hippo-memory 1.59.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 -1260
- package/dist/api.js +25 -2711
- package/dist/audit.d.ts +3 -0
- package/dist/audit.js +7 -3
- package/dist/auth.d.ts +45 -4
- package/dist/auth.js +125 -48
- package/dist/autolearn.js +7 -4
- 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 +319 -13
- package/dist/cli.js +436 -8580
- package/dist/client.js +15 -8
- package/dist/compaction-record.js +12 -9
- package/dist/config.js +12 -11
- package/dist/connectors/github/backfill.js +94 -87
- package/dist/connectors/github/cli-impl.js +5 -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 +13 -12
- 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 +231 -203
- 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 -3036
- package/dist/decisions.d.ts +4 -1
- package/dist/decisions.js +9 -7
- package/dist/dedupe.js +3 -2
- package/dist/delivery-recorder.js +5 -1
- package/dist/doctor.js +4 -3
- package/dist/dormant.js +1 -0
- package/dist/embedding-provider.d.ts +1 -1
- package/dist/embedding-provider.js +7 -5
- package/dist/embeddings.d.ts +9 -52
- package/dist/embeddings.js +47 -298
- 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 +5 -4
- 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} +8 -391
- 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/handoff.js +3 -0
- 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 +8 -5
- package/dist/index.d.ts +25 -6
- package/dist/index.js +23 -6
- package/dist/invalidation.js +2 -1
- package/dist/judgment.js +7 -3
- 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 -70
- package/dist/mcp/server.js +8 -1172
- 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 +8 -3
- 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 +8 -5
- package/dist/project-briefs.d.ts +3 -0
- package/dist/project-briefs.js +7 -5
- package/dist/project-identity.d.ts +1 -1
- package/dist/project-identity.js +12 -6
- package/dist/project-merge.js +3 -1
- package/dist/quarantine.d.ts +2 -1
- package/dist/quarantine.js +8 -5
- package/dist/raw-archive-mirror-cleanup.js +2 -1
- 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 +3 -3
- package/dist/recall-trace.js +10 -14
- package/dist/refine-llm.js +20 -11
- package/dist/reject-flow.js +6 -1
- package/dist/rerankers/clef.d.ts +2 -2
- package/dist/rerankers/clef.js +72 -30
- package/dist/rerankers/cross-encoder.js +6 -4
- package/dist/rerankers/jev.d.ts +4 -2
- package/dist/rerankers/jev.js +24 -19
- package/dist/rerankers/llm.d.ts +4 -2
- package/dist/rerankers/llm.js +61 -41
- package/dist/rerankers/types.d.ts +1 -1
- package/dist/salience.js +1 -1
- package/dist/same-text.d.ts +2 -0
- package/dist/same-text.js +4 -0
- package/dist/scheduler.d.ts +1 -0
- package/dist/scheduler.js +26 -3
- 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 +3 -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 +92 -2368
- 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 +46 -40
- package/dist/skills.d.ts +3 -0
- package/dist/skills.js +7 -5
- package/dist/stdin.js +3 -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/token-ledger.js +1 -0
- 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 +2 -1
- package/dist/capture.d.ts +0 -155
- package/dist/capture.js +0 -1293
- package/dist/consolidate.d.ts +0 -58
- package/dist/consolidate.js +0 -1123
- package/dist/graph.d.ts +0 -245
- package/dist/hooks.d.ts +0 -208
- package/dist/hooks.js +0 -1073
- package/dist/importers.js +0 -897
- package/dist/predictions.js +0 -620
- package/dist/search.d.ts +0 -320
- package/dist/search.js +0 -968
- package/dist/store.d.ts +0 -744
- package/dist/store.js +0 -3372
- 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,251 @@
|
|
|
1
|
+
import { Layer, calculateStrength, createMemory } from '../memory.js';
|
|
2
|
+
import { tokenize } from '../tokenize.js';
|
|
3
|
+
import { jaccardMinShared, overlapPartners } from '../overlap-index.js';
|
|
4
|
+
import { compareEntryIdentity } from '../compare.js';
|
|
5
|
+
import { duplicateKey, mergedText } from '../same-text.js';
|
|
6
|
+
import { successorAfterRetirement } from '../merged-row.js';
|
|
7
|
+
import { rejectionDigest, findRejectedValue } from '../rejection.js';
|
|
8
|
+
import { appendAuditEvent, reportAuditWriteFailure } from '../audit.js';
|
|
9
|
+
import { derivationScope, derivationPartitionKey } from '../recall-scope.js';
|
|
10
|
+
import { jaccardSets } from './conflicts.js';
|
|
11
|
+
import { keptAsWritten } from './run.js';
|
|
12
|
+
const MERGE_OVERLAP_THRESHOLD = 0.35; // Jaccard similarity for "related"
|
|
13
|
+
const MERGE_MIN_CLUSTER = 2; // minimum cluster size to merge
|
|
14
|
+
const MERGE_MAX_SOURCES = 5; // with MERGE_MAX_CHARS, keeps a merged row near 500 tokens, a third of the 1,500-token context budget
|
|
15
|
+
const MERGE_MAX_CHARS = 2000; // total source text; sources past either cap stay unmerged and keep their half-life
|
|
16
|
+
// Half-life scale for merged source episodics. Demotion must go through
|
|
17
|
+
// half_life_days: calculateStrength() recomputes live strength from
|
|
18
|
+
// last_retrieved/half_life and never reads the stored strength field, so a
|
|
19
|
+
// stored-strength write is inert for ranking and gets overwritten by the
|
|
20
|
+
// next sleep's decay pass anyway.
|
|
21
|
+
const MERGE_SOURCE_HALF_LIFE_FACTOR = 0.3;
|
|
22
|
+
export function retireHeldTexts(run) {
|
|
23
|
+
const { survivors } = run;
|
|
24
|
+
const byId = new Map(run.all.map((e) => [e.id, e]));
|
|
25
|
+
const rejectedIn = (tenantId) => (text) => {
|
|
26
|
+
const db = run.getConsolidateDb();
|
|
27
|
+
return db !== null && findRejectedValue(db, tenantId, rejectionDigest(text)) !== null;
|
|
28
|
+
};
|
|
29
|
+
for (let i = survivors.length - 1; i >= 0; i--) {
|
|
30
|
+
const row = survivors[i];
|
|
31
|
+
const successor = run.retirable(row) ? successorAfterRetirement(row, byId, rejectedIn(row.tenantId)) : undefined;
|
|
32
|
+
if (successor === undefined)
|
|
33
|
+
continue;
|
|
34
|
+
run.result.details.push(` ✂️ ${row.id} held a retired text${successor ? `, ${successor.id} holds the rest` : ''}`);
|
|
35
|
+
if (run.dryRun)
|
|
36
|
+
continue;
|
|
37
|
+
run.pendingDeletes.push(row.id);
|
|
38
|
+
if (successor) {
|
|
39
|
+
run.pendingWrites.push(successor);
|
|
40
|
+
survivors[i] = successor;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
survivors.splice(i, 1);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// -------------------------------------------------------------------------
|
|
48
|
+
// 3. Merge pass - episodic entries only
|
|
49
|
+
// -------------------------------------------------------------------------
|
|
50
|
+
/** Returns how many clusters were skipped because their merged text matches a rejected value. */
|
|
51
|
+
export function mergePass(run) {
|
|
52
|
+
const alreadyMergedIds = new Set(run.survivors.flatMap((e) => e.parents));
|
|
53
|
+
const mergeCandidates = run.survivors.filter((e) => e.layer === Layer.Episodic && !e.superseded_by && !keptAsWritten(e) && !alreadyMergedIds.has(e.id)
|
|
54
|
+
&& !e.pinned // a pin merged with a look-alike would read as one of two values
|
|
55
|
+
&& tokenize(e.content).length > 0);
|
|
56
|
+
const used = new Set();
|
|
57
|
+
// T1 fix (2026-08-15 hardening pass): partition by tenantId BEFORE the
|
|
58
|
+
// overlap loop so a cluster can never span tenants. Previously textOverlap
|
|
59
|
+
// clustered across the whole host-wide `survivors` list with no tenant
|
|
60
|
+
// boundary, and mergeContents concatenated cross-tenant content into one
|
|
61
|
+
// row. Map preserves insertion order, so single-tenant stores (every row
|
|
62
|
+
// 'default') get exactly one partition and iterate in the same order as
|
|
63
|
+
// before this fix — byte-identical behavior there.
|
|
64
|
+
const mergeCandidatesByTenant = new Map();
|
|
65
|
+
for (const entry of mergeCandidates) {
|
|
66
|
+
const key = derivationPartitionKey(entry.tenantId, entry.scope, entry.origin_project);
|
|
67
|
+
const bucket = mergeCandidatesByTenant.get(key);
|
|
68
|
+
if (bucket)
|
|
69
|
+
bucket.push(entry);
|
|
70
|
+
else
|
|
71
|
+
mergeCandidatesByTenant.set(key, [entry]);
|
|
72
|
+
}
|
|
73
|
+
// AT1 consolidation-loop fix (docs/plans/2026-08-15-at1-rejected-value-tombstone.md):
|
|
74
|
+
// reuses the single consolidateDb handle opened lazily in consolidate()
|
|
75
|
+
// for the whole non-dry-run consolidate — see that
|
|
76
|
+
// declaration's comment. Only needed for real writes — a dry-run preview
|
|
77
|
+
// never reaches batchWriteAndDelete's guard bypass, so there is nothing
|
|
78
|
+
// here for it to protect against.
|
|
79
|
+
let mergesSkippedRejected = 0;
|
|
80
|
+
for (const [, tenantCandidates] of mergeCandidatesByTenant) {
|
|
81
|
+
const partition = {
|
|
82
|
+
tenantId: tenantCandidates[0].tenantId,
|
|
83
|
+
scope: derivationScope(tenantCandidates[0].scope),
|
|
84
|
+
origin: tenantCandidates[0].origin_project,
|
|
85
|
+
};
|
|
86
|
+
const partnersOf = mergePartners(tenantCandidates.map((e) => e.content));
|
|
87
|
+
for (let i = 0; i < tenantCandidates.length; i++) {
|
|
88
|
+
if (used.has(tenantCandidates[i].id) || tenantCandidates[i].content.length > MERGE_MAX_CHARS)
|
|
89
|
+
continue;
|
|
90
|
+
const related = [tenantCandidates[i]];
|
|
91
|
+
for (const j of partnersOf(i)) {
|
|
92
|
+
if (!used.has(tenantCandidates[j].id))
|
|
93
|
+
related.push(tenantCandidates[j]);
|
|
94
|
+
}
|
|
95
|
+
const cluster = [];
|
|
96
|
+
let clusterChars = 0;
|
|
97
|
+
for (const e of related) {
|
|
98
|
+
if (cluster.length === MERGE_MAX_SOURCES || clusterChars + e.content.length > MERGE_MAX_CHARS)
|
|
99
|
+
continue;
|
|
100
|
+
cluster.push(e);
|
|
101
|
+
clusterChars += e.content.length;
|
|
102
|
+
}
|
|
103
|
+
if (cluster.length < MERGE_MIN_CLUSTER)
|
|
104
|
+
continue;
|
|
105
|
+
if (!mergeCluster(run, partition, cluster, related, used))
|
|
106
|
+
mergesSkippedRejected++;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return mergesSkippedRejected;
|
|
110
|
+
}
|
|
111
|
+
/** Merges one cluster into a semantic row; returns false when a tombstone refuses the merged text. */
|
|
112
|
+
function mergeCluster(run, partition, cluster, related, used) {
|
|
113
|
+
const { result, dryRun } = run;
|
|
114
|
+
// Create a semantic summary
|
|
115
|
+
const mergedContent = mergeContents(cluster);
|
|
116
|
+
const allTags = Array.from(new Set(cluster.flatMap((e) => e.tags))).sort();
|
|
117
|
+
const maxValence = pickStrongestValence(cluster);
|
|
118
|
+
// AT1 P2 fix: build the semantic entry FIRST — createMemory is cheap
|
|
119
|
+
// and pure — so the tombstone check below runs under the tenant the
|
|
120
|
+
// row will ACTUALLY land in.
|
|
121
|
+
// T1 fix: createMemory now receives tenantId: mergeTenant (the
|
|
122
|
+
// partition's tenant — every member of `cluster` shares it by
|
|
123
|
+
// construction), so the row lands in its source tenant instead of
|
|
124
|
+
// always 'default'.
|
|
125
|
+
let semantic = null;
|
|
126
|
+
if (!dryRun) {
|
|
127
|
+
semantic = {
|
|
128
|
+
...createMemory(mergedContent, {
|
|
129
|
+
layer: Layer.Semantic,
|
|
130
|
+
tags: allTags,
|
|
131
|
+
emotional_valence: maxValence,
|
|
132
|
+
schema_fit: 0.7,
|
|
133
|
+
source: 'consolidation',
|
|
134
|
+
confidence: 'inferred',
|
|
135
|
+
tenantId: partition.tenantId,
|
|
136
|
+
scope: partition.scope,
|
|
137
|
+
baseHalfLifeDays: run.config.defaultHalfLifeDays,
|
|
138
|
+
}),
|
|
139
|
+
origin_project: partition.origin,
|
|
140
|
+
parents: cluster.map((e) => e.id),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
if (semantic && mergeRejected(run, semantic, cluster, related, used))
|
|
144
|
+
return false;
|
|
145
|
+
// Mark cluster members as used
|
|
146
|
+
for (const e of cluster)
|
|
147
|
+
used.add(e.id);
|
|
148
|
+
result.merged += cluster.length;
|
|
149
|
+
result.details.push(` 🔀 merged ${cluster.length} episodic entries into semantic: "${mergedContent.slice(0, 60)}..."`);
|
|
150
|
+
if (!dryRun && semantic) {
|
|
151
|
+
run.pendingWrites.push(semantic);
|
|
152
|
+
result.semanticCreated++;
|
|
153
|
+
// Demote source episodics (they've been compressed into neocortex):
|
|
154
|
+
// scale half_life_days so they decay sooner while staying recoverable.
|
|
155
|
+
// Immediate ranking is deliberately unchanged: the 2026-06-10 DAG
|
|
156
|
+
// slice-1 eval measured that dropping children below a worse-retrieving
|
|
157
|
+
// summary regresses budget-bounded QA (docs/evals/). The stored
|
|
158
|
+
// strength is refreshed to the live value so inspect, replay sampling,
|
|
159
|
+
// and strength-sorted assembly see the truth instead of a fake 0.3.
|
|
160
|
+
// Mutate in place (not a copy): `cluster` holds the same object
|
|
161
|
+
// references as `survivors`, and the later detectConflicts(survivors)
|
|
162
|
+
// pass in this same run must see the post-demotion half-life, or it
|
|
163
|
+
// can persist conflicts for entries the just-written state excludes.
|
|
164
|
+
for (const e of cluster) {
|
|
165
|
+
e.half_life_days = Math.max(1, Math.floor(e.half_life_days * MERGE_SOURCE_HALF_LIFE_FACTOR));
|
|
166
|
+
e.strength = calculateStrength(e, run.now, run.decayOpts);
|
|
167
|
+
run.pendingWrites.push(e);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
172
|
+
// mergeContents is DETERMINISTIC CONCATENATION (not an LLM paraphrase)
|
|
173
|
+
// — if a human rejected exactly this byte-identical rollup before, an
|
|
174
|
+
// unguarded sleep would regenerate it every cycle and
|
|
175
|
+
// batchWriteAndDelete's guard bypass (store.ts) would silently
|
|
176
|
+
// re-assert it forever. This producer-side check is what makes that
|
|
177
|
+
// bypass safe. A hit skips the WHOLE cluster: sources stay unmerged —
|
|
178
|
+
// not demoted, not deleted — so a later sleep gets another chance if
|
|
179
|
+
// the tombstone is lifted.
|
|
180
|
+
function mergeRejected(run, semantic, cluster, related, used) {
|
|
181
|
+
const consolidateDb = run.getConsolidateDb();
|
|
182
|
+
if (!consolidateDb)
|
|
183
|
+
return false;
|
|
184
|
+
const newDigest = rejectionDigest(semantic.content);
|
|
185
|
+
const oldDigest = rejectionDigest(legacyMergeContents(related)); // tombstones from older releases hold this format's digest
|
|
186
|
+
const newHit = findRejectedValue(consolidateDb, semantic.tenantId, newDigest);
|
|
187
|
+
const tombstone = newHit ?? findRejectedValue(consolidateDb, semantic.tenantId, oldDigest);
|
|
188
|
+
const mergeDigest = newHit ? newDigest : oldDigest;
|
|
189
|
+
if (!tombstone)
|
|
190
|
+
return false;
|
|
191
|
+
// Still mark used — these members are not re-tried against a
|
|
192
|
+
// DIFFERENT cluster within this same pass; next sleep re-clusters
|
|
193
|
+
// them fresh.
|
|
194
|
+
const rejected = newHit ? cluster : related; // the old format digested the uncapped list, so rows past the cap were rejected too
|
|
195
|
+
for (const e of rejected)
|
|
196
|
+
used.add(e.id);
|
|
197
|
+
try {
|
|
198
|
+
appendAuditEvent(consolidateDb, {
|
|
199
|
+
tenantId: semantic.tenantId,
|
|
200
|
+
actor: 'sleep',
|
|
201
|
+
op: 'reject_refusal',
|
|
202
|
+
metadata: {
|
|
203
|
+
digest: mergeDigest,
|
|
204
|
+
reason: tombstone.reason,
|
|
205
|
+
sourceIds: rejected.map((e) => e.id),
|
|
206
|
+
},
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
reportAuditWriteFailure('reject_refusal', String(error));
|
|
211
|
+
}
|
|
212
|
+
return true;
|
|
213
|
+
}
|
|
214
|
+
// ---------------------------------------------------------------------------
|
|
215
|
+
// Helpers
|
|
216
|
+
// ---------------------------------------------------------------------------
|
|
217
|
+
function mergeContents(entries) {
|
|
218
|
+
// Each distinct text goes in once and in full (the merge demotes every source), one bullet with its lines indented, so heldTextKeys can read it back.
|
|
219
|
+
// Newest first says which version is current; compareEntryIdentity settles ties, so the row and its rejection digest depend only on the sources.
|
|
220
|
+
const sorted = [...entries].sort((a, b) => (Date.parse(b.created) - Date.parse(a.created)) || compareEntryIdentity(a, b));
|
|
221
|
+
const texts = new Map();
|
|
222
|
+
for (const e of sorted) {
|
|
223
|
+
if (!texts.has(duplicateKey(e.content)))
|
|
224
|
+
texts.set(duplicateKey(e.content), e.content);
|
|
225
|
+
}
|
|
226
|
+
const header = entries.length === 2 ? '[Consolidated from 2 related memories, newest first]' : `[Consolidated pattern from ${entries.length} related memories, newest first]`;
|
|
227
|
+
return mergedText(header, [...texts.values()]);
|
|
228
|
+
}
|
|
229
|
+
function legacyMergeContents(entries) {
|
|
230
|
+
// The old format dropped text, so it is only ever digested to match rejections recorded against it, never written.
|
|
231
|
+
const sorted = [...entries].sort((a, b) => (b.content.length - a.content.length) || compareEntryIdentity(a, b));
|
|
232
|
+
if (entries.length === 2)
|
|
233
|
+
return `[Consolidated from ${entries.length} related memories]\n\n${sorted[0].content}`;
|
|
234
|
+
const bullets = sorted.map((e) => `- ${e.content.split('\n')[0].slice(0, 120)}`).join('\n');
|
|
235
|
+
return `[Consolidated pattern from ${entries.length} related memories]\n\n${bullets}`;
|
|
236
|
+
}
|
|
237
|
+
function pickStrongestValence(entries) {
|
|
238
|
+
const order = ['critical', 'negative', 'positive', 'neutral'];
|
|
239
|
+
for (const v of order) {
|
|
240
|
+
if (entries.some((e) => e.emotional_valence === v))
|
|
241
|
+
return v;
|
|
242
|
+
}
|
|
243
|
+
return 'neutral';
|
|
244
|
+
}
|
|
245
|
+
/** Maps i to each j > i, ascending, whose text overlap with i reaches the merge threshold; every text needs at least one token. */
|
|
246
|
+
export function mergePartners(contents) {
|
|
247
|
+
const sets = contents.map((text) => new Set(tokenize(text)));
|
|
248
|
+
const candidatesOf = overlapPartners(sets, jaccardMinShared(MERGE_OVERLAP_THRESHOLD));
|
|
249
|
+
return (i) => candidatesOf(i).filter((j) => jaccardSets(sets[i], sets[j]) >= MERGE_OVERLAP_THRESHOLD);
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=merge.js.map
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { openHippoDb, closeHippoDb } from '../db.js';
|
|
2
|
+
import { loadPhysicsState, savePhysicsState, refreshParticleProperties } from '../physics-state.js';
|
|
3
|
+
import { simulate } from '../physics.js';
|
|
4
|
+
// -------------------------------------------------------------------------
|
|
5
|
+
// 2. Physics simulation pass
|
|
6
|
+
// -------------------------------------------------------------------------
|
|
7
|
+
export function physicsPass(run) {
|
|
8
|
+
if (run.dryRun)
|
|
9
|
+
return;
|
|
10
|
+
const { config, result, survivors } = run;
|
|
11
|
+
try {
|
|
12
|
+
const physicsEnabled = config.physics.enabled === true
|
|
13
|
+
|| (config.physics.enabled === 'auto');
|
|
14
|
+
if (physicsEnabled) {
|
|
15
|
+
const db = openHippoDb(run.hippoRoot);
|
|
16
|
+
try {
|
|
17
|
+
const physicsMap = loadPhysicsState(db);
|
|
18
|
+
const particles = Array.from(physicsMap.values());
|
|
19
|
+
if (particles.length > 0) {
|
|
20
|
+
// Build entry lookup for property refresh
|
|
21
|
+
const entryMap = new Map(survivors.map(e => [e.id, e]));
|
|
22
|
+
refreshParticleProperties(particles, entryMap, run.now);
|
|
23
|
+
// Build conflict pairs from survivors
|
|
24
|
+
const conflictPairs = new Map();
|
|
25
|
+
for (const entry of survivors) {
|
|
26
|
+
if (entry.conflicts_with.length > 0) {
|
|
27
|
+
const set = conflictPairs.get(entry.id) ?? new Set();
|
|
28
|
+
for (const cid of entry.conflicts_with)
|
|
29
|
+
set.add(cid);
|
|
30
|
+
conflictPairs.set(entry.id, set);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// Build half-life lookup
|
|
34
|
+
const halfLives = new Map();
|
|
35
|
+
for (const entry of survivors) {
|
|
36
|
+
halfLives.set(entry.id, entry.half_life_days);
|
|
37
|
+
}
|
|
38
|
+
const ctx = {
|
|
39
|
+
conflictPairs,
|
|
40
|
+
halfLives,
|
|
41
|
+
config: config.physics,
|
|
42
|
+
};
|
|
43
|
+
const stats = simulate(particles, ctx);
|
|
44
|
+
savePhysicsState(db, particles);
|
|
45
|
+
result.physicsSimulated = stats.particleCount;
|
|
46
|
+
result.details.push(` ⚛️ physics: ${stats.particleCount} particles, ` +
|
|
47
|
+
`avg vel ${stats.avgVelocityMagnitude.toFixed(4)}, ` +
|
|
48
|
+
`energy ${stats.energy.total.toFixed(4)}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
closeHippoDb(db);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
result.details.push(` ⚠️ physics simulation skipped: ${error instanceof Error ? error.message : 'unknown error'}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=physics-pass.js.map
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { MemoryEntry, type DecayOptions } from '../memory.js';
|
|
2
|
+
import { type DatabaseSyncLike } from '../db.js';
|
|
3
|
+
import { type DormantMove } from '../dormant.js';
|
|
4
|
+
import { loadConfig } from '../config.js';
|
|
5
|
+
export interface ConsolidationResult {
|
|
6
|
+
decayed: number;
|
|
7
|
+
removed: number;
|
|
8
|
+
/** Faded memories moved to the dormant store instead of deleted (config
|
|
9
|
+
* `dormant.enabled`; src/dormant.ts). Always 0 when that is off. */
|
|
10
|
+
dormant: number;
|
|
11
|
+
/** Dormant memories deleted for good this sleep because they outlived
|
|
12
|
+
* `dormant.retentionDays` without a restore. */
|
|
13
|
+
dormantExpired: number;
|
|
14
|
+
merged: number;
|
|
15
|
+
semanticCreated: number;
|
|
16
|
+
replayed: number;
|
|
17
|
+
promotedTraces: number;
|
|
18
|
+
/** T7: sessions skipped because their events span two derivation scopes. */
|
|
19
|
+
tracesSkippedMixedScope: number;
|
|
20
|
+
extractionCandidates: number;
|
|
21
|
+
extracted: number;
|
|
22
|
+
dagCandidateClusters: number;
|
|
23
|
+
dagSummariesCreated: number;
|
|
24
|
+
summariesRebuilt: number;
|
|
25
|
+
summariesRebuildFailed: number;
|
|
26
|
+
summariesZeroChildSkipped: number;
|
|
27
|
+
summariesRebuildRefused: number;
|
|
28
|
+
summariesRebuildCapped: boolean;
|
|
29
|
+
entityProfilesCreated: number;
|
|
30
|
+
dryRun: boolean;
|
|
31
|
+
details: string[];
|
|
32
|
+
physicsSimulated: number;
|
|
33
|
+
/** Ids the decay pass removes (or would remove, under dryRun). */
|
|
34
|
+
removedIds?: string[];
|
|
35
|
+
}
|
|
36
|
+
export declare const REPLAY_COUNT_DEFAULT = 5;
|
|
37
|
+
export declare function keptAsWritten(entry: MemoryEntry): boolean;
|
|
38
|
+
/** JSON value shape for a session event's free-form metadata field, cast to
|
|
39
|
+
* once at its `Record<string, unknown>` origin so it can be narrowed via
|
|
40
|
+
* isJsonString below rather than left as unparsed `unknown`. */
|
|
41
|
+
export type JsonValue = string | number | boolean | null | JsonValue[] | {
|
|
42
|
+
[key: string]: JsonValue;
|
|
43
|
+
};
|
|
44
|
+
export declare function isJsonString(value: JsonValue): value is string;
|
|
45
|
+
/** The sleep's one tombstone-check handle: opened on first use, never under dryRun, closed once. */
|
|
46
|
+
interface LazyDb {
|
|
47
|
+
get: () => DatabaseSyncLike | null;
|
|
48
|
+
close: () => void;
|
|
49
|
+
}
|
|
50
|
+
export declare function lazyConsolidateDb(hippoRoot: string, dryRun: boolean): LazyDb;
|
|
51
|
+
/** State every sleep stage reads or appends to; the pending lists are flushed in one transaction at the end. */
|
|
52
|
+
export interface SleepRun {
|
|
53
|
+
hippoRoot: string;
|
|
54
|
+
now: Date;
|
|
55
|
+
dryRun: boolean;
|
|
56
|
+
config: ReturnType<typeof loadConfig>;
|
|
57
|
+
decayOpts: DecayOptions;
|
|
58
|
+
result: ConsolidationResult;
|
|
59
|
+
all: MemoryEntry[];
|
|
60
|
+
retirable: (entry: MemoryEntry) => boolean;
|
|
61
|
+
getConsolidateDb: () => DatabaseSyncLike | null;
|
|
62
|
+
survivors: MemoryEntry[];
|
|
63
|
+
pendingWrites: MemoryEntry[];
|
|
64
|
+
pendingDeletes: string[];
|
|
65
|
+
pendingDormant: DormantMove[];
|
|
66
|
+
}
|
|
67
|
+
export declare function newConsolidationResult(dryRun: boolean): ConsolidationResult;
|
|
68
|
+
export {};
|
|
69
|
+
//# sourceMappingURL=run.d.ts.map
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { openHippoDb, closeHippoDb } from '../db.js';
|
|
2
|
+
import { NO_MERGE_TAGS } from '../shared.js';
|
|
3
|
+
export const REPLAY_COUNT_DEFAULT = 5;
|
|
4
|
+
export function keptAsWritten(entry) {
|
|
5
|
+
return entry.tags.some((tag) => NO_MERGE_TAGS.has(tag));
|
|
6
|
+
}
|
|
7
|
+
export function isJsonString(value) {
|
|
8
|
+
return typeof value === 'string';
|
|
9
|
+
}
|
|
10
|
+
// AT1 rejection-guard db handle (docs/plans/2026-08-15-at1-rejected-value-tombstone.md):
|
|
11
|
+
// covers BOTH the auto-promote pass (1.4) and the merge
|
|
12
|
+
// pass (3) — both build deterministic content that
|
|
13
|
+
// batchWriteAndDelete writes through the guard's bypass, so both need a
|
|
14
|
+
// producer-side tombstone check before pushing to pendingWrites.
|
|
15
|
+
//
|
|
16
|
+
// T3 fix (2026-08-15 hardening pass, perf hygiene): memoized lazy getter,
|
|
17
|
+
// not an eager open. The handle only serves these two tombstone checks —
|
|
18
|
+
// a sleep with zero promotable sessions and zero merge clusters never
|
|
19
|
+
// reaches either use site, so opening it unconditionally on every
|
|
20
|
+
// non-dry-run sleep paid a db-open cost for nothing. dryRun still never
|
|
21
|
+
// opens (getConsolidateDb short-circuits before touching the handle).
|
|
22
|
+
// consolidateDbOpened (not just a truthy handle check) is the
|
|
23
|
+
// single source of truth for "was this ever opened", so the finally
|
|
24
|
+
// closes it exactly once and never double-opens.
|
|
25
|
+
//
|
|
26
|
+
// AT1 P2 fix (codex, handle-leak restructure): the getter's lifetime must
|
|
27
|
+
// start IMMEDIATELY before the try whose finally closes it, covering every
|
|
28
|
+
// phase that can touch it — not just the merge pass. An exception thrown by
|
|
29
|
+
// auto-promote (1.4), replay (1.5), batch extraction (1.6), the DAG
|
|
30
|
+
// passes (1.7-1.9), or physics (2) would otherwise propagate past an open handle
|
|
31
|
+
// with nothing to close it.
|
|
32
|
+
export function lazyConsolidateDb(hippoRoot, dryRun) {
|
|
33
|
+
let consolidateDbHandle = null;
|
|
34
|
+
let consolidateDbOpened = false;
|
|
35
|
+
const get = () => {
|
|
36
|
+
if (dryRun)
|
|
37
|
+
return null;
|
|
38
|
+
if (!consolidateDbOpened) {
|
|
39
|
+
consolidateDbHandle = openHippoDb(hippoRoot);
|
|
40
|
+
consolidateDbOpened = true;
|
|
41
|
+
}
|
|
42
|
+
return consolidateDbHandle;
|
|
43
|
+
};
|
|
44
|
+
const close = () => {
|
|
45
|
+
if (consolidateDbHandle)
|
|
46
|
+
closeHippoDb(consolidateDbHandle);
|
|
47
|
+
};
|
|
48
|
+
return { get, close };
|
|
49
|
+
}
|
|
50
|
+
export function newConsolidationResult(dryRun) {
|
|
51
|
+
return {
|
|
52
|
+
decayed: 0,
|
|
53
|
+
removed: 0,
|
|
54
|
+
dormant: 0,
|
|
55
|
+
dormantExpired: 0,
|
|
56
|
+
merged: 0,
|
|
57
|
+
semanticCreated: 0,
|
|
58
|
+
replayed: 0,
|
|
59
|
+
promotedTraces: 0,
|
|
60
|
+
tracesSkippedMixedScope: 0,
|
|
61
|
+
extractionCandidates: 0,
|
|
62
|
+
extracted: 0,
|
|
63
|
+
dagCandidateClusters: 0,
|
|
64
|
+
dagSummariesCreated: 0,
|
|
65
|
+
summariesRebuilt: 0,
|
|
66
|
+
summariesRebuildFailed: 0,
|
|
67
|
+
summariesZeroChildSkipped: 0,
|
|
68
|
+
summariesRebuildRefused: 0,
|
|
69
|
+
summariesRebuildCapped: false,
|
|
70
|
+
entityProfilesCreated: 0,
|
|
71
|
+
dryRun,
|
|
72
|
+
details: [],
|
|
73
|
+
physicsSimulated: 0,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Consolidation engine ("Sleep") for Hippo.
|
|
3
|
+
*
|
|
4
|
+
* Steps:
|
|
5
|
+
* 1. Decay pass - remove entries below strength threshold
|
|
6
|
+
* 2. Merge pass - find episodic entries with high text overlap, create semantic summaries
|
|
7
|
+
* 3. Stats tracking
|
|
8
|
+
*/
|
|
9
|
+
import { type ConsolidationResult } from './run.js';
|
|
10
|
+
/**
|
|
11
|
+
* Run a full consolidation pass.
|
|
12
|
+
*/
|
|
13
|
+
export declare function consolidate(hippoRoot: string, options?: {
|
|
14
|
+
dryRun?: boolean;
|
|
15
|
+
now?: Date;
|
|
16
|
+
fetcher?: typeof fetch;
|
|
17
|
+
}): Promise<ConsolidationResult>;
|
|
18
|
+
//# sourceMappingURL=sleep.d.ts.map
|