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:
Jino Jose committed 2026-07-09 11:11:38 +05:30
1 parent 7540da04a8
commit b3eec34158
57 files changed
+2832 -1354

No files matched your search

+146 -65
View File
@@ -4,7 +4,7 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Quick Start — Nexus One AI Portal</title>
<link rel="stylesheet" href="style.css?v=4">
<link rel="stylesheet" href="style.css?v=12">
</head>
<body>
@@ -40,6 +40,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 &amp; Ratings</a>
<span class="nav-drop-cat">MANAGE /</span>
<a href="users.html">Users</a>
@@ -79,7 +80,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>
@@ -110,13 +111,13 @@
<h2>Open the chat interface</h2>
<p class="qs-sub">Open WebUI is your main access point — it works in any browser.</p>
</div>
<a href="http://ai.local:3001" target="_blank" class="btn-primary" style="margin-left:auto;white-space:nowrap">Open WebUI ↗</a>
<a href="http://ai.local:3001" target="_blank" class="btn-primary" style="margin-left:auto;white-space:nowrap">Open WebUI</a>
</div>
<div class="qs-body">
<div class="qs-tip">
Go to <code>http://ai.local:3001</code> in Chrome, Firefox, Edge, or Safari. No installation required — it runs entirely in the browser.
</div>
<div class="notice">💡 If <code>ai.local</code> doesn't resolve, ask your administrator for the server IP and use <code>http://[IP]:3001</code> instead.</div>
<div class="notice"><span class="icon-label"><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><span>If <code>ai.local</code> doesn't resolve, ask your administrator for the server IP and use <code>http://[IP]:3001</code> instead.</span></span></div>
</div>
</div>
@@ -134,11 +135,11 @@
<div class="info-grid" style="margin-top:0">
<div class="info-card">
<h4>First person to sign up</h4>
<p>The first account created becomes the admin automatically. Add other users from <strong>Admin Panel → Users</strong> after signing in.</p>
<p>The first account created becomes the admin automatically. Add other users from <strong>Admin Panel > Users</strong> after signing in.</p>
</div>
<div class="info-card">
<h4>Everyone else</h4>
<p>Ask your admin to create an account, or enable open registration from <strong>Admin Panel → Settings → General</strong>.</p>
<p>Ask your admin to create an account, or enable open registration from <strong>Admin Panel > Settings > General</strong>.</p>
</div>
</div>
</div>
@@ -153,7 +154,7 @@
<h2>Choose a model</h2>
<p class="qs-sub">Pick which AI to talk to. Start with Llama 3.1 8B for most tasks.</p>
</div>
<a href="models.html" class="btn-secondary" style="margin-left:auto;white-space:nowrap">View all models →</a>
<a href="models.html" class="btn-secondary" style="margin-left:auto;white-space:nowrap">View all models</a>
</div>
<div class="qs-body">
<div class="model-quick-grid">
@@ -229,7 +230,7 @@
<div class="qs-step qs-done" id="step6">
<div class="qs-step-header">
<div class="qs-num done">✓</div>
<div class="qs-num done">Done</div>
<div>
<h2>You're set up. Explore what else is available.</h2>
<p class="qs-sub">Switch to the <strong>Platform Features</strong> tab above to see everything Nexus One AI can do.</p>
@@ -238,28 +239,28 @@
<div class="qs-body">
<div class="next-cards">
<a href="chat-multi.html" class="next-card">
<div class="next-icon">🖼️</div>
<div class="next-icon"><span class="icon-svg icon-md" aria-hidden="true"><svg viewBox="0 0 24 24"><rect x="3" y="5" width="18" height="14" rx="2"/><circle cx="9" cy="10" r="2"/><path d="m21 15-4-4-6 6-3-3-5 5"/></svg></span></div>
<div>
<h4>Multimodal Chat</h4>
<p>Upload images, switch models mid-conversation, and access persistent chat history with search.</p>
</div>
</a>
<a href="documents.html" class="next-card">
<div class="next-icon">📄</div>
<div class="next-icon"><span class="icon-svg icon-md" 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"/><path d="M8 13h8M8 17h6"/></svg></span></div>
<div>
<h4>Document Intelligence</h4>
<p>Extract tables, compare documents side-by-side, and run batch processing across file sets.</p>
</div>
</a>
<a href="agents.html" class="next-card">
<div class="next-icon">🤖</div>
<div class="next-icon"><span class="icon-svg icon-md" aria-hidden="true"><svg viewBox="0 0 24 24"><rect x="7" y="8" width="10" height="8" rx="2"/><path d="M12 4v4M9 18h6M8 22h8M4 10h3M17 10h3"/></svg></span></div>
<div>
<h4>Build an AI Agent</h4>
<p>Create autonomous agents that run multi-step tasks, call tools, and act on your behalf.</p>
</div>
</a>
<a href="troubleshooting.html" class="next-card">
<div class="next-icon">🔧</div>
<div class="next-icon"><span class="icon-svg icon-md" 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></div>
<div>
<h4>Something not working?</h4>
<p>Check the troubleshooting guide for common issues and fixes.</p>
@@ -279,28 +280,28 @@
<div class="info-grid" style="grid-template-columns:repeat(auto-fill,minmax(280px,1fr))">
<div class="info-card">
<h4>🖼️ <a href="chat-multi.html">AI Workspace</a>
<h4><a href="chat-multi.html">AI Workspace</a>
<a href="prompt-studio.html">Prompt Studio</a></h4>
<p>Full-featured chat with persistent history, image upload, model switching per conversation, and markdown rendering. Search across all past conversations from the sidebar.</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Go to: AI Tools → Multimodal Chat</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Go to: AI Tools > Multimodal Chat</p>
</div>
<div class="info-card">
<h4>📄 <a href="documents.html">Document Intelligence</a></h4>
<h4><a href="documents.html">Document Intelligence</a></h4>
<p>Upload PDFs and documents for extraction, comparison, and Q&A. Supports table extraction, batch processing, side-by-side document comparison, and structure parsing.</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Go to: AI Tools → Document Intelligence</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Go to: AI Tools > Document Intelligence</p>
</div>
<div class="info-card">
<h4>🎙️ <a href="meeting.html">Meeting Assistant</a></h4>
<h4><a href="meeting.html">Meeting Assistant</a></h4>
<p>Record or upload meeting audio and get automatic transcription, AI-generated summaries, action item extraction, and follow-up email drafts — all on-premises.</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Go to: AI Tools → Meeting Assistant</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Go to: AI Tools > Meeting Assistant</p>
</div>
<div class="info-card">
<h4>💬 <a href="chatrooms.html">Secure Chat Rooms</a></h4>
<h4><a href="chatrooms.html">Secure Chat Rooms</a></h4>
<p>AI-assisted group conversations for your team. Create topic-specific rooms where members can collaborate with an AI moderator. Fully private, no cloud relay.</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Go to: AI Tools → Chat Rooms</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Go to: AI Tools > Chat Rooms</p>
</div>
</div>
@@ -309,27 +310,27 @@
<div class="info-grid" style="grid-template-columns:repeat(auto-fill,minmax(280px,1fr))">
<div class="info-card">
<h4>🤖 <a href="agents.html">Agent Studio</a></h4>
<h4><a href="agents.html">Agent Studio</a></h4>
<p>Build autonomous AI agents that execute multi-step tasks, call external tools, read files, and act on instructions without human input for every step. Includes governance and approval workflows.</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Go to: AI Tools → Agent Builder</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Go to: AI Tools > Agent Builder</p>
</div>
<div class="info-card">
<h4>🔄 <a href="workflows.html">Workflow Designer</a></h4>
<h4><a href="workflows.html">Workflow Designer</a></h4>
<p>Chain AI tasks together in visual pipelines. Trigger on schedule, webhook, or event. Connect input sources, AI processing steps, and output destinations into repeatable flows.</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Go to: AI Tools → Workflow Automation</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Go to: AI Tools > Workflow Automation</p>
</div>
<div class="info-card">
<h4>⏰ <a href="schedules.html">Scheduled Jobs</a></h4>
<h4><a href="schedules.html">Scheduled Jobs</a></h4>
<p>Set AI tasks to run automatically on a cron schedule — daily reports, nightly document processing, weekly summaries. Jobs run on the server even when no one is logged in.</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Go to: AI Tools → Scheduled Jobs</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Go to: AI Tools > Scheduled Jobs</p>
</div>
<div class="info-card">
<h4>🔌 <a href="connectors.html">MCP & Enterprise Connectors</a></h4>
<h4><a href="connectors.html">MCP & Enterprise Connectors</a></h4>
<p>Connect Nexus One AI to your existing systems — databases, file shares, APIs, email, and enterprise tools. Connectors let agents and workflows pull live data from your environment.</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Admin → Tools → Connectors</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Admin > Tools > Connectors</p>
</div>
</div>
@@ -338,27 +339,27 @@
<div class="info-grid" style="grid-template-columns:repeat(auto-fill,minmax(280px,1fr))">
<div class="info-card">
<h4>📚 <a href="knowledge.html">Knowledge Base</a></h4>
<h4><a href="knowledge.html">Knowledge Base</a></h4>
<p>Upload and organise documents into collections. The AI searches these at query time using RAG — so responses are grounded in your actual content rather than model training data.</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Admin → Manage → Knowledge Base</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Admin > Manage > Knowledge Base</p>
</div>
<div class="info-card">
<h4>📊 <a href="rag-quality.html">RAG Quality Dashboard</a></h4>
<h4><a href="rag-quality.html">RAG Quality Dashboard</a></h4>
<p>Monitor retrieval accuracy, chunk quality scores, and query-document relevance. Identify which collections return good results and which need reindexing or tuning.</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Admin → Tools → RAG Quality</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Admin > Tools > RAG Quality</p>
</div>
<div class="info-card">
<h4>🧪 <a href="evals.html">AI Eval Suite</a></h4>
<h4><a href="evals.html">AI Eval Suite</a></h4>
<p>Run standardised test suites against your models and prompts. Compare output quality, track regressions, and validate that fine-tuned models perform better than their base versions.</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Go to: AI Tools → AI Eval Suite</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Go to: AI Tools > AI Eval Suite</p>
</div>
<div class="info-card">
<h4>⚡ <a href="benchmark.html">Model Benchmarking</a></h4>
<h4><a href="benchmark.html">Model Benchmarking</a></h4>
<p>Run speed and quality benchmarks across installed models. Compare tokens/second, TTFT (time-to-first-token), and task-specific accuracy to choose the right model for each use case.</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Admin → Tools → Benchmarking</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Admin > Tools > Benchmarking</p>
</div>
</div>
@@ -367,27 +368,27 @@
<div class="info-grid" style="grid-template-columns:repeat(auto-fill,minmax(280px,1fr))">
<div class="info-card">
<h4>🛡️ <a href="guardrails.html">Guardrails</a></h4>
<h4><a href="guardrails.html">Guardrails</a></h4>
<p>Define content filters, keyword blocks, PII redaction rules, and prompt injection detection. All queries pass through guardrails before reaching the model and after the response is generated.</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Admin → Tools → Guardrails</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Admin > Tools > Guardrails</p>
</div>
<div class="info-card">
<h4>🔀 <a href="router.html">Model Router</a></h4>
<h4><a href="router.html">Model Router</a></h4>
<p>Automatically route queries to the most appropriate model based on task type, complexity, or cost. Send code questions to CodeLlama, simple tasks to the fast 3B model, complex reasoning to 70B.</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Admin → Tools → Model Router</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Admin > Tools > Model Router</p>
</div>
<div class="info-card">
<h4>🔑 <a href="apikeys.html">API Keys</a></h4>
<h4><a href="apikeys.html">API Keys</a></h4>
<p>Generate and manage API keys for programmatic access to Nexus One AI from your own applications. Set per-key rate limits, allowed models, and expiry dates.</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Admin → Tools → API Keys</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Admin > Tools > API Keys</p>
</div>
<div class="info-card">
<h4>🎓 <a href="training.html">Model Training</a></h4>
<h4><a href="training.html">Model Training</a></h4>
<p>Fine-tune models on your own data using QLoRA — efficient training that fits on your existing GPU. Upload a dataset, configure training parameters, and produce a domain-adapted model.</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Admin → Manage → Training</p>
<p style="margin-top:8px;font-size:12px;color:var(--med)">Admin > Manage > Training</p>
</div>
</div>
@@ -397,19 +398,19 @@
<div id="tab-admin" class="qs-tab-panel" style="display:none">
<div class="notice" style="margin-bottom:24px">
⚙️ This section is for system administrators. Regular users can skip to <strong>First Steps</strong>.
<span class="icon-label"><span class="icon-svg icon-sm" aria-hidden="true"><svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 1 1-4 0v-.09a1.65 1.65 0 0 0-1-1.51 1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 1 1 0-4h.09a1.65 1.65 0 0 0 1.51-1 1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33h.01A1.65 1.65 0 0 0 10.5 3.1V3a2 2 0 1 1 4 0v.09a1.65 1.65 0 0 0 1 1.51h.01a1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82v.01a1.65 1.65 0 0 0 1.51 1H21a2 2 0 1 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z"/></svg></span><span>This section is for system administrators. Regular users can skip to <strong>First Steps</strong>.</span></span>
</div>
<div class="qs-track">
<div class="qs-step">
<div class="qs-step" id="admin-step1">
<div class="qs-step-header">
<div class="qs-num">1</div>
<div>
<h2>Verify all services are running</h2>
<p class="qs-sub">Check the dashboard for green status on all core services.</p>
</div>
<a href="dashboard.html" class="btn-secondary" style="margin-left:auto;white-space:nowrap">Dashboard →</a>
<a href="dashboard.html" class="btn-secondary" style="margin-left:auto;white-space:nowrap">Dashboard</a>
</div>
<div class="qs-body">
<div class="qs-tip">Open the Dashboard and confirm Ollama, Open WebUI, ChromaDB, and the Cezen backend all show as running. If any are red, check the <a href="troubleshooting.html">troubleshooting guide</a>.</div>
@@ -418,46 +419,46 @@
<div class="qs-connector"></div>
<div class="qs-step">
<div class="qs-step" id="admin-step2">
<div class="qs-step-header">
<div class="qs-num">2</div>
<div>
<h2>Create user accounts</h2>
<p class="qs-sub">Add accounts for each team member before they try to log in.</p>
</div>
<a href="users.html" class="btn-secondary" style="margin-left:auto;white-space:nowrap">Users →</a>
<a href="users.html" class="btn-secondary" style="margin-left:auto;white-space:nowrap">Users</a>
</div>
<div class="qs-body">
<div class="qs-tip">Go to <strong>Admin → Users</strong> to create accounts. Assign roles: Admin for IT staff, User for everyone else. You can also enable open registration if your network is sufficiently restricted.</div>
<div class="qs-tip">Go to <strong>Admin > Users</strong> to create accounts. Assign roles: Admin for IT staff, User for everyone else. You can also enable open registration if your network is sufficiently restricted.</div>
</div>
</div>
<div class="qs-connector"></div>
<div class="qs-step">
<div class="qs-step" id="admin-step3">
<div class="qs-step-header">
<div class="qs-num">3</div>
<div>
<h2>Load AI models</h2>
<p class="qs-sub">Ensure the recommended models are installed and available.</p>
</div>
<a href="models-admin.html" class="btn-secondary" style="margin-left:auto;white-space:nowrap">Model Manager →</a>
<a href="models-admin.html" class="btn-secondary" style="margin-left:auto;white-space:nowrap">Model Catalog</a>
</div>
<div class="qs-body">
<div class="qs-tip">Go to <strong>Admin → Model Manager</strong> to see installed models. The recommended starter set: <code>llama3.1:8b</code>, <code>mistral:7b</code>, <code>nomic-embed-text</code> (required for RAG). Pull additional models as needed.</div>
<div class="qs-tip">Go to <strong>Admin > Model Manager</strong> to see installed models. The recommended starter set: <code>llama3.1:8b</code>, <code>mistral:7b</code>, <code>nomic-embed-text</code> (required for RAG). Pull additional models as needed.</div>
</div>
</div>
<div class="qs-connector"></div>
<div class="qs-step">
<div class="qs-step" id="admin-step4">
<div class="qs-step-header">
<div class="qs-num">4</div>
<div>
<h2>Set up guardrails</h2>
<p class="qs-sub">Configure content filters appropriate for your organisation before users start.</p>
</div>
<a href="guardrails.html" class="btn-secondary" style="margin-left:auto;white-space:nowrap">Guardrails →</a>
<a href="guardrails.html" class="btn-secondary" style="margin-left:auto;white-space:nowrap">Guardrails</a>
</div>
<div class="qs-body">
<div class="qs-tip">At minimum, enable PII redaction and keyword blocks for sensitive terms. Guardrails can be adjusted at any time — start conservative and loosen rules as you understand your team's usage patterns.</div>
@@ -466,14 +467,14 @@
<div class="qs-connector"></div>
<div class="qs-step">
<div class="qs-step" id="admin-step5">
<div class="qs-step-header">
<div class="qs-num">5</div>
<div>
<h2>Seed the Knowledge Base</h2>
<p class="qs-sub">Upload your organisation's core documents so users can query them immediately.</p>
</div>
<a href="knowledge.html" class="btn-secondary" style="margin-left:auto;white-space:nowrap">Knowledge Base →</a>
<a href="knowledge.html" class="btn-secondary" style="margin-left:auto;white-space:nowrap">Knowledge Base</a>
</div>
<div class="qs-body">
<div class="qs-tip">Create collections by department (HR Policies, Finance SOPs, Legal Contracts). Upload the documents and let ChromaDB index them. Users can then query these collections from any AI tool. Check <a href="rag-quality.html">RAG Quality</a> after indexing to confirm retrieval accuracy.</div>
@@ -484,7 +485,7 @@
<div class="qs-step qs-done">
<div class="qs-step-header">
<div class="qs-num done">✓</div>
<div class="qs-num done">Done</div>
<div>
<h2>System ready for your team</h2>
<p class="qs-sub">Share the portal link and the <strong>First Steps</strong> tab with your users.</p>
@@ -493,19 +494,19 @@
<div class="qs-body">
<div class="next-cards">
<a href="analytics.html" class="next-card">
<div class="next-icon">📊</div>
<div class="next-icon"><span class="icon-svg icon-md" aria-hidden="true"><svg viewBox="0 0 24 24"><path d="M4 19h16"/><path d="M7 16V9"/><path d="M12 16V5"/><path d="M17 16v-3"/></svg></span></div>
<div><h4>Usage Analytics</h4><p>Monitor who's using what, query volumes, and model performance across your team.</p></div>
</a>
<a href="audit.html" class="next-card">
<div class="next-icon">📋</div>
<div class="next-icon"><span class="icon-svg icon-md" aria-hidden="true"><svg viewBox="0 0 24 24"><path d="M9 3h6"/><path d="M10 7h4"/><rect x="5" y="5" width="14" height="16" rx="2"/></svg></span></div>
<div><h4>Audit Log</h4><p>Full record of all queries, file uploads, and admin actions for compliance.</p></div>
</a>
<a href="router.html" class="next-card">
<div class="next-icon">🔀</div>
<div class="next-icon"><span class="icon-svg icon-md" aria-hidden="true"><svg viewBox="0 0 24 24"><path d="M16 3h5v5"/><path d="M4 20 21 3"/><path d="M21 16v5h-5"/><path d="m15 15 6 6"/><path d="M4 4h5l3 3"/></svg></span></div>
<div><h4>Model Router</h4><p>Set routing rules so the right model is used automatically for each task type.</p></div>
</a>
<a href="connectors.html" class="next-card">
<div class="next-icon">🔌</div>
<div class="next-icon"><span class="icon-svg icon-md" aria-hidden="true"><svg viewBox="0 0 24 24"><path d="M12 3v6"/><path d="M8 3v6"/><path d="M6 9h8"/><path d="M10 9v5a4 4 0 0 0 4 4h1"/><path d="M15 14h5v4"/></svg></span></div>
<div><h4>Connectors</h4><p>Connect to your existing systems so agents and workflows can access live data.</p></div>
</a>
</div>
@@ -518,7 +519,7 @@
</div>
<footer>
<p>Nexus One AI &nbsp;·&nbsp; Powered by Cezen &nbsp;·&nbsp; Basic Tier</p>
<p>Nexus One AI &nbsp;·&nbsp; Powered by Cezen &nbsp;·&nbsp; <span data-brand="tier">Basic Tier</span></p>
<p>Questions? <a href="mailto:support@cezentech.com">support@cezentech.com</a> &nbsp;·&nbsp; <a href="https://cezentech.com" target="_blank">cezentech.com</a></p>
</footer>
@@ -539,6 +540,18 @@
.qs-tab.active { color: var(--purple); border-bottom-color: var(--purple); }
.qs-tab-panel { animation: fadeIn .2s ease; }
@keyframes fadeIn { from { opacity:0; transform:translateY(4px); } to { opacity:1; transform:translateY(0); } }
.qs-auto-done-badge {
display: inline-block;
margin-left: 8px;
font-size: 11px;
font-weight: 700;
color: var(--green);
background: var(--green-lt);
border: 1px solid var(--green-border);
border-radius: 999px;
padding: 2px 10px;
vertical-align: middle;
}
</style>
<script>
@@ -551,14 +564,82 @@ function showTab(name, btn) {
function copyPrompt(btn, text) {
navigator.clipboard.writeText(text).then(() => {
const orig = btn.textContent;
btn.textContent = '✓ Copied!';
btn.textContent = 'Copied!';
btn.classList.add('copied');
setTimeout(() => { btn.textContent = orig; btn.classList.remove('copied'); }, 2000);
});
}
// ── Dynamic step completion ───────────────────────────────────────────────────
// Steps below auto-check against real system state instead of staying static
// checklist text forever. Each check is best-effort: a missing/unreachable
// endpoint (or a non-admin viewing the Admin Setup tab) just leaves that step
// unchecked rather than showing an error — this is a helpful nicety, not a
// blocking gate.
function markStepDone(stepEl) {
if (!stepEl || stepEl.classList.contains('qs-done')) return;
stepEl.classList.add('qs-done');
const h2 = stepEl.querySelector('h2');
if (h2 && !h2.querySelector('.qs-auto-done-badge')) {
const badge = document.createElement('span');
badge.className = 'qs-auto-done-badge';
badge.textContent = '✓ Detected as complete';
h2.appendChild(badge);
}
}
async function checkStepCompletion() {
// "Sign in" — if this page loaded at all, auth.js already validated a session.
markStepDone(document.getElementById('step2'));
const _API = '/api';
const checks = [
// Admin Setup track — each maps to an existing endpoint already used elsewhere in the portal.
['admin-step1', async () => {
const r = await fetch(`${_API}/health`, { credentials: 'include' });
if (!r.ok) return false;
const data = await r.json();
return data.status === 'ok';
}],
['admin-step2', async () => {
const r = await fetch(`${_API}/users`, { credentials: 'include' });
if (!r.ok) return false;
const rows = await r.json();
return Array.isArray(rows) && rows.length > 1; // more than just the initial admin
}],
['admin-step3', async () => {
const r = await fetch(`${_API}/models`, { credentials: 'include' });
if (!r.ok) return false;
const data = await r.json();
return Array.isArray(data.models) && data.models.length > 0;
}],
['admin-step4', async () => {
const r = await fetch(`${_API}/guardrails/rules`, { credentials: 'include' });
if (!r.ok) return false;
const rows = await r.json();
return Array.isArray(rows) && rows.length > 0;
}],
['admin-step5', async () => {
const r = await fetch(`${_API}/rag/collections`, { credentials: 'include' });
if (!r.ok) return false;
const data = await r.json();
const cols = data.collections || [];
return cols.some(c => (c.doc_count || 0) > 0);
}],
];
for (const [id, check] of checks) {
try {
if (await check()) markStepDone(document.getElementById(id));
} catch (e) {
// Non-admin session, endpoint unreachable, etc. — leave step unchecked.
}
}
}
checkStepCompletion();
</script>
<script src="auth.js"></script>
<script src="branding.js"></script>
<script src="branding.js?v=3"></script>
</body>
</html>