hippo-memory 1.60.0 → 1.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/ablation.js +9 -27
- package/dist/agent-memories/apply.js +4 -1
- package/dist/agent-memories/claude-code.js +1 -1
- package/dist/agent-memories/codex.js +1 -1
- package/dist/agent-memories/gemini.js +1 -1
- package/dist/agent-memories/legacy.js +1 -1
- package/dist/agent-memories/source.js +1 -1
- package/dist/agent-memories/sync.js +8 -3
- package/dist/ambient-store.d.ts +14 -0
- package/dist/ambient-store.js +90 -0
- package/dist/ambient.d.ts +23 -0
- package/dist/ambient.js +72 -50
- package/dist/api/assemble.d.ts +93 -0
- package/dist/api/assemble.js +152 -0
- package/dist/api/audit.d.ts +17 -0
- package/dist/api/audit.js +23 -0
- package/dist/api/auth.d.ts +79 -0
- package/dist/api/auth.js +178 -0
- package/dist/api/context-types.d.ts +105 -0
- package/dist/api/context-types.js +3 -0
- package/dist/api/context.d.ts +31 -0
- package/dist/api/context.js +705 -0
- package/dist/api/dormant.d.ts +30 -0
- package/dist/api/dormant.js +140 -0
- package/dist/api/drill-down.d.ts +84 -0
- package/dist/api/drill-down.js +123 -0
- package/dist/api/forget.d.ts +57 -0
- package/dist/api/forget.js +87 -0
- package/dist/api/goals.d.ts +18 -0
- package/dist/api/goals.js +33 -0
- package/dist/api/learn.d.ts +31 -0
- package/dist/api/learn.js +88 -0
- package/dist/api/outcome.d.ts +61 -0
- package/dist/api/outcome.js +66 -0
- package/dist/api/promote.d.ts +54 -0
- package/dist/api/promote.js +203 -0
- package/dist/api/quarantine.d.ts +24 -0
- package/dist/api/quarantine.js +121 -0
- package/dist/api/recall-types.d.ts +390 -0
- package/dist/api/recall-types.js +3 -0
- package/dist/api/recall.d.ts +36 -0
- package/dist/api/recall.js +634 -0
- package/dist/api/remember.d.ts +35 -0
- package/dist/api/remember.js +43 -0
- package/dist/api/sleep.d.ts +136 -0
- package/dist/api/sleep.js +271 -0
- package/dist/api/tokens.d.ts +26 -0
- package/dist/api/tokens.js +60 -0
- package/dist/api/types.d.ts +56 -0
- package/dist/api/types.js +38 -0
- package/dist/api.d.ts +20 -1262
- package/dist/api.js +25 -2727
- package/dist/audit.d.ts +3 -0
- package/dist/audit.js +6 -3
- package/dist/auth.d.ts +45 -4
- package/dist/auth.js +125 -48
- package/dist/autolearn.js +2 -2
- package/dist/capture/command.d.ts +33 -0
- package/dist/capture/command.js +264 -0
- package/dist/capture/compact.d.ts +44 -0
- package/dist/capture/compact.js +354 -0
- package/dist/capture/extract.d.ts +21 -0
- package/dist/capture/extract.js +464 -0
- package/dist/capture/transcript.d.ts +40 -0
- package/dist/capture/transcript.js +193 -0
- package/dist/capture-error.js +2 -1
- package/dist/churn-git.js +4 -2
- package/dist/cli/audit.d.ts +3 -0
- package/dist/cli/audit.js +159 -0
- package/dist/cli/auth.d.ts +2 -0
- package/dist/cli/auth.js +171 -0
- package/dist/cli/briefs.d.ts +4 -0
- package/dist/cli/briefs.js +435 -0
- package/dist/cli/card.d.ts +3 -0
- package/dist/cli/card.js +333 -0
- package/dist/cli/context.d.ts +15 -0
- package/dist/cli/context.js +366 -0
- package/dist/cli/continuity.d.ts +6 -0
- package/dist/cli/continuity.js +445 -0
- package/dist/cli/curate.d.ts +19 -0
- package/dist/cli/curate.js +555 -0
- package/dist/cli/dag.d.ts +5 -0
- package/dist/cli/dag.js +177 -0
- package/dist/cli/decisions.d.ts +4 -0
- package/dist/cli/decisions.js +528 -0
- package/dist/cli/eval.d.ts +5 -0
- package/dist/cli/eval.js +213 -0
- package/dist/cli/explain.d.ts +4 -0
- package/dist/cli/explain.js +150 -0
- package/dist/cli/goals.d.ts +2 -0
- package/dist/cli/goals.js +196 -0
- package/dist/cli/hook-blocks.d.ts +18 -0
- package/dist/cli/hook-blocks.js +233 -0
- package/dist/cli/init.d.ts +2 -0
- package/dist/cli/init.js +305 -0
- package/dist/cli/maintenance.d.ts +4 -0
- package/dist/cli/maintenance.js +179 -0
- package/dist/cli/playbooks.d.ts +4 -0
- package/dist/cli/playbooks.js +556 -0
- package/dist/cli/projects.js +1 -1
- package/dist/cli/recall.d.ts +7 -0
- package/dist/cli/recall.js +597 -0
- package/dist/cli/remember.d.ts +5 -0
- package/dist/cli/remember.js +442 -0
- package/dist/cli/serve.d.ts +5 -0
- package/dist/cli/serve.js +40 -0
- package/dist/cli/session-hooks.d.ts +29 -0
- package/dist/cli/session-hooks.js +637 -0
- package/dist/cli/setup.d.ts +4 -0
- package/dist/cli/setup.js +376 -0
- package/dist/cli/shared.d.ts +15 -19
- package/dist/cli/shared.js +50 -341
- package/dist/cli/slack.d.ts +2 -0
- package/dist/cli/slack.js +171 -0
- package/dist/cli/status.d.ts +18 -0
- package/dist/cli/status.js +400 -0
- package/dist/cli/transfer.d.ts +10 -0
- package/dist/cli/transfer.js +438 -0
- package/dist/cli/usage.d.ts +85 -0
- package/dist/cli/usage.js +741 -0
- package/dist/cli.d.ts +71 -120
- package/dist/cli.js +170 -8469
- package/dist/client.js +15 -8
- package/dist/compaction-record.js +6 -4
- package/dist/connectors/github/backfill.js +94 -87
- package/dist/connectors/github/cli-impl.js +4 -3
- package/dist/connectors/github/dlq.js +67 -54
- package/dist/connectors/github/ingest.js +34 -35
- package/dist/connectors/github/tenant-routing.js +3 -2
- package/dist/connectors/github/webhook.js +135 -216
- package/dist/connectors/slack/dlq.js +49 -61
- package/dist/connectors/slack/ingest.js +55 -48
- package/dist/connectors/slack/tenant-routing.js +4 -3
- package/dist/connectors/slack/webhook.js +72 -74
- package/dist/consolidate/conflicts.d.ts +10 -0
- package/dist/consolidate/conflicts.js +178 -0
- package/dist/consolidate/decay.d.ts +12 -0
- package/dist/consolidate/decay.js +145 -0
- package/dist/consolidate/llm-passes.d.ts +3 -0
- package/dist/consolidate/llm-passes.js +141 -0
- package/dist/consolidate/merge.d.ts +7 -0
- package/dist/consolidate/merge.js +251 -0
- package/dist/consolidate/physics-pass.d.ts +3 -0
- package/dist/consolidate/physics-pass.js +60 -0
- package/dist/consolidate/run.d.ts +69 -0
- package/dist/consolidate/run.js +76 -0
- package/dist/consolidate/sleep.d.ts +18 -0
- package/dist/consolidate/sleep.js +209 -0
- package/dist/consolidate/traces.d.ts +4 -0
- package/dist/consolidate/traces.js +178 -0
- package/dist/context-auto.js +7 -11
- package/dist/context-render.d.ts +1 -1
- package/dist/context-render.js +1 -1
- package/dist/customer-notes.d.ts +3 -0
- package/dist/customer-notes.js +6 -4
- package/dist/dag.js +6 -5
- package/dist/dashboard-actions.d.ts +20 -0
- package/dist/dashboard-actions.js +88 -0
- package/dist/dashboard-params.d.ts +45 -0
- package/dist/dashboard-params.js +127 -0
- package/dist/dashboard-queries.d.ts +15 -0
- package/dist/dashboard-queries.js +355 -0
- package/dist/dashboard-snapshot.d.ts +138 -0
- package/dist/dashboard-snapshot.js +308 -0
- package/dist/dashboard-types.d.ts +163 -0
- package/dist/dashboard-types.js +3 -0
- package/dist/dashboard.d.ts +6 -7
- package/dist/dashboard.js +228 -202
- package/dist/db/busy.d.ts +5 -0
- package/dist/db/busy.js +24 -0
- package/dist/db/continuity.d.ts +5 -0
- package/dist/db/continuity.js +145 -0
- package/dist/db/meta.d.ts +8 -0
- package/dist/db/meta.js +35 -0
- package/dist/db/migrate.d.ts +9 -0
- package/dist/db/migrate.js +138 -0
- package/dist/db/migrations/index.d.ts +5 -0
- package/dist/db/migrations/index.js +109 -0
- package/dist/db/migrations/types.d.ts +14 -0
- package/dist/db/migrations/types.js +2 -0
- package/dist/db/migrations/v01.d.ts +3 -0
- package/dist/db/migrations/v01.js +38 -0
- package/dist/db/migrations/v02.d.ts +3 -0
- package/dist/db/migrations/v02.js +21 -0
- package/dist/db/migrations/v03.d.ts +3 -0
- package/dist/db/migrations/v03.js +22 -0
- package/dist/db/migrations/v04.d.ts +3 -0
- package/dist/db/migrations/v04.js +28 -0
- package/dist/db/migrations/v05.d.ts +3 -0
- package/dist/db/migrations/v05.js +21 -0
- package/dist/db/migrations/v06.d.ts +3 -0
- package/dist/db/migrations/v06.js +25 -0
- package/dist/db/migrations/v07.d.ts +3 -0
- package/dist/db/migrations/v07.js +13 -0
- package/dist/db/migrations/v08.d.ts +3 -0
- package/dist/db/migrations/v08.js +8 -0
- package/dist/db/migrations/v09.d.ts +3 -0
- package/dist/db/migrations/v09.js +13 -0
- package/dist/db/migrations/v10.d.ts +3 -0
- package/dist/db/migrations/v10.js +17 -0
- package/dist/db/migrations/v11.d.ts +3 -0
- package/dist/db/migrations/v11.js +15 -0
- package/dist/db/migrations/v12.d.ts +3 -0
- package/dist/db/migrations/v12.js +11 -0
- package/dist/db/migrations/v13.d.ts +3 -0
- package/dist/db/migrations/v13.js +15 -0
- package/dist/db/migrations/v14.d.ts +3 -0
- package/dist/db/migrations/v14.js +66 -0
- package/dist/db/migrations/v15.d.ts +3 -0
- package/dist/db/migrations/v15.js +42 -0
- package/dist/db/migrations/v16.d.ts +3 -0
- package/dist/db/migrations/v16.js +61 -0
- package/dist/db/migrations/v17.d.ts +3 -0
- package/dist/db/migrations/v17.js +46 -0
- package/dist/db/migrations/v18.d.ts +3 -0
- package/dist/db/migrations/v18.js +60 -0
- package/dist/db/migrations/v19.d.ts +3 -0
- package/dist/db/migrations/v19.js +28 -0
- package/dist/db/migrations/v20.d.ts +3 -0
- package/dist/db/migrations/v20.js +42 -0
- package/dist/db/migrations/v21.d.ts +3 -0
- package/dist/db/migrations/v21.js +16 -0
- package/dist/db/migrations/v22.d.ts +3 -0
- package/dist/db/migrations/v22.js +82 -0
- package/dist/db/migrations/v23.d.ts +3 -0
- package/dist/db/migrations/v23.js +48 -0
- package/dist/db/migrations/v24.d.ts +3 -0
- package/dist/db/migrations/v24.js +72 -0
- package/dist/db/migrations/v25.d.ts +3 -0
- package/dist/db/migrations/v25.js +46 -0
- package/dist/db/migrations/v26.d.ts +3 -0
- package/dist/db/migrations/v26.js +23 -0
- package/dist/db/migrations/v27.d.ts +3 -0
- package/dist/db/migrations/v27.js +57 -0
- package/dist/db/migrations/v28.d.ts +3 -0
- package/dist/db/migrations/v28.js +38 -0
- package/dist/db/migrations/v29.d.ts +3 -0
- package/dist/db/migrations/v29.js +78 -0
- package/dist/db/migrations/v30.d.ts +3 -0
- package/dist/db/migrations/v30.js +92 -0
- package/dist/db/migrations/v31.d.ts +3 -0
- package/dist/db/migrations/v31.js +74 -0
- package/dist/db/migrations/v32.d.ts +3 -0
- package/dist/db/migrations/v32.js +102 -0
- package/dist/db/migrations/v33.d.ts +3 -0
- package/dist/db/migrations/v33.js +104 -0
- package/dist/db/migrations/v34.d.ts +3 -0
- package/dist/db/migrations/v34.js +93 -0
- package/dist/db/migrations/v35.d.ts +3 -0
- package/dist/db/migrations/v35.js +98 -0
- package/dist/db/migrations/v36.d.ts +3 -0
- package/dist/db/migrations/v36.js +98 -0
- package/dist/db/migrations/v37.d.ts +3 -0
- package/dist/db/migrations/v37.js +219 -0
- package/dist/db/migrations/v38.d.ts +3 -0
- package/dist/db/migrations/v38.js +277 -0
- package/dist/db/migrations/v39.d.ts +3 -0
- package/dist/db/migrations/v39.js +59 -0
- package/dist/db/migrations/v40.d.ts +3 -0
- package/dist/db/migrations/v40.js +74 -0
- package/dist/db/migrations/v41.d.ts +3 -0
- package/dist/db/migrations/v41.js +43 -0
- package/dist/db/migrations/v42.d.ts +3 -0
- package/dist/db/migrations/v42.js +41 -0
- package/dist/db/migrations/v43.d.ts +3 -0
- package/dist/db/migrations/v43.js +67 -0
- package/dist/db/migrations/v44.d.ts +3 -0
- package/dist/db/migrations/v44.js +28 -0
- package/dist/db/migrations/v45.d.ts +3 -0
- package/dist/db/migrations/v45.js +30 -0
- package/dist/db/migrations/v46.d.ts +3 -0
- package/dist/db/migrations/v46.js +25 -0
- package/dist/db/migrations/v47.d.ts +3 -0
- package/dist/db/migrations/v47.js +17 -0
- package/dist/db/migrations/v48.d.ts +3 -0
- package/dist/db/migrations/v48.js +10 -0
- package/dist/db/migrations/v49.d.ts +3 -0
- package/dist/db/migrations/v49.js +31 -0
- package/dist/db/migrations/v50.d.ts +3 -0
- package/dist/db/migrations/v50.js +67 -0
- package/dist/db/migrations/v51.d.ts +3 -0
- package/dist/db/migrations/v51.js +14 -0
- package/dist/db/migrations/v52.d.ts +3 -0
- package/dist/db/migrations/v52.js +7 -0
- package/dist/db/open.d.ts +23 -0
- package/dist/db/open.js +146 -0
- package/dist/db/sqlite.d.ts +21 -0
- package/dist/db/sqlite.js +8 -0
- package/dist/db/tables.d.ts +7 -0
- package/dist/db/tables.js +38 -0
- package/dist/db.d.ts +6 -46
- package/dist/db.js +5 -3049
- package/dist/decisions.d.ts +4 -1
- package/dist/decisions.js +9 -7
- package/dist/dedupe.js +3 -2
- package/dist/delivery-recorder.js +4 -1
- package/dist/doctor.js +3 -3
- package/dist/embedding-provider.d.ts +1 -1
- package/dist/embedding-provider.js +4 -3
- package/dist/embeddings.d.ts +9 -52
- package/dist/embeddings.js +43 -297
- package/dist/env.d.ts +75 -0
- package/dist/env.js +119 -0
- package/dist/eval-suite.js +1 -1
- package/dist/eval.js +2 -2
- package/dist/extract.js +1 -1
- package/dist/gated-write.js +3 -1
- package/dist/goals.d.ts +3 -1
- package/dist/goals.js +18 -0
- package/dist/graph/read.d.ts +73 -0
- package/dist/graph/read.js +325 -0
- package/dist/graph/rows.d.ts +45 -0
- package/dist/graph/rows.js +51 -0
- package/dist/graph/types.d.ts +83 -0
- package/dist/graph/types.js +11 -0
- package/dist/graph/write.d.ts +93 -0
- package/dist/{graph.js → graph/write.js} +6 -384
- package/dist/graph-extract.js +2 -1
- package/dist/graph-recall.d.ts +1 -1
- package/dist/graph-recall.js +2 -2
- package/dist/graph-stream.js +1 -1
- package/dist/graph-view.d.ts +1 -1
- package/dist/graph-view.js +1 -1
- package/dist/half-life-migration.d.ts +1 -1
- package/dist/half-life-migration.js +2 -1
- package/dist/hooks/codex-session.d.ts +8 -0
- package/dist/hooks/codex-session.js +76 -0
- package/dist/hooks/codex-wrapper.d.ts +55 -0
- package/dist/hooks/codex-wrapper.js +288 -0
- package/dist/hooks/json-hooks.d.ts +63 -0
- package/dist/hooks/json-hooks.js +356 -0
- package/dist/hooks/opencode.d.ts +50 -0
- package/dist/hooks/opencode.js +202 -0
- package/dist/hooks/shared.d.ts +54 -0
- package/dist/hooks/shared.js +77 -0
- package/dist/http-retry.d.ts +2 -0
- package/dist/http-retry.js +4 -3
- package/dist/http-util.d.ts +3 -0
- package/dist/http-util.js +10 -0
- package/dist/{importers.d.ts → importers/core.d.ts} +13 -17
- package/dist/importers/core.js +141 -0
- package/dist/importers/markdown-parse.d.ts +41 -0
- package/dist/importers/markdown-parse.js +132 -0
- package/dist/importers/markdown.d.ts +3 -0
- package/dist/importers/markdown.js +92 -0
- package/dist/importers/sources.d.ts +7 -0
- package/dist/importers/sources.js +229 -0
- package/dist/importers/vault.d.ts +11 -0
- package/dist/importers/vault.js +352 -0
- package/dist/incidents.d.ts +3 -0
- package/dist/incidents.js +7 -5
- package/dist/index.d.ts +25 -6
- package/dist/index.js +23 -6
- package/dist/invalidation.js +2 -1
- package/dist/judgment.js +2 -1
- package/dist/keyset.d.ts +13 -0
- package/dist/keyset.js +8 -0
- package/dist/local-embedding.d.ts +13 -0
- package/dist/local-embedding.js +165 -0
- package/dist/log.d.ts +7 -0
- package/dist/log.js +19 -1
- package/dist/mcp/admin-tools.d.ts +8 -0
- package/dist/mcp/admin-tools.js +116 -0
- package/dist/mcp/format.d.ts +27 -0
- package/dist/mcp/format.js +135 -0
- package/dist/mcp/memory-tools.d.ts +5 -0
- package/dist/mcp/memory-tools.js +83 -0
- package/dist/mcp/protocol.d.ts +83 -0
- package/dist/mcp/protocol.js +55 -0
- package/dist/mcp/recall-tools.d.ts +6 -0
- package/dist/mcp/recall-tools.js +320 -0
- package/dist/mcp/request.d.ts +10 -0
- package/dist/mcp/request.js +163 -0
- package/dist/mcp/server.d.ts +4 -75
- package/dist/mcp/server.js +7 -1190
- package/dist/mcp/session-state.d.ts +11 -0
- package/dist/mcp/session-state.js +28 -0
- package/dist/mcp/stdio.d.ts +8 -0
- package/dist/mcp/stdio.js +79 -0
- package/dist/mcp/tools.d.ts +11 -0
- package/dist/mcp/tools.js +247 -0
- package/dist/memory.d.ts +3 -0
- package/dist/memory.js +27 -1
- package/dist/multihop.d.ts +1 -1
- package/dist/multihop.js +2 -1
- package/dist/owner-validation.js +2 -1
- package/dist/physics-state.js +10 -7
- package/dist/policies.d.ts +3 -0
- package/dist/policies.js +8 -6
- package/dist/postinstall.js +3 -2
- package/dist/predictions/planning-fallacy.d.ts +100 -0
- package/dist/predictions/planning-fallacy.js +190 -0
- package/dist/{predictions.d.ts → predictions/store.d.ts} +7 -102
- package/dist/predictions/store.js +434 -0
- package/dist/processes.d.ts +3 -0
- package/dist/processes.js +7 -5
- package/dist/project-briefs.d.ts +3 -0
- package/dist/project-briefs.js +7 -5
- package/dist/project-identity.js +3 -2
- package/dist/project-merge.js +3 -1
- package/dist/quarantine.d.ts +2 -1
- package/dist/quarantine.js +8 -5
- package/dist/raw-archive.js +1 -1
- package/dist/recall-history.js +3 -2
- package/dist/recall-pipeline.d.ts +2 -2
- package/dist/recall-pipeline.js +16 -8
- package/dist/recall-scope.js +1 -1
- package/dist/recall-trace.d.ts +1 -1
- package/dist/refine-llm.js +2 -1
- package/dist/reject-flow.js +6 -1
- package/dist/rerankers/clef.js +6 -5
- package/dist/rerankers/jev.d.ts +1 -1
- package/dist/rerankers/jev.js +4 -4
- package/dist/rerankers/llm.d.ts +4 -2
- package/dist/rerankers/llm.js +58 -38
- package/dist/rerankers/types.d.ts +1 -1
- package/dist/salience.js +1 -1
- package/dist/scheduler.d.ts +1 -0
- package/dist/scheduler.js +26 -4
- package/dist/scope.js +4 -3
- package/dist/search/as-of.d.ts +10 -0
- package/dist/search/as-of.js +22 -0
- package/dist/search/bm25-search.d.ts +14 -0
- package/dist/search/bm25-search.js +43 -0
- package/dist/search/bm25.d.ts +15 -0
- package/dist/search/bm25.js +54 -0
- package/dist/search/boosts.d.ts +54 -0
- package/dist/search/boosts.js +94 -0
- package/dist/search/breakdown.d.ts +7 -0
- package/dist/search/breakdown.js +20 -0
- package/dist/search/explain.d.ts +25 -0
- package/dist/search/explain.js +31 -0
- package/dist/search/finalize.d.ts +8 -0
- package/dist/search/finalize.js +52 -0
- package/dist/search/fusion.d.ts +27 -0
- package/dist/search/fusion.js +42 -0
- package/dist/search/hybrid-score.d.ts +20 -0
- package/dist/search/hybrid-score.js +73 -0
- package/dist/search/hybrid.d.ts +46 -0
- package/dist/search/hybrid.js +64 -0
- package/dist/search/physics-search.d.ts +29 -0
- package/dist/search/physics-search.js +162 -0
- package/dist/search/rerank.d.ts +10 -0
- package/dist/search/rerank.js +72 -0
- package/dist/search/temporal.d.ts +15 -0
- package/dist/search/temporal.js +45 -0
- package/dist/search/types.d.ts +91 -0
- package/dist/search/types.js +2 -0
- package/dist/search/vector.d.ts +30 -0
- package/dist/search/vector.js +71 -0
- package/dist/secret-detect.d.ts +2 -0
- package/dist/secret-detect.js +2 -1
- package/dist/server/auth.d.ts +52 -0
- package/dist/server/auth.js +221 -0
- package/dist/server/client-ip.d.ts +25 -0
- package/dist/server/client-ip.js +92 -0
- package/dist/server/cursor.d.ts +23 -0
- package/dist/server/cursor.js +58 -0
- package/dist/server/lifecycle.d.ts +7 -0
- package/dist/server/lifecycle.js +29 -0
- package/dist/server/mcp-http.d.ts +5 -0
- package/dist/server/mcp-http.js +199 -0
- package/dist/server/request.d.ts +33 -0
- package/dist/server/request.js +103 -0
- package/dist/server/routes/admin.d.ts +9 -0
- package/dist/server/routes/admin.js +158 -0
- package/dist/server/routes/customer-notes.d.ts +7 -0
- package/dist/server/routes/customer-notes.js +112 -0
- package/dist/server/routes/decisions.d.ts +7 -0
- package/dist/server/routes/decisions.js +133 -0
- package/dist/server/routes/incidents.d.ts +7 -0
- package/dist/server/routes/incidents.js +126 -0
- package/dist/server/routes/memories.d.ts +10 -0
- package/dist/server/routes/memories.js +179 -0
- package/dist/server/routes/policies.d.ts +8 -0
- package/dist/server/routes/policies.js +151 -0
- package/dist/server/routes/predictions.d.ts +7 -0
- package/dist/server/routes/predictions.js +164 -0
- package/dist/server/routes/processes.d.ts +7 -0
- package/dist/server/routes/processes.js +161 -0
- package/dist/server/routes/project-briefs.d.ts +8 -0
- package/dist/server/routes/project-briefs.js +136 -0
- package/dist/server/routes/recall.d.ts +8 -0
- package/dist/server/routes/recall.js +340 -0
- package/dist/server/routes/skills.d.ts +8 -0
- package/dist/server/routes/skills.js +150 -0
- package/dist/server/types.d.ts +56 -0
- package/dist/server/types.js +2 -0
- package/dist/server/validation.d.ts +14 -0
- package/dist/server/validation.js +91 -0
- package/dist/server.d.ts +7 -61
- package/dist/server.js +69 -2362
- package/dist/session-digest.d.ts +1 -1
- package/dist/session-digest.js +9 -2
- package/dist/shared.d.ts +3 -1
- package/dist/shared.js +26 -22
- package/dist/skills.d.ts +3 -0
- package/dist/skills.js +7 -5
- package/dist/stdin.js +2 -2
- package/dist/store/audit-event.d.ts +19 -0
- package/dist/store/audit-event.js +33 -0
- package/dist/store/candidates.d.ts +42 -0
- package/dist/store/candidates.js +152 -0
- package/dist/store/conflicts.d.ts +44 -0
- package/dist/store/conflicts.js +444 -0
- package/dist/store/delete-and-batch.d.ts +63 -0
- package/dist/store/delete-and-batch.js +310 -0
- package/dist/store/entry-reads.d.ts +92 -0
- package/dist/store/entry-reads.js +255 -0
- package/dist/store/entry-row.d.ts +67 -0
- package/dist/store/entry-row.js +208 -0
- package/dist/store/entry-writes.d.ts +46 -0
- package/dist/store/entry-writes.js +148 -0
- package/dist/store/handoffs.d.ts +26 -0
- package/dist/store/handoffs.js +184 -0
- package/dist/store/index-and-stats.d.ts +52 -0
- package/dist/store/index-and-stats.js +214 -0
- package/dist/store/markdown.d.ts +10 -0
- package/dist/store/markdown.js +108 -0
- package/dist/store/mirrors.d.ts +49 -0
- package/dist/store/mirrors.js +312 -0
- package/dist/store/open.d.ts +15 -0
- package/dist/store/open.js +223 -0
- package/dist/store/rows.d.ts +178 -0
- package/dist/store/rows.js +158 -0
- package/dist/store/search-rows.d.ts +86 -0
- package/dist/store/search-rows.js +254 -0
- package/dist/store/sessions.d.ts +83 -0
- package/dist/store/sessions.js +272 -0
- package/dist/store/summaries.d.ts +94 -0
- package/dist/store/summaries.js +377 -0
- package/dist/store/tenant-lookup.d.ts +12 -0
- package/dist/store/tenant-lookup.js +16 -0
- package/dist/store-cards.js +2 -1
- package/dist/summary-dirty.d.ts +4 -0
- package/dist/summary-dirty.js +32 -0
- package/dist/support-bundle.js +4 -3
- package/dist/tenant.js +2 -2
- package/dist/tokenize.d.ts +2 -0
- package/dist/tokenize.js +16 -0
- package/dist/transcript-tail.d.ts +7 -0
- package/dist/transcript-tail.js +48 -0
- package/dist/vector-store.d.ts +27 -0
- package/dist/vector-store.js +210 -0
- package/dist/version.d.ts +2 -2
- package/dist/version.js +2 -2
- package/dist/working-memory.js +1 -1
- package/dist/yaml.js +36 -11
- package/dist-ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
- package/dist-ui/assets/index-DPN7cP19.js +33 -0
- package/dist-ui/assets/index-dFloKRVr.css +1 -0
- package/dist-ui/index.html +3 -25
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
- package/dist/capture.d.ts +0 -155
- package/dist/capture.js +0 -1295
- package/dist/consolidate.d.ts +0 -58
- package/dist/consolidate.js +0 -1124
- package/dist/graph.d.ts +0 -245
- package/dist/hooks.d.ts +0 -208
- package/dist/hooks.js +0 -1076
- package/dist/importers.js +0 -900
- package/dist/predictions.js +0 -620
- package/dist/search.d.ts +0 -320
- package/dist/search.js +0 -970
- package/dist/store.d.ts +0 -776
- package/dist/store.js +0 -3473
- package/dist-ui/assets/d3-BiWEKnn4.js +0 -1
- package/dist-ui/assets/index-BhT8RvO6.js +0 -61
- package/dist-ui/assets/index-RoXXJ5dq.css +0 -1
- package/dist-ui/assets/three-BDgTxR1l.js +0 -4112
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
// Read models over a snapshot: overview, project, memory page, search, and the fresh single-memory detail.
|
|
2
|
+
import { calculateStrength } from './memory.js';
|
|
3
|
+
import { listMemoryConflicts } from './store/conflicts.js';
|
|
4
|
+
import { readEntry } from './store/entry-reads.js';
|
|
5
|
+
import { BANDS, DAY_MS, LAYERS, isLiveMemory, memoryFacts, projectIdentity, } from './dashboard-snapshot.js';
|
|
6
|
+
const SERIES_DAYS = 90;
|
|
7
|
+
/** The server words each delta for this range; the client re-slices the series for 7d and 90d. */
|
|
8
|
+
const DELTA_DAYS = 30;
|
|
9
|
+
const POINTS_MAX = 4_000;
|
|
10
|
+
const GRID_COLS = 64;
|
|
11
|
+
const GRID_ROWS = 32;
|
|
12
|
+
const NAME_MATCHES = 3;
|
|
13
|
+
function round1(value) {
|
|
14
|
+
return Math.round(value * 10) / 10;
|
|
15
|
+
}
|
|
16
|
+
function round3(value) {
|
|
17
|
+
return Math.round(value * 1000) / 1000;
|
|
18
|
+
}
|
|
19
|
+
/** Cumulative counts at 91 daily points, oldest first: point 0 is the base at the window start, point 90 is now. */
|
|
20
|
+
function cumulativeSeries(times, nowMs) {
|
|
21
|
+
const days = Array.from({ length: SERIES_DAYS + 1 }, () => 0);
|
|
22
|
+
let base = 0;
|
|
23
|
+
for (const t of times) {
|
|
24
|
+
const ago = Math.floor((nowMs - t) / DAY_MS);
|
|
25
|
+
if (ago >= SERIES_DAYS)
|
|
26
|
+
base++;
|
|
27
|
+
else
|
|
28
|
+
days[SERIES_DAYS - Math.max(0, ago)]++;
|
|
29
|
+
}
|
|
30
|
+
let running = base;
|
|
31
|
+
return days.map((n) => (running += n));
|
|
32
|
+
}
|
|
33
|
+
function addedWithin(series) {
|
|
34
|
+
return series[SERIES_DAYS] - series[SERIES_DAYS - DELTA_DAYS];
|
|
35
|
+
}
|
|
36
|
+
function pct(share) {
|
|
37
|
+
return `${(share * 100).toFixed(1)}%`;
|
|
38
|
+
}
|
|
39
|
+
function plural(n, one, many) {
|
|
40
|
+
return `${n} ${n === 1 ? one : many}`;
|
|
41
|
+
}
|
|
42
|
+
/** Named projects by size, then Global, then Unassigned, as the treemap orders them. */
|
|
43
|
+
function orderedProjects(snap) {
|
|
44
|
+
const rank = (p) => (p.summary.kind === 'project' ? 0 : p.summary.kind === 'global' ? 1 : 2);
|
|
45
|
+
return [...snap.projects].sort((a, b) => rank(a) - rank(b) || b.summary.live - a.summary.live || (a.summary.name < b.summary.name ? -1 : 1));
|
|
46
|
+
}
|
|
47
|
+
function buildKpis(snap, projects) {
|
|
48
|
+
const total = snap.facts.length;
|
|
49
|
+
const named = projects.filter((p) => p.summary.kind === 'project');
|
|
50
|
+
const totalSeries = cumulativeSeries(snap.facts.map((f) => f.createdMs), snap.nowMs);
|
|
51
|
+
const projectSeries = cumulativeSeries(named.map((p) => p.firstCreatedMs), snap.nowMs);
|
|
52
|
+
const atRisk = projects.reduce((sum, p) => sum + p.summary.atRisk, 0);
|
|
53
|
+
const weakNow = snap.facts.reduce((sum, f) => sum + (f.strength < 0.2 ? 1 : 0), 0);
|
|
54
|
+
const withConflicts = projects.filter((p) => p.summary.openConflicts > 0).length;
|
|
55
|
+
const embedded = snap.embeddingCoverage === null ? 0 : Math.round(snap.embeddingCoverage * total);
|
|
56
|
+
return [
|
|
57
|
+
{
|
|
58
|
+
id: 'total', label: 'Total memories', value: total, series: totalSeries,
|
|
59
|
+
delta: `+${addedWithin(totalSeries)} created in the last ${DELTA_DAYS}d`,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
id: 'projects', label: 'Projects', value: named.length, series: projectSeries,
|
|
63
|
+
delta: `+${addedWithin(projectSeries)} new in ${DELTA_DAYS}d`,
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
id: 'atRiskShare', label: 'At-risk share, 30d', value: total > 0 ? atRisk / total : 0, series: null,
|
|
67
|
+
delta: `${pct(total > 0 ? weakNow / total : 0)} now at strength under 0.2`,
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
id: 'openConflicts', label: 'Open conflicts', value: snap.openConflicts, series: null,
|
|
71
|
+
delta: `in ${plural(withConflicts, 'project', 'projects')}`,
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
id: 'embeddingCoverage', label: 'Embedding coverage', value: snap.embeddingCoverage ?? 0, series: null,
|
|
75
|
+
delta: snap.embeddingCoverage === null ? 'no vector table yet' : `${total - embedded} not embedded`,
|
|
76
|
+
},
|
|
77
|
+
];
|
|
78
|
+
}
|
|
79
|
+
function topKeys(projects, count, score) {
|
|
80
|
+
return projects
|
|
81
|
+
.filter((p) => score(p) > 0)
|
|
82
|
+
.sort((a, b) => score(b) - score(a) || b.summary.live - a.summary.live || (a.summary.key < b.summary.key ? -1 : 1))
|
|
83
|
+
.slice(0, count)
|
|
84
|
+
.map((p) => p.summary.key);
|
|
85
|
+
}
|
|
86
|
+
/** The overview of one snapshot, built once and reused until the snapshot is replaced. */
|
|
87
|
+
export function buildOverview(snap) {
|
|
88
|
+
if (snap.memo.overview !== null)
|
|
89
|
+
return snap.memo.overview;
|
|
90
|
+
const ordered = orderedProjects(snap);
|
|
91
|
+
const overview = {
|
|
92
|
+
snapshotId: snap.id,
|
|
93
|
+
generatedAt: new Date(snap.nowMs).toISOString(),
|
|
94
|
+
total: snap.facts.length,
|
|
95
|
+
excluded: snap.excluded,
|
|
96
|
+
embeddingCoverage: snap.embeddingCoverage,
|
|
97
|
+
kpis: buildKpis(snap, ordered),
|
|
98
|
+
projects: ordered.map((p) => p.summary),
|
|
99
|
+
mostAtRisk: topKeys(ordered, 5, (p) => p.summary.atRisk),
|
|
100
|
+
mostConflicts: topKeys(ordered, 4, (p) => p.summary.openConflicts),
|
|
101
|
+
};
|
|
102
|
+
snap.memo.overview = overview;
|
|
103
|
+
return overview;
|
|
104
|
+
}
|
|
105
|
+
function buildScatter(snap, project) {
|
|
106
|
+
const cached = snap.memo.scatter.get(project.summary.key);
|
|
107
|
+
if (cached)
|
|
108
|
+
return cached;
|
|
109
|
+
let maxAge = 0;
|
|
110
|
+
for (const i of project.members)
|
|
111
|
+
maxAge = Math.max(maxAge, snap.facts[i].ageDays);
|
|
112
|
+
const maxAgeDays = Math.max(1, Math.ceil(maxAge));
|
|
113
|
+
let scatter;
|
|
114
|
+
if (project.members.length <= POINTS_MAX) {
|
|
115
|
+
const points = [];
|
|
116
|
+
const ids = [];
|
|
117
|
+
for (const i of project.members) {
|
|
118
|
+
const f = snap.facts[i];
|
|
119
|
+
points.push([round1(f.ageDays), round3(f.strength), f.layer, f.band]);
|
|
120
|
+
ids.push(f.id);
|
|
121
|
+
}
|
|
122
|
+
scatter = { mode: 'points', maxAgeDays, points, ids };
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
const cells = [[], [], [], []];
|
|
126
|
+
for (const layer of cells)
|
|
127
|
+
for (let k = 0; k < GRID_COLS * GRID_ROWS; k++)
|
|
128
|
+
layer.push(0);
|
|
129
|
+
const maxLog = Math.log10(maxAgeDays + 1);
|
|
130
|
+
for (const i of project.members) {
|
|
131
|
+
const f = snap.facts[i];
|
|
132
|
+
const col = Math.min(GRID_COLS - 1, Math.floor((Math.log10(f.ageDays + 1) / maxLog) * GRID_COLS));
|
|
133
|
+
const row = Math.min(GRID_ROWS - 1, Math.floor(f.strength * GRID_ROWS));
|
|
134
|
+
cells[f.layer][row * GRID_COLS + col]++;
|
|
135
|
+
}
|
|
136
|
+
scatter = { mode: 'grid', maxAgeDays, cols: GRID_COLS, rows: GRID_ROWS, cells };
|
|
137
|
+
}
|
|
138
|
+
snap.memo.scatter.set(project.summary.key, scatter);
|
|
139
|
+
return scatter;
|
|
140
|
+
}
|
|
141
|
+
/** Summary and scatter for one project key, or null when the key is unknown. */
|
|
142
|
+
export function buildProjectDetail(snap, key) {
|
|
143
|
+
const project = snap.byKey.get(key);
|
|
144
|
+
if (!project)
|
|
145
|
+
return null;
|
|
146
|
+
return { snapshotId: snap.id, summary: project.summary, scatter: buildScatter(snap, project) };
|
|
147
|
+
}
|
|
148
|
+
function numericSort(sort) {
|
|
149
|
+
switch (sort) {
|
|
150
|
+
case 'layer': return (f) => f.layer;
|
|
151
|
+
case 'strength': return (f) => f.strength;
|
|
152
|
+
case 'retrievals': return (f) => f.retrievals;
|
|
153
|
+
case 'last': return (f) => f.lastRetrievedDays;
|
|
154
|
+
case 'age': return (f) => f.ageDays;
|
|
155
|
+
case 'confidence': return (f) => f.confidenceRank;
|
|
156
|
+
case 'content':
|
|
157
|
+
case 'scope': return null;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
function comparator(facts, sort, dir) {
|
|
161
|
+
const sign = dir === 'asc' ? 1 : -1;
|
|
162
|
+
const tie = (a, b) => (facts[a].id < facts[b].id ? -1 : facts[a].id > facts[b].id ? 1 : 0);
|
|
163
|
+
const num = numericSort(sort);
|
|
164
|
+
if (num)
|
|
165
|
+
return (a, b) => (num(facts[a]) - num(facts[b])) * sign || tie(a, b);
|
|
166
|
+
// Content and scope compare precomputed strings with `<`; localeCompare per pair is far slower at 50k rows.
|
|
167
|
+
const text = sort === 'content' ? (f) => f.lower : (f) => f.scope ?? '';
|
|
168
|
+
return (a, b) => {
|
|
169
|
+
const x = text(facts[a]);
|
|
170
|
+
const y = text(facts[b]);
|
|
171
|
+
return (x < y ? -sign : x > y ? sign : 0) || tie(a, b);
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
function sortedMembers(snap, project, sort, dir) {
|
|
175
|
+
const key = `${project.summary.key}|${sort}|${dir}`;
|
|
176
|
+
const hit = snap.memo.sorted.get(key);
|
|
177
|
+
if (hit)
|
|
178
|
+
return hit;
|
|
179
|
+
const sorted = Int32Array.from(project.members).sort(comparator(snap.facts, sort, dir));
|
|
180
|
+
snap.memo.sorted.set(key, sorted);
|
|
181
|
+
return sorted;
|
|
182
|
+
}
|
|
183
|
+
function bucket(value) {
|
|
184
|
+
return value >= 0.5 ? 0 : value >= 0.2 ? 1 : 2;
|
|
185
|
+
}
|
|
186
|
+
function filterMembers(snap, sorted, query) {
|
|
187
|
+
const layerOn = [false, false, false, false];
|
|
188
|
+
for (const l of query.layers)
|
|
189
|
+
layerOn[l] = true;
|
|
190
|
+
const { brush, q } = query;
|
|
191
|
+
const kept = new Int32Array(sorted.length);
|
|
192
|
+
let n = 0;
|
|
193
|
+
const counts = { all: 0, risk: 0, pinned: 0, conflict: 0 };
|
|
194
|
+
const decay = { now: [0, 0, 0], in7d: [0, 0, 0], in30d: [0, 0, 0], pinned: 0 };
|
|
195
|
+
for (const i of sorted) {
|
|
196
|
+
const f = snap.facts[i];
|
|
197
|
+
if (!layerOn[f.layer])
|
|
198
|
+
continue;
|
|
199
|
+
if (f.ageDays < brush.amin || f.ageDays > brush.amax || f.strength < brush.smin || f.strength > brush.smax)
|
|
200
|
+
continue;
|
|
201
|
+
if (q !== null && !f.lower.includes(q) && !f.tagsLower.includes(q))
|
|
202
|
+
continue;
|
|
203
|
+
kept[n++] = i;
|
|
204
|
+
decay.now[bucket(f.strength)]++;
|
|
205
|
+
decay.in7d[bucket(f.strength7d)]++;
|
|
206
|
+
decay.in30d[bucket(f.strength30d)]++;
|
|
207
|
+
if (f.pinned) {
|
|
208
|
+
decay.pinned++;
|
|
209
|
+
counts.pinned++;
|
|
210
|
+
}
|
|
211
|
+
if (f.band === 3)
|
|
212
|
+
counts.risk++;
|
|
213
|
+
if (f.inConflict)
|
|
214
|
+
counts.conflict++;
|
|
215
|
+
counts.all++;
|
|
216
|
+
}
|
|
217
|
+
return { idx: kept.subarray(0, n), counts, decay, byChip: new Map() };
|
|
218
|
+
}
|
|
219
|
+
function filteredSet(snap, project, query) {
|
|
220
|
+
const { brush } = query;
|
|
221
|
+
const key = [
|
|
222
|
+
project.summary.key, query.sort, query.dir, query.layers.join(''),
|
|
223
|
+
brush.amin, brush.amax, brush.smin, brush.smax, query.q ?? '',
|
|
224
|
+
].join('|');
|
|
225
|
+
const hit = snap.memo.filtered.get(key);
|
|
226
|
+
if (hit)
|
|
227
|
+
return hit;
|
|
228
|
+
const set = filterMembers(snap, sortedMembers(snap, project, query.sort, query.dir), query);
|
|
229
|
+
snap.memo.filtered.set(key, set);
|
|
230
|
+
return set;
|
|
231
|
+
}
|
|
232
|
+
function chipMembers(snap, set, chip) {
|
|
233
|
+
if (chip === 'all')
|
|
234
|
+
return set.idx;
|
|
235
|
+
const hit = set.byChip.get(chip);
|
|
236
|
+
if (hit)
|
|
237
|
+
return hit;
|
|
238
|
+
const pick = (f) => (chip === 'risk' ? f.band === 3 : chip === 'pinned' ? f.pinned : f.inConflict);
|
|
239
|
+
const out = set.idx.filter((i) => pick(snap.facts[i]));
|
|
240
|
+
set.byChip.set(chip, out);
|
|
241
|
+
return out;
|
|
242
|
+
}
|
|
243
|
+
function toRow(f) {
|
|
244
|
+
return {
|
|
245
|
+
id: f.id,
|
|
246
|
+
content: f.head,
|
|
247
|
+
truncated: f.truncated,
|
|
248
|
+
layer: LAYERS[f.layer],
|
|
249
|
+
band: BANDS[f.band],
|
|
250
|
+
strength: round3(f.strength),
|
|
251
|
+
retrievals: f.retrievals,
|
|
252
|
+
lastRetrievedDays: round1(f.lastRetrievedDays),
|
|
253
|
+
ageDays: round1(f.ageDays),
|
|
254
|
+
confidence: f.confidence,
|
|
255
|
+
scope: f.scope,
|
|
256
|
+
pinned: f.pinned,
|
|
257
|
+
wrong: f.wrong,
|
|
258
|
+
inConflict: f.inConflict,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
/** One page of a project's memories under the query's sort and filters, or null when the key is unknown. */
|
|
262
|
+
export function buildMemoryPage(snap, key, query) {
|
|
263
|
+
const project = snap.byKey.get(key);
|
|
264
|
+
if (!project)
|
|
265
|
+
return null;
|
|
266
|
+
const set = filteredSet(snap, project, query);
|
|
267
|
+
const shown = chipMembers(snap, set, query.chip);
|
|
268
|
+
const rows = [];
|
|
269
|
+
for (let k = query.offset; k < Math.min(shown.length, query.offset + query.limit); k++) {
|
|
270
|
+
rows.push(toRow(snap.facts[shown[k]]));
|
|
271
|
+
}
|
|
272
|
+
const decay = set.decay;
|
|
273
|
+
return { snapshotId: snap.id, total: shown.length, offset: query.offset, limit: query.limit, counts: set.counts, decay, rows };
|
|
274
|
+
}
|
|
275
|
+
/** Substring search over content and tags across every project; it reads the snapshot and never touches recall. */
|
|
276
|
+
export function buildSearch(snap, text) {
|
|
277
|
+
const needle = text.toLowerCase();
|
|
278
|
+
const perProject = Array.from({ length: snap.projects.length }, () => 0);
|
|
279
|
+
let total = 0;
|
|
280
|
+
for (const f of snap.facts) {
|
|
281
|
+
if (f.lower.includes(needle) || f.tagsLower.includes(needle)) {
|
|
282
|
+
perProject[f.project]++;
|
|
283
|
+
total++;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
const hits = {};
|
|
287
|
+
snap.projects.forEach((p, i) => {
|
|
288
|
+
if (perProject[i] > 0)
|
|
289
|
+
hits[p.summary.key] = perProject[i];
|
|
290
|
+
});
|
|
291
|
+
const nameMatches = snap.projects
|
|
292
|
+
.filter((p) => p.summary.name.toLowerCase().includes(needle))
|
|
293
|
+
.sort((a, b) => b.summary.live - a.summary.live)
|
|
294
|
+
.slice(0, NAME_MATCHES)
|
|
295
|
+
.map((p) => ({ key: p.summary.key, name: p.summary.name, live: p.summary.live }));
|
|
296
|
+
return { snapshotId: snap.id, q: text, total, hits, nameMatches };
|
|
297
|
+
}
|
|
298
|
+
function openConflictsOf(hippoRoot, tenantId, entry, nowMs) {
|
|
299
|
+
const out = [];
|
|
300
|
+
for (const c of listMemoryConflicts(hippoRoot, 'open', tenantId)) {
|
|
301
|
+
if (c.memory_a_id !== entry.id && c.memory_b_id !== entry.id)
|
|
302
|
+
continue;
|
|
303
|
+
const otherId = c.memory_a_id === entry.id ? c.memory_b_id : c.memory_a_id;
|
|
304
|
+
const other = readEntry(hippoRoot, otherId, tenantId);
|
|
305
|
+
if (!other || !isLiveMemory(other))
|
|
306
|
+
continue;
|
|
307
|
+
out.push({
|
|
308
|
+
id: c.id,
|
|
309
|
+
reason: c.reason,
|
|
310
|
+
score: c.score,
|
|
311
|
+
other: {
|
|
312
|
+
id: other.id,
|
|
313
|
+
content: other.content,
|
|
314
|
+
strength: round3(calculateStrength(other, new Date(nowMs))),
|
|
315
|
+
retrievals: other.retrieval_count,
|
|
316
|
+
},
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
return out;
|
|
320
|
+
}
|
|
321
|
+
/** Full detail read fresh from the store, never from the snapshot, so the drawer is current inside the coalescing window. */
|
|
322
|
+
export function buildMemoryDetail(hippoRoot, tenantId, entry, snapshotId, nowMs, embedded) {
|
|
323
|
+
const f = memoryFacts(entry, nowMs);
|
|
324
|
+
const project = projectIdentity(entry.origin_project);
|
|
325
|
+
return {
|
|
326
|
+
snapshotId,
|
|
327
|
+
id: entry.id,
|
|
328
|
+
content: entry.content,
|
|
329
|
+
layer: LAYERS[f.layer],
|
|
330
|
+
band: BANDS[f.band],
|
|
331
|
+
tags: entry.tags,
|
|
332
|
+
strength: round3(f.strength),
|
|
333
|
+
strength7d: round3(f.strength7d),
|
|
334
|
+
strength30d: round3(f.strength30d),
|
|
335
|
+
halfLifeDays: entry.half_life_days,
|
|
336
|
+
retrievals: entry.retrieval_count,
|
|
337
|
+
lastRetrieved: entry.last_retrieved,
|
|
338
|
+
created: entry.created,
|
|
339
|
+
ageDays: round1(f.ageDays),
|
|
340
|
+
schemaFit: entry.schema_fit,
|
|
341
|
+
valence: entry.emotional_valence,
|
|
342
|
+
confidence: f.confidence,
|
|
343
|
+
agedOut: f.agedOut,
|
|
344
|
+
pinned: entry.pinned,
|
|
345
|
+
wrong: f.wrong,
|
|
346
|
+
projectKey: project.key,
|
|
347
|
+
projectName: project.name,
|
|
348
|
+
scope: entry.scope,
|
|
349
|
+
tenant: entry.tenantId,
|
|
350
|
+
kind: entry.kind,
|
|
351
|
+
embedded,
|
|
352
|
+
conflicts: openConflictsOf(hippoRoot, tenantId, entry, nowMs),
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
//# sourceMappingURL=dashboard-queries.js.map
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { Layer as MemoryLayer, type MemoryEntry } from './memory.js';
|
|
2
|
+
import type { MemoryConflict } from './store/rows.js';
|
|
3
|
+
import type { Band, ChipCounts, Layer, Overview, ProjectKind, ProjectSummary, ScatterGrid, ScatterPoints } from './dashboard-types.js';
|
|
4
|
+
export declare const DAY_MS = 86400000;
|
|
5
|
+
export declare const LAYERS: readonly Layer[];
|
|
6
|
+
export declare const BANDS: readonly Band[];
|
|
7
|
+
/** An outside commit rebuilds the snapshot at most this often. */
|
|
8
|
+
export declare const COALESCE_MS = 10000;
|
|
9
|
+
/** Projected strengths track the clock, so the snapshot is rebuilt at least this often. */
|
|
10
|
+
export declare const TTL_MS: number;
|
|
11
|
+
/** The one predicate for "shown on the dashboard": not superseded, not archived, not quarantined. */
|
|
12
|
+
export declare function isLiveMemory(entry: Pick<MemoryEntry, 'superseded_by' | 'kind' | 'scope'>): boolean;
|
|
13
|
+
/** Wire key, display name and kind of a project. */
|
|
14
|
+
export interface ProjectIdentity {
|
|
15
|
+
key: string;
|
|
16
|
+
name: string;
|
|
17
|
+
kind: ProjectKind;
|
|
18
|
+
}
|
|
19
|
+
/** Wire key, display name and kind for an `origin_project` value. */
|
|
20
|
+
export declare function projectIdentity(origin: string | null | undefined): ProjectIdentity;
|
|
21
|
+
/** Index of a layer in the wire order `LAYERS`. */
|
|
22
|
+
export declare function layerIndex(layer: MemoryLayer): number;
|
|
23
|
+
/** Per-memory numbers shared by the snapshot build and the single-memory detail route. */
|
|
24
|
+
export interface MemoryFacts {
|
|
25
|
+
strength: number;
|
|
26
|
+
strength7d: number;
|
|
27
|
+
strength30d: number;
|
|
28
|
+
band: number;
|
|
29
|
+
layer: number;
|
|
30
|
+
ageDays: number;
|
|
31
|
+
lastRetrievedDays: number;
|
|
32
|
+
confidence: string;
|
|
33
|
+
agedOut: boolean;
|
|
34
|
+
wrong: boolean;
|
|
35
|
+
}
|
|
36
|
+
/** Strength now and at +7d and +30d, band, age and the confidence split for one entry at `nowMs`. */
|
|
37
|
+
export declare function memoryFacts(entry: MemoryEntry, nowMs: number): MemoryFacts;
|
|
38
|
+
/** One live memory as the snapshot holds it: numbers and short strings only, never the full entry. */
|
|
39
|
+
export interface Fact {
|
|
40
|
+
id: string;
|
|
41
|
+
head: string;
|
|
42
|
+
truncated: boolean;
|
|
43
|
+
lower: string;
|
|
44
|
+
tagsLower: string;
|
|
45
|
+
layer: number;
|
|
46
|
+
band: number;
|
|
47
|
+
strength: number;
|
|
48
|
+
strength7d: number;
|
|
49
|
+
strength30d: number;
|
|
50
|
+
retrievals: number;
|
|
51
|
+
lastRetrievedDays: number;
|
|
52
|
+
ageDays: number;
|
|
53
|
+
confidence: string;
|
|
54
|
+
confidenceRank: number;
|
|
55
|
+
scope: string | null;
|
|
56
|
+
pinned: boolean;
|
|
57
|
+
wrong: boolean;
|
|
58
|
+
inConflict: boolean;
|
|
59
|
+
embedded: boolean;
|
|
60
|
+
project: number;
|
|
61
|
+
createdMs: number;
|
|
62
|
+
}
|
|
63
|
+
export interface ProjectAgg {
|
|
64
|
+
summary: ProjectSummary;
|
|
65
|
+
/** Indices into `Snapshot.facts`, in snapshot order. */
|
|
66
|
+
members: Int32Array;
|
|
67
|
+
firstCreatedMs: number;
|
|
68
|
+
}
|
|
69
|
+
export type Chip = 'all' | 'risk' | 'pinned' | 'conflict';
|
|
70
|
+
/** A filtered memory set over one project: indices in sort order, chip counts, decay buckets, and per-chip lists built on demand. */
|
|
71
|
+
export interface FilteredSet {
|
|
72
|
+
idx: Int32Array;
|
|
73
|
+
counts: ChipCounts;
|
|
74
|
+
decay: {
|
|
75
|
+
now: [number, number, number];
|
|
76
|
+
in7d: [number, number, number];
|
|
77
|
+
in30d: [number, number, number];
|
|
78
|
+
pinned: number;
|
|
79
|
+
};
|
|
80
|
+
byChip: Map<Chip, Int32Array>;
|
|
81
|
+
}
|
|
82
|
+
/** Small least-recently-used map; the oldest entry leaves when it is full. */
|
|
83
|
+
export declare class Lru<V> {
|
|
84
|
+
private readonly capacity;
|
|
85
|
+
private readonly entries;
|
|
86
|
+
constructor(capacity: number);
|
|
87
|
+
get(key: string): V | undefined;
|
|
88
|
+
set(key: string, value: V): void;
|
|
89
|
+
}
|
|
90
|
+
/** Per-snapshot memo of query results; it dies with the snapshot, so no key needs a snapshot id. */
|
|
91
|
+
export interface SnapshotMemo {
|
|
92
|
+
sorted: Lru<Int32Array>;
|
|
93
|
+
filtered: Lru<FilteredSet>;
|
|
94
|
+
scatter: Map<string, ScatterPoints | ScatterGrid>;
|
|
95
|
+
overview: Overview | null;
|
|
96
|
+
}
|
|
97
|
+
export interface Snapshot {
|
|
98
|
+
id: number;
|
|
99
|
+
tenantId: string;
|
|
100
|
+
nowMs: number;
|
|
101
|
+
facts: Fact[];
|
|
102
|
+
projects: ProjectAgg[];
|
|
103
|
+
byKey: Map<string, ProjectAgg>;
|
|
104
|
+
excluded: {
|
|
105
|
+
superseded: number;
|
|
106
|
+
archived: number;
|
|
107
|
+
quarantined: number;
|
|
108
|
+
};
|
|
109
|
+
/** Embedded share of live memories, or null when the store has no vector table yet. */
|
|
110
|
+
embeddingCoverage: number | null;
|
|
111
|
+
/** Open conflicts with both members live, each counted once. */
|
|
112
|
+
openConflicts: number;
|
|
113
|
+
memo: SnapshotMemo;
|
|
114
|
+
}
|
|
115
|
+
export interface SnapshotInput {
|
|
116
|
+
id: number;
|
|
117
|
+
tenantId: string;
|
|
118
|
+
nowMs: number;
|
|
119
|
+
entries: readonly MemoryEntry[];
|
|
120
|
+
openConflicts: readonly Pick<MemoryConflict, 'memory_a_id' | 'memory_b_id'>[];
|
|
121
|
+
embeddedIds: ReadonlySet<string> | null;
|
|
122
|
+
}
|
|
123
|
+
/** Builds the snapshot from already-loaded rows; it touches no store, so tests can feed it directly. */
|
|
124
|
+
export declare function buildSnapshot(input: SnapshotInput): Snapshot;
|
|
125
|
+
export interface SnapshotService {
|
|
126
|
+
/** The cached snapshot, or a new build when the cache key changed, the coalescing window allows it, or `fresh` is set. */
|
|
127
|
+
get(tenantId: string, fresh?: boolean): Snapshot;
|
|
128
|
+
/** Drops the cache after a dashboard write commits, so the next read rebuilds. */
|
|
129
|
+
invalidate(): void;
|
|
130
|
+
/** Id of the most recent build, which is what a client holding the last response still has. */
|
|
131
|
+
currentId(): number;
|
|
132
|
+
/** Ids with a vector as of the last build (a direct read before any build), so a detail read never rescans the vector table. */
|
|
133
|
+
embeddedIds(): ReadonlySet<string> | null;
|
|
134
|
+
close(): void;
|
|
135
|
+
}
|
|
136
|
+
/** Holds one read-only connection for its commit signal (`PRAGMA data_version`) and the snapshot cache; `now` dates the strength projections, `cacheClock` ages the cache. */
|
|
137
|
+
export declare function createSnapshotService(hippoRoot: string, now: () => number, cacheClock?: () => number): SnapshotService;
|
|
138
|
+
//# sourceMappingURL=dashboard-snapshot.d.ts.map
|