hippo-memory 1.69.0 → 1.71.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 +5 -2
- package/dist/agent-memories/apply.d.ts +3 -3
- package/dist/agent-memories/apply.js +16 -31
- package/dist/agent-memories/claude-code.d.ts +5 -5
- package/dist/agent-memories/claude-code.js +25 -12
- package/dist/agent-memories/copilot.js +3 -2
- package/dist/agent-memories/files.js +26 -14
- package/dist/agent-memories/gemini.js +6 -5
- package/dist/agent-memories/keys.js +3 -2
- package/dist/agent-memories/legacy.d.ts +2 -2
- package/dist/agent-memories/legacy.js +2 -2
- package/dist/agent-memories/markdown.d.ts +1 -3
- package/dist/agent-memories/markdown.js +1 -3
- package/dist/agent-memories/report.d.ts +1 -1
- package/dist/agent-memories/report.js +3 -2
- package/dist/agent-memories/source.d.ts +1 -1
- package/dist/agent-memories/source.js +6 -5
- package/dist/agent-memories/sync.d.ts +5 -3
- package/dist/agent-memories/sync.js +34 -38
- package/dist/agent-memories/types.d.ts +1 -1
- package/dist/api/assemble.d.ts +9 -46
- package/dist/api/assemble.js +44 -54
- package/dist/api/audit.d.ts +8 -7
- package/dist/api/audit.js +15 -21
- package/dist/api/auth.d.ts +17 -39
- package/dist/api/auth.js +76 -216
- package/dist/api/auto-sleep.d.ts +13 -0
- package/dist/api/auto-sleep.js +32 -0
- package/dist/{availability.d.ts → api/availability.d.ts} +4 -17
- package/dist/{availability.js → api/availability.js} +14 -44
- package/dist/{context-auto.js → api/context-auto.js} +2 -1
- package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
- package/dist/{context-render.js → api/context-render.js} +7 -6
- package/dist/api/context-select.d.ts +5 -5
- package/dist/api/context-select.js +39 -48
- package/dist/api/context-types.d.ts +15 -40
- package/dist/api/context.d.ts +7 -26
- package/dist/api/context.js +67 -97
- package/dist/api/dormant.d.ts +7 -23
- package/dist/api/dormant.js +40 -128
- package/dist/api/drill-down.d.ts +9 -48
- package/dist/api/drill-down.js +41 -90
- package/dist/api/forget.d.ts +5 -33
- package/dist/api/forget.js +17 -73
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +2 -2
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +28 -0
- package/dist/api/index.js +31 -0
- package/dist/api/instruction-detect.js +85 -0
- package/dist/api/learn.js +63 -55
- package/dist/api/ledger-db.d.ts +21 -0
- package/dist/api/ledger-db.js +81 -0
- package/dist/api/memories.d.ts +5 -0
- package/dist/api/memories.js +7 -0
- package/dist/api/objects.d.ts +9 -0
- package/dist/api/objects.js +11 -0
- package/dist/api/on-store.d.ts +16 -0
- package/dist/api/on-store.js +38 -0
- package/dist/api/outcome.d.ts +5 -42
- package/dist/api/outcome.js +15 -80
- package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
- package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
- package/dist/api/predictions.d.ts +9 -0
- package/dist/api/predictions.js +18 -0
- package/dist/api/promote.d.ts +16 -31
- package/dist/api/promote.js +38 -123
- package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +11 -11
- package/dist/{prompt-hook.js → api/prompt-hook.js} +42 -60
- package/dist/api/quarantine.d.ts +5 -5
- package/dist/api/quarantine.js +30 -106
- package/dist/api/recall-cli.d.ts +55 -0
- package/dist/api/recall-cli.js +94 -0
- package/dist/api/recall-core.d.ts +4 -0
- package/dist/api/recall-core.js +120 -0
- package/dist/api/recall-finish.d.ts +53 -0
- package/dist/api/recall-finish.js +30 -0
- package/dist/api/recall-history.d.ts +64 -0
- package/dist/api/recall-history.js +159 -0
- package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +7 -8
- package/dist/{recall-pipeline.js → api/recall-pipeline.js} +60 -48
- package/dist/api/recall-record.d.ts +10 -13
- package/dist/api/recall-record.js +10 -30
- package/dist/api/recall-request.d.ts +2 -2
- package/dist/api/recall-request.js +3 -3
- package/dist/api/recall-types.d.ts +101 -316
- package/dist/api/recall.d.ts +5 -33
- package/dist/api/recall.js +92 -91
- package/dist/api/refine.d.ts +7 -0
- package/dist/api/refine.js +10 -0
- package/dist/api/remember-local.d.ts +57 -0
- package/dist/api/remember-local.js +90 -0
- package/dist/api/remember.d.ts +27 -12
- package/dist/api/remember.js +42 -46
- package/dist/api/session-owners.d.ts +4 -0
- package/dist/api/session-owners.js +17 -0
- package/dist/api/sleep-run.d.ts +7 -9
- package/dist/api/sleep-run.js +78 -94
- package/dist/api/sleep.d.ts +10 -29
- package/dist/api/tokens.d.ts +5 -12
- package/dist/api/tokens.js +12 -31
- package/dist/api/types.d.ts +8 -31
- package/dist/api/types.js +5 -23
- package/dist/capture/caller-session.d.ts +2 -2
- package/dist/capture/caller-session.js +8 -8
- package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
- package/dist/{capture-error.js → capture/capture-error.js} +7 -7
- package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
- package/dist/capture/command.d.ts +5 -13
- package/dist/capture/command.js +57 -60
- package/dist/capture/compact-resume-caller.d.ts +1 -1
- package/dist/capture/compact-resume-caller.js +7 -7
- package/dist/capture/compact.d.ts +8 -16
- package/dist/capture/compact.js +56 -47
- package/dist/capture/compaction-items-caller.d.ts +1 -1
- package/dist/capture/compaction-items-caller.js +7 -5
- package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
- package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
- package/dist/{compaction-record.js → capture/compaction-record.js} +143 -157
- package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +1 -1
- package/dist/{compaction-spool.js → capture/compaction-spool.js} +18 -14
- package/dist/capture/copilot-transcript.js +1 -1
- package/dist/capture/extract.js +2 -2
- package/dist/capture/failure-caller.d.ts +2 -2
- package/dist/capture/failure-caller.js +6 -6
- package/dist/capture/failure-reading.d.ts +2 -5
- package/dist/capture/failure-reading.js +11 -12
- package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
- package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
- package/dist/capture/pre-compact-caller.d.ts +1 -1
- package/dist/capture/pre-compact-caller.js +2 -2
- package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +2 -6
- package/dist/{session-digest.js → capture/session-digest.js} +29 -29
- package/dist/capture/session-end-caller.d.ts +2 -2
- package/dist/capture/session-end-caller.js +1 -1
- package/dist/capture/session-texts.d.ts +1 -1
- package/dist/capture/session-texts.js +5 -5
- package/dist/capture/session-worker.js +6 -4
- package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
- package/dist/capture/transcript.d.ts +2 -10
- package/dist/capture/transcript.js +72 -92
- package/dist/capture/working-state.d.ts +0 -3
- package/dist/capture/working-state.js +7 -7
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +28 -0
- package/dist/cli/audit-prune.js +40 -0
- package/dist/cli/audit.d.ts +2 -2
- package/dist/cli/audit.js +92 -88
- package/dist/cli/auth.d.ts +2 -1
- package/dist/cli/auth.js +69 -53
- package/dist/cli/briefs.d.ts +4 -3
- package/dist/cli/briefs.js +76 -202
- package/dist/cli/card.d.ts +2 -1
- package/dist/cli/card.js +55 -54
- package/dist/cli/client.d.ts +28 -0
- package/dist/{client.js → cli/client.js} +25 -44
- package/dist/cli/compact-resume-payload.d.ts +8 -0
- package/dist/cli/compact-resume-payload.js +40 -0
- package/dist/cli/context.d.ts +1 -13
- package/dist/cli/context.js +51 -77
- package/dist/cli/continuity.d.ts +6 -5
- package/dist/cli/continuity.js +153 -145
- package/dist/cli/correction-latency.d.ts +24 -0
- package/dist/{correction-latency.js → cli/correction-latency.js} +2 -14
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +226 -222
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +70 -52
- package/dist/cli/decisions.d.ts +4 -3
- package/dist/cli/decisions.js +129 -253
- package/dist/cli/eval.d.ts +1 -3
- package/dist/cli/eval.js +56 -42
- package/dist/cli/exit.d.ts +6 -0
- package/dist/cli/exit.js +11 -0
- package/dist/cli/explain.d.ts +1 -2
- package/dist/cli/explain.js +39 -21
- package/dist/cli/flag-values.d.ts +30 -0
- package/dist/cli/flag-values.js +120 -0
- package/dist/cli/flags.d.ts +304 -0
- package/dist/cli/flags.js +169 -0
- package/dist/cli/github.d.ts +14 -0
- package/dist/cli/github.js +184 -0
- package/dist/cli/goals.d.ts +2 -1
- package/dist/cli/goals.js +76 -75
- package/dist/cli/hook-runtime.d.ts +31 -0
- package/dist/cli/hook-runtime.js +139 -0
- package/dist/cli/init.d.ts +2 -1
- package/dist/cli/init.js +153 -126
- package/dist/cli/install-steps.d.ts +7 -0
- package/dist/cli/install-steps.js +101 -0
- package/dist/cli/last-sleep.d.ts +3 -1
- package/dist/cli/last-sleep.js +12 -7
- package/dist/cli/maintenance.d.ts +5 -4
- package/dist/cli/maintenance.js +41 -42
- package/dist/cli/object-verbs.d.ts +40 -0
- package/dist/cli/object-verbs.js +66 -0
- package/dist/cli/owner-validation.d.ts +18 -0
- package/dist/cli/owner-validation.js +33 -0
- package/dist/cli/playbooks.d.ts +4 -3
- package/dist/cli/playbooks.js +98 -306
- package/dist/cli/print.d.ts +15 -0
- package/dist/cli/print.js +82 -0
- package/dist/cli/projects.d.ts +2 -3
- package/dist/cli/projects.js +56 -51
- package/dist/cli/provenance-coverage.d.ts +14 -0
- package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +2 -6
- package/dist/cli/quality-repair-once.js +4 -4
- package/dist/cli/recall.d.ts +2 -6
- package/dist/cli/recall.js +128 -253
- package/dist/cli/refine-llm.d.ts +35 -0
- package/dist/cli/refine-llm.js +128 -0
- package/dist/cli/remember.d.ts +4 -6
- package/dist/cli/remember.js +193 -230
- package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +4 -17
- package/dist/{scheduler.js → cli/scheduler.js} +22 -22
- package/dist/cli/serve.d.ts +1 -1
- package/dist/cli/serve.js +46 -7
- package/dist/cli/session-hooks.d.ts +11 -19
- package/dist/cli/session-hooks.js +263 -258
- package/dist/cli/setup.d.ts +4 -3
- package/dist/cli/setup.js +55 -37
- package/dist/cli/shared.d.ts +14 -118
- package/dist/cli/shared.js +26 -400
- package/dist/cli/slack.d.ts +2 -1
- package/dist/cli/slack.js +46 -74
- package/dist/cli/sleep-render.d.ts +4 -0
- package/dist/cli/sleep-render.js +61 -0
- package/dist/cli/sleep.d.ts +3 -8
- package/dist/cli/sleep.js +34 -91
- package/dist/cli/status.d.ts +9 -12
- package/dist/cli/status.js +86 -131
- package/dist/{stdin.d.ts → cli/stdin.d.ts} +4 -6
- package/dist/{stdin.js → cli/stdin.js} +8 -9
- package/dist/cli/transfer.d.ts +9 -9
- package/dist/cli/transfer.js +125 -122
- package/dist/cli/usage.js +13 -5
- package/dist/cli.d.ts +69 -167
- package/dist/cli.js +187 -296
- package/dist/connectors/dlq.d.ts +44 -0
- package/dist/connectors/dlq.js +30 -0
- package/dist/connectors/github/backfill.d.ts +6 -26
- package/dist/connectors/github/backfill.js +42 -114
- package/dist/connectors/github/deletion.d.ts +6 -21
- package/dist/connectors/github/deletion.js +17 -64
- package/dist/connectors/github/dlq.d.ts +12 -91
- package/dist/connectors/github/dlq.js +23 -140
- package/dist/connectors/github/ingest.d.ts +4 -37
- package/dist/connectors/github/ingest.js +24 -93
- package/dist/connectors/github/octokit-client.d.ts +5 -17
- package/dist/connectors/github/octokit-client.js +29 -25
- package/dist/connectors/github/ratelimit.d.ts +3 -14
- package/dist/connectors/github/ratelimit.js +3 -14
- package/dist/connectors/github/scope.d.ts +3 -5
- package/dist/connectors/github/scope.js +3 -5
- package/dist/connectors/github/signature.d.ts +4 -26
- package/dist/connectors/github/signature.js +4 -26
- package/dist/connectors/github/tenant-routing.d.ts +4 -26
- package/dist/connectors/github/tenant-routing.js +13 -61
- package/dist/connectors/github/transform.d.ts +1 -1
- package/dist/connectors/github/transform.js +2 -16
- package/dist/connectors/github/types.d.ts +4 -16
- package/dist/connectors/github/types.js +17 -27
- package/dist/connectors/github/webhook.d.ts +5 -18
- package/dist/connectors/github/webhook.js +86 -105
- package/dist/connectors/slack/backfill.d.ts +5 -18
- package/dist/connectors/slack/backfill.js +9 -42
- package/dist/connectors/slack/deletion.d.ts +4 -7
- package/dist/connectors/slack/deletion.js +20 -49
- package/dist/connectors/slack/dlq.d.ts +9 -68
- package/dist/connectors/slack/dlq.js +26 -136
- package/dist/connectors/slack/ingest.d.ts +4 -18
- package/dist/connectors/slack/ingest.js +26 -91
- package/dist/connectors/slack/scope.d.ts +2 -8
- package/dist/connectors/slack/scope.js +2 -8
- package/dist/connectors/slack/signature.d.ts +1 -6
- package/dist/connectors/slack/signature.js +2 -1
- package/dist/connectors/slack/tenant-routing.d.ts +4 -18
- package/dist/connectors/slack/tenant-routing.js +11 -31
- package/dist/connectors/slack/transform.d.ts +3 -19
- package/dist/connectors/slack/transform.js +2 -18
- package/dist/connectors/slack/types.d.ts +4 -10
- package/dist/connectors/slack/types.js +5 -16
- package/dist/connectors/slack/web-client.js +34 -28
- package/dist/connectors/slack/webhook.d.ts +5 -21
- package/dist/connectors/slack/webhook.js +80 -108
- package/dist/connectors/slack/workspaces.d.ts +8 -41
- package/dist/connectors/slack/workspaces.js +8 -58
- package/dist/consolidate/conflicts.d.ts +1 -1
- package/dist/consolidate/conflicts.js +10 -18
- package/dist/consolidate/dag-summary.d.ts +8 -0
- package/dist/consolidate/dag-summary.js +41 -0
- package/dist/{dag.d.ts → consolidate/dag.d.ts} +6 -29
- package/dist/{dag.js → consolidate/dag.js} +49 -131
- package/dist/consolidate/decay.d.ts +2 -2
- package/dist/consolidate/decay.js +35 -41
- package/dist/consolidate/dedupe.d.ts +29 -0
- package/dist/consolidate/dedupe.js +103 -0
- package/dist/consolidate/flush-units.d.ts +5 -6
- package/dist/consolidate/flush-units.js +3 -3
- package/dist/consolidate/half-life-migration.d.ts +34 -0
- package/dist/consolidate/half-life-migration.js +89 -0
- package/dist/consolidate/llm-passes.js +12 -29
- package/dist/consolidate/memory-value-weights.d.ts +8 -0
- package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +2 -13
- package/dist/consolidate/memory-value.d.ts +45 -0
- package/dist/consolidate/memory-value.js +164 -0
- package/dist/consolidate/merge.js +65 -83
- package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
- package/dist/{merged-row.js → consolidate/merged-row.js} +4 -3
- package/dist/consolidate/physics-pass.js +46 -48
- package/dist/consolidate/replay.d.ts +9 -0
- package/dist/consolidate/replay.js +84 -0
- package/dist/consolidate/run.d.ts +7 -13
- package/dist/consolidate/run.js +6 -37
- package/dist/consolidate/sleep.d.ts +2 -9
- package/dist/consolidate/sleep.js +69 -151
- package/dist/consolidate/trace.d.ts +19 -0
- package/dist/{trace.js → consolidate/trace.js} +7 -24
- package/dist/consolidate/traces.js +40 -51
- package/dist/core/ablation.d.ts +15 -0
- package/dist/core/ablation.js +49 -0
- package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
- package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
- package/dist/{ambient.d.ts → core/ambient.d.ts} +1 -8
- package/dist/{ambient.js → core/ambient.js} +13 -18
- package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +16 -3
- package/dist/{capture-contract.js → core/capture-contract.js} +67 -1
- package/dist/{card.d.ts → core/card.d.ts} +4 -1
- package/dist/{card.js → core/card.js} +8 -0
- package/dist/core/compare.d.ts +32 -0
- package/dist/core/compare.js +70 -0
- package/dist/{config.d.ts → core/config.d.ts} +14 -28
- package/dist/{config.js → core/config.js} +101 -75
- package/dist/{handoff.d.ts → core/handoff.d.ts} +1 -7
- package/dist/core/handoff.js +81 -0
- package/dist/{memory-quality.js → core/memory-quality.js} +2 -2
- package/dist/core/memory.d.ts +183 -0
- package/dist/core/memory.js +380 -0
- package/dist/core/package-root.d.ts +3 -0
- package/dist/core/package-root.js +5 -0
- package/dist/{physics-config.d.ts → core/physics-config.d.ts} +1 -4
- package/dist/{physics-config.js → core/physics-config.js} +3 -8
- package/dist/{physics.d.ts → core/physics.d.ts} +16 -62
- package/dist/{physics.js → core/physics.js} +60 -122
- package/dist/{project-identity.d.ts → core/project-identity.d.ts} +17 -63
- package/dist/{project-identity.js → core/project-identity.js} +22 -55
- package/dist/{project-remote.js → core/project-remote.js} +17 -6
- package/dist/{prompt-recall.js → core/prompt-recall.js} +1 -1
- package/dist/core/raw-append-only.d.ts +5 -0
- package/dist/core/raw-append-only.js +7 -0
- package/dist/{salience.d.ts → core/salience.d.ts} +1 -7
- package/dist/{salience.js → core/salience.js} +36 -27
- package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
- package/dist/{search/types.js → core/search-types.js} +1 -1
- package/dist/core/session-digest-row.d.ts +5 -0
- package/dist/core/session-digest-row.js +6 -0
- package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
- package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +7 -7
- package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
- package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
- package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +11 -10
- package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +110 -104
- package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +2 -1
- package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +1 -0
- package/dist/{dashboard.js → dashboard/dashboard.js} +172 -55
- package/dist/db/backup.js +1 -1
- package/dist/db/busy.d.ts +19 -2
- package/dist/db/busy.js +88 -14
- package/dist/db/connect.d.ts +11 -2
- package/dist/db/connect.js +43 -10
- package/dist/db/index.d.ts +9 -0
- package/dist/db/index.js +8 -0
- package/dist/db/meta.d.ts +4 -0
- package/dist/db/meta.js +11 -1
- package/dist/db/migrate.d.ts +8 -1
- package/dist/db/migrate.js +28 -33
- package/dist/db/migrations/types.d.ts +2 -5
- package/dist/db/migrations/v08.js +1 -1
- package/dist/db/migrations/v14.js +39 -36
- package/dist/db/migrations/v15.js +2 -8
- package/dist/db/migrations/v16.js +31 -29
- package/dist/db/migrations/v17.js +2 -3
- package/dist/db/migrations/v18.js +6 -5
- package/dist/db/migrations/v19.js +2 -5
- package/dist/db/migrations/v20.js +5 -8
- package/dist/db/migrations/v22.js +28 -38
- package/dist/db/migrations/v23.js +3 -14
- package/dist/db/migrations/v24.js +25 -22
- package/dist/db/migrations/v25.js +3 -8
- package/dist/db/migrations/v26.js +2 -13
- package/dist/db/migrations/v27.js +3 -11
- package/dist/db/migrations/v28.js +2 -14
- package/dist/db/migrations/v29.js +23 -32
- package/dist/db/migrations/v30.js +4 -16
- package/dist/db/migrations/v31.js +23 -31
- package/dist/db/migrations/v32.js +4 -22
- package/dist/db/migrations/v33.js +2 -15
- package/dist/db/migrations/v34.js +2 -11
- package/dist/db/migrations/v35.js +2 -11
- package/dist/db/migrations/v36.js +2 -11
- package/dist/db/migrations/v37.js +8 -33
- package/dist/db/migrations/v38.js +5 -38
- package/dist/db/migrations/v39.js +10 -21
- package/dist/db/migrations/v40.js +8 -14
- package/dist/db/migrations/v41.js +2 -24
- package/dist/db/migrations/v43.js +7 -6
- package/dist/db/migrations/v44.js +2 -8
- package/dist/db/migrations/v45.js +2 -7
- package/dist/db/migrations/v46.js +1 -1
- package/dist/db/migrations/v47.js +2 -3
- package/dist/db/migrations/v48.js +1 -1
- package/dist/db/migrations/v49.js +1 -1
- package/dist/db/migrations/v50.js +8 -7
- package/dist/db/migrations/v51.js +1 -1
- package/dist/db/migrations/v52.js +1 -1
- package/dist/db/open.d.ts +11 -1
- package/dist/db/open.js +37 -4
- package/dist/db/physics-state.d.ts +23 -0
- package/dist/{physics-state.js → db/physics-state.js} +34 -52
- package/dist/db/raw-archive-mirror-cleanup.d.ts +5 -0
- package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +10 -20
- package/dist/db/request-stores.d.ts +15 -2
- package/dist/db/request-stores.js +37 -15
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -0
- package/dist/{vector-store.d.ts → db/vector-store.d.ts} +6 -2
- package/dist/{vector-store.js → db/vector-store.js} +83 -51
- package/dist/db/wal-checkpointer.d.ts +11 -0
- package/dist/db/wal-checkpointer.js +92 -0
- package/dist/doctor.js +176 -152
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.d.ts +1 -1
- package/dist/entry/project-identity.js +1 -1
- package/dist/entry/session-text.d.ts +3 -3
- package/dist/entry/session-text.js +5 -4
- package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +15 -53
- package/dist/{eval-stats.js → eval/eval-stats.js} +24 -51
- package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +3 -14
- package/dist/{eval-suite.js → eval/eval-suite.js} +99 -57
- package/dist/{eval.d.ts → eval/eval.d.ts} +7 -25
- package/dist/{eval.js → eval/eval.js} +35 -55
- package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -6
- package/dist/{judgment.js → eval/judgment.js} +23 -20
- package/dist/extensions/openclaw-plugin/index.js +2 -3
- package/dist/graph/delta.d.ts +3 -2
- package/dist/graph/delta.js +9 -23
- package/dist/{graph-extract.d.ts → graph/extract.d.ts} +10 -32
- package/dist/{graph-extract.js → graph/extract.js} +40 -81
- package/dist/{graph-recall.d.ts → graph/recall.d.ts} +9 -22
- package/dist/{graph-recall.js → graph/recall.js} +65 -108
- package/dist/graph/stream.d.ts +38 -0
- package/dist/{graph-stream.js → graph/stream.js} +20 -41
- package/dist/graph/view.d.ts +50 -0
- package/dist/graph/view.js +265 -0
- package/dist/graph/write.d.ts +4 -76
- package/dist/graph/write.js +13 -397
- package/dist/hooks/codex-session.js +1 -1
- package/dist/hooks/codex-wrapper.js +16 -17
- package/dist/hooks/copilot.d.ts +1 -8
- package/dist/hooks/copilot.js +16 -16
- package/dist/{cli → hooks}/hook-blocks.d.ts +6 -2
- package/dist/{cli → hooks}/hook-blocks.js +38 -125
- package/dist/hooks/json-hooks.d.ts +5 -37
- package/dist/hooks/json-hooks.js +49 -179
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +44 -103
- package/dist/hooks/shared.d.ts +8 -21
- package/dist/hooks/shared.js +30 -25
- package/dist/importers/core.d.ts +13 -42
- package/dist/importers/core.js +48 -64
- package/dist/importers/markdown-parse.d.ts +9 -32
- package/dist/importers/markdown-parse.js +10 -44
- package/dist/importers/markdown.js +5 -13
- package/dist/importers/sources.js +57 -81
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +95 -172
- package/dist/index.d.ts +26 -22
- package/dist/index.js +25 -21
- package/dist/learn/autolearn.d.ts +29 -0
- package/dist/{autolearn.js → learn/autolearn.js} +26 -51
- package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
- package/dist/{churn-git.js → learn/churn-git.js} +6 -4
- package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
- package/dist/learn/extract.js +123 -0
- package/dist/learn/forward-claim-detector.d.ts +12 -0
- package/dist/learn/forward-claim-detector.js +60 -0
- package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +10 -18
- package/dist/{invalidation.js → learn/invalidation.js} +92 -125
- package/dist/mcp/admin-tools.d.ts +1 -1
- package/dist/mcp/admin-tools.js +39 -64
- package/dist/mcp/format.d.ts +5 -5
- package/dist/mcp/format.js +7 -6
- package/dist/mcp/framing.d.ts +6 -0
- package/dist/mcp/framing.js +11 -3
- package/dist/mcp/memory-tools.js +10 -35
- package/dist/mcp/protocol.d.ts +14 -36
- package/dist/mcp/protocol.js +10 -19
- package/dist/mcp/recall-tools.d.ts +2 -2
- package/dist/mcp/recall-tools.js +70 -52
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +71 -85
- package/dist/mcp/server.d.ts +3 -9
- package/dist/mcp/server.js +6 -17
- package/dist/mcp/session-state.d.ts +2 -3
- package/dist/mcp/session-state.js +7 -13
- package/dist/mcp/shared-gate.js +1 -1
- package/dist/mcp/stdio.d.ts +2 -6
- package/dist/mcp/stdio.js +112 -38
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +7 -5
- package/dist/objects/customer-notes.d.ts +44 -0
- package/dist/objects/customer-notes.js +71 -0
- package/dist/objects/decisions.d.ts +41 -0
- package/dist/objects/decisions.js +63 -0
- package/dist/objects/descriptor.d.ts +52 -0
- package/dist/objects/descriptor.js +4 -0
- package/dist/objects/fields.d.ts +15 -0
- package/dist/objects/fields.js +21 -0
- package/dist/objects/incidents.d.ts +45 -0
- package/dist/objects/incidents.js +96 -0
- package/dist/objects/lifecycle.d.ts +27 -0
- package/dist/objects/lifecycle.js +96 -0
- package/dist/objects/policies.d.ts +60 -0
- package/dist/objects/policies.js +102 -0
- package/dist/objects/processes.d.ts +43 -0
- package/dist/objects/processes.js +92 -0
- package/dist/objects/project-briefs.d.ts +63 -0
- package/dist/objects/project-briefs.js +194 -0
- package/dist/objects/skills.d.ts +51 -0
- package/dist/objects/skills.js +110 -0
- package/dist/postinstall.js +10 -21
- package/dist/predictions/planning-fallacy.d.ts +14 -109
- package/dist/predictions/planning-fallacy.js +4 -129
- package/dist/rerankers/clef.d.ts +2 -6
- package/dist/rerankers/clef.js +28 -76
- package/dist/rerankers/cross-encoder.d.ts +0 -7
- package/dist/rerankers/cross-encoder.js +18 -28
- package/dist/rerankers/index.js +8 -7
- package/dist/rerankers/jev.d.ts +1 -4
- package/dist/rerankers/jev.js +36 -52
- package/dist/rerankers/llm.d.ts +2 -13
- package/dist/rerankers/llm.js +42 -59
- package/dist/rerankers/outage-warning.d.ts +8 -0
- package/dist/rerankers/outage-warning.js +32 -0
- package/dist/rerankers/remote.d.ts +4 -0
- package/dist/rerankers/remote.js +25 -0
- package/dist/rerankers/types.d.ts +3 -15
- package/dist/search/as-of.d.ts +1 -1
- package/dist/search/bm25-search.d.ts +2 -2
- package/dist/search/bm25-search.js +7 -7
- package/dist/search/bm25.d.ts +1 -1
- package/dist/search/bm25.js +1 -1
- package/dist/search/boosts.d.ts +5 -3
- package/dist/search/boosts.js +36 -15
- package/dist/search/breakdown.d.ts +2 -2
- package/dist/search/breakdown.js +2 -1
- package/dist/search/explain.d.ts +1 -1
- package/dist/search/explain.js +3 -2
- package/dist/search/finalize.d.ts +2 -2
- package/dist/search/finalize.js +4 -3
- package/dist/search/fusion.d.ts +1 -1
- package/dist/search/fusion.js +3 -3
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +90 -0
- package/dist/search/hybrid-score.d.ts +2 -2
- package/dist/search/hybrid-score.js +1 -1
- package/dist/search/hybrid.d.ts +6 -4
- package/dist/search/hybrid.js +11 -8
- package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
- package/dist/{multihop.js → search/multihop.js} +9 -8
- package/dist/search/path-context.d.ts +11 -0
- package/dist/{path-context.js → search/path-context.js} +8 -19
- package/dist/search/physics-search.d.ts +4 -4
- package/dist/search/physics-search.js +25 -22
- package/dist/search/rerank.d.ts +3 -3
- package/dist/search/rerank.js +4 -3
- package/dist/search/rrf.d.ts +15 -0
- package/dist/search/rrf.js +36 -0
- package/dist/search/temporal.d.ts +1 -1
- package/dist/search/temporal.js +5 -2
- package/dist/search/vector.d.ts +10 -3
- package/dist/search/vector.js +51 -15
- package/dist/server/auth.d.ts +10 -29
- package/dist/server/auth.js +57 -42
- package/dist/server/boot.d.ts +5 -0
- package/dist/server/boot.js +432 -0
- package/dist/server/client-ip.d.ts +8 -20
- package/dist/server/client-ip.js +23 -34
- package/dist/server/cursor.d.ts +1 -1
- package/dist/server/cursor.js +2 -3
- package/dist/server/deadline.d.ts +13 -0
- package/dist/server/deadline.js +45 -0
- package/dist/server/defaults.d.ts +3 -0
- package/dist/server/defaults.js +4 -0
- package/dist/server/key-check-bounds.d.ts +9 -0
- package/dist/server/key-check-bounds.js +46 -0
- package/dist/server/lifecycle.d.ts +5 -4
- package/dist/server/lifecycle.js +20 -5
- package/dist/server/mcp-http.d.ts +1 -4
- package/dist/server/mcp-http.js +44 -68
- package/dist/server/rate-limit.d.ts +21 -0
- package/dist/{rate-limit.js → server/rate-limit.js} +4 -13
- package/dist/server/ready.d.ts +7 -0
- package/dist/server/ready.js +38 -0
- package/dist/server/request.d.ts +14 -12
- package/dist/server/request.js +71 -28
- package/dist/server/route-table.d.ts +15 -0
- package/dist/server/route-table.js +202 -0
- package/dist/server/routes/admin.js +29 -30
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +35 -105
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +45 -115
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +44 -105
- package/dist/server/routes/memories.js +21 -43
- package/dist/server/routes/object-routes.d.ts +35 -0
- package/dist/server/routes/object-routes.js +72 -0
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +42 -134
- package/dist/server/routes/predictions.js +35 -63
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +44 -134
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +41 -120
- package/dist/server/routes/recall.js +21 -44
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +40 -138
- package/dist/server/server-detect.d.ts +28 -0
- package/dist/server/server-detect.js +156 -0
- package/dist/server/sleep-child.d.ts +2 -0
- package/dist/server/sleep-child.js +19 -0
- package/dist/server/sleep-offload.d.ts +20 -0
- package/dist/server/sleep-offload.js +73 -0
- package/dist/server/tls.d.ts +6 -0
- package/dist/server/tls.js +24 -0
- package/dist/server/types.d.ts +35 -14
- package/dist/server/validation.d.ts +6 -5
- package/dist/server/validation.js +16 -34
- package/dist/server.d.ts +39 -61
- package/dist/server.js +26 -569
- package/dist/sharing/global-store.d.ts +19 -0
- package/dist/sharing/global-store.js +75 -0
- package/dist/sharing/global-sync.d.ts +6 -0
- package/dist/sharing/global-sync.js +80 -0
- package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +5 -6
- package/dist/{project-merge.js → sharing/project-merge.js} +34 -51
- package/dist/sharing/scope.d.ts +7 -0
- package/dist/{scope.js → sharing/scope.js} +5 -12
- package/dist/sharing/search-both.d.ts +60 -0
- package/dist/sharing/search-both.js +138 -0
- package/dist/sharing/share.d.ts +38 -0
- package/dist/sharing/share.js +226 -0
- package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
- package/dist/{ambient-store.js → store/ambient.js} +11 -16
- package/dist/store/audit-event.d.ts +15 -17
- package/dist/store/audit-event.js +9 -16
- package/dist/{audit.d.ts → store/audit.d.ts} +29 -8
- package/dist/{audit.js → store/audit.js} +95 -18
- package/dist/{auth.d.ts → store/auth.d.ts} +19 -36
- package/dist/{auth.js → store/auth.js} +108 -99
- package/dist/store/candidates.d.ts +41 -13
- package/dist/store/candidates.js +141 -60
- package/dist/{card-detail.d.ts → store/card-detail.d.ts} +5 -4
- package/dist/{card-detail.js → store/card-detail.js} +3 -2
- package/dist/{store-cards.d.ts → store/cards.d.ts} +26 -16
- package/dist/{store-cards.js → store/cards.js} +133 -248
- package/dist/store/compactions.d.ts +78 -0
- package/dist/store/compactions.js +93 -0
- package/dist/store/conflicts.d.ts +26 -26
- package/dist/store/conflicts.js +194 -222
- package/dist/store/connectors/github.d.ts +84 -0
- package/dist/store/connectors/github.js +180 -0
- package/dist/store/connectors/slack.d.ts +69 -0
- package/dist/store/connectors/slack.js +177 -0
- package/dist/store/dashboard-reads.d.ts +27 -0
- package/dist/store/dashboard-reads.js +88 -0
- package/dist/store/delete-and-batch.d.ts +27 -51
- package/dist/store/delete-and-batch.js +100 -92
- package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +16 -5
- package/dist/{delivery-recorder.js → store/delivery-recorder.js} +60 -38
- package/dist/store/descendant-page.d.ts +12 -0
- package/dist/store/descendant-page.js +99 -0
- package/dist/store/diagnostics.d.ts +47 -0
- package/dist/store/diagnostics.js +44 -0
- package/dist/store/doctor-reads.d.ts +16 -0
- package/dist/store/doctor-reads.js +19 -0
- package/dist/store/dormant.d.ts +105 -0
- package/dist/store/dormant.js +241 -0
- package/dist/store/embeddings/index.d.ts +36 -0
- package/dist/{embeddings.js → store/embeddings/index.js} +104 -224
- package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
- package/dist/{local-embedding.js → store/embeddings/local.js} +69 -75
- package/dist/store/embeddings/provider.d.ts +40 -0
- package/dist/{embedding-provider.js → store/embeddings/provider.js} +78 -91
- package/dist/store/entry-reads.d.ts +66 -63
- package/dist/store/entry-reads.js +159 -121
- package/dist/store/entry-row.d.ts +14 -37
- package/dist/store/entry-row.js +37 -45
- package/dist/store/entry-writes.d.ts +40 -17
- package/dist/store/entry-writes.js +105 -41
- package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
- package/dist/{failure-log.js → store/failure-log.js} +9 -2
- package/dist/store/goals.d.ts +96 -0
- package/dist/store/goals.js +260 -0
- package/dist/store/graph-queue.d.ts +13 -0
- package/dist/store/graph-queue.js +70 -0
- package/dist/store/graph-reads.d.ts +41 -0
- package/dist/{graph/read.js → store/graph-reads.js} +72 -162
- package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +71 -14
- package/dist/{graph/rows.js → store/graph-rows.js} +20 -12
- package/dist/store/graph-view-rows.d.ts +13 -0
- package/dist/store/graph-view-rows.js +68 -0
- package/dist/store/graph-writes.d.ts +33 -0
- package/dist/store/graph-writes.js +232 -0
- package/dist/store/half-life.d.ts +35 -0
- package/dist/store/half-life.js +75 -0
- package/dist/store/handoffs.d.ts +6 -12
- package/dist/store/handoffs.js +54 -63
- package/dist/store/index-and-stats.d.ts +14 -20
- package/dist/store/index-and-stats.js +74 -119
- package/dist/store/index.d.ts +4 -0
- package/dist/store/index.js +3 -0
- package/dist/store/key-audit.d.ts +2 -2
- package/dist/store/key-audit.js +4 -4
- package/dist/store/key-writes.d.ts +12 -5
- package/dist/store/key-writes.js +30 -4
- package/dist/store/ledger-turn.d.ts +17 -0
- package/dist/store/ledger-turn.js +27 -0
- package/dist/store/markdown.d.ts +3 -7
- package/dist/store/markdown.js +25 -23
- package/dist/store/mirrors.d.ts +7 -13
- package/dist/store/mirrors.js +52 -47
- package/dist/store/object-types.d.ts +189 -0
- package/dist/store/object-types.js +4 -0
- package/dist/store/open.d.ts +6 -4
- package/dist/store/open.js +30 -36
- package/dist/store/planning-fallacy-evidence.d.ts +14 -0
- package/dist/store/planning-fallacy-evidence.js +52 -0
- package/dist/store/port.d.ts +649 -0
- package/dist/store/port.js +17 -0
- package/dist/{predictions/store.d.ts → store/predictions.d.ts} +25 -52
- package/dist/{predictions/store.js → store/predictions.js} +88 -184
- package/dist/{quality-repair.js → store/quality-repair.js} +27 -57
- package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
- package/dist/{quarantine.js → store/quarantine.js} +64 -22
- package/dist/store/raw-archive.d.ts +14 -0
- package/dist/{raw-archive.js → store/raw-archive.js} +20 -31
- package/dist/store/recall-scope.d.ts +78 -0
- package/dist/{recall-scope.js → store/recall-scope.js} +23 -84
- package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -81
- package/dist/{recall-trace.js → store/recall-trace.js} +41 -122
- package/dist/store/rejected-values.d.ts +55 -0
- package/dist/store/rejected-values.js +150 -0
- package/dist/store/rejection.d.ts +54 -0
- package/dist/{rejection.js → store/rejection.js} +16 -67
- package/dist/store/report-reads.d.ts +6 -0
- package/dist/store/report-reads.js +29 -0
- package/dist/store/rows.d.ts +11 -22
- package/dist/store/rows.js +52 -43
- package/dist/store/rule-sql.d.ts +5 -0
- package/dist/store/rule-sql.js +37 -0
- package/dist/store/search-rows.d.ts +22 -42
- package/dist/store/search-rows.js +55 -78
- package/dist/store/sessions.d.ts +23 -49
- package/dist/store/sessions.js +96 -118
- package/dist/store/sqlite/commit-watch.d.ts +4 -0
- package/dist/store/sqlite/commit-watch.js +29 -0
- package/dist/store/sqlite/connector-events-group.d.ts +5 -0
- package/dist/store/sqlite/connector-events-group.js +50 -0
- package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
- package/dist/store/sqlite/connector-writes-group.js +65 -0
- package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
- package/dist/store/sqlite/dag-reads-group.js +45 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
- package/dist/store/{entry-writes-group.js → sqlite/entry-writes-group.js} +73 -60
- package/dist/store/sqlite/error-codec.d.ts +17 -0
- package/dist/store/sqlite/error-codec.js +61 -0
- package/dist/store/sqlite/executor-counts.d.ts +10 -0
- package/dist/store/sqlite/executor-counts.js +11 -0
- package/dist/store/sqlite/executor.d.ts +29 -0
- package/dist/store/sqlite/executor.js +287 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
- package/dist/store/sqlite/graph-reads-group.js +18 -0
- package/dist/store/sqlite/local.d.ts +21 -0
- package/dist/store/sqlite/local.js +39 -0
- package/dist/store/sqlite/object-rows.d.ts +102 -0
- package/dist/store/sqlite/object-rows.js +221 -0
- package/dist/store/sqlite/objects-group.d.ts +20 -0
- package/dist/store/sqlite/objects-group.js +316 -0
- package/dist/store/sqlite/predictions-group.d.ts +5 -0
- package/dist/store/sqlite/predictions-group.js +28 -0
- package/dist/store/sqlite/quarantine-group.d.ts +5 -0
- package/dist/store/sqlite/quarantine-group.js +38 -0
- package/dist/store/sqlite/store.d.ts +23 -0
- package/dist/store/sqlite/store.js +294 -0
- package/dist/store/sqlite/vector-pack.d.ts +18 -0
- package/dist/store/sqlite/vector-pack.js +46 -0
- package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
- package/dist/store/sqlite/vector-reads-group.js +23 -0
- package/dist/store/sqlite/worker-entry.d.ts +2 -0
- package/dist/store/sqlite/worker-entry.js +8 -0
- package/dist/store/sqlite/worker-jobs.d.ts +5 -0
- package/dist/store/sqlite/worker-jobs.js +116 -0
- package/dist/store/sqlite/worker-ops.d.ts +135 -0
- package/dist/store/sqlite/worker-ops.js +93 -0
- package/dist/store/sqlite/worker-store.d.ts +8 -0
- package/dist/store/sqlite/worker-store.js +79 -0
- package/dist/store/summaries.d.ts +11 -72
- package/dist/store/summaries.js +47 -186
- package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
- package/dist/{summary-dirty.js → store/summary-dirty.js} +1 -1
- package/dist/store/tenant-lookup.d.ts +6 -1
- package/dist/store/tenant-lookup.js +7 -0
- package/dist/store/tenant.d.ts +11 -0
- package/dist/store/tenant.js +28 -0
- package/dist/store/token-ledger-rows.d.ts +61 -0
- package/dist/store/token-ledger-rows.js +68 -0
- package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +14 -51
- package/dist/{token-ledger.js → store/token-ledger.js} +51 -129
- package/dist/store/tombstone-checks.d.ts +12 -0
- package/dist/store/tombstone-checks.js +31 -0
- package/dist/store/usage-reports.d.ts +7 -0
- package/dist/store/usage-reports.js +18 -0
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +170 -0
- package/dist/{working-memory.d.ts → store/working-memory.d.ts} +11 -26
- package/dist/store/working-memory.js +118 -0
- package/dist/{yaml.d.ts → store/yaml.d.ts} +1 -5
- package/dist/{yaml.js → store/yaml.js} +2 -6
- package/dist/support-bundle.d.ts +1 -1
- package/dist/support-bundle.js +19 -37
- package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
- package/dist/{gated-write.js → trust/gated-write.js} +6 -6
- package/dist/trust/quarantine.d.ts +4 -0
- package/dist/trust/quarantine.js +8 -0
- package/dist/trust/reject-flow.d.ts +23 -0
- package/dist/trust/reject-flow.js +65 -0
- package/dist/util/anthropic-messages.d.ts +31 -0
- package/dist/util/anthropic-messages.js +58 -0
- package/dist/util/atomic-write.d.ts +4 -0
- package/dist/util/atomic-write.js +138 -0
- package/dist/util/capped-json.d.ts +6 -0
- package/dist/util/capped-json.js +46 -0
- package/dist/util/crash-handlers.d.ts +12 -0
- package/dist/util/crash-handlers.js +72 -0
- package/dist/{env.d.ts → util/env.d.ts} +27 -7
- package/dist/{env.js → util/env.js} +33 -8
- package/dist/{home-path.d.ts → util/home-path.d.ts} +2 -1
- package/dist/util/home-path.js +69 -0
- package/dist/{http-retry.d.ts → util/http-retry.d.ts} +8 -2
- package/dist/util/http-retry.js +103 -0
- package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
- package/dist/{http-util.js → util/http-util.js} +31 -11
- package/dist/util/json.d.ts +17 -0
- package/dist/util/json.js +25 -0
- package/dist/{log.d.ts → util/log.d.ts} +7 -3
- package/dist/{log.js → util/log.js} +36 -11
- package/dist/util/real-path.d.ts +3 -0
- package/dist/util/real-path.js +15 -0
- package/dist/util/request-scope.d.ts +28 -0
- package/dist/util/request-scope.js +48 -0
- package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
- package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +5 -30
- package/dist/{secret-detect.js → util/secret-detect.js} +17 -42
- package/dist/util/stored-json.d.ts +9 -0
- package/dist/util/stored-json.js +8 -0
- package/dist/util/time.d.ts +2 -0
- package/dist/util/time.js +3 -0
- package/dist/util/token-text.d.ts +15 -0
- package/dist/util/token-text.js +20 -0
- package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +2 -0
- package/dist/util/transcript-tail.js +49 -0
- package/dist/util/version.d.ts +11 -0
- package/dist/util/version.js +26 -0
- package/extensions/openclaw-plugin/index.ts +2 -6
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
- package/dist/ablation.d.ts +0 -102
- package/dist/ablation.js +0 -136
- package/dist/api.d.ts +0 -26
- package/dist/api.js +0 -29
- package/dist/audit-prune.d.ts +0 -62
- package/dist/audit-prune.js +0 -107
- package/dist/autolearn.d.ts +0 -56
- package/dist/client.d.ts +0 -48
- package/dist/compare.d.ts +0 -86
- package/dist/compare.js +0 -117
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/connectors/github/cli-impl.js +0 -227
- package/dist/connectors/github/idempotency.d.ts +0 -19
- package/dist/connectors/github/idempotency.js +0 -27
- package/dist/connectors/slack/idempotency.d.ts +0 -17
- package/dist/connectors/slack/idempotency.js +0 -31
- package/dist/correction-latency.d.ts +0 -36
- package/dist/customer-notes.d.ts +0 -96
- package/dist/customer-notes.js +0 -336
- package/dist/db.d.ts +0 -9
- package/dist/db.js +0 -8
- package/dist/decisions.d.ts +0 -94
- package/dist/decisions.js +0 -326
- package/dist/dedupe.d.ts +0 -75
- package/dist/dedupe.js +0 -169
- package/dist/dormant.d.ts +0 -93
- package/dist/dormant.js +0 -137
- package/dist/embedding-provider.d.ts +0 -77
- package/dist/embeddings.d.ts +0 -101
- package/dist/extract.js +0 -133
- package/dist/forward-claim-detector.d.ts +0 -36
- package/dist/forward-claim-detector.js +0 -112
- package/dist/goals.d.ts +0 -173
- package/dist/goals.js +0 -448
- package/dist/graph/read.d.ts +0 -73
- package/dist/graph/rows.d.ts +0 -45
- package/dist/graph/types.js +0 -11
- package/dist/graph-stream.d.ts +0 -70
- package/dist/graph-view.d.ts +0 -73
- package/dist/graph-view.js +0 -333
- package/dist/half-life-migration.d.ts +0 -63
- package/dist/half-life-migration.js +0 -182
- package/dist/handoff.js +0 -68
- package/dist/home-path.js +0 -24
- package/dist/http-retry.js +0 -51
- package/dist/incidents.d.ts +0 -103
- package/dist/incidents.js +0 -349
- package/dist/instruction-detect.js +0 -27
- package/dist/json.d.ts +0 -7
- package/dist/json.js +0 -11
- package/dist/ledger-db.d.ts +0 -10
- package/dist/ledger-db.js +0 -42
- package/dist/memory-value-weights.d.ts +0 -19
- package/dist/memory-value.d.ts +0 -113
- package/dist/memory-value.js +0 -250
- package/dist/memory.d.ts +0 -294
- package/dist/memory.js +0 -522
- package/dist/owner-validation.d.ts +0 -42
- package/dist/owner-validation.js +0 -56
- package/dist/path-context.d.ts +0 -24
- package/dist/physics-state.d.ts +0 -39
- package/dist/policies.d.ts +0 -151
- package/dist/policies.js +0 -434
- package/dist/processes.d.ts +0 -108
- package/dist/processes.js +0 -371
- package/dist/project-briefs.d.ts +0 -128
- package/dist/project-briefs.js +0 -523
- package/dist/provenance-coverage.d.ts +0 -18
- package/dist/rate-limit.d.ts +0 -34
- package/dist/raw-archive-mirror-cleanup.d.ts +0 -20
- package/dist/raw-archive.d.ts +0 -24
- package/dist/recall-history.d.ts +0 -131
- package/dist/recall-history.js +0 -227
- package/dist/recall-scope.d.ts +0 -138
- package/dist/refine-llm.d.ts +0 -61
- package/dist/refine-llm.js +0 -167
- package/dist/reject-flow.d.ts +0 -69
- package/dist/reject-flow.js +0 -260
- package/dist/rejection.d.ts +0 -100
- package/dist/replay.d.ts +0 -41
- package/dist/replay.js +0 -122
- package/dist/rrf.d.ts +0 -43
- package/dist/rrf.js +0 -61
- package/dist/scope.d.ts +0 -14
- package/dist/server-detect.d.ts +0 -72
- package/dist/server-detect.js +0 -222
- package/dist/session-owners.d.ts +0 -7
- package/dist/session-owners.js +0 -54
- package/dist/shared.d.ts +0 -186
- package/dist/shared.js +0 -540
- package/dist/skills.d.ts +0 -101
- package/dist/skills.js +0 -367
- package/dist/store/entry-writes-group.d.ts +0 -9
- package/dist/store/vector-writes.d.ts +0 -6
- package/dist/store/vector-writes.js +0 -59
- package/dist/store-port.d.ts +0 -262
- package/dist/store-port.js +0 -178
- package/dist/tenant.d.ts +0 -25
- package/dist/tenant.js +0 -43
- package/dist/trace.d.ts +0 -34
- package/dist/transcript-tail.js +0 -48
- package/dist/version.d.ts +0 -26
- package/dist/version.js +0 -41
- package/dist/working-memory.js +0 -154
- /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
- /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
- /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
- /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
- /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
- /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
- /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
- /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
- /package/dist/{api-errors.js → core/api-errors.js} +0 -0
- /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
- /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
- /package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +0 -0
- /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
- /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
- /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
- /package/dist/{quality-repair.d.ts → store/quality-repair.d.ts} +0 -0
- /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
- /package/dist/{escape.js → util/escape.js} +0 -0
- /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
- /package/dist/{keyset.js → util/keyset.js} +0 -0
- /package/dist/{same-text.js → util/same-text.js} +0 -0
- /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
- /package/dist/{db → util}/sqlite-blocked.js +0 -0
- /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
- /package/dist/{tokenize.js → util/tokenize.js} +0 -0
- /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
- /package/dist/{write-budget.js → util/write-budget.js} +0 -0
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
// The dashboard's read model: one in-memory snapshot of a tenant's live memories, grouped by origin project.
|
|
2
2
|
// Pure build functions plus one cache; the queries over it live in dashboard-queries.ts.
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
import { storedVectorIds } from './vector-store.js';
|
|
10
|
-
export const DAY_MS = 86_400_000;
|
|
3
|
+
import { calculateStrength, facetsOf, netWrong, Layer as MemoryLayer } from '../core/memory.js';
|
|
4
|
+
import { isQuarantineScope } from '../trust/quarantine.js';
|
|
5
|
+
import { listMemoryConflicts } from '../store/conflicts.js';
|
|
6
|
+
import { DashboardConnection, loadDashboardRows } from '../store/dashboard-reads.js';
|
|
7
|
+
import { DAY_MS } from '../util/time.js';
|
|
8
|
+
export { DAY_MS };
|
|
11
9
|
export const LAYERS = ['buffer', 'episodic', 'semantic', 'trace'];
|
|
12
10
|
// Wire order of `Band`, and the order the mockup sorts bands in.
|
|
13
11
|
export const BANDS = ['pinned', 'strong', 'fading', 'atRisk'];
|
|
@@ -18,9 +16,9 @@ const BAND_AT_RISK = 3;
|
|
|
18
16
|
const CONFIDENCE_ORDER = ['verified', 'observed', 'inferred', 'stale'];
|
|
19
17
|
const HEAD_CHARS = 240;
|
|
20
18
|
/** An outside commit rebuilds the snapshot at most this often. */
|
|
21
|
-
|
|
19
|
+
const COALESCE_MS = 10_000;
|
|
22
20
|
/** Projected strengths track the clock, so the snapshot is rebuilt at least this often. */
|
|
23
|
-
|
|
21
|
+
const TTL_MS = 5 * 60_000;
|
|
24
22
|
/** The one predicate for "shown on the dashboard": not superseded, not archived, not quarantined. */
|
|
25
23
|
export function isLiveMemory(entry) {
|
|
26
24
|
return !entry.superseded_by && (entry.kind === 'raw' || entry.kind === 'distilled') && !isQuarantineScope(entry.scope);
|
|
@@ -52,7 +50,7 @@ export function memoryFacts(entry, nowMs) {
|
|
|
52
50
|
const strength = calculateStrength(entry, now);
|
|
53
51
|
const strength7d = calculateStrength(entry, new Date(nowMs + 7 * DAY_MS));
|
|
54
52
|
const strength30d = calculateStrength(entry, new Date(nowMs + 30 * DAY_MS));
|
|
55
|
-
const facets =
|
|
53
|
+
const facets = facetsOf(entry, now);
|
|
56
54
|
const band = entry.pinned ? BAND_PINNED : strength30d < 0.2 ? BAND_AT_RISK : strength >= 0.5 ? BAND_STRONG : BAND_FADING;
|
|
57
55
|
return {
|
|
58
56
|
strength,
|
|
@@ -144,30 +142,42 @@ function toFact(entry, f, project, embedded, createdMs) {
|
|
|
144
142
|
createdMs,
|
|
145
143
|
};
|
|
146
144
|
}
|
|
145
|
+
function tallyExcluded(entry, excluded) {
|
|
146
|
+
if (isQuarantineScope(entry.scope))
|
|
147
|
+
excluded.quarantined++;
|
|
148
|
+
else if (entry.superseded_by || entry.kind === 'superseded')
|
|
149
|
+
excluded.superseded++;
|
|
150
|
+
else if (entry.kind === 'archived')
|
|
151
|
+
excluded.archived++;
|
|
152
|
+
}
|
|
153
|
+
function draftIndexFor(identity, projectIndex, drafts) {
|
|
154
|
+
let p = projectIndex.get(identity.key);
|
|
155
|
+
if (p === undefined) {
|
|
156
|
+
p = drafts.length;
|
|
157
|
+
projectIndex.set(identity.key, p);
|
|
158
|
+
drafts.push(newDraft(identity));
|
|
159
|
+
}
|
|
160
|
+
return p;
|
|
161
|
+
}
|
|
162
|
+
function finishProject(d) {
|
|
163
|
+
d.summary.atRisk = d.summary.bands.atRisk;
|
|
164
|
+
d.summary.share = d.summary.live > 0 ? d.summary.atRisk / d.summary.live : 0;
|
|
165
|
+
d.summary.lastRetrievedDays = d.summary.live > 0 ? round1(d.lastDays) : null;
|
|
166
|
+
return { summary: d.summary, members: Int32Array.from(d.members), firstCreatedMs: d.firstCreatedMs };
|
|
167
|
+
}
|
|
147
168
|
/** Builds the snapshot from already-loaded rows; it touches no store, so tests can feed it directly. */
|
|
148
169
|
export function buildSnapshot(input) {
|
|
149
170
|
const { entries, embeddedIds, nowMs } = input;
|
|
150
|
-
const excluded = { superseded: 0, archived: 0, quarantined: 0 };
|
|
171
|
+
const excluded = { superseded: 0, archived: 0, quarantined: 0, ...input.excluded };
|
|
151
172
|
const facts = [];
|
|
152
173
|
const projectIndex = new Map();
|
|
153
174
|
const drafts = [];
|
|
154
175
|
for (const entry of entries) {
|
|
155
176
|
if (!isLiveMemory(entry)) {
|
|
156
|
-
|
|
157
|
-
excluded.quarantined++;
|
|
158
|
-
else if (entry.superseded_by || entry.kind === 'superseded')
|
|
159
|
-
excluded.superseded++;
|
|
160
|
-
else if (entry.kind === 'archived')
|
|
161
|
-
excluded.archived++;
|
|
177
|
+
tallyExcluded(entry, excluded);
|
|
162
178
|
continue;
|
|
163
179
|
}
|
|
164
|
-
const
|
|
165
|
-
let p = projectIndex.get(identity.key);
|
|
166
|
-
if (p === undefined) {
|
|
167
|
-
p = drafts.length;
|
|
168
|
-
projectIndex.set(identity.key, p);
|
|
169
|
-
drafts.push(newDraft(identity));
|
|
170
|
-
}
|
|
180
|
+
const p = draftIndexFor(projectIdentity(entry.origin_project), projectIndex, drafts);
|
|
171
181
|
const f = memoryFacts(entry, nowMs);
|
|
172
182
|
const embedded = embeddedIds !== null && embeddedIds.has(entry.id);
|
|
173
183
|
const parsedCreated = Date.parse(entry.created);
|
|
@@ -187,12 +197,7 @@ export function buildSnapshot(input) {
|
|
|
187
197
|
facts.push(toFact(entry, f, p, embedded, Number.isFinite(parsedCreated) ? parsedCreated : nowMs));
|
|
188
198
|
}
|
|
189
199
|
const openConflicts = countOpenConflicts(facts, drafts.map((d) => d.summary), input.openConflicts);
|
|
190
|
-
const projects = drafts.map(
|
|
191
|
-
d.summary.atRisk = d.summary.bands.atRisk;
|
|
192
|
-
d.summary.share = d.summary.live > 0 ? d.summary.atRisk / d.summary.live : 0;
|
|
193
|
-
d.summary.lastRetrievedDays = d.summary.live > 0 ? round1(d.lastDays) : null;
|
|
194
|
-
return { summary: d.summary, members: Int32Array.from(d.members), firstCreatedMs: d.firstCreatedMs };
|
|
195
|
-
});
|
|
200
|
+
const projects = drafts.map(finishProject);
|
|
196
201
|
const embeddedTotal = projects.reduce((sum, p) => sum + p.summary.embedded, 0);
|
|
197
202
|
return {
|
|
198
203
|
id: input.id,
|
|
@@ -227,82 +232,83 @@ function countOpenConflicts(facts, summaries, conflicts) {
|
|
|
227
232
|
}
|
|
228
233
|
return total;
|
|
229
234
|
}
|
|
235
|
+
function cacheStillServes(hit, want, wallMs) {
|
|
236
|
+
const age = wallMs - hit.builtAtMs;
|
|
237
|
+
return hit.snapshot.tenantId === want.tenantId
|
|
238
|
+
&& (hit.dataVersion !== null || want.dataVersion === null)
|
|
239
|
+
&& age < TTL_MS
|
|
240
|
+
&& (hit.dataVersion === want.dataVersion || age < COALESCE_MS);
|
|
241
|
+
}
|
|
230
242
|
// Keeps ids rising between two services created in the same millisecond of one process.
|
|
231
243
|
let highestIssuedId = 0;
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
244
|
+
class SnapshotCacheService {
|
|
245
|
+
hippoRoot;
|
|
246
|
+
now;
|
|
247
|
+
cacheClock;
|
|
248
|
+
connection;
|
|
249
|
+
cached = null;
|
|
236
250
|
// Wall clock, not `now`, so ids keep rising across server restarts and a client holding an old tab never sees a lower one.
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
251
|
+
lastId = Math.max(Date.now(), highestIssuedId);
|
|
252
|
+
lastEmbeddedIds;
|
|
253
|
+
constructor(hippoRoot, now, cacheClock) {
|
|
254
|
+
this.hippoRoot = hippoRoot;
|
|
255
|
+
this.now = now;
|
|
256
|
+
this.cacheClock = cacheClock;
|
|
257
|
+
this.connection = new DashboardConnection(hippoRoot);
|
|
258
|
+
}
|
|
259
|
+
build(tenantId, dv, nowMs) {
|
|
260
|
+
const rows = dv === null ? null : loadDashboardRows(this.hippoRoot, tenantId);
|
|
261
|
+
const openConflicts = dv === null ? [] : listMemoryConflicts(this.hippoRoot, 'open', tenantId);
|
|
262
|
+
this.lastId += 1;
|
|
263
|
+
highestIssuedId = Math.max(highestIssuedId, this.lastId);
|
|
264
|
+
// After loadDashboardRows, whose writable open has run any pending migration and legacy embeddings.json import.
|
|
265
|
+
this.lastEmbeddedIds = this.connection.embeddedIds();
|
|
266
|
+
return buildSnapshot({
|
|
267
|
+
id: this.lastId,
|
|
268
|
+
tenantId,
|
|
269
|
+
nowMs,
|
|
270
|
+
entries: rows?.live ?? [],
|
|
271
|
+
excluded: rows?.excluded,
|
|
272
|
+
openConflicts,
|
|
273
|
+
embeddedIds: this.lastEmbeddedIds
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
get(tenantId, fresh = false) {
|
|
277
|
+
const nowMs = this.now();
|
|
278
|
+
// A frozen eval clock (HIPPO_FAKE_NOW) would never age the cache, so reuse is timed on its own clock.
|
|
279
|
+
const wallMs = this.cacheClock();
|
|
280
|
+
// Read before the build, so a commit that lands during it shows on the next read.
|
|
281
|
+
const dv = this.connection.dataVersion();
|
|
282
|
+
const hit = this.cached;
|
|
283
|
+
if (hit !== null && !fresh) {
|
|
284
|
+
if (cacheStillServes(hit, { tenantId, dataVersion: dv }, wallMs))
|
|
285
|
+
return hit.snapshot;
|
|
244
286
|
}
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
return
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
// Read before the build, so a commit that lands during it shows on the next read.
|
|
272
|
-
const dv = dataVersion();
|
|
273
|
-
const hit = cached;
|
|
274
|
-
if (hit !== null && !fresh) {
|
|
275
|
-
const age = wallMs - hit.builtAtMs;
|
|
276
|
-
const reusable = hit.snapshot.tenantId === tenantId
|
|
277
|
-
&& (hit.dataVersion !== null || dv === null)
|
|
278
|
-
&& age < TTL_MS
|
|
279
|
-
&& (hit.dataVersion === dv || age < COALESCE_MS);
|
|
280
|
-
if (reusable)
|
|
281
|
-
return hit.snapshot;
|
|
282
|
-
}
|
|
283
|
-
const snapshot = build(tenantId, dv, nowMs);
|
|
284
|
-
cached = { snapshot, dataVersion: dv, builtAtMs: wallMs };
|
|
285
|
-
return snapshot;
|
|
286
|
-
},
|
|
287
|
-
invalidate() {
|
|
288
|
-
cached = null;
|
|
289
|
-
},
|
|
290
|
-
currentId() {
|
|
291
|
-
return lastId;
|
|
292
|
-
},
|
|
293
|
-
embeddedIds() {
|
|
294
|
-
if (lastEmbeddedIds !== undefined)
|
|
295
|
-
return lastEmbeddedIds;
|
|
296
|
-
dataVersion();
|
|
297
|
-
return readEmbeddedIds();
|
|
298
|
-
},
|
|
299
|
-
close() {
|
|
300
|
-
if (db !== null)
|
|
301
|
-
closeHippoDb(db);
|
|
302
|
-
db = null;
|
|
303
|
-
cached = null;
|
|
304
|
-
lastEmbeddedIds = undefined;
|
|
305
|
-
},
|
|
306
|
-
};
|
|
287
|
+
const snapshot = this.build(tenantId, dv, nowMs);
|
|
288
|
+
this.cached = { snapshot, dataVersion: dv, builtAtMs: wallMs };
|
|
289
|
+
return snapshot;
|
|
290
|
+
}
|
|
291
|
+
invalidate() {
|
|
292
|
+
this.cached = null;
|
|
293
|
+
}
|
|
294
|
+
currentId() {
|
|
295
|
+
return this.lastId;
|
|
296
|
+
}
|
|
297
|
+
embeddedIds() {
|
|
298
|
+
if (this.lastEmbeddedIds !== undefined)
|
|
299
|
+
return this.lastEmbeddedIds;
|
|
300
|
+
this.connection.dataVersion();
|
|
301
|
+
return this.connection.embeddedIds();
|
|
302
|
+
}
|
|
303
|
+
close() {
|
|
304
|
+
this.connection.close();
|
|
305
|
+
this.cached = null;
|
|
306
|
+
this.lastEmbeddedIds = undefined;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
/** Holds one read-only connection for its commit signal (`PRAGMA data_version`) and the
|
|
310
|
+
* snapshot cache; `now` dates the strength projections, `cacheClock` ages the cache. */
|
|
311
|
+
export function createSnapshotService(hippoRoot, now, cacheClock = Date.now) {
|
|
312
|
+
return new SnapshotCacheService(hippoRoot, now, cacheClock);
|
|
307
313
|
}
|
|
308
314
|
//# sourceMappingURL=dashboard-snapshot.js.map
|
|
@@ -17,7 +17,8 @@ export interface ProjectSummary {
|
|
|
17
17
|
bands: Record<Band, number>;
|
|
18
18
|
layers: Record<Layer, number>;
|
|
19
19
|
}
|
|
20
|
-
/** One KPI card; `series` is 91 daily cumulative points, oldest first (point 0 is the base at the window start,
|
|
20
|
+
/** One KPI card; `series` is 91 daily cumulative points, oldest first (point 0 is the base at the window start,
|
|
21
|
+
* point 90 is now) so `last - first` over any range plus one points is exact; null when hippo recorded no history. */
|
|
21
22
|
export interface Kpi {
|
|
22
23
|
id: 'total' | 'projects' | 'atRiskShare' | 'openConflicts' | 'embeddingCoverage';
|
|
23
24
|
label: string;
|
|
@@ -2,18 +2,23 @@
|
|
|
2
2
|
import * as http from 'http';
|
|
3
3
|
import * as path from 'path';
|
|
4
4
|
import * as fs from 'fs';
|
|
5
|
-
import { randomBytes, timingSafeEqual } from 'crypto';
|
|
6
|
-
import { evalNow } from '
|
|
7
|
-
import { readEntry } from '
|
|
8
|
-
import { listCards } from '
|
|
9
|
-
import { resolveTenantId } from '
|
|
10
|
-
import { loadCardDetail } from '
|
|
11
|
-
import { closeAfterReply, isCrossSite, LOOPBACK_HOST_HEADER } from '
|
|
12
|
-
import { log } from '
|
|
5
|
+
import { createHash, randomBytes, randomUUID, timingSafeEqual } from 'crypto';
|
|
6
|
+
import { evalNow } from '../core/ablation.js';
|
|
7
|
+
import { readEntry } from '../store/entry-reads.js';
|
|
8
|
+
import { listCards } from '../store/cards.js';
|
|
9
|
+
import { resolveTenantId } from '../store/tenant.js';
|
|
10
|
+
import { loadCardDetail } from '../store/card-detail.js';
|
|
11
|
+
import { bodyDeadlineMs, BodyTimeoutError, closeAfterReply, isCrossSite, LOOPBACK_HOST_HEADER } from '../util/http-util.js';
|
|
12
|
+
import { errorFields, errorMessage, log } from '../util/log.js';
|
|
13
13
|
import { createSnapshotService, isLiveMemory } from './dashboard-snapshot.js';
|
|
14
14
|
import { buildMemoryDetail, buildMemoryPage, buildOverview, buildProjectDetail, buildSearch, } from './dashboard-queries.js';
|
|
15
15
|
import { forgetMemory, markWrong, pinMemory, resolveOpenConflict, } from './dashboard-actions.js';
|
|
16
16
|
import { ParamError, parseActionBody, parseConflictId, parseMemoryId, parseMemoryQuery, parseSearchText, } from './dashboard-params.js';
|
|
17
|
+
import { runWithRequestId } from '../util/request-scope.js';
|
|
18
|
+
import { installSignalHandlers } from '../util/crash-handlers.js';
|
|
19
|
+
import { DEFAULT_SHUTDOWN_DRAIN_MS, drainAndClose, setKeepAliveTimeouts, shutdownBoundMs } from '../server/lifecycle.js';
|
|
20
|
+
import { printError } from '../cli/output.js';
|
|
21
|
+
import { PACKAGE_ROOT } from '../core/package-root.js';
|
|
17
22
|
const MIME_TYPES = {
|
|
18
23
|
'.html': 'text/html; charset=utf-8',
|
|
19
24
|
'.js': 'application/javascript; charset=utf-8',
|
|
@@ -72,6 +77,10 @@ function readActionBody(req) {
|
|
|
72
77
|
const chunks = [];
|
|
73
78
|
let size = 0;
|
|
74
79
|
let aborted = false;
|
|
80
|
+
const deadlineMs = bodyDeadlineMs();
|
|
81
|
+
const timer = setTimeout(() => reject(new BodyTimeoutError(`request body not received within ${deadlineMs} ms`)), deadlineMs);
|
|
82
|
+
// Unref: a request that already failed another way must not hold the process open for the rest of the deadline.
|
|
83
|
+
timer.unref();
|
|
75
84
|
req.on('data', (chunk) => {
|
|
76
85
|
size += chunk.length;
|
|
77
86
|
if (size <= BODY_MAX_BYTES)
|
|
@@ -83,6 +92,7 @@ function readActionBody(req) {
|
|
|
83
92
|
});
|
|
84
93
|
req.on('error', reject);
|
|
85
94
|
req.on('end', () => {
|
|
95
|
+
clearTimeout(timer);
|
|
86
96
|
if (size > BODY_MAX_BYTES)
|
|
87
97
|
return reject(new ParamError(`Body must be at most ${BODY_MAX_BYTES} bytes`));
|
|
88
98
|
try {
|
|
@@ -123,7 +133,7 @@ function handleRead(ctx, segments) {
|
|
|
123
133
|
return sendOrNotFound(res, null);
|
|
124
134
|
const snapshotId = snapshots.get(tenantId, fresh).id;
|
|
125
135
|
const embedded = snapshots.embeddedIds()?.has(entry.id) ?? false;
|
|
126
|
-
return sendOrNotFound(res, buildMemoryDetail(hippoRoot, tenantId, entry, snapshotId, ctx.now(), embedded));
|
|
136
|
+
return sendOrNotFound(res, buildMemoryDetail(hippoRoot, tenantId, entry, { snapshotId, nowMs: ctx.now(), embedded }));
|
|
127
137
|
}
|
|
128
138
|
if (head === 'search' && segments.length === 2) {
|
|
129
139
|
return sendOrNotFound(res, buildSearch(snapshots.get(tenantId, fresh), parseSearchText(url.searchParams)));
|
|
@@ -175,7 +185,7 @@ async function handlePost(ctx, segments) {
|
|
|
175
185
|
if (result.entry) {
|
|
176
186
|
// The write is committed, so a rebuild failure must not turn it into a 500: the next read rebuilds.
|
|
177
187
|
const embedded = snapshots.embeddedIds()?.has(result.entry.id) ?? false;
|
|
178
|
-
const detail = buildMemoryDetail(hippoRoot, tenantId, result.entry, snapshots.currentId(), ctx.now(), embedded);
|
|
188
|
+
const detail = buildMemoryDetail(hippoRoot, tenantId, result.entry, { snapshotId: snapshots.currentId(), nowMs: ctx.now(), embedded });
|
|
179
189
|
jsonResponse(res, detail, result.status);
|
|
180
190
|
}
|
|
181
191
|
else {
|
|
@@ -183,21 +193,43 @@ async function handlePost(ctx, segments) {
|
|
|
183
193
|
}
|
|
184
194
|
return true;
|
|
185
195
|
}
|
|
196
|
+
// One style block, not style attributes, so the policy below can name its hash and allow no other inline style.
|
|
197
|
+
const NOT_BUILT_CSS = "body{font-family:Georgia,'Palatino Linotype',serif;max-width:640px;margin:60px auto;padding:24px;line-height:1.6;background:#f4efe6;color:#3a3228}" +
|
|
198
|
+
'h1{color:#c45c3c}' +
|
|
199
|
+
'pre{background:#faf7f2;padding:16px;border:1px solid #c4b9a8;border-radius:3px;font-family:Consolas,monospace}';
|
|
200
|
+
// Memory text is written by other tools and people, so every reply tells the browser to load code only from this server and never to frame, sniff or name the page elsewhere.
|
|
201
|
+
const SECURITY_HEADERS = {
|
|
202
|
+
'Content-Security-Policy': [
|
|
203
|
+
"default-src 'none'",
|
|
204
|
+
"script-src 'self'",
|
|
205
|
+
`style-src 'self' 'sha256-${createHash('sha256').update(NOT_BUILT_CSS).digest('base64')}'`,
|
|
206
|
+
"img-src 'self' data:",
|
|
207
|
+
"font-src 'self'",
|
|
208
|
+
"connect-src 'self'",
|
|
209
|
+
"base-uri 'none'",
|
|
210
|
+
"form-action 'none'",
|
|
211
|
+
"frame-ancestors 'none'",
|
|
212
|
+
].join('; '),
|
|
213
|
+
'X-Content-Type-Options': 'nosniff',
|
|
214
|
+
'Referrer-Policy': 'no-referrer',
|
|
215
|
+
'X-Frame-Options': 'DENY',
|
|
216
|
+
};
|
|
186
217
|
function notBuilt(res) {
|
|
187
218
|
res.writeHead(404, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
188
219
|
res.end(`<!doctype html>
|
|
189
|
-
<html lang="en"><head><title>Hippo Dashboard</title><meta charset="utf-8"></head>
|
|
190
|
-
<body
|
|
191
|
-
<h1
|
|
220
|
+
<html lang="en"><head><title>Hippo Dashboard</title><meta charset="utf-8"><style>${NOT_BUILT_CSS}</style></head>
|
|
221
|
+
<body>
|
|
222
|
+
<h1>Hippo Dashboard</h1>
|
|
192
223
|
<p>The React UI bundle is not built yet. Run:</p>
|
|
193
|
-
<pre
|
|
224
|
+
<pre>cd ui && npm install && npm run build</pre>
|
|
194
225
|
<p>Then refresh this page. The dashboard server will serve <code>dist-ui/index.html</code> automatically once present.</p>
|
|
195
226
|
</body></html>`);
|
|
196
227
|
}
|
|
197
228
|
function serveSpa(res, distUiDir, pathname) {
|
|
198
229
|
const safePath = path.normalize(pathname).replace(/^(\.\.[/\\])+/, '');
|
|
199
230
|
const filePath = path.join(distUiDir, safePath);
|
|
200
|
-
|
|
231
|
+
// The separator matters: a bare prefix also admits a sibling folder whose name starts with this one.
|
|
232
|
+
if (filePath !== distUiDir && !filePath.startsWith(distUiDir + path.sep))
|
|
201
233
|
return forbidden(res);
|
|
202
234
|
if (fs.existsSync(filePath) && fs.statSync(filePath).isFile() && serveStaticFile(res, filePath))
|
|
203
235
|
return;
|
|
@@ -221,9 +253,123 @@ function cookieValue(header, name) {
|
|
|
221
253
|
}
|
|
222
254
|
return undefined;
|
|
223
255
|
}
|
|
256
|
+
/** Where a page load that carried the token goes next, without it; null for an API call or a write, which is answered in place. */
|
|
257
|
+
function tokenFreeLocation(req, url) {
|
|
258
|
+
if ((req.method !== 'GET' && req.method !== 'HEAD') || url.pathname.startsWith('/api/'))
|
|
259
|
+
return null;
|
|
260
|
+
const query = new URLSearchParams(url.searchParams);
|
|
261
|
+
query.delete('token');
|
|
262
|
+
const rest = query.toString();
|
|
263
|
+
// One leading slash only: `//host` would send the browser to another site.
|
|
264
|
+
return `${url.pathname.replace(/^\/+/, '/')}${rest ? `?${rest}` : ''}`;
|
|
265
|
+
}
|
|
266
|
+
/** Moves the browser off the URL that carries the token, so the token stays out of history, bookmarks and copied links; false when the request is answered in place. */
|
|
267
|
+
function leaveTokenUrl(req, res, url) {
|
|
268
|
+
const location = tokenFreeLocation(req, url);
|
|
269
|
+
if (location === null)
|
|
270
|
+
return false;
|
|
271
|
+
if (req.headers['sec-fetch-site'] !== 'cross-site') {
|
|
272
|
+
res.writeHead(303, { Location: location });
|
|
273
|
+
res.end();
|
|
274
|
+
return true;
|
|
275
|
+
}
|
|
276
|
+
// A browser withholds a SameSite=Strict cookie from a redirect another site started; a refresh from this page is same-site.
|
|
277
|
+
const target = location.replace(/&/g, '&').replace(/"/g, '"');
|
|
278
|
+
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
279
|
+
res.end(`<!doctype html>\n<html lang="en"><head><meta charset="utf-8"><meta http-equiv="refresh" content="0;url=${target}"><title>Hippo Dashboard</title></head><body></body></html>`);
|
|
280
|
+
return true;
|
|
281
|
+
}
|
|
282
|
+
/** True when the request may proceed; false when this already answered it (redirect off the token URL, or 401). */
|
|
283
|
+
function admitDashboardRequest(req, res, url, access) {
|
|
284
|
+
const { token, port } = access;
|
|
285
|
+
// Cookies ignore the port, so the name carries it: two dashboards on one host keep separate tokens.
|
|
286
|
+
const cookieName = `hippo_dashboard_${req.socket.localPort ?? port}`;
|
|
287
|
+
if (sameToken(url.searchParams.get('token') ?? undefined, token)) {
|
|
288
|
+
res.setHeader('Set-Cookie', `${cookieName}=${token}; HttpOnly; SameSite=Strict; Path=/`);
|
|
289
|
+
if (leaveTokenUrl(req, res, url))
|
|
290
|
+
return false;
|
|
291
|
+
}
|
|
292
|
+
else if (!sameToken(cookieValue(req.headers.cookie, cookieName), token)) {
|
|
293
|
+
res.writeHead(401, { 'Content-Type': 'text/plain' });
|
|
294
|
+
res.end('Unauthorized: open the dashboard with the URL `hippo dashboard` printed; it carries the access token.');
|
|
295
|
+
return false;
|
|
296
|
+
}
|
|
297
|
+
return true;
|
|
298
|
+
}
|
|
299
|
+
function answerDashboardFailure(req, res, err) {
|
|
300
|
+
const clientFault = err instanceof ParamError || err instanceof URIError || err instanceof BodyTimeoutError;
|
|
301
|
+
// A cut-short response is logged even for a client fault; a bare 400 is not.
|
|
302
|
+
if (res.headersSent || !clientFault) {
|
|
303
|
+
log.error('dashboard request failed', { ...errorFields(err), error: errorMessage(err), path: req.url });
|
|
304
|
+
}
|
|
305
|
+
if (res.headersSent) {
|
|
306
|
+
res.end();
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
if (err instanceof BodyDrainExceeded || err instanceof BodyTimeoutError) {
|
|
310
|
+
// No `Connection: close` header: Node then destroys the socket as soon as the reply is written.
|
|
311
|
+
res.writeHead(err instanceof BodyTimeoutError ? 408 : 400, { 'Content-Type': 'application/json; charset=utf-8' });
|
|
312
|
+
res.end(JSON.stringify({ error: err.message }), () => closeAfterReply(req));
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
if (err instanceof ParamError)
|
|
316
|
+
return jsonResponse(res, { error: err.message }, 400);
|
|
317
|
+
if (err instanceof URIError)
|
|
318
|
+
return jsonResponse(res, { error: 'Malformed URL path' }, 400);
|
|
319
|
+
jsonResponse(res, { error: 'Internal error' }, 500);
|
|
320
|
+
}
|
|
321
|
+
function printDashboardBanner(boundPort, token, distUiDir) {
|
|
322
|
+
// The banner is the `hippo dashboard` command's printed result, so it stays on stdout.
|
|
323
|
+
console.log(`Hippo Dashboard running at http://localhost:${boundPort}/?token=${token}`);
|
|
324
|
+
if (distUiDir !== null)
|
|
325
|
+
console.log(`Serving React UI from ${distUiDir}`);
|
|
326
|
+
console.log('Press Ctrl+C to stop.');
|
|
327
|
+
}
|
|
328
|
+
/** A port that will not open is the user's to fix, so it gets one plain line and a failure exit code, not an uncaught error's stack. */
|
|
329
|
+
function reportListenFailure(port, err) {
|
|
330
|
+
const inUse = 'code' in err && err.code === 'EADDRINUSE';
|
|
331
|
+
printError(inUse
|
|
332
|
+
? `hippo dashboard: port ${port} is already in use. Stop the program that holds it, or choose another port with --port <number>.`
|
|
333
|
+
: `hippo dashboard: could not listen on port ${port}: ${err.message}. Choose another port with --port <number>.`);
|
|
334
|
+
process.exitCode = 1;
|
|
335
|
+
}
|
|
336
|
+
/** Ctrl+C or a stop signal: stop listening, give open requests the API server's drain, and leave within its shutdown bound. */
|
|
337
|
+
function stopOnSignal(server) {
|
|
338
|
+
const inflight = new Set();
|
|
339
|
+
server.on('request', (_req, res) => {
|
|
340
|
+
inflight.add(res);
|
|
341
|
+
res.once('close', () => inflight.delete(res));
|
|
342
|
+
});
|
|
343
|
+
installSignalHandlers('dashboard', {
|
|
344
|
+
run: () => drainAndClose(server, inflight, DEFAULT_SHUTDOWN_DRAIN_MS),
|
|
345
|
+
boundMs: shutdownBoundMs(DEFAULT_SHUTDOWN_DRAIN_MS),
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
/** Gives the listener the API server's socket deadlines and one close of the store's connection; with `handleSignals`, a signal stops it too. */
|
|
349
|
+
function superviseListener(server, snapshots, port, handleSignals) {
|
|
350
|
+
setKeepAliveTimeouts(server);
|
|
351
|
+
let storeClosed = false;
|
|
352
|
+
const closeStore = () => {
|
|
353
|
+
if (storeClosed)
|
|
354
|
+
return;
|
|
355
|
+
storeClosed = true;
|
|
356
|
+
snapshots.close();
|
|
357
|
+
};
|
|
358
|
+
server.on('close', closeStore);
|
|
359
|
+
server.on('error', (err) => {
|
|
360
|
+
// Once it listens, an 'error' is a failed accept: logged, as the API server does, and the dashboard keeps serving.
|
|
361
|
+
if (server.listening)
|
|
362
|
+
return log.error(`dashboard: listener error: ${err.message}`, errorFields(err));
|
|
363
|
+
reportListenFailure(port, err);
|
|
364
|
+
// A failed listen emits no 'close', so the store closes here.
|
|
365
|
+
closeStore();
|
|
366
|
+
});
|
|
367
|
+
if (handleSignals)
|
|
368
|
+
stopOnSignal(server);
|
|
369
|
+
}
|
|
224
370
|
/** Serves the dashboard on 127.0.0.1 behind a per-start `token` (tests pass one), since loopback alone lets any local process read every memory; `opts` sets the projection and cache clocks. */
|
|
225
371
|
export function serveDashboard(hippoRoot, port = 3333, token = randomBytes(32).toString('base64url'), opts) {
|
|
226
|
-
const distUiDir = path.
|
|
372
|
+
const distUiDir = path.join(PACKAGE_ROOT, 'dist-ui');
|
|
227
373
|
const hasDistUi = fs.existsSync(path.join(distUiDir, 'index.html'));
|
|
228
374
|
const now = opts?.now ?? (() => evalNow().getTime());
|
|
229
375
|
const snapshots = createSnapshotService(hippoRoot, now, opts?.cacheClock);
|
|
@@ -232,16 +378,8 @@ export function serveDashboard(hippoRoot, port = 3333, token = randomBytes(32).t
|
|
|
232
378
|
if (host !== undefined && !LOOPBACK_HOST_HEADER.test(host))
|
|
233
379
|
return forbidden(res);
|
|
234
380
|
const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);
|
|
235
|
-
|
|
236
|
-
const cookieName = `hippo_dashboard_${req.socket.localPort ?? port}`;
|
|
237
|
-
if (sameToken(url.searchParams.get('token') ?? undefined, token)) {
|
|
238
|
-
res.setHeader('Set-Cookie', `${cookieName}=${token}; HttpOnly; SameSite=Strict; Path=/`);
|
|
239
|
-
}
|
|
240
|
-
else if (!sameToken(cookieValue(req.headers.cookie, cookieName), token)) {
|
|
241
|
-
res.writeHead(401, { 'Content-Type': 'text/plain' });
|
|
242
|
-
res.end('Unauthorized: open the dashboard with the URL `hippo dashboard` printed; it carries the access token.');
|
|
381
|
+
if (!admitDashboardRequest(req, res, url, { token, port }))
|
|
243
382
|
return;
|
|
244
|
-
}
|
|
245
383
|
if (url.pathname.startsWith('/api/')) {
|
|
246
384
|
// A malformed % sequence throws URIError here; the caller answers 400.
|
|
247
385
|
const segments = url.pathname.split('/').filter((s) => s !== '').map((s) => decodeURIComponent(s));
|
|
@@ -257,39 +395,18 @@ export function serveDashboard(hippoRoot, port = 3333, token = randomBytes(32).t
|
|
|
257
395
|
return serveSpa(res, distUiDir, url.pathname);
|
|
258
396
|
notBuilt(res);
|
|
259
397
|
};
|
|
260
|
-
const
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
res.end();
|
|
269
|
-
return;
|
|
270
|
-
}
|
|
271
|
-
if (err instanceof BodyDrainExceeded) {
|
|
272
|
-
// No `Connection: close` header: Node then destroys the socket as soon as the reply is written.
|
|
273
|
-
res.writeHead(400, { 'Content-Type': 'application/json; charset=utf-8' });
|
|
274
|
-
res.end(JSON.stringify({ error: err.message }), () => closeAfterReply(req));
|
|
275
|
-
return;
|
|
276
|
-
}
|
|
277
|
-
if (err instanceof ParamError)
|
|
278
|
-
return jsonResponse(res, { error: err.message }, 400);
|
|
279
|
-
if (err instanceof URIError)
|
|
280
|
-
return jsonResponse(res, { error: 'Malformed URL path' }, 400);
|
|
281
|
-
jsonResponse(res, { error: 'Internal error' }, 500);
|
|
282
|
-
});
|
|
283
|
-
});
|
|
284
|
-
server.on('close', () => snapshots.close());
|
|
398
|
+
const onRequest = (req, res) => {
|
|
399
|
+
for (const [name, value] of Object.entries(SECURITY_HEADERS))
|
|
400
|
+
res.setHeader(name, value);
|
|
401
|
+
handleRequest(req, res).catch((err) => answerDashboardFailure(req, res, err));
|
|
402
|
+
};
|
|
403
|
+
// One id per request, so the lines it logs can be told apart from a concurrent request's.
|
|
404
|
+
const server = http.createServer((req, res) => runWithRequestId(randomUUID(), () => onRequest(req, res)));
|
|
405
|
+
superviseListener(server, snapshots, port, opts?.handleSignals === true);
|
|
285
406
|
server.listen(port, '127.0.0.1', () => {
|
|
286
407
|
// SAFETY: listen() was given a TCP port, so address() is AddressInfo, never a pipe name.
|
|
287
408
|
const boundPort = server.address().port;
|
|
288
|
-
|
|
289
|
-
console.log(`Hippo Dashboard running at http://localhost:${boundPort}/?token=${token}`);
|
|
290
|
-
if (hasDistUi)
|
|
291
|
-
console.log(`Serving React UI from ${distUiDir}`);
|
|
292
|
-
console.log('Press Ctrl+C to stop.');
|
|
409
|
+
printDashboardBanner(boundPort, token, hasDistUi ? distUiDir : null);
|
|
293
410
|
});
|
|
294
411
|
return server;
|
|
295
412
|
}
|
package/dist/db/backup.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as fs from 'node:fs';
|
|
2
2
|
import * as path from 'node:path';
|
|
3
|
-
import { log } from '../log.js';
|
|
3
|
+
import { log } from '../util/log.js';
|
|
4
4
|
/** Copies the database before a repair writes, so the audit ids plus this file are the way back. */
|
|
5
5
|
export function backupStore(db, hippoRoot, label, now = new Date()) {
|
|
6
6
|
const dir = path.join(hippoRoot, 'backups');
|
package/dist/db/busy.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { DatabaseSyncLike } from './sqlite.js';
|
|
2
|
-
export declare function isSqliteBusy(
|
|
2
|
+
export declare function isSqliteBusy(cause: unknown): boolean;
|
|
3
3
|
export declare const STORE_BUSY_MESSAGE = "store busy (another hippo process holds the write lock); retry shortly";
|
|
4
4
|
/** A store behind the port throws this when its lock wait runs out, so the server answers 503 as it does for a busy hippo.db. */
|
|
5
5
|
export declare class StoreBusyError extends Error {
|
|
@@ -8,7 +8,24 @@ export declare class StoreBusyError extends Error {
|
|
|
8
8
|
/** A held lock in any store: SQLite's busy codes or a port's StoreBusyError. */
|
|
9
9
|
export declare function isStoreBusy<E>(error: E): boolean;
|
|
10
10
|
export declare function execWithBusyRetry(db: DatabaseSyncLike, sql: string, timeoutMs?: number): void;
|
|
11
|
+
/** Waits for the lock past busy_timeout when given; ignored inside a caller's transaction, which already holds it. */
|
|
12
|
+
export interface WriteScopeOptions {
|
|
13
|
+
readonly busyWaitMs?: number;
|
|
14
|
+
}
|
|
11
15
|
/** Runs `fn` as one write: BEGIN IMMEDIATE on an idle handle, else SAVEPOINT `name` inside the caller's transaction.
|
|
12
16
|
* A deferred scope that reads first cannot wait out another writer, while BEGIN IMMEDIATE waits the open's busy_timeout. */
|
|
13
|
-
export declare function withWriteScope<T>(db: DatabaseSyncLike, name: string, fn: () => T): T;
|
|
17
|
+
export declare function withWriteScope<T>(db: DatabaseSyncLike, name: string, fn: () => T, opts?: WriteScopeOptions): T;
|
|
18
|
+
/** Runs the reads in `fn` against one snapshot, so two statements cannot straddle another process's write. */
|
|
19
|
+
export declare function withReadSnapshot<T>(db: DatabaseSyncLike, fn: () => T): T;
|
|
20
|
+
/** Runs `fn` and undoes every write it made, throw or not: a dry run that reports what a real run would do. Takes no write lock up front. */
|
|
21
|
+
export declare function withTrialScope<T>(db: DatabaseSyncLike, name: string, fn: () => T): T;
|
|
22
|
+
/** What `withWriteScopeOr` hands its callback's `rollback(value)`; a class so no stored value can pass for one. */
|
|
23
|
+
declare class RolledBack<V> {
|
|
24
|
+
readonly value: V;
|
|
25
|
+
constructor(value: V);
|
|
26
|
+
}
|
|
27
|
+
/** `withWriteScope` for a write that can refuse: a callback that returns `rollback(value)` gets the scope's writes undone
|
|
28
|
+
* and `value` back, with no throw. Any other return commits. */
|
|
29
|
+
export declare function withWriteScopeOr<T, R>(db: DatabaseSyncLike, name: string, fn: (rollback: <V>(value: V) => RolledBack<V>) => T | RolledBack<R>): T | R;
|
|
30
|
+
export {};
|
|
14
31
|
//# sourceMappingURL=busy.d.ts.map
|