hippo-memory 1.60.0 → 1.62.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 +29 -54
- package/dist/ablation.js +9 -27
- package/dist/agent-memories/apply.d.ts +1 -1
- package/dist/agent-memories/apply.js +4 -1
- package/dist/agent-memories/claude-code.d.ts +3 -1
- package/dist/agent-memories/claude-code.js +54 -10
- 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.d.ts +3 -3
- package/dist/agent-memories/sync.js +22 -9
- package/dist/agent-memories/types.d.ts +0 -2
- 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 +153 -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-select.d.ts +49 -0
- package/dist/api/context-select.js +344 -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 +378 -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 +126 -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 +192 -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 +499 -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 +256 -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 +453 -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 +376 -0
- package/dist/cli/continuity.d.ts +6 -0
- package/dist/cli/continuity.js +457 -0
- package/dist/cli/curate.d.ts +19 -0
- package/dist/cli/curate.js +556 -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 +156 -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 +190 -0
- package/dist/cli/playbooks.d.ts +4 -0
- package/dist/cli/playbooks.js +573 -0
- package/dist/cli/projects.js +9 -6
- package/dist/cli/recall.d.ts +7 -0
- package/dist/cli/recall.js +582 -0
- package/dist/cli/remember.d.ts +5 -0
- package/dist/cli/remember.js +485 -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 +647 -0
- package/dist/cli/setup.d.ts +4 -0
- package/dist/cli/setup.js +397 -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 +409 -0
- package/dist/cli/transfer.d.ts +10 -0
- package/dist/cli/transfer.js +424 -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.d.ts +0 -2
- package/dist/compaction-record.js +7 -5
- 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 +83 -72
- package/dist/dag.js +225 -188
- 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 +102 -83
- package/dist/dedupe.js +3 -2
- package/dist/delivery-recorder.js +4 -1
- package/dist/doctor.js +14 -10
- 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 +117 -86
- 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 +52 -43
- 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 +93 -74
- 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 +94 -76
- package/dist/project-briefs.d.ts +3 -0
- package/dist/project-briefs.js +142 -113
- package/dist/project-identity.js +3 -2
- package/dist/project-merge.d.ts +12 -4
- package/dist/project-merge.js +132 -45
- 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 +12 -1
- package/dist/shared.js +33 -27
- package/dist/skills.d.ts +3 -0
- package/dist/skills.js +88 -70
- 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 +260 -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/dist/decisions.d.ts
CHANGED
|
@@ -20,9 +20,10 @@
|
|
|
20
20
|
*
|
|
21
21
|
* Dual-write atomicity: `saveDecision` writes the memory + decisions row (and,
|
|
22
22
|
* when superseding, the old row's UPDATE) inside writeEntry's SAVEPOINT
|
|
23
|
-
* 'write_entry' (store.ts
|
|
23
|
+
* 'write_entry' (store/entry-writes.ts) via the afterWrite hook, so a failure in any
|
|
24
24
|
* step rolls all of them back. Pattern matches savePrediction (predictions.ts).
|
|
25
25
|
*/
|
|
26
|
+
import { type KeysetPosition } from './keyset.js';
|
|
26
27
|
export type DecisionStatus = 'active' | 'superseded' | 'closed';
|
|
27
28
|
export declare const VALID_DECISION_STATES: ReadonlySet<DecisionStatus>;
|
|
28
29
|
export interface Decision {
|
|
@@ -54,6 +55,8 @@ export interface SaveDecisionOpts {
|
|
|
54
55
|
export interface ListDecisionsOpts {
|
|
55
56
|
status?: DecisionStatus;
|
|
56
57
|
limit?: number;
|
|
58
|
+
/** Resume after this row: the position the previous page ended on. */
|
|
59
|
+
after?: KeysetPosition;
|
|
57
60
|
}
|
|
58
61
|
/**
|
|
59
62
|
* Create a decision. Writes the memory mirror + the decisions row atomically
|
package/dist/decisions.js
CHANGED
|
@@ -20,17 +20,18 @@
|
|
|
20
20
|
*
|
|
21
21
|
* Dual-write atomicity: `saveDecision` writes the memory + decisions row (and,
|
|
22
22
|
* when superseding, the old row's UPDATE) inside writeEntry's SAVEPOINT
|
|
23
|
-
* 'write_entry' (store.ts
|
|
23
|
+
* 'write_entry' (store/entry-writes.ts) via the afterWrite hook, so a failure in any
|
|
24
24
|
* step rolls all of them back. Pattern matches savePrediction (predictions.ts).
|
|
25
25
|
*/
|
|
26
26
|
import { BadRequestError, ConflictError, NotFoundError } from './api-errors.js';
|
|
27
27
|
import { openHippoDb, closeHippoDb } from './db.js';
|
|
28
|
-
import { writeEntry } from './store.js';
|
|
28
|
+
import { writeEntry } from './store/entry-writes.js';
|
|
29
29
|
import { assertTenantId } from './tenant.js';
|
|
30
|
-
import { markGraphDirty, removeGraphEntitiesForObject } from './graph.js';
|
|
30
|
+
import { markGraphDirty, removeGraphEntitiesForObject } from './graph/write.js';
|
|
31
31
|
import { createMemory, Layer } from './memory.js';
|
|
32
32
|
import { appendAuditEvent } from './audit.js';
|
|
33
33
|
import { objectHalfLifeDays } from './half-life-migration.js';
|
|
34
|
+
import { keysetAfter } from './keyset.js';
|
|
34
35
|
export const VALID_DECISION_STATES = new Set([
|
|
35
36
|
'active',
|
|
36
37
|
'superseded',
|
|
@@ -59,6 +60,97 @@ const DECISION_COLS = `
|
|
|
59
60
|
// ---------------------------------------------------------------------------
|
|
60
61
|
// Public API
|
|
61
62
|
// ---------------------------------------------------------------------------
|
|
63
|
+
/** The legacy `hippo decide` memory mirror for a decision. */
|
|
64
|
+
function buildDecisionMemory(hippoRoot, tenantId, opts) {
|
|
65
|
+
const content = opts.context
|
|
66
|
+
? `${opts.decisionText}\n\nContext: ${opts.context}`
|
|
67
|
+
: opts.decisionText;
|
|
68
|
+
const tags = ['decision', ...(opts.extraTags ?? [])];
|
|
69
|
+
return createMemory(content, {
|
|
70
|
+
tags,
|
|
71
|
+
layer: Layer.Semantic,
|
|
72
|
+
confidence: 'verified',
|
|
73
|
+
source: 'decision',
|
|
74
|
+
baseHalfLifeDays: objectHalfLifeDays(hippoRoot),
|
|
75
|
+
tenantId,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
// Preflight the supersede target BEFORE inserting the new row. The new
|
|
79
|
+
// row's autoincrement id could otherwise collide with a non-existent
|
|
80
|
+
// supersedesDecisionId (e.g. superseding id 1 on an empty store, where the
|
|
81
|
+
// INSERT below would itself become id 1), making the row supersede itself.
|
|
82
|
+
// Validating first means the new row is never a candidate for its own
|
|
83
|
+
// supersede UPDATE. codex review 2026-05-28 (P1).
|
|
84
|
+
function preflightDecisionSupersede(db, tenantId, supersedesId) {
|
|
85
|
+
// SAFETY: row shape matches the single `status` column named in the SELECT below.
|
|
86
|
+
const pred = db.prepare(`SELECT status FROM decisions WHERE id = ? AND tenant_id = ?`).get(supersedesId, tenantId);
|
|
87
|
+
if (!pred) {
|
|
88
|
+
throw new NotFoundError(`saveDecision: decision ${supersedesId} to supersede not found for tenant ${tenantId}`);
|
|
89
|
+
}
|
|
90
|
+
if (pred.status !== 'active') {
|
|
91
|
+
throw new ConflictError(`saveDecision: decision ${supersedesId} is not active (status='${pred.status}'); only active decisions can be superseded.`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function insertDecisionRow(db, memoryId, tenantId, opts, now) {
|
|
95
|
+
const result = db.prepare(`
|
|
96
|
+
INSERT INTO decisions(
|
|
97
|
+
memory_id, tenant_id, decision_text, context,
|
|
98
|
+
status, superseded_by, superseded_at, closed_at, created_at
|
|
99
|
+
) VALUES (?, ?, ?, ?, 'active', NULL, NULL, NULL, ?)
|
|
100
|
+
`).run(memoryId, tenantId, opts.decisionText, opts.context ?? null, now);
|
|
101
|
+
return Number(result.lastInsertRowid ?? 0);
|
|
102
|
+
}
|
|
103
|
+
// Supersede the (preflight-validated) prior active decision in the SAME
|
|
104
|
+
// SAVEPOINT, atomic with the new row. The `id != decisionId` exclusion is
|
|
105
|
+
// defense-in-depth against the self-match described above; combined with
|
|
106
|
+
// the preflight, a 0-change here is unreachable in the single-writer txn.
|
|
107
|
+
function supersedeDecisionRow(db, tenantId, actor, supersedesId, decisionId, now) {
|
|
108
|
+
const sup = db.prepare(`
|
|
109
|
+
UPDATE decisions
|
|
110
|
+
SET status = 'superseded', superseded_by = ?, superseded_at = ?
|
|
111
|
+
WHERE id = ? AND tenant_id = ? AND status = 'active' AND id != ?
|
|
112
|
+
`).run(decisionId, now, supersedesId, tenantId, decisionId);
|
|
113
|
+
if (sup.changes === 0) {
|
|
114
|
+
throw new BadRequestError(`saveDecision: decision ${supersedesId} could not be superseded (no longer active or self-reference).`);
|
|
115
|
+
}
|
|
116
|
+
appendAuditEvent(db, {
|
|
117
|
+
tenantId,
|
|
118
|
+
actor,
|
|
119
|
+
op: 'decision_supersede',
|
|
120
|
+
targetId: String(supersedesId),
|
|
121
|
+
metadata: {
|
|
122
|
+
decision_id: supersedesId,
|
|
123
|
+
superseded_by: decisionId,
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
/** The afterWrite body: preflight, INSERT, supersede, reload, create audit, all in one SAVEPOINT. */
|
|
128
|
+
function writeDecisionRow(db, memoryId, tenantId, opts, actor, now) {
|
|
129
|
+
if (opts.supersedesDecisionId !== undefined) {
|
|
130
|
+
preflightDecisionSupersede(db, tenantId, opts.supersedesDecisionId);
|
|
131
|
+
}
|
|
132
|
+
const decisionId = insertDecisionRow(db, memoryId, tenantId, opts, now);
|
|
133
|
+
if (opts.supersedesDecisionId !== undefined) {
|
|
134
|
+
supersedeDecisionRow(db, tenantId, actor, opts.supersedesDecisionId, decisionId, now);
|
|
135
|
+
}
|
|
136
|
+
// SAFETY: row's shape matches the columns named in DECISION_COLS above.
|
|
137
|
+
const row = db.prepare(`SELECT ${DECISION_COLS} FROM decisions WHERE id = ?`)
|
|
138
|
+
.get(decisionId);
|
|
139
|
+
if (!row)
|
|
140
|
+
throw new Error('saveDecision: failed to reload saved decision row');
|
|
141
|
+
// GDPR-light metadata: id + flag only, no decision_text.
|
|
142
|
+
appendAuditEvent(db, {
|
|
143
|
+
tenantId,
|
|
144
|
+
actor,
|
|
145
|
+
op: 'decision_create',
|
|
146
|
+
targetId: String(decisionId),
|
|
147
|
+
metadata: {
|
|
148
|
+
decision_id: decisionId,
|
|
149
|
+
has_context: opts.context !== undefined && opts.context !== null && opts.context !== '',
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
return row;
|
|
153
|
+
}
|
|
62
154
|
/**
|
|
63
155
|
* Create a decision. Writes the memory mirror + the decisions row atomically
|
|
64
156
|
* inside writeEntry's SAVEPOINT 'write_entry'. When supersedesDecisionId is
|
|
@@ -76,88 +168,14 @@ export function saveDecision(hippoRoot, tenantId, opts, actor = 'cli') {
|
|
|
76
168
|
if (!opts.decisionText)
|
|
77
169
|
throw new BadRequestError('saveDecision: decisionText is required');
|
|
78
170
|
const now = new Date().toISOString();
|
|
79
|
-
const
|
|
80
|
-
? `${opts.decisionText}\n\nContext: ${opts.context}`
|
|
81
|
-
: opts.decisionText;
|
|
82
|
-
const tags = ['decision', ...(opts.extraTags ?? [])];
|
|
83
|
-
const mem = createMemory(content, {
|
|
84
|
-
tags,
|
|
85
|
-
layer: Layer.Semantic,
|
|
86
|
-
confidence: 'verified',
|
|
87
|
-
source: 'decision',
|
|
88
|
-
baseHalfLifeDays: objectHalfLifeDays(hippoRoot),
|
|
89
|
-
tenantId,
|
|
90
|
-
});
|
|
171
|
+
const mem = buildDecisionMemory(hippoRoot, tenantId, opts);
|
|
91
172
|
// Populated inside afterWrite so the INSERT, the supersede UPDATE, and the
|
|
92
173
|
// memory write all share one SAVEPOINT.
|
|
93
174
|
let savedRow;
|
|
94
175
|
writeEntry(hippoRoot, mem, {
|
|
95
176
|
actor,
|
|
96
177
|
afterWrite: (db, memoryId) => {
|
|
97
|
-
|
|
98
|
-
// row's autoincrement id could otherwise collide with a non-existent
|
|
99
|
-
// supersedesDecisionId (e.g. superseding id 1 on an empty store, where the
|
|
100
|
-
// INSERT below would itself become id 1), making the row supersede itself.
|
|
101
|
-
// Validating first means the new row is never a candidate for its own
|
|
102
|
-
// supersede UPDATE. codex review 2026-05-28 (P1).
|
|
103
|
-
if (opts.supersedesDecisionId !== undefined) {
|
|
104
|
-
// SAFETY: row shape matches the single `status` column named in the SELECT below.
|
|
105
|
-
const pred = db.prepare(`SELECT status FROM decisions WHERE id = ? AND tenant_id = ?`).get(opts.supersedesDecisionId, tenantId);
|
|
106
|
-
if (!pred) {
|
|
107
|
-
throw new NotFoundError(`saveDecision: decision ${opts.supersedesDecisionId} to supersede not found for tenant ${tenantId}`);
|
|
108
|
-
}
|
|
109
|
-
if (pred.status !== 'active') {
|
|
110
|
-
throw new ConflictError(`saveDecision: decision ${opts.supersedesDecisionId} is not active (status='${pred.status}'); only active decisions can be superseded.`);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
const result = db.prepare(`
|
|
114
|
-
INSERT INTO decisions(
|
|
115
|
-
memory_id, tenant_id, decision_text, context,
|
|
116
|
-
status, superseded_by, superseded_at, closed_at, created_at
|
|
117
|
-
) VALUES (?, ?, ?, ?, 'active', NULL, NULL, NULL, ?)
|
|
118
|
-
`).run(memoryId, tenantId, opts.decisionText, opts.context ?? null, now);
|
|
119
|
-
const decisionId = Number(result.lastInsertRowid ?? 0);
|
|
120
|
-
// Supersede the (preflight-validated) prior active decision in the SAME
|
|
121
|
-
// SAVEPOINT, atomic with the new row. The `id != decisionId` exclusion is
|
|
122
|
-
// defense-in-depth against the self-match described above; combined with
|
|
123
|
-
// the preflight, a 0-change here is unreachable in the single-writer txn.
|
|
124
|
-
if (opts.supersedesDecisionId !== undefined) {
|
|
125
|
-
const sup = db.prepare(`
|
|
126
|
-
UPDATE decisions
|
|
127
|
-
SET status = 'superseded', superseded_by = ?, superseded_at = ?
|
|
128
|
-
WHERE id = ? AND tenant_id = ? AND status = 'active' AND id != ?
|
|
129
|
-
`).run(decisionId, now, opts.supersedesDecisionId, tenantId, decisionId);
|
|
130
|
-
if (sup.changes === 0) {
|
|
131
|
-
throw new BadRequestError(`saveDecision: decision ${opts.supersedesDecisionId} could not be superseded (no longer active or self-reference).`);
|
|
132
|
-
}
|
|
133
|
-
appendAuditEvent(db, {
|
|
134
|
-
tenantId,
|
|
135
|
-
actor,
|
|
136
|
-
op: 'decision_supersede',
|
|
137
|
-
targetId: String(opts.supersedesDecisionId),
|
|
138
|
-
metadata: {
|
|
139
|
-
decision_id: opts.supersedesDecisionId,
|
|
140
|
-
superseded_by: decisionId,
|
|
141
|
-
},
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
// SAFETY: row's shape matches the columns named in DECISION_COLS above.
|
|
145
|
-
const row = db.prepare(`SELECT ${DECISION_COLS} FROM decisions WHERE id = ?`)
|
|
146
|
-
.get(decisionId);
|
|
147
|
-
if (!row)
|
|
148
|
-
throw new Error('saveDecision: failed to reload saved decision row');
|
|
149
|
-
savedRow = row;
|
|
150
|
-
// GDPR-light metadata: id + flag only, no decision_text.
|
|
151
|
-
appendAuditEvent(db, {
|
|
152
|
-
tenantId,
|
|
153
|
-
actor,
|
|
154
|
-
op: 'decision_create',
|
|
155
|
-
targetId: String(decisionId),
|
|
156
|
-
metadata: {
|
|
157
|
-
decision_id: decisionId,
|
|
158
|
-
has_context: opts.context !== undefined && opts.context !== null && opts.context !== '',
|
|
159
|
-
},
|
|
160
|
-
});
|
|
178
|
+
savedRow = writeDecisionRow(db, memoryId, tenantId, opts, actor, now);
|
|
161
179
|
},
|
|
162
180
|
// Post-commit hook: mark the tenant's graph dirty AFTER the DB row commits
|
|
163
181
|
// but BEFORE the markdown mirrors are written, so a mirror-write failure can
|
|
@@ -252,6 +270,7 @@ export function loadDecisionById(hippoRoot, tenantId, id) {
|
|
|
252
270
|
export function loadDecisions(hippoRoot, tenantId, opts = {}) {
|
|
253
271
|
assertTenantId('loadDecisions', tenantId);
|
|
254
272
|
const limit = opts.limit ?? 100;
|
|
273
|
+
const after = keysetAfter('created_at', 'id', opts.after);
|
|
255
274
|
const db = openHippoDb(hippoRoot);
|
|
256
275
|
try {
|
|
257
276
|
let rows;
|
|
@@ -262,19 +281,19 @@ export function loadDecisions(hippoRoot, tenantId, opts = {}) {
|
|
|
262
281
|
// SAFETY: rows' shape matches the columns named in DECISION_COLS above.
|
|
263
282
|
rows = db.prepare(`
|
|
264
283
|
SELECT ${DECISION_COLS} FROM decisions
|
|
265
|
-
WHERE tenant_id = ? AND status =
|
|
284
|
+
WHERE tenant_id = ? AND status = ?${after.sql}
|
|
266
285
|
ORDER BY created_at DESC, id DESC
|
|
267
286
|
LIMIT ?
|
|
268
|
-
`).all(tenantId, opts.status, limit);
|
|
287
|
+
`).all(tenantId, opts.status, ...after.params, limit);
|
|
269
288
|
}
|
|
270
289
|
else {
|
|
271
290
|
// SAFETY: rows' shape matches the columns named in DECISION_COLS above.
|
|
272
291
|
rows = db.prepare(`
|
|
273
292
|
SELECT ${DECISION_COLS} FROM decisions
|
|
274
|
-
WHERE tenant_id =
|
|
293
|
+
WHERE tenant_id = ?${after.sql}
|
|
275
294
|
ORDER BY created_at DESC, id DESC
|
|
276
295
|
LIMIT ?
|
|
277
|
-
`).all(tenantId, limit);
|
|
296
|
+
`).all(tenantId, ...after.params, limit);
|
|
278
297
|
}
|
|
279
298
|
return rows.map(rowToDecision);
|
|
280
299
|
}
|
package/dist/dedupe.js
CHANGED
|
@@ -20,8 +20,9 @@
|
|
|
20
20
|
* WITHIN each tenant group; cross-tenant pairs are never compared. Raw and
|
|
21
21
|
* superseded rows are not candidates at all (v1.38.1).
|
|
22
22
|
*/
|
|
23
|
-
import { textOverlap } from './
|
|
24
|
-
import { loadAllEntries
|
|
23
|
+
import { textOverlap } from './tokenize.js';
|
|
24
|
+
import { loadAllEntries } from './store/entry-reads.js';
|
|
25
|
+
import { deleteEntry, memoriesBackingObjects } from './store/delete-and-batch.js';
|
|
25
26
|
import { compareEntryIdentity } from './compare.js';
|
|
26
27
|
import { canAutoDelete } from './memory.js';
|
|
27
28
|
import { derivationPartitionKey } from './recall-scope.js';
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
// In-memory observer for one pinned-only context call: what was considered, why each was rejected, what reached stdout.
|
|
2
|
+
// No DB access (the caller hands build()'s output to src/recall-trace.ts); hashes, ids, counts and enums only, never text.
|
|
3
|
+
import { envTestDeliveryFault } from './env.js';
|
|
1
4
|
import { evalNow } from './ablation.js';
|
|
2
5
|
import { scoreOverlap } from './prompt-recall.js';
|
|
3
6
|
import { blockHash, estimateTokens, hookPayloadSessionId, hookPayloadString, isSubagentPayload } from './token-ledger.js';
|
|
@@ -26,7 +29,7 @@ export function createDeliveryRecorder(init) {
|
|
|
26
29
|
const startedMs = Date.now();
|
|
27
30
|
const ts = evalNow().toISOString();
|
|
28
31
|
// Test-only fault injection, as HIPPO_FAKE_NOW is for time.
|
|
29
|
-
const fault =
|
|
32
|
+
const fault = envTestDeliveryFault();
|
|
30
33
|
const payloadSession = hookPayloadSessionId(init.stdinText);
|
|
31
34
|
const subagent = isSubagentPayload(init.stdinText);
|
|
32
35
|
const envSession = init.envSessionId !== undefined && init.envSessionId !== '' ? init.envSessionId : null;
|
package/dist/doctor.js
CHANGED
|
@@ -9,13 +9,13 @@ import * as os from 'node:os';
|
|
|
9
9
|
import * as path from 'node:path';
|
|
10
10
|
import { findHippoStoreDir } from './project-identity.js';
|
|
11
11
|
import { getGlobalRoot } from './shared.js';
|
|
12
|
-
import { isInitialized } from './store.js';
|
|
12
|
+
import { isInitialized } from './store/open.js';
|
|
13
13
|
import { loadConfig } from './config.js';
|
|
14
14
|
import { openHippoDbReadOnly, closeHippoDb, getSchemaVersion, getCurrentSchemaVersion, countTableRows, IncompatibleBinaryError } from './db.js';
|
|
15
15
|
import { REPLAY_AFTER_MS, TRANSCRIPT_FILL_WINDOW_MS } from './compaction-record.js';
|
|
16
|
-
import { isEmbeddingAvailable } from './
|
|
17
|
-
import { CODEX_TRUST_LINE, codexHomeDir, isCodexPresent, isJsonObject } from './hooks.js';
|
|
18
|
-
import {
|
|
16
|
+
import { isEmbeddingAvailable } from './local-embedding.js';
|
|
17
|
+
import { CODEX_TRUST_LINE, codexHomeDir, isCodexPresent, isJsonObject } from './hooks/shared.js';
|
|
18
|
+
import { planProjectRepair } from './project-merge.js';
|
|
19
19
|
import { resolveTenantId } from './tenant.js';
|
|
20
20
|
/** Minimum Node.js version hippo supports (package.json engines). */
|
|
21
21
|
export const MIN_NODE = '22.16.0';
|
|
@@ -131,16 +131,20 @@ function compactionsCheck(db, now) {
|
|
|
131
131
|
: { id: 'compactions', status: 'warn', detail: `cannot read the compaction records: ${message}` };
|
|
132
132
|
}
|
|
133
133
|
}
|
|
134
|
-
/**
|
|
134
|
+
/** Old project tags in the global store, counted by the repair's own plan so a truly user-global merge never warns. */
|
|
135
135
|
function projectsCheck(globalRoot) {
|
|
136
136
|
let db = null;
|
|
137
137
|
try {
|
|
138
138
|
db = openHippoDbReadOnly(globalRoot);
|
|
139
|
-
const r =
|
|
140
|
-
const
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
139
|
+
const r = planProjectRepair(db, globalRoot, resolveTenantId({}));
|
|
140
|
+
const found = [
|
|
141
|
+
r.copies.length > 0 ? `${r.copies.length} imported notes copied under the wrong project` : '',
|
|
142
|
+
r.folds.length > 0 ? `${r.folds.length} old project names that now resolve to another project` : '',
|
|
143
|
+
r.toProject.length + r.setAside.length > 0 ? `${r.toProject.length + r.setAside.length} merged memories tagged user-global` : '',
|
|
144
|
+
].filter((s) => s !== '');
|
|
145
|
+
return found.length === 0
|
|
146
|
+
? { id: 'projects', status: 'pass', detail: 'no duplicate or out-of-date project tags in the global store' }
|
|
147
|
+
: { id: 'projects', status: 'warn', detail: `global store: ${found.join('; ')}`, fix: 'hippo projects repair --global (dry run; add --apply to write)' };
|
|
144
148
|
}
|
|
145
149
|
catch (err) {
|
|
146
150
|
return { id: 'projects', status: 'info', detail: `project tags not checked (${err instanceof Error ? err.message : String(err)})` };
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
* `fetch` and are integration-verified in Workstream C (real API calls are
|
|
31
31
|
* egress-blocked in the build sandbox).
|
|
32
32
|
*/
|
|
33
|
-
import { type EmbeddingRole } from './
|
|
33
|
+
import { type EmbeddingRole } from './local-embedding.js';
|
|
34
34
|
export type EmbeddingProviderKind = 'local' | 'openai' | 'voyage' | 'cohere';
|
|
35
35
|
export declare const API_PROVIDER_KINDS: readonly EmbeddingProviderKind[];
|
|
36
36
|
export interface EmbeddingProvider {
|
|
@@ -30,7 +30,8 @@
|
|
|
30
30
|
* `fetch` and are integration-verified in Workstream C (real API calls are
|
|
31
31
|
* egress-blocked in the build sandbox).
|
|
32
32
|
*/
|
|
33
|
-
import {
|
|
33
|
+
import { envByName } from './env.js';
|
|
34
|
+
import { getEmbedding, isEmbeddingAvailable, resolveEmbeddingModel, DEFAULT_EMBEDDING_MODEL, } from './local-embedding.js';
|
|
34
35
|
import { loadConfig } from './config.js';
|
|
35
36
|
import { redactSecretsStrict } from './secret-detect.js';
|
|
36
37
|
import { fetchWithRetry } from './http-retry.js';
|
|
@@ -160,12 +161,12 @@ class ApiEmbeddingProvider {
|
|
|
160
161
|
return API_PROVIDER_SPECS[this.kind].keyEnv;
|
|
161
162
|
}
|
|
162
163
|
isAvailable() {
|
|
163
|
-
return this.enabled && !!
|
|
164
|
+
return this.enabled && !!envByName(this.keyEnv)?.trim();
|
|
164
165
|
}
|
|
165
166
|
async embed(texts, role) {
|
|
166
167
|
if (texts.length === 0)
|
|
167
168
|
return [];
|
|
168
|
-
const key =
|
|
169
|
+
const key = envByName(this.keyEnv)?.trim();
|
|
169
170
|
if (!key) {
|
|
170
171
|
// Hard, actionable failure — never includes a key value (there is none).
|
|
171
172
|
throw new Error(`Embedding provider '${this.kind}' is configured but ${this.keyEnv} is not set. ` +
|
package/dist/embeddings.d.ts
CHANGED
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
* Falls back silently if the library is not installed.
|
|
5
5
|
*/
|
|
6
6
|
import { MemoryEntry } from './memory.js';
|
|
7
|
+
import { EMBEDDING_MODEL_META_KEY } from './vector-store.js';
|
|
7
8
|
import { type EmbeddingProvider } from './embedding-provider.js';
|
|
8
|
-
export
|
|
9
|
-
export declare const EMBEDDING_MODEL_META_KEY = "embedding_model";
|
|
9
|
+
export { EMBEDDING_MODEL_META_KEY };
|
|
10
10
|
/**
|
|
11
11
|
* Bump whenever `embeddingInputText`'s composition changes in a way that
|
|
12
12
|
* changes the resulting vectors for existing entries. Folded into the stored
|
|
@@ -57,39 +57,6 @@ export declare function embeddingInputText(entry: {
|
|
|
57
57
|
content: string;
|
|
58
58
|
tags: string[];
|
|
59
59
|
}): string;
|
|
60
|
-
/**
|
|
61
|
-
* Per-model pooling dispatch for Transformers.js's feature-extraction
|
|
62
|
-
* pipeline. BGE family models were trained with CLS pooling (per BAAI's
|
|
63
|
-
* official inference code in `FlagEmbedding`); MiniLM and most sentence-
|
|
64
|
-
* transformers models use mean pooling. Unknown model ids default to mean
|
|
65
|
-
* — that is the safe choice because most third-party models adopt the
|
|
66
|
-
* sentence-transformers convention, and the alternative ('cls') silently
|
|
67
|
-
* degrades vector quality for mean-pooling models.
|
|
68
|
-
*/
|
|
69
|
-
export declare function poolingFor(model: string): 'cls' | 'mean';
|
|
70
|
-
/**
|
|
71
|
-
* Per-model input-prefix dispatch. The intfloat/e5 family was trained with
|
|
72
|
-
* asymmetric "query: " / "passage: " prefixes — the model only matches the
|
|
73
|
-
* two halves correctly when each side carries its prefix at inference. BGE
|
|
74
|
-
* also has prefix conventions for some downstream tasks, but symmetric use
|
|
75
|
-
* without prefixes is the documented default for `bge-*-en-v1.5`, so we leave
|
|
76
|
-
* BGE alone here. Symmetric models (MiniLM, BGE) and unknown models return
|
|
77
|
-
* an empty prefix.
|
|
78
|
-
*
|
|
79
|
-
* `role` semantics:
|
|
80
|
-
* - 'query' — the text is the user's question / search input.
|
|
81
|
-
* - 'passage' — the text is a document being indexed.
|
|
82
|
-
* - undefined or absent — symmetric path; no prefix is applied even for
|
|
83
|
-
* asymmetric models (preserves backwards compatibility with the legacy
|
|
84
|
-
* two-argument `getEmbedding(text, model)` API).
|
|
85
|
-
*/
|
|
86
|
-
export type EmbeddingRole = 'query' | 'passage';
|
|
87
|
-
export declare function prefixFor(model: string, role?: EmbeddingRole): string;
|
|
88
|
-
/**
|
|
89
|
-
* Check (synchronously) if @xenova/transformers or @huggingface/transformers is installed.
|
|
90
|
-
*/
|
|
91
|
-
export declare function isEmbeddingAvailable(): boolean;
|
|
92
|
-
export declare function resolveEmbeddingModel(hippoRoot: string, explicitModel?: string): string;
|
|
93
60
|
/**
|
|
94
61
|
* Persist the stored-index identity for `model` (see `embeddingIndexIdentity`).
|
|
95
62
|
* Versioning happens INSIDE this function, not at call sites, so every caller
|
|
@@ -99,29 +66,19 @@ export declare function resolveEmbeddingModel(hippoRoot: string, explicitModel?:
|
|
|
99
66
|
export declare function saveStoredEmbeddingModel(hippoRoot: string, model: string): void;
|
|
100
67
|
export declare function resolveIndexedEmbeddingModel(hippoRoot: string, index?: Record<string, number[]>): string | null;
|
|
101
68
|
export declare function embeddingModelRequiresReindex(hippoRoot: string, model: string, index?: Record<string, number[]>): boolean;
|
|
102
|
-
/**
|
|
103
|
-
* Get an embedding vector for a piece of text.
|
|
104
|
-
* Returns an empty array if transformers is not available or fails.
|
|
105
|
-
*
|
|
106
|
-
* Pass `role: 'query'` / `'passage'` to engage asymmetric prefixing for
|
|
107
|
-
* model families that require it (currently intfloat/e5-*). Omitting `role`
|
|
108
|
-
* keeps the legacy symmetric behavior (no prefix), so BGE / MiniLM callers
|
|
109
|
-
* don't need to change.
|
|
110
|
-
*/
|
|
111
|
-
export declare function getEmbedding(text: string, model?: string, role?: EmbeddingRole): Promise<number[]>;
|
|
112
69
|
/**
|
|
113
70
|
* Cosine similarity between two vectors. Handles unnormalized vectors.
|
|
114
71
|
* Returns 0 for empty or mismatched vectors.
|
|
115
72
|
*/
|
|
116
73
|
export declare function cosineSimilarity(a: number[], b: number[]): number;
|
|
117
|
-
/**
|
|
118
|
-
* Load the cached embedding index; `{}` when the file is missing. A corrupt file is moved aside and rebuilt on the next embed; any other read error throws, so nothing saves over an index it could not read.
|
|
119
|
-
*/
|
|
74
|
+
/** Every stored vector keyed by memory id; `{}` when none. Search reads only the rows it ranks via `loadStoredVectors`. */
|
|
120
75
|
export declare function loadEmbeddingIndex(hippoRoot: string): Record<string, number[]>;
|
|
121
|
-
/**
|
|
122
|
-
|
|
123
|
-
*/
|
|
124
|
-
export declare function
|
|
76
|
+
/** Stored vectors for `ids` only. */
|
|
77
|
+
export declare function loadStoredVectors(hippoRoot: string, ids: readonly string[]): Map<string, number[]>;
|
|
78
|
+
/** Whether the store holds any vector at all. */
|
|
79
|
+
export declare function hasEmbeddings(hippoRoot: string): boolean;
|
|
80
|
+
/** Replace every stored vector with `index`; `model` defaults to the stored index identity. */
|
|
81
|
+
export declare function saveEmbeddingIndex(hippoRoot: string, index: Record<string, number[]>, model?: string): void;
|
|
125
82
|
/**
|
|
126
83
|
* Embed a single memory entry and cache the result in the embedding index.
|
|
127
84
|
*/
|