hippo-memory 1.71.0 → 1.72.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/agent-memories/apply.d.ts +0 -11
- package/dist/agent-memories/apply.js +6 -21
- 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 +1 -1
- package/dist/api/audit.d.ts +29 -1
- package/dist/api/audit.js +44 -5
- package/dist/api/auth.d.ts +7 -4
- package/dist/api/auth.js +12 -8
- 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-render.js +4 -3
- package/dist/api/context-select.js +9 -11
- package/dist/api/context.js +17 -8
- 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 +1 -1
- 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 +6 -2
- package/dist/api/forget.js +18 -7
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +5 -9
- 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 +4 -0
- package/dist/api/learn.js +53 -27
- package/dist/api/ledger-db.d.ts +2 -6
- package/dist/api/ledger-db.js +4 -36
- package/dist/api/memories.d.ts +19 -1
- package/dist/api/memories.js +39 -0
- package/dist/api/objects.d.ts +1 -1
- package/dist/api/outcome.js +1 -1
- 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 +6 -0
- package/dist/api/projects.d.ts +21 -0
- package/dist/api/projects.js +24 -0
- package/dist/api/promote.js +1 -1
- package/dist/api/prompt-hook.d.ts +15 -2
- package/dist/api/prompt-hook.js +44 -4
- package/dist/api/recall-cli.d.ts +3 -0
- package/dist/api/recall-cli.js +13 -4
- package/dist/api/recall-core.js +3 -3
- package/dist/api/recall-pipeline.js +6 -7
- package/dist/api/recall-request.js +1 -1
- package/dist/api/recall.d.ts +0 -3
- package/dist/api/recall.js +19 -44
- package/dist/api/remember-local.js +1 -1
- package/dist/api/remember.d.ts +2 -1
- package/dist/api/remember.js +3 -2
- package/dist/api/session-end.d.ts +22 -0
- package/dist/api/session-end.js +101 -0
- package/dist/api/sleep-run.d.ts +1 -1
- package/dist/api/sleep-run.js +13 -9
- 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 +1 -1
- package/dist/api/types.d.ts +2 -0
- 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 +4 -2
- package/dist/capture/compaction-spool.js +20 -6
- 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 +2 -1
- package/dist/capture/session-worker.js +3 -4
- 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 +13 -13
- package/dist/cli/auth.d.ts +1 -1
- package/dist/cli/auth.js +12 -13
- 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 +5 -0
- package/dist/cli/client.js +24 -8
- package/dist/cli/compact-resume-payload.js +1 -1
- package/dist/cli/context.d.ts +1 -1
- package/dist/cli/context.js +12 -12
- package/dist/cli/continuity.d.ts +1 -1
- package/dist/cli/continuity.js +36 -39
- package/dist/cli/curate.d.ts +1 -1
- package/dist/cli/curate.js +23 -27
- 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 +4 -281
- 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 +3 -5
- package/dist/cli/hook-runtime.js +7 -34
- 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/lenient-id.d.ts +2 -0
- package/dist/cli/lenient-id.js +13 -0
- 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/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 +175 -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 +17 -17
- package/dist/cli/remember.js +12 -12
- package/dist/cli/scheduler.js +2 -1
- package/dist/cli/serve.js +3 -3
- package/dist/cli/session-hooks.d.ts +1 -1
- package/dist/cli/session-hooks.js +45 -115
- 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 +1 -1
- package/dist/cli/transfer.js +33 -31
- package/dist/cli/usage.d.ts +0 -79
- package/dist/cli/usage.js +1 -695
- package/dist/cli/verb-row.d.ts +32 -0
- package/dist/cli/verb-row.js +6 -0
- package/dist/cli/verbs/health.d.ts +27 -0
- package/dist/cli/verbs/health.js +232 -0
- package/dist/cli/verbs/memory.d.ts +16 -0
- package/dist/cli/verbs/memory.js +244 -0
- package/dist/cli/verbs/objects.d.ts +20 -0
- package/dist/cli/verbs/objects.js +254 -0
- package/dist/cli/verbs/sessions.d.ts +31 -0
- package/dist/cli/verbs/sessions.js +312 -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 +23 -313
- package/dist/connectors/dlq.d.ts +39 -3
- package/dist/connectors/dlq.js +37 -3
- package/dist/connectors/github/backfill.js +12 -3
- package/dist/connectors/github/dlq.js +31 -73
- package/dist/connectors/github/ingest.d.ts +2 -6
- package/dist/connectors/github/ingest.js +3 -28
- package/dist/connectors/github/webhook.d.ts +2 -1
- package/dist/connectors/github/webhook.js +33 -2
- package/dist/connectors/ingest.d.ts +10 -0
- package/dist/connectors/ingest.js +28 -0
- package/dist/connectors/slack/dlq.js +49 -71
- package/dist/connectors/slack/ingest.d.ts +2 -6
- package/dist/connectors/slack/ingest.js +2 -27
- package/dist/connectors/slack/webhook.d.ts +2 -1
- package/dist/connectors/slack/webhook.js +2 -1
- package/dist/consolidate/conflicts.js +1 -1
- package/dist/consolidate/dag.js +15 -9
- package/dist/consolidate/dedupe.d.ts +7 -0
- package/dist/consolidate/dedupe.js +5 -3
- package/dist/consolidate/llm-passes.js +45 -19
- package/dist/consolidate/memory-value.js +2 -1
- package/dist/consolidate/merge.js +2 -2
- 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 +8 -5
- package/dist/consolidate/traces.js +3 -3
- 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 +7 -2
- 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 +2 -2
- package/dist/core/memory-audit.d.ts +17 -0
- package/dist/core/memory-audit.js +54 -0
- package/dist/core/memory.d.ts +10 -4
- package/dist/core/memory.js +25 -18
- package/dist/{consolidate → core}/merged-row.d.ts +1 -1
- package/dist/{consolidate → core}/merged-row.js +1 -1
- package/dist/core/physics.js +6 -16
- 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 +10 -1
- package/dist/{store → core}/recall-scope.d.ts +1 -10
- package/dist/{store → core}/recall-scope.js +2 -19
- package/dist/db/busy.d.ts +2 -7
- package/dist/db/busy.js +21 -26
- package/dist/db/connect.d.ts +0 -1
- package/dist/db/connect.js +5 -6
- package/dist/db/index.d.ts +3 -3
- package/dist/db/index.js +3 -3
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- 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.js +3 -3
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -2
- package/dist/db/vector-store.js +17 -4
- package/dist/db/wal-checkpointer.js +2 -1
- package/dist/doctor.js +11 -8
- 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 +18 -15
- 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/eval/eval-suite.js +17 -11
- package/dist/eval/eval.js +1 -1
- package/dist/eval/judgment.js +11 -4
- 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 +4 -2
- 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 +1 -1
- package/dist/importers/sources.js +5 -4
- package/dist/importers/vault.js +7 -5
- package/dist/index.d.ts +3 -2
- package/dist/index.js +3 -2
- package/dist/learn/autolearn.d.ts +10 -2
- package/dist/learn/autolearn.js +32 -12
- package/dist/learn/churn-git.js +13 -4
- package/dist/learn/extract.d.ts +3 -2
- package/dist/learn/extract.js +6 -4
- package/dist/learn/forward-claim-detector.js +4 -2
- package/dist/learn/invalidation.js +10 -6
- 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.js +3 -1
- 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 +2 -1
- package/dist/mcp/stdio.js +24 -8
- 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 +63 -97
- 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 +9 -0
- package/dist/search/embed-memories.js +377 -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 +10 -13
- package/dist/server/auth.d.ts +2 -0
- package/dist/server/auth.js +17 -7
- package/dist/server/boot.js +7 -66
- package/dist/server/client-ip.d.ts +0 -2
- package/dist/server/client-ip.js +3 -2
- 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 -132
- 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 +15 -38
- 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/types.d.ts +22 -10
- package/dist/server/validation.d.ts +1 -2
- package/dist/server/validation.js +6 -11
- package/dist/server.d.ts +5 -4
- package/dist/server.js +5 -4
- package/dist/sharing/global-store.js +2 -2
- 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 +1 -1
- package/dist/sharing/share.d.ts +2 -0
- package/dist/sharing/share.js +37 -34
- package/dist/store/ambient.js +5 -6
- 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 +42 -23
- package/dist/store/capture-write.d.ts +17 -0
- package/dist/store/capture-write.js +35 -0
- package/dist/store/cards.js +1 -1
- 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 +417 -0
- package/dist/store/compactions.js +6 -4
- package/dist/store/conflicts.js +7 -4
- package/dist/store/connectors/dlq.d.ts +10 -0
- package/dist/store/connectors/dlq.js +32 -0
- package/dist/store/connectors/github.d.ts +7 -9
- package/dist/store/connectors/github.js +30 -53
- package/dist/store/connectors/slack.d.ts +2 -11
- package/dist/store/connectors/slack.js +18 -47
- package/dist/store/dashboard-reads.js +7 -6
- package/dist/store/delete-and-batch.d.ts +6 -0
- package/dist/store/delete-and-batch.js +36 -3
- package/dist/store/delivery-recorder.d.ts +10 -3
- package/dist/store/delivery-recorder.js +12 -5
- package/dist/store/descendant-page.js +6 -3
- package/dist/store/dormant.d.ts +1 -1
- package/dist/store/dormant.js +3 -1
- package/dist/store/embeddings/index.d.ts +2 -12
- package/dist/store/embeddings/index.js +5 -374
- package/dist/store/entry-reads.d.ts +13 -4
- package/dist/store/entry-reads.js +47 -11
- package/dist/store/entry-writes.d.ts +5 -5
- package/dist/store/entry-writes.js +32 -12
- 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 +20 -18
- package/dist/store/graph-reads.js +4 -2
- package/dist/store/graph-writes.d.ts +6 -6
- package/dist/store/graph-writes.js +48 -71
- package/dist/store/handoffs.d.ts +1 -1
- package/dist/store/handoffs.js +6 -6
- package/dist/store/index-and-stats.js +2 -2
- 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 +10 -6
- package/dist/store/open.d.ts +0 -4
- package/dist/store/open.js +40 -53
- package/dist/store/pilot-arm.d.ts +12 -0
- package/dist/store/pilot-arm.js +42 -0
- package/dist/store/port.d.ts +9 -3
- 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/quarantine.js +2 -1
- package/dist/store/recall-trace.d.ts +2 -0
- package/dist/store/recall-trace.js +18 -2
- package/dist/store/rejected-values.js +2 -1
- 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/rule-sql.d.ts +9 -0
- package/dist/store/rule-sql.js +21 -2
- package/dist/store/search-rows.js +9 -4
- 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 +3 -3
- package/dist/store/sqlite/entry-writes-group.js +2 -2
- 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 +9 -0
- package/dist/store/sqlite/held-connection.js +41 -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 +1 -1
- package/dist/store/sqlite/store.js +14 -12
- package/dist/store/summaries.d.ts +3 -3
- package/dist/store/summaries.js +5 -4
- package/dist/store/token-ledger.d.ts +0 -7
- package/dist/store/token-ledger.js +0 -35
- package/dist/store/vector-index.js +3 -2
- 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 +3 -0
- package/dist/util/anthropic-messages.js +22 -5
- 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 +2 -1
- package/dist/util/env.js +2 -1
- package/dist/util/format.d.ts +3 -0
- package/dist/util/format.js +6 -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 +3 -1
- package/dist/util/request-scope.js +11 -6
- package/dist/util/secret-detect.js +6 -1
- 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/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 +2 -2
- 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
package/dist/api/recall-core.js
CHANGED
|
@@ -5,7 +5,7 @@ import { decidePlanningFallacy, detectPlanningClaim } from '../predictions/plann
|
|
|
5
5
|
import { rankRecall } from './recall-pipeline.js';
|
|
6
6
|
import { writeRecallTraceAtRoot } from '../store/recall-trace.js';
|
|
7
7
|
import { saveIndex } from '../store/index-and-stats.js';
|
|
8
|
-
import { sqliteStore } from '../store/index.js';
|
|
8
|
+
import { sqliteStore, storeFor } from '../store/index.js';
|
|
9
9
|
import { estimateTokens } from '../util/token-text.js';
|
|
10
10
|
import { callerOf, recallAuditMetadata, recallAuditRow, strengthenOf } from './recall-record.js';
|
|
11
11
|
import { RECALL_RECORDING, recordShownRecall } from './recall-finish.js';
|
|
@@ -16,8 +16,8 @@ export async function retrieveWithCliCore(ctx, opts, core) {
|
|
|
16
16
|
if (!ctx.actor.hostAdmin)
|
|
17
17
|
throw new ForbiddenError('The CLI ranking core serves the host admin only');
|
|
18
18
|
const globalRoot = core.sources?.globalRoot;
|
|
19
|
-
// The ranking core reads hippo.db
|
|
20
|
-
const store =
|
|
19
|
+
// The ranking core reads hippo.db under hippoRoot, yet writes through the caller's store, whose finishRecall skips any id it does not hold.
|
|
20
|
+
const store = storeFor(ctx);
|
|
21
21
|
const ranking = await rankRecall({ hippoRoot: ctx.hippoRoot, globalRoot, tenantId: ctx.tenantId, note: core.note }, { ...core.rank, query: opts.query, sessionId: opts.sessionId, goalTag: opts.goalTag });
|
|
22
22
|
if (ranking.halted) {
|
|
23
23
|
// The stages that ran earned these rows, so the caller's flag error does not drop them.
|
|
@@ -3,19 +3,19 @@
|
|
|
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
16
|
import { hybridSearch } from '../search/hybrid.js';
|
|
17
17
|
import { physicsSearch } from '../search/physics-search.js';
|
|
18
|
-
import {
|
|
18
|
+
import { rankBothStores } from '../sharing/search-both.js';
|
|
19
19
|
import { loadRecallSearchEntries, 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';
|
|
@@ -98,7 +98,7 @@ async function searchPool(ctx, opts, pool) {
|
|
|
98
98
|
});
|
|
99
99
|
}
|
|
100
100
|
if (search.multihop) {
|
|
101
|
-
// Unlike
|
|
101
|
+
// Unlike rankBothStores below, multihop ranks one pooled list, so a shared memory's two copies both compete.
|
|
102
102
|
const allEntries = oneCopyPerMemory(pool.local, pool.global, evalNow()).flat();
|
|
103
103
|
return multihopSearch(query, allEntries, { budget, cost, hippoRoot: ctx.hippoRoot, minResults, includeSuperseded, asOf });
|
|
104
104
|
}
|
|
@@ -117,11 +117,10 @@ async function searchPool(ctx, opts, pool) {
|
|
|
117
117
|
});
|
|
118
118
|
}
|
|
119
119
|
if (globalRoot) {
|
|
120
|
-
//
|
|
121
|
-
return
|
|
120
|
+
// The pool already holds searchBothHybrid's additive-scope load for each store, so rank it rather than read both stores again.
|
|
121
|
+
return rankBothStores(query, { local: ctx.hippoRoot, global: globalRoot }, { local: pool.local, global: pool.global }, vectorCandidates, {
|
|
122
122
|
budget, cost, explain, mmr, mmrLambda, localBump: search.localBump, minResults, scope, tenantId: ctx.tenantId,
|
|
123
123
|
includeSuperseded, asOf,
|
|
124
|
-
recallScope: opts.explicitScope ? { requested: opts.explicitScope, additive: true } : {},
|
|
125
124
|
});
|
|
126
125
|
}
|
|
127
126
|
return hybridSearch(query, pool.local, {
|
|
@@ -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.
|
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,4 +1,4 @@
|
|
|
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';
|
|
@@ -6,7 +6,6 @@ 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
8
|
import { storeFor } from '../store/index.js';
|
|
9
|
-
import { sqliteSyncStore } from '../store/sqlite/store.js';
|
|
10
9
|
import { hybridSearch } from '../search/hybrid.js';
|
|
11
10
|
import { physicsSearch } from '../search/physics-search.js';
|
|
12
11
|
import { churnStaleFactor } from '../search/boosts.js';
|
|
@@ -17,26 +16,12 @@ import { classifyOriginProject, projectNames } from '../core/project-identity.js
|
|
|
17
16
|
import { decidePlanningFallacy, detectPlanningClaim } from '../predictions/planning-fallacy.js';
|
|
18
17
|
import { detectAnchoring, hashQueryText, biasHintEnabled } from './recall-history.js';
|
|
19
18
|
import { detectAvailabilityBias } from './availability.js';
|
|
20
|
-
import { passesScopeFilterForRecall, assertScopeRequestAllowed, personalScopeOf } from '../
|
|
19
|
+
import { passesScopeFilterForRecall, assertScopeRequestAllowed, personalScopeOf } from '../core/recall-scope.js';
|
|
21
20
|
import { ownerOrSubject, RecallContractError } from './types.js';
|
|
22
21
|
import { anchoringRows, availabilityRows, callerOf, recallAuditMetadata, recallAuditRow, strengthenOf } from './recall-record.js';
|
|
23
22
|
import { retrieveWithCliCore } from './recall-core.js';
|
|
24
23
|
import { recallLead, recordShownRecall } from './recall-finish.js';
|
|
25
24
|
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
25
|
function recallOrigin(opts) {
|
|
41
26
|
return opts.project ? projectNames(opts.project) : undefined;
|
|
42
27
|
}
|
|
@@ -198,27 +183,17 @@ function planRecall(ctx, opts, all, own) {
|
|
|
198
183
|
claim: detectPlanningClaim(opts.query),
|
|
199
184
|
};
|
|
200
185
|
}
|
|
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
186
|
/** The plan's reads through the store; `goals` already read by the caller skips that read. */
|
|
214
187
|
async function readRecall(store, ctx, opts, plan, goals) {
|
|
215
188
|
const { tenantId } = ctx;
|
|
216
189
|
const freshCount = opts.freshTailCount ?? 0;
|
|
190
|
+
const parentIds = plan.overflow.size > 0 ? [...plan.overflow.keys()] : null;
|
|
191
|
+
const continuity = opts.includeContinuity ? { key: continuityKey(ctx, opts) } : null;
|
|
217
192
|
return {
|
|
218
193
|
goals: goals !== undefined ? goals : plan.goalBoost ? await store.activeGoals({ sessionId: plan.goalBoost.sessionId, tenantId }) : null,
|
|
219
|
-
parents:
|
|
194
|
+
parents: parentIds ? await store.entriesByIds(parentIds, tenantId) : [],
|
|
220
195
|
freshRaws: freshCount > 0 ? await store.freshRawEntries(freshCount, tenantId, opts.freshTailSessionId, recallOrigin(opts) ?? null) : [],
|
|
221
|
-
continuity:
|
|
196
|
+
continuity: continuity ? await store.continuity(tenantId, CONTINUITY_EVENT_LIMIT, continuity.key) : undefined,
|
|
222
197
|
planning: plan.claim ? await store.planningFallacyEvidence(tenantId, plan.claim.classQueryTokens) : null,
|
|
223
198
|
};
|
|
224
199
|
}
|
|
@@ -461,19 +436,19 @@ function scopeContinuity(block, opts, own) {
|
|
|
461
436
|
function continuityTokensOf(c) {
|
|
462
437
|
const filteredSnapshot = c.activeSnapshot;
|
|
463
438
|
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 +
|
|
439
|
+
const tokenCount = (s) => s ? estimateTokens(s) : 0;
|
|
440
|
+
return tokenCount(filteredSnapshot?.task) +
|
|
441
|
+
tokenCount(filteredSnapshot?.summary) +
|
|
442
|
+
tokenCount(filteredSnapshot?.next_step) +
|
|
443
|
+
tokenCount(filteredHandoff?.summary) +
|
|
444
|
+
tokenCount(filteredHandoff?.nextAction) +
|
|
445
|
+
(filteredHandoff?.artifacts ?? []).reduce((acc, a) => acc + tokenCount(a), 0) +
|
|
446
|
+
(filteredHandoff?.constraints ?? []).reduce((acc, c) => acc + tokenCount(c), 0) +
|
|
447
|
+
tokenCount(filteredHandoff?.evidence ? formatHandoffEvidenceLine(filteredHandoff.evidence) : null) +
|
|
448
|
+
tokenCount(filteredHandoff?.outcome) +
|
|
449
|
+
tokenCount(filteredHandoff?.targetRuntime) +
|
|
450
|
+
tokenCount(filteredHandoff?.cardId) +
|
|
451
|
+
c.recentSessionEvents.reduce((acc, e) => acc + tokenCount(e.content), 0);
|
|
477
452
|
}
|
|
478
453
|
// A pure read of the caller's recallHistory snapshot against this top-1. HIPPO_ANCHORING=off skips even the detect
|
|
479
454
|
// call; CLI paths pass no history (cmdRecall computes its own hint), so the hint stays absent there.
|
|
@@ -4,7 +4,7 @@
|
|
|
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
10
|
import { errorMessage } from '../util/log.js';
|
package/dist/api/remember.d.ts
CHANGED
|
@@ -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;
|
package/dist/api/remember.js
CHANGED
|
@@ -7,7 +7,7 @@ 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 '../
|
|
10
|
+
import { assertClientScope, personalScopeOf } from '../core/recall-scope.js';
|
|
11
11
|
import { andThen, notPorted, onStore } from './on-store.js';
|
|
12
12
|
/** 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
13
|
function rememberScope(ctx, opts) {
|
|
@@ -21,7 +21,8 @@ function rememberScope(ctx, opts) {
|
|
|
21
21
|
throw new BadRequestError('send personal or scope, not both');
|
|
22
22
|
const own = personalScopeOf(ctx.actor);
|
|
23
23
|
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
|
|
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
|
+
'hold them');
|
|
25
26
|
}
|
|
26
27
|
return own;
|
|
27
28
|
}
|
|
@@ -0,0 +1,22 @@
|
|
|
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
|
+
//# sourceMappingURL=session-end.d.ts.map
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// The store writes a session's end makes after sleep and capture (handoff, snapshot close, re-read count), and the
|
|
2
|
+
// compact-resume read; the hook verbs keep stdin, spawning and the log file.
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import { isInitialized } from '../core/project-identity.js';
|
|
5
|
+
import { closeTaskSnapshotsForSession, listSessionEvents, loadActiveTaskSnapshot, loadFreshActiveTaskSnapshot } from '../store/sessions.js';
|
|
6
|
+
import { writeSessionEndHandoff } from '../store/handoffs.js';
|
|
7
|
+
import { readApiCalls, recordRereads } from '../store/token-ledger.js';
|
|
8
|
+
import { getGlobalRoot } from '../sharing/global-store.js';
|
|
9
|
+
import { truncateCodePointSafe } from '../util/transcript-tail.js';
|
|
10
|
+
import { errorMessage, log } from '../util/log.js';
|
|
11
|
+
import { COMPACT_RESUME_EVENT_CONTENT_CAP, COMPACT_RESUME_MAX_AGE_MS, compactResumeText } from './context-render.js';
|
|
12
|
+
/** Writes the session's handoff, then closes its snapshot unless `turn`; each step logs its own failure and never throws.
|
|
13
|
+
* The handoff goes first, while the snapshot writeSessionEndHandoff reads is still active. */
|
|
14
|
+
export function closeEndedSession(ctx, close) {
|
|
15
|
+
if (close.sessionId)
|
|
16
|
+
writeEndHandoff(ctx, close.sessionId, close);
|
|
17
|
+
if (close.turn) {
|
|
18
|
+
close.log('skip snapshot close: turn mode');
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
closeSnapshot(ctx, close.sessionId, close.log);
|
|
22
|
+
}
|
|
23
|
+
function writeEndHandoff(ctx, sessionId, close) {
|
|
24
|
+
try {
|
|
25
|
+
const ownSnapshot = loadActiveTaskSnapshot(ctx.hippoRoot, ctx.tenantId)?.session_id === sessionId;
|
|
26
|
+
// A never-compacted session has no snapshot; read even when it has one, as another session's PreCompact can take the slot before the write.
|
|
27
|
+
const derived = close.workingState();
|
|
28
|
+
if (!ownSnapshot && !derived) {
|
|
29
|
+
close.log('skip: no snapshot or transcript for session');
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const handoff = writeSessionEndHandoff(ctx.hippoRoot, ctx.tenantId, sessionId, close.evidence(), derived, undefined, { inPlace: close.turn });
|
|
33
|
+
close.log(handoff ? `wrote handoff for session ${sessionId}` : `skip: kept the existing handoff for session ${sessionId}`);
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
close.log(`handoff write failed: ${errorMessage(err)}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// If session-end never fires (crash, kill -9), the freshness bound in loadFreshActiveTaskSnapshot is the backstop.
|
|
40
|
+
function closeSnapshot(ctx, sessionId, line) {
|
|
41
|
+
try {
|
|
42
|
+
if (sessionId) {
|
|
43
|
+
const closed = closeTaskSnapshotsForSession(ctx.hippoRoot, ctx.tenantId, sessionId);
|
|
44
|
+
line(`closed ${closed} active snapshot(s) for session ${sessionId}`);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
line('skip: no session_id in SessionEnd payload, active snapshot left untouched');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
line(`snapshot close failed: ${errorMessage(err)}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/** Books the ending session's re-reads in each store its ledger rows can land in (`ctx.hippoRoot` and global); returns the log lines. */
|
|
55
|
+
export async function bookSessionRereads(ctx, transcriptPath, sessionId) {
|
|
56
|
+
if (!transcriptPath || !sessionId)
|
|
57
|
+
return [];
|
|
58
|
+
let read;
|
|
59
|
+
try {
|
|
60
|
+
read = await readApiCalls(transcriptPath);
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
return [`skip re-read count: cannot read the transcript: ${errorMessage(err)}`];
|
|
64
|
+
}
|
|
65
|
+
const roots = new Set([ctx.hippoRoot, getGlobalRoot()].filter((root) => isInitialized(root)).map((root) => path.resolve(root)));
|
|
66
|
+
const lines = [];
|
|
67
|
+
let tokens = 0;
|
|
68
|
+
for (const root of roots) {
|
|
69
|
+
try {
|
|
70
|
+
tokens += recordRereads(root, ctx.tenantId, sessionId, read.calls);
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
lines.push(`re-read count failed: ${errorMessage(err)}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const skipped = read.malformed > 0 ? `, ${read.malformed} unparsable transcript lines skipped` : '';
|
|
77
|
+
lines.push(`re-read ${tokens} tokens over ${read.calls.length} model calls for session ${sessionId}${skipped}`);
|
|
78
|
+
return lines;
|
|
79
|
+
}
|
|
80
|
+
/** The block a compaction lost: the fresh task snapshot and its session trail, or null with none or another session's snapshot. */
|
|
81
|
+
export function compactResumeBlock(ctx, payloadSessionId) {
|
|
82
|
+
const snapshot = loadFreshActiveTaskSnapshot(ctx.hippoRoot, ctx.tenantId, { maxAgeMs: COMPACT_RESUME_MAX_AGE_MS });
|
|
83
|
+
// Concurrent sessions must not cross-restore: only when both ids are present and differ, so a manual run with no payload id still prints.
|
|
84
|
+
if (!snapshot || (payloadSessionId !== null && snapshot.session_id !== null && payloadSessionId !== snapshot.session_id))
|
|
85
|
+
return null;
|
|
86
|
+
// A bad trail row costs the trail, not the snapshot; stderr stays out of the model's context.
|
|
87
|
+
let events = [];
|
|
88
|
+
try {
|
|
89
|
+
if (snapshot.session_id) {
|
|
90
|
+
events = listSessionEvents(ctx.hippoRoot, ctx.tenantId, { session_id: snapshot.session_id }).map((e) => ({
|
|
91
|
+
...e,
|
|
92
|
+
content: truncateCodePointSafe(e.content, COMPACT_RESUME_EVENT_CONTENT_CAP),
|
|
93
|
+
}));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
log.warn(`hippo compact-resume: trail skipped: ${errorMessage(err)}`);
|
|
98
|
+
}
|
|
99
|
+
return compactResumeText(snapshot, events);
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=session-end.js.map
|
package/dist/api/sleep-run.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { loadAllEntries } from '../store/entry-reads.js';
|
|
2
|
-
import { auditMemories } from '../
|
|
2
|
+
import { auditMemories } from '../core/memory-audit.js';
|
|
3
3
|
import { autoShare } from '../sharing/share.js';
|
|
4
4
|
import { consolidate } from '../consolidate/sleep.js';
|
|
5
5
|
import { loadConfig } from '../core/config.js';
|
package/dist/api/sleep-run.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
// The sleep pipeline behind `sleep`, with its phase dependencies injectable; kept out of the package root.
|
|
2
2
|
import { loadAllEntries } from '../store/entry-reads.js';
|
|
3
3
|
import { memoriesBackingObjects } from '../store/delete-and-batch.js';
|
|
4
|
-
import { reportAuditWriteFailure
|
|
4
|
+
import { reportAuditWriteFailure } from '../store/audit.js';
|
|
5
|
+
import { auditMemories } from '../core/memory-audit.js';
|
|
5
6
|
import { sqliteSyncStore } from '../store/sqlite/store.js';
|
|
6
|
-
import { autoShare } from '../sharing/share.js';
|
|
7
|
+
import { AUTO_SHARE_MIN_SCORE, autoShare } from '../sharing/share.js';
|
|
7
8
|
import { consolidate } from '../consolidate/sleep.js';
|
|
8
9
|
import { failedUnitOf } from '../store/delete-and-batch.js';
|
|
9
10
|
import { loadConfig } from '../core/config.js';
|
|
@@ -51,13 +52,15 @@ async function runSleepPhases(ctx, opts, phases, counts) {
|
|
|
51
52
|
const consolidateResult = await phases.consolidate(ctx.hippoRoot, { dryRun });
|
|
52
53
|
counts.consolidation = consolidateResult.semanticCreated + consolidateResult.merged;
|
|
53
54
|
const result = sleepResultFrom(consolidateResult, dryRun);
|
|
55
|
+
// One read after consolidation serves dedup, the audit and ambient: dedup reports every row it deletes, so later phases subtract instead of reading again.
|
|
56
|
+
const loaded = { entries: phases.loadAllEntries(ctx.hippoRoot), backing: memoriesBackingObjects(ctx.hippoRoot) };
|
|
54
57
|
// Phase 2: Dedup (post-consolidate near-duplicate cleanup).
|
|
55
|
-
const dedupResult = phases.deduplicateStore(ctx.hippoRoot, { dryRun, actor: ctx.actor.subject });
|
|
58
|
+
const dedupResult = phases.deduplicateStore(ctx.hippoRoot, { dryRun, actor: ctx.actor.subject, loaded });
|
|
56
59
|
counts.dedup = dedupResult.removed;
|
|
57
60
|
if (dedupResult.removed > 0)
|
|
58
61
|
result.deduped = dedupSummary(dedupResult);
|
|
59
62
|
// Phase 3: Quality audit (remove junk, report warnings; a dry run skips rows earlier phases would remove).
|
|
60
|
-
const audited = runQualityAudit(ctx, phases, { dryRun, consolidateResult, dedupResult, result });
|
|
63
|
+
const audited = runQualityAudit(ctx, phases, { dryRun, consolidateResult, dedupResult, result, loaded });
|
|
61
64
|
counts.auditDeleted = audited.removed;
|
|
62
65
|
if (dryRun)
|
|
63
66
|
return result;
|
|
@@ -115,10 +118,11 @@ function dedupSummary(dedupResult) {
|
|
|
115
118
|
}
|
|
116
119
|
/** `removed` counts audit errors deleted (or that would be under dryRun); `remaining` is what the audit read, less the rows it deleted. */
|
|
117
120
|
function runQualityAudit(ctx, phases, options) {
|
|
118
|
-
const { dryRun, consolidateResult, dedupResult, result } = options;
|
|
119
|
-
|
|
120
|
-
const
|
|
121
|
-
const
|
|
121
|
+
const { dryRun, consolidateResult, dedupResult, result, loaded } = options;
|
|
122
|
+
// The load followed consolidation, so only a dry run still holds the rows consolidation would remove; dedup's pairs are gone or would be.
|
|
123
|
+
const planned = new Set([...(dryRun ? consolidateResult.removedIds ?? [] : []), ...dedupResult.pairs.map((p) => p.removed)]);
|
|
124
|
+
const allEntries = loaded.entries.filter((e) => !planned.has(e.id));
|
|
125
|
+
const auditOut = phases.auditMemories(allEntries, loaded.backing);
|
|
122
126
|
if (auditOut.issues.length === 0)
|
|
123
127
|
return { removed: 0, remaining: allEntries };
|
|
124
128
|
const errors = auditOut.issues.filter((i) => i.severity === 'error');
|
|
@@ -140,7 +144,7 @@ function shareOnSleep(ctx, phases, result) {
|
|
|
140
144
|
return;
|
|
141
145
|
// Both skip counters are surfaced so the secret veto and the rejection tombstone are observable, not silent.
|
|
142
146
|
const autoShareStats = { secretSkipped: 0, rejectedSkipped: 0 };
|
|
143
|
-
const shared = phases.autoShare(ctx.hippoRoot, { minScore:
|
|
147
|
+
const shared = phases.autoShare(ctx.hippoRoot, { minScore: AUTO_SHARE_MIN_SCORE, stats: autoShareStats });
|
|
144
148
|
if (shared.length > 0) {
|
|
145
149
|
result.shared = shared.length;
|
|
146
150
|
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { PhysicsParticle } from '../core/physics.js';
|
|
2
|
+
import type { LegacyStats } from '../store/rows.js';
|
|
3
|
+
import { type StatusCounts } from '../store/candidates.js';
|
|
4
|
+
import { type StoredVectorSummary } from '../store/vector-index.js';
|
|
5
|
+
import { type CorrectionLatencyReport } from './correction-latency.js';
|
|
6
|
+
import { type ProvenanceCoverage } from './provenance-coverage.js';
|
|
7
|
+
import { type Context } from './types.js';
|
|
8
|
+
export interface StoreStatus {
|
|
9
|
+
stats: LegacyStats;
|
|
10
|
+
counts: StatusCounts;
|
|
11
|
+
}
|
|
12
|
+
/** Lifetime stats and row counts for the whole store. Every tenant, so the host admin only. */
|
|
13
|
+
export declare function storeStatus(ctx: Context, now: Date, atRiskBelow: number): StoreStatus;
|
|
14
|
+
/** Ids and dimension of the stored vectors. Every tenant, so the host admin only. */
|
|
15
|
+
export declare function vectorSummary(ctx: Context): StoredVectorSummary;
|
|
16
|
+
/** Whether the stored vectors were built by a different model than `providerId`. Every tenant, so the host admin only. */
|
|
17
|
+
export declare function embeddingReindexNeeded(ctx: Context, providerId: string): boolean;
|
|
18
|
+
/** Every stored physics particle. Every tenant, so the host admin only. */
|
|
19
|
+
export declare function storedParticles(ctx: Context): PhysicsParticle[];
|
|
20
|
+
/** Correction latency over every superseded row in the store. Every tenant, so the host admin only. */
|
|
21
|
+
export declare function correctionLatencyReport(ctx: Context): CorrectionLatencyReport;
|
|
22
|
+
/** Provenance coverage over every kind=raw row in the store. Every tenant, so the host admin only. */
|
|
23
|
+
export declare function provenanceCoverageReport(ctx: Context): ProvenanceCoverage;
|
|
24
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// Store-wide status reads: counts, stats, vector index state and the correction and provenance reports.
|
|
2
|
+
import { loadCorrectionEntries, loadRawEntries } from '../store/report-reads.js';
|
|
3
|
+
import { loadStats } from '../store/index-and-stats.js';
|
|
4
|
+
import { loadStatusCounts } from '../store/candidates.js';
|
|
5
|
+
import { embeddingModelRequiresReindex } from '../store/embeddings/index.js';
|
|
6
|
+
import { loadStoredParticles, storedVectorSummary } from '../store/vector-index.js';
|
|
7
|
+
import { buildCorrectionLatency } from './correction-latency.js';
|
|
8
|
+
import { buildProvenanceCoverage } from './provenance-coverage.js';
|
|
9
|
+
import { requireHostAdmin } from './types.js';
|
|
10
|
+
/** Lifetime stats and row counts for the whole store. Every tenant, so the host admin only. */
|
|
11
|
+
export function storeStatus(ctx, now, atRiskBelow) {
|
|
12
|
+
requireHostAdmin(ctx, 'Reading every tenant');
|
|
13
|
+
return { stats: loadStats(ctx.hippoRoot), counts: loadStatusCounts(ctx.hippoRoot, now, atRiskBelow) };
|
|
14
|
+
}
|
|
15
|
+
/** Ids and dimension of the stored vectors. Every tenant, so the host admin only. */
|
|
16
|
+
export function vectorSummary(ctx) {
|
|
17
|
+
requireHostAdmin(ctx, 'Reading every tenant');
|
|
18
|
+
return storedVectorSummary(ctx.hippoRoot);
|
|
19
|
+
}
|
|
20
|
+
/** Whether the stored vectors were built by a different model than `providerId`. Every tenant, so the host admin only. */
|
|
21
|
+
export function embeddingReindexNeeded(ctx, providerId) {
|
|
22
|
+
requireHostAdmin(ctx, 'Reading every tenant');
|
|
23
|
+
return embeddingModelRequiresReindex(ctx.hippoRoot, providerId);
|
|
24
|
+
}
|
|
25
|
+
/** Every stored physics particle. Every tenant, so the host admin only. */
|
|
26
|
+
export function storedParticles(ctx) {
|
|
27
|
+
requireHostAdmin(ctx, 'Reading every tenant');
|
|
28
|
+
return loadStoredParticles(ctx.hippoRoot);
|
|
29
|
+
}
|
|
30
|
+
/** Correction latency over every superseded row in the store. Every tenant, so the host admin only. */
|
|
31
|
+
export function correctionLatencyReport(ctx) {
|
|
32
|
+
requireHostAdmin(ctx, 'Reading every tenant');
|
|
33
|
+
return buildCorrectionLatency(loadCorrectionEntries(ctx.hippoRoot));
|
|
34
|
+
}
|
|
35
|
+
/** Provenance coverage over every kind=raw row in the store. Every tenant, so the host admin only. */
|
|
36
|
+
export function provenanceCoverageReport(ctx) {
|
|
37
|
+
requireHostAdmin(ctx, 'Reading every tenant');
|
|
38
|
+
return buildProvenanceCoverage(loadRawEntries(ctx.hippoRoot));
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type Context } from './types.js';
|
|
2
|
+
/** Create the store at `ctx.hippoRoot`, or finish setting up one that exists; a store holds every tenant, so the host admin only. */
|
|
3
|
+
export declare function initMemoryStore(ctx: Context): void;
|
|
4
|
+
//# sourceMappingURL=store-init.d.ts.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Creating a store for `hippo init`: the database, its mirror folders and first-run setup.
|
|
2
|
+
import { initStore } from '../store/open.js';
|
|
3
|
+
import { requireHostAdmin } from './types.js';
|
|
4
|
+
/** Create the store at `ctx.hippoRoot`, or finish setting up one that exists; a store holds every tenant, so the host admin only. */
|
|
5
|
+
export function initMemoryStore(ctx) {
|
|
6
|
+
requireHostAdmin(ctx, 'Creating a store');
|
|
7
|
+
initStore(ctx.hippoRoot);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=store-init.js.map
|
package/dist/api/tokens.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Token-use and failure reports.
|
|
2
|
-
import { rethrowIfSqliteBlocked } from '../
|
|
2
|
+
import { rethrowIfSqliteBlocked } from '../util/sqlite-blocked.js';
|
|
3
3
|
import { storeFor } from '../store/index.js';
|
|
4
4
|
import { failureLogSummary, tokenUseSummary } from '../store/usage-reports.js';
|
|
5
5
|
import { errorMessage, log } from '../util/log.js';
|
package/dist/api/types.d.ts
CHANGED
|
@@ -32,6 +32,8 @@ export type StoreReply<C extends Context, R> = C extends {
|
|
|
32
32
|
/** Builds process-local Actor values (admin and host admin) for CLI and CLI-run connector Contexts; Bearer-authed callers build Actor from the api_keys row
|
|
33
33
|
* instead. */
|
|
34
34
|
export declare function adminActor(subject: string): Actor;
|
|
35
|
+
/** Throws unless the caller is the host's operator: `action` reaches past the caller's tenant. */
|
|
36
|
+
export declare function requireHostAdmin(ctx: Context, action: string): void;
|
|
35
37
|
/** The per-person key: an unowned key gets its own bucket by key id rather than sharing one. */
|
|
36
38
|
export declare function ownerOrSubject(actor: Actor): string;
|
|
37
39
|
/** Thrown by `api.recall` on a contract violation; the stable `code` lets callers discriminate without parsing the message.
|
package/dist/api/types.js
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
// Request context (caller identity and tenant) shared by every API module, plus the recall contract error.
|
|
2
|
-
import { BadRequestError } from '../core/api-errors.js';
|
|
2
|
+
import { BadRequestError, ForbiddenError } from '../core/api-errors.js';
|
|
3
3
|
/** Builds process-local Actor values (admin and host admin) for CLI and CLI-run connector Contexts; Bearer-authed callers build Actor from the api_keys row
|
|
4
4
|
* instead. */
|
|
5
5
|
export function adminActor(subject) {
|
|
6
6
|
return { subject, role: 'admin', hostAdmin: true };
|
|
7
7
|
}
|
|
8
|
+
/** Throws unless the caller is the host's operator: `action` reaches past the caller's tenant. */
|
|
9
|
+
export function requireHostAdmin(ctx, action) {
|
|
10
|
+
if (!ctx.actor.hostAdmin)
|
|
11
|
+
throw new ForbiddenError(`${action} requires a host admin`);
|
|
12
|
+
}
|
|
8
13
|
/** The per-person key: an unowned key gets its own bucket by key id rather than sharing one. */
|
|
9
14
|
export function ownerOrSubject(actor) {
|
|
10
15
|
return actor.owner ?? actor.subject;
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { type Context } from '../api/types.js';
|
|
2
|
-
import { type DatabaseSyncLike } from '../db/index.js';
|
|
3
2
|
import { type CallerProject } from '../api/prompt-hook.js';
|
|
4
3
|
import type { ContinuityKey } from '../store/sessions.js';
|
|
5
4
|
import { type WorkingState } from './working-state.js';
|
|
@@ -11,6 +10,4 @@ export declare function callerInHoldout(ctx: Context, sessionId: string): boolea
|
|
|
11
10
|
export declare function checkedWorkingState(state: WorkingState | null): WorkingState | null;
|
|
12
11
|
export declare function assertTrigger(trigger: string | null): void;
|
|
13
12
|
export declare function assertRequestId(requestId: string): void;
|
|
14
|
-
/** Opens with the request's own lock wait, so a busy store becomes a 503 rather than a long stall. */
|
|
15
|
-
export declare function withCallerDb<T>(ctx: Context, fn: (db: DatabaseSyncLike) => T): T;
|
|
16
13
|
//# sourceMappingURL=caller-session.d.ts.map
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
// The checks every caller call shares: ids, project, the session's owner and the pilot arm, all from the request, never the server's env or folder.
|
|
2
2
|
import { BadRequestError } from '../core/api-errors.js';
|
|
3
3
|
import { ownerOrSubject } from '../api/types.js';
|
|
4
|
-
import {
|
|
5
|
-
import { MAX_ID_LEN } from '../util/http-util.js';
|
|
4
|
+
import { MAX_ID_LEN } from '../util/limits.js';
|
|
6
5
|
import { sessionPilotArm } from '../api/pilot-arm.js';
|
|
7
6
|
import { assertCallerIds } from '../api/prompt-hook.js';
|
|
8
7
|
import { assertCallerProject, projectNames } from '../core/project-identity.js';
|
|
@@ -45,14 +44,4 @@ export function assertRequestId(requestId) {
|
|
|
45
44
|
if (requestId.length > MAX_ID_LEN)
|
|
46
45
|
throw new BadRequestError(`request id: at most ${MAX_ID_LEN} characters`);
|
|
47
46
|
}
|
|
48
|
-
/** Opens with the request's own lock wait, so a busy store becomes a 503 rather than a long stall. */
|
|
49
|
-
export function withCallerDb(ctx, fn) {
|
|
50
|
-
const db = openHippoDb(ctx.hippoRoot);
|
|
51
|
-
try {
|
|
52
|
-
return fn(db);
|
|
53
|
-
}
|
|
54
|
-
finally {
|
|
55
|
-
closeHippoDb(db);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
47
|
//# sourceMappingURL=caller-session.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { CaptureErrorOutcome } from '../store/failure-log.js';
|
|
2
2
|
import type { JsonValue } from '../util/json.js';
|
|
3
3
|
/** Store a failure as an error memory unless it is routine or a repeat, and log it either way, even when storing throws. */
|
|
4
|
-
export declare function captureToolFailure(hippoRoot: string, tenantId: string, payload: JsonValue): CaptureErrorOutcome;
|
|
4
|
+
export declare function captureToolFailure(hippoRoot: string, tenantId: string, payload: JsonValue, onLogged?: (failureId: number | null) => void): CaptureErrorOutcome;
|
|
5
5
|
/** Who sent a failure from another machine: the audit actor and the project its lesson and repeat check belong to. */
|
|
6
6
|
export interface LessonCaller {
|
|
7
7
|
actor: string;
|