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,6 +1,7 @@
|
|
|
1
1
|
import { originInSql } from '../core/project-identity.js';
|
|
2
2
|
import { scopeAdmitSql } from './rule-sql.js';
|
|
3
|
-
const COLUMNS = 'tenant_id, id, session_id, origin_project, compact_trigger, cwd, transcript_path, snapshot_saved, started_at,
|
|
3
|
+
const COLUMNS = 'tenant_id, id, session_id, origin_project, compact_trigger, cwd, transcript_path, snapshot_saved, started_at, ' +
|
|
4
|
+
'summarised_at, summary, ' +
|
|
4
5
|
'items_json, items_written, status';
|
|
5
6
|
function selectRows(db, where, ...params) {
|
|
6
7
|
// SAFETY: the SELECT names exactly COLUMNS, matching CompactionRow's field set.
|
|
@@ -15,7 +16,8 @@ export function compactionRowsByRequest(db, tenantId, requestId) {
|
|
|
15
16
|
}
|
|
16
17
|
/** The session's newest `started` row with a start in [`notBefore`, `notAfter`], both ISO strings. */
|
|
17
18
|
export function latestStartedRows(db, tenantId, sessionId, notAfter, notBefore) {
|
|
18
|
-
return selectRows(db, `tenant_id = ? AND session_id = ? AND status = 'started' AND started_at <= ? AND started_at >= ? ORDER BY
|
|
19
|
+
return selectRows(db, `tenant_id = ? AND session_id = ? AND status = 'started' AND started_at <= ? AND started_at >= ? ORDER BY ` +
|
|
20
|
+
`started_at DESC, id DESC LIMIT 1`, tenantId, sessionId, notAfter, notBefore);
|
|
19
21
|
}
|
|
20
22
|
/** `summarised` rows whose summary is older than `summarisedBefore`, an ISO string. */
|
|
21
23
|
export function stalledSummarisedRows(db, tenantId, summarisedBefore) {
|
|
@@ -23,10 +25,12 @@ export function stalledSummarisedRows(db, tenantId, summarisedBefore) {
|
|
|
23
25
|
}
|
|
24
26
|
/** `started` rows with a transcript whose start lies between `startedAfter` and `startedBefore`, oldest first. */
|
|
25
27
|
export function openTranscriptRows(db, tenantId, startedBefore, startedAfter) {
|
|
26
|
-
return selectRows(db, `tenant_id = ? AND status = 'started' AND started_at < ? AND started_at > ? AND transcript_path IS NOT NULL
|
|
28
|
+
return selectRows(db, `tenant_id = ? AND status = 'started' AND started_at < ? AND started_at > ? AND transcript_path IS NOT NULL ` +
|
|
29
|
+
`ORDER BY started_at`, tenantId, startedBefore, startedAfter);
|
|
27
30
|
}
|
|
28
31
|
export function insertStartedCompaction(db, tenantId, start) {
|
|
29
|
-
db.prepare(`INSERT INTO compactions(tenant_id, id, session_id, origin_project, compact_trigger, cwd, transcript_path,
|
|
32
|
+
db.prepare(`INSERT INTO compactions(tenant_id, id, session_id, origin_project, compact_trigger, cwd, transcript_path, ` +
|
|
33
|
+
`started_at)
|
|
30
34
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(tenantId, start.id, start.sessionId, start.originProject, start.trigger, start.cwd, start.transcriptPath, start.startedAt);
|
|
31
35
|
}
|
|
32
36
|
/** Moves a `started` row to `summarised`; false when another process already moved it. */
|
|
@@ -34,8 +38,11 @@ export function markCompactionSummarised(db, tenantId, id, update) {
|
|
|
34
38
|
const { summary, itemsJson, summarisedAt, requestId } = update;
|
|
35
39
|
// Only a caller names the column, so a store from before it was added still takes local writes.
|
|
36
40
|
const stamp = requestId === undefined ? [] : [requestId];
|
|
37
|
-
const result = db
|
|
38
|
-
|
|
41
|
+
const result = db
|
|
42
|
+
.prepare(`UPDATE compactions SET summary = ?, items_json = ?, summarised_at = ?, status = ` +
|
|
43
|
+
`'summarised'${stamp.length === 0 ? '' : ', request_id = ?'}
|
|
44
|
+
WHERE tenant_id = ? AND id = ? AND status = 'started'`)
|
|
45
|
+
.run(summary, itemsJson, summarisedAt, ...stamp, tenantId, id);
|
|
39
46
|
return (result.changes ?? 0) > 0;
|
|
40
47
|
}
|
|
41
48
|
export function insertSummarisedCompaction(db, tenantId, meta, row) {
|
|
@@ -43,7 +50,8 @@ export function insertSummarisedCompaction(db, tenantId, meta, row) {
|
|
|
43
50
|
// Only a caller names the column, so a store from before it was added still takes local writes.
|
|
44
51
|
const stamp = requestId === undefined ? [] : [requestId];
|
|
45
52
|
const [col, mark] = stamp.length === 0 ? ['', ''] : [', request_id', ', ?'];
|
|
46
|
-
db.prepare(`INSERT INTO compactions(tenant_id, id, session_id, origin_project, compact_trigger, cwd, transcript_path,
|
|
53
|
+
db.prepare(`INSERT INTO compactions(tenant_id, id, session_id, origin_project, compact_trigger, cwd, transcript_path, ` +
|
|
54
|
+
`started_at, ` +
|
|
47
55
|
`summarised_at, summary, items_json, status${col})\n` +
|
|
48
56
|
` VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'summarised'${mark})`).run(tenantId, id, meta.sessionId, meta.originProject, meta.trigger, meta.cwd, meta.transcriptPath, meta.startedAt, summarisedAt, summary, itemsJson, ...stamp);
|
|
49
57
|
}
|
|
@@ -51,7 +59,8 @@ export function markSnapshotSavedRow(db, tenantId, recordId) {
|
|
|
51
59
|
db.prepare(`UPDATE compactions SET snapshot_saved = 1 WHERE tenant_id = ? AND id = ?`).run(tenantId, recordId);
|
|
52
60
|
}
|
|
53
61
|
export function compactionProgress(db, tenantId, id) {
|
|
54
|
-
return db
|
|
62
|
+
return db
|
|
63
|
+
.prepare(`SELECT status, items_written FROM compactions WHERE tenant_id = ? AND id = ?`)
|
|
55
64
|
.get(tenantId, id);
|
|
56
65
|
}
|
|
57
66
|
export function markCompactionDone(db, tenantId, id, itemsWritten) {
|
|
@@ -59,11 +68,14 @@ export function markCompactionDone(db, tenantId, id, itemsWritten) {
|
|
|
59
68
|
}
|
|
60
69
|
/** Rows changed: 1 when the `started` row was closed, 0 when it had already moved. */
|
|
61
70
|
export function closeStartedWithoutSummary(db, tenantId, id) {
|
|
62
|
-
const result = db
|
|
71
|
+
const result = db
|
|
72
|
+
.prepare(`UPDATE compactions SET status = 'no-summary' WHERE tenant_id = ? AND id = ? AND status = 'started'`)
|
|
73
|
+
.run(tenantId, id);
|
|
63
74
|
return Number(result.changes ?? 0);
|
|
64
75
|
}
|
|
65
76
|
export function nextCompactionStart(db, tenantId, sessionId, after) {
|
|
66
|
-
const row = db
|
|
77
|
+
const row = db
|
|
78
|
+
.prepare(`SELECT MIN(started_at) AS at FROM compactions WHERE tenant_id = ? AND session_id = ? AND started_at > ?`)
|
|
67
79
|
.get(tenantId, sessionId, after);
|
|
68
80
|
return row?.at ?? null;
|
|
69
81
|
}
|
|
@@ -71,8 +83,11 @@ export function nextCompactionStart(db, tenantId, sessionId, after) {
|
|
|
71
83
|
export function heldMemoryRows(db, tenantId, origins) {
|
|
72
84
|
const deny = scopeAdmitSql('');
|
|
73
85
|
// SAFETY: the SELECT names the id, source_session_id and content columns.
|
|
74
|
-
return db
|
|
75
|
-
|
|
86
|
+
return db
|
|
87
|
+
.prepare(`SELECT id, source_session_id, content FROM memories WHERE tenant_id = ? AND ${originInSql(origins)} AND ` +
|
|
88
|
+
`superseded_by IS NULL AND kind != 'raw'
|
|
89
|
+
AND ${deny.sql}`)
|
|
90
|
+
.all(tenantId, ...origins, ...deny.params);
|
|
76
91
|
}
|
|
77
92
|
export function restampCompactionOrigin(db, tenantId, from, into) {
|
|
78
93
|
return Number(db.prepare(`UPDATE compactions SET origin_project = ? WHERE tenant_id = ? AND origin_project = ?`)
|
|
@@ -80,16 +95,21 @@ export function restampCompactionOrigin(db, tenantId, from, into) {
|
|
|
80
95
|
}
|
|
81
96
|
export function compactionTranscripts(db, tenantId) {
|
|
82
97
|
// SAFETY: the SELECT names the two columns of the row type.
|
|
83
|
-
return db
|
|
98
|
+
return db
|
|
99
|
+
.prepare(`SELECT DISTINCT transcript_path AS transcript, cwd FROM compactions WHERE tenant_id = ? AND transcript_path ` +
|
|
100
|
+
`IS NOT NULL`)
|
|
84
101
|
.all(tenantId);
|
|
85
102
|
}
|
|
86
103
|
export function compactionOriginsWithCwd(db, tenantId) {
|
|
87
104
|
// SAFETY: the SELECT names the two columns of the row type.
|
|
88
|
-
return db
|
|
105
|
+
return db
|
|
106
|
+
.prepare(`SELECT DISTINCT origin_project AS origin, cwd FROM compactions WHERE tenant_id = ? AND origin_project <> '' ` +
|
|
107
|
+
`AND cwd IS NOT NULL`)
|
|
89
108
|
.all(tenantId);
|
|
90
109
|
}
|
|
91
110
|
/** True when `table` holds a row of this tenant under the project name. */
|
|
92
111
|
export function holdsOrigin(db, table, tenantId, name) {
|
|
93
|
-
return db.prepare(`SELECT 1 FROM ${table} WHERE tenant_id = ? AND origin_project = ? LIMIT 1`).get(tenantId, name) !==
|
|
112
|
+
return (db.prepare(`SELECT 1 FROM ${table} WHERE tenant_id = ? AND origin_project = ? LIMIT 1`).get(tenantId, name) !==
|
|
113
|
+
undefined);
|
|
94
114
|
}
|
|
95
115
|
//# sourceMappingURL=compactions.js.map
|
|
@@ -4,18 +4,21 @@ import { type MemoryConflict } from './rows.js';
|
|
|
4
4
|
export declare function listMemoryConflicts(hippoRoot: string, status?: string, tenantId?: string): MemoryConflict[];
|
|
5
5
|
/** How many open conflicts listMemoryConflicts returns for a tenant, without loading one. */
|
|
6
6
|
export declare function countOpenConflicts(hippoRoot: string, tenantId: string): number;
|
|
7
|
+
/** countOpenConflicts on a handle the caller holds, so it can share a snapshot with other reads. */
|
|
8
|
+
export declare function countOpenConflictsAt(db: DatabaseSyncLike, tenantId: string): number;
|
|
7
9
|
/** One open conflict of a memory, with the row on its other side. */
|
|
8
10
|
export interface OpenConflictOf {
|
|
9
11
|
conflict: MemoryConflict;
|
|
10
12
|
other: MemoryEntry;
|
|
11
13
|
}
|
|
12
|
-
/** A tenant's open conflicts naming `memoryId`, in listMemoryConflicts'
|
|
14
|
+
/** A tenant's open conflicts naming `memoryId`, in listMemoryConflicts'
|
|
15
|
+
* order, each with its other member read in one batch. */
|
|
13
16
|
export declare function loadOpenConflictsOf(hippoRoot: string, tenantId: string, memoryId: string): OpenConflictOf[];
|
|
14
17
|
/** Conflicts whose two rows `actor` may both touch; someone else's personal row hides its whole pair. */
|
|
15
18
|
export declare function listTouchableConflicts(hippoRoot: string, status: string, tenantId: string, actor: {
|
|
16
19
|
owner?: string;
|
|
17
20
|
}): MemoryConflict[];
|
|
18
|
-
type DetectedConflict = {
|
|
21
|
+
export type DetectedConflict = {
|
|
19
22
|
memory_a_id: string;
|
|
20
23
|
memory_b_id: string;
|
|
21
24
|
reason: string;
|
|
@@ -23,7 +26,8 @@ type DetectedConflict = {
|
|
|
23
26
|
};
|
|
24
27
|
type SameTenant = (a: string, b: string) => boolean;
|
|
25
28
|
export declare function replaceDetectedConflicts(hippoRoot: string, detected: Array<DetectedConflict>, detectedAt?: string): void;
|
|
26
|
-
/** The tenant of every memory the refresh can compare, and each stored conflicts_with_json other than '[]', read
|
|
29
|
+
/** The tenant of every memory the refresh can compare, and each stored conflicts_with_json other than '[]', read
|
|
30
|
+
* before the refresh takes the write lock. */
|
|
27
31
|
export interface ConflictRefreshReads {
|
|
28
32
|
sameTenant: SameTenant;
|
|
29
33
|
storedRefs: ReadonlyMap<string, string | null>;
|
|
@@ -44,7 +48,8 @@ export interface ResolveConflictRequest {
|
|
|
44
48
|
readonly forgetLoser?: boolean;
|
|
45
49
|
readonly tenantId?: string;
|
|
46
50
|
}
|
|
47
|
-
/** Resolve a conflict by keeping one memory and halving the loser's half-life; `--forget` removes the loser,
|
|
51
|
+
/** Resolve a conflict by keeping one memory and halving the loser's half-life; `--forget` removes the loser,
|
|
52
|
+
* `opts.rejectLoserValue` also tombstones its
|
|
48
53
|
* digest. Every path emits a `conflict_resolve` audit row. Returns the resolved conflict, or null if not found. */
|
|
49
54
|
export declare function resolveConflict(hippoRoot: string, { conflictId, keepId, forgetLoser, tenantId }: ResolveConflictRequest, opts?: ResolveConflictOpts): {
|
|
50
55
|
conflict: MemoryConflict;
|
package/dist/store/conflicts.js
CHANGED
|
@@ -22,25 +22,30 @@ function canonicalConflictPair(aId, bId) {
|
|
|
22
22
|
: { memory_a_id: bId, memory_b_id: aId };
|
|
23
23
|
}
|
|
24
24
|
function selectConflictRowsInTenant(db, status, allStatuses, tenantId) {
|
|
25
|
-
// Tenanted query: JOIN memories on both members and require each in-tenant, so no cross-tenant or stale pre-fix pair
|
|
25
|
+
// Tenanted query: JOIN memories on both members and require each in-tenant, so no cross-tenant or stale pre-fix pair
|
|
26
|
+
// surfaces.
|
|
26
27
|
// SAFETY: both branches select CONFLICT_COLS_MC, MemoryConflictRow's columns.
|
|
27
28
|
return allStatuses
|
|
28
|
-
? db
|
|
29
|
+
? db
|
|
30
|
+
.prepare(`
|
|
29
31
|
SELECT ${CONFLICT_COLS_MC}
|
|
30
32
|
FROM memory_conflicts mc
|
|
31
33
|
JOIN memories ma ON ma.id = mc.memory_a_id
|
|
32
34
|
JOIN memories mb ON mb.id = mc.memory_b_id
|
|
33
35
|
WHERE ma.tenant_id = ? AND mb.tenant_id = ?
|
|
34
36
|
ORDER BY mc.updated_at DESC, mc.id DESC
|
|
35
|
-
`)
|
|
36
|
-
|
|
37
|
+
`)
|
|
38
|
+
.all(tenantId, tenantId)
|
|
39
|
+
: db
|
|
40
|
+
.prepare(`
|
|
37
41
|
SELECT ${CONFLICT_COLS_MC}
|
|
38
42
|
FROM memory_conflicts mc
|
|
39
43
|
JOIN memories ma ON ma.id = mc.memory_a_id
|
|
40
44
|
JOIN memories mb ON mb.id = mc.memory_b_id
|
|
41
45
|
WHERE mc.status = ? AND ma.tenant_id = ? AND mb.tenant_id = ?
|
|
42
46
|
ORDER BY mc.updated_at DESC, mc.id DESC
|
|
43
|
-
`)
|
|
47
|
+
`)
|
|
48
|
+
.all(status, tenantId, tenantId);
|
|
44
49
|
}
|
|
45
50
|
function selectConflictRowsUnscoped(db, status, allStatuses) {
|
|
46
51
|
// Unscoped query — legacy direct-mode (CLI, tests, consolidate).
|
|
@@ -60,7 +65,8 @@ function selectConflictRowsUnscoped(db, status, allStatuses) {
|
|
|
60
65
|
}
|
|
61
66
|
export function listMemoryConflicts(hippoRoot, status = 'open', tenantId) {
|
|
62
67
|
return onHandle(hippoRoot, (db) => {
|
|
63
|
-
// '*' is a sentinel for no status filter; the 4 SQL branches below
|
|
68
|
+
// '*' is a sentinel for no status filter; the 4 SQL branches below
|
|
69
|
+
// cover {tenanted | unscoped} x {all-statuses | specific-status}.
|
|
64
70
|
const allStatuses = status === '*';
|
|
65
71
|
const rows = tenantId !== undefined
|
|
66
72
|
? selectConflictRowsInTenant(db, status, allStatuses, tenantId)
|
|
@@ -75,13 +81,16 @@ const OPEN_IN_TENANT = `FROM memory_conflicts mc
|
|
|
75
81
|
WHERE mc.status = 'open' AND ma.tenant_id = ? AND mb.tenant_id = ?`;
|
|
76
82
|
/** How many open conflicts listMemoryConflicts returns for a tenant, without loading one. */
|
|
77
83
|
export function countOpenConflicts(hippoRoot, tenantId) {
|
|
78
|
-
return onHandle(hippoRoot, (db) =>
|
|
79
|
-
// SAFETY: one row with the single aliased count column.
|
|
80
|
-
const row = db.prepare(`SELECT COUNT(*) AS n ${OPEN_IN_TENANT}`).get(tenantId, tenantId);
|
|
81
|
-
return Number(row.n);
|
|
82
|
-
}, openStore);
|
|
84
|
+
return onHandle(hippoRoot, (db) => countOpenConflictsAt(db, tenantId), openStore);
|
|
83
85
|
}
|
|
84
|
-
/**
|
|
86
|
+
/** countOpenConflicts on a handle the caller holds, so it can share a snapshot with other reads. */
|
|
87
|
+
export function countOpenConflictsAt(db, tenantId) {
|
|
88
|
+
// SAFETY: one row with the single aliased count column.
|
|
89
|
+
const row = db.prepare(`SELECT COUNT(*) AS n ${OPEN_IN_TENANT}`).get(tenantId, tenantId);
|
|
90
|
+
return Number(row.n);
|
|
91
|
+
}
|
|
92
|
+
/** A tenant's open conflicts naming `memoryId`, in listMemoryConflicts'
|
|
93
|
+
* order, each with its other member read in one batch. */
|
|
85
94
|
export function loadOpenConflictsOf(hippoRoot, tenantId, memoryId) {
|
|
86
95
|
return onHandle(hippoRoot, (db) => {
|
|
87
96
|
// SAFETY: selects CONFLICT_COLS_MC, MemoryConflictRow's columns.
|
|
@@ -113,7 +122,8 @@ export function replaceDetectedConflicts(hippoRoot, detected, detectedAt = new D
|
|
|
113
122
|
syncChangedMirrors(hippoRoot, db, [...selectEntriesByIds(db, changedIds).values()]);
|
|
114
123
|
}, openStore);
|
|
115
124
|
}
|
|
116
|
-
/** The refresh's reads, kept out of the write lock; only rows holding refs, in an open conflict or in `detected` are
|
|
125
|
+
/** The refresh's reads, kept out of the write lock; only rows holding refs, in an open conflict or in `detected` are
|
|
126
|
+
* loaded, not the whole table. */
|
|
117
127
|
function readConflictRefresh(db, detected) {
|
|
118
128
|
// Tenant guard (E2): a conflict is meaningful only within one tenant, so cross-tenant pairs are
|
|
119
129
|
// skipped on insert and on rebuild, and a stale cross-tenant row can neither persist nor leak a foreign id.
|
|
@@ -171,7 +181,8 @@ function resolveStaleOpenConflicts(db, canonicalDetected, sameTenant, detectedAt
|
|
|
171
181
|
for (const row of openRows) {
|
|
172
182
|
const key = `${row.memory_a_id}::${row.memory_b_id}`;
|
|
173
183
|
const stale = !detectedKeys.has(key);
|
|
174
|
-
// Auto-resolve any open cross-tenant row: the insert loop and refMap rebuild skip those pairs, so re-detected ones
|
|
184
|
+
// Auto-resolve any open cross-tenant row: the insert loop and refMap rebuild skip those pairs, so re-detected ones
|
|
185
|
+
// would linger as 'open'.
|
|
175
186
|
const crossTenant = !sameTenant(row.memory_a_id, row.memory_b_id);
|
|
176
187
|
if (stale || crossTenant)
|
|
177
188
|
resolve.run(detectedAt, row.id);
|
|
@@ -204,8 +215,8 @@ function rebuildConflictsWithJson(db, { sameTenant, storedRefs }) {
|
|
|
204
215
|
`).all();
|
|
205
216
|
const refMap = new Map();
|
|
206
217
|
for (const row of openConflicts) {
|
|
207
|
-
// Skip cross-tenant pairs so a stale row never
|
|
208
|
-
// into conflicts_with_json.
|
|
218
|
+
// Skip cross-tenant pairs so a stale row never
|
|
219
|
+
// seeds a foreign id into conflicts_with_json.
|
|
209
220
|
if (!sameTenant(row.memory_a_id, row.memory_b_id))
|
|
210
221
|
continue;
|
|
211
222
|
if (!refMap.has(row.memory_a_id))
|
|
@@ -215,8 +226,10 @@ function rebuildConflictsWithJson(db, { sameTenant, storedRefs }) {
|
|
|
215
226
|
refMap.get(row.memory_a_id).add(row.memory_b_id);
|
|
216
227
|
refMap.get(row.memory_b_id).add(row.memory_a_id);
|
|
217
228
|
}
|
|
218
|
-
// Only a row holding refs, or due some, can change. Compare-and-set, so a writer since the read keeps its value and
|
|
219
|
-
|
|
229
|
+
// Only a row holding refs, or due some, can change. Compare-and-set, so a writer since the read keeps its value and
|
|
230
|
+
// the next sleep redoes the row.
|
|
231
|
+
const update = db.prepare(`UPDATE memories SET conflicts_with_json = ?, updated_at = datetime('now') ` +
|
|
232
|
+
`WHERE id = ? AND conflicts_with_json IS ?`);
|
|
220
233
|
const changedIds = [];
|
|
221
234
|
for (const id of new Set([...storedRefs.keys(), ...refMap.keys()])) {
|
|
222
235
|
const stored = storedRefs.has(id) ? storedRefs.get(id) ?? null : '[]';
|
|
@@ -228,7 +241,8 @@ function rebuildConflictsWithJson(db, { sameTenant, storedRefs }) {
|
|
|
228
241
|
}
|
|
229
242
|
return changedIds;
|
|
230
243
|
}
|
|
231
|
-
// With tenantId, both members must be in-tenant and every memories mutation carries AND tenant_id = ?; a cross-tenant
|
|
244
|
+
// With tenantId, both members must be in-tenant and every memories mutation carries AND tenant_id = ?; a cross-tenant
|
|
245
|
+
// probe returns null like a bad id.
|
|
232
246
|
// Omitted tenantId = unscoped (CLI direct mode, tests).
|
|
233
247
|
function conflictMemScope(tenantId) {
|
|
234
248
|
return {
|
|
@@ -252,7 +266,8 @@ function findResolvableConflict(db, conflictId, keepId, tenantId) {
|
|
|
252
266
|
return null;
|
|
253
267
|
return { conflict, loserId };
|
|
254
268
|
}
|
|
255
|
-
/** Resolve a conflict by keeping one memory and halving the loser's half-life; `--forget` removes the loser,
|
|
269
|
+
/** Resolve a conflict by keeping one memory and halving the loser's half-life; `--forget` removes the loser,
|
|
270
|
+
* `opts.rejectLoserValue` also tombstones its
|
|
256
271
|
* digest. Every path emits a `conflict_resolve` audit row. Returns the resolved conflict, or null if not found. */
|
|
257
272
|
export function resolveConflict(hippoRoot, { conflictId, keepId, forgetLoser = false, tenantId }, opts) {
|
|
258
273
|
const db = openStore(hippoRoot);
|
|
@@ -299,18 +314,26 @@ function selectConflictRow(db, conflictId, tenantId) {
|
|
|
299
314
|
}
|
|
300
315
|
function weakenConflictLoser(db, t) {
|
|
301
316
|
// Halve the loser's half-life (weakens it over time)
|
|
302
|
-
db.prepare(`UPDATE memories SET half_life_days = MAX(1, half_life_days / 2), updated_at = datetime('now')
|
|
303
|
-
.run(t.loserId, ...t.scope.memArgs);
|
|
304
|
-
return {
|
|
317
|
+
db.prepare(`UPDATE memories SET half_life_days = MAX(1, half_life_days / 2), updated_at = datetime('now') ` +
|
|
318
|
+
`WHERE id = ?${t.scope.memScope}`).run(t.loserId, ...t.scope.memArgs);
|
|
319
|
+
return {
|
|
320
|
+
loserRemoved: false,
|
|
321
|
+
loserWasRaw: false,
|
|
322
|
+
rejectedDigest: undefined,
|
|
323
|
+
extraRemovedIds: [],
|
|
324
|
+
extraRemovedRawIds: [],
|
|
325
|
+
};
|
|
305
326
|
}
|
|
306
327
|
function removeConflictLoser(db, t) {
|
|
307
|
-
// Removal is kind-aware: a bare DELETE on a raw loser fires the append-only trigger, so use the same helpers as the
|
|
328
|
+
// Removal is kind-aware: a bare DELETE on a raw loser fires the append-only trigger, so use the same helpers as the
|
|
329
|
+
// reject verb.
|
|
308
330
|
// loserRemoved / loserWasRaw drive the conflicts_with_json skip below and the post-commit mirror purge.
|
|
309
331
|
const removal = {
|
|
310
332
|
loserRemoved: false,
|
|
311
333
|
loserWasRaw: false,
|
|
312
334
|
rejectedDigest: undefined,
|
|
313
|
-
// Same-tenant duplicates of the loser's content that rejectLoserValue also removes; kept apart from loserId so
|
|
335
|
+
// Same-tenant duplicates of the loser's content that rejectLoserValue also removes; kept apart from loserId so
|
|
336
|
+
// audit and mirror purge cover all of them.
|
|
314
337
|
extraRemovedIds: [],
|
|
315
338
|
extraRemovedRawIds: [],
|
|
316
339
|
};
|
|
@@ -350,28 +373,31 @@ function recordRejectedLoserValue(db, t, loserRow, digest, who) {
|
|
|
350
373
|
normalizedChars: normalizeValueForRejection(loserRow.content).length,
|
|
351
374
|
});
|
|
352
375
|
}
|
|
353
|
-
/**
|
|
354
|
-
function
|
|
355
|
-
if (isPersonalScope(loserRow.scope)) {
|
|
356
|
-
throw new BadRequestError(`cannot reject the value of personal memory ${t.loserId}: a rejection reaches the whole tenant, ` +
|
|
357
|
-
`so its reason would show to everyone; resolve with forget instead`);
|
|
358
|
-
}
|
|
376
|
+
/** Removes the live same-tenant rows whose digest matches the rejected value into `removal`; `keepId` is spared. */
|
|
377
|
+
function removeDuplicatesOfRejectedValue(db, t, loserRow, rejectedDigest, who, removal) {
|
|
359
378
|
const { actor, reason } = who;
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
//
|
|
363
|
-
//
|
|
379
|
+
// Remove ALL live same-tenant rows whose digest matches (as reject-flow.ts rejectValue does), not just loserId; the
|
|
380
|
+
// O(N) scan is human-scale.
|
|
381
|
+
// Tenant-scoped ONLY, since tombstones are; `keepId` is excluded even if its content matches, because the human chose
|
|
382
|
+
// to keep it.
|
|
364
383
|
const loserTenantId = loserRow.tenant_id ?? DEFAULT_TENANT_ID;
|
|
365
|
-
//
|
|
384
|
+
// SHORTCUT: streams the tenant to hold only the matches; a stored digest column with a (tenant_id, digest) index
|
|
385
|
+
// would read just those.
|
|
386
|
+
// SAFETY: each row has the four columns named in the SELECT.
|
|
366
387
|
const dupRows = db
|
|
367
388
|
.prepare(`SELECT id, kind, content, scope FROM memories WHERE tenant_id = ? AND id != ? AND id != ?`)
|
|
368
|
-
.
|
|
389
|
+
.iterate(loserTenantId, t.loserId, t.keepId);
|
|
390
|
+
const dups = [];
|
|
369
391
|
for (const dup of dupRows) {
|
|
370
392
|
if (rejectionDigest(dup.content) !== rejectedDigest)
|
|
371
393
|
continue;
|
|
372
394
|
// Another person's personal row is outside this resolver's reach, as it is outside their recall.
|
|
373
395
|
if (isPersonalScope(dup.scope) && dup.scope !== loserRow.scope)
|
|
374
396
|
continue;
|
|
397
|
+
dups.push({ id: dup.id, kind: dup.kind });
|
|
398
|
+
}
|
|
399
|
+
// Removed after the read ends, since deleting rows under an open cursor can skip or repeat rows.
|
|
400
|
+
for (const dup of dups) {
|
|
375
401
|
if (dup.kind === 'raw') {
|
|
376
402
|
archiveRawMemory(db, dup.id, { reason, who: actor });
|
|
377
403
|
removal.extraRemovedRawIds.push(dup.id);
|
|
@@ -381,6 +407,16 @@ function tombstoneLoserValue(db, t, loserRow, who, removal) {
|
|
|
381
407
|
}
|
|
382
408
|
removal.extraRemovedIds.push(dup.id);
|
|
383
409
|
}
|
|
410
|
+
}
|
|
411
|
+
/** Tombstones the loser's digest and removes its same-tenant duplicates into `removal`; returns the digest. */
|
|
412
|
+
function tombstoneLoserValue(db, t, loserRow, who, removal) {
|
|
413
|
+
if (isPersonalScope(loserRow.scope)) {
|
|
414
|
+
throw new BadRequestError(`cannot reject the value of personal memory ${t.loserId}: a rejection reaches the whole tenant, ` +
|
|
415
|
+
`so its reason would show to everyone; resolve with forget instead`);
|
|
416
|
+
}
|
|
417
|
+
const rejectedDigest = rejectionDigest(loserRow.content);
|
|
418
|
+
recordRejectedLoserValue(db, t, loserRow, rejectedDigest, who);
|
|
419
|
+
removeDuplicatesOfRejectedValue(db, t, loserRow, rejectedDigest, who, removal);
|
|
384
420
|
return rejectedDigest;
|
|
385
421
|
}
|
|
386
422
|
function stripConflictRefs(db, t, loserRemoved) {
|
|
@@ -390,7 +426,11 @@ function stripConflictRefs(db, t, loserRemoved) {
|
|
|
390
426
|
// SAFETY: keepRow's shape matches the single `conflicts_with_json` column selected above.
|
|
391
427
|
const keepRow = db.prepare(`SELECT conflicts_with_json FROM memories WHERE id = ?${memScope}`).get(keepId, ...memArgs);
|
|
392
428
|
if (keepRow) {
|
|
393
|
-
const refs = parseJsonArray(keepRow.conflicts_with_json, {
|
|
429
|
+
const refs = parseJsonArray(keepRow.conflicts_with_json, {
|
|
430
|
+
table: 'memories',
|
|
431
|
+
id: keepId,
|
|
432
|
+
column: 'conflicts_with_json',
|
|
433
|
+
});
|
|
394
434
|
const cleaned = refs.filter((r) => r !== loserId);
|
|
395
435
|
db.prepare(`UPDATE memories SET conflicts_with_json = ?, updated_at = datetime('now') WHERE id = ?${memScope}`)
|
|
396
436
|
.run(JSON.stringify(cleaned), keepId, ...memArgs);
|
|
@@ -400,7 +440,11 @@ function stripConflictRefs(db, t, loserRemoved) {
|
|
|
400
440
|
// column named in the SELECT below.
|
|
401
441
|
const loserRow = db.prepare(`SELECT conflicts_with_json FROM memories WHERE id = ?${memScope}`).get(loserId, ...memArgs);
|
|
402
442
|
if (loserRow) {
|
|
403
|
-
const refs = parseJsonArray(loserRow.conflicts_with_json, {
|
|
443
|
+
const refs = parseJsonArray(loserRow.conflicts_with_json, {
|
|
444
|
+
table: 'memories',
|
|
445
|
+
id: loserId,
|
|
446
|
+
column: 'conflicts_with_json',
|
|
447
|
+
});
|
|
404
448
|
const cleaned = refs.filter((r) => r !== keepId);
|
|
405
449
|
db.prepare(`UPDATE memories SET conflicts_with_json = ?, updated_at = datetime('now') WHERE id = ?${memScope}`)
|
|
406
450
|
.run(JSON.stringify(cleaned), loserId, ...memArgs);
|
|
@@ -423,15 +467,23 @@ function auditConflictResolve(db, t, removal, tenantId) {
|
|
|
423
467
|
// omitting the key, exactly as the pre-migration object literal did.
|
|
424
468
|
if (rejectedDigest !== undefined)
|
|
425
469
|
conflictResolveMeta.rejectedDigest = rejectedDigest;
|
|
426
|
-
// Fresh spread literal: ConflictResolveMeta is a closed interface, not assignable to audit()'s Record<string,
|
|
427
|
-
|
|
470
|
+
// Fresh spread literal: ConflictResolveMeta is a closed interface, not assignable to audit()'s Record<string,
|
|
471
|
+
// JsonValue> metadata otherwise.
|
|
472
|
+
audit(db, 'conflict_resolve', {
|
|
473
|
+
targetId: t.keepId,
|
|
474
|
+
metadata: { ...conflictResolveMeta },
|
|
475
|
+
actor: t.opts?.rejectedBy ?? 'cli',
|
|
476
|
+
tenantId,
|
|
477
|
+
});
|
|
428
478
|
}
|
|
429
479
|
function purgeRemovedLoserMirrors(hippoRoot, db, loserId, removal) {
|
|
430
|
-
// Mirror purge and reaper stamp for EVERY removed loser (loserId and each extraRemovedIds duplicate), post-commit
|
|
480
|
+
// Mirror purge and reaper stamp for EVERY removed loser (loserId and each extraRemovedIds duplicate), post-commit
|
|
481
|
+
// like the reject verb.
|
|
431
482
|
// A non-raw mirror has no reaper, so skipping the purge would orphan it forever.
|
|
432
483
|
for (const removedId of [loserId, ...removal.extraRemovedIds]) {
|
|
433
484
|
const isRaw = removedId === loserId ? removal.loserWasRaw : removal.extraRemovedRawIds.includes(removedId);
|
|
434
|
-
// purgeMirrorBestEffort retries once, then reports the explicit leftover paths for non-raw ids, which the
|
|
485
|
+
// purgeMirrorBestEffort retries once, then reports the explicit leftover paths for non-raw ids, which the
|
|
486
|
+
// cleanupArchivedMirrors reaper never scans.
|
|
435
487
|
const mirrorOk = purgeMirrorBestEffort(hippoRoot, removedId, isRaw, 'resolveConflict');
|
|
436
488
|
if (mirrorOk && isRaw) {
|
|
437
489
|
db.prepare(`UPDATE raw_archive SET mirror_cleaned_at = ? WHERE memory_id = ?`).run(new Date().toISOString(), removedId);
|
|
@@ -441,8 +493,11 @@ function purgeRemovedLoserMirrors(hippoRoot, db, loserId, removal) {
|
|
|
441
493
|
/** The conflict and loser ids every conflict_resolve audit row names. */
|
|
442
494
|
export function conflictResolveAuditsAt(db) {
|
|
443
495
|
// SAFETY: SELECT of two fields every conflict_resolve audit row carries (ConflictResolveMeta above).
|
|
444
|
-
return db
|
|
445
|
-
`
|
|
496
|
+
return db
|
|
497
|
+
.prepare(`SELECT json_extract(metadata_json, '$.conflictId') ` +
|
|
498
|
+
`AS conflictId, json_extract(metadata_json, '$.loserId') AS loserId ` +
|
|
499
|
+
`FROM audit_log WHERE op = 'conflict_resolve'`)
|
|
500
|
+
.all();
|
|
446
501
|
}
|
|
447
502
|
/** Every resolved conflict with both sides. */
|
|
448
503
|
export function resolvedConflictsAt(db) {
|
|
@@ -2,9 +2,21 @@ import type { DatabaseSyncLike } from '../../db/index.js';
|
|
|
2
2
|
export type DlqTable = 'slack_dlq' | 'github_dlq';
|
|
3
3
|
export type DlqRawValue = string | number | bigint | null;
|
|
4
4
|
export type DlqRawRow = Record<string, DlqRawValue>;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
export
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
type DlqKind = 'int' | 'text' | 'nullableText' | 'count' | 'bucket';
|
|
6
|
+
/** One DLQ column: the item field it fills, its kind, and whether insert writes it (the database sets the rest). */
|
|
7
|
+
export interface DlqColumn {
|
|
8
|
+
field: string;
|
|
9
|
+
column: string;
|
|
10
|
+
kind: DlqKind;
|
|
11
|
+
insert?: true;
|
|
12
|
+
}
|
|
13
|
+
export interface DlqAccess<Item, Insert> {
|
|
14
|
+
insert(db: DatabaseSyncLike, row: Insert): number;
|
|
15
|
+
list(db: DatabaseSyncLike, tenantId: string, limit: number): Item[];
|
|
16
|
+
get(db: DatabaseSyncLike, id: number): Item | null;
|
|
17
|
+
markRetried(db: DatabaseSyncLike, id: number): void;
|
|
18
|
+
}
|
|
19
|
+
/** The four statements and the row mapping of one dead-letter table, driven by its column map. */
|
|
20
|
+
export declare function dlqAccess<Item, Insert extends object>(table: DlqTable, columns: readonly DlqColumn[]): DlqAccess<Item, Insert>;
|
|
21
|
+
export {};
|
|
10
22
|
//# sourceMappingURL=dlq.d.ts.map
|
|
@@ -1,15 +1,33 @@
|
|
|
1
|
-
// The dead-letter statements both connectors share; each connector names its table and columns and maps rows to its own
|
|
1
|
+
// The dead-letter statements both connectors share; each connector names its table and columns and maps rows to its own
|
|
2
|
+
// item type.
|
|
2
3
|
import { placeholders } from '../../util/sql.js';
|
|
4
|
+
const DLQ_TABLES = ['slack_dlq', 'github_dlq'];
|
|
5
|
+
const COLUMN_NAME = /^[a-z_]+$/;
|
|
6
|
+
// The statements splice identifiers into SQL, so the typed union is backed by a runtime check.
|
|
7
|
+
function assertTable(table) {
|
|
8
|
+
if (!DLQ_TABLES.includes(table))
|
|
9
|
+
throw new Error(`Invalid DLQ table: ${table}`);
|
|
10
|
+
}
|
|
11
|
+
function assertColumns(names) {
|
|
12
|
+
for (const name of names) {
|
|
13
|
+
if (!COLUMN_NAME.test(name))
|
|
14
|
+
throw new Error(`Invalid DLQ column name: ${name}`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
3
17
|
/** Inserts one row, stamping received_at; `columns` pairs each column name with its value, in insert order. */
|
|
4
|
-
|
|
18
|
+
function insertDlqRow(db, table, columns) {
|
|
19
|
+
assertTable(table);
|
|
5
20
|
const names = [...columns.map(([name]) => name), 'received_at'];
|
|
21
|
+
assertColumns(names);
|
|
6
22
|
const values = [...columns.map(([, value]) => value), new Date().toISOString()];
|
|
7
23
|
const result = db
|
|
8
24
|
.prepare(`INSERT INTO ${table} (${names.join(', ')}) VALUES (${placeholders(names.length)})`)
|
|
9
25
|
.run(...values);
|
|
10
26
|
return Number(result.lastInsertRowid);
|
|
11
27
|
}
|
|
12
|
-
|
|
28
|
+
function listDlqRows(db, table, selectColumns, tenantId, limit) {
|
|
29
|
+
assertTable(table);
|
|
30
|
+
assertColumns(selectColumns.split(',').map((name) => name.trim()));
|
|
13
31
|
// SAFETY: the caller's selectColumns names exactly the fields its rowToItem reads.
|
|
14
32
|
return db
|
|
15
33
|
.prepare(`SELECT ${selectColumns}
|
|
@@ -19,15 +37,48 @@ export function listDlqRows(db, table, selectColumns, tenantId, limit) {
|
|
|
19
37
|
LIMIT ?`)
|
|
20
38
|
.all(tenantId, limit);
|
|
21
39
|
}
|
|
22
|
-
|
|
40
|
+
function getDlqRow(db, table, selectColumns, id) {
|
|
41
|
+
assertTable(table);
|
|
42
|
+
assertColumns(selectColumns.split(',').map((name) => name.trim()));
|
|
23
43
|
// SAFETY: the caller's selectColumns names exactly the fields its rowToItem reads.
|
|
24
44
|
const row = db
|
|
25
45
|
.prepare(`SELECT ${selectColumns} FROM ${table} WHERE id = ?`)
|
|
26
46
|
.get(id);
|
|
27
47
|
return row ?? null;
|
|
28
48
|
}
|
|
29
|
-
|
|
49
|
+
function markDlqRetried(db, table, id) {
|
|
50
|
+
assertTable(table);
|
|
30
51
|
db.prepare(`UPDATE ${table} SET retried_at = ?, retry_count = retry_count + 1 WHERE id = ?`)
|
|
31
52
|
.run(new Date().toISOString(), id);
|
|
32
53
|
}
|
|
54
|
+
function coerceDlqValue(kind, raw) {
|
|
55
|
+
switch (kind) {
|
|
56
|
+
case 'int': return Number(raw);
|
|
57
|
+
case 'count': return Number(raw ?? 0);
|
|
58
|
+
case 'text': return String(raw);
|
|
59
|
+
case 'nullableText': return raw == null ? null : String(raw);
|
|
60
|
+
case 'bucket': return raw == null ? 'parse_error' : String(raw);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** The four statements and the row mapping of one dead-letter table, driven by its column map. */
|
|
64
|
+
export function dlqAccess(table, columns) {
|
|
65
|
+
const selectColumns = columns.map((c) => c.column).join(', ');
|
|
66
|
+
const insertColumns = columns.filter((c) => c.insert);
|
|
67
|
+
// SAFETY: the column map names every field of Item with the kind that coerces it.
|
|
68
|
+
const toItem = (raw) => Object.fromEntries(columns.map((c) => [c.field, coerceDlqValue(c.kind, raw[c.column])]));
|
|
69
|
+
return {
|
|
70
|
+
insert: (db, row) => {
|
|
71
|
+
// SAFETY: every insert field of the column map is a string, null or absent on Insert.
|
|
72
|
+
const fields = row;
|
|
73
|
+
const pairs = insertColumns.map((c) => [c.column, fields[c.field] ?? null]);
|
|
74
|
+
return insertDlqRow(db, table, pairs);
|
|
75
|
+
},
|
|
76
|
+
list: (db, tenantId, limit) => listDlqRows(db, table, selectColumns, tenantId, limit).map(toItem),
|
|
77
|
+
get: (db, id) => {
|
|
78
|
+
const row = getDlqRow(db, table, selectColumns, id);
|
|
79
|
+
return row ? toItem(row) : null;
|
|
80
|
+
},
|
|
81
|
+
markRetried: (db, id) => markDlqRetried(db, table, id),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
33
84
|
//# sourceMappingURL=dlq.js.map
|