hippo-memory 1.60.0 → 1.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/ablation.js +9 -27
- package/dist/agent-memories/apply.js +4 -1
- package/dist/agent-memories/claude-code.js +1 -1
- package/dist/agent-memories/codex.js +1 -1
- package/dist/agent-memories/gemini.js +1 -1
- package/dist/agent-memories/legacy.js +1 -1
- package/dist/agent-memories/source.js +1 -1
- package/dist/agent-memories/sync.js +8 -3
- package/dist/ambient-store.d.ts +14 -0
- package/dist/ambient-store.js +90 -0
- package/dist/ambient.d.ts +23 -0
- package/dist/ambient.js +72 -50
- package/dist/api/assemble.d.ts +93 -0
- package/dist/api/assemble.js +152 -0
- package/dist/api/audit.d.ts +17 -0
- package/dist/api/audit.js +23 -0
- package/dist/api/auth.d.ts +79 -0
- package/dist/api/auth.js +178 -0
- package/dist/api/context-types.d.ts +105 -0
- package/dist/api/context-types.js +3 -0
- package/dist/api/context.d.ts +31 -0
- package/dist/api/context.js +705 -0
- package/dist/api/dormant.d.ts +30 -0
- package/dist/api/dormant.js +140 -0
- package/dist/api/drill-down.d.ts +84 -0
- package/dist/api/drill-down.js +123 -0
- package/dist/api/forget.d.ts +57 -0
- package/dist/api/forget.js +87 -0
- package/dist/api/goals.d.ts +18 -0
- package/dist/api/goals.js +33 -0
- package/dist/api/learn.d.ts +31 -0
- package/dist/api/learn.js +88 -0
- package/dist/api/outcome.d.ts +61 -0
- package/dist/api/outcome.js +66 -0
- package/dist/api/promote.d.ts +54 -0
- package/dist/api/promote.js +203 -0
- package/dist/api/quarantine.d.ts +24 -0
- package/dist/api/quarantine.js +121 -0
- package/dist/api/recall-types.d.ts +390 -0
- package/dist/api/recall-types.js +3 -0
- package/dist/api/recall.d.ts +36 -0
- package/dist/api/recall.js +634 -0
- package/dist/api/remember.d.ts +35 -0
- package/dist/api/remember.js +43 -0
- package/dist/api/sleep.d.ts +136 -0
- package/dist/api/sleep.js +271 -0
- package/dist/api/tokens.d.ts +26 -0
- package/dist/api/tokens.js +60 -0
- package/dist/api/types.d.ts +56 -0
- package/dist/api/types.js +38 -0
- package/dist/api.d.ts +20 -1262
- package/dist/api.js +25 -2727
- package/dist/audit.d.ts +3 -0
- package/dist/audit.js +6 -3
- package/dist/auth.d.ts +45 -4
- package/dist/auth.js +125 -48
- package/dist/autolearn.js +2 -2
- package/dist/capture/command.d.ts +33 -0
- package/dist/capture/command.js +264 -0
- package/dist/capture/compact.d.ts +44 -0
- package/dist/capture/compact.js +354 -0
- package/dist/capture/extract.d.ts +21 -0
- package/dist/capture/extract.js +464 -0
- package/dist/capture/transcript.d.ts +40 -0
- package/dist/capture/transcript.js +193 -0
- package/dist/capture-error.js +2 -1
- package/dist/churn-git.js +4 -2
- package/dist/cli/audit.d.ts +3 -0
- package/dist/cli/audit.js +159 -0
- package/dist/cli/auth.d.ts +2 -0
- package/dist/cli/auth.js +171 -0
- package/dist/cli/briefs.d.ts +4 -0
- package/dist/cli/briefs.js +435 -0
- package/dist/cli/card.d.ts +3 -0
- package/dist/cli/card.js +333 -0
- package/dist/cli/context.d.ts +15 -0
- package/dist/cli/context.js +366 -0
- package/dist/cli/continuity.d.ts +6 -0
- package/dist/cli/continuity.js +445 -0
- package/dist/cli/curate.d.ts +19 -0
- package/dist/cli/curate.js +555 -0
- package/dist/cli/dag.d.ts +5 -0
- package/dist/cli/dag.js +177 -0
- package/dist/cli/decisions.d.ts +4 -0
- package/dist/cli/decisions.js +528 -0
- package/dist/cli/eval.d.ts +5 -0
- package/dist/cli/eval.js +213 -0
- package/dist/cli/explain.d.ts +4 -0
- package/dist/cli/explain.js +150 -0
- package/dist/cli/goals.d.ts +2 -0
- package/dist/cli/goals.js +196 -0
- package/dist/cli/hook-blocks.d.ts +18 -0
- package/dist/cli/hook-blocks.js +233 -0
- package/dist/cli/init.d.ts +2 -0
- package/dist/cli/init.js +305 -0
- package/dist/cli/maintenance.d.ts +4 -0
- package/dist/cli/maintenance.js +179 -0
- package/dist/cli/playbooks.d.ts +4 -0
- package/dist/cli/playbooks.js +556 -0
- package/dist/cli/projects.js +1 -1
- package/dist/cli/recall.d.ts +7 -0
- package/dist/cli/recall.js +597 -0
- package/dist/cli/remember.d.ts +5 -0
- package/dist/cli/remember.js +442 -0
- package/dist/cli/serve.d.ts +5 -0
- package/dist/cli/serve.js +40 -0
- package/dist/cli/session-hooks.d.ts +29 -0
- package/dist/cli/session-hooks.js +637 -0
- package/dist/cli/setup.d.ts +4 -0
- package/dist/cli/setup.js +376 -0
- package/dist/cli/shared.d.ts +15 -19
- package/dist/cli/shared.js +50 -341
- package/dist/cli/slack.d.ts +2 -0
- package/dist/cli/slack.js +171 -0
- package/dist/cli/status.d.ts +18 -0
- package/dist/cli/status.js +400 -0
- package/dist/cli/transfer.d.ts +10 -0
- package/dist/cli/transfer.js +438 -0
- package/dist/cli/usage.d.ts +85 -0
- package/dist/cli/usage.js +741 -0
- package/dist/cli.d.ts +71 -120
- package/dist/cli.js +170 -8469
- package/dist/client.js +15 -8
- package/dist/compaction-record.js +6 -4
- package/dist/connectors/github/backfill.js +94 -87
- package/dist/connectors/github/cli-impl.js +4 -3
- package/dist/connectors/github/dlq.js +67 -54
- package/dist/connectors/github/ingest.js +34 -35
- package/dist/connectors/github/tenant-routing.js +3 -2
- package/dist/connectors/github/webhook.js +135 -216
- package/dist/connectors/slack/dlq.js +49 -61
- package/dist/connectors/slack/ingest.js +55 -48
- package/dist/connectors/slack/tenant-routing.js +4 -3
- package/dist/connectors/slack/webhook.js +72 -74
- package/dist/consolidate/conflicts.d.ts +10 -0
- package/dist/consolidate/conflicts.js +178 -0
- package/dist/consolidate/decay.d.ts +12 -0
- package/dist/consolidate/decay.js +145 -0
- package/dist/consolidate/llm-passes.d.ts +3 -0
- package/dist/consolidate/llm-passes.js +141 -0
- package/dist/consolidate/merge.d.ts +7 -0
- package/dist/consolidate/merge.js +251 -0
- package/dist/consolidate/physics-pass.d.ts +3 -0
- package/dist/consolidate/physics-pass.js +60 -0
- package/dist/consolidate/run.d.ts +69 -0
- package/dist/consolidate/run.js +76 -0
- package/dist/consolidate/sleep.d.ts +18 -0
- package/dist/consolidate/sleep.js +209 -0
- package/dist/consolidate/traces.d.ts +4 -0
- package/dist/consolidate/traces.js +178 -0
- package/dist/context-auto.js +7 -11
- package/dist/context-render.d.ts +1 -1
- package/dist/context-render.js +1 -1
- package/dist/customer-notes.d.ts +3 -0
- package/dist/customer-notes.js +6 -4
- package/dist/dag.js +6 -5
- package/dist/dashboard-actions.d.ts +20 -0
- package/dist/dashboard-actions.js +88 -0
- package/dist/dashboard-params.d.ts +45 -0
- package/dist/dashboard-params.js +127 -0
- package/dist/dashboard-queries.d.ts +15 -0
- package/dist/dashboard-queries.js +355 -0
- package/dist/dashboard-snapshot.d.ts +138 -0
- package/dist/dashboard-snapshot.js +308 -0
- package/dist/dashboard-types.d.ts +163 -0
- package/dist/dashboard-types.js +3 -0
- package/dist/dashboard.d.ts +6 -7
- package/dist/dashboard.js +228 -202
- package/dist/db/busy.d.ts +5 -0
- package/dist/db/busy.js +24 -0
- package/dist/db/continuity.d.ts +5 -0
- package/dist/db/continuity.js +145 -0
- package/dist/db/meta.d.ts +8 -0
- package/dist/db/meta.js +35 -0
- package/dist/db/migrate.d.ts +9 -0
- package/dist/db/migrate.js +138 -0
- package/dist/db/migrations/index.d.ts +5 -0
- package/dist/db/migrations/index.js +109 -0
- package/dist/db/migrations/types.d.ts +14 -0
- package/dist/db/migrations/types.js +2 -0
- package/dist/db/migrations/v01.d.ts +3 -0
- package/dist/db/migrations/v01.js +38 -0
- package/dist/db/migrations/v02.d.ts +3 -0
- package/dist/db/migrations/v02.js +21 -0
- package/dist/db/migrations/v03.d.ts +3 -0
- package/dist/db/migrations/v03.js +22 -0
- package/dist/db/migrations/v04.d.ts +3 -0
- package/dist/db/migrations/v04.js +28 -0
- package/dist/db/migrations/v05.d.ts +3 -0
- package/dist/db/migrations/v05.js +21 -0
- package/dist/db/migrations/v06.d.ts +3 -0
- package/dist/db/migrations/v06.js +25 -0
- package/dist/db/migrations/v07.d.ts +3 -0
- package/dist/db/migrations/v07.js +13 -0
- package/dist/db/migrations/v08.d.ts +3 -0
- package/dist/db/migrations/v08.js +8 -0
- package/dist/db/migrations/v09.d.ts +3 -0
- package/dist/db/migrations/v09.js +13 -0
- package/dist/db/migrations/v10.d.ts +3 -0
- package/dist/db/migrations/v10.js +17 -0
- package/dist/db/migrations/v11.d.ts +3 -0
- package/dist/db/migrations/v11.js +15 -0
- package/dist/db/migrations/v12.d.ts +3 -0
- package/dist/db/migrations/v12.js +11 -0
- package/dist/db/migrations/v13.d.ts +3 -0
- package/dist/db/migrations/v13.js +15 -0
- package/dist/db/migrations/v14.d.ts +3 -0
- package/dist/db/migrations/v14.js +66 -0
- package/dist/db/migrations/v15.d.ts +3 -0
- package/dist/db/migrations/v15.js +42 -0
- package/dist/db/migrations/v16.d.ts +3 -0
- package/dist/db/migrations/v16.js +61 -0
- package/dist/db/migrations/v17.d.ts +3 -0
- package/dist/db/migrations/v17.js +46 -0
- package/dist/db/migrations/v18.d.ts +3 -0
- package/dist/db/migrations/v18.js +60 -0
- package/dist/db/migrations/v19.d.ts +3 -0
- package/dist/db/migrations/v19.js +28 -0
- package/dist/db/migrations/v20.d.ts +3 -0
- package/dist/db/migrations/v20.js +42 -0
- package/dist/db/migrations/v21.d.ts +3 -0
- package/dist/db/migrations/v21.js +16 -0
- package/dist/db/migrations/v22.d.ts +3 -0
- package/dist/db/migrations/v22.js +82 -0
- package/dist/db/migrations/v23.d.ts +3 -0
- package/dist/db/migrations/v23.js +48 -0
- package/dist/db/migrations/v24.d.ts +3 -0
- package/dist/db/migrations/v24.js +72 -0
- package/dist/db/migrations/v25.d.ts +3 -0
- package/dist/db/migrations/v25.js +46 -0
- package/dist/db/migrations/v26.d.ts +3 -0
- package/dist/db/migrations/v26.js +23 -0
- package/dist/db/migrations/v27.d.ts +3 -0
- package/dist/db/migrations/v27.js +57 -0
- package/dist/db/migrations/v28.d.ts +3 -0
- package/dist/db/migrations/v28.js +38 -0
- package/dist/db/migrations/v29.d.ts +3 -0
- package/dist/db/migrations/v29.js +78 -0
- package/dist/db/migrations/v30.d.ts +3 -0
- package/dist/db/migrations/v30.js +92 -0
- package/dist/db/migrations/v31.d.ts +3 -0
- package/dist/db/migrations/v31.js +74 -0
- package/dist/db/migrations/v32.d.ts +3 -0
- package/dist/db/migrations/v32.js +102 -0
- package/dist/db/migrations/v33.d.ts +3 -0
- package/dist/db/migrations/v33.js +104 -0
- package/dist/db/migrations/v34.d.ts +3 -0
- package/dist/db/migrations/v34.js +93 -0
- package/dist/db/migrations/v35.d.ts +3 -0
- package/dist/db/migrations/v35.js +98 -0
- package/dist/db/migrations/v36.d.ts +3 -0
- package/dist/db/migrations/v36.js +98 -0
- package/dist/db/migrations/v37.d.ts +3 -0
- package/dist/db/migrations/v37.js +219 -0
- package/dist/db/migrations/v38.d.ts +3 -0
- package/dist/db/migrations/v38.js +277 -0
- package/dist/db/migrations/v39.d.ts +3 -0
- package/dist/db/migrations/v39.js +59 -0
- package/dist/db/migrations/v40.d.ts +3 -0
- package/dist/db/migrations/v40.js +74 -0
- package/dist/db/migrations/v41.d.ts +3 -0
- package/dist/db/migrations/v41.js +43 -0
- package/dist/db/migrations/v42.d.ts +3 -0
- package/dist/db/migrations/v42.js +41 -0
- package/dist/db/migrations/v43.d.ts +3 -0
- package/dist/db/migrations/v43.js +67 -0
- package/dist/db/migrations/v44.d.ts +3 -0
- package/dist/db/migrations/v44.js +28 -0
- package/dist/db/migrations/v45.d.ts +3 -0
- package/dist/db/migrations/v45.js +30 -0
- package/dist/db/migrations/v46.d.ts +3 -0
- package/dist/db/migrations/v46.js +25 -0
- package/dist/db/migrations/v47.d.ts +3 -0
- package/dist/db/migrations/v47.js +17 -0
- package/dist/db/migrations/v48.d.ts +3 -0
- package/dist/db/migrations/v48.js +10 -0
- package/dist/db/migrations/v49.d.ts +3 -0
- package/dist/db/migrations/v49.js +31 -0
- package/dist/db/migrations/v50.d.ts +3 -0
- package/dist/db/migrations/v50.js +67 -0
- package/dist/db/migrations/v51.d.ts +3 -0
- package/dist/db/migrations/v51.js +14 -0
- package/dist/db/migrations/v52.d.ts +3 -0
- package/dist/db/migrations/v52.js +7 -0
- package/dist/db/open.d.ts +23 -0
- package/dist/db/open.js +146 -0
- package/dist/db/sqlite.d.ts +21 -0
- package/dist/db/sqlite.js +8 -0
- package/dist/db/tables.d.ts +7 -0
- package/dist/db/tables.js +38 -0
- package/dist/db.d.ts +6 -46
- package/dist/db.js +5 -3049
- package/dist/decisions.d.ts +4 -1
- package/dist/decisions.js +9 -7
- package/dist/dedupe.js +3 -2
- package/dist/delivery-recorder.js +4 -1
- package/dist/doctor.js +3 -3
- package/dist/embedding-provider.d.ts +1 -1
- package/dist/embedding-provider.js +4 -3
- package/dist/embeddings.d.ts +9 -52
- package/dist/embeddings.js +43 -297
- package/dist/env.d.ts +75 -0
- package/dist/env.js +119 -0
- package/dist/eval-suite.js +1 -1
- package/dist/eval.js +2 -2
- package/dist/extract.js +1 -1
- package/dist/gated-write.js +3 -1
- package/dist/goals.d.ts +3 -1
- package/dist/goals.js +18 -0
- package/dist/graph/read.d.ts +73 -0
- package/dist/graph/read.js +325 -0
- package/dist/graph/rows.d.ts +45 -0
- package/dist/graph/rows.js +51 -0
- package/dist/graph/types.d.ts +83 -0
- package/dist/graph/types.js +11 -0
- package/dist/graph/write.d.ts +93 -0
- package/dist/{graph.js → graph/write.js} +6 -384
- package/dist/graph-extract.js +2 -1
- package/dist/graph-recall.d.ts +1 -1
- package/dist/graph-recall.js +2 -2
- package/dist/graph-stream.js +1 -1
- package/dist/graph-view.d.ts +1 -1
- package/dist/graph-view.js +1 -1
- package/dist/half-life-migration.d.ts +1 -1
- package/dist/half-life-migration.js +2 -1
- package/dist/hooks/codex-session.d.ts +8 -0
- package/dist/hooks/codex-session.js +76 -0
- package/dist/hooks/codex-wrapper.d.ts +55 -0
- package/dist/hooks/codex-wrapper.js +288 -0
- package/dist/hooks/json-hooks.d.ts +63 -0
- package/dist/hooks/json-hooks.js +356 -0
- package/dist/hooks/opencode.d.ts +50 -0
- package/dist/hooks/opencode.js +202 -0
- package/dist/hooks/shared.d.ts +54 -0
- package/dist/hooks/shared.js +77 -0
- package/dist/http-retry.d.ts +2 -0
- package/dist/http-retry.js +4 -3
- package/dist/http-util.d.ts +3 -0
- package/dist/http-util.js +10 -0
- package/dist/{importers.d.ts → importers/core.d.ts} +13 -17
- package/dist/importers/core.js +141 -0
- package/dist/importers/markdown-parse.d.ts +41 -0
- package/dist/importers/markdown-parse.js +132 -0
- package/dist/importers/markdown.d.ts +3 -0
- package/dist/importers/markdown.js +92 -0
- package/dist/importers/sources.d.ts +7 -0
- package/dist/importers/sources.js +229 -0
- package/dist/importers/vault.d.ts +11 -0
- package/dist/importers/vault.js +352 -0
- package/dist/incidents.d.ts +3 -0
- package/dist/incidents.js +7 -5
- package/dist/index.d.ts +25 -6
- package/dist/index.js +23 -6
- package/dist/invalidation.js +2 -1
- package/dist/judgment.js +2 -1
- package/dist/keyset.d.ts +13 -0
- package/dist/keyset.js +8 -0
- package/dist/local-embedding.d.ts +13 -0
- package/dist/local-embedding.js +165 -0
- package/dist/log.d.ts +7 -0
- package/dist/log.js +19 -1
- package/dist/mcp/admin-tools.d.ts +8 -0
- package/dist/mcp/admin-tools.js +116 -0
- package/dist/mcp/format.d.ts +27 -0
- package/dist/mcp/format.js +135 -0
- package/dist/mcp/memory-tools.d.ts +5 -0
- package/dist/mcp/memory-tools.js +83 -0
- package/dist/mcp/protocol.d.ts +83 -0
- package/dist/mcp/protocol.js +55 -0
- package/dist/mcp/recall-tools.d.ts +6 -0
- package/dist/mcp/recall-tools.js +320 -0
- package/dist/mcp/request.d.ts +10 -0
- package/dist/mcp/request.js +163 -0
- package/dist/mcp/server.d.ts +4 -75
- package/dist/mcp/server.js +7 -1190
- package/dist/mcp/session-state.d.ts +11 -0
- package/dist/mcp/session-state.js +28 -0
- package/dist/mcp/stdio.d.ts +8 -0
- package/dist/mcp/stdio.js +79 -0
- package/dist/mcp/tools.d.ts +11 -0
- package/dist/mcp/tools.js +247 -0
- package/dist/memory.d.ts +3 -0
- package/dist/memory.js +27 -1
- package/dist/multihop.d.ts +1 -1
- package/dist/multihop.js +2 -1
- package/dist/owner-validation.js +2 -1
- package/dist/physics-state.js +10 -7
- package/dist/policies.d.ts +3 -0
- package/dist/policies.js +8 -6
- package/dist/postinstall.js +3 -2
- package/dist/predictions/planning-fallacy.d.ts +100 -0
- package/dist/predictions/planning-fallacy.js +190 -0
- package/dist/{predictions.d.ts → predictions/store.d.ts} +7 -102
- package/dist/predictions/store.js +434 -0
- package/dist/processes.d.ts +3 -0
- package/dist/processes.js +7 -5
- package/dist/project-briefs.d.ts +3 -0
- package/dist/project-briefs.js +7 -5
- package/dist/project-identity.js +3 -2
- package/dist/project-merge.js +3 -1
- package/dist/quarantine.d.ts +2 -1
- package/dist/quarantine.js +8 -5
- package/dist/raw-archive.js +1 -1
- package/dist/recall-history.js +3 -2
- package/dist/recall-pipeline.d.ts +2 -2
- package/dist/recall-pipeline.js +16 -8
- package/dist/recall-scope.js +1 -1
- package/dist/recall-trace.d.ts +1 -1
- package/dist/refine-llm.js +2 -1
- package/dist/reject-flow.js +6 -1
- package/dist/rerankers/clef.js +6 -5
- package/dist/rerankers/jev.d.ts +1 -1
- package/dist/rerankers/jev.js +4 -4
- package/dist/rerankers/llm.d.ts +4 -2
- package/dist/rerankers/llm.js +58 -38
- package/dist/rerankers/types.d.ts +1 -1
- package/dist/salience.js +1 -1
- package/dist/scheduler.d.ts +1 -0
- package/dist/scheduler.js +26 -4
- package/dist/scope.js +4 -3
- package/dist/search/as-of.d.ts +10 -0
- package/dist/search/as-of.js +22 -0
- package/dist/search/bm25-search.d.ts +14 -0
- package/dist/search/bm25-search.js +43 -0
- package/dist/search/bm25.d.ts +15 -0
- package/dist/search/bm25.js +54 -0
- package/dist/search/boosts.d.ts +54 -0
- package/dist/search/boosts.js +94 -0
- package/dist/search/breakdown.d.ts +7 -0
- package/dist/search/breakdown.js +20 -0
- package/dist/search/explain.d.ts +25 -0
- package/dist/search/explain.js +31 -0
- package/dist/search/finalize.d.ts +8 -0
- package/dist/search/finalize.js +52 -0
- package/dist/search/fusion.d.ts +27 -0
- package/dist/search/fusion.js +42 -0
- package/dist/search/hybrid-score.d.ts +20 -0
- package/dist/search/hybrid-score.js +73 -0
- package/dist/search/hybrid.d.ts +46 -0
- package/dist/search/hybrid.js +64 -0
- package/dist/search/physics-search.d.ts +29 -0
- package/dist/search/physics-search.js +162 -0
- package/dist/search/rerank.d.ts +10 -0
- package/dist/search/rerank.js +72 -0
- package/dist/search/temporal.d.ts +15 -0
- package/dist/search/temporal.js +45 -0
- package/dist/search/types.d.ts +91 -0
- package/dist/search/types.js +2 -0
- package/dist/search/vector.d.ts +30 -0
- package/dist/search/vector.js +71 -0
- package/dist/secret-detect.d.ts +2 -0
- package/dist/secret-detect.js +2 -1
- package/dist/server/auth.d.ts +52 -0
- package/dist/server/auth.js +221 -0
- package/dist/server/client-ip.d.ts +25 -0
- package/dist/server/client-ip.js +92 -0
- package/dist/server/cursor.d.ts +23 -0
- package/dist/server/cursor.js +58 -0
- package/dist/server/lifecycle.d.ts +7 -0
- package/dist/server/lifecycle.js +29 -0
- package/dist/server/mcp-http.d.ts +5 -0
- package/dist/server/mcp-http.js +199 -0
- package/dist/server/request.d.ts +33 -0
- package/dist/server/request.js +103 -0
- package/dist/server/routes/admin.d.ts +9 -0
- package/dist/server/routes/admin.js +158 -0
- package/dist/server/routes/customer-notes.d.ts +7 -0
- package/dist/server/routes/customer-notes.js +112 -0
- package/dist/server/routes/decisions.d.ts +7 -0
- package/dist/server/routes/decisions.js +133 -0
- package/dist/server/routes/incidents.d.ts +7 -0
- package/dist/server/routes/incidents.js +126 -0
- package/dist/server/routes/memories.d.ts +10 -0
- package/dist/server/routes/memories.js +179 -0
- package/dist/server/routes/policies.d.ts +8 -0
- package/dist/server/routes/policies.js +151 -0
- package/dist/server/routes/predictions.d.ts +7 -0
- package/dist/server/routes/predictions.js +164 -0
- package/dist/server/routes/processes.d.ts +7 -0
- package/dist/server/routes/processes.js +161 -0
- package/dist/server/routes/project-briefs.d.ts +8 -0
- package/dist/server/routes/project-briefs.js +136 -0
- package/dist/server/routes/recall.d.ts +8 -0
- package/dist/server/routes/recall.js +340 -0
- package/dist/server/routes/skills.d.ts +8 -0
- package/dist/server/routes/skills.js +150 -0
- package/dist/server/types.d.ts +56 -0
- package/dist/server/types.js +2 -0
- package/dist/server/validation.d.ts +14 -0
- package/dist/server/validation.js +91 -0
- package/dist/server.d.ts +7 -61
- package/dist/server.js +69 -2362
- package/dist/session-digest.d.ts +1 -1
- package/dist/session-digest.js +9 -2
- package/dist/shared.d.ts +3 -1
- package/dist/shared.js +26 -22
- package/dist/skills.d.ts +3 -0
- package/dist/skills.js +7 -5
- package/dist/stdin.js +2 -2
- package/dist/store/audit-event.d.ts +19 -0
- package/dist/store/audit-event.js +33 -0
- package/dist/store/candidates.d.ts +42 -0
- package/dist/store/candidates.js +152 -0
- package/dist/store/conflicts.d.ts +44 -0
- package/dist/store/conflicts.js +444 -0
- package/dist/store/delete-and-batch.d.ts +63 -0
- package/dist/store/delete-and-batch.js +310 -0
- package/dist/store/entry-reads.d.ts +92 -0
- package/dist/store/entry-reads.js +255 -0
- package/dist/store/entry-row.d.ts +67 -0
- package/dist/store/entry-row.js +208 -0
- package/dist/store/entry-writes.d.ts +46 -0
- package/dist/store/entry-writes.js +148 -0
- package/dist/store/handoffs.d.ts +26 -0
- package/dist/store/handoffs.js +184 -0
- package/dist/store/index-and-stats.d.ts +52 -0
- package/dist/store/index-and-stats.js +214 -0
- package/dist/store/markdown.d.ts +10 -0
- package/dist/store/markdown.js +108 -0
- package/dist/store/mirrors.d.ts +49 -0
- package/dist/store/mirrors.js +312 -0
- package/dist/store/open.d.ts +15 -0
- package/dist/store/open.js +223 -0
- package/dist/store/rows.d.ts +178 -0
- package/dist/store/rows.js +158 -0
- package/dist/store/search-rows.d.ts +86 -0
- package/dist/store/search-rows.js +254 -0
- package/dist/store/sessions.d.ts +83 -0
- package/dist/store/sessions.js +272 -0
- package/dist/store/summaries.d.ts +94 -0
- package/dist/store/summaries.js +377 -0
- package/dist/store/tenant-lookup.d.ts +12 -0
- package/dist/store/tenant-lookup.js +16 -0
- package/dist/store-cards.js +2 -1
- package/dist/summary-dirty.d.ts +4 -0
- package/dist/summary-dirty.js +32 -0
- package/dist/support-bundle.js +4 -3
- package/dist/tenant.js +2 -2
- package/dist/tokenize.d.ts +2 -0
- package/dist/tokenize.js +16 -0
- package/dist/transcript-tail.d.ts +7 -0
- package/dist/transcript-tail.js +48 -0
- package/dist/vector-store.d.ts +27 -0
- package/dist/vector-store.js +210 -0
- package/dist/version.d.ts +2 -2
- package/dist/version.js +2 -2
- package/dist/working-memory.js +1 -1
- package/dist/yaml.js +36 -11
- package/dist-ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
- package/dist-ui/assets/index-DPN7cP19.js +33 -0
- package/dist-ui/assets/index-dFloKRVr.css +1 -0
- package/dist-ui/index.html +3 -25
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
- package/dist/capture.d.ts +0 -155
- package/dist/capture.js +0 -1295
- package/dist/consolidate.d.ts +0 -58
- package/dist/consolidate.js +0 -1124
- package/dist/graph.d.ts +0 -245
- package/dist/hooks.d.ts +0 -208
- package/dist/hooks.js +0 -1076
- package/dist/importers.js +0 -900
- package/dist/predictions.js +0 -620
- package/dist/search.d.ts +0 -320
- package/dist/search.js +0 -970
- package/dist/store.d.ts +0 -776
- package/dist/store.js +0 -3473
- package/dist-ui/assets/d3-BiWEKnn4.js +0 -1
- package/dist-ui/assets/index-BhT8RvO6.js +0 -61
- package/dist-ui/assets/index-RoXXJ5dq.css +0 -1
- package/dist-ui/assets/three-BDgTxR1l.js +0 -4112
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { MemoryEntry } from '../memory.js';
|
|
2
|
+
import { openHippoDb } from '../db.js';
|
|
3
|
+
/**
|
|
4
|
+
* `bypassRejectionGuard` (AT1, plan §3): ONLY `batchWriteAndDelete`'s call
|
|
5
|
+
* site passes `true`. Consolidation merges are DETERMINISTIC CONCATENATION
|
|
6
|
+
* (mergeContents, consolidate.ts:736-751), not LLM paraphrase — the bypass
|
|
7
|
+
* is safe because the producer (consolidate.ts's merge pass) now checks the
|
|
8
|
+
* merged content's rejection digest against the tenant's tombstones BEFORE
|
|
9
|
+
* ever assembling a batch to write, and skips the merge entirely on a hit.
|
|
10
|
+
* Every other caller (writeEntryDbOnly, bootstrapLegacyStore, rebuildIndex)
|
|
11
|
+
* leaves this false and the guard runs live.
|
|
12
|
+
*
|
|
13
|
+
* AT1 P1 fix (codex, batch-transaction rejection race): the producer check
|
|
14
|
+
* above runs on a DIFFERENT connection BEFORE this transaction opens — a
|
|
15
|
+
* `hippo reject X` that commits in that window is invisible to it. This
|
|
16
|
+
* parameter's contract is UNCHANGED (still the sole bypass, still trusted
|
|
17
|
+
* by the producer-side check for the common case); what changed is that
|
|
18
|
+
* `batchWriteAndDelete` no longer trusts it BLINDLY. It now runs its own
|
|
19
|
+
* in-transaction point-probe (same connection, same digest lookup this
|
|
20
|
+
* function's guard would have done) immediately before each upsert and
|
|
21
|
+
* skips — rather than writes — any entry whose content matches a tombstone
|
|
22
|
+
* that landed after the producer's check. See batchWriteAndDelete for the
|
|
23
|
+
* skip logic.
|
|
24
|
+
*/
|
|
25
|
+
export declare function upsertEntryRow(db: ReturnType<typeof openHippoDb>, entry: MemoryEntry, bypassRejectionGuard?: boolean): void;
|
|
26
|
+
export declare function syncFtsRow(db: ReturnType<typeof openHippoDb>, entry: MemoryEntry, isNewRow?: boolean): void;
|
|
27
|
+
export declare function deleteFtsRow(db: ReturnType<typeof openHippoDb>, id: string): void;
|
|
28
|
+
/**
|
|
29
|
+
* Write a memory entry to SQLite and refresh compatibility mirrors.
|
|
30
|
+
*
|
|
31
|
+
* `opts.actor` defaults to 'cli' so unauthenticated direct-CLI callers still
|
|
32
|
+
* get the right audit attribution. The HTTP server (A1) and api.* layer pass
|
|
33
|
+
* the resolved actor (`api_key:<key_id>` / `localhost:cli`) so audit events
|
|
34
|
+
* land with one row per write, no double-emit.
|
|
35
|
+
*
|
|
36
|
+
* `opts.afterWrite` is invoked inside the same SAVEPOINT as the memories
|
|
37
|
+
* INSERT (mirrors archiveRawMemory's shape in raw-archive.ts). On callback
|
|
38
|
+
* throw, the SAVEPOINT rolls back — the memory row never lands, and the
|
|
39
|
+
* filesystem mirrors / audit emit never run. Used by E1.3+ connectors to
|
|
40
|
+
* stamp idempotency rows atomically with the memory write.
|
|
41
|
+
*/
|
|
42
|
+
/**
|
|
43
|
+
* Stamp origin_project from the store's own location when the entry has
|
|
44
|
+
* never been stamped (v39 memory scope isolation). The store dir is
|
|
45
|
+
* `<project>/.hippo`, so its parent resolves to the owning project; the
|
|
46
|
+
* home/global store resolves to '' (user-global). Callers that know a better
|
|
47
|
+
* origin (shareMemory, syncGlobalToLocal) set entry.origin_project before
|
|
48
|
+
* writing and this is a no-op. Returns a stamped copy; never mutates.
|
|
49
|
+
*
|
|
50
|
+
* NULL is deliberately PRESERVED, not re-stamped: null means "legacy row the
|
|
51
|
+
* v39 migration found no evidence for" and is deny-by-default in ambient
|
|
52
|
+
* context. A writeback (e.g. markRetrieved on a crossProject-included row)
|
|
53
|
+
* must not launder it into an injectable origin - the migration is the only
|
|
54
|
+
* evidence-based NULL converter (codex gating round 2 P1).
|
|
55
|
+
*/
|
|
56
|
+
export declare function stampOriginProject(hippoRoot: string, entry: MemoryEntry): MemoryEntry;
|
|
57
|
+
/**
|
|
58
|
+
* Import-time variant for a mirror with no origin field (an explicit null stays null): used only where evidence exists
|
|
59
|
+
* for rows that predate the origin column - the legacy-markdown bootstrap and
|
|
60
|
+
* rebuildIndex import, which are the markdown-store equivalent of the v39 SQL
|
|
61
|
+
* backfill. Same evidence order as the migration: the provenance source
|
|
62
|
+
* (`shared:<project>:` / `promoted:<localRoot>`) wins over the destination
|
|
63
|
+
* store's location, so a shared row imported into the global store keeps its
|
|
64
|
+
* owning project instead of becoming user-global (codex gating round 3 P1).
|
|
65
|
+
*/
|
|
66
|
+
export declare function stampOriginProjectForImport(hippoRoot: string, entry: MemoryEntry): MemoryEntry;
|
|
67
|
+
//# sourceMappingURL=entry-row.d.ts.map
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
import { isFtsAvailable } from '../db.js';
|
|
3
|
+
import { deriveOriginProject, originFromSource } from '../project-identity.js';
|
|
4
|
+
import { checkRejectionGuard } from '../rejection.js';
|
|
5
|
+
import { log } from '../log.js';
|
|
6
|
+
/**
|
|
7
|
+
* `bypassRejectionGuard` (AT1, plan §3): ONLY `batchWriteAndDelete`'s call
|
|
8
|
+
* site passes `true`. Consolidation merges are DETERMINISTIC CONCATENATION
|
|
9
|
+
* (mergeContents, consolidate.ts:736-751), not LLM paraphrase — the bypass
|
|
10
|
+
* is safe because the producer (consolidate.ts's merge pass) now checks the
|
|
11
|
+
* merged content's rejection digest against the tenant's tombstones BEFORE
|
|
12
|
+
* ever assembling a batch to write, and skips the merge entirely on a hit.
|
|
13
|
+
* Every other caller (writeEntryDbOnly, bootstrapLegacyStore, rebuildIndex)
|
|
14
|
+
* leaves this false and the guard runs live.
|
|
15
|
+
*
|
|
16
|
+
* AT1 P1 fix (codex, batch-transaction rejection race): the producer check
|
|
17
|
+
* above runs on a DIFFERENT connection BEFORE this transaction opens — a
|
|
18
|
+
* `hippo reject X` that commits in that window is invisible to it. This
|
|
19
|
+
* parameter's contract is UNCHANGED (still the sole bypass, still trusted
|
|
20
|
+
* by the producer-side check for the common case); what changed is that
|
|
21
|
+
* `batchWriteAndDelete` no longer trusts it BLINDLY. It now runs its own
|
|
22
|
+
* in-transaction point-probe (same connection, same digest lookup this
|
|
23
|
+
* function's guard would have done) immediately before each upsert and
|
|
24
|
+
* skips — rather than writes — any entry whose content matches a tombstone
|
|
25
|
+
* that landed after the producer's check. See batchWriteAndDelete for the
|
|
26
|
+
* skip logic.
|
|
27
|
+
*/
|
|
28
|
+
export function upsertEntryRow(db, entry, bypassRejectionGuard = false) {
|
|
29
|
+
if (!bypassRejectionGuard) {
|
|
30
|
+
checkRejectionGuard(db, entry.tenantId ?? 'default', entry.id, entry.content);
|
|
31
|
+
}
|
|
32
|
+
const isNewRow = db.prepare(`SELECT 1 FROM memories WHERE id = ?`).get(entry.id) === undefined;
|
|
33
|
+
db.prepare(UPSERT_MEMORY_SQL).run(...memoryRowValues(entry));
|
|
34
|
+
syncFtsRow(db, entry, isNewRow);
|
|
35
|
+
}
|
|
36
|
+
const UPSERT_MEMORY_SQL = `
|
|
37
|
+
INSERT INTO memories(
|
|
38
|
+
id, created, last_retrieved, retrieval_count, strength, half_life_days, layer,
|
|
39
|
+
tags_json, emotional_valence, schema_fit, source, outcome_score,
|
|
40
|
+
outcome_positive, outcome_negative,
|
|
41
|
+
conflicts_with_json, pinned, confidence, content,
|
|
42
|
+
parents_json, starred,
|
|
43
|
+
trace_outcome, source_session_id,
|
|
44
|
+
valid_from, superseded_by,
|
|
45
|
+
extracted_from,
|
|
46
|
+
dag_level, dag_parent_id,
|
|
47
|
+
kind, scope, owner, artifact_ref,
|
|
48
|
+
tenant_id, origin_project,
|
|
49
|
+
descendant_count, earliest_at, latest_at,
|
|
50
|
+
dag_level_3_built_at,
|
|
51
|
+
updated_at
|
|
52
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, datetime('now'))
|
|
53
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
54
|
+
created = excluded.created,
|
|
55
|
+
last_retrieved = excluded.last_retrieved,
|
|
56
|
+
retrieval_count = excluded.retrieval_count,
|
|
57
|
+
strength = excluded.strength,
|
|
58
|
+
half_life_days = excluded.half_life_days,
|
|
59
|
+
layer = excluded.layer,
|
|
60
|
+
tags_json = excluded.tags_json,
|
|
61
|
+
emotional_valence = excluded.emotional_valence,
|
|
62
|
+
schema_fit = excluded.schema_fit,
|
|
63
|
+
source = excluded.source,
|
|
64
|
+
outcome_score = excluded.outcome_score,
|
|
65
|
+
outcome_positive = excluded.outcome_positive,
|
|
66
|
+
outcome_negative = excluded.outcome_negative,
|
|
67
|
+
conflicts_with_json = excluded.conflicts_with_json,
|
|
68
|
+
pinned = excluded.pinned,
|
|
69
|
+
confidence = excluded.confidence,
|
|
70
|
+
content = excluded.content,
|
|
71
|
+
parents_json = excluded.parents_json,
|
|
72
|
+
starred = excluded.starred,
|
|
73
|
+
trace_outcome = excluded.trace_outcome,
|
|
74
|
+
source_session_id = excluded.source_session_id,
|
|
75
|
+
valid_from = excluded.valid_from,
|
|
76
|
+
superseded_by = excluded.superseded_by,
|
|
77
|
+
extracted_from = excluded.extracted_from,
|
|
78
|
+
dag_level = excluded.dag_level,
|
|
79
|
+
dag_parent_id = excluded.dag_parent_id,
|
|
80
|
+
kind = excluded.kind,
|
|
81
|
+
scope = excluded.scope,
|
|
82
|
+
owner = excluded.owner,
|
|
83
|
+
artifact_ref = excluded.artifact_ref,
|
|
84
|
+
tenant_id = excluded.tenant_id,
|
|
85
|
+
origin_project = excluded.origin_project,
|
|
86
|
+
descendant_count = excluded.descendant_count,
|
|
87
|
+
earliest_at = excluded.earliest_at,
|
|
88
|
+
latest_at = excluded.latest_at,
|
|
89
|
+
dag_level_3_built_at = excluded.dag_level_3_built_at,
|
|
90
|
+
updated_at = datetime('now')
|
|
91
|
+
`;
|
|
92
|
+
/** Bind values for UPSERT_MEMORY_SQL, in its column order. */
|
|
93
|
+
function memoryRowValues(entry) {
|
|
94
|
+
return [
|
|
95
|
+
entry.id,
|
|
96
|
+
entry.created,
|
|
97
|
+
entry.last_retrieved,
|
|
98
|
+
entry.retrieval_count,
|
|
99
|
+
entry.strength,
|
|
100
|
+
entry.half_life_days,
|
|
101
|
+
entry.layer,
|
|
102
|
+
JSON.stringify(entry.tags ?? []),
|
|
103
|
+
entry.emotional_valence,
|
|
104
|
+
entry.schema_fit,
|
|
105
|
+
entry.source,
|
|
106
|
+
entry.outcome_score,
|
|
107
|
+
entry.outcome_positive ?? 0,
|
|
108
|
+
entry.outcome_negative ?? 0,
|
|
109
|
+
JSON.stringify(entry.conflicts_with ?? []),
|
|
110
|
+
entry.pinned ? 1 : 0,
|
|
111
|
+
entry.confidence,
|
|
112
|
+
entry.content,
|
|
113
|
+
JSON.stringify(entry.parents ?? []),
|
|
114
|
+
entry.starred ? 1 : 0,
|
|
115
|
+
entry.trace_outcome ?? null,
|
|
116
|
+
entry.source_session_id ?? null,
|
|
117
|
+
entry.valid_from ?? entry.created,
|
|
118
|
+
entry.superseded_by ?? null,
|
|
119
|
+
entry.extracted_from ?? null,
|
|
120
|
+
entry.dag_level ?? 0,
|
|
121
|
+
entry.dag_parent_id ?? null,
|
|
122
|
+
entry.kind ?? 'distilled',
|
|
123
|
+
entry.scope ?? null,
|
|
124
|
+
entry.owner ?? null,
|
|
125
|
+
entry.artifact_ref ?? null,
|
|
126
|
+
entry.tenantId ?? 'default',
|
|
127
|
+
entry.origin_project ?? null,
|
|
128
|
+
entry.descendant_count ?? 0,
|
|
129
|
+
entry.earliest_at ?? null,
|
|
130
|
+
entry.latest_at ?? null,
|
|
131
|
+
entry.dag_level_3_built_at ?? null,
|
|
132
|
+
];
|
|
133
|
+
}
|
|
134
|
+
export function syncFtsRow(db, entry, isNewRow = false) {
|
|
135
|
+
if (!isFtsAvailable(db))
|
|
136
|
+
return;
|
|
137
|
+
try {
|
|
138
|
+
if (!isNewRow)
|
|
139
|
+
db.prepare(`DELETE FROM memories_fts WHERE id = ?`).run(entry.id);
|
|
140
|
+
db.prepare(`INSERT INTO memories_fts(id, content, tags) VALUES (?, ?, ?)`).run(entry.id, entry.content, entry.tags.join(' '));
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
// The memories table stays authoritative; a stale FTS row only costs recall quality, so the write goes on.
|
|
144
|
+
log.warnThenDebug('fts-sync', `FTS index update failed for ${entry.id}; keyword recall may miss it: ${err instanceof Error ? err.message : String(err)}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
export function deleteFtsRow(db, id) {
|
|
148
|
+
if (!isFtsAvailable(db))
|
|
149
|
+
return;
|
|
150
|
+
try {
|
|
151
|
+
db.prepare(`DELETE FROM memories_fts WHERE id = ?`).run(id);
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
log.warnThenDebug('fts-delete', `FTS index delete failed for ${id}; recall may return a stale hit: ${err instanceof Error ? err.message : String(err)}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Write a memory entry to SQLite and refresh compatibility mirrors.
|
|
159
|
+
*
|
|
160
|
+
* `opts.actor` defaults to 'cli' so unauthenticated direct-CLI callers still
|
|
161
|
+
* get the right audit attribution. The HTTP server (A1) and api.* layer pass
|
|
162
|
+
* the resolved actor (`api_key:<key_id>` / `localhost:cli`) so audit events
|
|
163
|
+
* land with one row per write, no double-emit.
|
|
164
|
+
*
|
|
165
|
+
* `opts.afterWrite` is invoked inside the same SAVEPOINT as the memories
|
|
166
|
+
* INSERT (mirrors archiveRawMemory's shape in raw-archive.ts). On callback
|
|
167
|
+
* throw, the SAVEPOINT rolls back — the memory row never lands, and the
|
|
168
|
+
* filesystem mirrors / audit emit never run. Used by E1.3+ connectors to
|
|
169
|
+
* stamp idempotency rows atomically with the memory write.
|
|
170
|
+
*/
|
|
171
|
+
/**
|
|
172
|
+
* Stamp origin_project from the store's own location when the entry has
|
|
173
|
+
* never been stamped (v39 memory scope isolation). The store dir is
|
|
174
|
+
* `<project>/.hippo`, so its parent resolves to the owning project; the
|
|
175
|
+
* home/global store resolves to '' (user-global). Callers that know a better
|
|
176
|
+
* origin (shareMemory, syncGlobalToLocal) set entry.origin_project before
|
|
177
|
+
* writing and this is a no-op. Returns a stamped copy; never mutates.
|
|
178
|
+
*
|
|
179
|
+
* NULL is deliberately PRESERVED, not re-stamped: null means "legacy row the
|
|
180
|
+
* v39 migration found no evidence for" and is deny-by-default in ambient
|
|
181
|
+
* context. A writeback (e.g. markRetrieved on a crossProject-included row)
|
|
182
|
+
* must not launder it into an injectable origin - the migration is the only
|
|
183
|
+
* evidence-based NULL converter (codex gating round 2 P1).
|
|
184
|
+
*/
|
|
185
|
+
export function stampOriginProject(hippoRoot, entry) {
|
|
186
|
+
if (entry.origin_project !== undefined)
|
|
187
|
+
return entry;
|
|
188
|
+
return { ...entry, origin_project: deriveOriginProject(path.dirname(hippoRoot)) };
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Import-time variant for a mirror with no origin field (an explicit null stays null): used only where evidence exists
|
|
192
|
+
* for rows that predate the origin column - the legacy-markdown bootstrap and
|
|
193
|
+
* rebuildIndex import, which are the markdown-store equivalent of the v39 SQL
|
|
194
|
+
* backfill. Same evidence order as the migration: the provenance source
|
|
195
|
+
* (`shared:<project>:` / `promoted:<localRoot>`) wins over the destination
|
|
196
|
+
* store's location, so a shared row imported into the global store keeps its
|
|
197
|
+
* owning project instead of becoming user-global (codex gating round 3 P1).
|
|
198
|
+
*/
|
|
199
|
+
export function stampOriginProjectForImport(hippoRoot, entry) {
|
|
200
|
+
if (entry.origin_project !== undefined)
|
|
201
|
+
return entry;
|
|
202
|
+
const fromSource = originFromSource(entry.source);
|
|
203
|
+
return {
|
|
204
|
+
...entry,
|
|
205
|
+
origin_project: fromSource ?? deriveOriginProject(path.dirname(hippoRoot)),
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=entry-row.js.map
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type MemoryEntry } from '../memory.js';
|
|
2
|
+
import { type DatabaseSyncLike } from '../db.js';
|
|
3
|
+
export declare function writeEntry(hippoRoot: string, entry: MemoryEntry, opts?: {
|
|
4
|
+
actor?: string;
|
|
5
|
+
afterWrite?: (db: DatabaseSyncLike, memoryId: string) => void;
|
|
6
|
+
/** Runs AFTER the DB row commits (RELEASE SAVEPOINT in writeEntryDbOnly) but
|
|
7
|
+
* BEFORE the markdown mirrors are written. Lets a caller perform a post-commit
|
|
8
|
+
* side effect (e.g. mark the graph dirty) that must still happen even if a
|
|
9
|
+
* mirror write then throws. Keep it best-effort — it runs on a committed,
|
|
10
|
+
* idle connection, so opening another handle inside it is safe. */
|
|
11
|
+
afterCommit?: () => void;
|
|
12
|
+
}): void;
|
|
13
|
+
/**
|
|
14
|
+
* DB-only write path. Caller owns the open `db` handle. Runs SAVEPOINT +
|
|
15
|
+
* upsert + afterWrite hook + audit row inside the SAVEPOINT scope. Caller
|
|
16
|
+
* is responsible for opening `db`, optionally wrapping in a larger BEGIN/
|
|
17
|
+
* COMMIT (e.g. supersede's BEGIN IMMEDIATE), closing `db`, AND calling
|
|
18
|
+
* `writeEntryMirrors` after the larger tx commits — mirrors must run
|
|
19
|
+
* post-commit so a rolled-back tx never leaves orphan markdown.
|
|
20
|
+
*
|
|
21
|
+
* Audit-order note: the audit row is emitted INSIDE the SAVEPOINT, so audit
|
|
22
|
+
* commits atomically with the row INSERT. A subsequent mirror failure cannot
|
|
23
|
+
* leave a recorded audit entry without its corresponding DB row. This is a
|
|
24
|
+
* documented hardening over the prior writeEntry-as-monolith ordering.
|
|
25
|
+
*/
|
|
26
|
+
export declare function writeEntryDbOnly(db: DatabaseSyncLike, entry: MemoryEntry, opts?: {
|
|
27
|
+
actor?: string;
|
|
28
|
+
afterWrite?: (db: DatabaseSyncLike, memoryId: string) => void;
|
|
29
|
+
}): void;
|
|
30
|
+
/** Markdown mirror path, invoked AFTER commit (a rolled-back tx must leave no orphan markdown). */
|
|
31
|
+
export declare function writeEntryMirrors(hippoRoot: string, entry: MemoryEntry): void;
|
|
32
|
+
/** The caller passes the eval-only recall-boost ablation switch, so the store never reads experiment config itself. */
|
|
33
|
+
export interface StrengthenOptions {
|
|
34
|
+
readonly tenantId?: string;
|
|
35
|
+
readonly recallBoostAblated: boolean;
|
|
36
|
+
}
|
|
37
|
+
/** Strengthen what a read returned: update only the four retrieval columns on the live row, never a stale copy.
|
|
38
|
+
* Best effort: a failure logs and never fails the read. Returns the ids found in this store. */
|
|
39
|
+
export declare function strengthenRetrieved(hippoRoot: string, ids: readonly string[], opts: StrengthenOptions): Set<string>;
|
|
40
|
+
/** strengthenRetrieved on the caller's handle, inside the caller's transaction. Throws; the caller decides. */
|
|
41
|
+
export declare function strengthenRetrievedOn(db: DatabaseSyncLike, ids: readonly string[], opts: StrengthenOptions): Set<string>;
|
|
42
|
+
/** Rewrites a live row's tags and its full-text row on the caller's transaction, with no audit row. */
|
|
43
|
+
export declare function setEntryTagsInTx(db: DatabaseSyncLike, entry: MemoryEntry): void;
|
|
44
|
+
/** Removes a row from `memories` and full-text search on the caller's transaction, as sleep's dormant move does, and marks its summary parent dirty. */
|
|
45
|
+
export declare function deleteEntryRowInTx(db: DatabaseSyncLike, entry: MemoryEntry, actor: string): void;
|
|
46
|
+
//# sourceMappingURL=entry-writes.d.ts.map
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { markRetrieved } from '../memory.js';
|
|
2
|
+
import { closeHippoDb, openHippoDb } from '../db.js';
|
|
3
|
+
import { RejectedValueError } from '../rejection.js';
|
|
4
|
+
import { markSummaryDirtyInTx } from '../summary-dirty.js';
|
|
5
|
+
import { log } from '../log.js';
|
|
6
|
+
import { MEMORY_SELECT_COLUMNS, rowToEntry } from './rows.js';
|
|
7
|
+
import { auditRejectionRefusal, audit } from './audit-event.js';
|
|
8
|
+
import { stampOriginProject, upsertEntryRow, syncFtsRow, deleteFtsRow } from './entry-row.js';
|
|
9
|
+
import { mirrorBestEffort, writeMarkdownMirror } from './mirrors.js';
|
|
10
|
+
import { openStore } from './open.js';
|
|
11
|
+
export function writeEntry(hippoRoot, entry, opts) {
|
|
12
|
+
const db = openStore(hippoRoot);
|
|
13
|
+
try {
|
|
14
|
+
const stamped = stampOriginProject(hippoRoot, entry);
|
|
15
|
+
writeEntryDbOnly(db, stamped, opts);
|
|
16
|
+
opts?.afterCommit?.();
|
|
17
|
+
writeEntryMirrors(hippoRoot, stamped);
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
// AT1 (plan §3): writeEntryDbOnly's own SAVEPOINT has already unwound by
|
|
21
|
+
// the time this catch runs, so the refusal audit lands post-rollback in
|
|
22
|
+
// a fresh implicit transaction — then rethrow so the caller sees the
|
|
23
|
+
// refusal.
|
|
24
|
+
if (error instanceof RejectedValueError) {
|
|
25
|
+
auditRejectionRefusal(db, error, opts?.actor ?? 'cli');
|
|
26
|
+
}
|
|
27
|
+
throw error;
|
|
28
|
+
}
|
|
29
|
+
finally {
|
|
30
|
+
closeHippoDb(db);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* DB-only write path. Caller owns the open `db` handle. Runs SAVEPOINT +
|
|
35
|
+
* upsert + afterWrite hook + audit row inside the SAVEPOINT scope. Caller
|
|
36
|
+
* is responsible for opening `db`, optionally wrapping in a larger BEGIN/
|
|
37
|
+
* COMMIT (e.g. supersede's BEGIN IMMEDIATE), closing `db`, AND calling
|
|
38
|
+
* `writeEntryMirrors` after the larger tx commits — mirrors must run
|
|
39
|
+
* post-commit so a rolled-back tx never leaves orphan markdown.
|
|
40
|
+
*
|
|
41
|
+
* Audit-order note: the audit row is emitted INSIDE the SAVEPOINT, so audit
|
|
42
|
+
* commits atomically with the row INSERT. A subsequent mirror failure cannot
|
|
43
|
+
* leave a recorded audit entry without its corresponding DB row. This is a
|
|
44
|
+
* documented hardening over the prior writeEntry-as-monolith ordering.
|
|
45
|
+
*/
|
|
46
|
+
export function writeEntryDbOnly(db, entry, opts) {
|
|
47
|
+
// SAVEPOINT (not BEGIN) so this nests safely inside any outer transaction
|
|
48
|
+
// a caller might hold (e.g. supersede's BEGIN IMMEDIATE). SQLite refuses
|
|
49
|
+
// BEGIN within a transaction; SAVEPOINT is the only way to scope rollback
|
|
50
|
+
// without disturbing outers.
|
|
51
|
+
db.exec('SAVEPOINT write_entry');
|
|
52
|
+
try {
|
|
53
|
+
upsertEntryRow(db, entry);
|
|
54
|
+
if (opts?.afterWrite) {
|
|
55
|
+
opts.afterWrite(db, entry.id);
|
|
56
|
+
}
|
|
57
|
+
audit(db, 'remember', entry.id, {
|
|
58
|
+
kind: entry.kind ?? 'distilled',
|
|
59
|
+
scope: entry.scope ?? null,
|
|
60
|
+
}, opts?.actor ?? 'cli', entry.tenantId);
|
|
61
|
+
// v0.30 / E2 — DAG live-coupling: child write under a level-2 summary
|
|
62
|
+
// marks the parent dirty for E3 sleep-cycle rebuild. Early-exit on
|
|
63
|
+
// null dag_parent_id (vast majority of writes); cost is one null check
|
|
64
|
+
// on the hot path.
|
|
65
|
+
if (entry.dag_parent_id) {
|
|
66
|
+
markSummaryDirtyInTx(db, entry.dag_parent_id, entry.tenantId, opts?.actor ?? 'cli');
|
|
67
|
+
}
|
|
68
|
+
db.exec('RELEASE SAVEPOINT write_entry');
|
|
69
|
+
}
|
|
70
|
+
catch (e) {
|
|
71
|
+
try {
|
|
72
|
+
db.exec('ROLLBACK TO SAVEPOINT write_entry');
|
|
73
|
+
db.exec('RELEASE SAVEPOINT write_entry');
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Ignore rollback failures — the throw below is what matters.
|
|
77
|
+
}
|
|
78
|
+
throw e;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/** Markdown mirror path, invoked AFTER commit (a rolled-back tx must leave no orphan markdown). */
|
|
82
|
+
export function writeEntryMirrors(hippoRoot, entry) {
|
|
83
|
+
mirrorBestEffort(`${entry.id}.md`, () => writeMarkdownMirror(hippoRoot, entry));
|
|
84
|
+
}
|
|
85
|
+
/** Strengthen what a read returned: update only the four retrieval columns on the live row, never a stale copy.
|
|
86
|
+
* Best effort: a failure logs and never fails the read. Returns the ids found in this store. */
|
|
87
|
+
export function strengthenRetrieved(hippoRoot, ids, opts) {
|
|
88
|
+
const found = new Set();
|
|
89
|
+
if (ids.length === 0 || opts.recallBoostAblated)
|
|
90
|
+
return found;
|
|
91
|
+
let db;
|
|
92
|
+
try {
|
|
93
|
+
db = openHippoDb(hippoRoot);
|
|
94
|
+
db.exec('BEGIN IMMEDIATE');
|
|
95
|
+
for (const id of strengthenRetrievedOn(db, ids, opts))
|
|
96
|
+
found.add(id);
|
|
97
|
+
db.exec('COMMIT');
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
try {
|
|
101
|
+
db?.exec('ROLLBACK');
|
|
102
|
+
}
|
|
103
|
+
catch { /* already rolled back; keep the original error */ }
|
|
104
|
+
log.warn(`retrieval stats not saved (${error instanceof Error ? error.message : String(error)})`);
|
|
105
|
+
found.clear();
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
if (db)
|
|
109
|
+
closeHippoDb(db);
|
|
110
|
+
}
|
|
111
|
+
return found;
|
|
112
|
+
}
|
|
113
|
+
/** strengthenRetrieved on the caller's handle, inside the caller's transaction. Throws; the caller decides. */
|
|
114
|
+
export function strengthenRetrievedOn(db, ids, opts) {
|
|
115
|
+
const found = new Set();
|
|
116
|
+
if (ids.length === 0 || opts.recallBoostAblated)
|
|
117
|
+
return found;
|
|
118
|
+
const { tenantId } = opts;
|
|
119
|
+
const tenantClause = tenantId !== undefined ? ' AND tenant_id = ?' : '';
|
|
120
|
+
const select = db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE id = ?${tenantClause}`);
|
|
121
|
+
const live = [];
|
|
122
|
+
for (const id of ids) {
|
|
123
|
+
// SAFETY: the SELECT names exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
|
|
124
|
+
const row = (tenantId !== undefined ? select.get(id, tenantId) : select.get(id));
|
|
125
|
+
if (row)
|
|
126
|
+
live.push(rowToEntry(row));
|
|
127
|
+
}
|
|
128
|
+
const update = db.prepare('UPDATE memories SET retrieval_count = ?, last_retrieved = ?, half_life_days = ?, strength = ? WHERE id = ?');
|
|
129
|
+
for (const e of markRetrieved(live)) {
|
|
130
|
+
update.run(e.retrieval_count, e.last_retrieved, e.half_life_days, e.strength, e.id);
|
|
131
|
+
found.add(e.id);
|
|
132
|
+
}
|
|
133
|
+
return found;
|
|
134
|
+
}
|
|
135
|
+
/** Rewrites a live row's tags and its full-text row on the caller's transaction, with no audit row. */
|
|
136
|
+
export function setEntryTagsInTx(db, entry) {
|
|
137
|
+
db.prepare(`UPDATE memories SET tags_json = ?, updated_at = datetime('now') WHERE id = ? AND tenant_id = ?`)
|
|
138
|
+
.run(JSON.stringify(entry.tags), entry.id, entry.tenantId);
|
|
139
|
+
syncFtsRow(db, entry);
|
|
140
|
+
}
|
|
141
|
+
/** Removes a row from `memories` and full-text search on the caller's transaction, as sleep's dormant move does, and marks its summary parent dirty. */
|
|
142
|
+
export function deleteEntryRowInTx(db, entry, actor) {
|
|
143
|
+
db.prepare('DELETE FROM memories WHERE id = ? AND tenant_id = ?').run(entry.id, entry.tenantId);
|
|
144
|
+
deleteFtsRow(db, entry.id);
|
|
145
|
+
if (entry.dag_parent_id)
|
|
146
|
+
markSummaryDirtyInTx(db, entry.dag_parent_id, entry.tenantId, actor);
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=entry-writes.js.map
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type SessionHandoff, type HandoffOutcome, type HandoffEvidence } from '../handoff.js';
|
|
2
|
+
import type { TaskSnapshot } from './rows.js';
|
|
3
|
+
/** Column list shared by every session_handoffs SELECT; store-cards.ts reuses it for the card handoff lookup. */
|
|
4
|
+
export declare const HANDOFF_COLUMNS = "id, session_id, repo_root, task_id, summary, next_action, artifacts_json, scope, created_at, constraints_json, evidence_json, outcome, target_runtime, card_id";
|
|
5
|
+
/**
|
|
6
|
+
* Save a session handoff record. Returns the persisted handoff.
|
|
7
|
+
*/
|
|
8
|
+
export declare function saveSessionHandoff(hippoRoot: string, tenantId: string, handoff: Omit<SessionHandoff, 'updatedAt'>): SessionHandoff;
|
|
9
|
+
/** Load the most recent handoff, optionally filtered by session ID. */
|
|
10
|
+
export declare function loadLatestHandoff(hippoRoot: string, tenantId: string, sessionId?: string, opts?: {
|
|
11
|
+
unfinishedOnly?: boolean;
|
|
12
|
+
maxAgeMs?: number;
|
|
13
|
+
scopeFilter?: 'default-deny';
|
|
14
|
+
excludeSessionId?: string;
|
|
15
|
+
}): SessionHandoff | null;
|
|
16
|
+
/**
|
|
17
|
+
* Load a specific handoff by its row ID.
|
|
18
|
+
*/
|
|
19
|
+
export declare function loadHandoffById(hippoRoot: string, tenantId: string, id: number): SessionHandoff | null;
|
|
20
|
+
/** Stamp the outcome on a session's newest handoff, only if it has none yet. Returns rows changed. */
|
|
21
|
+
export declare function stampHandoffOutcome(hippoRoot: string, tenantId: string, sessionId: string, outcome: HandoffOutcome): number;
|
|
22
|
+
/** Auto-write a handoff at session-end (DF1 T3) from the session's active snapshot, else from `derived`, its transcript state.
|
|
23
|
+
* @param evidence best-effort git state; outcome comes from the newest session_complete event.
|
|
24
|
+
* @returns null when neither source is the session's, a newer handoff covers the snapshot, or the session's latest handoff was not read off its transcript. */
|
|
25
|
+
export declare function writeSessionEndHandoff(hippoRoot: string, tenantId: string, sessionId: string, evidence: HandoffEvidence | null, derived?: Pick<TaskSnapshot, 'task' | 'summary' | 'next_step'> | null): SessionHandoff | null;
|
|
26
|
+
//# sourceMappingURL=handoffs.d.ts.map
|