hippo-memory 1.71.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -5
- package/dist/agent-memories/apply.d.ts +0 -11
- package/dist/agent-memories/apply.js +11 -26
- package/dist/agent-memories/claude-code.js +1 -1
- package/dist/agent-memories/codex.js +1 -1
- package/dist/agent-memories/copilot.d.ts +1 -3
- package/dist/agent-memories/copilot.js +1 -17
- package/dist/agent-memories/project-folds.d.ts +10 -0
- package/dist/agent-memories/project-folds.js +34 -0
- package/dist/agent-memories/sync.js +8 -6
- package/dist/api/assemble.js +3 -2
- package/dist/api/audit.d.ts +30 -2
- package/dist/api/audit.js +48 -7
- package/dist/api/auth.d.ts +11 -9
- package/dist/api/auth.js +39 -40
- package/dist/api/auto-sleep.d.ts +5 -2
- package/dist/api/auto-sleep.js +7 -3
- package/dist/api/availability.js +2 -3
- package/dist/api/cards.d.ts +42 -0
- package/dist/api/cards.js +52 -0
- package/dist/api/conflicts.d.ts +28 -0
- package/dist/api/conflicts.js +61 -0
- package/dist/api/context-auto.js +4 -2
- package/dist/api/context-render.js +4 -3
- package/dist/api/context-select.js +15 -29
- package/dist/api/context.js +29 -18
- package/dist/api/continuity.d.ts +47 -0
- package/dist/api/continuity.js +66 -0
- package/dist/api/dormant.js +4 -2
- package/dist/api/drill-down.js +3 -2
- package/dist/api/embeddings.d.ts +17 -0
- package/dist/api/embeddings.js +28 -0
- package/dist/api/error-reply.d.ts +8 -0
- package/dist/api/error-reply.js +21 -0
- package/dist/api/forget.d.ts +7 -3
- package/dist/api/forget.js +24 -14
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +5 -9
- package/dist/api/graph.js +2 -1
- package/dist/api/index.d.ts +4 -2
- package/dist/api/index.js +4 -2
- package/dist/api/instruction-detect.js +5 -1
- package/dist/api/learn.d.ts +5 -1
- package/dist/api/learn.js +71 -44
- package/dist/api/ledger-db.d.ts +2 -6
- package/dist/api/ledger-db.js +4 -36
- package/dist/api/memories.d.ts +21 -1
- package/dist/api/memories.js +51 -1
- package/dist/api/objects.d.ts +1 -1
- package/dist/api/objects.js +2 -1
- package/dist/api/outcome.d.ts +5 -5
- package/dist/api/outcome.js +17 -16
- package/dist/api/pilot-arm.d.ts +1 -11
- package/dist/api/pilot-arm.js +5 -45
- package/dist/api/predictions.d.ts +3 -1
- package/dist/api/predictions.js +8 -1
- package/dist/api/projects.d.ts +21 -0
- package/dist/api/projects.js +24 -0
- package/dist/api/promote.d.ts +3 -3
- package/dist/api/promote.js +26 -28
- package/dist/api/prompt-hook.d.ts +17 -2
- package/dist/api/prompt-hook.js +45 -4
- package/dist/api/quarantine.js +2 -1
- package/dist/api/recall-cli.d.ts +3 -0
- package/dist/api/recall-cli.js +13 -4
- package/dist/api/recall-core.js +10 -5
- package/dist/api/recall-pipeline.js +23 -24
- package/dist/api/recall-request.js +1 -1
- package/dist/api/recall-types.d.ts +3 -1
- package/dist/api/recall.d.ts +0 -3
- package/dist/api/recall.js +51 -73
- package/dist/api/remember-local.d.ts +5 -2
- package/dist/api/remember-local.js +15 -7
- package/dist/api/remember.d.ts +7 -3
- package/dist/api/remember.js +19 -16
- package/dist/api/session-end.d.ts +46 -0
- package/dist/api/session-end.js +131 -0
- package/dist/api/sleep-run.d.ts +1 -1
- package/dist/api/sleep-run.js +16 -11
- package/dist/api/sleep.js +4 -3
- package/dist/api/status.d.ts +24 -0
- package/dist/api/status.js +40 -0
- package/dist/api/store-init.d.ts +4 -0
- package/dist/api/store-init.js +9 -0
- package/dist/api/tokens.js +2 -2
- package/dist/api/types.d.ts +3 -7
- package/dist/api/types.js +6 -1
- package/dist/capture/caller-session.d.ts +0 -3
- package/dist/capture/caller-session.js +1 -12
- package/dist/capture/capture-error.d.ts +2 -2
- package/dist/capture/capture-error.js +23 -18
- package/dist/capture/codex-patch.js +3 -1
- package/dist/capture/command.js +36 -95
- package/dist/capture/compact.js +10 -5
- package/dist/capture/compaction-items-caller.js +11 -20
- package/dist/capture/compaction-record.d.ts +7 -93
- package/dist/capture/compaction-record.js +29 -426
- package/dist/capture/compaction-spool.d.ts +7 -7
- package/dist/capture/compaction-spool.js +60 -51
- package/dist/capture/copilot-transcript.d.ts +2 -1
- package/dist/capture/copilot-transcript.js +2 -1
- package/dist/capture/extract.d.ts +5 -2
- package/dist/capture/extract.js +4 -3
- package/dist/capture/failure-caller.d.ts +1 -1
- package/dist/capture/failure-caller.js +21 -16
- package/dist/capture/failure-reading.d.ts +2 -1
- package/dist/capture/failure-reading.js +7 -9
- package/dist/capture/pre-compact-caller.js +5 -4
- package/dist/capture/session-digest.js +4 -3
- package/dist/capture/session-end-caller.js +3 -2
- package/dist/capture/session-worker.js +22 -10
- package/dist/capture/transcript.d.ts +2 -1
- package/dist/capture/transcript.js +6 -3
- package/dist/capture/working-state.d.ts +4 -2
- package/dist/capture/working-state.js +4 -2
- package/dist/cli/audit-prune.d.ts +0 -25
- package/dist/cli/audit-prune.js +1 -27
- package/dist/cli/audit.js +20 -20
- package/dist/cli/auth.d.ts +1 -1
- package/dist/cli/auth.js +16 -17
- package/dist/cli/briefs.d.ts +1 -4
- package/dist/cli/briefs.js +37 -292
- package/dist/cli/card.js +41 -33
- package/dist/cli/client.d.ts +6 -2
- package/dist/cli/client.js +37 -21
- package/dist/cli/compact-resume-payload.js +1 -1
- package/dist/cli/context.d.ts +1 -1
- package/dist/cli/context.js +13 -13
- package/dist/cli/continuity.d.ts +1 -1
- package/dist/cli/continuity.js +36 -39
- package/dist/cli/curate.d.ts +2 -2
- package/dist/cli/curate.js +32 -36
- package/dist/cli/dag.d.ts +1 -1
- package/dist/cli/dag.js +23 -8
- package/dist/cli/decisions.d.ts +0 -2
- package/dist/cli/decisions.js +7 -285
- package/dist/cli/eval.d.ts +1 -1
- package/dist/cli/eval.js +12 -13
- package/dist/cli/explain.d.ts +1 -1
- package/dist/cli/explain.js +21 -25
- package/dist/cli/flag-values.js +16 -6
- package/dist/cli/flags.d.ts +0 -289
- package/dist/cli/flags.js +3 -138
- package/dist/cli/graph.d.ts +3 -0
- package/dist/cli/graph.js +83 -0
- package/dist/cli/hook-runtime.d.ts +6 -6
- package/dist/cli/hook-runtime.js +9 -36
- package/dist/cli/incidents.d.ts +3 -0
- package/dist/cli/incidents.js +112 -0
- package/dist/cli/init.d.ts +1 -1
- package/dist/cli/init.js +28 -19
- package/dist/cli/install-steps.d.ts +2 -1
- package/dist/cli/install-steps.js +11 -3
- package/dist/cli/last-sleep.js +1 -1
- package/dist/cli/maintenance.d.ts +3 -3
- package/dist/cli/maintenance.js +29 -30
- package/dist/cli/notes.d.ts +2 -0
- package/dist/cli/notes.js +41 -0
- package/dist/cli/object-verbs.d.ts +2 -2
- package/dist/cli/object-verbs.js +4 -4
- package/dist/cli/open-browser.d.ts +14 -0
- package/dist/cli/open-browser.js +26 -0
- package/dist/cli/playbooks.d.ts +3 -4
- package/dist/cli/playbooks.js +126 -290
- package/dist/cli/predictions.d.ts +3 -0
- package/dist/cli/predictions.js +174 -0
- package/dist/cli/print.js +2 -1
- package/dist/cli/projects.js +30 -22
- package/dist/cli/quality-repair-once.d.ts +1 -1
- package/dist/cli/quality-repair-once.js +6 -5
- package/dist/cli/recall.js +13 -7
- package/dist/cli/refine-llm.js +18 -17
- package/dist/cli/remember.js +17 -17
- package/dist/cli/scheduler.js +2 -1
- package/dist/cli/serve.js +11 -6
- package/dist/cli/session-hooks.d.ts +1 -5
- package/dist/cli/session-hooks.js +89 -168
- package/dist/cli/setup.d.ts +1 -1
- package/dist/cli/setup.js +17 -10
- package/dist/cli/shared.d.ts +2 -6
- package/dist/cli/shared.js +9 -29
- package/dist/cli/sleep-render.js +6 -3
- package/dist/cli/sleep.js +6 -37
- package/dist/cli/status.d.ts +3 -3
- package/dist/cli/status.js +32 -35
- package/dist/cli/transfer.d.ts +3 -3
- package/dist/cli/transfer.js +64 -43
- package/dist/cli/usage.d.ts +1 -80
- package/dist/cli/usage.js +2 -696
- package/dist/cli/verb-row.d.ts +34 -0
- package/dist/cli/verb-row.js +6 -0
- package/dist/cli/verbs/health.d.ts +27 -0
- package/dist/cli/verbs/health.js +234 -0
- package/dist/cli/verbs/memory.d.ts +16 -0
- package/dist/cli/verbs/memory.js +236 -0
- package/dist/cli/verbs/objects.d.ts +20 -0
- package/dist/cli/verbs/objects.js +257 -0
- package/dist/cli/verbs/sessions.d.ts +31 -0
- package/dist/cli/verbs/sessions.js +314 -0
- package/dist/cli/verbs.d.ts +81 -0
- package/dist/cli/verbs.js +7 -0
- package/dist/cli/versioned-verbs.d.ts +51 -0
- package/dist/cli/versioned-verbs.js +79 -0
- package/dist/cli.d.ts +1 -272
- package/dist/cli.js +24 -315
- package/dist/connectors/dlq.d.ts +39 -3
- package/dist/connectors/dlq.js +39 -4
- package/dist/connectors/github/backfill.js +12 -3
- package/dist/connectors/github/deletion.js +2 -1
- package/dist/connectors/github/dlq.js +31 -73
- package/dist/connectors/github/ingest.d.ts +2 -6
- package/dist/connectors/github/ingest.js +5 -29
- package/dist/connectors/github/tenant-routing.js +2 -1
- package/dist/connectors/github/webhook.d.ts +2 -1
- package/dist/connectors/github/webhook.js +35 -2
- package/dist/connectors/ingest.d.ts +10 -0
- package/dist/connectors/ingest.js +29 -0
- package/dist/connectors/slack/deletion.js +2 -1
- package/dist/connectors/slack/dlq.js +49 -71
- package/dist/connectors/slack/ingest.d.ts +2 -6
- package/dist/connectors/slack/ingest.js +4 -28
- package/dist/connectors/slack/tenant-routing.js +2 -1
- package/dist/connectors/slack/webhook.d.ts +2 -1
- package/dist/connectors/slack/webhook.js +2 -1
- package/dist/consolidate/conflicts.js +2 -2
- package/dist/consolidate/dag.js +29 -18
- package/dist/consolidate/dedupe.d.ts +7 -0
- package/dist/consolidate/dedupe.js +6 -4
- package/dist/consolidate/llm-passes.js +45 -19
- package/dist/consolidate/memory-value.js +3 -2
- package/dist/consolidate/merge.js +8 -8
- package/dist/consolidate/physics-pass.d.ts +6 -1
- package/dist/consolidate/physics-pass.js +26 -6
- package/dist/consolidate/replay.js +11 -4
- package/dist/consolidate/sleep.js +9 -6
- package/dist/consolidate/traces.js +5 -5
- package/dist/core/ablation.d.ts +10 -0
- package/dist/core/ablation.js +12 -0
- package/dist/{sharing/scope.d.ts → core/active-scope.d.ts} +1 -1
- package/dist/{sharing/scope.js → core/active-scope.js} +1 -1
- package/dist/core/ambient.d.ts +4 -0
- package/dist/core/ambient.js +39 -18
- package/dist/core/api-errors.d.ts +16 -0
- package/dist/core/api-errors.js +20 -0
- package/dist/core/card.js +3 -1
- package/dist/core/compaction-timing.d.ts +7 -0
- package/dist/core/compaction-timing.js +9 -0
- package/dist/core/config.d.ts +1 -1
- package/dist/core/config.js +22 -18
- package/dist/core/cosine.d.ts +3 -0
- package/dist/core/cosine.js +19 -0
- package/dist/{store → core}/markdown.d.ts +1 -1
- package/dist/{store → core}/markdown.js +4 -4
- package/dist/core/memory-audit.d.ts +17 -0
- package/dist/core/memory-audit.js +54 -0
- package/dist/core/memory.d.ts +14 -8
- package/dist/core/memory.js +35 -23
- package/dist/{consolidate → core}/merged-row.d.ts +1 -1
- package/dist/{consolidate → core}/merged-row.js +1 -1
- package/dist/core/physics.d.ts +3 -1
- package/dist/core/physics.js +23 -18
- package/dist/core/prediction.d.ts +3 -0
- package/dist/core/prediction.js +6 -0
- package/dist/core/project-identity.d.ts +3 -0
- package/dist/core/project-identity.js +12 -2
- package/dist/{store → core}/recall-scope.d.ts +1 -10
- package/dist/{store → core}/recall-scope.js +2 -19
- package/dist/core/search-types.d.ts +1 -1
- package/dist/dashboard/dashboard-actions.d.ts +2 -2
- package/dist/dashboard/dashboard-actions.js +5 -5
- package/dist/dashboard/dashboard-queries.js +2 -7
- package/dist/dashboard/dashboard-snapshot.js +1 -3
- package/dist/dashboard/dashboard.js +16 -5
- package/dist/db/busy.d.ts +2 -7
- package/dist/db/busy.js +21 -26
- package/dist/db/connect.d.ts +2 -2
- package/dist/db/connect.js +7 -7
- package/dist/db/index.d.ts +3 -3
- package/dist/db/index.js +3 -3
- package/dist/db/migrate.js +14 -7
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/v11.js +1 -0
- package/dist/db/migrations/v14.js +1 -0
- package/dist/db/migrations/v55.d.ts +3 -0
- package/dist/db/migrations/v55.js +17 -0
- package/dist/db/open.d.ts +0 -2
- package/dist/db/open.js +6 -10
- package/dist/db/physics-state.d.ts +0 -4
- package/dist/db/physics-state.js +7 -33
- package/dist/db/request-stores.d.ts +1 -0
- package/dist/db/request-stores.js +2 -1
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -2
- package/dist/db/vector-store.js +19 -5
- package/dist/db/wal-checkpointer.js +2 -1
- package/dist/doctor.d.ts +3 -0
- package/dist/doctor.js +18 -15
- package/dist/embeddings/local.d.ts +62 -0
- package/dist/embeddings/local.js +146 -0
- package/dist/{store/embeddings → embeddings}/provider.d.ts +5 -2
- package/dist/{store/embeddings → embeddings}/provider.js +19 -25
- package/dist/embeddings/transformers.d.ts +26 -0
- package/dist/embeddings/transformers.js +89 -0
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +1 -1
- package/dist/entry/store-kit.d.ts +37 -0
- package/dist/entry/store-kit.js +25 -0
- package/dist/entry/testing.d.ts +6 -0
- package/dist/entry/testing.js +7 -0
- package/dist/eval/eval-suite.js +17 -11
- package/dist/eval/eval.js +1 -1
- package/dist/eval/judgment.js +12 -5
- package/dist/graph/extract.js +3 -3
- package/dist/graph/recall.js +1 -1
- package/dist/graph/view.js +13 -5
- package/dist/graph/write.d.ts +1 -1
- package/dist/graph/write.js +9 -9
- package/dist/hooks/codex-session.js +3 -2
- package/dist/hooks/codex-wrapper.js +2 -1
- package/dist/hooks/json-hooks.js +10 -4
- package/dist/hooks/opencode.js +8 -5
- package/dist/hooks/shared.d.ts +0 -6
- package/dist/hooks/shared.js +4 -15
- package/dist/importers/core.js +4 -4
- package/dist/importers/sources.js +5 -4
- package/dist/importers/vault.d.ts +1 -1
- package/dist/importers/vault.js +25 -23
- package/dist/index.d.ts +5 -4
- package/dist/index.js +4 -3
- package/dist/learn/autolearn.d.ts +15 -3
- package/dist/learn/autolearn.js +38 -16
- package/dist/learn/churn-git.js +13 -4
- package/dist/learn/extract.d.ts +3 -2
- package/dist/learn/extract.js +7 -5
- package/dist/learn/forward-claim-detector.js +4 -2
- package/dist/learn/invalidation.d.ts +2 -1
- package/dist/learn/invalidation.js +18 -9
- package/dist/mcp/admin-tools.d.ts +2 -2
- package/dist/mcp/admin-tools.js +27 -48
- package/dist/mcp/format.js +3 -2
- package/dist/mcp/framing.d.ts +1 -0
- package/dist/mcp/framing.js +1 -1
- package/dist/mcp/memory-tools.d.ts +1 -1
- package/dist/mcp/memory-tools.js +8 -9
- package/dist/mcp/protocol.d.ts +11 -7
- package/dist/mcp/protocol.js +25 -12
- package/dist/mcp/recall-tools.js +12 -9
- package/dist/mcp/request.js +22 -20
- package/dist/mcp/stdio.js +37 -16
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +44 -21
- package/dist/objects/customer-notes.d.ts +2 -2
- package/dist/objects/decisions.d.ts +2 -2
- package/dist/objects/descriptor.d.ts +1 -1
- package/dist/objects/incidents.d.ts +2 -2
- package/dist/objects/lifecycle.d.ts +1 -1
- package/dist/objects/lifecycle.js +2 -1
- package/dist/objects/policies.d.ts +2 -2
- package/dist/objects/policies.js +2 -1
- package/dist/objects/processes.d.ts +2 -2
- package/dist/objects/project-briefs.d.ts +2 -2
- package/dist/objects/project-briefs.js +2 -3
- package/dist/objects/skills.d.ts +2 -2
- package/dist/postinstall.js +1 -1
- package/dist/rerankers/clef.js +3 -6
- package/dist/rerankers/cross-encoder.d.ts +31 -2
- package/dist/rerankers/cross-encoder.js +71 -98
- package/dist/rerankers/index.js +5 -4
- package/dist/rerankers/jev.js +2 -4
- package/dist/rerankers/outage-warning.d.ts +3 -1
- package/dist/rerankers/outage-warning.js +5 -3
- package/dist/search/bm25-search.js +1 -1
- package/dist/search/boosts.js +1 -1
- package/dist/search/embed-memories.d.ts +12 -0
- package/dist/search/embed-memories.js +389 -0
- package/dist/search/engine.d.ts +8 -0
- package/dist/search/engine.js +10 -0
- package/dist/search/goal-boost.d.ts +1 -1
- package/dist/search/goal-boost.js +6 -3
- package/dist/search/hybrid.d.ts +9 -2
- package/dist/search/hybrid.js +9 -4
- package/dist/search/physics-search.d.ts +6 -3
- package/dist/search/physics-search.js +22 -15
- package/dist/search/rerank.js +1 -1
- package/dist/search/vector.d.ts +8 -6
- package/dist/search/vector.js +14 -17
- package/dist/server/auth.d.ts +3 -1
- package/dist/server/auth.js +24 -15
- package/dist/server/boot.d.ts +2 -1
- package/dist/server/boot.js +34 -84
- package/dist/server/client-ip.d.ts +9 -6
- package/dist/server/client-ip.js +36 -17
- package/dist/server/deadline.d.ts +0 -2
- package/dist/server/deadline.js +1 -7
- package/dist/server/defaults.d.ts +1 -0
- package/dist/server/defaults.js +1 -0
- package/dist/server/mcp-http.js +16 -11
- package/dist/server/request.js +7 -2
- package/dist/server/route-checks.d.ts +7 -0
- package/dist/server/route-checks.js +42 -0
- package/dist/server/route-table.d.ts +9 -8
- package/dist/server/route-table.js +127 -133
- package/dist/server/routes/admin.d.ts +8 -8
- package/dist/server/routes/admin.js +13 -21
- package/dist/server/routes/customer-notes.d.ts +6 -6
- package/dist/server/routes/customer-notes.js +1 -2
- package/dist/server/routes/decisions.d.ts +6 -6
- package/dist/server/routes/decisions.js +2 -4
- package/dist/server/routes/incidents.d.ts +6 -6
- package/dist/server/routes/incidents.js +2 -5
- package/dist/server/routes/memories.d.ts +9 -9
- package/dist/server/routes/memories.js +19 -40
- package/dist/server/routes/object-routes.d.ts +6 -6
- package/dist/server/routes/object-routes.js +4 -7
- package/dist/server/routes/policies.d.ts +7 -7
- package/dist/server/routes/policies.js +2 -4
- package/dist/server/routes/predictions.d.ts +6 -6
- package/dist/server/routes/predictions.js +9 -13
- package/dist/server/routes/processes.d.ts +6 -6
- package/dist/server/routes/processes.js +1 -2
- package/dist/server/routes/project-briefs.d.ts +7 -7
- package/dist/server/routes/project-briefs.js +2 -4
- package/dist/server/routes/recall.d.ts +5 -5
- package/dist/server/routes/recall.js +6 -10
- package/dist/server/routes/skills.d.ts +7 -7
- package/dist/server/routes/skills.js +2 -4
- package/dist/server/server-detect.d.ts +7 -1
- package/dist/server/server-detect.js +36 -11
- package/dist/server/sleep-child.js +26 -7
- package/dist/server/sleep-offload.d.ts +11 -5
- package/dist/server/sleep-offload.js +17 -11
- package/dist/server/tls.d.ts +7 -2
- package/dist/server/tls.js +17 -5
- package/dist/server/types.d.ts +29 -12
- package/dist/server/validation.d.ts +1 -2
- package/dist/server/validation.js +6 -11
- package/dist/server.d.ts +4 -40
- package/dist/server.js +3 -29
- package/dist/sharing/global-store.d.ts +4 -5
- package/dist/sharing/global-store.js +8 -13
- package/dist/sharing/global-sync.js +38 -45
- package/dist/sharing/project-merge.d.ts +7 -14
- package/dist/sharing/project-merge.js +57 -121
- package/dist/sharing/search-both.js +10 -3
- package/dist/sharing/share.d.ts +2 -0
- package/dist/sharing/share.js +39 -38
- package/dist/store/ambient.js +7 -7
- package/dist/store/audit-event.d.ts +1 -1
- package/dist/store/audit.d.ts +0 -16
- package/dist/store/audit.js +4 -55
- package/dist/store/auth.d.ts +4 -2
- package/dist/store/auth.js +7 -3
- package/dist/store/candidates.d.ts +3 -2
- package/dist/store/candidates.js +59 -30
- package/dist/store/capture-write.d.ts +17 -0
- package/dist/store/capture-write.js +35 -0
- package/dist/store/cards.js +6 -5
- package/dist/store/compaction-caller.d.ts +18 -0
- package/dist/store/compaction-caller.js +29 -0
- package/dist/store/compactions-record.d.ts +115 -0
- package/dist/store/compactions-record.js +418 -0
- package/dist/store/compactions.js +6 -4
- package/dist/store/conflicts.d.ts +7 -1
- package/dist/store/conflicts.js +13 -9
- package/dist/store/connectors/dlq.d.ts +10 -0
- package/dist/store/connectors/dlq.js +33 -0
- package/dist/store/connectors/event-log.d.ts +13 -0
- package/dist/store/connectors/event-log.js +24 -0
- package/dist/store/connectors/github.d.ts +7 -9
- package/dist/store/connectors/github.js +35 -60
- package/dist/store/connectors/slack.d.ts +2 -11
- package/dist/store/connectors/slack.js +24 -57
- package/dist/store/dashboard-reads.js +8 -6
- package/dist/store/delete-and-batch.d.ts +6 -0
- package/dist/store/delete-and-batch.js +40 -6
- package/dist/store/delivery-recorder.d.ts +12 -5
- package/dist/store/delivery-recorder.js +13 -11
- package/dist/store/descendant-page.js +8 -4
- package/dist/store/dormant.d.ts +1 -1
- package/dist/store/dormant.js +10 -4
- package/dist/store/embeddings/index.d.ts +2 -12
- package/dist/store/embeddings/index.js +5 -374
- package/dist/store/entry-reads.d.ts +35 -4
- package/dist/store/entry-reads.js +86 -19
- package/dist/store/entry-row.js +9 -2
- package/dist/store/entry-writes.d.ts +15 -12
- package/dist/store/entry-writes.js +54 -22
- package/dist/store/failure-log-at.d.ts +8 -0
- package/dist/store/failure-log-at.js +16 -0
- package/dist/store/failure-log.d.ts +2 -2
- package/dist/store/failure-log.js +5 -3
- package/dist/{trust → store}/gated-write.d.ts +3 -1
- package/dist/{trust → store}/gated-write.js +7 -5
- package/dist/store/goals.js +22 -19
- package/dist/store/graph-reads.js +9 -6
- package/dist/store/graph-view-rows.js +2 -1
- package/dist/store/graph-writes.d.ts +6 -6
- package/dist/store/graph-writes.js +48 -71
- package/dist/store/half-life.js +2 -2
- package/dist/store/handoffs.d.ts +10 -4
- package/dist/store/handoffs.js +10 -9
- package/dist/store/index-and-stats.js +2 -2
- package/dist/store/index.d.ts +2 -2
- package/dist/store/index.js +1 -1
- package/dist/store/key-writes.js +1 -1
- package/dist/store/ledger-turn.d.ts +9 -0
- package/dist/store/ledger-turn.js +38 -0
- package/dist/store/mirrors.js +19 -10
- package/dist/store/open.d.ts +2 -5
- package/dist/store/open.js +42 -54
- package/dist/store/pilot-arm.d.ts +12 -0
- package/dist/store/pilot-arm.js +42 -0
- package/dist/store/port.d.ts +68 -6
- package/dist/store/port.js +8 -0
- package/dist/store/predictions.d.ts +1 -2
- package/dist/store/predictions.js +3 -6
- package/dist/store/project-tags.d.ts +62 -0
- package/dist/store/project-tags.js +67 -0
- package/dist/store/quality-repair.js +1 -1
- package/dist/store/quarantine.js +2 -1
- package/dist/store/recall-trace.d.ts +2 -0
- package/dist/store/recall-trace.js +20 -3
- package/dist/store/rejected-values.js +16 -10
- package/dist/store/rejection-probe.d.ts +4 -0
- package/dist/store/rejection-probe.js +19 -0
- package/dist/store/rejection.d.ts +0 -17
- package/dist/store/rejection.js +1 -21
- package/dist/store/rows.js +2 -2
- package/dist/store/rule-sql.d.ts +11 -0
- package/dist/store/rule-sql.js +31 -6
- package/dist/store/search-rows.d.ts +5 -5
- package/dist/store/search-rows.js +18 -16
- package/dist/store/sessions.js +4 -2
- package/dist/store/set-aside.d.ts +14 -0
- package/dist/store/set-aside.js +23 -0
- package/dist/store/sqlite/busy.d.ts +3 -0
- package/dist/store/sqlite/busy.js +8 -0
- package/dist/store/sqlite/connector-events-group.js +4 -7
- package/dist/store/sqlite/connector-writes-group.js +6 -4
- package/dist/store/sqlite/entry-writes-group.d.ts +3 -3
- package/dist/store/sqlite/entry-writes-group.js +3 -3
- package/dist/store/sqlite/error-codec.js +4 -3
- package/dist/store/sqlite/executor.js +10 -4
- package/dist/store/sqlite/graph-reads-group.js +1 -1
- package/dist/store/sqlite/held-connection.d.ts +11 -0
- package/dist/store/sqlite/held-connection.js +41 -0
- package/dist/store/sqlite/last-recall-group.d.ts +13 -0
- package/dist/store/sqlite/last-recall-group.js +57 -0
- package/dist/store/sqlite/local.d.ts +0 -17
- package/dist/store/sqlite/local.js +0 -31
- package/dist/store/sqlite/maintenance-groups.d.ts +6 -0
- package/dist/store/sqlite/maintenance-groups.js +60 -0
- package/dist/store/sqlite/object-rows.d.ts +1 -1
- package/dist/store/sqlite/objects-group.d.ts +1 -1
- package/dist/store/sqlite/objects-group.js +15 -7
- package/dist/store/sqlite/store.d.ts +1 -8
- package/dist/store/sqlite/store.js +13 -22
- package/dist/store/summaries.d.ts +10 -3
- package/dist/store/summaries.js +54 -11
- package/dist/store/token-ledger-rows.js +3 -2
- package/dist/store/token-ledger.d.ts +0 -7
- package/dist/store/token-ledger.js +0 -35
- package/dist/store/vector-index.js +8 -4
- package/dist/support-bundle.js +2 -3
- package/dist/trust/reject-flow.js +2 -2
- package/dist/util/agent-homes.d.ts +15 -0
- package/dist/util/agent-homes.js +34 -0
- package/dist/util/anthropic-messages.d.ts +6 -1
- package/dist/util/anthropic-messages.js +26 -7
- package/dist/util/atomic-write.d.ts +5 -2
- package/dist/util/atomic-write.js +12 -8
- package/dist/util/chunked.d.ts +3 -0
- package/dist/util/chunked.js +10 -0
- package/dist/util/ellipsize.d.ts +3 -0
- package/dist/util/ellipsize.js +5 -0
- package/dist/util/env.d.ts +12 -2
- package/dist/util/env.js +12 -2
- package/dist/util/format.d.ts +5 -0
- package/dist/util/format.js +10 -0
- package/dist/util/hook-payload.d.ts +8 -0
- package/dist/util/hook-payload.js +37 -0
- package/dist/util/http-retry.d.ts +6 -0
- package/dist/util/http-retry.js +43 -5
- package/dist/util/http-util.d.ts +0 -8
- package/dist/util/http-util.js +10 -21
- package/dist/util/limits.d.ts +7 -0
- package/dist/util/limits.js +14 -0
- package/dist/util/log.d.ts +4 -0
- package/dist/util/log.js +9 -0
- package/dist/util/request-scope.d.ts +9 -3
- package/dist/util/request-scope.js +18 -9
- package/dist/util/secret-detect.js +6 -1
- package/dist/util/spawn-argv.d.ts +9 -0
- package/dist/util/spawn-argv.js +57 -0
- package/dist/util/sql.d.ts +3 -0
- package/dist/util/sql.js +6 -0
- package/dist/util/sqlite-blocked.d.ts +2 -0
- package/dist/util/sqlite-blocked.js +5 -0
- package/dist/util/stream-tee.d.ts +3 -0
- package/dist/util/stream-tee.js +35 -0
- package/dist/util/time.d.ts +4 -0
- package/dist/util/time.js +4 -0
- package/dist/util/vector-codec.d.ts +4 -0
- package/dist/util/vector-codec.js +15 -0
- package/dist/util/version.d.ts +1 -1
- package/dist/util/version.js +1 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +4 -2
- package/dist/api/on-store.d.ts +0 -16
- package/dist/api/on-store.js +0 -38
- package/dist/store/embeddings/local.d.ts +0 -15
- package/dist/store/embeddings/local.js +0 -175
- /package/dist/{cli → api}/correction-latency.d.ts +0 -0
- /package/dist/{cli → api}/correction-latency.js +0 -0
- /package/dist/{cli → api}/provenance-coverage.d.ts +0 -0
- /package/dist/{cli → api}/provenance-coverage.js +0 -0
- /package/dist/{store → core}/object-types.d.ts +0 -0
- /package/dist/{store → core}/object-types.js +0 -0
- /package/dist/{capture → util}/compaction-items.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.js +0 -0
- /package/dist/{store → util}/yaml.d.ts +0 -0
- /package/dist/{store → util}/yaml.js +0 -0
package/dist/db/busy.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { errorFields, errorMessage, log } from '../util/log.js';
|
|
1
2
|
function carriesErrcode(cause) {
|
|
2
3
|
return typeof cause === 'object' && cause !== null && 'errcode' in cause;
|
|
3
4
|
}
|
|
@@ -5,21 +6,11 @@ export function isSqliteBusy(cause) {
|
|
|
5
6
|
const code = carriesErrcode(cause) ? cause.errcode : undefined;
|
|
6
7
|
return code === 5 || code === 6 || code === 517;
|
|
7
8
|
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
export class StoreBusyError extends Error {
|
|
11
|
-
constructor(message = STORE_BUSY_MESSAGE, options) {
|
|
12
|
-
super(message, options);
|
|
13
|
-
this.name = 'StoreBusyError';
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
/** A held lock in any store: SQLite's busy codes or a port's StoreBusyError. */
|
|
17
|
-
export function isStoreBusy(error) {
|
|
18
|
-
return error instanceof StoreBusyError || isSqliteBusy(error);
|
|
19
|
-
}
|
|
9
|
+
/** The lock wait of an open that names none: its busy_timeout and every explicit wait below. */
|
|
10
|
+
export const DEFAULT_BUSY_WAIT_MS = 5000;
|
|
20
11
|
// busy_timeout covers neither contended statement here: SQLite skips the busy handler for `PRAGMA journal_mode` and for a write
|
|
21
12
|
// that upgrades a deferred read snapshot, so both need an explicit wait.
|
|
22
|
-
export function execWithBusyRetry(db, sql, timeoutMs =
|
|
13
|
+
export function execWithBusyRetry(db, sql, timeoutMs = DEFAULT_BUSY_WAIT_MS) {
|
|
23
14
|
const deadline = Date.now() + timeoutMs;
|
|
24
15
|
const idle = new Int32Array(new SharedArrayBuffer(4));
|
|
25
16
|
for (;;) {
|
|
@@ -43,6 +34,17 @@ function undoScope(db, top, name) {
|
|
|
43
34
|
db.exec(`RELEASE SAVEPOINT ${name}`);
|
|
44
35
|
}
|
|
45
36
|
}
|
|
37
|
+
/** Undo after a failure without letting a failed undo replace the caller's error; an idle handle means SQLite already unwound the scope. */
|
|
38
|
+
function undoAfterFailure(db, top, name) {
|
|
39
|
+
if (db.isTransaction === false)
|
|
40
|
+
return;
|
|
41
|
+
try {
|
|
42
|
+
undoScope(db, top, name);
|
|
43
|
+
}
|
|
44
|
+
catch (undoError) {
|
|
45
|
+
log.error(`rollback of write scope ${name} failed: ${errorMessage(undoError)}`, errorFields(undoError));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
46
48
|
/** Runs `fn` as one write: BEGIN IMMEDIATE on an idle handle, else SAVEPOINT `name` inside the caller's transaction.
|
|
47
49
|
* A deferred scope that reads first cannot wait out another writer, while BEGIN IMMEDIATE waits the open's busy_timeout. */
|
|
48
50
|
export function withWriteScope(db, name, fn, opts) {
|
|
@@ -57,10 +59,7 @@ export function withWriteScope(db, name, fn, opts) {
|
|
|
57
59
|
return result;
|
|
58
60
|
}
|
|
59
61
|
catch (error) {
|
|
60
|
-
|
|
61
|
-
undoScope(db, top, name);
|
|
62
|
-
}
|
|
63
|
-
catch { /* already rolled back; keep the original error */ }
|
|
62
|
+
undoAfterFailure(db, top, name);
|
|
64
63
|
throw error;
|
|
65
64
|
}
|
|
66
65
|
}
|
|
@@ -77,7 +76,9 @@ export function withReadSnapshot(db, fn) {
|
|
|
77
76
|
try {
|
|
78
77
|
db.exec('COMMIT');
|
|
79
78
|
}
|
|
80
|
-
catch {
|
|
79
|
+
catch (endError) {
|
|
80
|
+
log.error(`ending read snapshot failed: ${errorMessage(endError)}`, errorFields(endError));
|
|
81
|
+
}
|
|
81
82
|
throw error;
|
|
82
83
|
}
|
|
83
84
|
db.exec('COMMIT');
|
|
@@ -92,10 +93,7 @@ export function withTrialScope(db, name, fn) {
|
|
|
92
93
|
result = fn();
|
|
93
94
|
}
|
|
94
95
|
catch (error) {
|
|
95
|
-
|
|
96
|
-
undoScope(db, top, name);
|
|
97
|
-
}
|
|
98
|
-
catch { /* already rolled back; keep the original error */ }
|
|
96
|
+
undoAfterFailure(db, top, name);
|
|
99
97
|
throw error;
|
|
100
98
|
}
|
|
101
99
|
undoScope(db, top, name);
|
|
@@ -123,10 +121,7 @@ export function withWriteScopeOr(db, name, fn) {
|
|
|
123
121
|
return result;
|
|
124
122
|
}
|
|
125
123
|
catch (error) {
|
|
126
|
-
|
|
127
|
-
undoScope(db, top, name);
|
|
128
|
-
}
|
|
129
|
-
catch { /* already rolled back; keep the original error */ }
|
|
124
|
+
undoAfterFailure(db, top, name);
|
|
130
125
|
throw error;
|
|
131
126
|
}
|
|
132
127
|
}
|
package/dist/db/connect.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { type DatabaseSyncLike } from './sqlite.js';
|
|
2
2
|
import { type OpenFacts } from './migrate.js';
|
|
3
|
-
export declare const DEFAULT_BUSY_WAIT_MS = 5000;
|
|
4
3
|
export declare function getHippoDbPath(hippoRoot: string): string;
|
|
5
4
|
/** Runs `step` on this store unless it already ran to the end in this process; a throw leaves it due. */
|
|
6
5
|
export declare function oncePerStore(hippoRoot: string, name: string, step: () => void): void;
|
|
@@ -9,6 +8,7 @@ export interface OpenedDb {
|
|
|
9
8
|
readonly db: DatabaseSyncLike;
|
|
10
9
|
readonly facts: OpenFacts | null;
|
|
11
10
|
}
|
|
12
|
-
/** A new connection with the store's pragmas and migrations applied and the mirror cleanup run when it is due; the caller owns and closes it.
|
|
11
|
+
/** A new connection with the store's pragmas and migrations applied and the mirror cleanup run when it is due; the caller owns and closes it.
|
|
12
|
+
* Outside any request scope (CLI start-up, timers) this is the only handle there is; openHippoDb reuses the scope's when one exists. */
|
|
13
13
|
export declare function connectWithFacts(hippoRoot: string, busyWaitMs?: number): OpenedDb;
|
|
14
14
|
//# sourceMappingURL=connect.d.ts.map
|
package/dist/db/connect.js
CHANGED
|
@@ -3,10 +3,9 @@ import * as path from 'path';
|
|
|
3
3
|
import { cleanupArchivedMirrors } from './raw-archive-mirror-cleanup.js';
|
|
4
4
|
import { errorFields, errorMessage, log } from '../util/log.js';
|
|
5
5
|
import { DatabaseSync } from './sqlite.js';
|
|
6
|
-
import { execWithBusyRetry } from './busy.js';
|
|
6
|
+
import { DEFAULT_BUSY_WAIT_MS, execWithBusyRetry } from './busy.js';
|
|
7
7
|
import { runMigrations } from './migrate.js';
|
|
8
8
|
import { autoCheckpointPages } from './wal-checkpointer.js';
|
|
9
|
-
export const DEFAULT_BUSY_WAIT_MS = 5000;
|
|
10
9
|
export function getHippoDbPath(hippoRoot) {
|
|
11
10
|
return path.join(hippoRoot, 'hippo.db');
|
|
12
11
|
}
|
|
@@ -52,12 +51,13 @@ function archiveTop(db) {
|
|
|
52
51
|
const row = db.prepare('SELECT MAX(id) AS top FROM raw_archive').get();
|
|
53
52
|
return Number(row?.top ?? 0);
|
|
54
53
|
}
|
|
55
|
-
/** A new connection with the store's pragmas and migrations applied and the mirror cleanup run when it is due; the caller owns and closes it.
|
|
56
|
-
|
|
54
|
+
/** A new connection with the store's pragmas and migrations applied and the mirror cleanup run when it is due; the caller owns and closes it.
|
|
55
|
+
* Outside any request scope (CLI start-up, timers) this is the only handle there is; openHippoDb reuses the scope's when one exists. */
|
|
56
|
+
export function connectWithFacts(hippoRoot, busyWaitMs = DEFAULT_BUSY_WAIT_MS) {
|
|
57
57
|
createStoreFilesOwnerOnly(hippoRoot);
|
|
58
58
|
const db = new DatabaseSync(getHippoDbPath(hippoRoot));
|
|
59
59
|
try {
|
|
60
|
-
db.exec(`PRAGMA busy_timeout = ${busyWaitMs
|
|
60
|
+
db.exec(`PRAGMA busy_timeout = ${busyWaitMs}`);
|
|
61
61
|
execWithBusyRetry(db, 'PRAGMA journal_mode = WAL', busyWaitMs);
|
|
62
62
|
db.exec('PRAGMA synchronous = NORMAL');
|
|
63
63
|
db.exec(`PRAGMA wal_autocheckpoint = ${autoCheckpointPages(getHippoDbPath(hippoRoot))}`);
|
|
@@ -76,8 +76,8 @@ export function connectWithFacts(hippoRoot, busyWaitMs) {
|
|
|
76
76
|
try {
|
|
77
77
|
db.close();
|
|
78
78
|
}
|
|
79
|
-
catch {
|
|
80
|
-
|
|
79
|
+
catch (closeErr) {
|
|
80
|
+
log.error(`openHippoDb: closing the handle after a failed open failed: ${errorMessage(closeErr)}`, errorFields(closeErr));
|
|
81
81
|
}
|
|
82
82
|
throw error;
|
|
83
83
|
}
|
package/dist/db/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
export type { DatabaseSyncLike } from './sqlite.js';
|
|
2
|
-
export { isSqliteBusy,
|
|
2
|
+
export { isSqliteBusy, execWithBusyRetry, withReadSnapshot, withTrialScope, withWriteScope, withWriteScopeOr } from './busy.js';
|
|
3
3
|
export { getSchemaVersion, getMeta, setMeta, isFtsAvailable } from './meta.js';
|
|
4
|
-
export { countTableRows, pruneConsolidationRuns } from './tables.js';
|
|
4
|
+
export { countTableRows, pruneConsolidationRuns, CONSOLIDATION_RUNS_KEPT } from './tables.js';
|
|
5
5
|
export { getCurrentSchemaVersion, IncompatibleBinaryError, ftsRowCounts, repairFtsDrift } from './migrate.js';
|
|
6
|
-
export { getHippoDbPath, HOOK_DB_WAIT_MS, noteStoreBusy, withSharedStoreHandles, SERVER_DB_WAIT_MS, SLEEP_DB_WAIT_MS, scopedBusyWait, withSqliteBlocked, withSqliteAllowed, withSqliteOffLoop, outsideSqliteOffLoop,
|
|
6
|
+
export { getHippoDbPath, HOOK_DB_WAIT_MS, noteStoreBusy, withSharedStoreHandles, SERVER_DB_WAIT_MS, SLEEP_DB_WAIT_MS, scopedBusyWait, withSqliteBlocked, withSqliteAllowed, withSqliteOffLoop, outsideSqliteOffLoop, OTHER_STORE_MARKER, openHippoDb, openHippoDbReadOnly, closeHippoDb, } from './open.js';
|
|
7
7
|
export { RequestStores, runWithRequestStores, currentRequestStores, outsideRequestStores } from './request-stores.js';
|
|
8
8
|
export { OtherStoreFolderError, SqliteBlockedError } from '../util/sqlite-blocked.js';
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/db/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export { isSqliteBusy,
|
|
1
|
+
export { isSqliteBusy, execWithBusyRetry, withReadSnapshot, withTrialScope, withWriteScope, withWriteScopeOr } from './busy.js';
|
|
2
2
|
export { getSchemaVersion, getMeta, setMeta, isFtsAvailable } from './meta.js';
|
|
3
|
-
export { countTableRows, pruneConsolidationRuns } from './tables.js';
|
|
3
|
+
export { countTableRows, pruneConsolidationRuns, CONSOLIDATION_RUNS_KEPT } from './tables.js';
|
|
4
4
|
export { getCurrentSchemaVersion, IncompatibleBinaryError, ftsRowCounts, repairFtsDrift } from './migrate.js';
|
|
5
|
-
export { getHippoDbPath, HOOK_DB_WAIT_MS, noteStoreBusy, withSharedStoreHandles, SERVER_DB_WAIT_MS, SLEEP_DB_WAIT_MS, scopedBusyWait, withSqliteBlocked, withSqliteAllowed, withSqliteOffLoop, outsideSqliteOffLoop,
|
|
5
|
+
export { getHippoDbPath, HOOK_DB_WAIT_MS, noteStoreBusy, withSharedStoreHandles, SERVER_DB_WAIT_MS, SLEEP_DB_WAIT_MS, scopedBusyWait, withSqliteBlocked, withSqliteAllowed, withSqliteOffLoop, outsideSqliteOffLoop, OTHER_STORE_MARKER, openHippoDb, openHippoDbReadOnly, closeHippoDb, } from './open.js';
|
|
6
6
|
export { RequestStores, runWithRequestStores, currentRequestStores, outsideRequestStores } from './request-stores.js';
|
|
7
7
|
export { OtherStoreFolderError, SqliteBlockedError } from '../util/sqlite-blocked.js';
|
|
8
8
|
//# sourceMappingURL=index.js.map
|
package/dist/db/migrate.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { PACKAGE_VERSION, compareSemver } from '../util/version.js';
|
|
2
|
-
import { errorMessage, log } from '../util/log.js';
|
|
2
|
+
import { errorFields, errorMessage, log } from '../util/log.js';
|
|
3
3
|
import { importLegacyEmbeddingIndex } from './vector-store.js';
|
|
4
4
|
import { execWithBusyRetry, withWriteScope } from './busy.js';
|
|
5
5
|
import { tableExists } from './tables.js';
|
|
6
6
|
import { ensureMetaTable, getMeta, getSchemaVersion, setMeta, setSchemaVersion } from './meta.js';
|
|
7
7
|
import { MEMORIES_FTS_DDL, REQUIRED_SCHEMA_OBJECTS, ensureContinuityIndexes, ensureContinuityTables } from './continuity.js';
|
|
8
8
|
import { CURRENT_SCHEMA_VERSION, MIGRATIONS } from './migrations/index.js';
|
|
9
|
+
import { placeholders } from '../util/sql.js';
|
|
9
10
|
export function getCurrentSchemaVersion() {
|
|
10
11
|
return CURRENT_SCHEMA_VERSION;
|
|
11
12
|
}
|
|
@@ -130,7 +131,7 @@ function ensureMetaDefaults(db) {
|
|
|
130
131
|
const keys = META_DEFAULTS.map(([key]) => key);
|
|
131
132
|
// SAFETY: the statement selects only the `key` column of `meta`, which is TEXT NOT NULL, so each row is { key: string }.
|
|
132
133
|
const present = new Set(db
|
|
133
|
-
.prepare(`SELECT key FROM meta WHERE key IN (${keys.
|
|
134
|
+
.prepare(`SELECT key FROM meta WHERE key IN (${placeholders(keys.length)})`)
|
|
134
135
|
.all(...keys)
|
|
135
136
|
.map((r) => r.key));
|
|
136
137
|
if (present.size === META_DEFAULTS.length)
|
|
@@ -142,18 +143,24 @@ function ensureMetaDefaults(db) {
|
|
|
142
143
|
}
|
|
143
144
|
}
|
|
144
145
|
function ensureOptionalFts(db) {
|
|
145
|
-
let available = false;
|
|
146
146
|
try {
|
|
147
147
|
db.exec(MEMORIES_FTS_DDL);
|
|
148
148
|
repairFtsDrift(db);
|
|
149
|
-
available = true;
|
|
150
149
|
}
|
|
151
150
|
catch (err) {
|
|
151
|
+
// A busy or locked open says nothing about fts5, so only a missing module may flip the flag.
|
|
152
|
+
if (!/no such module/i.test(errorMessage(err)) || !/fts5/i.test(errorMessage(err))) {
|
|
153
|
+
log.warn(`full-text index not set up this open (${errorMessage(err)}); the next open retries`, errorFields(err));
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
152
156
|
log.warn(`full-text index unavailable (${errorMessage(err)}); search falls back to slower LIKE matching`);
|
|
157
|
+
writeFtsFlag(db, '0');
|
|
158
|
+
return;
|
|
153
159
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
160
|
+
writeFtsFlag(db, '1');
|
|
161
|
+
}
|
|
162
|
+
// Read-first: only write when the flag actually changed, so a healthy store's open takes no write lock.
|
|
163
|
+
function writeFtsFlag(db, flag) {
|
|
157
164
|
if (getMeta(db, 'fts5_available') !== flag)
|
|
158
165
|
setMeta(db, 'fts5_available', flag);
|
|
159
166
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Migration } from './types.js';
|
|
2
|
-
export declare const CURRENT_SCHEMA_VERSION =
|
|
2
|
+
export declare const CURRENT_SCHEMA_VERSION = 55;
|
|
3
3
|
/** Every schema migration in version order; runMigrations applies each one above the stored version. */
|
|
4
4
|
export declare const MIGRATIONS: Migration[];
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -52,7 +52,8 @@ import { v51 } from './v51.js';
|
|
|
52
52
|
import { v52 } from './v52.js';
|
|
53
53
|
import { v53 } from './v53.js';
|
|
54
54
|
import { v54 } from './v54.js';
|
|
55
|
-
|
|
55
|
+
import { v55 } from './v55.js';
|
|
56
|
+
export const CURRENT_SCHEMA_VERSION = 55;
|
|
56
57
|
/** Every schema migration in version order; runMigrations applies each one above the stored version. */
|
|
57
58
|
export const MIGRATIONS = [
|
|
58
59
|
v01,
|
|
@@ -109,5 +110,6 @@ export const MIGRATIONS = [
|
|
|
109
110
|
v52,
|
|
110
111
|
v53,
|
|
111
112
|
v54,
|
|
113
|
+
v55,
|
|
112
114
|
];
|
|
113
115
|
//# sourceMappingURL=index.js.map
|
|
@@ -9,6 +9,7 @@ export const v11 = {
|
|
|
9
9
|
if (!tableHasColumn(db, 'memories', 'superseded_by')) {
|
|
10
10
|
db.exec(`ALTER TABLE memories ADD COLUMN superseded_by TEXT`);
|
|
11
11
|
}
|
|
12
|
+
// SHORTCUT: overlaps idx_memories_layer_created (v01); dropping it is held until a schema migration is approved.
|
|
12
13
|
db.exec(`CREATE INDEX IF NOT EXISTS idx_memories_current ON memories(layer, created) WHERE superseded_by IS NULL`);
|
|
13
14
|
},
|
|
14
15
|
};
|
|
@@ -48,6 +48,7 @@ export const v14 = {
|
|
|
48
48
|
if (!tableHasColumn(db, 'memories', 'owner')) {
|
|
49
49
|
db.exec(`ALTER TABLE memories ADD COLUMN owner TEXT`);
|
|
50
50
|
}
|
|
51
|
+
// SHORTCUT: artifact_ref has no index, so connector deletes and vault lookups scan the tenant; the index is held until a schema migration is approved.
|
|
51
52
|
if (!tableHasColumn(db, 'memories', 'artifact_ref')) {
|
|
52
53
|
db.exec(`ALTER TABLE memories ADD COLUMN artifact_ref TEXT`);
|
|
53
54
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { tableHasColumn, tableExists } from '../tables.js';
|
|
2
|
+
export const v55 = {
|
|
3
|
+
version: 55,
|
|
4
|
+
up: (db) => {
|
|
5
|
+
// No backfill and no floor raise: an older binary names its INSERT columns, so it still writes.
|
|
6
|
+
if (!tableExists(db, 'delivery_events'))
|
|
7
|
+
return;
|
|
8
|
+
if (!tableHasColumn(db, 'delivery_events', 'tool_use_id'))
|
|
9
|
+
db.exec('ALTER TABLE delivery_events ADD COLUMN tool_use_id TEXT');
|
|
10
|
+
if (!tableHasColumn(db, 'delivery_events', 'failure_id'))
|
|
11
|
+
db.exec('ALTER TABLE delivery_events ADD COLUMN failure_id INTEGER');
|
|
12
|
+
db.exec(`CREATE UNIQUE INDEX IF NOT EXISTS idx_delivery_events_tool_call
|
|
13
|
+
ON delivery_events(tenant_id, session_id, tool_use_id)
|
|
14
|
+
WHERE tool_use_id IS NOT NULL AND turn_seq IS NOT NULL`);
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=v55.js.map
|
package/dist/db/open.d.ts
CHANGED
|
@@ -24,8 +24,6 @@ export declare function withSqliteAllowed<T>(fn: () => T): T;
|
|
|
24
24
|
export declare function withSqliteOffLoop<T>(fn: () => T): T;
|
|
25
25
|
/** Leaves withSqliteOffLoop's block and nothing else: another store's block and the folder marker still refuse, which withSqliteAllowed would waive. */
|
|
26
26
|
export declare function outsideSqliteOffLoop<T>(fn: () => T): T;
|
|
27
|
-
/** First line of a best-effort catch around a hippo.db open: an unported path must fail closed, not fall back silently. */
|
|
28
|
-
export declare function rethrowIfSqliteBlocked<E>(err: E): void;
|
|
29
27
|
/** store init --db, store copy --db and serve --db write this file in the hippo root; its text is the store kind. */
|
|
30
28
|
export declare const OTHER_STORE_MARKER = "other-store";
|
|
31
29
|
/** Throws where hippo.db must not open; checked on every open, not cached, since the marker can appear while a process runs. */
|
package/dist/db/open.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
2
|
import { existsSync, readFileSync } from 'node:fs';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
|
-
import { errorMessage, log } from '../util/log.js';
|
|
4
|
+
import { errorFields, errorMessage, log } from '../util/log.js';
|
|
5
5
|
import { DatabaseSync } from './sqlite.js';
|
|
6
6
|
import { tableExists } from './tables.js';
|
|
7
7
|
import { assertBinaryCompatible } from './migrate.js';
|
|
8
|
-
import {
|
|
8
|
+
import { DEFAULT_BUSY_WAIT_MS } from './busy.js';
|
|
9
|
+
import { connectWithFacts, getHippoDbPath } from './connect.js';
|
|
9
10
|
import { currentRequestStores, isScopedHandle, runWithRequestStores } from './request-stores.js';
|
|
10
11
|
import { OtherStoreFolderError, SqliteBlockedError } from '../util/sqlite-blocked.js';
|
|
11
12
|
export { getHippoDbPath };
|
|
@@ -49,11 +50,6 @@ export function withSqliteOffLoop(fn) {
|
|
|
49
50
|
export function outsideSqliteOffLoop(fn) {
|
|
50
51
|
return sqliteBlockedBy.getStore() === OFF_LOOP ? sqliteBlockedBy.exit(fn) : fn();
|
|
51
52
|
}
|
|
52
|
-
/** First line of a best-effort catch around a hippo.db open: an unported path must fail closed, not fall back silently. */
|
|
53
|
-
export function rethrowIfSqliteBlocked(err) {
|
|
54
|
-
if (err instanceof SqliteBlockedError)
|
|
55
|
-
throw err;
|
|
56
|
-
}
|
|
57
53
|
/** store init --db, store copy --db and serve --db write this file in the hippo root; its text is the store kind. */
|
|
58
54
|
export const OTHER_STORE_MARKER = 'other-store';
|
|
59
55
|
const markerWaived = new AsyncLocalStorage();
|
|
@@ -95,7 +91,7 @@ export function openHippoDbReadOnly(hippoRoot) {
|
|
|
95
91
|
assertSqliteAllowed(hippoRoot);
|
|
96
92
|
const db = new DatabaseSync(getHippoDbPath(hippoRoot), { readOnly: true });
|
|
97
93
|
try {
|
|
98
|
-
db.exec(
|
|
94
|
+
db.exec(`PRAGMA busy_timeout = ${DEFAULT_BUSY_WAIT_MS}`);
|
|
99
95
|
if (tableExists(db, 'meta'))
|
|
100
96
|
assertBinaryCompatible(db);
|
|
101
97
|
return db;
|
|
@@ -104,8 +100,8 @@ export function openHippoDbReadOnly(hippoRoot) {
|
|
|
104
100
|
try {
|
|
105
101
|
db.close();
|
|
106
102
|
}
|
|
107
|
-
catch {
|
|
108
|
-
|
|
103
|
+
catch (closeErr) {
|
|
104
|
+
log.error(`openHippoDbReadOnly: closing the handle after a failed open failed: ${errorMessage(closeErr)}`, errorFields(closeErr));
|
|
109
105
|
}
|
|
110
106
|
throw error;
|
|
111
107
|
}
|
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
import type { DatabaseSyncLike } from './index.js';
|
|
3
3
|
import type { MemoryEntry } from '../core/memory.js';
|
|
4
4
|
import type { PhysicsParticle } from '../core/physics.js';
|
|
5
|
-
export declare function float32ToBuffer(arr: number[]): Buffer;
|
|
6
|
-
export declare function bufferToFloat32(buf: Buffer | Uint8Array): number[];
|
|
7
5
|
/** Create the memory_physics table (migration v8). */
|
|
8
6
|
export declare function createPhysicsTable(db: DatabaseSyncLike): void;
|
|
9
7
|
/**
|
|
@@ -14,8 +12,6 @@ export declare function loadPhysicsState(db: DatabaseSyncLike, memoryIds?: strin
|
|
|
14
12
|
* Save physics state for multiple particles (batch upsert).
|
|
15
13
|
*/
|
|
16
14
|
export declare function savePhysicsState(db: DatabaseSyncLike, particles: PhysicsParticle[]): void;
|
|
17
|
-
/** Initialize physics state for a memory from its embedding vector; returns the new particle without persisting (the caller must save). */
|
|
18
|
-
export declare function initializeParticle(entry: MemoryEntry, embedding: number[], now?: Date): PhysicsParticle;
|
|
19
15
|
/** Drops every particle, then seeds one per entry that has an embedding; `entries` may be read lazily, as each batch is written before the next is read. */
|
|
20
16
|
export declare function resetAllPhysicsState(db: DatabaseSyncLike, entries: Iterable<MemoryEntry>, embeddingIndex: Record<string, number[]>, now?: Date): number;
|
|
21
17
|
/** Refresh mass, charge and temperature for existing particles from current memory attributes (called during consolidation). */
|
package/dist/db/physics-state.js
CHANGED
|
@@ -1,23 +1,11 @@
|
|
|
1
1
|
/** Physics state persistence: particle state (position, velocity, mass, charge, temperature) in SQLite, with BLOB columns for 384-dim vectors. */
|
|
2
|
-
import { evalNow } from '../core/ablation.js';
|
|
2
|
+
import { evalNow, strengthAblation } from '../core/ablation.js';
|
|
3
3
|
import { withWriteScope } from './busy.js';
|
|
4
|
-
import { computeMass, computeCharge, computeTemperature,
|
|
4
|
+
import { computeMass, computeCharge, computeTemperature, initializeParticle } from '../core/physics.js';
|
|
5
5
|
import { calculateStrength } from '../core/memory.js';
|
|
6
6
|
import { DAY_MS } from '../util/time.js';
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const f32 = new Float32Array(arr);
|
|
10
|
-
return Buffer.from(f32.buffer);
|
|
11
|
-
}
|
|
12
|
-
export function bufferToFloat32(buf) {
|
|
13
|
-
if (buf.byteLength === 0 || buf.byteLength % 4 !== 0)
|
|
14
|
-
return [];
|
|
15
|
-
// Ensure we have a properly aligned copy (SQLite may return Uint8Array, not Buffer)
|
|
16
|
-
const bytes = new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
|
|
17
|
-
const aligned = new ArrayBuffer(bytes.length);
|
|
18
|
-
new Uint8Array(aligned).set(bytes);
|
|
19
|
-
return Array.from(new Float32Array(aligned));
|
|
20
|
-
}
|
|
7
|
+
import { placeholders } from '../util/sql.js';
|
|
8
|
+
import { bufferToFloat32, float32ToBuffer } from '../util/vector-codec.js';
|
|
21
9
|
// Schema migration
|
|
22
10
|
/** Create the memory_physics table (migration v8). */
|
|
23
11
|
export function createPhysicsTable(db) {
|
|
@@ -48,10 +36,10 @@ export function loadPhysicsState(db, memoryIds) {
|
|
|
48
36
|
// Chunked so a whole-store candidate list stays under SQLite's bound-parameter limit.
|
|
49
37
|
for (let i = 0; i < memoryIds.length; i += PHYSICS_ID_CHUNK) {
|
|
50
38
|
const chunk = memoryIds.slice(i, i + PHYSICS_ID_CHUNK);
|
|
51
|
-
const
|
|
39
|
+
const marks = placeholders(chunk.length);
|
|
52
40
|
// SAFETY: the SELECT projects exactly the PhysicsRow columns, in order.
|
|
53
41
|
rows = rows.concat(db.prepare(`SELECT memory_id, position_blob, velocity_blob, mass, charge, temperature, last_simulation
|
|
54
|
-
FROM memory_physics WHERE memory_id IN (${
|
|
42
|
+
FROM memory_physics WHERE memory_id IN (${marks})`).all(...chunk));
|
|
55
43
|
}
|
|
56
44
|
}
|
|
57
45
|
else {
|
|
@@ -97,20 +85,6 @@ export function savePhysicsState(db, particles) {
|
|
|
97
85
|
}
|
|
98
86
|
});
|
|
99
87
|
}
|
|
100
|
-
/** Initialize physics state for a memory from its embedding vector; returns the new particle without persisting (the caller must save). */
|
|
101
|
-
export function initializeParticle(entry, embedding, now = evalNow()) {
|
|
102
|
-
const strength = calculateStrength(entry, now);
|
|
103
|
-
const ageDays = (now.getTime() - new Date(entry.created).getTime()) / DAY_MS;
|
|
104
|
-
return {
|
|
105
|
-
memoryId: entry.id,
|
|
106
|
-
position: [...embedding], // copy — position will diverge from original embedding
|
|
107
|
-
velocity: vecZero(embedding.length),
|
|
108
|
-
mass: computeMass(strength, entry.retrieval_count),
|
|
109
|
-
charge: computeCharge(entry.emotional_valence),
|
|
110
|
-
temperature: computeTemperature(ageDays, 1.0),
|
|
111
|
-
lastSimulation: now.toISOString(),
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
88
|
const RESET_BATCH = 64;
|
|
115
89
|
/** Drops every particle, then seeds one per entry that has an embedding; `entries` may be read lazily, as each batch is written before the next is read. */
|
|
116
90
|
export function resetAllPhysicsState(db, entries, embeddingIndex, now = evalNow()) {
|
|
@@ -141,7 +115,7 @@ export function refreshParticleProperties(particles, entries, now = evalNow()) {
|
|
|
141
115
|
const entry = entries.get(p.memoryId);
|
|
142
116
|
if (!entry)
|
|
143
117
|
continue;
|
|
144
|
-
const strength = calculateStrength(entry, now);
|
|
118
|
+
const strength = calculateStrength(entry, now, { ablation: strengthAblation() });
|
|
145
119
|
const ageDays = (now.getTime() - new Date(entry.created).getTime()) / DAY_MS;
|
|
146
120
|
p.mass = computeMass(strength, entry.retrieval_count);
|
|
147
121
|
p.charge = computeCharge(entry.emotional_valence);
|
|
@@ -15,6 +15,7 @@ export declare class RequestStores implements RequestScope {
|
|
|
15
15
|
readonly busyWaitMs: number | undefined;
|
|
16
16
|
readonly requestId: string | undefined;
|
|
17
17
|
readonly deadline: import("../util/request-scope.js").RequestDeadline | undefined;
|
|
18
|
+
readonly signal: AbortSignal | undefined;
|
|
18
19
|
readonly setupDoneFor: string | undefined;
|
|
19
20
|
constructor(opts?: RequestStoresOptions);
|
|
20
21
|
get closed(): boolean;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// One store handle per store for each request (HTTP call, MCP tool call, scoped CLI command), opened lazily and closed with it.
|
|
2
2
|
import * as path from 'node:path';
|
|
3
3
|
import { connectWithFacts, getHippoDbPath } from './connect.js';
|
|
4
|
-
import { currentDeadline, currentRequestId, requestScopes } from '../util/request-scope.js';
|
|
4
|
+
import { currentDeadline, currentRequestId, currentSignal, requestScopes } from '../util/request-scope.js';
|
|
5
5
|
// Handles a scope owns, so closeHippoDb leaves them open for the rest of the request.
|
|
6
6
|
const scopedHandles = new WeakSet();
|
|
7
7
|
// process.exit skips every finally, so one exit listener closes the handles of scopes still open.
|
|
@@ -24,6 +24,7 @@ export class RequestStores {
|
|
|
24
24
|
// Taken from the scope this one opens inside, so the request's log lines keep their id.
|
|
25
25
|
requestId = currentRequestId();
|
|
26
26
|
deadline = currentDeadline();
|
|
27
|
+
signal = currentSignal();
|
|
27
28
|
setupDoneFor;
|
|
28
29
|
#failFastWhenBusy;
|
|
29
30
|
#handles = new Map();
|
package/dist/db/tables.d.ts
CHANGED
|
@@ -7,5 +7,7 @@ export declare function tableExists(db: DatabaseSyncLike, tableName: string): bo
|
|
|
7
7
|
export declare function listTableNames(db: DatabaseSyncLike): string[];
|
|
8
8
|
/** Row count of one table; null when the table is missing or unreadable, which callers show as unknown. */
|
|
9
9
|
export declare function countTableRows(db: DatabaseSyncLike, table: string): number | null;
|
|
10
|
+
/** Sleep runs a store keeps; stats.json lists exactly these, so a recall's stats rewrite reads a fixed number of rows. */
|
|
11
|
+
export declare const CONSOLIDATION_RUNS_KEPT = 50;
|
|
10
12
|
export declare function pruneConsolidationRuns(db: DatabaseSyncLike, keep?: number): void;
|
|
11
13
|
//# sourceMappingURL=tables.d.ts.map
|
package/dist/db/tables.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { errorCode, log } from '../util/log.js';
|
|
1
2
|
/** Column names of one table; empty when the table is missing. */
|
|
2
3
|
export function tableColumns(db, tableName) {
|
|
3
4
|
if (!/^[a-z_]+$/i.test(tableName))
|
|
@@ -30,12 +31,15 @@ export function countTableRows(db, table) {
|
|
|
30
31
|
const row = db.prepare(`SELECT COUNT(*) AS n FROM "${table.replace(/"/g, '""')}"`).get();
|
|
31
32
|
return Number(row?.n ?? 0);
|
|
32
33
|
}
|
|
33
|
-
catch {
|
|
34
|
+
catch (err) {
|
|
34
35
|
// Callers treat an uncountable table as unknown; the bundle and doctor still finish.
|
|
36
|
+
log.warn(`could not count rows in table ${table}`, { table, code: errorCode(err) || 'unknown' });
|
|
35
37
|
return null;
|
|
36
38
|
}
|
|
37
39
|
}
|
|
38
|
-
|
|
40
|
+
/** Sleep runs a store keeps; stats.json lists exactly these, so a recall's stats rewrite reads a fixed number of rows. */
|
|
41
|
+
export const CONSOLIDATION_RUNS_KEPT = 50;
|
|
42
|
+
export function pruneConsolidationRuns(db, keep = CONSOLIDATION_RUNS_KEPT) {
|
|
39
43
|
db.prepare(`
|
|
40
44
|
DELETE FROM consolidation_runs
|
|
41
45
|
WHERE id NOT IN (
|
package/dist/db/vector-store.js
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
import * as fs from 'fs';
|
|
3
3
|
import * as path from 'path';
|
|
4
4
|
import { withWriteScope } from './busy.js';
|
|
5
|
-
import { log } from '../util/log.js';
|
|
5
|
+
import { errorCode, errorFields, log } from '../util/log.js';
|
|
6
|
+
import { placeholders } from '../util/sql.js';
|
|
6
7
|
/** Legacy whole-file index; imported once into `memory_vectors`, then kept beside the store as a renamed backup. */
|
|
7
8
|
const LEGACY_EMBEDDINGS_FILE = 'embeddings.json';
|
|
8
9
|
export const EMBEDDING_MODEL_META_KEY = 'embedding_model';
|
|
@@ -66,7 +67,7 @@ function eachStoredVector(db, ids, take) {
|
|
|
66
67
|
const unique = [...new Set(ids)];
|
|
67
68
|
for (let i = 0; i < unique.length; i += ID_CHUNK) {
|
|
68
69
|
const chunk = unique.slice(i, i + ID_CHUNK);
|
|
69
|
-
read(db.prepare(`SELECT memory_id, vector FROM memory_vectors WHERE memory_id IN (${chunk.
|
|
70
|
+
read(db.prepare(`SELECT memory_id, vector FROM memory_vectors WHERE memory_id IN (${placeholders(chunk.length)})`).all(...chunk));
|
|
70
71
|
}
|
|
71
72
|
}
|
|
72
73
|
/** Vectors for `ids`, or every stored vector when `ids` is omitted. */
|
|
@@ -188,17 +189,30 @@ function insertSorted(top, m, k) {
|
|
|
188
189
|
function stamp() {
|
|
189
190
|
return `${new Date().toISOString().replace(/[:.]/g, '-')}-${process.pid}`;
|
|
190
191
|
}
|
|
191
|
-
|
|
192
|
+
// The codes a rename gets when another process holds the file open (Windows); any other failure would fail a copy too.
|
|
193
|
+
const RENAME_BLOCKED_CODES = new Set(['EPERM', 'EBUSY', 'EACCES']);
|
|
194
|
+
/** Rename `fp` to `aside`; a rename blocked by an open handle falls back to a copy, so the bytes are kept either way. */
|
|
192
195
|
function moveAside(fp, aside) {
|
|
193
196
|
try {
|
|
194
197
|
fs.renameSync(fp, aside);
|
|
195
198
|
return true;
|
|
196
199
|
}
|
|
197
200
|
catch (err) {
|
|
198
|
-
|
|
201
|
+
const code = errorCode(err);
|
|
202
|
+
if (code === 'ENOENT')
|
|
199
203
|
return false;
|
|
204
|
+
if (!RENAME_BLOCKED_CODES.has(code))
|
|
205
|
+
throw err;
|
|
206
|
+
log.warn(`could not rename ${path.basename(fp)} aside (${code}); copying it instead`, { path: fp, ...errorFields(err) });
|
|
200
207
|
fs.copyFileSync(fp, aside, fs.constants.COPYFILE_EXCL);
|
|
201
|
-
|
|
208
|
+
try {
|
|
209
|
+
fs.rmSync(fp, { force: true });
|
|
210
|
+
}
|
|
211
|
+
catch (rmErr) {
|
|
212
|
+
// The original stays for the next open to retry, so a copy left beside it would pile up one per open.
|
|
213
|
+
fs.rmSync(aside, { force: true });
|
|
214
|
+
throw rmErr;
|
|
215
|
+
}
|
|
202
216
|
return true;
|
|
203
217
|
}
|
|
204
218
|
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import * as path from 'node:path';
|
|
3
3
|
import { Worker } from 'node:worker_threads';
|
|
4
4
|
import { errorMessage, log } from '../util/log.js';
|
|
5
|
+
import { DEFAULT_BUSY_WAIT_MS } from './busy.js';
|
|
5
6
|
// WAL pages at which a connection checkpoints inside its own commit.
|
|
6
7
|
const INLINE_CHECKPOINT_PAGES = 100;
|
|
7
8
|
// The same limit while a worker checkpoints the store: SQLite still bounds the WAL when the worker falls behind.
|
|
@@ -17,7 +18,7 @@ const WORKER_SOURCE = `
|
|
|
17
18
|
const { parentPort, workerData } = require('node:worker_threads');
|
|
18
19
|
const { DatabaseSync } = require('node:sqlite');
|
|
19
20
|
const db = new DatabaseSync(workerData.dbPath);
|
|
20
|
-
db.exec('PRAGMA busy_timeout =
|
|
21
|
+
db.exec('PRAGMA busy_timeout = ${DEFAULT_BUSY_WAIT_MS}');
|
|
21
22
|
db.exec('PRAGMA synchronous = NORMAL');
|
|
22
23
|
const pass = db.prepare('PRAGMA wal_checkpoint(PASSIVE)');
|
|
23
24
|
parentPort.on('message', (message) => {
|
package/dist/doctor.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type SpoolFs } from './capture/compaction-spool.js';
|
|
1
2
|
/** Outcome of one check. `fail` makes `hippo doctor` exit 1. */
|
|
2
3
|
export type DoctorStatus = 'pass' | 'warn' | 'fail' | 'info';
|
|
3
4
|
/** One check in a {@link DoctorReport}. */
|
|
@@ -24,6 +25,8 @@ export interface DoctorOpts {
|
|
|
24
25
|
version: string;
|
|
25
26
|
nodeVersion?: string;
|
|
26
27
|
now?: Date;
|
|
28
|
+
/** Stands in for the fs the spool check reads; a test makes one call fail. */
|
|
29
|
+
spoolFs?: SpoolFs;
|
|
27
30
|
}
|
|
28
31
|
/** Minimum Node.js version hippo supports (package.json engines). */
|
|
29
32
|
export declare const MIN_NODE = "22.16.0";
|