diff --git a/src/viewer/index.html b/src/viewer/index.html index 5cfdccb04..d43d3f9e5 100644 --- a/src/viewer/index.html +++ b/src/viewer/index.html @@ -1491,23 +1491,13 @@

agentmemory

await apiGet('sessions'), await apiGet('memories?latest=true&limit=500'), await apiGet('graph/stats'), - await apiGet('audit?limit=5'), - await apiGet('semantic'), - await apiGet('procedural'), - await apiGet('relations'), - await apiGet('lessons'), - await apiGet('crystals') + await apiGet('audit?limit=5') ]; state.dashboard.health = results[0]; state.dashboard.sessions = (results[1] && results[1].sessions) || []; state.dashboard.memories = (results[2] && results[2].memories) || []; state.dashboard.graphStats = results[3]; state.dashboard.recentAudit = (results[4] && results[4].entries) || []; - state.dashboard.semantic = (results[5] && results[5].facts) || (results[5] && results[5].semantic) || []; - state.dashboard.procedural = (results[6] && results[6].procedures) || (results[6] && results[6].procedural) || []; - state.dashboard.lessons = (results[8] && results[8].lessons) || []; - state.dashboard.crystals = (results[9] && results[9].crystals) || []; - state.dashboard.relations = (results[7] && results[7].relations) || []; state.dashboard.loaded = true; renderDashboard(); } catch (err) { @@ -1721,12 +1711,15 @@

agentmemory

var semFacts = d.semantic || []; var procItems = d.procedural || []; var relItems = d.relations || []; + var consolidationDeferred = d.semantic === undefined; html += '
'; html += '
'; html += '
Semantic Memory
'; - if (semFacts.length === 0) { + if (consolidationDeferred) { + html += '
Not loaded on the dashboard to keep large memory stores responsive.
'; + } else if (semFacts.length === 0) { html += '
No semantic facts yet. Observations will be consolidated into semantic memories over time.
'; } else { semFacts.slice(0, 5).forEach(function(f) { @@ -1744,7 +1737,9 @@

agentmemory

html += '
'; html += '
Procedural Memory
'; - if (procItems.length === 0) { + if (consolidationDeferred) { + html += '
Not loaded on the dashboard to keep large memory stores responsive.
'; + } else if (procItems.length === 0) { html += '
No procedures yet. Repeated patterns will be extracted as procedures.
'; } else { procItems.slice(0, 5).forEach(function(p) { @@ -1766,10 +1761,10 @@

agentmemory

html += '
'; html += '
Consolidation Status
'; - html += '
Semantic facts' + semFacts.length + '
'; - html += '
Procedures' + procItems.length + '
'; - html += '
Relations' + relItems.length + '
'; - if (semFacts.length === 0 && procItems.length === 0 && relItems.length === 0) { + html += '
Semantic facts' + (consolidationDeferred ? '—' : semFacts.length) + '
'; + html += '
Procedures' + (consolidationDeferred ? '—' : procItems.length) + '
'; + html += '
Relations' + (consolidationDeferred ? '—' : relItems.length) + '
'; + if (!consolidationDeferred && semFacts.length === 0 && procItems.length === 0 && relItems.length === 0) { html += '
Consolidation distills session observations into durable facts and repeatable procedures. It runs on a schedule when CONSOLIDATION_ENABLED=true and an LLM provider key are set, or on demand via memory_consolidate.
'; } html += '
'; diff --git a/test/viewer-session-id.test.ts b/test/viewer-session-id.test.ts index 6c2f88834..292e1bd32 100644 --- a/test/viewer-session-id.test.ts +++ b/test/viewer-session-id.test.ts @@ -200,11 +200,6 @@ describe("viewer session rendering", () => { "/agentmemory/memories", "/agentmemory/graph/stats", "/agentmemory/audit", - "/agentmemory/semantic", - "/agentmemory/procedural", - "/agentmemory/relations", - "/agentmemory/lessons", - "/agentmemory/crystals", ]); }); @@ -228,7 +223,7 @@ describe("viewer session rendering", () => { releaseSessions(); await Promise.all([initialLoad, pendingRefresh]); - expect(paths).toHaveLength(20); + expect(paths).toHaveLength(10); }); it("attaches the saved viewer bearer to API calls", async () => {