Sync cezen-portal/ from live working copy (V1.0 GA polish + search-icon ordering fix)
Brings the ISO-packaged portal copy current with the live cezen-portal/ working directory, which had drifted across the entire V1.0 GA polish initiative (Phases 1-10) plus this session's topnav icon-order bugfix. - 52 existing files updated, 2 new pages added (about.html, health.html) - cgit/cezen-portal/ is now byte-identical to cezen-portal/ - Backend files (rag_ingest.py, cezen_license.py) already in sync; main.py intentionally left as-is (cgit is ahead there with workstation-category commercial-fit logic not yet backported to the live working copy) Next: rebuild the ISO (bash autoinstall/build-iso.sh) to bake this in.
This commit is contained in:
1 parent
7540da04a8
commit
b3eec34158
57 files changed
+2832
-1354
No files matched your search
@@ -4,7 +4,7 @@
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Guardrails — Nexus One AI</title>
|
||||
<link rel="stylesheet" href="style.css?v=4">
|
||||
<link rel="stylesheet" href="style.css?v=12">
|
||||
<style>
|
||||
.gr-card { background:var(--navy2); border:1px solid var(--bdr); border-radius:14px; padding:28px; margin-bottom:24px; }
|
||||
.gr-card-title { font-size:16px; font-weight:700; color:var(--ink); margin-bottom:4px; }
|
||||
@@ -122,6 +122,7 @@
|
||||
<a href="dashboard.html">Dashboard</a>
|
||||
<a href="analytics.html">Usage Analytics</a>
|
||||
<a href="audit.html">Governance & Audit</a>
|
||||
<a href="health.html">Health Center</a>
|
||||
<a href="feedback.html">Feedback & Ratings</a>
|
||||
<span class="nav-drop-cat">MANAGE /</span>
|
||||
<a href="users.html">Users</a>
|
||||
@@ -161,7 +162,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<a href="notifications.html" style="position:relative">🔔</a>
|
||||
<a href="notifications.html" class="nav-icon-btn" style="position:relative" aria-label="Notifications"><span class="icon-svg icon-sm" aria-hidden="true"><svg viewBox="0 0 24 24"><path d="M15 17h5l-1.4-1.4A2 2 0 0 1 18 14.2V11a6 6 0 1 0-12 0v3.2a2 2 0 0 1-.6 1.4L4 17h5"/><path d="M10 17a2 2 0 0 0 4 0"/></svg></span></a>
|
||||
<span class="badge" data-brand="tier">Basic Tier</span>
|
||||
<div id="nav-org-logo" class="nav-org-logo"></div>
|
||||
</header>
|
||||
@@ -176,7 +177,7 @@
|
||||
|
||||
<!-- Tier gate -->
|
||||
<div class="tier-gate" id="tier-gate" style="display:none">
|
||||
<h3>🛡 Pro Tier & Above</h3>
|
||||
<h3>Pro Tier & Above</h3>
|
||||
<p>Guardrails are available on Mid and Advanced tiers. Advanced tier adds built-in PII detection (Aadhaar, PAN, mobile numbers, credit cards).</p>
|
||||
</div>
|
||||
|
||||
@@ -184,10 +185,10 @@
|
||||
|
||||
<!-- Tabs -->
|
||||
<div class="gr-tabs">
|
||||
<button class="gr-tab active" onclick="showTab('rules',this)">🚫 Rules</button>
|
||||
<button class="gr-tab" onclick="showTab('pii',this)">🔍 PII Detection</button>
|
||||
<button class="gr-tab" onclick="showTab('tester',this)">🧪 Tester</button>
|
||||
<button class="gr-tab" onclick="showTab('log',this)">📋 Violation Log</button>
|
||||
<button class="gr-tab active" onclick="showTab('rules',this)">Rules</button>
|
||||
<button class="gr-tab" onclick="showTab('pii',this)">PII Detection</button>
|
||||
<button class="gr-tab" onclick="showTab('tester',this)">Tester</button>
|
||||
<button class="gr-tab" onclick="showTab('log',this)">Violation Log</button>
|
||||
</div>
|
||||
|
||||
<!-- Rules tab -->
|
||||
@@ -203,8 +204,8 @@
|
||||
<!-- PII tab -->
|
||||
<div id="tab-pii" style="display:none">
|
||||
<div class="gr-card">
|
||||
<div class="gr-card-title">🔍 PII Detection Patterns</div>
|
||||
<div class="gr-card-sub">One-click rules that detect common Indian PII. Each adds a regex-backed guardrail rule. <span id="pii-advanced-note" style="display:none;color:#7C3AED;font-weight:600">✦ Advanced tier — full PII suite enabled.</span></div>
|
||||
<div class="gr-card-title">PII Detection Patterns</div>
|
||||
<div class="gr-card-sub">One-click rules that detect common Indian PII. Each adds a regex-backed guardrail rule. <span id="pii-advanced-note" style="display:none;color:#7C3AED;font-weight:600"><span class="icon-svg icon-xs" aria-hidden="true"><svg viewBox="0 0 24 24"><path d="M12 3v4M12 17v4M3 12h4M17 12h4M5.6 5.6l2.8 2.8M15.6 15.6l2.8 2.8M18.4 5.6l-2.8 2.8M8.4 15.6l-2.8 2.8"/></svg></span> Advanced tier — full PII suite enabled.</span></div>
|
||||
<div class="pii-grid" id="pii-presets"></div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -212,7 +213,7 @@
|
||||
<!-- Tester tab -->
|
||||
<div id="tab-tester" style="display:none">
|
||||
<div class="gr-card gr-tester">
|
||||
<div class="gr-card-title">🧪 Test a Prompt</div>
|
||||
<div class="gr-card-title">Test a Prompt</div>
|
||||
<div class="gr-card-sub">Paste any text below to check which active rules it would trigger.</div>
|
||||
<textarea id="test-input" placeholder="Paste a sample prompt or message to test…"></textarea>
|
||||
<div style="margin-top:10px">
|
||||
@@ -228,7 +229,7 @@
|
||||
<!-- Log tab -->
|
||||
<div id="tab-log" style="display:none">
|
||||
<div class="gr-card">
|
||||
<div class="gr-card-title">📋 Violation Log</div>
|
||||
<div class="gr-card-title">Violation Log</div>
|
||||
<div class="gr-card-sub">Most recent 100 guardrail triggers across all users.</div>
|
||||
<div id="log-table"><div class="gr-empty">Loading…</div></div>
|
||||
</div>
|
||||
@@ -244,7 +245,7 @@
|
||||
<h3 id="modal-title">Add Rule</h3>
|
||||
<div class="gr-modal-row">
|
||||
<div>
|
||||
<label>Type</label>
|
||||
<label>Type <span class="cezen-help" tabindex="0" data-tip="Keyword: exact word/phrase match, case-insensitive. Regex: a full regular expression for complex patterns. PII Pattern: pre-built detectors for things like emails, phone numbers, and card numbers.">?</span></label>
|
||||
<select id="m-type" onchange="updatePatternHint()">
|
||||
<option value="keyword">Keyword</option>
|
||||
<option value="regex">Regex</option>
|
||||
@@ -252,7 +253,7 @@
|
||||
</select>
|
||||
</div>
|
||||
<div>
|
||||
<label>Action</label>
|
||||
<label>Action <span class="cezen-help" tabindex="0" data-tip="Block: the request is rejected before it reaches the model — the user sees a refusal. Warn only: the request still goes through, but it's flagged in the guardrail log for review.">?</span></label>
|
||||
<select id="m-action">
|
||||
<option value="block">Block</option>
|
||||
<option value="warn">Warn only</option>
|
||||
@@ -387,7 +388,7 @@ function renderPiiPresets() {
|
||||
return `<button class="pii-chip${added ? ' added' : ''}" onclick="togglePii('${p.pattern}','${escHtml(p.label)}')" ${added ? 'disabled' : ''}>
|
||||
<strong>${escHtml(p.label)}</strong><br>
|
||||
<span style="font-weight:400;font-size:11px;color:var(--lt)">${escHtml(p.desc)}</span>
|
||||
${added ? '<br><span style="color:var(--purple);font-size:11px">✓ Active</span>' : ''}
|
||||
${added ? '<br><span style="color:var(--purple);font-size:11px">Active</span>' : ''}
|
||||
</button>`;
|
||||
}).join('');
|
||||
}
|
||||
@@ -498,13 +499,13 @@ async function testPrompt() {
|
||||
resultEl.style.display = '';
|
||||
if (d.blocked) {
|
||||
resultEl.className = 'gr-result blocked';
|
||||
summaryEl.innerHTML = `<strong>🚫 Blocked</strong> — ${d.matches.length} rule${d.matches.length>1?'s':''} triggered`;
|
||||
summaryEl.innerHTML = `<strong><span class="icon-svg icon-xs" aria-hidden="true"><svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><path d="M4.9 4.9l14.2 14.2"/></svg></span> Blocked</strong> — ${d.matches.length} rule${d.matches.length>1?'s':''} triggered`;
|
||||
} else if (d.matches.length) {
|
||||
resultEl.className = 'gr-result warn';
|
||||
summaryEl.innerHTML = `<strong>⚠ Warning</strong> — ${d.matches.length} rule${d.matches.length>1?'s':''} triggered (warn-only)`;
|
||||
summaryEl.innerHTML = `<strong>Warning</strong> - ${d.matches.length} rule${d.matches.length>1?'s':''} triggered (warn-only)`;
|
||||
} else {
|
||||
resultEl.className = 'gr-result ok';
|
||||
summaryEl.innerHTML = '<strong>✓ Clear</strong> — No rules triggered';
|
||||
summaryEl.innerHTML = '<strong>Clear</strong> - No rules triggered';
|
||||
}
|
||||
matchesEl.innerHTML = d.matches.map(m =>
|
||||
`<div class="gr-match"><span class="badge-type-${m.type}">${m.type}</span> <span class="badge-action-${m.action}">${m.action}</span> <code>${escHtml(m.pattern)}</code>${m.label ? ` — ${escHtml(m.label)}` : ''}</div>`
|
||||
@@ -562,6 +563,6 @@ document.addEventListener('cezenAuthReady', function() {
|
||||
setTimeout(checkTier, 200);
|
||||
});
|
||||
</script>
|
||||
<script src="branding.js"></script>
|
||||
<script src="branding.js?v=3"></script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in new issue
Block a user