hippo-memory 1.71.0 → 2.0.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 +7 -5
- package/dist/agent-memories/apply.d.ts +0 -11
- package/dist/agent-memories/apply.js +11 -26
- package/dist/agent-memories/claude-code.js +1 -1
- package/dist/agent-memories/codex.js +1 -1
- package/dist/agent-memories/copilot.d.ts +1 -3
- package/dist/agent-memories/copilot.js +1 -17
- package/dist/agent-memories/project-folds.d.ts +10 -0
- package/dist/agent-memories/project-folds.js +34 -0
- package/dist/agent-memories/sync.js +8 -6
- package/dist/api/assemble.js +3 -2
- package/dist/api/audit.d.ts +30 -2
- package/dist/api/audit.js +48 -7
- package/dist/api/auth.d.ts +11 -9
- package/dist/api/auth.js +39 -40
- package/dist/api/auto-sleep.d.ts +5 -2
- package/dist/api/auto-sleep.js +7 -3
- package/dist/api/availability.js +2 -3
- package/dist/api/cards.d.ts +42 -0
- package/dist/api/cards.js +52 -0
- package/dist/api/conflicts.d.ts +28 -0
- package/dist/api/conflicts.js +61 -0
- package/dist/api/context-auto.js +4 -2
- package/dist/api/context-render.js +4 -3
- package/dist/api/context-select.js +15 -29
- package/dist/api/context.js +29 -18
- package/dist/api/continuity.d.ts +47 -0
- package/dist/api/continuity.js +66 -0
- package/dist/api/dormant.js +4 -2
- package/dist/api/drill-down.js +3 -2
- package/dist/api/embeddings.d.ts +17 -0
- package/dist/api/embeddings.js +28 -0
- package/dist/api/error-reply.d.ts +8 -0
- package/dist/api/error-reply.js +21 -0
- package/dist/api/forget.d.ts +7 -3
- package/dist/api/forget.js +24 -14
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +5 -9
- package/dist/api/graph.js +2 -1
- package/dist/api/index.d.ts +4 -2
- package/dist/api/index.js +4 -2
- package/dist/api/instruction-detect.js +5 -1
- package/dist/api/learn.d.ts +5 -1
- package/dist/api/learn.js +71 -44
- package/dist/api/ledger-db.d.ts +2 -6
- package/dist/api/ledger-db.js +4 -36
- package/dist/api/memories.d.ts +21 -1
- package/dist/api/memories.js +51 -1
- package/dist/api/objects.d.ts +1 -1
- package/dist/api/objects.js +2 -1
- package/dist/api/outcome.d.ts +5 -5
- package/dist/api/outcome.js +17 -16
- package/dist/api/pilot-arm.d.ts +1 -11
- package/dist/api/pilot-arm.js +5 -45
- package/dist/api/predictions.d.ts +3 -1
- package/dist/api/predictions.js +8 -1
- package/dist/api/projects.d.ts +21 -0
- package/dist/api/projects.js +24 -0
- package/dist/api/promote.d.ts +3 -3
- package/dist/api/promote.js +26 -28
- package/dist/api/prompt-hook.d.ts +17 -2
- package/dist/api/prompt-hook.js +45 -4
- package/dist/api/quarantine.js +2 -1
- package/dist/api/recall-cli.d.ts +3 -0
- package/dist/api/recall-cli.js +13 -4
- package/dist/api/recall-core.js +10 -5
- package/dist/api/recall-pipeline.js +23 -24
- package/dist/api/recall-request.js +1 -1
- package/dist/api/recall-types.d.ts +3 -1
- package/dist/api/recall.d.ts +0 -3
- package/dist/api/recall.js +51 -73
- package/dist/api/remember-local.d.ts +5 -2
- package/dist/api/remember-local.js +15 -7
- package/dist/api/remember.d.ts +7 -3
- package/dist/api/remember.js +19 -16
- package/dist/api/session-end.d.ts +46 -0
- package/dist/api/session-end.js +131 -0
- package/dist/api/sleep-run.d.ts +1 -1
- package/dist/api/sleep-run.js +16 -11
- package/dist/api/sleep.js +4 -3
- package/dist/api/status.d.ts +24 -0
- package/dist/api/status.js +40 -0
- package/dist/api/store-init.d.ts +4 -0
- package/dist/api/store-init.js +9 -0
- package/dist/api/tokens.js +2 -2
- package/dist/api/types.d.ts +3 -7
- package/dist/api/types.js +6 -1
- package/dist/capture/caller-session.d.ts +0 -3
- package/dist/capture/caller-session.js +1 -12
- package/dist/capture/capture-error.d.ts +2 -2
- package/dist/capture/capture-error.js +23 -18
- package/dist/capture/codex-patch.js +3 -1
- package/dist/capture/command.js +36 -95
- package/dist/capture/compact.js +10 -5
- package/dist/capture/compaction-items-caller.js +11 -20
- package/dist/capture/compaction-record.d.ts +7 -93
- package/dist/capture/compaction-record.js +29 -426
- package/dist/capture/compaction-spool.d.ts +7 -7
- package/dist/capture/compaction-spool.js +60 -51
- package/dist/capture/copilot-transcript.d.ts +2 -1
- package/dist/capture/copilot-transcript.js +2 -1
- package/dist/capture/extract.d.ts +5 -2
- package/dist/capture/extract.js +4 -3
- package/dist/capture/failure-caller.d.ts +1 -1
- package/dist/capture/failure-caller.js +21 -16
- package/dist/capture/failure-reading.d.ts +2 -1
- package/dist/capture/failure-reading.js +7 -9
- package/dist/capture/pre-compact-caller.js +5 -4
- package/dist/capture/session-digest.js +4 -3
- package/dist/capture/session-end-caller.js +3 -2
- package/dist/capture/session-worker.js +22 -10
- package/dist/capture/transcript.d.ts +2 -1
- package/dist/capture/transcript.js +6 -3
- package/dist/capture/working-state.d.ts +4 -2
- package/dist/capture/working-state.js +4 -2
- package/dist/cli/audit-prune.d.ts +0 -25
- package/dist/cli/audit-prune.js +1 -27
- package/dist/cli/audit.js +20 -20
- package/dist/cli/auth.d.ts +1 -1
- package/dist/cli/auth.js +16 -17
- package/dist/cli/briefs.d.ts +1 -4
- package/dist/cli/briefs.js +37 -292
- package/dist/cli/card.js +41 -33
- package/dist/cli/client.d.ts +6 -2
- package/dist/cli/client.js +37 -21
- package/dist/cli/compact-resume-payload.js +1 -1
- package/dist/cli/context.d.ts +1 -1
- package/dist/cli/context.js +13 -13
- package/dist/cli/continuity.d.ts +1 -1
- package/dist/cli/continuity.js +36 -39
- package/dist/cli/curate.d.ts +2 -2
- package/dist/cli/curate.js +32 -36
- package/dist/cli/dag.d.ts +1 -1
- package/dist/cli/dag.js +23 -8
- package/dist/cli/decisions.d.ts +0 -2
- package/dist/cli/decisions.js +7 -285
- package/dist/cli/eval.d.ts +1 -1
- package/dist/cli/eval.js +12 -13
- package/dist/cli/explain.d.ts +1 -1
- package/dist/cli/explain.js +21 -25
- package/dist/cli/flag-values.js +16 -6
- package/dist/cli/flags.d.ts +0 -289
- package/dist/cli/flags.js +3 -138
- package/dist/cli/graph.d.ts +3 -0
- package/dist/cli/graph.js +83 -0
- package/dist/cli/hook-runtime.d.ts +6 -6
- package/dist/cli/hook-runtime.js +9 -36
- package/dist/cli/incidents.d.ts +3 -0
- package/dist/cli/incidents.js +112 -0
- package/dist/cli/init.d.ts +1 -1
- package/dist/cli/init.js +28 -19
- package/dist/cli/install-steps.d.ts +2 -1
- package/dist/cli/install-steps.js +11 -3
- package/dist/cli/last-sleep.js +1 -1
- package/dist/cli/maintenance.d.ts +3 -3
- package/dist/cli/maintenance.js +29 -30
- package/dist/cli/notes.d.ts +2 -0
- package/dist/cli/notes.js +41 -0
- package/dist/cli/object-verbs.d.ts +2 -2
- package/dist/cli/object-verbs.js +4 -4
- package/dist/cli/open-browser.d.ts +14 -0
- package/dist/cli/open-browser.js +26 -0
- package/dist/cli/playbooks.d.ts +3 -4
- package/dist/cli/playbooks.js +126 -290
- package/dist/cli/predictions.d.ts +3 -0
- package/dist/cli/predictions.js +174 -0
- package/dist/cli/print.js +2 -1
- package/dist/cli/projects.js +30 -22
- package/dist/cli/quality-repair-once.d.ts +1 -1
- package/dist/cli/quality-repair-once.js +6 -5
- package/dist/cli/recall.js +13 -7
- package/dist/cli/refine-llm.js +18 -17
- package/dist/cli/remember.js +17 -17
- package/dist/cli/scheduler.js +2 -1
- package/dist/cli/serve.js +11 -6
- package/dist/cli/session-hooks.d.ts +1 -5
- package/dist/cli/session-hooks.js +89 -168
- package/dist/cli/setup.d.ts +1 -1
- package/dist/cli/setup.js +17 -10
- package/dist/cli/shared.d.ts +2 -6
- package/dist/cli/shared.js +9 -29
- package/dist/cli/sleep-render.js +6 -3
- package/dist/cli/sleep.js +6 -37
- package/dist/cli/status.d.ts +3 -3
- package/dist/cli/status.js +32 -35
- package/dist/cli/transfer.d.ts +3 -3
- package/dist/cli/transfer.js +64 -43
- package/dist/cli/usage.d.ts +1 -80
- package/dist/cli/usage.js +2 -696
- package/dist/cli/verb-row.d.ts +34 -0
- package/dist/cli/verb-row.js +6 -0
- package/dist/cli/verbs/health.d.ts +27 -0
- package/dist/cli/verbs/health.js +234 -0
- package/dist/cli/verbs/memory.d.ts +16 -0
- package/dist/cli/verbs/memory.js +236 -0
- package/dist/cli/verbs/objects.d.ts +20 -0
- package/dist/cli/verbs/objects.js +257 -0
- package/dist/cli/verbs/sessions.d.ts +31 -0
- package/dist/cli/verbs/sessions.js +314 -0
- package/dist/cli/verbs.d.ts +81 -0
- package/dist/cli/verbs.js +7 -0
- package/dist/cli/versioned-verbs.d.ts +51 -0
- package/dist/cli/versioned-verbs.js +79 -0
- package/dist/cli.d.ts +1 -272
- package/dist/cli.js +24 -315
- package/dist/connectors/dlq.d.ts +39 -3
- package/dist/connectors/dlq.js +39 -4
- package/dist/connectors/github/backfill.js +12 -3
- package/dist/connectors/github/deletion.js +2 -1
- package/dist/connectors/github/dlq.js +31 -73
- package/dist/connectors/github/ingest.d.ts +2 -6
- package/dist/connectors/github/ingest.js +5 -29
- package/dist/connectors/github/tenant-routing.js +2 -1
- package/dist/connectors/github/webhook.d.ts +2 -1
- package/dist/connectors/github/webhook.js +35 -2
- package/dist/connectors/ingest.d.ts +10 -0
- package/dist/connectors/ingest.js +29 -0
- package/dist/connectors/slack/deletion.js +2 -1
- package/dist/connectors/slack/dlq.js +49 -71
- package/dist/connectors/slack/ingest.d.ts +2 -6
- package/dist/connectors/slack/ingest.js +4 -28
- package/dist/connectors/slack/tenant-routing.js +2 -1
- package/dist/connectors/slack/webhook.d.ts +2 -1
- package/dist/connectors/slack/webhook.js +2 -1
- package/dist/consolidate/conflicts.js +2 -2
- package/dist/consolidate/dag.js +29 -18
- package/dist/consolidate/dedupe.d.ts +7 -0
- package/dist/consolidate/dedupe.js +6 -4
- package/dist/consolidate/llm-passes.js +45 -19
- package/dist/consolidate/memory-value.js +3 -2
- package/dist/consolidate/merge.js +8 -8
- package/dist/consolidate/physics-pass.d.ts +6 -1
- package/dist/consolidate/physics-pass.js +26 -6
- package/dist/consolidate/replay.js +11 -4
- package/dist/consolidate/sleep.js +9 -6
- package/dist/consolidate/traces.js +5 -5
- package/dist/core/ablation.d.ts +10 -0
- package/dist/core/ablation.js +12 -0
- package/dist/{sharing/scope.d.ts → core/active-scope.d.ts} +1 -1
- package/dist/{sharing/scope.js → core/active-scope.js} +1 -1
- package/dist/core/ambient.d.ts +4 -0
- package/dist/core/ambient.js +39 -18
- package/dist/core/api-errors.d.ts +16 -0
- package/dist/core/api-errors.js +20 -0
- package/dist/core/card.js +3 -1
- package/dist/core/compaction-timing.d.ts +7 -0
- package/dist/core/compaction-timing.js +9 -0
- package/dist/core/config.d.ts +1 -1
- package/dist/core/config.js +22 -18
- package/dist/core/cosine.d.ts +3 -0
- package/dist/core/cosine.js +19 -0
- package/dist/{store → core}/markdown.d.ts +1 -1
- package/dist/{store → core}/markdown.js +4 -4
- package/dist/core/memory-audit.d.ts +17 -0
- package/dist/core/memory-audit.js +54 -0
- package/dist/core/memory.d.ts +14 -8
- package/dist/core/memory.js +35 -23
- package/dist/{consolidate → core}/merged-row.d.ts +1 -1
- package/dist/{consolidate → core}/merged-row.js +1 -1
- package/dist/core/physics.d.ts +3 -1
- package/dist/core/physics.js +23 -18
- package/dist/core/prediction.d.ts +3 -0
- package/dist/core/prediction.js +6 -0
- package/dist/core/project-identity.d.ts +3 -0
- package/dist/core/project-identity.js +12 -2
- package/dist/{store → core}/recall-scope.d.ts +1 -10
- package/dist/{store → core}/recall-scope.js +2 -19
- package/dist/core/search-types.d.ts +1 -1
- package/dist/dashboard/dashboard-actions.d.ts +2 -2
- package/dist/dashboard/dashboard-actions.js +5 -5
- package/dist/dashboard/dashboard-queries.js +2 -7
- package/dist/dashboard/dashboard-snapshot.js +1 -3
- package/dist/dashboard/dashboard.js +16 -5
- package/dist/db/busy.d.ts +2 -7
- package/dist/db/busy.js +21 -26
- package/dist/db/connect.d.ts +2 -2
- package/dist/db/connect.js +7 -7
- package/dist/db/index.d.ts +3 -3
- package/dist/db/index.js +3 -3
- package/dist/db/migrate.js +14 -7
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/v11.js +1 -0
- package/dist/db/migrations/v14.js +1 -0
- package/dist/db/migrations/v55.d.ts +3 -0
- package/dist/db/migrations/v55.js +17 -0
- package/dist/db/open.d.ts +0 -2
- package/dist/db/open.js +6 -10
- package/dist/db/physics-state.d.ts +0 -4
- package/dist/db/physics-state.js +7 -33
- package/dist/db/request-stores.d.ts +1 -0
- package/dist/db/request-stores.js +2 -1
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -2
- package/dist/db/vector-store.js +19 -5
- package/dist/db/wal-checkpointer.js +2 -1
- package/dist/doctor.d.ts +3 -0
- package/dist/doctor.js +18 -15
- package/dist/embeddings/local.d.ts +62 -0
- package/dist/embeddings/local.js +146 -0
- package/dist/{store/embeddings → embeddings}/provider.d.ts +5 -2
- package/dist/{store/embeddings → embeddings}/provider.js +19 -25
- package/dist/embeddings/transformers.d.ts +26 -0
- package/dist/embeddings/transformers.js +89 -0
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +1 -1
- package/dist/entry/store-kit.d.ts +37 -0
- package/dist/entry/store-kit.js +25 -0
- package/dist/entry/testing.d.ts +6 -0
- package/dist/entry/testing.js +7 -0
- package/dist/eval/eval-suite.js +17 -11
- package/dist/eval/eval.js +1 -1
- package/dist/eval/judgment.js +12 -5
- package/dist/graph/extract.js +3 -3
- package/dist/graph/recall.js +1 -1
- package/dist/graph/view.js +13 -5
- package/dist/graph/write.d.ts +1 -1
- package/dist/graph/write.js +9 -9
- package/dist/hooks/codex-session.js +3 -2
- package/dist/hooks/codex-wrapper.js +2 -1
- package/dist/hooks/json-hooks.js +10 -4
- package/dist/hooks/opencode.js +8 -5
- package/dist/hooks/shared.d.ts +0 -6
- package/dist/hooks/shared.js +4 -15
- package/dist/importers/core.js +4 -4
- package/dist/importers/sources.js +5 -4
- package/dist/importers/vault.d.ts +1 -1
- package/dist/importers/vault.js +25 -23
- package/dist/index.d.ts +5 -4
- package/dist/index.js +4 -3
- package/dist/learn/autolearn.d.ts +15 -3
- package/dist/learn/autolearn.js +38 -16
- package/dist/learn/churn-git.js +13 -4
- package/dist/learn/extract.d.ts +3 -2
- package/dist/learn/extract.js +7 -5
- package/dist/learn/forward-claim-detector.js +4 -2
- package/dist/learn/invalidation.d.ts +2 -1
- package/dist/learn/invalidation.js +18 -9
- package/dist/mcp/admin-tools.d.ts +2 -2
- package/dist/mcp/admin-tools.js +27 -48
- package/dist/mcp/format.js +3 -2
- package/dist/mcp/framing.d.ts +1 -0
- package/dist/mcp/framing.js +1 -1
- package/dist/mcp/memory-tools.d.ts +1 -1
- package/dist/mcp/memory-tools.js +8 -9
- package/dist/mcp/protocol.d.ts +11 -7
- package/dist/mcp/protocol.js +25 -12
- package/dist/mcp/recall-tools.js +12 -9
- package/dist/mcp/request.js +22 -20
- package/dist/mcp/stdio.js +37 -16
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +44 -21
- package/dist/objects/customer-notes.d.ts +2 -2
- package/dist/objects/decisions.d.ts +2 -2
- package/dist/objects/descriptor.d.ts +1 -1
- package/dist/objects/incidents.d.ts +2 -2
- package/dist/objects/lifecycle.d.ts +1 -1
- package/dist/objects/lifecycle.js +2 -1
- package/dist/objects/policies.d.ts +2 -2
- package/dist/objects/policies.js +2 -1
- package/dist/objects/processes.d.ts +2 -2
- package/dist/objects/project-briefs.d.ts +2 -2
- package/dist/objects/project-briefs.js +2 -3
- package/dist/objects/skills.d.ts +2 -2
- package/dist/postinstall.js +1 -1
- package/dist/rerankers/clef.js +3 -6
- package/dist/rerankers/cross-encoder.d.ts +31 -2
- package/dist/rerankers/cross-encoder.js +71 -98
- package/dist/rerankers/index.js +5 -4
- package/dist/rerankers/jev.js +2 -4
- package/dist/rerankers/outage-warning.d.ts +3 -1
- package/dist/rerankers/outage-warning.js +5 -3
- package/dist/search/bm25-search.js +1 -1
- package/dist/search/boosts.js +1 -1
- package/dist/search/embed-memories.d.ts +12 -0
- package/dist/search/embed-memories.js +389 -0
- package/dist/search/engine.d.ts +8 -0
- package/dist/search/engine.js +10 -0
- package/dist/search/goal-boost.d.ts +1 -1
- package/dist/search/goal-boost.js +6 -3
- package/dist/search/hybrid.d.ts +9 -2
- package/dist/search/hybrid.js +9 -4
- package/dist/search/physics-search.d.ts +6 -3
- package/dist/search/physics-search.js +22 -15
- package/dist/search/rerank.js +1 -1
- package/dist/search/vector.d.ts +8 -6
- package/dist/search/vector.js +14 -17
- package/dist/server/auth.d.ts +3 -1
- package/dist/server/auth.js +24 -15
- package/dist/server/boot.d.ts +2 -1
- package/dist/server/boot.js +34 -84
- package/dist/server/client-ip.d.ts +9 -6
- package/dist/server/client-ip.js +36 -17
- package/dist/server/deadline.d.ts +0 -2
- package/dist/server/deadline.js +1 -7
- package/dist/server/defaults.d.ts +1 -0
- package/dist/server/defaults.js +1 -0
- package/dist/server/mcp-http.js +16 -11
- package/dist/server/request.js +7 -2
- package/dist/server/route-checks.d.ts +7 -0
- package/dist/server/route-checks.js +42 -0
- package/dist/server/route-table.d.ts +9 -8
- package/dist/server/route-table.js +127 -133
- package/dist/server/routes/admin.d.ts +8 -8
- package/dist/server/routes/admin.js +13 -21
- package/dist/server/routes/customer-notes.d.ts +6 -6
- package/dist/server/routes/customer-notes.js +1 -2
- package/dist/server/routes/decisions.d.ts +6 -6
- package/dist/server/routes/decisions.js +2 -4
- package/dist/server/routes/incidents.d.ts +6 -6
- package/dist/server/routes/incidents.js +2 -5
- package/dist/server/routes/memories.d.ts +9 -9
- package/dist/server/routes/memories.js +19 -40
- package/dist/server/routes/object-routes.d.ts +6 -6
- package/dist/server/routes/object-routes.js +4 -7
- package/dist/server/routes/policies.d.ts +7 -7
- package/dist/server/routes/policies.js +2 -4
- package/dist/server/routes/predictions.d.ts +6 -6
- package/dist/server/routes/predictions.js +9 -13
- package/dist/server/routes/processes.d.ts +6 -6
- package/dist/server/routes/processes.js +1 -2
- package/dist/server/routes/project-briefs.d.ts +7 -7
- package/dist/server/routes/project-briefs.js +2 -4
- package/dist/server/routes/recall.d.ts +5 -5
- package/dist/server/routes/recall.js +6 -10
- package/dist/server/routes/skills.d.ts +7 -7
- package/dist/server/routes/skills.js +2 -4
- package/dist/server/server-detect.d.ts +7 -1
- package/dist/server/server-detect.js +36 -11
- package/dist/server/sleep-child.js +26 -7
- package/dist/server/sleep-offload.d.ts +11 -5
- package/dist/server/sleep-offload.js +17 -11
- package/dist/server/tls.d.ts +7 -2
- package/dist/server/tls.js +17 -5
- package/dist/server/types.d.ts +29 -12
- package/dist/server/validation.d.ts +1 -2
- package/dist/server/validation.js +6 -11
- package/dist/server.d.ts +4 -40
- package/dist/server.js +3 -29
- package/dist/sharing/global-store.d.ts +4 -5
- package/dist/sharing/global-store.js +8 -13
- package/dist/sharing/global-sync.js +38 -45
- package/dist/sharing/project-merge.d.ts +7 -14
- package/dist/sharing/project-merge.js +57 -121
- package/dist/sharing/search-both.js +10 -3
- package/dist/sharing/share.d.ts +2 -0
- package/dist/sharing/share.js +39 -38
- package/dist/store/ambient.js +7 -7
- package/dist/store/audit-event.d.ts +1 -1
- package/dist/store/audit.d.ts +0 -16
- package/dist/store/audit.js +4 -55
- package/dist/store/auth.d.ts +4 -2
- package/dist/store/auth.js +7 -3
- package/dist/store/candidates.d.ts +3 -2
- package/dist/store/candidates.js +59 -30
- package/dist/store/capture-write.d.ts +17 -0
- package/dist/store/capture-write.js +35 -0
- package/dist/store/cards.js +6 -5
- package/dist/store/compaction-caller.d.ts +18 -0
- package/dist/store/compaction-caller.js +29 -0
- package/dist/store/compactions-record.d.ts +115 -0
- package/dist/store/compactions-record.js +418 -0
- package/dist/store/compactions.js +6 -4
- package/dist/store/conflicts.d.ts +7 -1
- package/dist/store/conflicts.js +13 -9
- package/dist/store/connectors/dlq.d.ts +10 -0
- package/dist/store/connectors/dlq.js +33 -0
- package/dist/store/connectors/event-log.d.ts +13 -0
- package/dist/store/connectors/event-log.js +24 -0
- package/dist/store/connectors/github.d.ts +7 -9
- package/dist/store/connectors/github.js +35 -60
- package/dist/store/connectors/slack.d.ts +2 -11
- package/dist/store/connectors/slack.js +24 -57
- package/dist/store/dashboard-reads.js +8 -6
- package/dist/store/delete-and-batch.d.ts +6 -0
- package/dist/store/delete-and-batch.js +40 -6
- package/dist/store/delivery-recorder.d.ts +12 -5
- package/dist/store/delivery-recorder.js +13 -11
- package/dist/store/descendant-page.js +8 -4
- package/dist/store/dormant.d.ts +1 -1
- package/dist/store/dormant.js +10 -4
- package/dist/store/embeddings/index.d.ts +2 -12
- package/dist/store/embeddings/index.js +5 -374
- package/dist/store/entry-reads.d.ts +35 -4
- package/dist/store/entry-reads.js +86 -19
- package/dist/store/entry-row.js +9 -2
- package/dist/store/entry-writes.d.ts +15 -12
- package/dist/store/entry-writes.js +54 -22
- package/dist/store/failure-log-at.d.ts +8 -0
- package/dist/store/failure-log-at.js +16 -0
- package/dist/store/failure-log.d.ts +2 -2
- package/dist/store/failure-log.js +5 -3
- package/dist/{trust → store}/gated-write.d.ts +3 -1
- package/dist/{trust → store}/gated-write.js +7 -5
- package/dist/store/goals.js +22 -19
- package/dist/store/graph-reads.js +9 -6
- package/dist/store/graph-view-rows.js +2 -1
- package/dist/store/graph-writes.d.ts +6 -6
- package/dist/store/graph-writes.js +48 -71
- package/dist/store/half-life.js +2 -2
- package/dist/store/handoffs.d.ts +10 -4
- package/dist/store/handoffs.js +10 -9
- package/dist/store/index-and-stats.js +2 -2
- package/dist/store/index.d.ts +2 -2
- package/dist/store/index.js +1 -1
- package/dist/store/key-writes.js +1 -1
- package/dist/store/ledger-turn.d.ts +9 -0
- package/dist/store/ledger-turn.js +38 -0
- package/dist/store/mirrors.js +19 -10
- package/dist/store/open.d.ts +2 -5
- package/dist/store/open.js +42 -54
- package/dist/store/pilot-arm.d.ts +12 -0
- package/dist/store/pilot-arm.js +42 -0
- package/dist/store/port.d.ts +68 -6
- package/dist/store/port.js +8 -0
- package/dist/store/predictions.d.ts +1 -2
- package/dist/store/predictions.js +3 -6
- package/dist/store/project-tags.d.ts +62 -0
- package/dist/store/project-tags.js +67 -0
- package/dist/store/quality-repair.js +1 -1
- package/dist/store/quarantine.js +2 -1
- package/dist/store/recall-trace.d.ts +2 -0
- package/dist/store/recall-trace.js +20 -3
- package/dist/store/rejected-values.js +16 -10
- package/dist/store/rejection-probe.d.ts +4 -0
- package/dist/store/rejection-probe.js +19 -0
- package/dist/store/rejection.d.ts +0 -17
- package/dist/store/rejection.js +1 -21
- package/dist/store/rows.js +2 -2
- package/dist/store/rule-sql.d.ts +11 -0
- package/dist/store/rule-sql.js +31 -6
- package/dist/store/search-rows.d.ts +5 -5
- package/dist/store/search-rows.js +18 -16
- package/dist/store/sessions.js +4 -2
- package/dist/store/set-aside.d.ts +14 -0
- package/dist/store/set-aside.js +23 -0
- package/dist/store/sqlite/busy.d.ts +3 -0
- package/dist/store/sqlite/busy.js +8 -0
- package/dist/store/sqlite/connector-events-group.js +4 -7
- package/dist/store/sqlite/connector-writes-group.js +6 -4
- package/dist/store/sqlite/entry-writes-group.d.ts +3 -3
- package/dist/store/sqlite/entry-writes-group.js +3 -3
- package/dist/store/sqlite/error-codec.js +4 -3
- package/dist/store/sqlite/executor.js +10 -4
- package/dist/store/sqlite/graph-reads-group.js +1 -1
- package/dist/store/sqlite/held-connection.d.ts +11 -0
- package/dist/store/sqlite/held-connection.js +41 -0
- package/dist/store/sqlite/last-recall-group.d.ts +13 -0
- package/dist/store/sqlite/last-recall-group.js +57 -0
- package/dist/store/sqlite/local.d.ts +0 -17
- package/dist/store/sqlite/local.js +0 -31
- package/dist/store/sqlite/maintenance-groups.d.ts +6 -0
- package/dist/store/sqlite/maintenance-groups.js +60 -0
- package/dist/store/sqlite/object-rows.d.ts +1 -1
- package/dist/store/sqlite/objects-group.d.ts +1 -1
- package/dist/store/sqlite/objects-group.js +15 -7
- package/dist/store/sqlite/store.d.ts +1 -8
- package/dist/store/sqlite/store.js +13 -22
- package/dist/store/summaries.d.ts +10 -3
- package/dist/store/summaries.js +54 -11
- package/dist/store/token-ledger-rows.js +3 -2
- package/dist/store/token-ledger.d.ts +0 -7
- package/dist/store/token-ledger.js +0 -35
- package/dist/store/vector-index.js +8 -4
- package/dist/support-bundle.js +2 -3
- package/dist/trust/reject-flow.js +2 -2
- package/dist/util/agent-homes.d.ts +15 -0
- package/dist/util/agent-homes.js +34 -0
- package/dist/util/anthropic-messages.d.ts +6 -1
- package/dist/util/anthropic-messages.js +26 -7
- package/dist/util/atomic-write.d.ts +5 -2
- package/dist/util/atomic-write.js +12 -8
- package/dist/util/chunked.d.ts +3 -0
- package/dist/util/chunked.js +10 -0
- package/dist/util/ellipsize.d.ts +3 -0
- package/dist/util/ellipsize.js +5 -0
- package/dist/util/env.d.ts +12 -2
- package/dist/util/env.js +12 -2
- package/dist/util/format.d.ts +5 -0
- package/dist/util/format.js +10 -0
- package/dist/util/hook-payload.d.ts +8 -0
- package/dist/util/hook-payload.js +37 -0
- package/dist/util/http-retry.d.ts +6 -0
- package/dist/util/http-retry.js +43 -5
- package/dist/util/http-util.d.ts +0 -8
- package/dist/util/http-util.js +10 -21
- package/dist/util/limits.d.ts +7 -0
- package/dist/util/limits.js +14 -0
- package/dist/util/log.d.ts +4 -0
- package/dist/util/log.js +9 -0
- package/dist/util/request-scope.d.ts +9 -3
- package/dist/util/request-scope.js +18 -9
- package/dist/util/secret-detect.js +6 -1
- package/dist/util/spawn-argv.d.ts +9 -0
- package/dist/util/spawn-argv.js +57 -0
- package/dist/util/sql.d.ts +3 -0
- package/dist/util/sql.js +6 -0
- package/dist/util/sqlite-blocked.d.ts +2 -0
- package/dist/util/sqlite-blocked.js +5 -0
- package/dist/util/stream-tee.d.ts +3 -0
- package/dist/util/stream-tee.js +35 -0
- package/dist/util/time.d.ts +4 -0
- package/dist/util/time.js +4 -0
- package/dist/util/vector-codec.d.ts +4 -0
- package/dist/util/vector-codec.js +15 -0
- package/dist/util/version.d.ts +1 -1
- package/dist/util/version.js +1 -1
- 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 +4 -2
- package/dist/api/on-store.d.ts +0 -16
- package/dist/api/on-store.js +0 -38
- package/dist/store/embeddings/local.d.ts +0 -15
- package/dist/store/embeddings/local.js +0 -175
- /package/dist/{cli → api}/correction-latency.d.ts +0 -0
- /package/dist/{cli → api}/correction-latency.js +0 -0
- /package/dist/{cli → api}/provenance-coverage.d.ts +0 -0
- /package/dist/{cli → api}/provenance-coverage.js +0 -0
- /package/dist/{store → core}/object-types.d.ts +0 -0
- /package/dist/{store → core}/object-types.js +0 -0
- /package/dist/{capture → util}/compaction-items.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.js +0 -0
- /package/dist/{store → util}/yaml.d.ts +0 -0
- /package/dist/{store → util}/yaml.js +0 -0
|
@@ -3,20 +3,20 @@
|
|
|
3
3
|
import { evalNow } from '../core/ablation.js';
|
|
4
4
|
import { oneCopyPerMemory } from './context-select.js';
|
|
5
5
|
import { compareEntryIdentity, compareScoresDesc } from '../core/compare.js';
|
|
6
|
-
import { isEmbeddingAvailable } from '../
|
|
6
|
+
import { isEmbeddingAvailable } from '../embeddings/local.js';
|
|
7
7
|
import { activeGoalsWithPolicies } from '../store/goals.js';
|
|
8
8
|
import { boostByGoals } from '../search/goal-boost.js';
|
|
9
9
|
import { graphExpandRecall } from '../graph/recall.js';
|
|
10
10
|
import { DEFAULT_GRAPH_STREAM_WEIGHT } from '../graph/stream.js';
|
|
11
11
|
import { Layer } from '../core/memory.js';
|
|
12
12
|
import { multihopSearch } from '../search/multihop.js';
|
|
13
|
-
import { passesCliRecallScopeFilter } from '../
|
|
13
|
+
import { passesCliRecallScopeFilter } from '../core/recall-scope.js';
|
|
14
14
|
import { currentEntries } from '../search/as-of.js';
|
|
15
15
|
import { STRENGTH_RANK_FLOOR, STRENGTH_RANK_SPAN } from '../search/boosts.js';
|
|
16
|
-
import { hybridSearch } from '../search/hybrid.js';
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
16
|
+
import { hybridSearch, vectorSourceOf } from '../search/hybrid.js';
|
|
17
|
+
import { searchByEngine } from '../search/engine.js';
|
|
18
|
+
import { rankBothStores } from '../sharing/search-both.js';
|
|
19
|
+
import { loadRecallEntries, recallScopeFilter } from '../store/search-rows.js';
|
|
20
20
|
import { isJsonNumber } from '../util/json.js';
|
|
21
21
|
import { textOverlap, tokenize as tokenizeQuery } from '../util/tokenize.js';
|
|
22
22
|
/** Ranks memories for a query as `hippo recall` does, through the `limit` slice. Reads stores, embeddings and physics state; writes and prints nothing
|
|
@@ -65,10 +65,9 @@ function loadRecallPool(ctx, opts) {
|
|
|
65
65
|
// An explicit --scope unlocks that envelope scope; the regex-only `<source>:private:*` deny is the JS half below.
|
|
66
66
|
const requested = opts.explicitScope || undefined;
|
|
67
67
|
const loadSuperseded = opts.includeSuperseded || Boolean(opts.asOf);
|
|
68
|
-
|
|
69
|
-
let
|
|
70
|
-
|
|
71
|
-
: [];
|
|
68
|
+
const load = { tenantId: ctx.tenantId, requestedScope: requested, explicitScopeMode: 'additive', includeSuperseded: loadSuperseded };
|
|
69
|
+
let local = loadRecallEntries(ctx.hippoRoot, opts.query, load);
|
|
70
|
+
let global = ctx.globalRoot ? loadRecallEntries(ctx.globalRoot, opts.query, load) : [];
|
|
72
71
|
// SQL-excluded rows are pre-candidate, so the total is taken before the JS filters, which normally drop nothing.
|
|
73
72
|
const total = local.length + global.length;
|
|
74
73
|
const passes = (e) => passesCliRecallScopeFilter(e.scope ?? null, requested);
|
|
@@ -98,7 +97,7 @@ async function searchPool(ctx, opts, pool) {
|
|
|
98
97
|
});
|
|
99
98
|
}
|
|
100
99
|
if (search.multihop) {
|
|
101
|
-
// Unlike
|
|
100
|
+
// Unlike rankBothStores below, multihop ranks one pooled list, so a shared memory's two copies both compete.
|
|
102
101
|
const allEntries = oneCopyPerMemory(pool.local, pool.global, evalNow()).flat();
|
|
103
102
|
return multihopSearch(query, allEntries, { budget, cost, hippoRoot: ctx.hippoRoot, minResults, includeSuperseded, asOf });
|
|
104
103
|
}
|
|
@@ -109,24 +108,24 @@ async function searchPool(ctx, opts, pool) {
|
|
|
109
108
|
includeSuperseded: includeSuperseded || Boolean(asOf),
|
|
110
109
|
admit: (e) => passesCliRecallScopeFilter(e.scope ?? null, requested),
|
|
111
110
|
};
|
|
112
|
-
if (search.usePhysics && !globalRoot) {
|
|
113
|
-
// Explain leaves minResults and includeSuperseded out to hold its output steady; asOf must reach physics or later rows leak.
|
|
114
|
-
const temporal = explain ? { asOf } : { minResults, includeSuperseded, asOf };
|
|
115
|
-
return physicsSearch(query, pool.local, {
|
|
116
|
-
budget, cost, hippoRoot: ctx.hippoRoot, physicsConfig: search.physicsConfig, scope, explain, vectorCandidates, ...temporal
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
111
|
if (globalRoot) {
|
|
120
|
-
//
|
|
121
|
-
return
|
|
112
|
+
// The pool already holds searchBothHybrid's additive-scope load for each store, so rank it rather than read both stores again.
|
|
113
|
+
return rankBothStores(query, { local: ctx.hippoRoot, global: globalRoot }, { local: pool.local, global: pool.global }, vectorCandidates, {
|
|
122
114
|
budget, cost, explain, mmr, mmrLambda, localBump: search.localBump, minResults, scope, tenantId: ctx.tenantId,
|
|
123
115
|
includeSuperseded, asOf,
|
|
124
|
-
recallScope: opts.explicitScope ? { requested: opts.explicitScope, additive: true } : {},
|
|
125
116
|
});
|
|
126
117
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
}
|
|
118
|
+
const physics = search.usePhysics ? search.physicsConfig : null;
|
|
119
|
+
// Physics takes no MMR; explain drops minResults and includeSuperseded to hold its output steady; asOf must reach physics or later rows leak.
|
|
120
|
+
const tuning = !physics ? { mmr, mmrLambda, minResults, includeSuperseded, asOf } : explain ? { asOf } : { minResults, includeSuperseded, asOf };
|
|
121
|
+
return searchByEngine(hippoDbSource(ctx.hippoRoot), query, pool.local, physics, { budget, cost, scope, explain, vectorCandidates, ...tuning });
|
|
122
|
+
}
|
|
123
|
+
/** The CLI core holds no store: it ranks on hippo.db under its root, as its loads above do. */
|
|
124
|
+
function hippoDbSource(hippoRoot) {
|
|
125
|
+
const source = vectorSourceOf({ hippoRoot });
|
|
126
|
+
if (!source)
|
|
127
|
+
throw new Error('The CLI ranking core needs a hippo root to rank on');
|
|
128
|
+
return source;
|
|
130
129
|
}
|
|
131
130
|
/** Adds memories reached by walking the entity graph out from the lexical seeds. */
|
|
132
131
|
function expandGraph(ctx, opts, graph, state) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// The recall and context input rules in one copy, so MCP and HTTP reject the same inputs with the same messages.
|
|
2
2
|
import { BadRequestError } from '../core/api-errors.js';
|
|
3
|
-
import { MAX_ID_LEN } from '../util/
|
|
3
|
+
import { MAX_ID_LEN } from '../util/limits.js';
|
|
4
4
|
import { isJsonString } from '../util/json.js';
|
|
5
5
|
const MAX_RECALL_LIMIT = 1000;
|
|
6
6
|
// recall() owns the shape rule for scorer_window (invalid_scorer_window); this cap bounds remote cost.
|
|
@@ -5,6 +5,7 @@ import type { PlanningFallacyHint, PlanningFallacyOutput, PlanningFallacyWatchin
|
|
|
5
5
|
import type { AnchoringHint, RecallHistorySnapshot } from './recall-history.js';
|
|
6
6
|
import type { AvailabilityHint } from './availability.js';
|
|
7
7
|
import type { AppendAuditOpts } from '../store/audit.js';
|
|
8
|
+
import type { HippoStore } from '../store/port.js';
|
|
8
9
|
import type { CallerProject } from './prompt-hook.js';
|
|
9
10
|
import type { RankRecallOpts, RankRecallResult } from './recall-pipeline.js';
|
|
10
11
|
import type { RecallRecording } from './recall-finish.js';
|
|
@@ -60,9 +61,10 @@ export interface RecallOpts {
|
|
|
60
61
|
}
|
|
61
62
|
interface CliCoreRanking {
|
|
62
63
|
rank: Omit<RankRecallOpts, 'query' | 'sessionId' | 'goalTag'>;
|
|
63
|
-
/** A second store searched beside `ctx.hippoRoot`. */
|
|
64
|
+
/** A second store searched beside `ctx.hippoRoot`; its recall rows go to `globalStore`, else hippo.db under `globalRoot`. */
|
|
64
65
|
sources?: {
|
|
65
66
|
globalRoot?: string;
|
|
67
|
+
globalStore?: HippoStore;
|
|
66
68
|
};
|
|
67
69
|
/** Receives each operator note when ranking reaches it. */
|
|
68
70
|
note?: (line: string) => void;
|
package/dist/api/recall.d.ts
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import type { RecallOpts, RecallResult } from './recall-types.js';
|
|
2
2
|
import { type Context } from './types.js';
|
|
3
|
-
/** Reads hippo.db directly, never `ctx.store`, because it is synchronous (another store would throw `SqliteBlockedError`).
|
|
4
|
-
* It never writes `last_retrieval_ids` (contract lock: tests/api-recall-no-side-effects.test.ts). */
|
|
5
|
-
export declare function recall(ctx: Context, opts: RecallOpts): RecallResult;
|
|
6
3
|
/** The one recall entry: ranks with the ranker `opts` names, then writes the recall, and records it in full for a surface that sets `recordAs`.
|
|
7
4
|
* Only the CLI core ranker writes last_retrieval_ids (contract lock). */
|
|
8
5
|
export declare function retrieve(ctx: Context, opts: RecallOpts): Promise<RecallResult>;
|
package/dist/api/recall.js
CHANGED
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
// Read path:
|
|
1
|
+
// Read path: retrieve, the one recall entry.
|
|
2
2
|
import { envRequireSessionScopedFreshTail } from '../util/env.js';
|
|
3
3
|
import { DEFAULT_SEARCH_CANDIDATE_LIMIT } from '../store/rows.js';
|
|
4
4
|
import { recallScopeFilter } from '../store/search-rows.js';
|
|
5
5
|
import { estimateTokens } from '../util/token-text.js';
|
|
6
6
|
import { formatHandoffEvidenceLine } from '../core/handoff.js';
|
|
7
7
|
import { boostByGoals } from '../search/goal-boost.js';
|
|
8
|
-
import { storeFor } from '../store/
|
|
9
|
-
import {
|
|
10
|
-
import { hybridSearch } from '../search/hybrid.js';
|
|
11
|
-
import { physicsSearch } from '../search/physics-search.js';
|
|
8
|
+
import { storeFor } from '../store/sqlite/store.js';
|
|
9
|
+
import { searchByEngine } from '../search/engine.js';
|
|
12
10
|
import { churnStaleFactor } from '../search/boosts.js';
|
|
13
11
|
import { compareEntryIdentity } from '../core/compare.js';
|
|
14
12
|
import { dropHeldCopies, duplicateKey, storedTextKeys } from '../util/same-text.js';
|
|
@@ -17,26 +15,12 @@ import { classifyOriginProject, projectNames } from '../core/project-identity.js
|
|
|
17
15
|
import { decidePlanningFallacy, detectPlanningClaim } from '../predictions/planning-fallacy.js';
|
|
18
16
|
import { detectAnchoring, hashQueryText, biasHintEnabled } from './recall-history.js';
|
|
19
17
|
import { detectAvailabilityBias } from './availability.js';
|
|
20
|
-
import { passesScopeFilterForRecall, assertScopeRequestAllowed, personalScopeOf } from '../
|
|
18
|
+
import { passesScopeFilterForRecall, assertScopeRequestAllowed, personalScopeOf } from '../core/recall-scope.js';
|
|
21
19
|
import { ownerOrSubject, RecallContractError } from './types.js';
|
|
22
20
|
import { anchoringRows, availabilityRows, callerOf, recallAuditMetadata, recallAuditRow, strengthenOf } from './recall-record.js';
|
|
23
21
|
import { retrieveWithCliCore } from './recall-core.js';
|
|
24
22
|
import { recallLead, recordShownRecall } from './recall-finish.js';
|
|
25
23
|
const DEFAULT_RECALL_LIMIT = 10;
|
|
26
|
-
/** Reads hippo.db directly, never `ctx.store`, because it is synchronous (another store would throw `SqliteBlockedError`).
|
|
27
|
-
* It never writes `last_retrieval_ids` (contract lock: tests/api-recall-no-side-effects.test.ts). */
|
|
28
|
-
export function recall(ctx, opts) {
|
|
29
|
-
// A member key may not unlock a private or quarantined scope by naming it.
|
|
30
|
-
assertScopeRequestAllowed(ctx.actor, opts.scope);
|
|
31
|
-
const windowSize = recallWindowSize(opts);
|
|
32
|
-
const own = personalScopeOf(ctx.actor) ?? undefined;
|
|
33
|
-
const store = sqliteSyncStore(ctx.hippoRoot);
|
|
34
|
-
const all = store.searchRecallEntries(opts.query, recallSearchArgs(ctx, opts, windowSize, own));
|
|
35
|
-
const plan = planRecall(ctx, opts, all, own);
|
|
36
|
-
const { result, writes } = composeRecall(ctx, opts, { windowSize, all, plan, reads: readRecallSync(store, ctx, opts, plan) });
|
|
37
|
-
store.finishRecall({ ...writes, audit: [...(opts.leadingAudit ?? []), ...writes.audit] });
|
|
38
|
-
return result;
|
|
39
|
-
}
|
|
40
24
|
function recallOrigin(opts) {
|
|
41
25
|
return opts.project ? projectNames(opts.project) : undefined;
|
|
42
26
|
}
|
|
@@ -79,23 +63,28 @@ function shownBand(opts, result) {
|
|
|
79
63
|
async function retrieveBand(ctx, store, opts, windowSize, own) {
|
|
80
64
|
let candidates = await store.searchRecallEntries(opts.query, recallSearchArgs(ctx, opts, windowSize, own));
|
|
81
65
|
if (opts.mode === 'hybrid' || opts.mode === 'physics') {
|
|
82
|
-
const searchOpts = { budget: Infinity,
|
|
83
|
-
const ranked = await
|
|
66
|
+
const searchOpts = { budget: Infinity, scope: opts.scope ?? null, vectorCandidates: recallVectorSpec(ctx, opts, own) };
|
|
67
|
+
const ranked = await searchByEngine({ root: ctx.hippoRoot, store }, opts.query, candidates, physicsFor(ctx, opts), searchOpts);
|
|
84
68
|
const rankedIds = new Set(ranked.map((r) => r.entry.id));
|
|
85
69
|
candidates = [...ranked.map((r) => r.entry), ...candidates.filter((e) => !rankedIds.has(e.id))];
|
|
86
70
|
}
|
|
87
71
|
const plan = planRecall(ctx, opts, candidates, own);
|
|
88
|
-
const
|
|
72
|
+
const reads = await readRecall(store, ctx, opts, plan);
|
|
73
|
+
const { result, writes } = composeRecall(ctx, opts, { windowSize, all: candidates, plan, reads });
|
|
74
|
+
await finishBandRecall(store, ctx, opts, writes, result.results.map((r) => r.id));
|
|
75
|
+
return result;
|
|
76
|
+
}
|
|
77
|
+
/** The one recall write: the caller's leading audit rows go first, and the ids shown are the ones strengthened. */
|
|
78
|
+
async function finishBandRecall(store, ctx, opts, writes, shownIds) {
|
|
89
79
|
await store.finishRecall({
|
|
90
|
-
...writes,
|
|
80
|
+
...writes,
|
|
81
|
+
audit: [...(opts.leadingAudit ?? []), ...writes.audit],
|
|
82
|
+
strengthen: strengthenOf(ctx, shownIds),
|
|
91
83
|
});
|
|
92
|
-
return result;
|
|
93
84
|
}
|
|
94
|
-
/**
|
|
95
|
-
function
|
|
96
|
-
return opts.mode === 'physics'
|
|
97
|
-
? physicsSearch(opts.query, pool, { ...searchOpts, physicsConfig: loadConfig(ctx.hippoRoot).physics })
|
|
98
|
-
: hybridSearch(opts.query, pool, searchOpts);
|
|
85
|
+
/** `mode` names the engine: physics with the store's config, hybrid otherwise. */
|
|
86
|
+
function physicsFor(ctx, opts) {
|
|
87
|
+
return opts.mode === 'physics' ? loadConfig(ctx.hippoRoot).physics : null;
|
|
99
88
|
}
|
|
100
89
|
/** The recall load's arguments: exact scope, current rows only, the caller's project and personal scope. */
|
|
101
90
|
function recallSearchArgs(ctx, opts, limit, own) {
|
|
@@ -127,8 +116,8 @@ async function retrieveFromStore(ctx, opts, windowSize, show, own) {
|
|
|
127
116
|
const loaded = await store.searchRecallEntries(opts.query, recallSearchArgs(ctx, opts, Math.max(windowSize, SHOW_RANKED_LEXICAL_WINDOW), own));
|
|
128
117
|
const pool = loaded.filter((e) => passesScopeFilterForRecall(e.scope ?? null, opts.scope, own));
|
|
129
118
|
// No scope option: the scope boost follows HIPPO_SCOPE and the skill env, as MCP recall always ranked.
|
|
130
|
-
const searchOpts = { budget: Infinity,
|
|
131
|
-
let ranked = await
|
|
119
|
+
const searchOpts = { budget: Infinity, vectorCandidates: recallVectorSpec(ctx, opts, own) };
|
|
120
|
+
let ranked = await searchByEngine({ root: ctx.hippoRoot, store }, opts.query, pool, physicsFor(ctx, opts), searchOpts);
|
|
132
121
|
// One goal read serves both boosts; the ranked list's log rows come first, so its scores win the log's first-write.
|
|
133
122
|
const goals = opts.sessionId && !opts.goalTag ? await store.activeGoals({ sessionId: opts.sessionId, tenantId: ctx.tenantId }) : null;
|
|
134
123
|
let rankedLog = [];
|
|
@@ -140,27 +129,26 @@ async function retrieveFromStore(ctx, opts, windowSize, show, own) {
|
|
|
140
129
|
const window = ranked.slice(0, windowSize).map((r) => r.entry);
|
|
141
130
|
const bandOpts = { ...opts, suppressRecallTrace: true };
|
|
142
131
|
const plan = planRecall(ctx, bandOpts, window, own);
|
|
143
|
-
const
|
|
144
|
-
|
|
145
|
-
});
|
|
132
|
+
const reads = await readRecall(store, ctx, bandOpts, plan, goals);
|
|
133
|
+
const { result, writes } = composeRecall(ctx, bandOpts, { windowSize, all: window, plan, reads, auditBand: false });
|
|
146
134
|
// Rows the vector arm added count as candidates too.
|
|
147
135
|
const inPool = new Set(pool.map((e) => e.id));
|
|
148
136
|
const candidates = [...pool, ...ranked.map((r) => r.entry).filter((e) => !inPool.has(e.id))];
|
|
149
137
|
const shown = show({ ranked, pool: candidates, droppedByScope: loaded.length - pool.length }, result);
|
|
150
138
|
const scores = new Map(ranked.map((r) => [r.entry.id, r.score]));
|
|
151
139
|
const shownRow = recallAuditRow(callerOf(ctx), 'recall', undefined, recallAuditMetadata(opts.query, shown.ids.length));
|
|
152
|
-
|
|
140
|
+
const trace = opts.suppressRecallTrace ? undefined : {
|
|
141
|
+
tenantId: ctx.tenantId,
|
|
142
|
+
sessionId: opts.sessionId ?? null,
|
|
143
|
+
pipeline: 'mcp',
|
|
144
|
+
query: opts.query,
|
|
145
|
+
results: shown.ids.map((id) => ({ memoryId: id, score: scores.get(id) ?? 0 })),
|
|
146
|
+
};
|
|
147
|
+
await finishBandRecall(store, ctx, opts, {
|
|
153
148
|
goalLog: [...rankedLog, ...writes.goalLog],
|
|
154
|
-
audit: [...
|
|
155
|
-
trace
|
|
156
|
-
|
|
157
|
-
sessionId: opts.sessionId ?? null,
|
|
158
|
-
pipeline: 'mcp',
|
|
159
|
-
query: opts.query,
|
|
160
|
-
results: shown.ids.map((id) => ({ memoryId: id, score: scores.get(id) ?? 0 })),
|
|
161
|
-
},
|
|
162
|
-
strengthen: strengthenOf(ctx, shown.ids),
|
|
163
|
-
});
|
|
149
|
+
audit: [...writes.audit, shownRow, ...shown.audit],
|
|
150
|
+
trace,
|
|
151
|
+
}, shown.ids);
|
|
164
152
|
return result;
|
|
165
153
|
}
|
|
166
154
|
/** Contract preflight: throws before any store-touching work. */
|
|
@@ -198,27 +186,17 @@ function planRecall(ctx, opts, all, own) {
|
|
|
198
186
|
claim: detectPlanningClaim(opts.query),
|
|
199
187
|
};
|
|
200
188
|
}
|
|
201
|
-
/** The plan's reads on the synchronous store, for the recall that cannot await the port. */
|
|
202
|
-
function readRecallSync(store, ctx, opts, plan) {
|
|
203
|
-
const { tenantId } = ctx;
|
|
204
|
-
const freshCount = opts.freshTailCount ?? 0;
|
|
205
|
-
return {
|
|
206
|
-
goals: plan.goalBoost ? store.activeGoals({ sessionId: plan.goalBoost.sessionId, tenantId }) : null,
|
|
207
|
-
parents: plan.overflow.size > 0 ? store.entriesByIds([...plan.overflow.keys()], tenantId) : [],
|
|
208
|
-
freshRaws: freshCount > 0 ? store.freshRawEntries(freshCount, tenantId, opts.freshTailSessionId, recallOrigin(opts) ?? null) : [],
|
|
209
|
-
continuity: opts.includeContinuity ? store.continuity(tenantId, CONTINUITY_EVENT_LIMIT, continuityKey(ctx, opts)) : undefined,
|
|
210
|
-
planning: plan.claim ? store.planningFallacyEvidence(tenantId, plan.claim.classQueryTokens) : null,
|
|
211
|
-
};
|
|
212
|
-
}
|
|
213
189
|
/** The plan's reads through the store; `goals` already read by the caller skips that read. */
|
|
214
190
|
async function readRecall(store, ctx, opts, plan, goals) {
|
|
215
191
|
const { tenantId } = ctx;
|
|
216
192
|
const freshCount = opts.freshTailCount ?? 0;
|
|
193
|
+
const parentIds = plan.overflow.size > 0 ? [...plan.overflow.keys()] : null;
|
|
194
|
+
const continuity = opts.includeContinuity ? { key: continuityKey(ctx, opts) } : null;
|
|
217
195
|
return {
|
|
218
196
|
goals: goals !== undefined ? goals : plan.goalBoost ? await store.activeGoals({ sessionId: plan.goalBoost.sessionId, tenantId }) : null,
|
|
219
|
-
parents:
|
|
197
|
+
parents: parentIds ? await store.entriesByIds(parentIds, tenantId) : [],
|
|
220
198
|
freshRaws: freshCount > 0 ? await store.freshRawEntries(freshCount, tenantId, opts.freshTailSessionId, recallOrigin(opts) ?? null) : [],
|
|
221
|
-
continuity:
|
|
199
|
+
continuity: continuity ? await store.continuity(tenantId, CONTINUITY_EVENT_LIMIT, continuity.key) : undefined,
|
|
222
200
|
planning: plan.claim ? await store.planningFallacyEvidence(tenantId, plan.claim.classQueryTokens) : null,
|
|
223
201
|
};
|
|
224
202
|
}
|
|
@@ -461,19 +439,19 @@ function scopeContinuity(block, opts, own) {
|
|
|
461
439
|
function continuityTokensOf(c) {
|
|
462
440
|
const filteredSnapshot = c.activeSnapshot;
|
|
463
441
|
const filteredHandoff = c.sessionHandoff;
|
|
464
|
-
const
|
|
465
|
-
return
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
(filteredHandoff?.artifacts ?? []).reduce((acc, a) => acc +
|
|
471
|
-
(filteredHandoff?.constraints ?? []).reduce((acc, c) => acc +
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
c.recentSessionEvents.reduce((acc, e) => acc +
|
|
442
|
+
const tokenCount = (s) => s ? estimateTokens(s) : 0;
|
|
443
|
+
return tokenCount(filteredSnapshot?.task) +
|
|
444
|
+
tokenCount(filteredSnapshot?.summary) +
|
|
445
|
+
tokenCount(filteredSnapshot?.next_step) +
|
|
446
|
+
tokenCount(filteredHandoff?.summary) +
|
|
447
|
+
tokenCount(filteredHandoff?.nextAction) +
|
|
448
|
+
(filteredHandoff?.artifacts ?? []).reduce((acc, a) => acc + tokenCount(a), 0) +
|
|
449
|
+
(filteredHandoff?.constraints ?? []).reduce((acc, c) => acc + tokenCount(c), 0) +
|
|
450
|
+
tokenCount(filteredHandoff?.evidence ? formatHandoffEvidenceLine(filteredHandoff.evidence) : null) +
|
|
451
|
+
tokenCount(filteredHandoff?.outcome) +
|
|
452
|
+
tokenCount(filteredHandoff?.targetRuntime) +
|
|
453
|
+
tokenCount(filteredHandoff?.cardId) +
|
|
454
|
+
c.recentSessionEvents.reduce((acc, e) => acc + tokenCount(e.content), 0);
|
|
477
455
|
}
|
|
478
456
|
// A pure read of the caller's recallHistory snapshot against this top-1. HIPPO_ANCHORING=off skips even the detect
|
|
479
457
|
// call; CLI paths pass no history (cmdRecall computes its own hint), so the hint stays absent there.
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ConfidenceLevel, Layer, MemoryEntry, MemoryKind } from '../core/memory.js';
|
|
2
|
+
import { type EmbedOutcome } from '../search/embed-memories.js';
|
|
2
3
|
import type { HippoDbContext } from './types.js';
|
|
3
4
|
/** One write by a caller in this process, every field already parsed and checked by it. */
|
|
4
5
|
export interface LocalRememberInput {
|
|
@@ -23,10 +24,12 @@ export interface StartedWeak {
|
|
|
23
24
|
readonly reason: string;
|
|
24
25
|
readonly strength: number;
|
|
25
26
|
}
|
|
26
|
-
/** `stored` carries the row as the store holds it after the write
|
|
27
|
+
/** `stored` carries the row as the store holds it after the write, and `embedding`, which settles with whether the row reached the vector index
|
|
28
|
+
* (a caller may ignore it; a failure is also logged). `skipped` is the gate dropping the write, with nothing stored or counted. */
|
|
27
29
|
export type LocalRememberOutcome = {
|
|
28
30
|
readonly status: 'stored';
|
|
29
31
|
readonly entry: MemoryEntry;
|
|
32
|
+
readonly embedding: Promise<EmbedOutcome>;
|
|
30
33
|
readonly startedWeak?: StartedWeak;
|
|
31
34
|
} | {
|
|
32
35
|
readonly status: 'skipped';
|
|
@@ -34,7 +37,7 @@ export type LocalRememberOutcome = {
|
|
|
34
37
|
readonly score: number;
|
|
35
38
|
};
|
|
36
39
|
/** One local write on hippo.db: gate, write, read-back, counter, then the embedding, started and never awaited. A refused value throws as `remember` does. */
|
|
37
|
-
export declare function rememberLocally(ctx: HippoDbContext, input: LocalRememberInput): LocalRememberOutcome
|
|
40
|
+
export declare function rememberLocally(ctx: HippoDbContext, input: LocalRememberInput): Promise<LocalRememberOutcome>;
|
|
38
41
|
/** What a caller asks of fact extraction. The key comes from the caller, which read it from its own environment. */
|
|
39
42
|
export interface FactExtractionRequest {
|
|
40
43
|
/** The caller asked for extraction (`--extract`); the store's config can turn it on without that. */
|
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
import { loadConfig } from '../core/config.js';
|
|
5
5
|
import { computeSalience } from '../core/salience.js';
|
|
6
6
|
import { loadNewestEntries, schemaFitInStore } from '../store/candidates.js';
|
|
7
|
-
import { embedMemory } from '../
|
|
7
|
+
import { embedMemory } from '../search/embed-memories.js';
|
|
8
8
|
import { loadAllEntries, readEntry } from '../store/entry-reads.js';
|
|
9
9
|
import { updateStats } from '../store/index-and-stats.js';
|
|
10
|
-
import { errorMessage } from '../util/log.js';
|
|
10
|
+
import { errorMessage, log } from '../util/log.js';
|
|
11
11
|
import { remember } from './remember.js';
|
|
12
12
|
const WEAK_HALF_LIFE_FACTOR = 0.5;
|
|
13
13
|
/** The gate's verdict on one write, or null where it does not judge: the store has it off, or the write is pinned or forced. */
|
|
@@ -34,14 +34,23 @@ function storedEntry(ctx, id) {
|
|
|
34
34
|
throw new Error(`memory ${id} was written but cannot be read back`);
|
|
35
35
|
return entry;
|
|
36
36
|
}
|
|
37
|
+
/** Best-effort and slow (a model load or a network call), so the caller is not held for it; a row left out of the index is logged. */
|
|
38
|
+
function indexInBackground(hippoRoot, entry) {
|
|
39
|
+
return embedMemory(hippoRoot, entry).then((outcome) => {
|
|
40
|
+
if (outcome === 'failed') {
|
|
41
|
+
log.warn(`memory ${entry.id} is stored but not in the vector index, so recall by meaning will miss it; run 'hippo embed' to index it`);
|
|
42
|
+
}
|
|
43
|
+
return outcome;
|
|
44
|
+
});
|
|
45
|
+
}
|
|
37
46
|
/** One local write on hippo.db: gate, write, read-back, counter, then the embedding, started and never awaited. A refused value throws as `remember` does. */
|
|
38
|
-
export function rememberLocally(ctx, input) {
|
|
47
|
+
export async function rememberLocally(ctx, input) {
|
|
39
48
|
const schemaFit = schemaFitInStore(ctx.hippoRoot, ctx.tenantId, input.content, input.fitTags ?? input.tags);
|
|
40
49
|
const verdict = salienceVerdict(ctx, input);
|
|
41
50
|
if (verdict?.decision === 'skip')
|
|
42
51
|
return { status: 'skipped', reason: verdict.reason, score: verdict.score };
|
|
43
52
|
const startedWeak = verdict?.decision === 'start_weak' ? { reason: verdict.reason, strength: verdict.score } : undefined;
|
|
44
|
-
const { id } = remember(ctx, {
|
|
53
|
+
const { id } = await remember(ctx, {
|
|
45
54
|
content: input.content,
|
|
46
55
|
kind: input.kind,
|
|
47
56
|
scope: input.scope,
|
|
@@ -59,9 +68,8 @@ export function rememberLocally(ctx, input) {
|
|
|
59
68
|
});
|
|
60
69
|
const entry = storedEntry(ctx, id);
|
|
61
70
|
updateStats(ctx.hippoRoot, { remembered: 1 });
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
return startedWeak ? { status: 'stored', entry, startedWeak } : { status: 'stored', entry };
|
|
71
|
+
const embedding = indexInBackground(ctx.hippoRoot, entry);
|
|
72
|
+
return startedWeak ? { status: 'stored', entry, embedding, startedWeak } : { status: 'stored', entry, embedding };
|
|
65
73
|
}
|
|
66
74
|
/** Extracts facts from a row just stored and stores them beside it. Best-effort: a failure is named in the result, never thrown. */
|
|
67
75
|
export async function extractRememberedFacts(ctx, entry, request) {
|
package/dist/api/remember.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ConnectorEvent } from '../store/port.js';
|
|
2
2
|
import { type ConfidenceLevel, type Layer, type MemoryKind, type TraceOutcome } from '../core/memory.js';
|
|
3
|
-
import type { Context
|
|
3
|
+
import type { Context } from './types.js';
|
|
4
4
|
/** Row fields the caller's own process decides, as the CLI does from its flags and its salience gate. */
|
|
5
5
|
export interface RememberLocal {
|
|
6
6
|
layer?: Layer;
|
|
@@ -23,7 +23,8 @@ export interface RememberOpts {
|
|
|
23
23
|
owner?: string;
|
|
24
24
|
artifactRef?: string;
|
|
25
25
|
tags?: string[];
|
|
26
|
-
/** The connector event this write answers. The store logs it in the memory's own transaction; an event logged before stores nothing and
|
|
26
|
+
/** The connector event this write answers. The store logs it in the memory's own transaction; an event logged before stores nothing and
|
|
27
|
+
* answers `duplicate`. */
|
|
27
28
|
event?: ConnectorEvent;
|
|
28
29
|
/** Connector-ingested content an agent doesn't control; gates detectInstruction. CLI/HTTP/MCP never set this. */
|
|
29
30
|
untrusted?: boolean;
|
|
@@ -41,6 +42,9 @@ export interface RememberResult {
|
|
|
41
42
|
id: string;
|
|
42
43
|
kind: MemoryKind;
|
|
43
44
|
tenantId: string;
|
|
45
|
+
/** The row as written, so a caller can show it without reading it back. */
|
|
46
|
+
halfLifeDays: number;
|
|
47
|
+
tags: string[];
|
|
44
48
|
/** Set only when untrusted content was flagged and quarantined instead of stored under its requested scope. */
|
|
45
49
|
quarantined?: {
|
|
46
50
|
reason: string;
|
|
@@ -54,5 +58,5 @@ export interface RememberResult {
|
|
|
54
58
|
}
|
|
55
59
|
/** Store one memory: the store's entryWrites group writes the row and its one remember audit row, under the caller's subject.
|
|
56
60
|
* A write that carries a connector event or untrusted content goes through connectorWrites, which commits its companion rows with it. */
|
|
57
|
-
export declare function remember
|
|
61
|
+
export declare function remember(ctx: Context, opts: RememberOpts): Promise<RememberResult>;
|
|
58
62
|
//# sourceMappingURL=remember.d.ts.map
|
package/dist/api/remember.js
CHANGED
|
@@ -7,8 +7,9 @@ import { loadConfig } from '../core/config.js';
|
|
|
7
7
|
import { vetSecrets } from '../util/secret-detect.js';
|
|
8
8
|
import { assertCallerProject } from '../core/project-identity.js';
|
|
9
9
|
import { BadRequestError } from '../core/api-errors.js';
|
|
10
|
-
import { assertClientScope, personalScopeOf } from '../
|
|
11
|
-
import {
|
|
10
|
+
import { assertClientScope, personalScopeOf } from '../core/recall-scope.js';
|
|
11
|
+
import { requireGroup } from '../store/index.js';
|
|
12
|
+
import { storeFor } from '../store/sqlite/store.js';
|
|
12
13
|
/** The scope a write lands in: the caller's own personal scope when asked for, else the client's, which may not be a personal one. */
|
|
13
14
|
function rememberScope(ctx, opts) {
|
|
14
15
|
if (!opts.personal) {
|
|
@@ -21,7 +22,8 @@ function rememberScope(ctx, opts) {
|
|
|
21
22
|
throw new BadRequestError('send personal or scope, not both');
|
|
22
23
|
const own = personalScopeOf(ctx.actor);
|
|
23
24
|
if (own === null) {
|
|
24
|
-
throw new BadRequestError('personal memories need a key its owner minted, or a sign-in; owner ids over 239 characters or with control characters cannot
|
|
25
|
+
throw new BadRequestError('personal memories need a key its owner minted, or a sign-in; owner ids over 239 characters or with control characters cannot ' +
|
|
26
|
+
'hold them');
|
|
25
27
|
}
|
|
26
28
|
return own;
|
|
27
29
|
}
|
|
@@ -59,7 +61,7 @@ function weakened(entry, weaken) {
|
|
|
59
61
|
}
|
|
60
62
|
function rememberResult(ctx, prepared, written) {
|
|
61
63
|
const { entry, detection, warnings } = prepared;
|
|
62
|
-
const result = { id: entry.id, kind: entry.kind, tenantId: ctx.tenantId };
|
|
64
|
+
const result = { id: entry.id, kind: entry.kind, tenantId: ctx.tenantId, halfLifeDays: entry.half_life_days, tags: [...entry.tags] };
|
|
63
65
|
if (detection.flagged)
|
|
64
66
|
result.quarantined = { reason: detection.reason ?? 'unknown' };
|
|
65
67
|
if (warnings.length > 0)
|
|
@@ -74,17 +76,18 @@ function quarantineOf({ requestedScope, detection }) {
|
|
|
74
76
|
}
|
|
75
77
|
/** Store one memory: the store's entryWrites group writes the row and its one remember audit row, under the caller's subject.
|
|
76
78
|
* A write that carries a connector event or untrusted content goes through connectorWrites, which commits its companion rows with it. */
|
|
77
|
-
export function remember(ctx, opts) {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
});
|
|
79
|
+
export async function remember(ctx, opts) {
|
|
80
|
+
const store = storeFor(ctx);
|
|
81
|
+
const entryWrites = requireGroup(store, 'entryWrites');
|
|
82
|
+
const prepared = prepareRemember(ctx, opts);
|
|
83
|
+
// A store writes origin_project as given, so the served folder's fallback is stamped here.
|
|
84
|
+
const write = { entry: stampOriginProject(ctx.hippoRoot, prepared.entry), actor: ctx.actor.subject };
|
|
85
|
+
if (opts.untrusted !== true && opts.event === undefined) {
|
|
86
|
+
await entryWrites.writeEntry(write);
|
|
87
|
+
return rememberResult(ctx, prepared);
|
|
88
|
+
}
|
|
89
|
+
const connectorWrites = requireGroup(store, 'connectorWrites');
|
|
90
|
+
const written = await connectorWrites.writeConnectorEntry({ ...write, event: opts.event, quarantine: quarantineOf(prepared) });
|
|
91
|
+
return rememberResult(ctx, prepared, written);
|
|
89
92
|
}
|
|
90
93
|
//# sourceMappingURL=remember.js.map
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { HandoffEvidence } from '../core/handoff.js';
|
|
2
|
+
import type { TaskSnapshot } from '../store/rows.js';
|
|
3
|
+
import type { Context } from './types.js';
|
|
4
|
+
/** What closing one ended session needs from the host; the two readers run only when the handoff is written. */
|
|
5
|
+
export interface SessionClose {
|
|
6
|
+
sessionId: string | null;
|
|
7
|
+
/** A reply's end, not the session's: the handoff is updated in place and the snapshot stays for the next compaction. */
|
|
8
|
+
turn: boolean;
|
|
9
|
+
/** The transcript's working state, or null with no readable transcript. */
|
|
10
|
+
workingState: () => Pick<TaskSnapshot, 'task' | 'summary' | 'next_step'> | null;
|
|
11
|
+
evidence: () => HandoffEvidence;
|
|
12
|
+
/** One line to the session-end log. */
|
|
13
|
+
log: (line: string) => void;
|
|
14
|
+
}
|
|
15
|
+
/** Writes the session's handoff, then closes its snapshot unless `turn`; each step logs its own failure and never throws.
|
|
16
|
+
* The handoff goes first, while the snapshot writeSessionEndHandoff reads is still active. */
|
|
17
|
+
export declare function closeEndedSession(ctx: Context, close: SessionClose): void;
|
|
18
|
+
/** Books the ending session's re-reads in each store its ledger rows can land in (`ctx.hippoRoot` and global); returns the log lines. */
|
|
19
|
+
export declare function bookSessionRereads(ctx: Context, transcriptPath: string | undefined, sessionId: string | null): Promise<string[]>;
|
|
20
|
+
/** The block a compaction lost: the fresh task snapshot and its session trail, or null with none or another session's snapshot. */
|
|
21
|
+
export declare function compactResumeBlock(ctx: Context, payloadSessionId: string | null): string | null;
|
|
22
|
+
/** What one session-end run needs from its host; the host owns sleep, transcript reading and capture, this module owns the order. */
|
|
23
|
+
export interface SessionEndWork<Scan> {
|
|
24
|
+
mode: 'turn' | 'full';
|
|
25
|
+
hippoRoot: string;
|
|
26
|
+
tenantId: string;
|
|
27
|
+
sessionId: string | null;
|
|
28
|
+
transcriptPath: string | undefined;
|
|
29
|
+
/** Builds the call context for one store root. */
|
|
30
|
+
contextFor: (root: string) => Context;
|
|
31
|
+
/** The store the run captures into: the project store, else global. */
|
|
32
|
+
storeRoot: () => string;
|
|
33
|
+
/** One line to the session-end log; `startFresh` restarts the file. */
|
|
34
|
+
log: (line: string, opts?: {
|
|
35
|
+
startFresh?: boolean;
|
|
36
|
+
}) => void;
|
|
37
|
+
sleep: () => Promise<void>;
|
|
38
|
+
readScan: (log: (line: string) => void) => Scan | null;
|
|
39
|
+
capture: (store: string, scan: Scan | null) => void;
|
|
40
|
+
digest: (scan: Scan | null, log: (line: string) => void) => void;
|
|
41
|
+
workingState: (log: (line: string) => void) => ReturnType<SessionClose['workingState']>;
|
|
42
|
+
evidence: () => HandoffEvidence;
|
|
43
|
+
}
|
|
44
|
+
/** Books re-reads, sleeps, captures, digests and closes one ended session, in that order. */
|
|
45
|
+
export declare function sessionEndWork<Scan>(w: SessionEndWork<Scan>): Promise<void>;
|
|
46
|
+
//# sourceMappingURL=session-end.d.ts.map
|