hippo-memory 1.59.0 → 1.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/ablation.js +9 -27
- package/dist/agent-memories/apply.js +4 -1
- package/dist/agent-memories/claude-code.js +1 -1
- package/dist/agent-memories/codex.js +1 -1
- package/dist/agent-memories/gemini.js +1 -1
- package/dist/agent-memories/legacy.js +1 -1
- package/dist/agent-memories/source.js +1 -1
- package/dist/agent-memories/sync.js +8 -3
- package/dist/ambient-store.d.ts +14 -0
- package/dist/ambient-store.js +90 -0
- package/dist/ambient.d.ts +23 -0
- package/dist/ambient.js +72 -50
- package/dist/api/assemble.d.ts +93 -0
- package/dist/api/assemble.js +152 -0
- package/dist/api/audit.d.ts +17 -0
- package/dist/api/audit.js +23 -0
- package/dist/api/auth.d.ts +79 -0
- package/dist/api/auth.js +178 -0
- package/dist/api/context-types.d.ts +105 -0
- package/dist/api/context-types.js +3 -0
- package/dist/api/context.d.ts +31 -0
- package/dist/api/context.js +705 -0
- package/dist/api/dormant.d.ts +30 -0
- package/dist/api/dormant.js +140 -0
- package/dist/api/drill-down.d.ts +84 -0
- package/dist/api/drill-down.js +123 -0
- package/dist/api/forget.d.ts +57 -0
- package/dist/api/forget.js +87 -0
- package/dist/api/goals.d.ts +18 -0
- package/dist/api/goals.js +33 -0
- package/dist/api/learn.d.ts +31 -0
- package/dist/api/learn.js +88 -0
- package/dist/api/outcome.d.ts +61 -0
- package/dist/api/outcome.js +66 -0
- package/dist/api/promote.d.ts +54 -0
- package/dist/api/promote.js +203 -0
- package/dist/api/quarantine.d.ts +24 -0
- package/dist/api/quarantine.js +121 -0
- package/dist/api/recall-types.d.ts +390 -0
- package/dist/api/recall-types.js +3 -0
- package/dist/api/recall.d.ts +36 -0
- package/dist/api/recall.js +634 -0
- package/dist/api/remember.d.ts +35 -0
- package/dist/api/remember.js +43 -0
- package/dist/api/sleep.d.ts +136 -0
- package/dist/api/sleep.js +271 -0
- package/dist/api/tokens.d.ts +26 -0
- package/dist/api/tokens.js +60 -0
- package/dist/api/types.d.ts +56 -0
- package/dist/api/types.js +38 -0
- package/dist/api.d.ts +20 -1260
- package/dist/api.js +25 -2711
- package/dist/audit.d.ts +3 -0
- package/dist/audit.js +7 -3
- package/dist/auth.d.ts +45 -4
- package/dist/auth.js +125 -48
- package/dist/autolearn.js +7 -4
- package/dist/capture/command.d.ts +33 -0
- package/dist/capture/command.js +264 -0
- package/dist/capture/compact.d.ts +44 -0
- package/dist/capture/compact.js +354 -0
- package/dist/capture/extract.d.ts +21 -0
- package/dist/capture/extract.js +464 -0
- package/dist/capture/transcript.d.ts +40 -0
- package/dist/capture/transcript.js +193 -0
- package/dist/capture-error.js +2 -1
- package/dist/churn-git.js +4 -2
- package/dist/cli/audit.d.ts +3 -0
- package/dist/cli/audit.js +159 -0
- package/dist/cli/auth.d.ts +2 -0
- package/dist/cli/auth.js +171 -0
- package/dist/cli/briefs.d.ts +4 -0
- package/dist/cli/briefs.js +435 -0
- package/dist/cli/card.d.ts +3 -0
- package/dist/cli/card.js +333 -0
- package/dist/cli/context.d.ts +15 -0
- package/dist/cli/context.js +366 -0
- package/dist/cli/continuity.d.ts +6 -0
- package/dist/cli/continuity.js +445 -0
- package/dist/cli/curate.d.ts +19 -0
- package/dist/cli/curate.js +555 -0
- package/dist/cli/dag.d.ts +5 -0
- package/dist/cli/dag.js +177 -0
- package/dist/cli/decisions.d.ts +4 -0
- package/dist/cli/decisions.js +528 -0
- package/dist/cli/eval.d.ts +5 -0
- package/dist/cli/eval.js +213 -0
- package/dist/cli/explain.d.ts +4 -0
- package/dist/cli/explain.js +150 -0
- package/dist/cli/goals.d.ts +2 -0
- package/dist/cli/goals.js +196 -0
- package/dist/cli/hook-blocks.d.ts +18 -0
- package/dist/cli/hook-blocks.js +233 -0
- package/dist/cli/init.d.ts +2 -0
- package/dist/cli/init.js +305 -0
- package/dist/cli/maintenance.d.ts +4 -0
- package/dist/cli/maintenance.js +179 -0
- package/dist/cli/playbooks.d.ts +4 -0
- package/dist/cli/playbooks.js +556 -0
- package/dist/cli/projects.js +1 -1
- package/dist/cli/recall.d.ts +7 -0
- package/dist/cli/recall.js +597 -0
- package/dist/cli/remember.d.ts +5 -0
- package/dist/cli/remember.js +442 -0
- package/dist/cli/serve.d.ts +5 -0
- package/dist/cli/serve.js +40 -0
- package/dist/cli/session-hooks.d.ts +29 -0
- package/dist/cli/session-hooks.js +637 -0
- package/dist/cli/setup.d.ts +4 -0
- package/dist/cli/setup.js +376 -0
- package/dist/cli/shared.d.ts +15 -19
- package/dist/cli/shared.js +50 -341
- package/dist/cli/slack.d.ts +2 -0
- package/dist/cli/slack.js +171 -0
- package/dist/cli/status.d.ts +18 -0
- package/dist/cli/status.js +400 -0
- package/dist/cli/transfer.d.ts +10 -0
- package/dist/cli/transfer.js +438 -0
- package/dist/cli/usage.d.ts +85 -0
- package/dist/cli/usage.js +741 -0
- package/dist/cli.d.ts +319 -13
- package/dist/cli.js +436 -8580
- package/dist/client.js +15 -8
- package/dist/compaction-record.js +12 -9
- package/dist/config.js +12 -11
- package/dist/connectors/github/backfill.js +94 -87
- package/dist/connectors/github/cli-impl.js +5 -3
- package/dist/connectors/github/dlq.js +67 -54
- package/dist/connectors/github/ingest.js +34 -35
- package/dist/connectors/github/tenant-routing.js +3 -2
- package/dist/connectors/github/webhook.js +135 -216
- package/dist/connectors/slack/dlq.js +49 -61
- package/dist/connectors/slack/ingest.js +55 -48
- package/dist/connectors/slack/tenant-routing.js +4 -3
- package/dist/connectors/slack/webhook.js +72 -74
- package/dist/consolidate/conflicts.d.ts +10 -0
- package/dist/consolidate/conflicts.js +178 -0
- package/dist/consolidate/decay.d.ts +12 -0
- package/dist/consolidate/decay.js +145 -0
- package/dist/consolidate/llm-passes.d.ts +3 -0
- package/dist/consolidate/llm-passes.js +141 -0
- package/dist/consolidate/merge.d.ts +7 -0
- package/dist/consolidate/merge.js +251 -0
- package/dist/consolidate/physics-pass.d.ts +3 -0
- package/dist/consolidate/physics-pass.js +60 -0
- package/dist/consolidate/run.d.ts +69 -0
- package/dist/consolidate/run.js +76 -0
- package/dist/consolidate/sleep.d.ts +18 -0
- package/dist/consolidate/sleep.js +209 -0
- package/dist/consolidate/traces.d.ts +4 -0
- package/dist/consolidate/traces.js +178 -0
- package/dist/context-auto.js +7 -11
- package/dist/context-render.d.ts +1 -1
- package/dist/context-render.js +1 -1
- package/dist/customer-notes.d.ts +3 -0
- package/dist/customer-notes.js +6 -4
- package/dist/dag.js +13 -12
- package/dist/dashboard-actions.d.ts +20 -0
- package/dist/dashboard-actions.js +88 -0
- package/dist/dashboard-params.d.ts +45 -0
- package/dist/dashboard-params.js +127 -0
- package/dist/dashboard-queries.d.ts +15 -0
- package/dist/dashboard-queries.js +355 -0
- package/dist/dashboard-snapshot.d.ts +138 -0
- package/dist/dashboard-snapshot.js +308 -0
- package/dist/dashboard-types.d.ts +163 -0
- package/dist/dashboard-types.js +3 -0
- package/dist/dashboard.d.ts +6 -7
- package/dist/dashboard.js +231 -203
- package/dist/db/busy.d.ts +5 -0
- package/dist/db/busy.js +24 -0
- package/dist/db/continuity.d.ts +5 -0
- package/dist/db/continuity.js +145 -0
- package/dist/db/meta.d.ts +8 -0
- package/dist/db/meta.js +35 -0
- package/dist/db/migrate.d.ts +9 -0
- package/dist/db/migrate.js +138 -0
- package/dist/db/migrations/index.d.ts +5 -0
- package/dist/db/migrations/index.js +109 -0
- package/dist/db/migrations/types.d.ts +14 -0
- package/dist/db/migrations/types.js +2 -0
- package/dist/db/migrations/v01.d.ts +3 -0
- package/dist/db/migrations/v01.js +38 -0
- package/dist/db/migrations/v02.d.ts +3 -0
- package/dist/db/migrations/v02.js +21 -0
- package/dist/db/migrations/v03.d.ts +3 -0
- package/dist/db/migrations/v03.js +22 -0
- package/dist/db/migrations/v04.d.ts +3 -0
- package/dist/db/migrations/v04.js +28 -0
- package/dist/db/migrations/v05.d.ts +3 -0
- package/dist/db/migrations/v05.js +21 -0
- package/dist/db/migrations/v06.d.ts +3 -0
- package/dist/db/migrations/v06.js +25 -0
- package/dist/db/migrations/v07.d.ts +3 -0
- package/dist/db/migrations/v07.js +13 -0
- package/dist/db/migrations/v08.d.ts +3 -0
- package/dist/db/migrations/v08.js +8 -0
- package/dist/db/migrations/v09.d.ts +3 -0
- package/dist/db/migrations/v09.js +13 -0
- package/dist/db/migrations/v10.d.ts +3 -0
- package/dist/db/migrations/v10.js +17 -0
- package/dist/db/migrations/v11.d.ts +3 -0
- package/dist/db/migrations/v11.js +15 -0
- package/dist/db/migrations/v12.d.ts +3 -0
- package/dist/db/migrations/v12.js +11 -0
- package/dist/db/migrations/v13.d.ts +3 -0
- package/dist/db/migrations/v13.js +15 -0
- package/dist/db/migrations/v14.d.ts +3 -0
- package/dist/db/migrations/v14.js +66 -0
- package/dist/db/migrations/v15.d.ts +3 -0
- package/dist/db/migrations/v15.js +42 -0
- package/dist/db/migrations/v16.d.ts +3 -0
- package/dist/db/migrations/v16.js +61 -0
- package/dist/db/migrations/v17.d.ts +3 -0
- package/dist/db/migrations/v17.js +46 -0
- package/dist/db/migrations/v18.d.ts +3 -0
- package/dist/db/migrations/v18.js +60 -0
- package/dist/db/migrations/v19.d.ts +3 -0
- package/dist/db/migrations/v19.js +28 -0
- package/dist/db/migrations/v20.d.ts +3 -0
- package/dist/db/migrations/v20.js +42 -0
- package/dist/db/migrations/v21.d.ts +3 -0
- package/dist/db/migrations/v21.js +16 -0
- package/dist/db/migrations/v22.d.ts +3 -0
- package/dist/db/migrations/v22.js +82 -0
- package/dist/db/migrations/v23.d.ts +3 -0
- package/dist/db/migrations/v23.js +48 -0
- package/dist/db/migrations/v24.d.ts +3 -0
- package/dist/db/migrations/v24.js +72 -0
- package/dist/db/migrations/v25.d.ts +3 -0
- package/dist/db/migrations/v25.js +46 -0
- package/dist/db/migrations/v26.d.ts +3 -0
- package/dist/db/migrations/v26.js +23 -0
- package/dist/db/migrations/v27.d.ts +3 -0
- package/dist/db/migrations/v27.js +57 -0
- package/dist/db/migrations/v28.d.ts +3 -0
- package/dist/db/migrations/v28.js +38 -0
- package/dist/db/migrations/v29.d.ts +3 -0
- package/dist/db/migrations/v29.js +78 -0
- package/dist/db/migrations/v30.d.ts +3 -0
- package/dist/db/migrations/v30.js +92 -0
- package/dist/db/migrations/v31.d.ts +3 -0
- package/dist/db/migrations/v31.js +74 -0
- package/dist/db/migrations/v32.d.ts +3 -0
- package/dist/db/migrations/v32.js +102 -0
- package/dist/db/migrations/v33.d.ts +3 -0
- package/dist/db/migrations/v33.js +104 -0
- package/dist/db/migrations/v34.d.ts +3 -0
- package/dist/db/migrations/v34.js +93 -0
- package/dist/db/migrations/v35.d.ts +3 -0
- package/dist/db/migrations/v35.js +98 -0
- package/dist/db/migrations/v36.d.ts +3 -0
- package/dist/db/migrations/v36.js +98 -0
- package/dist/db/migrations/v37.d.ts +3 -0
- package/dist/db/migrations/v37.js +219 -0
- package/dist/db/migrations/v38.d.ts +3 -0
- package/dist/db/migrations/v38.js +277 -0
- package/dist/db/migrations/v39.d.ts +3 -0
- package/dist/db/migrations/v39.js +59 -0
- package/dist/db/migrations/v40.d.ts +3 -0
- package/dist/db/migrations/v40.js +74 -0
- package/dist/db/migrations/v41.d.ts +3 -0
- package/dist/db/migrations/v41.js +43 -0
- package/dist/db/migrations/v42.d.ts +3 -0
- package/dist/db/migrations/v42.js +41 -0
- package/dist/db/migrations/v43.d.ts +3 -0
- package/dist/db/migrations/v43.js +67 -0
- package/dist/db/migrations/v44.d.ts +3 -0
- package/dist/db/migrations/v44.js +28 -0
- package/dist/db/migrations/v45.d.ts +3 -0
- package/dist/db/migrations/v45.js +30 -0
- package/dist/db/migrations/v46.d.ts +3 -0
- package/dist/db/migrations/v46.js +25 -0
- package/dist/db/migrations/v47.d.ts +3 -0
- package/dist/db/migrations/v47.js +17 -0
- package/dist/db/migrations/v48.d.ts +3 -0
- package/dist/db/migrations/v48.js +10 -0
- package/dist/db/migrations/v49.d.ts +3 -0
- package/dist/db/migrations/v49.js +31 -0
- package/dist/db/migrations/v50.d.ts +3 -0
- package/dist/db/migrations/v50.js +67 -0
- package/dist/db/migrations/v51.d.ts +3 -0
- package/dist/db/migrations/v51.js +14 -0
- package/dist/db/migrations/v52.d.ts +3 -0
- package/dist/db/migrations/v52.js +7 -0
- package/dist/db/open.d.ts +23 -0
- package/dist/db/open.js +146 -0
- package/dist/db/sqlite.d.ts +21 -0
- package/dist/db/sqlite.js +8 -0
- package/dist/db/tables.d.ts +7 -0
- package/dist/db/tables.js +38 -0
- package/dist/db.d.ts +6 -46
- package/dist/db.js +5 -3036
- package/dist/decisions.d.ts +4 -1
- package/dist/decisions.js +9 -7
- package/dist/dedupe.js +3 -2
- package/dist/delivery-recorder.js +5 -1
- package/dist/doctor.js +4 -3
- package/dist/dormant.js +1 -0
- package/dist/embedding-provider.d.ts +1 -1
- package/dist/embedding-provider.js +7 -5
- package/dist/embeddings.d.ts +9 -52
- package/dist/embeddings.js +47 -298
- package/dist/env.d.ts +75 -0
- package/dist/env.js +119 -0
- package/dist/eval-suite.js +1 -1
- package/dist/eval.js +2 -2
- package/dist/extract.js +5 -4
- package/dist/gated-write.js +3 -1
- package/dist/goals.d.ts +3 -1
- package/dist/goals.js +18 -0
- package/dist/graph/read.d.ts +73 -0
- package/dist/graph/read.js +325 -0
- package/dist/graph/rows.d.ts +45 -0
- package/dist/graph/rows.js +51 -0
- package/dist/graph/types.d.ts +83 -0
- package/dist/graph/types.js +11 -0
- package/dist/graph/write.d.ts +93 -0
- package/dist/{graph.js → graph/write.js} +8 -391
- package/dist/graph-extract.js +2 -1
- package/dist/graph-recall.d.ts +1 -1
- package/dist/graph-recall.js +2 -2
- package/dist/graph-stream.js +1 -1
- package/dist/graph-view.d.ts +1 -1
- package/dist/graph-view.js +1 -1
- package/dist/half-life-migration.d.ts +1 -1
- package/dist/half-life-migration.js +2 -1
- package/dist/handoff.js +3 -0
- package/dist/hooks/codex-session.d.ts +8 -0
- package/dist/hooks/codex-session.js +76 -0
- package/dist/hooks/codex-wrapper.d.ts +55 -0
- package/dist/hooks/codex-wrapper.js +288 -0
- package/dist/hooks/json-hooks.d.ts +63 -0
- package/dist/hooks/json-hooks.js +356 -0
- package/dist/hooks/opencode.d.ts +50 -0
- package/dist/hooks/opencode.js +202 -0
- package/dist/hooks/shared.d.ts +54 -0
- package/dist/hooks/shared.js +77 -0
- package/dist/http-retry.d.ts +2 -0
- package/dist/http-retry.js +4 -3
- package/dist/http-util.d.ts +3 -0
- package/dist/http-util.js +10 -0
- package/dist/{importers.d.ts → importers/core.d.ts} +13 -17
- package/dist/importers/core.js +141 -0
- package/dist/importers/markdown-parse.d.ts +41 -0
- package/dist/importers/markdown-parse.js +132 -0
- package/dist/importers/markdown.d.ts +3 -0
- package/dist/importers/markdown.js +92 -0
- package/dist/importers/sources.d.ts +7 -0
- package/dist/importers/sources.js +229 -0
- package/dist/importers/vault.d.ts +11 -0
- package/dist/importers/vault.js +352 -0
- package/dist/incidents.d.ts +3 -0
- package/dist/incidents.js +8 -5
- package/dist/index.d.ts +25 -6
- package/dist/index.js +23 -6
- package/dist/invalidation.js +2 -1
- package/dist/judgment.js +7 -3
- package/dist/keyset.d.ts +13 -0
- package/dist/keyset.js +8 -0
- package/dist/local-embedding.d.ts +13 -0
- package/dist/local-embedding.js +165 -0
- package/dist/log.d.ts +7 -0
- package/dist/log.js +19 -1
- package/dist/mcp/admin-tools.d.ts +8 -0
- package/dist/mcp/admin-tools.js +116 -0
- package/dist/mcp/format.d.ts +27 -0
- package/dist/mcp/format.js +135 -0
- package/dist/mcp/memory-tools.d.ts +5 -0
- package/dist/mcp/memory-tools.js +83 -0
- package/dist/mcp/protocol.d.ts +83 -0
- package/dist/mcp/protocol.js +55 -0
- package/dist/mcp/recall-tools.d.ts +6 -0
- package/dist/mcp/recall-tools.js +320 -0
- package/dist/mcp/request.d.ts +10 -0
- package/dist/mcp/request.js +163 -0
- package/dist/mcp/server.d.ts +4 -70
- package/dist/mcp/server.js +8 -1172
- package/dist/mcp/session-state.d.ts +11 -0
- package/dist/mcp/session-state.js +28 -0
- package/dist/mcp/stdio.d.ts +8 -0
- package/dist/mcp/stdio.js +79 -0
- package/dist/mcp/tools.d.ts +11 -0
- package/dist/mcp/tools.js +247 -0
- package/dist/memory.d.ts +8 -3
- package/dist/memory.js +27 -1
- package/dist/multihop.d.ts +1 -1
- package/dist/multihop.js +2 -1
- package/dist/owner-validation.js +2 -1
- package/dist/physics-state.js +10 -7
- package/dist/policies.d.ts +3 -0
- package/dist/policies.js +8 -6
- package/dist/postinstall.js +3 -2
- package/dist/predictions/planning-fallacy.d.ts +100 -0
- package/dist/predictions/planning-fallacy.js +190 -0
- package/dist/{predictions.d.ts → predictions/store.d.ts} +7 -102
- package/dist/predictions/store.js +434 -0
- package/dist/processes.d.ts +3 -0
- package/dist/processes.js +8 -5
- package/dist/project-briefs.d.ts +3 -0
- package/dist/project-briefs.js +7 -5
- package/dist/project-identity.d.ts +1 -1
- package/dist/project-identity.js +12 -6
- package/dist/project-merge.js +3 -1
- package/dist/quarantine.d.ts +2 -1
- package/dist/quarantine.js +8 -5
- package/dist/raw-archive-mirror-cleanup.js +2 -1
- package/dist/raw-archive.js +1 -1
- package/dist/recall-history.js +3 -2
- package/dist/recall-pipeline.d.ts +2 -2
- package/dist/recall-pipeline.js +16 -8
- package/dist/recall-scope.js +1 -1
- package/dist/recall-trace.d.ts +3 -3
- package/dist/recall-trace.js +10 -14
- package/dist/refine-llm.js +20 -11
- package/dist/reject-flow.js +6 -1
- package/dist/rerankers/clef.d.ts +2 -2
- package/dist/rerankers/clef.js +72 -30
- package/dist/rerankers/cross-encoder.js +6 -4
- package/dist/rerankers/jev.d.ts +4 -2
- package/dist/rerankers/jev.js +24 -19
- package/dist/rerankers/llm.d.ts +4 -2
- package/dist/rerankers/llm.js +61 -41
- package/dist/rerankers/types.d.ts +1 -1
- package/dist/salience.js +1 -1
- package/dist/same-text.d.ts +2 -0
- package/dist/same-text.js +4 -0
- package/dist/scheduler.d.ts +1 -0
- package/dist/scheduler.js +26 -3
- package/dist/scope.js +4 -3
- package/dist/search/as-of.d.ts +10 -0
- package/dist/search/as-of.js +22 -0
- package/dist/search/bm25-search.d.ts +14 -0
- package/dist/search/bm25-search.js +43 -0
- package/dist/search/bm25.d.ts +15 -0
- package/dist/search/bm25.js +54 -0
- package/dist/search/boosts.d.ts +54 -0
- package/dist/search/boosts.js +94 -0
- package/dist/search/breakdown.d.ts +7 -0
- package/dist/search/breakdown.js +20 -0
- package/dist/search/explain.d.ts +25 -0
- package/dist/search/explain.js +31 -0
- package/dist/search/finalize.d.ts +8 -0
- package/dist/search/finalize.js +52 -0
- package/dist/search/fusion.d.ts +27 -0
- package/dist/search/fusion.js +42 -0
- package/dist/search/hybrid-score.d.ts +20 -0
- package/dist/search/hybrid-score.js +73 -0
- package/dist/search/hybrid.d.ts +46 -0
- package/dist/search/hybrid.js +64 -0
- package/dist/search/physics-search.d.ts +29 -0
- package/dist/search/physics-search.js +162 -0
- package/dist/search/rerank.d.ts +10 -0
- package/dist/search/rerank.js +72 -0
- package/dist/search/temporal.d.ts +15 -0
- package/dist/search/temporal.js +45 -0
- package/dist/search/types.d.ts +91 -0
- package/dist/search/types.js +2 -0
- package/dist/search/vector.d.ts +30 -0
- package/dist/search/vector.js +71 -0
- package/dist/secret-detect.d.ts +2 -0
- package/dist/secret-detect.js +3 -1
- package/dist/server/auth.d.ts +52 -0
- package/dist/server/auth.js +221 -0
- package/dist/server/client-ip.d.ts +25 -0
- package/dist/server/client-ip.js +92 -0
- package/dist/server/cursor.d.ts +23 -0
- package/dist/server/cursor.js +58 -0
- package/dist/server/lifecycle.d.ts +7 -0
- package/dist/server/lifecycle.js +29 -0
- package/dist/server/mcp-http.d.ts +5 -0
- package/dist/server/mcp-http.js +199 -0
- package/dist/server/request.d.ts +33 -0
- package/dist/server/request.js +103 -0
- package/dist/server/routes/admin.d.ts +9 -0
- package/dist/server/routes/admin.js +158 -0
- package/dist/server/routes/customer-notes.d.ts +7 -0
- package/dist/server/routes/customer-notes.js +112 -0
- package/dist/server/routes/decisions.d.ts +7 -0
- package/dist/server/routes/decisions.js +133 -0
- package/dist/server/routes/incidents.d.ts +7 -0
- package/dist/server/routes/incidents.js +126 -0
- package/dist/server/routes/memories.d.ts +10 -0
- package/dist/server/routes/memories.js +179 -0
- package/dist/server/routes/policies.d.ts +8 -0
- package/dist/server/routes/policies.js +151 -0
- package/dist/server/routes/predictions.d.ts +7 -0
- package/dist/server/routes/predictions.js +164 -0
- package/dist/server/routes/processes.d.ts +7 -0
- package/dist/server/routes/processes.js +161 -0
- package/dist/server/routes/project-briefs.d.ts +8 -0
- package/dist/server/routes/project-briefs.js +136 -0
- package/dist/server/routes/recall.d.ts +8 -0
- package/dist/server/routes/recall.js +340 -0
- package/dist/server/routes/skills.d.ts +8 -0
- package/dist/server/routes/skills.js +150 -0
- package/dist/server/types.d.ts +56 -0
- package/dist/server/types.js +2 -0
- package/dist/server/validation.d.ts +14 -0
- package/dist/server/validation.js +91 -0
- package/dist/server.d.ts +7 -61
- package/dist/server.js +92 -2368
- package/dist/session-digest.d.ts +1 -1
- package/dist/session-digest.js +9 -2
- package/dist/shared.d.ts +3 -1
- package/dist/shared.js +46 -40
- package/dist/skills.d.ts +3 -0
- package/dist/skills.js +7 -5
- package/dist/stdin.js +3 -2
- package/dist/store/audit-event.d.ts +19 -0
- package/dist/store/audit-event.js +33 -0
- package/dist/store/candidates.d.ts +42 -0
- package/dist/store/candidates.js +152 -0
- package/dist/store/conflicts.d.ts +44 -0
- package/dist/store/conflicts.js +444 -0
- package/dist/store/delete-and-batch.d.ts +63 -0
- package/dist/store/delete-and-batch.js +310 -0
- package/dist/store/entry-reads.d.ts +92 -0
- package/dist/store/entry-reads.js +255 -0
- package/dist/store/entry-row.d.ts +67 -0
- package/dist/store/entry-row.js +208 -0
- package/dist/store/entry-writes.d.ts +46 -0
- package/dist/store/entry-writes.js +148 -0
- package/dist/store/handoffs.d.ts +26 -0
- package/dist/store/handoffs.js +184 -0
- package/dist/store/index-and-stats.d.ts +52 -0
- package/dist/store/index-and-stats.js +214 -0
- package/dist/store/markdown.d.ts +10 -0
- package/dist/store/markdown.js +108 -0
- package/dist/store/mirrors.d.ts +49 -0
- package/dist/store/mirrors.js +312 -0
- package/dist/store/open.d.ts +15 -0
- package/dist/store/open.js +223 -0
- package/dist/store/rows.d.ts +178 -0
- package/dist/store/rows.js +158 -0
- package/dist/store/search-rows.d.ts +86 -0
- package/dist/store/search-rows.js +254 -0
- package/dist/store/sessions.d.ts +83 -0
- package/dist/store/sessions.js +272 -0
- package/dist/store/summaries.d.ts +94 -0
- package/dist/store/summaries.js +377 -0
- package/dist/store/tenant-lookup.d.ts +12 -0
- package/dist/store/tenant-lookup.js +16 -0
- package/dist/store-cards.js +2 -1
- package/dist/summary-dirty.d.ts +4 -0
- package/dist/summary-dirty.js +32 -0
- package/dist/support-bundle.js +4 -3
- package/dist/tenant.js +2 -2
- package/dist/token-ledger.js +1 -0
- package/dist/tokenize.d.ts +2 -0
- package/dist/tokenize.js +16 -0
- package/dist/transcript-tail.d.ts +7 -0
- package/dist/transcript-tail.js +48 -0
- package/dist/vector-store.d.ts +27 -0
- package/dist/vector-store.js +210 -0
- package/dist/version.d.ts +2 -2
- package/dist/version.js +2 -2
- package/dist/working-memory.js +1 -1
- package/dist/yaml.js +36 -11
- package/dist-ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
- package/dist-ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
- package/dist-ui/assets/index-DPN7cP19.js +33 -0
- package/dist-ui/assets/index-dFloKRVr.css +1 -0
- package/dist-ui/index.html +3 -25
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -1
- package/dist/capture.d.ts +0 -155
- package/dist/capture.js +0 -1293
- package/dist/consolidate.d.ts +0 -58
- package/dist/consolidate.js +0 -1123
- package/dist/graph.d.ts +0 -245
- package/dist/hooks.d.ts +0 -208
- package/dist/hooks.js +0 -1073
- package/dist/importers.js +0 -897
- package/dist/predictions.js +0 -620
- package/dist/search.d.ts +0 -320
- package/dist/search.js +0 -968
- package/dist/store.d.ts +0 -744
- package/dist/store.js +0 -3372
- package/dist-ui/assets/d3-BiWEKnn4.js +0 -1
- package/dist-ui/assets/index-BhT8RvO6.js +0 -61
- package/dist-ui/assets/index-RoXXJ5dq.css +0 -1
- package/dist-ui/assets/three-BDgTxR1l.js +0 -4112
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// Write path: remember stores one memory after secret vetting and, for untrusted content, the instruction check.
|
|
2
|
+
import { writeEntry } from '../store/entry-writes.js';
|
|
3
|
+
import { detectInstruction } from '../instruction-detect.js';
|
|
4
|
+
import { quarantineScopeFor, recordQuarantine } from '../quarantine.js';
|
|
5
|
+
import { createMemory } from '../memory.js';
|
|
6
|
+
import { loadConfig } from '../config.js';
|
|
7
|
+
import { vetSecrets } from '../secret-detect.js';
|
|
8
|
+
export function remember(ctx, opts) {
|
|
9
|
+
const vetted = vetSecrets(opts.content, opts.tags ?? [], opts.untrusted === true);
|
|
10
|
+
const detection = opts.untrusted ? detectInstruction(vetted.content) : { flagged: false, reason: null };
|
|
11
|
+
const requestedScope = opts.scope ?? null;
|
|
12
|
+
const entry = createMemory(vetted.content, {
|
|
13
|
+
kind: opts.kind ?? 'distilled',
|
|
14
|
+
scope: detection.flagged ? quarantineScopeFor(requestedScope) : requestedScope,
|
|
15
|
+
owner: opts.owner ?? null,
|
|
16
|
+
artifact_ref: opts.artifactRef ?? null,
|
|
17
|
+
tags: opts.tags,
|
|
18
|
+
tenantId: ctx.tenantId,
|
|
19
|
+
baseHalfLifeDays: loadConfig(ctx.hippoRoot).defaultHalfLifeDays,
|
|
20
|
+
});
|
|
21
|
+
// writeEntry threads ctx.actor.subject into its internal audit hook, so exactly
|
|
22
|
+
// one 'remember' event lands in the log with the supplied actor.
|
|
23
|
+
const afterWrite = detection.flagged
|
|
24
|
+
? (db, memoryId) => {
|
|
25
|
+
recordQuarantine(db, {
|
|
26
|
+
tenantId: ctx.tenantId,
|
|
27
|
+
memoryId,
|
|
28
|
+
originalScope: requestedScope,
|
|
29
|
+
reason: detection.reason ?? 'unknown',
|
|
30
|
+
actor: ctx.actor.subject,
|
|
31
|
+
});
|
|
32
|
+
opts.afterWrite?.(db, memoryId);
|
|
33
|
+
}
|
|
34
|
+
: opts.afterWrite;
|
|
35
|
+
writeEntry(ctx.hippoRoot, entry, { actor: ctx.actor.subject, afterWrite });
|
|
36
|
+
const result = { id: entry.id, kind: entry.kind, tenantId: ctx.tenantId };
|
|
37
|
+
if (detection.flagged)
|
|
38
|
+
result.quarantined = { reason: detection.reason ?? 'unknown' };
|
|
39
|
+
if (vetted.warnings.length > 0)
|
|
40
|
+
result.warnings = vetted.warnings;
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=remember.js.map
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { loadAllEntries } from '../store/entry-reads.js';
|
|
2
|
+
import { deleteEntry } from '../store/delete-and-batch.js';
|
|
3
|
+
import { auditMemories } from '../audit.js';
|
|
4
|
+
import { autoShare } from '../shared.js';
|
|
5
|
+
import { consolidate } from '../consolidate/sleep.js';
|
|
6
|
+
import { loadConfig } from '../config.js';
|
|
7
|
+
import { deduplicateStore } from '../dedupe.js';
|
|
8
|
+
import { computeAmbientState, type AmbientState } from '../ambient.js';
|
|
9
|
+
import { loadPendingExtractionTenants } from '../graph/read.js';
|
|
10
|
+
import { extractGraph } from '../graph-extract.js';
|
|
11
|
+
import type { Context } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Options for `sleep` — run the pure-storage consolidation pipeline
|
|
14
|
+
* (consolidate + dedup + audit + share + ambient) and return structured counts.
|
|
15
|
+
*
|
|
16
|
+
* Extracted from `cmdSleepCore` Phase 2-6 in Episode A. NOT covered by api.sleep:
|
|
17
|
+
* the cli-only auto-learn phase (Phase 1: learnFromRepo + the agent memory import),
|
|
18
|
+
* which is intrinsically host-bound (uses `process.cwd()` / `os.homedir()`).
|
|
19
|
+
* Auto-learn stays in cli.ts cmdSleepCore as a pre-api block.
|
|
20
|
+
*
|
|
21
|
+
* The CLI `cmdSleep` wrapper continues to own the log-file tee + console
|
|
22
|
+
* rendering + `process.exit`; `api.sleep` is pure (no console.log, no IO
|
|
23
|
+
* beyond the store).
|
|
24
|
+
*/
|
|
25
|
+
export interface SleepOpts {
|
|
26
|
+
dryRun?: boolean;
|
|
27
|
+
noShare?: boolean;
|
|
28
|
+
/**
|
|
29
|
+
* @internal Test-only DI seam — see `tests/api-sleep-phase-faults.test.ts`.
|
|
30
|
+
* Override one or more phase dependencies (typically a throwing stub) to
|
|
31
|
+
* force mid-phase failure paths deterministically. Production callers
|
|
32
|
+
* MUST NOT use this field. The runtime defaults at `DEFAULT_SLEEP_PHASES`
|
|
33
|
+
* preserve all current behaviour when `__phases` is undefined.
|
|
34
|
+
*/
|
|
35
|
+
__phases?: Partial<SleepPhases>;
|
|
36
|
+
}
|
|
37
|
+
export interface SleepResult {
|
|
38
|
+
active: number;
|
|
39
|
+
removed: number;
|
|
40
|
+
/**
|
|
41
|
+
* Faded memories the decay pass moved to the dormant store instead of
|
|
42
|
+
* deleting (config `dormant.enabled`). Absent when 0. Per-invocation
|
|
43
|
+
* activity counter, same class as `removed`.
|
|
44
|
+
*/
|
|
45
|
+
dormant?: number;
|
|
46
|
+
/**
|
|
47
|
+
* Dormant memories deleted for good this sleep because they outlived
|
|
48
|
+
* `dormant.retentionDays`. Absent when 0. Same per-invocation class as
|
|
49
|
+
* `removed`.
|
|
50
|
+
*/
|
|
51
|
+
dormantExpired?: number;
|
|
52
|
+
mergedEpisodic: number;
|
|
53
|
+
newSemantic: number;
|
|
54
|
+
dryRun: boolean;
|
|
55
|
+
deduped?: {
|
|
56
|
+
removed: number;
|
|
57
|
+
semDups: number;
|
|
58
|
+
epiDups: number;
|
|
59
|
+
crossDups: number;
|
|
60
|
+
};
|
|
61
|
+
audit?: {
|
|
62
|
+
errorsRemoved: number;
|
|
63
|
+
warningCount: number;
|
|
64
|
+
};
|
|
65
|
+
shared?: number;
|
|
66
|
+
/**
|
|
67
|
+
* v1.25.0: count of memories the auto-share secret veto withheld this sleep
|
|
68
|
+
* — rows that passed every other admission gate (transfer score,
|
|
69
|
+
* not-already-global) and were blocked solely by `detectSecret`. Absent
|
|
70
|
+
* when 0 or when auto-share did not run.
|
|
71
|
+
*/
|
|
72
|
+
secretSkipped?: number;
|
|
73
|
+
/**
|
|
74
|
+
* AT1: count of auto-share candidates the GLOBAL store's rejection
|
|
75
|
+
* tombstone refused this sleep (docs/plans/2026-08-15-at1-rejected-value-tombstone.md
|
|
76
|
+
* plan §3 — copy paths must not let one rejected candidate abort the
|
|
77
|
+
* batch). Absent when 0 or when auto-share did not run.
|
|
78
|
+
*/
|
|
79
|
+
rejectedSkipped?: number;
|
|
80
|
+
ambient?: AmbientState | null;
|
|
81
|
+
/**
|
|
82
|
+
* E3 sleep enqueue-hook: graph re-extraction totals across the tenants rebuilt
|
|
83
|
+
* this sleep. Absent when no tenant was dirty, and under dryRun (the graph
|
|
84
|
+
* phase runs only on a real sleep). Cross-tenant aggregate, one reason
|
|
85
|
+
* /v1/sleep stays loopback-only.
|
|
86
|
+
*/
|
|
87
|
+
graph?: {
|
|
88
|
+
tenants: number;
|
|
89
|
+
entities: number;
|
|
90
|
+
relations: number;
|
|
91
|
+
};
|
|
92
|
+
details?: string[];
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Run the pure-storage consolidation pipeline.
|
|
96
|
+
*
|
|
97
|
+
* Tenant scope note: sleep operates on the WHOLE hippoRoot (all tenants in
|
|
98
|
+
* it), matching the pre-refactor cmdSleepCore behavior. Correct for a CLI
|
|
99
|
+
* maintenance op invoked by the operator. Episode B (v1.11.4) exposed this
|
|
100
|
+
* over HTTP `/v1/sleep` with loopback-only enforcement (per-request guard
|
|
101
|
+
* in the handler plus serve()'s boot-time host check). The TODOS.md
|
|
102
|
+
* per-tenant scoping follow-up remains open for the day non-loopback
|
|
103
|
+
* serving lands — at that point the route will need an admin-role gate OR
|
|
104
|
+
* api.sleep itself will need to scope dedup / audit / delete by ctx.tenantId.
|
|
105
|
+
*
|
|
106
|
+
* Dedup and audit deletes each log a `forget` row with the ctx actor and a
|
|
107
|
+
* `metadata.reason`. Pinned, raw, kept and object-backing rows are never auto-deleted (AUTOMATIC_DELETE_SQL).
|
|
108
|
+
* dryRun previews consolidate, dedup and audit, then returns before share/ambient.
|
|
109
|
+
*/
|
|
110
|
+
/**
|
|
111
|
+
* v1.12.2: Test-only DI seam shape for `sleep`'s phase dependencies.
|
|
112
|
+
*
|
|
113
|
+
* Each field defaults to the real production implementation imported at the
|
|
114
|
+
* top of this file. Test files pass a `Partial<SleepPhases>` override via
|
|
115
|
+
* `SleepOpts.__phases` (note the `__` prefix — internal-only) to inject
|
|
116
|
+
* deterministic throws for mid-phase failure-path coverage (the
|
|
117
|
+
* `partial: true` + `errorMessage` audit-row branch at line ~2098).
|
|
118
|
+
*
|
|
119
|
+
* Production callers MUST NOT use `__phases`. The field exists solely so
|
|
120
|
+
* `tests/api-sleep-phase-faults.test.ts` can force each phase boundary to
|
|
121
|
+
* throw without depending on store-corruption fragility.
|
|
122
|
+
*/
|
|
123
|
+
export interface SleepPhases {
|
|
124
|
+
consolidate: typeof consolidate;
|
|
125
|
+
deduplicateStore: typeof deduplicateStore;
|
|
126
|
+
auditMemories: typeof auditMemories;
|
|
127
|
+
autoShare: typeof autoShare;
|
|
128
|
+
loadAllEntries: typeof loadAllEntries;
|
|
129
|
+
deleteEntry: typeof deleteEntry;
|
|
130
|
+
computeAmbientState: typeof computeAmbientState;
|
|
131
|
+
loadConfig: typeof loadConfig;
|
|
132
|
+
loadPendingExtractionTenants: typeof loadPendingExtractionTenants;
|
|
133
|
+
extractGraph: typeof extractGraph;
|
|
134
|
+
}
|
|
135
|
+
export declare function sleep(ctx: Context, opts?: SleepOpts): Promise<SleepResult>;
|
|
136
|
+
//# sourceMappingURL=sleep.d.ts.map
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
// The sleep cycle: decay, consolidation, dedupe, graph extraction and the other maintenance passes.
|
|
2
|
+
import { openHippoDb, closeHippoDb } from '../db.js';
|
|
3
|
+
import { loadAllEntries } from '../store/entry-reads.js';
|
|
4
|
+
import { deleteEntry, memoriesBackingObjects } from '../store/delete-and-batch.js';
|
|
5
|
+
import { appendAuditEvent, reportAuditWriteFailure, auditMemories } from '../audit.js';
|
|
6
|
+
import { autoShare } from '../shared.js';
|
|
7
|
+
import { consolidate } from '../consolidate/sleep.js';
|
|
8
|
+
import { loadConfig } from '../config.js';
|
|
9
|
+
import { deduplicateStore } from '../dedupe.js';
|
|
10
|
+
import { computeAmbientState } from '../ambient.js';
|
|
11
|
+
import { loadPendingExtractionTenants } from '../graph/read.js';
|
|
12
|
+
import { markPendingProcessedUpTo } from '../graph/write.js';
|
|
13
|
+
import { extractGraph } from '../graph-extract.js';
|
|
14
|
+
const DEFAULT_SLEEP_PHASES = {
|
|
15
|
+
consolidate,
|
|
16
|
+
deduplicateStore,
|
|
17
|
+
auditMemories,
|
|
18
|
+
autoShare,
|
|
19
|
+
loadAllEntries,
|
|
20
|
+
deleteEntry,
|
|
21
|
+
computeAmbientState,
|
|
22
|
+
loadConfig,
|
|
23
|
+
loadPendingExtractionTenants,
|
|
24
|
+
extractGraph,
|
|
25
|
+
};
|
|
26
|
+
export async function sleep(ctx, opts = {}) {
|
|
27
|
+
const dryRun = Boolean(opts.dryRun);
|
|
28
|
+
// v1.12.2: resolve phase dependencies, allowing test-only `__phases`
|
|
29
|
+
// override to inject deterministic throws for mid-phase failure coverage.
|
|
30
|
+
const phases = { ...DEFAULT_SLEEP_PHASES, ...(opts.__phases ?? {}) };
|
|
31
|
+
// v1.11.5: phase counters for the consolidate audit emit (in finally).
|
|
32
|
+
// Accumulated as each phase completes so partial-failure paths still report
|
|
33
|
+
// accurate "what got done before the failure" data.
|
|
34
|
+
let consolidationCount = 0;
|
|
35
|
+
let dedupCount = 0;
|
|
36
|
+
let auditDeletedCount = 0;
|
|
37
|
+
let ambientTotal = 0;
|
|
38
|
+
let phaseError = null;
|
|
39
|
+
let graphSnapshotError = null;
|
|
40
|
+
let result = null;
|
|
41
|
+
try {
|
|
42
|
+
// Snapshot dirty tenants BEFORE any memory-deleting phase (consolidate /
|
|
43
|
+
// dedup / audit). The graph_extraction_queue rows are FK'd to mirror
|
|
44
|
+
// memories with ON DELETE CASCADE, so a phase that deletes a queued mirror
|
|
45
|
+
// (e.g. dedup removing a near-duplicate superseding decision) would drop the
|
|
46
|
+
// tenant from a drain-time load and leave its graph stale (codex P1). The
|
|
47
|
+
// MAX(id) watermark captured here stays valid: arrivals during sleep get a
|
|
48
|
+
// higher id and remain pending.
|
|
49
|
+
//
|
|
50
|
+
// Fail-soft (codex P2): a queue-read failure here must NOT abort core sleep
|
|
51
|
+
// (consolidation / dedup / audit run regardless). On failure, skip graph
|
|
52
|
+
// refresh this sleep (recovered next sleep) and surface a detail once
|
|
53
|
+
// `result` exists (Phase 6).
|
|
54
|
+
let dirtyTenants = [];
|
|
55
|
+
if (!dryRun) {
|
|
56
|
+
try {
|
|
57
|
+
dirtyTenants = phases.loadPendingExtractionTenants(ctx.hippoRoot);
|
|
58
|
+
}
|
|
59
|
+
catch (snapErr) {
|
|
60
|
+
// SAFETY: this is a best-effort log message only; property access on
|
|
61
|
+
// any JS value is safe (undefined if absent), preserving the existing
|
|
62
|
+
// lenient formatting even when something non-Error was thrown.
|
|
63
|
+
graphSnapshotError = snapErr.message;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Phase 1: Consolidation.
|
|
67
|
+
const consolidateResult = await phases.consolidate(ctx.hippoRoot, { dryRun });
|
|
68
|
+
consolidationCount = consolidateResult.semanticCreated + consolidateResult.merged;
|
|
69
|
+
result = {
|
|
70
|
+
active: consolidateResult.decayed,
|
|
71
|
+
removed: consolidateResult.removed,
|
|
72
|
+
mergedEpisodic: consolidateResult.merged,
|
|
73
|
+
newSemantic: consolidateResult.semanticCreated,
|
|
74
|
+
dryRun,
|
|
75
|
+
details: consolidateResult.details,
|
|
76
|
+
};
|
|
77
|
+
// Set only when non-zero, so a store without dormant memories gets a
|
|
78
|
+
// byte-identical result (HTTP /v1/sleep, the CLI render snapshot).
|
|
79
|
+
if (consolidateResult.dormant > 0) {
|
|
80
|
+
result.dormant = consolidateResult.dormant;
|
|
81
|
+
}
|
|
82
|
+
if (consolidateResult.dormantExpired > 0) {
|
|
83
|
+
result.dormantExpired = consolidateResult.dormantExpired;
|
|
84
|
+
}
|
|
85
|
+
// Phase 2: Dedup (post-consolidate near-duplicate cleanup).
|
|
86
|
+
const dedupResult = phases.deduplicateStore(ctx.hippoRoot, { dryRun, actor: ctx.actor.subject });
|
|
87
|
+
dedupCount = dedupResult.removed;
|
|
88
|
+
if (dedupResult.removed > 0) {
|
|
89
|
+
const semDups = dedupResult.pairs.filter((p) => p.keptLayer === 'semantic' && p.removedLayer === 'semantic').length;
|
|
90
|
+
const epiDups = dedupResult.pairs.filter((p) => p.keptLayer === 'episodic' && p.removedLayer === 'episodic').length;
|
|
91
|
+
const crossDups = dedupResult.pairs.filter((p) => p.keptLayer !== p.removedLayer).length;
|
|
92
|
+
result.deduped = {
|
|
93
|
+
removed: dedupResult.removed,
|
|
94
|
+
semDups,
|
|
95
|
+
epiDups,
|
|
96
|
+
crossDups,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
// Phase 3: Quality audit (remove junk, report warnings; a dry run skips rows earlier phases would remove).
|
|
100
|
+
const planned = new Set(dryRun ? [...(consolidateResult.removedIds ?? []), ...dedupResult.pairs.map((p) => p.removed)] : []);
|
|
101
|
+
const allEntries = phases.loadAllEntries(ctx.hippoRoot).filter((e) => !planned.has(e.id));
|
|
102
|
+
const auditOut = phases.auditMemories(allEntries, memoriesBackingObjects(ctx.hippoRoot));
|
|
103
|
+
if (auditOut.issues.length > 0) {
|
|
104
|
+
const errors = auditOut.issues.filter((i) => i.severity === 'error');
|
|
105
|
+
const warnings = auditOut.issues.filter((i) => i.severity === 'warning');
|
|
106
|
+
let removed = 0;
|
|
107
|
+
for (const issue of errors) {
|
|
108
|
+
const reason = `sleep-audit: ${issue.reason}`;
|
|
109
|
+
if (dryRun || phases.deleteEntry(ctx.hippoRoot, issue.memoryId, { actor: ctx.actor.subject, reason, automatic: true }))
|
|
110
|
+
removed++;
|
|
111
|
+
}
|
|
112
|
+
auditDeletedCount = removed;
|
|
113
|
+
if (removed > 0 || warnings.length > 0) {
|
|
114
|
+
result.audit = {
|
|
115
|
+
errorsRemoved: removed,
|
|
116
|
+
warningCount: warnings.length,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (dryRun)
|
|
121
|
+
return result;
|
|
122
|
+
// Phase 4: Auto-share high-transfer-score memories to global.
|
|
123
|
+
if (!opts.noShare) {
|
|
124
|
+
const sleepConfig = phases.loadConfig(ctx.hippoRoot);
|
|
125
|
+
if (sleepConfig.autoShareOnSleep) {
|
|
126
|
+
// v1.25.0: surface the secret-veto skip count (v39 follow-up #2) so
|
|
127
|
+
// the veto is observable instead of silent.
|
|
128
|
+
// AT1: rejectedSkipped is autoShare's sibling counter for candidates
|
|
129
|
+
// the global store's rejection tombstone refused (threaded the same
|
|
130
|
+
// way as secretSkipped just below).
|
|
131
|
+
const autoShareStats = { secretSkipped: 0, rejectedSkipped: 0 };
|
|
132
|
+
const shared = phases.autoShare(ctx.hippoRoot, { minScore: 0.6, stats: autoShareStats });
|
|
133
|
+
if (shared.length > 0) {
|
|
134
|
+
result.shared = shared.length;
|
|
135
|
+
}
|
|
136
|
+
if (autoShareStats.secretSkipped > 0) {
|
|
137
|
+
result.secretSkipped = autoShareStats.secretSkipped;
|
|
138
|
+
}
|
|
139
|
+
if (autoShareStats.rejectedSkipped > 0) {
|
|
140
|
+
result.rejectedSkipped = autoShareStats.rejectedSkipped;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Phase 5: Post-sleep ambient state summary.
|
|
145
|
+
const postSleepConfig = phases.loadConfig(ctx.hippoRoot);
|
|
146
|
+
if (postSleepConfig.ambient.enabled) {
|
|
147
|
+
const postSleepEntries = phases.loadAllEntries(ctx.hippoRoot).filter((e) => !e.superseded_by);
|
|
148
|
+
if (postSleepEntries.length > 0) {
|
|
149
|
+
result.ambient = phases.computeAmbientState(postSleepEntries);
|
|
150
|
+
ambientTotal = result.ambient.totalMemories;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Phase 6: Graph extraction drain (E3 sleep enqueue-hook). Rebuild the
|
|
154
|
+
// entity/relation graph for every tenant marked dirty (by markGraphDirty)
|
|
155
|
+
// since the last sleep, so `recall --hops` + cross-object `references` edges
|
|
156
|
+
// run on fresh data without a manual `hippo graph extract`. Fully
|
|
157
|
+
// fault-isolated: the consolidation work above has already committed, so a
|
|
158
|
+
// failure here must never abort sleep; a per-tenant extract failure leaves
|
|
159
|
+
// that tenant's queue items pending for the next sleep. (Skipped under
|
|
160
|
+
// dryRun via the early return above.)
|
|
161
|
+
try {
|
|
162
|
+
if (graphSnapshotError) {
|
|
163
|
+
// The dirty-tenant snapshot failed (codex P2 fail-soft). Core sleep
|
|
164
|
+
// already succeeded; surface the skipped graph refresh as a detail.
|
|
165
|
+
result.details = [
|
|
166
|
+
...(result.details ?? []),
|
|
167
|
+
`graph: dirty-tenant snapshot failed (skipped graph refresh): ${graphSnapshotError}`,
|
|
168
|
+
];
|
|
169
|
+
}
|
|
170
|
+
let gTenants = 0;
|
|
171
|
+
let gEntities = 0;
|
|
172
|
+
let gRelations = 0;
|
|
173
|
+
// dirtyTenants was snapshotted before the memory-deleting phases above.
|
|
174
|
+
for (const { tenantId, maxPendingId } of dirtyTenants) {
|
|
175
|
+
try {
|
|
176
|
+
const ext = phases.extractGraph(ctx.hippoRoot, tenantId);
|
|
177
|
+
// Count the rebuild as soon as it succeeds — it happened regardless of
|
|
178
|
+
// the drain-mark below.
|
|
179
|
+
gTenants += 1;
|
|
180
|
+
gEntities += ext.entities;
|
|
181
|
+
gRelations += ext.relations;
|
|
182
|
+
// Watermark drain: mark processed only items enqueued before this
|
|
183
|
+
// rebuild started (id <= maxPendingId). Arrivals during the rebuild
|
|
184
|
+
// keep pending status and are caught next sleep; rows whose mirror was
|
|
185
|
+
// cascade-deleted earlier this sleep are already gone (no-op).
|
|
186
|
+
markPendingProcessedUpTo(ctx.hippoRoot, tenantId, maxPendingId);
|
|
187
|
+
}
|
|
188
|
+
catch (tenantErr) {
|
|
189
|
+
// SAFETY: this is a best-effort log message only; property access
|
|
190
|
+
// on any JS value is safe (undefined if absent), preserving the
|
|
191
|
+
// existing lenient formatting even when something non-Error was thrown.
|
|
192
|
+
result.details = [
|
|
193
|
+
...(result.details ?? []),
|
|
194
|
+
`graph: extract failed for a dirty tenant (left pending): ${tenantErr.message}`,
|
|
195
|
+
];
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (gTenants > 0) {
|
|
199
|
+
result.graph = { tenants: gTenants, entities: gEntities, relations: gRelations };
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
catch (graphErr) {
|
|
203
|
+
// SAFETY: this is a best-effort log message only; property access on
|
|
204
|
+
// any JS value is safe (undefined if absent), preserving the existing
|
|
205
|
+
// lenient formatting even when something non-Error was thrown.
|
|
206
|
+
result.details = [
|
|
207
|
+
...(result.details ?? []),
|
|
208
|
+
`graph: drain phase failed (skipped): ${graphErr.message}`,
|
|
209
|
+
];
|
|
210
|
+
}
|
|
211
|
+
return result;
|
|
212
|
+
}
|
|
213
|
+
catch (err) {
|
|
214
|
+
// SAFETY: phaseError is read via phaseError.message / (phaseError !==
|
|
215
|
+
// null) below, both safe even if a non-Error was thrown; this mirrors
|
|
216
|
+
// the existing lenient (err as Error) pattern used throughout this catch chain.
|
|
217
|
+
phaseError = err;
|
|
218
|
+
throw err;
|
|
219
|
+
}
|
|
220
|
+
finally {
|
|
221
|
+
// v1.11.5: emit one 'consolidate' audit_log row per api.sleep invocation,
|
|
222
|
+
// with phase counters in metadata. Closes the CLI/MCP parity gap that T6
|
|
223
|
+
// fixed for cmdOutcome (Episode A follow-up). In finally so partial-failure
|
|
224
|
+
// paths still emit; `partial: true` + errorMessage flag the failure.
|
|
225
|
+
// Dedicated handle for this emit only (phase helpers above each open their
|
|
226
|
+
// own handle via hippoRoot — SQLite single-writer makes parallel handles
|
|
227
|
+
// safe for the read-heavy phases).
|
|
228
|
+
//
|
|
229
|
+
// TODO(v1.12.0 + A5 v2): the audit row is tagged with ctx.tenantId but
|
|
230
|
+
// api.sleep is host-wide (cross-tenant dedup is intentional). When
|
|
231
|
+
// /v1/sleep moves off loopback-only, either tag with a synthetic "host"
|
|
232
|
+
// tenant or scope api.sleep per-tenant. Independent-review-critic flag,
|
|
233
|
+
// v1.11.5 ship.
|
|
234
|
+
//
|
|
235
|
+
// Error preservation: if openHippoDb or appendAuditEvent throws here, we
|
|
236
|
+
// do NOT let it replace the original phaseError (independent-review HIGH:
|
|
237
|
+
// would mask the underlying consolidation failure). Audit emit failure
|
|
238
|
+
// is logged to stderr but the original throw wins.
|
|
239
|
+
try {
|
|
240
|
+
const db = openHippoDb(ctx.hippoRoot);
|
|
241
|
+
try {
|
|
242
|
+
const sleepAuditMetadata = {
|
|
243
|
+
consolidationCount,
|
|
244
|
+
dedupCount,
|
|
245
|
+
auditDeletedCount,
|
|
246
|
+
ambientTotal,
|
|
247
|
+
dryRun,
|
|
248
|
+
noShare: opts.noShare ?? false,
|
|
249
|
+
partial: phaseError !== null,
|
|
250
|
+
triggeredByTenant: ctx.tenantId, // preserve for audit forensics
|
|
251
|
+
};
|
|
252
|
+
if (phaseError)
|
|
253
|
+
sleepAuditMetadata.errorMessage = phaseError.message;
|
|
254
|
+
appendAuditEvent(db, {
|
|
255
|
+
tenantId: '__host__',
|
|
256
|
+
actor: ctx.actor.subject,
|
|
257
|
+
op: 'consolidate',
|
|
258
|
+
metadata: { ...sleepAuditMetadata },
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
finally {
|
|
262
|
+
closeHippoDb(db);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
catch (auditErr) {
|
|
266
|
+
// Logged, never thrown: a second failure must not mask the original phaseError.
|
|
267
|
+
reportAuditWriteFailure('consolidate', String(auditErr));
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=sleep.js.map
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type TokenSummary, type TokenSurface } from '../token-ledger.js';
|
|
2
|
+
import { type FailureSummary } from '../failure-log.js';
|
|
3
|
+
import type { Context } from './types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Record memory text handed to an agent in the token ledger (ROADMAP TE0).
|
|
6
|
+
* Best-effort: never throws, because a ledger failure must not fail the
|
|
7
|
+
* recall or context call that produced the text.
|
|
8
|
+
*/
|
|
9
|
+
export declare function recordTokens(ctx: Context, surface: TokenSurface, use: {
|
|
10
|
+
items: number;
|
|
11
|
+
tokens: number;
|
|
12
|
+
sessionId?: string | null;
|
|
13
|
+
}): void;
|
|
14
|
+
/**
|
|
15
|
+
* Token ledger totals for the tenant over the last `days` days (default 30):
|
|
16
|
+
* tokens sent, skipped as unchanged and re-read by later model calls, per
|
|
17
|
+
* surface, with session counts and mean tokens per session.
|
|
18
|
+
*/
|
|
19
|
+
export declare function tokenSummary(ctx: Context, opts?: {
|
|
20
|
+
days?: number;
|
|
21
|
+
}): TokenSummary;
|
|
22
|
+
/** Failed tool calls by outcome, and repeats across sessions, over the last `days` days (default 30); ROADMAP CD13. */
|
|
23
|
+
export declare function failureSummary(ctx: Context, opts?: {
|
|
24
|
+
days?: number;
|
|
25
|
+
}): FailureSummary;
|
|
26
|
+
//# sourceMappingURL=tokens.d.ts.map
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// Token-use and failure reports.
|
|
2
|
+
import { openHippoDb, closeHippoDb } from '../db.js';
|
|
3
|
+
import { recordTokenUse, summarizeTokenUse } from '../token-ledger.js';
|
|
4
|
+
import { summarizeFailures } from '../failure-log.js';
|
|
5
|
+
import { log } from '../log.js';
|
|
6
|
+
/**
|
|
7
|
+
* Record memory text handed to an agent in the token ledger (ROADMAP TE0).
|
|
8
|
+
* Best-effort: never throws, because a ledger failure must not fail the
|
|
9
|
+
* recall or context call that produced the text.
|
|
10
|
+
*/
|
|
11
|
+
export function recordTokens(ctx, surface, use) {
|
|
12
|
+
try {
|
|
13
|
+
const db = openHippoDb(ctx.hippoRoot);
|
|
14
|
+
try {
|
|
15
|
+
recordTokenUse(db, {
|
|
16
|
+
tenantId: ctx.tenantId,
|
|
17
|
+
sessionId: use.sessionId ?? null,
|
|
18
|
+
surface,
|
|
19
|
+
event: 'inject',
|
|
20
|
+
items: use.items,
|
|
21
|
+
tokens: use.tokens,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
finally {
|
|
25
|
+
closeHippoDb(db);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
log.warnThenDebug('api-token-ledger', `token ledger write failed; the reply is unaffected: ${err instanceof Error ? err.message : String(err)}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Token ledger totals for the tenant over the last `days` days (default 30):
|
|
34
|
+
* tokens sent, skipped as unchanged and re-read by later model calls, per
|
|
35
|
+
* surface, with session counts and mean tokens per session.
|
|
36
|
+
*/
|
|
37
|
+
export function tokenSummary(ctx, opts = {}) {
|
|
38
|
+
const db = openHippoDb(ctx.hippoRoot);
|
|
39
|
+
try {
|
|
40
|
+
return summarizeTokenUse(db, ctx.tenantId, reportWindowStart(opts.days));
|
|
41
|
+
}
|
|
42
|
+
finally {
|
|
43
|
+
closeHippoDb(db);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** Failed tool calls by outcome, and repeats across sessions, over the last `days` days (default 30); ROADMAP CD13. */
|
|
47
|
+
export function failureSummary(ctx, opts = {}) {
|
|
48
|
+
const db = openHippoDb(ctx.hippoRoot);
|
|
49
|
+
try {
|
|
50
|
+
return summarizeFailures(db, ctx.tenantId, reportWindowStart(opts.days));
|
|
51
|
+
}
|
|
52
|
+
finally {
|
|
53
|
+
closeHippoDb(db);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function reportWindowStart(days) {
|
|
57
|
+
const span = days !== undefined && Number.isFinite(days) && days > 0 ? days : 30;
|
|
58
|
+
return new Date(Date.now() - span * 86_400_000).toISOString();
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=tokens.js.map
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { BadRequestError } from '../api-errors.js';
|
|
2
|
+
/**
|
|
3
|
+
* Actor identity + authorization role for a Context. v1.12.0 A5 v2 sub-1.
|
|
4
|
+
*
|
|
5
|
+
* Before v1.12.0, Context.actor was a bare string. v1.12.0 promotes it to an
|
|
6
|
+
* object carrying both the audit-log subject (formerly the string itself) and
|
|
7
|
+
* a role for /v1/sleep admin gating. Audit helpers continue accepting `string`
|
|
8
|
+
* — callers pass `ctx.actor.subject`. Role checks happen at the request
|
|
9
|
+
* boundary (e.g. /v1/sleep), except in authCreate and authRevoke (ForbiddenError).
|
|
10
|
+
*/
|
|
11
|
+
export interface Actor {
|
|
12
|
+
/** 'cli' | 'localhost:cli' | 'api_key:<key_id>' | 'mcp' | 'connector:slack' | 'connector:github' */
|
|
13
|
+
subject: string;
|
|
14
|
+
role: 'admin' | 'member';
|
|
15
|
+
/** EI2: restricted scopes a member key may read (auth.ts grantScope). Unused for admin actors. */
|
|
16
|
+
scopes?: readonly string[];
|
|
17
|
+
/** An auth resolver vouched for this caller, so its admin role stops at its own tenant. */
|
|
18
|
+
viaAuthResolver?: true;
|
|
19
|
+
/** The host's operator (CLI, stdio MCP, keyless loopback, host-tenant admin key): may act beyond its tenant. */
|
|
20
|
+
hostAdmin?: true;
|
|
21
|
+
}
|
|
22
|
+
export interface Context {
|
|
23
|
+
hippoRoot: string;
|
|
24
|
+
tenantId: string;
|
|
25
|
+
actor: Actor;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Helper for building process-local Actor values (admin and host admin),
|
|
29
|
+
* used by CLI and CLI-run connector Context constructors so the role
|
|
30
|
+
* boilerplate isn't repeated at every site. Bearer-authed callers (HTTP
|
|
31
|
+
* /v1/*) construct Actor directly from the api_keys row's role column via
|
|
32
|
+
* buildContextWithAuth in src/server.ts.
|
|
33
|
+
*/
|
|
34
|
+
export declare function adminActor(subject: string): Actor;
|
|
35
|
+
/**
|
|
36
|
+
* Thrown by `api.recall` when a caller's options violate a recall contract
|
|
37
|
+
* that has been opted into via env. Carries a stable `code` field for HTTP /
|
|
38
|
+
* MCP / CLI render paths to discriminate without parsing the message.
|
|
39
|
+
*
|
|
40
|
+
* Codes:
|
|
41
|
+
* - 'fresh_tail_requires_session_id' — `freshTailCount > 0` AND no
|
|
42
|
+
* `freshTailSessionId` AND `HIPPO_REQUIRE_SESSION_SCOPED_FRESH_TAIL=1`.
|
|
43
|
+
* Default behaviour (env unset) returns tenant-wide rows; the env gate
|
|
44
|
+
* is opt-in so multi-session tenants can fail loud instead of silently
|
|
45
|
+
* surfacing cross-session rows tagged `isFreshTail=true`.
|
|
46
|
+
* - 'invalid_scorer_window' — `opts.scorerWindow` is set to a non-positive,
|
|
47
|
+
* non-integer, or non-finite value. Pre-v1.7.0 the value 0 routed
|
|
48
|
+
* through FTS/LIKE `LIMIT 0` and then fell through to an uncapped
|
|
49
|
+
* full-store fallback (codex v1.7.0 diff-pass P1). Validated upfront
|
|
50
|
+
* so the contract holds.
|
|
51
|
+
*/
|
|
52
|
+
export declare class RecallContractError extends BadRequestError {
|
|
53
|
+
readonly code: 'fresh_tail_requires_session_id' | 'invalid_scorer_window';
|
|
54
|
+
constructor(code: 'fresh_tail_requires_session_id' | 'invalid_scorer_window', message: string);
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// Request context (caller identity and tenant) shared by every API module, plus the recall contract error.
|
|
2
|
+
import { BadRequestError } from '../api-errors.js';
|
|
3
|
+
/**
|
|
4
|
+
* Helper for building process-local Actor values (admin and host admin),
|
|
5
|
+
* used by CLI and CLI-run connector Context constructors so the role
|
|
6
|
+
* boilerplate isn't repeated at every site. Bearer-authed callers (HTTP
|
|
7
|
+
* /v1/*) construct Actor directly from the api_keys row's role column via
|
|
8
|
+
* buildContextWithAuth in src/server.ts.
|
|
9
|
+
*/
|
|
10
|
+
export function adminActor(subject) {
|
|
11
|
+
return { subject, role: 'admin', hostAdmin: true };
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Thrown by `api.recall` when a caller's options violate a recall contract
|
|
15
|
+
* that has been opted into via env. Carries a stable `code` field for HTTP /
|
|
16
|
+
* MCP / CLI render paths to discriminate without parsing the message.
|
|
17
|
+
*
|
|
18
|
+
* Codes:
|
|
19
|
+
* - 'fresh_tail_requires_session_id' — `freshTailCount > 0` AND no
|
|
20
|
+
* `freshTailSessionId` AND `HIPPO_REQUIRE_SESSION_SCOPED_FRESH_TAIL=1`.
|
|
21
|
+
* Default behaviour (env unset) returns tenant-wide rows; the env gate
|
|
22
|
+
* is opt-in so multi-session tenants can fail loud instead of silently
|
|
23
|
+
* surfacing cross-session rows tagged `isFreshTail=true`.
|
|
24
|
+
* - 'invalid_scorer_window' — `opts.scorerWindow` is set to a non-positive,
|
|
25
|
+
* non-integer, or non-finite value. Pre-v1.7.0 the value 0 routed
|
|
26
|
+
* through FTS/LIKE `LIMIT 0` and then fell through to an uncapped
|
|
27
|
+
* full-store fallback (codex v1.7.0 diff-pass P1). Validated upfront
|
|
28
|
+
* so the contract holds.
|
|
29
|
+
*/
|
|
30
|
+
export class RecallContractError extends BadRequestError {
|
|
31
|
+
code;
|
|
32
|
+
constructor(code, message) {
|
|
33
|
+
super(message);
|
|
34
|
+
this.name = 'RecallContractError';
|
|
35
|
+
this.code = code;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=types.js.map
|