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
package/README.md
CHANGED
|
@@ -769,7 +769,7 @@ hippo watch "npm run build"
|
|
|
769
769
|
| `hippo wm read --scope <s>` | Read working memory entries |
|
|
770
770
|
| `hippo wm clear --scope <s>` | Clear working memory |
|
|
771
771
|
| `hippo wm flush --scope <s>` | Flush working memory (session end) |
|
|
772
|
-
| `hippo dashboard` | Open web dashboard at localhost:3333 (memory
|
|
772
|
+
| `hippo dashboard` | Open web dashboard at localhost:3333 (memory health by project, and the card board); open the printed URL, which carries a per-start access token |
|
|
773
773
|
| `hippo dashboard --port <n>` | Use custom port |
|
|
774
774
|
| `hippo mcp` | Start MCP server (stdio transport) |
|
|
775
775
|
|
package/dist/ablation.js
CHANGED
|
@@ -84,38 +84,20 @@
|
|
|
84
84
|
* that mutate these env vars MUST call _resetAblationCacheForTests() in BOTH
|
|
85
85
|
* beforeEach AND afterEach.
|
|
86
86
|
*/
|
|
87
|
+
import { envAblateDecay, envAblateOutcome, envAblateOutcomeFast, envAblateOutcomeSlow, envAblateRecallBoost, envAblateRecency, envEvalRecencyDays, envFakeNowMs, } from './env.js';
|
|
87
88
|
let _cache;
|
|
88
|
-
function isTruthy(value) {
|
|
89
|
-
return value === '1' || value === 'true';
|
|
90
|
-
}
|
|
91
89
|
function readFlags() {
|
|
92
90
|
if (_cache !== undefined)
|
|
93
91
|
return _cache;
|
|
94
|
-
const outcomeBoth =
|
|
95
|
-
let fakeNowMs = null;
|
|
96
|
-
const rawNow = process.env.HIPPO_FAKE_NOW;
|
|
97
|
-
if (rawNow !== undefined && rawNow !== '') {
|
|
98
|
-
// STRICT canonical form only: exactly what Date.prototype.toISOString
|
|
99
|
-
// emits (YYYY-MM-DDTHH:mm:ss.sssZ), verified by ROUND-TRIP equality.
|
|
100
|
-
// Two codex P2s drove this: (1) Date.parse accepts junk like '1' or
|
|
101
|
-
// locale-dependent '06/11/2026'; (2) a regex alone still admits
|
|
102
|
-
// rolled-over dates ('2026-02-31T...Z' silently becomes March 3). A
|
|
103
|
-
// value that does not round-trip byte-identical falls back to the real
|
|
104
|
-
// clock, exactly as documented.
|
|
105
|
-
const parsed = Date.parse(rawNow);
|
|
106
|
-
if (Number.isFinite(parsed) && new Date(parsed).toISOString() === rawNow) {
|
|
107
|
-
fakeNowMs = parsed;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
const recencyDays = Number(process.env.HIPPO_EVAL_RECENCY_DAYS);
|
|
92
|
+
const outcomeBoth = envAblateOutcome();
|
|
111
93
|
_cache = {
|
|
112
|
-
decay:
|
|
113
|
-
recallBoost:
|
|
114
|
-
outcomeSlow: outcomeBoth ||
|
|
115
|
-
outcomeFast: outcomeBoth ||
|
|
116
|
-
recency:
|
|
117
|
-
recencyDays:
|
|
118
|
-
fakeNowMs,
|
|
94
|
+
decay: envAblateDecay(),
|
|
95
|
+
recallBoost: envAblateRecallBoost(),
|
|
96
|
+
outcomeSlow: outcomeBoth || envAblateOutcomeSlow(),
|
|
97
|
+
outcomeFast: outcomeBoth || envAblateOutcomeFast(),
|
|
98
|
+
recency: envAblateRecency(),
|
|
99
|
+
recencyDays: envEvalRecencyDays(),
|
|
100
|
+
fakeNowMs: envFakeNowMs(),
|
|
119
101
|
};
|
|
120
102
|
return _cache;
|
|
121
103
|
}
|
|
@@ -5,7 +5,10 @@ import { gatedWrite } from '../gated-write.js';
|
|
|
5
5
|
import { Layer, calculateStrength, createMemory } from '../memory.js';
|
|
6
6
|
import { findRejectedValue, rejectionDigest } from '../rejection.js';
|
|
7
7
|
import { redactSecretsStrict } from '../secret-detect.js';
|
|
8
|
-
import {
|
|
8
|
+
import { stampOriginProject } from '../store/entry-row.js';
|
|
9
|
+
import { deleteEntryRowInTx, setEntryTagsInTx } from '../store/entry-writes.js';
|
|
10
|
+
import { selectLiveEntriesBySourcePrefix } from '../store/entry-reads.js';
|
|
11
|
+
import { markSummaryDirtyInTx } from '../summary-dirty.js';
|
|
9
12
|
import { itemHash } from './keys.js';
|
|
10
13
|
import { planContainer } from './plan.js';
|
|
11
14
|
import { emptyTally } from './report.js';
|
|
@@ -3,7 +3,7 @@ import fs from 'node:fs';
|
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import { realpathOrResolve } from '../project-identity.js';
|
|
5
5
|
import { isStringValue } from '../capture-contract.js';
|
|
6
|
-
import { isJsonObject } from '../hooks.js';
|
|
6
|
+
import { isJsonObject } from '../hooks/shared.js';
|
|
7
7
|
import { expandHome, frontmatterField, itemTime, readTextFile, splitFrontmatter } from './files.js';
|
|
8
8
|
import { markdownNotes, readFolderStore, uniqueFolders } from './folder-store.js';
|
|
9
9
|
import { gitLayout } from './git.js';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Codex CLI's memory_summary.md, the one memory file Codex puts in its prompt, read as a single text-keyed file.
|
|
2
2
|
import fs from 'node:fs';
|
|
3
3
|
import path from 'node:path';
|
|
4
|
-
import { codexHomeDir } from '../hooks.js';
|
|
4
|
+
import { codexHomeDir } from '../hooks/shared.js';
|
|
5
5
|
import { readTextFile } from './files.js';
|
|
6
6
|
import { textItemKeys } from './keys.js';
|
|
7
7
|
import { splitMarkdownItems } from './markdown.js';
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import fs from 'node:fs';
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import { isStringValue } from '../capture-contract.js';
|
|
5
|
-
import { isJsonObject } from '../hooks.js';
|
|
5
|
+
import { isJsonObject } from '../hooks/shared.js';
|
|
6
6
|
import { readTextFile, splitFrontmatter } from './files.js';
|
|
7
7
|
import { markdownNotes, readFolderStore } from './folder-store.js';
|
|
8
8
|
import { gitLayout } from './git.js';
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { duplicateKey } from '../same-text.js';
|
|
4
4
|
import { maskEmails } from '../secret-detect.js';
|
|
5
|
-
import { selectLiveEntriesBySourcePrefix } from '../store.js';
|
|
5
|
+
import { selectLiveEntriesBySourcePrefix } from '../store/entry-reads.js';
|
|
6
6
|
import { matchLegacy } from './plan.js';
|
|
7
7
|
import { MIN_ITEM_CHARS, storedText } from './source.js';
|
|
8
8
|
export const LEGACY_SOURCE_PREFIX = 'claude-memory:';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// An imported row's source, `agent-memory:<tool>:<container>/<item>#<hash>`, and the stored text: plan design 3 and 4.
|
|
2
2
|
import { realpathOrResolve } from '../project-identity.js';
|
|
3
|
-
import { truncateCodePointSafe } from '../
|
|
3
|
+
import { truncateCodePointSafe } from '../transcript-tail.js';
|
|
4
4
|
import { maskEmails } from '../secret-detect.js';
|
|
5
5
|
import { itemHash, sha256Hex } from './keys.js';
|
|
6
6
|
import { toolSourcePrefix } from './tools.js';
|
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
// Runs the adapters and routes each container to its store: the project pass, the user pass and their call sites (plan designs 2, 8, 11).
|
|
2
|
+
import { processEnv } from '../env.js';
|
|
2
3
|
import fs from 'node:fs';
|
|
3
4
|
import os from 'node:os';
|
|
4
5
|
import path from 'node:path';
|
|
5
|
-
import { errorMessage } from '../
|
|
6
|
+
import { errorMessage } from '../log.js';
|
|
6
7
|
import { loadConfig } from '../config.js';
|
|
7
8
|
import { closeHippoDb, isSqliteBusy, openHippoDb } from '../db.js';
|
|
8
9
|
import { deriveOriginProject, isGlobalStoreRoot, resolveGlobalRootDir } from '../project-identity.js';
|
|
9
10
|
import { duplicateKey, heldTextKeys } from '../same-text.js';
|
|
10
|
-
import {
|
|
11
|
+
import { removeEntryMirrors } from '../store/mirrors.js';
|
|
12
|
+
import { initStore, isInitialized } from '../store/open.js';
|
|
13
|
+
import { writeEntryMirrors } from '../store/entry-writes.js';
|
|
14
|
+
import { selectLiveEntriesBySourcePrefix } from '../store/entry-reads.js';
|
|
15
|
+
import { updateStats } from '../store/index-and-stats.js';
|
|
11
16
|
import { resolveTenantId } from '../tenant.js';
|
|
12
17
|
import { setAsideRow, syncContainer } from './apply.js';
|
|
13
18
|
import { claudeCodeAdapter, claudeTranscriptListing } from './claude-code.js';
|
|
@@ -24,7 +29,7 @@ export const ADAPTERS = [claudeCodeAdapter, codexAdapter, geminiAdapter, copilot
|
|
|
24
29
|
/** Overrides config because `hippo init` creates the store in the same command that imports (plan design 11). */
|
|
25
30
|
export const TOOLS_ENV = 'HIPPO_AGENT_MEMORY_TOOLS';
|
|
26
31
|
export function currentMachine() {
|
|
27
|
-
return { home: os.homedir(), env:
|
|
32
|
+
return { home: os.homedir(), env: processEnv(), platform: process.platform };
|
|
28
33
|
}
|
|
29
34
|
/** init, sleep, `import --agents` and the daily runner: a local store gets its project pass then the user pass; the global store the user pass only. */
|
|
30
35
|
export function importForStore(hippoRoot, opts) {
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type AmbientTallies } from './ambient.js';
|
|
2
|
+
/** The rows an ambient summary describes: a context read's envelope, origin partition and tag secret veto. */
|
|
3
|
+
export interface AmbientStoreFilter {
|
|
4
|
+
exactScope?: string;
|
|
5
|
+
/** Rows of this project and user-global rows pass; absent admits every origin. */
|
|
6
|
+
project?: string;
|
|
7
|
+
/** The reader's project: a secret-tagged row counts only inside its own non-empty origin project. */
|
|
8
|
+
currentProject: string;
|
|
9
|
+
now: Date;
|
|
10
|
+
}
|
|
11
|
+
/** Whole-store ambient tallies in one aggregate pass, no row loaded. Content-pattern secrets and session-local
|
|
12
|
+
* rows (own compaction items, a printed handoff's digest) still count: only injection drops them. */
|
|
13
|
+
export declare function loadAmbientTallies(hippoRoot: string, tenantId: string, filter: AmbientStoreFilter): AmbientTallies;
|
|
14
|
+
//# sourceMappingURL=ambient-store.d.ts.map
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { closeHippoDb } from './db.js';
|
|
2
|
+
import { strengthSql } from './memory.js';
|
|
3
|
+
import { RECALL_DEFAULT_DENY_SCOPES } from './recall-scope.js';
|
|
4
|
+
import { SECRET_TAGS } from './secret-detect.js';
|
|
5
|
+
import { openStore } from './store/open.js';
|
|
6
|
+
import { isErrorTagged } from './ambient.js';
|
|
7
|
+
// A malformed or non-array JSON list reads as empty, as parseJsonArray does, instead of failing json_each.
|
|
8
|
+
const jsonList = (column) => `(CASE WHEN json_valid(${column}) AND json_type(${column}) = 'array' THEN ${column} ELSE '[]' END)`;
|
|
9
|
+
// SHORTCUT: mirrors loadContextCandidates' WHERE (request-path snapshots pin the match); share it once store.ts is split.
|
|
10
|
+
function contextRowsWhere(tenantId, filter) {
|
|
11
|
+
const where = ['tenant_id = ?', `COALESCE(superseded_by, '') = ''`, `COALESCE(kind, '') != 'archived'`];
|
|
12
|
+
const params = [tenantId];
|
|
13
|
+
if (filter.exactScope) {
|
|
14
|
+
where.push('scope = ?');
|
|
15
|
+
params.push(filter.exactScope);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
where.push(`(scope IS NULL OR (scope NOT IN (${RECALL_DEFAULT_DENY_SCOPES.map(() => '?').join(', ')}) AND scope NOT LIKE '%:private:%'))`);
|
|
19
|
+
params.push(...RECALL_DEFAULT_DENY_SCOPES);
|
|
20
|
+
}
|
|
21
|
+
if (filter.project !== undefined) {
|
|
22
|
+
where.push(`(origin_project = '' OR origin_project = ?)`);
|
|
23
|
+
params.push(filter.project);
|
|
24
|
+
}
|
|
25
|
+
return { where, params };
|
|
26
|
+
}
|
|
27
|
+
/** A secret tag's row, the half of detectSecret SQL can check; the LIKEs only skip json_each on rows that cannot match. */
|
|
28
|
+
function secretTaggedSql() {
|
|
29
|
+
const tags = [...SECRET_TAGS];
|
|
30
|
+
return {
|
|
31
|
+
sql: `((${tags.map(() => 'tags_json LIKE ?').join(' OR ')})
|
|
32
|
+
AND EXISTS (SELECT 1 FROM json_each(${jsonList('tags_json')}) WHERE lower(value) IN (${tags.map(() => '?').join(', ')})))`,
|
|
33
|
+
params: [...tags.map((t) => `%"${t}"%`), ...tags],
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/** Whole-store ambient tallies in one aggregate pass, no row loaded. Content-pattern secrets and session-local
|
|
37
|
+
* rows (own compaction items, a printed handoff's digest) still count: only injection drops them. */
|
|
38
|
+
export function loadAmbientTallies(hippoRoot, tenantId, filter) {
|
|
39
|
+
const { where, params } = contextRowsWhere(tenantId, filter);
|
|
40
|
+
const secret = secretTaggedSql();
|
|
41
|
+
const sevenDaysAgo = new Date(filter.now.getTime() - 7 * 86400000).toISOString();
|
|
42
|
+
const db = openStore(hippoRoot);
|
|
43
|
+
try {
|
|
44
|
+
// SAFETY: one aggregate row whose columns are the aliases named below. Tag lists come back as one JSON array of
|
|
45
|
+
// arrays and are counted in JS, which maps items through String() as parseJsonArray does.
|
|
46
|
+
const row = db.prepare(`SELECT
|
|
47
|
+
COUNT(*) AS total,
|
|
48
|
+
COALESCE(SUM(${strengthSql(filter.now)}), 0) AS strengthSum,
|
|
49
|
+
COALESCE(SUM(julianday(created) > julianday(?)), 0) AS fresh,
|
|
50
|
+
COALESCE(SUM(emotional_valence IN ('negative', 'critical')), 0) AS negative,
|
|
51
|
+
COALESCE(SUM(COALESCE(schema_fit, 0.5) > 0.7), 0) AS highSchemaFit,
|
|
52
|
+
COALESCE(SUM(layer = 'semantic'), 0) AS semantic,
|
|
53
|
+
COALESCE(SUM(layer = 'episodic'), 0) AS episodic,
|
|
54
|
+
COALESCE(SUM(json_array_length(${jsonList('conflicts_with_json')})), 0) AS conflicts,
|
|
55
|
+
COALESCE(SUM(COALESCE(extracted_from, '') != ''), 0) AS extracted,
|
|
56
|
+
MAX(0, COALESCE(MAX(COALESCE(dag_level, 0)), 0)) AS maxDagLevel,
|
|
57
|
+
'[' || COALESCE(group_concat(${jsonList('tags_json')}, ','), '') || ']' AS tagLists
|
|
58
|
+
FROM memories
|
|
59
|
+
WHERE ${where.join(' AND ')}
|
|
60
|
+
AND ((origin_project = ? AND origin_project != '') OR NOT ${secret.sql})`).get(sevenDaysAgo, ...params, filter.currentProject, ...secret.params);
|
|
61
|
+
const tagCounts = new Map();
|
|
62
|
+
let errors = 0;
|
|
63
|
+
const lists = /* SAFETY: jsonList yields an array per row, joined into one array */ JSON.parse(row.tagLists);
|
|
64
|
+
for (const raw of lists) {
|
|
65
|
+
const tags = raw.map((item) => String(item));
|
|
66
|
+
for (const tag of tags)
|
|
67
|
+
tagCounts.set(tag, (tagCounts.get(tag) ?? 0) + 1);
|
|
68
|
+
if (isErrorTagged(tags))
|
|
69
|
+
errors++;
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
total: Number(row.total),
|
|
73
|
+
strengthSum: Number(row.strengthSum),
|
|
74
|
+
fresh: Number(row.fresh),
|
|
75
|
+
negative: Number(row.negative),
|
|
76
|
+
highSchemaFit: Number(row.highSchemaFit),
|
|
77
|
+
errors,
|
|
78
|
+
semantic: Number(row.semantic),
|
|
79
|
+
episodic: Number(row.episodic),
|
|
80
|
+
conflicts: Number(row.conflicts),
|
|
81
|
+
extracted: Number(row.extracted),
|
|
82
|
+
maxDagLevel: Number(row.maxDagLevel),
|
|
83
|
+
tagCounts,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
closeHippoDb(db);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=ambient-store.js.map
|
package/dist/ambient.d.ts
CHANGED
|
@@ -20,7 +20,30 @@ export interface AmbientState {
|
|
|
20
20
|
dagDepth: number;
|
|
21
21
|
totalMemories: number;
|
|
22
22
|
}
|
|
23
|
+
/** Row counts and sums an AmbientState is derived from; two stores' tallies add with addAmbientTallies. */
|
|
24
|
+
export interface AmbientTallies {
|
|
25
|
+
total: number;
|
|
26
|
+
strengthSum: number;
|
|
27
|
+
fresh: number;
|
|
28
|
+
negative: number;
|
|
29
|
+
highSchemaFit: number;
|
|
30
|
+
errors: number;
|
|
31
|
+
semantic: number;
|
|
32
|
+
episodic: number;
|
|
33
|
+
conflicts: number;
|
|
34
|
+
extracted: number;
|
|
35
|
+
maxDagLevel: number;
|
|
36
|
+
tagCounts: Map<string, number>;
|
|
37
|
+
}
|
|
38
|
+
/** The tallies of two disjoint row sets taken together. */
|
|
39
|
+
export declare function addAmbientTallies(a: AmbientTallies, b: AmbientTallies): AmbientTallies;
|
|
40
|
+
/** Whether a tag list marks its memory as an error for errorDensity. */
|
|
41
|
+
export declare function isErrorTagged(tags: readonly string[]): boolean;
|
|
42
|
+
/** Tallies over loaded entries; superseded rows count toward the total only, as they always have here. */
|
|
43
|
+
export declare function tallyAmbientEntries(entries: readonly MemoryEntry[], now?: Date): AmbientTallies;
|
|
23
44
|
export declare function computeAmbientState(entries: MemoryEntry[], now?: Date): AmbientState;
|
|
45
|
+
/** The ambient state of a row set from its tallies, however they were counted. */
|
|
46
|
+
export declare function ambientStateFromTallies(t: AmbientTallies): AmbientState;
|
|
24
47
|
export declare function renderAmbientSummary(state: AmbientState): string;
|
|
25
48
|
export declare function formatAmbientVector(state: AmbientState): string;
|
|
26
49
|
//# sourceMappingURL=ambient.d.ts.map
|
package/dist/ambient.js
CHANGED
|
@@ -9,67 +9,89 @@
|
|
|
9
9
|
import { evalNow } from './ablation.js';
|
|
10
10
|
import { Layer } from './memory.js';
|
|
11
11
|
import { calculateStrength } from './memory.js';
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
12
|
+
/** The tallies of two disjoint row sets taken together. */
|
|
13
|
+
export function addAmbientTallies(a, b) {
|
|
14
|
+
const tagCounts = new Map(a.tagCounts);
|
|
15
|
+
for (const [tag, count] of b.tagCounts)
|
|
16
|
+
tagCounts.set(tag, (tagCounts.get(tag) ?? 0) + count);
|
|
17
|
+
return {
|
|
18
|
+
total: a.total + b.total,
|
|
19
|
+
strengthSum: a.strengthSum + b.strengthSum,
|
|
20
|
+
fresh: a.fresh + b.fresh,
|
|
21
|
+
negative: a.negative + b.negative,
|
|
22
|
+
highSchemaFit: a.highSchemaFit + b.highSchemaFit,
|
|
23
|
+
errors: a.errors + b.errors,
|
|
24
|
+
semantic: a.semantic + b.semantic,
|
|
25
|
+
episodic: a.episodic + b.episodic,
|
|
26
|
+
conflicts: a.conflicts + b.conflicts,
|
|
27
|
+
extracted: a.extracted + b.extracted,
|
|
28
|
+
maxDagLevel: Math.max(a.maxDagLevel, b.maxDagLevel),
|
|
29
|
+
tagCounts,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/** Whether a tag list marks its memory as an error for errorDensity. */
|
|
33
|
+
export function isErrorTagged(tags) {
|
|
34
|
+
return tags.some(tag => tag === 'error' || tag === 'critical' || tag.startsWith('error:'));
|
|
35
|
+
}
|
|
36
|
+
/** Tallies over loaded entries; superseded rows count toward the total only, as they always have here. */
|
|
37
|
+
export function tallyAmbientEntries(entries, now) {
|
|
22
38
|
const currentTime = now ?? evalNow(); // honors HIPPO_FAKE_NOW (eval-only)
|
|
23
|
-
const tagCounts = new Map();
|
|
24
|
-
let strengthSum = 0;
|
|
25
|
-
let freshCount = 0;
|
|
26
|
-
let negativeCount = 0;
|
|
27
|
-
let highSchemaCount = 0;
|
|
28
|
-
let errorCount = 0;
|
|
29
|
-
let semanticCount = 0;
|
|
30
|
-
let episodicCount = 0;
|
|
31
|
-
let conflictSum = 0;
|
|
32
|
-
let extractedCount = 0;
|
|
33
|
-
let maxDagLevel = 0;
|
|
34
39
|
const sevenDaysAgo = currentTime.getTime() - 7 * 86400000;
|
|
40
|
+
const t = {
|
|
41
|
+
total: entries.length, strengthSum: 0, fresh: 0, negative: 0, highSchemaFit: 0, errors: 0,
|
|
42
|
+
semantic: 0, episodic: 0, conflicts: 0, extracted: 0, maxDagLevel: 0, tagCounts: new Map(),
|
|
43
|
+
};
|
|
35
44
|
for (const entry of entries) {
|
|
36
45
|
if (entry.superseded_by)
|
|
37
46
|
continue;
|
|
38
|
-
for (const tag of entry.tags)
|
|
39
|
-
tagCounts.set(tag, (tagCounts.get(tag) ?? 0) + 1);
|
|
40
|
-
|
|
41
|
-
const strength = calculateStrength(entry, currentTime);
|
|
42
|
-
strengthSum += strength;
|
|
47
|
+
for (const tag of entry.tags)
|
|
48
|
+
t.tagCounts.set(tag, (t.tagCounts.get(tag) ?? 0) + 1);
|
|
49
|
+
t.strengthSum += calculateStrength(entry, currentTime);
|
|
43
50
|
if (new Date(entry.created).getTime() > sevenDaysAgo)
|
|
44
|
-
|
|
45
|
-
if (entry.emotional_valence === 'negative' || entry.emotional_valence === 'critical')
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
errorCount++;
|
|
50
|
-
}
|
|
51
|
+
t.fresh++;
|
|
52
|
+
if (entry.emotional_valence === 'negative' || entry.emotional_valence === 'critical')
|
|
53
|
+
t.negative++;
|
|
54
|
+
if (isErrorTagged(entry.tags))
|
|
55
|
+
t.errors++;
|
|
51
56
|
if (entry.schema_fit > 0.7)
|
|
52
|
-
|
|
57
|
+
t.highSchemaFit++;
|
|
53
58
|
if (entry.layer === Layer.Semantic)
|
|
54
|
-
|
|
59
|
+
t.semantic++;
|
|
55
60
|
if (entry.layer === Layer.Episodic)
|
|
56
|
-
|
|
57
|
-
|
|
61
|
+
t.episodic++;
|
|
62
|
+
t.conflicts += entry.conflicts_with.length;
|
|
58
63
|
if (entry.extracted_from)
|
|
59
|
-
|
|
60
|
-
if (entry.dag_level > maxDagLevel)
|
|
61
|
-
maxDagLevel = entry.dag_level;
|
|
64
|
+
t.extracted++;
|
|
65
|
+
if (entry.dag_level > t.maxDagLevel)
|
|
66
|
+
t.maxDagLevel = entry.dag_level;
|
|
67
|
+
}
|
|
68
|
+
return t;
|
|
69
|
+
}
|
|
70
|
+
export function computeAmbientState(entries, now) {
|
|
71
|
+
return ambientStateFromTallies(tallyAmbientEntries(entries, now));
|
|
72
|
+
}
|
|
73
|
+
/** The ambient state of a row set from its tallies, however they were counted. */
|
|
74
|
+
export function ambientStateFromTallies(t) {
|
|
75
|
+
const n = t.total;
|
|
76
|
+
if (n === 0) {
|
|
77
|
+
return {
|
|
78
|
+
tagEntropy: 0, avgStrength: 0, recencyFreshness: 0,
|
|
79
|
+
emotionalSkew: 0, schemaFitRatio: 0, errorDensity: 0,
|
|
80
|
+
consolidationRatio: 0, conflictIntensity: 0,
|
|
81
|
+
extractionCoverage: 0, dagDepth: 0, totalMemories: 0,
|
|
82
|
+
};
|
|
62
83
|
}
|
|
63
|
-
const tagEntropy = shannonEntropy(tagCounts, n);
|
|
64
|
-
const avgStrength = strengthSum / n;
|
|
65
|
-
const recencyFreshness =
|
|
66
|
-
const emotionalSkew = (
|
|
67
|
-
const schemaFitRatio =
|
|
68
|
-
const errorDensity =
|
|
69
|
-
const totalLayered =
|
|
70
|
-
const consolidationRatio = totalLayered > 0 ?
|
|
71
|
-
const conflictIntensity =
|
|
72
|
-
const extractionCoverage =
|
|
84
|
+
const tagEntropy = shannonEntropy(t.tagCounts, n);
|
|
85
|
+
const avgStrength = t.strengthSum / n;
|
|
86
|
+
const recencyFreshness = t.fresh / n;
|
|
87
|
+
const emotionalSkew = (t.negative / n) * 2 - 0.5;
|
|
88
|
+
const schemaFitRatio = t.highSchemaFit / n;
|
|
89
|
+
const errorDensity = t.errors / n;
|
|
90
|
+
const totalLayered = t.semantic + t.episodic;
|
|
91
|
+
const consolidationRatio = totalLayered > 0 ? t.semantic / totalLayered : 0;
|
|
92
|
+
const conflictIntensity = t.conflicts / (n * 2);
|
|
93
|
+
const extractionCoverage = t.episodic > 0 ? t.extracted / t.episodic : 0;
|
|
94
|
+
const maxDagLevel = t.maxDagLevel;
|
|
73
95
|
return {
|
|
74
96
|
tagEntropy,
|
|
75
97
|
avgStrength,
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { Context } from './types.js';
|
|
2
|
+
export interface AssembleOpts {
|
|
3
|
+
/** Token budget. Default 4000. */
|
|
4
|
+
budget?: number;
|
|
5
|
+
/** Recent raw rows always kept verbatim. Default 10. */
|
|
6
|
+
freshTailCount?: number;
|
|
7
|
+
/** Substitute parent summaries for older raws when ≥2 share a level-2
|
|
8
|
+
* ancestor. Default true. */
|
|
9
|
+
summarizeOlder?: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Restrict to a specific scope. v1.6.1 senior-review P1 #3 parity with
|
|
12
|
+
* `recall`: when set, exact match required (so an authorised caller can
|
|
13
|
+
* assemble a `slack:private:CSEC` session by passing scope explicitly).
|
|
14
|
+
* When undefined, default-deny applies to ANY `<source>:private:*` and
|
|
15
|
+
* `unknown:legacy` rows.
|
|
16
|
+
*/
|
|
17
|
+
scope?: string;
|
|
18
|
+
/**
|
|
19
|
+
* Hard row cap on the SELECT that loads session raws. Default 5000 to
|
|
20
|
+
* protect against degenerate sessions. When the cap is hit, `truncated`
|
|
21
|
+
* is set on the result so the caller knows to widen.
|
|
22
|
+
*/
|
|
23
|
+
rowCap?: number;
|
|
24
|
+
cost?: AssembleCost;
|
|
25
|
+
}
|
|
26
|
+
export interface AssembleCost {
|
|
27
|
+
item: (it: AssembledContextItem) => number;
|
|
28
|
+
fixed: (widest: number) => number;
|
|
29
|
+
}
|
|
30
|
+
export interface AssembledContextItem {
|
|
31
|
+
id: string;
|
|
32
|
+
content: string;
|
|
33
|
+
/** ISO timestamp of the source row's `created` field (or `earliest_at`
|
|
34
|
+
* for substituted summaries). */
|
|
35
|
+
createdAt: string;
|
|
36
|
+
/** Fresh-tail protected window (last freshTailCount raws). */
|
|
37
|
+
isFreshTail?: boolean;
|
|
38
|
+
/** Level-2 summary substituted for older raw rows that share a parent. */
|
|
39
|
+
isSummary?: boolean;
|
|
40
|
+
/** When isSummary, the raw ids this summary covers. drillDown
|
|
41
|
+
* recovers the originals. */
|
|
42
|
+
substitutedFor?: string[];
|
|
43
|
+
/** Decay × retrieval × emotional. Lets callers render a confidence
|
|
44
|
+
* hint without re-deriving from MemoryEntry. */
|
|
45
|
+
strength: number;
|
|
46
|
+
}
|
|
47
|
+
export interface AssembleResult {
|
|
48
|
+
sessionId: string;
|
|
49
|
+
items: AssembledContextItem[];
|
|
50
|
+
tokens: number;
|
|
51
|
+
/**
|
|
52
|
+
* Tenant + scope-filtered raw row count for the session — what the caller
|
|
53
|
+
* could have seen given their grant. Pre-v1.6.1 was pre-filter (confusing
|
|
54
|
+
* for all-private sessions); pre-v1.6.3 was capped (under-reported on
|
|
55
|
+
* sessions > rowCap). v1.6.3 reports the FULL post-filter count via a
|
|
56
|
+
* separate COUNT(*) query so consumers can render "session has N msgs"
|
|
57
|
+
* accurately even when items[] is the windowed view.
|
|
58
|
+
*/
|
|
59
|
+
totalRaw: number;
|
|
60
|
+
summarized: number;
|
|
61
|
+
evicted: number;
|
|
62
|
+
/**
|
|
63
|
+
* True when `rowCap` truncated the loaded window. With v1.6.2's NEWEST-cap
|
|
64
|
+
* semantics, the items[] array represents the freshest tail of the session;
|
|
65
|
+
* older rows beyond the cap are silently absent. Use `totalRaw - items.length
|
|
66
|
+
* - summarized + ...` to estimate how much you didn't see, or widen `rowCap`.
|
|
67
|
+
*/
|
|
68
|
+
truncated: boolean;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Build a chronologically-ordered context window for a session. Adapts the
|
|
72
|
+
* lossless-claw context-engine pattern to Hippo's score-ranked memory store.
|
|
73
|
+
*
|
|
74
|
+
* Algorithm:
|
|
75
|
+
* 1. Load all kind='raw' rows for the session, tenant + scope filtered.
|
|
76
|
+
* 2. Split: newest `freshTailCount` are protected (fresh tail).
|
|
77
|
+
* 3. For older rows, when ≥2 share a level-2 parent, substitute the
|
|
78
|
+
* summary; everything else passes through as raw.
|
|
79
|
+
* 4. Hippo-additive eviction: when over-budget, drop the lowest-strength
|
|
80
|
+
* non-fresh-tail item first. Fresh-tail rows are never evicted.
|
|
81
|
+
*
|
|
82
|
+
* Strength-weighted eviction is the differentiator from lossless-claw,
|
|
83
|
+
* which evicts oldest-first. A high-strength older row (high retrieval
|
|
84
|
+
* count, slow decay) survives; a low-strength recent row (newer but
|
|
85
|
+
* unimportant) goes first.
|
|
86
|
+
*
|
|
87
|
+
* Returns `items: []` cleanly when:
|
|
88
|
+
* - sessionId is empty
|
|
89
|
+
* - no raws exist for the session
|
|
90
|
+
* - all rows fail the scope/tenant filter
|
|
91
|
+
*/
|
|
92
|
+
export declare function assemble(ctx: Context, sessionId: string, opts?: AssembleOpts): AssembleResult;
|
|
93
|
+
//# sourceMappingURL=assemble.d.ts.map
|