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/store/auth.d.ts
CHANGED
|
@@ -12,13 +12,15 @@ export declare function apiKeyVerifyStats(): ApiKeyVerifyStats;
|
|
|
12
12
|
export interface CreateApiKeyOpts {
|
|
13
13
|
tenantId: string;
|
|
14
14
|
label?: string;
|
|
15
|
-
/** 'admin' | 'member'. Defaults to '
|
|
15
|
+
/** 'admin' | 'member'. Defaults to 'member', like the API layer. */
|
|
16
16
|
role?: 'admin' | 'member';
|
|
17
17
|
/** The auth-resolver subject a self-service key belongs to; unset for keys an admin or the CLI mints. */
|
|
18
18
|
ownerSubject?: string;
|
|
19
|
-
/** ISO time the key stops working; unset means
|
|
19
|
+
/** ISO time the key stops working; unset means DEFAULT_KEY_TTL_DAYS from now. */
|
|
20
20
|
expiresAt?: string;
|
|
21
21
|
}
|
|
22
|
+
/** Days a key lives when its mint names no expiry, so a key nobody remembers stops working by itself. */
|
|
23
|
+
export declare const DEFAULT_KEY_TTL_DAYS = 90;
|
|
22
24
|
export interface CreateApiKeyResult {
|
|
23
25
|
keyId: string;
|
|
24
26
|
plaintext: string;
|
package/dist/store/auth.js
CHANGED
|
@@ -3,6 +3,7 @@ import { promisify } from 'node:util';
|
|
|
3
3
|
import { closeHippoDb, openHippoDb } from '../db/index.js';
|
|
4
4
|
import { raiseMinBinary } from '../db/meta.js';
|
|
5
5
|
import { keysetAfter } from '../util/keyset.js';
|
|
6
|
+
import { DAY_MS } from '../util/time.js';
|
|
6
7
|
import { EXPIRING_KEYS_MIN_BINARY } from '../util/version.js';
|
|
7
8
|
/** Every minted API key starts with this, so the server can route a bearer token by shape. */
|
|
8
9
|
export const API_KEY_PREFIX = 'hk_';
|
|
@@ -48,6 +49,8 @@ function verifyKey(plaintext, stored) {
|
|
|
48
49
|
return parsed.matches(scryptSync(plaintext, parsed.salt, parsed.keylen));
|
|
49
50
|
}
|
|
50
51
|
const scryptOffLoop = promisify(scrypt);
|
|
52
|
+
/** Days a key lives when its mint names no expiry, so a key nobody remembers stops working by itself. */
|
|
53
|
+
export const DEFAULT_KEY_TTL_DAYS = 90;
|
|
51
54
|
export function mintApiKey() {
|
|
52
55
|
const keyId = `${API_KEY_PREFIX}${randBase32(ID_LEN)}`;
|
|
53
56
|
const plaintext = `${keyId}.${randBase32(SECRET_LEN)}`;
|
|
@@ -63,8 +66,8 @@ export function insertApiKey(db, key) {
|
|
|
63
66
|
export function createApiKey(db, opts) {
|
|
64
67
|
const { keyId, plaintext, keyHash } = mintApiKey();
|
|
65
68
|
insertApiKey(db, {
|
|
66
|
-
keyId, keyHash, tenantId: opts.tenantId, label: opts.label ?? null, role: opts.role ?? '
|
|
67
|
-
ownerSubject: opts.ownerSubject ?? null, expiresAt: opts.expiresAt ??
|
|
69
|
+
keyId, keyHash, tenantId: opts.tenantId, label: opts.label ?? null, role: opts.role ?? 'member', createdAt: new Date().toISOString(),
|
|
70
|
+
ownerSubject: opts.ownerSubject ?? null, expiresAt: opts.expiresAt ?? new Date(Date.now() + DEFAULT_KEY_TTL_DAYS * DAY_MS).toISOString(),
|
|
68
71
|
});
|
|
69
72
|
return { keyId, plaintext };
|
|
70
73
|
}
|
|
@@ -251,7 +254,8 @@ export function listApiKeyRows(db, opts) {
|
|
|
251
254
|
const limitSql = opts.limit === undefined ? '' : ' LIMIT ?';
|
|
252
255
|
if (opts.limit !== undefined)
|
|
253
256
|
params.push(opts.limit);
|
|
254
|
-
const sql = `SELECT id, key_id, tenant_id, label, created_at, revoked_at, role, expires_at, owner_subject FROM api_keys
|
|
257
|
+
const sql = `SELECT id, key_id, tenant_id, label, created_at, revoked_at, role, expires_at, owner_subject FROM api_keys ` +
|
|
258
|
+
`WHERE ${where.join(' AND ')}${after.sql} ORDER BY id DESC${limitSql}`;
|
|
255
259
|
// SAFETY: the SELECT above projects exactly these 9 columns, in this order.
|
|
256
260
|
const rows = db.prepare(sql).all(...params);
|
|
257
261
|
return rows.map(r => ({
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type MemoryEntry, type ConfidenceLevel, Layer } from '../core/memory.js';
|
|
2
|
-
import { type SqlFragment } from './
|
|
2
|
+
import { type SqlFragment } from './rule-sql.js';
|
|
3
3
|
export interface AmbientRecallRequest {
|
|
4
4
|
terms: string[];
|
|
5
5
|
limit: number;
|
|
@@ -37,7 +37,8 @@ export declare const EVERY_SCOPE: SqlFragment;
|
|
|
37
37
|
export declare function loadTextsHoldingWords(hippoRoot: string, tenantId: string | undefined, words: readonly string[], project?: readonly string[], admit?: SqlFragment): HeldText[];
|
|
38
38
|
/** A tenant's `limit` newest rows, oldest first: the tail of loadAllEntries' order, without reading the rows before it. */
|
|
39
39
|
export declare function loadNewestEntries(hippoRoot: string, tenantId: string, limit: number): MemoryEntry[];
|
|
40
|
-
/** computeSchemaFit against
|
|
40
|
+
/** computeSchemaFit against a tenant's newest SCHEMA_FIT_WINDOW_ROWS rows: tag counts come from one aggregate
|
|
41
|
+
* and texts stream one column, so no row is loaded. */
|
|
41
42
|
export declare function schemaFitInStore(hippoRoot: string, tenantId: string, content: string, tags: readonly string[]): number;
|
|
42
43
|
export interface SourceTally {
|
|
43
44
|
source: string;
|
package/dist/store/candidates.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { FALLBACK_HALF_LIFE_DAYS, Layer, calculateStrength, facetsOf, schemaFitFrom } from '../core/memory.js';
|
|
2
2
|
import { strengthSql } from './rule-sql.js';
|
|
3
3
|
import { withReadSnapshot } from '../db/index.js';
|
|
4
|
-
import { scopeAdmitSql } from './
|
|
4
|
+
import { scopeAdmitSql } from './rule-sql.js';
|
|
5
5
|
import { MEMORY_SELECT_COLUMNS, rowToEntry, parseJsonArray } from './rows.js';
|
|
6
6
|
import { onHandle, openStore } from './open.js';
|
|
7
7
|
import { originInSql } from '../core/project-identity.js';
|
|
@@ -15,32 +15,44 @@ function inOrigins(e, origins) {
|
|
|
15
15
|
const origin = e.origin_project ?? null;
|
|
16
16
|
return origin === '' ? origins.userGlobal : origin !== null && origins.names.includes(origin);
|
|
17
17
|
}
|
|
18
|
+
// `id DESC` mirrors getContext's comparator, not loadFreshRawMemories'
|
|
19
|
+
// cross-ingest-stable order: that would change what the hook injects.
|
|
20
|
+
const NEWEST = 'ORDER BY created DESC, id DESC';
|
|
18
21
|
// The newest rows `admit` keeps, newest first. The first window stays unfiltered so admit still sees, and the
|
|
19
22
|
// delivery ledger still counts, the other-project rows it refuses; past it, the reads narrow to the caller's origins.
|
|
20
23
|
function loadRecentRows(run, drifted, tenantId, options) {
|
|
21
24
|
const { needed, admit, origins } = options;
|
|
22
25
|
const keep = origins ? (e) => admit(e) && inOrigins(e, origins) : admit;
|
|
23
|
-
// `id DESC` mirrors getContext's comparator, not loadFreshRawMemories'
|
|
24
|
-
// cross-ingest-stable order: that would change what the hook injects.
|
|
25
|
-
const newest = 'ORDER BY created DESC, id DESC';
|
|
26
26
|
const window = Math.max(needed * 4, 32);
|
|
27
27
|
const originSql = origins && (origins.userGlobal ? `(origin_project = '' OR ${originInSql(origins.names)})` : originInSql(origins.names));
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
if (
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
28
|
+
const own = { where: originSql ? `${AMBIENT_SCOPED} AND ${originSql}` : AMBIENT_SCOPED, params: [tenantId, ...(origins?.names ?? [])] };
|
|
29
|
+
// Text order is chronological only for standard UTC ISO (memory.ts), so a drifted store is read whole and re-sorted downstream.
|
|
30
|
+
if (drifted)
|
|
31
|
+
return run(`${own.where} ${NEWEST}`, [...own.params]).filter(keep);
|
|
32
|
+
let read = run(`${AMBIENT_SCOPED} ${NEWEST} LIMIT ?`, [tenantId, window]);
|
|
33
|
+
let kept = read.filter(keep);
|
|
34
|
+
if (kept.length >= needed || read.length < window)
|
|
35
|
+
return kept;
|
|
36
|
+
if (origins) {
|
|
37
|
+
read = run(`${own.where} ${NEWEST} LIMIT ?`, [...own.params, window]);
|
|
38
|
+
kept = read.filter(keep);
|
|
39
|
+
if (kept.length >= needed || read.length < window)
|
|
34
40
|
return kept;
|
|
35
|
-
if (origins) {
|
|
36
|
-
const ownWindow = run(`${ownWhere} ${newest} LIMIT ?`, [...ownParams, window]);
|
|
37
|
-
const ownKept = ownWindow.filter(keep);
|
|
38
|
-
if (ownKept.length >= needed || ownWindow.length < window)
|
|
39
|
-
return ownKept;
|
|
40
|
-
}
|
|
41
41
|
}
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
return [...kept, ...keptPastWindow(run, own, read, needed - kept.length, keep)];
|
|
43
|
+
}
|
|
44
|
+
// A window of refused rows can hide older ones, so read on in keyset pages, each four times the last, until enough are kept.
|
|
45
|
+
function keptPastWindow(run, own, read, wanted, keep) {
|
|
46
|
+
const out = [];
|
|
47
|
+
let last = read[read.length - 1];
|
|
48
|
+
for (let size = read.length * 4; out.length < wanted; size *= 4) {
|
|
49
|
+
const page = run(`${own.where} AND created <= ? AND (created < ? OR id < ?) ${NEWEST} LIMIT ?`, [...own.params, last.created, last.created, last.id, size]);
|
|
50
|
+
out.push(...page.filter(keep));
|
|
51
|
+
if (page.length < size)
|
|
52
|
+
break;
|
|
53
|
+
last = page[page.length - 1];
|
|
54
|
+
}
|
|
55
|
+
return out;
|
|
44
56
|
}
|
|
45
57
|
// The pins plus the `recentNeeded` newest rows that pass `admit`, for ambient injection. One connection;
|
|
46
58
|
// `recall` piggybacks the prompt-recall FTS query on it too. `origins` narrows the recent rows past the first window.
|
|
@@ -124,7 +136,8 @@ export function loadTextsHoldingWords(hippoRoot, tenantId, words, project, admit
|
|
|
124
136
|
for (let i = 0; i < unique.length; i += 200) {
|
|
125
137
|
const chunk = unique.slice(i, i + 200);
|
|
126
138
|
// SAFETY: rows' shape matches the three columns named in the SELECT below.
|
|
127
|
-
const rows = db.prepare(`SELECT content, source, origin_project FROM memories WHERE ${tenantWhere}${originWhere} AND ${admit.sql} AND (${chunk.map(() => 'instr(content, ?)
|
|
139
|
+
const rows = db.prepare(`SELECT content, source, origin_project FROM memories WHERE ${tenantWhere}${originWhere} AND ${admit.sql} AND (${chunk.map(() => 'instr(content, ?) ' +
|
|
140
|
+
'> 0').join(' OR ')})`).all(...tenantParams, ...(project ?? []), ...admit.params, ...chunk);
|
|
128
141
|
for (const row of rows)
|
|
129
142
|
out.push({ content: row.content, source: row.source ?? 'cli', origin_project: row.origin_project });
|
|
130
143
|
}
|
|
@@ -143,13 +156,17 @@ function* contentsOf(rows) {
|
|
|
143
156
|
for (const row of rows)
|
|
144
157
|
yield row.content;
|
|
145
158
|
}
|
|
146
|
-
/**
|
|
159
|
+
/** How many of a tenant's newest rows schemaFitInStore reads; older rows no longer move the fit. */
|
|
160
|
+
const SCHEMA_FIT_WINDOW_ROWS = 2000;
|
|
161
|
+
/** computeSchemaFit against a tenant's newest SCHEMA_FIT_WINDOW_ROWS rows: tag counts come from one aggregate
|
|
162
|
+
* and texts stream one column, so no row is loaded. */
|
|
147
163
|
export function schemaFitInStore(hippoRoot, tenantId, content, tags) {
|
|
164
|
+
const newest = 'SELECT tags_json, content FROM memories WHERE tenant_id = ? ORDER BY created DESC, id DESC LIMIT ?';
|
|
148
165
|
return onHandle(hippoRoot, (db) => {
|
|
149
166
|
// One read transaction, so the row count and the texts come from the same snapshot.
|
|
150
167
|
return withReadSnapshot(db, () => {
|
|
151
168
|
// SAFETY: rows' shape matches the two columns named in the SELECT.
|
|
152
|
-
const groups = db.prepare(
|
|
169
|
+
const groups = db.prepare(`SELECT tags_json, COUNT(*) AS n FROM (${newest}) GROUP BY tags_json`).all(tenantId, SCHEMA_FIT_WINDOW_ROWS);
|
|
153
170
|
let rows = 0;
|
|
154
171
|
const tagCounts = new Map();
|
|
155
172
|
for (const group of groups) {
|
|
@@ -157,9 +174,11 @@ export function schemaFitInStore(hippoRoot, tenantId, content, tags) {
|
|
|
157
174
|
for (const tag of parseJsonArray(group.tags_json))
|
|
158
175
|
tagCounts.set(tag, (tagCounts.get(tag) ?? 0) + group.n);
|
|
159
176
|
}
|
|
160
|
-
// SHORTCUT: the
|
|
177
|
+
// SHORTCUT: only the newest SCHEMA_FIT_WINDOW_ROWS rows count, so older tags drop out;
|
|
178
|
+
// a stored per-tenant tag and token tally is the upgrade.
|
|
161
179
|
// SAFETY: the SELECT names exactly the one column read.
|
|
162
|
-
const texts = db.prepare(
|
|
180
|
+
const texts = db.prepare(`SELECT content FROM (${newest})`)
|
|
181
|
+
.iterate(tenantId, SCHEMA_FIT_WINDOW_ROWS);
|
|
163
182
|
return schemaFitFrom(content, tags, { rows, tagCounts, contents: contentsOf(texts) });
|
|
164
183
|
});
|
|
165
184
|
}, openStore);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { MemoryEntry } from '../core/memory.js';
|
|
2
|
+
export type CapturedOutcome = 'captured' | 'skipped' | 'rejected';
|
|
3
|
+
export interface CaptureItem {
|
|
4
|
+
readonly content: string;
|
|
5
|
+
/** Built only for an item that is not a repeat of an earlier one, since building can throw. */
|
|
6
|
+
readonly makeEntry: () => MemoryEntry;
|
|
7
|
+
}
|
|
8
|
+
export interface CaptureWriteOpts {
|
|
9
|
+
readonly actor?: string;
|
|
10
|
+
/** No stats, as in a server process. */
|
|
11
|
+
readonly lean: boolean;
|
|
12
|
+
/** Called with each captured entry after its write, so the caller can embed it; the store never picks a provider. */
|
|
13
|
+
readonly onCaptured?: (entry: MemoryEntry) => void;
|
|
14
|
+
}
|
|
15
|
+
/** One outcome per item, in order. `keys` holds the texts already stored and gains each one written, so a repeat inside the batch is skipped. */
|
|
16
|
+
export declare function writeCapturedItems(hippoRoot: string, items: readonly CaptureItem[], keys: Set<string>, opts: CaptureWriteOpts): CapturedOutcome[];
|
|
17
|
+
//# sourceMappingURL=capture-write.d.ts.map
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { closeHippoDb } from '../db/index.js';
|
|
2
|
+
import { duplicateKey } from '../util/same-text.js';
|
|
3
|
+
import { writeEntryMirrors } from './entry-writes.js';
|
|
4
|
+
import { stampOriginProject } from './entry-row.js';
|
|
5
|
+
import { gatedWrite } from './gated-write.js';
|
|
6
|
+
import { updateStatsOn } from './index-and-stats.js';
|
|
7
|
+
import { openStore } from './open.js';
|
|
8
|
+
/** One outcome per item, in order. `keys` holds the texts already stored and gains each one written, so a repeat inside the batch is skipped. */
|
|
9
|
+
export function writeCapturedItems(hippoRoot, items, keys, opts) {
|
|
10
|
+
const db = openStore(hippoRoot);
|
|
11
|
+
try {
|
|
12
|
+
return items.map((item) => {
|
|
13
|
+
if (keys.has(duplicateKey(item.content)))
|
|
14
|
+
return 'skipped';
|
|
15
|
+
const entry = item.makeEntry();
|
|
16
|
+
// One rejected item must not abort the rest of this capture's items.
|
|
17
|
+
const stamped = stampOriginProject(hippoRoot, entry);
|
|
18
|
+
const outcome = gatedWrite(db, hippoRoot, stamped, { actor: opts.actor });
|
|
19
|
+
if (outcome === 'skipped:rejected')
|
|
20
|
+
return 'rejected';
|
|
21
|
+
if (outcome !== 'written')
|
|
22
|
+
return 'skipped';
|
|
23
|
+
writeEntryMirrors(hippoRoot, stamped);
|
|
24
|
+
if (!opts.lean)
|
|
25
|
+
updateStatsOn(db, hippoRoot, { remembered: 1 });
|
|
26
|
+
keys.add(duplicateKey(item.content)); // within-batch dedup
|
|
27
|
+
opts.onCaptured?.(entry);
|
|
28
|
+
return 'captured';
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
closeHippoDb(db);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=capture-write.js.map
|
package/dist/store/cards.js
CHANGED
|
@@ -4,7 +4,7 @@ import { rowToSessionHandoff, isHandoffOutcome } from '../core/handoff.js';
|
|
|
4
4
|
import { CARD_LEASE_MS, assertCardTransition } from '../core/card.js';
|
|
5
5
|
import { assertTenantId } from './tenant.js';
|
|
6
6
|
import { onHandle, openStore } from './open.js';
|
|
7
|
-
import { chunked } from '
|
|
7
|
+
import { chunked } from '../util/chunked.js';
|
|
8
8
|
import { HANDOFF_COLUMNS } from './handoffs.js';
|
|
9
9
|
const CARD_COLUMNS = 'id, title, status, assignee_runtime, repo, contract, budget, lease_until, heartbeat_at, created_at, updated_at, tenant_id, scope';
|
|
10
10
|
function rowToCard(row) {
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type CompactionStart, type Log } from './compactions-record.js';
|
|
2
|
+
/** {@link startCompaction} on a handle of its own, for a caller's request. */
|
|
3
|
+
export declare function startCompactionAt(hippoRoot: string, tenantId: string, start: CompactionStart): string;
|
|
4
|
+
/** {@link markSnapshotSaved} on a handle of its own, for a caller's request. */
|
|
5
|
+
export declare function markSnapshotSavedAt(hippoRoot: string, tenantId: string, recordId: string): void;
|
|
6
|
+
export interface CallerItems {
|
|
7
|
+
readonly sessionId: string;
|
|
8
|
+
readonly trigger: string | null;
|
|
9
|
+
readonly requestId: string;
|
|
10
|
+
readonly project: string;
|
|
11
|
+
readonly items: readonly string[];
|
|
12
|
+
/** The caller's audit actor and its project's names. */
|
|
13
|
+
readonly owner: string;
|
|
14
|
+
readonly origins: readonly string[];
|
|
15
|
+
}
|
|
16
|
+
/** A caller's items, already scrubbed, under its record: a retry of a finished request answers with the first count, and a `summarised` one is reused. */
|
|
17
|
+
export declare function saveCallerItems(hippoRoot: string, tenantId: string, req: CallerItems, log: Log): number;
|
|
18
|
+
//# sourceMappingURL=compaction-caller.d.ts.map
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// A caller's compaction calls on a handle of its own, for code that has a folder and no connection.
|
|
2
|
+
import { onHandle } from './open.js';
|
|
3
|
+
import { compactionByRequest, markSnapshotSaved, recordSummary, saveItems, startCompaction, } from './compactions-record.js';
|
|
4
|
+
/** {@link startCompaction} on a handle of its own, for a caller's request. */
|
|
5
|
+
export function startCompactionAt(hippoRoot, tenantId, start) {
|
|
6
|
+
return onHandle(hippoRoot, (db) => startCompaction(db, tenantId, start));
|
|
7
|
+
}
|
|
8
|
+
/** {@link markSnapshotSaved} on a handle of its own, for a caller's request. */
|
|
9
|
+
export function markSnapshotSavedAt(hippoRoot, tenantId, recordId) {
|
|
10
|
+
onHandle(hippoRoot, (db) => markSnapshotSaved(db, tenantId, recordId));
|
|
11
|
+
}
|
|
12
|
+
/** A caller's items, already scrubbed, under its record: a retry of a finished request answers with the first count, and a `summarised` one is reused. */
|
|
13
|
+
export function saveCallerItems(hippoRoot, tenantId, req, log) {
|
|
14
|
+
return onHandle(hippoRoot, (db) => {
|
|
15
|
+
const earlier = compactionByRequest(db, tenantId, req.requestId, req.sessionId);
|
|
16
|
+
if (earlier !== null && earlier.status !== 'summarised')
|
|
17
|
+
return earlier.itemsWritten;
|
|
18
|
+
const meta = { sessionId: req.sessionId, trigger: req.trigger, cwd: null, transcriptPath: null };
|
|
19
|
+
const text = { summary: '', items: [...req.items] };
|
|
20
|
+
const record = earlier ?? recordSummary(db, hippoRoot, tenantId, {
|
|
21
|
+
meta, text, at: new Date(), caller: { originProject: req.project, requestId: req.requestId },
|
|
22
|
+
});
|
|
23
|
+
return saveItems(db, hippoRoot, {
|
|
24
|
+
tenantId, recordId: record.id, sessionId: req.sessionId, originProject: record.originProject, cwd: null,
|
|
25
|
+
items: record.items, caller: { actor: req.owner, origins: req.origins },
|
|
26
|
+
}, log);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=compaction-caller.js.map
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { type DatabaseSyncLike } from '../db/index.js';
|
|
2
|
+
import { type CompactionStatus } from './compactions.js';
|
|
3
|
+
export type { CompactionStatus };
|
|
4
|
+
export interface CompactionRecord {
|
|
5
|
+
id: string;
|
|
6
|
+
tenantId: string;
|
|
7
|
+
sessionId: string;
|
|
8
|
+
originProject: string;
|
|
9
|
+
trigger: string | null;
|
|
10
|
+
cwd: string | null;
|
|
11
|
+
transcriptPath: string | null;
|
|
12
|
+
snapshotSaved: boolean;
|
|
13
|
+
startedAt: string;
|
|
14
|
+
summarisedAt: string | null;
|
|
15
|
+
summary: string | null;
|
|
16
|
+
items: string[];
|
|
17
|
+
itemsWritten: number;
|
|
18
|
+
status: CompactionStatus;
|
|
19
|
+
}
|
|
20
|
+
export type Log = (message: string) => void;
|
|
21
|
+
export interface CompactionStart {
|
|
22
|
+
sessionId: string;
|
|
23
|
+
originProject: string;
|
|
24
|
+
trigger: string | null;
|
|
25
|
+
cwd: string | null;
|
|
26
|
+
transcriptPath: string | null;
|
|
27
|
+
}
|
|
28
|
+
export declare function startCompaction(db: DatabaseSyncLike, tenantId: string, start: CompactionStart, at?: Date): string;
|
|
29
|
+
/** A session's newest record, or null. */
|
|
30
|
+
export declare function latestCompaction(db: DatabaseSyncLike, tenantId: string, sessionId: string): CompactionRecord | null;
|
|
31
|
+
/** The record a caller's request made, whatever state it reached, so a retry neither writes its items twice nor starts a second record.
|
|
32
|
+
* Another session's id is a ConflictError. */
|
|
33
|
+
export declare function compactionByRequest(db: DatabaseSyncLike, tenantId: string, requestId: string, sessionId: string): CompactionRecord | null;
|
|
34
|
+
/** Best effort, never throws: a compaction must not fail because its record could not be written. */
|
|
35
|
+
export declare function recordCompactionStart(hippoRoot: string, start: Omit<CompactionStart, 'originProject'>, log: Log): string | null;
|
|
36
|
+
/** On the caller's handle and tenant, so a server marks the record under the caller's tenant with its own wait. */
|
|
37
|
+
export declare function markSnapshotSaved(db: DatabaseSyncLike, tenantId: string, recordId: string): void;
|
|
38
|
+
export declare function recordSnapshotSaved(hippoRoot: string, tenantId: string, recordId: string, log: Log): void;
|
|
39
|
+
export interface CompactionText {
|
|
40
|
+
summary: string;
|
|
41
|
+
items: string[];
|
|
42
|
+
}
|
|
43
|
+
/** A caller's checked project, and the id its retries carry so a retry finds this record. */
|
|
44
|
+
export interface SummaryCaller {
|
|
45
|
+
originProject?: string;
|
|
46
|
+
requestId?: string;
|
|
47
|
+
}
|
|
48
|
+
export interface RecordSummaryOptions {
|
|
49
|
+
readonly meta: Omit<CompactionStart, 'originProject'>;
|
|
50
|
+
readonly text: CompactionText;
|
|
51
|
+
readonly at: Date;
|
|
52
|
+
readonly caller?: SummaryCaller;
|
|
53
|
+
}
|
|
54
|
+
/** Puts the summary on the session's `started` record, or inserts a `summarised` one when pre-compact wrote none. One statement each. */
|
|
55
|
+
export declare function recordSummary(db: DatabaseSyncLike, hippoRoot: string, tenantId: string, options: RecordSummaryOptions): CompactionRecord;
|
|
56
|
+
export interface ItemContext {
|
|
57
|
+
tenantId: string;
|
|
58
|
+
/** null when the record step failed: the items still go in, with no record to close. */
|
|
59
|
+
recordId: string | null;
|
|
60
|
+
sessionId: string;
|
|
61
|
+
originProject: string;
|
|
62
|
+
/** Where the session ran, so rows held under the project's older folder name count too. */
|
|
63
|
+
cwd: string | null;
|
|
64
|
+
items: string[];
|
|
65
|
+
/** Set when another machine sent the items: its audit actor and its project's names, since the server's folder is neither. */
|
|
66
|
+
caller?: {
|
|
67
|
+
actor: string;
|
|
68
|
+
origins: readonly string[];
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/** Items that become rows, then the record `done`, in one transaction so two sessions cannot both insert one text. Mirrors after commit. */
|
|
72
|
+
export declare function saveItems(db: DatabaseSyncLike, hippoRoot: string, ctx: ItemContext, log: Log): number;
|
|
73
|
+
export interface CompactionSaveResult {
|
|
74
|
+
/** Memories written; null when neither the record nor the items could be saved. */
|
|
75
|
+
written: number | null;
|
|
76
|
+
/** True when the rest waits for the next sleep or post-compact. */
|
|
77
|
+
deferred: boolean;
|
|
78
|
+
snapshotSaved: boolean;
|
|
79
|
+
}
|
|
80
|
+
/** What one PostCompact save did; `spoolReason` is set when the store was busy or would not open, so the caller keeps the summary on disk. */
|
|
81
|
+
export interface CompactionSaveOutcome {
|
|
82
|
+
result: CompactionSaveResult;
|
|
83
|
+
spoolReason: string | null;
|
|
84
|
+
}
|
|
85
|
+
/** The PostCompact store work, on a handle of its own: record the summary, then write its items. Each step is independent. Never throws. */
|
|
86
|
+
export declare function saveCompactionAt(hippoRoot: string, meta: Omit<CompactionStart, 'originProject'>, text: CompactionText, at: Date, log: Log): CompactionSaveOutcome;
|
|
87
|
+
/** One spooled summary, as plain data. */
|
|
88
|
+
export interface SpooledSummary {
|
|
89
|
+
tenantId: string;
|
|
90
|
+
payload: Omit<CompactionStart, 'originProject'>;
|
|
91
|
+
text: CompactionText;
|
|
92
|
+
at: Date;
|
|
93
|
+
}
|
|
94
|
+
/** Records one spooled summary; it calls `recorded` once the store holds it, so the file is done even if a later step throws. */
|
|
95
|
+
export type SpoolRecorder = (spooled: SpooledSummary, recorded: () => void) => void;
|
|
96
|
+
/** A summary read out of a transcript, scrubbed; `listed` is false when it had no memories section. */
|
|
97
|
+
export interface TranscriptText {
|
|
98
|
+
text: CompactionText;
|
|
99
|
+
listed: boolean;
|
|
100
|
+
}
|
|
101
|
+
/** The file work a replay needs, handed in by the caller so the store holds none of it. */
|
|
102
|
+
export interface ReplaySources {
|
|
103
|
+
/** Feeds each spooled summary to `record`; returns how many it imported. */
|
|
104
|
+
importSpool(tenantId: string, deadline: number, record: SpoolRecorder): number;
|
|
105
|
+
transcriptExists(transcriptPath: string): boolean;
|
|
106
|
+
/** The summary a transcript holds between two moments, or null when it is not (yet) there. */
|
|
107
|
+
transcriptText(transcriptPath: string, afterMs: number, beforeMs: number): TranscriptText | null;
|
|
108
|
+
}
|
|
109
|
+
export interface ReplayOptions {
|
|
110
|
+
busyWaitMs?: number;
|
|
111
|
+
deadline?: number;
|
|
112
|
+
}
|
|
113
|
+
/** For `hippo sleep` and post-compact: opens the store itself and never throws. */
|
|
114
|
+
export declare function replayStoredCompactions(hippoRoot: string, sources: ReplaySources, log: Log, opts?: ReplayOptions): number;
|
|
115
|
+
//# sourceMappingURL=compactions-record.d.ts.map
|