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

+14 -13
View File
@@ -4,7 +4,7 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Training — Nexus One AI</title>
<link rel="stylesheet" href="style.css?v=4">
<link rel="stylesheet" href="style.css?v=12">
<style>
/* ── Shared layout ────────────────────────────────────────── */
.tr-card { background:var(--navy2); border:1px solid var(--bdr); border-radius:14px; padding:28px; margin-bottom:28px; }
@@ -113,6 +113,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>
@@ -152,7 +153,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>
@@ -167,12 +168,12 @@
<!-- ── 1. Dataset Manager ── -->
<div class="tr-card">
<div class="tr-card-title">📂 Dataset Manager</div>
<div class="tr-card-title"><span class="icon-svg icon-sm" aria-hidden="true"><svg viewBox="0 0 24 24"><path d="M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/></svg></span> Dataset Manager</div>
<div class="tr-card-sub">Upload JSONL or CSV files. JSONL rows must have a <code>text</code> field, or <code>prompt</code>/<code>completion</code> pair, or <code>instruction</code>/<code>output</code> pair.</div>
<div class="upload-zone" id="upload-zone" onclick="document.getElementById('file-input').click()">
<input type="file" id="file-input" accept=".jsonl,.json,.csv" onchange="uploadDataset(this.files[0])">
<div class="uz-icon">📤</div>
<div class="uz-icon"><span class="icon-svg icon-xl" aria-hidden="true"><svg viewBox="0 0 24 24"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><path d="M17 8l-5-5-5 5"/><path d="M12 3v12"/></svg></span></div>
<div class="uz-label">Click to upload or drag &amp; drop</div>
<div class="uz-hint">.jsonl · .json · .csv — max 500 MB</div>
</div>
@@ -180,7 +181,7 @@
<div style="margin-top:20px;">
<div class="tr-toolbar">
<button class="tr-btn ghost" onclick="loadDatasets()">↺ Refresh</button>
<button class="tr-btn ghost" onclick="loadDatasets()">Refresh</button>
</div>
<div class="tr-table-wrap">
<table class="tr-table">
@@ -197,7 +198,7 @@
<!-- ── 2. Launch Fine-Tune ── -->
<div class="tr-card">
<div class="tr-card-title">🚀 Launch Fine-Tune Job</div>
<div class="tr-card-title">Launch Fine-Tune Job</div>
<div class="tr-card-sub">Uses QLoRA (4-bit quantization + LoRA adapters). Requires a GPU with ≥ 8 GB VRAM.</div>
<div class="launch-form">
@@ -258,18 +259,18 @@
</div>
<div class="full">
<button class="tr-btn primary" onclick="launchJob()" id="launch-btn">▶ Launch Training</button>
<button class="tr-btn primary" onclick="launchJob()" id="launch-btn">Launch Training</button>
</div>
</div>
</div>
<!-- ── 3. Job Monitor ── -->
<div class="tr-card">
<div class="tr-card-title">📊 Training Jobs</div>
<div class="tr-card-title">Training Jobs</div>
<div class="tr-card-sub">Click a job row to expand logs and the live loss curve. Running jobs auto-refresh every 10 seconds.</div>
<div class="tr-toolbar">
<button class="tr-btn ghost" onclick="loadJobs()">↺ Refresh</button>
<button class="tr-btn ghost" onclick="loadJobs()">Refresh</button>
</div>
<div class="tr-table-wrap">
@@ -417,7 +418,7 @@ async function uploadDataset(file) {
const res = await fetch(`${_API}/training/datasets`, {method:'POST', credentials:'include', body:fd});
const d = await res.json();
if (!res.ok) throw new Error(d.detail || 'Upload failed');
toast(`✓ Uploaded ${file.name} — ${d.row_count.toLocaleString()} rows`);
toast(`Uploaded ${file.name} - ${d.row_count.toLocaleString()} rows`);
loadDatasets();
} catch(e) {
toast(e.message, true);
@@ -491,14 +492,14 @@ async function launchJob() {
});
const d = await res.json();
if (!res.ok) throw new Error(d.detail || 'Launch failed');
toast(`✓ Job "${name}" launched (ID: ${d.job_id})`);
toast(`Job "${name}" launched (ID: ${d.job_id})`);
loadJobs();
startAutoRefresh();
} catch(e) {
toast(e.message, true);
} finally {
btn.disabled = false;
btn.textContent = '▶ Launch Training';
btn.textContent = 'Launch Training';
}
}
@@ -725,6 +726,6 @@ loadModels();
loadJobs();
</script>
<script src="auth.js"></script>
<script src="branding.js"></script>
<script src="branding.js?v=3"></script>
</body>
</html>