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
package/dist/store/cards.js
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { generateId } from '../core/memory.js';
|
|
2
2
|
import { withWriteScope, withWriteScopeOr } from '../db/index.js';
|
|
3
|
-
import { rowToSessionHandoff, isHandoffOutcome } from '../core/handoff.js';
|
|
3
|
+
import { rowToSessionHandoff, isHandoffOutcome, } from '../core/handoff.js';
|
|
4
4
|
import { CARD_LEASE_MS, assertCardTransition } from '../core/card.js';
|
|
5
5
|
import { assertTenantId } from './tenant.js';
|
|
6
6
|
import { onHandle, openStore } from './open.js';
|
|
7
7
|
import { chunked } from '../util/chunked.js';
|
|
8
8
|
import { HANDOFF_COLUMNS } from './handoffs.js';
|
|
9
9
|
import { placeholders } from '../util/sql.js';
|
|
10
|
-
const CARD_COLUMNS = 'id, title, status, assignee_runtime, repo, contract, budget, lease_until, heartbeat_at, created_at, updated_at,
|
|
10
|
+
const CARD_COLUMNS = 'id, title, status, assignee_runtime, repo, contract, budget, lease_until, heartbeat_at, created_at, updated_at, ' +
|
|
11
|
+
'tenant_id, scope';
|
|
11
12
|
function rowToCard(row) {
|
|
12
13
|
return {
|
|
13
14
|
id: row.id,
|
|
@@ -25,7 +26,7 @@ function rowToCard(row) {
|
|
|
25
26
|
scope: row.scope,
|
|
26
27
|
};
|
|
27
28
|
}
|
|
28
|
-
function loadCardRow(db, tenantId, id) {
|
|
29
|
+
export function loadCardRow(db, tenantId, id) {
|
|
29
30
|
// SAFETY: row's shape matches CARD_COLUMNS; status only ever holds a CardStatus value.
|
|
30
31
|
const row = db.prepare(`SELECT ${CARD_COLUMNS} FROM cards WHERE id = ? AND tenant_id = ?`).get(id, tenantId);
|
|
31
32
|
return row ? rowToCard(row) : null;
|
|
@@ -46,10 +47,12 @@ function rowToCardComment(row) {
|
|
|
46
47
|
}
|
|
47
48
|
function insertCardComment(db, tenantId, cardId, author, body) {
|
|
48
49
|
const now = new Date().toISOString();
|
|
49
|
-
const result = db
|
|
50
|
+
const result = db
|
|
51
|
+
.prepare(`
|
|
50
52
|
INSERT INTO card_comments (card_id, author, body, created_at, tenant_id)
|
|
51
53
|
SELECT ?, ?, ?, ?, ? WHERE EXISTS (SELECT 1 FROM cards WHERE id = ? AND tenant_id = ?)
|
|
52
|
-
`)
|
|
54
|
+
`)
|
|
55
|
+
.run(cardId, author, body, now, tenantId, cardId, tenantId);
|
|
53
56
|
if (Number(result.changes ?? 0) === 0) {
|
|
54
57
|
throw new Error(`unknown card id: ${cardId}`);
|
|
55
58
|
}
|
|
@@ -67,7 +70,9 @@ function assertRunId(runId) {
|
|
|
67
70
|
// A second run that has not ended means a corrupt store; throw rather than guess which run the caller means.
|
|
68
71
|
function isLiveRun(db, tenantId, cardId, runId) {
|
|
69
72
|
// SAFETY: rows' shape matches the single `id` column named in the SELECT below.
|
|
70
|
-
const rows = db
|
|
73
|
+
const rows = db
|
|
74
|
+
.prepare(`SELECT id FROM card_runs WHERE tenant_id = ? AND card = ? AND ended IS NULL`)
|
|
75
|
+
.all(tenantId, cardId);
|
|
71
76
|
if (rows.length > 1) {
|
|
72
77
|
throw new Error(`card ${cardId} has ${rows.length} runs that have not ended`);
|
|
73
78
|
}
|
|
@@ -91,8 +96,10 @@ function transitionCards(db, tenantId, cardIds, options) {
|
|
|
91
96
|
const lease = to === 'running' ? [leaseUntilFrom(now), now] : [null, null];
|
|
92
97
|
const fromPlaceholders = placeholders(from.length);
|
|
93
98
|
const sql = `
|
|
94
|
-
UPDATE cards SET status = ?, updated_at = ?, lease_until = ?, heartbeat_at =
|
|
95
|
-
|
|
99
|
+
UPDATE cards SET status = ?, updated_at = ?, lease_until = ?, heartbeat_at =
|
|
100
|
+
?${extra?.setSql ? `, ${extra.setSql}` : ''}
|
|
101
|
+
WHERE id IN (${placeholders(cardIds.length)}) AND tenant_id = ? AND status IN
|
|
102
|
+
(${fromPlaceholders})${extra?.whereSql ? ` AND ${extra.whereSql}` : ''}
|
|
96
103
|
`;
|
|
97
104
|
const params = [to, now, ...lease, ...(extra?.params ?? []), ...cardIds, tenantId, ...from];
|
|
98
105
|
const result = db.prepare(sql).run(...params);
|
|
@@ -131,7 +138,8 @@ export function createCard(hippoRoot, tenantId, input) {
|
|
|
131
138
|
return loadCardRow(db, tenantId, id);
|
|
132
139
|
}, openStore);
|
|
133
140
|
}
|
|
134
|
-
/** Whether every dependsOn card is done, true for none; throws on an id that is no card of the tenant. Call inside the
|
|
141
|
+
/** Whether every dependsOn card is done, true for none; throws on an id that is no card of the tenant. Call inside the
|
|
142
|
+
* write scope. */
|
|
135
143
|
function everyParentDone(db, tenantId, dependsOn) {
|
|
136
144
|
if (dependsOn.length === 0)
|
|
137
145
|
return true;
|
|
@@ -174,52 +182,57 @@ export function listCards(hippoRoot, tenantId, opts = {}) {
|
|
|
174
182
|
/** Returns this card's parent and child ids from card_deps. */
|
|
175
183
|
export function loadCardDeps(hippoRoot, tenantId, id) {
|
|
176
184
|
assertTenantId('loadCardDeps', tenantId);
|
|
177
|
-
return onHandle(hippoRoot, (db) =>
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
185
|
+
return onHandle(hippoRoot, (db) => loadCardDepsAt(db, tenantId, id), openStore);
|
|
186
|
+
}
|
|
187
|
+
export function loadCardDepsAt(db, tenantId, id) {
|
|
188
|
+
// SAFETY: rows' shape matches the single `parent` column named in the SELECT below.
|
|
189
|
+
const parents = db.prepare(`SELECT parent FROM card_deps WHERE tenant_id = ? AND child = ?`).all(tenantId, id).map((r) => r.parent);
|
|
190
|
+
// SAFETY: rows' shape matches the single `child` column named in the SELECT below.
|
|
191
|
+
const children = db.prepare(`SELECT child FROM card_deps WHERE tenant_id = ? AND parent = ?`).all(tenantId, id).map((r) => r.child);
|
|
192
|
+
return { parents, children };
|
|
184
193
|
}
|
|
185
194
|
/** Returns this card's run history, most recent first. */
|
|
186
195
|
export function loadCardRuns(hippoRoot, tenantId, id) {
|
|
187
196
|
assertTenantId('loadCardRuns', tenantId);
|
|
188
|
-
return onHandle(hippoRoot, (db) =>
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
197
|
+
return onHandle(hippoRoot, (db) => loadCardRunsAt(db, tenantId, id), openStore);
|
|
198
|
+
}
|
|
199
|
+
export function loadCardRunsAt(db, tenantId, id) {
|
|
200
|
+
// SAFETY: rows' shape matches CardRunRow.
|
|
201
|
+
const rows = db.prepare(`
|
|
202
|
+
SELECT id, card, runtime, session_id, started, ended, outcome
|
|
203
|
+
FROM card_runs WHERE tenant_id = ? AND card = ? ORDER BY started DESC, id DESC
|
|
204
|
+
`).all(tenantId, id);
|
|
205
|
+
return rows.map(rowToCardRun);
|
|
196
206
|
}
|
|
197
207
|
/** Returns this card's comments, most recent first. */
|
|
198
208
|
export function loadCardComments(hippoRoot, tenantId, id) {
|
|
199
209
|
assertTenantId('loadCardComments', tenantId);
|
|
200
|
-
return onHandle(hippoRoot, (db) =>
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
210
|
+
return onHandle(hippoRoot, (db) => loadCardCommentsAt(db, tenantId, id), openStore);
|
|
211
|
+
}
|
|
212
|
+
export function loadCardCommentsAt(db, tenantId, id) {
|
|
213
|
+
// SAFETY: rows' shape matches CardCommentRow.
|
|
214
|
+
const rows = db.prepare(`
|
|
215
|
+
SELECT id, card_id, author, body, created_at
|
|
216
|
+
FROM card_comments WHERE tenant_id = ? AND card_id = ? ORDER BY created_at DESC, id DESC
|
|
217
|
+
`).all(tenantId, id);
|
|
218
|
+
return rows.map(rowToCardComment);
|
|
208
219
|
}
|
|
209
220
|
/** Read side of the card <-> handoff round trip: the newest handoff filed against this card. */
|
|
210
221
|
export function loadLatestHandoffForCard(hippoRoot, tenantId, cardId) {
|
|
211
222
|
assertTenantId('loadLatestHandoffForCard', tenantId);
|
|
212
|
-
return onHandle(hippoRoot, (db) =>
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
223
|
+
return onHandle(hippoRoot, (db) => loadLatestHandoffForCardAt(db, tenantId, cardId), openStore);
|
|
224
|
+
}
|
|
225
|
+
export function loadLatestHandoffForCardAt(db, tenantId, cardId) {
|
|
226
|
+
// SAFETY: row's shape matches HANDOFF_COLUMNS.
|
|
227
|
+
const row = db.prepare(`
|
|
228
|
+
SELECT ${HANDOFF_COLUMNS} FROM session_handoffs
|
|
229
|
+
WHERE tenant_id = ? AND card_id = ? ORDER BY created_at DESC, id DESC LIMIT 1
|
|
230
|
+
`).get(tenantId, cardId);
|
|
231
|
+
return row ? rowToSessionHandoff(row) : null;
|
|
220
232
|
}
|
|
221
|
-
/** Atomic claim: WHERE status IN (ready, blocked) AND assignee_runtime IS NULL decides the race. Throws on an unknown
|
|
222
|
-
* returns null for a card not ready/blocked or already claimed. Sets a CARD_LEASE_MS lease and returns the new
|
|
233
|
+
/** Atomic claim: WHERE status IN (ready, blocked) AND assignee_runtime IS NULL decides the race. Throws on an unknown
|
|
234
|
+
* card id; returns null for a card not ready/blocked or already claimed. Sets a CARD_LEASE_MS lease and returns the new
|
|
235
|
+
* run's id as runId. */
|
|
223
236
|
export function claimCard(hippoRoot, tenantId, id, runtime, sessionId) {
|
|
224
237
|
assertTenantId('claimCard', tenantId);
|
|
225
238
|
if (runtime.trim() === '') {
|
|
@@ -239,17 +252,20 @@ export function claimCard(hippoRoot, tenantId, id, runtime, sessionId) {
|
|
|
239
252
|
return rollback(null);
|
|
240
253
|
}
|
|
241
254
|
const now = new Date().toISOString();
|
|
242
|
-
const insert = db
|
|
255
|
+
const insert = db
|
|
256
|
+
.prepare(`
|
|
243
257
|
INSERT INTO card_runs (card, runtime, session_id, started, created_at, updated_at, tenant_id)
|
|
244
258
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
245
|
-
`)
|
|
259
|
+
`)
|
|
260
|
+
.run(id, runtime, sessionId ?? null, now, now, now, tenantId);
|
|
246
261
|
return Number(insert.lastInsertRowid ?? 0);
|
|
247
262
|
});
|
|
248
263
|
return runId === null ? null : { ...loadCardRow(db, tenantId, id), runId };
|
|
249
264
|
}, openStore);
|
|
250
265
|
}
|
|
251
|
-
/** Moves a running card's lease to CARD_LEASE_MS from now and records the heartbeat; updated_at is left alone. Throws
|
|
252
|
-
* unknown card id or a run id that is not a positive integer; returns null unless the card is running and runId
|
|
266
|
+
/** Moves a running card's lease to CARD_LEASE_MS from now and records the heartbeat; updated_at is left alone. Throws
|
|
267
|
+
* on an unknown card id or a run id that is not a positive integer; returns null unless the card is running and runId
|
|
268
|
+
* is its live run. */
|
|
253
269
|
export function heartbeatCard(hippoRoot, tenantId, id, runId) {
|
|
254
270
|
assertTenantId('heartbeatCard', tenantId);
|
|
255
271
|
assertRunId(runId);
|
|
@@ -282,7 +298,13 @@ export function blockCard(hippoRoot, tenantId, id, reason, runId) {
|
|
|
282
298
|
return onHandle(hippoRoot, (db) => {
|
|
283
299
|
const blocked = withWriteScopeOr(db, 'block_card', (rollback) => {
|
|
284
300
|
const allowed = runId === undefined || isLiveRun(db, tenantId, id, runId);
|
|
285
|
-
const changes = allowed
|
|
301
|
+
const changes = allowed
|
|
302
|
+
? transitionCard(db, tenantId, id, {
|
|
303
|
+
from: ['running'],
|
|
304
|
+
to: 'blocked',
|
|
305
|
+
extra: { setSql: 'assignee_runtime = NULL' },
|
|
306
|
+
})
|
|
307
|
+
: 0;
|
|
286
308
|
if (changes === 0) {
|
|
287
309
|
if (!loadCardRow(db, tenantId, id)) {
|
|
288
310
|
throw new Error(`unknown card id: ${id}`);
|
|
@@ -298,8 +320,9 @@ export function blockCard(hippoRoot, tenantId, id, reason, runId) {
|
|
|
298
320
|
return blocked ? loadCardRow(db, tenantId, id) : null;
|
|
299
321
|
}, openStore);
|
|
300
322
|
}
|
|
301
|
-
/** Requires the card be running; moves it to review, clearing its lease and heartbeat and keeping its live run. When
|
|
302
|
-
* given, returns null unless it is the card's live run. Throws on an unknown card id; returns null for a card
|
|
323
|
+
/** Requires the card be running; moves it to review, clearing its lease and heartbeat and keeping its live run. When
|
|
324
|
+
* runId is given, returns null unless it is the card's live run. Throws on an unknown card id; returns null for a card
|
|
325
|
+
* not running. */
|
|
303
326
|
export function reviewCard(hippoRoot, tenantId, id, runId) {
|
|
304
327
|
assertTenantId('reviewCard', tenantId);
|
|
305
328
|
if (runId !== undefined)
|
|
@@ -319,8 +342,9 @@ export function reviewCard(hippoRoot, tenantId, id, runId) {
|
|
|
319
342
|
return moved ? loadCardRow(db, tenantId, id) : null;
|
|
320
343
|
}, openStore);
|
|
321
344
|
}
|
|
322
|
-
/** Closes the live run of a card in review: 'success' moves it to done and promotes children whose parents are all
|
|
323
|
-
* Throws on an unknown card id; returns null for a card not in review, or when
|
|
345
|
+
/** Closes the live run of a card in review: 'success' moves it to done and promotes children whose parents are all
|
|
346
|
+
* done; 'failure'/'partial' shelves it. Throws on an unknown card id; returns null for a card not in review, or when
|
|
347
|
+
* `runId` is given and is not the card's live run. */
|
|
324
348
|
export function completeCard(hippoRoot, tenantId, id, outcome, runId) {
|
|
325
349
|
assertTenantId('completeCard', tenantId);
|
|
326
350
|
if (!isHandoffOutcome(outcome)) {
|
|
@@ -348,24 +372,29 @@ export function completeCard(hippoRoot, tenantId, id, outcome, runId) {
|
|
|
348
372
|
return promoted === null ? null : { card: loadCardRow(db, tenantId, id), promotedChildren: promoted };
|
|
349
373
|
}, openStore);
|
|
350
374
|
}
|
|
351
|
-
/** Moves to ready each backlog child of `parentId` whose parents are all done, and returns their ids. Call inside the
|
|
375
|
+
/** Moves to ready each backlog child of `parentId` whose parents are all done, and returns their ids. Call inside the
|
|
376
|
+
* write scope. */
|
|
352
377
|
function promoteUnblockedChildren(db, tenantId, parentId) {
|
|
353
|
-
// The child's status and its open parents are result columns, not joins, so the rows keep the order of a plain read
|
|
354
|
-
// SAFETY: rows' shape matches the three columns named in the SELECT below.
|
|
355
|
-
const children = db
|
|
378
|
+
// The child's status and its open parents are result columns, not joins, so the rows keep the order of a plain read
|
|
379
|
+
// of the parent's children. SAFETY: rows' shape matches the three columns named in the SELECT below.
|
|
380
|
+
const children = db
|
|
381
|
+
.prepare(`
|
|
356
382
|
SELECT d.child AS child,
|
|
357
383
|
(SELECT c.status FROM cards c WHERE c.tenant_id = ? AND c.id = d.child) AS status,
|
|
358
384
|
(SELECT COUNT(*) FROM card_deps p WHERE p.tenant_id = ? AND p.child = d.child
|
|
359
|
-
AND NOT EXISTS (SELECT 1 FROM cards pc WHERE pc.tenant_id = ? AND pc.id = p.parent AND pc.status = 'done')) AS
|
|
385
|
+
AND NOT EXISTS (SELECT 1 FROM cards pc WHERE pc.tenant_id = ? AND pc.id = p.parent AND pc.status = 'done')) AS
|
|
386
|
+
open_parents
|
|
360
387
|
FROM card_deps d WHERE d.tenant_id = ? AND d.parent = ?
|
|
361
|
-
`)
|
|
388
|
+
`)
|
|
389
|
+
.all(tenantId, tenantId, tenantId, tenantId, parentId);
|
|
362
390
|
const unblocked = children.filter((r) => r.status === 'backlog' && r.open_parents === 0).map((r) => r.child);
|
|
363
391
|
for (const ids of chunked(unblocked))
|
|
364
392
|
transitionCards(db, tenantId, ids, { from: ['backlog'], to: 'ready' });
|
|
365
393
|
return unblocked;
|
|
366
394
|
}
|
|
367
|
-
/** Returns to ready every running card of the tenant whose lease has expired or is missing: clears its assignee, closes
|
|
368
|
-
* run as 'reclaimed' and leaves its handoffs alone, all in one write transaction. Returns the reclaimed card
|
|
395
|
+
/** Returns to ready every running card of the tenant whose lease has expired or is missing: clears its assignee, closes
|
|
396
|
+
* its live run as 'reclaimed' and leaves its handoffs alone, all in one write transaction. Returns the reclaimed card
|
|
397
|
+
* ids in id order. */
|
|
369
398
|
export function reclaimExpiredCards(hippoRoot, tenantId) {
|
|
370
399
|
assertTenantId('reclaimExpiredCards', tenantId);
|
|
371
400
|
return onHandle(hippoRoot, (db) => {
|
|
@@ -379,7 +408,11 @@ export function reclaimExpiredCards(hippoRoot, tenantId) {
|
|
|
379
408
|
ORDER BY id
|
|
380
409
|
`).all(tenantId, now).map((r) => r.id);
|
|
381
410
|
for (const id of ids) {
|
|
382
|
-
transitionCard(db, tenantId, id, {
|
|
411
|
+
transitionCard(db, tenantId, id, {
|
|
412
|
+
from: ['running'],
|
|
413
|
+
to: 'ready',
|
|
414
|
+
extra: { setSql: 'assignee_runtime = NULL' },
|
|
415
|
+
});
|
|
383
416
|
closeLiveRun(db, tenantId, id, 'reclaimed', now);
|
|
384
417
|
}
|
|
385
418
|
return ids;
|
|
@@ -13,6 +13,7 @@ export interface CallerItems {
|
|
|
13
13
|
readonly owner: string;
|
|
14
14
|
readonly origins: readonly string[];
|
|
15
15
|
}
|
|
16
|
-
/** A caller's items, already scrubbed, under its record: a retry of a finished request answers with the first count,
|
|
16
|
+
/** A caller's items, already scrubbed, under its record: a retry of a finished request answers with the first count,
|
|
17
|
+
* and a `summarised` one is reused. */
|
|
17
18
|
export declare function saveCallerItems(hippoRoot: string, tenantId: string, req: CallerItems, log: Log): number;
|
|
18
19
|
//# sourceMappingURL=compaction-caller.d.ts.map
|
|
@@ -9,7 +9,8 @@ export function startCompactionAt(hippoRoot, tenantId, start) {
|
|
|
9
9
|
export function markSnapshotSavedAt(hippoRoot, tenantId, recordId) {
|
|
10
10
|
onHandle(hippoRoot, (db) => markSnapshotSaved(db, tenantId, recordId));
|
|
11
11
|
}
|
|
12
|
-
/** A caller's items, already scrubbed, under its record: a retry of a finished request answers with the first count,
|
|
12
|
+
/** A caller's items, already scrubbed, under its record: a retry of a finished request answers with the first count,
|
|
13
|
+
* and a `summarised` one is reused. */
|
|
13
14
|
export function saveCallerItems(hippoRoot, tenantId, req, log) {
|
|
14
15
|
return onHandle(hippoRoot, (db) => {
|
|
15
16
|
const earlier = compactionByRequest(db, tenantId, req.requestId, req.sessionId);
|
|
@@ -28,8 +28,8 @@ export interface CompactionStart {
|
|
|
28
28
|
export declare function startCompaction(db: DatabaseSyncLike, tenantId: string, start: CompactionStart, at?: Date): string;
|
|
29
29
|
/** A session's newest record, or null. */
|
|
30
30
|
export declare function latestCompaction(db: DatabaseSyncLike, tenantId: string, sessionId: string): CompactionRecord | null;
|
|
31
|
-
/** The record a caller's request made, whatever state it reached, so a retry neither writes its items twice nor starts
|
|
32
|
-
* Another session's id is a ConflictError. */
|
|
31
|
+
/** The record a caller's request made, whatever state it reached, so a retry neither writes its items twice nor starts
|
|
32
|
+
* a second record. Another session's id is a ConflictError. */
|
|
33
33
|
export declare function compactionByRequest(db: DatabaseSyncLike, tenantId: string, requestId: string, sessionId: string): CompactionRecord | null;
|
|
34
34
|
/** Best effort, never throws: a compaction must not fail because its record could not be written. */
|
|
35
35
|
export declare function recordCompactionStart(hippoRoot: string, start: Omit<CompactionStart, 'originProject'>, log: Log): string | null;
|
|
@@ -51,7 +51,8 @@ export interface RecordSummaryOptions {
|
|
|
51
51
|
readonly at: Date;
|
|
52
52
|
readonly caller?: SummaryCaller;
|
|
53
53
|
}
|
|
54
|
-
/** Puts the summary on the session's `started` record, or inserts a `summarised` one when pre-compact wrote none. One
|
|
54
|
+
/** Puts the summary on the session's `started` record, or inserts a `summarised` one when pre-compact wrote none. One
|
|
55
|
+
* statement each. */
|
|
55
56
|
export declare function recordSummary(db: DatabaseSyncLike, hippoRoot: string, tenantId: string, options: RecordSummaryOptions): CompactionRecord;
|
|
56
57
|
export interface ItemContext {
|
|
57
58
|
tenantId: string;
|
|
@@ -62,13 +63,15 @@ export interface ItemContext {
|
|
|
62
63
|
/** Where the session ran, so rows held under the project's older folder name count too. */
|
|
63
64
|
cwd: string | null;
|
|
64
65
|
items: string[];
|
|
65
|
-
/** Set when another machine sent the items: its audit actor and its project's names, since the server's folder is
|
|
66
|
+
/** Set when another machine sent the items: its audit actor and its project's names, since the server's folder is
|
|
67
|
+
* neither. */
|
|
66
68
|
caller?: {
|
|
67
69
|
actor: string;
|
|
68
70
|
origins: readonly string[];
|
|
69
71
|
};
|
|
70
72
|
}
|
|
71
|
-
/** Items that become rows, then the record `done`, in one transaction so two sessions cannot both insert one text.
|
|
73
|
+
/** Items that become rows, then the record `done`, in one transaction so two sessions cannot both insert one text.
|
|
74
|
+
* Mirrors after commit. */
|
|
72
75
|
export declare function saveItems(db: DatabaseSyncLike, hippoRoot: string, ctx: ItemContext, log: Log): number;
|
|
73
76
|
export interface CompactionSaveResult {
|
|
74
77
|
/** Memories written; null when neither the record nor the items could be saved. */
|
|
@@ -77,12 +80,14 @@ export interface CompactionSaveResult {
|
|
|
77
80
|
deferred: boolean;
|
|
78
81
|
snapshotSaved: boolean;
|
|
79
82
|
}
|
|
80
|
-
/** What one PostCompact save did; `spoolReason` is set when the store was busy or would not open, so the caller keeps
|
|
83
|
+
/** What one PostCompact save did; `spoolReason` is set when the store was busy or would not open, so the caller keeps
|
|
84
|
+
* the summary on disk. */
|
|
81
85
|
export interface CompactionSaveOutcome {
|
|
82
86
|
result: CompactionSaveResult;
|
|
83
87
|
spoolReason: string | null;
|
|
84
88
|
}
|
|
85
|
-
/** The PostCompact store work, on a handle of its own: record the summary, then write its items. Each step is
|
|
89
|
+
/** The PostCompact store work, on a handle of its own: record the summary, then write its items. Each step is
|
|
90
|
+
* independent. Never throws. */
|
|
86
91
|
export declare function saveCompactionAt(hippoRoot: string, meta: Omit<CompactionStart, 'originProject'>, text: CompactionText, at: Date, log: Log): CompactionSaveOutcome;
|
|
87
92
|
/** One spooled summary, as plain data. */
|
|
88
93
|
export interface SpooledSummary {
|
|
@@ -91,7 +96,8 @@ export interface SpooledSummary {
|
|
|
91
96
|
text: CompactionText;
|
|
92
97
|
at: Date;
|
|
93
98
|
}
|
|
94
|
-
/** Records one spooled summary; it calls `recorded` once the store holds it, so the file is done even if a later step
|
|
99
|
+
/** Records one spooled summary; it calls `recorded` once the store holds it, so the file is done even if a later step
|
|
100
|
+
* throws. */
|
|
95
101
|
export type SpoolRecorder = (spooled: SpooledSummary, recorded: () => void) => void;
|
|
96
102
|
/** A summary read out of a transcript, scrubbed; `listed` is false when it had no memories section. */
|
|
97
103
|
export interface TranscriptText {
|
|
@@ -7,8 +7,8 @@ import { selectItemRows } from '../util/compaction-items.js';
|
|
|
7
7
|
import { isSharedStore, loadConfig } from '../core/config.js';
|
|
8
8
|
import { closeHippoDb, isSqliteBusy, openHippoDb, withWriteScopeOr } from '../db/index.js';
|
|
9
9
|
import { gatedWrite } from './gated-write.js';
|
|
10
|
-
import { COMPACTION_MEMORY_TAG, COMPACTION_SOURCE_PREFIX, Layer, createMemory, generateId } from '../core/memory.js';
|
|
11
|
-
import { fallbackOrigin, isGlobalStoreRoot, projectId, projectNames, resolveProjectIdentity } from '../core/project-identity.js';
|
|
10
|
+
import { COMPACTION_MEMORY_TAG, COMPACTION_SOURCE_PREFIX, Layer, createMemory, generateId, } from '../core/memory.js';
|
|
11
|
+
import { fallbackOrigin, isGlobalStoreRoot, projectId, projectNames, resolveProjectIdentity, } from '../core/project-identity.js';
|
|
12
12
|
import { closeStartedWithoutSummary, compactionProgress, compactionRowsByRequest, heldMemoryRows, insertStartedCompaction, insertSummarisedCompaction, latestCompactionRows, latestStartedRows, markCompactionDone, markCompactionSummarised, markSnapshotSavedRow, nextCompactionStart, openTranscriptRows, stalledSummarisedRows, } from './compactions.js';
|
|
13
13
|
import { strengthenRetrievedOn, writeEntryMirrors } from './entry-writes.js';
|
|
14
14
|
import { isRecallBoostAblated } from '../core/ablation.js';
|
|
@@ -17,14 +17,18 @@ import { resolveTenantId } from './tenant.js';
|
|
|
17
17
|
import { errorMessage, reportCompactionFailure } from '../util/log.js';
|
|
18
18
|
/** The marker redactSecretsStrict writes; an item holding it was a secret before it was stored. */
|
|
19
19
|
const REDACTED = '[REDACTED]';
|
|
20
|
-
/** Where the session ran: rows written through the global store or a shared store keep the project the session was
|
|
20
|
+
/** Where the session ran: rows written through the global store or a shared store keep the project the session was
|
|
21
|
+
* in. */
|
|
21
22
|
function compactionProject(hippoRoot, cwd) {
|
|
22
|
-
if (!isGlobalStoreRoot(hippoRoot) && !isSharedStore(hippoRoot))
|
|
23
|
+
if (!isGlobalStoreRoot(hippoRoot) && !isSharedStore(hippoRoot)) {
|
|
23
24
|
return resolveProjectIdentity(path.dirname(hippoRoot));
|
|
24
|
-
|
|
25
|
+
}
|
|
26
|
+
// No cwd means user-global, as stampOriginProject gives the global store; undefined would fall back to the hook's own
|
|
27
|
+
// cwd.
|
|
25
28
|
return cwd === null ? '' : resolveProjectIdentity(cwd);
|
|
26
29
|
}
|
|
27
|
-
/** The record column cannot hold NULL, but an item from an unknown folder on a shared store must not read as
|
|
30
|
+
/** The record column cannot hold NULL, but an item from an unknown folder on a shared store must not read as
|
|
31
|
+
* user-global. */
|
|
28
32
|
function itemOrigin(hippoRoot, ctx) {
|
|
29
33
|
return ctx.cwd === null && isSharedStore(hippoRoot) ? fallbackOrigin(hippoRoot) : ctx.originProject;
|
|
30
34
|
}
|
|
@@ -64,30 +68,39 @@ export function startCompaction(db, tenantId, start, at = new Date()) {
|
|
|
64
68
|
export function latestCompaction(db, tenantId, sessionId) {
|
|
65
69
|
return latestCompactionRows(db, tenantId, sessionId).map(toRecord)[0] ?? null;
|
|
66
70
|
}
|
|
67
|
-
/** The record a caller's request made, whatever state it reached, so a retry neither writes its items twice nor starts
|
|
68
|
-
* Another session's id is a ConflictError. */
|
|
71
|
+
/** The record a caller's request made, whatever state it reached, so a retry neither writes its items twice nor starts
|
|
72
|
+
* a second record. Another session's id is a ConflictError. */
|
|
69
73
|
export function compactionByRequest(db, tenantId, requestId, sessionId) {
|
|
70
74
|
const record = compactionRowsByRequest(db, tenantId, requestId).map(toRecord)[0] ?? null;
|
|
71
75
|
// Sessions are owner-bound, so this also keeps one owner from reading or finishing another's record.
|
|
72
|
-
if (record !== null && record.sessionId !== sessionId)
|
|
76
|
+
if (record !== null && record.sessionId !== sessionId) {
|
|
73
77
|
throw new ConflictError('request id belongs to another session');
|
|
78
|
+
}
|
|
74
79
|
return record;
|
|
75
80
|
}
|
|
76
|
-
/** Pre-compact's record for the compaction that is ending: the session's newest `started` one within REPLAY_AFTER_MS
|
|
77
|
-
* An older one is left for the transcript fill. */
|
|
81
|
+
/** Pre-compact's record for the compaction that is ending: the session's newest `started` one within REPLAY_AFTER_MS
|
|
82
|
+
* before `at`. An older one is left for the transcript fill. */
|
|
78
83
|
function latestStarted(db, tenantId, sessionId, at) {
|
|
79
|
-
return latestStartedRows(db, tenantId, sessionId, at.toISOString(), new Date(at.getTime() - REPLAY_AFTER_MS).toISOString()).map(toRecord)[0] ?? null;
|
|
84
|
+
return (latestStartedRows(db, tenantId, sessionId, at.toISOString(), new Date(at.getTime() - REPLAY_AFTER_MS).toISOString()).map(toRecord)[0] ?? null);
|
|
80
85
|
}
|
|
81
86
|
function markSummarised(db, tenantId, id, options) {
|
|
82
87
|
const { text, summarisedAt, requestId } = options;
|
|
83
|
-
return markCompactionSummarised(db, tenantId, id, {
|
|
88
|
+
return markCompactionSummarised(db, tenantId, id, {
|
|
89
|
+
summary: text.summary,
|
|
90
|
+
itemsJson: JSON.stringify(text.items),
|
|
91
|
+
summarisedAt,
|
|
92
|
+
requestId,
|
|
93
|
+
});
|
|
84
94
|
}
|
|
85
95
|
/** Best effort, never throws: a compaction must not fail because its record could not be written. */
|
|
86
96
|
export function recordCompactionStart(hippoRoot, start, log) {
|
|
87
97
|
let db;
|
|
88
98
|
try {
|
|
89
99
|
db = openHippoDb(hippoRoot, { busyWaitMs: COMPACTION_DB_WAIT_MS });
|
|
90
|
-
return startCompaction(db, resolveTenantId({}), {
|
|
100
|
+
return startCompaction(db, resolveTenantId({}), {
|
|
101
|
+
...start,
|
|
102
|
+
originProject: compactionOrigin(hippoRoot, start.cwd),
|
|
103
|
+
});
|
|
91
104
|
}
|
|
92
105
|
catch (err) {
|
|
93
106
|
log(`compaction record not started: ${errorMessage(err)}`);
|
|
@@ -116,7 +129,8 @@ export function recordSnapshotSaved(hippoRoot, tenantId, recordId, log) {
|
|
|
116
129
|
closeHippoDb(db);
|
|
117
130
|
}
|
|
118
131
|
}
|
|
119
|
-
/** Puts the summary on the session's `started` record, or inserts a `summarised` one when pre-compact wrote none. One
|
|
132
|
+
/** Puts the summary on the session's `started` record, or inserts a `summarised` one when pre-compact wrote none. One
|
|
133
|
+
* statement each. */
|
|
120
134
|
export function recordSummary(db, hippoRoot, tenantId, options) {
|
|
121
135
|
const { meta, text, at, caller = {} } = options;
|
|
122
136
|
const now = new Date().toISOString();
|
|
@@ -130,18 +144,44 @@ export function recordSummary(db, hippoRoot, tenantId, options) {
|
|
|
130
144
|
const id = generateId('cmp');
|
|
131
145
|
insertSummarisedCompaction(db, tenantId, { ...meta, originProject, startedAt: at.toISOString() }, { id, summary: text.summary, itemsJson, summarisedAt: now, requestId });
|
|
132
146
|
return {
|
|
133
|
-
id,
|
|
134
|
-
|
|
147
|
+
id,
|
|
148
|
+
tenantId,
|
|
149
|
+
sessionId: meta.sessionId,
|
|
150
|
+
originProject,
|
|
151
|
+
trigger: meta.trigger,
|
|
152
|
+
cwd: meta.cwd,
|
|
153
|
+
transcriptPath: meta.transcriptPath,
|
|
154
|
+
snapshotSaved: false,
|
|
155
|
+
startedAt: at.toISOString(),
|
|
156
|
+
summarisedAt: now,
|
|
157
|
+
summary: text.summary,
|
|
158
|
+
items: text.items,
|
|
159
|
+
itemsWritten: 0,
|
|
160
|
+
status: 'summarised',
|
|
135
161
|
};
|
|
136
162
|
}
|
|
137
163
|
/** Words whose loss reverses or narrows a statement: "do not", "can't", "only", "unless". */
|
|
138
|
-
const PROTECTED_WORDS = new Set([
|
|
164
|
+
const PROTECTED_WORDS = new Set([
|
|
165
|
+
'not',
|
|
166
|
+
'no',
|
|
167
|
+
'never',
|
|
168
|
+
'none',
|
|
169
|
+
'nor',
|
|
170
|
+
'without',
|
|
171
|
+
'cannot',
|
|
172
|
+
't',
|
|
173
|
+
'only',
|
|
174
|
+
'except',
|
|
175
|
+
'unless',
|
|
176
|
+
'until',
|
|
177
|
+
]);
|
|
139
178
|
/** Below this share of the held text's words, an item is a fragment of something longer, not a restatement. */
|
|
140
179
|
const RESTATE_MIN_SHARE = 0.5;
|
|
141
180
|
function words(text) {
|
|
142
181
|
return text.normalize('NFC').toLowerCase().split(/[^\p{L}\p{M}\p{N}_]+/u).filter(Boolean);
|
|
143
182
|
}
|
|
144
|
-
/** True when `item` is `held` with words left out, in the same order, keeping every number and protected word. Spacing,
|
|
183
|
+
/** True when `item` is `held` with words left out, in the same order, keeping every number and protected word. Spacing,
|
|
184
|
+
* case and punctuation may differ. */
|
|
145
185
|
function restates(item, held) {
|
|
146
186
|
if (item.length === 0 || item.length < RESTATE_MIN_SHARE * held.length)
|
|
147
187
|
return false;
|
|
@@ -155,9 +195,14 @@ function restates(item, held) {
|
|
|
155
195
|
}
|
|
156
196
|
return next === item.length;
|
|
157
197
|
}
|
|
158
|
-
/** Live rows of one tenant and origin that default recall shows: a compaction often restates what an earlier one, or
|
|
198
|
+
/** Live rows of one tenant and origin that default recall shows: a compaction often restates what an earlier one, or
|
|
199
|
+
* the user, already saved. */
|
|
159
200
|
function heldRows(db, tenantId, origins) {
|
|
160
|
-
return heldMemoryRows(db, tenantId, origins).map((r) => ({
|
|
201
|
+
return heldMemoryRows(db, tenantId, origins).map((r) => ({
|
|
202
|
+
id: r.id,
|
|
203
|
+
sessionId: r.source_session_id,
|
|
204
|
+
words: words(r.content),
|
|
205
|
+
}));
|
|
161
206
|
}
|
|
162
207
|
function compactionEntry(text, ctx, origin, baseHalfLifeDays) {
|
|
163
208
|
return {
|
|
@@ -167,7 +212,7 @@ function compactionEntry(text, ctx, origin, baseHalfLifeDays) {
|
|
|
167
212
|
source: `${COMPACTION_SOURCE_PREFIX}${ctx.sessionId}`,
|
|
168
213
|
confidence: 'observed',
|
|
169
214
|
kind: 'distilled',
|
|
170
|
-
|
|
215
|
+
sourceSessionId: ctx.sessionId,
|
|
171
216
|
tenantId: ctx.tenantId,
|
|
172
217
|
baseHalfLifeDays,
|
|
173
218
|
}),
|
|
@@ -224,7 +269,8 @@ function finishItemWrites(hippoRoot, writes, log) {
|
|
|
224
269
|
}
|
|
225
270
|
}
|
|
226
271
|
}
|
|
227
|
-
/** Items that become rows, then the record `done`, in one transaction so two sessions cannot both insert one text.
|
|
272
|
+
/** Items that become rows, then the record `done`, in one transaction so two sessions cannot both insert one text.
|
|
273
|
+
* Mirrors after commit. */
|
|
228
274
|
export function saveItems(db, hippoRoot, ctx, log) {
|
|
229
275
|
const usable = ctx.items.filter((item) => !item.includes(REDACTED));
|
|
230
276
|
if (usable.length < ctx.items.length)
|
|
@@ -262,7 +308,11 @@ export function saveItems(db, hippoRoot, ctx, log) {
|
|
|
262
308
|
}
|
|
263
309
|
function recordStep(step) {
|
|
264
310
|
try {
|
|
265
|
-
const record = recordSummary(step.db, step.hippoRoot, step.tenantId, {
|
|
311
|
+
const record = recordSummary(step.db, step.hippoRoot, step.tenantId, {
|
|
312
|
+
meta: step.meta,
|
|
313
|
+
text: step.text,
|
|
314
|
+
at: step.at,
|
|
315
|
+
});
|
|
266
316
|
step.result.snapshotSaved = record.snapshotSaved;
|
|
267
317
|
return record;
|
|
268
318
|
}
|
|
@@ -294,7 +344,8 @@ function itemsStep(step, record) {
|
|
|
294
344
|
log(`store busy, items left for the next sleep: ${errorMessage(err)}`);
|
|
295
345
|
}
|
|
296
346
|
}
|
|
297
|
-
/** The PostCompact store work, on a handle of its own: record the summary, then write its items. Each step is
|
|
347
|
+
/** The PostCompact store work, on a handle of its own: record the summary, then write its items. Each step is
|
|
348
|
+
* independent. Never throws. */
|
|
298
349
|
export function saveCompactionAt(hippoRoot, meta, text, at, log) {
|
|
299
350
|
const result = { written: null, deferred: false, snapshotSaved: false };
|
|
300
351
|
let db;
|
|
@@ -315,27 +366,39 @@ export function saveCompactionAt(hippoRoot, meta, text, at, log) {
|
|
|
315
366
|
return { result, spoolReason: null };
|
|
316
367
|
}
|
|
317
368
|
function closeWithoutSummary(db, tenantId, id, log) {
|
|
318
|
-
if (closeStartedWithoutSummary(db, tenantId, id) > 0)
|
|
369
|
+
if (closeStartedWithoutSummary(db, tenantId, id) > 0) {
|
|
319
370
|
log(`${id} closed as no-summary: its transcript holds no summary for it`);
|
|
371
|
+
}
|
|
320
372
|
}
|
|
321
373
|
function nextStartedAt(db, record) {
|
|
322
374
|
return nextCompactionStart(db, record.tenantId, record.sessionId, record.startedAt);
|
|
323
375
|
}
|
|
324
376
|
/** The one place a record becomes the argument saveItems takes. */
|
|
325
377
|
function itemContext(tenantId, record, items = record.items) {
|
|
326
|
-
return {
|
|
378
|
+
return {
|
|
379
|
+
tenantId,
|
|
380
|
+
recordId: record.id,
|
|
381
|
+
sessionId: record.sessionId,
|
|
382
|
+
originProject: record.originProject,
|
|
383
|
+
cwd: record.cwd,
|
|
384
|
+
items,
|
|
385
|
+
};
|
|
327
386
|
}
|
|
328
387
|
/** Records a spooled summary, then writes its items. */
|
|
329
388
|
function spoolRecorder(db, hippoRoot, log) {
|
|
330
389
|
return (spooled, recorded) => {
|
|
331
|
-
const record = recordSummary(db, hippoRoot, spooled.tenantId, {
|
|
390
|
+
const record = recordSummary(db, hippoRoot, spooled.tenantId, {
|
|
391
|
+
meta: spooled.payload,
|
|
392
|
+
text: spooled.text,
|
|
393
|
+
at: spooled.at,
|
|
394
|
+
});
|
|
332
395
|
// The record holds the items now, so the file is done even if the write below fails.
|
|
333
396
|
recorded();
|
|
334
397
|
saveItems(db, hippoRoot, itemContext(spooled.tenantId, record), log);
|
|
335
398
|
};
|
|
336
399
|
}
|
|
337
|
-
/** Runs `step` over each row until the deadline; a row that will not map or a step that throws is logged and the rest
|
|
338
|
-
* Returns how many `step` finished. */
|
|
400
|
+
/** Runs `step` over each row until the deadline; a row that will not map or a step that throws is logged and the rest
|
|
401
|
+
* still run. Returns how many `step` finished. */
|
|
339
402
|
function replayEach(run, rows, what, step) {
|
|
340
403
|
let finished = 0;
|
|
341
404
|
for (const row of rows) {
|
|
@@ -393,8 +456,8 @@ function replayOpen(run) {
|
|
|
393
456
|
const open = openTranscriptRows(run.db, run.tenantId, new Date(run.now - REPLAY_AFTER_MS).toISOString(), new Date(run.now - TRANSCRIPT_FILL_WINDOW_MS).toISOString());
|
|
394
457
|
return replayEach(run, open, 'transcript fill', (record) => fillFromTranscript(run, record));
|
|
395
458
|
}
|
|
396
|
-
/** Finishes what a killed hook or a busy store left: `summarised` records, spool files, and `started` records the
|
|
397
|
-
* Returns how many compactions it saved. */
|
|
459
|
+
/** Finishes what a killed hook or a busy store left: `summarised` records, spool files, and `started` records the
|
|
460
|
+
* transcript can fill. Returns how many compactions it saved. */
|
|
398
461
|
function replayCompactions(db, hippoRoot, sources, log, deadline) {
|
|
399
462
|
const run = { db, hippoRoot, tenantId: resolveTenantId({}), now: Date.now(), sources, log, deadline };
|
|
400
463
|
return replayStalled(run) + replaySpool(run) + replayOpen(run);
|