hippo-memory 1.69.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 +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 +1 -3
- package/dist/agent-memories/claude-code.js +11 -7
- package/dist/agent-memories/copilot.js +3 -2
- 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 +5 -5
- package/dist/api/context-select.js +37 -45
- package/dist/api/context-types.d.ts +5 -5
- package/dist/api/context.d.ts +2 -4
- package/dist/api/context.js +48 -61
- 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 +2 -11
- package/dist/api/forget.js +13 -46
- 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 +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/promote.d.ts +4 -15
- package/dist/api/promote.js +29 -106
- 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 +10 -12
- package/dist/api/remember.js +29 -45
- 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 +40 -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.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} +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.js +6 -4
- 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 +190 -184
- package/dist/cli/setup.d.ts +2 -1
- package/dist/cli/setup.js +41 -21
- 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 +4 -2
- 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 -83
- 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 -49
- 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 -91
- 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} +13 -2
- package/dist/{capture-contract.js → core/capture-contract.js} +64 -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} +17 -5
- package/dist/{memory.js → core/memory.js} +110 -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.js → core/prompt-recall.js} +1 -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 +1 -8
- package/dist/hooks/copilot.js +14 -15
- package/dist/{cli → hooks}/hook-blocks.js +1 -1
- package/dist/hooks/json-hooks.d.ts +1 -1
- package/dist/hooks/json-hooks.js +31 -122
- package/dist/hooks/opencode.js +35 -27
- package/dist/hooks/shared.d.ts +0 -4
- package/dist/hooks/shared.js +1 -5
- 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.js +7 -27
- 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 +62 -60
- 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 +12 -14
- 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} +1 -1
- 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 +39 -61
- package/dist/server.js +24 -568
- 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 +11 -5
- package/dist/store/audit-event.js +5 -4
- 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 +1 -1
- package/dist/store/handoffs.js +39 -30
- 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 +6 -4
- package/dist/store/open.js +24 -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} +3 -1
- package/dist/{raw-archive.js → store/raw-archive.js} +6 -2
- package/dist/{recall-scope.d.ts → store/recall-scope.d.ts} +2 -2
- package/dist/{recall-scope.js → store/recall-scope.js} +3 -3
- 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 +41 -28
- package/dist/store/sessions.d.ts +13 -2
- package/dist/store/sessions.js +79 -45
- 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 +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} +15 -2
- package/dist/{env.js → util/env.js} +20 -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/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/entry-writes-group.d.ts +0 -9
- package/dist/store-port.d.ts +0 -262
- package/dist/store-port.js +0 -178
- /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/{prompt-recall.d.ts → core/prompt-recall.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
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
* Stores and loads particle state (position, velocity, mass, charge, temperature)
|
|
4
4
|
* in SQLite using BLOB columns for 384-dim vectors.
|
|
5
5
|
*/
|
|
6
|
-
import type { DatabaseSyncLike } from './
|
|
7
|
-
import type { MemoryEntry } from '
|
|
8
|
-
import type { PhysicsParticle } from '
|
|
6
|
+
import type { DatabaseSyncLike } from './index.js';
|
|
7
|
+
import type { MemoryEntry } from '../core/memory.js';
|
|
8
|
+
import type { PhysicsParticle } from '../core/physics.js';
|
|
9
9
|
export declare function float32ToBuffer(arr: number[]): Buffer;
|
|
10
10
|
export declare function bufferToFloat32(buf: Buffer | Uint8Array): number[];
|
|
11
11
|
/**
|
|
@@ -3,9 +3,11 @@
|
|
|
3
3
|
* Stores and loads particle state (position, velocity, mass, charge, temperature)
|
|
4
4
|
* in SQLite using BLOB columns for 384-dim vectors.
|
|
5
5
|
*/
|
|
6
|
-
import { evalNow } from '
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
6
|
+
import { evalNow } from '../core/ablation.js';
|
|
7
|
+
import { withWriteScope } from './busy.js';
|
|
8
|
+
import { computeMass, computeCharge, computeTemperature, vecZero } from '../core/physics.js';
|
|
9
|
+
import { calculateStrength } from '../core/memory.js';
|
|
10
|
+
import { DAY_MS } from '../util/time.js';
|
|
9
11
|
// ---------------------------------------------------------------------------
|
|
10
12
|
// Float32Array <-> Buffer serialization
|
|
11
13
|
// ---------------------------------------------------------------------------
|
|
@@ -100,20 +102,11 @@ export function savePhysicsState(db, particles) {
|
|
|
100
102
|
last_simulation = excluded.last_simulation,
|
|
101
103
|
updated_at = datetime('now')
|
|
102
104
|
`);
|
|
103
|
-
db
|
|
104
|
-
try {
|
|
105
|
+
withWriteScope(db, 'save_particles', () => {
|
|
105
106
|
for (const p of particles) {
|
|
106
107
|
stmt.run(p.memoryId, float32ToBuffer(p.position), float32ToBuffer(p.velocity), p.mass, p.charge, p.temperature, p.lastSimulation);
|
|
107
108
|
}
|
|
108
|
-
|
|
109
|
-
}
|
|
110
|
-
catch (error) {
|
|
111
|
-
try {
|
|
112
|
-
db.exec('ROLLBACK');
|
|
113
|
-
}
|
|
114
|
-
catch { /* already rolled back; keep the original error */ }
|
|
115
|
-
throw error;
|
|
116
|
-
}
|
|
109
|
+
});
|
|
117
110
|
}
|
|
118
111
|
/**
|
|
119
112
|
* Initialize physics state for a memory from its embedding vector.
|
|
@@ -121,7 +114,7 @@ export function savePhysicsState(db, particles) {
|
|
|
121
114
|
*/
|
|
122
115
|
export function initializeParticle(entry, embedding, now = evalNow()) {
|
|
123
116
|
const strength = calculateStrength(entry, now);
|
|
124
|
-
const ageDays = (now.getTime() - new Date(entry.created).getTime()) /
|
|
117
|
+
const ageDays = (now.getTime() - new Date(entry.created).getTime()) / DAY_MS;
|
|
125
118
|
return {
|
|
126
119
|
memoryId: entry.id,
|
|
127
120
|
position: [...embedding], // copy — position will diverge from original embedding
|
|
@@ -160,7 +153,7 @@ export function refreshParticleProperties(particles, entries, now = evalNow()) {
|
|
|
160
153
|
if (!entry)
|
|
161
154
|
continue;
|
|
162
155
|
const strength = calculateStrength(entry, now);
|
|
163
|
-
const ageDays = (now.getTime() - new Date(entry.created).getTime()) /
|
|
156
|
+
const ageDays = (now.getTime() - new Date(entry.created).getTime()) / DAY_MS;
|
|
164
157
|
p.mass = computeMass(strength, entry.retrieval_count);
|
|
165
158
|
p.charge = computeCharge(entry.emotional_valence);
|
|
166
159
|
p.temperature = computeTemperature(ageDays, 1.0);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { DatabaseSyncLike } from './
|
|
1
|
+
import type { DatabaseSyncLike } from './index.js';
|
|
2
2
|
/**
|
|
3
3
|
* Path A backfill cleanup: existing raw_archive rows that were archived BEFORE
|
|
4
4
|
* commit 70180b5 left their markdown mirrors at <hippoRoot>/<layer>/<id>.md
|
|
@@ -11,10 +11,10 @@ import type { DatabaseSyncLike } from './db.js';
|
|
|
11
11
|
* - On success (every layer either deleted or didn't exist), UPDATE the row
|
|
12
12
|
* with the cleanup timestamp.
|
|
13
13
|
* - On any unlink failure, leave mirror_cleaned_at NULL so the next
|
|
14
|
-
*
|
|
14
|
+
* connection retries. Warn (capped at MAX_WARN_LOGS rows per call).
|
|
15
15
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
16
|
+
* Returns whether every pending row was cleaned; the SELECT has no index to
|
|
17
|
+
* use, so a connection runs it only when the archive has changed since.
|
|
18
18
|
*/
|
|
19
|
-
export declare function cleanupArchivedMirrors(hippoRoot: string, db: DatabaseSyncLike):
|
|
19
|
+
export declare function cleanupArchivedMirrors(hippoRoot: string, db: DatabaseSyncLike): boolean;
|
|
20
20
|
//# sourceMappingURL=raw-archive-mirror-cleanup.d.ts.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as fs from 'fs';
|
|
2
2
|
import * as path from 'path';
|
|
3
|
-
import { log } from '
|
|
3
|
+
import { errorMessage, log } from '../util/log.js';
|
|
4
4
|
const LAYERS = ['episodic', 'buffer', 'semantic'];
|
|
5
5
|
const MAX_WARN_LOGS = 5;
|
|
6
6
|
/**
|
|
@@ -15,10 +15,10 @@ const MAX_WARN_LOGS = 5;
|
|
|
15
15
|
* - On success (every layer either deleted or didn't exist), UPDATE the row
|
|
16
16
|
* with the cleanup timestamp.
|
|
17
17
|
* - On any unlink failure, leave mirror_cleaned_at NULL so the next
|
|
18
|
-
*
|
|
18
|
+
* connection retries. Warn (capped at MAX_WARN_LOGS rows per call).
|
|
19
19
|
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
20
|
+
* Returns whether every pending row was cleaned; the SELECT has no index to
|
|
21
|
+
* use, so a connection runs it only when the archive has changed since.
|
|
22
22
|
*/
|
|
23
23
|
export function cleanupArchivedMirrors(hippoRoot, db) {
|
|
24
24
|
// SAFETY: the SELECT above names exactly one column, memory_id (raw_archive.memory_id
|
|
@@ -27,10 +27,11 @@ export function cleanupArchivedMirrors(hippoRoot, db) {
|
|
|
27
27
|
.prepare(`SELECT memory_id FROM raw_archive WHERE mirror_cleaned_at IS NULL`)
|
|
28
28
|
.all();
|
|
29
29
|
if (rows.length === 0)
|
|
30
|
-
return;
|
|
30
|
+
return true;
|
|
31
31
|
const update = db.prepare(`UPDATE raw_archive SET mirror_cleaned_at = ? WHERE memory_id = ?`);
|
|
32
32
|
const now = new Date().toISOString();
|
|
33
33
|
let warnCount = 0;
|
|
34
|
+
let everyRowCleaned = true;
|
|
34
35
|
for (const row of rows) {
|
|
35
36
|
let allOk = true;
|
|
36
37
|
for (const layer of LAYERS) {
|
|
@@ -43,7 +44,7 @@ export function cleanupArchivedMirrors(hippoRoot, db) {
|
|
|
43
44
|
catch (err) {
|
|
44
45
|
allOk = false;
|
|
45
46
|
if (warnCount < MAX_WARN_LOGS) {
|
|
46
|
-
log.warn(`cleanupArchivedMirrors: unlink failed for ${filePath} (will retry on next DB open): ${
|
|
47
|
+
log.warn(`cleanupArchivedMirrors: unlink failed for ${filePath} (will retry on next DB open): ${errorMessage(err)}`);
|
|
47
48
|
warnCount += 1;
|
|
48
49
|
}
|
|
49
50
|
}
|
|
@@ -51,6 +52,10 @@ export function cleanupArchivedMirrors(hippoRoot, db) {
|
|
|
51
52
|
if (allOk) {
|
|
52
53
|
update.run(now, row.memory_id);
|
|
53
54
|
}
|
|
55
|
+
else {
|
|
56
|
+
everyRowCleaned = false;
|
|
57
|
+
}
|
|
54
58
|
}
|
|
59
|
+
return everyRowCleaned;
|
|
55
60
|
}
|
|
56
61
|
//# sourceMappingURL=raw-archive-mirror-cleanup.js.map
|
|
@@ -1,29 +1,42 @@
|
|
|
1
1
|
import type { DatabaseSyncLike } from './sqlite.js';
|
|
2
|
+
import { type OpenedDb } from './connect.js';
|
|
3
|
+
import { type RequestScope } from '../util/request-scope.js';
|
|
2
4
|
export interface RequestStoresOptions {
|
|
3
5
|
/** Lock wait of every open in the scope that does not pass its own. */
|
|
4
6
|
readonly busyWaitMs?: number;
|
|
5
7
|
/** Set for hook scopes: after one lock wait runs out, {@link RequestStores.noteBusy} makes the scope's later writes skip at once. */
|
|
6
8
|
readonly failFastWhenBusy?: boolean;
|
|
9
|
+
/** The store whose open-time setup another connection has already run, so an open in this scope skips it: a store worker's reader, which cannot write it. */
|
|
10
|
+
readonly setupDoneFor?: string;
|
|
7
11
|
}
|
|
8
12
|
/** The handles one request opened, keyed by resolved store path and lock wait. */
|
|
9
|
-
export declare class RequestStores {
|
|
13
|
+
export declare class RequestStores implements RequestScope {
|
|
10
14
|
#private;
|
|
11
15
|
readonly busyWaitMs: number | undefined;
|
|
16
|
+
readonly requestId: string | undefined;
|
|
17
|
+
readonly deadline: import("../util/request-scope.js").RequestDeadline | undefined;
|
|
18
|
+
readonly setupDoneFor: string | undefined;
|
|
12
19
|
constructor(opts?: RequestStoresOptions);
|
|
13
20
|
get closed(): boolean;
|
|
14
21
|
/** The scope's handle on `hippoRoot`, opened on first use. `opts.busyWaitMs` overrides the scope's lock wait. */
|
|
15
22
|
get(hippoRoot: string, opts?: {
|
|
16
23
|
busyWaitMs?: number;
|
|
17
24
|
}): DatabaseSyncLike;
|
|
25
|
+
/** `get`, with the facts of the open's probe when this call made the connection and null for a cached handle. */
|
|
26
|
+
getWithFacts(hippoRoot: string, opts?: {
|
|
27
|
+
busyWaitMs?: number;
|
|
28
|
+
}): OpenedDb;
|
|
18
29
|
/** A lock held past one full wait belongs to a long transaction, so a hook scope's later writes skip at once. */
|
|
19
30
|
noteBusy(): void;
|
|
20
31
|
close(): void;
|
|
21
32
|
}
|
|
22
33
|
/** Runs `fn` in a request scope whose handles close when `fn` settles; inside an open scope `fn` joins it and `opts` is ignored. */
|
|
23
34
|
export declare function runWithRequestStores<T>(fn: () => T | Promise<T>, opts?: RequestStoresOptions): Promise<T>;
|
|
35
|
+
/** runWithRequestStores for a synchronous `fn`, so a batch called from outside any request still opens each store once. */
|
|
36
|
+
export declare function withRequestStoresSync<T>(fn: () => T): T;
|
|
24
37
|
/** The scope this code runs in, if any. A closed scope still answers: its `get` falls through to a plain open. */
|
|
25
38
|
export declare function currentRequestStores(): RequestStores | undefined;
|
|
26
|
-
/** Runs `fn` outside every scope, for a connection that must outlive the request that happens to open it. */
|
|
39
|
+
/** Runs `fn` outside every store scope, for a connection that must outlive the request that happens to open it; its log lines keep the request's id. */
|
|
27
40
|
export declare function outsideRequestStores<T>(fn: () => T): T;
|
|
28
41
|
/** Whether a scope owns `db` and will close it itself. */
|
|
29
42
|
export declare function isScopedHandle(db: DatabaseSyncLike): boolean;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// One store handle per store for each request (HTTP call, MCP tool call, scoped CLI command), opened lazily and closed with it.
|
|
2
2
|
import * as path from 'node:path';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { connectWithFacts, getHippoDbPath } from './connect.js';
|
|
4
|
+
import { currentDeadline, currentRequestId, requestScopes } from '../util/request-scope.js';
|
|
5
5
|
// Handles a scope owns, so closeHippoDb leaves them open for the rest of the request.
|
|
6
6
|
const scopedHandles = new WeakSet();
|
|
7
7
|
// process.exit skips every finally, so one exit listener closes the handles of scopes still open.
|
|
@@ -21,11 +21,16 @@ function trackLive(scope) {
|
|
|
21
21
|
/** The handles one request opened, keyed by resolved store path and lock wait. */
|
|
22
22
|
export class RequestStores {
|
|
23
23
|
busyWaitMs;
|
|
24
|
+
// Taken from the scope this one opens inside, so the request's log lines keep their id.
|
|
25
|
+
requestId = currentRequestId();
|
|
26
|
+
deadline = currentDeadline();
|
|
27
|
+
setupDoneFor;
|
|
24
28
|
#failFastWhenBusy;
|
|
25
29
|
#handles = new Map();
|
|
26
30
|
#closed = false;
|
|
27
31
|
constructor(opts = {}) {
|
|
28
32
|
this.busyWaitMs = opts.busyWaitMs;
|
|
33
|
+
this.setupDoneFor = opts.setupDoneFor;
|
|
29
34
|
this.#failFastWhenBusy = opts.failFastWhenBusy === true;
|
|
30
35
|
}
|
|
31
36
|
get closed() {
|
|
@@ -33,22 +38,26 @@ export class RequestStores {
|
|
|
33
38
|
}
|
|
34
39
|
/** The scope's handle on `hippoRoot`, opened on first use. `opts.busyWaitMs` overrides the scope's lock wait. */
|
|
35
40
|
get(hippoRoot, opts) {
|
|
41
|
+
return this.getWithFacts(hippoRoot, opts).db;
|
|
42
|
+
}
|
|
43
|
+
/** `get`, with the facts of the open's probe when this call made the connection and null for a cached handle. */
|
|
44
|
+
getWithFacts(hippoRoot, opts) {
|
|
36
45
|
const busyWaitMs = opts?.busyWaitMs ?? this.busyWaitMs;
|
|
37
46
|
// A listener or timer that outlives its request still sees this scope, so it gets a connection of its own.
|
|
38
47
|
if (this.#closed)
|
|
39
|
-
return
|
|
48
|
+
return connectWithFacts(hippoRoot, busyWaitMs);
|
|
40
49
|
const key = `${path.resolve(getHippoDbPath(hippoRoot))}\0${busyWaitMs ?? ''}`;
|
|
41
50
|
const cached = this.#handles.get(key);
|
|
42
51
|
if (cached?.isOpen && !cached.isTransaction)
|
|
43
|
-
return cached;
|
|
44
|
-
const
|
|
52
|
+
return { db: cached, facts: null };
|
|
53
|
+
const opened = connectWithFacts(hippoRoot, busyWaitMs);
|
|
45
54
|
// An open nested inside a transaction gets its own connection, which its caller closes.
|
|
46
55
|
if (cached?.isOpen)
|
|
47
|
-
return
|
|
48
|
-
this.#handles.set(key, db);
|
|
49
|
-
scopedHandles.add(db);
|
|
56
|
+
return opened;
|
|
57
|
+
this.#handles.set(key, opened.db);
|
|
58
|
+
scopedHandles.add(opened.db);
|
|
50
59
|
trackLive(this);
|
|
51
|
-
return
|
|
60
|
+
return opened;
|
|
52
61
|
}
|
|
53
62
|
/** A lock held past one full wait belongs to a long transaction, so a hook scope's later writes skip at once. */
|
|
54
63
|
noteBusy() {
|
|
@@ -69,14 +78,13 @@ export class RequestStores {
|
|
|
69
78
|
this.#handles.clear();
|
|
70
79
|
}
|
|
71
80
|
}
|
|
72
|
-
const scopes = new AsyncLocalStorage();
|
|
73
81
|
/** Runs `fn` in a request scope whose handles close when `fn` settles; inside an open scope `fn` joins it and `opts` is ignored. */
|
|
74
82
|
export async function runWithRequestStores(fn, opts) {
|
|
75
|
-
const outer =
|
|
83
|
+
const outer = currentRequestStores();
|
|
76
84
|
if (outer && !outer.closed)
|
|
77
85
|
return fn();
|
|
78
86
|
const stores = new RequestStores(opts);
|
|
79
|
-
return
|
|
87
|
+
return requestScopes.run(stores, async () => {
|
|
80
88
|
try {
|
|
81
89
|
return await fn();
|
|
82
90
|
}
|
|
@@ -85,13 +93,27 @@ export async function runWithRequestStores(fn, opts) {
|
|
|
85
93
|
}
|
|
86
94
|
});
|
|
87
95
|
}
|
|
96
|
+
/** runWithRequestStores for a synchronous `fn`, so a batch called from outside any request still opens each store once. */
|
|
97
|
+
export function withRequestStoresSync(fn) {
|
|
98
|
+
const outer = currentRequestStores();
|
|
99
|
+
if (outer && !outer.closed)
|
|
100
|
+
return fn();
|
|
101
|
+
const stores = new RequestStores();
|
|
102
|
+
try {
|
|
103
|
+
return requestScopes.run(stores, fn);
|
|
104
|
+
}
|
|
105
|
+
finally {
|
|
106
|
+
stores.close();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
88
109
|
/** The scope this code runs in, if any. A closed scope still answers: its `get` falls through to a plain open. */
|
|
89
110
|
export function currentRequestStores() {
|
|
90
|
-
|
|
111
|
+
const scope = requestScopes.getStore();
|
|
112
|
+
return scope instanceof RequestStores ? scope : undefined;
|
|
91
113
|
}
|
|
92
|
-
/** Runs `fn` outside every scope, for a connection that must outlive the request that happens to open it. */
|
|
114
|
+
/** Runs `fn` outside every store scope, for a connection that must outlive the request that happens to open it; its log lines keep the request's id. */
|
|
93
115
|
export function outsideRequestStores(fn) {
|
|
94
|
-
return
|
|
116
|
+
return requestScopes.run({ requestId: currentRequestId() }, fn);
|
|
95
117
|
}
|
|
96
118
|
/** Whether a scope owns `db` and will close it itself. */
|
|
97
119
|
export function isScopedHandle(db) {
|
package/dist/db/tables.d.ts
CHANGED
|
@@ -3,6 +3,8 @@ import type { DatabaseSyncLike } from './sqlite.js';
|
|
|
3
3
|
export declare function tableColumns(db: DatabaseSyncLike, tableName: string): Set<string>;
|
|
4
4
|
export declare function tableHasColumn(db: DatabaseSyncLike, tableName: string, columnName: string): boolean;
|
|
5
5
|
export declare function tableExists(db: DatabaseSyncLike, tableName: string): boolean;
|
|
6
|
+
/** Names of the real tables, without sqlite internals and FTS virtual tables. */
|
|
7
|
+
export declare function listTableNames(db: DatabaseSyncLike): string[];
|
|
6
8
|
/** Row count of one table; null when the table is missing or unreadable, which callers show as unknown. */
|
|
7
9
|
export declare function countTableRows(db: DatabaseSyncLike, table: string): number | null;
|
|
8
10
|
export declare function pruneConsolidationRuns(db: DatabaseSyncLike, keep?: number): void;
|
package/dist/db/tables.js
CHANGED
|
@@ -17,6 +17,12 @@ export function tableExists(db, tableName) {
|
|
|
17
17
|
const row = db.prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name = ?`).get(tableName);
|
|
18
18
|
return !!row?.name;
|
|
19
19
|
}
|
|
20
|
+
/** Names of the real tables, without sqlite internals and FTS virtual tables. */
|
|
21
|
+
export function listTableNames(db) {
|
|
22
|
+
// SAFETY: each row's shape matches the single `name` column named in the SELECT below.
|
|
23
|
+
const rows = db.prepare(`SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' AND sql NOT LIKE 'CREATE VIRTUAL TABLE%' ORDER BY name`).all();
|
|
24
|
+
return rows.map((r) => r.name);
|
|
25
|
+
}
|
|
20
26
|
/** Row count of one table; null when the table is missing or unreadable, which callers show as unknown. */
|
|
21
27
|
export function countTableRows(db, table) {
|
|
22
28
|
try {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Embedding vectors in the `memory_vectors` table: one Float32 BLOB per memory id, plus the one-time import of the old JSON index. */
|
|
2
|
-
import type { DatabaseSyncLike } from './
|
|
2
|
+
import type { DatabaseSyncLike } from './index.js';
|
|
3
3
|
export declare const EMBEDDING_MODEL_META_KEY = "embedding_model";
|
|
4
4
|
export declare const MEMORY_VECTORS_DDL = "\n CREATE TABLE IF NOT EXISTS memory_vectors (\n memory_id TEXT PRIMARY KEY,\n model TEXT NOT NULL,\n dim INTEGER NOT NULL,\n vector BLOB NOT NULL\n );\n CREATE TRIGGER IF NOT EXISTS trg_memory_vectors_delete AFTER DELETE ON memories BEGIN\n DELETE FROM memory_vectors WHERE memory_id = old.id;\n END;\n";
|
|
5
5
|
export declare function encodeVector(vector: readonly number[]): Uint8Array;
|
|
@@ -12,6 +12,8 @@ export declare function replaceAllVectors(db: DatabaseSyncLike, index: Readonly<
|
|
|
12
12
|
export declare function deleteOrphanVectors(db: DatabaseSyncLike): number;
|
|
13
13
|
/** Vectors for `ids`, or every stored vector when `ids` is omitted. */
|
|
14
14
|
export declare function loadVectors(db: DatabaseSyncLike, ids?: readonly string[]): Map<string, number[]>;
|
|
15
|
+
/** `loadVectors` for `ids` with no copy: each value views the bytes the store returned for that row. */
|
|
16
|
+
export declare function loadVectorViews(db: DatabaseSyncLike, ids: readonly string[]): Map<string, Float32Array>;
|
|
15
17
|
export declare function storedVectorIds(db: DatabaseSyncLike): Set<string>;
|
|
16
18
|
export declare function hasStoredVectors(db: DatabaseSyncLike): boolean;
|
|
17
19
|
export interface VectorMatch {
|
|
@@ -28,7 +30,7 @@ export interface VectorRow {
|
|
|
28
30
|
export declare function rankVectorRows(query: readonly number[], rows: Iterable<VectorRow>, k: number): VectorMatch[];
|
|
29
31
|
/** The `k` stored vectors closest to `query` among `memories m` rows passing `where` (SQL starting with ` AND`).
|
|
30
32
|
* Filters run before the cut, so rows a caller may not see can never push admitted rows out of the top k. */
|
|
31
|
-
export declare function topVectorMatches(db: DatabaseSyncLike, query: readonly number[], k: number, where: string, params: readonly (string | number)[]): VectorMatch[]
|
|
33
|
+
export declare function topVectorMatches(db: DatabaseSyncLike, query: readonly number[], k: number, where: string, params: readonly (string | number)[]): Promise<VectorMatch[]>;
|
|
32
34
|
/** Move a legacy `embeddings.json` into `memory_vectors`, then keep the file as `embeddings.json.imported-<stamp>`.
|
|
33
35
|
* Runs after the migration commits, so the rename never outlives rolled-back rows; a file an older binary writes later imports the same way. */
|
|
34
36
|
export declare function importLegacyEmbeddingIndex(db: DatabaseSyncLike, hippoRoot: string): void;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/** Embedding vectors in the `memory_vectors` table: one Float32 BLOB per memory id, plus the one-time import of the old JSON index. */
|
|
2
2
|
import * as fs from 'fs';
|
|
3
3
|
import * as path from 'path';
|
|
4
|
-
import {
|
|
4
|
+
import { withWriteScope } from './busy.js';
|
|
5
|
+
import { log } from '../util/log.js';
|
|
5
6
|
/** Legacy whole-file index; imported once into `memory_vectors`, then kept beside the store as a renamed backup. */
|
|
6
7
|
const LEGACY_EMBEDDINGS_FILE = 'embeddings.json';
|
|
7
8
|
export const EMBEDDING_MODEL_META_KEY = 'embedding_model';
|
|
@@ -40,24 +41,9 @@ export function upsertVectors(db, rows, model) {
|
|
|
40
41
|
}
|
|
41
42
|
return written;
|
|
42
43
|
}
|
|
43
|
-
function inTransaction(db, fn) {
|
|
44
|
-
db.exec('BEGIN IMMEDIATE');
|
|
45
|
-
try {
|
|
46
|
-
const out = fn();
|
|
47
|
-
db.exec('COMMIT');
|
|
48
|
-
return out;
|
|
49
|
-
}
|
|
50
|
-
catch (err) {
|
|
51
|
-
try {
|
|
52
|
-
db.exec('ROLLBACK');
|
|
53
|
-
}
|
|
54
|
-
catch { /* keep the original error */ }
|
|
55
|
-
throw err;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
44
|
/** Replace the whole table with `index` in one transaction, as a full rebuild does. */
|
|
59
45
|
export function replaceAllVectors(db, index, model) {
|
|
60
|
-
|
|
46
|
+
withWriteScope(db, 'replace_all_vectors', () => {
|
|
61
47
|
db.exec('DELETE FROM memory_vectors');
|
|
62
48
|
upsertVectors(db, Object.entries(index), model);
|
|
63
49
|
});
|
|
@@ -66,23 +52,33 @@ export function replaceAllVectors(db, index, model) {
|
|
|
66
52
|
export function deleteOrphanVectors(db) {
|
|
67
53
|
return Number(db.prepare('DELETE FROM memory_vectors WHERE memory_id NOT IN (SELECT id FROM memories)').run().changes ?? 0);
|
|
68
54
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
const out = new Map();
|
|
55
|
+
// One read behind the copied and the viewed shape, so the two can never return different rows.
|
|
56
|
+
function eachStoredVector(db, ids, take) {
|
|
72
57
|
const read = (rows) => {
|
|
73
58
|
// SAFETY: both SELECTs below name exactly these two columns; node:sqlite returns BLOBs as Uint8Array.
|
|
74
59
|
for (const row of rows)
|
|
75
|
-
|
|
60
|
+
take(row.memory_id, decodeVector(row.vector));
|
|
76
61
|
};
|
|
77
62
|
if (ids === undefined) {
|
|
78
63
|
read(db.prepare('SELECT memory_id, vector FROM memory_vectors').iterate());
|
|
79
|
-
return
|
|
64
|
+
return;
|
|
80
65
|
}
|
|
81
66
|
const unique = [...new Set(ids)];
|
|
82
67
|
for (let i = 0; i < unique.length; i += ID_CHUNK) {
|
|
83
68
|
const chunk = unique.slice(i, i + ID_CHUNK);
|
|
84
69
|
read(db.prepare(`SELECT memory_id, vector FROM memory_vectors WHERE memory_id IN (${chunk.map(() => '?').join(', ')})`).all(...chunk));
|
|
85
70
|
}
|
|
71
|
+
}
|
|
72
|
+
/** Vectors for `ids`, or every stored vector when `ids` is omitted. */
|
|
73
|
+
export function loadVectors(db, ids) {
|
|
74
|
+
const out = new Map();
|
|
75
|
+
eachStoredVector(db, ids, (id, vector) => out.set(id, Array.from(vector)));
|
|
76
|
+
return out;
|
|
77
|
+
}
|
|
78
|
+
/** `loadVectors` for `ids` with no copy: each value views the bytes the store returned for that row. */
|
|
79
|
+
export function loadVectorViews(db, ids) {
|
|
80
|
+
const out = new Map();
|
|
81
|
+
eachStoredVector(db, ids, (id, vector) => out.set(id, vector));
|
|
86
82
|
return out;
|
|
87
83
|
}
|
|
88
84
|
export function storedVectorIds(db) {
|
|
@@ -95,51 +91,80 @@ export function hasStoredVectors(db) {
|
|
|
95
91
|
/** The `k` rows closest to `query` by cosine, best first; ties go to the smaller id, so row order never changes the top k.
|
|
96
92
|
* The query rounds to Float32 as stored vectors are, and scores add up in float64, so every store that feeds it the same bytes ranks alike. */
|
|
97
93
|
export function rankVectorRows(query, rows, k) {
|
|
98
|
-
const
|
|
94
|
+
const best = bestMatches(query, k);
|
|
95
|
+
if (!best)
|
|
96
|
+
return [];
|
|
97
|
+
for (const { id, vector } of rows)
|
|
98
|
+
best.offer(id, vector);
|
|
99
|
+
return best.top;
|
|
100
|
+
}
|
|
101
|
+
// One scoring loop for rows in memory and rows streamed from the store, so the two can never rank apart.
|
|
102
|
+
function bestMatches(query, k) {
|
|
99
103
|
if (k <= 0 || query.length === 0)
|
|
100
|
-
return
|
|
104
|
+
return null;
|
|
101
105
|
const q = Float32Array.from(query);
|
|
102
106
|
let qNorm = 0;
|
|
103
107
|
for (let i = 0; i < q.length; i++)
|
|
104
108
|
qNorm += q[i] * q[i];
|
|
105
109
|
qNorm = Math.sqrt(qNorm);
|
|
106
110
|
if (qNorm < 1e-10)
|
|
107
|
-
return
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
dot
|
|
115
|
-
norm
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
111
|
+
return null;
|
|
112
|
+
const top = [];
|
|
113
|
+
return {
|
|
114
|
+
top,
|
|
115
|
+
offer(id, v) {
|
|
116
|
+
if (v.length !== q.length)
|
|
117
|
+
return;
|
|
118
|
+
let dot = 0;
|
|
119
|
+
let norm = 0;
|
|
120
|
+
for (let i = 0; i < v.length; i++) {
|
|
121
|
+
dot += q[i] * v[i];
|
|
122
|
+
norm += v[i] * v[i];
|
|
123
|
+
}
|
|
124
|
+
if (norm < 1e-20)
|
|
125
|
+
return;
|
|
126
|
+
const score = dot / (qNorm * Math.sqrt(norm));
|
|
127
|
+
if (top.length === k && !beats(score, id, top[k - 1]))
|
|
128
|
+
return;
|
|
129
|
+
insertSorted(top, { id, score }, k);
|
|
130
|
+
},
|
|
131
|
+
};
|
|
125
132
|
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
133
|
+
/** Rows the nearest-vector scan scores between two turns of the event loop. */
|
|
134
|
+
const VECTOR_SCAN_CHUNK = 256;
|
|
135
|
+
function nextTurn() {
|
|
136
|
+
return new Promise((resolve) => { setImmediate(resolve); });
|
|
129
137
|
}
|
|
130
138
|
/** The `k` stored vectors closest to `query` among `memories m` rows passing `where` (SQL starting with ` AND`).
|
|
131
139
|
* Filters run before the cut, so rows a caller may not see can never push admitted rows out of the top k. */
|
|
132
|
-
export function topVectorMatches(db, query, k, where, params) {
|
|
133
|
-
|
|
140
|
+
export async function topVectorMatches(db, query, k, where, params) {
|
|
141
|
+
const best = bestMatches(query, k);
|
|
142
|
+
if (!best)
|
|
134
143
|
return [];
|
|
135
|
-
// SHORTCUT: brute-force cosine over every vector
|
|
144
|
+
// SHORTCUT: brute-force cosine over every admitted vector, a chunk per event-loop turn; latency still grows with rows, fine to ~100k, and an ANN index (sqlite-vec, HNSW) is the upgrade.
|
|
145
|
+
// SAFETY: the SELECT names exactly these two columns; node:sqlite returns BLOBs as Uint8Array.
|
|
136
146
|
const rows = db.prepare(`
|
|
137
147
|
SELECT v.memory_id AS id, v.vector AS vector
|
|
138
148
|
FROM memory_vectors v JOIN memories m ON m.id = v.memory_id
|
|
139
149
|
WHERE v.dim = ?${where}
|
|
140
150
|
`).iterate(query.length, ...params);
|
|
141
|
-
|
|
142
|
-
|
|
151
|
+
const floats = new Float32Array(query.length);
|
|
152
|
+
const bytes = new Uint8Array(floats.buffer);
|
|
153
|
+
let scored = 0;
|
|
154
|
+
for (const row of rows) {
|
|
155
|
+
// The cursor stays open across the pause: under WAL a reader blocks no writer, and the scan keeps one snapshot.
|
|
156
|
+
if (scored > 0 && scored % VECTOR_SCAN_CHUNK === 0)
|
|
157
|
+
await nextTurn();
|
|
158
|
+
scored++;
|
|
159
|
+
if (row.vector.byteLength === bytes.byteLength) {
|
|
160
|
+
bytes.set(row.vector);
|
|
161
|
+
best.offer(row.id, floats);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
best.offer(row.id, decodeVector(row.vector));
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return best.top;
|
|
143
168
|
}
|
|
144
169
|
// Ties break on id so the cut is the same on every run.
|
|
145
170
|
function beats(score, id, other) {
|
|
@@ -213,7 +238,7 @@ export function importLegacyEmbeddingIndex(db, hippoRoot) {
|
|
|
213
238
|
}
|
|
214
239
|
// SAFETY: the SELECT names exactly the one column read.
|
|
215
240
|
const model = db.prepare(`SELECT value FROM meta WHERE key = ?`).get(EMBEDDING_MODEL_META_KEY)?.value ?? '';
|
|
216
|
-
const written =
|
|
241
|
+
const written = withWriteScope(db, 'import_legacy_vectors', () => upsertVectors(db, index, model));
|
|
217
242
|
const backup = `${fp}.imported-${stamp()}`;
|
|
218
243
|
if (moveAside(fp, backup)) {
|
|
219
244
|
log.info(`moved ${written} vectors from ${LEGACY_EMBEDDINGS_FILE} into the store; the file is kept as ${path.basename(backup)}`, { hippoRoot });
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface WalCheckpointer {
|
|
2
|
+
/** Counts one finished response and starts a checkpoint when enough have finished, unless one is still running. */
|
|
3
|
+
noteResponse(): void;
|
|
4
|
+
/** Resolves once the worker's connection is closed, so the caller's own close can be SQLite's last. */
|
|
5
|
+
stop(): Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
/** The wal_autocheckpoint value for a new connection to `dbPath` in this process. */
|
|
8
|
+
export declare function autoCheckpointPages(dbPath: string): number;
|
|
9
|
+
/** Checkpoints `dbPath` off the calling thread until `stop()`; the worker starts with the first checkpoint that is due. */
|
|
10
|
+
export declare function startWalCheckpointer(dbPath: string): WalCheckpointer;
|
|
11
|
+
//# sourceMappingURL=wal-checkpointer.d.ts.map
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// A served store's WAL is checkpointed on a worker thread: the fsync calls of a checkpoint would otherwise stall every request on the event loop.
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { Worker } from 'node:worker_threads';
|
|
4
|
+
import { errorMessage, log } from '../util/log.js';
|
|
5
|
+
// WAL pages at which a connection checkpoints inside its own commit.
|
|
6
|
+
const INLINE_CHECKPOINT_PAGES = 100;
|
|
7
|
+
// The same limit while a worker checkpoints the store: SQLite still bounds the WAL when the worker falls behind.
|
|
8
|
+
const BACKSTOP_CHECKPOINT_PAGES = 4000;
|
|
9
|
+
// Sized so one background checkpoint covers about 1000 WAL pages of recalls, SQLite's own default.
|
|
10
|
+
const RESPONSES_PER_CHECKPOINT = 32;
|
|
11
|
+
// After a checkpoint that left frames behind, a sooner retry keeps what an inline checkpoint would have to flush small.
|
|
12
|
+
const RESPONSES_PER_RETRY = 8;
|
|
13
|
+
// A commit that lands during a pass leaves frames behind, and only a WAL with none left can be reused from its start.
|
|
14
|
+
const MAX_PASSES = 4;
|
|
15
|
+
// CommonJS in a string, so the worker starts the same way from dist, vitest and strip-types, with no second entry file.
|
|
16
|
+
const WORKER_SOURCE = `
|
|
17
|
+
const { parentPort, workerData } = require('node:worker_threads');
|
|
18
|
+
const { DatabaseSync } = require('node:sqlite');
|
|
19
|
+
const db = new DatabaseSync(workerData.dbPath);
|
|
20
|
+
db.exec('PRAGMA busy_timeout = 5000');
|
|
21
|
+
db.exec('PRAGMA synchronous = NORMAL');
|
|
22
|
+
const pass = db.prepare('PRAGMA wal_checkpoint(PASSIVE)');
|
|
23
|
+
parentPort.on('message', (message) => {
|
|
24
|
+
if (message === 'stop') {
|
|
25
|
+
db.close();
|
|
26
|
+
parentPort.close();
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
let seen = -1;
|
|
30
|
+
let settled = false;
|
|
31
|
+
for (let n = 0; n < workerData.maxPasses && !settled; n++) {
|
|
32
|
+
const { busy, log, checkpointed } = pass.get();
|
|
33
|
+
if (busy) break;
|
|
34
|
+
settled = log === seen && checkpointed === log;
|
|
35
|
+
seen = log;
|
|
36
|
+
}
|
|
37
|
+
parentPort.postMessage(settled);
|
|
38
|
+
});
|
|
39
|
+
`;
|
|
40
|
+
const backgrounded = new Set();
|
|
41
|
+
/** The wal_autocheckpoint value for a new connection to `dbPath` in this process. */
|
|
42
|
+
export function autoCheckpointPages(dbPath) {
|
|
43
|
+
return backgrounded.has(path.resolve(dbPath)) ? BACKSTOP_CHECKPOINT_PAGES : INLINE_CHECKPOINT_PAGES;
|
|
44
|
+
}
|
|
45
|
+
/** Checkpoints `dbPath` off the calling thread until `stop()`; the worker starts with the first checkpoint that is due. */
|
|
46
|
+
export function startWalCheckpointer(dbPath) {
|
|
47
|
+
const key = path.resolve(dbPath);
|
|
48
|
+
let worker;
|
|
49
|
+
let exited;
|
|
50
|
+
let running = false;
|
|
51
|
+
let stopped = false;
|
|
52
|
+
let responses = 0;
|
|
53
|
+
let due = RESPONSES_PER_CHECKPOINT;
|
|
54
|
+
backgrounded.add(key);
|
|
55
|
+
const end = () => {
|
|
56
|
+
stopped = true;
|
|
57
|
+
backgrounded.delete(key);
|
|
58
|
+
};
|
|
59
|
+
const spawn = () => {
|
|
60
|
+
// An explicit execArgv keeps the parent's loaders out of the worker and silences its repeat of the node:sqlite warning.
|
|
61
|
+
const started = new Worker(WORKER_SOURCE, { eval: true, execArgv: ['--no-warnings'], workerData: { dbPath: key, maxPasses: MAX_PASSES } });
|
|
62
|
+
started.unref();
|
|
63
|
+
started.on('message', (settled) => {
|
|
64
|
+
running = false;
|
|
65
|
+
due = settled ? RESPONSES_PER_CHECKPOINT : RESPONSES_PER_RETRY;
|
|
66
|
+
});
|
|
67
|
+
started.on('error', (err) => {
|
|
68
|
+
end();
|
|
69
|
+
log.warn(`background checkpoint of ${key} stopped (${errorMessage(err)}); each connection checkpoints inside its own commit again`);
|
|
70
|
+
});
|
|
71
|
+
exited = new Promise((resolve) => { started.once('exit', () => resolve()); });
|
|
72
|
+
return started;
|
|
73
|
+
};
|
|
74
|
+
return {
|
|
75
|
+
noteResponse() {
|
|
76
|
+
if (stopped || ++responses < due || running)
|
|
77
|
+
return;
|
|
78
|
+
responses = 0;
|
|
79
|
+
running = true;
|
|
80
|
+
worker ??= spawn();
|
|
81
|
+
worker.postMessage('checkpoint');
|
|
82
|
+
},
|
|
83
|
+
async stop() {
|
|
84
|
+
const live = !stopped;
|
|
85
|
+
end();
|
|
86
|
+
if (live)
|
|
87
|
+
worker?.postMessage('stop');
|
|
88
|
+
await exited;
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=wal-checkpointer.js.map
|