[object Object]

← back to Ventura Claw

/changelog updated + ● Prime cache UI button on admin

d6f1881f42f1c46287f090fa1a7bcbcf36c5a94a · 2026-05-06 05:50:34 -0700 · Steve Abrams

- /changelog top entry now reflects what actually shipped overnight (admin endpoint, sequential prime fix, /feed, /faq, /docs, etc.)
- /admin/connectors filter bar gets a ● Prime cache button that calls /api/admin/cache/prime, shows primed N/5 + cache size

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

Files touched

Diff

commit d6f1881f42f1c46287f090fa1a7bcbcf36c5a94a
Author: Steve Abrams <info@agentabrams.com>
Date:   Wed May 6 05:50:34 2026 -0700

    /changelog updated + ● Prime cache UI button on admin
    
    - /changelog top entry now reflects what actually shipped overnight (admin endpoint, sequential prime fix, /feed, /faq, /docs, etc.)
    - /admin/connectors filter bar gets a ● Prime cache button that calls /api/admin/cache/prime, shows primed N/5 + cache size
    
    Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---
 server/public/admin-connectors.html | 29 +++++++++++++++++++++++++++++
 server/server.js                    | 13 +++++++++----
 2 files changed, 38 insertions(+), 4 deletions(-)

diff --git a/server/public/admin-connectors.html b/server/public/admin-connectors.html
index 1634cef..eefecdd 100644
--- a/server/public/admin-connectors.html
+++ b/server/public/admin-connectors.html
@@ -50,6 +50,8 @@
   <div class="glass" style="padding:18px;margin-bottom:18px;display:flex;gap:14px;align-items:center;flex-wrap:wrap">
     <input id="filter" placeholder="filter connectors…" style="flex:1;min-width:200px" />
     <select id="cat-filter" style="min-width:160px"><option value="">all categories</option></select>
+    <button id="prime-btn" type="button" class="btn" style="font-family:var(--mono);font-size:10px;letter-spacing:.14em;text-transform:uppercase;padding:8px 14px;border:1px solid var(--gold);color:var(--gold);background:transparent;border-radius:2px;cursor:pointer" title="Re-fire the 5 preset cache primes — useful when Mac1 has evicted qwen3 and visitors are eating cold-loads">● Prime cache</button>
+    <span id="prime-status" role="status" aria-live="polite" style="font-family:var(--mono);font-size:10px;color:var(--ink-mute);min-width:80px"></span>
     <select id="status-filter" style="min-width:140px">
       <option value="">all status</option>
       <option value="live">live API</option>
@@ -156,6 +158,33 @@ const filter = document.getElementById('filter'),
 filter.addEventListener('input', draw);
 catFilter.addEventListener('change', draw);
 statusFilter.addEventListener('change', draw);
+// Prime cache button — calls POST /api/admin/cache/prime, shows result inline.
+document.getElementById('prime-btn').addEventListener('click', async (e) => {
+  const btn = e.currentTarget;
+  const status = document.getElementById('prime-status');
+  const orig = btn.textContent;
+  btn.disabled = true; btn.textContent = '● priming…';
+  status.textContent = ''; status.style.color = 'var(--ink-mute)';
+  try {
+    const r = await fetch('/api/admin/cache/prime', { method: 'POST' });
+    const d = await r.json();
+    if (r.ok) {
+      btn.textContent = `✓ primed ${d.primed}/${d.total}`;
+      status.textContent = `cache size: ${d.cache_size}`;
+      status.style.color = 'var(--good)';
+    } else {
+      btn.textContent = '✗ failed';
+      status.textContent = (d.error || 'unknown error').slice(0, 40);
+      status.style.color = 'var(--bad)';
+    }
+  } catch (err) {
+    btn.textContent = '✗ network error';
+    status.style.color = 'var(--bad)';
+  } finally {
+    setTimeout(() => { btn.textContent = orig; btn.disabled = false; }, 5000);
+  }
+});
+
 document.getElementById('logout').addEventListener('click', async e => {
   e.preventDefault(); await fetch('/api/auth/logout', { method: 'POST' }); location.href = '/login';
 });
diff --git a/server/server.js b/server/server.js
index 1640586..9023049 100644
--- a/server/server.js
+++ b/server/server.js
@@ -1043,16 +1043,21 @@ set-cookie: cc_session=…; HttpOnly; Secure; SameSite=Lax
 
 // Public changelog — append entries here as work ships. Most-recent first.
 const CHANGELOG = [
-  { date: "2026-05-06", title: "Public surface hardening overnight", items: [
-    "Branded 404 page (HTML for browsers, JSON for /api/*)",
+  { date: "2026-05-06", title: "Overnight loop — public surface polish", items: [
+    "Admin POST /api/admin/cache/prime + ● Prime cache button on /admin/connectors (re-fires preset cache when Mac1 evicts qwen3)",
+    "Sequential preset cache prime on boot — 4/5 fills (was 2/3 with parallel) · presets serve in 20ms",
+    "/changelog page (this one) · /feed RSS · auto-discovery <link rel=alternate>",
+    "Branded 404 (HTML for browsers, JSON for /api/*)",
     "Favicon — gold connector-graph SVG · served at .ico/.svg/apple-touch-icon paths",
     "/healthz?format=json exposes uptime, mem, demo cache size, LLM endpoints",
     "Allowlist env loader extended for OLLAMA_FALLBACK_URL + CC_KEY_ID",
     "robots.txt cleanup — removed dead duplicate handler",
     "/docs page · 5 curl examples for public + auth API surface",
-    "/faq page (separate URL) with FAQPage JSON-LD for Google rich-result eligibility",
+    "/faq dedicated page with FAQPage JSON-LD for Google rich-result eligibility",
     "/privacy /terms /about — required SaaS pages",
-    "Initial git commit · 88 files · secrets clean",
+    "<noscript> graceful fallback · theme-color #0e0e10 · <link rel=prefetch href=/connectors>",
+    "esc() XSS sweep on chat.html + brand.html — all 5 user-facing HTML pages now hardened",
+    "Initial git commit (61cfcb1) · 88 files · secrets clean · gitignore covers all data/*.json",
   ]},
   { date: "2026-05-05 (evening)", title: "Public homepage shipped", items: [
     "/ now serves a real public homepage (was login redirect)",

← 320d50b Add POST /api/admin/cache/prime endpoint  ·  back to Ventura Claw  ·  Externalize homepage inline CSS to /static/homepage.css d9e7a6c →