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.
244 lines
13 KiB
HTML
244 lines
13 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>About — Nexus One AI</title>
|
|
<link rel="stylesheet" href="style.css?v=12">
|
|
<style>
|
|
/* ── About page ─────────────────────────────────────────────────── */
|
|
.ab-hero-card {
|
|
display: flex; align-items: center; gap: 18px;
|
|
background: var(--surface); border: 1px solid var(--border);
|
|
border-radius: var(--radius-lg); padding: 24px 28px; margin-bottom: 20px;
|
|
box-shadow: var(--shadow-sm);
|
|
}
|
|
.ab-hero-mark {
|
|
width: 52px; height: 52px; border-radius: var(--radius-md); flex-shrink: 0;
|
|
background: var(--brand-lt); color: var(--brand); display: flex; align-items: center; justify-content: center;
|
|
}
|
|
.ab-hero-mark svg { width: 28px; height: 28px; stroke: currentColor; fill: none; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }
|
|
.ab-hero-name { font-size: 20px; font-weight: 800; color: var(--text-primary); }
|
|
.ab-hero-sub { font-size: 13px; color: var(--text-tertiary); margin-top: 2px; }
|
|
|
|
.ab-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; }
|
|
@media(max-width: 800px) { .ab-grid { grid-template-columns: 1fr; } }
|
|
|
|
.ab-card {
|
|
background: var(--surface); border: 1px solid var(--border);
|
|
border-radius: var(--radius-lg); padding: 20px 22px;
|
|
}
|
|
.ab-card-title { font-size: 13.5px; font-weight: 700; color: var(--text-primary); margin-bottom: 14px; display: flex; align-items: center; gap: 8px; }
|
|
.ab-row { display: flex; justify-content: space-between; gap: 12px; padding: 8px 0; border-bottom: 1px solid var(--border); font-size: 13px; }
|
|
.ab-row:last-child { border-bottom: none; }
|
|
.ab-row-label { color: var(--text-tertiary); }
|
|
.ab-row-value { color: var(--text-primary); font-weight: 600; text-align: right; }
|
|
.ab-status-pill { font-size: .6875rem; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; padding: 2px 9px; border-radius: var(--radius-pill); }
|
|
.ab-status-pill.ok { background: var(--green-lt); color: var(--green); }
|
|
.ab-status-pill.warning { background: var(--amber-lt); color: var(--amber); }
|
|
.ab-status-pill.critical { background: var(--red-lt); color: var(--red); }
|
|
|
|
.ab-links { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 6px; }
|
|
.ab-links a {
|
|
display: inline-flex; align-items: center; gap: 6px;
|
|
padding: 8px 14px; border-radius: var(--radius-md); border: 1px solid var(--border);
|
|
color: var(--text-primary); text-decoration: none; font-size: 13px; font-weight: 600;
|
|
transition: border-color var(--t-base), color var(--t-base);
|
|
}
|
|
.ab-links a:hover { border-color: var(--brand); color: var(--brand); }
|
|
</style>
|
|
</head>
|
|
<body data-role="admin">
|
|
|
|
<header class="topnav">
|
|
<a href="index.html" class="brand">Nexus One <span>AI</span></a>
|
|
<nav>
|
|
<a href="index.html">Home</a>
|
|
<a href="quickstart.html">Quick Start</a>
|
|
<a href="prompts.html">Prompt Library</a>
|
|
<a href="usecases.html">Use Cases</a>
|
|
<div class="nav-dropdown">
|
|
<button class="nav-drop-btn">AI Tools ▾</button>
|
|
<div class="nav-drop-menu">
|
|
<span class="nav-drop-cat">INTELLIGENCE /</span>
|
|
<a href="documents.html">Document Intelligence</a>
|
|
<a href="chat-multi.html">AI Workspace</a>
|
|
<a href="prompt-studio.html">Prompt Studio</a>
|
|
<a href="meeting.html">Meeting Assistant</a>
|
|
<span class="nav-drop-cat">AUTOMATION /</span>
|
|
<a href="agents.html">Agent Studio</a>
|
|
<a href="schedules.html">Scheduled Jobs</a>
|
|
<a href="workflows.html">Workflow Designer</a>
|
|
<span class="nav-drop-cat">QUALITY /</span>
|
|
<a href="evals.html">AI Eval Suite</a>
|
|
<a href="chatrooms.html">Chat Rooms</a>
|
|
</div>
|
|
</div>
|
|
<span class="nav-sep"></span>
|
|
<div class="nav-dropdown">
|
|
<button class="nav-drop-btn">Help ▾</button>
|
|
<div class="nav-drop-menu">
|
|
<span class="nav-drop-cat">LEARN /</span>
|
|
<a href="quickstart.html">Quick Start</a>
|
|
<a href="models.html">Models</a>
|
|
<span class="nav-drop-cat">SUPPORT /</span>
|
|
<a href="troubleshooting.html">Troubleshoot</a>
|
|
<a href="faq.html">FAQ</a>
|
|
<span class="nav-drop-cat">MORE /</span>
|
|
<a href="glossary.html">Glossary</a>
|
|
<a href="whats-new.html">What's New</a>
|
|
</div>
|
|
</div>
|
|
<div class="nav-dropdown">
|
|
<button class="nav-drop-btn active">Admin ▾</button>
|
|
<div class="nav-drop-menu nav-drop-menu-wide">
|
|
<span class="nav-drop-cat">DOCS /</span>
|
|
<a href="security.html">Security & Privacy</a>
|
|
<a href="admin.html">Admin Guide</a>
|
|
<span class="nav-drop-cat">MONITOR /</span>
|
|
<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>
|
|
<a href="teams.html">Teams</a>
|
|
<a href="models-admin.html">Model Catalog</a>
|
|
<a href="training.html">Training</a>
|
|
<a href="knowledge.html">Knowledge Base</a>
|
|
<span class="nav-drop-cat">TOOLS /</span>
|
|
<a href="apikeys.html">API Keys</a>
|
|
<a href="benchmark.html">Benchmarking</a>
|
|
<a href="model-compare.html">Model Compare</a>
|
|
<a href="api-playground.html">API Playground</a>
|
|
<a href="guardrails.html">Guardrails</a>
|
|
<a href="rag-quality.html">RAG Quality</a>
|
|
<a href="router.html">Model Router</a>
|
|
<a href="connectors.html">MCP & Enterprise Connectors</a>
|
|
<span class="nav-drop-cat">SYSTEM /</span>
|
|
<a href="appliance.html">Appliance Ops</a>
|
|
<a href="console.html">Console</a>
|
|
<a href="settings.html">Settings</a>
|
|
<a href="about.html" class="active">About</a>
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
<div class="nav-right">
|
|
<div id="nav-org-logo" class="nav-org-logo"></div>
|
|
<span class="nav-tier-badge" data-brand="tier" data-tier-slug="basic">Basic Tier</span>
|
|
<a href="notifications.html" class="nav-icon-btn" title="Notifications">
|
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round"><path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"/><path d="M13.73 21a2 2 0 0 1-3.46 0"/></svg>
|
|
</a>
|
|
</div>
|
|
</header>
|
|
|
|
<div class="page-hero">
|
|
<div class="eyebrow">Admin</div>
|
|
<h1>About <span data-brand="org">Nexus One AI</span></h1>
|
|
<p>Product version, license status, and support information for this deployment — everything you'd need on a support call.</p>
|
|
</div>
|
|
|
|
<div class="content">
|
|
|
|
<div class="ab-hero-card">
|
|
<div class="ab-hero-mark"><svg viewBox="0 0 24 24"><rect x="3" y="11" width="18" height="10" rx="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/></svg></div>
|
|
<div>
|
|
<div class="ab-hero-name"><span data-brand="org">Nexus One AI</span></div>
|
|
<div class="ab-hero-sub" data-brand="footer">Powered by Cezen</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="ab-grid">
|
|
|
|
<div class="ab-card">
|
|
<div class="ab-card-title">
|
|
<span class="icon-svg icon-sm" aria-hidden="true"><svg viewBox="0 0 24 24"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"/><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"/></svg></span>
|
|
Product
|
|
</div>
|
|
<div class="ab-row"><span class="ab-row-label">Version</span><span class="ab-row-value" id="ab-version">—</span></div>
|
|
<div class="ab-row"><span class="ab-row-label">Tier</span><span class="ab-row-value" id="ab-tier">—</span></div>
|
|
<div class="ab-row"><span class="ab-row-label">Category</span><span class="ab-row-value" id="ab-category">—</span></div>
|
|
<div class="ab-row"><span class="ab-row-label">Max Users</span><span class="ab-row-value" id="ab-max-users">—</span></div>
|
|
</div>
|
|
|
|
<div class="ab-card">
|
|
<div class="ab-card-title">
|
|
<span class="icon-svg icon-sm" aria-hidden="true"><svg viewBox="0 0 24 24"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><path d="M14 2v6h6"/></svg></span>
|
|
License
|
|
</div>
|
|
<div class="ab-row"><span class="ab-row-label">Status</span><span class="ab-row-value" id="ab-license-status">—</span></div>
|
|
<div class="ab-row"><span class="ab-row-label">Customer</span><span class="ab-row-value" id="ab-customer">—</span></div>
|
|
<div class="ab-row"><span class="ab-row-label">Support Until</span><span class="ab-row-value" id="ab-support-until">—</span></div>
|
|
<div class="ab-row"><span class="ab-row-label">Install Type</span><span class="ab-row-value" id="ab-install-type">—</span></div>
|
|
</div>
|
|
|
|
<div class="ab-card" style="grid-column: 1 / -1">
|
|
<div class="ab-card-title">
|
|
<span class="icon-svg icon-sm" aria-hidden="true"><svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="9"/><path d="M12 8h.01"/><path d="M11 12h1v4h1"/></svg></span>
|
|
Support & Resources
|
|
</div>
|
|
<div class="ab-links">
|
|
<a href="mailto:support@cezentech.com"><span class="icon-svg icon-xs" aria-hidden="true"><svg viewBox="0 0 24 24"><rect x="2" y="4" width="20" height="16" rx="2"/><path d="m22 6-10 7L2 6"/></svg></span> support@cezentech.com</a>
|
|
<a href="https://cezentech.com" target="_blank"><span class="icon-svg icon-xs" aria-hidden="true"><svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="9"/><path d="M3 12h18"/><path d="M12 3a15 15 0 0 1 0 18a15 15 0 0 1 0-18"/></svg></span> cezentech.com</a>
|
|
<a href="quickstart.html"><span class="icon-svg icon-xs" aria-hidden="true"><svg viewBox="0 0 24 24"><path d="M13 2 3 14h7l-1 8 10-12h-7z"/></svg></span> Quick Start Guide</a>
|
|
<a href="troubleshooting.html"><span class="icon-svg icon-xs" aria-hidden="true"><svg viewBox="0 0 24 24"><path d="m14.7 6.3 3 3"/><path d="M5 19l6.5-6.5"/><path d="M16 3a4 4 0 0 0-3.9 4.8L4 16v4h4l8.2-8.1A4 4 0 1 0 16 3Z"/></svg></span> Troubleshooting</a>
|
|
<a href="health.html"><span class="icon-svg icon-xs" aria-hidden="true"><svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><path d="M12 8v4l3 2"/></svg></span> Health Center</a>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<footer>
|
|
<p>Nexus One AI · Powered by Cezen · <span data-brand="tier">Basic Tier</span></p>
|
|
<p>Questions? <a href="mailto:support@cezentech.com">support@cezentech.com</a> · <a href="https://cezentech.com" target="_blank">cezentech.com</a></p>
|
|
</footer>
|
|
|
|
<script>
|
|
const _API = '/api';
|
|
|
|
function fmtDate(iso) {
|
|
if (!iso) return '—';
|
|
const s = String(iso).replace(/\+00:00$/, 'Z').replace(/\.\d+Z$/, 'Z');
|
|
const d = new Date(s);
|
|
return isNaN(d.getTime()) ? String(iso) : d.toLocaleDateString();
|
|
}
|
|
|
|
async function loadAbout() {
|
|
// Version comes from /api/health (already reports a version string);
|
|
// license/tier detail comes from /api/license — both endpoints already
|
|
// exist and are used elsewhere in the portal, no new API surface here.
|
|
try {
|
|
const h = await fetch(`${_API}/health`, { credentials: 'include' }).then(r => r.ok ? r.json() : null);
|
|
document.getElementById('ab-version').textContent = h?.version ? 'v' + h.version : 'v1.0.0';
|
|
} catch (e) { /* leave placeholder */ }
|
|
|
|
try {
|
|
const lic = await fetch(`${_API}/license`, { credentials: 'include' }).then(r => r.ok ? r.json() : null);
|
|
if (!lic) throw new Error('unavailable');
|
|
const ent = lic.entitlement || {};
|
|
document.getElementById('ab-tier').textContent = lic.commercial_label || lic.label || '—';
|
|
document.getElementById('ab-category').textContent = lic.category ? (lic.category.charAt(0).toUpperCase() + lic.category.slice(1)) : '—';
|
|
document.getElementById('ab-max-users').textContent = lic.max_users != null ? lic.max_users : '—';
|
|
|
|
const statusLabel = (window.licenseStatusLabel ? window.licenseStatusLabel(ent.license_status) : (ent.license_status || 'unknown'));
|
|
const statusEl = document.getElementById('ab-license-status');
|
|
statusEl.innerHTML = `<span class="ab-status-pill ${ent.license_status === 'valid' ? 'ok' : (ent.license_status === 'missing' || ent.license_status === 'not_yet_valid' ? 'warning' : 'critical')}">${statusLabel}</span>`;
|
|
|
|
document.getElementById('ab-customer').textContent = ent.license_record?.customer_name || '—';
|
|
document.getElementById('ab-support-until').textContent = ent.license_record?.support_until ? fmtDate(ent.license_record.support_until) : '—';
|
|
document.getElementById('ab-install-type').textContent = ent.install_type ? (ent.install_type === 'field-staging' ? 'Field staging / evaluation' : ent.install_type.charAt(0).toUpperCase() + ent.install_type.slice(1)) : '—';
|
|
} catch (e) {
|
|
document.getElementById('ab-license-status').innerHTML = '<span class="ab-status-pill warning">Unavailable</span>';
|
|
}
|
|
}
|
|
loadAbout();
|
|
</script>
|
|
|
|
<script src="auth.js"></script>
|
|
<script src="branding.js?v=3"></script>
|
|
</body>
|
|
</html>
|