hippo-memory 1.59.0 → 1.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/ablation.js +9 -27
- package/dist/agent-memories/apply.js +4 -1
- package/dist/agent-memories/claude-code.js +1 -1
- package/dist/agent-memories/codex.js +1 -1
- package/dist/agent-memories/gemini.js +1 -1
- package/dist/agent-memories/legacy.js +1 -1
- package/dist/agent-memories/source.js +1 -1
- package/dist/agent-memories/sync.js +8 -3
- package/dist/ambient-store.d.ts +14 -0
- package/dist/ambient-store.js +90 -0
- package/dist/ambient.d.ts +23 -0
- package/dist/ambient.js +72 -50
- package/dist/api/assemble.d.ts +93 -0
- package/dist/api/assemble.js +152 -0
- package/dist/api/audit.d.ts +17 -0
- package/dist/api/audit.js +23 -0
- package/dist/api/auth.d.ts +79 -0
- package/dist/api/auth.js +178 -0
- package/dist/api/context-types.d.ts +105 -0
- package/dist/api/context-types.js +3 -0
- package/dist/api/context.d.ts +31 -0
- package/dist/api/context.js +705 -0
- package/dist/api/dormant.d.ts +30 -0
- package/dist/api/dormant.js +140 -0
- package/dist/api/drill-down.d.ts +84 -0
- package/dist/api/drill-down.js +123 -0
- package/dist/api/forget.d.ts +57 -0
- package/dist/api/forget.js +87 -0
- package/dist/api/goals.d.ts +18 -0
- package/dist/api/goals.js +33 -0
- package/dist/api/learn.d.ts +31 -0
- package/dist/api/learn.js +88 -0
- package/dist/api/outcome.d.ts +61 -0
- package/dist/api/outcome.js +66 -0
- package/dist/api/promote.d.ts +54 -0
- package/dist/api/promote.js +203 -0
- package/dist/api/quarantine.d.ts +24 -0
- package/dist/api/quarantine.js +121 -0
- package/dist/api/recall-types.d.ts +390 -0
- package/dist/api/recall-types.js +3 -0
- package/dist/api/recall.d.ts +36 -0
- package/dist/api/recall.js +634 -0
- package/dist/api/remember.d.ts +35 -0
- package/dist/api/remember.js +43 -0
- package/dist/api/sleep.d.ts +136 -0
- package/dist/api/sleep.js +271 -0
- package/dist/api/tokens.d.ts +26 -0
- package/dist/api/tokens.js +60 -0
- package/dist/api/types.d.ts +56 -0
- package/dist/api/types.js +38 -0
- package/dist/api.d.ts +20 -1260
- package/dist/api.js +25 -2711
- package/dist/audit.d.ts +3 -0
- package/dist/audit.js +7 -3
- package/dist/auth.d.ts +45 -4
- package/dist/auth.js +125 -48
- package/dist/autolearn.js +7 -4
- package/dist/capture/command.d.ts +33 -0
- package/dist/capture/command.js +264 -0
- package/dist/capture/compact.d.ts +44 -0
- package/dist/capture/compact.js +354 -0
- package/dist/capture/extract.d.ts +21 -0
- package/dist/capture/extract.js +464 -0
- package/dist/capture/transcript.d.ts +40 -0
- package/dist/capture/transcript.js +193 -0
- package/dist/capture-error.js +2 -1
- package/dist/churn-git.js +4 -2
- package/dist/cli/audit.d.ts +3 -0
- package/dist/cli/audit.js +159 -0
- package/dist/cli/auth.d.ts +2 -0
- package/dist/cli/auth.js +171 -0
- package/dist/cli/briefs.d.ts +4 -0
- package/dist/cli/briefs.js +435 -0
- package/dist/cli/card.d.ts +3 -0
- package/dist/cli/card.js +333 -0
- package/dist/cli/context.d.ts +15 -0
- package/dist/cli/context.js +366 -0
- package/dist/cli/continuity.d.ts +6 -0
- package/dist/cli/continuity.js +445 -0
- package/dist/cli/curate.d.ts +19 -0
- package/dist/cli/curate.js +555 -0
- package/dist/cli/dag.d.ts +5 -0
- package/dist/cli/dag.js +177 -0
- package/dist/cli/decisions.d.ts +4 -0
- package/dist/cli/decisions.js +528 -0
- package/dist/cli/eval.d.ts +5 -0
- package/dist/cli/eval.js +213 -0
- package/dist/cli/explain.d.ts +4 -0
- package/dist/cli/explain.js +150 -0
- package/dist/cli/goals.d.ts +2 -0
- package/dist/cli/goals.js +196 -0
- package/dist/cli/hook-blocks.d.ts +18 -0
- package/dist/cli/hook-blocks.js +233 -0
- package/dist/cli/init.d.ts +2 -0
- package/dist/cli/init.js +305 -0
- package/dist/cli/maintenance.d.ts +4 -0
- package/dist/cli/maintenance.js +179 -0
- package/dist/cli/playbooks.d.ts +4 -0
- package/dist/cli/playbooks.js +556 -0
- package/dist/cli/projects.js +1 -1
- package/dist/cli/recall.d.ts +7 -0
- package/dist/cli/recall.js +597 -0
- package/dist/cli/remember.d.ts +5 -0
- package/dist/cli/remember.js +442 -0
- package/dist/cli/serve.d.ts +5 -0
- package/dist/cli/serve.js +40 -0
- package/dist/cli/session-hooks.d.ts +29 -0
- package/dist/cli/session-hooks.js +637 -0
- package/dist/cli/setup.d.ts +4 -0
- package/dist/cli/setup.js +376 -0
- package/dist/cli/shared.d.ts +15 -19
- package/dist/cli/shared.js +50 -341
- package/dist/cli/slack.d.ts +2 -0
- package/dist/cli/slack.js +171 -0
- package/dist/cli/status.d.ts +18 -0
- package/dist/cli/status.js +400 -0
- package/dist/cli/transfer.d.ts +10 -0
- package/dist/cli/transfer.js +438 -0
- package/dist/cli/usage.d.ts +85 -0
- package/dist/cli/usage.js +741 -0
- package/dist/cli.d.ts +319 -13
- package/dist/cli.js +436 -8580
- package/dist/client.js +15 -8
- package/dist/compaction-record.js +12 -9
- package/dist/config.js +12 -11
- package/dist/connectors/github/backfill.js +94 -87
- package/dist/connectors/github/cli-impl.js +5 -3
- package/dist/connectors/github/dlq.js +67 -54
- package/dist/connectors/github/ingest.js +34 -35
- package/dist/connectors/github/tenant-routing.js +3 -2
- package/dist/connectors/github/webhook.js +135 -216
- package/dist/connectors/slack/dlq.js +49 -61
- package/dist/connectors/slack/ingest.js +55 -48
- package/dist/connectors/slack/tenant-routing.js +4 -3
- package/dist/connectors/slack/webhook.js +72 -74
- package/dist/consolidate/conflicts.d.ts +10 -0
- package/dist/consolidate/conflicts.js +178 -0
- package/dist/consolidate/decay.d.ts +12 -0
- package/dist/consolidate/decay.js +145 -0
- package/dist/consolidate/llm-passes.d.ts +3 -0
- package/dist/consolidate/llm-passes.js +141 -0
- package/dist/consolidate/merge.d.ts +7 -0
- package/dist/consolidate/merge.js +251 -0
- package/dist/consolidate/physics-pass.d.ts +3 -0
- package/dist/consolidate/physics-pass.js +60 -0
- package/dist/consolidate/run.d.ts +69 -0
- package/dist/consolidate/run.js +76 -0
- package/dist/consolidate/sleep.d.ts +18 -0
- package/dist/consolidate/sleep.js +209 -0
- package/dist/consolidate/traces.d.ts +4 -0
- package/dist/consolidate/traces.js +178 -0
- package/dist/context-auto.js +7 -11
- package/dist/context-render.d.ts +1 -1
- package/dist/context-render.js +1 -1
- package/dist/customer-notes.d.ts +3 -0
- package/dist/customer-notes.js +6 -4
- package/dist/dag.js +13 -12
- package/dist/dashboard-actions.d.ts +20 -0
- package/dist/dashboard-actions.js +88 -0
- package/dist/dashboard-params.d.ts +45 -0
- package/dist/dashboard-params.js +127 -0
- package/dist/dashboard-queries.d.ts +15 -0
- package/dist/dashboard-queries.js +355 -0
- package/dist/dashboard-snapshot.d.ts +138 -0
- package/dist/dashboard-snapshot.js +308 -0
- package/dist/dashboard-types.d.ts +163 -0
- package/dist/dashboard-types.js +3 -0
- package/dist/dashboard.d.ts +6 -7
- package/dist/dashboard.js +231 -203
- package/dist/db/busy.d.ts +5 -0
- package/dist/db/busy.js +24 -0
- package/dist/db/continuity.d.ts +5 -0
- package/dist/db/continuity.js +145 -0
- package/dist/db/meta.d.ts +8 -0
- package/dist/db/meta.js +35 -0
- package/dist/db/migrate.d.ts +9 -0
- package/dist/db/migrate.js +138 -0
- package/dist/db/migrations/index.d.ts +5 -0
- package/dist/db/migrations/index.js +109 -0
- package/dist/db/migrations/types.d.ts +14 -0
- package/dist/db/migrations/types.js +2 -0
- package/dist/db/migrations/v01.d.ts +3 -0
- package/dist/db/migrations/v01.js +38 -0
- package/dist/db/migrations/v02.d.ts +3 -0
- package/dist/db/migrations/v02.js +21 -0
- package/dist/db/migrations/v03.d.ts +3 -0
- package/dist/db/migrations/v03.js +22 -0
- package/dist/db/migrations/v04.d.ts +3 -0
- package/dist/db/migrations/v04.js +28 -0
- package/dist/db/migrations/v05.d.ts +3 -0
- package/dist/db/migrations/v05.js +21 -0
- package/dist/db/migrations/v06.d.ts +3 -0
- package/dist/db/migrations/v06.js +25 -0
- package/dist/db/migrations/v07.d.ts +3 -0
- package/dist/db/migrations/v07.js +13 -0
- package/dist/db/migrations/v08.d.ts +3 -0
- package/dist/db/migrations/v08.js +8 -0
- package/dist/db/migrations/v09.d.ts +3 -0
- package/dist/db/migrations/v09.js +13 -0
- package/dist/db/migrations/v10.d.ts +3 -0
- package/dist/db/migrations/v10.js +17 -0
- package/dist/db/migrations/v11.d.ts +3 -0
- package/dist/db/migrations/v11.js +15 -0
- package/dist/db/migrations/v12.d.ts +3 -0
- package/dist/db/migrations/v12.js +11 -0
- package/dist/db/migrations/v13.d.ts +3 -0
- package/dist/db/migrations/v13.js +15 -0
- package/dist/db/migrations/v14.d.ts +3 -0
- package/dist/db/migrations/v14.js +66 -0
- package/dist/db/migrations/v15.d.ts +3 -0
- package/dist/db/migrations/v15.js +42 -0
- package/dist/db/migrations/v16.d.ts +3 -0
- package/dist/db/migrations/v16.js +61 -0
- package/dist/db/migrations/v17.d.ts +3 -0
- package/dist/db/migrations/v17.js +46 -0
- package/dist/db/migrations/v18.d.ts +3 -0
- package/dist/db/migrations/v18.js +60 -0
- package/dist/db/migrations/v19.d.ts +3 -0
- package/dist/db/migrations/v19.js +28 -0
- package/dist/db/migrations/v20.d.ts +3 -0
- package/dist/db/migrations/v20.js +42 -0
- package/dist/db/migrations/v21.d.ts +3 -0
- package/dist/db/migrations/v21.js +16 -0
- package/dist/db/migrations/v22.d.ts +3 -0
- package/dist/db/migrations/v22.js +82 -0
- package/dist/db/migrations/v23.d.ts +3 -0
- package/dist/db/migrations/v23.js +48 -0
- package/dist/db/migrations/v24.d.ts +3 -0
- package/dist/db/migrations/v24.js +72 -0
- package/dist/db/migrations/v25.d.ts +3 -0
- package/dist/db/migrations/v25.js +46 -0
- package/dist/db/migrations/v26.d.ts +3 -0
- package/dist/db/migrations/v26.js +23 -0
- package/dist/db/migrations/v27.d.ts +3 -0
- package/dist/db/migrations/v27.js +57 -0
- package/dist/db/migrations/v28.d.ts +3 -0
- package/dist/db/migrations/v28.js +38 -0
- package/dist/db/migrations/v29.d.ts +3 -0
- package/dist/db/migrations/v29.js +78 -0
- package/dist/db/migrations/v30.d.ts +3 -0
- package/dist/db/migrations/v30.js +92 -0
- package/dist/db/migrations/v31.d.ts +3 -0
- package/dist/db/migrations/v31.js +74 -0
- package/dist/db/migrations/v32.d.ts +3 -0
- package/dist/db/migrations/v32.js +102 -0
- package/dist/db/migrations/v33.d.ts +3 -0
- package/dist/db/migrations/v33.js +104 -0
- package/dist/db/migrations/v34.d.ts +3 -0
- package/dist/db/migrations/v34.js +93 -0
- package/dist/db/migrations/v35.d.ts +3 -0
- package/dist/db/migrations/v35.js +98 -0
- package/dist/db/migrations/v36.d.ts +3 -0
- package/dist/db/migrations/v36.js +98 -0
- package/dist/db/migrations/v37.d.ts +3 -0
- package/dist/db/migrations/v37.js +219 -0
- package/dist/db/migrations/v38.d.ts +3 -0
- package/dist/db/migrations/v38.js +277 -0
- package/dist/db/migrations/v39.d.ts +3 -0
- package/dist/db/migrations/v39.js +59 -0
- package/dist/db/migrations/v40.d.ts +3 -0
- package/dist/db/migrations/v40.js +74 -0
- package/dist/db/migrations/v41.d.ts +3 -0
- package/dist/db/migrations/v41.js +43 -0
- package/dist/db/migrations/v42.d.ts +3 -0
- package/dist/db/migrations/v42.js +41 -0
- package/dist/db/migrations/v43.d.ts +3 -0
- package/dist/db/migrations/v43.js +67 -0
- package/dist/db/migrations/v44.d.ts +3 -0
- package/dist/db/migrations/v44.js +28 -0
- package/dist/db/migrations/v45.d.ts +3 -0
- package/dist/db/migrations/v45.js +30 -0
- package/dist/db/migrations/v46.d.ts +3 -0
- package/dist/db/migrations/v46.js +25 -0
- package/dist/db/migrations/v47.d.ts +3 -0
- package/dist/db/migrations/v47.js +17 -0
- package/dist/db/migrations/v48.d.ts +3 -0
- package/dist/db/migrations/v48.js +10 -0
- package/dist/db/migrations/v49.d.ts +3 -0
- package/dist/db/migrations/v49.js +31 -0
- package/dist/db/migrations/v50.d.ts +3 -0
- package/dist/db/migrations/v50.js +67 -0
- package/dist/db/migrations/v51.d.ts +3 -0
- package/dist/db/migrations/v51.js +14 -0
- package/dist/db/migrations/v52.d.ts +3 -0
- package/dist/db/migrations/v52.js +7 -0
- package/dist/db/open.d.ts +23 -0
- package/dist/db/open.js +146 -0
- package/dist/db/sqlite.d.ts +21 -0
- package/dist/db/sqlite.js +8 -0
- package/dist/db/tables.d.ts +7 -0
- package/dist/db/tables.js +38 -0
- package/dist/db.d.ts +6 -46
- package/dist/db.js +5 -3036
- package/dist/decisions.d.ts +4 -1
- package/dist/decisions.js +9 -7
- package/dist/dedupe.js +3 -2
- package/dist/delivery-recorder.js +5 -1
- package/dist/doctor.js +4 -3
- package/dist/dormant.js +1 -0
- package/dist/embedding-provider.d.ts +1 -1
- package/dist/embedding-provider.js +7 -5
- package/dist/embeddings.d.ts +9 -52
- package/dist/embeddings.js +47 -298
- package/dist/env.d.ts +75 -0
- package/dist/env.js +119 -0
- package/dist/eval-suite.js +1 -1
- package/dist/eval.js +2 -2
- package/dist/extract.js +5 -4
- package/dist/gated-write.js +3 -1
- package/dist/goals.d.ts +3 -1
- package/dist/goals.js +18 -0
- package/dist/graph/read.d.ts +73 -0
- package/dist/graph/read.js +325 -0
- package/dist/graph/rows.d.ts +45 -0
- package/dist/graph/rows.js +51 -0
- package/dist/graph/types.d.ts +83 -0
- package/dist/graph/types.js +11 -0
- package/dist/graph/write.d.ts +93 -0
- package/dist/{graph.js → graph/write.js} +8 -391
- package/dist/graph-extract.js +2 -1
- package/dist/graph-recall.d.ts +1 -1
- package/dist/graph-recall.js +2 -2
- package/dist/graph-stream.js +1 -1
- package/dist/graph-view.d.ts +1 -1
- package/dist/graph-view.js +1 -1
- package/dist/half-life-migration.d.ts +1 -1
- package/dist/half-life-migration.js +2 -1
- package/dist/handoff.js +3 -0
- package/dist/hooks/codex-session.d.ts +8 -0
- package/dist/hooks/codex-session.js +76 -0
- package/dist/hooks/codex-wrapper.d.ts +55 -0
- package/dist/hooks/codex-wrapper.js +288 -0
- package/dist/hooks/json-hooks.d.ts +63 -0
- package/dist/hooks/json-hooks.js +356 -0
- package/dist/hooks/opencode.d.ts +50 -0
- package/dist/hooks/opencode.js +202 -0
- package/dist/hooks/shared.d.ts +54 -0
- package/dist/hooks/shared.js +77 -0
- package/dist/http-retry.d.ts +2 -0
- package/dist/http-retry.js +4 -3
- package/dist/http-util.d.ts +3 -0
- package/dist/http-util.js +10 -0
- package/dist/{importers.d.ts → importers/core.d.ts} +13 -17
- package/dist/importers/core.js +141 -0
- package/dist/importers/markdown-parse.d.ts +41 -0
- package/dist/importers/markdown-parse.js +132 -0
- package/dist/importers/markdown.d.ts +3 -0
- package/dist/importers/markdown.js +92 -0
- package/dist/importers/sources.d.ts +7 -0
- package/dist/importers/sources.js +229 -0
- package/dist/importers/vault.d.ts +11 -0
- package/dist/importers/vault.js +352 -0
- package/dist/incidents.d.ts +3 -0
- package/dist/incidents.js +8 -5
- package/dist/index.d.ts +25 -6
- package/dist/index.js +23 -6
- package/dist/invalidation.js +2 -1
- package/dist/judgment.js +7 -3
- package/dist/keyset.d.ts +13 -0
- package/dist/keyset.js +8 -0
- package/dist/local-embedding.d.ts +13 -0
- package/dist/local-embedding.js +165 -0
- package/dist/log.d.ts +7 -0
- package/dist/log.js +19 -1
- package/dist/mcp/admin-tools.d.ts +8 -0
- package/dist/mcp/admin-tools.js +116 -0
- package/dist/mcp/format.d.ts +27 -0
- package/dist/mcp/format.js +135 -0
- package/dist/mcp/memory-tools.d.ts +5 -0
- package/dist/mcp/memory-tools.js +83 -0
- package/dist/mcp/protocol.d.ts +83 -0
- package/dist/mcp/protocol.js +55 -0
- package/dist/mcp/recall-tools.d.ts +6 -0
- package/dist/mcp/recall-tools.js +320 -0
- package/dist/mcp/request.d.ts +10 -0
- package/dist/mcp/request.js +163 -0
- package/dist/mcp/server.d.ts +4 -70
- package/dist/mcp/server.js +8 -1172
- package/dist/mcp/session-state.d.ts +11 -0
- package/dist/mcp/session-state.js +28 -0
- package/dist/mcp/stdio.d.ts +8 -0
- package/dist/mcp/stdio.js +79 -0
- package/dist/mcp/tools.d.ts +11 -0
- package/dist/mcp/tools.js +247 -0
- package/dist/memory.d.ts +8 -3
- package/dist/memory.js +27 -1
- package/dist/multihop.d.ts +1 -1
- package/dist/multihop.js +2 -1
- package/dist/owner-validation.js +2 -1
- package/dist/physics-state.js +10 -7
- package/dist/policies.d.ts +3 -0
- package/dist/policies.js +8 -6
- package/dist/postinstall.js +3 -2
- package/dist/predictions/planning-fallacy.d.ts +100 -0
- package/dist/predictions/planning-fallacy.js +190 -0
- package/dist/{predictions.d.ts → predictions/store.d.ts} +7 -102
- package/dist/predictions/store.js +434 -0
- package/dist/processes.d.ts +3 -0
- package/dist/processes.js +8 -5
- package/dist/project-briefs.d.ts +3 -0
- package/dist/project-briefs.js +7 -5
- package/dist/project-identity.d.ts +1 -1
- package/dist/project-identity.js +12 -6
- package/dist/project-merge.js +3 -1
- package/dist/quarantine.d.ts +2 -1
- package/dist/quarantine.js +8 -5
- package/dist/raw-archive-mirror-cleanup.js +2 -1
- package/dist/raw-archive.js +1 -1
- package/dist/recall-history.js +3 -2
- package/dist/recall-pipeline.d.ts +2 -2
- package/dist/recall-pipeline.js +16 -8
- package/dist/recall-scope.js +1 -1
- package/dist/recall-trace.d.ts +3 -3
- package/dist/recall-trace.js +10 -14
- package/dist/refine-llm.js +20 -11
- package/dist/reject-flow.js +6 -1
- package/dist/rerankers/clef.d.ts +2 -2
- package/dist/rerankers/clef.js +72 -30
- package/dist/rerankers/cross-encoder.js +6 -4
- package/dist/rerankers/jev.d.ts +4 -2
- package/dist/rerankers/jev.js +24 -19
- package/dist/rerankers/llm.d.ts +4 -2
- package/dist/rerankers/llm.js +61 -41
- package/dist/rerankers/types.d.ts +1 -1
- package/dist/salience.js +1 -1
- package/dist/same-text.d.ts +2 -0
- package/dist/same-text.js +4 -0
- package/dist/scheduler.d.ts +1 -0
- package/dist/scheduler.js +26 -3
- package/dist/scope.js +4 -3
- package/dist/search/as-of.d.ts +10 -0
- package/dist/search/as-of.js +22 -0
- package/dist/search/bm25-search.d.ts +14 -0
- package/dist/search/bm25-search.js +43 -0
- package/dist/search/bm25.d.ts +15 -0
- package/dist/search/bm25.js +54 -0
- package/dist/search/boosts.d.ts +54 -0
- package/dist/search/boosts.js +94 -0
- package/dist/search/breakdown.d.ts +7 -0
- package/dist/search/breakdown.js +20 -0
- package/dist/search/explain.d.ts +25 -0
- package/dist/search/explain.js +31 -0
- package/dist/search/finalize.d.ts +8 -0
- package/dist/search/finalize.js +52 -0
- package/dist/search/fusion.d.ts +27 -0
- package/dist/search/fusion.js +42 -0
- package/dist/search/hybrid-score.d.ts +20 -0
- package/dist/search/hybrid-score.js +73 -0
- package/dist/search/hybrid.d.ts +46 -0
- package/dist/search/hybrid.js +64 -0
- package/dist/search/physics-search.d.ts +29 -0
- package/dist/search/physics-search.js +162 -0
- package/dist/search/rerank.d.ts +10 -0
- package/dist/search/rerank.js +72 -0
- package/dist/search/temporal.d.ts +15 -0
- package/dist/search/temporal.js +45 -0
- package/dist/search/types.d.ts +91 -0
- package/dist/search/types.js +2 -0
- package/dist/search/vector.d.ts +30 -0
- package/dist/search/vector.js +71 -0
- package/dist/secret-detect.d.ts +2 -0
- package/dist/secret-detect.js +3 -1
- package/dist/server/auth.d.ts +52 -0
- package/dist/server/auth.js +221 -0
- package/dist/server/client-ip.d.ts +25 -0
- package/dist/server/client-ip.js +92 -0
- package/dist/server/cursor.d.ts +23 -0
- package/dist/server/cursor.js +58 -0
- package/dist/server/lifecycle.d.ts +7 -0
- package/dist/server/lifecycle.js +29 -0
- package/dist/server/mcp-http.d.ts +5 -0
- package/dist/server/mcp-http.js +199 -0
- package/dist/server/request.d.ts +33 -0
- package/dist/server/request.js +103 -0
- package/dist/server/routes/admin.d.ts +9 -0
- package/dist/server/routes/admin.js +158 -0
- package/dist/server/routes/customer-notes.d.ts +7 -0
- package/dist/server/routes/customer-notes.js +112 -0
- package/dist/server/routes/decisions.d.ts +7 -0
- package/dist/server/routes/decisions.js +133 -0
- package/dist/server/routes/incidents.d.ts +7 -0
- package/dist/server/routes/incidents.js +126 -0
- package/dist/server/routes/memories.d.ts +10 -0
- package/dist/server/routes/memories.js +179 -0
- package/dist/server/routes/policies.d.ts +8 -0
- package/dist/server/routes/policies.js +151 -0
- package/dist/server/routes/predictions.d.ts +7 -0
- package/dist/server/routes/predictions.js +164 -0
- package/dist/server/routes/processes.d.ts +7 -0
- package/dist/server/routes/processes.js +161 -0
- package/dist/server/routes/project-briefs.d.ts +8 -0
- package/dist/server/routes/project-briefs.js +136 -0
- package/dist/server/routes/recall.d.ts +8 -0
- package/dist/server/routes/recall.js +340 -0
- package/dist/server/routes/skills.d.ts +8 -0
- package/dist/server/routes/skills.js +150 -0
- package/dist/server/types.d.ts +56 -0
- package/dist/server/types.js +2 -0
- package/dist/server/validation.d.ts +14 -0
- package/dist/server/validation.js +91 -0
- package/dist/server.d.ts +7 -61
- package/dist/server.js +92 -2368
- package/dist/session-digest.d.ts +1 -1
- package/dist/session-digest.js +9 -2
- package/dist/shared.d.ts +3 -1
- package/dist/shared.js +46 -40
- package/dist/skills.d.ts +3 -0
- package/dist/skills.js +7 -5
- package/dist/stdin.js +3 -2
- package/dist/store/audit-event.d.ts +19 -0
- package/dist/store/audit-event.js +33 -0
- package/dist/store/candidates.d.ts +42 -0
- package/dist/store/candidates.js +152 -0
- package/dist/store/conflicts.d.ts +44 -0
- package/dist/store/conflicts.js +444 -0
- package/dist/store/delete-and-batch.d.ts +63 -0
- package/dist/store/delete-and-batch.js +310 -0
- package/dist/store/entry-reads.d.ts +92 -0
- package/dist/store/entry-reads.js +255 -0
- package/dist/store/entry-row.d.ts +67 -0
- package/dist/store/entry-row.js +208 -0
- package/dist/store/entry-writes.d.ts +46 -0
- package/dist/store/entry-writes.js +148 -0
- package/dist/store/handoffs.d.ts +26 -0
- package/dist/store/handoffs.js +184 -0
- package/dist/store/index-and-stats.d.ts +52 -0
- package/dist/store/index-and-stats.js +214 -0
- package/dist/store/markdown.d.ts +10 -0
- package/dist/store/markdown.js +108 -0
- package/dist/store/mirrors.d.ts +49 -0
- package/dist/store/mirrors.js +312 -0
- package/dist/store/open.d.ts +15 -0
- package/dist/store/open.js +223 -0
- package/dist/store/rows.d.ts +178 -0
- package/dist/store/rows.js +158 -0
- package/dist/store/search-rows.d.ts +86 -0
- package/dist/store/search-rows.js +254 -0
- package/dist/store/sessions.d.ts +83 -0
- package/dist/store/sessions.js +272 -0
- package/dist/store/summaries.d.ts +94 -0
- package/dist/store/summaries.js +377 -0
- package/dist/store/tenant-lookup.d.ts +12 -0
- package/dist/store/tenant-lookup.js +16 -0
- package/dist/store-cards.js +2 -1
- package/dist/summary-dirty.d.ts +4 -0
- package/dist/summary-dirty.js +32 -0
- package/dist/support-bundle.js +4 -3
- package/dist/tenant.js +2 -2
- package/dist/token-ledger.js +1 -0
- package/dist/tokenize.d.ts +2 -0
- package/dist/tokenize.js +16 -0
- package/dist/transcript-tail.d.ts +7 -0
- package/dist/transcript-tail.js +48 -0
- package/dist/vector-store.d.ts +27 -0
- package/dist/vector-store.js +210 -0
- package/dist/version.d.ts +2 -2
- package/dist/version.js +2 -2
- package/dist/working-memory.js +1 -1
- package/dist/yaml.js +36 -11
- package/dist-ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
- package/dist-ui/assets/index-DPN7cP19.js +33 -0
- package/dist-ui/assets/index-dFloKRVr.css +1 -0
- package/dist-ui/index.html +3 -25
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -1
- package/dist/capture.d.ts +0 -155
- package/dist/capture.js +0 -1293
- package/dist/consolidate.d.ts +0 -58
- package/dist/consolidate.js +0 -1123
- package/dist/graph.d.ts +0 -245
- package/dist/hooks.d.ts +0 -208
- package/dist/hooks.js +0 -1073
- package/dist/importers.js +0 -897
- package/dist/predictions.js +0 -620
- package/dist/search.d.ts +0 -320
- package/dist/search.js +0 -968
- package/dist/store.d.ts +0 -744
- package/dist/store.js +0 -3372
- package/dist-ui/assets/d3-BiWEKnn4.js +0 -1
- package/dist-ui/assets/index-BhT8RvO6.js +0 -61
- package/dist-ui/assets/index-RoXXJ5dq.css +0 -1
- package/dist-ui/assets/three-BDgTxR1l.js +0 -4112
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type DormantMemory, type ListDormantOpts } from '../dormant.js';
|
|
2
|
+
import { type MemoryEntry } from '../memory.js';
|
|
3
|
+
import type { Context } from './types.js';
|
|
4
|
+
/**
|
|
5
|
+
* A tenant's dormant memories (src/dormant.ts): what sleep moved out of
|
|
6
|
+
* active memory instead of deleting, when `dormant.enabled` is on. Newest
|
|
7
|
+
* first; `opts.query` keeps rows containing every term (case-insensitive).
|
|
8
|
+
*/
|
|
9
|
+
export declare function listDormant(ctx: Context, opts?: ListDormantOpts): DormantMemory[];
|
|
10
|
+
/**
|
|
11
|
+
* Bring a dormant memory back into active memory. It returns as if just
|
|
12
|
+
* recalled: `last_retrieved` is now, so it gets a full half-life before it
|
|
13
|
+
* can fade again. Every other field is the snapshot taken when it went
|
|
14
|
+
* dormant.
|
|
15
|
+
*
|
|
16
|
+
* Throws when the tenant has no dormant memory with that id (another
|
|
17
|
+
* tenant's id reads the same way), when a live memory already holds the id,
|
|
18
|
+
* and RejectedValueError when the value has been rejected since. On any
|
|
19
|
+
* throw the dormant copy stays where it is.
|
|
20
|
+
*/
|
|
21
|
+
export declare function restoreDormant(ctx: Context, id: string): MemoryEntry;
|
|
22
|
+
/**
|
|
23
|
+
* Permanently delete a dormant memory: the explicit "forget it for good"
|
|
24
|
+
* that dormant storage leaves to the user. Throws when the tenant has no
|
|
25
|
+
* dormant memory with that id.
|
|
26
|
+
*/
|
|
27
|
+
export declare function forgetDormant(ctx: Context, id: string): void;
|
|
28
|
+
/** Whether the tenant holds a dormant memory with this id (for "not found" hints). */
|
|
29
|
+
export declare function isDormant(ctx: Context, id: string): boolean;
|
|
30
|
+
//# sourceMappingURL=dormant.d.ts.map
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
// Dormant memories: list, restore, forget and check.
|
|
2
|
+
import { openHippoDb, closeHippoDb } from '../db.js';
|
|
3
|
+
import { ConflictError, NotFoundError } from '../api-errors.js';
|
|
4
|
+
import { auditRejectionRefusal } from '../store/audit-event.js';
|
|
5
|
+
import { stampOriginProject } from '../store/entry-row.js';
|
|
6
|
+
import { writeEntryDbOnly, writeEntryMirrors } from '../store/entry-writes.js';
|
|
7
|
+
import { updateStatsUnlessBusy } from '../store/index-and-stats.js';
|
|
8
|
+
import { RejectedValueError } from '../rejection.js';
|
|
9
|
+
import { listDormantRows, readDormantSnapshot, deleteDormantRow, hasDormantRow, } from '../dormant.js';
|
|
10
|
+
import { createMemory, calculateStrength } from '../memory.js';
|
|
11
|
+
import { appendAuditEvent, reportAuditWriteFailure } from '../audit.js';
|
|
12
|
+
import { loadConfig } from '../config.js';
|
|
13
|
+
/**
|
|
14
|
+
* A tenant's dormant memories (src/dormant.ts): what sleep moved out of
|
|
15
|
+
* active memory instead of deleting, when `dormant.enabled` is on. Newest
|
|
16
|
+
* first; `opts.query` keeps rows containing every term (case-insensitive).
|
|
17
|
+
*/
|
|
18
|
+
export function listDormant(ctx, opts = {}) {
|
|
19
|
+
const db = openHippoDb(ctx.hippoRoot);
|
|
20
|
+
try {
|
|
21
|
+
return listDormantRows(db, ctx.tenantId, opts);
|
|
22
|
+
}
|
|
23
|
+
finally {
|
|
24
|
+
closeHippoDb(db);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Bring a dormant memory back into active memory. It returns as if just
|
|
29
|
+
* recalled: `last_retrieved` is now, so it gets a full half-life before it
|
|
30
|
+
* can fade again. Every other field is the snapshot taken when it went
|
|
31
|
+
* dormant.
|
|
32
|
+
*
|
|
33
|
+
* Throws when the tenant has no dormant memory with that id (another
|
|
34
|
+
* tenant's id reads the same way), when a live memory already holds the id,
|
|
35
|
+
* and RejectedValueError when the value has been rejected since. On any
|
|
36
|
+
* throw the dormant copy stays where it is.
|
|
37
|
+
*/
|
|
38
|
+
export function restoreDormant(ctx, id) {
|
|
39
|
+
const db = openHippoDb(ctx.hippoRoot);
|
|
40
|
+
try {
|
|
41
|
+
let restored;
|
|
42
|
+
db.exec('BEGIN IMMEDIATE');
|
|
43
|
+
try {
|
|
44
|
+
const dormant = readDormantSnapshot(db, ctx.tenantId, id);
|
|
45
|
+
if (!dormant) {
|
|
46
|
+
throw new NotFoundError(`dormant memory not found: ${id}`);
|
|
47
|
+
}
|
|
48
|
+
if (db.prepare(`SELECT 1 FROM memories WHERE id = ?`).get(id) !== undefined) {
|
|
49
|
+
throw new ConflictError(`memory ${id} is already active; forget it before restoring its dormant copy`);
|
|
50
|
+
}
|
|
51
|
+
const now = new Date();
|
|
52
|
+
// Dormant rows are long-lived, so a snapshot can predate a field added
|
|
53
|
+
// later: createMemory supplies a default for anything it lacks, then
|
|
54
|
+
// the snapshot overrides every field it does carry, content included.
|
|
55
|
+
// (The placeholder only satisfies createMemory's minimum length, so a
|
|
56
|
+
// legacy row shorter than 3 chars can still be restored.)
|
|
57
|
+
const revived = {
|
|
58
|
+
...createMemory('dormant snapshot defaults', { baseHalfLifeDays: loadConfig(ctx.hippoRoot).defaultHalfLifeDays }),
|
|
59
|
+
...dormant.entry,
|
|
60
|
+
last_retrieved: now.toISOString(),
|
|
61
|
+
};
|
|
62
|
+
restored = stampOriginProject(ctx.hippoRoot, { ...revived, strength: calculateStrength(revived, now) });
|
|
63
|
+
writeEntryDbOnly(db, restored, { actor: ctx.actor.subject });
|
|
64
|
+
deleteDormantRow(db, ctx.tenantId, id);
|
|
65
|
+
// A restore is a labelled "forgot it, then needed it" event: the
|
|
66
|
+
// signal a learned lifecycle (ROADMAP LC3) trains on. Same transaction
|
|
67
|
+
// as the restore, so the label exists exactly when the restore does.
|
|
68
|
+
appendAuditEvent(db, {
|
|
69
|
+
tenantId: ctx.tenantId,
|
|
70
|
+
actor: ctx.actor.subject,
|
|
71
|
+
op: 'dormant_restore',
|
|
72
|
+
targetId: id,
|
|
73
|
+
metadata: {
|
|
74
|
+
reason: dormant.reason,
|
|
75
|
+
strengthAtDormancy: dormant.strength,
|
|
76
|
+
dormantAt: dormant.dormantAt,
|
|
77
|
+
daysDormant: Math.max(0, (now.getTime() - Date.parse(dormant.dormantAt)) / (24 * 60 * 60 * 1000)),
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
db.exec('COMMIT');
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
try {
|
|
84
|
+
db.exec('ROLLBACK');
|
|
85
|
+
}
|
|
86
|
+
catch { /* already rolled back */ }
|
|
87
|
+
if (err instanceof RejectedValueError) {
|
|
88
|
+
auditRejectionRefusal(db, err, ctx.actor.subject);
|
|
89
|
+
}
|
|
90
|
+
throw err;
|
|
91
|
+
}
|
|
92
|
+
writeEntryMirrors(ctx.hippoRoot, restored);
|
|
93
|
+
return restored;
|
|
94
|
+
}
|
|
95
|
+
finally {
|
|
96
|
+
closeHippoDb(db);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Permanently delete a dormant memory: the explicit "forget it for good"
|
|
101
|
+
* that dormant storage leaves to the user. Throws when the tenant has no
|
|
102
|
+
* dormant memory with that id.
|
|
103
|
+
*/
|
|
104
|
+
export function forgetDormant(ctx, id) {
|
|
105
|
+
const db = openHippoDb(ctx.hippoRoot);
|
|
106
|
+
try {
|
|
107
|
+
if (!deleteDormantRow(db, ctx.tenantId, id)) {
|
|
108
|
+
throw new NotFoundError(`dormant memory not found: ${id}`);
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
appendAuditEvent(db, {
|
|
112
|
+
tenantId: ctx.tenantId,
|
|
113
|
+
actor: ctx.actor.subject,
|
|
114
|
+
op: 'forget',
|
|
115
|
+
targetId: id,
|
|
116
|
+
metadata: { dormant: true },
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
// Best-effort, like every other forget audit row: the delete stands.
|
|
121
|
+
reportAuditWriteFailure('forget', String(error), id);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
finally {
|
|
125
|
+
closeHippoDb(db);
|
|
126
|
+
}
|
|
127
|
+
// Counted like every other permanent removal (forget, archiveRaw).
|
|
128
|
+
updateStatsUnlessBusy(ctx.hippoRoot, { forgotten: 1 }, `removed ${id}`);
|
|
129
|
+
}
|
|
130
|
+
/** Whether the tenant holds a dormant memory with this id (for "not found" hints). */
|
|
131
|
+
export function isDormant(ctx, id) {
|
|
132
|
+
const db = openHippoDb(ctx.hippoRoot);
|
|
133
|
+
try {
|
|
134
|
+
return hasDormantRow(db, ctx.tenantId, id);
|
|
135
|
+
}
|
|
136
|
+
finally {
|
|
137
|
+
closeHippoDb(db);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=dormant.js.map
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { Context } from './types.js';
|
|
2
|
+
export interface DrillDownOpts {
|
|
3
|
+
/** Cap on number of children returned. Default 50. */
|
|
4
|
+
limit?: number;
|
|
5
|
+
/**
|
|
6
|
+
* Optional token budget. When set, children are appended in chronological
|
|
7
|
+
* order (created ASC) until adding the next child would exceed the budget.
|
|
8
|
+
* Token cost = the child's printed line under `cost`, else ceil(content.length / 4).
|
|
9
|
+
*
|
|
10
|
+
* For depth > 1, the budget is GLOBAL cumulative (NOT per-level).
|
|
11
|
+
*/
|
|
12
|
+
budget?: number;
|
|
13
|
+
/**
|
|
14
|
+
* v0.30 / E5 — walk N levels down (default 1 = direct children only).
|
|
15
|
+
* Higher values include children of children, etc. Internal hard cap 10
|
|
16
|
+
* to prevent pathological depth walks. BFS uses visited Set for dedup
|
|
17
|
+
* (defensive against shared-child data anomalies; DAG is acyclic by
|
|
18
|
+
* construction).
|
|
19
|
+
*/
|
|
20
|
+
depth?: number;
|
|
21
|
+
cost?: DrillDownCost;
|
|
22
|
+
}
|
|
23
|
+
export interface DrillDownSummary {
|
|
24
|
+
id: string;
|
|
25
|
+
content: string;
|
|
26
|
+
descendantCount: number;
|
|
27
|
+
earliestAt: string | null;
|
|
28
|
+
latestAt: string | null;
|
|
29
|
+
}
|
|
30
|
+
export interface DrillDownChild {
|
|
31
|
+
id: string;
|
|
32
|
+
content: string;
|
|
33
|
+
layer: string;
|
|
34
|
+
dagLevel: number;
|
|
35
|
+
created: string;
|
|
36
|
+
}
|
|
37
|
+
export interface DrillDownCost {
|
|
38
|
+
child: (c: DrillDownChild) => number;
|
|
39
|
+
fixed: (summary: DrillDownSummary, widest: number) => number;
|
|
40
|
+
}
|
|
41
|
+
export interface DrillDownResult {
|
|
42
|
+
summary: DrillDownSummary;
|
|
43
|
+
children: DrillDownChild[];
|
|
44
|
+
totalChildren: number;
|
|
45
|
+
truncated: boolean;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* v1.6.4 discriminated failure shape. Two reasons distinguishable:
|
|
49
|
+
* - `not_found`: covers genuinely-missing, wrong-tenant, AND
|
|
50
|
+
* scope-blocked (codex round 3 P1 — distinguishing scope_blocked
|
|
51
|
+
* from not_found on non-HTTP surfaces leaked private-row existence
|
|
52
|
+
* to no-scope callers, even though the HTTP route already collapsed
|
|
53
|
+
* them. Collapse at the API layer.)
|
|
54
|
+
* - `not_drillable`: id is a leaf row (level 0/1). Caller-actionable.
|
|
55
|
+
*
|
|
56
|
+
* If a future drillDown gains a `scope` opt for explicit-scope callers,
|
|
57
|
+
* a `scope_blocked` failure could be safely re-introduced ONLY for that
|
|
58
|
+
* code path (caller already proved authorization by passing a scope).
|
|
59
|
+
*/
|
|
60
|
+
export interface DrillDownFailure {
|
|
61
|
+
failure: 'not_found' | 'not_drillable';
|
|
62
|
+
}
|
|
63
|
+
export type DrillDownOutcome = DrillDownResult | DrillDownFailure;
|
|
64
|
+
/**
|
|
65
|
+
* Walk one step down the DAG from a level-2 (or higher) summary to its direct
|
|
66
|
+
* children. Companion to `recall(... summarizeOverflow: true)` — when recall
|
|
67
|
+
* surfaces a summary with `substitutedFor: [...]`, the caller drills into the
|
|
68
|
+
* summary id to recover the original detail.
|
|
69
|
+
*
|
|
70
|
+
* Tenant scope: only summaries owned by `ctx.tenantId` are reachable. The same
|
|
71
|
+
* scope filter that recall applies is enforced on the children — a level-2
|
|
72
|
+
* summary in `slack:public:CGEN` cannot leak `slack:private:*` children even
|
|
73
|
+
* if the underlying DAG accidentally linked across scopes.
|
|
74
|
+
*
|
|
75
|
+
* Returns a discriminated `DrillDownOutcome`: `DrillDownResult` on success,
|
|
76
|
+
* or `{failure: '...'}` for `not_found` (covers genuinely-missing AND wrong-
|
|
77
|
+
* tenant, intentionally indistinguishable), `not_drillable` (id is a leaf
|
|
78
|
+
* row), or `scope_blocked` (caller has no scope grant for the row's scope).
|
|
79
|
+
*
|
|
80
|
+
* Pre-v1.6.4 returned null for all four cases. JS callers migrate via
|
|
81
|
+
* `'failure' in result` checks; HTTP route maps `not_drillable` to 422.
|
|
82
|
+
*/
|
|
83
|
+
export declare function drillDown(ctx: Context, summaryId: string, opts?: DrillDownOpts): DrillDownOutcome;
|
|
84
|
+
//# sourceMappingURL=drill-down.d.ts.map
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
// DAG drill-down from a summary to its children.
|
|
2
|
+
import { readEntry, loadChildrenOf } from '../store/entry-reads.js';
|
|
3
|
+
import { estimateTokens } from '../token-ledger.js';
|
|
4
|
+
import { passesScopeFilterForRecall } from '../recall-scope.js';
|
|
5
|
+
/**
|
|
6
|
+
* Walk one step down the DAG from a level-2 (or higher) summary to its direct
|
|
7
|
+
* children. Companion to `recall(... summarizeOverflow: true)` — when recall
|
|
8
|
+
* surfaces a summary with `substitutedFor: [...]`, the caller drills into the
|
|
9
|
+
* summary id to recover the original detail.
|
|
10
|
+
*
|
|
11
|
+
* Tenant scope: only summaries owned by `ctx.tenantId` are reachable. The same
|
|
12
|
+
* scope filter that recall applies is enforced on the children — a level-2
|
|
13
|
+
* summary in `slack:public:CGEN` cannot leak `slack:private:*` children even
|
|
14
|
+
* if the underlying DAG accidentally linked across scopes.
|
|
15
|
+
*
|
|
16
|
+
* Returns a discriminated `DrillDownOutcome`: `DrillDownResult` on success,
|
|
17
|
+
* or `{failure: '...'}` for `not_found` (covers genuinely-missing AND wrong-
|
|
18
|
+
* tenant, intentionally indistinguishable), `not_drillable` (id is a leaf
|
|
19
|
+
* row), or `scope_blocked` (caller has no scope grant for the row's scope).
|
|
20
|
+
*
|
|
21
|
+
* Pre-v1.6.4 returned null for all four cases. JS callers migrate via
|
|
22
|
+
* `'failure' in result` checks; HTTP route maps `not_drillable` to 422.
|
|
23
|
+
*/
|
|
24
|
+
export function drillDown(ctx, summaryId, opts = {}) {
|
|
25
|
+
const limit = opts.limit ?? 50;
|
|
26
|
+
// v0.30 / E5: depth defaults 1 (backward compat); hard cap 10 levels
|
|
27
|
+
// prevents pathological deep trees. CLI/HTTP/MCP reject invalid values.
|
|
28
|
+
const depth = Math.max(1, Math.min(Math.trunc(opts.depth ?? 1), 10));
|
|
29
|
+
const summary = readEntry(ctx.hippoRoot, summaryId, ctx.tenantId);
|
|
30
|
+
// No unscoped cross-tenant probe here — readEntry's null return covers
|
|
31
|
+
// both "doesn't exist" and "exists in another tenant" by design.
|
|
32
|
+
// Distinguishing them via an unscoped lookup would leak existence to
|
|
33
|
+
// unauthorised tenants. The two cases collapse into not_found.
|
|
34
|
+
if (!summary)
|
|
35
|
+
return { failure: 'not_found' };
|
|
36
|
+
if ((summary.dag_level ?? 0) < 2)
|
|
37
|
+
return { failure: 'not_drillable' };
|
|
38
|
+
if (!passesScopeFilterForRecall(summary.scope ?? null, undefined)) {
|
|
39
|
+
// codex round 3 P1: collapse to not_found. A distinguishable
|
|
40
|
+
// "scope_blocked" tells a no-scope caller "this row exists, just
|
|
41
|
+
// not for you" — same existence-leak the HTTP 404 collapse was
|
|
42
|
+
// already preventing. Match the HTTP behaviour at the API level.
|
|
43
|
+
return { failure: 'not_found' };
|
|
44
|
+
}
|
|
45
|
+
// v0.30 / E5: BFS walk levels 1..depth with visited-Set dedup. Defensive
|
|
46
|
+
// against shared-child data anomalies (dag_parent_id has no uniqueness
|
|
47
|
+
// constraint, so a misconfigured tree could double-emit at depth > 1).
|
|
48
|
+
// Each level uses loadChildrenOf which is tenant-scoped via ctx.tenantId.
|
|
49
|
+
const collected = [];
|
|
50
|
+
const visited = new Set([summaryId]);
|
|
51
|
+
let frontier = [summaryId];
|
|
52
|
+
// independent-review MED #4 fold: track level-0 direct-children count
|
|
53
|
+
// separately so the descendantCount fallback (for legacy summaries with
|
|
54
|
+
// null descendant_count) reflects DIRECT children, not BFS-collected total.
|
|
55
|
+
let level0DirectCount = 0;
|
|
56
|
+
for (let level = 0; level < depth; level++) {
|
|
57
|
+
const nextFrontier = [];
|
|
58
|
+
for (const parentId of frontier) {
|
|
59
|
+
const kids = loadChildrenOf(ctx.hippoRoot, parentId, ctx.tenantId);
|
|
60
|
+
const eligibleKids = kids.filter((c) => passesScopeFilterForRecall(c.scope ?? null, undefined));
|
|
61
|
+
for (const k of eligibleKids) {
|
|
62
|
+
if (visited.has(k.id))
|
|
63
|
+
continue;
|
|
64
|
+
visited.add(k.id);
|
|
65
|
+
collected.push(k);
|
|
66
|
+
nextFrontier.push(k.id);
|
|
67
|
+
if (level === 0)
|
|
68
|
+
level0DirectCount++;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (nextFrontier.length === 0)
|
|
72
|
+
break;
|
|
73
|
+
frontier = nextFrontier;
|
|
74
|
+
}
|
|
75
|
+
const summaryOut = {
|
|
76
|
+
id: summary.id,
|
|
77
|
+
content: summary.content,
|
|
78
|
+
// v0.30 / E5: the STORED direct-child count; the legacy fallback counts
|
|
79
|
+
// level-0 children, never the BFS-depth-N total (independent-review MED #4).
|
|
80
|
+
descendantCount: summary.descendant_count ?? level0DirectCount,
|
|
81
|
+
earliestAt: summary.earliest_at ?? null,
|
|
82
|
+
latestAt: summary.latest_at ?? null,
|
|
83
|
+
};
|
|
84
|
+
const all = collected.map((c) => ({
|
|
85
|
+
id: c.id,
|
|
86
|
+
content: c.content,
|
|
87
|
+
layer: c.layer,
|
|
88
|
+
dagLevel: c.dag_level ?? 0,
|
|
89
|
+
created: c.created,
|
|
90
|
+
}));
|
|
91
|
+
// Apply global cumulative token budget + limit cap on collected.
|
|
92
|
+
let children = all;
|
|
93
|
+
let truncated = false;
|
|
94
|
+
if (opts.budget !== undefined) {
|
|
95
|
+
const out = [];
|
|
96
|
+
let used = 0;
|
|
97
|
+
const room = opts.budget - (opts.cost?.fixed(summaryOut, all.length) ?? 0);
|
|
98
|
+
for (const c of all) {
|
|
99
|
+
const t = opts.cost ? opts.cost.child(c) : estimateTokens(c.content);
|
|
100
|
+
if (out.length > 0 && used + t > room) {
|
|
101
|
+
truncated = true;
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
out.push(c);
|
|
105
|
+
used += t;
|
|
106
|
+
}
|
|
107
|
+
children = out;
|
|
108
|
+
}
|
|
109
|
+
if (children.length > limit) {
|
|
110
|
+
children = children.slice(0, limit);
|
|
111
|
+
truncated = true;
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
summary: summaryOut,
|
|
115
|
+
children,
|
|
116
|
+
// v0.30 / E5: totalChildren = BFS-collected count (depth-aware). For
|
|
117
|
+
// depth=1 this equals the eligible direct-children count (backward
|
|
118
|
+
// compat). For depth>1 it is the cumulative count across levels.
|
|
119
|
+
totalChildren: collected.length,
|
|
120
|
+
truncated,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=drill-down.js.map
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { RejectedValueRow } from '../rejection.js';
|
|
2
|
+
import type { Context } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Delete a memory by id. `deleteEntry` threads ctx.actor.subject into its internal
|
|
5
|
+
* audit hook, so exactly one 'forget' event lands with the supplied actor.
|
|
6
|
+
*
|
|
7
|
+
* Tenant scope: deleteEntry looks up the row by id alone, so without an
|
|
8
|
+
* explicit tenant guard a Bearer for tenant A could delete tenant B's row
|
|
9
|
+
* by guessing or leaking the id. Pre-check the row's tenant_id and deny
|
|
10
|
+
* cross-tenant access with a not-found error (no info leak about whether
|
|
11
|
+
* the id exists in another tenant).
|
|
12
|
+
*/
|
|
13
|
+
export interface ForgetResult {
|
|
14
|
+
ok: true;
|
|
15
|
+
id: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function forget(ctx: Context, id: string): ForgetResult;
|
|
18
|
+
export interface RejectOpts {
|
|
19
|
+
/** By-id form: reject the CURRENT content of an existing memory. */
|
|
20
|
+
memoryId?: string;
|
|
21
|
+
/** Pre-emptive form: reject a value not currently stored (or already gone). */
|
|
22
|
+
value?: string;
|
|
23
|
+
/** Required — the tombstone stores no content; reason is its only identity. */
|
|
24
|
+
reason: string;
|
|
25
|
+
}
|
|
26
|
+
export interface RejectResult {
|
|
27
|
+
digest: string;
|
|
28
|
+
removedIds: string[];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Reject a value: tombstone its normalized digest so a matching write is
|
|
32
|
+
* refused everywhere (remember/capture/import/sync) until `unreject`. Two
|
|
33
|
+
* forms — pass exactly one:
|
|
34
|
+
* - `memoryId`: reject the CURRENT content of an existing memory. Removes
|
|
35
|
+
* that row and every other live row in the tenant whose normalized
|
|
36
|
+
* digest matches (not just the id passed).
|
|
37
|
+
* - `value`: pre-emptive form — tombstone content that may not currently
|
|
38
|
+
* be stored (or is already gone). Zero removals.
|
|
39
|
+
*
|
|
40
|
+
* `reason` is required (the tombstone stores no content; reason is its
|
|
41
|
+
* only human-readable identity). Throws if the memory id is not found in
|
|
42
|
+
* `ctx.tenantId`, or if both/neither of `memoryId`/`value` are given.
|
|
43
|
+
*/
|
|
44
|
+
export declare function reject(ctx: Context, opts: RejectOpts): RejectResult;
|
|
45
|
+
/**
|
|
46
|
+
* Delete a tombstone by exact digest or unambiguous prefix, restoring the
|
|
47
|
+
* value's writability — the only v1 escape hatch (no per-write force flag).
|
|
48
|
+
* Throws if `digestOrPrefix` matches no tombstone, is blank, or matches
|
|
49
|
+
* more than one (use a longer prefix).
|
|
50
|
+
*/
|
|
51
|
+
export declare function unreject(ctx: Context, digestOrPrefix: string): {
|
|
52
|
+
ok: boolean;
|
|
53
|
+
digest: string;
|
|
54
|
+
};
|
|
55
|
+
/** List every rejected-value tombstone for `ctx.tenantId`, newest first. */
|
|
56
|
+
export declare function listRejections(ctx: Context): RejectedValueRow[];
|
|
57
|
+
//# sourceMappingURL=forget.d.ts.map
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// Forget a memory, and reject or unreject a value so it cannot be stored again.
|
|
2
|
+
import { openHippoDb, closeHippoDb } from '../db.js';
|
|
3
|
+
import { BadRequestError, NotFoundError } from '../api-errors.js';
|
|
4
|
+
import { deleteEntry } from '../store/delete-and-batch.js';
|
|
5
|
+
import { updateStatsUnlessBusy } from '../store/index-and-stats.js';
|
|
6
|
+
import { rejectValue, unrejectValue, listRejectionsForTenant } from '../reject-flow.js';
|
|
7
|
+
import { selectMemoryTenant } from '../store/tenant-lookup.js';
|
|
8
|
+
export function forget(ctx, id) {
|
|
9
|
+
const db = openHippoDb(ctx.hippoRoot);
|
|
10
|
+
try {
|
|
11
|
+
if (selectMemoryTenant(db, id) !== ctx.tenantId) {
|
|
12
|
+
throw new NotFoundError(`memory not found: ${id}`);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
finally {
|
|
16
|
+
closeHippoDb(db);
|
|
17
|
+
}
|
|
18
|
+
const removed = deleteEntry(ctx.hippoRoot, id, { actor: ctx.actor.subject });
|
|
19
|
+
if (!removed) {
|
|
20
|
+
throw new NotFoundError(`memory not found: ${id}`);
|
|
21
|
+
}
|
|
22
|
+
// Counted here, not in the CLI: both callers of this function (cmdForget and
|
|
23
|
+
// the HTTP route) are the two paths of one user command, so neither can miss
|
|
24
|
+
// it. api.remember cannot take the same move; see the server route.
|
|
25
|
+
updateStatsUnlessBusy(ctx.hippoRoot, { forgotten: 1 }, `removed ${id}`);
|
|
26
|
+
return { ok: true, id };
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Reject a value: tombstone its normalized digest so a matching write is
|
|
30
|
+
* refused everywhere (remember/capture/import/sync) until `unreject`. Two
|
|
31
|
+
* forms — pass exactly one:
|
|
32
|
+
* - `memoryId`: reject the CURRENT content of an existing memory. Removes
|
|
33
|
+
* that row and every other live row in the tenant whose normalized
|
|
34
|
+
* digest matches (not just the id passed).
|
|
35
|
+
* - `value`: pre-emptive form — tombstone content that may not currently
|
|
36
|
+
* be stored (or is already gone). Zero removals.
|
|
37
|
+
*
|
|
38
|
+
* `reason` is required (the tombstone stores no content; reason is its
|
|
39
|
+
* only human-readable identity). Throws if the memory id is not found in
|
|
40
|
+
* `ctx.tenantId`, or if both/neither of `memoryId`/`value` are given.
|
|
41
|
+
*/
|
|
42
|
+
export function reject(ctx, opts) {
|
|
43
|
+
if (opts.memoryId !== undefined) {
|
|
44
|
+
// Tenant scope, same not-found-shaped denial as forget/promote above:
|
|
45
|
+
// rejectValue itself also tenant-checks the id, but pre-checking here
|
|
46
|
+
// keeps the error message consistent with the rest of this module.
|
|
47
|
+
const db = openHippoDb(ctx.hippoRoot);
|
|
48
|
+
try {
|
|
49
|
+
if (selectMemoryTenant(db, opts.memoryId) !== ctx.tenantId) {
|
|
50
|
+
throw new NotFoundError(`memory not found: ${opts.memoryId}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
closeHippoDb(db);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const result = rejectValue({
|
|
58
|
+
hippoRoot: ctx.hippoRoot,
|
|
59
|
+
tenantId: ctx.tenantId,
|
|
60
|
+
actor: ctx.actor.subject,
|
|
61
|
+
reason: opts.reason,
|
|
62
|
+
memoryId: opts.memoryId,
|
|
63
|
+
value: opts.value,
|
|
64
|
+
});
|
|
65
|
+
return { digest: result.digest, removedIds: result.removedIds };
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Delete a tombstone by exact digest or unambiguous prefix, restoring the
|
|
69
|
+
* value's writability — the only v1 escape hatch (no per-write force flag).
|
|
70
|
+
* Throws if `digestOrPrefix` matches no tombstone, is blank, or matches
|
|
71
|
+
* more than one (use a longer prefix).
|
|
72
|
+
*/
|
|
73
|
+
export function unreject(ctx, digestOrPrefix) {
|
|
74
|
+
const outcome = unrejectValue(ctx.hippoRoot, ctx.tenantId, digestOrPrefix, ctx.actor.subject);
|
|
75
|
+
if (outcome.status === 'not_found') {
|
|
76
|
+
throw new NotFoundError(`no rejected value matches: ${digestOrPrefix}`);
|
|
77
|
+
}
|
|
78
|
+
if (outcome.status === 'ambiguous') {
|
|
79
|
+
throw new BadRequestError(`"${digestOrPrefix}" matches ${outcome.candidates.length} tombstones; use a longer prefix`);
|
|
80
|
+
}
|
|
81
|
+
return { ok: true, digest: outcome.digest };
|
|
82
|
+
}
|
|
83
|
+
/** List every rejected-value tombstone for `ctx.tenantId`, newest first. */
|
|
84
|
+
export function listRejections(ctx) {
|
|
85
|
+
return listRejectionsForTenant(ctx.hippoRoot, ctx.tenantId);
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=forget.js.map
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type CompleteGoalOpts, type Goal, type PushGoalOpts } from '../goals.js';
|
|
2
|
+
import type { Context } from './types.js';
|
|
3
|
+
/** What a new goal carries; its tenant is always the caller's. */
|
|
4
|
+
export type GoalPushOpts = Omit<PushGoalOpts, 'tenantId'>;
|
|
5
|
+
/** Push a goal onto `sessionId`'s stack in the caller's tenant. */
|
|
6
|
+
export declare function goalPush(ctx: Context, opts: GoalPushOpts): Goal;
|
|
7
|
+
/** The caller's goals for `sessionId`: active ones, or every status when `all` is set. */
|
|
8
|
+
export declare function goalList(ctx: Context, opts: {
|
|
9
|
+
sessionId: string;
|
|
10
|
+
all: boolean;
|
|
11
|
+
}): Goal[];
|
|
12
|
+
/** Complete a goal by id; a no-op for an unknown or already completed goal. Host admin only. */
|
|
13
|
+
export declare function goalComplete(ctx: Context, goalId: string, opts: CompleteGoalOpts): void;
|
|
14
|
+
/** Suspend an active goal by id. Host admin only. */
|
|
15
|
+
export declare function goalSuspend(ctx: Context, goalId: string): void;
|
|
16
|
+
/** Resume a suspended goal by id, suspending the oldest active one past the depth cap. Host admin only. */
|
|
17
|
+
export declare function goalResume(ctx: Context, goalId: string): void;
|
|
18
|
+
//# sourceMappingURL=goals.d.ts.map
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// The per-session goal stack that recall boosts: push, list, complete, suspend and resume.
|
|
2
|
+
import { ForbiddenError } from '../api-errors.js';
|
|
3
|
+
import { completeGoal, getActiveGoals, getSessionGoals, pushGoal, resumeGoal, suspendGoal, } from '../goals.js';
|
|
4
|
+
/** Push a goal onto `sessionId`'s stack in the caller's tenant. */
|
|
5
|
+
export function goalPush(ctx, opts) {
|
|
6
|
+
return pushGoal(ctx.hippoRoot, { ...opts, tenantId: ctx.tenantId });
|
|
7
|
+
}
|
|
8
|
+
/** The caller's goals for `sessionId`: active ones, or every status when `all` is set. */
|
|
9
|
+
export function goalList(ctx, opts) {
|
|
10
|
+
const scope = { sessionId: opts.sessionId, tenantId: ctx.tenantId };
|
|
11
|
+
return opts.all ? getSessionGoals(ctx.hippoRoot, scope) : getActiveGoals(ctx.hippoRoot, scope);
|
|
12
|
+
}
|
|
13
|
+
/** Complete a goal by id; a no-op for an unknown or already completed goal. Host admin only. */
|
|
14
|
+
export function goalComplete(ctx, goalId, opts) {
|
|
15
|
+
requireHostAdmin(ctx);
|
|
16
|
+
completeGoal(ctx.hippoRoot, goalId, opts);
|
|
17
|
+
}
|
|
18
|
+
/** Suspend an active goal by id. Host admin only. */
|
|
19
|
+
export function goalSuspend(ctx, goalId) {
|
|
20
|
+
requireHostAdmin(ctx);
|
|
21
|
+
suspendGoal(ctx.hippoRoot, goalId);
|
|
22
|
+
}
|
|
23
|
+
/** Resume a suspended goal by id, suspending the oldest active one past the depth cap. Host admin only. */
|
|
24
|
+
export function goalResume(ctx, goalId) {
|
|
25
|
+
requireHostAdmin(ctx);
|
|
26
|
+
resumeGoal(ctx.hippoRoot, goalId);
|
|
27
|
+
}
|
|
28
|
+
// Goal ids are not tenant-scoped in the store, so acting on one by id is a cross-tenant power.
|
|
29
|
+
function requireHostAdmin(ctx) {
|
|
30
|
+
if (!ctx.actor.hostAdmin)
|
|
31
|
+
throw new ForbiddenError('Only the host admin can change a goal by id');
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=goals.js.map
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Context } from './types.js';
|
|
2
|
+
/** How a surface writes what it learns. */
|
|
3
|
+
export interface LearnProfile {
|
|
4
|
+
readonly tags: readonly string[];
|
|
5
|
+
readonly source: string;
|
|
6
|
+
/** Also invalidate what a migration subject supersedes, score schema fit, path-tag, count and embed each row. */
|
|
7
|
+
readonly full: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare const CLI_LEARN: LearnProfile;
|
|
10
|
+
export declare const MCP_LEARN: LearnProfile;
|
|
11
|
+
export interface LearnOpts {
|
|
12
|
+
repoPath: string;
|
|
13
|
+
days: number;
|
|
14
|
+
profile: LearnProfile;
|
|
15
|
+
}
|
|
16
|
+
export interface LearnResult {
|
|
17
|
+
/** `no-commits`: an empty git log; `no-lessons`: a log with no lesson-shaped subject. */
|
|
18
|
+
status: 'not-a-repo' | 'no-commits' | 'no-lessons' | 'scanned';
|
|
19
|
+
added: number;
|
|
20
|
+
skipped: number;
|
|
21
|
+
rejected: number;
|
|
22
|
+
lowInfo: number;
|
|
23
|
+
/** Each lesson whose migration target weakened at least one memory, in scan order. */
|
|
24
|
+
invalidations: Array<{
|
|
25
|
+
from: string;
|
|
26
|
+
count: number;
|
|
27
|
+
}>;
|
|
28
|
+
}
|
|
29
|
+
/** Learn from `repoPath`'s last `days` of commits into the caller's tenant. Host admin only. */
|
|
30
|
+
export declare function learn(ctx: Context, opts: LearnOpts): LearnResult;
|
|
31
|
+
//# sourceMappingURL=learn.d.ts.map
|