hippo-memory 1.70.0 → 1.72.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 +2 -2
- package/dist/agent-memories/apply.d.ts +0 -11
- package/dist/agent-memories/apply.js +6 -21
- package/dist/agent-memories/claude-code.d.ts +4 -2
- package/dist/agent-memories/claude-code.js +15 -6
- package/dist/agent-memories/codex.js +1 -1
- package/dist/agent-memories/copilot.d.ts +1 -3
- package/dist/agent-memories/copilot.js +1 -17
- package/dist/agent-memories/files.js +23 -12
- package/dist/agent-memories/markdown.d.ts +1 -3
- package/dist/agent-memories/markdown.js +1 -3
- package/dist/agent-memories/project-folds.d.ts +10 -0
- package/dist/agent-memories/project-folds.js +34 -0
- package/dist/agent-memories/report.js +2 -1
- package/dist/agent-memories/sync.d.ts +4 -2
- package/dist/agent-memories/sync.js +18 -11
- package/dist/api/assemble.d.ts +7 -44
- package/dist/api/assemble.js +3 -23
- package/dist/api/audit.d.ts +33 -1
- package/dist/api/audit.js +48 -1
- package/dist/api/auth.d.ts +20 -26
- package/dist/api/auth.js +43 -29
- package/dist/api/auto-sleep.d.ts +5 -2
- package/dist/api/auto-sleep.js +9 -5
- package/dist/api/availability.d.ts +2 -15
- package/dist/api/availability.js +4 -18
- package/dist/api/cards.d.ts +42 -0
- package/dist/api/cards.js +52 -0
- package/dist/api/conflicts.d.ts +28 -0
- package/dist/api/conflicts.js +61 -0
- package/dist/api/context-render.js +4 -3
- package/dist/api/context-select.js +12 -15
- package/dist/api/context-types.d.ts +10 -35
- package/dist/api/context.d.ts +5 -22
- package/dist/api/context.js +38 -46
- package/dist/api/continuity.d.ts +47 -0
- package/dist/api/continuity.js +66 -0
- package/dist/{cli → api}/correction-latency.d.ts +2 -14
- package/dist/{cli → api}/correction-latency.js +2 -14
- package/dist/api/dormant.d.ts +5 -21
- package/dist/api/dormant.js +11 -28
- package/dist/api/drill-down.d.ts +7 -46
- package/dist/api/drill-down.js +6 -27
- package/dist/api/embeddings.d.ts +17 -0
- package/dist/api/embeddings.js +28 -0
- package/dist/api/error-reply.d.ts +8 -0
- package/dist/api/error-reply.js +21 -0
- package/dist/api/forget.d.ts +11 -26
- package/dist/api/forget.js +23 -35
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +5 -9
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +6 -2
- package/dist/api/index.js +6 -2
- package/dist/api/instruction-detect.js +21 -6
- package/dist/api/learn.d.ts +4 -0
- package/dist/api/learn.js +53 -27
- package/dist/api/ledger-db.d.ts +2 -5
- package/dist/api/ledger-db.js +5 -35
- package/dist/api/memories.d.ts +23 -0
- package/dist/api/memories.js +46 -0
- package/dist/api/objects.d.ts +9 -0
- package/dist/api/objects.js +11 -0
- package/dist/api/on-store.js +5 -3
- package/dist/api/outcome.js +1 -1
- package/dist/api/pilot-arm.d.ts +1 -11
- package/dist/api/pilot-arm.js +5 -45
- package/dist/api/predictions.d.ts +11 -0
- package/dist/api/predictions.js +24 -0
- package/dist/api/projects.d.ts +21 -0
- package/dist/api/projects.js +24 -0
- package/dist/api/promote.d.ts +13 -17
- package/dist/api/promote.js +12 -20
- package/dist/api/prompt-hook.d.ts +19 -6
- package/dist/api/prompt-hook.js +54 -13
- package/dist/api/provenance-coverage.d.ts +14 -0
- package/dist/{cli → api}/provenance-coverage.js +2 -6
- package/dist/api/recall-cli.d.ts +58 -0
- package/dist/api/recall-cli.js +103 -0
- package/dist/api/recall-core.js +17 -9
- package/dist/api/recall-finish.d.ts +53 -0
- package/dist/api/recall-finish.js +30 -0
- package/dist/api/recall-history.d.ts +17 -84
- package/dist/api/recall-history.js +15 -88
- package/dist/api/recall-pipeline.d.ts +2 -3
- package/dist/api/recall-pipeline.js +21 -15
- package/dist/api/recall-request.js +1 -1
- package/dist/api/recall-types.d.ts +64 -304
- package/dist/api/recall.d.ts +3 -34
- package/dist/api/recall.js +63 -89
- package/dist/api/refine.d.ts +7 -0
- package/dist/api/refine.js +10 -0
- package/dist/api/remember-local.d.ts +57 -0
- package/dist/api/remember-local.js +90 -0
- package/dist/api/remember.d.ts +20 -2
- package/dist/api/remember.js +16 -3
- package/dist/api/session-end.d.ts +22 -0
- package/dist/api/session-end.js +101 -0
- package/dist/api/sleep-run.d.ts +2 -4
- package/dist/api/sleep-run.js +28 -28
- package/dist/api/sleep.d.ts +9 -28
- package/dist/api/status.d.ts +24 -0
- package/dist/api/status.js +40 -0
- package/dist/api/store-init.d.ts +4 -0
- package/dist/api/store-init.js +9 -0
- package/dist/api/tokens.d.ts +3 -10
- package/dist/api/tokens.js +4 -11
- package/dist/api/types.d.ts +8 -29
- package/dist/api/types.js +10 -23
- package/dist/capture/caller-session.d.ts +0 -3
- package/dist/capture/caller-session.js +1 -12
- package/dist/capture/capture-error.d.ts +2 -2
- package/dist/capture/capture-error.js +23 -18
- package/dist/capture/codex-patch.js +3 -1
- package/dist/capture/command.d.ts +4 -12
- package/dist/capture/command.js +39 -114
- package/dist/capture/compact.d.ts +4 -15
- package/dist/capture/compact.js +26 -30
- package/dist/capture/compaction-items-caller.js +11 -20
- package/dist/capture/compaction-record.d.ts +7 -93
- package/dist/capture/compaction-record.js +34 -399
- package/dist/capture/compaction-spool.d.ts +5 -3
- package/dist/capture/compaction-spool.js +21 -7
- package/dist/capture/copilot-transcript.d.ts +2 -1
- package/dist/capture/copilot-transcript.js +2 -1
- package/dist/capture/extract.d.ts +5 -2
- package/dist/capture/extract.js +4 -3
- package/dist/capture/failure-caller.d.ts +1 -1
- package/dist/capture/failure-caller.js +21 -16
- package/dist/capture/failure-reading.d.ts +2 -1
- package/dist/capture/failure-reading.js +7 -9
- package/dist/capture/pre-compact-caller.js +5 -4
- package/dist/capture/session-digest.d.ts +1 -1
- package/dist/capture/session-digest.js +17 -10
- package/dist/capture/session-end-caller.js +2 -1
- package/dist/capture/session-worker.js +3 -4
- package/dist/capture/transcript.d.ts +4 -11
- package/dist/capture/transcript.js +10 -21
- package/dist/capture/working-state.d.ts +4 -2
- package/dist/capture/working-state.js +4 -2
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +1 -59
- package/dist/cli/audit-prune.js +2 -61
- package/dist/cli/audit.d.ts +1 -1
- package/dist/cli/audit.js +42 -43
- package/dist/cli/auth.d.ts +2 -2
- package/dist/cli/auth.js +61 -44
- package/dist/cli/briefs.d.ts +1 -4
- package/dist/cli/briefs.js +42 -301
- package/dist/cli/card.d.ts +2 -2
- package/dist/cli/card.js +63 -56
- package/dist/cli/client.d.ts +12 -27
- package/dist/cli/client.js +41 -44
- package/dist/cli/compact-resume-payload.js +4 -3
- package/dist/cli/context.d.ts +2 -3
- package/dist/cli/context.js +22 -18
- package/dist/cli/continuity.d.ts +6 -6
- package/dist/cli/continuity.js +81 -86
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +88 -116
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +55 -34
- package/dist/cli/decisions.d.ts +2 -4
- package/dist/cli/decisions.js +18 -309
- package/dist/cli/eval.d.ts +1 -1
- package/dist/cli/eval.js +27 -26
- package/dist/cli/exit.d.ts +6 -0
- package/dist/cli/exit.js +11 -0
- package/dist/cli/explain.d.ts +2 -3
- package/dist/cli/explain.js +25 -27
- package/dist/cli/flag-values.d.ts +6 -1
- package/dist/cli/flag-values.js +42 -15
- package/dist/cli/flags.d.ts +0 -288
- package/dist/cli/flags.js +3 -138
- package/dist/cli/github.d.ts +14 -0
- package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
- package/dist/cli/goals.d.ts +2 -2
- package/dist/cli/goals.js +46 -50
- package/dist/cli/graph.d.ts +3 -0
- package/dist/cli/graph.js +83 -0
- package/dist/cli/hook-runtime.d.ts +12 -32
- package/dist/cli/hook-runtime.js +21 -64
- package/dist/cli/incidents.d.ts +3 -0
- package/dist/cli/incidents.js +112 -0
- package/dist/cli/init.d.ts +2 -2
- package/dist/cli/init.js +33 -30
- package/dist/cli/install-steps.d.ts +2 -1
- package/dist/cli/install-steps.js +13 -14
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +4 -1
- package/dist/cli/lenient-id.d.ts +2 -0
- package/dist/cli/lenient-id.js +13 -0
- package/dist/cli/maintenance.d.ts +5 -5
- package/dist/cli/maintenance.js +37 -43
- package/dist/cli/notes.d.ts +2 -0
- package/dist/cli/notes.js +41 -0
- package/dist/cli/object-verbs.js +4 -3
- package/dist/cli/open-browser.d.ts +14 -0
- package/dist/cli/open-browser.js +26 -0
- package/dist/cli/owner-validation.d.ts +5 -28
- package/dist/cli/owner-validation.js +5 -28
- package/dist/cli/playbooks.d.ts +3 -4
- package/dist/cli/playbooks.js +131 -300
- package/dist/cli/predictions.d.ts +3 -0
- package/dist/cli/predictions.js +175 -0
- package/dist/cli/print.d.ts +2 -5
- package/dist/cli/print.js +3 -5
- package/dist/cli/projects.d.ts +2 -2
- package/dist/cli/projects.js +31 -25
- package/dist/cli/quality-repair-once.d.ts +1 -1
- package/dist/cli/quality-repair-once.js +7 -6
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +67 -137
- package/dist/cli/refine-llm.d.ts +5 -31
- package/dist/cli/refine-llm.js +23 -50
- package/dist/cli/remember.d.ts +3 -3
- package/dist/cli/remember.js +134 -192
- package/dist/cli/scheduler.d.ts +2 -17
- package/dist/cli/scheduler.js +14 -19
- package/dist/cli/serve.js +23 -14
- package/dist/cli/session-hooks.d.ts +11 -19
- package/dist/cli/session-hooks.js +143 -214
- package/dist/cli/setup.d.ts +4 -4
- package/dist/cli/setup.js +35 -30
- package/dist/cli/shared.d.ts +7 -25
- package/dist/cli/shared.js +17 -60
- package/dist/cli/slack.d.ts +2 -2
- package/dist/cli/slack.js +19 -23
- package/dist/cli/sleep-render.js +6 -3
- package/dist/cli/sleep.d.ts +3 -2
- package/dist/cli/sleep.js +17 -49
- package/dist/cli/status.d.ts +11 -14
- package/dist/cli/status.js +74 -120
- package/dist/cli/stdin.d.ts +4 -6
- package/dist/cli/stdin.js +2 -3
- package/dist/cli/transfer.d.ts +9 -9
- package/dist/cli/transfer.js +87 -108
- package/dist/cli/usage.d.ts +0 -79
- package/dist/cli/usage.js +1 -689
- package/dist/cli/verb-row.d.ts +32 -0
- package/dist/cli/verb-row.js +6 -0
- package/dist/cli/verbs/health.d.ts +27 -0
- package/dist/cli/verbs/health.js +232 -0
- package/dist/cli/verbs/memory.d.ts +16 -0
- package/dist/cli/verbs/memory.js +244 -0
- package/dist/cli/verbs/objects.d.ts +20 -0
- package/dist/cli/verbs/objects.js +254 -0
- package/dist/cli/verbs/sessions.d.ts +31 -0
- package/dist/cli/verbs/sessions.js +312 -0
- package/dist/cli/verbs.d.ts +81 -0
- package/dist/cli/verbs.js +7 -0
- package/dist/cli/versioned-verbs.d.ts +51 -0
- package/dist/cli/versioned-verbs.js +79 -0
- package/dist/cli.d.ts +1 -654
- package/dist/cli.js +44 -510
- package/dist/connectors/dlq.d.ts +39 -3
- package/dist/connectors/dlq.js +37 -3
- package/dist/connectors/github/backfill.d.ts +5 -25
- package/dist/connectors/github/backfill.js +26 -52
- package/dist/connectors/github/deletion.d.ts +4 -18
- package/dist/connectors/github/deletion.js +2 -15
- package/dist/connectors/github/dlq.d.ts +8 -33
- package/dist/connectors/github/dlq.js +34 -93
- package/dist/connectors/github/ingest.d.ts +4 -12
- package/dist/connectors/github/ingest.js +5 -36
- package/dist/connectors/github/octokit-client.d.ts +4 -16
- package/dist/connectors/github/octokit-client.js +27 -24
- package/dist/connectors/github/ratelimit.d.ts +3 -14
- package/dist/connectors/github/ratelimit.js +3 -14
- package/dist/connectors/github/scope.d.ts +3 -5
- package/dist/connectors/github/scope.js +3 -5
- package/dist/connectors/github/signature.d.ts +4 -26
- package/dist/connectors/github/signature.js +4 -26
- package/dist/connectors/github/tenant-routing.d.ts +2 -24
- package/dist/connectors/github/tenant-routing.js +4 -26
- package/dist/connectors/github/transform.js +2 -16
- package/dist/connectors/github/types.d.ts +3 -15
- package/dist/connectors/github/types.js +2 -9
- package/dist/connectors/github/webhook.d.ts +3 -16
- package/dist/connectors/github/webhook.js +38 -23
- package/dist/connectors/ingest.d.ts +10 -0
- package/dist/connectors/ingest.js +28 -0
- package/dist/connectors/slack/backfill.d.ts +4 -17
- package/dist/connectors/slack/backfill.js +4 -13
- package/dist/connectors/slack/dlq.d.ts +2 -19
- package/dist/connectors/slack/dlq.js +51 -90
- package/dist/connectors/slack/ingest.d.ts +4 -9
- package/dist/connectors/slack/ingest.js +4 -30
- package/dist/connectors/slack/scope.d.ts +2 -8
- package/dist/connectors/slack/scope.js +2 -8
- package/dist/connectors/slack/signature.d.ts +1 -6
- package/dist/connectors/slack/tenant-routing.d.ts +2 -19
- package/dist/connectors/slack/tenant-routing.js +2 -21
- package/dist/connectors/slack/transform.d.ts +2 -18
- package/dist/connectors/slack/transform.js +2 -18
- package/dist/connectors/slack/types.d.ts +3 -9
- package/dist/connectors/slack/types.js +2 -4
- package/dist/connectors/slack/web-client.js +33 -27
- package/dist/connectors/slack/webhook.d.ts +3 -19
- package/dist/connectors/slack/webhook.js +6 -26
- package/dist/connectors/slack/workspaces.d.ts +4 -24
- package/dist/connectors/slack/workspaces.js +4 -24
- package/dist/consolidate/conflicts.js +7 -15
- package/dist/consolidate/dag-summary.d.ts +8 -0
- package/dist/consolidate/dag-summary.js +41 -0
- package/dist/consolidate/dag.d.ts +5 -28
- package/dist/consolidate/dag.js +29 -84
- package/dist/consolidate/decay.js +7 -19
- package/dist/consolidate/dedupe.d.ts +13 -52
- package/dist/consolidate/dedupe.js +18 -74
- package/dist/consolidate/flush-units.d.ts +3 -4
- package/dist/consolidate/flush-units.js +3 -3
- package/dist/consolidate/half-life-migration.d.ts +3 -26
- package/dist/consolidate/half-life-migration.js +11 -28
- package/dist/consolidate/llm-passes.js +49 -40
- package/dist/consolidate/memory-value-weights.d.ts +2 -13
- package/dist/consolidate/memory-value-weights.js +2 -13
- package/dist/consolidate/memory-value.d.ts +11 -84
- package/dist/consolidate/memory-value.js +18 -105
- package/dist/consolidate/merge.js +12 -33
- package/dist/consolidate/physics-pass.d.ts +6 -1
- package/dist/consolidate/physics-pass.js +27 -9
- package/dist/consolidate/replay.d.ts +6 -38
- package/dist/consolidate/replay.js +25 -56
- package/dist/consolidate/run.js +1 -1
- package/dist/consolidate/sleep.d.ts +1 -8
- package/dist/consolidate/sleep.js +13 -22
- package/dist/consolidate/trace.d.ts +3 -18
- package/dist/consolidate/trace.js +3 -18
- package/dist/consolidate/traces.js +9 -25
- package/dist/core/ablation.d.ts +14 -91
- package/dist/core/ablation.js +16 -91
- package/dist/core/active-scope.d.ts +7 -0
- package/dist/{sharing/scope.js → core/active-scope.js} +5 -12
- package/dist/core/ambient.d.ts +5 -8
- package/dist/core/ambient.js +40 -26
- package/dist/core/api-errors.d.ts +16 -0
- package/dist/core/api-errors.js +20 -0
- package/dist/core/capture-contract.d.ts +4 -2
- package/dist/core/capture-contract.js +4 -2
- package/dist/core/card.d.ts +4 -1
- package/dist/core/card.js +11 -1
- package/dist/core/compaction-timing.d.ts +7 -0
- package/dist/core/compaction-timing.js +9 -0
- package/dist/core/compare.d.ts +11 -67
- package/dist/core/compare.js +9 -63
- package/dist/core/config.d.ts +10 -24
- package/dist/core/config.js +20 -16
- package/dist/core/cosine.d.ts +3 -0
- package/dist/core/cosine.js +19 -0
- package/dist/core/handoff.d.ts +1 -7
- package/dist/core/handoff.js +1 -7
- package/dist/core/markdown.d.ts +6 -0
- package/dist/{store → core}/markdown.js +23 -22
- package/dist/core/memory-audit.d.ts +17 -0
- package/dist/core/memory-audit.js +54 -0
- package/dist/core/memory-quality.js +1 -1
- package/dist/core/memory.d.ts +51 -168
- package/dist/core/memory.js +76 -239
- package/dist/{consolidate → core}/merged-row.d.ts +1 -1
- package/dist/{consolidate → core}/merged-row.js +3 -2
- package/dist/core/package-root.d.ts +3 -0
- package/dist/core/package-root.js +5 -0
- package/dist/core/physics-config.d.ts +1 -4
- package/dist/core/physics-config.js +3 -8
- package/dist/core/physics.d.ts +15 -61
- package/dist/core/physics.js +65 -138
- package/dist/core/prediction.d.ts +3 -0
- package/dist/core/prediction.js +6 -0
- package/dist/core/project-identity.d.ts +20 -58
- package/dist/core/project-identity.js +27 -39
- package/dist/core/project-remote.js +13 -2
- package/dist/core/raw-append-only.d.ts +5 -0
- package/dist/core/raw-append-only.js +7 -0
- package/dist/core/recall-scope.d.ts +69 -0
- package/dist/core/recall-scope.js +138 -0
- package/dist/core/salience.d.ts +1 -7
- package/dist/core/salience.js +1 -7
- package/dist/dashboard/dashboard-actions.js +2 -2
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
- package/dist/dashboard/dashboard-snapshot.js +11 -2
- package/dist/dashboard/dashboard-types.d.ts +2 -1
- package/dist/dashboard/dashboard.d.ts +1 -0
- package/dist/dashboard/dashboard.js +50 -4
- package/dist/db/busy.d.ts +3 -8
- package/dist/db/busy.js +37 -33
- package/dist/db/connect.js +7 -8
- package/dist/db/index.d.ts +3 -3
- package/dist/db/index.js +3 -3
- package/dist/db/migrate.js +3 -3
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/types.d.ts +2 -5
- package/dist/db/migrations/v14.js +2 -3
- package/dist/db/migrations/v15.js +2 -8
- package/dist/db/migrations/v16.js +2 -3
- package/dist/db/migrations/v17.js +2 -3
- package/dist/db/migrations/v19.js +2 -5
- package/dist/db/migrations/v20.js +2 -7
- package/dist/db/migrations/v22.js +4 -17
- package/dist/db/migrations/v23.js +3 -14
- package/dist/db/migrations/v24.js +2 -4
- package/dist/db/migrations/v25.js +3 -8
- package/dist/db/migrations/v26.js +2 -13
- package/dist/db/migrations/v27.js +3 -11
- package/dist/db/migrations/v28.js +2 -14
- package/dist/db/migrations/v29.js +4 -18
- package/dist/db/migrations/v30.js +4 -16
- package/dist/db/migrations/v31.js +2 -15
- package/dist/db/migrations/v32.js +4 -22
- package/dist/db/migrations/v33.js +2 -15
- package/dist/db/migrations/v34.js +2 -11
- package/dist/db/migrations/v35.js +2 -11
- package/dist/db/migrations/v36.js +2 -11
- package/dist/db/migrations/v37.js +8 -33
- package/dist/db/migrations/v38.js +5 -38
- package/dist/db/migrations/v39.js +9 -20
- package/dist/db/migrations/v40.js +2 -9
- package/dist/db/migrations/v41.js +2 -24
- package/dist/db/migrations/v43.js +1 -1
- package/dist/db/migrations/v44.js +2 -8
- package/dist/db/migrations/v45.js +2 -7
- package/dist/db/migrations/v47.js +2 -3
- package/dist/db/migrations/v51.js +1 -1
- package/dist/db/migrations/v55.d.ts +3 -0
- package/dist/db/migrations/v55.js +17 -0
- package/dist/db/open.d.ts +2 -2
- package/dist/db/open.js +21 -9
- package/dist/db/physics-state.d.ts +6 -22
- package/dist/db/physics-state.js +28 -39
- package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
- package/dist/db/raw-archive-mirror-cleanup.js +2 -17
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -2
- package/dist/db/vector-store.d.ts +2 -0
- package/dist/db/vector-store.js +25 -5
- package/dist/db/wal-checkpointer.js +2 -1
- package/dist/doctor.js +85 -27
- package/dist/embeddings/local.d.ts +62 -0
- package/dist/embeddings/local.js +146 -0
- package/dist/embeddings/provider.d.ts +43 -0
- package/dist/{store/embeddings → embeddings}/provider.js +58 -83
- package/dist/embeddings/transformers.d.ts +26 -0
- package/dist/embeddings/transformers.js +89 -0
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +3 -2
- package/dist/eval/eval-stats.d.ts +15 -53
- package/dist/eval/eval-stats.js +12 -42
- package/dist/eval/eval-suite.d.ts +2 -13
- package/dist/eval/eval-suite.js +91 -45
- package/dist/eval/eval.d.ts +6 -24
- package/dist/eval/eval.js +8 -35
- package/dist/eval/judgment.d.ts +0 -3
- package/dist/eval/judgment.js +30 -15
- package/dist/extensions/openclaw-plugin/index.js +1 -1
- package/dist/graph/extract.d.ts +5 -27
- package/dist/graph/extract.js +10 -36
- package/dist/graph/recall.d.ts +7 -20
- package/dist/graph/recall.js +15 -77
- package/dist/graph/stream.d.ts +7 -39
- package/dist/graph/stream.js +11 -34
- package/dist/graph/view.d.ts +9 -35
- package/dist/graph/view.js +24 -44
- package/dist/graph/write.d.ts +1 -1
- package/dist/graph/write.js +9 -9
- package/dist/hooks/codex-session.js +3 -2
- package/dist/hooks/codex-wrapper.js +4 -3
- package/dist/hooks/copilot.js +2 -1
- package/dist/hooks/hook-blocks.d.ts +6 -2
- package/dist/hooks/hook-blocks.js +37 -124
- package/dist/hooks/json-hooks.d.ts +4 -36
- package/dist/hooks/json-hooks.js +22 -59
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +17 -81
- package/dist/hooks/shared.d.ts +6 -21
- package/dist/hooks/shared.js +31 -33
- package/dist/importers/core.d.ts +12 -37
- package/dist/importers/core.js +10 -28
- package/dist/importers/markdown-parse.d.ts +8 -22
- package/dist/importers/markdown-parse.js +8 -25
- package/dist/importers/markdown.js +3 -12
- package/dist/importers/sources.js +12 -39
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +31 -85
- package/dist/index.d.ts +8 -3
- package/dist/index.js +8 -3
- package/dist/learn/autolearn.d.ts +23 -42
- package/dist/learn/autolearn.js +45 -52
- package/dist/learn/churn-git.js +13 -4
- package/dist/learn/extract.d.ts +3 -2
- package/dist/learn/extract.js +8 -8
- package/dist/learn/forward-claim-detector.d.ts +6 -30
- package/dist/learn/forward-claim-detector.js +18 -68
- package/dist/learn/invalidation.d.ts +6 -18
- package/dist/learn/invalidation.js +18 -31
- package/dist/mcp/admin-tools.d.ts +2 -2
- package/dist/mcp/admin-tools.js +30 -53
- package/dist/mcp/format.js +3 -2
- package/dist/mcp/framing.d.ts +1 -0
- package/dist/mcp/framing.js +1 -1
- package/dist/mcp/memory-tools.js +7 -10
- package/dist/mcp/protocol.d.ts +15 -29
- package/dist/mcp/protocol.js +26 -16
- package/dist/mcp/recall-tools.js +14 -11
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +12 -27
- package/dist/mcp/server.d.ts +3 -9
- package/dist/mcp/server.js +5 -16
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +5 -11
- package/dist/mcp/stdio.d.ts +2 -6
- package/dist/mcp/stdio.js +68 -16
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +47 -22
- package/dist/objects/customer-notes.d.ts +9 -44
- package/dist/objects/customer-notes.js +7 -48
- package/dist/objects/decisions.d.ts +14 -52
- package/dist/objects/decisions.js +15 -53
- package/dist/objects/descriptor.d.ts +1 -1
- package/dist/objects/incidents.d.ts +9 -40
- package/dist/objects/incidents.js +7 -41
- package/dist/objects/lifecycle.d.ts +1 -1
- package/dist/objects/lifecycle.js +2 -1
- package/dist/objects/policies.d.ts +13 -91
- package/dist/objects/policies.js +13 -99
- package/dist/objects/processes.d.ts +9 -54
- package/dist/objects/processes.js +7 -61
- package/dist/objects/project-briefs.d.ts +13 -57
- package/dist/objects/project-briefs.js +16 -78
- package/dist/objects/skills.d.ts +9 -44
- package/dist/objects/skills.js +8 -54
- package/dist/postinstall.js +7 -20
- package/dist/predictions/planning-fallacy.d.ts +11 -34
- package/dist/rerankers/clef.js +6 -37
- package/dist/rerankers/cross-encoder.d.ts +31 -2
- package/dist/rerankers/cross-encoder.js +65 -101
- package/dist/rerankers/index.js +5 -4
- package/dist/rerankers/jev.js +11 -10
- package/dist/rerankers/llm.d.ts +2 -11
- package/dist/rerankers/llm.js +14 -14
- package/dist/rerankers/outage-warning.d.ts +5 -2
- package/dist/rerankers/outage-warning.js +7 -4
- package/dist/rerankers/remote.d.ts +1 -0
- package/dist/rerankers/remote.js +2 -0
- package/dist/rerankers/types.d.ts +2 -14
- package/dist/search/bm25-search.js +1 -1
- package/dist/search/boosts.d.ts +0 -2
- package/dist/search/boosts.js +3 -3
- package/dist/search/embed-memories.d.ts +9 -0
- package/dist/search/embed-memories.js +377 -0
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +93 -0
- package/dist/search/hybrid.d.ts +11 -2
- package/dist/search/hybrid.js +9 -4
- package/dist/search/multihop.js +2 -3
- package/dist/search/path-context.d.ts +5 -18
- package/dist/search/path-context.js +5 -18
- package/dist/search/physics-search.d.ts +6 -3
- package/dist/search/physics-search.js +29 -19
- package/dist/search/rerank.js +1 -1
- package/dist/search/rrf.d.ts +7 -35
- package/dist/search/rrf.js +5 -30
- package/dist/search/vector.d.ts +13 -4
- package/dist/search/vector.js +40 -13
- package/dist/server/auth.d.ts +11 -28
- package/dist/server/auth.js +49 -32
- package/dist/server/boot.d.ts +2 -21
- package/dist/server/boot.js +69 -161
- package/dist/server/client-ip.d.ts +3 -21
- package/dist/server/client-ip.js +8 -30
- package/dist/server/deadline.d.ts +0 -2
- package/dist/server/deadline.js +1 -7
- package/dist/server/defaults.d.ts +4 -0
- package/dist/server/defaults.js +5 -0
- package/dist/server/key-check-bounds.d.ts +2 -1
- package/dist/server/lifecycle.d.ts +5 -4
- package/dist/server/lifecycle.js +19 -4
- package/dist/server/mcp-http.js +24 -53
- package/dist/server/rate-limit.d.ts +5 -18
- package/dist/server/rate-limit.js +4 -13
- package/dist/server/request.d.ts +4 -8
- package/dist/server/request.js +16 -19
- package/dist/server/route-checks.d.ts +7 -0
- package/dist/server/route-checks.js +42 -0
- package/dist/server/route-table.d.ts +9 -8
- package/dist/server/route-table.js +127 -139
- package/dist/server/routes/admin.d.ts +8 -8
- package/dist/server/routes/admin.js +35 -49
- package/dist/server/routes/customer-notes.d.ts +6 -6
- package/dist/server/routes/customer-notes.js +8 -14
- package/dist/server/routes/decisions.d.ts +6 -6
- package/dist/server/routes/decisions.js +12 -21
- package/dist/server/routes/incidents.d.ts +6 -6
- package/dist/server/routes/incidents.js +14 -25
- package/dist/server/routes/memories.d.ts +9 -9
- package/dist/server/routes/memories.js +20 -63
- package/dist/server/routes/object-routes.d.ts +6 -11
- package/dist/server/routes/object-routes.js +11 -22
- package/dist/server/routes/policies.d.ts +7 -7
- package/dist/server/routes/policies.js +12 -22
- package/dist/server/routes/predictions.d.ts +6 -6
- package/dist/server/routes/predictions.js +22 -38
- package/dist/server/routes/processes.d.ts +6 -6
- package/dist/server/routes/processes.js +17 -28
- package/dist/server/routes/project-briefs.d.ts +7 -7
- package/dist/server/routes/project-briefs.js +11 -20
- package/dist/server/routes/recall.d.ts +5 -5
- package/dist/server/routes/recall.js +16 -45
- package/dist/server/routes/skills.d.ts +7 -7
- package/dist/server/routes/skills.js +10 -22
- package/dist/server/server-detect.d.ts +15 -53
- package/dist/server/server-detect.js +55 -96
- package/dist/server/sleep-child.js +26 -7
- package/dist/server/sleep-offload.d.ts +11 -5
- package/dist/server/sleep-offload.js +21 -12
- package/dist/server/types.d.ts +32 -18
- package/dist/server/validation.d.ts +3 -2
- package/dist/server/validation.js +15 -33
- package/dist/server.d.ts +7 -6
- package/dist/server.js +8 -6
- package/dist/sharing/global-store.d.ts +19 -0
- package/dist/sharing/global-store.js +75 -0
- package/dist/sharing/global-sync.d.ts +6 -0
- package/dist/sharing/global-sync.js +73 -0
- package/dist/sharing/project-merge.d.ts +11 -19
- package/dist/sharing/project-merge.js +63 -125
- package/dist/sharing/search-both.d.ts +60 -0
- package/dist/sharing/search-both.js +138 -0
- package/dist/sharing/share.d.ts +40 -0
- package/dist/sharing/share.js +229 -0
- package/dist/store/ambient.js +9 -15
- package/dist/store/audit-event.d.ts +5 -13
- package/dist/store/audit-event.js +4 -12
- package/dist/store/audit.d.ts +2 -21
- package/dist/store/audit.js +8 -67
- package/dist/store/auth.d.ts +10 -8
- package/dist/store/auth.js +17 -12
- package/dist/store/candidates.d.ts +23 -5
- package/dist/store/candidates.js +119 -71
- package/dist/store/capture-write.d.ts +17 -0
- package/dist/store/capture-write.js +35 -0
- package/dist/store/card-detail.d.ts +2 -1
- package/dist/store/card-detail.js +2 -1
- package/dist/store/cards.d.ts +14 -9
- package/dist/store/cards.js +72 -126
- package/dist/store/compaction-caller.d.ts +18 -0
- package/dist/store/compaction-caller.js +29 -0
- package/dist/store/compactions-record.d.ts +115 -0
- package/dist/store/compactions-record.js +417 -0
- package/dist/store/compactions.js +6 -4
- package/dist/store/conflicts.d.ts +4 -21
- package/dist/store/conflicts.js +76 -152
- package/dist/store/connectors/dlq.d.ts +10 -0
- package/dist/store/connectors/dlq.js +32 -0
- package/dist/store/connectors/github.d.ts +14 -16
- package/dist/store/connectors/github.js +34 -57
- package/dist/store/connectors/slack.d.ts +2 -11
- package/dist/store/connectors/slack.js +18 -47
- package/dist/store/dashboard-reads.js +11 -14
- package/dist/store/delete-and-batch.d.ts +17 -31
- package/dist/store/delete-and-batch.js +84 -67
- package/dist/store/delivery-recorder.d.ts +15 -4
- package/dist/store/delivery-recorder.js +34 -17
- package/dist/store/descendant-page.js +6 -3
- package/dist/store/diagnostics.js +6 -13
- package/dist/store/dormant.d.ts +8 -30
- package/dist/store/dormant.js +18 -57
- package/dist/store/embeddings/index.d.ts +11 -90
- package/dist/store/embeddings/index.js +18 -523
- package/dist/store/entry-reads.d.ts +34 -61
- package/dist/store/entry-reads.js +111 -136
- package/dist/store/entry-row.d.ts +6 -35
- package/dist/store/entry-row.js +9 -37
- package/dist/store/entry-writes.d.ts +12 -18
- package/dist/store/entry-writes.js +46 -44
- package/dist/store/failure-log-at.d.ts +8 -0
- package/dist/store/failure-log-at.js +16 -0
- package/dist/store/failure-log.d.ts +2 -2
- package/dist/store/failure-log.js +5 -3
- package/dist/{trust → store}/gated-write.d.ts +3 -1
- package/dist/{trust → store}/gated-write.js +7 -5
- package/dist/store/goals.d.ts +3 -40
- package/dist/store/goals.js +41 -178
- package/dist/store/graph-queue.d.ts +6 -22
- package/dist/store/graph-queue.js +14 -45
- package/dist/store/graph-reads.d.ts +11 -35
- package/dist/store/graph-reads.js +24 -60
- package/dist/store/graph-rows.d.ts +3 -6
- package/dist/store/graph-rows.js +6 -9
- package/dist/store/graph-view-rows.d.ts +2 -1
- package/dist/store/graph-view-rows.js +2 -1
- package/dist/store/graph-writes.d.ts +10 -35
- package/dist/store/graph-writes.js +59 -106
- package/dist/store/half-life.d.ts +2 -1
- package/dist/store/half-life.js +14 -16
- package/dist/store/handoffs.d.ts +6 -12
- package/dist/store/handoffs.js +22 -40
- package/dist/store/index-and-stats.d.ts +6 -19
- package/dist/store/index-and-stats.js +36 -84
- package/dist/store/key-writes.js +1 -1
- package/dist/store/ledger-turn.d.ts +9 -0
- package/dist/store/ledger-turn.js +38 -0
- package/dist/store/mirrors.d.ts +2 -6
- package/dist/store/mirrors.js +24 -29
- package/dist/store/open.d.ts +0 -4
- package/dist/store/open.js +42 -62
- package/dist/store/pilot-arm.d.ts +12 -0
- package/dist/store/pilot-arm.js +42 -0
- package/dist/store/planning-fallacy-evidence.d.ts +2 -30
- package/dist/store/planning-fallacy-evidence.js +8 -37
- package/dist/store/port.d.ts +91 -82
- package/dist/store/port.js +8 -0
- package/dist/store/predictions.d.ts +12 -53
- package/dist/store/predictions.js +41 -125
- package/dist/store/project-tags.d.ts +62 -0
- package/dist/store/project-tags.js +67 -0
- package/dist/{cli → store}/quality-repair.js +15 -31
- package/dist/store/quarantine.js +2 -1
- package/dist/store/raw-archive.d.ts +4 -16
- package/dist/store/raw-archive.js +14 -29
- package/dist/store/recall-trace.d.ts +12 -77
- package/dist/store/recall-trace.js +37 -97
- package/dist/store/rejected-values.js +9 -20
- package/dist/store/rejection-probe.d.ts +4 -0
- package/dist/store/rejection-probe.js +19 -0
- package/dist/store/rejection.d.ts +10 -73
- package/dist/store/rejection.js +12 -84
- package/dist/store/report-reads.d.ts +6 -0
- package/dist/store/report-reads.js +29 -0
- package/dist/store/rows.d.ts +9 -19
- package/dist/store/rows.js +36 -34
- package/dist/store/rule-sql.d.ts +14 -0
- package/dist/store/rule-sql.js +56 -0
- package/dist/store/search-rows.d.ts +7 -38
- package/dist/store/search-rows.js +23 -54
- package/dist/store/sessions.d.ts +10 -47
- package/dist/store/sessions.js +21 -75
- package/dist/store/set-aside.d.ts +14 -0
- package/dist/store/set-aside.js +23 -0
- package/dist/store/sqlite/busy.d.ts +3 -0
- package/dist/store/sqlite/busy.js +8 -0
- package/dist/store/sqlite/connector-events-group.js +5 -8
- package/dist/store/sqlite/connector-writes-group.js +3 -3
- package/dist/store/sqlite/entry-writes-group.js +4 -4
- package/dist/store/sqlite/error-codec.js +8 -5
- package/dist/store/sqlite/executor.d.ts +2 -1
- package/dist/store/sqlite/executor.js +12 -5
- package/dist/store/sqlite/graph-reads-group.js +1 -1
- package/dist/store/sqlite/held-connection.d.ts +9 -0
- package/dist/store/sqlite/held-connection.js +41 -0
- package/dist/store/sqlite/local.d.ts +3 -3
- package/dist/store/sqlite/local.js +1 -0
- package/dist/store/sqlite/object-rows.d.ts +1 -1
- package/dist/store/sqlite/object-rows.js +6 -3
- package/dist/store/sqlite/objects-group.d.ts +1 -1
- package/dist/store/sqlite/objects-group.js +5 -3
- package/dist/store/sqlite/quarantine-group.js +2 -2
- package/dist/store/sqlite/store.d.ts +1 -4
- package/dist/store/sqlite/store.js +16 -15
- package/dist/store/sqlite/vector-reads-group.js +2 -2
- package/dist/store/sqlite/worker-jobs.js +1 -1
- package/dist/store/sqlite/worker-ops.d.ts +13 -2
- package/dist/store/sqlite/worker-ops.js +13 -2
- package/dist/store/sqlite/worker-store.js +5 -2
- package/dist/store/summaries.d.ts +11 -63
- package/dist/store/summaries.js +37 -148
- package/dist/store/summary-dirty.js +1 -1
- package/dist/store/tenant-lookup.d.ts +6 -1
- package/dist/store/tenant-lookup.js +7 -0
- package/dist/store/tenant.d.ts +2 -16
- package/dist/store/tenant.js +4 -19
- package/dist/store/token-ledger.d.ts +13 -50
- package/dist/store/token-ledger.js +19 -85
- package/dist/store/usage-reports.js +5 -13
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +171 -0
- package/dist/store/working-memory.d.ts +6 -25
- package/dist/store/working-memory.js +18 -52
- package/dist/support-bundle.js +9 -8
- package/dist/trust/reject-flow.js +3 -5
- package/dist/util/agent-homes.d.ts +15 -0
- package/dist/util/agent-homes.js +34 -0
- package/dist/util/anthropic-messages.d.ts +3 -0
- package/dist/util/anthropic-messages.js +35 -6
- package/dist/util/atomic-write.d.ts +2 -1
- package/dist/util/atomic-write.js +35 -4
- package/dist/util/capped-json.d.ts +6 -0
- package/dist/util/capped-json.js +46 -0
- package/dist/util/chunked.d.ts +3 -0
- package/dist/util/chunked.js +10 -0
- package/dist/util/crash-handlers.d.ts +8 -1
- package/dist/util/crash-handlers.js +52 -10
- package/dist/util/ellipsize.d.ts +3 -0
- package/dist/util/ellipsize.js +5 -0
- package/dist/util/env.d.ts +14 -6
- package/dist/util/env.js +15 -7
- package/dist/util/format.d.ts +3 -0
- package/dist/util/format.js +6 -0
- package/dist/util/home-path.d.ts +2 -1
- package/dist/util/home-path.js +4 -2
- package/dist/util/hook-payload.d.ts +8 -0
- package/dist/util/hook-payload.js +37 -0
- package/dist/util/http-retry.d.ts +9 -1
- package/dist/util/http-retry.js +67 -8
- package/dist/util/http-util.d.ts +0 -8
- package/dist/util/http-util.js +10 -21
- package/dist/util/limits.d.ts +7 -0
- package/dist/util/limits.js +14 -0
- package/dist/util/log.d.ts +7 -2
- package/dist/util/log.js +34 -9
- package/dist/util/request-scope.d.ts +5 -2
- package/dist/util/request-scope.js +13 -7
- package/dist/util/secret-detect.d.ts +5 -30
- package/dist/util/secret-detect.js +19 -40
- package/dist/util/sqlite-blocked.d.ts +2 -0
- package/dist/util/sqlite-blocked.js +5 -0
- package/dist/util/stored-json.d.ts +1 -1
- package/dist/util/stored-json.js +1 -1
- package/dist/util/stream-tee.d.ts +3 -0
- package/dist/util/stream-tee.js +35 -0
- package/dist/util/time.d.ts +4 -0
- package/dist/util/time.js +4 -0
- package/dist/util/token-text.d.ts +1 -4
- package/dist/util/token-text.js +1 -4
- package/dist/util/transcript-tail.d.ts +2 -0
- package/dist/util/transcript-tail.js +24 -23
- package/dist/util/version.d.ts +5 -20
- package/dist/util/version.js +5 -20
- package/dist/{store → util}/yaml.d.ts +1 -5
- package/dist/{store → util}/yaml.js +2 -6
- package/extensions/openclaw-plugin/index.ts +1 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
- package/dist/cli/provenance-coverage.d.ts +0 -18
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/sharing/scope.d.ts +0 -14
- package/dist/sharing/shared.d.ts +0 -187
- package/dist/sharing/shared.js +0 -563
- package/dist/store/embeddings/local.d.ts +0 -15
- package/dist/store/embeddings/local.js +0 -192
- package/dist/store/embeddings/provider.d.ts +0 -77
- package/dist/store/markdown.d.ts +0 -10
- package/dist/store/recall-scope.d.ts +0 -138
- package/dist/store/recall-scope.js +0 -216
- package/dist/store/vector-writes.d.ts +0 -13
- package/dist/store/vector-writes.js +0 -89
- /package/dist/{store → core}/object-types.d.ts +0 -0
- /package/dist/{store → core}/object-types.js +0 -0
- /package/dist/{cli → store}/quality-repair.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.js +0 -0
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { isFtsAvailable, closeHippoDb } from '../db/index.js';
|
|
2
2
|
import { tokenize } from '../util/tokenize.js';
|
|
3
|
-
import { isPersonalScope
|
|
3
|
+
import { isPersonalScope } from '../core/recall-scope.js';
|
|
4
|
+
import { scopeAdmitSql } from './rule-sql.js';
|
|
4
5
|
import { ftsTermParts, RAREST_TERM_COUNT, rarestFtsQuery } from '../core/prompt-recall.js';
|
|
5
6
|
import { errorMessage, log } from '../util/log.js';
|
|
6
7
|
import { originInSql } from '../core/project-identity.js';
|
|
7
8
|
import { topVectorMatches } from '../db/vector-store.js';
|
|
8
9
|
import { MEMORY_SELECT_COLUMNS, MEMORY_SEARCH_COLUMNS, DEFAULT_SEARCH_CANDIDATE_LIMIT, rowToEntry, } from './rows.js';
|
|
9
|
-
import { openStore } from './open.js';
|
|
10
|
+
import { onHandle, openStore } from './open.js';
|
|
10
11
|
import { escapeLike } from '../util/escape.js';
|
|
11
12
|
/** The recall scope rule for a table column prefix (`m.` or none); `passesScopeFilterForRecall` in recall-scope.ts is its JS twin. */
|
|
12
13
|
function recallScopeClause(col, scopeFilter) {
|
|
@@ -26,9 +27,13 @@ function withProject(scope, col, origin) {
|
|
|
26
27
|
return scope;
|
|
27
28
|
// A string is the shape published callers passed before a project could carry several names.
|
|
28
29
|
const originProjects = [origin].flat();
|
|
29
|
-
return {
|
|
30
|
+
return {
|
|
31
|
+
sql: `${scope.sql} AND (${col}origin_project = '' OR ${originInSql(originProjects, `${col}origin_project`)})`,
|
|
32
|
+
params: [...scope.params, ...originProjects],
|
|
33
|
+
};
|
|
30
34
|
}
|
|
31
|
-
/** Scope rule for recall: none requested is default-deny; 'exact' narrows to the request; 'additive' adds it to the default set, unless it is personal,
|
|
35
|
+
/** Scope rule for recall: none requested is default-deny; 'exact' narrows to the request; 'additive' adds it to the default set, unless it is personal,
|
|
36
|
+
* which only `ownScope` opens. */
|
|
32
37
|
export function recallScopeFilter(requestedScope, mode, ownScope) {
|
|
33
38
|
if (!requestedScope || (mode === 'additive' && isPersonalScope(requestedScope)))
|
|
34
39
|
return { mode: 'default-deny', ownScope };
|
|
@@ -62,19 +67,14 @@ function loadSearchRows(db, query, limit, tenantId, options = {}) {
|
|
|
62
67
|
return selectAllCandidates(db, p, limit);
|
|
63
68
|
}
|
|
64
69
|
function searchPredicates(tenantId, scopeFilter, includeSuperseded, originProjects) {
|
|
65
|
-
// tenantId undefined = no tenant filter (legacy callers / cross-deployment
|
|
66
|
-
// helpers). tenantId set = strict tenant isolation, leveraging the composite
|
|
67
|
-
// idx_memories_tenant_created (leading column tenant_id, O(log n) lookup).
|
|
70
|
+
// tenantId undefined = no tenant filter (legacy callers / cross-deployment helpers); set = strict isolation via the composite idx_memories_tenant_created.
|
|
68
71
|
const tenantPredicate = tenantId !== undefined ? ` AND m.tenant_id = ?` : '';
|
|
69
72
|
const tenantOnlyPredicate = tenantId !== undefined ? ` WHERE tenant_id = ?` : '';
|
|
70
73
|
const tenantParams = tenantId !== undefined ? [tenantId] : [];
|
|
71
74
|
// Defensive: kind='archived' is a transient sentinel inside archiveRawMemory's SAVEPOINT, so this only
|
|
72
75
|
// guards against a dropped SAVEPOINT, a persisted 'archived' state, or direct-SQL writes.
|
|
73
76
|
const archivedClauseAlias = ` AND m.kind != 'archived'`;
|
|
74
|
-
//
|
|
75
|
-
// so prepend WHERE; if tenant set, append AND. handled in each call site
|
|
76
|
-
// by always joining `tenantOnlyPredicate + archivedClauseTenantOnly` where
|
|
77
|
-
// the latter switches between " AND" and " WHERE" based on caller context.
|
|
77
|
+
// Tenant-only path: with no tenant `tenantOnlyPredicate` is '', so the archived clause switches between ' AND' and ' WHERE' by caller context.
|
|
78
78
|
const archivedClauseTenantOnly = tenantId !== undefined ? ` AND kind != 'archived'` : ` WHERE kind != 'archived'`;
|
|
79
79
|
const aliasScope = withProject(recallScopeClause('m.', scopeFilter), 'm.', originProjects);
|
|
80
80
|
const plainScope = withProject(recallScopeClause('', scopeFilter), '', originProjects);
|
|
@@ -89,7 +89,8 @@ function searchPredicates(tenantId, scopeFilter, includeSuperseded, originProjec
|
|
|
89
89
|
}
|
|
90
90
|
/** Every admitted row, oldest first; the no-terms path and the last-resort fallback share it. */
|
|
91
91
|
function selectAllCandidates(db, p, limit) {
|
|
92
|
-
const sql = `SELECT ${MEMORY_SELECT_COLUMNS} FROM memories${p.tenantOnlyPredicate}${p.archivedClauseTenantOnly}
|
|
92
|
+
const sql = `SELECT ${MEMORY_SELECT_COLUMNS} FROM memories${p.tenantOnlyPredicate}${p.archivedClauseTenantOnly}` +
|
|
93
|
+
`${p.plainScope.sql}${p.currentNoAlias} ORDER BY created ASC, id ASC LIMIT ?`;
|
|
93
94
|
// SAFETY: sql selects exactly MEMORY_SELECT_COLUMNS, whose column list
|
|
94
95
|
// matches MemoryRow's field set.
|
|
95
96
|
return db.prepare(sql).all(...p.tenantParams, ...p.scopeParams, limit);
|
|
@@ -98,11 +99,8 @@ function selectAllCandidates(db, p, limit) {
|
|
|
98
99
|
function selectFtsCandidates(db, terms, p, limit) {
|
|
99
100
|
try {
|
|
100
101
|
const ftsQuery = terms.map((t) => `"${t.replace(/"/g, '""')}"`).join(' OR ');
|
|
101
|
-
// memories_fts
|
|
102
|
-
//
|
|
103
|
-
// on tenant_id).
|
|
104
|
-
// SAFETY: MEMORY_SEARCH_COLUMNS aliases every column to the same name
|
|
105
|
-
// MEMORY_SELECT_COLUMNS uses (plus bm25_score), matching MemoryRow.
|
|
102
|
+
// memories_fts has no tenant_id column; filter via the joined memories row (cheap with idx_memories_tenant_created).
|
|
103
|
+
// SAFETY: MEMORY_SEARCH_COLUMNS aliases every column like MEMORY_SELECT_COLUMNS (plus bm25_score), matching MemoryRow.
|
|
106
104
|
return db.prepare(`
|
|
107
105
|
SELECT ${MEMORY_SEARCH_COLUMNS}
|
|
108
106
|
FROM memories m
|
|
@@ -146,52 +144,23 @@ function selectLikeCandidates(db, terms, p, limit) {
|
|
|
146
144
|
LIMIT ?
|
|
147
145
|
`).all(...p.tenantParams, ...p.scopeParams, Math.max(limit, LIKE_WINDOW_ROWS), ...params, limit);
|
|
148
146
|
}
|
|
149
|
-
/**
|
|
150
|
-
* Load likely search candidates directly from SQLite.
|
|
151
|
-
* Uses FTS5 when available, falls back to LIKE matching, then full-store fallback.
|
|
152
|
-
*
|
|
153
|
-
* When `tenantId` is provided, every SELECT (FTS join, LIKE, fallback) filters
|
|
154
|
-
* by tenant_id. Cross-tenant memories never surface. Omitted = no filter.
|
|
155
|
-
*/
|
|
147
|
+
/** Load likely search candidates: FTS5 when available, else LIKE, then full-store fallback. With `tenantId` every SELECT filters by it; omitted = no filter. */
|
|
156
148
|
export function loadSearchEntries(hippoRoot, query, limit = DEFAULT_SEARCH_CANDIDATE_LIMIT, tenantId) {
|
|
157
|
-
|
|
158
|
-
try {
|
|
149
|
+
return onHandle(hippoRoot, (db) => {
|
|
159
150
|
return loadSearchRows(db, query, limit, tenantId).map(rowToEntry);
|
|
160
|
-
}
|
|
161
|
-
finally {
|
|
162
|
-
closeHippoDb(db);
|
|
163
|
-
}
|
|
151
|
+
}, openStore);
|
|
164
152
|
}
|
|
165
|
-
/**
|
|
166
|
-
*
|
|
167
|
-
* `unknown:legacy` cannot leak via any consumer that hasn't remembered to re-filter.
|
|
168
|
-
*
|
|
169
|
-
* - `requestedScope` undefined / '': default-deny on `unknown:legacy`, admitting `ownScope`, the caller's personal scope.
|
|
170
|
-
* - `requestedScope` non-empty string: exact match on `m.scope = requestedScope`.
|
|
171
|
-
*
|
|
172
|
-
* Private scopes: SQL applies a conservative `NOT LIKE '%:private:%'` before the LIMIT window so private
|
|
173
|
-
* rows cannot starve admitted ones; `passesScopeFilterForRecall` stays the exact JS post-filter.
|
|
174
|
-
*
|
|
175
|
-
* Consumers: `api.recall`, `cmdRecall`/`cmdExplain` direct CLI paths
|
|
176
|
-
* and `searchBothHybrid` recall mode. Background pipelines
|
|
177
|
-
* (`consolidate`, `embeddings`, `refine-llm`, ...) keep using
|
|
178
|
-
* `loadSearchEntries` so they can see quarantined rows when needed.
|
|
179
|
-
*
|
|
180
|
-
* `tenantId` is optional because searchBothHybrid's is; undefined means no tenant filter.
|
|
181
|
-
*/
|
|
153
|
+
/** Recall-mode loader: scope predicate in SQL so `unknown:legacy` cannot leak. Empty `requestedScope` default-denies (admits `ownScope`); else exact match.
|
|
154
|
+
* SQL `NOT LIKE '%:private:%'` runs before the LIMIT so private rows cannot starve admitted ones; `passesScopeFilterForRecall` is the exact post-filter. */
|
|
182
155
|
export function loadRecallSearchEntries(hippoRoot, query, limit = DEFAULT_SEARCH_CANDIDATE_LIMIT, tenantId, requestedScope, explicitScopeMode = 'exact', includeSuperseded = true, originProjects, ownScope) {
|
|
183
|
-
|
|
184
|
-
try {
|
|
156
|
+
return onHandle(hippoRoot, (db) => {
|
|
185
157
|
return loadRecallSearchEntriesFromDb(db, query, { limit, tenantId, requestedScope, explicitScopeMode, includeSuperseded, originProjects, ownScope });
|
|
186
|
-
}
|
|
187
|
-
finally {
|
|
188
|
-
closeHippoDb(db);
|
|
189
|
-
}
|
|
158
|
+
}, openStore);
|
|
190
159
|
}
|
|
191
160
|
// Split out so callers with an already-open db (the prompt-recall path) skip
|
|
192
161
|
// the initStore+open/close cycle per store per call.
|
|
193
162
|
export function loadRecallSearchEntriesFromDb(db, query, options = {}) {
|
|
194
|
-
const { limit = DEFAULT_SEARCH_CANDIDATE_LIMIT, tenantId, requestedScope, explicitScopeMode = 'exact', includeSuperseded = true, originProjects, ownScope } = options;
|
|
163
|
+
const { limit = DEFAULT_SEARCH_CANDIDATE_LIMIT, tenantId, requestedScope, explicitScopeMode = 'exact', includeSuperseded = true, originProjects, ownScope, } = options;
|
|
195
164
|
const scopeFilter = recallScopeFilter(requestedScope, explicitScopeMode, ownScope);
|
|
196
165
|
return loadSearchRows(db, query, limit, tenantId, { scopeFilter, includeSuperseded, originProjects }).map(rowToEntry);
|
|
197
166
|
}
|
package/dist/store/sessions.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { JsonObject } from './working-memory.js';
|
|
1
2
|
import { type TaskSnapshot, type SessionEvent } from './rows.js';
|
|
2
3
|
/** A shared-store caller's task state bucket: its owner and every name its project's rows carry. */
|
|
3
4
|
export interface ContinuityKey {
|
|
@@ -26,36 +27,11 @@ type SnapshotInput = {
|
|
|
26
27
|
};
|
|
27
28
|
export declare function saveActiveTaskSnapshot(hippoRoot: string, tenantId: string, snapshot: SnapshotInput, key?: ContinuityKey): TaskSnapshot;
|
|
28
29
|
export declare function loadActiveTaskSnapshot(hippoRoot: string, tenantId: string, key?: ContinuityKey): TaskSnapshot | null;
|
|
29
|
-
/**
|
|
30
|
-
*
|
|
31
|
-
* a Friday-evening orphan still offers continuity on Monday morning.
|
|
32
|
-
* Exported so callers can override via `loadFreshActiveTaskSnapshot`'s
|
|
33
|
-
* `opts.maxAgeMs`; deliberately no env knob (Simplicity First).
|
|
34
|
-
*/
|
|
30
|
+
/** Default freshness bound for AMBIENT active-task-snapshot reads: 72h rather than 48h so a Friday-evening orphan still offers continuity on Monday;
|
|
31
|
+
* override via `loadFreshActiveTaskSnapshot`'s `opts.maxAgeMs`; deliberately no env knob. */
|
|
35
32
|
export declare const SNAPSHOT_AMBIENT_MAX_AGE_MS: number;
|
|
36
|
-
/**
|
|
37
|
-
*
|
|
38
|
-
* hook context, MCP recall block), so snapshots expire. A
|
|
39
|
-
* snapshot written by `hippo pre-compact` has no death path tied to the
|
|
40
|
-
* session that owns it, so an orphaned row would otherwise inject into
|
|
41
|
-
* every prompt of every later session forever. Wraps `loadActiveTaskSnapshot`
|
|
42
|
-
* (unchanged, still the source of truth for explicit continuity surfaces),
|
|
43
|
-
* then applies, in order:
|
|
44
|
-
*
|
|
45
|
-
* 1. Owner match — ONLY when both `opts.sessionId` and the snapshot's
|
|
46
|
-
* `session_id` are non-null, non-empty strings and strictly equal
|
|
47
|
-
* (`===`). Owner reads are unbounded: the session that owns the snapshot
|
|
48
|
-
* can always see its own working state, regardless of age.
|
|
49
|
-
* 2. Age check — everything else, including absent-vs-absent ids. A
|
|
50
|
-
* null/undefined/empty id on EITHER side never counts as an owner match;
|
|
51
|
-
* it falls through here instead. (`runPreCompact` can legitimately save a
|
|
52
|
-
* snapshot with `session_id = null`; a null-equals-null "match" would
|
|
53
|
-
* reopen indefinite ambient injection for exactly those rows.) Returns
|
|
54
|
-
* the snapshot only when `age(updated_at) <= maxAgeMs` (default
|
|
55
|
-
* `SNAPSHOT_AMBIENT_MAX_AGE_MS`); otherwise null.
|
|
56
|
-
*
|
|
57
|
-
* No SQL change — age derives from the existing `updated_at` column.
|
|
58
|
-
*/
|
|
33
|
+
/** Bounded read for AMBIENT snapshot surfaces so orphaned snapshots expire. The owner (both session ids non-empty and `===`) always sees its own state;
|
|
34
|
+
* all others, null ids included (null === null is no match), get it only if age(updated_at) <= maxAgeMs (default `SNAPSHOT_AMBIENT_MAX_AGE_MS`), else null. */
|
|
59
35
|
export declare function loadFreshActiveTaskSnapshot(hippoRoot: string, tenantId: string, opts?: {
|
|
60
36
|
maxAgeMs?: number;
|
|
61
37
|
sessionId?: string | null;
|
|
@@ -66,15 +42,8 @@ export declare function freshActiveSnapshot(snapshot: TaskSnapshot | null, opts?
|
|
|
66
42
|
sessionId?: string | null;
|
|
67
43
|
}): TaskSnapshot | null;
|
|
68
44
|
export declare function clearActiveTaskSnapshot(hippoRoot: string, tenantId: string, clearedStatus?: string): boolean;
|
|
69
|
-
/**
|
|
70
|
-
*
|
|
71
|
-
* session-end death path.
|
|
72
|
-
* Only one `active` row exists per tenant (per owner and project when keyed) in practice (supersession happens
|
|
73
|
-
* at save), but the WHERE clause scopes on `session_id` too — not just
|
|
74
|
-
* `status='active' AND tenant_id=?` — so an ending session can never close a
|
|
75
|
-
* different, newer session's active snapshot. Returns the number of rows
|
|
76
|
-
* closed (0 when no active row is owned by `sessionId`).
|
|
77
|
-
*/
|
|
45
|
+
/** Close the `active` task snapshot(s) owned by `sessionId` at session end; the WHERE scopes on `session_id` too so an ending session can never close a
|
|
46
|
+
* newer session's snapshot. Returns the number of rows closed. */
|
|
78
47
|
export declare function closeTaskSnapshotsForSession(hippoRoot: string, tenantId: string, sessionId: string, status?: string, key?: ContinuityKey): number;
|
|
79
48
|
interface SessionEventInput {
|
|
80
49
|
session_id: string;
|
|
@@ -83,7 +52,7 @@ interface SessionEventInput {
|
|
|
83
52
|
task?: string | null;
|
|
84
53
|
source?: string;
|
|
85
54
|
scope?: string | null;
|
|
86
|
-
metadata?:
|
|
55
|
+
metadata?: JsonObject;
|
|
87
56
|
}
|
|
88
57
|
export declare function appendSessionEvent(hippoRoot: string, tenantId: string, event: SessionEventInput): SessionEvent;
|
|
89
58
|
export declare function listSessionEvents(hippoRoot: string, tenantId: string, options?: {
|
|
@@ -91,17 +60,11 @@ export declare function listSessionEvents(hippoRoot: string, tenantId: string, o
|
|
|
91
60
|
task?: string;
|
|
92
61
|
limit?: number;
|
|
93
62
|
}): SessionEvent[];
|
|
94
|
-
/**
|
|
95
|
-
* Return session_ids with a `session_complete` event newer than `sinceMs`.
|
|
96
|
-
* Used by the sleep auto-promotion pass to bound scanning to a fixed window.
|
|
97
|
-
*/
|
|
63
|
+
/** Session_ids with a `session_complete` event newer than `sinceMs`; bounds the sleep auto-promotion scan to a fixed window. */
|
|
98
64
|
export declare function findPromotableSessions(hippoRoot: string, tenantId: string, sinceMs: number): Array<{
|
|
99
65
|
session_id: string;
|
|
100
66
|
}>;
|
|
101
|
-
/**
|
|
102
|
-
* Idempotency guard — true if a trace-layer memory with this source_session_id
|
|
103
|
-
* already exists.
|
|
104
|
-
*/
|
|
67
|
+
/** Idempotency guard: true if a trace-layer memory with this source_session_id already exists. */
|
|
105
68
|
export declare function traceExistsForSession(hippoRoot: string, tenantId: string, session_id: string): boolean;
|
|
106
69
|
/** One caller's claim on a session id. */
|
|
107
70
|
export interface SessionOwnerBinding {
|
package/dist/store/sessions.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { HOUR_MS } from '../util/time.js';
|
|
1
2
|
import { isSharedStore } from '../core/config.js';
|
|
2
3
|
import { closeHippoDb, HOOK_DB_WAIT_MS, scopedBusyWait, withWriteScope } from '../db/index.js';
|
|
3
4
|
import { raiseMinBinary } from '../db/meta.js';
|
|
@@ -24,8 +25,9 @@ export function continuityStamp(key) {
|
|
|
24
25
|
}
|
|
25
26
|
// An unkeyed write acts on the tenant's newest or every active row, which on a shared store belong to other owners.
|
|
26
27
|
function assertKeyedOnSharedStore(fn, hippoRoot, key) {
|
|
27
|
-
if (!key && isSharedStore(hippoRoot))
|
|
28
|
+
if (!key && isSharedStore(hippoRoot)) {
|
|
28
29
|
throw new Error(`${fn}: a shared store keeps one task snapshot per owner and project, so this write needs their continuity key`);
|
|
30
|
+
}
|
|
29
31
|
}
|
|
30
32
|
function insertSnapshot(db, tenantId, snapshot, now, stamp) {
|
|
31
33
|
const result = db.prepare(`
|
|
@@ -73,8 +75,7 @@ export function saveActiveTaskSnapshot(hippoRoot, tenantId, snapshot, key) {
|
|
|
73
75
|
export function loadActiveTaskSnapshot(hippoRoot, tenantId, key) {
|
|
74
76
|
assertTenantId('loadActiveTaskSnapshot', tenantId);
|
|
75
77
|
const owned = key ? continuityWhere(key) : null;
|
|
76
|
-
|
|
77
|
-
try {
|
|
78
|
+
return onHandle(hippoRoot, (db) => {
|
|
78
79
|
// SAFETY: row's shape matches the ten columns named in the SELECT above.
|
|
79
80
|
const row = db.prepare(`
|
|
80
81
|
SELECT id, task, summary, next_step, status, source, session_id, scope, created_at, updated_at
|
|
@@ -92,47 +93,17 @@ export function loadActiveTaskSnapshot(hippoRoot, tenantId, key) {
|
|
|
92
93
|
if (!key)
|
|
93
94
|
writeActiveTaskMirror(hippoRoot, tenantId, loaded);
|
|
94
95
|
return loaded;
|
|
95
|
-
}
|
|
96
|
-
finally {
|
|
97
|
-
closeHippoDb(db);
|
|
98
|
-
}
|
|
96
|
+
}, openStore);
|
|
99
97
|
}
|
|
100
|
-
/**
|
|
101
|
-
*
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
* `opts.maxAgeMs`; deliberately no env knob (Simplicity First).
|
|
105
|
-
*/
|
|
106
|
-
export const SNAPSHOT_AMBIENT_MAX_AGE_MS = 72 * 60 * 60 * 1000;
|
|
107
|
-
/** A usable session id: non-null, non-empty string. Named predicate (not an
|
|
108
|
-
* inline `typeof` check) so the owner-match rule in
|
|
109
|
-
* `loadFreshActiveTaskSnapshot` states its contract once. */
|
|
98
|
+
/** Default freshness bound for AMBIENT active-task-snapshot reads: 72h rather than 48h so a Friday-evening orphan still offers continuity on Monday;
|
|
99
|
+
* override via `loadFreshActiveTaskSnapshot`'s `opts.maxAgeMs`; deliberately no env knob. */
|
|
100
|
+
export const SNAPSHOT_AMBIENT_MAX_AGE_MS = 72 * HOUR_MS;
|
|
101
|
+
/** A usable session id: non-null, non-empty string; named so the owner-match rule in `loadFreshActiveTaskSnapshot` states its contract once. */
|
|
110
102
|
function isNonEmptySessionId(value) {
|
|
111
103
|
return typeof value === 'string' && value.length > 0;
|
|
112
104
|
}
|
|
113
|
-
/**
|
|
114
|
-
*
|
|
115
|
-
* hook context, MCP recall block), so snapshots expire. A
|
|
116
|
-
* snapshot written by `hippo pre-compact` has no death path tied to the
|
|
117
|
-
* session that owns it, so an orphaned row would otherwise inject into
|
|
118
|
-
* every prompt of every later session forever. Wraps `loadActiveTaskSnapshot`
|
|
119
|
-
* (unchanged, still the source of truth for explicit continuity surfaces),
|
|
120
|
-
* then applies, in order:
|
|
121
|
-
*
|
|
122
|
-
* 1. Owner match — ONLY when both `opts.sessionId` and the snapshot's
|
|
123
|
-
* `session_id` are non-null, non-empty strings and strictly equal
|
|
124
|
-
* (`===`). Owner reads are unbounded: the session that owns the snapshot
|
|
125
|
-
* can always see its own working state, regardless of age.
|
|
126
|
-
* 2. Age check — everything else, including absent-vs-absent ids. A
|
|
127
|
-
* null/undefined/empty id on EITHER side never counts as an owner match;
|
|
128
|
-
* it falls through here instead. (`runPreCompact` can legitimately save a
|
|
129
|
-
* snapshot with `session_id = null`; a null-equals-null "match" would
|
|
130
|
-
* reopen indefinite ambient injection for exactly those rows.) Returns
|
|
131
|
-
* the snapshot only when `age(updated_at) <= maxAgeMs` (default
|
|
132
|
-
* `SNAPSHOT_AMBIENT_MAX_AGE_MS`); otherwise null.
|
|
133
|
-
*
|
|
134
|
-
* No SQL change — age derives from the existing `updated_at` column.
|
|
135
|
-
*/
|
|
105
|
+
/** Bounded read for AMBIENT snapshot surfaces so orphaned snapshots expire. The owner (both session ids non-empty and `===`) always sees its own state;
|
|
106
|
+
* all others, null ids included (null === null is no match), get it only if age(updated_at) <= maxAgeMs (default `SNAPSHOT_AMBIENT_MAX_AGE_MS`), else null. */
|
|
136
107
|
export function loadFreshActiveTaskSnapshot(hippoRoot, tenantId, opts = {}, key) {
|
|
137
108
|
return freshActiveSnapshot(loadActiveTaskSnapshot(hippoRoot, tenantId, key), opts);
|
|
138
109
|
}
|
|
@@ -170,15 +141,8 @@ export function clearActiveTaskSnapshot(hippoRoot, tenantId, clearedStatus = 'cl
|
|
|
170
141
|
closeHippoDb(db);
|
|
171
142
|
}
|
|
172
143
|
}
|
|
173
|
-
/**
|
|
174
|
-
*
|
|
175
|
-
* session-end death path.
|
|
176
|
-
* Only one `active` row exists per tenant (per owner and project when keyed) in practice (supersession happens
|
|
177
|
-
* at save), but the WHERE clause scopes on `session_id` too — not just
|
|
178
|
-
* `status='active' AND tenant_id=?` — so an ending session can never close a
|
|
179
|
-
* different, newer session's active snapshot. Returns the number of rows
|
|
180
|
-
* closed (0 when no active row is owned by `sessionId`).
|
|
181
|
-
*/
|
|
144
|
+
/** Close the `active` task snapshot(s) owned by `sessionId` at session end; the WHERE scopes on `session_id` too so an ending session can never close a
|
|
145
|
+
* newer session's snapshot. Returns the number of rows closed. */
|
|
182
146
|
export function closeTaskSnapshotsForSession(hippoRoot, tenantId, sessionId, status = 'session-ended', key) {
|
|
183
147
|
assertTenantId('closeTaskSnapshotsForSession', tenantId);
|
|
184
148
|
if (key)
|
|
@@ -242,8 +206,7 @@ export function appendSessionEvent(hippoRoot, tenantId, event) {
|
|
|
242
206
|
}
|
|
243
207
|
export function listSessionEvents(hippoRoot, tenantId, options = {}) {
|
|
244
208
|
assertTenantId('listSessionEvents', tenantId);
|
|
245
|
-
|
|
246
|
-
try {
|
|
209
|
+
return onHandle(hippoRoot, (db) => {
|
|
247
210
|
const clauses = ['tenant_id = ?'];
|
|
248
211
|
const params = [tenantId];
|
|
249
212
|
if (options.session_id) {
|
|
@@ -267,19 +230,12 @@ export function listSessionEvents(hippoRoot, tenantId, options = {}) {
|
|
|
267
230
|
LIMIT ?
|
|
268
231
|
`).all(...params);
|
|
269
232
|
return rows.map(rowToSessionEvent).reverse();
|
|
270
|
-
}
|
|
271
|
-
finally {
|
|
272
|
-
closeHippoDb(db);
|
|
273
|
-
}
|
|
233
|
+
}, openStore);
|
|
274
234
|
}
|
|
275
|
-
/**
|
|
276
|
-
* Return session_ids with a `session_complete` event newer than `sinceMs`.
|
|
277
|
-
* Used by the sleep auto-promotion pass to bound scanning to a fixed window.
|
|
278
|
-
*/
|
|
235
|
+
/** Session_ids with a `session_complete` event newer than `sinceMs`; bounds the sleep auto-promotion scan to a fixed window. */
|
|
279
236
|
export function findPromotableSessions(hippoRoot, tenantId, sinceMs) {
|
|
280
237
|
assertTenantId('findPromotableSessions', tenantId);
|
|
281
|
-
|
|
282
|
-
try {
|
|
238
|
+
return onHandle(hippoRoot, (db) => {
|
|
283
239
|
// SAFETY: rows' shape matches the single `session_id` column selected
|
|
284
240
|
// above.
|
|
285
241
|
const rows = db.prepare(`
|
|
@@ -287,29 +243,19 @@ export function findPromotableSessions(hippoRoot, tenantId, sinceMs) {
|
|
|
287
243
|
WHERE event_type = 'session_complete' AND created_at >= ? AND tenant_id = ?
|
|
288
244
|
`).all(new Date(sinceMs).toISOString(), tenantId);
|
|
289
245
|
return rows;
|
|
290
|
-
}
|
|
291
|
-
finally {
|
|
292
|
-
closeHippoDb(db);
|
|
293
|
-
}
|
|
246
|
+
}, openStore);
|
|
294
247
|
}
|
|
295
|
-
/**
|
|
296
|
-
* Idempotency guard — true if a trace-layer memory with this source_session_id
|
|
297
|
-
* already exists.
|
|
298
|
-
*/
|
|
248
|
+
/** Idempotency guard: true if a trace-layer memory with this source_session_id already exists. */
|
|
299
249
|
export function traceExistsForSession(hippoRoot, tenantId, session_id) {
|
|
300
250
|
assertTenantId('traceExistsForSession', tenantId);
|
|
301
|
-
|
|
302
|
-
try {
|
|
251
|
+
return onHandle(hippoRoot, (db) => {
|
|
303
252
|
const row = db.prepare(`
|
|
304
253
|
SELECT 1 FROM memories
|
|
305
254
|
WHERE source_session_id = ? AND layer = 'trace' AND tenant_id = ?
|
|
306
255
|
LIMIT 1
|
|
307
256
|
`).get(session_id, tenantId);
|
|
308
257
|
return !!row;
|
|
309
|
-
}
|
|
310
|
-
finally {
|
|
311
|
-
closeHippoDb(db);
|
|
312
|
-
}
|
|
258
|
+
}, openStore);
|
|
313
259
|
}
|
|
314
260
|
/** The owner a session id is bound to, or null. */
|
|
315
261
|
function selectSessionOwnerAt(db, tenantId, sessionId) {
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { DatabaseSyncLike } from '../db/index.js';
|
|
2
|
+
import { type MemoryEntry } from '../core/memory.js';
|
|
3
|
+
export declare const SYNC_ACTOR = "agent-memories";
|
|
4
|
+
export type SetAsideWhy = 'note-gone' | 'note-changed' | 'handover' | 'project-merge' | 'project-repair';
|
|
5
|
+
export type SetAsideResult = {
|
|
6
|
+
readonly kind: 'untagged';
|
|
7
|
+
readonly entry: MemoryEntry;
|
|
8
|
+
} | {
|
|
9
|
+
readonly kind: 'dormant';
|
|
10
|
+
readonly id: string;
|
|
11
|
+
};
|
|
12
|
+
/** Design 6's set-aside on the caller's transaction: a pinned row only loses the tag, any other goes dormant, restorable. */
|
|
13
|
+
export declare function setAsideRow(db: DatabaseSyncLike, tag: string, row: MemoryEntry, why: SetAsideWhy): SetAsideResult;
|
|
14
|
+
//# sourceMappingURL=set-aside.d.ts.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// Takes an imported agent note out of recall on the caller's transaction; the note sync and the project repair both use it.
|
|
2
|
+
import { appendAuditEvent } from './audit.js';
|
|
3
|
+
import { insertDormantRow } from './dormant.js';
|
|
4
|
+
import { calculateStrength } from '../core/memory.js';
|
|
5
|
+
import { deleteEntryRowInTx, setEntryTagsInTx } from './entry-writes.js';
|
|
6
|
+
export const SYNC_ACTOR = 'agent-memories';
|
|
7
|
+
/** Design 6's set-aside on the caller's transaction: a pinned row only loses the tag, any other goes dormant, restorable. */
|
|
8
|
+
export function setAsideRow(db, tag, row, why) {
|
|
9
|
+
const untagged = { ...row, tags: row.tags.filter((t) => t !== tag) };
|
|
10
|
+
const audit = (metadata) => appendAuditEvent(db, { tenantId: row.tenantId, actor: SYNC_ACTOR, op: 'agent_memory_set_aside', targetId: row.id, metadata });
|
|
11
|
+
if (row.pinned) {
|
|
12
|
+
setEntryTagsInTx(db, untagged);
|
|
13
|
+
audit({ why, untagged: true });
|
|
14
|
+
return { kind: 'untagged', entry: untagged };
|
|
15
|
+
}
|
|
16
|
+
const now = new Date();
|
|
17
|
+
// Sleep's dormant move skips kept rows, so the steps are written out here without its filter.
|
|
18
|
+
insertDormantRow(db, { entry: untagged, strength: calculateStrength(row, now), reason: 'source-deleted', dormantAt: now.toISOString() });
|
|
19
|
+
deleteEntryRowInTx(db, row, SYNC_ACTOR);
|
|
20
|
+
audit({ why });
|
|
21
|
+
return { kind: 'dormant', id: row.id };
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=set-aside.js.map
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// Busy detection lives with the adapter, so the port names no SQLite error code.
|
|
2
|
+
import { isSqliteBusy } from '../../db/busy.js';
|
|
3
|
+
import { StoreBusyError } from '../port.js';
|
|
4
|
+
/** A held lock in any store: SQLite's busy codes or a port's StoreBusyError. */
|
|
5
|
+
export function isStoreBusy(error) {
|
|
6
|
+
return error instanceof StoreBusyError || isSqliteBusy(error);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=busy.js.map
|
|
@@ -1,22 +1,19 @@
|
|
|
1
1
|
// hippo.db's half of the ConnectorEvents store group: each call on a handle of its own.
|
|
2
|
-
import { archiveDeletedArtifact,
|
|
2
|
+
import { archiveDeletedArtifact, githubEventRecord, githubEventSeenAt, githubRouting, insertGitHubDlq, markGitHubEventSeen } from '../connectors/github.js';
|
|
3
3
|
import { insertSlackDlq, markSlackEventSeen, rawMemoryIdForArtifactAt, slackEventRecord, slackEventSeenAt, slackTeamRoute } from '../connectors/slack.js';
|
|
4
4
|
import { onHandle } from '../open.js';
|
|
5
5
|
function eventRecord(hippoRoot, event) {
|
|
6
|
-
|
|
7
|
-
return slackEventRecord(hippoRoot, event.eventId);
|
|
8
|
-
const logged = seenEvent(hippoRoot, event.idempotencyKey);
|
|
9
|
-
return logged ? { seen: true, memoryId: logged.memoryId } : { seen: false };
|
|
6
|
+
return event.connector === 'slack' ? slackEventRecord(hippoRoot, event.eventId) : githubEventRecord(hippoRoot, event.idempotencyKey);
|
|
10
7
|
}
|
|
11
8
|
function markEventSeen(hippoRoot, event) {
|
|
12
9
|
if (event.connector === 'slack')
|
|
13
10
|
return markSlackEventSeen(hippoRoot, event.eventId, null);
|
|
14
11
|
const { idempotencyKey, deliveryId, eventName } = event;
|
|
15
|
-
|
|
12
|
+
markGitHubEventSeen(hippoRoot, { idempotencyKey, deliveryId, eventName, memoryId: null });
|
|
16
13
|
}
|
|
17
14
|
function deletionTarget(hippoRoot, { event, artifactRef, tenantId }) {
|
|
18
15
|
return onHandle(hippoRoot, (db) => {
|
|
19
|
-
const seen = event.connector === 'slack' ? slackEventSeenAt(db, event.eventId) :
|
|
16
|
+
const seen = event.connector === 'slack' ? slackEventSeenAt(db, event.eventId) : githubEventSeenAt(db, event.idempotencyKey);
|
|
20
17
|
return seen ? { seen: true } : { seen: false, memoryId: rawMemoryIdForArtifactAt(db, artifactRef, tenantId) };
|
|
21
18
|
});
|
|
22
19
|
}
|
|
@@ -32,7 +29,7 @@ export function sqliteConnectorEvents(hippoRoot) {
|
|
|
32
29
|
archiveDeletedArtifact: (archive) => archiveArtifact(hippoRoot, archive),
|
|
33
30
|
slackTeamRoute: (teamId) => slackTeamRoute(hippoRoot, teamId),
|
|
34
31
|
githubRouting: (query) => githubRouting(hippoRoot, query),
|
|
35
|
-
parkDeadLetter: (letter) => (letter.connector === 'slack' ? insertSlackDlq(hippoRoot, letter) :
|
|
32
|
+
parkDeadLetter: (letter) => (letter.connector === 'slack' ? insertSlackDlq(hippoRoot, letter) : insertGitHubDlq(hippoRoot, letter)),
|
|
36
33
|
};
|
|
37
34
|
}
|
|
38
35
|
/** 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. */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { githubEventMemoryAt, markGitHubEventSeenAt } from '../connectors/github.js';
|
|
2
2
|
import { markSlackEventSeenAt, slackEventMemoryAt } from '../connectors/slack.js';
|
|
3
3
|
import { stampOriginProject } from '../entry-row.js';
|
|
4
4
|
import { writeEntryMirrors } from '../entry-writes.js';
|
|
@@ -13,10 +13,10 @@ function logEvent(db, event, memoryId) {
|
|
|
13
13
|
if (event.connector === 'slack')
|
|
14
14
|
return markSlackEventSeenAt(db, event.eventId, memoryId);
|
|
15
15
|
const { idempotencyKey, deliveryId, eventName } = event;
|
|
16
|
-
return
|
|
16
|
+
return markGitHubEventSeenAt(db, { idempotencyKey, deliveryId, eventName, memoryId });
|
|
17
17
|
}
|
|
18
18
|
function loggedMemory(db, event) {
|
|
19
|
-
return event.connector === 'slack' ? slackEventMemoryAt(db, event.eventId) :
|
|
19
|
+
return event.connector === 'slack' ? slackEventMemoryAt(db, event.eventId) : githubEventMemoryAt(db, event.idempotencyKey);
|
|
20
20
|
}
|
|
21
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
22
|
function writeWithCompanions(db, { entry, actor, event, quarantine }) {
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
import { ConflictError, NotFoundError } from '../../core/api-errors.js';
|
|
3
3
|
import { appendAuditEvent } from '../audit.js';
|
|
4
4
|
import { isSqliteBusy, withWriteScope } from '../../db/index.js';
|
|
5
|
-
import { errorMessage, log } from '../../util/log.js';
|
|
5
|
+
import { errorFields, errorMessage, log } from '../../util/log.js';
|
|
6
6
|
import { entryAfterOutcome } from '../../core/memory.js';
|
|
7
7
|
import { archiveRawMemory } from '../raw-archive.js';
|
|
8
|
-
import { ownScopeTouches } from '
|
|
8
|
+
import { ownScopeTouches } from '../../core/recall-scope.js';
|
|
9
9
|
import { recordTraceOutcome } from '../recall-trace.js';
|
|
10
|
-
import { RejectedValueError } from '
|
|
10
|
+
import { RejectedValueError } from '../../core/api-errors.js';
|
|
11
11
|
import { markSummaryDirtyInTx } from '../summary-dirty.js';
|
|
12
12
|
import { auditRejectionRefusal } from '../audit-event.js';
|
|
13
13
|
import { deleteEntryCore } from '../delete-and-batch.js';
|
|
@@ -155,7 +155,7 @@ function cleanArchivedMirrors(db, hippoRoot, id) {
|
|
|
155
155
|
removeEntryMirrors(hippoRoot, id);
|
|
156
156
|
}
|
|
157
157
|
catch (mirrorErr) {
|
|
158
|
-
log.error(`archiveRaw: mirror cleanup failed for ${id} (will retry via reaper on next openHippoDb): ${errorMessage(mirrorErr)}
|
|
158
|
+
log.error(`archiveRaw: mirror cleanup failed for ${id} (will retry via reaper on next openHippoDb): ${errorMessage(mirrorErr)}`, errorFields(mirrorErr));
|
|
159
159
|
return;
|
|
160
160
|
}
|
|
161
161
|
try {
|
|
@@ -1,16 +1,19 @@
|
|
|
1
|
-
// A thrown error crosses the worker boundary as plain data and arrives as an instance
|
|
1
|
+
// A thrown error crosses the worker boundary as plain data and arrives as an instance
|
|
2
|
+
// of its class: the server's mappers test `instanceof`, `errcode` and fields.
|
|
2
3
|
import { BadRequestError, ConflictError, ForbiddenError, NotFoundError } from '../../core/api-errors.js';
|
|
3
|
-
import {
|
|
4
|
+
import { RawAppendOnlyError } from '../../core/raw-append-only.js';
|
|
5
|
+
import { IncompatibleBinaryError } from '../../db/index.js';
|
|
6
|
+
import { StoreBusyError } from '../port.js';
|
|
4
7
|
import { BodyTimeoutError, BodyTooLargeError, HttpError } from '../../util/http-util.js';
|
|
5
8
|
import { errorMessage, log } from '../../util/log.js';
|
|
6
|
-
import { ScopeForbiddenError } from '
|
|
7
|
-
import { RejectedValueError } from '
|
|
9
|
+
import { ScopeForbiddenError } from '../../core/recall-scope.js';
|
|
10
|
+
import { RejectedValueError } from '../../core/api-errors.js';
|
|
8
11
|
import { OtherStoreFolderError, SqliteBlockedError, StoreNotPortedError } from '../../util/sqlite-blocked.js';
|
|
9
12
|
// Every class the server maps by, at or below the store layer. Abstract ApiError is absent: only its four subclasses are thrown.
|
|
10
13
|
const CLASSES = [
|
|
11
14
|
Error, TypeError, RangeError, SyntaxError, ReferenceError, EvalError, URIError,
|
|
12
15
|
HttpError, BodyTooLargeError, BodyTimeoutError,
|
|
13
|
-
BadRequestError, ForbiddenError, NotFoundError, ConflictError, RejectedValueError, ScopeForbiddenError,
|
|
16
|
+
BadRequestError, ForbiddenError, NotFoundError, ConflictError, RejectedValueError, ScopeForbiddenError, RawAppendOnlyError,
|
|
14
17
|
SqliteBlockedError, StoreNotPortedError, OtherStoreFolderError,
|
|
15
18
|
StoreBusyError, IncompatibleBinaryError,
|
|
16
19
|
];
|
|
@@ -23,6 +23,7 @@ export interface SqliteExecutor {
|
|
|
23
23
|
/** Stops the writer thread as a crash would: its running and queued calls reject, and the next write starts a fresh thread. */
|
|
24
24
|
terminateWriter(): void;
|
|
25
25
|
}
|
|
26
|
-
/** Threads for the hippo.db under `hippoRoot`: one writer and two readers. The first
|
|
26
|
+
/** Threads for the hippo.db under `hippoRoot`: one writer and two readers. The first
|
|
27
|
+
* call starts the writer for the store's setup; a reader starts at its own first call. */
|
|
27
28
|
export declare function createSqliteExecutor(hippoRoot: string, opts?: ExecutorOptions): SqliteExecutor;
|
|
28
29
|
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -2,11 +2,12 @@
|
|
|
2
2
|
import { fileURLToPath } from 'node:url';
|
|
3
3
|
import { SHARE_ENV, Worker } from 'node:worker_threads';
|
|
4
4
|
import { addAuditWriteFailures } from '../audit.js';
|
|
5
|
-
import { getHippoDbPath, SERVER_DB_WAIT_MS
|
|
5
|
+
import { getHippoDbPath, SERVER_DB_WAIT_MS } from '../../db/index.js';
|
|
6
|
+
import { StoreBusyError } from '../port.js';
|
|
6
7
|
import { autoCheckpointPages } from '../../db/wal-checkpointer.js';
|
|
7
8
|
import { envStoreQueueMax } from '../../util/env.js';
|
|
8
9
|
import { DeadlineExceededError } from '../../util/http-util.js';
|
|
9
|
-
import { errorMessage, log } from '../../util/log.js';
|
|
10
|
+
import { errorFields, errorMessage, log } from '../../util/log.js';
|
|
10
11
|
import { requestScopes } from '../../util/request-scope.js';
|
|
11
12
|
import { decodeError } from './error-codec.js';
|
|
12
13
|
import { workerCounts } from './executor-counts.js';
|
|
@@ -27,6 +28,10 @@ const DEFAULT_WRITE_GRACE_MS = 2000;
|
|
|
27
28
|
function laneOf(mode) {
|
|
28
29
|
return { mode, queue: [], running: undefined, worker: undefined, stopping: undefined, commitFlag: undefined };
|
|
29
30
|
}
|
|
31
|
+
// A thread that will not stop leaves a live worker behind, so the rejection is logged rather than dropped.
|
|
32
|
+
function terminateLogged(worker) {
|
|
33
|
+
worker.terminate().catch((err) => log.warn('the store worker did not terminate cleanly', errorFields(err)));
|
|
34
|
+
}
|
|
30
35
|
/** Gives `pending`'s caller its one answer; a second call does nothing. */
|
|
31
36
|
function finish(pending, answer) {
|
|
32
37
|
if (pending.answered)
|
|
@@ -153,7 +158,7 @@ class WorkerPool {
|
|
|
153
158
|
#stopReader(lane, worker, pending) {
|
|
154
159
|
finish(pending, () => pending.fail(new DeadlineExceededError(READ_LATE)));
|
|
155
160
|
lane.stopping = worker;
|
|
156
|
-
|
|
161
|
+
terminateLogged(worker);
|
|
157
162
|
}
|
|
158
163
|
// Before its commit flag a stopped write is a known rollback; after it the thread is left to finish, since stopping it could not undo the write.
|
|
159
164
|
#stopWriter(lane, worker, pending) {
|
|
@@ -195,7 +200,8 @@ class WorkerPool {
|
|
|
195
200
|
return this.#exits.size;
|
|
196
201
|
}
|
|
197
202
|
terminateWriter() {
|
|
198
|
-
|
|
203
|
+
if (this.#writer.worker)
|
|
204
|
+
terminateLogged(this.#writer.worker);
|
|
199
205
|
}
|
|
200
206
|
#pump(lane) {
|
|
201
207
|
if (lane.running !== undefined)
|
|
@@ -279,7 +285,8 @@ class WorkerPool {
|
|
|
279
285
|
finish(pending, () => pending.fail(new StoreBusyError(WORKER_GONE, { cause })));
|
|
280
286
|
}
|
|
281
287
|
}
|
|
282
|
-
/** Threads for the hippo.db under `hippoRoot`: one writer and two readers. The first
|
|
288
|
+
/** Threads for the hippo.db under `hippoRoot`: one writer and two readers. The first
|
|
289
|
+
* call starts the writer for the store's setup; a reader starts at its own first call. */
|
|
283
290
|
export function createSqliteExecutor(hippoRoot, opts = {}) {
|
|
284
291
|
return new WorkerPool(hippoRoot, opts);
|
|
285
292
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// hippo.db's half of the GraphReads store group: one read snapshot around the walk the CLI graph commands run.
|
|
2
|
-
import { canReadScope } from '
|
|
2
|
+
import { canReadScope } from '../../core/recall-scope.js';
|
|
3
3
|
import { withGraphReadSnapshot } from '../graph-reads.js';
|
|
4
4
|
import { graphViewRows } from '../graph-view-rows.js';
|
|
5
5
|
export function sqliteGraphReads(hippoRoot) {
|