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
package/dist/api.d.ts
CHANGED
|
@@ -1,1266 +1,26 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Domain API layer for Hippo.
|
|
3
|
-
*
|
|
4
|
-
* Pure functions taking a Context (hippoRoot + tenantId + actor) plus
|
|
5
|
-
* operation options. Both the CLI (direct mode) and the HTTP server
|
|
6
|
-
* (`hippo serve`, A1) call into this module so the business logic lives
|
|
7
|
-
* in exactly one place.
|
|
8
|
-
*/
|
|
9
|
-
import { type DatabaseSyncLike } from './db.js';
|
|
10
|
-
import { BadRequestError } from './api-errors.js';
|
|
11
1
|
export { ApiError, BadRequestError, ConflictError, ForbiddenError, NotFoundError } from './api-errors.js';
|
|
12
|
-
|
|
13
|
-
import { type RejectedValueRow } from './rejection.js';
|
|
14
|
-
import { type DormantMemory, type ListDormantOpts } from './dormant.js';
|
|
15
|
-
import { type TokenSummary, type TokenSurface } from './token-ledger.js';
|
|
16
|
-
import { type QuarantineStatus } from './quarantine.js';
|
|
17
|
-
import { type FailureSummary } from './failure-log.js';
|
|
18
|
-
import { type SessionHandoff } from './handoff.js';
|
|
19
|
-
import { type MemoryKind, type MemoryEntry } from './memory.js';
|
|
20
|
-
import { auditMemories, type AuditEvent, type AuditOp } from './audit.js';
|
|
21
|
-
import { autoShare } from './shared.js';
|
|
22
|
-
import type { DeliveryObserver } from './delivery-recorder.js';
|
|
23
|
-
import { type ApiKeyListItem } from './auth.js';
|
|
24
|
-
import { type RerankStep, type SearchResult } from './search.js';
|
|
25
|
-
import { consolidate } from './consolidate.js';
|
|
26
|
-
import { loadConfig } from './config.js';
|
|
27
|
-
import { deduplicateStore } from './dedupe.js';
|
|
28
|
-
import { computeAmbientState, type AmbientState } from './ambient.js';
|
|
29
|
-
import { loadPendingExtractionTenants } from './graph.js';
|
|
30
|
-
import { extractGraph } from './graph-extract.js';
|
|
31
|
-
import { type PlanningFallacyHint, type PlanningFallacyWatching } from './predictions.js';
|
|
32
|
-
import { type AnchoringHint, type RecallHistorySnapshot } from './recall-history.js';
|
|
33
|
-
import { type AvailabilityHint } from './availability.js';
|
|
34
|
-
/**
|
|
35
|
-
* Actor identity + authorization role for a Context. v1.12.0 A5 v2 sub-1.
|
|
36
|
-
*
|
|
37
|
-
* Before v1.12.0, Context.actor was a bare string. v1.12.0 promotes it to an
|
|
38
|
-
* object carrying both the audit-log subject (formerly the string itself) and
|
|
39
|
-
* a role for /v1/sleep admin gating. Audit helpers continue accepting `string`
|
|
40
|
-
* — callers pass `ctx.actor.subject`. Role checks happen at the request
|
|
41
|
-
* boundary (e.g. /v1/sleep), except in authCreate and authRevoke (ForbiddenError).
|
|
42
|
-
*/
|
|
43
|
-
export interface Actor {
|
|
44
|
-
/** 'cli' | 'localhost:cli' | 'api_key:<key_id>' | 'mcp' | 'connector:slack' | 'connector:github' */
|
|
45
|
-
subject: string;
|
|
46
|
-
role: 'admin' | 'member';
|
|
47
|
-
/** EI2: restricted scopes a member key may read (auth.ts grantScope). Unused for admin actors. */
|
|
48
|
-
scopes?: readonly string[];
|
|
49
|
-
/** An auth resolver vouched for this caller, so its admin role stops at its own tenant. */
|
|
50
|
-
viaAuthResolver?: true;
|
|
51
|
-
}
|
|
52
|
-
export interface Context {
|
|
53
|
-
hippoRoot: string;
|
|
54
|
-
tenantId: string;
|
|
55
|
-
actor: Actor;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Helper for building process-local (admin-by-default) Actor values. v1.12.0
|
|
59
|
-
* factory used by CLI / MCP / connector Context constructors so the role
|
|
60
|
-
* boilerplate isn't repeated at every site. Bearer-authed callers (HTTP
|
|
61
|
-
* /v1/*) construct Actor directly from the api_keys row's role column via
|
|
62
|
-
* buildContextWithAuth in src/server.ts.
|
|
63
|
-
*/
|
|
64
|
-
export declare function adminActor(subject: string): Actor;
|
|
65
|
-
/**
|
|
66
|
-
* Thrown by `api.recall` when a caller's options violate a recall contract
|
|
67
|
-
* that has been opted into via env. Carries a stable `code` field for HTTP /
|
|
68
|
-
* MCP / CLI render paths to discriminate without parsing the message.
|
|
69
|
-
*
|
|
70
|
-
* Codes:
|
|
71
|
-
* - 'fresh_tail_requires_session_id' — `freshTailCount > 0` AND no
|
|
72
|
-
* `freshTailSessionId` AND `HIPPO_REQUIRE_SESSION_SCOPED_FRESH_TAIL=1`.
|
|
73
|
-
* Default behaviour (env unset) returns tenant-wide rows; the env gate
|
|
74
|
-
* is opt-in so multi-session tenants can fail loud instead of silently
|
|
75
|
-
* surfacing cross-session rows tagged `isFreshTail=true`.
|
|
76
|
-
* - 'invalid_scorer_window' — `opts.scorerWindow` is set to a non-positive,
|
|
77
|
-
* non-integer, or non-finite value. Pre-v1.7.0 the value 0 routed
|
|
78
|
-
* through FTS/LIKE `LIMIT 0` and then fell through to an uncapped
|
|
79
|
-
* full-store fallback (codex v1.7.0 diff-pass P1). Validated upfront
|
|
80
|
-
* so the contract holds.
|
|
81
|
-
*/
|
|
82
|
-
export declare class RecallContractError extends BadRequestError {
|
|
83
|
-
readonly code: 'fresh_tail_requires_session_id' | 'invalid_scorer_window';
|
|
84
|
-
constructor(code: 'fresh_tail_requires_session_id' | 'invalid_scorer_window', message: string);
|
|
85
|
-
}
|
|
86
|
-
import { isPrivateScope, passesScopeFilterForRecall } from './recall-scope.js';
|
|
87
|
-
export { isPrivateScope, passesScopeFilterForRecall };
|
|
2
|
+
export { isPrivateScope, passesScopeFilterForRecall } from './recall-scope.js';
|
|
88
3
|
export { passesCliRecallScopeFilter, ScopeForbiddenError } from './recall-scope.js';
|
|
89
4
|
export type { TokenSummary, TokenSurface, TokenSurfaceSummary } from './token-ledger.js';
|
|
90
5
|
export type { FailureSummary } from './failure-log.js';
|
|
91
6
|
export { classifyOriginProject } from './project-identity.js';
|
|
92
|
-
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
|
|
97
|
-
export
|
|
98
|
-
export
|
|
99
|
-
export
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
* log row (or vice versa). If the callback throws, the INSERT is rolled
|
|
112
|
-
* back and the error is rethrown.
|
|
113
|
-
*/
|
|
114
|
-
afterWrite?: (db: DatabaseSyncLike, memoryId: string) => void;
|
|
115
|
-
/** CD5: connector-ingested content an agent doesn't control; gates detectInstruction. CLI/HTTP/MCP never set this. */
|
|
116
|
-
untrusted?: boolean;
|
|
117
|
-
}
|
|
118
|
-
export interface RememberResult {
|
|
119
|
-
id: string;
|
|
120
|
-
kind: MemoryKind;
|
|
121
|
-
tenantId: string;
|
|
122
|
-
/** Set only when untrusted content was flagged and quarantined instead of stored under its requested scope. */
|
|
123
|
-
quarantined?: {
|
|
124
|
-
reason: string;
|
|
125
|
-
};
|
|
126
|
-
/** Set only when the content held secret material: untrusted text had it redacted, typed text was stored as sent. */
|
|
127
|
-
warnings?: string[];
|
|
128
|
-
}
|
|
129
|
-
export declare function remember(ctx: Context, opts: RememberOpts): RememberResult;
|
|
130
|
-
export interface RecallOpts {
|
|
131
|
-
query: string;
|
|
132
|
-
limit?: number;
|
|
133
|
-
/**
|
|
134
|
-
* F3 (v1.7.0): scorer-window opt-in. When set, `loadSearchEntries`
|
|
135
|
-
* loads up to `scorerWindow` candidates. When undefined (default),
|
|
136
|
-
* the existing behaviour is preserved: store-internal 200-row default,
|
|
137
|
-
* which every release before v1.7.0 silently relied on.
|
|
138
|
-
*
|
|
139
|
-
* `scorerWindow` lets callers decouple "how many candidates do I want
|
|
140
|
-
* the scorer to evaluate" from `limit` ("how many do I want returned").
|
|
141
|
-
* Useful when `summarizeOverflow=true` and you want a wider candidate
|
|
142
|
-
* pool to detect more level-2 parent clusters.
|
|
143
|
-
*
|
|
144
|
-
* NOT a hard cap on returned results. Fresh-tail and substituted
|
|
145
|
-
* summaries can extend the result count above `limit`. The CLI's
|
|
146
|
-
* existing slice in `cmdRecall` (cli.ts) is the CLI hard cap; library
|
|
147
|
-
* callers slice themselves if they want one.
|
|
148
|
-
*
|
|
149
|
-
* Validated as a positive finite integer when set. `scorerWindow: 0`
|
|
150
|
-
* or non-finite values throw `RecallContractError` with code
|
|
151
|
-
* `invalid_scorer_window` to prevent the v1.6.x footgun where 0 fell
|
|
152
|
-
* through to an uncapped fallback (codex v1.7.0 diff-pass P1).
|
|
153
|
-
*
|
|
154
|
-
* **Input is library-only at v1.7.0.** HTTP `/v1/memories`, MCP
|
|
155
|
-
* `hippo_recall`, and `client.ts` thin-client do NOT serialize this
|
|
156
|
-
* INPUT field; remote callers cannot send `scorerWindow` and will see
|
|
157
|
-
* the store default applied. The OUTPUT `RecallResult.windowSize` is
|
|
158
|
-
* always serialized over the wire (HTTP `sendJson` ships the whole
|
|
159
|
-
* RecallResult, so remote callers receive `windowSize: 200` in the
|
|
160
|
-
* response). Transport exposure for the input planned for v1.7.1
|
|
161
|
-
* alongside the deferred-queue items that need a wider candidate pool
|
|
162
|
-
* (e.g. mean-of-children summary re-rank).
|
|
163
|
-
*/
|
|
164
|
-
scorerWindow?: number;
|
|
165
|
-
/** Candidate order. `recall` always keeps the BM25 order; `retrieve` honours this. */
|
|
166
|
-
mode?: 'bm25' | 'hybrid' | 'physics';
|
|
167
|
-
/**
|
|
168
|
-
* Restrict results to memories whose `scope` equals this value exactly.
|
|
169
|
-
*
|
|
170
|
-
* When `scope` is undefined or empty, recall applies a DEFAULT-DENY rule:
|
|
171
|
-
* any memory whose scope starts with `'slack:private:'` is filtered out so
|
|
172
|
-
* a frontend caller passing `undefined` cannot accidentally surface
|
|
173
|
-
* private-channel content. Memories with scope=null (the common case for
|
|
174
|
-
* non-Slack content) are still returned.
|
|
175
|
-
*/
|
|
176
|
-
scope?: string;
|
|
177
|
-
/**
|
|
178
|
-
* v1.5.0 DAG-aware recall. When true (default), entries that overflow the
|
|
179
|
-
* `limit` and share a level-2 parent summary cause that summary to be
|
|
180
|
-
* appended in their place, capped at ceil(limit * 0.3) extra rows. Set to
|
|
181
|
-
* false to disable and get the pre-v1.5 strict-limit behaviour.
|
|
182
|
-
*/
|
|
183
|
-
summarizeOverflow?: boolean;
|
|
184
|
-
/**
|
|
185
|
-
* v1.5.2 fresh-tail. When > 0, prepend the last N kind='raw' rows
|
|
186
|
-
* (tenant + scope filtered, dedup against the BM25 hits) so an agent's
|
|
187
|
-
* "what did I just see" recall path always covers the recent window
|
|
188
|
-
* even when the query terms don't match. Capped at 200. Default 0 = off.
|
|
189
|
-
*/
|
|
190
|
-
freshTailCount?: number;
|
|
191
|
-
/**
|
|
192
|
-
* v1.6.2 fresh-tail session scope. When set, restricts the fresh-tail
|
|
193
|
-
* window to a specific session. Without it, fresh-tail is tenant-wide,
|
|
194
|
-
* which surfaces newest rows across ALL sessions — useful for "anything
|
|
195
|
-
* new in this tenant", but wrong for "what did I just see in this one
|
|
196
|
-
* conversation". Set to ctx-supplied session id for the correct shape.
|
|
197
|
-
*/
|
|
198
|
-
freshTailSessionId?: string;
|
|
199
|
-
/**
|
|
200
|
-
* When true, include a continuity block (active task snapshot, latest matching
|
|
201
|
-
* session handoff, recent session events) on the result. Default false to keep
|
|
202
|
-
* the hot path cheap; agent boot paths should set this to true.
|
|
203
|
-
*
|
|
204
|
-
* All three lookups are tenant-scoped to ctx.tenantId via the v0.40+ store
|
|
205
|
-
* helpers. No risk of cross-tenant leak.
|
|
206
|
-
*
|
|
207
|
-
* Note: when no active snapshot exists, sessionHandoff is null and
|
|
208
|
-
* recentSessionEvents is []. We deliberately do NOT fall back to the latest
|
|
209
|
-
* tenant handoff without a session anchor, to avoid resurrecting stale state
|
|
210
|
-
* after a session ends. The explicit handoff-without-snapshot path remains
|
|
211
|
-
* `hippo session resume`.
|
|
212
|
-
*/
|
|
213
|
-
includeContinuity?: boolean;
|
|
214
|
-
/**
|
|
215
|
-
* v1.7.4 -- when set AND `(ctx.tenantId, sessionId)` has active goals AND
|
|
216
|
-
* `goalTag` is unset, `api.recall` applies the dlPFC goal-stack boost lifted
|
|
217
|
-
* from CLI cmdRecall. Pre-v1.7.4 the boost was CLI-only (env-driven via
|
|
218
|
-
* HIPPO_SESSION_ID). Undefined preserves v1.7.3 behaviour (no boost).
|
|
219
|
-
*
|
|
220
|
-
* Why on RecallOpts and not Context: Context is shared by remember/recall/
|
|
221
|
-
* assemble/outcome. Goal-stack boost is recall-scoped only.
|
|
222
|
-
*/
|
|
223
|
-
sessionId?: string;
|
|
224
|
-
/**
|
|
225
|
-
* v1.7.4 -- explicit goal-tag override. When set, the goal-stack boost is
|
|
226
|
-
* SUPPRESSED (mirrors the CLI's `goalTag === ''` gate from v0.38). Use to
|
|
227
|
-
* pin recall ranking against one specific goal/tag without the multi-goal
|
|
228
|
-
* stack interfering.
|
|
229
|
-
*/
|
|
230
|
-
goalTag?: string;
|
|
231
|
-
/**
|
|
232
|
-
* v0.33 / J1 anchoring detector. Caller-supplied snapshot of the per-
|
|
233
|
-
* (tenant, session) recall ring. When present, api.recall computes
|
|
234
|
-
* `RecallResult.anchoringHint` against this snapshot + the just-computed
|
|
235
|
-
* top-1. When undefined (default), no anchoring detection runs on the
|
|
236
|
-
* api.recall surface — but a calling pipeline (CLI cmdRecall, MCP
|
|
237
|
-
* hippo_recall) MAY compute its own hint via the shared
|
|
238
|
-
* `detectAnchoring()` helper against its own ring + top-1.
|
|
239
|
-
*
|
|
240
|
-
* Pure read: api.recall NEVER mutates the snapshot or any caller-side
|
|
241
|
-
* Map. Caller is responsible for appending to its own ring after the
|
|
242
|
-
* recall (passing the resulting hint's memoryId as `anchoredOn` to feed
|
|
243
|
-
* the cooldown logic on the NEXT recall).
|
|
244
|
-
*/
|
|
245
|
-
recallHistory?: RecallHistorySnapshot;
|
|
246
|
-
/**
|
|
247
|
-
* v1.13.x / J2 — when true, api.recall does NOT compute or emit the
|
|
248
|
-
* availabilityHint. Callers that run their OWN per-pipeline availability
|
|
249
|
-
* detection over a different result set (the MCP handler computes it over
|
|
250
|
-
* physics/hybrid results, not api.recall's BM25 band) pass this to avoid a
|
|
251
|
-
* double audit emission and a hint describing a result set the caller never
|
|
252
|
-
* surfaces. Mirrors how J1 only computes anchoring when opts.recallHistory
|
|
253
|
-
* is supplied. HTTP / direct SDK callers leave this unset and receive the hint.
|
|
254
|
-
*/
|
|
255
|
-
suppressAvailabilityHint?: boolean;
|
|
256
|
-
/**
|
|
257
|
-
* A7 recall-trace. When true, api.recall captures the lifecycle re-ranking
|
|
258
|
-
* trace (currently the goal-boost step on the primary band) and attaches it
|
|
259
|
-
* to each `RecallResultItem` as `rerankTrace`, plus `rerankPipeline:'api'`.
|
|
260
|
-
* When undefined/false (default), both fields are absent on EVERY band so
|
|
261
|
-
* the response shape is byte-identical to pre-A7. The api pipeline applies
|
|
262
|
-
* only goal-boost; the richer CLI stages (interference/value/utility/
|
|
263
|
-
* reranker/retrieval-count-downweight) are A7.2.
|
|
264
|
-
*/
|
|
265
|
-
explain?: boolean;
|
|
266
|
-
/**
|
|
267
|
-
* LC1 (docs/plans/2026-08-02-lc1-recall-trace-persistence.md) / F2 fix.
|
|
268
|
-
* When true, api.recall does NOT write a recall_traces row for this call.
|
|
269
|
-
* Mirrors `suppressAvailabilityHint`'s pattern: callers that run their OWN
|
|
270
|
-
* tracing over a DIFFERENT result set must suppress api.recall's copy so
|
|
271
|
-
* the training corpus doesn't get a trace mislabeled as 'api' pipeline
|
|
272
|
-
* when the caller's actual user-visible results came from elsewhere. Under
|
|
273
|
-
* `showRanked` it also drops the 'mcp' trace of the shown list. HTTP /
|
|
274
|
-
* direct SDK callers leave this unset and get the trace.
|
|
275
|
-
*/
|
|
276
|
-
suppressRecallTrace?: boolean;
|
|
277
|
-
/** Set only by the MCP recall tool, which ranks with its own scorer and drops copies from its own final list: this call
|
|
278
|
-
* then keeps a memory that a merged row in the same result holds word for word. Other callers leave it unset. */
|
|
279
|
-
keepHeldCopies?: boolean;
|
|
280
|
-
/** MCP recall only: `retrieve` ranks the whole scoped store and strengthens and traces (pipeline 'mcp') just the ids this returns; `results` stays the window band. */
|
|
281
|
-
showRanked?: (ranking: StoreRanking, result: RecallResult) => readonly string[];
|
|
282
|
-
}
|
|
283
|
-
/** `ranked`: every scored row, best first, goal boost applied, entries as loaded; `pool`: the store after the scope filter. */
|
|
284
|
-
export interface StoreRanking {
|
|
285
|
-
ranked: SearchResult[];
|
|
286
|
-
pool: MemoryEntry[];
|
|
287
|
-
droppedByScope: number;
|
|
288
|
-
}
|
|
289
|
-
export interface ContinuityBlock {
|
|
290
|
-
activeSnapshot: TaskSnapshot | null;
|
|
291
|
-
sessionHandoff: SessionHandoff | null;
|
|
292
|
-
recentSessionEvents: SessionEvent[];
|
|
293
|
-
}
|
|
294
|
-
export interface RecallResultItem {
|
|
295
|
-
id: string;
|
|
296
|
-
content: string;
|
|
297
|
-
score: number;
|
|
298
|
-
layer: string;
|
|
299
|
-
strength: number;
|
|
300
|
-
/**
|
|
301
|
-
* v1.5.0 DAG-aware recall (docs/plans/2026-05-05-dag-recall.md Task 2).
|
|
302
|
-
* True when this row is a level-2 topic summary substituted in for
|
|
303
|
-
* overflowed children that didn't fit the limit.
|
|
304
|
-
*/
|
|
305
|
-
isSummary?: boolean;
|
|
306
|
-
/**
|
|
307
|
-
* IDs of the overflow leaves this summary covers. Caller can drill
|
|
308
|
-
* into these via `drillDown` (Task 3) to recover the original detail.
|
|
309
|
-
*/
|
|
310
|
-
substitutedFor?: string[];
|
|
311
|
-
/** Cached descendant count from schema v25; non-zero for level-2+ rows. */
|
|
312
|
-
descendantCount?: number;
|
|
313
|
-
/**
|
|
314
|
-
* v1.5.2 fresh-tail (docs/plans/2026-05-05-dag-recall.md Task 4). True
|
|
315
|
-
* for rows surfaced via the most-recent-N kind='raw' window, NOT by the
|
|
316
|
-
* BM25 query match. Caller can render them in a separate "recent" band.
|
|
317
|
-
*/
|
|
318
|
-
isFreshTail?: boolean;
|
|
319
|
-
/**
|
|
320
|
-
* A7 recall-trace. Ordered lifecycle re-ranking steps that mutated this
|
|
321
|
-
* row's `score` after candidate generation. On the api pipeline this carries
|
|
322
|
-
* the goal-boost step (the only re-ranking api.recall applies). Populated
|
|
323
|
-
* ONLY when `RecallOpts.explain` is set; absent on the default path
|
|
324
|
-
* (additive optional, back-compat per the `windowSize?` precedent;
|
|
325
|
-
* `client.ts` deserializes `as RecallResult` so the field rides through).
|
|
326
|
-
*/
|
|
327
|
-
rerankTrace?: RerankStep[];
|
|
328
|
-
/**
|
|
329
|
-
* A7 recall-trace. Names which pipeline produced `rerankTrace`. `'api'` on
|
|
330
|
-
* every band returned by `api.recall` when `explain` is set; the CLI carries
|
|
331
|
-
* its trace on `SearchResult` instead and does not set this. Absent on the
|
|
332
|
-
* default path. Distinguishes the api pipeline (goal-boost only) from the
|
|
333
|
-
* richer CLI pipeline (A7.2 will unify them).
|
|
334
|
-
*/
|
|
335
|
-
rerankPipeline?: 'cli' | 'api';
|
|
336
|
-
}
|
|
337
|
-
export interface RecallResult {
|
|
338
|
-
results: RecallResultItem[];
|
|
339
|
-
total: number;
|
|
340
|
-
tokens: number;
|
|
341
|
-
continuity?: ContinuityBlock;
|
|
342
|
-
/**
|
|
343
|
-
* Tokens consumed by the continuity block: snapshot (task + summary + next_step)
|
|
344
|
-
* + handoff (summary + nextAction + artifacts + constraints + evidence line)
|
|
345
|
-
* + every event's full content across the last 5 events. Each measured by Math.ceil(len/4), matching
|
|
346
|
-
* the existing `tokens` count and src/search.ts estimateTokens().
|
|
347
|
-
* Undefined when continuity not requested. Callers needing a tighter budget
|
|
348
|
-
* should truncate event.content themselves before display.
|
|
349
|
-
*/
|
|
350
|
-
continuityTokens?: number;
|
|
351
|
-
/**
|
|
352
|
-
* F3 (v1.7.0): scorer window actually used for this recall. Equals
|
|
353
|
-
* `opts.scorerWindow` when set, otherwise the store-internal default
|
|
354
|
-
* (200) used by `loadSearchEntries(undefined, ...)`. Reported so
|
|
355
|
-
* callers can introspect "did the scorer see enough candidates?"
|
|
356
|
-
* without re-deriving the value.
|
|
357
|
-
*
|
|
358
|
-
* Optional in the type to keep `RecallResult` literal-construction
|
|
359
|
-
* back-compatible with pre-v1.7 test fakes / mocks (senior review P1-2).
|
|
360
|
-
* Always present on values returned by `api.recall` itself; consumers
|
|
361
|
-
* reading from `api.recall` can treat it as defined.
|
|
362
|
-
*/
|
|
363
|
-
windowSize?: number;
|
|
364
|
-
/**
|
|
365
|
-
* v1.12.13 / C5 — WYSIATI cutoff transparency. When present, gives the
|
|
366
|
-
* calling agent a per-pipeline breakdown of what was excluded from
|
|
367
|
-
* `results[]` and why. Always populated by `api.recall`, `cmdRecall`, and
|
|
368
|
-
* the MCP `hippo_recall` handler. Optional in the type for back-compat
|
|
369
|
-
* with test fakes / mocks (same pattern as `windowSize?`).
|
|
370
|
-
*
|
|
371
|
-
* Counters reflect actual filter activity in the pipeline that produced
|
|
372
|
-
* THIS specific RecallResult. api.recall counts its own filter sites;
|
|
373
|
-
* cmdRecall counts its (richer) filter sites; MCP counts the physics/
|
|
374
|
-
* hybrid pipeline's filter sites. Shape is identical across surfaces;
|
|
375
|
-
* numbers are honest per-path reports, NOT normalised cross-pipeline
|
|
376
|
-
* counts.
|
|
377
|
-
*/
|
|
378
|
-
suppressionSummary?: RecallSuppressionSummary;
|
|
379
|
-
/**
|
|
380
|
-
* v0.32 / J3.2 — auto-injected planning-fallacy hint. When the recall
|
|
381
|
-
* query carries a forward-prediction phrase ("will take ~3 days", "ship
|
|
382
|
-
* by Friday", "ETA in 2 weeks") AND the closest matching prediction
|
|
383
|
-
* class has closed historical data, this carries the base-rate stats so
|
|
384
|
-
* the calling agent sees its track record at the moment of forecasting
|
|
385
|
-
* (Lovallo-Kahneman 2003 inside-vs-outside view).
|
|
386
|
-
*
|
|
387
|
-
* Populated by `api.recall` itself via `computePlanningFallacyOutput`.
|
|
388
|
-
* Pipeline-invariant: the value depends only on (queryText, tenantId,
|
|
389
|
-
* predictions table state) — all three are identical regardless of
|
|
390
|
-
* which downstream search pipeline produces the memory list, so MCP
|
|
391
|
-
* and CLI both read this field as the single source of truth (unlike
|
|
392
|
-
* `suppressionSummary` which is per-pipeline).
|
|
393
|
-
*
|
|
394
|
-
* Optional in the type so existing test fakes / mocks of RecallResult
|
|
395
|
-
* remain valid (same pattern as `windowSize?` / `suppressionSummary?`).
|
|
396
|
-
* Disabled by setting `HIPPO_AUTODEBIAS=off`.
|
|
397
|
-
*/
|
|
398
|
-
planningFallacyHint?: PlanningFallacyHint;
|
|
399
|
-
/**
|
|
400
|
-
* v1.13.4 / J3.2 follow-up — "watching" variant emitted when the
|
|
401
|
-
* forward-claim regex matched but no baserate could be produced
|
|
402
|
-
* (either because no prediction class scored ≥ 1 on token overlap,
|
|
403
|
-
* or because ≥2 classes tied at the best score). Mutually exclusive
|
|
404
|
-
* with `planningFallacyHint`: at most one of the two is set per
|
|
405
|
-
* recall. Dogfood diary (docs/dogfood/2026-05-27-track-j-warnings.md)
|
|
406
|
-
* Trial 2a confirmed the pre-v1.13.4 silent-no-class-match path was
|
|
407
|
-
* the dominant J3.2 failure mode, because natural-language queries
|
|
408
|
-
* rarely share non-stopword tokens with class tags. The watching
|
|
409
|
-
* variant gives the agent enough signal to either re-tag the
|
|
410
|
-
* prediction or pass the suggestion through to the user.
|
|
411
|
-
*
|
|
412
|
-
* Pipeline-invariant same as `planningFallacyHint`. Honoured by
|
|
413
|
-
* api.recall, cmdRecall, and MCP handler render paths.
|
|
414
|
-
* Disabled by setting `HIPPO_AUTODEBIAS=off`.
|
|
415
|
-
*/
|
|
416
|
-
planningFallacyWatching?: PlanningFallacyWatching;
|
|
417
|
-
/**
|
|
418
|
-
* v0.33 / J1 (v1.13.2) — recall-recurrence anchoring hint. Populated
|
|
419
|
-
* when api.recall's `opts.recallHistory` snapshot + the just-computed
|
|
420
|
-
* top-1 satisfy R1 (query_repeat) or R2 (memory_dominance).
|
|
421
|
-
*
|
|
422
|
-
* Per-pipeline detection: each pipeline (api.recall, cmdRecall, MCP)
|
|
423
|
-
* computes its OWN hint against its OWN top-1. This field reflects
|
|
424
|
-
* api.recall's compute ONLY. On CLI-routed call paths cmdRecall does
|
|
425
|
-
* NOT thread its ring snapshot through `opts.recallHistory`, so this
|
|
426
|
-
* field is null on CLI-routed calls even when CLI's own hint fires
|
|
427
|
-
* (the user-visible hint there comes from cmdRecall's parallel
|
|
428
|
-
* compute, surfaced via the CLI render path + cmdSuppressionSummary).
|
|
429
|
-
* Non-null on direct SDK / HTTP-routed invocations where the caller
|
|
430
|
-
* threads its own ring snapshot.
|
|
431
|
-
*
|
|
432
|
-
* Disabled by setting `HIPPO_ANCHORING=off`.
|
|
433
|
-
*/
|
|
434
|
-
anchoringHint?: AnchoringHint;
|
|
435
|
-
/**
|
|
436
|
-
* v1.13.x / J2 — availability/recency-bias hint. Per-pipeline (computed
|
|
437
|
-
* against this pipeline's own returned top-K + the matched candidate pool
|
|
438
|
-
* it was drawn from), soft-warning ONLY: never filters, reorders, or
|
|
439
|
-
* suppresses a result. Fires when the returned slice is recency-dominated
|
|
440
|
-
* while substantially older relevant matches in the same pool were passed
|
|
441
|
-
* over. Disabled by setting `HIPPO_AVAILABILITY=off`.
|
|
442
|
-
*/
|
|
443
|
-
availabilityHint?: AvailabilityHint;
|
|
444
|
-
}
|
|
445
|
-
/**
|
|
446
|
-
* v1.12.13 / C5 — WYSIATI cutoff transparency (Track C Pineal Gland, C5).
|
|
447
|
-
*
|
|
448
|
-
* Surfaces what the recall pipeline excluded from `results[]` so the calling
|
|
449
|
-
* agent does not treat the cutoff as the full picture (Kahneman's "What You
|
|
450
|
-
* See Is All There Is" failure mode, TFAS ch. 7). Each counter reflects
|
|
451
|
-
* filter activity in the pipeline that produced this RecallResult; counts
|
|
452
|
-
* are honest per-path reports, not normalised cross-pipeline numbers.
|
|
453
|
-
*
|
|
454
|
-
* See `buildSuppressionSummary` for the shared construction helper used by
|
|
455
|
-
* all three pipelines (api.recall, cmdRecall, MCP).
|
|
456
|
-
*/
|
|
457
|
-
export interface RecallSuppressionSummary {
|
|
458
|
-
/** Total candidates loaded from the store, before any post-load filter or
|
|
459
|
-
* limit cut. Per-pipeline source:
|
|
460
|
-
* - api.recall: `all.length` immediately after `loadRecallSearchEntries`
|
|
461
|
-
* - cmdRecall: candidate count immediately after the initial load
|
|
462
|
-
* - MCP physics/hybrid: count of entries passed to physicsSearch/hybridSearch
|
|
463
|
-
*/
|
|
464
|
-
totalCandidates: number;
|
|
465
|
-
/** Candidates dropped by any non-budget filter site (pre-rank OR post-rank,
|
|
466
|
-
* but NOT the final budget cut). Field name retains the `preRank` label
|
|
467
|
-
* for the original framing; semantically: any filter drop that is not the
|
|
468
|
-
* final limit slice. Per-pipeline source:
|
|
469
|
-
* - api.recall: `all.length - entries.length` (private-scope JS filter + scope-mismatch defense; pre-rank)
|
|
470
|
-
* - cmdRecall: SUM of drops from `--as-of`, default-drop of superseded (when `--include-superseded` not set), `--filter-conflicts` (`.filter` drop only), `--outcome` (post-rank), `--layer` (post-rank). `--salience-threshold` HARD drops would also land here; current implementation is soft-rebalance only (logged in `ScoreBreakdown`, not here).
|
|
471
|
-
* - MCP physics/hybrid: scope-filter drops at the MCP handler before physicsSearch
|
|
472
|
-
*/
|
|
473
|
-
droppedPreRank: number;
|
|
474
|
-
/** Candidates loaded but excluded by the final `limit` slice after scoring.
|
|
475
|
-
* Per-pipeline source:
|
|
476
|
-
* - api.recall: `entries.length - baseSlice.length`
|
|
477
|
-
* - cmdRecall: pre-slice candidate count minus final slice count
|
|
478
|
-
* - MCP physics/hybrid: pre-slice minus post-slice at the physics/hybrid limit
|
|
479
|
-
*/
|
|
480
|
-
droppedByBudget: number;
|
|
481
|
-
/** Substituted DAG-L2 summaries added back to mitigate overflow.
|
|
482
|
-
* Per-pipeline source:
|
|
483
|
-
* - api.recall: `substituted.length` after the `summarizeOverflow` block
|
|
484
|
-
* - cmdRecall: 0 (CLI does not run summarizeOverflow)
|
|
485
|
-
* - MCP physics/hybrid: count of summary rows appended from apiResult.tailOrSummary
|
|
486
|
-
*/
|
|
487
|
-
summarySubstitutionsAdded: number;
|
|
488
|
-
/** Fresh-tail `kind='raw'` rows prepended.
|
|
489
|
-
* Per-pipeline source:
|
|
490
|
-
* - api.recall: `freshRanked.length` when `freshTailCount > 0`; else 0
|
|
491
|
-
* - cmdRecall: 0 (CLI does not currently expose fresh-tail)
|
|
492
|
-
* - MCP physics/hybrid: count of fresh-tail rows appended from apiResult.tailOrSummary
|
|
493
|
-
*/
|
|
494
|
-
freshTailAdded: number;
|
|
495
|
-
/** Counter of memories suppressed by detected interference patterns.
|
|
496
|
-
* v0.33 / J1 (v1.13.2): incremented by 1 PER PIPELINE when that
|
|
497
|
-
* pipeline's own R2 memory_dominance verdict fires (via the J1
|
|
498
|
-
* anchoring detector — see `detectAnchoring()` in src/recall-history.ts).
|
|
499
|
-
* Each pipeline (api.recall, cmdRecall, MCP physics/hybrid) bumps its
|
|
500
|
-
* OWN suppressionSummary independently because each runs its own
|
|
501
|
-
* detector against its own top-1 + its own per-(tenant, session) ring
|
|
502
|
-
* buffer. The number reflects this-pipeline interference only; not a
|
|
503
|
-
* cross-pipeline aggregate.
|
|
504
|
-
*
|
|
505
|
-
* Future B4-depth work may add additional sources (e.g. vlPFC inhibition
|
|
506
|
-
* scores). No `interference_suppression` table is built — the v1.12.13
|
|
507
|
-
* doc that referenced one was speculative; J1 uses caller-side in-memory
|
|
508
|
-
* rings instead.
|
|
509
|
-
*/
|
|
510
|
-
suppressedByInterference: number;
|
|
511
|
-
}
|
|
512
|
-
/**
|
|
513
|
-
* Shared construction helper for `RecallSuppressionSummary`. Used by
|
|
514
|
-
* `api.recall`, `cmdRecall`, and the MCP `hippo_recall` handler so all three
|
|
515
|
-
* pipelines produce the same shape without duplicating field-construction
|
|
516
|
-
* logic. Pass-through identity today; kept as a helper so future field
|
|
517
|
-
* additions (B4 interference counter wiring, etc.) land at one site.
|
|
518
|
-
*/
|
|
519
|
-
export declare function buildSuppressionSummary(counts: {
|
|
520
|
-
totalCandidates: number;
|
|
521
|
-
droppedPreRank: number;
|
|
522
|
-
droppedByBudget: number;
|
|
523
|
-
summarySubstitutionsAdded: number;
|
|
524
|
-
freshTailAdded: number;
|
|
525
|
-
suppressedByInterference: number;
|
|
526
|
-
}): RecallSuppressionSummary;
|
|
527
|
-
/**
|
|
528
|
-
* Domain-level recall. Loads BM25-ranked candidates from SQLite scoped to
|
|
529
|
-
* `ctx.tenantId` and keeps that order whatever `mode` says; `retrieve` is the
|
|
530
|
-
* mode-aware, strengthening variant the HTTP route uses.
|
|
531
|
-
*
|
|
532
|
-
* **api.recall does NOT mutate `index.last_retrieval_ids`** (v1.11.5 contract
|
|
533
|
-
* lock). The CLI `cmdRecall` (cli.ts) writes `last_retrieval_ids` because the
|
|
534
|
-
* CLI is interactive (user is about to run `hippo outcome --good`). SDK callers
|
|
535
|
-
* are programmatic: they either pass explicit ids to `api.outcome` or call
|
|
536
|
-
* `api.getContext` first for the context-then-outcome workflow (getContext
|
|
537
|
-
* DOES write `last_retrieval_ids`). Adding the side-effect here would change
|
|
538
|
-
* `api.recall` from a pure read into a read+write, breaking SDK callers who
|
|
539
|
-
* batch recall calls in a row. Locked by
|
|
540
|
-
* `tests/api-recall-no-side-effects.test.ts`.
|
|
541
|
-
*/
|
|
542
|
-
export declare function recall(ctx: Context, opts: RecallOpts): RecallResult;
|
|
543
|
-
/** Mode-aware recall that strengthens each returned row; never writes last_retrieval_ids (v1.11.5 lock). */
|
|
544
|
-
export declare function retrieve(ctx: Context, opts: RecallOpts): Promise<RecallResult>;
|
|
545
|
-
export interface AssembleOpts {
|
|
546
|
-
/** Token budget. Default 4000. */
|
|
547
|
-
budget?: number;
|
|
548
|
-
/** Recent raw rows always kept verbatim. Default 10. */
|
|
549
|
-
freshTailCount?: number;
|
|
550
|
-
/** Substitute parent summaries for older raws when ≥2 share a level-2
|
|
551
|
-
* ancestor. Default true. */
|
|
552
|
-
summarizeOlder?: boolean;
|
|
553
|
-
/**
|
|
554
|
-
* Restrict to a specific scope. v1.6.1 senior-review P1 #3 parity with
|
|
555
|
-
* `recall`: when set, exact match required (so an authorised caller can
|
|
556
|
-
* assemble a `slack:private:CSEC` session by passing scope explicitly).
|
|
557
|
-
* When undefined, default-deny applies to ANY `<source>:private:*` and
|
|
558
|
-
* `unknown:legacy` rows.
|
|
559
|
-
*/
|
|
560
|
-
scope?: string;
|
|
561
|
-
/**
|
|
562
|
-
* Hard row cap on the SELECT that loads session raws. Default 5000 to
|
|
563
|
-
* protect against degenerate sessions. When the cap is hit, `truncated`
|
|
564
|
-
* is set on the result so the caller knows to widen.
|
|
565
|
-
*/
|
|
566
|
-
rowCap?: number;
|
|
567
|
-
cost?: AssembleCost;
|
|
568
|
-
}
|
|
569
|
-
export interface AssembleCost {
|
|
570
|
-
item: (it: AssembledContextItem) => number;
|
|
571
|
-
fixed: (widest: number) => number;
|
|
572
|
-
}
|
|
573
|
-
export interface AssembledContextItem {
|
|
574
|
-
id: string;
|
|
575
|
-
content: string;
|
|
576
|
-
/** ISO timestamp of the source row's `created` field (or `earliest_at`
|
|
577
|
-
* for substituted summaries). */
|
|
578
|
-
createdAt: string;
|
|
579
|
-
/** Fresh-tail protected window (last freshTailCount raws). */
|
|
580
|
-
isFreshTail?: boolean;
|
|
581
|
-
/** Level-2 summary substituted for older raw rows that share a parent. */
|
|
582
|
-
isSummary?: boolean;
|
|
583
|
-
/** When isSummary, the raw ids this summary covers. drillDown
|
|
584
|
-
* recovers the originals. */
|
|
585
|
-
substitutedFor?: string[];
|
|
586
|
-
/** Decay × retrieval × emotional. Lets callers render a confidence
|
|
587
|
-
* hint without re-deriving from MemoryEntry. */
|
|
588
|
-
strength: number;
|
|
589
|
-
}
|
|
590
|
-
export interface AssembleResult {
|
|
591
|
-
sessionId: string;
|
|
592
|
-
items: AssembledContextItem[];
|
|
593
|
-
tokens: number;
|
|
594
|
-
/**
|
|
595
|
-
* Tenant + scope-filtered raw row count for the session — what the caller
|
|
596
|
-
* could have seen given their grant. Pre-v1.6.1 was pre-filter (confusing
|
|
597
|
-
* for all-private sessions); pre-v1.6.3 was capped (under-reported on
|
|
598
|
-
* sessions > rowCap). v1.6.3 reports the FULL post-filter count via a
|
|
599
|
-
* separate COUNT(*) query so consumers can render "session has N msgs"
|
|
600
|
-
* accurately even when items[] is the windowed view.
|
|
601
|
-
*/
|
|
602
|
-
totalRaw: number;
|
|
603
|
-
summarized: number;
|
|
604
|
-
evicted: number;
|
|
605
|
-
/**
|
|
606
|
-
* True when `rowCap` truncated the loaded window. With v1.6.2's NEWEST-cap
|
|
607
|
-
* semantics, the items[] array represents the freshest tail of the session;
|
|
608
|
-
* older rows beyond the cap are silently absent. Use `totalRaw - items.length
|
|
609
|
-
* - summarized + ...` to estimate how much you didn't see, or widen `rowCap`.
|
|
610
|
-
*/
|
|
611
|
-
truncated: boolean;
|
|
612
|
-
}
|
|
613
|
-
/**
|
|
614
|
-
* Build a chronologically-ordered context window for a session. Adapts the
|
|
615
|
-
* lossless-claw context-engine pattern to Hippo's score-ranked memory store.
|
|
616
|
-
*
|
|
617
|
-
* Algorithm:
|
|
618
|
-
* 1. Load all kind='raw' rows for the session, tenant + scope filtered.
|
|
619
|
-
* 2. Split: newest `freshTailCount` are protected (fresh tail).
|
|
620
|
-
* 3. For older rows, when ≥2 share a level-2 parent, substitute the
|
|
621
|
-
* summary; everything else passes through as raw.
|
|
622
|
-
* 4. Hippo-additive eviction: when over-budget, drop the lowest-strength
|
|
623
|
-
* non-fresh-tail item first. Fresh-tail rows are never evicted.
|
|
624
|
-
*
|
|
625
|
-
* Strength-weighted eviction is the differentiator from lossless-claw,
|
|
626
|
-
* which evicts oldest-first. A high-strength older row (high retrieval
|
|
627
|
-
* count, slow decay) survives; a low-strength recent row (newer but
|
|
628
|
-
* unimportant) goes first.
|
|
629
|
-
*
|
|
630
|
-
* Returns `items: []` cleanly when:
|
|
631
|
-
* - sessionId is empty
|
|
632
|
-
* - no raws exist for the session
|
|
633
|
-
* - all rows fail the scope/tenant filter
|
|
634
|
-
*/
|
|
635
|
-
export declare function assemble(ctx: Context, sessionId: string, opts?: AssembleOpts): AssembleResult;
|
|
636
|
-
export interface DrillDownOpts {
|
|
637
|
-
/** Cap on number of children returned. Default 50. */
|
|
638
|
-
limit?: number;
|
|
639
|
-
/**
|
|
640
|
-
* Optional token budget. When set, children are appended in chronological
|
|
641
|
-
* order (created ASC) until adding the next child would exceed the budget.
|
|
642
|
-
* Token cost = the child's printed line under `cost`, else ceil(content.length / 4).
|
|
643
|
-
*
|
|
644
|
-
* For depth > 1, the budget is GLOBAL cumulative (NOT per-level).
|
|
645
|
-
*/
|
|
646
|
-
budget?: number;
|
|
647
|
-
/**
|
|
648
|
-
* v0.30 / E5 — walk N levels down (default 1 = direct children only).
|
|
649
|
-
* Higher values include children of children, etc. Internal hard cap 10
|
|
650
|
-
* to prevent pathological depth walks. BFS uses visited Set for dedup
|
|
651
|
-
* (defensive against shared-child data anomalies; DAG is acyclic by
|
|
652
|
-
* construction).
|
|
653
|
-
*/
|
|
654
|
-
depth?: number;
|
|
655
|
-
cost?: DrillDownCost;
|
|
656
|
-
}
|
|
657
|
-
export interface DrillDownSummary {
|
|
658
|
-
id: string;
|
|
659
|
-
content: string;
|
|
660
|
-
descendantCount: number;
|
|
661
|
-
earliestAt: string | null;
|
|
662
|
-
latestAt: string | null;
|
|
663
|
-
}
|
|
664
|
-
export interface DrillDownChild {
|
|
665
|
-
id: string;
|
|
666
|
-
content: string;
|
|
667
|
-
layer: string;
|
|
668
|
-
dagLevel: number;
|
|
669
|
-
created: string;
|
|
670
|
-
}
|
|
671
|
-
export interface DrillDownCost {
|
|
672
|
-
child: (c: DrillDownChild) => number;
|
|
673
|
-
fixed: (summary: DrillDownSummary, widest: number) => number;
|
|
674
|
-
}
|
|
675
|
-
export interface DrillDownResult {
|
|
676
|
-
summary: DrillDownSummary;
|
|
677
|
-
children: DrillDownChild[];
|
|
678
|
-
totalChildren: number;
|
|
679
|
-
truncated: boolean;
|
|
680
|
-
}
|
|
681
|
-
/**
|
|
682
|
-
* v1.6.4 discriminated failure shape. Two reasons distinguishable:
|
|
683
|
-
* - `not_found`: covers genuinely-missing, wrong-tenant, AND
|
|
684
|
-
* scope-blocked (codex round 3 P1 — distinguishing scope_blocked
|
|
685
|
-
* from not_found on non-HTTP surfaces leaked private-row existence
|
|
686
|
-
* to no-scope callers, even though the HTTP route already collapsed
|
|
687
|
-
* them. Collapse at the API layer.)
|
|
688
|
-
* - `not_drillable`: id is a leaf row (level 0/1). Caller-actionable.
|
|
689
|
-
*
|
|
690
|
-
* If a future drillDown gains a `scope` opt for explicit-scope callers,
|
|
691
|
-
* a `scope_blocked` failure could be safely re-introduced ONLY for that
|
|
692
|
-
* code path (caller already proved authorization by passing a scope).
|
|
693
|
-
*/
|
|
694
|
-
export interface DrillDownFailure {
|
|
695
|
-
failure: 'not_found' | 'not_drillable';
|
|
696
|
-
}
|
|
697
|
-
export type DrillDownOutcome = DrillDownResult | DrillDownFailure;
|
|
698
|
-
/**
|
|
699
|
-
* Walk one step down the DAG from a level-2 (or higher) summary to its direct
|
|
700
|
-
* children. Companion to `recall(... summarizeOverflow: true)` — when recall
|
|
701
|
-
* surfaces a summary with `substitutedFor: [...]`, the caller drills into the
|
|
702
|
-
* summary id to recover the original detail.
|
|
703
|
-
*
|
|
704
|
-
* Tenant scope: only summaries owned by `ctx.tenantId` are reachable. The same
|
|
705
|
-
* scope filter that recall applies is enforced on the children — a level-2
|
|
706
|
-
* summary in `slack:public:CGEN` cannot leak `slack:private:*` children even
|
|
707
|
-
* if the underlying DAG accidentally linked across scopes.
|
|
708
|
-
*
|
|
709
|
-
* Returns a discriminated `DrillDownOutcome`: `DrillDownResult` on success,
|
|
710
|
-
* or `{failure: '...'}` for `not_found` (covers genuinely-missing AND wrong-
|
|
711
|
-
* tenant, intentionally indistinguishable), `not_drillable` (id is a leaf
|
|
712
|
-
* row), or `scope_blocked` (caller has no scope grant for the row's scope).
|
|
713
|
-
*
|
|
714
|
-
* Pre-v1.6.4 returned null for all four cases. JS callers migrate via
|
|
715
|
-
* `'failure' in result` checks; HTTP route maps `not_drillable` to 422.
|
|
716
|
-
*/
|
|
717
|
-
export declare function drillDown(ctx: Context, summaryId: string, opts?: DrillDownOpts): DrillDownOutcome;
|
|
718
|
-
/**
|
|
719
|
-
* Apply a positive/negative outcome to a list of recently-recalled memory ids.
|
|
720
|
-
* Used by the MCP `hippo_outcome` tool and the HTTP `POST /v1/outcome` route.
|
|
721
|
-
* Tenant-scoped: ids that don't belong to ctx.tenantId are silently skipped
|
|
722
|
-
* (matches the prior MCP semantics — a stale id from another tenant doesn't
|
|
723
|
-
* crash the call). Each successful outcome emits one audit_log row with
|
|
724
|
-
* op='outcome' tagged with ctx.actor.subject.
|
|
725
|
-
*
|
|
726
|
-
* Returns `{applied, appliedIds}`. `appliedIds` is the tenant-filtered subset
|
|
727
|
-
* of input ids that actually had `applyOutcome` run on them (i.e. ids whose
|
|
728
|
-
* `readEntry(..., ctx.tenantId)` resolved). Callers that surface the id list
|
|
729
|
-
* over a multi-tenant boundary (HTTP /v1/outcome last-recall path, Python SDK)
|
|
730
|
-
* MUST return `appliedIds` instead of the raw input list — otherwise the
|
|
731
|
-
* non-applied (cross-tenant) ids leak to the caller. Added in v1.11.4 to
|
|
732
|
-
* close that disclosure path on POST /v1/outcome.
|
|
733
|
-
*
|
|
734
|
-
* `opts.traceId` (LC1, docs/plans/2026-08-02-lc1-recall-trace-persistence.md):
|
|
735
|
-
* OPTIONAL additive opt so a programmatic caller can link this outcome to
|
|
736
|
-
* the recall_traces row it judges. NOT applied unconditionally — an SDK
|
|
737
|
-
* caller passing explicit ids with no preceding CLI/context recall would
|
|
738
|
-
* otherwise get linked to a stale, unrelated trace. `outcomeForLastRecall`
|
|
739
|
-
* supplies this automatically from `last_trace_id`; every other caller
|
|
740
|
-
* (server.ts explicit-ids path, MCP hippo_outcome) omits it and gets no
|
|
741
|
-
* linkage, which is correct.
|
|
742
|
-
*/
|
|
743
|
-
export interface OutcomeResult {
|
|
744
|
-
applied: number;
|
|
745
|
-
appliedIds: string[];
|
|
746
|
-
}
|
|
747
|
-
export declare function outcome(ctx: Context, ids: ReadonlyArray<string>, good: boolean, opts?: {
|
|
748
|
-
traceId?: number;
|
|
749
|
-
}): OutcomeResult;
|
|
750
|
-
/**
|
|
751
|
-
* Delete a memory by id. `deleteEntry` threads ctx.actor.subject into its internal
|
|
752
|
-
* audit hook, so exactly one 'forget' event lands with the supplied actor.
|
|
753
|
-
*
|
|
754
|
-
* Tenant scope: deleteEntry looks up the row by id alone, so without an
|
|
755
|
-
* explicit tenant guard a Bearer for tenant A could delete tenant B's row
|
|
756
|
-
* by guessing or leaking the id. Pre-check the row's tenant_id and deny
|
|
757
|
-
* cross-tenant access with a not-found error (no info leak about whether
|
|
758
|
-
* the id exists in another tenant).
|
|
759
|
-
*/
|
|
760
|
-
export interface ForgetResult {
|
|
761
|
-
ok: true;
|
|
762
|
-
id: string;
|
|
763
|
-
}
|
|
764
|
-
export declare function forget(ctx: Context, id: string): ForgetResult;
|
|
765
|
-
export interface RejectOpts {
|
|
766
|
-
/** By-id form: reject the CURRENT content of an existing memory. */
|
|
767
|
-
memoryId?: string;
|
|
768
|
-
/** Pre-emptive form: reject a value not currently stored (or already gone). */
|
|
769
|
-
value?: string;
|
|
770
|
-
/** Required — the tombstone stores no content; reason is its only identity. */
|
|
771
|
-
reason: string;
|
|
772
|
-
}
|
|
773
|
-
export interface RejectResult {
|
|
774
|
-
digest: string;
|
|
775
|
-
removedIds: string[];
|
|
776
|
-
}
|
|
777
|
-
/**
|
|
778
|
-
* Reject a value: tombstone its normalized digest so a matching write is
|
|
779
|
-
* refused everywhere (remember/capture/import/sync) until `unreject`. Two
|
|
780
|
-
* forms — pass exactly one:
|
|
781
|
-
* - `memoryId`: reject the CURRENT content of an existing memory. Removes
|
|
782
|
-
* that row and every other live row in the tenant whose normalized
|
|
783
|
-
* digest matches (not just the id passed).
|
|
784
|
-
* - `value`: pre-emptive form — tombstone content that may not currently
|
|
785
|
-
* be stored (or is already gone). Zero removals.
|
|
786
|
-
*
|
|
787
|
-
* `reason` is required (the tombstone stores no content; reason is its
|
|
788
|
-
* only human-readable identity). Throws if the memory id is not found in
|
|
789
|
-
* `ctx.tenantId`, or if both/neither of `memoryId`/`value` are given.
|
|
790
|
-
*/
|
|
791
|
-
export declare function reject(ctx: Context, opts: RejectOpts): RejectResult;
|
|
792
|
-
/**
|
|
793
|
-
* Delete a tombstone by exact digest or unambiguous prefix, restoring the
|
|
794
|
-
* value's writability — the only v1 escape hatch (no per-write force flag).
|
|
795
|
-
* Throws if `digestOrPrefix` matches no tombstone, is blank, or matches
|
|
796
|
-
* more than one (use a longer prefix).
|
|
797
|
-
*/
|
|
798
|
-
export declare function unreject(ctx: Context, digestOrPrefix: string): {
|
|
799
|
-
ok: boolean;
|
|
800
|
-
digest: string;
|
|
801
|
-
};
|
|
802
|
-
/** List every rejected-value tombstone for `ctx.tenantId`, newest first. */
|
|
803
|
-
export declare function listRejections(ctx: Context): RejectedValueRow[];
|
|
804
|
-
/**
|
|
805
|
-
* Copy a local memory into the global store. Mirrors `cmdPromote` in cli.ts:
|
|
806
|
-
* the `writeEntry` inside `promoteToGlobal` emits a 'remember' on the global
|
|
807
|
-
* db; we add a 'promote' audit event on the global db so the user-facing
|
|
808
|
-
* intent stays distinct from the underlying upsert.
|
|
809
|
-
*
|
|
810
|
-
* Note: `promoteToGlobal` does not currently take a tenantId override — it
|
|
811
|
-
* reads the entry from the local root via `readEntry` (no tenant filter) and
|
|
812
|
-
* preserves the entry's existing tenantId on the global side. Task 4 may
|
|
813
|
-
* tighten this once writeEntry/readEntry thread tenant context.
|
|
814
|
-
*/
|
|
815
|
-
export interface PromoteResult {
|
|
816
|
-
ok: true;
|
|
817
|
-
sourceId: string;
|
|
818
|
-
globalId: string;
|
|
819
|
-
}
|
|
820
|
-
export declare function promote(ctx: Context, id: string): PromoteResult;
|
|
821
|
-
/**
|
|
822
|
-
* Replace an old memory with new content, chaining old.superseded_by = new.id.
|
|
823
|
-
* Mirrors `cmdSupersede` in cli.ts (without flag-driven layer/tag/pin overrides
|
|
824
|
-
* — A1 keeps the API minimal; the CLI handler will continue to handle those
|
|
825
|
-
* flags and pass the resolved values once Task 4 lands).
|
|
826
|
-
*/
|
|
827
|
-
export interface SupersedeResult {
|
|
828
|
-
ok: true;
|
|
829
|
-
oldId: string;
|
|
830
|
-
newId: string;
|
|
831
|
-
}
|
|
832
|
-
export declare function supersede(ctx: Context, oldId: string, newContent: string): SupersedeResult;
|
|
833
|
-
/**
|
|
834
|
-
* Archive a kind='raw' memory: snapshot into raw_archive, mark archived, delete.
|
|
835
|
-
*
|
|
836
|
-
* `archiveRawMemory` audits the operation internally (op='archive_raw') using the
|
|
837
|
-
* row's own tenant_id. We DO NOT emit a second audit event here to avoid double-
|
|
838
|
-
* emitting the archive_raw op (unlike Task 1 remember/forget where the underlying
|
|
839
|
-
* helpers hardcode actor='cli'). Instead we pass `ctx.actor.subject` through as `who`,
|
|
840
|
-
* and raw-archive.ts uses that for the audit row.
|
|
841
|
-
*/
|
|
842
|
-
export interface ArchiveRawOpts {
|
|
843
|
-
/**
|
|
844
|
-
* Connector idempotency hook (v0.39 commit 3). Runs inside the same
|
|
845
|
-
* SAVEPOINT as the archive — throwing rolls the archive back. Used by the
|
|
846
|
-
* Slack deletion connector to mark the deletion event seen atomically.
|
|
847
|
-
*/
|
|
848
|
-
afterArchive?: (db: DatabaseSyncLike, archivedMemoryId: string) => void;
|
|
849
|
-
}
|
|
850
|
-
export interface ArchiveRawResult {
|
|
851
|
-
ok: true;
|
|
852
|
-
archivedAt: string;
|
|
853
|
-
}
|
|
854
|
-
export declare function archiveRaw(ctx: Context, id: string, reason: string, opts?: ArchiveRawOpts): ArchiveRawResult;
|
|
855
|
-
export interface AuthCreateOpts {
|
|
856
|
-
label?: string;
|
|
857
|
-
/**
|
|
858
|
-
* v1.12.3: authorization role for the new key. Defaults to `'admin'` for
|
|
859
|
-
* back-compat with v1.12.0-v1.12.2 (the api_keys.role column DEFAULT also
|
|
860
|
-
* resolves to 'admin' if omitted from the INSERT). Member keys are
|
|
861
|
-
* 403-blocked from admin-gated routes (e.g. `POST /v1/sleep`).
|
|
862
|
-
*/
|
|
863
|
-
role?: 'admin' | 'member';
|
|
864
|
-
}
|
|
865
|
-
export interface AuthCreateResult {
|
|
866
|
-
keyId: string;
|
|
867
|
-
plaintext: string;
|
|
868
|
-
tenantId: string;
|
|
869
|
-
/** v1.12.3: the role bound to the new key (admin | member). */
|
|
870
|
-
role: 'admin' | 'member';
|
|
871
|
-
}
|
|
872
|
-
/**
|
|
873
|
-
* Mint a new API key. The new key is ALWAYS bound to `ctx.tenantId`. Callers
|
|
874
|
-
* cannot override the tenant via the opts bag — a previous `tenantId` field
|
|
875
|
-
* was removed because the HTTP layer would happily forward `body.tenantId`,
|
|
876
|
-
* letting tenant A mint a key for tenant B. The HTTP route handler at
|
|
877
|
-
* `src/server.ts` POST /v1/auth/keys mirrors this: it ignores any body
|
|
878
|
-
* `tenantId` and uses the resolved Bearer's tenant exclusively.
|
|
879
|
-
*
|
|
880
|
-
* Only an admin actor can mint (ForbiddenError otherwise), and a key never
|
|
881
|
-
* outranks its minter: a resolver admin is tenant-only, so it mints members.
|
|
882
|
-
*/
|
|
883
|
-
export declare function authCreate(ctx: Context, opts: AuthCreateOpts): AuthCreateResult;
|
|
884
|
-
/**
|
|
885
|
-
* List API keys visible to the calling tenant.
|
|
886
|
-
*
|
|
887
|
-
* Divergence from `cmdAuthList` in src/cli.ts: the CLI today returns ALL keys
|
|
888
|
-
* regardless of tenant (single-tenant deployments). The API surface is tenant-
|
|
889
|
-
* scoped because future multi-tenant deployments will share a hippoRoot, and
|
|
890
|
-
* tenant A must not see tenant B's keys. Read-only — no audit emit (matches A5).
|
|
891
|
-
*/
|
|
892
|
-
export declare function authList(ctx: Context, opts: {
|
|
893
|
-
active: boolean;
|
|
894
|
-
}): ApiKeyListItem[];
|
|
895
|
-
/**
|
|
896
|
-
* Revoke an API key.
|
|
897
|
-
*
|
|
898
|
-
* Security: the key must belong to `ctx.tenantId`. Cross-tenant revoke is
|
|
899
|
-
* rejected with the "not found" message used for missing keys, and a member may
|
|
900
|
-
* revoke only its own key (checked first), so no caller can probe other key_ids.
|
|
901
|
-
*
|
|
902
|
-
* Audit: emits 'auth_revoke' with `tenantId` set to the KEY ROW's tenant_id
|
|
903
|
-
* (M1 fix from A5 review, mirrors src/cli.ts:cmdAuthRevoke). Skipped on no-op
|
|
904
|
-
* revoke (already revoked) so re-running doesn't pad the audit log.
|
|
905
|
-
*/
|
|
906
|
-
export interface AuthRevokeResult {
|
|
907
|
-
ok: true;
|
|
908
|
-
revokedAt: string;
|
|
909
|
-
}
|
|
910
|
-
export declare function authRevoke(ctx: Context, keyId: string): AuthRevokeResult;
|
|
911
|
-
/** Shared result shape for authGrant/authUngrant, named per the file's oxlint anti-slop rule. */
|
|
912
|
-
export interface AuthGrantResult {
|
|
913
|
-
ok: true;
|
|
914
|
-
}
|
|
915
|
-
/** Grant `keyId` read access to one restricted `scope` (ROADMAP Part VIII EI2). Admin only. */
|
|
916
|
-
export declare function authGrant(ctx: Context, keyId: string, scope: string): AuthGrantResult;
|
|
917
|
-
/** Revoke `keyId`'s grant on `scope`. Same authorization and lookup rules as authGrant. */
|
|
918
|
-
export declare function authUngrant(ctx: Context, keyId: string, scope: string): AuthGrantResult;
|
|
919
|
-
export interface AuditListOpts {
|
|
920
|
-
op?: AuditOp;
|
|
921
|
-
/** ISO timestamp lower bound. */
|
|
922
|
-
since?: string;
|
|
923
|
-
limit?: number;
|
|
924
|
-
}
|
|
925
|
-
/**
|
|
926
|
-
* Read audit events scoped to `ctx.tenantId`. Read-only — no audit emit (matches
|
|
927
|
-
* A5: cmdAuditList does not record a 'recall'-style read event).
|
|
928
|
-
*/
|
|
929
|
-
export declare function auditList(ctx: Context, opts: AuditListOpts): AuditEvent[];
|
|
930
|
-
/**
|
|
931
|
-
* Options for `getContext` — assemble a budget-bounded context bundle
|
|
932
|
-
* (recalled memories + active task snapshot + handoff + recent events).
|
|
933
|
-
* Extracted from `cmdContext` in `cli.ts` in Episode A of the api.ts refactor.
|
|
934
|
-
*
|
|
935
|
-
* Named `getContext` (not `context`) to avoid collision with the `Context`
|
|
936
|
-
* interface above and the ubiquitous `ctx: Context` convention. Follows the
|
|
937
|
-
* existing `getEntry` naming pattern in store.ts.
|
|
938
|
-
*
|
|
939
|
-
* Scope narrow (T5 execute decision): rendering opts (`format`, `framing`,
|
|
940
|
-
* `rendered`) and host-side opts (`auto`) are NOT included here. The print
|
|
941
|
-
* helpers (`printContextMarkdown`, `printActiveTaskSnapshot`, `printHandoff`,
|
|
942
|
-
* `printSessionEvents`) are shared with `cmdRecall` / `cmdSnapshot` /
|
|
943
|
-
* `cmdHandoffShow` — moving them into api.ts would expand T5 to also rewire
|
|
944
|
-
* those commands. CLI handles rendering + auto-resolution. Episode B can add
|
|
945
|
-
* `api.renderContext` once a shared rendering need actually materializes.
|
|
946
|
-
*/
|
|
947
|
-
export interface ContextOpts {
|
|
948
|
-
q?: string;
|
|
949
|
-
/** Default 1500 tokens. */
|
|
950
|
-
budget?: number;
|
|
951
|
-
limit?: number;
|
|
952
|
-
pinnedOnly?: boolean;
|
|
953
|
-
scope?: string;
|
|
954
|
-
/** Envelope scope to match exactly, as in `recall`: admits that scope even when private, after the actor's scope check. */
|
|
955
|
-
exactScope?: string;
|
|
956
|
-
/** With `pinnedOnly`, also inject the N most recent writes that pass the
|
|
957
|
-
* quality floor (`isContentWorthStoring`, DF3). Filtering happens BEFORE
|
|
958
|
-
* the take-N, so a caller asking for 5 gets 5 qualifying entries rather
|
|
959
|
-
* than 5-minus-junk; pinned entries bypass the floor. Entries are only
|
|
960
|
-
* skipped for this read, never mutated or deleted. Ignored when
|
|
961
|
-
* `pinnedOnly` is false — no other path reads it. */
|
|
962
|
-
includeRecent?: number;
|
|
963
|
-
/** v39 memory scope isolation: re-include other-project memories that the
|
|
964
|
-
* origin partition excludes by default. They come back tagged
|
|
965
|
-
* `category: 'cross-project'` so renderers can demarcate them. */
|
|
966
|
-
crossProject?: boolean;
|
|
967
|
-
/** The active project name for the origin partition ('' = not in a
|
|
968
|
-
* project). Defaults to `resolveProjectIdentity(process.cwd()).name`;
|
|
969
|
-
* surfaces whose process cwd is not the caller's project (HTTP server)
|
|
970
|
-
* should pass it explicitly. */
|
|
971
|
-
currentProject?: string;
|
|
972
|
-
/** DF1 (docs/plans/2026-08-23-df1-snapshot-lifecycle.md, T2): the calling
|
|
973
|
-
* session's id. Stamped on this call's recall trace, and the owner-match input to
|
|
974
|
-
* `loadFreshActiveTaskSnapshot` — when it strictly equals the active
|
|
975
|
-
* snapshot's `session_id`, the read is unbounded (same-session
|
|
976
|
-
* continuity); otherwise the snapshot must pass the freshness bound to
|
|
977
|
-
* surface. Absent (undefined/null/'') never short-circuits as a match;
|
|
978
|
-
* it just means every snapshot goes through the age check. Host-resolved
|
|
979
|
-
* (stdin payload, HIPPO_SESSION_ID, else the host's session var) so this stays host-agnostic. */
|
|
980
|
-
currentSessionId?: string | null;
|
|
981
|
-
/** Z1: raw hook-payload prompt; only the pinned-only branch reads it, gated on `pinnedInject.promptRecall`. */
|
|
982
|
-
prompt?: string;
|
|
983
|
-
/** What the budget pays for, from the caller that renders the block. Absent = the memory text alone. */
|
|
984
|
-
cost?: ContextCost;
|
|
985
|
-
/** @internal The CLI's delivery-ledger observer; it only reads, so selection is the same with or without it. */
|
|
986
|
-
deliveryObserver?: DeliveryObserver;
|
|
987
|
-
}
|
|
988
|
-
/** Budget prices in the text a caller prints, so the budget bounds what reaches the model. */
|
|
989
|
-
export interface ContextCost {
|
|
990
|
-
/** Tokens of one entry as printed. */
|
|
991
|
-
entry: (item: Pick<ContextResultEntry, 'entry' | 'isGlobal' | 'promptRecall' | 'origin' | 'category'>) => number;
|
|
992
|
-
/** Tokens of the headers and footer the block can print at this budget, reserved before any entry. */
|
|
993
|
-
fixed: (budget: number, can: {
|
|
994
|
-
cross: boolean;
|
|
995
|
-
promptRecall: boolean;
|
|
996
|
-
ambient: boolean;
|
|
997
|
-
}) => number;
|
|
998
|
-
/** Tokens of the sections printed ahead of the memories, each as printed. */
|
|
999
|
-
snapshot: (s: TaskSnapshot) => number;
|
|
1000
|
-
handoff: (h: SessionHandoff) => number;
|
|
1001
|
-
trail: (events: SessionEvent[]) => number;
|
|
1002
|
-
}
|
|
1003
|
-
export interface ContextResultEntry {
|
|
1004
|
-
entry: MemoryEntry;
|
|
1005
|
-
score: number;
|
|
1006
|
-
/** What this entry cost the budget: its printed line under `ContextOpts.cost`, else its memory text. */
|
|
1007
|
-
tokens: number;
|
|
1008
|
-
isGlobal?: boolean;
|
|
1009
|
-
isFreshTail?: boolean;
|
|
1010
|
-
/** Z1: admitted by the prompt-recall gate, not the recent-N backfill or a pin. */
|
|
1011
|
-
promptRecall?: boolean;
|
|
1012
|
-
/** v39: the entry's owning project ('' = user-global, null = legacy row). */
|
|
1013
|
-
origin?: string | null;
|
|
1014
|
-
/** v39: how the origin relates to the active project. 'cross-project'
|
|
1015
|
-
* entries only appear when ContextOpts.crossProject was set (or isolation
|
|
1016
|
-
* is disabled). */
|
|
1017
|
-
category?: 'project' | 'user-global' | 'cross-project';
|
|
1018
|
-
}
|
|
1019
|
-
export interface ContextResult {
|
|
1020
|
-
entries: ContextResultEntry[];
|
|
1021
|
-
tokens: number;
|
|
1022
|
-
activeSnapshot?: TaskSnapshot | null;
|
|
1023
|
-
sessionHandoff?: SessionHandoff | null;
|
|
1024
|
-
recentEvents?: SessionEvent[];
|
|
1025
|
-
/** The ambient landscape summary over the admitted entries. Present only
|
|
1026
|
-
* when the store's ambient config is on, the caller is not pinned-only,
|
|
1027
|
-
* and at least one entry was admitted. */
|
|
1028
|
-
ambientState?: AmbientState;
|
|
1029
|
-
}
|
|
1030
|
-
/**
|
|
1031
|
-
* Assemble a context bundle: recalled memories (pinned-only / strength-sorted
|
|
1032
|
-
* fallback / hybrid search) + active task snapshot + session handoff + recent
|
|
1033
|
-
* session events. Budget-bounded, tenant-scoped. Mutates `last_retrieval_ids`
|
|
1034
|
-
* + emits a 'recall' audit row for non-pinned, non-'*' queries.
|
|
1035
|
-
*
|
|
1036
|
-
* Behaves like the pre-extraction `cmdContext` data-loading + selection
|
|
1037
|
-
* pipeline. CLI presentation (markdown / json / additional-context rendering)
|
|
1038
|
-
* stays in `cli.ts`.
|
|
1039
|
-
*
|
|
1040
|
-
* Tenant scope: all `loadAllEntries` / snapshot / handoff / events reads use
|
|
1041
|
-
* `ctx.tenantId`. Cross-tenant rows are filtered out.
|
|
1042
|
-
*
|
|
1043
|
-
* Returns an empty result (`entries: []`, snapshot/handoff/events undefined)
|
|
1044
|
-
* when there's nothing to surface (no memories AND no snapshot AND no handoff
|
|
1045
|
-
* AND no recent events).
|
|
1046
|
-
*/
|
|
1047
|
-
export declare function getContext(ctx: Context, opts?: ContextOpts): Promise<ContextResult>;
|
|
1048
|
-
/**
|
|
1049
|
-
* Options for `sleep` — run the pure-storage consolidation pipeline
|
|
1050
|
-
* (consolidate + dedup + audit + share + ambient) and return structured counts.
|
|
1051
|
-
*
|
|
1052
|
-
* Extracted from `cmdSleepCore` Phase 2-6 in Episode A. NOT covered by api.sleep:
|
|
1053
|
-
* the cli-only auto-learn phase (Phase 1: learnFromRepo + the agent memory import),
|
|
1054
|
-
* which is intrinsically host-bound (uses `process.cwd()` / `os.homedir()`).
|
|
1055
|
-
* Auto-learn stays in cli.ts cmdSleepCore as a pre-api block.
|
|
1056
|
-
*
|
|
1057
|
-
* The CLI `cmdSleep` wrapper continues to own the log-file tee + console
|
|
1058
|
-
* rendering + `process.exit`; `api.sleep` is pure (no console.log, no IO
|
|
1059
|
-
* beyond the store).
|
|
1060
|
-
*/
|
|
1061
|
-
export interface SleepOpts {
|
|
1062
|
-
dryRun?: boolean;
|
|
1063
|
-
noShare?: boolean;
|
|
1064
|
-
/**
|
|
1065
|
-
* @internal Test-only DI seam — see `tests/api-sleep-phase-faults.test.ts`.
|
|
1066
|
-
* Override one or more phase dependencies (typically a throwing stub) to
|
|
1067
|
-
* force mid-phase failure paths deterministically. Production callers
|
|
1068
|
-
* MUST NOT use this field. The runtime defaults at `DEFAULT_SLEEP_PHASES`
|
|
1069
|
-
* preserve all current behaviour when `__phases` is undefined.
|
|
1070
|
-
*/
|
|
1071
|
-
__phases?: Partial<SleepPhases>;
|
|
1072
|
-
}
|
|
1073
|
-
/**
|
|
1074
|
-
* Record memory text handed to an agent in the token ledger (ROADMAP TE0).
|
|
1075
|
-
* Best-effort: never throws, because a ledger failure must not fail the
|
|
1076
|
-
* recall or context call that produced the text.
|
|
1077
|
-
*/
|
|
1078
|
-
export declare function recordTokens(ctx: Context, surface: TokenSurface, use: {
|
|
1079
|
-
items: number;
|
|
1080
|
-
tokens: number;
|
|
1081
|
-
sessionId?: string | null;
|
|
1082
|
-
}): void;
|
|
1083
|
-
/**
|
|
1084
|
-
* Token ledger totals for the tenant over the last `days` days (default 30):
|
|
1085
|
-
* tokens sent, skipped as unchanged and re-read by later model calls, per
|
|
1086
|
-
* surface, with session counts and mean tokens per session.
|
|
1087
|
-
*/
|
|
1088
|
-
export declare function tokenSummary(ctx: Context, opts?: {
|
|
1089
|
-
days?: number;
|
|
1090
|
-
}): TokenSummary;
|
|
1091
|
-
/** Failed tool calls by outcome, and repeats across sessions, over the last `days` days (default 30); ROADMAP CD13. */
|
|
1092
|
-
export declare function failureSummary(ctx: Context, opts?: {
|
|
1093
|
-
days?: number;
|
|
1094
|
-
}): FailureSummary;
|
|
1095
|
-
/**
|
|
1096
|
-
* A tenant's dormant memories (src/dormant.ts): what sleep moved out of
|
|
1097
|
-
* active memory instead of deleting, when `dormant.enabled` is on. Newest
|
|
1098
|
-
* first; `opts.query` keeps rows containing every term (case-insensitive).
|
|
1099
|
-
*/
|
|
1100
|
-
export declare function listDormant(ctx: Context, opts?: ListDormantOpts): DormantMemory[];
|
|
1101
|
-
/**
|
|
1102
|
-
* Bring a dormant memory back into active memory. It returns as if just
|
|
1103
|
-
* recalled: `last_retrieved` is now, so it gets a full half-life before it
|
|
1104
|
-
* can fade again. Every other field is the snapshot taken when it went
|
|
1105
|
-
* dormant.
|
|
1106
|
-
*
|
|
1107
|
-
* Throws when the tenant has no dormant memory with that id (another
|
|
1108
|
-
* tenant's id reads the same way), when a live memory already holds the id,
|
|
1109
|
-
* and RejectedValueError when the value has been rejected since. On any
|
|
1110
|
-
* throw the dormant copy stays where it is.
|
|
1111
|
-
*/
|
|
1112
|
-
export declare function restoreDormant(ctx: Context, id: string): MemoryEntry;
|
|
1113
|
-
/**
|
|
1114
|
-
* Permanently delete a dormant memory: the explicit "forget it for good"
|
|
1115
|
-
* that dormant storage leaves to the user. Throws when the tenant has no
|
|
1116
|
-
* dormant memory with that id.
|
|
1117
|
-
*/
|
|
1118
|
-
export declare function forgetDormant(ctx: Context, id: string): void;
|
|
1119
|
-
/** Whether the tenant holds a dormant memory with this id (for "not found" hints). */
|
|
1120
|
-
export declare function isDormant(ctx: Context, id: string): boolean;
|
|
1121
|
-
export interface QuarantineListItem {
|
|
1122
|
-
id: string;
|
|
1123
|
-
originalScope: string | null;
|
|
1124
|
-
reason: string;
|
|
1125
|
-
status: QuarantineStatus;
|
|
1126
|
-
quarantinedAt: string;
|
|
1127
|
-
decidedAt: string | null;
|
|
1128
|
-
decidedBy: string | null;
|
|
1129
|
-
contentPreview: string;
|
|
1130
|
-
}
|
|
1131
|
-
/** A tenant's quarantined memories, newest first. Default `status` is 'pending' (the review queue). */
|
|
1132
|
-
export declare function quarantineList(ctx: Context, opts?: {
|
|
1133
|
-
status?: QuarantineStatus | 'all';
|
|
1134
|
-
limit?: number;
|
|
1135
|
-
}): QuarantineListItem[];
|
|
1136
|
-
/** Release a quarantined memory to its original scope. Admin only; the scope guard refuses a row moved since (mirrors restoreDormant). */
|
|
1137
|
-
export declare function quarantineApprove(ctx: Context, id: string): void;
|
|
1138
|
-
/** Keep a quarantined memory hidden for good. Admin only; the raw row is untouched (append-only). */
|
|
1139
|
-
export declare function quarantineReject(ctx: Context, id: string): void;
|
|
1140
|
-
export interface SleepResult {
|
|
1141
|
-
active: number;
|
|
1142
|
-
removed: number;
|
|
1143
|
-
/**
|
|
1144
|
-
* Faded memories the decay pass moved to the dormant store instead of
|
|
1145
|
-
* deleting (config `dormant.enabled`). Absent when 0. Per-invocation
|
|
1146
|
-
* activity counter, same class as `removed`.
|
|
1147
|
-
*/
|
|
1148
|
-
dormant?: number;
|
|
1149
|
-
/**
|
|
1150
|
-
* Dormant memories deleted for good this sleep because they outlived
|
|
1151
|
-
* `dormant.retentionDays`. Absent when 0. Same per-invocation class as
|
|
1152
|
-
* `removed`.
|
|
1153
|
-
*/
|
|
1154
|
-
dormantExpired?: number;
|
|
1155
|
-
mergedEpisodic: number;
|
|
1156
|
-
newSemantic: number;
|
|
1157
|
-
dryRun: boolean;
|
|
1158
|
-
deduped?: {
|
|
1159
|
-
removed: number;
|
|
1160
|
-
semDups: number;
|
|
1161
|
-
epiDups: number;
|
|
1162
|
-
crossDups: number;
|
|
1163
|
-
};
|
|
1164
|
-
audit?: {
|
|
1165
|
-
errorsRemoved: number;
|
|
1166
|
-
warningCount: number;
|
|
1167
|
-
};
|
|
1168
|
-
shared?: number;
|
|
1169
|
-
/**
|
|
1170
|
-
* v1.25.0: count of memories the auto-share secret veto withheld this sleep
|
|
1171
|
-
* — rows that passed every other admission gate (transfer score,
|
|
1172
|
-
* not-already-global) and were blocked solely by `detectSecret`. Absent
|
|
1173
|
-
* when 0 or when auto-share did not run.
|
|
1174
|
-
*/
|
|
1175
|
-
secretSkipped?: number;
|
|
1176
|
-
/**
|
|
1177
|
-
* AT1: count of auto-share candidates the GLOBAL store's rejection
|
|
1178
|
-
* tombstone refused this sleep (docs/plans/2026-08-15-at1-rejected-value-tombstone.md
|
|
1179
|
-
* plan §3 — copy paths must not let one rejected candidate abort the
|
|
1180
|
-
* batch). Absent when 0 or when auto-share did not run.
|
|
1181
|
-
*/
|
|
1182
|
-
rejectedSkipped?: number;
|
|
1183
|
-
ambient?: AmbientState | null;
|
|
1184
|
-
/**
|
|
1185
|
-
* E3 sleep enqueue-hook: graph re-extraction totals across the tenants rebuilt
|
|
1186
|
-
* this sleep. Absent when no tenant was dirty, and under dryRun (the graph
|
|
1187
|
-
* phase runs only on a real sleep). Cross-tenant aggregate, one reason
|
|
1188
|
-
* /v1/sleep stays loopback-only.
|
|
1189
|
-
*/
|
|
1190
|
-
graph?: {
|
|
1191
|
-
tenants: number;
|
|
1192
|
-
entities: number;
|
|
1193
|
-
relations: number;
|
|
1194
|
-
};
|
|
1195
|
-
details?: string[];
|
|
1196
|
-
}
|
|
1197
|
-
/**
|
|
1198
|
-
* Run the pure-storage consolidation pipeline.
|
|
1199
|
-
*
|
|
1200
|
-
* Tenant scope note: sleep operates on the WHOLE hippoRoot (all tenants in
|
|
1201
|
-
* it), matching the pre-refactor cmdSleepCore behavior. Correct for a CLI
|
|
1202
|
-
* maintenance op invoked by the operator. Episode B (v1.11.4) exposed this
|
|
1203
|
-
* over HTTP `/v1/sleep` with loopback-only enforcement (per-request guard
|
|
1204
|
-
* in the handler plus serve()'s boot-time host check). The TODOS.md
|
|
1205
|
-
* per-tenant scoping follow-up remains open for the day non-loopback
|
|
1206
|
-
* serving lands — at that point the route will need an admin-role gate OR
|
|
1207
|
-
* api.sleep itself will need to scope dedup / audit / delete by ctx.tenantId.
|
|
1208
|
-
*
|
|
1209
|
-
* Dedup and audit deletes each log a `forget` row with the ctx actor and a
|
|
1210
|
-
* `metadata.reason`. Pinned, raw, kept and object-backing rows are never auto-deleted (AUTOMATIC_DELETE_SQL).
|
|
1211
|
-
* dryRun previews consolidate, dedup and audit, then returns before share/ambient.
|
|
1212
|
-
*/
|
|
1213
|
-
/**
|
|
1214
|
-
* v1.12.2: Test-only DI seam shape for `sleep`'s phase dependencies.
|
|
1215
|
-
*
|
|
1216
|
-
* Each field defaults to the real production implementation imported at the
|
|
1217
|
-
* top of this file. Test files pass a `Partial<SleepPhases>` override via
|
|
1218
|
-
* `SleepOpts.__phases` (note the `__` prefix — internal-only) to inject
|
|
1219
|
-
* deterministic throws for mid-phase failure-path coverage (the
|
|
1220
|
-
* `partial: true` + `errorMessage` audit-row branch at line ~2098).
|
|
1221
|
-
*
|
|
1222
|
-
* Production callers MUST NOT use `__phases`. The field exists solely so
|
|
1223
|
-
* `tests/api-sleep-phase-faults.test.ts` can force each phase boundary to
|
|
1224
|
-
* throw without depending on store-corruption fragility.
|
|
1225
|
-
*/
|
|
1226
|
-
export interface SleepPhases {
|
|
1227
|
-
consolidate: typeof consolidate;
|
|
1228
|
-
deduplicateStore: typeof deduplicateStore;
|
|
1229
|
-
auditMemories: typeof auditMemories;
|
|
1230
|
-
autoShare: typeof autoShare;
|
|
1231
|
-
loadAllEntries: typeof loadAllEntries;
|
|
1232
|
-
deleteEntry: typeof deleteEntry;
|
|
1233
|
-
computeAmbientState: typeof computeAmbientState;
|
|
1234
|
-
loadConfig: typeof loadConfig;
|
|
1235
|
-
loadPendingExtractionTenants: typeof loadPendingExtractionTenants;
|
|
1236
|
-
extractGraph: typeof extractGraph;
|
|
1237
|
-
}
|
|
1238
|
-
export declare function sleep(ctx: Context, opts?: SleepOpts): Promise<SleepResult>;
|
|
1239
|
-
/**
|
|
1240
|
-
* Apply an outcome to the ids most recently returned by `recall()`.
|
|
1241
|
-
*
|
|
1242
|
-
* Reads `loadIndex(ctx.hippoRoot).last_retrieval_ids` (per-hippoRoot local
|
|
1243
|
-
* state; not tenant-scoped at the index layer) and forwards to `outcome()`,
|
|
1244
|
-
* which DOES tenant-filter via `readEntry(..., ctx.tenantId)`. Cross-tenant
|
|
1245
|
-
* ids in `last_retrieval_ids` are silently skipped, matching the MCP
|
|
1246
|
-
* `hippo_outcome` semantics.
|
|
1247
|
-
*
|
|
1248
|
-
* **Tenant-safe response shape (v1.11.4 security fix):** the returned `ids`
|
|
1249
|
-
* field contains ONLY the tenant-filtered subset that actually had outcomes
|
|
1250
|
-
* applied (i.e. `appliedIds` from the inner `outcome()` call). Earlier
|
|
1251
|
-
* versions returned the raw `last_retrieval_ids` regardless of tenant, which
|
|
1252
|
-
* leaked cross-tenant memory IDs to the caller via POST /v1/outcome's
|
|
1253
|
-
* no-body last-recall response. The fix is at this helper so all callers
|
|
1254
|
-
* (CLI cmdOutcome, HTTP /v1/outcome, MCP `hippo_outcome` if added later)
|
|
1255
|
-
* inherit the tenant-safe contract.
|
|
1256
|
-
*
|
|
1257
|
-
* Do NOT tighten `loadIndex` with `tenantId` inside this helper — doing so
|
|
1258
|
-
* would break the (correct) cross-tenant-silent-skip behavior covered by
|
|
1259
|
-
* the test in `tests/api-outcome-for-last-recall.test.ts`.
|
|
1260
|
-
*/
|
|
1261
|
-
export interface OutcomeForLastRecallResult {
|
|
1262
|
-
applied: number;
|
|
1263
|
-
ids: string[];
|
|
1264
|
-
}
|
|
1265
|
-
export declare function outcomeForLastRecall(ctx: Context, good: boolean): OutcomeForLastRecallResult;
|
|
7
|
+
export * from './api/types.js';
|
|
8
|
+
export * from './api/remember.js';
|
|
9
|
+
export * from './api/recall-types.js';
|
|
10
|
+
export * from './api/recall.js';
|
|
11
|
+
export * from './api/assemble.js';
|
|
12
|
+
export * from './api/drill-down.js';
|
|
13
|
+
export * from './api/outcome.js';
|
|
14
|
+
export * from './api/forget.js';
|
|
15
|
+
export * from './api/promote.js';
|
|
16
|
+
export * from './api/auth.js';
|
|
17
|
+
export * from './api/audit.js';
|
|
18
|
+
export * from './api/context-types.js';
|
|
19
|
+
export * from './api/context.js';
|
|
20
|
+
export * from './api/tokens.js';
|
|
21
|
+
export * from './api/dormant.js';
|
|
22
|
+
export * from './api/quarantine.js';
|
|
23
|
+
export * from './api/sleep.js';
|
|
24
|
+
export * from './api/goals.js';
|
|
25
|
+
export * from './api/learn.js';
|
|
1266
26
|
//# sourceMappingURL=api.d.ts.map
|