hippo-memory 2.0.0 → 2.1.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/dist/agent-memories/apply.d.ts +7 -5
- package/dist/agent-memories/apply.js +66 -39
- package/dist/agent-memories/claude-code.d.ts +8 -2
- package/dist/agent-memories/claude-code.js +26 -7
- package/dist/agent-memories/copilot.js +2 -1
- package/dist/agent-memories/files.js +2 -1
- package/dist/agent-memories/legacy.d.ts +6 -3
- package/dist/agent-memories/legacy.js +35 -14
- package/dist/agent-memories/markdown.d.ts +3 -1
- package/dist/agent-memories/markdown.js +3 -1
- package/dist/agent-memories/openclaw.js +5 -2
- package/dist/agent-memories/plan.js +11 -1
- package/dist/agent-memories/project-folds.js +2 -1
- package/dist/agent-memories/report.d.ts +4 -1
- package/dist/agent-memories/report.js +43 -9
- package/dist/agent-memories/source.d.ts +8 -2
- package/dist/agent-memories/source.js +11 -3
- package/dist/agent-memories/sync.d.ts +7 -2
- package/dist/agent-memories/sync.js +141 -101
- package/dist/api/assemble.d.ts +6 -4
- package/dist/api/assemble.js +11 -6
- package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
- package/dist/api/{audit.js → auth/audit.js} +11 -11
- package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -15
- package/dist/api/{auth.js → auth/auth.js} +46 -29
- package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
- package/dist/api/{quarantine.js → auth/quarantine.js} +8 -8
- package/dist/api/auth/session-owners.d.ts +10 -0
- package/dist/api/auth/session-owners.js +35 -0
- package/dist/api/availability.d.ts +3 -1
- package/dist/api/availability.js +3 -1
- package/dist/api/busy.d.ts +2 -0
- package/dist/api/busy.js +2 -0
- package/dist/api/cli-surface.d.ts +6 -0
- package/dist/api/cli-surface.js +6 -0
- package/dist/api/config-of.d.ts +5 -0
- package/dist/api/config-of.js +6 -0
- package/dist/api/context-auto.d.ts +4 -1
- package/dist/api/context-auto.js +10 -2
- package/dist/api/context-render.js +14 -7
- package/dist/api/context-select.d.ts +4 -1
- package/dist/api/context-select.js +23 -14
- package/dist/api/context-types.d.ts +38 -12
- package/dist/api/context.d.ts +8 -5
- package/dist/api/context.js +112 -57
- package/dist/api/continuity.d.ts +24 -21
- package/dist/api/continuity.js +18 -20
- package/dist/api/correction-latency.d.ts +3 -1
- package/dist/api/correction-latency.js +3 -1
- package/dist/api/error-reply.d.ts +4 -1
- package/dist/api/error-reply.js +12 -3
- package/dist/api/index.d.ts +39 -23
- package/dist/api/index.js +21 -23
- package/dist/api/instruction-detect.d.ts +4 -1
- package/dist/api/instruction-detect.js +75 -20
- package/dist/api/ledger-db.d.ts +15 -11
- package/dist/api/ledger-db.js +21 -23
- package/dist/api/memories/conflicts.d.ts +33 -0
- package/dist/api/memories/conflicts.js +67 -0
- package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
- package/dist/api/{forget.js → memories/forget.js} +22 -15
- package/dist/api/memories/memories.d.ts +27 -0
- package/dist/api/{memories.js → memories/memories.js} +16 -21
- package/dist/api/memories/outcome.d.ts +22 -0
- package/dist/api/{outcome.js → memories/outcome.js} +14 -8
- package/dist/api/memories/promote.d.ts +40 -0
- package/dist/api/{promote.js → memories/promote.js} +35 -22
- package/dist/api/memories/refine.d.ts +10 -0
- package/dist/api/memories/refine.js +12 -0
- package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +16 -11
- package/dist/api/{remember-local.js → memories/remember-local.js} +34 -20
- package/dist/api/{remember.d.ts → memories/remember.d.ts} +19 -13
- package/dist/api/{remember.js → memories/remember.js} +42 -26
- package/dist/api/objects/cards.d.ts +39 -0
- package/dist/api/{cards.js → objects/cards.js} +12 -14
- package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
- package/dist/api/{drill-down.js → objects/drill-down.js} +7 -8
- package/dist/api/objects/goals.d.ts +18 -0
- package/dist/api/{goals.js → objects/goals.js} +12 -12
- package/dist/api/objects/graph.d.ts +11 -0
- package/dist/api/objects/graph.js +16 -0
- package/dist/api/objects/objects.d.ts +9 -0
- package/dist/api/{objects.js → objects/objects.js} +2 -4
- package/dist/api/objects/predictions.d.ts +11 -0
- package/dist/api/{predictions.js → objects/predictions.js} +7 -6
- package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
- package/dist/api/{projects.js → objects/projects.js} +8 -4
- package/dist/api/pilot-arm.d.ts +8 -4
- package/dist/api/pilot-arm.js +5 -4
- package/dist/api/prompt-hook.d.ts +32 -19
- package/dist/api/prompt-hook.js +65 -44
- package/dist/api/provenance-coverage.d.ts +3 -1
- package/dist/api/provenance-coverage.js +3 -1
- package/dist/api/recall/finish.d.ts +185 -0
- package/dist/api/recall/finish.js +301 -0
- package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
- package/dist/api/{recall-pipeline.js → recall/pipeline.js} +176 -92
- package/dist/api/recall/recall.d.ts +6 -0
- package/dist/api/{recall.js → recall/recall.js} +101 -60
- package/dist/api/recall/render.d.ts +39 -0
- package/dist/api/recall/render.js +60 -0
- package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
- package/dist/api/recall/request.js +261 -0
- package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
- package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
- package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -70
- package/dist/api/{recall-types.js → recall/types.js} +1 -1
- package/dist/api/session-end.d.ts +16 -12
- package/dist/api/session-end.js +46 -30
- package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
- package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
- package/dist/api/sleep/dormant.d.ts +25 -0
- package/dist/api/sleep/dormant.js +64 -0
- package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
- package/dist/api/sleep/learn.js +138 -0
- package/dist/api/sleep/sleep-run.d.ts +38 -0
- package/dist/api/{sleep-run.js → sleep/sleep-run.js} +51 -43
- package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
- package/dist/api/sleep/sleep.js +9 -0
- package/dist/api/status.d.ts +3 -1
- package/dist/api/status.js +3 -1
- package/dist/api/store-init.d.ts +4 -1
- package/dist/api/store-init.js +4 -1
- package/dist/api/tokens.d.ts +10 -9
- package/dist/api/tokens.js +9 -10
- package/dist/api/types.d.ts +28 -7
- package/dist/api/types.js +13 -4
- package/dist/capture/caller-session.d.ts +8 -2
- package/dist/capture/caller-session.js +16 -6
- package/dist/capture/capture-error.d.ts +3 -1
- package/dist/capture/capture-error.js +3 -1
- package/dist/capture/codex-patch.js +7 -2
- package/dist/capture/command.d.ts +4 -2
- package/dist/capture/command.js +33 -14
- package/dist/capture/compact-resume-caller.js +15 -8
- package/dist/capture/compact.d.ts +8 -5
- package/dist/capture/compact.js +34 -23
- package/dist/capture/compaction-items-caller.js +9 -3
- package/dist/capture/compaction-record.d.ts +4 -3
- package/dist/capture/compaction-record.js +20 -12
- package/dist/capture/compaction-spool.d.ts +15 -4
- package/dist/capture/compaction-spool.js +64 -17
- package/dist/capture/copilot-transcript.d.ts +11 -3
- package/dist/capture/copilot-transcript.js +16 -6
- package/dist/capture/extract.js +20 -8
- package/dist/capture/failure-caller.js +23 -12
- package/dist/capture/failure-reading.d.ts +10 -3
- package/dist/capture/failure-reading.js +24 -7
- package/dist/capture/pre-compact-caller.js +11 -4
- package/dist/capture/session-digest.d.ts +15 -4
- package/dist/capture/session-digest.js +39 -13
- package/dist/capture/session-end-caller.d.ts +4 -1
- package/dist/capture/session-end-caller.js +20 -8
- package/dist/capture/session-texts.d.ts +6 -2
- package/dist/capture/session-texts.js +22 -7
- package/dist/capture/session-worker.d.ts +4 -2
- package/dist/capture/session-worker.js +45 -17
- package/dist/capture/transcript.d.ts +13 -4
- package/dist/capture/transcript.js +32 -10
- package/dist/capture/working-state.d.ts +13 -4
- package/dist/capture/working-state.js +50 -56
- package/dist/cli/api-context.d.ts +14 -2
- package/dist/cli/api-context.js +45 -2
- package/dist/cli/audit.js +23 -23
- package/dist/cli/auth.js +19 -27
- package/dist/cli/briefs.d.ts +1 -1
- package/dist/cli/briefs.js +20 -15
- package/dist/cli/card.d.ts +1 -1
- package/dist/cli/card.js +56 -73
- package/dist/cli/client.d.ts +12 -4
- package/dist/cli/client.js +43 -13
- package/dist/cli/compact-resume-payload.d.ts +4 -1
- package/dist/cli/compact-resume-payload.js +12 -5
- package/dist/cli/context.js +42 -17
- package/dist/cli/continuity.d.ts +5 -5
- package/dist/cli/continuity.js +90 -107
- package/dist/cli/curate.d.ts +4 -3
- package/dist/cli/curate.js +46 -68
- package/dist/cli/dag.d.ts +1 -1
- package/dist/cli/dag.js +14 -17
- package/dist/cli/decisions.js +27 -26
- package/dist/cli/eval.js +16 -21
- package/dist/cli/exit.d.ts +4 -1
- package/dist/cli/exit.js +10 -2
- package/dist/cli/explain.js +12 -11
- package/dist/cli/flag-values.d.ts +1 -1
- package/dist/cli/flag-values.js +9 -18
- package/dist/cli/github.d.ts +6 -0
- package/dist/cli/github.js +25 -13
- package/dist/cli/goals.d.ts +1 -1
- package/dist/cli/goals.js +39 -56
- package/dist/cli/graph.d.ts +1 -1
- package/dist/cli/graph.js +15 -11
- package/dist/cli/hook-runtime.d.ts +31 -9
- package/dist/cli/hook-runtime.js +40 -15
- package/dist/cli/incidents.d.ts +1 -1
- package/dist/cli/incidents.js +25 -25
- package/dist/cli/init.js +26 -11
- package/dist/cli/install-steps.d.ts +12 -3
- package/dist/cli/install-steps.js +42 -18
- package/dist/cli/last-sleep.d.ts +4 -1
- package/dist/cli/last-sleep.js +9 -4
- package/dist/cli/maintenance.d.ts +1 -1
- package/dist/cli/maintenance.js +11 -12
- package/dist/cli/notes.d.ts +1 -1
- package/dist/cli/notes.js +8 -5
- package/dist/cli/object-verbs.d.ts +4 -4
- package/dist/cli/object-verbs.js +10 -13
- package/dist/cli/open-browser.js +11 -2
- package/dist/cli/playbooks.d.ts +3 -3
- package/dist/cli/playbooks.js +40 -32
- package/dist/cli/predictions.js +15 -19
- package/dist/cli/print.js +4 -2
- package/dist/cli/projects.js +21 -11
- package/dist/cli/quality-repair-once.js +5 -4
- package/dist/cli/recall.js +129 -93
- package/dist/cli/refine-llm.d.ts +15 -4
- package/dist/cli/refine-llm.js +16 -7
- package/dist/cli/remember.js +46 -50
- package/dist/cli/scheduler.d.ts +4 -1
- package/dist/cli/scheduler.js +9 -5
- package/dist/cli/serve.js +22 -17
- package/dist/cli/session-hooks.d.ts +2 -2
- package/dist/cli/session-hooks.js +87 -50
- package/dist/cli/setup.js +54 -32
- package/dist/cli/shared.d.ts +3 -1
- package/dist/cli/shared.js +24 -9
- package/dist/cli/slack.js +15 -24
- package/dist/cli/sleep-render.d.ts +3 -1
- package/dist/cli/sleep-render.js +8 -5
- package/dist/cli/sleep.js +14 -6
- package/dist/cli/status.d.ts +4 -4
- package/dist/cli/status.js +32 -27
- package/dist/cli/stdin.d.ts +10 -3
- package/dist/cli/stdin.js +10 -3
- package/dist/cli/transfer.d.ts +1 -1
- package/dist/cli/transfer.js +71 -75
- package/dist/cli/verbs/memory.js +8 -6
- package/dist/cli/verbs/objects.js +10 -4
- package/dist/cli/versioned-verbs.d.ts +8 -7
- package/dist/cli/versioned-verbs.js +31 -21
- package/dist/cli.js +13 -16
- package/dist/connectors/dlq.d.ts +6 -6
- package/dist/connectors/dlq.js +12 -8
- package/dist/connectors/github/backfill.d.ts +4 -4
- package/dist/connectors/github/backfill.js +6 -4
- package/dist/connectors/github/deletion.d.ts +6 -4
- package/dist/connectors/github/deletion.js +5 -5
- package/dist/connectors/github/dlq.d.ts +8 -6
- package/dist/connectors/github/dlq.js +11 -5
- package/dist/connectors/github/ingest.d.ts +2 -2
- package/dist/connectors/github/ingest.js +9 -6
- package/dist/connectors/github/octokit-client.d.ts +3 -1
- package/dist/connectors/github/octokit-client.js +7 -2
- package/dist/connectors/github/ratelimit.d.ts +6 -2
- package/dist/connectors/github/ratelimit.js +6 -2
- package/dist/connectors/github/signature.d.ts +14 -3
- package/dist/connectors/github/signature.js +17 -3
- package/dist/connectors/github/tenant-routing.d.ts +6 -4
- package/dist/connectors/github/tenant-routing.js +6 -6
- package/dist/connectors/github/transform.js +50 -67
- package/dist/connectors/github/types.d.ts +10 -3
- package/dist/connectors/github/types.js +6 -2
- package/dist/connectors/github/webhook.d.ts +5 -5
- package/dist/connectors/github/webhook.js +34 -23
- package/dist/connectors/ingest.d.ts +5 -3
- package/dist/connectors/ingest.js +3 -4
- package/dist/connectors/slack/backfill.d.ts +5 -5
- package/dist/connectors/slack/backfill.js +3 -3
- package/dist/connectors/slack/deletion.d.ts +4 -4
- package/dist/connectors/slack/deletion.js +6 -6
- package/dist/connectors/slack/dlq.d.ts +4 -4
- package/dist/connectors/slack/dlq.js +6 -6
- package/dist/connectors/slack/ingest.d.ts +6 -4
- package/dist/connectors/slack/ingest.js +5 -5
- package/dist/connectors/slack/signature.d.ts +4 -1
- package/dist/connectors/slack/tenant-routing.d.ts +6 -4
- package/dist/connectors/slack/tenant-routing.js +6 -6
- package/dist/connectors/slack/transform.d.ts +6 -2
- package/dist/connectors/slack/transform.js +6 -2
- package/dist/connectors/slack/types.d.ts +3 -1
- package/dist/connectors/slack/web-client.js +8 -3
- package/dist/connectors/slack/webhook.d.ts +5 -5
- package/dist/connectors/slack/webhook.js +19 -11
- package/dist/connectors/slack/workspaces.d.ts +7 -3
- package/dist/connectors/slack/workspaces.js +7 -3
- package/dist/connectors/store.d.ts +8 -0
- package/dist/connectors/store.js +2 -0
- package/dist/consolidate/conflicts.js +23 -9
- package/dist/consolidate/dag-summary.js +2 -1
- package/dist/consolidate/dag.d.ts +10 -5
- package/dist/consolidate/dag.js +37 -36
- package/dist/consolidate/decay.js +19 -6
- package/dist/consolidate/dedupe.d.ts +14 -5
- package/dist/consolidate/dedupe.js +27 -16
- package/dist/consolidate/flush-units.d.ts +4 -1
- package/dist/consolidate/flush-units.js +4 -1
- package/dist/consolidate/half-life-migration.d.ts +18 -8
- package/dist/consolidate/half-life-migration.js +48 -18
- package/dist/consolidate/llm-passes.js +27 -11
- package/dist/consolidate/memory-value-weights.d.ts +6 -2
- package/dist/consolidate/memory-value-weights.js +6 -2
- package/dist/consolidate/memory-value.d.ts +30 -10
- package/dist/consolidate/memory-value.js +36 -13
- package/dist/consolidate/merge.d.ts +4 -1
- package/dist/consolidate/merge.js +42 -32
- package/dist/consolidate/overlap-index.d.ts +8 -2
- package/dist/consolidate/overlap-index.js +11 -4
- package/dist/consolidate/physics-pass.d.ts +3 -1
- package/dist/consolidate/physics-pass.js +10 -7
- package/dist/consolidate/replay.d.ts +11 -4
- package/dist/consolidate/replay.js +19 -7
- package/dist/consolidate/run.d.ts +13 -5
- package/dist/consolidate/run.js +4 -4
- package/dist/consolidate/sleep.d.ts +14 -6
- package/dist/consolidate/sleep.js +41 -38
- package/dist/consolidate/trace.d.ts +7 -2
- package/dist/consolidate/trace.js +7 -2
- package/dist/consolidate/traces.js +26 -29
- package/dist/core/ablation.d.ts +9 -3
- package/dist/core/ablation.js +14 -4
- package/dist/core/active-scope.d.ts +3 -1
- package/dist/core/active-scope.js +3 -1
- package/dist/core/agent-memory-tools.d.ts +2 -0
- package/dist/core/agent-memory-tools.js +2 -0
- package/dist/core/ambient.d.ts +4 -3
- package/dist/core/ambient.js +8 -6
- package/dist/core/api-errors.d.ts +9 -3
- package/dist/core/api-errors.js +9 -3
- package/dist/core/capture-contract.d.ts +4 -1
- package/dist/core/capture-contract.js +27 -8
- package/dist/core/compare.d.ts +24 -8
- package/dist/core/compare.js +24 -8
- package/dist/core/config.d.ts +18 -9
- package/dist/core/config.js +24 -14
- package/dist/core/cosine.d.ts +4 -1
- package/dist/core/cosine.js +4 -1
- package/dist/core/handoff.d.ts +7 -2
- package/dist/core/handoff.js +4 -1
- package/dist/core/markdown.js +21 -16
- package/dist/core/memory-audit.js +14 -3
- package/dist/core/memory-quality.d.ts +12 -3
- package/dist/core/memory-quality.js +57 -21
- package/dist/core/memory.d.ts +84 -27
- package/dist/core/memory.js +73 -29
- package/dist/core/merged-row.d.ts +8 -2
- package/dist/core/merged-row.js +10 -3
- package/dist/core/package-root.d.ts +3 -1
- package/dist/core/package-root.js +3 -1
- package/dist/core/particle-refresh.d.ts +8 -0
- package/dist/core/particle-refresh.js +22 -0
- package/dist/core/physics-config.d.ts +4 -1
- package/dist/core/physics-config.js +6 -2
- package/dist/core/physics.d.ts +37 -11
- package/dist/core/physics.js +55 -20
- package/dist/core/project-identity.d.ts +34 -17
- package/dist/core/project-identity.js +33 -17
- package/dist/core/project-remote.d.ts +8 -4
- package/dist/core/project-remote.js +31 -14
- package/dist/core/recall-scope.d.ts +33 -11
- package/dist/core/recall-scope.js +42 -15
- package/dist/core/rejection-digest.d.ts +7 -0
- package/dist/core/rejection-digest.js +13 -0
- package/dist/core/salience.d.ts +3 -1
- package/dist/core/salience.js +10 -4
- package/dist/core/search-types.d.ts +15 -2
- package/dist/core/search-types.js +11 -0
- package/dist/dashboard/dashboard-actions.js +13 -2
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
- package/dist/dashboard/dashboard-snapshot.js +4 -4
- package/dist/dashboard/dashboard.js +6 -3
- package/dist/db/backup.js +2 -2
- package/dist/db/busy.d.ts +10 -3
- package/dist/db/busy.js +27 -5
- package/dist/db/connect.d.ts +10 -3
- package/dist/db/connect.js +8 -3
- package/dist/db/continuity.d.ts +1 -1
- package/dist/db/continuity.js +27 -11
- package/dist/db/meta.d.ts +4 -1
- package/dist/db/meta.js +4 -1
- package/dist/db/migrate.d.ts +10 -5
- package/dist/db/migrate.js +26 -13
- 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 -1
- package/dist/db/migrations/v12.js +2 -1
- package/dist/db/migrations/v14.js +2 -1
- package/dist/db/migrations/v15.js +4 -2
- package/dist/db/migrations/v16.js +6 -3
- package/dist/db/migrations/v17.js +2 -1
- package/dist/db/migrations/v19.js +4 -2
- package/dist/db/migrations/v20.js +2 -1
- package/dist/db/migrations/v22.js +12 -6
- package/dist/db/migrations/v23.js +6 -3
- package/dist/db/migrations/v24.js +6 -3
- package/dist/db/migrations/v25.js +4 -2
- package/dist/db/migrations/v26.js +4 -2
- package/dist/db/migrations/v27.js +6 -3
- package/dist/db/migrations/v28.js +4 -2
- package/dist/db/migrations/v29.js +4 -2
- package/dist/db/migrations/v30.js +6 -3
- package/dist/db/migrations/v31.js +4 -2
- package/dist/db/migrations/v32.js +6 -3
- package/dist/db/migrations/v33.js +4 -2
- package/dist/db/migrations/v34.js +2 -1
- package/dist/db/migrations/v35.js +2 -1
- package/dist/db/migrations/v36.js +2 -1
- package/dist/db/migrations/v37.js +10 -5
- package/dist/db/migrations/v38.js +10 -5
- package/dist/db/migrations/v39.js +14 -6
- package/dist/db/migrations/v40.js +4 -2
- package/dist/db/migrations/v41.js +4 -2
- package/dist/db/migrations/v42.js +2 -1
- package/dist/db/migrations/v44.js +4 -2
- package/dist/db/migrations/v45.js +4 -2
- package/dist/db/migrations/v49.js +2 -1
- package/dist/db/migrations/v50.js +4 -2
- package/dist/db/migrations/v51.js +4 -2
- package/dist/db/migrations/v52.js +2 -1
- package/dist/db/migrations/v53.js +8 -4
- package/dist/db/migrations/v54.js +2 -1
- package/dist/db/migrations/v55.js +4 -2
- package/dist/db/migrations/v56.d.ts +3 -0
- package/dist/db/migrations/v56.js +28 -0
- package/dist/db/open.d.ts +24 -12
- package/dist/db/open.js +25 -13
- package/dist/db/physics-state.d.ts +8 -4
- package/dist/db/physics-state.js +13 -20
- package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
- package/dist/db/raw-archive-mirror-cleanup.js +6 -4
- package/dist/db/request-stores.d.ts +19 -5
- package/dist/db/request-stores.js +14 -5
- package/dist/db/tables.d.ts +2 -1
- package/dist/db/tables.js +12 -4
- package/dist/db/vector-store.d.ts +13 -4
- package/dist/db/vector-store.js +34 -14
- package/dist/db/wal-checkpointer.d.ts +2 -1
- package/dist/db/wal-checkpointer.js +19 -7
- package/dist/doctor.d.ts +4 -1
- package/dist/doctor.js +121 -39
- package/dist/embeddings/local.d.ts +8 -4
- package/dist/embeddings/local.js +9 -5
- package/dist/embeddings/provider.d.ts +19 -10
- package/dist/embeddings/provider.js +31 -17
- package/dist/embeddings/transformers.d.ts +16 -4
- package/dist/embeddings/transformers.js +32 -15
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.js +2 -1
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +1 -1
- package/dist/entry/sqlite-handles.d.ts +10 -0
- package/dist/entry/sqlite-handles.js +9 -0
- package/dist/entry/store-kit.d.ts +19 -6
- package/dist/entry/store-kit.js +6 -4
- package/dist/eval/eval-stats.d.ts +27 -8
- package/dist/eval/eval-stats.js +17 -5
- package/dist/eval/eval-suite.d.ts +3 -1
- package/dist/eval/eval-suite.js +409 -187
- package/dist/eval/eval.d.ts +8 -2
- package/dist/eval/eval.js +8 -2
- package/dist/eval/judgment.js +16 -6
- package/dist/graph/delta.d.ts +9 -42
- package/dist/graph/delta.js +17 -11
- package/dist/graph/extract.d.ts +10 -7
- package/dist/graph/extract.js +57 -25
- package/dist/graph/recall.d.ts +12 -4
- package/dist/graph/recall.js +30 -13
- package/dist/graph/stream.d.ts +18 -6
- package/dist/graph/stream.js +32 -10
- package/dist/graph/view.d.ts +19 -6
- package/dist/graph/view.js +42 -17
- package/dist/hooks/codex-session.js +2 -2
- package/dist/hooks/codex-wrapper.d.ts +3 -1
- package/dist/hooks/codex-wrapper.js +9 -4
- package/dist/hooks/copilot.d.ts +19 -5
- package/dist/hooks/copilot.js +54 -15
- package/dist/hooks/hook-blocks.d.ts +4 -1
- package/dist/hooks/hook-blocks.js +8 -3
- package/dist/hooks/json-hooks.d.ts +9 -5
- package/dist/hooks/json-hooks.js +69 -34
- package/dist/hooks/opencode.js +15 -5
- package/dist/hooks/shared.d.ts +27 -8
- package/dist/hooks/shared.js +57 -16
- package/dist/importers/core.d.ts +12 -4
- package/dist/importers/core.js +8 -7
- package/dist/importers/markdown-parse.d.ts +15 -5
- package/dist/importers/markdown-parse.js +16 -7
- package/dist/importers/markdown.js +6 -9
- package/dist/importers/sources.js +10 -23
- package/dist/importers/vault.d.ts +2 -2
- package/dist/importers/vault.js +43 -27
- package/dist/index.d.ts +32 -6
- package/dist/index.js +25 -7
- package/dist/learn/autolearn.d.ts +17 -6
- package/dist/learn/autolearn.js +53 -24
- package/dist/learn/churn-git.d.ts +4 -1
- package/dist/learn/churn-git.js +29 -5
- package/dist/learn/extract.d.ts +4 -1
- package/dist/learn/extract.js +16 -9
- package/dist/learn/forward-claim-detector.d.ts +17 -5
- package/dist/learn/forward-claim-detector.js +34 -15
- package/dist/learn/invalidation.d.ts +12 -7
- package/dist/learn/invalidation.js +56 -27
- package/dist/learn/roots.d.ts +3 -0
- package/dist/learn/roots.js +5 -0
- package/dist/mcp/admin-tools.d.ts +5 -5
- package/dist/mcp/admin-tools.js +28 -23
- package/dist/mcp/format.d.ts +1 -1
- package/dist/mcp/format.js +4 -2
- package/dist/mcp/framing.d.ts +3 -1
- package/dist/mcp/framing.js +20 -8
- package/dist/mcp/memory-tools.d.ts +3 -3
- package/dist/mcp/memory-tools.js +18 -14
- package/dist/mcp/protocol.d.ts +32 -16
- package/dist/mcp/protocol.js +12 -9
- package/dist/mcp/recall-tools.d.ts +3 -3
- package/dist/mcp/recall-tools.js +62 -74
- package/dist/mcp/request.d.ts +7 -5
- package/dist/mcp/request.js +57 -74
- package/dist/mcp/server.d.ts +3 -1
- package/dist/mcp/server.js +8 -3
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +4 -3
- package/dist/mcp/shared-gate.d.ts +3 -2
- package/dist/mcp/shared-gate.js +3 -2
- package/dist/mcp/stdio.d.ts +6 -3
- package/dist/mcp/stdio.js +52 -21
- package/dist/mcp/tool-args.d.ts +4 -1
- package/dist/mcp/tool-args.js +8 -3
- package/dist/mcp/tools.js +76 -32
- package/dist/objects/customer-notes.d.ts +12 -10
- package/dist/objects/customer-notes.js +21 -15
- package/dist/objects/decisions.d.ts +18 -10
- package/dist/objects/decisions.js +23 -17
- package/dist/objects/descriptor.js +2 -1
- package/dist/objects/fields.d.ts +4 -1
- package/dist/objects/fields.js +6 -2
- package/dist/objects/incidents.d.ts +14 -16
- package/dist/objects/incidents.js +29 -30
- package/dist/objects/lifecycle.d.ts +0 -4
- package/dist/objects/lifecycle.js +21 -24
- package/dist/objects/policies.d.ts +12 -16
- package/dist/objects/policies.js +17 -21
- package/dist/objects/processes.d.ts +16 -10
- package/dist/objects/processes.js +20 -15
- package/dist/objects/project-briefs.d.ts +13 -14
- package/dist/objects/project-briefs.js +33 -39
- package/dist/objects/skills.d.ts +10 -12
- package/dist/objects/skills.js +17 -22
- package/dist/postinstall.js +15 -7
- package/dist/predictions/planning-fallacy.d.ts +19 -6
- package/dist/predictions/planning-fallacy.js +4 -2
- package/dist/rerankers/clef.d.ts +8 -2
- package/dist/rerankers/clef.js +14 -9
- package/dist/rerankers/cross-encoder.d.ts +2 -1
- package/dist/rerankers/cross-encoder.js +9 -6
- package/dist/rerankers/index.js +2 -1
- package/dist/rerankers/jev.js +2 -1
- package/dist/rerankers/llm.d.ts +6 -2
- package/dist/rerankers/llm.js +8 -3
- package/dist/rerankers/remote.d.ts +3 -1
- package/dist/rerankers/remote.js +5 -2
- package/dist/rerankers/types.d.ts +6 -2
- package/dist/search/bm25-search.d.ts +3 -1
- package/dist/search/bm25-search.js +15 -2
- package/dist/search/boosts.js +4 -3
- package/dist/search/embed-memories.d.ts +10 -5
- package/dist/search/embed-memories.js +62 -36
- package/dist/search/engine.d.ts +4 -1
- package/dist/search/engine.js +6 -2
- package/dist/search/goal-boost.d.ts +10 -3
- package/dist/search/goal-boost.js +13 -6
- package/dist/search/hybrid-score.d.ts +4 -1
- package/dist/search/hybrid-score.js +4 -1
- package/dist/search/hybrid.d.ts +23 -8
- package/dist/search/hybrid.js +12 -7
- package/dist/search/multihop.js +14 -13
- package/dist/search/path-context.d.ts +10 -3
- package/dist/search/path-context.js +10 -3
- package/dist/search/physics-search.d.ts +9 -4
- package/dist/search/physics-search.js +38 -14
- package/dist/search/rerank.d.ts +2 -1
- package/dist/search/rerank.js +2 -1
- package/dist/search/rrf.d.ts +14 -5
- package/dist/search/rrf.js +11 -4
- package/dist/search/vector.d.ts +8 -2
- package/dist/search/vector.js +9 -3
- package/dist/server/auth.d.ts +18 -14
- package/dist/server/auth.js +69 -38
- package/dist/server/boot.d.ts +3 -1
- package/dist/server/boot.js +95 -56
- package/dist/server/client-ip.d.ts +11 -4
- package/dist/server/client-ip.js +27 -10
- package/dist/server/cursor.d.ts +10 -3
- package/dist/server/cursor.js +10 -3
- package/dist/server/deadline.d.ts +5 -2
- package/dist/server/deadline.js +10 -3
- package/dist/server/key-check-bounds.js +12 -4
- package/dist/server/lifecycle.d.ts +4 -1
- package/dist/server/lifecycle.js +10 -4
- package/dist/server/mcp-http.d.ts +2 -1
- package/dist/server/mcp-http.js +37 -22
- package/dist/server/rate-limit.d.ts +17 -5
- package/dist/server/rate-limit.js +55 -26
- package/dist/server/ready.js +7 -4
- package/dist/server/request.d.ts +15 -4
- package/dist/server/request.js +42 -15
- package/dist/server/route-checks.d.ts +4 -1
- package/dist/server/route-checks.js +8 -3
- package/dist/server/route-table.d.ts +8 -6
- package/dist/server/route-table.js +547 -93
- package/dist/server/routes/admin.d.ts +7 -7
- package/dist/server/routes/admin.js +36 -15
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +5 -4
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +12 -6
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +10 -4
- package/dist/server/routes/memories.d.ts +8 -8
- package/dist/server/routes/memories.js +12 -19
- package/dist/server/routes/object-routes.d.ts +8 -5
- package/dist/server/routes/object-routes.js +4 -2
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +11 -4
- package/dist/server/routes/predictions.d.ts +5 -5
- package/dist/server/routes/predictions.js +9 -4
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +15 -6
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +3 -2
- package/dist/server/routes/recall.d.ts +3 -3
- package/dist/server/routes/recall.js +21 -10
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +12 -4
- package/dist/server/server-detect.d.ts +24 -8
- package/dist/server/server-detect.js +57 -22
- package/dist/server/sleep-child.js +16 -10
- package/dist/server/sleep-offload.d.ts +8 -5
- package/dist/server/sleep-offload.js +41 -19
- package/dist/server/tls.d.ts +4 -1
- package/dist/server/tls.js +13 -5
- package/dist/server/types.d.ts +38 -26
- package/dist/server/validation.d.ts +4 -1
- package/dist/server/validation.js +22 -9
- package/dist/server.d.ts +15 -10
- package/dist/server.js +32 -12
- package/dist/sharing/global-store.d.ts +5 -10
- package/dist/sharing/global-store.js +8 -43
- package/dist/sharing/global-sync.d.ts +3 -1
- package/dist/sharing/global-sync.js +16 -6
- package/dist/sharing/project-merge.d.ts +25 -7
- package/dist/sharing/project-merge.js +49 -17
- package/dist/sharing/search-both.d.ts +8 -4
- package/dist/sharing/search-both.js +19 -12
- package/dist/sharing/share.d.ts +8 -4
- package/dist/sharing/share.js +39 -15
- package/dist/store/ambient.js +9 -5
- package/dist/store/audit-event.d.ts +2 -2
- package/dist/store/audit-event.js +8 -3
- package/dist/store/audit.d.ts +6 -3
- package/dist/store/audit.js +16 -6
- package/dist/store/auth.d.ts +4 -2
- package/dist/store/auth.js +63 -20
- package/dist/store/busy.d.ts +9 -0
- package/dist/store/busy.js +16 -0
- package/dist/store/candidates.d.ts +12 -5
- package/dist/store/candidates.js +75 -36
- package/dist/store/capture-write.d.ts +2 -1
- package/dist/store/capture-write.js +2 -1
- package/dist/store/card-detail.d.ts +4 -4
- package/dist/store/card-detail.js +15 -8
- package/dist/store/cards.d.ts +24 -10
- package/dist/store/cards.js +93 -60
- package/dist/store/compaction-caller.d.ts +2 -1
- package/dist/store/compaction-caller.js +2 -1
- package/dist/store/compactions-record.d.ts +14 -8
- package/dist/store/compactions-record.js +95 -32
- package/dist/store/compactions.js +35 -15
- package/dist/store/conflicts.d.ts +9 -4
- package/dist/store/conflicts.js +100 -45
- package/dist/store/connectors/dlq.d.ts +17 -5
- package/dist/store/connectors/dlq.js +56 -5
- package/dist/store/connectors/event-log.d.ts +111 -2
- package/dist/store/connectors/event-log.js +2 -1
- package/dist/store/connectors/github.d.ts +6 -3
- package/dist/store/connectors/github.js +24 -40
- package/dist/store/connectors/slack.d.ts +2 -1
- package/dist/store/connectors/slack.js +25 -37
- package/dist/store/dashboard-reads.d.ts +7 -3
- package/dist/store/dashboard-reads.js +32 -11
- package/dist/store/delete-and-batch.d.ts +17 -11
- package/dist/store/delete-and-batch.js +67 -26
- package/dist/store/delivery-recorder.d.ts +8 -5
- package/dist/store/delivery-recorder.js +70 -32
- package/dist/store/descendant-page.d.ts +2 -1
- package/dist/store/descendant-page.js +24 -9
- package/dist/store/diagnostics.d.ts +2 -1
- package/dist/store/diagnostics.js +2 -1
- package/dist/store/doctor-reads.d.ts +2 -1
- package/dist/store/doctor-reads.js +13 -5
- package/dist/store/dormant.d.ts +19 -11
- package/dist/store/dormant.js +40 -18
- package/dist/store/embeddings/index.d.ts +13 -9
- package/dist/store/embeddings/index.js +19 -12
- package/dist/store/entry-reads.d.ts +49 -20
- package/dist/store/entry-reads.js +181 -66
- package/dist/store/entry-row.d.ts +10 -6
- package/dist/store/entry-row.js +17 -12
- package/dist/store/entry-writes.d.ts +22 -10
- package/dist/store/entry-writes.js +41 -14
- package/dist/store/failure-log-at.js +1 -1
- package/dist/store/failure-log.d.ts +4 -2
- package/dist/store/failure-log.js +13 -6
- package/dist/store/gated-write.d.ts +3 -3
- package/dist/store/gated-write.js +3 -3
- package/dist/store/goals.d.ts +5 -4
- package/dist/store/goals.js +8 -10
- package/dist/store/graph-apply.d.ts +21 -0
- package/dist/{graph/write.js → store/graph-apply.js} +31 -11
- package/dist/store/graph-queue.d.ts +9 -6
- package/dist/store/graph-queue.js +15 -10
- package/dist/store/graph-reads.d.ts +16 -11
- package/dist/store/graph-reads.js +24 -15
- package/dist/store/graph-rows.d.ts +41 -3
- package/dist/store/graph-rows.js +10 -7
- package/dist/store/graph-view-rows.js +14 -7
- package/dist/store/graph-writes.d.ts +16 -10
- package/dist/store/graph-writes.js +59 -36
- package/dist/store/handoffs.d.ts +4 -4
- package/dist/store/handoffs.js +40 -19
- package/dist/store/index-and-stats.d.ts +2 -2
- package/dist/store/index-and-stats.js +6 -5
- package/dist/store/index.d.ts +3 -1
- package/dist/store/index.js +1 -0
- package/dist/store/key-audit.d.ts +2 -1
- package/dist/store/key-audit.js +2 -1
- package/dist/store/key-writes.d.ts +2 -1
- package/dist/store/key-writes.js +9 -2
- package/dist/store/ledger-turn.d.ts +4 -1
- package/dist/store/ledger-turn.js +7 -2
- package/dist/store/mirrors.d.ts +11 -4
- package/dist/store/mirrors.js +88 -16
- package/dist/store/narrow.d.ts +6 -0
- package/dist/store/narrow.js +11 -0
- package/dist/store/open.d.ts +4 -2
- package/dist/store/open.js +18 -9
- package/dist/store/pilot-arm.d.ts +2 -1
- package/dist/store/pilot-arm.js +18 -6
- package/dist/store/planning-fallacy-evidence.d.ts +2 -2
- package/dist/store/planning-fallacy-evidence.js +8 -5
- package/dist/store/port/agent-import.d.ts +62 -0
- package/dist/store/port/agent-import.js +2 -0
- package/dist/store/port/consolidation.d.ts +129 -0
- package/dist/store/port/consolidation.js +2 -0
- package/dist/store/port/learning.d.ts +19 -0
- package/dist/store/port/learning.js +2 -0
- package/dist/store/port/local-files.d.ts +18 -0
- package/dist/store/port/local-files.js +2 -0
- package/dist/store/port/promotion.d.ts +20 -0
- package/dist/store/port/promotion.js +3 -0
- package/dist/store/port-groups.d.ts +160 -0
- package/dist/store/port-groups.js +2 -0
- package/dist/store/port.d.ts +215 -229
- package/dist/store/port.js +3 -9
- package/dist/store/predictions.d.ts +14 -10
- package/dist/store/predictions.js +37 -17
- package/dist/store/project-tags.d.ts +4 -1
- package/dist/store/project-tags.js +16 -5
- package/dist/store/quality-repair.d.ts +8 -4
- package/dist/store/quality-repair.js +53 -20
- package/dist/store/quarantine.d.ts +1 -0
- package/dist/store/quarantine.js +23 -9
- package/dist/store/raw-archive.d.ts +5 -4
- package/dist/store/raw-archive.js +11 -10
- package/dist/store/recall-trace.d.ts +22 -17
- package/dist/store/recall-trace.js +126 -63
- package/dist/store/rejected-values.d.ts +15 -10
- package/dist/store/rejected-values.js +33 -12
- package/dist/store/rejection.d.ts +12 -11
- package/dist/store/rejection.js +18 -19
- package/dist/store/report-reads.d.ts +2 -1
- package/dist/store/report-reads.js +2 -1
- package/dist/store/rows.d.ts +7 -5
- package/dist/store/rows.js +18 -11
- package/dist/store/rule-sql.d.ts +6 -4
- package/dist/store/rule-sql.js +16 -9
- package/dist/store/search-rows.d.ts +14 -9
- package/dist/store/search-rows.js +48 -23
- package/dist/store/sessions.d.ts +12 -10
- package/dist/store/sessions.js +40 -21
- package/dist/store/set-aside.d.ts +2 -2
- package/dist/store/set-aside.js +18 -5
- package/dist/store/sqlite/agent-import.d.ts +3 -0
- package/dist/store/sqlite/agent-import.js +77 -0
- package/dist/store/sqlite/cards-group.d.ts +6 -0
- package/dist/store/sqlite/cards-group.js +37 -0
- package/dist/store/sqlite/conflicts-group.d.ts +6 -0
- package/dist/store/sqlite/conflicts-group.js +18 -0
- package/dist/store/sqlite/connector-events-group.d.ts +2 -1
- package/dist/store/sqlite/connector-events-group.js +17 -6
- package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
- package/dist/store/sqlite/connector-writes-group.js +9 -4
- package/dist/store/sqlite/consolidation-group.d.ts +4 -0
- package/dist/store/sqlite/consolidation-group.js +64 -0
- package/dist/store/sqlite/dag-reads-group.js +1 -1
- package/dist/store/sqlite/dormant-group.d.ts +6 -0
- package/dist/store/sqlite/dormant-group.js +29 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +6 -3
- package/dist/store/sqlite/entry-writes-group.js +37 -14
- package/dist/store/sqlite/error-codec.d.ts +4 -2
- package/dist/store/sqlite/error-codec.js +32 -10
- package/dist/store/sqlite/executor-counts.js +2 -1
- package/dist/store/sqlite/executor.d.ts +8 -3
- package/dist/store/sqlite/executor.js +56 -18
- package/dist/store/sqlite/global-promote.d.ts +5 -0
- package/dist/store/sqlite/global-promote.js +48 -0
- package/dist/store/sqlite/goals-group.d.ts +6 -0
- package/dist/store/sqlite/goals-group.js +23 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
- package/dist/store/sqlite/graph-reads-group.js +2 -1
- package/dist/store/sqlite/held-connection.d.ts +7 -1
- package/dist/store/sqlite/held-connection.js +34 -7
- package/dist/store/sqlite/last-recall-group.d.ts +4 -2
- package/dist/store/sqlite/last-recall-group.js +9 -4
- package/dist/store/sqlite/learning-group.d.ts +4 -0
- package/dist/store/sqlite/learning-group.js +17 -0
- package/dist/store/sqlite/maintenance-groups.js +2 -1
- package/dist/store/sqlite/object-rows.d.ts +6 -3
- package/dist/store/sqlite/object-rows.js +34 -5
- package/dist/store/sqlite/objects-group.d.ts +5 -4
- package/dist/store/sqlite/objects-group.js +84 -33
- package/dist/store/sqlite/predictions-group.d.ts +2 -1
- package/dist/store/sqlite/predictions-group.js +4 -2
- package/dist/store/sqlite/promotion-group.d.ts +3 -0
- package/dist/store/sqlite/promotion-group.js +10 -0
- package/dist/store/sqlite/quarantine-group.d.ts +2 -1
- package/dist/store/sqlite/quarantine-group.js +4 -2
- package/dist/store/sqlite/reports-group.d.ts +6 -0
- package/dist/store/sqlite/reports-group.js +33 -0
- package/dist/store/sqlite/request-scope.d.ts +6 -0
- package/dist/store/sqlite/request-scope.js +18 -0
- package/dist/store/sqlite/sessions-group.d.ts +6 -0
- package/dist/store/sqlite/sessions-group.js +46 -0
- package/dist/store/sqlite/store.d.ts +22 -11
- package/dist/store/sqlite/store.js +84 -11
- package/dist/store/sqlite/vector-pack.js +2 -1
- package/dist/store/sqlite/vector-reads-group.js +2 -1
- package/dist/store/sqlite/worker-jobs.d.ts +2 -1
- package/dist/store/sqlite/worker-jobs.js +19 -7
- package/dist/store/sqlite/worker-ops.d.ts +10 -5
- package/dist/store/sqlite/worker-ops.js +6 -3
- package/dist/store/sqlite/worker-store.d.ts +4 -3
- package/dist/store/sqlite/worker-store.js +24 -14
- package/dist/store/summaries.d.ts +19 -12
- package/dist/store/summaries.js +36 -21
- package/dist/store/summary-dirty.d.ts +2 -1
- package/dist/store/summary-dirty.js +2 -1
- package/dist/store/tenant.d.ts +3 -2
- package/dist/store/tenant.js +5 -4
- package/dist/store/token-ledger-rows.js +6 -3
- package/dist/store/token-ledger.d.ts +19 -13
- package/dist/store/token-ledger.js +27 -14
- package/dist/store/tombstone-checks.d.ts +4 -1
- package/dist/store/tombstone-checks.js +10 -1
- package/dist/store/usage-reports.js +2 -1
- package/dist/store/vector-index.d.ts +8 -5
- package/dist/store/vector-index.js +24 -10
- package/dist/store/working-memory.d.ts +6 -4
- package/dist/store/working-memory.js +14 -9
- package/dist/support-bundle.js +10 -5
- package/dist/trust/quarantine.d.ts +1 -2
- package/dist/trust/quarantine.js +1 -5
- package/dist/trust/reject-flow.d.ts +12 -3
- package/dist/trust/reject-flow.js +12 -4
- package/dist/util/anthropic-messages.d.ts +4 -1
- package/dist/util/anthropic-messages.js +14 -5
- package/dist/util/atomic-write.d.ts +4 -2
- package/dist/util/atomic-write.js +25 -14
- package/dist/util/compaction-items.d.ts +4 -1
- package/dist/util/compaction-items.js +8 -2
- package/dist/util/crash-handlers.d.ts +7 -2
- package/dist/util/crash-handlers.js +13 -4
- package/dist/util/env.d.ts +16 -4
- package/dist/util/env.js +78 -25
- package/dist/util/home-path.js +12 -6
- package/dist/util/hook-payload.d.ts +3 -1
- package/dist/util/hook-payload.js +3 -1
- package/dist/util/http-retry.d.ts +12 -6
- package/dist/util/http-retry.js +16 -6
- package/dist/util/http-util.d.ts +20 -5
- package/dist/util/http-util.js +28 -9
- package/dist/util/json.d.ts +4 -1
- package/dist/util/json.js +4 -1
- package/dist/util/keyset.js +2 -1
- package/dist/util/limits.js +4 -2
- package/dist/util/log.d.ts +13 -5
- package/dist/util/log.js +29 -6
- package/dist/util/net.d.ts +5 -0
- package/dist/util/net.js +19 -0
- package/dist/util/real-path.d.ts +2 -1
- package/dist/util/real-path.js +4 -3
- package/dist/util/request-scope.d.ts +11 -3
- package/dist/util/request-scope.js +13 -4
- package/dist/util/same-text.d.ts +10 -3
- package/dist/util/same-text.js +10 -3
- package/dist/util/secret-detect.d.ts +24 -7
- package/dist/util/secret-detect.js +49 -14
- package/dist/util/spawn-argv.d.ts +3 -1
- package/dist/util/spawn-argv.js +13 -4
- package/dist/util/sqlite-blocked.d.ts +15 -4
- package/dist/util/sqlite-blocked.js +19 -6
- package/dist/util/stored-json.d.ts +4 -1
- package/dist/util/stored-json.js +6 -2
- package/dist/util/stream-tee.d.ts +2 -1
- package/dist/util/stream-tee.js +8 -5
- package/dist/util/transcript-tail.d.ts +4 -1
- package/dist/util/transcript-tail.js +4 -1
- package/dist/util/version.d.ts +8 -3
- package/dist/util/version.js +8 -3
- package/dist/util/write-budget.d.ts +7 -2
- package/dist/util/write-budget.js +5 -2
- package/dist/util/yaml.d.ts +4 -1
- package/dist/util/yaml.js +4 -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 -1
- package/scripts/postinstall.cjs +3 -1
- package/dist/api/cards.d.ts +0 -42
- package/dist/api/conflicts.d.ts +0 -28
- package/dist/api/conflicts.js +0 -61
- package/dist/api/dormant.d.ts +0 -14
- package/dist/api/dormant.js +0 -58
- package/dist/api/goals.d.ts +0 -18
- package/dist/api/graph.d.ts +0 -8
- package/dist/api/graph.js +0 -8
- package/dist/api/learn.js +0 -125
- package/dist/api/memories.d.ts +0 -25
- package/dist/api/objects.d.ts +0 -9
- package/dist/api/outcome.d.ts +0 -19
- package/dist/api/predictions.d.ts +0 -11
- package/dist/api/promote.d.ts +0 -36
- package/dist/api/recall-core.d.ts +0 -4
- package/dist/api/recall-core.js +0 -125
- package/dist/api/recall-finish.d.ts +0 -53
- package/dist/api/recall-finish.js +0 -30
- package/dist/api/recall-history.d.ts +0 -64
- package/dist/api/recall-history.js +0 -159
- package/dist/api/recall-record.d.ts +0 -43
- package/dist/api/recall-record.js +0 -78
- package/dist/api/recall-request.js +0 -121
- package/dist/api/recall.d.ts +0 -6
- package/dist/api/refine.d.ts +0 -7
- package/dist/api/refine.js +0 -10
- package/dist/api/session-owners.d.ts +0 -4
- package/dist/api/session-owners.js +0 -17
- package/dist/api/sleep-run.d.ts +0 -26
- package/dist/api/sleep.js +0 -11
- package/dist/graph/write.d.ts +0 -14
- package/dist/store/sqlite/busy.d.ts +0 -3
- package/dist/store/sqlite/busy.js +0 -8
- package/dist/store/sqlite/local.d.ts +0 -4
- package/dist/store/sqlite/local.js +0 -8
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { MemoryEntry } from '../core/memory.js';
|
|
2
|
-
/** Every superseded row, the row that replaced it and that row's extraction source, in loadAllEntries' order: all a
|
|
2
|
+
/** Every superseded row, the row that replaced it and that row's extraction source, in loadAllEntries' order: all a
|
|
3
|
+
* correction-latency report reads. */
|
|
3
4
|
export declare function loadCorrectionEntries(hippoRoot: string): MemoryEntry[];
|
|
4
5
|
/** The kind='raw' rows in loadAllEntries' order: all a provenance-coverage report reads. */
|
|
5
6
|
export declare function loadRawEntries(hippoRoot: string): MemoryEntry[];
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { MEMORY_SELECT_COLUMNS, rowToEntry } from './rows.js';
|
|
2
2
|
import { onHandle, openStore } from './open.js';
|
|
3
|
-
/** Every superseded row, the row that replaced it and that row's extraction source, in loadAllEntries' order: all a
|
|
3
|
+
/** Every superseded row, the row that replaced it and that row's extraction source, in loadAllEntries' order: all a
|
|
4
|
+
* correction-latency report reads. */
|
|
4
5
|
export function loadCorrectionEntries(hippoRoot) {
|
|
5
6
|
return onHandle(hippoRoot, (db) => {
|
|
6
7
|
const superseded = `superseded_by IS NOT NULL AND superseded_by != ''`;
|
package/dist/store/rows.d.ts
CHANGED
|
@@ -137,14 +137,16 @@ export interface SessionEvent {
|
|
|
137
137
|
export declare const INDEX_VERSION = 3;
|
|
138
138
|
export declare const MEMORY_SELECT_COLUMNS: string;
|
|
139
139
|
export declare const MEMORY_SEARCH_COLUMNS: string;
|
|
140
|
-
/** Default candidate-pool size for `loadSearchEntries` when `limit` is undefined; `api.recall` imports it for
|
|
141
|
-
* drift. */
|
|
140
|
+
/** Default candidate-pool size for `loadSearchEntries` when `limit` is undefined; `api.recall` imports it for
|
|
141
|
+
* `RecallResult.windowSize` so the two cannot drift. */
|
|
142
142
|
export declare const DEFAULT_SEARCH_CANDIDATE_LIMIT = 200;
|
|
143
143
|
export declare function rowToEntry(row: MemoryRow): MemoryEntry;
|
|
144
|
-
/** A column that is not JSON reads as empty. With `site` the row is named at warn once; without it no row is known and
|
|
144
|
+
/** A column that is not JSON reads as empty. With `site` the row is named at warn once; without it no row is known and
|
|
145
|
+
* the line stays at debug. */
|
|
145
146
|
export declare function parseJsonArray(raw: string | null | undefined, site?: StoredJsonSite): string[];
|
|
146
|
-
/** Strict parse for `last_trace_id`: Number(raw) turns '' or garbage into 0/NaN (a masked FK violation); require a
|
|
147
|
-
* The ONE place that decides 'clean'; consumers read the validated value
|
|
147
|
+
/** Strict parse for `last_trace_id`: Number(raw) turns '' or garbage into 0/NaN (a masked FK violation); require a
|
|
148
|
+
* clean positive integer string, else unset. The ONE place that decides 'clean'; consumers read the validated value
|
|
149
|
+
* from `buildIndexFromDb`'s result and never re-parse. */
|
|
148
150
|
export declare function parseLastTraceId(raw: string | null | undefined): string | null;
|
|
149
151
|
export declare function rowToTaskSnapshot(row: TaskSnapshotRow): TaskSnapshot;
|
|
150
152
|
export declare function rowToMemoryConflict(row: MemoryConflictRow): MemoryConflict;
|
package/dist/store/rows.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { DEFAULT_TENANT_ID } from '../util/env.js';
|
|
2
|
-
import { FALLBACK_HALF_LIFE_DAYS, DEFAULT_SCHEMA_FIT } from '../core/memory.js';
|
|
3
|
-
import { errorMessage, log } from '../util/log.js';
|
|
2
|
+
import { FALLBACK_HALF_LIFE_DAYS, DEFAULT_SCHEMA_FIT, } from '../core/memory.js';
|
|
3
|
+
import { errorMessage, log, errorFields } from '../util/log.js';
|
|
4
4
|
import { isJsonObject } from '../util/json.js';
|
|
5
5
|
import { warnDamagedColumn } from '../util/stored-json.js';
|
|
6
6
|
export const INDEX_VERSION = 3;
|
|
@@ -18,12 +18,13 @@ export const MEMORY_SEARCH_COLUMNS = [
|
|
|
18
18
|
...MEMORY_COLUMN_NAMES.map((c) => `m.${c} AS ${c}`),
|
|
19
19
|
'bm25(memories_fts) AS bm25_score',
|
|
20
20
|
].join(', ');
|
|
21
|
-
/** Default candidate-pool size for `loadSearchEntries` when `limit` is undefined; `api.recall` imports it for
|
|
22
|
-
* drift. */
|
|
21
|
+
/** Default candidate-pool size for `loadSearchEntries` when `limit` is undefined; `api.recall` imports it for
|
|
22
|
+
* `RecallResult.windowSize` so the two cannot drift. */
|
|
23
23
|
export const DEFAULT_SEARCH_CANDIDATE_LIMIT = 200;
|
|
24
24
|
function rowToRetrievalFields(row) {
|
|
25
|
-
// SAFETY: every `as X` narrows a SQLite column to a MemoryEntry enum/union member; `row` comes from
|
|
26
|
-
// the only queries producing MemoryRow, and the DB layer writes these
|
|
25
|
+
// SAFETY: every `as X` narrows a SQLite column to a MemoryEntry enum/union member; `row` comes from
|
|
26
|
+
// MEMORY_SELECT_COLUMNS / MEMORY_SEARCH_COLUMNS, the only queries producing MemoryRow, and the DB layer writes these
|
|
27
|
+
// columns only from the same enums.
|
|
27
28
|
return {
|
|
28
29
|
id: row.id,
|
|
29
30
|
created: row.created,
|
|
@@ -39,7 +40,11 @@ function rowToRetrievalFields(row) {
|
|
|
39
40
|
outcome_score: row.outcome_score === null || row.outcome_score === undefined ? null : Number(row.outcome_score),
|
|
40
41
|
outcome_positive: Number(row.outcome_positive ?? 0),
|
|
41
42
|
outcome_negative: Number(row.outcome_negative ?? 0),
|
|
42
|
-
conflicts_with: parseJsonArray(row.conflicts_with_json, {
|
|
43
|
+
conflicts_with: parseJsonArray(row.conflicts_with_json, {
|
|
44
|
+
table: 'memories',
|
|
45
|
+
id: row.id,
|
|
46
|
+
column: 'conflicts_with_json',
|
|
47
|
+
}),
|
|
43
48
|
pinned: Boolean(row.pinned),
|
|
44
49
|
confidence: row.confidence ?? 'observed',
|
|
45
50
|
content: row.content,
|
|
@@ -81,7 +86,8 @@ export function rowToEntry(row) {
|
|
|
81
86
|
}
|
|
82
87
|
return entry;
|
|
83
88
|
}
|
|
84
|
-
/** A column that is not JSON reads as empty. With `site` the row is named at warn once; without it no row is known and
|
|
89
|
+
/** A column that is not JSON reads as empty. With `site` the row is named at warn once; without it no row is known and
|
|
90
|
+
* the line stays at debug. */
|
|
85
91
|
export function parseJsonArray(raw, site) {
|
|
86
92
|
if (!raw)
|
|
87
93
|
return [];
|
|
@@ -93,12 +99,13 @@ export function parseJsonArray(raw, site) {
|
|
|
93
99
|
if (site)
|
|
94
100
|
warnDamagedColumn(site, 'not valid JSON');
|
|
95
101
|
else
|
|
96
|
-
log.debug(`store: corrupt JSON array column read as empty: ${errorMessage(err)}
|
|
102
|
+
log.debug(`store: corrupt JSON array column read as empty: ${errorMessage(err)}`, errorFields(err));
|
|
97
103
|
return [];
|
|
98
104
|
}
|
|
99
105
|
}
|
|
100
|
-
/** Strict parse for `last_trace_id`: Number(raw) turns '' or garbage into 0/NaN (a masked FK violation); require a
|
|
101
|
-
* The ONE place that decides 'clean'; consumers read the validated value
|
|
106
|
+
/** Strict parse for `last_trace_id`: Number(raw) turns '' or garbage into 0/NaN (a masked FK violation); require a
|
|
107
|
+
* clean positive integer string, else unset. The ONE place that decides 'clean'; consumers read the validated value
|
|
108
|
+
* from `buildIndexFromDb`'s result and never re-parse. */
|
|
102
109
|
export function parseLastTraceId(raw) {
|
|
103
110
|
const trimmed = (raw ?? '').trim();
|
|
104
111
|
if (!/^\d+$/.test(trimmed) || Number(trimmed) <= 0)
|
package/dist/store/rule-sql.d.ts
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
|
-
/** calculateRewardFactor as SQL over `memories` columns; strengthSql and the context-candidate rank both build on it,
|
|
1
|
+
/** calculateRewardFactor as SQL over `memories` columns; strengthSql and the context-candidate rank both build on it,
|
|
2
|
+
* so the slope has one source. */
|
|
2
3
|
export declare function rewardFactorSql(): string;
|
|
3
|
-
/** calculateStrength's clock-basis formula as SQL over `memories` columns, flags and multipliers baked in; keep in
|
|
4
|
-
*
|
|
4
|
+
/** calculateStrength's clock-basis formula as SQL over `memories` columns, flags and multipliers baked in; keep in
|
|
5
|
+
* step. An unparseable date scores NULL here and 0 in JS, so sums agree. */
|
|
5
6
|
export declare function strengthSql(now: Date): string;
|
|
6
7
|
export declare const AUTO_DELETABLE_SQL: string;
|
|
7
8
|
export interface SqlFragment {
|
|
8
9
|
sql: string;
|
|
9
10
|
params: string[];
|
|
10
11
|
}
|
|
11
|
-
/** SQL twin of the no-request arm of passesScopeFilterForRecall; `ownScope` is bound and compared with `=`, so `%` or
|
|
12
|
+
/** SQL twin of the no-request arm of passesScopeFilterForRecall; `ownScope` is bound and compared with `=`, so `%` or
|
|
13
|
+
* `_` in an owner match nothing extra. */
|
|
12
14
|
export declare function scopeAdmitSql(col: '' | 'm.', ownScope?: string | null): SqlFragment;
|
|
13
15
|
/** SQL twin of canTouchScope, which is also canReadScope for an admin: every row but
|
|
14
16
|
* another person's personal one. LIKE folds ASCII case as isPersonalScope's /i does. */
|
package/dist/store/rule-sql.js
CHANGED
|
@@ -1,20 +1,23 @@
|
|
|
1
|
-
// The SQL twins of the model's rules in src/core: strength and keep (memory.ts), recall scope (recall-scope.ts); keep
|
|
1
|
+
// The SQL twins of the model's rules in src/core: strength and keep (memory.ts), recall scope (recall-scope.ts); keep
|
|
2
|
+
// each in step with its JS half.
|
|
2
3
|
import { DAY_MS } from '../util/time.js';
|
|
3
4
|
import { isDecayAblated, isOutcomeSlowAblated, isRecallBoostAblated } from '../core/ablation.js';
|
|
4
5
|
import { DECAY_BASE, EMOTIONAL_MULTIPLIERS, FALLBACK_HALF_LIFE_DAYS, KEEP_PAIRS, MAX_WRONG_HALVINGS, RETRIEVAL_BOOST_SLOPE, REWARD_SLOPE, applyLossAversionRatio, } from '../core/memory.js';
|
|
5
6
|
import { PERSONAL_SCOPE_PREFIX, RECALL_DEFAULT_DENY_SCOPES } from '../core/recall-scope.js';
|
|
6
7
|
import { placeholders } from '../util/sql.js';
|
|
7
8
|
const UNIX_EPOCH_JULIAN_DAY = 2440587.5;
|
|
8
|
-
/** calculateRewardFactor as SQL over `memories` columns; strengthSql and the context-candidate rank both build on it,
|
|
9
|
+
/** calculateRewardFactor as SQL over `memories` columns; strengthSql and the context-candidate rank both build on it,
|
|
10
|
+
* so the slope has one source. */
|
|
9
11
|
export function rewardFactorSql() {
|
|
10
12
|
if (isOutcomeSlowAblated())
|
|
11
13
|
return '1.0';
|
|
12
14
|
const pos = 'COALESCE(outcome_positive, 0)';
|
|
13
15
|
const neg = 'COALESCE(outcome_negative, 0)';
|
|
14
|
-
return `(CASE WHEN ${pos} = 0 AND ${neg} = 0 THEN 1.0 ELSE 1.0 + ${REWARD_SLOPE} * (${pos} - ${neg}) / (${pos} +
|
|
16
|
+
return `(CASE WHEN ${pos} = 0 AND ${neg} = 0 THEN 1.0 ELSE 1.0 + ${REWARD_SLOPE} * (${pos} - ${neg}) / (${pos} + ` +
|
|
17
|
+
`${neg} + 1.0) END)`;
|
|
15
18
|
}
|
|
16
|
-
/** calculateStrength's clock-basis formula as SQL over `memories` columns, flags and multipliers baked in; keep in
|
|
17
|
-
*
|
|
19
|
+
/** calculateStrength's clock-basis formula as SQL over `memories` columns, flags and multipliers baked in; keep in
|
|
20
|
+
* step. An unparseable date scores NULL here and 0 in JS, so sums agree. */
|
|
18
21
|
export function strengthSql(now) {
|
|
19
22
|
const num = (n) => (Number.isInteger(n) ? n.toFixed(1) : String(n));
|
|
20
23
|
const pos = 'COALESCE(outcome_positive, 0)';
|
|
@@ -26,7 +29,8 @@ export function strengthSql(now) {
|
|
|
26
29
|
const decay = isDecayAblated() ? '1.0' : `pow(${DECAY_BASE}, (${nowJulian} - julianday(${anchor})) / ${halfLife})`;
|
|
27
30
|
const boost = isRecallBoostAblated()
|
|
28
31
|
? '1.0'
|
|
29
|
-
: `(CASE WHEN ${wrong} > 0 THEN 1.0 ELSE 1.0 + ${RETRIEVAL_BOOST_SLOPE} * log2(COALESCE(retrieval_count, 0) + 1)
|
|
32
|
+
: `(CASE WHEN ${wrong} > 0 THEN 1.0 ELSE 1.0 + ${RETRIEVAL_BOOST_SLOPE} * log2(COALESCE(retrieval_count, 0) + 1) ` +
|
|
33
|
+
`END)`;
|
|
30
34
|
const valences = /* SAFETY: a Record keyed by EmotionalValence */ Object.keys(EMOTIONAL_MULTIPLIERS);
|
|
31
35
|
const emotion = `(CASE COALESCE(emotional_valence, 'neutral') ${valences
|
|
32
36
|
.map((v) => `WHEN '${v}' THEN ${num(applyLossAversionRatio(v, EMOTIONAL_MULTIPLIERS[v]))}`)
|
|
@@ -37,12 +41,15 @@ export function strengthSql(now) {
|
|
|
37
41
|
}
|
|
38
42
|
const sqlText = (s) => `'${s.replace(/'/g, "''")}'`;
|
|
39
43
|
// json_each matches the tag as a whole element; substr, not LIKE, keeps the prefix case-sensitive like startsWith.
|
|
40
|
-
const keepPairSql = (p) => `(COALESCE(superseded_by, '') = '' AND EXISTS (SELECT 1 FROM json_each(CASE WHEN json_valid(tags_json) THEN
|
|
44
|
+
const keepPairSql = (p) => `(COALESCE(superseded_by, '') = '' AND EXISTS (SELECT 1 FROM json_each(CASE WHEN json_valid(tags_json) THEN ` +
|
|
45
|
+
`tags_json ELSE '[]' END) ` +
|
|
41
46
|
`WHERE value = ${sqlText(p.tag)}) AND substr(source, 1, ${p.sourcePrefix.length}) = ${sqlText(p.sourcePrefix)})`;
|
|
42
47
|
// Pinned and kept rows stay (a superseded row is not kept: its successor carries the tag and
|
|
43
48
|
// source); raw rows leave only through archiveRawMemory. The SQL twin guards the DELETE itself.
|
|
44
|
-
export const AUTO_DELETABLE_SQL = `pinned = 0 AND kind !=
|
|
45
|
-
|
|
49
|
+
export const AUTO_DELETABLE_SQL = `pinned = 0 AND kind != ` +
|
|
50
|
+
`'raw'${KEEP_PAIRS.map((p) => ` AND NOT ${keepPairSql(p)}`).join('')}`;
|
|
51
|
+
/** SQL twin of the no-request arm of passesScopeFilterForRecall; `ownScope` is bound and compared with `=`, so `%` or
|
|
52
|
+
* `_` in an owner match nothing extra. */
|
|
46
53
|
export function scopeAdmitSql(col, ownScope) {
|
|
47
54
|
const marks = placeholders(RECALL_DEFAULT_DENY_SCOPES.length);
|
|
48
55
|
const admitted = `${col}scope IS NULL OR (${col}scope NOT IN (${marks}) AND ${col}scope NOT LIKE '%:private:%')`;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { MemoryEntry } from '../core/memory.js';
|
|
2
2
|
import { type DatabaseSyncLike } from '../db/index.js';
|
|
3
|
-
/** Recall scope filter: 'default-deny' (exclude RECALL_DEFAULT_DENY_SCOPES), 'exact' (m.scope = value),
|
|
4
|
-
* @internal Internal SQL-builder shape; not re-exported from
|
|
3
|
+
/** Recall scope filter: 'default-deny' (exclude RECALL_DEFAULT_DENY_SCOPES), 'exact' (m.scope = value),
|
|
4
|
+
* 'default-deny-or-exact' (both; CLI `--scope`). @internal Internal SQL-builder shape; not re-exported from
|
|
5
|
+
* `src/index.ts`. Subject to change. */
|
|
5
6
|
export type RecallScopeFilter = {
|
|
6
7
|
mode: 'default-deny';
|
|
7
8
|
ownScope?: string;
|
|
@@ -15,10 +16,11 @@ export type RecallScopeFilter = {
|
|
|
15
16
|
};
|
|
16
17
|
/** One project name, or every name a project's rows carry. */
|
|
17
18
|
export type OriginFilter = string | readonly string[];
|
|
18
|
-
/** Scope rule for recall: none requested is default-deny; 'exact' narrows to the request; 'additive' adds it to the
|
|
19
|
-
* which only `ownScope` opens. */
|
|
19
|
+
/** Scope rule for recall: none requested is default-deny; 'exact' narrows to the request; 'additive' adds it to the
|
|
20
|
+
* default set, unless it is personal, which only `ownScope` opens. */
|
|
20
21
|
export declare function recallScopeFilter(requestedScope: string | undefined, mode: 'exact' | 'additive', ownScope?: string): RecallScopeFilter;
|
|
21
|
-
/** Load likely search candidates: FTS5 when available, else LIKE, then full-store fallback. With `tenantId` every
|
|
22
|
+
/** Load likely search candidates: FTS5 when available, else LIKE, then full-store fallback. With `tenantId` every
|
|
23
|
+
* SELECT filters by it; omitted = no filter. */
|
|
22
24
|
export declare function loadSearchEntries(hippoRoot: string, query: string, limit?: number, tenantId?: string): MemoryEntry[];
|
|
23
25
|
export interface RecallSearchEntriesOptions {
|
|
24
26
|
readonly limit?: number;
|
|
@@ -29,13 +31,16 @@ export interface RecallSearchEntriesOptions {
|
|
|
29
31
|
readonly originProjects?: OriginFilter;
|
|
30
32
|
readonly ownScope?: string;
|
|
31
33
|
}
|
|
32
|
-
/** Recall-mode loader: scope predicate in SQL so `unknown:legacy` cannot leak. Empty `requestedScope` default-denies
|
|
33
|
-
* SQL `NOT LIKE '%:private:%'` runs before the LIMIT so private rows cannot
|
|
34
|
+
/** Recall-mode loader: scope predicate in SQL so `unknown:legacy` cannot leak. Empty `requestedScope` default-denies
|
|
35
|
+
* (admits `ownScope`); else exact match. SQL `NOT LIKE '%:private:%'` runs before the LIMIT so private rows cannot
|
|
36
|
+
* starve admitted ones; `passesScopeFilterForRecall` is the exact post-filter. */
|
|
34
37
|
export declare function loadRecallEntries(hippoRoot: string, query: string, options?: RecallSearchEntriesOptions): MemoryEntry[];
|
|
35
|
-
/** Positional form of `loadRecallEntries`, kept internal because the frozen q3b-ranker-floor benchmark imports it from
|
|
38
|
+
/** Positional form of `loadRecallEntries`, kept internal because the frozen q3b-ranker-floor benchmark imports it from
|
|
39
|
+
* dist. */
|
|
36
40
|
export declare function loadRecallSearchEntries(hippoRoot: string, query: string, limit?: number, tenantId?: string, requestedScope?: string, explicitScopeMode?: 'exact' | 'additive', includeSuperseded?: boolean, originProjects?: OriginFilter, ownScope?: string): MemoryEntry[];
|
|
37
41
|
export declare function loadRecallSearchEntriesFromDb(db: DatabaseSyncLike, query: string, options?: RecallSearchEntriesOptions): MemoryEntry[];
|
|
38
|
-
/** Which rows the vector arm of hybrid search may add: the same tenant, scope and superseded rules as the lexical
|
|
42
|
+
/** Which rows the vector arm of hybrid search may add: the same tenant, scope and superseded rules as the lexical
|
|
43
|
+
* load. */
|
|
39
44
|
export interface VectorCandidateSpec {
|
|
40
45
|
tenantId?: string;
|
|
41
46
|
scope?: RecallScopeFilter;
|
|
@@ -3,14 +3,15 @@ import { tokenize } from '../util/tokenize.js';
|
|
|
3
3
|
import { isPersonalScope } from '../core/recall-scope.js';
|
|
4
4
|
import { scopeAdmitSql } from './rule-sql.js';
|
|
5
5
|
import { ftsTermParts, RAREST_TERM_COUNT, rarestFtsQuery } from '../core/prompt-recall.js';
|
|
6
|
-
import { errorMessage, log } from '../util/log.js';
|
|
6
|
+
import { errorMessage, log, errorFields } from '../util/log.js';
|
|
7
7
|
import { originInSql } from '../core/project-identity.js';
|
|
8
8
|
import { topVectorMatches } from '../db/vector-store.js';
|
|
9
9
|
import { MEMORY_SELECT_COLUMNS, MEMORY_SEARCH_COLUMNS, DEFAULT_SEARCH_CANDIDATE_LIMIT, rowToEntry, } from './rows.js';
|
|
10
10
|
import { onHandle, openStore } from './open.js';
|
|
11
11
|
import { escapeLike } from '../util/escape.js';
|
|
12
12
|
import { placeholders } from '../util/sql.js';
|
|
13
|
-
/** The recall scope rule for a table column prefix (`m.` or none); `passesScopeFilterForRecall` in recall-scope.ts is
|
|
13
|
+
/** The recall scope rule for a table column prefix (`m.` or none); `passesScopeFilterForRecall` in recall-scope.ts is
|
|
14
|
+
* its JS twin. */
|
|
14
15
|
function recallScopeClause(col, scopeFilter) {
|
|
15
16
|
if (scopeFilter === undefined)
|
|
16
17
|
return { sql: '', params: [] };
|
|
@@ -33,12 +34,15 @@ function withProject(scope, col, origin) {
|
|
|
33
34
|
params: [...scope.params, ...originProjects],
|
|
34
35
|
};
|
|
35
36
|
}
|
|
36
|
-
/** Scope rule for recall: none requested is default-deny; 'exact' narrows to the request; 'additive' adds it to the
|
|
37
|
-
* which only `ownScope` opens. */
|
|
37
|
+
/** Scope rule for recall: none requested is default-deny; 'exact' narrows to the request; 'additive' adds it to the
|
|
38
|
+
* default set, unless it is personal, which only `ownScope` opens. */
|
|
38
39
|
export function recallScopeFilter(requestedScope, mode, ownScope) {
|
|
39
|
-
if (!requestedScope || (mode === 'additive' && isPersonalScope(requestedScope)))
|
|
40
|
+
if (!requestedScope || (mode === 'additive' && isPersonalScope(requestedScope))) {
|
|
40
41
|
return { mode: 'default-deny', ownScope };
|
|
41
|
-
|
|
42
|
+
}
|
|
43
|
+
return mode === 'additive'
|
|
44
|
+
? { mode: 'default-deny-or-exact', value: requestedScope, ownScope }
|
|
45
|
+
: { mode: 'exact', value: requestedScope };
|
|
42
46
|
}
|
|
43
47
|
const FTS_QUERY_SYNTAX_RE = /fts5: syntax error|unterminated string/i;
|
|
44
48
|
function loadSearchRows(db, query, limit, tenantId, options = {}) {
|
|
@@ -62,14 +66,16 @@ function loadSearchRows(db, query, limit, tenantId, options = {}) {
|
|
|
62
66
|
return selectAllCandidates(db, p, limit);
|
|
63
67
|
}
|
|
64
68
|
function searchPredicates(tenantId, scopeFilter, includeSuperseded, originProjects) {
|
|
65
|
-
// tenantId undefined = no tenant filter (legacy callers / cross-deployment helpers); set = strict isolation via the
|
|
69
|
+
// tenantId undefined = no tenant filter (legacy callers / cross-deployment helpers); set = strict isolation via the
|
|
70
|
+
// composite idx_memories_tenant_created.
|
|
66
71
|
const tenantPredicate = tenantId !== undefined ? ` AND m.tenant_id = ?` : '';
|
|
67
72
|
const tenantOnlyPredicate = tenantId !== undefined ? ` WHERE tenant_id = ?` : '';
|
|
68
73
|
const tenantParams = tenantId !== undefined ? [tenantId] : [];
|
|
69
74
|
// Defensive: kind='archived' is a transient sentinel inside archiveRawMemory's SAVEPOINT, so this only
|
|
70
75
|
// guards against a dropped SAVEPOINT, a persisted 'archived' state, or direct-SQL writes.
|
|
71
76
|
const archivedClauseAlias = ` AND m.kind != 'archived'`;
|
|
72
|
-
// Tenant-only path: with no tenant `tenantOnlyPredicate` is '', so the archived clause switches between ' AND' and '
|
|
77
|
+
// Tenant-only path: with no tenant `tenantOnlyPredicate` is '', so the archived clause switches between ' AND' and '
|
|
78
|
+
// WHERE' by caller context.
|
|
73
79
|
const archivedClauseTenantOnly = tenantId !== undefined ? ` AND kind != 'archived'` : ` WHERE kind != 'archived'`;
|
|
74
80
|
const aliasScope = withProject(recallScopeClause('m.', scopeFilter), 'm.', originProjects);
|
|
75
81
|
const plainScope = withProject(recallScopeClause('', scopeFilter), '', originProjects);
|
|
@@ -94,8 +100,9 @@ function selectAllCandidates(db, p, limit) {
|
|
|
94
100
|
function selectFtsCandidates(db, terms, p, limit) {
|
|
95
101
|
try {
|
|
96
102
|
const ftsQuery = terms.map((t) => `"${t.replace(/"/g, '""')}"`).join(' OR ');
|
|
97
|
-
// memories_fts has no tenant_id column; filter via the joined memories row (cheap with
|
|
98
|
-
// SAFETY: MEMORY_SEARCH_COLUMNS aliases every column like MEMORY_SELECT_COLUMNS (plus
|
|
103
|
+
// memories_fts has no tenant_id column; filter via the joined memories row (cheap with
|
|
104
|
+
// idx_memories_tenant_created). SAFETY: MEMORY_SEARCH_COLUMNS aliases every column like MEMORY_SELECT_COLUMNS (plus
|
|
105
|
+
// bm25_score), matching MemoryRow.
|
|
99
106
|
return db.prepare(`
|
|
100
107
|
SELECT ${MEMORY_SEARCH_COLUMNS}
|
|
101
108
|
FROM memories m
|
|
@@ -108,24 +115,30 @@ function selectFtsCandidates(db, terms, p, limit) {
|
|
|
108
115
|
catch (err) {
|
|
109
116
|
// A query FTS5 cannot parse is expected input; anything else means the index itself is broken.
|
|
110
117
|
const message = errorMessage(err);
|
|
111
|
-
if (!FTS_QUERY_SYNTAX_RE.test(message))
|
|
112
|
-
|
|
118
|
+
if (!FTS_QUERY_SYNTAX_RE.test(message)) {
|
|
119
|
+
const failure = `FTS search failed, using the slower LIKE match: ${message}`;
|
|
120
|
+
log.once('fts-match-fallback', 'warn', failure, errorFields(err));
|
|
121
|
+
}
|
|
113
122
|
return [];
|
|
114
123
|
}
|
|
115
124
|
}
|
|
116
|
-
/** Newest admitted rows the substring match tests, so a query matching nothing costs the same in a store of any
|
|
125
|
+
/** Newest admitted rows the substring match tests, so a query matching nothing costs the same in a store of any
|
|
126
|
+
* size. */
|
|
117
127
|
const LIKE_WINDOW_ROWS = 2000;
|
|
118
|
-
/** Substring matches in content or tags among the newest admitted rows: the lexical path without FTS5, and the catch
|
|
128
|
+
/** Substring matches in content or tags among the newest admitted rows: the lexical path without FTS5, and the catch
|
|
129
|
+
* for a part-word that FTS5 tokens miss. */
|
|
119
130
|
function selectLikeCandidates(db, terms, p, limit) {
|
|
120
|
-
const where = terms
|
|
131
|
+
const where = terms
|
|
132
|
+
.map(() => `(LOWER(content) LIKE ? ESCAPE '\\' OR LOWER(tags_json) LIKE ? ESCAPE '\\')`)
|
|
133
|
+
.join(' OR ');
|
|
121
134
|
const params = terms.flatMap((term) => {
|
|
122
135
|
const like = `%${escapeLike(term)}%`;
|
|
123
136
|
return [like, like];
|
|
124
137
|
});
|
|
125
138
|
// idx_memories_tenant_created serves a tenant's newest rows; with no tenant only the table's own order needs no sort.
|
|
126
139
|
const newestFirst = p.tenantParams.length > 0 ? 'created DESC' : 'rowid DESC';
|
|
127
|
-
// SHORTCUT: no index serves a substring, so a match older than the window is missed; an FTS5 trigram index is the
|
|
128
|
-
// SAFETY: the outer query selects exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
|
|
140
|
+
// SHORTCUT: no index serves a substring, so a match older than the window is missed; an FTS5 trigram index is the
|
|
141
|
+
// upgrade. SAFETY: the outer query selects exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
|
|
129
142
|
return db.prepare(`
|
|
130
143
|
SELECT ${MEMORY_SELECT_COLUMNS}
|
|
131
144
|
FROM (
|
|
@@ -139,20 +152,31 @@ function selectLikeCandidates(db, terms, p, limit) {
|
|
|
139
152
|
LIMIT ?
|
|
140
153
|
`).all(...p.tenantParams, ...p.scopeParams, Math.max(limit, LIKE_WINDOW_ROWS), ...params, limit);
|
|
141
154
|
}
|
|
142
|
-
/** Load likely search candidates: FTS5 when available, else LIKE, then full-store fallback. With `tenantId` every
|
|
155
|
+
/** Load likely search candidates: FTS5 when available, else LIKE, then full-store fallback. With `tenantId` every
|
|
156
|
+
* SELECT filters by it; omitted = no filter. */
|
|
143
157
|
export function loadSearchEntries(hippoRoot, query, limit = DEFAULT_SEARCH_CANDIDATE_LIMIT, tenantId) {
|
|
144
158
|
return onHandle(hippoRoot, (db) => {
|
|
145
159
|
return loadSearchRows(db, query, limit, tenantId).map(rowToEntry);
|
|
146
160
|
}, openStore);
|
|
147
161
|
}
|
|
148
|
-
/** Recall-mode loader: scope predicate in SQL so `unknown:legacy` cannot leak. Empty `requestedScope` default-denies
|
|
149
|
-
* SQL `NOT LIKE '%:private:%'` runs before the LIMIT so private rows cannot
|
|
162
|
+
/** Recall-mode loader: scope predicate in SQL so `unknown:legacy` cannot leak. Empty `requestedScope` default-denies
|
|
163
|
+
* (admits `ownScope`); else exact match. SQL `NOT LIKE '%:private:%'` runs before the LIMIT so private rows cannot
|
|
164
|
+
* starve admitted ones; `passesScopeFilterForRecall` is the exact post-filter. */
|
|
150
165
|
export function loadRecallEntries(hippoRoot, query, options = {}) {
|
|
151
166
|
return onHandle(hippoRoot, (db) => loadRecallSearchEntriesFromDb(db, query, options), openStore);
|
|
152
167
|
}
|
|
153
|
-
/** Positional form of `loadRecallEntries`, kept internal because the frozen q3b-ranker-floor benchmark imports it from
|
|
168
|
+
/** Positional form of `loadRecallEntries`, kept internal because the frozen q3b-ranker-floor benchmark imports it from
|
|
169
|
+
* dist. */
|
|
154
170
|
export function loadRecallSearchEntries(hippoRoot, query, limit = DEFAULT_SEARCH_CANDIDATE_LIMIT, tenantId, requestedScope, explicitScopeMode = 'exact', includeSuperseded = true, originProjects, ownScope) {
|
|
155
|
-
return loadRecallEntries(hippoRoot, query, {
|
|
171
|
+
return loadRecallEntries(hippoRoot, query, {
|
|
172
|
+
limit,
|
|
173
|
+
tenantId,
|
|
174
|
+
requestedScope,
|
|
175
|
+
explicitScopeMode,
|
|
176
|
+
includeSuperseded,
|
|
177
|
+
originProjects,
|
|
178
|
+
ownScope,
|
|
179
|
+
});
|
|
156
180
|
}
|
|
157
181
|
// Split out so callers with an already-open db (the prompt-recall path) skip
|
|
158
182
|
// the initStore+open/close cycle per store per call.
|
|
@@ -173,7 +197,8 @@ export async function loadVectorCandidateEntries(hippoRoot, queryVector, spec) {
|
|
|
173
197
|
if (matches.length === 0)
|
|
174
198
|
return [];
|
|
175
199
|
// SAFETY: the SELECT names exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
|
|
176
|
-
const rows = db
|
|
200
|
+
const rows = db
|
|
201
|
+
.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories WHERE id IN (${placeholders(matches.length)})`)
|
|
177
202
|
.all(...matches.map((m) => m.id));
|
|
178
203
|
const byId = new Map(rows.map((r) => [r.id, rowToEntry(r)]));
|
|
179
204
|
return matches.flatMap((m) => byId.get(m.id) ?? []);
|
package/dist/store/sessions.d.ts
CHANGED
|
@@ -17,7 +17,7 @@ export interface ContinuityStamp {
|
|
|
17
17
|
export declare function continuityWhere(key: ContinuityKey): ContinuityFilter;
|
|
18
18
|
/** The columns a keyed write stamps; a partial key throws, since a row it wrote would match no reader. */
|
|
19
19
|
export declare function continuityStamp(key: ContinuityKey): ContinuityStamp;
|
|
20
|
-
type SnapshotInput = {
|
|
20
|
+
export type SnapshotInput = {
|
|
21
21
|
task: string;
|
|
22
22
|
summary: string;
|
|
23
23
|
next_step: string;
|
|
@@ -27,11 +27,13 @@ type SnapshotInput = {
|
|
|
27
27
|
};
|
|
28
28
|
export declare function saveActiveTaskSnapshot(hippoRoot: string, tenantId: string, snapshot: SnapshotInput, key?: ContinuityKey): TaskSnapshot;
|
|
29
29
|
export declare function loadActiveTaskSnapshot(hippoRoot: string, tenantId: string, key?: ContinuityKey): TaskSnapshot | null;
|
|
30
|
-
/** Default freshness bound for AMBIENT active-task-snapshot reads: 72h rather than 48h so a Friday-evening orphan still
|
|
31
|
-
* override via `loadFreshActiveTaskSnapshot`'s `opts.maxAgeMs`; deliberately no env
|
|
30
|
+
/** Default freshness bound for AMBIENT active-task-snapshot reads: 72h rather than 48h so a Friday-evening orphan still
|
|
31
|
+
* offers continuity on Monday; override via `loadFreshActiveTaskSnapshot`'s `opts.maxAgeMs`; deliberately no env
|
|
32
|
+
* knob. */
|
|
32
33
|
export declare const SNAPSHOT_AMBIENT_MAX_AGE_MS: number;
|
|
33
|
-
/** Bounded read for AMBIENT snapshot surfaces so orphaned snapshots expire. The owner (both session ids non-empty and
|
|
34
|
-
* all others, null ids included (null === null is no match), get it only if
|
|
34
|
+
/** Bounded read for AMBIENT snapshot surfaces so orphaned snapshots expire. The owner (both session ids non-empty and
|
|
35
|
+
* `===`) always sees its own state; all others, null ids included (null === null is no match), get it only if
|
|
36
|
+
* age(updated_at) <= maxAgeMs (default `SNAPSHOT_AMBIENT_MAX_AGE_MS`), else null. */
|
|
35
37
|
export declare function loadFreshActiveTaskSnapshot(hippoRoot: string, tenantId: string, opts?: {
|
|
36
38
|
maxAgeMs?: number;
|
|
37
39
|
sessionId?: string | null;
|
|
@@ -42,10 +44,10 @@ export declare function freshActiveSnapshot(snapshot: TaskSnapshot | null, opts?
|
|
|
42
44
|
sessionId?: string | null;
|
|
43
45
|
}): TaskSnapshot | null;
|
|
44
46
|
export declare function clearActiveTaskSnapshot(hippoRoot: string, tenantId: string, clearedStatus?: string): boolean;
|
|
45
|
-
/** Close the `active` task snapshot(s) owned by `sessionId` at session end; the WHERE scopes on `session_id` too so an
|
|
46
|
-
* newer session's snapshot. Returns the number of rows closed. */
|
|
47
|
+
/** Close the `active` task snapshot(s) owned by `sessionId` at session end; the WHERE scopes on `session_id` too so an
|
|
48
|
+
* ending session can never close a newer session's snapshot. Returns the number of rows closed. */
|
|
47
49
|
export declare function closeTaskSnapshotsForSession(hippoRoot: string, tenantId: string, sessionId: string, status?: string, key?: ContinuityKey): number;
|
|
48
|
-
interface SessionEventInput {
|
|
50
|
+
export interface SessionEventInput {
|
|
49
51
|
session_id: string;
|
|
50
52
|
event_type: string;
|
|
51
53
|
content: string;
|
|
@@ -60,7 +62,8 @@ export declare function listSessionEvents(hippoRoot: string, tenantId: string, o
|
|
|
60
62
|
task?: string;
|
|
61
63
|
limit?: number;
|
|
62
64
|
}): SessionEvent[];
|
|
63
|
-
/** Session_ids with a `session_complete` event newer than `sinceMs`; bounds the sleep auto-promotion scan to a fixed
|
|
65
|
+
/** Session_ids with a `session_complete` event newer than `sinceMs`; bounds the sleep auto-promotion scan to a fixed
|
|
66
|
+
* window. */
|
|
64
67
|
export declare function findPromotableSessions(hippoRoot: string, tenantId: string, sinceMs: number): Array<{
|
|
65
68
|
session_id: string;
|
|
66
69
|
}>;
|
|
@@ -76,5 +79,4 @@ export interface SessionOwnerBinding {
|
|
|
76
79
|
}
|
|
77
80
|
/** The owner stored for the session id, binding `binding.owner` first when none is stored. */
|
|
78
81
|
export declare function sessionOwnerOrBind(hippoRoot: string, binding: SessionOwnerBinding): string | null;
|
|
79
|
-
export {};
|
|
80
82
|
//# sourceMappingURL=sessions.d.ts.map
|
package/dist/store/sessions.js
CHANGED
|
@@ -30,10 +30,13 @@ function assertKeyedOnSharedStore(fn, hippoRoot, key) {
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
function insertSnapshot(db, tenantId, snapshot, now, stamp) {
|
|
33
|
-
const result = db
|
|
34
|
-
|
|
33
|
+
const result = db
|
|
34
|
+
.prepare(`
|
|
35
|
+
INSERT INTO task_snapshots(task, summary, next_step, status, source, session_id, scope, tenant_id, created_at,
|
|
36
|
+
updated_at, owner_subject, origin_project)
|
|
35
37
|
VALUES (?, ?, ?, 'active', ?, ?, ?, ?, ?, ?, ?, ?)
|
|
36
|
-
`)
|
|
38
|
+
`)
|
|
39
|
+
.run(redactSecretsStrict(snapshot.task), redactSecretsStrict(snapshot.summary), redactSecretsStrict(snapshot.next_step), snapshot.source ?? 'cli', snapshot.session_id ?? null, snapshot.scope ?? null, tenantId, now, now, stamp?.owner ?? null, stamp?.origin ?? null);
|
|
37
40
|
return Number(result.lastInsertRowid ?? 0);
|
|
38
41
|
}
|
|
39
42
|
export function saveActiveTaskSnapshot(hippoRoot, tenantId, snapshot, key) {
|
|
@@ -45,8 +48,8 @@ export function saveActiveTaskSnapshot(hippoRoot, tenantId, snapshot, key) {
|
|
|
45
48
|
const now = new Date().toISOString();
|
|
46
49
|
try {
|
|
47
50
|
const id = withWriteScope(db, 'save_active_task', () => {
|
|
48
|
-
db.prepare(`UPDATE task_snapshots SET status = 'superseded', updated_at = ? WHERE status = 'active' AND tenant_id =
|
|
49
|
-
.run(now, tenantId, ...(owned?.params ?? []));
|
|
51
|
+
db.prepare(`UPDATE task_snapshots SET status = 'superseded', updated_at = ? WHERE status = 'active' AND tenant_id = ` +
|
|
52
|
+
`?${owned ? ` AND ${owned.sql}` : ''}`).run(now, tenantId, ...(owned?.params ?? []));
|
|
50
53
|
const inserted = insertSnapshot(db, tenantId, snapshot, now, stamp);
|
|
51
54
|
// An older binary's tenant-wide supersede would close other owners' rows, so the first owner row shuts it out.
|
|
52
55
|
if (stamp)
|
|
@@ -95,15 +98,18 @@ export function loadActiveTaskSnapshot(hippoRoot, tenantId, key) {
|
|
|
95
98
|
return loaded;
|
|
96
99
|
}, openStore);
|
|
97
100
|
}
|
|
98
|
-
/** Default freshness bound for AMBIENT active-task-snapshot reads: 72h rather than 48h so a Friday-evening orphan still
|
|
99
|
-
* override via `loadFreshActiveTaskSnapshot`'s `opts.maxAgeMs`; deliberately no env
|
|
101
|
+
/** Default freshness bound for AMBIENT active-task-snapshot reads: 72h rather than 48h so a Friday-evening orphan still
|
|
102
|
+
* offers continuity on Monday; override via `loadFreshActiveTaskSnapshot`'s `opts.maxAgeMs`; deliberately no env
|
|
103
|
+
* knob. */
|
|
100
104
|
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`
|
|
105
|
+
/** A usable session id: non-null, non-empty string; named so the owner-match rule in `loadFreshActiveTaskSnapshot`
|
|
106
|
+
* states its contract once. */
|
|
102
107
|
function isNonEmptySessionId(value) {
|
|
103
108
|
return typeof value === 'string' && value.length > 0;
|
|
104
109
|
}
|
|
105
|
-
/** Bounded read for AMBIENT snapshot surfaces so orphaned snapshots expire. The owner (both session ids non-empty and
|
|
106
|
-
* all others, null ids included (null === null is no match), get it only if
|
|
110
|
+
/** Bounded read for AMBIENT snapshot surfaces so orphaned snapshots expire. The owner (both session ids non-empty and
|
|
111
|
+
* `===`) always sees its own state; all others, null ids included (null === null is no match), get it only if
|
|
112
|
+
* age(updated_at) <= maxAgeMs (default `SNAPSHOT_AMBIENT_MAX_AGE_MS`), else null. */
|
|
107
113
|
export function loadFreshActiveTaskSnapshot(hippoRoot, tenantId, opts = {}, key) {
|
|
108
114
|
return freshActiveSnapshot(loadActiveTaskSnapshot(hippoRoot, tenantId, key), opts);
|
|
109
115
|
}
|
|
@@ -128,7 +134,10 @@ export function clearActiveTaskSnapshot(hippoRoot, tenantId, clearedStatus = 'cl
|
|
|
128
134
|
const now = new Date().toISOString();
|
|
129
135
|
try {
|
|
130
136
|
// SAFETY: active's shape matches the single `id` column selected above.
|
|
131
|
-
const active = db
|
|
137
|
+
const active = db
|
|
138
|
+
.prepare(`SELECT id FROM task_snapshots WHERE status = 'active' AND tenant_id = ? ORDER BY updated_at DESC, id DESC ` +
|
|
139
|
+
`LIMIT 1`)
|
|
140
|
+
.get(tenantId);
|
|
132
141
|
if (!active?.id) {
|
|
133
142
|
removeActiveTaskMirror(hippoRoot, tenantId);
|
|
134
143
|
return false;
|
|
@@ -141,8 +150,8 @@ export function clearActiveTaskSnapshot(hippoRoot, tenantId, clearedStatus = 'cl
|
|
|
141
150
|
closeHippoDb(db);
|
|
142
151
|
}
|
|
143
152
|
}
|
|
144
|
-
/** Close the `active` task snapshot(s) owned by `sessionId` at session end; the WHERE scopes on `session_id` too so an
|
|
145
|
-
* newer session's snapshot. Returns the number of rows closed. */
|
|
153
|
+
/** Close the `active` task snapshot(s) owned by `sessionId` at session end; the WHERE scopes on `session_id` too so an
|
|
154
|
+
* ending session can never close a newer session's snapshot. Returns the number of rows closed. */
|
|
146
155
|
export function closeTaskSnapshotsForSession(hippoRoot, tenantId, sessionId, status = 'session-ended', key) {
|
|
147
156
|
assertTenantId('closeTaskSnapshotsForSession', tenantId);
|
|
148
157
|
if (key)
|
|
@@ -151,7 +160,10 @@ export function closeTaskSnapshotsForSession(hippoRoot, tenantId, sessionId, sta
|
|
|
151
160
|
const db = openStore(hippoRoot);
|
|
152
161
|
const now = new Date().toISOString();
|
|
153
162
|
try {
|
|
154
|
-
const result = db
|
|
163
|
+
const result = db
|
|
164
|
+
.prepare(`UPDATE task_snapshots SET status = ?, updated_at = ? WHERE status = 'active' AND tenant_id = ? AND ` +
|
|
165
|
+
`session_id = ?${owned ? ` AND ${owned.sql}` : ''}`)
|
|
166
|
+
.run(status, now, tenantId, sessionId, ...(owned?.params ?? []));
|
|
155
167
|
return Number(result.changes ?? 0);
|
|
156
168
|
}
|
|
157
169
|
finally {
|
|
@@ -159,10 +171,13 @@ export function closeTaskSnapshotsForSession(hippoRoot, tenantId, sessionId, sta
|
|
|
159
171
|
}
|
|
160
172
|
}
|
|
161
173
|
function insertSessionEventRow(db, tenantId, event, now) {
|
|
162
|
-
const result = db
|
|
163
|
-
|
|
174
|
+
const result = db
|
|
175
|
+
.prepare(`
|
|
176
|
+
INSERT INTO session_events(session_id, task, event_type, content, source, scope, metadata_json, tenant_id,
|
|
177
|
+
created_at)
|
|
164
178
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
165
|
-
`)
|
|
179
|
+
`)
|
|
180
|
+
.run(event.session_id, event.task ?? null, event.event_type, event.content, event.source ?? 'cli', event.scope ?? null, JSON.stringify(event.metadata ?? {}), tenantId, now);
|
|
166
181
|
return Number(result.lastInsertRowid ?? 0);
|
|
167
182
|
}
|
|
168
183
|
function reloadSessionEvent(db, id) {
|
|
@@ -179,13 +194,15 @@ function reloadSessionEvent(db, id) {
|
|
|
179
194
|
}
|
|
180
195
|
function recentSessionEventsOldestFirst(db, tenantId, sessionId, limit) {
|
|
181
196
|
// SAFETY: recentRows' shape matches the nine columns named in the SELECT below.
|
|
182
|
-
const recentRows = db
|
|
197
|
+
const recentRows = db
|
|
198
|
+
.prepare(`
|
|
183
199
|
SELECT id, session_id, task, event_type, content, source, scope, metadata_json, created_at
|
|
184
200
|
FROM session_events
|
|
185
201
|
WHERE session_id = ? AND tenant_id = ?
|
|
186
202
|
ORDER BY created_at DESC, id DESC
|
|
187
203
|
LIMIT ?
|
|
188
|
-
`)
|
|
204
|
+
`)
|
|
205
|
+
.all(sessionId, tenantId, limit);
|
|
189
206
|
return recentRows.map(rowToSessionEvent).reverse();
|
|
190
207
|
}
|
|
191
208
|
export function appendSessionEvent(hippoRoot, tenantId, event) {
|
|
@@ -232,7 +249,8 @@ export function listSessionEvents(hippoRoot, tenantId, options = {}) {
|
|
|
232
249
|
return rows.map(rowToSessionEvent).reverse();
|
|
233
250
|
}, openStore);
|
|
234
251
|
}
|
|
235
|
-
/** Session_ids with a `session_complete` event newer than `sinceMs`; bounds the sleep auto-promotion scan to a fixed
|
|
252
|
+
/** Session_ids with a `session_complete` event newer than `sinceMs`; bounds the sleep auto-promotion scan to a fixed
|
|
253
|
+
* window. */
|
|
236
254
|
export function findPromotableSessions(hippoRoot, tenantId, sinceMs) {
|
|
237
255
|
assertTenantId('findPromotableSessions', tenantId);
|
|
238
256
|
return onHandle(hippoRoot, (db) => {
|
|
@@ -265,7 +283,8 @@ function selectSessionOwnerAt(db, tenantId, sessionId) {
|
|
|
265
283
|
}
|
|
266
284
|
/** Binds `sessionId` to `owner` unless a binding exists; the count is 1 when this call bound it. */
|
|
267
285
|
function insertSessionOwnerAt(db, tenantId, sessionId, owner, createdAt) {
|
|
268
|
-
const result = db
|
|
286
|
+
const result = db
|
|
287
|
+
.prepare(`INSERT OR IGNORE INTO session_owners(tenant_id, session_id, owner_subject, created_at) VALUES (?, ?, ?, ?)`)
|
|
269
288
|
.run(tenantId, sessionId, owner, createdAt);
|
|
270
289
|
return Number(result.changes ?? 0);
|
|
271
290
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { DatabaseSyncLike } from '../db/index.js';
|
|
2
2
|
import { type MemoryEntry } from '../core/memory.js';
|
|
3
|
-
export declare const SYNC_ACTOR = "agent-memories";
|
|
4
3
|
export type SetAsideWhy = 'note-gone' | 'note-changed' | 'handover' | 'project-merge' | 'project-repair';
|
|
5
4
|
export type SetAsideResult = {
|
|
6
5
|
readonly kind: 'untagged';
|
|
@@ -9,6 +8,7 @@ export type SetAsideResult = {
|
|
|
9
8
|
readonly kind: 'dormant';
|
|
10
9
|
readonly id: string;
|
|
11
10
|
};
|
|
12
|
-
/** Design 6's set-aside on the caller's transaction: a pinned row only loses the tag, any other goes dormant,
|
|
11
|
+
/** Design 6's set-aside on the caller's transaction: a pinned row only loses the tag, any other goes dormant,
|
|
12
|
+
* restorable. */
|
|
13
13
|
export declare function setAsideRow(db: DatabaseSyncLike, tag: string, row: MemoryEntry, why: SetAsideWhy): SetAsideResult;
|
|
14
14
|
//# sourceMappingURL=set-aside.d.ts.map
|