hippo-memory 1.72.0 → 2.1.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 +6 -4
- package/dist/agent-memories/apply.d.ts +7 -5
- package/dist/agent-memories/apply.js +66 -39
- package/dist/agent-memories/claude-code.d.ts +8 -2
- package/dist/agent-memories/claude-code.js +26 -7
- package/dist/agent-memories/copilot.js +2 -1
- package/dist/agent-memories/files.js +2 -1
- package/dist/agent-memories/legacy.d.ts +6 -3
- package/dist/agent-memories/legacy.js +35 -14
- package/dist/agent-memories/markdown.d.ts +3 -1
- package/dist/agent-memories/markdown.js +3 -1
- package/dist/agent-memories/openclaw.js +5 -2
- package/dist/agent-memories/plan.js +11 -1
- package/dist/agent-memories/project-folds.js +2 -1
- package/dist/agent-memories/report.d.ts +4 -1
- package/dist/agent-memories/report.js +43 -9
- package/dist/agent-memories/source.d.ts +8 -2
- package/dist/agent-memories/source.js +11 -3
- package/dist/agent-memories/sync.d.ts +7 -2
- package/dist/agent-memories/sync.js +141 -101
- package/dist/api/assemble.d.ts +6 -4
- package/dist/api/assemble.js +11 -5
- package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
- package/dist/api/auth/audit.js +58 -0
- package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -16
- package/dist/api/{auth.js → auth/auth.js} +66 -54
- package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
- package/dist/api/{quarantine.js → auth/quarantine.js} +8 -7
- package/dist/api/auth/session-owners.d.ts +10 -0
- package/dist/api/auth/session-owners.js +35 -0
- package/dist/api/availability.d.ts +3 -1
- package/dist/api/availability.js +3 -1
- package/dist/api/busy.d.ts +2 -0
- package/dist/api/busy.js +2 -0
- package/dist/api/cli-surface.d.ts +6 -0
- package/dist/api/cli-surface.js +6 -0
- package/dist/api/config-of.d.ts +5 -0
- package/dist/api/config-of.js +6 -0
- package/dist/api/context-auto.d.ts +4 -1
- package/dist/api/context-auto.js +14 -4
- package/dist/api/context-render.js +14 -7
- package/dist/api/context-select.d.ts +4 -1
- package/dist/api/context-select.js +31 -34
- package/dist/api/context-types.d.ts +38 -12
- package/dist/api/context.d.ts +8 -5
- package/dist/api/context.js +120 -63
- package/dist/api/continuity.d.ts +24 -21
- package/dist/api/continuity.js +18 -20
- package/dist/api/correction-latency.d.ts +3 -1
- package/dist/api/correction-latency.js +3 -1
- package/dist/api/error-reply.d.ts +4 -1
- package/dist/api/error-reply.js +12 -3
- package/dist/api/index.d.ts +39 -23
- package/dist/api/index.js +21 -23
- package/dist/api/instruction-detect.d.ts +4 -1
- package/dist/api/instruction-detect.js +75 -20
- package/dist/api/ledger-db.d.ts +15 -11
- package/dist/api/ledger-db.js +21 -23
- package/dist/api/memories/conflicts.d.ts +33 -0
- package/dist/api/memories/conflicts.js +67 -0
- package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
- package/dist/api/{forget.js → memories/forget.js} +23 -17
- package/dist/api/memories/memories.d.ts +27 -0
- package/dist/api/memories/memories.js +52 -0
- package/dist/api/memories/outcome.d.ts +22 -0
- package/dist/api/memories/outcome.js +28 -0
- package/dist/api/memories/promote.d.ts +40 -0
- package/dist/api/memories/promote.js +76 -0
- package/dist/api/memories/refine.d.ts +10 -0
- package/dist/api/memories/refine.js +12 -0
- package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +17 -9
- package/dist/api/{remember-local.js → memories/remember-local.js} +46 -24
- package/dist/api/{remember.d.ts → memories/remember.d.ts} +22 -13
- package/dist/api/{remember.js → memories/remember.js} +50 -32
- package/dist/api/objects/cards.d.ts +39 -0
- package/dist/api/{cards.js → objects/cards.js} +12 -14
- package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
- package/dist/api/{drill-down.js → objects/drill-down.js} +7 -7
- package/dist/api/objects/goals.d.ts +18 -0
- package/dist/api/{goals.js → objects/goals.js} +12 -12
- package/dist/api/objects/graph.d.ts +11 -0
- package/dist/api/objects/graph.js +16 -0
- package/dist/api/objects/objects.d.ts +9 -0
- package/dist/api/{objects.js → objects/objects.js} +2 -3
- package/dist/api/objects/predictions.d.ts +11 -0
- package/dist/api/{predictions.js → objects/predictions.js} +7 -5
- package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
- package/dist/api/{projects.js → objects/projects.js} +8 -4
- package/dist/api/pilot-arm.d.ts +8 -4
- package/dist/api/pilot-arm.js +5 -4
- package/dist/api/prompt-hook.d.ts +35 -20
- package/dist/api/prompt-hook.js +66 -44
- package/dist/api/provenance-coverage.d.ts +3 -1
- package/dist/api/provenance-coverage.js +3 -1
- package/dist/api/recall/finish.d.ts +185 -0
- package/dist/api/recall/finish.js +301 -0
- package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
- package/dist/api/{recall-pipeline.js → recall/pipeline.js} +185 -101
- package/dist/api/recall/recall.d.ts +6 -0
- package/dist/api/{recall.js → recall/recall.js} +116 -72
- package/dist/api/recall/render.d.ts +39 -0
- package/dist/api/recall/render.js +60 -0
- package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
- package/dist/api/recall/request.js +261 -0
- package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
- package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
- package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -68
- package/dist/api/{recall-types.js → recall/types.js} +1 -1
- package/dist/api/session-end.d.ts +36 -8
- package/dist/api/session-end.js +71 -25
- package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
- package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
- package/dist/api/sleep/dormant.d.ts +25 -0
- package/dist/api/sleep/dormant.js +64 -0
- package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
- package/dist/api/sleep/learn.js +138 -0
- package/dist/api/sleep/sleep-run.d.ts +38 -0
- package/dist/api/{sleep-run.js → sleep/sleep-run.js} +54 -45
- package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
- package/dist/api/sleep/sleep.js +9 -0
- package/dist/api/status.d.ts +3 -1
- package/dist/api/status.js +3 -1
- package/dist/api/store-init.d.ts +4 -1
- package/dist/api/store-init.js +4 -1
- package/dist/api/tokens.d.ts +10 -9
- package/dist/api/tokens.js +9 -10
- package/dist/api/types.d.ts +27 -12
- package/dist/api/types.js +13 -4
- package/dist/capture/caller-session.d.ts +8 -2
- package/dist/capture/caller-session.js +16 -6
- package/dist/capture/capture-error.d.ts +3 -1
- package/dist/capture/capture-error.js +3 -1
- package/dist/capture/codex-patch.js +7 -2
- package/dist/capture/command.d.ts +4 -2
- package/dist/capture/command.js +34 -15
- package/dist/capture/compact-resume-caller.js +15 -8
- package/dist/capture/compact.d.ts +8 -5
- package/dist/capture/compact.js +34 -23
- package/dist/capture/compaction-items-caller.js +9 -3
- package/dist/capture/compaction-record.d.ts +4 -3
- package/dist/capture/compaction-record.js +20 -12
- package/dist/capture/compaction-spool.d.ts +18 -9
- package/dist/capture/compaction-spool.js +105 -63
- package/dist/capture/copilot-transcript.d.ts +11 -3
- package/dist/capture/copilot-transcript.js +16 -6
- package/dist/capture/extract.js +20 -8
- package/dist/capture/failure-caller.js +23 -12
- package/dist/capture/failure-reading.d.ts +10 -3
- package/dist/capture/failure-reading.js +24 -7
- package/dist/capture/pre-compact-caller.js +11 -4
- package/dist/capture/session-digest.d.ts +15 -4
- package/dist/capture/session-digest.js +39 -13
- package/dist/capture/session-end-caller.d.ts +4 -1
- package/dist/capture/session-end-caller.js +20 -8
- package/dist/capture/session-texts.d.ts +6 -2
- package/dist/capture/session-texts.js +22 -7
- package/dist/capture/session-worker.d.ts +4 -2
- package/dist/capture/session-worker.js +58 -17
- package/dist/capture/transcript.d.ts +13 -4
- package/dist/capture/transcript.js +32 -10
- package/dist/capture/working-state.d.ts +13 -4
- package/dist/capture/working-state.js +50 -56
- package/dist/cli/api-context.d.ts +14 -2
- package/dist/cli/api-context.js +45 -2
- package/dist/cli/audit.js +33 -33
- package/dist/cli/auth.js +23 -31
- package/dist/cli/briefs.d.ts +1 -1
- package/dist/cli/briefs.js +20 -15
- package/dist/cli/card.d.ts +1 -1
- package/dist/cli/card.js +56 -73
- package/dist/cli/client.d.ts +12 -5
- package/dist/cli/client.js +53 -23
- package/dist/cli/compact-resume-payload.d.ts +4 -1
- package/dist/cli/compact-resume-payload.js +12 -5
- package/dist/cli/context.js +43 -18
- package/dist/cli/continuity.d.ts +5 -5
- package/dist/cli/continuity.js +90 -107
- package/dist/cli/curate.d.ts +5 -4
- package/dist/cli/curate.js +55 -77
- package/dist/cli/dag.d.ts +1 -1
- package/dist/cli/dag.js +14 -17
- package/dist/cli/decisions.js +30 -30
- package/dist/cli/eval.js +16 -21
- package/dist/cli/exit.d.ts +4 -1
- package/dist/cli/exit.js +10 -2
- package/dist/cli/explain.js +12 -11
- package/dist/cli/flag-values.d.ts +1 -1
- package/dist/cli/flag-values.js +9 -18
- package/dist/cli/github.d.ts +6 -0
- package/dist/cli/github.js +25 -13
- package/dist/cli/goals.d.ts +1 -1
- package/dist/cli/goals.js +39 -56
- package/dist/cli/graph.d.ts +1 -1
- package/dist/cli/graph.js +15 -11
- package/dist/cli/hook-runtime.d.ts +34 -10
- package/dist/cli/hook-runtime.js +41 -16
- package/dist/cli/incidents.d.ts +1 -1
- package/dist/cli/incidents.js +25 -25
- package/dist/cli/init.d.ts +1 -1
- package/dist/cli/init.js +35 -20
- package/dist/cli/install-steps.d.ts +12 -3
- package/dist/cli/install-steps.js +42 -18
- package/dist/cli/last-sleep.d.ts +4 -1
- package/dist/cli/last-sleep.js +9 -4
- package/dist/cli/maintenance.d.ts +1 -1
- package/dist/cli/maintenance.js +11 -12
- package/dist/cli/notes.d.ts +1 -1
- package/dist/cli/notes.js +8 -5
- package/dist/cli/object-verbs.d.ts +5 -5
- package/dist/cli/object-verbs.js +13 -16
- package/dist/cli/open-browser.js +11 -2
- package/dist/cli/playbooks.d.ts +3 -3
- package/dist/cli/playbooks.js +40 -32
- package/dist/cli/predictions.js +17 -22
- package/dist/cli/print.js +4 -2
- package/dist/cli/projects.js +21 -11
- package/dist/cli/quality-repair-once.d.ts +1 -1
- package/dist/cli/quality-repair-once.js +7 -6
- package/dist/cli/recall.js +129 -93
- package/dist/cli/refine-llm.d.ts +15 -4
- package/dist/cli/refine-llm.js +17 -7
- package/dist/cli/remember.js +51 -55
- package/dist/cli/scheduler.d.ts +4 -1
- package/dist/cli/scheduler.js +9 -5
- package/dist/cli/serve.js +28 -18
- package/dist/cli/session-hooks.d.ts +2 -6
- package/dist/cli/session-hooks.js +140 -112
- package/dist/cli/setup.d.ts +1 -1
- package/dist/cli/setup.js +56 -34
- package/dist/cli/shared.d.ts +4 -2
- package/dist/cli/shared.js +26 -11
- package/dist/cli/slack.js +15 -24
- package/dist/cli/sleep-render.d.ts +3 -1
- package/dist/cli/sleep-render.js +8 -5
- package/dist/cli/sleep.js +16 -8
- package/dist/cli/status.d.ts +4 -4
- package/dist/cli/status.js +32 -27
- package/dist/cli/stdin.d.ts +10 -3
- package/dist/cli/stdin.js +10 -3
- package/dist/cli/transfer.d.ts +4 -4
- package/dist/cli/transfer.js +97 -82
- package/dist/cli/usage.d.ts +1 -1
- package/dist/cli/usage.js +1 -1
- package/dist/cli/verb-row.d.ts +2 -0
- package/dist/cli/verbs/health.js +2 -0
- package/dist/cli/verbs/memory.js +47 -53
- package/dist/cli/verbs/objects.js +16 -7
- package/dist/cli/verbs/sessions.js +4 -2
- package/dist/cli/versioned-verbs.d.ts +8 -7
- package/dist/cli/versioned-verbs.js +31 -21
- package/dist/cli.js +14 -18
- package/dist/connectors/dlq.d.ts +6 -6
- package/dist/connectors/dlq.js +12 -7
- package/dist/connectors/github/backfill.d.ts +4 -4
- package/dist/connectors/github/backfill.js +6 -4
- package/dist/connectors/github/deletion.d.ts +6 -4
- package/dist/connectors/github/deletion.js +5 -4
- package/dist/connectors/github/dlq.d.ts +8 -6
- package/dist/connectors/github/dlq.js +11 -5
- package/dist/connectors/github/ingest.d.ts +2 -2
- package/dist/connectors/github/ingest.js +9 -5
- package/dist/connectors/github/octokit-client.d.ts +3 -1
- package/dist/connectors/github/octokit-client.js +7 -2
- package/dist/connectors/github/ratelimit.d.ts +6 -2
- package/dist/connectors/github/ratelimit.js +6 -2
- package/dist/connectors/github/signature.d.ts +14 -3
- package/dist/connectors/github/signature.js +17 -3
- package/dist/connectors/github/tenant-routing.d.ts +6 -4
- package/dist/connectors/github/tenant-routing.js +6 -5
- package/dist/connectors/github/transform.js +50 -67
- package/dist/connectors/github/types.d.ts +10 -3
- package/dist/connectors/github/types.js +6 -2
- package/dist/connectors/github/webhook.d.ts +5 -5
- package/dist/connectors/github/webhook.js +36 -23
- package/dist/connectors/ingest.d.ts +5 -3
- package/dist/connectors/ingest.js +3 -3
- package/dist/connectors/slack/backfill.d.ts +5 -5
- package/dist/connectors/slack/backfill.js +3 -3
- package/dist/connectors/slack/deletion.d.ts +4 -4
- package/dist/connectors/slack/deletion.js +6 -5
- package/dist/connectors/slack/dlq.d.ts +4 -4
- package/dist/connectors/slack/dlq.js +6 -6
- package/dist/connectors/slack/ingest.d.ts +6 -4
- package/dist/connectors/slack/ingest.js +5 -4
- package/dist/connectors/slack/signature.d.ts +4 -1
- package/dist/connectors/slack/tenant-routing.d.ts +6 -4
- package/dist/connectors/slack/tenant-routing.js +6 -5
- package/dist/connectors/slack/transform.d.ts +6 -2
- package/dist/connectors/slack/transform.js +6 -2
- package/dist/connectors/slack/types.d.ts +3 -1
- package/dist/connectors/slack/web-client.js +8 -3
- package/dist/connectors/slack/webhook.d.ts +5 -5
- package/dist/connectors/slack/webhook.js +19 -11
- package/dist/connectors/slack/workspaces.d.ts +7 -3
- package/dist/connectors/slack/workspaces.js +7 -3
- package/dist/connectors/store.d.ts +8 -0
- package/dist/connectors/store.js +2 -0
- package/dist/consolidate/conflicts.js +24 -10
- package/dist/consolidate/dag-summary.js +2 -1
- package/dist/consolidate/dag.d.ts +10 -5
- package/dist/consolidate/dag.js +45 -39
- package/dist/consolidate/decay.js +19 -6
- package/dist/consolidate/dedupe.d.ts +14 -5
- package/dist/consolidate/dedupe.js +28 -17
- package/dist/consolidate/flush-units.d.ts +4 -1
- package/dist/consolidate/flush-units.js +4 -1
- package/dist/consolidate/half-life-migration.d.ts +18 -8
- package/dist/consolidate/half-life-migration.js +48 -18
- package/dist/consolidate/llm-passes.js +27 -11
- package/dist/consolidate/memory-value-weights.d.ts +6 -2
- package/dist/consolidate/memory-value-weights.js +6 -2
- package/dist/consolidate/memory-value.d.ts +30 -10
- package/dist/consolidate/memory-value.js +37 -14
- package/dist/consolidate/merge.d.ts +4 -1
- package/dist/consolidate/merge.js +47 -37
- package/dist/consolidate/overlap-index.d.ts +8 -2
- package/dist/consolidate/overlap-index.js +11 -4
- package/dist/consolidate/physics-pass.d.ts +3 -1
- package/dist/consolidate/physics-pass.js +10 -7
- package/dist/consolidate/replay.d.ts +11 -4
- package/dist/consolidate/replay.js +19 -7
- package/dist/consolidate/run.d.ts +13 -5
- package/dist/consolidate/run.js +4 -4
- package/dist/consolidate/sleep.d.ts +14 -6
- package/dist/consolidate/sleep.js +42 -39
- package/dist/consolidate/trace.d.ts +7 -2
- package/dist/consolidate/trace.js +7 -2
- package/dist/consolidate/traces.js +27 -30
- package/dist/core/ablation.d.ts +9 -3
- package/dist/core/ablation.js +14 -4
- package/dist/core/active-scope.d.ts +3 -1
- package/dist/core/active-scope.js +3 -1
- package/dist/core/agent-memory-tools.d.ts +2 -0
- package/dist/core/agent-memory-tools.js +2 -0
- package/dist/core/ambient.d.ts +4 -3
- package/dist/core/ambient.js +8 -6
- package/dist/core/api-errors.d.ts +9 -3
- package/dist/core/api-errors.js +9 -3
- package/dist/core/capture-contract.d.ts +4 -1
- package/dist/core/capture-contract.js +27 -8
- package/dist/core/compare.d.ts +24 -8
- package/dist/core/compare.js +24 -8
- package/dist/core/config.d.ts +18 -9
- package/dist/core/config.js +38 -29
- package/dist/core/cosine.d.ts +4 -1
- package/dist/core/cosine.js +4 -1
- package/dist/core/handoff.d.ts +7 -2
- package/dist/core/handoff.js +4 -1
- package/dist/core/markdown.js +22 -17
- package/dist/core/memory-audit.js +14 -3
- package/dist/core/memory-quality.d.ts +12 -3
- package/dist/core/memory-quality.js +57 -21
- package/dist/core/memory.d.ts +87 -30
- package/dist/core/memory.js +82 -33
- package/dist/core/merged-row.d.ts +8 -2
- package/dist/core/merged-row.js +10 -3
- package/dist/core/package-root.d.ts +3 -1
- package/dist/core/package-root.js +3 -1
- package/dist/core/particle-refresh.d.ts +8 -0
- package/dist/core/particle-refresh.js +22 -0
- package/dist/core/physics-config.d.ts +4 -1
- package/dist/core/physics-config.js +6 -2
- package/dist/core/physics.d.ts +39 -11
- package/dist/core/physics.js +71 -21
- package/dist/core/project-identity.d.ts +34 -17
- package/dist/core/project-identity.js +35 -18
- package/dist/core/project-remote.d.ts +8 -4
- package/dist/core/project-remote.js +31 -14
- package/dist/core/recall-scope.d.ts +33 -11
- package/dist/core/recall-scope.js +42 -15
- package/dist/core/rejection-digest.d.ts +7 -0
- package/dist/core/rejection-digest.js +13 -0
- package/dist/core/salience.d.ts +3 -1
- package/dist/core/salience.js +10 -4
- package/dist/core/search-types.d.ts +15 -2
- package/dist/core/search-types.js +11 -0
- package/dist/dashboard/dashboard-actions.d.ts +2 -2
- package/dist/dashboard/dashboard-actions.js +18 -7
- package/dist/dashboard/dashboard-queries.js +2 -7
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
- package/dist/dashboard/dashboard-snapshot.js +5 -7
- package/dist/dashboard/dashboard.js +22 -8
- package/dist/db/backup.js +2 -2
- package/dist/db/busy.d.ts +10 -3
- package/dist/db/busy.js +27 -5
- package/dist/db/connect.d.ts +10 -2
- package/dist/db/connect.js +8 -2
- package/dist/db/continuity.d.ts +1 -1
- package/dist/db/continuity.js +27 -11
- package/dist/db/meta.d.ts +4 -1
- package/dist/db/meta.js +4 -1
- package/dist/db/migrate.d.ts +10 -5
- package/dist/db/migrate.js +40 -20
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/types.d.ts +2 -1
- package/dist/db/migrations/v11.js +1 -0
- package/dist/db/migrations/v12.js +2 -1
- package/dist/db/migrations/v14.js +2 -0
- package/dist/db/migrations/v15.js +4 -2
- package/dist/db/migrations/v16.js +6 -3
- package/dist/db/migrations/v17.js +2 -1
- package/dist/db/migrations/v19.js +4 -2
- package/dist/db/migrations/v20.js +2 -1
- package/dist/db/migrations/v22.js +12 -6
- package/dist/db/migrations/v23.js +6 -3
- package/dist/db/migrations/v24.js +6 -3
- package/dist/db/migrations/v25.js +4 -2
- package/dist/db/migrations/v26.js +4 -2
- package/dist/db/migrations/v27.js +6 -3
- package/dist/db/migrations/v28.js +4 -2
- package/dist/db/migrations/v29.js +4 -2
- package/dist/db/migrations/v30.js +6 -3
- package/dist/db/migrations/v31.js +4 -2
- package/dist/db/migrations/v32.js +6 -3
- package/dist/db/migrations/v33.js +4 -2
- package/dist/db/migrations/v34.js +2 -1
- package/dist/db/migrations/v35.js +2 -1
- package/dist/db/migrations/v36.js +2 -1
- package/dist/db/migrations/v37.js +10 -5
- package/dist/db/migrations/v38.js +10 -5
- package/dist/db/migrations/v39.js +14 -6
- package/dist/db/migrations/v40.js +4 -2
- package/dist/db/migrations/v41.js +4 -2
- package/dist/db/migrations/v42.js +2 -1
- package/dist/db/migrations/v44.js +4 -2
- package/dist/db/migrations/v45.js +4 -2
- package/dist/db/migrations/v49.js +2 -1
- package/dist/db/migrations/v50.js +4 -2
- package/dist/db/migrations/v51.js +4 -2
- package/dist/db/migrations/v52.js +2 -1
- package/dist/db/migrations/v53.js +8 -4
- package/dist/db/migrations/v54.js +2 -1
- package/dist/db/migrations/v55.js +4 -2
- package/dist/db/migrations/v56.d.ts +3 -0
- package/dist/db/migrations/v56.js +28 -0
- package/dist/db/open.d.ts +24 -12
- package/dist/db/open.js +25 -13
- package/dist/db/physics-state.d.ts +8 -8
- package/dist/db/physics-state.js +17 -50
- package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
- package/dist/db/raw-archive-mirror-cleanup.js +6 -4
- package/dist/db/request-stores.d.ts +20 -5
- package/dist/db/request-stores.js +15 -5
- package/dist/db/tables.d.ts +2 -1
- package/dist/db/tables.js +12 -4
- package/dist/db/vector-store.d.ts +13 -4
- package/dist/db/vector-store.js +35 -14
- package/dist/db/wal-checkpointer.d.ts +2 -1
- package/dist/db/wal-checkpointer.js +19 -7
- package/dist/doctor.d.ts +7 -1
- package/dist/doctor.js +128 -46
- package/dist/embeddings/local.d.ts +8 -4
- package/dist/embeddings/local.js +11 -7
- package/dist/embeddings/provider.d.ts +19 -10
- package/dist/embeddings/provider.js +32 -27
- package/dist/embeddings/transformers.d.ts +16 -4
- package/dist/embeddings/transformers.js +32 -15
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.js +2 -1
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +1 -1
- package/dist/entry/sqlite-handles.d.ts +10 -0
- package/dist/entry/sqlite-handles.js +9 -0
- package/dist/entry/store-kit.d.ts +50 -0
- package/dist/entry/store-kit.js +27 -0
- package/dist/entry/testing.d.ts +6 -0
- package/dist/entry/testing.js +7 -0
- package/dist/eval/eval-stats.d.ts +27 -8
- package/dist/eval/eval-stats.js +17 -5
- package/dist/eval/eval-suite.d.ts +3 -1
- package/dist/eval/eval-suite.js +409 -187
- package/dist/eval/eval.d.ts +8 -2
- package/dist/eval/eval.js +8 -2
- package/dist/eval/judgment.js +17 -7
- package/dist/graph/delta.d.ts +9 -42
- package/dist/graph/delta.js +17 -11
- package/dist/graph/extract.d.ts +10 -7
- package/dist/graph/extract.js +57 -25
- package/dist/graph/recall.d.ts +12 -4
- package/dist/graph/recall.js +30 -13
- package/dist/graph/stream.d.ts +18 -6
- package/dist/graph/stream.js +32 -10
- package/dist/graph/view.d.ts +19 -6
- package/dist/graph/view.js +42 -17
- package/dist/hooks/codex-session.js +2 -2
- package/dist/hooks/codex-wrapper.d.ts +3 -1
- package/dist/hooks/codex-wrapper.js +9 -4
- package/dist/hooks/copilot.d.ts +19 -5
- package/dist/hooks/copilot.js +54 -15
- package/dist/hooks/hook-blocks.d.ts +4 -1
- package/dist/hooks/hook-blocks.js +8 -3
- package/dist/hooks/json-hooks.d.ts +9 -5
- package/dist/hooks/json-hooks.js +72 -33
- package/dist/hooks/opencode.js +15 -5
- package/dist/hooks/shared.d.ts +27 -8
- package/dist/hooks/shared.js +57 -16
- package/dist/importers/core.d.ts +12 -4
- package/dist/importers/core.js +11 -10
- package/dist/importers/markdown-parse.d.ts +15 -5
- package/dist/importers/markdown-parse.js +16 -7
- package/dist/importers/markdown.js +6 -9
- package/dist/importers/sources.js +10 -23
- package/dist/importers/vault.d.ts +3 -3
- package/dist/importers/vault.js +61 -45
- package/dist/index.d.ts +33 -7
- package/dist/index.js +26 -8
- package/dist/learn/autolearn.d.ts +21 -6
- package/dist/learn/autolearn.js +57 -26
- package/dist/learn/churn-git.d.ts +4 -1
- package/dist/learn/churn-git.js +29 -5
- package/dist/learn/extract.d.ts +4 -1
- package/dist/learn/extract.js +17 -10
- package/dist/learn/forward-claim-detector.d.ts +17 -5
- package/dist/learn/forward-claim-detector.js +34 -15
- package/dist/learn/invalidation.d.ts +12 -6
- package/dist/learn/invalidation.js +62 -28
- package/dist/learn/roots.d.ts +3 -0
- package/dist/learn/roots.js +5 -0
- package/dist/mcp/admin-tools.d.ts +5 -5
- package/dist/mcp/admin-tools.js +28 -23
- package/dist/mcp/format.d.ts +1 -1
- package/dist/mcp/format.js +4 -2
- package/dist/mcp/framing.d.ts +3 -1
- package/dist/mcp/framing.js +20 -8
- package/dist/mcp/memory-tools.d.ts +3 -3
- package/dist/mcp/memory-tools.js +21 -20
- package/dist/mcp/protocol.d.ts +32 -16
- package/dist/mcp/protocol.js +12 -9
- package/dist/mcp/recall-tools.d.ts +3 -3
- package/dist/mcp/recall-tools.js +62 -74
- package/dist/mcp/request.d.ts +7 -5
- package/dist/mcp/request.js +61 -77
- package/dist/mcp/server.d.ts +3 -1
- package/dist/mcp/server.js +8 -3
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +4 -3
- package/dist/mcp/shared-gate.d.ts +3 -2
- package/dist/mcp/shared-gate.js +3 -2
- package/dist/mcp/stdio.d.ts +6 -3
- package/dist/mcp/stdio.js +59 -23
- package/dist/mcp/tool-args.d.ts +4 -1
- package/dist/mcp/tool-args.js +8 -3
- package/dist/mcp/tools.js +76 -32
- package/dist/objects/customer-notes.d.ts +12 -10
- package/dist/objects/customer-notes.js +21 -15
- package/dist/objects/decisions.d.ts +18 -10
- package/dist/objects/decisions.js +23 -17
- package/dist/objects/descriptor.js +2 -1
- package/dist/objects/fields.d.ts +4 -1
- package/dist/objects/fields.js +6 -2
- package/dist/objects/incidents.d.ts +14 -16
- package/dist/objects/incidents.js +29 -30
- package/dist/objects/lifecycle.d.ts +0 -4
- package/dist/objects/lifecycle.js +21 -24
- package/dist/objects/policies.d.ts +12 -16
- package/dist/objects/policies.js +17 -21
- package/dist/objects/processes.d.ts +16 -10
- package/dist/objects/processes.js +20 -15
- package/dist/objects/project-briefs.d.ts +13 -14
- package/dist/objects/project-briefs.js +33 -39
- package/dist/objects/skills.d.ts +10 -12
- package/dist/objects/skills.js +17 -22
- package/dist/postinstall.js +15 -7
- package/dist/predictions/planning-fallacy.d.ts +19 -6
- package/dist/predictions/planning-fallacy.js +4 -2
- package/dist/rerankers/clef.d.ts +8 -2
- package/dist/rerankers/clef.js +14 -9
- package/dist/rerankers/cross-encoder.d.ts +2 -1
- package/dist/rerankers/cross-encoder.js +19 -9
- package/dist/rerankers/index.js +2 -1
- package/dist/rerankers/jev.js +2 -1
- package/dist/rerankers/llm.d.ts +6 -2
- package/dist/rerankers/llm.js +8 -3
- package/dist/rerankers/remote.d.ts +3 -1
- package/dist/rerankers/remote.js +5 -2
- package/dist/rerankers/types.d.ts +6 -2
- package/dist/search/bm25-search.d.ts +3 -1
- package/dist/search/bm25-search.js +15 -2
- package/dist/search/boosts.js +4 -3
- package/dist/search/embed-memories.d.ts +12 -4
- package/dist/search/embed-memories.js +96 -58
- package/dist/search/engine.d.ts +11 -0
- package/dist/search/engine.js +14 -0
- package/dist/search/goal-boost.d.ts +10 -3
- package/dist/search/goal-boost.js +13 -6
- package/dist/search/hybrid-score.d.ts +4 -1
- package/dist/search/hybrid-score.js +4 -1
- package/dist/search/hybrid.d.ts +23 -8
- package/dist/search/hybrid.js +12 -7
- package/dist/search/multihop.js +14 -13
- package/dist/search/path-context.d.ts +10 -3
- package/dist/search/path-context.js +10 -3
- package/dist/search/physics-search.d.ts +9 -4
- package/dist/search/physics-search.js +38 -14
- package/dist/search/rerank.d.ts +2 -1
- package/dist/search/rerank.js +2 -1
- package/dist/search/rrf.d.ts +14 -5
- package/dist/search/rrf.js +11 -4
- package/dist/search/vector.d.ts +8 -2
- package/dist/search/vector.js +14 -8
- package/dist/server/auth.d.ts +19 -15
- package/dist/server/auth.js +68 -38
- package/dist/server/boot.d.ts +4 -1
- package/dist/server/boot.js +115 -67
- package/dist/server/client-ip.d.ts +17 -5
- package/dist/server/client-ip.js +56 -21
- package/dist/server/cursor.d.ts +10 -3
- package/dist/server/cursor.js +10 -3
- package/dist/server/deadline.d.ts +5 -2
- package/dist/server/deadline.js +10 -3
- package/dist/server/key-check-bounds.js +12 -4
- package/dist/server/lifecycle.d.ts +4 -1
- package/dist/server/lifecycle.js +10 -4
- package/dist/server/mcp-http.d.ts +2 -1
- package/dist/server/mcp-http.js +37 -22
- package/dist/server/rate-limit.d.ts +17 -5
- package/dist/server/rate-limit.js +55 -26
- package/dist/server/ready.js +7 -4
- package/dist/server/request.d.ts +15 -4
- package/dist/server/request.js +42 -15
- package/dist/server/route-checks.d.ts +4 -1
- package/dist/server/route-checks.js +8 -3
- package/dist/server/route-table.d.ts +8 -6
- package/dist/server/route-table.js +550 -97
- package/dist/server/routes/admin.d.ts +7 -7
- package/dist/server/routes/admin.js +36 -15
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +5 -4
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +12 -6
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +10 -4
- package/dist/server/routes/memories.d.ts +8 -8
- package/dist/server/routes/memories.js +12 -17
- package/dist/server/routes/object-routes.d.ts +8 -5
- package/dist/server/routes/object-routes.js +4 -2
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +11 -4
- package/dist/server/routes/predictions.d.ts +5 -5
- package/dist/server/routes/predictions.js +9 -4
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +15 -6
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +3 -2
- package/dist/server/routes/recall.d.ts +3 -3
- package/dist/server/routes/recall.js +21 -10
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +12 -4
- package/dist/server/server-detect.d.ts +24 -8
- package/dist/server/server-detect.js +57 -22
- package/dist/server/sleep-child.js +16 -10
- package/dist/server/sleep-offload.d.ts +8 -5
- package/dist/server/sleep-offload.js +40 -18
- package/dist/server/tls.d.ts +10 -2
- package/dist/server/tls.js +25 -5
- package/dist/server/types.d.ts +41 -24
- package/dist/server/validation.d.ts +4 -1
- package/dist/server/validation.js +22 -9
- package/dist/server.d.ts +17 -49
- package/dist/server.js +33 -40
- package/dist/sharing/global-store.d.ts +6 -12
- package/dist/sharing/global-store.js +8 -48
- package/dist/sharing/global-sync.d.ts +3 -1
- package/dist/sharing/global-sync.js +17 -7
- package/dist/sharing/project-merge.d.ts +25 -7
- package/dist/sharing/project-merge.js +49 -17
- package/dist/sharing/search-both.d.ts +8 -4
- package/dist/sharing/search-both.js +28 -14
- package/dist/sharing/share.d.ts +8 -4
- package/dist/sharing/share.js +40 -18
- package/dist/store/ambient.js +10 -5
- package/dist/store/audit-event.d.ts +2 -2
- package/dist/store/audit-event.js +8 -3
- package/dist/store/audit.d.ts +6 -3
- package/dist/store/audit.js +16 -6
- package/dist/store/auth.d.ts +4 -2
- package/dist/store/auth.js +63 -20
- package/dist/store/busy.d.ts +9 -0
- package/dist/store/busy.js +16 -0
- package/dist/store/candidates.d.ts +12 -5
- package/dist/store/candidates.js +90 -41
- package/dist/store/capture-write.d.ts +2 -1
- package/dist/store/capture-write.js +2 -1
- package/dist/store/card-detail.d.ts +4 -4
- package/dist/store/card-detail.js +15 -8
- package/dist/store/cards.d.ts +24 -10
- package/dist/store/cards.js +97 -63
- package/dist/store/compaction-caller.d.ts +2 -1
- package/dist/store/compaction-caller.js +2 -1
- package/dist/store/compactions-record.d.ts +14 -8
- package/dist/store/compactions-record.js +101 -37
- package/dist/store/compactions.js +35 -15
- package/dist/store/conflicts.d.ts +16 -5
- package/dist/store/conflicts.js +104 -48
- package/dist/store/connectors/dlq.d.ts +17 -5
- package/dist/store/connectors/dlq.js +58 -6
- package/dist/store/connectors/event-log.d.ts +122 -0
- package/dist/store/connectors/event-log.js +25 -0
- package/dist/store/connectors/github.d.ts +6 -3
- package/dist/store/connectors/github.js +30 -48
- package/dist/store/connectors/slack.d.ts +2 -1
- package/dist/store/connectors/slack.js +31 -47
- package/dist/store/dashboard-reads.d.ts +7 -3
- package/dist/store/dashboard-reads.js +32 -10
- package/dist/store/delete-and-batch.d.ts +17 -11
- package/dist/store/delete-and-batch.js +70 -28
- package/dist/store/delivery-recorder.d.ts +10 -7
- package/dist/store/delivery-recorder.js +70 -37
- package/dist/store/descendant-page.d.ts +2 -1
- package/dist/store/descendant-page.js +26 -10
- package/dist/store/diagnostics.d.ts +2 -1
- package/dist/store/diagnostics.js +2 -1
- package/dist/store/doctor-reads.d.ts +2 -1
- package/dist/store/doctor-reads.js +13 -5
- package/dist/store/dormant.d.ts +19 -11
- package/dist/store/dormant.js +45 -19
- package/dist/store/embeddings/index.d.ts +13 -9
- package/dist/store/embeddings/index.js +19 -12
- package/dist/store/entry-reads.d.ts +72 -21
- package/dist/store/entry-reads.js +215 -69
- package/dist/store/entry-row.d.ts +10 -6
- package/dist/store/entry-row.js +26 -14
- package/dist/store/entry-writes.d.ts +28 -13
- package/dist/store/entry-writes.js +61 -22
- package/dist/store/failure-log-at.js +1 -1
- package/dist/store/failure-log.d.ts +4 -2
- package/dist/store/failure-log.js +13 -6
- package/dist/store/gated-write.d.ts +3 -3
- package/dist/store/gated-write.js +3 -3
- package/dist/store/goals.d.ts +5 -4
- package/dist/store/goals.js +11 -12
- package/dist/store/graph-apply.d.ts +21 -0
- package/dist/{graph/write.js → store/graph-apply.js} +31 -11
- package/dist/store/graph-queue.d.ts +9 -6
- package/dist/store/graph-queue.js +15 -10
- package/dist/store/graph-reads.d.ts +16 -11
- package/dist/store/graph-reads.js +29 -19
- package/dist/store/graph-rows.d.ts +41 -3
- package/dist/store/graph-rows.js +10 -7
- package/dist/store/graph-view-rows.js +15 -7
- package/dist/store/graph-writes.d.ts +16 -10
- package/dist/store/graph-writes.js +59 -36
- package/dist/store/half-life.js +2 -2
- package/dist/store/handoffs.d.ts +13 -7
- package/dist/store/handoffs.js +44 -22
- package/dist/store/index-and-stats.d.ts +2 -2
- package/dist/store/index-and-stats.js +6 -5
- package/dist/store/index.d.ts +4 -2
- package/dist/store/index.js +2 -1
- package/dist/store/key-audit.d.ts +2 -1
- package/dist/store/key-audit.js +2 -1
- package/dist/store/key-writes.d.ts +2 -1
- package/dist/store/key-writes.js +9 -2
- package/dist/store/ledger-turn.d.ts +4 -1
- package/dist/store/ledger-turn.js +7 -2
- package/dist/store/mirrors.d.ts +11 -4
- package/dist/store/mirrors.js +96 -19
- package/dist/store/narrow.d.ts +6 -0
- package/dist/store/narrow.js +11 -0
- package/dist/store/open.d.ts +6 -3
- package/dist/store/open.js +20 -10
- package/dist/store/pilot-arm.d.ts +2 -1
- package/dist/store/pilot-arm.js +18 -6
- package/dist/store/planning-fallacy-evidence.d.ts +2 -2
- package/dist/store/planning-fallacy-evidence.js +8 -5
- package/dist/store/port/agent-import.d.ts +62 -0
- package/dist/store/port/agent-import.js +2 -0
- package/dist/store/port/consolidation.d.ts +129 -0
- package/dist/store/port/consolidation.js +2 -0
- package/dist/store/port/learning.d.ts +19 -0
- package/dist/store/port/learning.js +2 -0
- package/dist/store/port/local-files.d.ts +18 -0
- package/dist/store/port/local-files.js +2 -0
- package/dist/store/port/promotion.d.ts +20 -0
- package/dist/store/port/promotion.js +3 -0
- package/dist/store/port-groups.d.ts +160 -0
- package/dist/store/port-groups.js +2 -0
- package/dist/store/port.d.ts +261 -219
- package/dist/store/port.js +3 -9
- package/dist/store/predictions.d.ts +14 -10
- package/dist/store/predictions.js +37 -17
- package/dist/store/project-tags.d.ts +4 -1
- package/dist/store/project-tags.js +16 -5
- package/dist/store/quality-repair.d.ts +8 -4
- package/dist/store/quality-repair.js +53 -20
- package/dist/store/quarantine.d.ts +1 -0
- package/dist/store/quarantine.js +23 -9
- package/dist/store/raw-archive.d.ts +5 -4
- package/dist/store/raw-archive.js +11 -10
- package/dist/store/recall-trace.d.ts +22 -17
- package/dist/store/recall-trace.js +128 -64
- package/dist/store/rejected-values.d.ts +15 -10
- package/dist/store/rejected-values.js +46 -20
- package/dist/store/rejection.d.ts +12 -11
- package/dist/store/rejection.js +18 -19
- package/dist/store/report-reads.d.ts +2 -1
- package/dist/store/report-reads.js +2 -1
- package/dist/store/rows.d.ts +7 -5
- package/dist/store/rows.js +20 -13
- package/dist/store/rule-sql.d.ts +7 -3
- package/dist/store/rule-sql.js +26 -13
- package/dist/store/search-rows.d.ts +16 -11
- package/dist/store/search-rows.js +54 -32
- package/dist/store/sessions.d.ts +12 -10
- package/dist/store/sessions.js +40 -21
- package/dist/store/set-aside.d.ts +2 -2
- package/dist/store/set-aside.js +18 -5
- package/dist/store/sqlite/agent-import.d.ts +3 -0
- package/dist/store/sqlite/agent-import.js +77 -0
- package/dist/store/sqlite/cards-group.d.ts +6 -0
- package/dist/store/sqlite/cards-group.js +37 -0
- package/dist/store/sqlite/conflicts-group.d.ts +6 -0
- package/dist/store/sqlite/conflicts-group.js +18 -0
- package/dist/store/sqlite/connector-events-group.d.ts +2 -1
- package/dist/store/sqlite/connector-events-group.js +17 -6
- package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
- package/dist/store/sqlite/connector-writes-group.js +12 -5
- package/dist/store/sqlite/consolidation-group.d.ts +4 -0
- package/dist/store/sqlite/consolidation-group.js +64 -0
- package/dist/store/sqlite/dag-reads-group.js +1 -1
- package/dist/store/sqlite/dormant-group.d.ts +6 -0
- package/dist/store/sqlite/dormant-group.js +29 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +9 -6
- package/dist/store/sqlite/entry-writes-group.js +37 -14
- package/dist/store/sqlite/error-codec.d.ts +4 -2
- package/dist/store/sqlite/error-codec.js +32 -10
- package/dist/store/sqlite/executor-counts.js +2 -1
- package/dist/store/sqlite/executor.d.ts +8 -3
- package/dist/store/sqlite/executor.js +56 -18
- package/dist/store/sqlite/global-promote.d.ts +5 -0
- package/dist/store/sqlite/global-promote.js +48 -0
- package/dist/store/sqlite/goals-group.d.ts +6 -0
- package/dist/store/sqlite/goals-group.js +23 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
- package/dist/store/sqlite/graph-reads-group.js +2 -1
- package/dist/store/sqlite/held-connection.d.ts +8 -0
- package/dist/store/sqlite/held-connection.js +34 -7
- package/dist/store/sqlite/last-recall-group.d.ts +15 -0
- package/dist/store/sqlite/last-recall-group.js +62 -0
- package/dist/store/sqlite/learning-group.d.ts +4 -0
- package/dist/store/sqlite/learning-group.js +17 -0
- package/dist/store/sqlite/maintenance-groups.d.ts +6 -0
- package/dist/store/sqlite/maintenance-groups.js +61 -0
- package/dist/store/sqlite/object-rows.d.ts +6 -3
- package/dist/store/sqlite/object-rows.js +34 -5
- package/dist/store/sqlite/objects-group.d.ts +5 -4
- package/dist/store/sqlite/objects-group.js +97 -38
- package/dist/store/sqlite/predictions-group.d.ts +2 -1
- package/dist/store/sqlite/predictions-group.js +4 -2
- package/dist/store/sqlite/promotion-group.d.ts +3 -0
- package/dist/store/sqlite/promotion-group.js +10 -0
- package/dist/store/sqlite/quarantine-group.d.ts +2 -1
- package/dist/store/sqlite/quarantine-group.js +4 -2
- package/dist/store/sqlite/reports-group.d.ts +6 -0
- package/dist/store/sqlite/reports-group.js +33 -0
- package/dist/store/sqlite/request-scope.d.ts +6 -0
- package/dist/store/sqlite/request-scope.js +18 -0
- package/dist/store/sqlite/sessions-group.d.ts +6 -0
- package/dist/store/sqlite/sessions-group.js +46 -0
- package/dist/store/sqlite/store.d.ts +22 -18
- package/dist/store/sqlite/store.js +95 -33
- package/dist/store/sqlite/vector-pack.js +2 -1
- package/dist/store/sqlite/vector-reads-group.js +2 -1
- package/dist/store/sqlite/worker-jobs.d.ts +2 -1
- package/dist/store/sqlite/worker-jobs.js +19 -7
- package/dist/store/sqlite/worker-ops.d.ts +10 -5
- package/dist/store/sqlite/worker-ops.js +6 -3
- package/dist/store/sqlite/worker-store.d.ts +4 -3
- package/dist/store/sqlite/worker-store.js +24 -14
- package/dist/store/summaries.d.ts +25 -11
- package/dist/store/summaries.js +84 -27
- package/dist/store/summary-dirty.d.ts +2 -1
- package/dist/store/summary-dirty.js +2 -1
- package/dist/store/tenant.d.ts +3 -2
- package/dist/store/tenant.js +5 -4
- package/dist/store/token-ledger-rows.js +8 -4
- package/dist/store/token-ledger.d.ts +19 -13
- package/dist/store/token-ledger.js +27 -14
- package/dist/store/tombstone-checks.d.ts +4 -1
- package/dist/store/tombstone-checks.js +10 -1
- package/dist/store/usage-reports.js +2 -1
- package/dist/store/vector-index.d.ts +8 -5
- package/dist/store/vector-index.js +28 -11
- package/dist/store/working-memory.d.ts +6 -4
- package/dist/store/working-memory.js +14 -9
- package/dist/support-bundle.js +10 -5
- package/dist/trust/quarantine.d.ts +1 -2
- package/dist/trust/quarantine.js +1 -5
- package/dist/trust/reject-flow.d.ts +12 -3
- package/dist/trust/reject-flow.js +12 -4
- package/dist/util/anthropic-messages.d.ts +7 -2
- package/dist/util/anthropic-messages.js +18 -7
- package/dist/util/atomic-write.d.ts +8 -3
- package/dist/util/atomic-write.js +36 -21
- package/dist/util/compaction-items.d.ts +4 -1
- package/dist/util/compaction-items.js +8 -2
- package/dist/util/crash-handlers.d.ts +7 -2
- package/dist/util/crash-handlers.js +13 -4
- package/dist/util/env.d.ts +26 -5
- package/dist/util/env.js +87 -25
- package/dist/util/format.d.ts +2 -0
- package/dist/util/format.js +4 -0
- package/dist/util/home-path.js +12 -6
- package/dist/util/hook-payload.d.ts +3 -1
- package/dist/util/hook-payload.js +3 -1
- package/dist/util/http-retry.d.ts +12 -6
- package/dist/util/http-retry.js +16 -6
- package/dist/util/http-util.d.ts +20 -5
- package/dist/util/http-util.js +28 -9
- package/dist/util/json.d.ts +4 -1
- package/dist/util/json.js +4 -1
- package/dist/util/keyset.js +2 -1
- package/dist/util/limits.js +4 -2
- package/dist/util/log.d.ts +13 -5
- package/dist/util/log.js +29 -6
- package/dist/util/net.d.ts +5 -0
- package/dist/util/net.js +19 -0
- package/dist/util/real-path.d.ts +2 -1
- package/dist/util/real-path.js +4 -3
- package/dist/util/request-scope.d.ts +16 -4
- package/dist/util/request-scope.js +19 -6
- package/dist/util/same-text.d.ts +10 -3
- package/dist/util/same-text.js +10 -3
- package/dist/util/secret-detect.d.ts +24 -7
- package/dist/util/secret-detect.js +49 -14
- package/dist/util/spawn-argv.d.ts +11 -0
- package/dist/util/spawn-argv.js +66 -0
- package/dist/util/sql.d.ts +3 -0
- package/dist/util/sql.js +6 -0
- package/dist/util/sqlite-blocked.d.ts +15 -4
- package/dist/util/sqlite-blocked.js +19 -6
- package/dist/util/stored-json.d.ts +4 -1
- package/dist/util/stored-json.js +6 -2
- package/dist/util/stream-tee.d.ts +2 -1
- package/dist/util/stream-tee.js +8 -5
- package/dist/util/transcript-tail.d.ts +4 -1
- package/dist/util/transcript-tail.js +4 -1
- package/dist/util/vector-codec.d.ts +4 -0
- package/dist/util/vector-codec.js +15 -0
- package/dist/util/version.d.ts +8 -3
- package/dist/util/version.js +8 -3
- package/dist/util/write-budget.d.ts +7 -2
- package/dist/util/write-budget.js +5 -2
- package/dist/util/yaml.d.ts +4 -1
- package/dist/util/yaml.js +4 -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 -1
- package/scripts/postinstall.cjs +3 -1
- package/dist/api/audit.js +0 -56
- package/dist/api/cards.d.ts +0 -42
- package/dist/api/conflicts.d.ts +0 -28
- package/dist/api/conflicts.js +0 -61
- package/dist/api/dormant.d.ts +0 -14
- package/dist/api/dormant.js +0 -58
- package/dist/api/goals.d.ts +0 -18
- package/dist/api/graph.d.ts +0 -8
- package/dist/api/graph.js +0 -7
- package/dist/api/learn.js +0 -124
- package/dist/api/memories.d.ts +0 -23
- package/dist/api/memories.js +0 -46
- package/dist/api/objects.d.ts +0 -9
- package/dist/api/on-store.d.ts +0 -16
- package/dist/api/on-store.js +0 -38
- package/dist/api/outcome.d.ts +0 -19
- package/dist/api/outcome.js +0 -21
- package/dist/api/predictions.d.ts +0 -11
- package/dist/api/promote.d.ts +0 -36
- package/dist/api/promote.js +0 -65
- package/dist/api/recall-core.d.ts +0 -4
- package/dist/api/recall-core.js +0 -120
- package/dist/api/recall-finish.d.ts +0 -53
- package/dist/api/recall-finish.js +0 -30
- package/dist/api/recall-history.d.ts +0 -64
- package/dist/api/recall-history.js +0 -159
- package/dist/api/recall-record.d.ts +0 -43
- package/dist/api/recall-record.js +0 -78
- package/dist/api/recall-request.js +0 -121
- package/dist/api/recall.d.ts +0 -6
- package/dist/api/refine.d.ts +0 -7
- package/dist/api/refine.js +0 -10
- package/dist/api/session-owners.d.ts +0 -4
- package/dist/api/session-owners.js +0 -17
- package/dist/api/sleep-run.d.ts +0 -26
- package/dist/api/sleep.js +0 -10
- package/dist/cli/lenient-id.d.ts +0 -2
- package/dist/cli/lenient-id.js +0 -13
- package/dist/graph/write.d.ts +0 -14
- package/dist/store/sqlite/busy.d.ts +0 -3
- package/dist/store/sqlite/busy.js +0 -8
- package/dist/store/sqlite/local.d.ts +0 -21
- package/dist/store/sqlite/local.js +0 -39
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
// hippo.db's half of the EntryWrites store group: the queries remember, outcome, supersede, archive and forget run
|
|
1
|
+
// hippo.db's half of the EntryWrites store group: the queries remember, outcome, supersede, archive and forget run
|
|
2
|
+
// today.
|
|
2
3
|
import { ConflictError, NotFoundError } from '../../core/api-errors.js';
|
|
3
4
|
import { appendAuditEvent } from '../audit.js';
|
|
4
5
|
import { isSqliteBusy, withWriteScope } from '../../db/index.js';
|
|
@@ -18,7 +19,8 @@ import { updateStatsUnlessBusy } from '../index-and-stats.js';
|
|
|
18
19
|
import { purgeMirrorBestEffort, removeEntryMirrors } from '../mirrors.js';
|
|
19
20
|
import { onHandle, openStore } from '../open.js';
|
|
20
21
|
import { selectMemoryReach } from '../tenant-lookup.js';
|
|
21
|
-
/** Each call on its own handle; mirrors and the forgotten counter follow the commit, so a rolled-back write leaves
|
|
22
|
+
/** Each call on its own handle; mirrors and the forgotten counter follow the commit, so a rolled-back write leaves
|
|
23
|
+
* neither. */
|
|
22
24
|
export function sqliteEntryWrites(hippoRoot) {
|
|
23
25
|
return {
|
|
24
26
|
writeEntry(write) {
|
|
@@ -52,13 +54,19 @@ export function writeEntryAt(hippoRoot, { entry, actor }, afterWrite) {
|
|
|
52
54
|
onHandle(hippoRoot, (db) => writeInOwnTenant(db, stamped, actor, afterWrite), openStore);
|
|
53
55
|
writeEntryMirrors(hippoRoot, stamped);
|
|
54
56
|
}
|
|
55
|
-
/** A trace link follows the commit on the same handle and names only the ids applied, so a rolled-back outcome leaves
|
|
57
|
+
/** A trace link follows the commit on the same handle and names only the ids applied, so a rolled-back outcome leaves
|
|
58
|
+
* none. */
|
|
56
59
|
export function applyOutcomeAt(hippoRoot, outcome, traceId) {
|
|
57
60
|
const applied = onHandle(hippoRoot, (db) => {
|
|
58
61
|
const rows = applyOutcomeOn(db, outcome);
|
|
59
62
|
const memoryIds = rows.map((entry) => entry.id);
|
|
60
63
|
if (traceId !== undefined && rows.length > 0) {
|
|
61
|
-
recordTraceOutcome(db, {
|
|
64
|
+
recordTraceOutcome(db, {
|
|
65
|
+
traceId,
|
|
66
|
+
tenantId: outcome.tenantId,
|
|
67
|
+
outcome: outcome.good ? 'positive' : 'negative',
|
|
68
|
+
memoryIds,
|
|
69
|
+
});
|
|
62
70
|
}
|
|
63
71
|
return rows;
|
|
64
72
|
}, openStore);
|
|
@@ -66,7 +74,8 @@ export function applyOutcomeAt(hippoRoot, outcome, traceId) {
|
|
|
66
74
|
writeEntryMirrors(hippoRoot, entry);
|
|
67
75
|
return applied.map((entry) => entry.id);
|
|
68
76
|
}
|
|
69
|
-
/** Reach is checked inside the archive's write scope. A store-side hook writes on the same handle inside that scope, so
|
|
77
|
+
/** Reach is checked inside the archive's write scope. A store-side hook writes on the same handle inside that scope, so
|
|
78
|
+
* its throw undoes the archive. */
|
|
70
79
|
export function archiveRawAt(hippoRoot, archive, afterArchive) {
|
|
71
80
|
const archivedAt = onHandle(hippoRoot, (db) => {
|
|
72
81
|
const at = withWriteScope(db, 'archive_raw_in_reach', () => {
|
|
@@ -88,11 +97,13 @@ function assertInReach(db, target, id) {
|
|
|
88
97
|
if (reach?.tenantId !== target.tenantId || !ownScopeTouches(target.ownScope, reach.scope))
|
|
89
98
|
throw notFound(id);
|
|
90
99
|
}
|
|
91
|
-
/** hippo.db's upsert would move the row into the writer's tenant, so a store write refuses an id another tenant
|
|
100
|
+
/** hippo.db's upsert would move the row into the writer's tenant, so a store write refuses an id another tenant
|
|
101
|
+
* holds. */
|
|
92
102
|
function assertIdInTenant(db, entry) {
|
|
93
103
|
const holder = selectMemoryReach(db, entry.id)?.tenantId;
|
|
94
|
-
if (holder !== undefined && holder !== entry.
|
|
104
|
+
if (holder !== undefined && holder !== entry.tenant_id) {
|
|
95
105
|
throw new ConflictError(`Memory ${entry.id} belongs to another tenant`);
|
|
106
|
+
}
|
|
96
107
|
}
|
|
97
108
|
/** The refusal row lands after `write` has rolled back, in a fresh implicit transaction the aborted one cannot undo. */
|
|
98
109
|
export function auditingRefusal(db, actor, write) {
|
|
@@ -112,7 +123,8 @@ export function writeInOwnTenant(db, entry, actor, afterWrite) {
|
|
|
112
123
|
writeEntryDbOnly(db, entry, { actor, afterWrite });
|
|
113
124
|
}));
|
|
114
125
|
}
|
|
115
|
-
/** The reads, rewrites and outcome rows share one BEGIN IMMEDIATE transaction, hippo.db's form of the port's row lock;
|
|
126
|
+
/** The reads, rewrites and outcome rows share one BEGIN IMMEDIATE transaction, hippo.db's form of the port's row lock;
|
|
127
|
+
* the caller writes the mirrors after. */
|
|
116
128
|
function applyOutcomeOn(db, outcome) {
|
|
117
129
|
return auditingRefusal(db, outcome.actor, () => withWriteScope(db, 'apply_outcome', () => {
|
|
118
130
|
const live = selectEntriesByIds(db, outcome.ids, outcome.tenantId);
|
|
@@ -124,20 +136,29 @@ function applyOutcomeOn(db, outcome) {
|
|
|
124
136
|
const updated = entryAfterOutcome(entry, outcome.good);
|
|
125
137
|
writeEntryDbOnly(db, updated, { actor: outcome.actor });
|
|
126
138
|
live.set(id, updated);
|
|
127
|
-
appendAuditEvent(db, {
|
|
139
|
+
appendAuditEvent(db, {
|
|
140
|
+
tenantId: outcome.tenantId,
|
|
141
|
+
actor: outcome.actor,
|
|
142
|
+
op: 'outcome',
|
|
143
|
+
targetId: id,
|
|
144
|
+
metadata: { good: outcome.good },
|
|
145
|
+
});
|
|
128
146
|
applied.push(updated);
|
|
129
147
|
}
|
|
130
148
|
return applied;
|
|
131
149
|
}));
|
|
132
150
|
}
|
|
133
|
-
/** Reach, the CAS on the old row, the successor's insert and the supersede row in one BEGIN IMMEDIATE transaction. Two
|
|
151
|
+
/** Reach, the CAS on the old row, the successor's insert and the supersede row in one BEGIN IMMEDIATE transaction. Two
|
|
152
|
+
* racing supersedes: one CAS wins. */
|
|
134
153
|
function commitSupersede(db, write) {
|
|
135
154
|
const { tenantId, actor, oldId, successor } = write;
|
|
136
155
|
// The refusal row lands after the scope has rolled back, in a fresh implicit transaction the aborted one cannot undo.
|
|
137
156
|
auditingRefusal(db, actor, () => withWriteScope(db, 'supersede', () => {
|
|
138
157
|
assertInReach(db, write, oldId);
|
|
139
158
|
// SAFETY: RETURNING names one column, dag_parent_id; no row means another writer got there first.
|
|
140
|
-
const won = db
|
|
159
|
+
const won = db
|
|
160
|
+
.prepare('UPDATE memories SET superseded_by = ? WHERE id = ? AND tenant_id = ? AND superseded_by IS NULL RETURNING ' +
|
|
161
|
+
'dag_parent_id')
|
|
141
162
|
.get(successor.id, oldId, tenantId);
|
|
142
163
|
if (!won)
|
|
143
164
|
throw new ConflictError(`Memory ${oldId} already superseded by another writer`);
|
|
@@ -149,13 +170,15 @@ function commitSupersede(db, write) {
|
|
|
149
170
|
appendAuditEvent(db, { tenantId, actor, op: 'supersede', targetId: oldId, metadata: { newId: successor.id } });
|
|
150
171
|
}));
|
|
151
172
|
}
|
|
152
|
-
/** A mirror left on disk would bring the archived row back on the next import; on failure the reaper retries, as
|
|
173
|
+
/** A mirror left on disk would bring the archived row back on the next import; on failure the reaper retries, as
|
|
174
|
+
* mirror_cleaned_at stays NULL. */
|
|
153
175
|
function cleanArchivedMirrors(db, hippoRoot, id) {
|
|
154
176
|
try {
|
|
155
177
|
removeEntryMirrors(hippoRoot, id);
|
|
156
178
|
}
|
|
157
179
|
catch (mirrorErr) {
|
|
158
|
-
log.error(`archiveRaw: mirror cleanup failed for ${id} (will retry via reaper on next openHippoDb):
|
|
180
|
+
log.error(`archiveRaw: mirror cleanup failed for ${id} (will retry via reaper on next openHippoDb): ` +
|
|
181
|
+
`${errorMessage(mirrorErr)}`, errorFields(mirrorErr));
|
|
159
182
|
return;
|
|
160
183
|
}
|
|
161
184
|
try {
|
|
@@ -164,7 +187,7 @@ function cleanArchivedMirrors(db, hippoRoot, id) {
|
|
|
164
187
|
catch (err) {
|
|
165
188
|
if (!isSqliteBusy(err))
|
|
166
189
|
throw err;
|
|
167
|
-
log.warnThenDebug('archive-mirror-stamp-busy', `archived ${id}; the store was busy, so the mirror reaper will re-check it on the next open
|
|
190
|
+
log.warnThenDebug('archive-mirror-stamp-busy', `archived ${id}; the store was busy, so the mirror reaper will re-check it on the next open`, errorFields(err));
|
|
168
191
|
}
|
|
169
192
|
}
|
|
170
193
|
//# sourceMappingURL=entry-writes-group.js.map
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
type FieldValue = string | number | boolean | null;
|
|
2
2
|
/** One error as a thread message can carry it. */
|
|
3
3
|
export interface WireError {
|
|
4
|
-
/** Constructor names from the thrown class up to Error: several classes set no `name`, so a name alone cannot pick
|
|
4
|
+
/** Constructor names from the thrown class up to Error: several classes set no `name`, so a name alone cannot pick
|
|
5
|
+
* the class. */
|
|
5
6
|
readonly classes: readonly string[];
|
|
6
7
|
readonly message: string;
|
|
7
8
|
readonly stack: string | undefined;
|
|
@@ -11,7 +12,8 @@ export interface WireError {
|
|
|
11
12
|
}
|
|
12
13
|
/** Worker side. A thrown value that is not an Error carries its text and no class. */
|
|
13
14
|
export declare function encodeError<E>(err: E, depth?: number): WireError;
|
|
14
|
-
/** Server side: an instance of the thrown class, or of its nearest ancestor in the table, with the worker's stack,
|
|
15
|
+
/** Server side: an instance of the thrown class, or of its nearest ancestor in the table, with the worker's stack,
|
|
16
|
+
* cause and fields. */
|
|
15
17
|
export declare function decodeError(wire: WireError): Error;
|
|
16
18
|
export {};
|
|
17
19
|
//# sourceMappingURL=error-codec.d.ts.map
|
|
@@ -9,13 +9,31 @@ import { errorMessage, log } from '../../util/log.js';
|
|
|
9
9
|
import { ScopeForbiddenError } from '../../core/recall-scope.js';
|
|
10
10
|
import { RejectedValueError } from '../../core/api-errors.js';
|
|
11
11
|
import { OtherStoreFolderError, SqliteBlockedError, StoreNotPortedError } from '../../util/sqlite-blocked.js';
|
|
12
|
-
// Every class the server maps by, at or below the store layer. Abstract ApiError is absent: only its four subclasses
|
|
12
|
+
// Every class the server maps by, at or below the store layer. Abstract ApiError is absent: only its four subclasses
|
|
13
|
+
// are thrown.
|
|
13
14
|
const CLASSES = [
|
|
14
|
-
Error,
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
Error,
|
|
16
|
+
TypeError,
|
|
17
|
+
RangeError,
|
|
18
|
+
SyntaxError,
|
|
19
|
+
ReferenceError,
|
|
20
|
+
EvalError,
|
|
21
|
+
URIError,
|
|
22
|
+
HttpError,
|
|
23
|
+
BodyTooLargeError,
|
|
24
|
+
BodyTimeoutError,
|
|
25
|
+
BadRequestError,
|
|
26
|
+
ForbiddenError,
|
|
27
|
+
NotFoundError,
|
|
28
|
+
ConflictError,
|
|
29
|
+
RejectedValueError,
|
|
30
|
+
ScopeForbiddenError,
|
|
31
|
+
RawAppendOnlyError,
|
|
32
|
+
SqliteBlockedError,
|
|
33
|
+
StoreNotPortedError,
|
|
34
|
+
OtherStoreFolderError,
|
|
35
|
+
StoreBusyError,
|
|
36
|
+
IncompatibleBinaryError,
|
|
19
37
|
];
|
|
20
38
|
const PROTOTYPES = new Map(CLASSES.map((known) => [known.name, known.prototype]));
|
|
21
39
|
// A chain of causes deeper than this is cut, so a cycle cannot recurse for ever.
|
|
@@ -37,19 +55,23 @@ function ownFields(err) {
|
|
|
37
55
|
}
|
|
38
56
|
/** Worker side. A thrown value that is not an Error carries its text and no class. */
|
|
39
57
|
export function encodeError(err, depth = 0) {
|
|
40
|
-
if (!(err instanceof Error))
|
|
58
|
+
if (!(err instanceof Error)) {
|
|
41
59
|
return { classes: [], message: errorMessage(err), stack: undefined, fields: {}, cause: undefined };
|
|
60
|
+
}
|
|
42
61
|
const cause = err.cause === undefined || depth >= MAX_CAUSES ? undefined : encodeError(err.cause, depth + 1);
|
|
43
62
|
return { classes: classNames(err), message: err.message, stack: err.stack, fields: ownFields(err), cause };
|
|
44
63
|
}
|
|
45
|
-
/** Server side: an instance of the thrown class, or of its nearest ancestor in the table, with the worker's stack,
|
|
64
|
+
/** Server side: an instance of the thrown class, or of its nearest ancestor in the table, with the worker's stack,
|
|
65
|
+
* cause and fields. */
|
|
46
66
|
export function decodeError(wire) {
|
|
47
67
|
const thrown = wire.classes[0];
|
|
48
68
|
const known = wire.classes.find((name) => PROTOTYPES.has(name)) ?? 'Error';
|
|
49
69
|
const unlisted = thrown !== undefined && thrown !== known;
|
|
50
|
-
if (unlisted)
|
|
70
|
+
if (unlisted) {
|
|
51
71
|
log.once(`store-worker-error:${thrown}`, 'warn', `a store worker threw ${thrown}, which the error codec does not list; it arrives as ${known}`);
|
|
52
|
-
|
|
72
|
+
}
|
|
73
|
+
// A listed ancestor still maps to its status, so its text stays as thrown; under plain Error the class survives only
|
|
74
|
+
// in the message.
|
|
53
75
|
const message = unlisted && known === 'Error' ? `${thrown}: ${wire.message}` : wire.message;
|
|
54
76
|
const rebuilt = wire.cause === undefined ? new Error(message) : new Error(message, { cause: decodeError(wire.cause) });
|
|
55
77
|
// The constructor is not run again: its arguments did not cross, and the fields below are what it set.
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
// What the store workers refused, timed out and replaced since the process started; /health reports them beside the
|
|
1
|
+
// What the store workers refused, timed out and replaced since the process started; /health reports them beside the
|
|
2
|
+
// audit failure count.
|
|
2
3
|
/** Counted on the server thread, across every executor of the process. */
|
|
3
4
|
export const workerCounts = {
|
|
4
5
|
/** Calls refused because a thread's queue was full. */
|
|
@@ -2,8 +2,11 @@ import { type OpMode } from './worker-ops.js';
|
|
|
2
2
|
export interface CallOptions {
|
|
3
3
|
readonly mode: OpMode;
|
|
4
4
|
readonly requestId: string | undefined;
|
|
5
|
-
/** Epoch milliseconds by which the call's request must be answered; absent means the call waits as long as it
|
|
5
|
+
/** Epoch milliseconds by which the call's request must be answered; absent means the call waits as long as it
|
|
6
|
+
* takes. */
|
|
6
7
|
readonly deadlineAt?: number | undefined;
|
|
8
|
+
/** Aborts when the request is abandoned; a call still queued then is dropped and never runs. */
|
|
9
|
+
readonly signal?: AbortSignal | undefined;
|
|
7
10
|
}
|
|
8
11
|
export interface ExecutorOptions {
|
|
9
12
|
/** Lock wait of each thread's connection; defaults to the server's. */
|
|
@@ -14,13 +17,15 @@ export interface ExecutorOptions {
|
|
|
14
17
|
readonly writeGraceMs?: number;
|
|
15
18
|
}
|
|
16
19
|
export interface SqliteExecutor {
|
|
17
|
-
/** Runs `op` of the synchronous store on a worker thread. A throw there rejects here as an instance of its own
|
|
20
|
+
/** Runs `op` of the synchronous store on a worker thread. A throw there rejects here as an instance of its own
|
|
21
|
+
* class. */
|
|
18
22
|
call<T>(op: string, args: readonly unknown[], opts: CallOptions): Promise<T>;
|
|
19
23
|
/** Resolves once every thread has exited: Windows cannot delete a store folder while a thread holds its files. */
|
|
20
24
|
close(): Promise<void>;
|
|
21
25
|
/** Threads started and not yet exited. */
|
|
22
26
|
liveThreads(): number;
|
|
23
|
-
/** Stops the writer thread as a crash would: its running and queued calls reject, and the next write starts a fresh
|
|
27
|
+
/** Stops the writer thread as a crash would: its running and queued calls reject, and the next write starts a fresh
|
|
28
|
+
* thread. */
|
|
24
29
|
terminateWriter(): void;
|
|
25
30
|
}
|
|
26
31
|
/** Threads for the hippo.db under `hippoRoot`: one writer and two readers. The first
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
// The server thread's side of the store workers: SQLite's synchronous statements and lock waits run on their threads,
|
|
1
|
+
// The server thread's side of the store workers: SQLite's synchronous statements and lock waits run on their threads,
|
|
2
|
+
// so the event loop keeps answering.
|
|
2
3
|
import { fileURLToPath } from 'node:url';
|
|
3
4
|
import { SHARE_ENV, Worker } from 'node:worker_threads';
|
|
4
5
|
import { addAuditWriteFailures } from '../audit.js';
|
|
@@ -66,7 +67,7 @@ class WorkerPool {
|
|
|
66
67
|
this.#queueMax = opts.queueMax ?? envStoreQueueMax() ?? DEFAULT_QUEUE_MAX;
|
|
67
68
|
this.#writeGraceMs = opts.writeGraceMs ?? DEFAULT_WRITE_GRACE_MS;
|
|
68
69
|
}
|
|
69
|
-
call(op, args, { mode, requestId, deadlineAt }) {
|
|
70
|
+
call(op, args, { mode, requestId, deadlineAt, signal }) {
|
|
70
71
|
return new Promise((resolve, reject) => {
|
|
71
72
|
if (this.#closed) {
|
|
72
73
|
reject(new StoreBusyError(EXECUTOR_CLOSED));
|
|
@@ -77,16 +78,27 @@ class WorkerPool {
|
|
|
77
78
|
reject(decodeError(reply.error));
|
|
78
79
|
return;
|
|
79
80
|
}
|
|
80
|
-
// SAFETY: the worker ran `op` of the synchronous store, whose result is the T the caller's port method
|
|
81
|
+
// SAFETY: the worker ran `op` of the synchronous store, whose result is the T the caller's port method
|
|
82
|
+
// declares.
|
|
81
83
|
resolve(reply.value);
|
|
82
84
|
};
|
|
83
|
-
const lane = mode === 'write'
|
|
85
|
+
const lane = mode === 'write'
|
|
86
|
+
? this.#writer
|
|
87
|
+
: this.#readers.reduce((least, next) => (load(next) < load(least) ? next : least));
|
|
84
88
|
const refusal = this.#refusal(lane, deadlineAt);
|
|
85
89
|
if (refusal !== undefined) {
|
|
86
90
|
reject(refusal);
|
|
87
91
|
return;
|
|
88
92
|
}
|
|
89
|
-
const pending = {
|
|
93
|
+
const pending = {
|
|
94
|
+
job: { id: this.#nextId++, op, args, requestId },
|
|
95
|
+
settle,
|
|
96
|
+
fail: reject,
|
|
97
|
+
deadlineAt,
|
|
98
|
+
signal,
|
|
99
|
+
timer: undefined,
|
|
100
|
+
answered: false,
|
|
101
|
+
};
|
|
90
102
|
this.#watchDeadline(lane, pending);
|
|
91
103
|
lane.queue.push(pending);
|
|
92
104
|
this.#ensureSetup();
|
|
@@ -109,13 +121,15 @@ class WorkerPool {
|
|
|
109
121
|
this.#writer.queue.unshift(pending);
|
|
110
122
|
this.#pump(this.#writer);
|
|
111
123
|
}
|
|
112
|
-
// A failed setup fails the reads that waited for it with its own error, as each read's own open would have, and the
|
|
124
|
+
// A failed setup fails the reads that waited for it with its own error, as each read's own open would have, and the
|
|
125
|
+
// next call tries it again.
|
|
113
126
|
#setupEnded(failure) {
|
|
114
127
|
this.#setup = failure === undefined ? 'done' : 'none';
|
|
115
128
|
for (const lane of this.#readers) {
|
|
116
|
-
if (failure !== undefined)
|
|
129
|
+
if (failure !== undefined) {
|
|
117
130
|
for (const waiting of lane.queue.splice(0))
|
|
118
131
|
finish(waiting, () => waiting.fail(failure));
|
|
132
|
+
}
|
|
119
133
|
this.#pump(lane);
|
|
120
134
|
}
|
|
121
135
|
}
|
|
@@ -148,7 +162,9 @@ class WorkerPool {
|
|
|
148
162
|
}
|
|
149
163
|
if (lane.running !== pending || lane.worker === undefined)
|
|
150
164
|
return;
|
|
151
|
-
log.warn(`the store's ${lane.mode} worker ran '${pending.job.op}' past its request's deadline`, {
|
|
165
|
+
log.warn(`the store's ${lane.mode} worker ran '${pending.job.op}' past its request's deadline`, {
|
|
166
|
+
requestId: pending.job.requestId,
|
|
167
|
+
});
|
|
152
168
|
if (lane.mode === 'read')
|
|
153
169
|
this.#stopReader(lane, lane.worker, pending);
|
|
154
170
|
else
|
|
@@ -160,13 +176,15 @@ class WorkerPool {
|
|
|
160
176
|
lane.stopping = worker;
|
|
161
177
|
terminateLogged(worker);
|
|
162
178
|
}
|
|
163
|
-
// Before its commit flag a stopped write is a known rollback; after it the thread is left to finish, since stopping
|
|
179
|
+
// Before its commit flag a stopped write is a known rollback; after it the thread is left to finish, since stopping
|
|
180
|
+
// it could not undo the write.
|
|
164
181
|
#stopWriter(lane, worker, pending) {
|
|
165
182
|
if (!mayHaveCommitted(lane, pending)) {
|
|
166
183
|
lane.stopping = worker;
|
|
167
184
|
this.terminateWriter();
|
|
168
185
|
}
|
|
169
|
-
// A statement in flight runs to its end even after the stop, so the caller waits for the thread's own word only
|
|
186
|
+
// A statement in flight runs to its end even after the stop, so the caller waits for the thread's own word only
|
|
187
|
+
// this long.
|
|
170
188
|
pending.timer = setTimeout(() => finish(pending, () => pending.fail(new DeadlineExceededError(WRITE_UNKNOWN))), this.#writeGraceMs);
|
|
171
189
|
pending.timer.unref();
|
|
172
190
|
}
|
|
@@ -187,8 +205,9 @@ class WorkerPool {
|
|
|
187
205
|
async close() {
|
|
188
206
|
this.#closed = true;
|
|
189
207
|
for (const lane of [this.#writer, ...this.#readers]) {
|
|
190
|
-
for (const pending of lane.queue.splice(0))
|
|
208
|
+
for (const pending of lane.queue.splice(0)) {
|
|
191
209
|
finish(pending, () => pending.fail(new StoreBusyError(EXECUTOR_CLOSED)));
|
|
210
|
+
}
|
|
192
211
|
// An idle thread is unreferenced, and the process must not end before the thread has closed its connection.
|
|
193
212
|
lane.worker?.ref();
|
|
194
213
|
// Read after the reply of a job still running; the thread then closes its connection and ends.
|
|
@@ -209,7 +228,14 @@ class WorkerPool {
|
|
|
209
228
|
// Setup comes first: a reader sent a job before it would open a store whose setup it cannot write.
|
|
210
229
|
if (lane.mode === 'read' && this.#setup !== 'done')
|
|
211
230
|
return;
|
|
212
|
-
|
|
231
|
+
let next = lane.queue.shift();
|
|
232
|
+
// Its request was abandoned while it waited, so no one is left to read what it would do.
|
|
233
|
+
while (next?.signal?.aborted) {
|
|
234
|
+
workerCounts.jobsExpired += 1;
|
|
235
|
+
const dropped = next;
|
|
236
|
+
finish(dropped, () => dropped.fail(new StoreBusyError(EXPIRED_WAITING)));
|
|
237
|
+
next = lane.queue.shift();
|
|
238
|
+
}
|
|
213
239
|
if (next === undefined)
|
|
214
240
|
return;
|
|
215
241
|
// Started by the first call and never at boot, so a server that only answers /health opens no thread.
|
|
@@ -219,7 +245,10 @@ class WorkerPool {
|
|
|
219
245
|
// An idle thread never keeps the process alive; one with a call in flight does.
|
|
220
246
|
lane.worker.ref();
|
|
221
247
|
try {
|
|
222
|
-
lane.worker.postMessage({
|
|
248
|
+
lane.worker.postMessage({
|
|
249
|
+
...next.job,
|
|
250
|
+
walPages: autoCheckpointPages(getHippoDbPath(this.#hippoRoot)),
|
|
251
|
+
});
|
|
223
252
|
}
|
|
224
253
|
catch (err) {
|
|
225
254
|
// Arguments that cannot be copied to the thread fail this call alone.
|
|
@@ -233,11 +262,18 @@ class WorkerPool {
|
|
|
233
262
|
worker.unref();
|
|
234
263
|
}
|
|
235
264
|
#start(lane) {
|
|
236
|
-
// A fresh flag per thread: a job id left by the thread before it could match no later job, but a shared buffer
|
|
265
|
+
// A fresh flag per thread: a job id left by the thread before it could match no later job, but a shared buffer
|
|
266
|
+
// would outlive its writer.
|
|
237
267
|
const shared = lane.mode === 'write' ? new SharedArrayBuffer(4) : undefined;
|
|
238
268
|
lane.commitFlag = shared && new Int32Array(shared);
|
|
239
|
-
const init = {
|
|
240
|
-
|
|
269
|
+
const init = {
|
|
270
|
+
hippoRoot: this.#hippoRoot,
|
|
271
|
+
mode: lane.mode,
|
|
272
|
+
busyWaitMs: this.#busyWaitMs,
|
|
273
|
+
...(shared && { commitFlag: shared }),
|
|
274
|
+
};
|
|
275
|
+
// An explicit execArgv keeps the parent's loaders out of the thread and silences its repeat of the node:sqlite
|
|
276
|
+
// warning.
|
|
241
277
|
const worker = new Worker(WORKER_ENTRY, { env: SHARE_ENV, execArgv: ['--no-warnings'], workerData: init });
|
|
242
278
|
worker.unref();
|
|
243
279
|
worker.on('message', (reply) => this.#settle(lane, worker, reply));
|
|
@@ -265,7 +301,8 @@ class WorkerPool {
|
|
|
265
301
|
this.#idle(lane, worker);
|
|
266
302
|
this.#pump(lane);
|
|
267
303
|
}
|
|
268
|
-
// The lane keeps a stopped thread until it has exited, so a new thread never starts while the old one may still hold
|
|
304
|
+
// The lane keeps a stopped thread until it has exited, so a new thread never starts while the old one may still hold
|
|
305
|
+
// the write lock.
|
|
269
306
|
#retire(lane, worker, cause) {
|
|
270
307
|
if (lane.worker !== worker)
|
|
271
308
|
return;
|
|
@@ -278,7 +315,8 @@ class WorkerPool {
|
|
|
278
315
|
const lost = lane.running === undefined ? lane.queue.splice(0) : [lane.running, ...lane.queue.splice(0)];
|
|
279
316
|
lane.running = undefined;
|
|
280
317
|
if (lost.length > 0 || cause !== undefined) {
|
|
281
|
-
log.warn(`the store's ${lane.mode} worker stopped with ${lost.length} call(s)
|
|
318
|
+
log.warn(`the store's ${lane.mode} worker stopped with ${lost.length} call(s) ` +
|
|
319
|
+
`unanswered${cause === undefined ? '' : `: ${cause.message}`}`);
|
|
282
320
|
}
|
|
283
321
|
// The server answers this class as its retryable 503.
|
|
284
322
|
for (const pending of lost)
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { MemoryEntry } from '../../core/memory.js';
|
|
2
|
+
import type { PromoteOptions } from '../port/promotion.js';
|
|
3
|
+
/** Copies a local memory to the global store and returns the copy, which gets a new `g_` id so it cannot collide. */
|
|
4
|
+
export declare function copyToGlobal(localRoot: string, id: string, opts?: PromoteOptions): MemoryEntry;
|
|
5
|
+
//# sourceMappingURL=global-promote.d.ts.map
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// Copies a local memory into the global store; the caller embeds the copy.
|
|
2
|
+
import { BadRequestError, NotFoundError } from '../../core/api-errors.js';
|
|
3
|
+
import { generateId } from '../../core/memory.js';
|
|
4
|
+
import { isPersonalScope } from '../../core/recall-scope.js';
|
|
5
|
+
import { fallbackOrigin, resolveGlobalRootDir } from '../../core/project-identity.js';
|
|
6
|
+
import { isSharedStore } from '../../core/config.js';
|
|
7
|
+
import { detectSecret } from '../../util/secret-detect.js';
|
|
8
|
+
import { initStore } from '../open.js';
|
|
9
|
+
import { writePromotedEntry } from '../entry-writes.js';
|
|
10
|
+
import { readEntry } from '../entry-reads.js';
|
|
11
|
+
import { isQuarantineScope } from '../quarantine.js';
|
|
12
|
+
function assertPromotable(id, entry) {
|
|
13
|
+
// Same quarantine veto as shareMemory; a promoted copy would have no quarantine record to review.
|
|
14
|
+
if (isQuarantineScope(entry.scope)) {
|
|
15
|
+
throw new BadRequestError(`Refusing to promote ${id}: it is quarantined pending review. Approve it first via 'hippo quarantine approve ` +
|
|
16
|
+
`${id}'.`);
|
|
17
|
+
}
|
|
18
|
+
if (isPersonalScope(entry.scope ?? null)) {
|
|
19
|
+
throw new BadRequestError(`Refusing to promote ${id}: it is a personal memory and stays with its owner on this server.`);
|
|
20
|
+
}
|
|
21
|
+
// Secret producer veto: promote is a producer path to the global store
|
|
22
|
+
// exactly like shareMemory - same hard rule.
|
|
23
|
+
const promoteSecret = detectSecret(entry);
|
|
24
|
+
if (promoteSecret.flagged) {
|
|
25
|
+
throw new BadRequestError(`Refusing to promote ${id} to the global store: content matches secret material (${promoteSecret.reason}). ` +
|
|
26
|
+
`Secrets stay in their owning project's store.`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/** Copies a local memory to the global store and returns the copy, which gets a new `g_` id so it cannot collide. */
|
|
30
|
+
export function copyToGlobal(localRoot, id, opts) {
|
|
31
|
+
const entry = readEntry(localRoot, id, opts?.tenantId);
|
|
32
|
+
if (!entry)
|
|
33
|
+
throw new NotFoundError(`Memory not found: ${id}`);
|
|
34
|
+
assertPromotable(id, entry);
|
|
35
|
+
const globalRoot = resolveGlobalRootDir();
|
|
36
|
+
initStore(globalRoot);
|
|
37
|
+
// A project store's NULL row gets its folder back; a shared store's folder is no caller's project, so NULL stays and
|
|
38
|
+
// the label names no path.
|
|
39
|
+
const globalEntry = {
|
|
40
|
+
...entry,
|
|
41
|
+
id: generateId('g'),
|
|
42
|
+
source: isSharedStore(localRoot) ? `shared::${new Date().toISOString()}` : `promoted:${localRoot}`,
|
|
43
|
+
origin_project: entry.origin_project ?? fallbackOrigin(localRoot),
|
|
44
|
+
};
|
|
45
|
+
writePromotedEntry(globalRoot, globalEntry, { actor: opts?.actor, sourceId: id, auditAs: opts?.auditAs });
|
|
46
|
+
return globalEntry;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=global-promote.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Goals } from '../port-groups.js';
|
|
2
|
+
import type { Sync } from '../port.js';
|
|
3
|
+
export declare function sqliteGoals(hippoRoot: string): Sync<Goals>;
|
|
4
|
+
/** The group as a served store answers it: a throw rejects as another store's would. */
|
|
5
|
+
export declare function servedGoals(sync: Sync<Goals>): Goals;
|
|
6
|
+
//# sourceMappingURL=goals-group.d.ts.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// hippo.db's Goals group: the goal stack's writes and the every-status listing.
|
|
2
|
+
import { completeGoal, getSessionGoals, pushGoal, resumeGoal, suspendGoal } from '../goals.js';
|
|
3
|
+
export function sqliteGoals(hippoRoot) {
|
|
4
|
+
return {
|
|
5
|
+
push: (tenantId, goal) => pushGoal(hippoRoot, { ...goal, tenantId }),
|
|
6
|
+
sessionGoals: (tenantId, sessionId) => getSessionGoals(hippoRoot, { sessionId, tenantId }),
|
|
7
|
+
// Goal ids are not tenant-scoped in hippo.db, so these ignore the tenant; the api checks the host admin.
|
|
8
|
+
complete: (_tenantId, goalId, opts) => completeGoal(hippoRoot, goalId, opts),
|
|
9
|
+
suspend: (_tenantId, goalId) => suspendGoal(hippoRoot, goalId),
|
|
10
|
+
resume: (_tenantId, goalId) => resumeGoal(hippoRoot, goalId),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/** The group as a served store answers it: a throw rejects as another store's would. */
|
|
14
|
+
export function servedGoals(sync) {
|
|
15
|
+
return {
|
|
16
|
+
push: async (tenantId, goal) => sync.push(tenantId, goal),
|
|
17
|
+
sessionGoals: async (tenantId, sessionId) => sync.sessionGoals(tenantId, sessionId),
|
|
18
|
+
complete: async (tenantId, goalId, opts) => sync.complete(tenantId, goalId, opts),
|
|
19
|
+
suspend: async (tenantId, goalId) => sync.suspend(tenantId, goalId),
|
|
20
|
+
resume: async (tenantId, goalId) => sync.resume(tenantId, goalId),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=goals-group.js.map
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { GraphReads, Sync } from '../port.js';
|
|
2
2
|
export declare function sqliteGraphReads(hippoRoot: string): Sync<GraphReads>;
|
|
3
|
-
/** The group as a served store answers it: the call runs at once and resolves through a Promise, so a throw rejects as
|
|
3
|
+
/** The group as a served store answers it: the call runs at once and resolves through a Promise, so a throw rejects as
|
|
4
|
+
* another store's would. */
|
|
4
5
|
export declare function servedGraphReads(sync: Sync<GraphReads>): GraphReads;
|
|
5
6
|
//# sourceMappingURL=graph-reads-group.d.ts.map
|
|
@@ -11,7 +11,8 @@ export function sqliteGraphReads(hippoRoot) {
|
|
|
11
11
|
})),
|
|
12
12
|
};
|
|
13
13
|
}
|
|
14
|
-
/** The group as a served store answers it: the call runs at once and resolves through a Promise, so a throw rejects as
|
|
14
|
+
/** The group as a served store answers it: the call runs at once and resolves through a Promise, so a throw rejects as
|
|
15
|
+
* another store's would. */
|
|
15
16
|
export function servedGraphReads(sync) {
|
|
16
17
|
return { graphRows: async (tenantId, query) => sync.graphRows(tenantId, query) };
|
|
17
18
|
}
|
|
@@ -1,9 +1,17 @@
|
|
|
1
|
+
import { type HippoStore } from '../port.js';
|
|
1
2
|
/** What the server calls around its responses to keep its store connection. */
|
|
2
3
|
export interface StoreHolder {
|
|
3
4
|
hold: () => void;
|
|
4
5
|
afterResponse: () => void;
|
|
5
6
|
release: () => Promise<void>;
|
|
7
|
+
/** Runs one request in the server's scope, inside the fence that keeps hippo.db shut when the store is not it. */
|
|
8
|
+
runRequest: (run: () => Promise<void>) => Promise<void>;
|
|
6
9
|
}
|
|
7
10
|
/** Holds a connection to the hippo.db under `hippoRoot` once it exists, so serving never creates one. */
|
|
8
11
|
export declare function holdSqliteConnection(hippoRoot: string): StoreHolder;
|
|
12
|
+
/** The holder for the store a server serves: hippo.db's held connection, else a fence that keeps hippo.db shut. */
|
|
13
|
+
export declare function createStoreHolder(hippoRoot: string, store: HippoStore): StoreHolder;
|
|
14
|
+
/** Runs a route's store work off the event loop when the store has a worker, else in place. */
|
|
15
|
+
export declare function offLoopFor(store: HippoStore): <T>(run: () => T) => T;
|
|
16
|
+
export declare function outsideRouteBlock<A extends readonly unknown[], R>(resolver: ((...args: A) => R) | undefined): ((...args: A) => R) | undefined;
|
|
9
17
|
//# sourceMappingURL=held-connection.d.ts.map
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
// A served hippo.db keeps one connection open for the life of the server, beside the worker that checkpoints its WAL.
|
|
2
2
|
import { existsSync } from 'node:fs';
|
|
3
|
-
import { closeHippoDb, getHippoDbPath, openHippoDb, outsideRequestStores, outsideSqliteOffLoop, SERVER_DB_WAIT_MS, } from '../../db/index.js';
|
|
3
|
+
import { closeHippoDb, getHippoDbPath, openHippoDb, outsideRequestStores, outsideSqliteOffLoop, SERVER_DB_WAIT_MS, withSqliteBlocked, withSqliteOffLoop, } from '../../db/index.js';
|
|
4
|
+
import { hasGroup } from '../port.js';
|
|
5
|
+
import { runSqliteRequest } from './request-scope.js';
|
|
6
|
+
import { runsOffLoop } from './worker-store.js';
|
|
4
7
|
import { startWalCheckpointer } from '../../db/wal-checkpointer.js';
|
|
5
|
-
import { errorMessage, log } from '../../util/log.js';
|
|
8
|
+
import { errorMessage, log, errorFields } from '../../util/log.js';
|
|
6
9
|
/** Holds a connection to the hippo.db under `hippoRoot` once it exists, so serving never creates one. */
|
|
7
10
|
export function holdSqliteConnection(hippoRoot) {
|
|
8
11
|
// Handlers open and close their own connections; while this one is held, none of those closes is SQLite's last,
|
|
@@ -14,14 +17,15 @@ export function holdSqliteConnection(hippoRoot) {
|
|
|
14
17
|
if (heldDb || stopHolding || !existsSync(getHippoDbPath(hippoRoot)))
|
|
15
18
|
return;
|
|
16
19
|
try {
|
|
17
|
-
// The 'finish' listener can fire inside a request scope (closing this connection with the request) and inside a
|
|
18
|
-
// The server's lock wait: this open runs on the event loop, where
|
|
20
|
+
// The 'finish' listener can fire inside a request scope (closing this connection with the request) and inside a
|
|
21
|
+
// `loop: 'off'` block (refusing the open). The server's lock wait: this open runs on the event loop, where
|
|
22
|
+
// SQLite's 5 s default and the 30 s journal-mode retry would stall every request.
|
|
19
23
|
heldDb = outsideSqliteOffLoop(() => outsideRequestStores(() => openHippoDb(hippoRoot, { busyWaitMs: SERVER_DB_WAIT_MS })));
|
|
20
24
|
checkpointer = startWalCheckpointer(getHippoDbPath(hippoRoot));
|
|
21
25
|
}
|
|
22
26
|
catch (err) {
|
|
23
27
|
stopHolding = true;
|
|
24
|
-
log.warn(`serve: could not hold a store connection; requests still work, only slower: ${errorMessage(err)}
|
|
28
|
+
log.warn(`serve: could not hold a store connection; requests still work, only slower: ${errorMessage(err)}`, errorFields(err));
|
|
25
29
|
}
|
|
26
30
|
};
|
|
27
31
|
const afterResponse = () => {
|
|
@@ -30,12 +34,35 @@ export function holdSqliteConnection(hippoRoot) {
|
|
|
30
34
|
};
|
|
31
35
|
const release = async () => {
|
|
32
36
|
stopHolding = true;
|
|
33
|
-
// The worker's connection closes first, so the held one is SQLite's last and its close checkpoints and deletes the
|
|
37
|
+
// The worker's connection closes first, so the held one is SQLite's last and its close checkpoints and deletes the
|
|
38
|
+
// WAL.
|
|
34
39
|
await checkpointer?.stop();
|
|
35
40
|
if (heldDb)
|
|
36
41
|
closeHippoDb(heldDb);
|
|
37
42
|
heldDb = undefined;
|
|
38
43
|
};
|
|
39
|
-
return { hold, afterResponse, release };
|
|
44
|
+
return { hold, afterResponse, release, runRequest: (run) => runSqliteRequest(run, 'server') };
|
|
45
|
+
}
|
|
46
|
+
/** The holder for the store a server serves: hippo.db's held connection, else a fence that keeps hippo.db shut. */
|
|
47
|
+
export function createStoreHolder(hippoRoot, store) {
|
|
48
|
+
if (hasGroup(store, 'localFiles'))
|
|
49
|
+
return holdSqliteConnection(hippoRoot);
|
|
50
|
+
log.info(`serve: the '${store.kind}' store serves ${hippoRoot}, so no hippo.db connection is held`);
|
|
51
|
+
// A missed port under another store would otherwise create and write a hippo.db that store never reads.
|
|
52
|
+
return {
|
|
53
|
+
hold: () => { },
|
|
54
|
+
afterResponse: () => { },
|
|
55
|
+
release: async () => { },
|
|
56
|
+
runRequest: (run) => runSqliteRequest(() => withSqliteBlocked(store.kind, run), 'server'),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/** Runs a route's store work off the event loop when the store has a worker, else in place. */
|
|
60
|
+
export function offLoopFor(store) {
|
|
61
|
+
return runsOffLoop(store) ? withSqliteOffLoop : (run) => run();
|
|
62
|
+
}
|
|
63
|
+
// A plugin's resolver may read hippo.db through this package's synchronous functions, so it runs outside the block of a
|
|
64
|
+
// `loop: 'off'` route.
|
|
65
|
+
export function outsideRouteBlock(resolver) {
|
|
66
|
+
return resolver && ((...args) => outsideSqliteOffLoop(() => resolver(...args)));
|
|
40
67
|
}
|
|
41
68
|
//# sourceMappingURL=held-connection.js.map
|