hippo-memory 1.68.0 → 1.70.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 -3
- 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 +1 -3
- package/dist/agent-memories/claude-code.js +11 -7
- package/dist/agent-memories/copilot.d.ts +3 -1
- package/dist/agent-memories/copilot.js +5 -4
- package/dist/agent-memories/files.js +3 -2
- 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/report.d.ts +1 -1
- package/dist/agent-memories/report.js +1 -1
- package/dist/agent-memories/source.d.ts +1 -1
- package/dist/agent-memories/source.js +6 -5
- package/dist/agent-memories/sync.d.ts +1 -1
- package/dist/agent-memories/sync.js +24 -33
- package/dist/agent-memories/types.d.ts +1 -1
- package/dist/api/assemble.d.ts +2 -2
- package/dist/api/assemble.js +42 -32
- package/dist/api/audit.d.ts +4 -7
- package/dist/api/audit.js +6 -20
- package/dist/api/auth.d.ts +5 -18
- package/dist/api/auth.js +44 -194
- 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} +2 -2
- package/dist/{availability.js → api/availability.js} +12 -29
- 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 +14 -4
- package/dist/api/context-select.js +50 -60
- package/dist/api/context-types.d.ts +5 -5
- package/dist/api/context.d.ts +2 -4
- package/dist/api/context.js +113 -85
- package/dist/api/dormant.d.ts +3 -3
- package/dist/api/dormant.js +38 -107
- package/dist/api/drill-down.d.ts +2 -2
- package/dist/api/drill-down.js +37 -65
- package/dist/api/forget.d.ts +4 -13
- package/dist/api/forget.js +13 -35
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +2 -2
- package/dist/api/index.d.ts +26 -0
- package/dist/api/index.js +29 -0
- package/dist/api/instruction-detect.js +74 -0
- package/dist/api/learn.js +63 -55
- package/dist/api/ledger-db.d.ts +20 -0
- package/dist/api/ledger-db.js +79 -0
- package/dist/api/on-store.d.ts +16 -0
- package/dist/api/on-store.js +36 -0
- package/dist/api/outcome.d.ts +9 -46
- package/dist/api/outcome.js +15 -57
- 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/promote.d.ts +7 -18
- package/dist/api/promote.js +30 -152
- package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +7 -7
- package/dist/{prompt-hook.js → api/prompt-hook.js} +34 -53
- package/dist/api/quarantine.d.ts +5 -5
- package/dist/api/quarantine.js +30 -106
- package/dist/api/recall-core.d.ts +4 -0
- package/dist/api/recall-core.js +112 -0
- package/dist/{recall-history.js → api/recall-history.js} +30 -25
- package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +5 -5
- package/dist/{recall-pipeline.js → api/recall-pipeline.js} +47 -42
- 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 +41 -16
- package/dist/api/recall.d.ts +1 -1
- package/dist/api/recall.js +39 -37
- package/dist/api/remember.d.ts +12 -13
- package/dist/api/remember.js +38 -27
- 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 -7
- package/dist/api/sleep-run.js +63 -75
- package/dist/api/sleep.d.ts +1 -1
- package/dist/api/tokens.d.ts +2 -2
- package/dist/api/tokens.js +9 -21
- package/dist/api/types.d.ts +2 -2
- package/dist/api/types.js +1 -1
- 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 +1 -1
- package/dist/capture/command.js +54 -41
- 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 +4 -1
- package/dist/capture/compact.js +59 -22
- 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} +48 -94
- package/dist/{compaction-spool.js → capture/compaction-spool.js} +17 -13
- package/dist/capture/copilot-transcript.d.ts +3 -0
- package/dist/capture/copilot-transcript.js +9 -2
- 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} +1 -5
- package/dist/{session-digest.js → capture/session-digest.js} +17 -23
- 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.d.ts +13 -0
- package/dist/capture/session-worker.js +196 -0
- package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
- package/dist/capture/transcript.js +68 -74
- package/dist/capture/working-state.d.ts +0 -3
- package/dist/capture/working-state.js +7 -7
- package/dist/{audit-prune.d.ts → cli/audit-prune.d.ts} +1 -2
- package/dist/{audit-prune.js → cli/audit-prune.js} +5 -39
- package/dist/cli/audit.d.ts +2 -2
- package/dist/cli/audit.js +77 -72
- package/dist/cli/auth.d.ts +2 -1
- package/dist/cli/auth.js +18 -20
- package/dist/cli/briefs.d.ts +4 -3
- package/dist/cli/briefs.js +59 -181
- package/dist/cli/card.d.ts +2 -1
- package/dist/cli/card.js +25 -23
- package/dist/{client.d.ts → cli/client.d.ts} +1 -1
- package/dist/{client.js → cli/client.js} +1 -1
- package/dist/cli/compact-resume-payload.d.ts +8 -0
- package/dist/cli/compact-resume-payload.js +39 -0
- package/dist/cli/context.d.ts +2 -13
- package/dist/cli/context.js +41 -71
- package/dist/cli/continuity.d.ts +6 -5
- package/dist/cli/continuity.js +109 -99
- package/dist/{correction-latency.d.ts → cli/correction-latency.d.ts} +1 -1
- package/dist/cli/curate.d.ts +9 -9
- package/dist/cli/curate.js +177 -149
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +46 -34
- package/dist/cli/decisions.d.ts +4 -3
- package/dist/cli/decisions.js +108 -218
- package/dist/cli/eval.d.ts +1 -3
- package/dist/cli/eval.js +43 -31
- package/dist/cli/explain.d.ts +1 -1
- package/dist/cli/explain.js +35 -19
- package/dist/cli/flag-values.d.ts +25 -0
- package/dist/cli/flag-values.js +103 -0
- package/dist/cli/flags.d.ts +303 -0
- package/dist/cli/flags.js +169 -0
- package/dist/cli/goals.d.ts +2 -1
- package/dist/cli/goals.js +39 -34
- package/dist/cli/hook-runtime.d.ts +49 -0
- package/dist/cli/hook-runtime.js +155 -0
- package/dist/cli/init.d.ts +2 -1
- package/dist/cli/init.js +151 -118
- package/dist/cli/install-steps.d.ts +7 -0
- package/dist/cli/install-steps.js +110 -0
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +9 -7
- package/dist/cli/maintenance.d.ts +5 -4
- package/dist/cli/maintenance.js +31 -27
- package/dist/cli/object-verbs.d.ts +40 -0
- package/dist/cli/object-verbs.js +65 -0
- package/dist/{owner-validation.d.ts → cli/owner-validation.d.ts} +0 -1
- package/dist/{owner-validation.js → cli/owner-validation.js} +2 -2
- package/dist/cli/playbooks.d.ts +4 -3
- package/dist/cli/playbooks.js +77 -280
- package/dist/cli/print.d.ts +18 -0
- package/dist/cli/print.js +85 -0
- package/dist/cli/projects.d.ts +2 -3
- package/dist/cli/projects.js +56 -49
- package/dist/{provenance-coverage.d.ts → cli/provenance-coverage.d.ts} +1 -1
- package/dist/cli/quality-repair-once.js +4 -4
- package/dist/{quality-repair.js → cli/quality-repair.js} +23 -37
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +101 -150
- package/dist/{refine-llm.d.ts → cli/refine-llm.d.ts} +1 -1
- package/dist/{refine-llm.js → cli/refine-llm.js} +70 -82
- package/dist/cli/remember.d.ts +1 -3
- package/dist/cli/remember.js +124 -103
- package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +3 -1
- package/dist/{scheduler.js → cli/scheduler.js} +13 -7
- package/dist/cli/serve.d.ts +1 -1
- package/dist/cli/serve.js +34 -4
- package/dist/cli/session-hooks.d.ts +4 -4
- package/dist/cli/session-hooks.js +265 -191
- package/dist/cli/setup.d.ts +2 -1
- package/dist/cli/setup.js +111 -45
- package/dist/cli/shared.d.ts +5 -95
- package/dist/cli/shared.js +18 -369
- package/dist/cli/slack.d.ts +2 -1
- package/dist/cli/slack.js +31 -55
- package/dist/cli/sleep-render.d.ts +4 -0
- package/dist/cli/sleep-render.js +61 -0
- package/dist/cli/sleep.d.ts +2 -8
- package/dist/cli/sleep.js +20 -76
- package/dist/cli/status.d.ts +3 -3
- package/dist/cli/status.js +39 -41
- package/dist/{stdin.js → cli/stdin.js} +6 -6
- package/dist/cli/transfer.d.ts +4 -4
- package/dist/cli/transfer.js +68 -42
- package/dist/cli/usage.js +8 -3
- package/dist/cli.d.ts +289 -5
- package/dist/cli.js +184 -117
- package/dist/connectors/dlq.d.ts +44 -0
- package/dist/connectors/dlq.js +30 -0
- package/dist/connectors/github/backfill.d.ts +1 -1
- package/dist/connectors/github/backfill.js +29 -66
- package/dist/connectors/github/cli-impl.js +59 -74
- package/dist/connectors/github/deletion.d.ts +5 -6
- package/dist/connectors/github/deletion.js +18 -52
- package/dist/connectors/github/dlq.d.ts +7 -61
- package/dist/connectors/github/dlq.js +19 -119
- package/dist/connectors/github/ingest.d.ts +2 -31
- package/dist/connectors/github/ingest.js +20 -82
- package/dist/connectors/github/octokit-client.d.ts +1 -1
- package/dist/connectors/github/octokit-client.js +2 -1
- package/dist/connectors/github/tenant-routing.d.ts +2 -2
- package/dist/connectors/github/tenant-routing.js +10 -36
- package/dist/connectors/github/transform.d.ts +1 -1
- package/dist/connectors/github/types.d.ts +1 -1
- package/dist/connectors/github/types.js +15 -18
- package/dist/connectors/github/webhook.d.ts +3 -2
- package/dist/connectors/github/webhook.js +84 -87
- package/dist/connectors/slack/backfill.d.ts +1 -1
- package/dist/connectors/slack/backfill.js +5 -29
- package/dist/connectors/slack/deletion.d.ts +4 -7
- package/dist/connectors/slack/deletion.js +20 -48
- package/dist/connectors/slack/dlq.d.ts +7 -49
- package/dist/connectors/slack/dlq.js +25 -118
- package/dist/connectors/slack/ingest.d.ts +5 -18
- package/dist/connectors/slack/ingest.js +27 -90
- package/dist/connectors/slack/signature.js +2 -1
- package/dist/connectors/slack/tenant-routing.d.ts +4 -1
- package/dist/connectors/slack/tenant-routing.js +13 -14
- package/dist/connectors/slack/transform.d.ts +1 -1
- package/dist/connectors/slack/types.d.ts +1 -1
- package/dist/connectors/slack/types.js +3 -12
- package/dist/connectors/slack/web-client.js +2 -2
- package/dist/connectors/slack/webhook.d.ts +3 -2
- package/dist/connectors/slack/webhook.js +75 -82
- package/dist/connectors/slack/workspaces.d.ts +4 -17
- package/dist/connectors/slack/workspaces.js +4 -34
- package/dist/consolidate/conflicts.d.ts +1 -1
- package/dist/consolidate/conflicts.js +4 -4
- package/dist/{dag.d.ts → consolidate/dag.d.ts} +1 -1
- package/dist/{dag.js → consolidate/dag.js} +60 -81
- package/dist/consolidate/decay.d.ts +2 -2
- package/dist/consolidate/decay.js +28 -22
- package/dist/{dedupe.js → consolidate/dedupe.js} +11 -19
- package/dist/consolidate/flush-units.d.ts +2 -2
- package/dist/{half-life-migration.d.ts → consolidate/half-life-migration.d.ts} +3 -9
- package/dist/consolidate/half-life-migration.js +106 -0
- package/dist/consolidate/llm-passes.js +8 -8
- package/dist/{memory-value.d.ts → consolidate/memory-value.d.ts} +7 -2
- package/dist/{memory-value.js → consolidate/memory-value.js} +9 -7
- package/dist/consolidate/merge.js +57 -54
- package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
- package/dist/{merged-row.js → consolidate/merged-row.js} +2 -2
- package/dist/consolidate/physics-pass.js +46 -46
- package/dist/{replay.d.ts → consolidate/replay.d.ts} +1 -1
- package/dist/{replay.js → consolidate/replay.js} +2 -2
- package/dist/consolidate/run.d.ts +7 -13
- package/dist/consolidate/run.js +6 -37
- package/dist/consolidate/sleep.d.ts +1 -1
- package/dist/consolidate/sleep.js +64 -134
- package/dist/{trace.js → consolidate/trace.js} +4 -6
- package/dist/consolidate/traces.js +34 -29
- package/dist/{ablation.js → core/ablation.js} +1 -1
- 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.js → core/ambient.js} +12 -10
- package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +16 -3
- package/dist/core/capture-contract.js +149 -0
- package/dist/{compare.d.ts → core/compare.d.ts} +2 -0
- package/dist/{compare.js → core/compare.js} +10 -3
- package/dist/{config.d.ts → core/config.d.ts} +6 -6
- package/dist/{config.js → core/config.js} +99 -72
- package/dist/core/handoff.js +87 -0
- package/dist/{memory-quality.js → core/memory-quality.js} +1 -1
- package/dist/{memory.d.ts → core/memory.d.ts} +19 -5
- package/dist/{memory.js → core/memory.js} +117 -82
- package/dist/{physics.d.ts → core/physics.d.ts} +1 -1
- package/dist/{physics.js → core/physics.js} +2 -1
- package/dist/{project-identity.d.ts → core/project-identity.d.ts} +0 -5
- package/dist/{project-identity.js → core/project-identity.js} +5 -17
- package/dist/{project-remote.js → core/project-remote.js} +4 -4
- package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +5 -0
- package/dist/{prompt-recall.js → core/prompt-recall.js} +14 -1
- package/dist/{salience.js → core/salience.js} +35 -20
- 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} +5 -5
- 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} +9 -9
- package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +101 -104
- package/dist/{dashboard.js → dashboard/dashboard.js} +124 -53
- package/dist/db/backup.js +1 -1
- package/dist/db/busy.d.ts +18 -1
- package/dist/db/busy.js +74 -9
- package/dist/db/connect.d.ts +10 -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 +25 -30
- package/dist/db/migrations/v08.js +1 -1
- package/dist/db/migrations/v14.js +39 -35
- package/dist/db/migrations/v16.js +29 -26
- package/dist/db/migrations/v18.js +6 -5
- package/dist/db/migrations/v20.js +4 -2
- package/dist/db/migrations/v22.js +39 -36
- package/dist/db/migrations/v24.js +27 -22
- package/dist/db/migrations/v29.js +37 -32
- package/dist/db/migrations/v31.js +36 -31
- package/dist/db/migrations/v35.js +1 -1
- package/dist/db/migrations/v39.js +1 -1
- package/dist/db/migrations/v40.js +15 -14
- package/dist/db/migrations/v43.js +7 -6
- package/dist/db/migrations/v44.js +1 -1
- package/dist/db/migrations/v45.js +1 -1
- package/dist/db/migrations/v46.js +1 -1
- package/dist/db/migrations/v47.js +1 -1
- 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/v52.js +1 -1
- package/dist/db/open.d.ts +9 -1
- package/dist/db/open.js +21 -4
- package/dist/{physics-state.d.ts → db/physics-state.d.ts} +3 -3
- package/dist/{physics-state.js → db/physics-state.js} +9 -16
- package/dist/{raw-archive-mirror-cleanup.d.ts → db/raw-archive-mirror-cleanup.d.ts} +5 -5
- package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +11 -6
- 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} +4 -2
- package/dist/{vector-store.js → db/vector-store.js} +76 -51
- package/dist/db/wal-checkpointer.d.ts +11 -0
- package/dist/db/wal-checkpointer.js +92 -0
- package/dist/doctor.js +105 -136
- 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 +3 -3
- package/dist/{eval-stats.js → eval/eval-stats.js} +12 -9
- package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +1 -1
- package/dist/{eval-suite.js → eval/eval-suite.js} +25 -23
- package/dist/{eval.d.ts → eval/eval.d.ts} +1 -1
- package/dist/{eval.js → eval/eval.js} +29 -22
- package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -3
- package/dist/{judgment.js → eval/judgment.js} +4 -9
- package/dist/extensions/openclaw-plugin/index.js +1 -2
- 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} +6 -6
- package/dist/{graph-extract.js → graph/extract.js} +37 -52
- package/dist/{graph-recall.d.ts → graph/recall.d.ts} +2 -2
- package/dist/{graph-recall.js → graph/recall.js} +55 -36
- package/dist/{graph-stream.d.ts → graph/stream.d.ts} +2 -2
- package/dist/{graph-stream.js → graph/stream.js} +9 -7
- package/dist/{graph-view.d.ts → graph/view.d.ts} +6 -3
- package/dist/{graph-view.js → graph/view.js} +127 -167
- 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 +14 -15
- package/dist/hooks/copilot.d.ts +48 -13
- package/dist/hooks/copilot.js +124 -39
- package/dist/{cli → hooks}/hook-blocks.js +1 -1
- package/dist/hooks/json-hooks.d.ts +3 -1
- package/dist/hooks/json-hooks.js +40 -122
- package/dist/hooks/opencode.js +35 -27
- package/dist/hooks/shared.d.ts +7 -5
- package/dist/hooks/shared.js +19 -8
- package/dist/importers/core.d.ts +2 -6
- package/dist/importers/core.js +41 -39
- package/dist/importers/markdown-parse.d.ts +1 -10
- package/dist/importers/markdown-parse.js +2 -19
- package/dist/importers/markdown.js +2 -1
- package/dist/importers/sources.js +50 -46
- package/dist/importers/vault.js +71 -92
- package/dist/index.d.ts +22 -22
- package/dist/index.js +21 -21
- package/dist/{autolearn.d.ts → learn/autolearn.d.ts} +2 -2
- package/dist/{autolearn.js → learn/autolearn.js} +13 -11
- 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 +125 -0
- package/dist/{forward-claim-detector.d.ts → learn/forward-claim-detector.d.ts} +1 -1
- package/dist/{forward-claim-detector.js → learn/forward-claim-detector.js} +1 -1
- package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +4 -0
- package/dist/{invalidation.js → learn/invalidation.js} +83 -99
- package/dist/mcp/admin-tools.d.ts +1 -1
- package/dist/mcp/admin-tools.js +37 -60
- 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.d.ts +2 -2
- package/dist/mcp/memory-tools.js +12 -31
- package/dist/mcp/protocol.d.ts +6 -10
- package/dist/mcp/protocol.js +8 -14
- package/dist/mcp/recall-tools.d.ts +2 -2
- package/dist/mcp/recall-tools.js +68 -50
- package/dist/mcp/request.js +65 -63
- package/dist/mcp/server.js +1 -1
- package/dist/mcp/session-state.d.ts +1 -2
- package/dist/mcp/session-state.js +2 -2
- package/dist/mcp/shared-gate.js +1 -1
- package/dist/mcp/stdio.js +69 -31
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +2 -2
- package/dist/{customer-notes.d.ts → objects/customer-notes.d.ts} +7 -24
- package/dist/objects/customer-notes.js +112 -0
- package/dist/{decisions.d.ts → objects/decisions.d.ts} +13 -28
- package/dist/objects/decisions.js +101 -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/{incidents.d.ts → objects/incidents.d.ts} +17 -44
- package/dist/objects/incidents.js +130 -0
- package/dist/objects/lifecycle.d.ts +27 -0
- package/dist/objects/lifecycle.js +96 -0
- package/dist/{policies.d.ts → objects/policies.d.ts} +14 -27
- package/dist/objects/policies.js +189 -0
- package/dist/{processes.d.ts → objects/processes.d.ts} +14 -34
- package/dist/objects/processes.js +146 -0
- package/dist/{project-briefs.d.ts → objects/project-briefs.d.ts} +19 -40
- package/dist/objects/project-briefs.js +255 -0
- package/dist/{skills.d.ts → objects/skills.d.ts} +11 -26
- package/dist/objects/skills.js +156 -0
- package/dist/postinstall.js +4 -2
- package/dist/predictions/planning-fallacy.d.ts +4 -76
- package/dist/predictions/planning-fallacy.js +4 -129
- package/dist/rerankers/clef.d.ts +2 -6
- package/dist/rerankers/clef.js +27 -47
- package/dist/rerankers/cross-encoder.d.ts +0 -7
- package/dist/rerankers/cross-encoder.js +15 -23
- package/dist/rerankers/index.js +8 -7
- package/dist/rerankers/jev.d.ts +1 -4
- package/dist/rerankers/jev.js +30 -49
- package/dist/rerankers/llm.d.ts +2 -4
- package/dist/rerankers/llm.js +33 -50
- package/dist/rerankers/outage-warning.d.ts +7 -0
- package/dist/rerankers/outage-warning.js +31 -0
- package/dist/rerankers/remote.d.ts +3 -0
- package/dist/rerankers/remote.js +23 -0
- package/dist/rerankers/types.d.ts +1 -1
- 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 -1
- package/dist/search/boosts.js +34 -13
- 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/hybrid-score.d.ts +2 -2
- package/dist/search/hybrid-score.js +1 -1
- package/dist/search/hybrid.d.ts +4 -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} +7 -5
- package/dist/{path-context.js → search/path-context.js} +3 -1
- package/dist/search/physics-search.d.ts +4 -4
- package/dist/search/physics-search.js +15 -15
- package/dist/search/rerank.d.ts +3 -3
- package/dist/search/rerank.js +4 -3
- package/dist/search/temporal.d.ts +1 -1
- package/dist/search/temporal.js +5 -2
- package/dist/search/vector.d.ts +3 -3
- package/dist/search/vector.js +17 -11
- package/dist/server/auth.d.ts +1 -1
- package/dist/server/auth.js +26 -18
- package/dist/server/boot.d.ts +24 -0
- package/dist/server/boot.js +465 -0
- package/dist/server/client-ip.d.ts +5 -1
- package/dist/server/client-ip.js +18 -6
- 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/key-check-bounds.d.ts +8 -0
- package/dist/server/key-check-bounds.js +46 -0
- package/dist/server/lifecycle.js +1 -1
- package/dist/server/mcp-http.d.ts +1 -4
- package/dist/server/mcp-http.js +34 -24
- package/dist/server/ready.d.ts +7 -0
- package/dist/server/ready.js +38 -0
- package/dist/server/request.d.ts +10 -4
- package/dist/server/request.js +63 -12
- package/dist/server/route-table.d.ts +15 -0
- package/dist/server/route-table.js +209 -0
- package/dist/server/routes/admin.js +13 -8
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +32 -97
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +42 -105
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +42 -95
- package/dist/server/routes/memories.js +21 -20
- package/dist/server/routes/object-routes.d.ts +40 -0
- package/dist/server/routes/object-routes.js +80 -0
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +40 -124
- package/dist/server/routes/predictions.js +29 -45
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +38 -118
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +38 -110
- package/dist/server/routes/recall.js +14 -12
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +37 -125
- package/dist/{server-detect.js → server/server-detect.js} +3 -2
- 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 +70 -0
- package/dist/server/tls.d.ts +6 -0
- package/dist/server/tls.js +24 -0
- package/dist/server/types.d.ts +27 -8
- package/dist/server/validation.d.ts +3 -4
- package/dist/server/validation.js +6 -11
- package/dist/server.d.ts +41 -50
- package/dist/server.js +26 -560
- package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +1 -1
- package/dist/{project-merge.js → sharing/project-merge.js} +26 -45
- package/dist/{scope.js → sharing/scope.js} +1 -1
- package/dist/{shared.d.ts → sharing/shared.d.ts} +10 -9
- package/dist/{shared.js → sharing/shared.js} +100 -77
- package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
- package/dist/{ambient-store.js → store/ambient.js} +10 -10
- package/dist/store/audit-event.d.ts +12 -6
- package/dist/store/audit-event.js +6 -5
- package/dist/{audit.d.ts → store/audit.d.ts} +27 -3
- package/dist/{audit.js → store/audit.js} +91 -6
- package/dist/{auth.d.ts → store/auth.d.ts} +15 -32
- package/dist/{auth.js → store/auth.js} +100 -92
- package/dist/store/candidates.d.ts +23 -12
- package/dist/store/candidates.js +87 -35
- package/dist/{card-detail.d.ts → store/card-detail.d.ts} +3 -3
- package/dist/{card-detail.js → store/card-detail.js} +1 -1
- package/dist/{store-cards.d.ts → store/cards.d.ts} +14 -9
- package/dist/{store-cards.js → store/cards.js} +85 -146
- package/dist/store/compactions.d.ts +78 -0
- package/dist/store/compactions.js +93 -0
- package/dist/store/conflicts.d.ts +22 -5
- package/dist/store/conflicts.js +160 -109
- 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 +92 -0
- package/dist/store/delete-and-batch.d.ts +20 -24
- package/dist/store/delete-and-batch.js +64 -40
- package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +12 -5
- package/dist/{delivery-recorder.js → store/delivery-recorder.js} +42 -30
- 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 +51 -0
- package/dist/store/doctor-reads.d.ts +16 -0
- package/dist/store/doctor-reads.js +19 -0
- package/dist/{dormant.d.ts → store/dormant.d.ts} +46 -12
- package/dist/{dormant.js → store/dormant.js} +151 -6
- package/dist/{embeddings.d.ts → store/embeddings/index.d.ts} +10 -6
- package/dist/{embeddings.js → store/embeddings/index.js} +60 -44
- package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
- package/dist/{local-embedding.js → store/embeddings/local.js} +68 -57
- package/dist/{embedding-provider.d.ts → store/embeddings/provider.d.ts} +2 -2
- package/dist/{embedding-provider.js → store/embeddings/provider.js} +47 -32
- package/dist/store/entry-reads.d.ts +46 -7
- package/dist/store/entry-reads.js +120 -21
- package/dist/store/entry-row.d.ts +8 -2
- package/dist/store/entry-row.js +28 -8
- package/dist/store/entry-writes.d.ts +33 -4
- package/dist/store/entry-writes.js +108 -26
- 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/{goals.d.ts → store/goals.d.ts} +6 -46
- package/dist/{goals.js → store/goals.js} +45 -94
- package/dist/store/graph-queue.d.ts +29 -0
- package/dist/store/graph-queue.js +101 -0
- package/dist/{graph/read.d.ts → store/graph-reads.d.ts} +26 -34
- package/dist/{graph/read.js → store/graph-reads.js} +63 -115
- package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +68 -8
- package/dist/{graph/rows.js → store/graph-rows.js} +14 -3
- package/dist/store/graph-view-rows.d.ts +12 -0
- package/dist/store/graph-view-rows.js +67 -0
- package/dist/store/graph-writes.d.ts +58 -0
- package/dist/store/graph-writes.js +256 -0
- package/dist/store/half-life.d.ts +34 -0
- package/dist/store/half-life.js +77 -0
- package/dist/store/handoffs.d.ts +6 -3
- package/dist/store/handoffs.js +70 -31
- package/dist/store/index-and-stats.d.ts +8 -1
- package/dist/store/index-and-stats.js +51 -48
- 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 +1 -1
- package/dist/store/markdown.js +4 -3
- package/dist/store/mirrors.d.ts +5 -7
- package/dist/store/mirrors.js +39 -25
- package/dist/store/object-types.d.ts +189 -0
- package/dist/store/object-types.js +4 -0
- package/dist/store/open.d.ts +8 -4
- package/dist/store/open.js +34 -23
- package/dist/store/planning-fallacy-evidence.d.ts +42 -0
- package/dist/store/planning-fallacy-evidence.js +81 -0
- package/dist/store/port.d.ts +646 -0
- package/dist/store/port.js +17 -0
- package/dist/{predictions/store.d.ts → store/predictions.d.ts} +15 -2
- package/dist/{predictions/store.js → store/predictions.js} +52 -67
- package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
- package/dist/{quarantine.js → store/quarantine.js} +64 -22
- package/dist/{raw-archive.d.ts → store/raw-archive.d.ts} +5 -3
- package/dist/{raw-archive.js → store/raw-archive.js} +11 -5
- package/dist/{recall-scope.d.ts → store/recall-scope.d.ts} +4 -7
- package/dist/{recall-scope.js → store/recall-scope.js} +8 -9
- package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -14
- package/dist/{recall-trace.js → store/recall-trace.js} +38 -43
- package/dist/store/rejected-values.d.ts +55 -0
- package/dist/store/rejected-values.js +162 -0
- package/dist/{rejection.d.ts → store/rejection.d.ts} +2 -2
- package/dist/{rejection.js → store/rejection.js} +3 -2
- package/dist/store/rows.d.ts +2 -3
- package/dist/store/rows.js +18 -11
- package/dist/store/search-rows.d.ts +15 -4
- package/dist/store/search-rows.js +43 -36
- package/dist/store/sessions.d.ts +18 -2
- package/dist/store/sessions.js +83 -46
- 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/sqlite/entry-writes-group.js +170 -0
- package/dist/store/sqlite/error-codec.d.ts +17 -0
- package/dist/store/sqlite/error-codec.js +59 -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 +28 -0
- package/dist/store/sqlite/executor.js +286 -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 +38 -0
- package/dist/store/sqlite/object-rows.d.ts +102 -0
- package/dist/store/sqlite/object-rows.js +218 -0
- package/dist/store/sqlite/objects-group.d.ts +20 -0
- package/dist/store/sqlite/objects-group.js +314 -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 +26 -0
- package/dist/store/sqlite/store.js +295 -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 +124 -0
- package/dist/store/sqlite/worker-ops.js +82 -0
- package/dist/store/sqlite/worker-store.d.ts +8 -0
- package/dist/store/sqlite/worker-store.js +76 -0
- package/dist/store/summaries.d.ts +2 -11
- package/dist/store/summaries.js +17 -44
- package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
- package/dist/store/tenant-lookup.d.ts +1 -1
- package/dist/{tenant.d.ts → store/tenant.d.ts} +2 -2
- package/dist/{tenant.js → store/tenant.js} +1 -1
- 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} +2 -9
- package/dist/{token-ledger.js → store/token-ledger.js} +31 -78
- 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 +26 -0
- package/dist/store/vector-writes.d.ts +10 -3
- package/dist/store/vector-writes.js +35 -5
- package/dist/{working-memory.d.ts → store/working-memory.d.ts} +5 -1
- package/dist/{working-memory.js → store/working-memory.js} +39 -41
- package/dist/support-bundle.d.ts +1 -1
- package/dist/support-bundle.js +13 -33
- 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 +67 -0
- package/dist/util/anthropic-messages.d.ts +31 -0
- package/dist/util/anthropic-messages.js +46 -0
- package/dist/util/atomic-write.d.ts +3 -0
- package/dist/util/atomic-write.js +107 -0
- package/dist/util/crash-handlers.d.ts +5 -0
- package/dist/util/crash-handlers.js +30 -0
- package/dist/{env.d.ts → util/env.d.ts} +17 -2
- package/dist/{env.js → util/env.js} +22 -2
- package/dist/util/home-path.js +67 -0
- package/dist/{http-retry.d.ts → util/http-retry.d.ts} +6 -2
- package/dist/{http-retry.js → util/http-retry.js} +38 -7
- 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} +5 -2
- package/dist/{log.js → util/log.js} +12 -3
- package/dist/util/real-path.d.ts +3 -0
- package/dist/util/real-path.js +15 -0
- package/dist/util/request-scope.d.ts +27 -0
- package/dist/util/request-scope.js +47 -0
- package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
- package/dist/{secret-detect.js → util/secret-detect.js} +5 -4
- 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 +18 -0
- package/dist/util/token-text.js +23 -0
- package/dist/{version.d.ts → util/version.d.ts} +1 -1
- package/dist/{version.js → util/version.js} +1 -1
- package/extensions/openclaw-plugin/index.ts +1 -5
- 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/api.d.ts +0 -26
- package/dist/api.js +0 -29
- package/dist/capture-contract.js +0 -49
- 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/customer-notes.js +0 -336
- package/dist/db.d.ts +0 -9
- package/dist/db.js +0 -8
- package/dist/decisions.js +0 -326
- package/dist/extract.js +0 -133
- package/dist/graph/rows.d.ts +0 -45
- package/dist/graph/types.js +0 -11
- package/dist/half-life-migration.js +0 -182
- package/dist/handoff.js +0 -68
- package/dist/home-path.js +0 -24
- 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/policies.js +0 -434
- package/dist/processes.js +0 -371
- package/dist/project-briefs.js +0 -523
- package/dist/reject-flow.d.ts +0 -69
- package/dist/reject-flow.js +0 -260
- package/dist/session-owners.d.ts +0 -7
- package/dist/session-owners.js +0 -54
- package/dist/skills.js +0 -367
- package/dist/store-port.d.ts +0 -191
- package/dist/store-port.js +0 -166
- /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/{recall-history.d.ts → api/recall-history.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/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +0 -0
- /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
- /package/dist/{correction-latency.js → cli/correction-latency.js} +0 -0
- /package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +0 -0
- /package/dist/{quality-repair.d.ts → cli/quality-repair.d.ts} +0 -0
- /package/dist/{stdin.d.ts → cli/stdin.d.ts} +0 -0
- /package/dist/{dedupe.d.ts → consolidate/dedupe.d.ts} +0 -0
- /package/dist/{memory-value-weights.d.ts → consolidate/memory-value-weights.d.ts} +0 -0
- /package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +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/{trace.d.ts → consolidate/trace.d.ts} +0 -0
- /package/dist/{ablation.d.ts → core/ablation.d.ts} +0 -0
- /package/dist/{ambient.d.ts → core/ambient.d.ts} +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/{card.d.ts → core/card.d.ts} +0 -0
- /package/dist/{card.js → core/card.js} +0 -0
- /package/dist/{handoff.d.ts → core/handoff.d.ts} +0 -0
- /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
- /package/dist/{physics-config.d.ts → core/physics-config.d.ts} +0 -0
- /package/dist/{physics-config.js → core/physics-config.js} +0 -0
- /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
- /package/dist/{salience.d.ts → core/salience.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.d.ts → dashboard/dashboard-types.d.ts} +0 -0
- /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
- /package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +0 -0
- /package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +0 -0
- /package/dist/{cli → hooks}/hook-blocks.d.ts +0 -0
- /package/dist/{path-context.d.ts → search/path-context.d.ts} +0 -0
- /package/dist/{rrf.d.ts → search/rrf.d.ts} +0 -0
- /package/dist/{rrf.js → search/rrf.js} +0 -0
- /package/dist/{rate-limit.d.ts → server/rate-limit.d.ts} +0 -0
- /package/dist/{rate-limit.js → server/rate-limit.js} +0 -0
- /package/dist/{server-detect.d.ts → server/server-detect.d.ts} +0 -0
- /package/dist/{scope.d.ts → sharing/scope.d.ts} +0 -0
- /package/dist/{summary-dirty.js → store/summary-dirty.js} +0 -0
- /package/dist/{yaml.d.ts → store/yaml.d.ts} +0 -0
- /package/dist/{yaml.js → store/yaml.js} +0 -0
- /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
- /package/dist/{escape.js → util/escape.js} +0 -0
- /package/dist/{home-path.d.ts → util/home-path.d.ts} +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/{secret-detect.d.ts → util/secret-detect.d.ts} +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/{transcript-tail.d.ts → util/transcript-tail.d.ts} +0 -0
- /package/dist/{transcript-tail.js → util/transcript-tail.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
|
@@ -2,18 +2,19 @@
|
|
|
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 { 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';
|
|
17
18
|
const MIME_TYPES = {
|
|
18
19
|
'.html': 'text/html; charset=utf-8',
|
|
19
20
|
'.js': 'application/javascript; charset=utf-8',
|
|
@@ -72,6 +73,10 @@ function readActionBody(req) {
|
|
|
72
73
|
const chunks = [];
|
|
73
74
|
let size = 0;
|
|
74
75
|
let aborted = false;
|
|
76
|
+
const deadlineMs = bodyDeadlineMs();
|
|
77
|
+
const timer = setTimeout(() => reject(new BodyTimeoutError(`request body not received within ${deadlineMs} ms`)), deadlineMs);
|
|
78
|
+
// Unref: a request that already failed another way must not hold the process open for the rest of the deadline.
|
|
79
|
+
timer.unref();
|
|
75
80
|
req.on('data', (chunk) => {
|
|
76
81
|
size += chunk.length;
|
|
77
82
|
if (size <= BODY_MAX_BYTES)
|
|
@@ -83,6 +88,7 @@ function readActionBody(req) {
|
|
|
83
88
|
});
|
|
84
89
|
req.on('error', reject);
|
|
85
90
|
req.on('end', () => {
|
|
91
|
+
clearTimeout(timer);
|
|
86
92
|
if (size > BODY_MAX_BYTES)
|
|
87
93
|
return reject(new ParamError(`Body must be at most ${BODY_MAX_BYTES} bytes`));
|
|
88
94
|
try {
|
|
@@ -123,7 +129,7 @@ function handleRead(ctx, segments) {
|
|
|
123
129
|
return sendOrNotFound(res, null);
|
|
124
130
|
const snapshotId = snapshots.get(tenantId, fresh).id;
|
|
125
131
|
const embedded = snapshots.embeddedIds()?.has(entry.id) ?? false;
|
|
126
|
-
return sendOrNotFound(res, buildMemoryDetail(hippoRoot, tenantId, entry, snapshotId, ctx.now(), embedded));
|
|
132
|
+
return sendOrNotFound(res, buildMemoryDetail(hippoRoot, tenantId, entry, { snapshotId, nowMs: ctx.now(), embedded }));
|
|
127
133
|
}
|
|
128
134
|
if (head === 'search' && segments.length === 2) {
|
|
129
135
|
return sendOrNotFound(res, buildSearch(snapshots.get(tenantId, fresh), parseSearchText(url.searchParams)));
|
|
@@ -175,7 +181,7 @@ async function handlePost(ctx, segments) {
|
|
|
175
181
|
if (result.entry) {
|
|
176
182
|
// The write is committed, so a rebuild failure must not turn it into a 500: the next read rebuilds.
|
|
177
183
|
const embedded = snapshots.embeddedIds()?.has(result.entry.id) ?? false;
|
|
178
|
-
const detail = buildMemoryDetail(hippoRoot, tenantId, result.entry, snapshots.currentId(), ctx.now(), embedded);
|
|
184
|
+
const detail = buildMemoryDetail(hippoRoot, tenantId, result.entry, { snapshotId: snapshots.currentId(), nowMs: ctx.now(), embedded });
|
|
179
185
|
jsonResponse(res, detail, result.status);
|
|
180
186
|
}
|
|
181
187
|
else {
|
|
@@ -183,21 +189,43 @@ async function handlePost(ctx, segments) {
|
|
|
183
189
|
}
|
|
184
190
|
return true;
|
|
185
191
|
}
|
|
192
|
+
// One style block, not style attributes, so the policy below can name its hash and allow no other inline style.
|
|
193
|
+
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}" +
|
|
194
|
+
'h1{color:#c45c3c}' +
|
|
195
|
+
'pre{background:#faf7f2;padding:16px;border:1px solid #c4b9a8;border-radius:3px;font-family:Consolas,monospace}';
|
|
196
|
+
// 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.
|
|
197
|
+
const SECURITY_HEADERS = {
|
|
198
|
+
'Content-Security-Policy': [
|
|
199
|
+
"default-src 'none'",
|
|
200
|
+
"script-src 'self'",
|
|
201
|
+
`style-src 'self' 'sha256-${createHash('sha256').update(NOT_BUILT_CSS).digest('base64')}'`,
|
|
202
|
+
"img-src 'self' data:",
|
|
203
|
+
"font-src 'self'",
|
|
204
|
+
"connect-src 'self'",
|
|
205
|
+
"base-uri 'none'",
|
|
206
|
+
"form-action 'none'",
|
|
207
|
+
"frame-ancestors 'none'",
|
|
208
|
+
].join('; '),
|
|
209
|
+
'X-Content-Type-Options': 'nosniff',
|
|
210
|
+
'Referrer-Policy': 'no-referrer',
|
|
211
|
+
'X-Frame-Options': 'DENY',
|
|
212
|
+
};
|
|
186
213
|
function notBuilt(res) {
|
|
187
214
|
res.writeHead(404, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
188
215
|
res.end(`<!doctype html>
|
|
189
|
-
<html lang="en"><head><title>Hippo Dashboard</title><meta charset="utf-8"></head>
|
|
190
|
-
<body
|
|
191
|
-
<h1
|
|
216
|
+
<html lang="en"><head><title>Hippo Dashboard</title><meta charset="utf-8"><style>${NOT_BUILT_CSS}</style></head>
|
|
217
|
+
<body>
|
|
218
|
+
<h1>Hippo Dashboard</h1>
|
|
192
219
|
<p>The React UI bundle is not built yet. Run:</p>
|
|
193
|
-
<pre
|
|
220
|
+
<pre>cd ui && npm install && npm run build</pre>
|
|
194
221
|
<p>Then refresh this page. The dashboard server will serve <code>dist-ui/index.html</code> automatically once present.</p>
|
|
195
222
|
</body></html>`);
|
|
196
223
|
}
|
|
197
224
|
function serveSpa(res, distUiDir, pathname) {
|
|
198
225
|
const safePath = path.normalize(pathname).replace(/^(\.\.[/\\])+/, '');
|
|
199
226
|
const filePath = path.join(distUiDir, safePath);
|
|
200
|
-
|
|
227
|
+
// The separator matters: a bare prefix also admits a sibling folder whose name starts with this one.
|
|
228
|
+
if (filePath !== distUiDir && !filePath.startsWith(distUiDir + path.sep))
|
|
201
229
|
return forbidden(res);
|
|
202
230
|
if (fs.existsSync(filePath) && fs.statSync(filePath).isFile() && serveStaticFile(res, filePath))
|
|
203
231
|
return;
|
|
@@ -221,6 +249,78 @@ function cookieValue(header, name) {
|
|
|
221
249
|
}
|
|
222
250
|
return undefined;
|
|
223
251
|
}
|
|
252
|
+
/** 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. */
|
|
253
|
+
function tokenFreeLocation(req, url) {
|
|
254
|
+
if ((req.method !== 'GET' && req.method !== 'HEAD') || url.pathname.startsWith('/api/'))
|
|
255
|
+
return null;
|
|
256
|
+
const query = new URLSearchParams(url.searchParams);
|
|
257
|
+
query.delete('token');
|
|
258
|
+
const rest = query.toString();
|
|
259
|
+
// One leading slash only: `//host` would send the browser to another site.
|
|
260
|
+
return `${url.pathname.replace(/^\/+/, '/')}${rest ? `?${rest}` : ''}`;
|
|
261
|
+
}
|
|
262
|
+
/** 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. */
|
|
263
|
+
function leaveTokenUrl(req, res, url) {
|
|
264
|
+
const location = tokenFreeLocation(req, url);
|
|
265
|
+
if (location === null)
|
|
266
|
+
return false;
|
|
267
|
+
if (req.headers['sec-fetch-site'] !== 'cross-site') {
|
|
268
|
+
res.writeHead(303, { Location: location });
|
|
269
|
+
res.end();
|
|
270
|
+
return true;
|
|
271
|
+
}
|
|
272
|
+
// A browser withholds a SameSite=Strict cookie from a redirect another site started; a refresh from this page is same-site.
|
|
273
|
+
const target = location.replace(/&/g, '&').replace(/"/g, '"');
|
|
274
|
+
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
275
|
+
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>`);
|
|
276
|
+
return true;
|
|
277
|
+
}
|
|
278
|
+
/** True when the request may proceed; false when this already answered it (redirect off the token URL, or 401). */
|
|
279
|
+
function admitDashboardRequest(req, res, url, access) {
|
|
280
|
+
const { token, port } = access;
|
|
281
|
+
// Cookies ignore the port, so the name carries it: two dashboards on one host keep separate tokens.
|
|
282
|
+
const cookieName = `hippo_dashboard_${req.socket.localPort ?? port}`;
|
|
283
|
+
if (sameToken(url.searchParams.get('token') ?? undefined, token)) {
|
|
284
|
+
res.setHeader('Set-Cookie', `${cookieName}=${token}; HttpOnly; SameSite=Strict; Path=/`);
|
|
285
|
+
if (leaveTokenUrl(req, res, url))
|
|
286
|
+
return false;
|
|
287
|
+
}
|
|
288
|
+
else if (!sameToken(cookieValue(req.headers.cookie, cookieName), token)) {
|
|
289
|
+
res.writeHead(401, { 'Content-Type': 'text/plain' });
|
|
290
|
+
res.end('Unauthorized: open the dashboard with the URL `hippo dashboard` printed; it carries the access token.');
|
|
291
|
+
return false;
|
|
292
|
+
}
|
|
293
|
+
return true;
|
|
294
|
+
}
|
|
295
|
+
function answerDashboardFailure(req, res, err) {
|
|
296
|
+
const clientFault = err instanceof ParamError || err instanceof URIError || err instanceof BodyTimeoutError;
|
|
297
|
+
// A cut-short response is logged even for a client fault; a bare 400 is not.
|
|
298
|
+
if (res.headersSent || !clientFault) {
|
|
299
|
+
log.error('dashboard request failed', { error: errorMessage(err), path: req.url });
|
|
300
|
+
}
|
|
301
|
+
if (res.headersSent) {
|
|
302
|
+
res.end();
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
if (err instanceof BodyDrainExceeded || err instanceof BodyTimeoutError) {
|
|
306
|
+
// No `Connection: close` header: Node then destroys the socket as soon as the reply is written.
|
|
307
|
+
res.writeHead(err instanceof BodyTimeoutError ? 408 : 400, { 'Content-Type': 'application/json; charset=utf-8' });
|
|
308
|
+
res.end(JSON.stringify({ error: err.message }), () => closeAfterReply(req));
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
if (err instanceof ParamError)
|
|
312
|
+
return jsonResponse(res, { error: err.message }, 400);
|
|
313
|
+
if (err instanceof URIError)
|
|
314
|
+
return jsonResponse(res, { error: 'Malformed URL path' }, 400);
|
|
315
|
+
jsonResponse(res, { error: 'Internal error' }, 500);
|
|
316
|
+
}
|
|
317
|
+
function printDashboardBanner(boundPort, token, distUiDir) {
|
|
318
|
+
// The banner is the `hippo dashboard` command's printed result, so it stays on stdout.
|
|
319
|
+
console.log(`Hippo Dashboard running at http://localhost:${boundPort}/?token=${token}`);
|
|
320
|
+
if (distUiDir !== null)
|
|
321
|
+
console.log(`Serving React UI from ${distUiDir}`);
|
|
322
|
+
console.log('Press Ctrl+C to stop.');
|
|
323
|
+
}
|
|
224
324
|
/** 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
325
|
export function serveDashboard(hippoRoot, port = 3333, token = randomBytes(32).toString('base64url'), opts) {
|
|
226
326
|
const distUiDir = path.resolve(import.meta.dirname, '..', 'dist-ui');
|
|
@@ -232,16 +332,8 @@ export function serveDashboard(hippoRoot, port = 3333, token = randomBytes(32).t
|
|
|
232
332
|
if (host !== undefined && !LOOPBACK_HOST_HEADER.test(host))
|
|
233
333
|
return forbidden(res);
|
|
234
334
|
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.');
|
|
335
|
+
if (!admitDashboardRequest(req, res, url, { token, port }))
|
|
243
336
|
return;
|
|
244
|
-
}
|
|
245
337
|
if (url.pathname.startsWith('/api/')) {
|
|
246
338
|
// A malformed % sequence throws URIError here; the caller answers 400.
|
|
247
339
|
const segments = url.pathname.split('/').filter((s) => s !== '').map((s) => decodeURIComponent(s));
|
|
@@ -257,39 +349,18 @@ export function serveDashboard(hippoRoot, port = 3333, token = randomBytes(32).t
|
|
|
257
349
|
return serveSpa(res, distUiDir, url.pathname);
|
|
258
350
|
notBuilt(res);
|
|
259
351
|
};
|
|
260
|
-
const
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
if (res.headersSent) {
|
|
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
|
-
});
|
|
352
|
+
const onRequest = (req, res) => {
|
|
353
|
+
for (const [name, value] of Object.entries(SECURITY_HEADERS))
|
|
354
|
+
res.setHeader(name, value);
|
|
355
|
+
handleRequest(req, res).catch((err) => answerDashboardFailure(req, res, err));
|
|
356
|
+
};
|
|
357
|
+
// One id per request, so the lines it logs can be told apart from a concurrent request's.
|
|
358
|
+
const server = http.createServer((req, res) => runWithRequestId(randomUUID(), () => onRequest(req, res)));
|
|
284
359
|
server.on('close', () => snapshots.close());
|
|
285
360
|
server.listen(port, '127.0.0.1', () => {
|
|
286
361
|
// SAFETY: listen() was given a TCP port, so address() is AddressInfo, never a pipe name.
|
|
287
362
|
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.');
|
|
363
|
+
printDashboardBanner(boundPort, token, hasDistUi ? distUiDir : null);
|
|
293
364
|
});
|
|
294
365
|
return server;
|
|
295
366
|
}
|
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
|
@@ -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
|
package/dist/db/busy.js
CHANGED
|
@@ -32,11 +32,23 @@ export function execWithBusyRetry(db, sql, timeoutMs = 30000) {
|
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
|
+
function undoScope(db, top, name) {
|
|
36
|
+
if (top) {
|
|
37
|
+
db.exec('ROLLBACK');
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
db.exec(`ROLLBACK TO SAVEPOINT ${name}`);
|
|
41
|
+
db.exec(`RELEASE SAVEPOINT ${name}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
35
44
|
/** Runs `fn` as one write: BEGIN IMMEDIATE on an idle handle, else SAVEPOINT `name` inside the caller's transaction.
|
|
36
45
|
* A deferred scope that reads first cannot wait out another writer, while BEGIN IMMEDIATE waits the open's busy_timeout. */
|
|
37
|
-
export function withWriteScope(db, name, fn) {
|
|
46
|
+
export function withWriteScope(db, name, fn, opts) {
|
|
38
47
|
const top = db.isTransaction === false;
|
|
39
|
-
|
|
48
|
+
if (top && opts)
|
|
49
|
+
execWithBusyRetry(db, 'BEGIN IMMEDIATE', opts.busyWaitMs);
|
|
50
|
+
else
|
|
51
|
+
db.exec(top ? 'BEGIN IMMEDIATE' : `SAVEPOINT ${name}`);
|
|
40
52
|
try {
|
|
41
53
|
const result = fn();
|
|
42
54
|
db.exec(top ? 'COMMIT' : `RELEASE SAVEPOINT ${name}`);
|
|
@@ -44,13 +56,66 @@ export function withWriteScope(db, name, fn) {
|
|
|
44
56
|
}
|
|
45
57
|
catch (error) {
|
|
46
58
|
try {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
59
|
+
undoScope(db, top, name);
|
|
60
|
+
}
|
|
61
|
+
catch { /* already rolled back; keep the original error */ }
|
|
62
|
+
throw error;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/** Runs the reads in `fn` against one snapshot, so two statements cannot straddle another process's write. */
|
|
66
|
+
export function withReadSnapshot(db, fn) {
|
|
67
|
+
if (db.isTransaction !== false)
|
|
68
|
+
return fn();
|
|
69
|
+
db.exec('BEGIN');
|
|
70
|
+
try {
|
|
71
|
+
return fn();
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
db.exec('COMMIT');
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/** 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. */
|
|
78
|
+
export function withTrialScope(db, name, fn) {
|
|
79
|
+
const top = db.isTransaction === false;
|
|
80
|
+
db.exec(top ? 'BEGIN' : `SAVEPOINT ${name}`);
|
|
81
|
+
let result;
|
|
82
|
+
try {
|
|
83
|
+
result = fn();
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
try {
|
|
87
|
+
undoScope(db, top, name);
|
|
88
|
+
}
|
|
89
|
+
catch { /* already rolled back; keep the original error */ }
|
|
90
|
+
throw error;
|
|
91
|
+
}
|
|
92
|
+
undoScope(db, top, name);
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
95
|
+
/** What `withWriteScopeOr` hands its callback's `rollback(value)`; a class so no stored value can pass for one. */
|
|
96
|
+
class RolledBack {
|
|
97
|
+
value;
|
|
98
|
+
constructor(value) {
|
|
99
|
+
this.value = value;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/** `withWriteScope` for a write that can refuse: a callback that returns `rollback(value)` gets the scope's writes undone
|
|
103
|
+
* and `value` back, with no throw. Any other return commits. */
|
|
104
|
+
export function withWriteScopeOr(db, name, fn) {
|
|
105
|
+
const top = db.isTransaction === false;
|
|
106
|
+
db.exec(top ? 'BEGIN IMMEDIATE' : `SAVEPOINT ${name}`);
|
|
107
|
+
try {
|
|
108
|
+
const result = fn((value) => new RolledBack(value));
|
|
109
|
+
if (result instanceof RolledBack) {
|
|
110
|
+
undoScope(db, top, name);
|
|
111
|
+
return result.value;
|
|
112
|
+
}
|
|
113
|
+
db.exec(top ? 'COMMIT' : `RELEASE SAVEPOINT ${name}`);
|
|
114
|
+
return result;
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
try {
|
|
118
|
+
undoScope(db, top, name);
|
|
54
119
|
}
|
|
55
120
|
catch { /* already rolled back; keep the original error */ }
|
|
56
121
|
throw error;
|
package/dist/db/connect.d.ts
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import { type DatabaseSyncLike } from './sqlite.js';
|
|
2
|
+
import { type OpenFacts } from './migrate.js';
|
|
2
3
|
export declare function getHippoDbPath(hippoRoot: string): string;
|
|
3
|
-
/**
|
|
4
|
-
export declare function
|
|
4
|
+
/** Runs `step` on this store unless it already ran to the end in this process; a throw leaves it due. */
|
|
5
|
+
export declare function oncePerStore(hippoRoot: string, name: string, step: () => void): void;
|
|
6
|
+
/** A connection with what its own open's probe read; facts go stale with the next statement, so a handle made by an earlier call carries null. */
|
|
7
|
+
export interface OpenedDb {
|
|
8
|
+
readonly db: DatabaseSyncLike;
|
|
9
|
+
readonly facts: OpenFacts | null;
|
|
10
|
+
}
|
|
11
|
+
/** A new connection with the store's pragmas and migrations applied and the mirror cleanup run when it is due; the caller owns and closes it. */
|
|
12
|
+
export declare function connectWithFacts(hippoRoot: string, busyWaitMs?: number): OpenedDb;
|
|
5
13
|
//# sourceMappingURL=connect.d.ts.map
|
package/dist/db/connect.js
CHANGED
|
@@ -1,43 +1,76 @@
|
|
|
1
1
|
import * as fs from 'fs';
|
|
2
2
|
import * as path from 'path';
|
|
3
|
-
import { cleanupArchivedMirrors } from '
|
|
4
|
-
import { log } from '../log.js';
|
|
3
|
+
import { cleanupArchivedMirrors } from './raw-archive-mirror-cleanup.js';
|
|
4
|
+
import { errorMessage, log } from '../util/log.js';
|
|
5
5
|
import { DatabaseSync } from './sqlite.js';
|
|
6
6
|
import { execWithBusyRetry } from './busy.js';
|
|
7
7
|
import { runMigrations } from './migrate.js';
|
|
8
|
+
import { autoCheckpointPages } from './wal-checkpointer.js';
|
|
9
|
+
const DEFAULT_BUSY_WAIT_MS = 5000;
|
|
8
10
|
export function getHippoDbPath(hippoRoot) {
|
|
9
11
|
return path.join(hippoRoot, 'hippo.db');
|
|
10
12
|
}
|
|
13
|
+
// Per store file, what this process has already done to it; a store file created anew starts over.
|
|
14
|
+
const settledSteps = new Map();
|
|
15
|
+
const sweptThrough = new Map();
|
|
16
|
+
function storeKey(hippoRoot) {
|
|
17
|
+
return path.resolve(getHippoDbPath(hippoRoot));
|
|
18
|
+
}
|
|
19
|
+
/** Runs `step` on this store unless it already ran to the end in this process; a throw leaves it due. */
|
|
20
|
+
export function oncePerStore(hippoRoot, name, step) {
|
|
21
|
+
const key = storeKey(hippoRoot);
|
|
22
|
+
const settled = settledSteps.get(key) ?? new Set();
|
|
23
|
+
if (settled.has(name))
|
|
24
|
+
return;
|
|
25
|
+
step();
|
|
26
|
+
settledSteps.set(key, settled.add(name));
|
|
27
|
+
}
|
|
11
28
|
// Owner-only on create; SQLite gives the WAL and SHM files the db's mode. Existing paths keep theirs.
|
|
12
29
|
function createStoreFilesOwnerOnly(hippoRoot) {
|
|
13
30
|
fs.mkdirSync(hippoRoot, { recursive: true, mode: 0o700 });
|
|
14
31
|
try {
|
|
15
32
|
fs.closeSync(fs.openSync(getHippoDbPath(hippoRoot), 'wx', 0o600));
|
|
33
|
+
settledSteps.delete(storeKey(hippoRoot));
|
|
34
|
+
sweptThrough.delete(storeKey(hippoRoot));
|
|
16
35
|
}
|
|
17
36
|
catch (err) {
|
|
18
37
|
if (!(err instanceof Error && 'code' in err && err.code === 'EEXIST'))
|
|
19
38
|
throw err;
|
|
20
39
|
}
|
|
21
40
|
}
|
|
22
|
-
|
|
23
|
-
|
|
41
|
+
// The archive only grows and its ids never repeat, so an unchanged top id means no row this process has not swept; a failed sweep stays due.
|
|
42
|
+
function sweepArchivedMirrorsIfDue(hippoRoot, db, probedTop) {
|
|
43
|
+
const top = probedTop ?? archiveTop(db);
|
|
44
|
+
const key = storeKey(hippoRoot);
|
|
45
|
+
if (sweptThrough.get(key) === top)
|
|
46
|
+
return;
|
|
47
|
+
if (cleanupArchivedMirrors(hippoRoot, db))
|
|
48
|
+
sweptThrough.set(key, top);
|
|
49
|
+
}
|
|
50
|
+
function archiveTop(db) {
|
|
51
|
+
// SAFETY: MAX over the integer key returns one row with one column, null for an empty table.
|
|
52
|
+
const row = db.prepare('SELECT MAX(id) AS top FROM raw_archive').get();
|
|
53
|
+
return Number(row?.top ?? 0);
|
|
54
|
+
}
|
|
55
|
+
/** A new connection with the store's pragmas and migrations applied and the mirror cleanup run when it is due; the caller owns and closes it. */
|
|
56
|
+
export function connectWithFacts(hippoRoot, busyWaitMs) {
|
|
24
57
|
createStoreFilesOwnerOnly(hippoRoot);
|
|
25
58
|
const db = new DatabaseSync(getHippoDbPath(hippoRoot));
|
|
26
59
|
try {
|
|
27
|
-
db.exec(`PRAGMA busy_timeout = ${busyWaitMs ??
|
|
60
|
+
db.exec(`PRAGMA busy_timeout = ${busyWaitMs ?? DEFAULT_BUSY_WAIT_MS}`);
|
|
28
61
|
execWithBusyRetry(db, 'PRAGMA journal_mode = WAL', busyWaitMs);
|
|
29
62
|
db.exec('PRAGMA synchronous = NORMAL');
|
|
30
|
-
db.exec(
|
|
63
|
+
db.exec(`PRAGMA wal_autocheckpoint = ${autoCheckpointPages(getHippoDbPath(hippoRoot))}`);
|
|
31
64
|
db.exec('PRAGMA foreign_keys = ON');
|
|
32
|
-
runMigrations(db, hippoRoot, busyWaitMs);
|
|
65
|
+
const facts = runMigrations(db, hippoRoot, busyWaitMs);
|
|
33
66
|
// Orphan mirrors of archived raw rows go here; a filesystem failure must not block the open.
|
|
34
67
|
try {
|
|
35
|
-
|
|
68
|
+
sweepArchivedMirrorsIfDue(hippoRoot, db, facts?.archiveTop);
|
|
36
69
|
}
|
|
37
70
|
catch (cleanupErr) {
|
|
38
|
-
log.error(`openHippoDb: cleanupArchivedMirrors failed (non-fatal): ${
|
|
71
|
+
log.error(`openHippoDb: cleanupArchivedMirrors failed (non-fatal): ${errorMessage(cleanupErr)}`);
|
|
39
72
|
}
|
|
40
|
-
return db;
|
|
73
|
+
return { db, facts };
|
|
41
74
|
}
|
|
42
75
|
catch (error) {
|
|
43
76
|
try {
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type { DatabaseSyncLike } from './sqlite.js';
|
|
2
|
+
export { isSqliteBusy, isStoreBusy, StoreBusyError, STORE_BUSY_MESSAGE, execWithBusyRetry, withReadSnapshot, withTrialScope, withWriteScope, withWriteScopeOr } from './busy.js';
|
|
3
|
+
export { getSchemaVersion, getMeta, setMeta, isFtsAvailable } from './meta.js';
|
|
4
|
+
export { countTableRows, pruneConsolidationRuns } from './tables.js';
|
|
5
|
+
export { getCurrentSchemaVersion, IncompatibleBinaryError, ftsRowCounts, repairFtsDrift } from './migrate.js';
|
|
6
|
+
export { getHippoDbPath, HOOK_DB_WAIT_MS, noteStoreBusy, withSharedStoreHandles, SERVER_DB_WAIT_MS, SLEEP_DB_WAIT_MS, scopedBusyWait, withSqliteBlocked, withSqliteAllowed, withSqliteOffLoop, outsideSqliteOffLoop, rethrowIfSqliteBlocked, OTHER_STORE_MARKER, openHippoDb, openHippoDbReadOnly, closeHippoDb, } from './open.js';
|
|
7
|
+
export { RequestStores, runWithRequestStores, currentRequestStores, outsideRequestStores } from './request-stores.js';
|
|
8
|
+
export { OtherStoreFolderError, SqliteBlockedError } from '../util/sqlite-blocked.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
package/dist/db/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { isSqliteBusy, isStoreBusy, StoreBusyError, STORE_BUSY_MESSAGE, execWithBusyRetry, withReadSnapshot, withTrialScope, withWriteScope, withWriteScopeOr } from './busy.js';
|
|
2
|
+
export { getSchemaVersion, getMeta, setMeta, isFtsAvailable } from './meta.js';
|
|
3
|
+
export { countTableRows, pruneConsolidationRuns } from './tables.js';
|
|
4
|
+
export { getCurrentSchemaVersion, IncompatibleBinaryError, ftsRowCounts, repairFtsDrift } from './migrate.js';
|
|
5
|
+
export { getHippoDbPath, HOOK_DB_WAIT_MS, noteStoreBusy, withSharedStoreHandles, SERVER_DB_WAIT_MS, SLEEP_DB_WAIT_MS, scopedBusyWait, withSqliteBlocked, withSqliteAllowed, withSqliteOffLoop, outsideSqliteOffLoop, rethrowIfSqliteBlocked, OTHER_STORE_MARKER, openHippoDb, openHippoDbReadOnly, closeHippoDb, } from './open.js';
|
|
6
|
+
export { RequestStores, runWithRequestStores, currentRequestStores, outsideRequestStores } from './request-stores.js';
|
|
7
|
+
export { OtherStoreFolderError, SqliteBlockedError } from '../util/sqlite-blocked.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
package/dist/db/meta.d.ts
CHANGED
|
@@ -2,6 +2,10 @@ import type { DatabaseSyncLike } from './sqlite.js';
|
|
|
2
2
|
export declare const META_TABLE_DDL = "\n CREATE TABLE IF NOT EXISTS meta (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n );\n ";
|
|
3
3
|
export declare function ensureMetaTable(db: DatabaseSyncLike): void;
|
|
4
4
|
export declare function getSchemaVersion(db: DatabaseSyncLike): number;
|
|
5
|
+
/** SQLite's own `user_version` stamp, which can differ from the `meta` schema_version row. */
|
|
6
|
+
export declare function pragmaUserVersion(db: DatabaseSyncLike): number;
|
|
7
|
+
/** The connection's commit counter: it moves when another connection commits. */
|
|
8
|
+
export declare function pragmaDataVersion(db: DatabaseSyncLike): number;
|
|
5
9
|
export declare function setSchemaVersion(db: DatabaseSyncLike, version: number): void;
|
|
6
10
|
export declare function getMeta(db: DatabaseSyncLike, key: string, fallback?: string): string;
|
|
7
11
|
export declare function setMeta(db: DatabaseSyncLike, key: string, value: string): void;
|
package/dist/db/meta.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { compareSemver } from '../version.js';
|
|
1
|
+
import { compareSemver } from '../util/version.js';
|
|
2
2
|
import { tableExists } from './tables.js';
|
|
3
3
|
export const META_TABLE_DDL = `
|
|
4
4
|
CREATE TABLE IF NOT EXISTS meta (
|
|
@@ -18,6 +18,16 @@ export function getSchemaVersion(db) {
|
|
|
18
18
|
const version = Number(row?.value ?? 0);
|
|
19
19
|
return Number.isFinite(version) ? version : 0;
|
|
20
20
|
}
|
|
21
|
+
/** SQLite's own `user_version` stamp, which can differ from the `meta` schema_version row. */
|
|
22
|
+
export function pragmaUserVersion(db) {
|
|
23
|
+
// SAFETY: PRAGMA user_version returns one row with one integer column.
|
|
24
|
+
return db.prepare('PRAGMA user_version').get().user_version;
|
|
25
|
+
}
|
|
26
|
+
/** The connection's commit counter: it moves when another connection commits. */
|
|
27
|
+
export function pragmaDataVersion(db) {
|
|
28
|
+
// SAFETY: PRAGMA data_version returns one row with that single integer column.
|
|
29
|
+
return db.prepare('PRAGMA data_version').get().data_version;
|
|
30
|
+
}
|
|
21
31
|
export function setSchemaVersion(db, version) {
|
|
22
32
|
db.prepare(`INSERT INTO meta(key, value) VALUES('schema_version', ?) ON CONFLICT(key) DO UPDATE SET value=excluded.value`).run(String(version));
|
|
23
33
|
db.exec(`PRAGMA user_version = ${Math.max(0, Math.trunc(version))}`);
|
package/dist/db/migrate.d.ts
CHANGED
|
@@ -7,7 +7,14 @@ export declare class IncompatibleBinaryError extends Error {
|
|
|
7
7
|
export declare function assertBinaryCompatible(db: DatabaseSyncLike): void;
|
|
8
8
|
/** The fast path's single probe: versions, the binary minimum, the FTS flag, and counts of the meta defaults and required objects. */
|
|
9
9
|
export declare const SCHEMA_PROBE_SQL: string;
|
|
10
|
-
|
|
10
|
+
/** What the probe of a current store read beyond the schema proof, so the same open need not read them again. */
|
|
11
|
+
export interface OpenFacts {
|
|
12
|
+
/** The largest raw_archive id, 0 for an empty archive. */
|
|
13
|
+
readonly archiveTop: number;
|
|
14
|
+
readonly hasMemories: boolean;
|
|
15
|
+
}
|
|
16
|
+
/** Brings the store to the current schema; returns the probe's facts when it was current already, null after any repair. */
|
|
17
|
+
export declare function runMigrations(db: DatabaseSyncLike, hippoRoot?: string, busyWaitMs?: number): OpenFacts | null;
|
|
11
18
|
/** Row counts of `memories` and its full-text index, which differ once the index drifts; null when either table is missing. */
|
|
12
19
|
export declare function ftsRowCounts(db: DatabaseSyncLike): {
|
|
13
20
|
memories: number;
|