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
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { topVectorMatches } from '../vector-store.js';
|
|
1
|
+
import { isFtsAvailable, closeHippoDb } from '../db/index.js';
|
|
2
|
+
import { tokenize } from '../util/tokenize.js';
|
|
3
|
+
import { isPersonalScope, scopeAdmitSql } from './recall-scope.js';
|
|
4
|
+
import { ftsTermParts, RAREST_TERM_COUNT, rarestFtsQuery } from '../core/prompt-recall.js';
|
|
5
|
+
import { errorMessage, log } from '../util/log.js';
|
|
6
|
+
import { originInSql } from '../core/project-identity.js';
|
|
7
|
+
import { topVectorMatches } from '../db/vector-store.js';
|
|
9
8
|
import { MEMORY_SELECT_COLUMNS, MEMORY_SEARCH_COLUMNS, DEFAULT_SEARCH_CANDIDATE_LIMIT, rowToEntry, } from './rows.js';
|
|
10
9
|
import { openStore } from './open.js';
|
|
11
|
-
import { escapeLike } from '../escape.js';
|
|
10
|
+
import { escapeLike } from '../util/escape.js';
|
|
12
11
|
/** The recall scope rule for a table column prefix (`m.` or none); `passesScopeFilterForRecall` in recall-scope.ts is its JS twin. */
|
|
13
12
|
function recallScopeClause(col, scopeFilter) {
|
|
14
13
|
if (scopeFilter === undefined)
|
|
@@ -36,16 +35,20 @@ export function recallScopeFilter(requestedScope, mode, ownScope) {
|
|
|
36
35
|
return mode === 'additive' ? { mode: 'default-deny-or-exact', value: requestedScope, ownScope } : { mode: 'exact', value: requestedScope };
|
|
37
36
|
}
|
|
38
37
|
const FTS_QUERY_SYNTAX_RE = /fts5: syntax error|unterminated string/i;
|
|
39
|
-
|
|
38
|
+
let forceLikePath = false;
|
|
39
|
+
/** Sends term queries down the LIKE path on a build that has FTS. Only tests call it. */
|
|
40
|
+
export function _forceLikePathForTests(on) {
|
|
41
|
+
forceLikePath = on;
|
|
42
|
+
}
|
|
43
|
+
function loadSearchRows(db, query, limit, tenantId, options = {}) {
|
|
44
|
+
const { scopeFilter, includeSuperseded = true, originProjects } = options;
|
|
40
45
|
const p = searchPredicates(tenantId, scopeFilter, includeSuperseded, originProjects);
|
|
41
46
|
const terms = Array.from(new Set(tokenize(query)));
|
|
42
47
|
if (terms.length === 0) {
|
|
43
48
|
// LIMIT here too, so every candidate path honours the caller's cap.
|
|
44
49
|
return selectAllCandidates(db, p, limit);
|
|
45
50
|
}
|
|
46
|
-
//
|
|
47
|
-
// writes keep using `isFtsAvailable` and never silently skip FTS index sync.
|
|
48
|
-
const forceLikePath = envForceLikePath();
|
|
51
|
+
// The test switch is read here, not in `isFtsAvailable`, so writes never skip FTS index sync.
|
|
49
52
|
if (!forceLikePath && isFtsAvailable(db)) {
|
|
50
53
|
const rows = selectFtsCandidates(db, terms, p, limit);
|
|
51
54
|
if (rows.length > 0)
|
|
@@ -63,13 +66,11 @@ function searchPredicates(tenantId, scopeFilter, includeSuperseded, originProjec
|
|
|
63
66
|
// helpers). tenantId set = strict tenant isolation, leveraging the composite
|
|
64
67
|
// idx_memories_tenant_created (leading column tenant_id, O(log n) lookup).
|
|
65
68
|
const tenantPredicate = tenantId !== undefined ? ` AND m.tenant_id = ?` : '';
|
|
66
|
-
const tenantPredicateNoAlias = tenantId !== undefined ? ` AND tenant_id = ?` : '';
|
|
67
69
|
const tenantOnlyPredicate = tenantId !== undefined ? ` WHERE tenant_id = ?` : '';
|
|
68
70
|
const tenantParams = tenantId !== undefined ? [tenantId] : [];
|
|
69
71
|
// Defensive: kind='archived' is a transient sentinel inside archiveRawMemory's SAVEPOINT, so this only
|
|
70
72
|
// guards against a dropped SAVEPOINT, a persisted 'archived' state, or direct-SQL writes.
|
|
71
73
|
const archivedClauseAlias = ` AND m.kind != 'archived'`;
|
|
72
|
-
const archivedClauseNoAlias = ` AND kind != 'archived'`;
|
|
73
74
|
// For the "tenant-only" path: if no tenant set, tenantOnlyPredicate is '',
|
|
74
75
|
// so prepend WHERE; if tenant set, append AND. handled in each call site
|
|
75
76
|
// by always joining `tenantOnlyPredicate + archivedClauseTenantOnly` where
|
|
@@ -81,8 +82,8 @@ function searchPredicates(tenantId, scopeFilter, includeSuperseded, originProjec
|
|
|
81
82
|
const currentAlias = includeSuperseded ? '' : ' AND m.superseded_by IS NULL';
|
|
82
83
|
const currentNoAlias = includeSuperseded ? '' : ' AND superseded_by IS NULL';
|
|
83
84
|
return {
|
|
84
|
-
tenantPredicate,
|
|
85
|
-
archivedClauseAlias,
|
|
85
|
+
tenantPredicate, tenantOnlyPredicate, tenantParams,
|
|
86
|
+
archivedClauseAlias, archivedClauseTenantOnly,
|
|
86
87
|
aliasScope, plainScope, scopeParams, currentAlias, currentNoAlias,
|
|
87
88
|
};
|
|
88
89
|
}
|
|
@@ -113,27 +114,37 @@ function selectFtsCandidates(db, terms, p, limit) {
|
|
|
113
114
|
}
|
|
114
115
|
catch (err) {
|
|
115
116
|
// A query FTS5 cannot parse is expected input; anything else means the index itself is broken.
|
|
116
|
-
const message =
|
|
117
|
+
const message = errorMessage(err);
|
|
117
118
|
if (!FTS_QUERY_SYNTAX_RE.test(message))
|
|
118
119
|
log.once('fts-match-fallback', 'warn', `FTS search failed, using the slower LIKE match: ${message}`);
|
|
119
120
|
return [];
|
|
120
121
|
}
|
|
121
122
|
}
|
|
123
|
+
/** Newest admitted rows the substring match tests, so a query matching nothing costs the same in a store of any size. */
|
|
124
|
+
const LIKE_WINDOW_ROWS = 2000;
|
|
125
|
+
/** Substring matches in content or tags among the newest admitted rows: the lexical path without FTS5, and the catch for a part-word that FTS5 tokens miss. */
|
|
122
126
|
function selectLikeCandidates(db, terms, p, limit) {
|
|
123
127
|
const where = terms.map(() => `(LOWER(content) LIKE ? ESCAPE '\\' OR LOWER(tags_json) LIKE ? ESCAPE '\\')`).join(' OR ');
|
|
124
128
|
const params = terms.flatMap((term) => {
|
|
125
129
|
const like = `%${escapeLike(term)}%`;
|
|
126
130
|
return [like, like];
|
|
127
131
|
});
|
|
128
|
-
//
|
|
129
|
-
|
|
132
|
+
// idx_memories_tenant_created serves a tenant's newest rows; with no tenant only the table's own order needs no sort.
|
|
133
|
+
const newestFirst = p.tenantParams.length > 0 ? 'created DESC' : 'rowid DESC';
|
|
134
|
+
// SHORTCUT: no index serves a substring, so a match older than the window is missed; an FTS5 trigram index is the upgrade.
|
|
135
|
+
// SAFETY: the outer query selects exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
|
|
130
136
|
return db.prepare(`
|
|
131
137
|
SELECT ${MEMORY_SELECT_COLUMNS}
|
|
132
|
-
FROM
|
|
133
|
-
|
|
138
|
+
FROM (
|
|
139
|
+
SELECT ${MEMORY_SELECT_COLUMNS}, updated_at
|
|
140
|
+
FROM memories${p.tenantOnlyPredicate}${p.archivedClauseTenantOnly}${p.plainScope.sql}${p.currentNoAlias}
|
|
141
|
+
ORDER BY ${newestFirst}
|
|
142
|
+
LIMIT ?
|
|
143
|
+
)
|
|
144
|
+
WHERE (${where})
|
|
134
145
|
ORDER BY updated_at DESC, created DESC, content ASC, id ASC
|
|
135
146
|
LIMIT ?
|
|
136
|
-
`).all(...
|
|
147
|
+
`).all(...p.tenantParams, ...p.scopeParams, Math.max(limit, LIKE_WINDOW_ROWS), ...params, limit);
|
|
137
148
|
}
|
|
138
149
|
/**
|
|
139
150
|
* Load likely search candidates directly from SQLite.
|
|
@@ -171,7 +182,7 @@ export function loadSearchEntries(hippoRoot, query, limit = DEFAULT_SEARCH_CANDI
|
|
|
171
182
|
export function loadRecallSearchEntries(hippoRoot, query, limit = DEFAULT_SEARCH_CANDIDATE_LIMIT, tenantId, requestedScope, explicitScopeMode = 'exact', includeSuperseded = true, originProjects, ownScope) {
|
|
172
183
|
const db = openStore(hippoRoot);
|
|
173
184
|
try {
|
|
174
|
-
return loadRecallSearchEntriesFromDb(db, query, limit, tenantId, requestedScope, explicitScopeMode, includeSuperseded, originProjects, ownScope);
|
|
185
|
+
return loadRecallSearchEntriesFromDb(db, query, { limit, tenantId, requestedScope, explicitScopeMode, includeSuperseded, originProjects, ownScope });
|
|
175
186
|
}
|
|
176
187
|
finally {
|
|
177
188
|
closeHippoDb(db);
|
|
@@ -179,18 +190,20 @@ export function loadRecallSearchEntries(hippoRoot, query, limit = DEFAULT_SEARCH
|
|
|
179
190
|
}
|
|
180
191
|
// Split out so callers with an already-open db (the prompt-recall path) skip
|
|
181
192
|
// the initStore+open/close cycle per store per call.
|
|
182
|
-
export function loadRecallSearchEntriesFromDb(db, query,
|
|
183
|
-
|
|
193
|
+
export function loadRecallSearchEntriesFromDb(db, query, options = {}) {
|
|
194
|
+
const { limit = DEFAULT_SEARCH_CANDIDATE_LIMIT, tenantId, requestedScope, explicitScopeMode = 'exact', includeSuperseded = true, originProjects, ownScope } = options;
|
|
195
|
+
const scopeFilter = recallScopeFilter(requestedScope, explicitScopeMode, ownScope);
|
|
196
|
+
return loadSearchRows(db, query, limit, tenantId, { scopeFilter, includeSuperseded, originProjects }).map(rowToEntry);
|
|
184
197
|
}
|
|
185
198
|
/** The rows nearest `queryVector` that pass `spec`, nearest first. */
|
|
186
|
-
export function loadVectorCandidateEntries(hippoRoot, queryVector, spec) {
|
|
199
|
+
export async function loadVectorCandidateEntries(hippoRoot, queryVector, spec) {
|
|
187
200
|
const scope = withProject(recallScopeClause('m.', spec.scope), 'm.', spec.origin);
|
|
188
201
|
const tenant = spec.tenantId !== undefined ? ' AND m.tenant_id = ?' : '';
|
|
189
202
|
const current = spec.includeSuperseded ? '' : ' AND m.superseded_by IS NULL';
|
|
190
203
|
const params = [...(spec.tenantId !== undefined ? [spec.tenantId] : []), ...scope.params];
|
|
191
204
|
const db = openStore(hippoRoot);
|
|
192
205
|
try {
|
|
193
|
-
const matches = topVectorMatches(db, queryVector, spec.limit ?? 50, `${tenant} AND m.kind != 'archived'${scope.sql}${current}`, params);
|
|
206
|
+
const matches = await topVectorMatches(db, queryVector, spec.limit ?? 50, `${tenant} AND m.kind != 'archived'${scope.sql}${current}`, params);
|
|
194
207
|
if (matches.length === 0)
|
|
195
208
|
return [];
|
|
196
209
|
// SAFETY: the SELECT names exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
|
package/dist/store/sessions.d.ts
CHANGED
|
@@ -76,7 +76,7 @@ export declare function clearActiveTaskSnapshot(hippoRoot: string, tenantId: str
|
|
|
76
76
|
* closed (0 when no active row is owned by `sessionId`).
|
|
77
77
|
*/
|
|
78
78
|
export declare function closeTaskSnapshotsForSession(hippoRoot: string, tenantId: string, sessionId: string, status?: string, key?: ContinuityKey): number;
|
|
79
|
-
|
|
79
|
+
interface SessionEventInput {
|
|
80
80
|
session_id: string;
|
|
81
81
|
event_type: string;
|
|
82
82
|
content: string;
|
|
@@ -84,7 +84,8 @@ export declare function appendSessionEvent(hippoRoot: string, tenantId: string,
|
|
|
84
84
|
source?: string;
|
|
85
85
|
scope?: string | null;
|
|
86
86
|
metadata?: Record<string, unknown>;
|
|
87
|
-
}
|
|
87
|
+
}
|
|
88
|
+
export declare function appendSessionEvent(hippoRoot: string, tenantId: string, event: SessionEventInput): SessionEvent;
|
|
88
89
|
export declare function listSessionEvents(hippoRoot: string, tenantId: string, options?: {
|
|
89
90
|
session_id?: string;
|
|
90
91
|
task?: string;
|
|
@@ -102,5 +103,15 @@ export declare function findPromotableSessions(hippoRoot: string, tenantId: stri
|
|
|
102
103
|
* already exists.
|
|
103
104
|
*/
|
|
104
105
|
export declare function traceExistsForSession(hippoRoot: string, tenantId: string, session_id: string): boolean;
|
|
106
|
+
/** One caller's claim on a session id. */
|
|
107
|
+
export interface SessionOwnerBinding {
|
|
108
|
+
readonly tenantId: string;
|
|
109
|
+
readonly sessionId: string;
|
|
110
|
+
readonly owner: string;
|
|
111
|
+
/** Bindings older than this are pruned in the write that adds a new one. */
|
|
112
|
+
readonly retentionMs: number;
|
|
113
|
+
}
|
|
114
|
+
/** The owner stored for the session id, binding `binding.owner` first when none is stored. */
|
|
115
|
+
export declare function sessionOwnerOrBind(hippoRoot: string, binding: SessionOwnerBinding): string | null;
|
|
105
116
|
export {};
|
|
106
117
|
//# sourceMappingURL=sessions.d.ts.map
|
package/dist/store/sessions.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { isSharedStore } from '../config.js';
|
|
2
|
-
import { closeHippoDb } from '../db.js';
|
|
1
|
+
import { isSharedStore } from '../core/config.js';
|
|
2
|
+
import { closeHippoDb, HOOK_DB_WAIT_MS, scopedBusyWait, withWriteScope } from '../db/index.js';
|
|
3
3
|
import { raiseMinBinary } from '../db/meta.js';
|
|
4
|
-
import { originInSql } from '../project-identity.js';
|
|
5
|
-
import { assertTenantId } from '
|
|
6
|
-
import { redactSecretsStrict } from '../secret-detect.js';
|
|
7
|
-
import { TASK_OWNER_MIN_BINARY } from '../version.js';
|
|
4
|
+
import { originInSql } from '../core/project-identity.js';
|
|
5
|
+
import { assertTenantId } from './tenant.js';
|
|
6
|
+
import { redactSecretsStrict } from '../util/secret-detect.js';
|
|
7
|
+
import { TASK_OWNER_MIN_BINARY } from '../util/version.js';
|
|
8
8
|
import { rowToTaskSnapshot, rowToSessionEvent, } from './rows.js';
|
|
9
9
|
import { writeActiveTaskMirror, removeActiveTaskMirror, writeRecentSessionMirror } from './mirrors.js';
|
|
10
|
-
import { openStore } from './open.js';
|
|
10
|
+
import { onHandle, openStore } from './open.js';
|
|
11
11
|
/** All or nothing: a key missing its owner or every project name matches no row, never the tenant's newest. */
|
|
12
12
|
export function continuityWhere(key) {
|
|
13
13
|
const names = key.project.filter((n) => n !== '');
|
|
@@ -42,14 +42,15 @@ export function saveActiveTaskSnapshot(hippoRoot, tenantId, snapshot, key) {
|
|
|
42
42
|
const db = openStore(hippoRoot);
|
|
43
43
|
const now = new Date().toISOString();
|
|
44
44
|
try {
|
|
45
|
-
db
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
45
|
+
const id = withWriteScope(db, 'save_active_task', () => {
|
|
46
|
+
db.prepare(`UPDATE task_snapshots SET status = 'superseded', updated_at = ? WHERE status = 'active' AND tenant_id = ?${owned ? ` AND ${owned.sql}` : ''}`)
|
|
47
|
+
.run(now, tenantId, ...(owned?.params ?? []));
|
|
48
|
+
const inserted = insertSnapshot(db, tenantId, snapshot, now, stamp);
|
|
49
|
+
// An older binary's tenant-wide supersede would close other owners' rows, so the first owner row shuts it out.
|
|
50
|
+
if (stamp)
|
|
51
|
+
raiseMinBinary(db, TASK_OWNER_MIN_BINARY);
|
|
52
|
+
return inserted;
|
|
53
|
+
});
|
|
53
54
|
// SAFETY: row's shape matches the ten columns named in the SELECT above.
|
|
54
55
|
const row = db.prepare(`
|
|
55
56
|
SELECT id, task, summary, next_step, status, source, session_id, scope, created_at, updated_at
|
|
@@ -65,15 +66,6 @@ export function saveActiveTaskSnapshot(hippoRoot, tenantId, snapshot, key) {
|
|
|
65
66
|
writeActiveTaskMirror(hippoRoot, tenantId, loaded);
|
|
66
67
|
return loaded;
|
|
67
68
|
}
|
|
68
|
-
catch (error) {
|
|
69
|
-
try {
|
|
70
|
-
db.exec('ROLLBACK');
|
|
71
|
-
}
|
|
72
|
-
catch {
|
|
73
|
-
// Ignore nested rollback failures.
|
|
74
|
-
}
|
|
75
|
-
throw error;
|
|
76
|
-
}
|
|
77
69
|
finally {
|
|
78
70
|
closeHippoDb(db);
|
|
79
71
|
}
|
|
@@ -202,39 +194,45 @@ export function closeTaskSnapshotsForSession(hippoRoot, tenantId, sessionId, sta
|
|
|
202
194
|
closeHippoDb(db);
|
|
203
195
|
}
|
|
204
196
|
}
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
const db = openStore(hippoRoot);
|
|
208
|
-
const now = new Date().toISOString();
|
|
209
|
-
// Scope is stored as given; default-deny in api.recall + cmdRecall
|
|
210
|
-
// continuity reads applies to slack:private:* and 'unknown:legacy' rows.
|
|
211
|
-
try {
|
|
212
|
-
const result = db.prepare(`
|
|
197
|
+
function insertSessionEventRow(db, tenantId, event, now) {
|
|
198
|
+
const result = db.prepare(`
|
|
213
199
|
INSERT INTO session_events(session_id, task, event_type, content, source, scope, metadata_json, tenant_id, created_at)
|
|
214
200
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
215
201
|
`).run(event.session_id, event.task ?? null, event.event_type, event.content, event.source ?? 'cli', event.scope ?? null, JSON.stringify(event.metadata ?? {}), tenantId, now);
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
202
|
+
return Number(result.lastInsertRowid ?? 0);
|
|
203
|
+
}
|
|
204
|
+
function reloadSessionEvent(db, id) {
|
|
205
|
+
// SAFETY: row's shape matches the nine columns named in the SELECT below.
|
|
206
|
+
const row = db.prepare(`
|
|
220
207
|
SELECT id, session_id, task, event_type, content, source, scope, metadata_json, created_at
|
|
221
208
|
FROM session_events
|
|
222
209
|
WHERE id = ?
|
|
223
210
|
`).get(id);
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
211
|
+
if (!row) {
|
|
212
|
+
throw new Error('Failed to reload saved session event');
|
|
213
|
+
}
|
|
214
|
+
return rowToSessionEvent(row);
|
|
215
|
+
}
|
|
216
|
+
function recentSessionEventsOldestFirst(db, tenantId, sessionId, limit) {
|
|
217
|
+
// SAFETY: recentRows' shape matches the nine columns named in the SELECT below.
|
|
218
|
+
const recentRows = db.prepare(`
|
|
231
219
|
SELECT id, session_id, task, event_type, content, source, scope, metadata_json, created_at
|
|
232
220
|
FROM session_events
|
|
233
221
|
WHERE session_id = ? AND tenant_id = ?
|
|
234
222
|
ORDER BY created_at DESC, id DESC
|
|
235
223
|
LIMIT ?
|
|
236
|
-
`).all(
|
|
237
|
-
|
|
224
|
+
`).all(sessionId, tenantId, limit);
|
|
225
|
+
return recentRows.map(rowToSessionEvent).reverse();
|
|
226
|
+
}
|
|
227
|
+
export function appendSessionEvent(hippoRoot, tenantId, event) {
|
|
228
|
+
assertTenantId('appendSessionEvent', tenantId);
|
|
229
|
+
const db = openStore(hippoRoot);
|
|
230
|
+
const now = new Date().toISOString();
|
|
231
|
+
// Scope is stored as given; default-deny in api.recall + cmdRecall
|
|
232
|
+
// continuity reads applies to slack:private:* and 'unknown:legacy' rows.
|
|
233
|
+
try {
|
|
234
|
+
const loaded = reloadSessionEvent(db, insertSessionEventRow(db, tenantId, event, now));
|
|
235
|
+
const recent = recentSessionEventsOldestFirst(db, tenantId, loaded.session_id, 20);
|
|
238
236
|
writeRecentSessionMirror(hippoRoot, tenantId, recent);
|
|
239
237
|
return loaded;
|
|
240
238
|
}
|
|
@@ -313,4 +311,40 @@ export function traceExistsForSession(hippoRoot, tenantId, session_id) {
|
|
|
313
311
|
closeHippoDb(db);
|
|
314
312
|
}
|
|
315
313
|
}
|
|
314
|
+
/** The owner a session id is bound to, or null. */
|
|
315
|
+
function selectSessionOwnerAt(db, tenantId, sessionId) {
|
|
316
|
+
// SAFETY: the SELECT names exactly this one TEXT column.
|
|
317
|
+
const row = db.prepare(`SELECT owner_subject FROM session_owners WHERE tenant_id = ? AND session_id = ?`).get(tenantId, sessionId);
|
|
318
|
+
return row?.owner_subject ?? null;
|
|
319
|
+
}
|
|
320
|
+
/** Binds `sessionId` to `owner` unless a binding exists; the count is 1 when this call bound it. */
|
|
321
|
+
function insertSessionOwnerAt(db, tenantId, sessionId, owner, createdAt) {
|
|
322
|
+
const result = db.prepare(`INSERT OR IGNORE INTO session_owners(tenant_id, session_id, owner_subject, created_at) VALUES (?, ?, ?, ?)`)
|
|
323
|
+
.run(tenantId, sessionId, owner, createdAt);
|
|
324
|
+
return Number(result.changes ?? 0);
|
|
325
|
+
}
|
|
326
|
+
// SHORTCUT: no created_at index, so each first bind scans the table; add one past a few hundred thousand rows.
|
|
327
|
+
/** Drops bindings created before `cutoffIso`. */
|
|
328
|
+
function deleteSessionOwnersBeforeAt(db, cutoffIso) {
|
|
329
|
+
db.prepare(`DELETE FROM session_owners WHERE created_at < ?`).run(cutoffIso);
|
|
330
|
+
}
|
|
331
|
+
/** Binds under the write lock and returns the stored owner, which is not `owner` when a concurrent first bind won. */
|
|
332
|
+
function insertSessionOwner(db, binding) {
|
|
333
|
+
const { tenantId, sessionId, owner, retentionMs } = binding;
|
|
334
|
+
withWriteScope(db, 'bind_session_owner', () => {
|
|
335
|
+
const bound = insertSessionOwnerAt(db, tenantId, sessionId, owner, new Date().toISOString());
|
|
336
|
+
// An older binary supersedes across owners, so the first binding shuts it out in the same transaction.
|
|
337
|
+
if (bound === 1)
|
|
338
|
+
raiseMinBinary(db, TASK_OWNER_MIN_BINARY);
|
|
339
|
+
// Pruned on write, as the failure log is; a pruned session id is a UUID no other caller knows.
|
|
340
|
+
deleteSessionOwnersBeforeAt(db, new Date(Date.now() - retentionMs).toISOString());
|
|
341
|
+
}, { busyWaitMs: scopedBusyWait() ?? HOOK_DB_WAIT_MS });
|
|
342
|
+
// Re-read, since a concurrent first bind may have won the INSERT OR IGNORE.
|
|
343
|
+
return selectSessionOwnerAt(db, tenantId, sessionId);
|
|
344
|
+
}
|
|
345
|
+
/** The owner stored for the session id, binding `binding.owner` first when none is stored. */
|
|
346
|
+
export function sessionOwnerOrBind(hippoRoot, binding) {
|
|
347
|
+
// A bound session is the common case after the first prompt, so it must not take the write lock.
|
|
348
|
+
return onHandle(hippoRoot, (db) => selectSessionOwnerAt(db, binding.tenantId, binding.sessionId) ?? insertSessionOwner(db, binding));
|
|
349
|
+
}
|
|
316
350
|
//# sourceMappingURL=sessions.js.map
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const ROLLS_BACK_PART = /^\s*ROLLBACK\s+TO\b/i;
|
|
2
|
+
// After any of these the connection may be in autocommit, where a statement prepared earlier commits on its own.
|
|
3
|
+
const ENDS_TRANSACTION = /^\s*(?:COMMIT|END|RELEASE|ROLLBACK)\b/i;
|
|
4
|
+
// Reads, and the statements that open a transaction: none makes a change durable on its own.
|
|
5
|
+
const NEVER_COMMITS = /^\s*(?:SELECT|BEGIN|SAVEPOINT|PRAGMA|EXPLAIN)\b/i;
|
|
6
|
+
/** Whether running `sql` on `db` can make a change durable. Anything the patterns do not know counts as a commit. */
|
|
7
|
+
function mayCommit(db, sql) {
|
|
8
|
+
if (ROLLS_BACK_PART.test(sql))
|
|
9
|
+
return false;
|
|
10
|
+
if (ENDS_TRANSACTION.test(sql))
|
|
11
|
+
return true;
|
|
12
|
+
return db.isTransaction !== true && !NEVER_COMMITS.test(sql);
|
|
13
|
+
}
|
|
14
|
+
/** Calls `mark` before `db` is handed any statement that may commit. */
|
|
15
|
+
export function watchCommits(db, mark) {
|
|
16
|
+
const exec = db.exec.bind(db);
|
|
17
|
+
const prepare = db.prepare.bind(db);
|
|
18
|
+
db.exec = (sql) => {
|
|
19
|
+
if (mayCommit(db, sql))
|
|
20
|
+
mark();
|
|
21
|
+
exec(sql);
|
|
22
|
+
};
|
|
23
|
+
db.prepare = (sql) => {
|
|
24
|
+
if (mayCommit(db, sql))
|
|
25
|
+
mark();
|
|
26
|
+
return prepare(sql);
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=commit-watch.js.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ConnectorEvents, Sync } from '../port.js';
|
|
2
|
+
export declare function sqliteConnectorEvents(hippoRoot: string): Sync<ConnectorEvents>;
|
|
3
|
+
/** The group as a served store answers it: each call runs at once and resolves through a Promise, so a throw rejects as another store's would. */
|
|
4
|
+
export declare function servedConnectorEvents(sync: Sync<ConnectorEvents>): ConnectorEvents;
|
|
5
|
+
//# sourceMappingURL=connector-events-group.d.ts.map
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// hippo.db's half of the ConnectorEvents store group: each call on a handle of its own.
|
|
2
|
+
import { archiveDeletedArtifact, eventSeenAt, githubRouting, insertDlq, logEvent, seenEvent } from '../connectors/github.js';
|
|
3
|
+
import { insertSlackDlq, markSlackEventSeen, rawMemoryIdForArtifactAt, slackEventRecord, slackEventSeenAt, slackTeamRoute } from '../connectors/slack.js';
|
|
4
|
+
import { onHandle } from '../open.js';
|
|
5
|
+
function eventRecord(hippoRoot, event) {
|
|
6
|
+
if (event.connector === 'slack')
|
|
7
|
+
return slackEventRecord(hippoRoot, event.eventId);
|
|
8
|
+
const logged = seenEvent(hippoRoot, event.idempotencyKey);
|
|
9
|
+
return logged ? { seen: true, memoryId: logged.memoryId } : { seen: false };
|
|
10
|
+
}
|
|
11
|
+
function markEventSeen(hippoRoot, event) {
|
|
12
|
+
if (event.connector === 'slack')
|
|
13
|
+
return markSlackEventSeen(hippoRoot, event.eventId, null);
|
|
14
|
+
const { idempotencyKey, deliveryId, eventName } = event;
|
|
15
|
+
logEvent(hippoRoot, { idempotencyKey, deliveryId, eventName, memoryId: null });
|
|
16
|
+
}
|
|
17
|
+
function deletionTarget(hippoRoot, { event, artifactRef, tenantId }) {
|
|
18
|
+
return onHandle(hippoRoot, (db) => {
|
|
19
|
+
const seen = event.connector === 'slack' ? slackEventSeenAt(db, event.eventId) : eventSeenAt(db, event.idempotencyKey);
|
|
20
|
+
return seen ? { seen: true } : { seen: false, memoryId: rawMemoryIdForArtifactAt(db, artifactRef, tenantId) };
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
function archiveArtifact(hippoRoot, { tenantId, actor, artifactRef, reason, event }) {
|
|
24
|
+
const { idempotencyKey, deliveryId, eventName } = event;
|
|
25
|
+
return archiveDeletedArtifact(hippoRoot, { tenantId, artifactRef, idempotencyKey, deliveryId, eventName, reason, who: actor });
|
|
26
|
+
}
|
|
27
|
+
export function sqliteConnectorEvents(hippoRoot) {
|
|
28
|
+
return {
|
|
29
|
+
eventRecord: (event) => eventRecord(hippoRoot, event),
|
|
30
|
+
markEventSeen: (event) => markEventSeen(hippoRoot, event),
|
|
31
|
+
deletionTarget: (lookup) => deletionTarget(hippoRoot, lookup),
|
|
32
|
+
archiveDeletedArtifact: (archive) => archiveArtifact(hippoRoot, archive),
|
|
33
|
+
slackTeamRoute: (teamId) => slackTeamRoute(hippoRoot, teamId),
|
|
34
|
+
githubRouting: (query) => githubRouting(hippoRoot, query),
|
|
35
|
+
parkDeadLetter: (letter) => (letter.connector === 'slack' ? insertSlackDlq(hippoRoot, letter) : insertDlq(hippoRoot, letter)),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/** The group as a served store answers it: each call runs at once and resolves through a Promise, so a throw rejects as another store's would. */
|
|
39
|
+
export function servedConnectorEvents(sync) {
|
|
40
|
+
return {
|
|
41
|
+
eventRecord: async (event) => sync.eventRecord(event),
|
|
42
|
+
markEventSeen: async (event) => sync.markEventSeen(event),
|
|
43
|
+
deletionTarget: async (lookup) => sync.deletionTarget(lookup),
|
|
44
|
+
archiveDeletedArtifact: async (archive) => sync.archiveDeletedArtifact(archive),
|
|
45
|
+
slackTeamRoute: async (teamId) => sync.slackTeamRoute(teamId),
|
|
46
|
+
githubRouting: async (query) => sync.githubRouting(query),
|
|
47
|
+
parkDeadLetter: async (letter) => sync.parkDeadLetter(letter),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=connector-events-group.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ConnectorWrites, Sync } from '../port.js';
|
|
2
|
+
/** Each call on its own handle; the mirror follows the commit, so a duplicate or a rolled-back write leaves none. */
|
|
3
|
+
export declare function sqliteConnectorWrites(hippoRoot: string): Sync<ConnectorWrites>;
|
|
4
|
+
/** The group as a served store answers it: each call runs at once and resolves through a Promise, so a throw rejects as another store's would. */
|
|
5
|
+
export declare function servedConnectorWrites(sync: Sync<ConnectorWrites>): ConnectorWrites;
|
|
6
|
+
//# sourceMappingURL=connector-writes-group.d.ts.map
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { eventMemoryAt, logEventAt } from '../connectors/github.js';
|
|
2
|
+
import { markSlackEventSeenAt, slackEventMemoryAt } from '../connectors/slack.js';
|
|
3
|
+
import { stampOriginProject } from '../entry-row.js';
|
|
4
|
+
import { writeEntryMirrors } from '../entry-writes.js';
|
|
5
|
+
import { onHandle, openStore } from '../open.js';
|
|
6
|
+
import { recordQuarantine } from '../quarantine.js';
|
|
7
|
+
import { archiveRawAt, writeInOwnTenant } from './entry-writes-group.js';
|
|
8
|
+
/** Unwinds a write whose event key is already logged. Caught in this file, so no caller ever sees it. */
|
|
9
|
+
class EventAlreadyLogged extends Error {
|
|
10
|
+
}
|
|
11
|
+
/** False when the key was logged before: the insert ignores a taken key, so the first writer's row stays. */
|
|
12
|
+
function logEvent(db, event, memoryId) {
|
|
13
|
+
if (event.connector === 'slack')
|
|
14
|
+
return markSlackEventSeenAt(db, event.eventId, memoryId);
|
|
15
|
+
const { idempotencyKey, deliveryId, eventName } = event;
|
|
16
|
+
return logEventAt(db, { idempotencyKey, deliveryId, eventName, memoryId });
|
|
17
|
+
}
|
|
18
|
+
function loggedMemory(db, event) {
|
|
19
|
+
return event.connector === 'slack' ? slackEventMemoryAt(db, event.eventId) : eventMemoryAt(db, event.idempotencyKey);
|
|
20
|
+
}
|
|
21
|
+
/** The record, then the log row, go in after the memory row and ahead of its remember row, as a second store must order them. */
|
|
22
|
+
function writeWithCompanions(db, { entry, actor, event, quarantine }) {
|
|
23
|
+
writeInOwnTenant(db, entry, actor, (handle, memoryId) => {
|
|
24
|
+
if (quarantine)
|
|
25
|
+
recordQuarantine(handle, { tenantId: entry.tenantId, memoryId, originalScope: quarantine.originalScope, reason: quarantine.reason, actor });
|
|
26
|
+
if (event && !logEvent(handle, event, memoryId))
|
|
27
|
+
throw new EventAlreadyLogged();
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
function writeOnce(db, write) {
|
|
31
|
+
try {
|
|
32
|
+
writeWithCompanions(db, write);
|
|
33
|
+
return { outcome: 'written' };
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
if (!(err instanceof EventAlreadyLogged) || !write.event)
|
|
37
|
+
throw err;
|
|
38
|
+
// The scope has unwound, so this reads the winner's committed row.
|
|
39
|
+
return { outcome: 'duplicate', memoryId: loggedMemory(db, write.event) };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** Each call on its own handle; the mirror follows the commit, so a duplicate or a rolled-back write leaves none. */
|
|
43
|
+
export function sqliteConnectorWrites(hippoRoot) {
|
|
44
|
+
return {
|
|
45
|
+
writeConnectorEntry(write) {
|
|
46
|
+
const entry = stampOriginProject(hippoRoot, write.entry);
|
|
47
|
+
const result = onHandle(hippoRoot, (db) => writeOnce(db, { ...write, entry }), openStore);
|
|
48
|
+
if (result.outcome === 'written')
|
|
49
|
+
writeEntryMirrors(hippoRoot, entry);
|
|
50
|
+
return result;
|
|
51
|
+
},
|
|
52
|
+
archiveConnectorEntry(archive) {
|
|
53
|
+
// The log write's answer is unread: a key logged before keeps its row and the archive stands.
|
|
54
|
+
return archiveRawAt(hippoRoot, archive, (db, archivedId) => { logEvent(db, archive.event, archivedId); });
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** The group as a served store answers it: each call runs at once and resolves through a Promise, so a throw rejects as another store's would. */
|
|
59
|
+
export function servedConnectorWrites(sync) {
|
|
60
|
+
return {
|
|
61
|
+
writeConnectorEntry: async (write) => sync.writeConnectorEntry(write),
|
|
62
|
+
archiveConnectorEntry: async (archive) => sync.archiveConnectorEntry(archive),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=connector-writes-group.js.map
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { pagedDescendants } from '../descendant-page.js';
|
|
2
|
+
import { countSessionRawMemories, loadSessionRawMemories, selectChildrenByParent, selectEntriesByIds } from '../entry-reads.js';
|
|
3
|
+
import { onHandle, openStore } from '../open.js';
|
|
4
|
+
export function sqliteDagReads(hippoRoot) {
|
|
5
|
+
return {
|
|
6
|
+
sessionRawEntries({ tenantId, sessionId, cap, origins }) {
|
|
7
|
+
return loadSessionRawMemories(hippoRoot, sessionId, tenantId, cap, origins);
|
|
8
|
+
},
|
|
9
|
+
sessionRawCount({ tenantId, sessionId, scope, ownScope, origins }) {
|
|
10
|
+
return countSessionRawMemories(hippoRoot, sessionId, tenantId, scope, ownScope, origins);
|
|
11
|
+
},
|
|
12
|
+
summaryWithDescendants(tenantId, id, walk) {
|
|
13
|
+
return onHandle(hippoRoot, (db) => summaryWithDescendantsAt(db, tenantId, id, walk), openStore);
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
// dag_parent_id is not unique to a tree, so `seen` keeps a mislinked row from being listed twice or walked in a loop.
|
|
18
|
+
function summaryWithDescendantsAt(db, tenantId, id, { depth, admit, page }) {
|
|
19
|
+
const summary = selectEntriesByIds(db, [id], tenantId).get(id);
|
|
20
|
+
if (!summary)
|
|
21
|
+
return null;
|
|
22
|
+
if (page)
|
|
23
|
+
return pagedDescendants(db, { tenantId, summary, depth, page }, admit(summary));
|
|
24
|
+
const levels = [];
|
|
25
|
+
const seen = new Set([id]);
|
|
26
|
+
let parents = admit(summary) ? [id] : [];
|
|
27
|
+
for (let level = 0; level < depth && parents.length > 0; level++) {
|
|
28
|
+
const childrenOf = selectChildrenByParent(db, parents, tenantId);
|
|
29
|
+
const admitted = [];
|
|
30
|
+
for (const parentId of parents) {
|
|
31
|
+
for (const child of childrenOf.get(parentId) ?? []) {
|
|
32
|
+
if (seen.has(child.id) || !admit(child))
|
|
33
|
+
continue;
|
|
34
|
+
seen.add(child.id);
|
|
35
|
+
admitted.push(child);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (admitted.length === 0)
|
|
39
|
+
break;
|
|
40
|
+
levels.push(admitted);
|
|
41
|
+
parents = admitted.map((row) => row.id);
|
|
42
|
+
}
|
|
43
|
+
return { summary, levels };
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=dag-reads-group.js.map
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type DatabaseSyncLike } from '../../db/index.js';
|
|
2
|
+
import { type MemoryEntry } from '../../core/memory.js';
|
|
3
|
+
import { type ArchiveOpts } from '../raw-archive.js';
|
|
4
|
+
import type { EntryWrite, EntryWrites, OutcomeWrite, RawArchive, Sync } from '../port.js';
|
|
5
|
+
import { type WriteEntryOptions } from '../entry-writes.js';
|
|
6
|
+
/** Each call on its own handle; mirrors and the forgotten counter follow the commit, so a rolled-back write leaves neither. */
|
|
7
|
+
export declare function sqliteEntryWrites(hippoRoot: string): Sync<EntryWrites>;
|
|
8
|
+
/** A store-side hook writes on the row's handle inside its write scope, so its throw undoes the row. */
|
|
9
|
+
export declare function writeEntryAt(hippoRoot: string, { entry, actor }: EntryWrite, afterWrite?: WriteEntryOptions['afterWrite']): void;
|
|
10
|
+
/** A trace link follows the commit on the same handle and names only the ids applied, so a rolled-back outcome leaves none. */
|
|
11
|
+
export declare function applyOutcomeAt(hippoRoot: string, outcome: OutcomeWrite, traceId?: number): string[];
|
|
12
|
+
/** Reach is checked inside the archive's write scope. A store-side hook writes on the same handle inside that scope, so its throw undoes the archive. */
|
|
13
|
+
export declare function archiveRawAt(hippoRoot: string, archive: RawArchive, afterArchive?: ArchiveOpts['afterArchive']): string;
|
|
14
|
+
/** The refusal row lands after `write` has rolled back, in a fresh implicit transaction the aborted one cannot undo. */
|
|
15
|
+
export declare function auditingRefusal<T>(db: DatabaseSyncLike, actor: string, write: () => T): T;
|
|
16
|
+
/** writeEntryAt on the caller's handle, so a sibling group can read on it after the scope has unwound. */
|
|
17
|
+
export declare function writeInOwnTenant(db: DatabaseSyncLike, entry: MemoryEntry, actor: string, afterWrite?: WriteEntryOptions['afterWrite']): void;
|
|
18
|
+
//# sourceMappingURL=entry-writes-group.d.ts.map
|