hippo-memory 1.69.0 → 1.71.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -2
- package/dist/agent-memories/apply.d.ts +3 -3
- package/dist/agent-memories/apply.js +16 -31
- package/dist/agent-memories/claude-code.d.ts +5 -5
- package/dist/agent-memories/claude-code.js +25 -12
- package/dist/agent-memories/copilot.js +3 -2
- package/dist/agent-memories/files.js +26 -14
- package/dist/agent-memories/gemini.js +6 -5
- package/dist/agent-memories/keys.js +3 -2
- package/dist/agent-memories/legacy.d.ts +2 -2
- package/dist/agent-memories/legacy.js +2 -2
- package/dist/agent-memories/markdown.d.ts +1 -3
- package/dist/agent-memories/markdown.js +1 -3
- package/dist/agent-memories/report.d.ts +1 -1
- package/dist/agent-memories/report.js +3 -2
- package/dist/agent-memories/source.d.ts +1 -1
- package/dist/agent-memories/source.js +6 -5
- package/dist/agent-memories/sync.d.ts +5 -3
- package/dist/agent-memories/sync.js +34 -38
- package/dist/agent-memories/types.d.ts +1 -1
- package/dist/api/assemble.d.ts +9 -46
- package/dist/api/assemble.js +44 -54
- package/dist/api/audit.d.ts +8 -7
- package/dist/api/audit.js +15 -21
- package/dist/api/auth.d.ts +17 -39
- package/dist/api/auth.js +76 -216
- package/dist/api/auto-sleep.d.ts +13 -0
- package/dist/api/auto-sleep.js +32 -0
- package/dist/{availability.d.ts → api/availability.d.ts} +4 -17
- package/dist/{availability.js → api/availability.js} +14 -44
- package/dist/{context-auto.js → api/context-auto.js} +2 -1
- package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
- package/dist/{context-render.js → api/context-render.js} +7 -6
- package/dist/api/context-select.d.ts +5 -5
- package/dist/api/context-select.js +39 -48
- package/dist/api/context-types.d.ts +15 -40
- package/dist/api/context.d.ts +7 -26
- package/dist/api/context.js +67 -97
- package/dist/api/dormant.d.ts +7 -23
- package/dist/api/dormant.js +40 -128
- package/dist/api/drill-down.d.ts +9 -48
- package/dist/api/drill-down.js +41 -90
- package/dist/api/forget.d.ts +5 -33
- package/dist/api/forget.js +17 -73
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +2 -2
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +28 -0
- package/dist/api/index.js +31 -0
- package/dist/api/instruction-detect.js +85 -0
- package/dist/api/learn.js +63 -55
- package/dist/api/ledger-db.d.ts +21 -0
- package/dist/api/ledger-db.js +81 -0
- package/dist/api/memories.d.ts +5 -0
- package/dist/api/memories.js +7 -0
- package/dist/api/objects.d.ts +9 -0
- package/dist/api/objects.js +11 -0
- package/dist/api/on-store.d.ts +16 -0
- package/dist/api/on-store.js +38 -0
- package/dist/api/outcome.d.ts +5 -42
- package/dist/api/outcome.js +15 -80
- package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
- package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
- package/dist/api/predictions.d.ts +9 -0
- package/dist/api/predictions.js +18 -0
- package/dist/api/promote.d.ts +16 -31
- package/dist/api/promote.js +38 -123
- package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +11 -11
- package/dist/{prompt-hook.js → api/prompt-hook.js} +42 -60
- package/dist/api/quarantine.d.ts +5 -5
- package/dist/api/quarantine.js +30 -106
- package/dist/api/recall-cli.d.ts +55 -0
- package/dist/api/recall-cli.js +94 -0
- package/dist/api/recall-core.d.ts +4 -0
- package/dist/api/recall-core.js +120 -0
- package/dist/api/recall-finish.d.ts +53 -0
- package/dist/api/recall-finish.js +30 -0
- package/dist/api/recall-history.d.ts +64 -0
- package/dist/api/recall-history.js +159 -0
- package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +7 -8
- package/dist/{recall-pipeline.js → api/recall-pipeline.js} +60 -48
- package/dist/api/recall-record.d.ts +10 -13
- package/dist/api/recall-record.js +10 -30
- package/dist/api/recall-request.d.ts +2 -2
- package/dist/api/recall-request.js +3 -3
- package/dist/api/recall-types.d.ts +101 -316
- package/dist/api/recall.d.ts +5 -33
- package/dist/api/recall.js +92 -91
- package/dist/api/refine.d.ts +7 -0
- package/dist/api/refine.js +10 -0
- package/dist/api/remember-local.d.ts +57 -0
- package/dist/api/remember-local.js +90 -0
- package/dist/api/remember.d.ts +27 -12
- package/dist/api/remember.js +42 -46
- package/dist/api/session-owners.d.ts +4 -0
- package/dist/api/session-owners.js +17 -0
- package/dist/api/sleep-run.d.ts +7 -9
- package/dist/api/sleep-run.js +78 -94
- package/dist/api/sleep.d.ts +10 -29
- package/dist/api/tokens.d.ts +5 -12
- package/dist/api/tokens.js +12 -31
- package/dist/api/types.d.ts +8 -31
- package/dist/api/types.js +5 -23
- package/dist/capture/caller-session.d.ts +2 -2
- package/dist/capture/caller-session.js +8 -8
- package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
- package/dist/{capture-error.js → capture/capture-error.js} +7 -7
- package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
- package/dist/capture/command.d.ts +5 -13
- package/dist/capture/command.js +57 -60
- package/dist/capture/compact-resume-caller.d.ts +1 -1
- package/dist/capture/compact-resume-caller.js +7 -7
- package/dist/capture/compact.d.ts +8 -16
- package/dist/capture/compact.js +56 -47
- package/dist/capture/compaction-items-caller.d.ts +1 -1
- package/dist/capture/compaction-items-caller.js +7 -5
- package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
- package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
- package/dist/{compaction-record.js → capture/compaction-record.js} +143 -157
- package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +1 -1
- package/dist/{compaction-spool.js → capture/compaction-spool.js} +18 -14
- package/dist/capture/copilot-transcript.js +1 -1
- package/dist/capture/extract.js +2 -2
- package/dist/capture/failure-caller.d.ts +2 -2
- package/dist/capture/failure-caller.js +6 -6
- package/dist/capture/failure-reading.d.ts +2 -5
- package/dist/capture/failure-reading.js +11 -12
- package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
- package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
- package/dist/capture/pre-compact-caller.d.ts +1 -1
- package/dist/capture/pre-compact-caller.js +2 -2
- package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +2 -6
- package/dist/{session-digest.js → capture/session-digest.js} +29 -29
- package/dist/capture/session-end-caller.d.ts +2 -2
- package/dist/capture/session-end-caller.js +1 -1
- package/dist/capture/session-texts.d.ts +1 -1
- package/dist/capture/session-texts.js +5 -5
- package/dist/capture/session-worker.js +6 -4
- package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
- package/dist/capture/transcript.d.ts +2 -10
- package/dist/capture/transcript.js +72 -92
- package/dist/capture/working-state.d.ts +0 -3
- package/dist/capture/working-state.js +7 -7
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +28 -0
- package/dist/cli/audit-prune.js +40 -0
- package/dist/cli/audit.d.ts +2 -2
- package/dist/cli/audit.js +92 -88
- package/dist/cli/auth.d.ts +2 -1
- package/dist/cli/auth.js +69 -53
- package/dist/cli/briefs.d.ts +4 -3
- package/dist/cli/briefs.js +76 -202
- package/dist/cli/card.d.ts +2 -1
- package/dist/cli/card.js +55 -54
- package/dist/cli/client.d.ts +28 -0
- package/dist/{client.js → cli/client.js} +25 -44
- package/dist/cli/compact-resume-payload.d.ts +8 -0
- package/dist/cli/compact-resume-payload.js +40 -0
- package/dist/cli/context.d.ts +1 -13
- package/dist/cli/context.js +51 -77
- package/dist/cli/continuity.d.ts +6 -5
- package/dist/cli/continuity.js +153 -145
- package/dist/cli/correction-latency.d.ts +24 -0
- package/dist/{correction-latency.js → cli/correction-latency.js} +2 -14
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +226 -222
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +70 -52
- package/dist/cli/decisions.d.ts +4 -3
- package/dist/cli/decisions.js +129 -253
- package/dist/cli/eval.d.ts +1 -3
- package/dist/cli/eval.js +56 -42
- package/dist/cli/exit.d.ts +6 -0
- package/dist/cli/exit.js +11 -0
- package/dist/cli/explain.d.ts +1 -2
- package/dist/cli/explain.js +39 -21
- package/dist/cli/flag-values.d.ts +30 -0
- package/dist/cli/flag-values.js +120 -0
- package/dist/cli/flags.d.ts +304 -0
- package/dist/cli/flags.js +169 -0
- package/dist/cli/github.d.ts +14 -0
- package/dist/cli/github.js +184 -0
- package/dist/cli/goals.d.ts +2 -1
- package/dist/cli/goals.js +76 -75
- package/dist/cli/hook-runtime.d.ts +31 -0
- package/dist/cli/hook-runtime.js +139 -0
- package/dist/cli/init.d.ts +2 -1
- package/dist/cli/init.js +153 -126
- package/dist/cli/install-steps.d.ts +7 -0
- package/dist/cli/install-steps.js +101 -0
- package/dist/cli/last-sleep.d.ts +3 -1
- package/dist/cli/last-sleep.js +12 -7
- package/dist/cli/maintenance.d.ts +5 -4
- package/dist/cli/maintenance.js +41 -42
- package/dist/cli/object-verbs.d.ts +40 -0
- package/dist/cli/object-verbs.js +66 -0
- package/dist/cli/owner-validation.d.ts +18 -0
- package/dist/cli/owner-validation.js +33 -0
- package/dist/cli/playbooks.d.ts +4 -3
- package/dist/cli/playbooks.js +98 -306
- package/dist/cli/print.d.ts +15 -0
- package/dist/cli/print.js +82 -0
- package/dist/cli/projects.d.ts +2 -3
- package/dist/cli/projects.js +56 -51
- package/dist/cli/provenance-coverage.d.ts +14 -0
- package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +2 -6
- package/dist/cli/quality-repair-once.js +4 -4
- package/dist/cli/recall.d.ts +2 -6
- package/dist/cli/recall.js +128 -253
- package/dist/cli/refine-llm.d.ts +35 -0
- package/dist/cli/refine-llm.js +128 -0
- package/dist/cli/remember.d.ts +4 -6
- package/dist/cli/remember.js +193 -230
- package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +4 -17
- package/dist/{scheduler.js → cli/scheduler.js} +22 -22
- package/dist/cli/serve.d.ts +1 -1
- package/dist/cli/serve.js +46 -7
- package/dist/cli/session-hooks.d.ts +11 -19
- package/dist/cli/session-hooks.js +263 -258
- package/dist/cli/setup.d.ts +4 -3
- package/dist/cli/setup.js +55 -37
- package/dist/cli/shared.d.ts +14 -118
- package/dist/cli/shared.js +26 -400
- package/dist/cli/slack.d.ts +2 -1
- package/dist/cli/slack.js +46 -74
- package/dist/cli/sleep-render.d.ts +4 -0
- package/dist/cli/sleep-render.js +61 -0
- package/dist/cli/sleep.d.ts +3 -8
- package/dist/cli/sleep.js +34 -91
- package/dist/cli/status.d.ts +9 -12
- package/dist/cli/status.js +86 -131
- package/dist/{stdin.d.ts → cli/stdin.d.ts} +4 -6
- package/dist/{stdin.js → cli/stdin.js} +8 -9
- package/dist/cli/transfer.d.ts +9 -9
- package/dist/cli/transfer.js +125 -122
- package/dist/cli/usage.js +13 -5
- package/dist/cli.d.ts +69 -167
- package/dist/cli.js +187 -296
- package/dist/connectors/dlq.d.ts +44 -0
- package/dist/connectors/dlq.js +30 -0
- package/dist/connectors/github/backfill.d.ts +6 -26
- package/dist/connectors/github/backfill.js +42 -114
- package/dist/connectors/github/deletion.d.ts +6 -21
- package/dist/connectors/github/deletion.js +17 -64
- package/dist/connectors/github/dlq.d.ts +12 -91
- package/dist/connectors/github/dlq.js +23 -140
- package/dist/connectors/github/ingest.d.ts +4 -37
- package/dist/connectors/github/ingest.js +24 -93
- package/dist/connectors/github/octokit-client.d.ts +5 -17
- package/dist/connectors/github/octokit-client.js +29 -25
- package/dist/connectors/github/ratelimit.d.ts +3 -14
- package/dist/connectors/github/ratelimit.js +3 -14
- package/dist/connectors/github/scope.d.ts +3 -5
- package/dist/connectors/github/scope.js +3 -5
- package/dist/connectors/github/signature.d.ts +4 -26
- package/dist/connectors/github/signature.js +4 -26
- package/dist/connectors/github/tenant-routing.d.ts +4 -26
- package/dist/connectors/github/tenant-routing.js +13 -61
- package/dist/connectors/github/transform.d.ts +1 -1
- package/dist/connectors/github/transform.js +2 -16
- package/dist/connectors/github/types.d.ts +4 -16
- package/dist/connectors/github/types.js +17 -27
- package/dist/connectors/github/webhook.d.ts +5 -18
- package/dist/connectors/github/webhook.js +86 -105
- package/dist/connectors/slack/backfill.d.ts +5 -18
- package/dist/connectors/slack/backfill.js +9 -42
- package/dist/connectors/slack/deletion.d.ts +4 -7
- package/dist/connectors/slack/deletion.js +20 -49
- package/dist/connectors/slack/dlq.d.ts +9 -68
- package/dist/connectors/slack/dlq.js +26 -136
- package/dist/connectors/slack/ingest.d.ts +4 -18
- package/dist/connectors/slack/ingest.js +26 -91
- package/dist/connectors/slack/scope.d.ts +2 -8
- package/dist/connectors/slack/scope.js +2 -8
- package/dist/connectors/slack/signature.d.ts +1 -6
- package/dist/connectors/slack/signature.js +2 -1
- package/dist/connectors/slack/tenant-routing.d.ts +4 -18
- package/dist/connectors/slack/tenant-routing.js +11 -31
- package/dist/connectors/slack/transform.d.ts +3 -19
- package/dist/connectors/slack/transform.js +2 -18
- package/dist/connectors/slack/types.d.ts +4 -10
- package/dist/connectors/slack/types.js +5 -16
- package/dist/connectors/slack/web-client.js +34 -28
- package/dist/connectors/slack/webhook.d.ts +5 -21
- package/dist/connectors/slack/webhook.js +80 -108
- package/dist/connectors/slack/workspaces.d.ts +8 -41
- package/dist/connectors/slack/workspaces.js +8 -58
- package/dist/consolidate/conflicts.d.ts +1 -1
- package/dist/consolidate/conflicts.js +10 -18
- package/dist/consolidate/dag-summary.d.ts +8 -0
- package/dist/consolidate/dag-summary.js +41 -0
- package/dist/{dag.d.ts → consolidate/dag.d.ts} +6 -29
- package/dist/{dag.js → consolidate/dag.js} +49 -131
- package/dist/consolidate/decay.d.ts +2 -2
- package/dist/consolidate/decay.js +35 -41
- package/dist/consolidate/dedupe.d.ts +29 -0
- package/dist/consolidate/dedupe.js +103 -0
- package/dist/consolidate/flush-units.d.ts +5 -6
- package/dist/consolidate/flush-units.js +3 -3
- package/dist/consolidate/half-life-migration.d.ts +34 -0
- package/dist/consolidate/half-life-migration.js +89 -0
- package/dist/consolidate/llm-passes.js +12 -29
- package/dist/consolidate/memory-value-weights.d.ts +8 -0
- package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +2 -13
- package/dist/consolidate/memory-value.d.ts +45 -0
- package/dist/consolidate/memory-value.js +164 -0
- package/dist/consolidate/merge.js +65 -83
- package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
- package/dist/{merged-row.js → consolidate/merged-row.js} +4 -3
- package/dist/consolidate/physics-pass.js +46 -48
- package/dist/consolidate/replay.d.ts +9 -0
- package/dist/consolidate/replay.js +84 -0
- package/dist/consolidate/run.d.ts +7 -13
- package/dist/consolidate/run.js +6 -37
- package/dist/consolidate/sleep.d.ts +2 -9
- package/dist/consolidate/sleep.js +69 -151
- package/dist/consolidate/trace.d.ts +19 -0
- package/dist/{trace.js → consolidate/trace.js} +7 -24
- package/dist/consolidate/traces.js +40 -51
- package/dist/core/ablation.d.ts +15 -0
- package/dist/core/ablation.js +49 -0
- package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
- package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
- package/dist/{ambient.d.ts → core/ambient.d.ts} +1 -8
- package/dist/{ambient.js → core/ambient.js} +13 -18
- package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +16 -3
- package/dist/{capture-contract.js → core/capture-contract.js} +67 -1
- package/dist/{card.d.ts → core/card.d.ts} +4 -1
- package/dist/{card.js → core/card.js} +8 -0
- package/dist/core/compare.d.ts +32 -0
- package/dist/core/compare.js +70 -0
- package/dist/{config.d.ts → core/config.d.ts} +14 -28
- package/dist/{config.js → core/config.js} +101 -75
- package/dist/{handoff.d.ts → core/handoff.d.ts} +1 -7
- package/dist/core/handoff.js +81 -0
- package/dist/{memory-quality.js → core/memory-quality.js} +2 -2
- package/dist/core/memory.d.ts +183 -0
- package/dist/core/memory.js +380 -0
- package/dist/core/package-root.d.ts +3 -0
- package/dist/core/package-root.js +5 -0
- package/dist/{physics-config.d.ts → core/physics-config.d.ts} +1 -4
- package/dist/{physics-config.js → core/physics-config.js} +3 -8
- package/dist/{physics.d.ts → core/physics.d.ts} +16 -62
- package/dist/{physics.js → core/physics.js} +60 -122
- package/dist/{project-identity.d.ts → core/project-identity.d.ts} +17 -63
- package/dist/{project-identity.js → core/project-identity.js} +22 -55
- package/dist/{project-remote.js → core/project-remote.js} +17 -6
- package/dist/{prompt-recall.js → core/prompt-recall.js} +1 -1
- package/dist/core/raw-append-only.d.ts +5 -0
- package/dist/core/raw-append-only.js +7 -0
- package/dist/{salience.d.ts → core/salience.d.ts} +1 -7
- package/dist/{salience.js → core/salience.js} +36 -27
- package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
- package/dist/{search/types.js → core/search-types.js} +1 -1
- package/dist/core/session-digest-row.d.ts +5 -0
- package/dist/core/session-digest-row.js +6 -0
- package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
- package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +7 -7
- package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
- package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
- package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +11 -10
- package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +110 -104
- package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +2 -1
- package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +1 -0
- package/dist/{dashboard.js → dashboard/dashboard.js} +172 -55
- package/dist/db/backup.js +1 -1
- package/dist/db/busy.d.ts +19 -2
- package/dist/db/busy.js +88 -14
- package/dist/db/connect.d.ts +11 -2
- package/dist/db/connect.js +43 -10
- package/dist/db/index.d.ts +9 -0
- package/dist/db/index.js +8 -0
- package/dist/db/meta.d.ts +4 -0
- package/dist/db/meta.js +11 -1
- package/dist/db/migrate.d.ts +8 -1
- package/dist/db/migrate.js +28 -33
- package/dist/db/migrations/types.d.ts +2 -5
- package/dist/db/migrations/v08.js +1 -1
- package/dist/db/migrations/v14.js +39 -36
- package/dist/db/migrations/v15.js +2 -8
- package/dist/db/migrations/v16.js +31 -29
- package/dist/db/migrations/v17.js +2 -3
- package/dist/db/migrations/v18.js +6 -5
- package/dist/db/migrations/v19.js +2 -5
- package/dist/db/migrations/v20.js +5 -8
- package/dist/db/migrations/v22.js +28 -38
- package/dist/db/migrations/v23.js +3 -14
- package/dist/db/migrations/v24.js +25 -22
- package/dist/db/migrations/v25.js +3 -8
- package/dist/db/migrations/v26.js +2 -13
- package/dist/db/migrations/v27.js +3 -11
- package/dist/db/migrations/v28.js +2 -14
- package/dist/db/migrations/v29.js +23 -32
- package/dist/db/migrations/v30.js +4 -16
- package/dist/db/migrations/v31.js +23 -31
- package/dist/db/migrations/v32.js +4 -22
- package/dist/db/migrations/v33.js +2 -15
- package/dist/db/migrations/v34.js +2 -11
- package/dist/db/migrations/v35.js +2 -11
- package/dist/db/migrations/v36.js +2 -11
- package/dist/db/migrations/v37.js +8 -33
- package/dist/db/migrations/v38.js +5 -38
- package/dist/db/migrations/v39.js +10 -21
- package/dist/db/migrations/v40.js +8 -14
- package/dist/db/migrations/v41.js +2 -24
- package/dist/db/migrations/v43.js +7 -6
- package/dist/db/migrations/v44.js +2 -8
- package/dist/db/migrations/v45.js +2 -7
- package/dist/db/migrations/v46.js +1 -1
- package/dist/db/migrations/v47.js +2 -3
- package/dist/db/migrations/v48.js +1 -1
- package/dist/db/migrations/v49.js +1 -1
- package/dist/db/migrations/v50.js +8 -7
- package/dist/db/migrations/v51.js +1 -1
- package/dist/db/migrations/v52.js +1 -1
- package/dist/db/open.d.ts +11 -1
- package/dist/db/open.js +37 -4
- package/dist/db/physics-state.d.ts +23 -0
- package/dist/{physics-state.js → db/physics-state.js} +34 -52
- package/dist/db/raw-archive-mirror-cleanup.d.ts +5 -0
- package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +10 -20
- package/dist/db/request-stores.d.ts +15 -2
- package/dist/db/request-stores.js +37 -15
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -0
- package/dist/{vector-store.d.ts → db/vector-store.d.ts} +6 -2
- package/dist/{vector-store.js → db/vector-store.js} +83 -51
- package/dist/db/wal-checkpointer.d.ts +11 -0
- package/dist/db/wal-checkpointer.js +92 -0
- package/dist/doctor.js +176 -152
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.d.ts +1 -1
- package/dist/entry/project-identity.js +1 -1
- package/dist/entry/session-text.d.ts +3 -3
- package/dist/entry/session-text.js +5 -4
- package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +15 -53
- package/dist/{eval-stats.js → eval/eval-stats.js} +24 -51
- package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +3 -14
- package/dist/{eval-suite.js → eval/eval-suite.js} +99 -57
- package/dist/{eval.d.ts → eval/eval.d.ts} +7 -25
- package/dist/{eval.js → eval/eval.js} +35 -55
- package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -6
- package/dist/{judgment.js → eval/judgment.js} +23 -20
- package/dist/extensions/openclaw-plugin/index.js +2 -3
- package/dist/graph/delta.d.ts +3 -2
- package/dist/graph/delta.js +9 -23
- package/dist/{graph-extract.d.ts → graph/extract.d.ts} +10 -32
- package/dist/{graph-extract.js → graph/extract.js} +40 -81
- package/dist/{graph-recall.d.ts → graph/recall.d.ts} +9 -22
- package/dist/{graph-recall.js → graph/recall.js} +65 -108
- package/dist/graph/stream.d.ts +38 -0
- package/dist/{graph-stream.js → graph/stream.js} +20 -41
- package/dist/graph/view.d.ts +50 -0
- package/dist/graph/view.js +265 -0
- package/dist/graph/write.d.ts +4 -76
- package/dist/graph/write.js +13 -397
- package/dist/hooks/codex-session.js +1 -1
- package/dist/hooks/codex-wrapper.js +16 -17
- package/dist/hooks/copilot.d.ts +1 -8
- package/dist/hooks/copilot.js +16 -16
- package/dist/{cli → hooks}/hook-blocks.d.ts +6 -2
- package/dist/{cli → hooks}/hook-blocks.js +38 -125
- package/dist/hooks/json-hooks.d.ts +5 -37
- package/dist/hooks/json-hooks.js +49 -179
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +44 -103
- package/dist/hooks/shared.d.ts +8 -21
- package/dist/hooks/shared.js +30 -25
- package/dist/importers/core.d.ts +13 -42
- package/dist/importers/core.js +48 -64
- package/dist/importers/markdown-parse.d.ts +9 -32
- package/dist/importers/markdown-parse.js +10 -44
- package/dist/importers/markdown.js +5 -13
- package/dist/importers/sources.js +57 -81
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +95 -172
- package/dist/index.d.ts +26 -22
- package/dist/index.js +25 -21
- package/dist/learn/autolearn.d.ts +29 -0
- package/dist/{autolearn.js → learn/autolearn.js} +26 -51
- package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
- package/dist/{churn-git.js → learn/churn-git.js} +6 -4
- package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
- package/dist/learn/extract.js +123 -0
- package/dist/learn/forward-claim-detector.d.ts +12 -0
- package/dist/learn/forward-claim-detector.js +60 -0
- package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +10 -18
- package/dist/{invalidation.js → learn/invalidation.js} +92 -125
- package/dist/mcp/admin-tools.d.ts +1 -1
- package/dist/mcp/admin-tools.js +39 -64
- package/dist/mcp/format.d.ts +5 -5
- package/dist/mcp/format.js +7 -6
- package/dist/mcp/framing.d.ts +6 -0
- package/dist/mcp/framing.js +11 -3
- package/dist/mcp/memory-tools.js +10 -35
- package/dist/mcp/protocol.d.ts +14 -36
- package/dist/mcp/protocol.js +10 -19
- package/dist/mcp/recall-tools.d.ts +2 -2
- package/dist/mcp/recall-tools.js +70 -52
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +71 -85
- package/dist/mcp/server.d.ts +3 -9
- package/dist/mcp/server.js +6 -17
- package/dist/mcp/session-state.d.ts +2 -3
- package/dist/mcp/session-state.js +7 -13
- package/dist/mcp/shared-gate.js +1 -1
- package/dist/mcp/stdio.d.ts +2 -6
- package/dist/mcp/stdio.js +112 -38
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +7 -5
- package/dist/objects/customer-notes.d.ts +44 -0
- package/dist/objects/customer-notes.js +71 -0
- package/dist/objects/decisions.d.ts +41 -0
- package/dist/objects/decisions.js +63 -0
- package/dist/objects/descriptor.d.ts +52 -0
- package/dist/objects/descriptor.js +4 -0
- package/dist/objects/fields.d.ts +15 -0
- package/dist/objects/fields.js +21 -0
- package/dist/objects/incidents.d.ts +45 -0
- package/dist/objects/incidents.js +96 -0
- package/dist/objects/lifecycle.d.ts +27 -0
- package/dist/objects/lifecycle.js +96 -0
- package/dist/objects/policies.d.ts +60 -0
- package/dist/objects/policies.js +102 -0
- package/dist/objects/processes.d.ts +43 -0
- package/dist/objects/processes.js +92 -0
- package/dist/objects/project-briefs.d.ts +63 -0
- package/dist/objects/project-briefs.js +194 -0
- package/dist/objects/skills.d.ts +51 -0
- package/dist/objects/skills.js +110 -0
- package/dist/postinstall.js +10 -21
- package/dist/predictions/planning-fallacy.d.ts +14 -109
- package/dist/predictions/planning-fallacy.js +4 -129
- package/dist/rerankers/clef.d.ts +2 -6
- package/dist/rerankers/clef.js +28 -76
- package/dist/rerankers/cross-encoder.d.ts +0 -7
- package/dist/rerankers/cross-encoder.js +18 -28
- package/dist/rerankers/index.js +8 -7
- package/dist/rerankers/jev.d.ts +1 -4
- package/dist/rerankers/jev.js +36 -52
- package/dist/rerankers/llm.d.ts +2 -13
- package/dist/rerankers/llm.js +42 -59
- package/dist/rerankers/outage-warning.d.ts +8 -0
- package/dist/rerankers/outage-warning.js +32 -0
- package/dist/rerankers/remote.d.ts +4 -0
- package/dist/rerankers/remote.js +25 -0
- package/dist/rerankers/types.d.ts +3 -15
- package/dist/search/as-of.d.ts +1 -1
- package/dist/search/bm25-search.d.ts +2 -2
- package/dist/search/bm25-search.js +7 -7
- package/dist/search/bm25.d.ts +1 -1
- package/dist/search/bm25.js +1 -1
- package/dist/search/boosts.d.ts +5 -3
- package/dist/search/boosts.js +36 -15
- package/dist/search/breakdown.d.ts +2 -2
- package/dist/search/breakdown.js +2 -1
- package/dist/search/explain.d.ts +1 -1
- package/dist/search/explain.js +3 -2
- package/dist/search/finalize.d.ts +2 -2
- package/dist/search/finalize.js +4 -3
- package/dist/search/fusion.d.ts +1 -1
- package/dist/search/fusion.js +3 -3
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +90 -0
- package/dist/search/hybrid-score.d.ts +2 -2
- package/dist/search/hybrid-score.js +1 -1
- package/dist/search/hybrid.d.ts +6 -4
- package/dist/search/hybrid.js +11 -8
- package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
- package/dist/{multihop.js → search/multihop.js} +9 -8
- package/dist/search/path-context.d.ts +11 -0
- package/dist/{path-context.js → search/path-context.js} +8 -19
- package/dist/search/physics-search.d.ts +4 -4
- package/dist/search/physics-search.js +25 -22
- package/dist/search/rerank.d.ts +3 -3
- package/dist/search/rerank.js +4 -3
- package/dist/search/rrf.d.ts +15 -0
- package/dist/search/rrf.js +36 -0
- package/dist/search/temporal.d.ts +1 -1
- package/dist/search/temporal.js +5 -2
- package/dist/search/vector.d.ts +10 -3
- package/dist/search/vector.js +51 -15
- package/dist/server/auth.d.ts +10 -29
- package/dist/server/auth.js +57 -42
- package/dist/server/boot.d.ts +5 -0
- package/dist/server/boot.js +432 -0
- package/dist/server/client-ip.d.ts +8 -20
- package/dist/server/client-ip.js +23 -34
- package/dist/server/cursor.d.ts +1 -1
- package/dist/server/cursor.js +2 -3
- package/dist/server/deadline.d.ts +13 -0
- package/dist/server/deadline.js +45 -0
- package/dist/server/defaults.d.ts +3 -0
- package/dist/server/defaults.js +4 -0
- package/dist/server/key-check-bounds.d.ts +9 -0
- package/dist/server/key-check-bounds.js +46 -0
- package/dist/server/lifecycle.d.ts +5 -4
- package/dist/server/lifecycle.js +20 -5
- package/dist/server/mcp-http.d.ts +1 -4
- package/dist/server/mcp-http.js +44 -68
- package/dist/server/rate-limit.d.ts +21 -0
- package/dist/{rate-limit.js → server/rate-limit.js} +4 -13
- package/dist/server/ready.d.ts +7 -0
- package/dist/server/ready.js +38 -0
- package/dist/server/request.d.ts +14 -12
- package/dist/server/request.js +71 -28
- package/dist/server/route-table.d.ts +15 -0
- package/dist/server/route-table.js +202 -0
- package/dist/server/routes/admin.js +29 -30
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +35 -105
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +45 -115
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +44 -105
- package/dist/server/routes/memories.js +21 -43
- package/dist/server/routes/object-routes.d.ts +35 -0
- package/dist/server/routes/object-routes.js +72 -0
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +42 -134
- package/dist/server/routes/predictions.js +35 -63
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +44 -134
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +41 -120
- package/dist/server/routes/recall.js +21 -44
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +40 -138
- package/dist/server/server-detect.d.ts +28 -0
- package/dist/server/server-detect.js +156 -0
- package/dist/server/sleep-child.d.ts +2 -0
- package/dist/server/sleep-child.js +19 -0
- package/dist/server/sleep-offload.d.ts +20 -0
- package/dist/server/sleep-offload.js +73 -0
- package/dist/server/tls.d.ts +6 -0
- package/dist/server/tls.js +24 -0
- package/dist/server/types.d.ts +35 -14
- package/dist/server/validation.d.ts +6 -5
- package/dist/server/validation.js +16 -34
- package/dist/server.d.ts +39 -61
- package/dist/server.js +26 -569
- package/dist/sharing/global-store.d.ts +19 -0
- package/dist/sharing/global-store.js +75 -0
- package/dist/sharing/global-sync.d.ts +6 -0
- package/dist/sharing/global-sync.js +80 -0
- package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +5 -6
- package/dist/{project-merge.js → sharing/project-merge.js} +34 -51
- package/dist/sharing/scope.d.ts +7 -0
- package/dist/{scope.js → sharing/scope.js} +5 -12
- package/dist/sharing/search-both.d.ts +60 -0
- package/dist/sharing/search-both.js +138 -0
- package/dist/sharing/share.d.ts +38 -0
- package/dist/sharing/share.js +226 -0
- package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
- package/dist/{ambient-store.js → store/ambient.js} +11 -16
- package/dist/store/audit-event.d.ts +15 -17
- package/dist/store/audit-event.js +9 -16
- package/dist/{audit.d.ts → store/audit.d.ts} +29 -8
- package/dist/{audit.js → store/audit.js} +95 -18
- package/dist/{auth.d.ts → store/auth.d.ts} +19 -36
- package/dist/{auth.js → store/auth.js} +108 -99
- package/dist/store/candidates.d.ts +41 -13
- package/dist/store/candidates.js +141 -60
- package/dist/{card-detail.d.ts → store/card-detail.d.ts} +5 -4
- package/dist/{card-detail.js → store/card-detail.js} +3 -2
- package/dist/{store-cards.d.ts → store/cards.d.ts} +26 -16
- package/dist/{store-cards.js → store/cards.js} +133 -248
- package/dist/store/compactions.d.ts +78 -0
- package/dist/store/compactions.js +93 -0
- package/dist/store/conflicts.d.ts +26 -26
- package/dist/store/conflicts.js +194 -222
- package/dist/store/connectors/github.d.ts +84 -0
- package/dist/store/connectors/github.js +180 -0
- package/dist/store/connectors/slack.d.ts +69 -0
- package/dist/store/connectors/slack.js +177 -0
- package/dist/store/dashboard-reads.d.ts +27 -0
- package/dist/store/dashboard-reads.js +88 -0
- package/dist/store/delete-and-batch.d.ts +27 -51
- package/dist/store/delete-and-batch.js +100 -92
- package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +16 -5
- package/dist/{delivery-recorder.js → store/delivery-recorder.js} +60 -38
- package/dist/store/descendant-page.d.ts +12 -0
- package/dist/store/descendant-page.js +99 -0
- package/dist/store/diagnostics.d.ts +47 -0
- package/dist/store/diagnostics.js +44 -0
- package/dist/store/doctor-reads.d.ts +16 -0
- package/dist/store/doctor-reads.js +19 -0
- package/dist/store/dormant.d.ts +105 -0
- package/dist/store/dormant.js +241 -0
- package/dist/store/embeddings/index.d.ts +36 -0
- package/dist/{embeddings.js → store/embeddings/index.js} +104 -224
- package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
- package/dist/{local-embedding.js → store/embeddings/local.js} +69 -75
- package/dist/store/embeddings/provider.d.ts +40 -0
- package/dist/{embedding-provider.js → store/embeddings/provider.js} +78 -91
- package/dist/store/entry-reads.d.ts +66 -63
- package/dist/store/entry-reads.js +159 -121
- package/dist/store/entry-row.d.ts +14 -37
- package/dist/store/entry-row.js +37 -45
- package/dist/store/entry-writes.d.ts +40 -17
- package/dist/store/entry-writes.js +105 -41
- package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
- package/dist/{failure-log.js → store/failure-log.js} +9 -2
- package/dist/store/goals.d.ts +96 -0
- package/dist/store/goals.js +260 -0
- package/dist/store/graph-queue.d.ts +13 -0
- package/dist/store/graph-queue.js +70 -0
- package/dist/store/graph-reads.d.ts +41 -0
- package/dist/{graph/read.js → store/graph-reads.js} +72 -162
- package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +71 -14
- package/dist/{graph/rows.js → store/graph-rows.js} +20 -12
- package/dist/store/graph-view-rows.d.ts +13 -0
- package/dist/store/graph-view-rows.js +68 -0
- package/dist/store/graph-writes.d.ts +33 -0
- package/dist/store/graph-writes.js +232 -0
- package/dist/store/half-life.d.ts +35 -0
- package/dist/store/half-life.js +75 -0
- package/dist/store/handoffs.d.ts +6 -12
- package/dist/store/handoffs.js +54 -63
- package/dist/store/index-and-stats.d.ts +14 -20
- package/dist/store/index-and-stats.js +74 -119
- package/dist/store/index.d.ts +4 -0
- package/dist/store/index.js +3 -0
- package/dist/store/key-audit.d.ts +2 -2
- package/dist/store/key-audit.js +4 -4
- package/dist/store/key-writes.d.ts +12 -5
- package/dist/store/key-writes.js +30 -4
- package/dist/store/ledger-turn.d.ts +17 -0
- package/dist/store/ledger-turn.js +27 -0
- package/dist/store/markdown.d.ts +3 -7
- package/dist/store/markdown.js +25 -23
- package/dist/store/mirrors.d.ts +7 -13
- package/dist/store/mirrors.js +52 -47
- package/dist/store/object-types.d.ts +189 -0
- package/dist/store/object-types.js +4 -0
- package/dist/store/open.d.ts +6 -4
- package/dist/store/open.js +30 -36
- package/dist/store/planning-fallacy-evidence.d.ts +14 -0
- package/dist/store/planning-fallacy-evidence.js +52 -0
- package/dist/store/port.d.ts +649 -0
- package/dist/store/port.js +17 -0
- package/dist/{predictions/store.d.ts → store/predictions.d.ts} +25 -52
- package/dist/{predictions/store.js → store/predictions.js} +88 -184
- package/dist/{quality-repair.js → store/quality-repair.js} +27 -57
- package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
- package/dist/{quarantine.js → store/quarantine.js} +64 -22
- package/dist/store/raw-archive.d.ts +14 -0
- package/dist/{raw-archive.js → store/raw-archive.js} +20 -31
- package/dist/store/recall-scope.d.ts +78 -0
- package/dist/{recall-scope.js → store/recall-scope.js} +23 -84
- package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -81
- package/dist/{recall-trace.js → store/recall-trace.js} +41 -122
- package/dist/store/rejected-values.d.ts +55 -0
- package/dist/store/rejected-values.js +150 -0
- package/dist/store/rejection.d.ts +54 -0
- package/dist/{rejection.js → store/rejection.js} +16 -67
- package/dist/store/report-reads.d.ts +6 -0
- package/dist/store/report-reads.js +29 -0
- package/dist/store/rows.d.ts +11 -22
- package/dist/store/rows.js +52 -43
- package/dist/store/rule-sql.d.ts +5 -0
- package/dist/store/rule-sql.js +37 -0
- package/dist/store/search-rows.d.ts +22 -42
- package/dist/store/search-rows.js +55 -78
- package/dist/store/sessions.d.ts +23 -49
- package/dist/store/sessions.js +96 -118
- package/dist/store/sqlite/commit-watch.d.ts +4 -0
- package/dist/store/sqlite/commit-watch.js +29 -0
- package/dist/store/sqlite/connector-events-group.d.ts +5 -0
- package/dist/store/sqlite/connector-events-group.js +50 -0
- package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
- package/dist/store/sqlite/connector-writes-group.js +65 -0
- package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
- package/dist/store/sqlite/dag-reads-group.js +45 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
- package/dist/store/{entry-writes-group.js → sqlite/entry-writes-group.js} +73 -60
- package/dist/store/sqlite/error-codec.d.ts +17 -0
- package/dist/store/sqlite/error-codec.js +61 -0
- package/dist/store/sqlite/executor-counts.d.ts +10 -0
- package/dist/store/sqlite/executor-counts.js +11 -0
- package/dist/store/sqlite/executor.d.ts +29 -0
- package/dist/store/sqlite/executor.js +287 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
- package/dist/store/sqlite/graph-reads-group.js +18 -0
- package/dist/store/sqlite/local.d.ts +21 -0
- package/dist/store/sqlite/local.js +39 -0
- package/dist/store/sqlite/object-rows.d.ts +102 -0
- package/dist/store/sqlite/object-rows.js +221 -0
- package/dist/store/sqlite/objects-group.d.ts +20 -0
- package/dist/store/sqlite/objects-group.js +316 -0
- package/dist/store/sqlite/predictions-group.d.ts +5 -0
- package/dist/store/sqlite/predictions-group.js +28 -0
- package/dist/store/sqlite/quarantine-group.d.ts +5 -0
- package/dist/store/sqlite/quarantine-group.js +38 -0
- package/dist/store/sqlite/store.d.ts +23 -0
- package/dist/store/sqlite/store.js +294 -0
- package/dist/store/sqlite/vector-pack.d.ts +18 -0
- package/dist/store/sqlite/vector-pack.js +46 -0
- package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
- package/dist/store/sqlite/vector-reads-group.js +23 -0
- package/dist/store/sqlite/worker-entry.d.ts +2 -0
- package/dist/store/sqlite/worker-entry.js +8 -0
- package/dist/store/sqlite/worker-jobs.d.ts +5 -0
- package/dist/store/sqlite/worker-jobs.js +116 -0
- package/dist/store/sqlite/worker-ops.d.ts +135 -0
- package/dist/store/sqlite/worker-ops.js +93 -0
- package/dist/store/sqlite/worker-store.d.ts +8 -0
- package/dist/store/sqlite/worker-store.js +79 -0
- package/dist/store/summaries.d.ts +11 -72
- package/dist/store/summaries.js +47 -186
- package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
- package/dist/{summary-dirty.js → store/summary-dirty.js} +1 -1
- package/dist/store/tenant-lookup.d.ts +6 -1
- package/dist/store/tenant-lookup.js +7 -0
- package/dist/store/tenant.d.ts +11 -0
- package/dist/store/tenant.js +28 -0
- package/dist/store/token-ledger-rows.d.ts +61 -0
- package/dist/store/token-ledger-rows.js +68 -0
- package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +14 -51
- package/dist/{token-ledger.js → store/token-ledger.js} +51 -129
- package/dist/store/tombstone-checks.d.ts +12 -0
- package/dist/store/tombstone-checks.js +31 -0
- package/dist/store/usage-reports.d.ts +7 -0
- package/dist/store/usage-reports.js +18 -0
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +170 -0
- package/dist/{working-memory.d.ts → store/working-memory.d.ts} +11 -26
- package/dist/store/working-memory.js +118 -0
- package/dist/{yaml.d.ts → store/yaml.d.ts} +1 -5
- package/dist/{yaml.js → store/yaml.js} +2 -6
- package/dist/support-bundle.d.ts +1 -1
- package/dist/support-bundle.js +19 -37
- package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
- package/dist/{gated-write.js → trust/gated-write.js} +6 -6
- package/dist/trust/quarantine.d.ts +4 -0
- package/dist/trust/quarantine.js +8 -0
- package/dist/trust/reject-flow.d.ts +23 -0
- package/dist/trust/reject-flow.js +65 -0
- package/dist/util/anthropic-messages.d.ts +31 -0
- package/dist/util/anthropic-messages.js +58 -0
- package/dist/util/atomic-write.d.ts +4 -0
- package/dist/util/atomic-write.js +138 -0
- package/dist/util/capped-json.d.ts +6 -0
- package/dist/util/capped-json.js +46 -0
- package/dist/util/crash-handlers.d.ts +12 -0
- package/dist/util/crash-handlers.js +72 -0
- package/dist/{env.d.ts → util/env.d.ts} +27 -7
- package/dist/{env.js → util/env.js} +33 -8
- package/dist/{home-path.d.ts → util/home-path.d.ts} +2 -1
- package/dist/util/home-path.js +69 -0
- package/dist/{http-retry.d.ts → util/http-retry.d.ts} +8 -2
- package/dist/util/http-retry.js +103 -0
- package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
- package/dist/{http-util.js → util/http-util.js} +31 -11
- package/dist/util/json.d.ts +17 -0
- package/dist/util/json.js +25 -0
- package/dist/{log.d.ts → util/log.d.ts} +7 -3
- package/dist/{log.js → util/log.js} +36 -11
- package/dist/util/real-path.d.ts +3 -0
- package/dist/util/real-path.js +15 -0
- package/dist/util/request-scope.d.ts +28 -0
- package/dist/util/request-scope.js +48 -0
- package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
- package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +5 -30
- package/dist/{secret-detect.js → util/secret-detect.js} +17 -42
- package/dist/util/stored-json.d.ts +9 -0
- package/dist/util/stored-json.js +8 -0
- package/dist/util/time.d.ts +2 -0
- package/dist/util/time.js +3 -0
- package/dist/util/token-text.d.ts +15 -0
- package/dist/util/token-text.js +20 -0
- package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +2 -0
- package/dist/util/transcript-tail.js +49 -0
- package/dist/util/version.d.ts +11 -0
- package/dist/util/version.js +26 -0
- package/extensions/openclaw-plugin/index.ts +2 -6
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
- package/dist/ablation.d.ts +0 -102
- package/dist/ablation.js +0 -136
- package/dist/api.d.ts +0 -26
- package/dist/api.js +0 -29
- package/dist/audit-prune.d.ts +0 -62
- package/dist/audit-prune.js +0 -107
- package/dist/autolearn.d.ts +0 -56
- package/dist/client.d.ts +0 -48
- package/dist/compare.d.ts +0 -86
- package/dist/compare.js +0 -117
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/connectors/github/cli-impl.js +0 -227
- package/dist/connectors/github/idempotency.d.ts +0 -19
- package/dist/connectors/github/idempotency.js +0 -27
- package/dist/connectors/slack/idempotency.d.ts +0 -17
- package/dist/connectors/slack/idempotency.js +0 -31
- package/dist/correction-latency.d.ts +0 -36
- package/dist/customer-notes.d.ts +0 -96
- package/dist/customer-notes.js +0 -336
- package/dist/db.d.ts +0 -9
- package/dist/db.js +0 -8
- package/dist/decisions.d.ts +0 -94
- package/dist/decisions.js +0 -326
- package/dist/dedupe.d.ts +0 -75
- package/dist/dedupe.js +0 -169
- package/dist/dormant.d.ts +0 -93
- package/dist/dormant.js +0 -137
- package/dist/embedding-provider.d.ts +0 -77
- package/dist/embeddings.d.ts +0 -101
- package/dist/extract.js +0 -133
- package/dist/forward-claim-detector.d.ts +0 -36
- package/dist/forward-claim-detector.js +0 -112
- package/dist/goals.d.ts +0 -173
- package/dist/goals.js +0 -448
- package/dist/graph/read.d.ts +0 -73
- package/dist/graph/rows.d.ts +0 -45
- package/dist/graph/types.js +0 -11
- package/dist/graph-stream.d.ts +0 -70
- package/dist/graph-view.d.ts +0 -73
- package/dist/graph-view.js +0 -333
- package/dist/half-life-migration.d.ts +0 -63
- package/dist/half-life-migration.js +0 -182
- package/dist/handoff.js +0 -68
- package/dist/home-path.js +0 -24
- package/dist/http-retry.js +0 -51
- package/dist/incidents.d.ts +0 -103
- package/dist/incidents.js +0 -349
- package/dist/instruction-detect.js +0 -27
- package/dist/json.d.ts +0 -7
- package/dist/json.js +0 -11
- package/dist/ledger-db.d.ts +0 -10
- package/dist/ledger-db.js +0 -42
- package/dist/memory-value-weights.d.ts +0 -19
- package/dist/memory-value.d.ts +0 -113
- package/dist/memory-value.js +0 -250
- package/dist/memory.d.ts +0 -294
- package/dist/memory.js +0 -522
- package/dist/owner-validation.d.ts +0 -42
- package/dist/owner-validation.js +0 -56
- package/dist/path-context.d.ts +0 -24
- package/dist/physics-state.d.ts +0 -39
- package/dist/policies.d.ts +0 -151
- package/dist/policies.js +0 -434
- package/dist/processes.d.ts +0 -108
- package/dist/processes.js +0 -371
- package/dist/project-briefs.d.ts +0 -128
- package/dist/project-briefs.js +0 -523
- package/dist/provenance-coverage.d.ts +0 -18
- package/dist/rate-limit.d.ts +0 -34
- package/dist/raw-archive-mirror-cleanup.d.ts +0 -20
- package/dist/raw-archive.d.ts +0 -24
- package/dist/recall-history.d.ts +0 -131
- package/dist/recall-history.js +0 -227
- package/dist/recall-scope.d.ts +0 -138
- package/dist/refine-llm.d.ts +0 -61
- package/dist/refine-llm.js +0 -167
- package/dist/reject-flow.d.ts +0 -69
- package/dist/reject-flow.js +0 -260
- package/dist/rejection.d.ts +0 -100
- package/dist/replay.d.ts +0 -41
- package/dist/replay.js +0 -122
- package/dist/rrf.d.ts +0 -43
- package/dist/rrf.js +0 -61
- package/dist/scope.d.ts +0 -14
- package/dist/server-detect.d.ts +0 -72
- package/dist/server-detect.js +0 -222
- package/dist/session-owners.d.ts +0 -7
- package/dist/session-owners.js +0 -54
- package/dist/shared.d.ts +0 -186
- package/dist/shared.js +0 -540
- package/dist/skills.d.ts +0 -101
- package/dist/skills.js +0 -367
- package/dist/store/entry-writes-group.d.ts +0 -9
- package/dist/store/vector-writes.d.ts +0 -6
- package/dist/store/vector-writes.js +0 -59
- package/dist/store-port.d.ts +0 -262
- package/dist/store-port.js +0 -178
- package/dist/tenant.d.ts +0 -25
- package/dist/tenant.js +0 -43
- package/dist/trace.d.ts +0 -34
- package/dist/transcript-tail.js +0 -48
- package/dist/version.d.ts +0 -26
- package/dist/version.js +0 -41
- package/dist/working-memory.js +0 -154
- /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
- /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
- /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
- /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
- /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
- /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
- /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
- /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
- /package/dist/{api-errors.js → core/api-errors.js} +0 -0
- /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
- /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
- /package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +0 -0
- /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
- /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
- /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
- /package/dist/{quality-repair.d.ts → store/quality-repair.d.ts} +0 -0
- /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
- /package/dist/{escape.js → util/escape.js} +0 -0
- /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
- /package/dist/{keyset.js → util/keyset.js} +0 -0
- /package/dist/{same-text.js → util/same-text.js} +0 -0
- /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
- /package/dist/{db → util}/sqlite-blocked.js +0 -0
- /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
- /package/dist/{tokenize.js → util/tokenize.js} +0 -0
- /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
- /package/dist/{write-budget.js → util/write-budget.js} +0 -0
package/dist/store/conflicts.js
CHANGED
|
@@ -1,111 +1,142 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { DEFAULT_TENANT_ID } from '../util/env.js';
|
|
2
|
+
import { closeHippoDb, withWriteScope } from '../db/index.js';
|
|
3
|
+
import { rejectionDigest, insertRejectedValue, normalizeValueForRejection } from './rejection.js';
|
|
4
|
+
import { archiveRawMemory } from './raw-archive.js';
|
|
4
5
|
import { rowToMemoryConflict } from './rows.js';
|
|
5
6
|
import { audit } from './audit-event.js';
|
|
6
7
|
import { syncChangedMirrors, purgeMirrorBestEffort } from './mirrors.js';
|
|
7
|
-
import { selectEntriesByIds } from './entry-reads.js';
|
|
8
|
-
import { openStore } from './open.js';
|
|
8
|
+
import { chunked, selectEntriesByIds } from './entry-reads.js';
|
|
9
|
+
import { onHandle, openStore } from './open.js';
|
|
9
10
|
import { deleteEntryCore } from './delete-and-batch.js';
|
|
10
|
-
import { BadRequestError } from '../api-errors.js';
|
|
11
|
-
import { canTouchScope, isPersonalScope } from '
|
|
11
|
+
import { BadRequestError } from '../core/api-errors.js';
|
|
12
|
+
import { canTouchScope, isPersonalScope } from './recall-scope.js';
|
|
12
13
|
import { selectMemoryReach } from './tenant-lookup.js';
|
|
14
|
+
// The one place MemoryConflictRow's columns are listed; CONFLICT_COLS_MC is the same list under the `mc` alias.
|
|
15
|
+
const CONFLICT_COLS = 'id, memory_a_id, memory_b_id, reason, score, status, detected_at, updated_at';
|
|
16
|
+
const CONFLICT_COLS_MC = CONFLICT_COLS.split(', ').map((c) => `mc.${c}`).join(', ');
|
|
13
17
|
function canonicalConflictPair(aId, bId) {
|
|
14
18
|
return aId < bId
|
|
15
19
|
? { memory_a_id: aId, memory_b_id: bId }
|
|
16
20
|
: { memory_a_id: bId, memory_b_id: aId };
|
|
17
21
|
}
|
|
22
|
+
function selectConflictRowsInTenant(db, status, allStatuses, tenantId) {
|
|
23
|
+
// Tenanted query: JOIN memories on both members and require each in-tenant, so no cross-tenant or stale pre-fix pair surfaces.
|
|
24
|
+
// SAFETY: both branches select CONFLICT_COLS_MC, MemoryConflictRow's columns.
|
|
25
|
+
return allStatuses
|
|
26
|
+
? db.prepare(`
|
|
27
|
+
SELECT ${CONFLICT_COLS_MC}
|
|
28
|
+
FROM memory_conflicts mc
|
|
29
|
+
JOIN memories ma ON ma.id = mc.memory_a_id
|
|
30
|
+
JOIN memories mb ON mb.id = mc.memory_b_id
|
|
31
|
+
WHERE ma.tenant_id = ? AND mb.tenant_id = ?
|
|
32
|
+
ORDER BY mc.updated_at DESC, mc.id DESC
|
|
33
|
+
`).all(tenantId, tenantId)
|
|
34
|
+
: db.prepare(`
|
|
35
|
+
SELECT ${CONFLICT_COLS_MC}
|
|
36
|
+
FROM memory_conflicts mc
|
|
37
|
+
JOIN memories ma ON ma.id = mc.memory_a_id
|
|
38
|
+
JOIN memories mb ON mb.id = mc.memory_b_id
|
|
39
|
+
WHERE mc.status = ? AND ma.tenant_id = ? AND mb.tenant_id = ?
|
|
40
|
+
ORDER BY mc.updated_at DESC, mc.id DESC
|
|
41
|
+
`).all(status, tenantId, tenantId);
|
|
42
|
+
}
|
|
43
|
+
function selectConflictRowsUnscoped(db, status, allStatuses) {
|
|
44
|
+
// Unscoped query — legacy direct-mode (CLI, tests, consolidate).
|
|
45
|
+
// SAFETY: both branches select CONFLICT_COLS, MemoryConflictRow's columns.
|
|
46
|
+
return allStatuses
|
|
47
|
+
? db.prepare(`
|
|
48
|
+
SELECT ${CONFLICT_COLS}
|
|
49
|
+
FROM memory_conflicts
|
|
50
|
+
ORDER BY updated_at DESC, id DESC
|
|
51
|
+
`).all()
|
|
52
|
+
: db.prepare(`
|
|
53
|
+
SELECT ${CONFLICT_COLS}
|
|
54
|
+
FROM memory_conflicts
|
|
55
|
+
WHERE status = ?
|
|
56
|
+
ORDER BY updated_at DESC, id DESC
|
|
57
|
+
`).all(status);
|
|
58
|
+
}
|
|
18
59
|
export function listMemoryConflicts(hippoRoot, status = 'open', tenantId) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
// v0.28 — '*' is a sentinel meaning "no status filter, return all rows".
|
|
22
|
-
// Pre-v0.28 callers (cli/mcp/dashboard) always passed 'open' or default,
|
|
23
|
-
// so this sentinel is purely additive. The 4 SQL branches below cover
|
|
24
|
-
// {tenanted | unscoped} × {all-statuses | specific-status}.
|
|
60
|
+
return onHandle(hippoRoot, (db) => {
|
|
61
|
+
// '*' is a sentinel for no status filter; the 4 SQL branches below cover {tenanted | unscoped} x {all-statuses | specific-status}.
|
|
25
62
|
const allStatuses = status === '*';
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
// each in-tenant, so neither a normal cross-tenant pair nor a stale
|
|
30
|
-
// pre-fix row surfaces (consistent with resolveConflict).
|
|
31
|
-
// SAFETY: both branches select the same eight mc.* columns (aliased
|
|
32
|
-
// to MemoryConflictRow's field names) from memory_conflicts.
|
|
33
|
-
rows = allStatuses
|
|
34
|
-
? db.prepare(`
|
|
35
|
-
SELECT mc.id, mc.memory_a_id, mc.memory_b_id, mc.reason, mc.score,
|
|
36
|
-
mc.status, mc.detected_at, mc.updated_at
|
|
37
|
-
FROM memory_conflicts mc
|
|
38
|
-
JOIN memories ma ON ma.id = mc.memory_a_id
|
|
39
|
-
JOIN memories mb ON mb.id = mc.memory_b_id
|
|
40
|
-
WHERE ma.tenant_id = ? AND mb.tenant_id = ?
|
|
41
|
-
ORDER BY mc.updated_at DESC, mc.id DESC
|
|
42
|
-
`).all(tenantId, tenantId)
|
|
43
|
-
: db.prepare(`
|
|
44
|
-
SELECT mc.id, mc.memory_a_id, mc.memory_b_id, mc.reason, mc.score,
|
|
45
|
-
mc.status, mc.detected_at, mc.updated_at
|
|
46
|
-
FROM memory_conflicts mc
|
|
47
|
-
JOIN memories ma ON ma.id = mc.memory_a_id
|
|
48
|
-
JOIN memories mb ON mb.id = mc.memory_b_id
|
|
49
|
-
WHERE mc.status = ? AND ma.tenant_id = ? AND mb.tenant_id = ?
|
|
50
|
-
ORDER BY mc.updated_at DESC, mc.id DESC
|
|
51
|
-
`).all(status, tenantId, tenantId);
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
// Unscoped query — legacy direct-mode (CLI, tests, consolidate).
|
|
55
|
-
// SAFETY: both branches select the same eight columns matching
|
|
56
|
-
// MemoryConflictRow's field set.
|
|
57
|
-
rows = allStatuses
|
|
58
|
-
? db.prepare(`
|
|
59
|
-
SELECT id, memory_a_id, memory_b_id, reason, score, status, detected_at, updated_at
|
|
60
|
-
FROM memory_conflicts
|
|
61
|
-
ORDER BY updated_at DESC, id DESC
|
|
62
|
-
`).all()
|
|
63
|
-
: db.prepare(`
|
|
64
|
-
SELECT id, memory_a_id, memory_b_id, reason, score, status, detected_at, updated_at
|
|
65
|
-
FROM memory_conflicts
|
|
66
|
-
WHERE status = ?
|
|
67
|
-
ORDER BY updated_at DESC, id DESC
|
|
68
|
-
`).all(status);
|
|
69
|
-
}
|
|
63
|
+
const rows = tenantId !== undefined
|
|
64
|
+
? selectConflictRowsInTenant(db, status, allStatuses, tenantId)
|
|
65
|
+
: selectConflictRowsUnscoped(db, status, allStatuses);
|
|
70
66
|
return rows.map(rowToMemoryConflict);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
67
|
+
}, openStore);
|
|
68
|
+
}
|
|
69
|
+
// listMemoryConflicts' tenanted open set: both members in the tenant.
|
|
70
|
+
const OPEN_IN_TENANT = `FROM memory_conflicts mc
|
|
71
|
+
JOIN memories ma ON ma.id = mc.memory_a_id
|
|
72
|
+
JOIN memories mb ON mb.id = mc.memory_b_id
|
|
73
|
+
WHERE mc.status = 'open' AND ma.tenant_id = ? AND mb.tenant_id = ?`;
|
|
74
|
+
/** How many open conflicts listMemoryConflicts returns for a tenant, without loading one. */
|
|
75
|
+
export function countOpenConflicts(hippoRoot, tenantId) {
|
|
76
|
+
return onHandle(hippoRoot, (db) => {
|
|
77
|
+
// SAFETY: one row with the single aliased count column.
|
|
78
|
+
const row = db.prepare(`SELECT COUNT(*) AS n ${OPEN_IN_TENANT}`).get(tenantId, tenantId);
|
|
79
|
+
return Number(row.n);
|
|
80
|
+
}, openStore);
|
|
81
|
+
}
|
|
82
|
+
/** A tenant's open conflicts naming `memoryId`, in listMemoryConflicts' order, each with its other member read in one batch. */
|
|
83
|
+
export function loadOpenConflictsOf(hippoRoot, tenantId, memoryId) {
|
|
84
|
+
return onHandle(hippoRoot, (db) => {
|
|
85
|
+
// SAFETY: selects CONFLICT_COLS_MC, MemoryConflictRow's columns.
|
|
86
|
+
const rows = db.prepare(`SELECT ${CONFLICT_COLS_MC}
|
|
87
|
+
${OPEN_IN_TENANT} AND (mc.memory_a_id = ? OR mc.memory_b_id = ?)
|
|
88
|
+
ORDER BY mc.updated_at DESC, mc.id DESC`).all(tenantId, tenantId, memoryId, memoryId);
|
|
89
|
+
const conflicts = rows.map(rowToMemoryConflict);
|
|
90
|
+
const otherId = (c) => (c.memory_a_id === memoryId ? c.memory_b_id : c.memory_a_id);
|
|
91
|
+
const others = selectEntriesByIds(db, conflicts.map(otherId), tenantId);
|
|
92
|
+
const out = [];
|
|
93
|
+
for (const conflict of conflicts) {
|
|
94
|
+
const other = others.get(otherId(conflict));
|
|
95
|
+
if (other)
|
|
96
|
+
out.push({ conflict, other });
|
|
97
|
+
}
|
|
98
|
+
return out;
|
|
99
|
+
}, openStore);
|
|
75
100
|
}
|
|
76
101
|
/** Conflicts whose two rows `actor` may both touch; someone else's personal row hides its whole pair. */
|
|
77
102
|
export function listTouchableConflicts(hippoRoot, status, tenantId, actor) {
|
|
78
103
|
const conflicts = listMemoryConflicts(hippoRoot, status, tenantId);
|
|
79
|
-
|
|
80
|
-
try {
|
|
104
|
+
return onHandle(hippoRoot, (db) => {
|
|
81
105
|
return conflicts.filter((c) => [c.memory_a_id, c.memory_b_id].every((id) => canTouchScope(actor, selectMemoryReach(db, id)?.scope ?? null)));
|
|
82
|
-
}
|
|
83
|
-
finally {
|
|
84
|
-
closeHippoDb(db);
|
|
85
|
-
}
|
|
106
|
+
});
|
|
86
107
|
}
|
|
87
108
|
export function replaceDetectedConflicts(hippoRoot, detected, detectedAt = new Date().toISOString()) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
const changedIds = writeConflictRefresh(db, readConflictRefresh(db), detected, detectedAt);
|
|
109
|
+
onHandle(hippoRoot, (db) => {
|
|
110
|
+
const changedIds = writeConflictRefresh(db, readConflictRefresh(db, detected), detected, detectedAt);
|
|
91
111
|
syncChangedMirrors(hippoRoot, db, [...selectEntriesByIds(db, changedIds).values()]);
|
|
92
|
-
}
|
|
93
|
-
finally {
|
|
94
|
-
closeHippoDb(db);
|
|
95
|
-
}
|
|
112
|
+
}, openStore);
|
|
96
113
|
}
|
|
97
|
-
/** The refresh's
|
|
98
|
-
|
|
114
|
+
/** The refresh's reads, kept out of the write lock; only rows holding refs, in an open conflict or in `detected` are loaded, not the whole table. */
|
|
115
|
+
function readConflictRefresh(db, detected) {
|
|
99
116
|
// Tenant guard (E2): a conflict is meaningful only within one tenant, so cross-tenant pairs are
|
|
100
117
|
// skipped on insert and on rebuild, and a stale cross-tenant row can neither persist nor leak a foreign id.
|
|
101
118
|
const tenantById = new Map();
|
|
102
119
|
const storedRefs = new Map();
|
|
103
120
|
// SAFETY: rows' shape matches the three columns named in the SELECT.
|
|
104
|
-
|
|
121
|
+
const rows = db.prepare(`
|
|
122
|
+
SELECT id, tenant_id, conflicts_with_json FROM memories
|
|
123
|
+
WHERE conflicts_with_json != '[]'
|
|
124
|
+
OR id IN (SELECT memory_a_id FROM memory_conflicts WHERE status = 'open')
|
|
125
|
+
OR id IN (SELECT memory_b_id FROM memory_conflicts WHERE status = 'open')
|
|
126
|
+
`).all();
|
|
127
|
+
for (const r of rows) {
|
|
105
128
|
tenantById.set(r.id, r.tenant_id);
|
|
106
129
|
if (r.conflicts_with_json !== '[]')
|
|
107
130
|
storedRefs.set(r.id, r.conflicts_with_json);
|
|
108
131
|
}
|
|
132
|
+
const given = [...new Set(detected.flatMap((c) => [c.memory_a_id, c.memory_b_id]))].filter((id) => !tenantById.has(id));
|
|
133
|
+
for (const ids of chunked(given)) {
|
|
134
|
+
const marks = ids.map(() => '?').join(',');
|
|
135
|
+
// SAFETY: rows' shape matches the two columns named in the SELECT.
|
|
136
|
+
const found = db.prepare(`SELECT id, tenant_id FROM memories WHERE id IN (${marks})`).all(...ids);
|
|
137
|
+
for (const r of found)
|
|
138
|
+
tenantById.set(r.id, r.tenant_id);
|
|
139
|
+
}
|
|
109
140
|
const sameTenant = (a, b) => {
|
|
110
141
|
const ta = tenantById.get(a);
|
|
111
142
|
const tb = tenantById.get(b);
|
|
@@ -114,32 +145,23 @@ export function readConflictRefresh(db) {
|
|
|
114
145
|
return { sameTenant, storedRefs };
|
|
115
146
|
}
|
|
116
147
|
/** Under the write lock: the memory_conflicts rows, then each memory whose refs change; returns the ids it rewrote. */
|
|
117
|
-
|
|
148
|
+
function writeConflictRefresh(db, reads, detected, detectedAt) {
|
|
118
149
|
const canonicalDetected = detected.map((conflict) => ({
|
|
119
150
|
...canonicalConflictPair(conflict.memory_a_id, conflict.memory_b_id),
|
|
120
151
|
reason: conflict.reason,
|
|
121
152
|
score: conflict.score,
|
|
122
153
|
}));
|
|
123
|
-
db
|
|
124
|
-
try {
|
|
154
|
+
return withWriteScope(db, 'replace_conflicts', () => {
|
|
125
155
|
resolveStaleOpenConflicts(db, canonicalDetected, reads.sameTenant, detectedAt);
|
|
126
156
|
upsertDetectedConflicts(db, canonicalDetected, reads.sameTenant, detectedAt);
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
return changedIds;
|
|
130
|
-
}
|
|
131
|
-
catch (error) {
|
|
132
|
-
if (db.isTransaction !== false)
|
|
133
|
-
db.exec('ROLLBACK');
|
|
134
|
-
throw error;
|
|
135
|
-
}
|
|
157
|
+
return rebuildConflictsWithJson(db, reads);
|
|
158
|
+
});
|
|
136
159
|
}
|
|
137
160
|
function resolveStaleOpenConflicts(db, canonicalDetected, sameTenant, detectedAt) {
|
|
138
161
|
const detectedKeys = new Set(canonicalDetected.map((conflict) => `${conflict.memory_a_id}::${conflict.memory_b_id}`));
|
|
139
|
-
// SAFETY: openRows' shape matches the
|
|
140
|
-
// above.
|
|
162
|
+
// SAFETY: openRows' shape matches the columns named in CONFLICT_COLS.
|
|
141
163
|
const openRows = db.prepare(`
|
|
142
|
-
SELECT
|
|
164
|
+
SELECT ${CONFLICT_COLS}
|
|
143
165
|
FROM memory_conflicts
|
|
144
166
|
WHERE status = 'open'
|
|
145
167
|
`).all();
|
|
@@ -147,11 +169,7 @@ function resolveStaleOpenConflicts(db, canonicalDetected, sameTenant, detectedAt
|
|
|
147
169
|
for (const row of openRows) {
|
|
148
170
|
const key = `${row.memory_a_id}::${row.memory_b_id}`;
|
|
149
171
|
const stale = !detectedKeys.has(key);
|
|
150
|
-
//
|
|
151
|
-
// loop in upsertDetectedConflicts and the refMap rebuild skip
|
|
152
|
-
// cross-tenant pairs, but the resolve-stale loop previously left
|
|
153
|
-
// re-detected cross-tenant rows lingering status='open'. The
|
|
154
|
-
// sameTenant() helper is already built one block up; no extra query.
|
|
172
|
+
// Auto-resolve any open cross-tenant row: the insert loop and refMap rebuild skip those pairs, so re-detected ones would linger as 'open'.
|
|
155
173
|
const crossTenant = !sameTenant(row.memory_a_id, row.memory_b_id);
|
|
156
174
|
if (stale || crossTenant)
|
|
157
175
|
resolve.run(detectedAt, row.id);
|
|
@@ -208,85 +226,72 @@ function rebuildConflictsWithJson(db, { sameTenant, storedRefs }) {
|
|
|
208
226
|
}
|
|
209
227
|
return changedIds;
|
|
210
228
|
}
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
* are archived via archiveRawMemory, others deleted via deleteEntryCore —
|
|
216
|
-
* AT1 fix for the pre-existing crash where a raw loser aborted the whole
|
|
217
|
-
* resolve transaction against the append-only trigger). `opts.rejectLoserValue`
|
|
218
|
-
* additionally tombstones the loser's normalized digest so it cannot be
|
|
219
|
-
* re-asserted later.
|
|
220
|
-
*
|
|
221
|
-
* Every resolution path (weaken / forget / reject) emits a `conflict_resolve`
|
|
222
|
-
* audit row (AT1 — previously resolveConflict wrote zero audit rows on any path).
|
|
223
|
-
*
|
|
224
|
-
* Returns the resolved conflict, or null if not found.
|
|
225
|
-
*/
|
|
226
|
-
export function resolveConflict(hippoRoot, conflictId, keepId, forgetLoser = false, tenantId, opts) {
|
|
227
|
-
const db = openStore(hippoRoot);
|
|
228
|
-
// When tenantId is set, the conflict lookup requires BOTH members in-tenant
|
|
229
|
-
// and every memories mutation carries AND tenant_id = ?. A cross-tenant probe
|
|
230
|
-
// then returns null, indistinguishable from a bad id. Omitted tenantId =
|
|
231
|
-
// legacy unscoped behaviour (CLI direct mode, tests, consolidate.ts).
|
|
232
|
-
const scope = {
|
|
229
|
+
// With tenantId, both members must be in-tenant and every memories mutation carries AND tenant_id = ?; a cross-tenant probe returns null like a bad id.
|
|
230
|
+
// Omitted tenantId = unscoped (CLI direct mode, tests).
|
|
231
|
+
function conflictMemScope(tenantId) {
|
|
232
|
+
return {
|
|
233
233
|
memScope: tenantId !== undefined ? ' AND tenant_id = ?' : '',
|
|
234
234
|
memArgs: tenantId !== undefined ? [tenantId] : [],
|
|
235
235
|
};
|
|
236
|
+
}
|
|
237
|
+
function findResolvableConflict(db, conflictId, keepId, tenantId) {
|
|
238
|
+
const row = selectConflictRow(db, conflictId, tenantId);
|
|
239
|
+
if (!row)
|
|
240
|
+
return null;
|
|
241
|
+
const conflict = rowToMemoryConflict(row);
|
|
242
|
+
if (conflict.status !== 'open')
|
|
243
|
+
return null;
|
|
244
|
+
const loserId = keepId === conflict.memory_a_id
|
|
245
|
+
? conflict.memory_b_id
|
|
246
|
+
: keepId === conflict.memory_b_id
|
|
247
|
+
? conflict.memory_a_id
|
|
248
|
+
: null;
|
|
249
|
+
if (!loserId)
|
|
250
|
+
return null;
|
|
251
|
+
return { conflict, loserId };
|
|
252
|
+
}
|
|
253
|
+
/** Resolve a conflict by keeping one memory and halving the loser's half-life; `--forget` removes the loser, `opts.rejectLoserValue` also tombstones its
|
|
254
|
+
* digest. Every path emits a `conflict_resolve` audit row. Returns the resolved conflict, or null if not found. */
|
|
255
|
+
export function resolveConflict(hippoRoot, conflictId, keepId, forgetLoser = false, tenantId, opts) {
|
|
256
|
+
const db = openStore(hippoRoot);
|
|
257
|
+
const scope = conflictMemScope(tenantId);
|
|
236
258
|
try {
|
|
237
|
-
const
|
|
238
|
-
if (!
|
|
239
|
-
return null;
|
|
240
|
-
const conflict = rowToMemoryConflict(row);
|
|
241
|
-
if (conflict.status !== 'open')
|
|
259
|
+
const resolvable = findResolvableConflict(db, conflictId, keepId, tenantId);
|
|
260
|
+
if (!resolvable)
|
|
242
261
|
return null;
|
|
243
|
-
const loserId =
|
|
244
|
-
? conflict.memory_b_id
|
|
245
|
-
: keepId === conflict.memory_b_id
|
|
246
|
-
? conflict.memory_a_id
|
|
247
|
-
: null;
|
|
248
|
-
if (!loserId)
|
|
249
|
-
return null;
|
|
250
|
-
db.exec('BEGIN IMMEDIATE');
|
|
251
|
-
// Mark conflict as resolved
|
|
252
|
-
db.prepare(`UPDATE memory_conflicts SET status = 'resolved', updated_at = datetime('now') WHERE id = ?`)
|
|
253
|
-
.run(conflictId);
|
|
262
|
+
const { conflict, loserId } = resolvable;
|
|
254
263
|
const target = { conflictId, keepId, loserId, scope, opts };
|
|
255
|
-
const
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
264
|
+
const removal = withWriteScope(db, 'resolve_conflict', () => {
|
|
265
|
+
// Mark conflict as resolved
|
|
266
|
+
db.prepare(`UPDATE memory_conflicts SET status = 'resolved', updated_at = datetime('now') WHERE id = ?`)
|
|
267
|
+
.run(conflictId);
|
|
268
|
+
const removeLoser = forgetLoser || opts?.rejectLoserValue === true;
|
|
269
|
+
const out = removeLoser ? removeConflictLoser(db, target) : weakenConflictLoser(db, target);
|
|
270
|
+
stripConflictRefs(db, target, out.loserRemoved);
|
|
271
|
+
auditConflictResolve(db, target, out, tenantId);
|
|
272
|
+
return out;
|
|
273
|
+
});
|
|
260
274
|
syncChangedMirrors(hippoRoot, db, [...selectEntriesByIds(db, [keepId, loserId]).values()]);
|
|
261
275
|
if (removal.loserRemoved)
|
|
262
276
|
purgeRemovedLoserMirrors(hippoRoot, db, loserId, removal);
|
|
263
277
|
return { conflict: { ...conflict, status: 'resolved' }, loserId };
|
|
264
278
|
}
|
|
265
|
-
catch (error) {
|
|
266
|
-
try {
|
|
267
|
-
db.exec('ROLLBACK');
|
|
268
|
-
}
|
|
269
|
-
catch { /* ignore */ }
|
|
270
|
-
throw error;
|
|
271
|
-
}
|
|
272
279
|
finally {
|
|
273
280
|
closeHippoDb(db);
|
|
274
281
|
}
|
|
275
282
|
}
|
|
276
283
|
function selectConflictRow(db, conflictId, tenantId) {
|
|
277
|
-
// SAFETY:
|
|
278
|
-
// tenanted branch) matching MemoryConflictRow's field set.
|
|
284
|
+
// SAFETY: the branches select CONFLICT_COLS_MC and CONFLICT_COLS, MemoryConflictRow's columns.
|
|
279
285
|
return (tenantId !== undefined
|
|
280
286
|
? db.prepare(`
|
|
281
|
-
SELECT
|
|
282
|
-
mc.status, mc.detected_at, mc.updated_at
|
|
287
|
+
SELECT ${CONFLICT_COLS_MC}
|
|
283
288
|
FROM memory_conflicts mc
|
|
284
289
|
JOIN memories ma ON ma.id = mc.memory_a_id
|
|
285
290
|
JOIN memories mb ON mb.id = mc.memory_b_id
|
|
286
291
|
WHERE mc.id = ? AND ma.tenant_id = ? AND mb.tenant_id = ?
|
|
287
292
|
`).get(conflictId, tenantId, tenantId)
|
|
288
293
|
: db.prepare(`
|
|
289
|
-
SELECT
|
|
294
|
+
SELECT ${CONFLICT_COLS}
|
|
290
295
|
FROM memory_conflicts WHERE id = ?
|
|
291
296
|
`).get(conflictId));
|
|
292
297
|
}
|
|
@@ -297,21 +302,13 @@ function weakenConflictLoser(db, t) {
|
|
|
297
302
|
return { loserRemoved: false, loserWasRaw: false, rejectedDigest: undefined, extraRemovedIds: [], extraRemovedRawIds: [] };
|
|
298
303
|
}
|
|
299
304
|
function removeConflictLoser(db, t) {
|
|
300
|
-
//
|
|
301
|
-
//
|
|
302
|
-
// `DELETE FROM memories WHERE id = ?` aborted the whole transaction when
|
|
303
|
-
// the loser was kind='raw' (append-only trigger fires); route through
|
|
304
|
-
// the same helpers the reject verb uses (both db-scoped, both compose
|
|
305
|
-
// inside this BEGIN/COMMIT). loserRemoved / loserWasRaw drive both the
|
|
306
|
-
// conflicts_with_json skip below and the post-commit mirror purge.
|
|
305
|
+
// Removal is kind-aware: a bare DELETE on a raw loser fires the append-only trigger, so use the same helpers as the reject verb.
|
|
306
|
+
// loserRemoved / loserWasRaw drive the conflicts_with_json skip below and the post-commit mirror purge.
|
|
307
307
|
const removal = {
|
|
308
308
|
loserRemoved: false,
|
|
309
309
|
loserWasRaw: false,
|
|
310
310
|
rejectedDigest: undefined,
|
|
311
|
-
//
|
|
312
|
-
// rejectLoserValue also removes (see below) — separate from loserId so
|
|
313
|
-
// the audit + post-commit mirror purge can cover ALL of them, not just
|
|
314
|
-
// loserId.
|
|
311
|
+
// Same-tenant duplicates of the loser's content that rejectLoserValue also removes; kept apart from loserId so audit and mirror purge cover all of them.
|
|
315
312
|
extraRemovedIds: [],
|
|
316
313
|
extraRemovedRawIds: [],
|
|
317
314
|
};
|
|
@@ -340,6 +337,17 @@ function removeConflictLoser(db, t) {
|
|
|
340
337
|
// the old tenant-scoped DELETE's silent 0-rows-affected behavior.
|
|
341
338
|
return removal;
|
|
342
339
|
}
|
|
340
|
+
function recordRejectedLoserValue(db, t, loserRow, digest, who) {
|
|
341
|
+
insertRejectedValue(db, {
|
|
342
|
+
tenantId: loserRow.tenant_id ?? DEFAULT_TENANT_ID,
|
|
343
|
+
digest,
|
|
344
|
+
reason: who.reason,
|
|
345
|
+
rejectedBy: who.actor,
|
|
346
|
+
rejectedAt: new Date().toISOString(),
|
|
347
|
+
sourceMemoryId: t.loserId,
|
|
348
|
+
normalizedChars: normalizeValueForRejection(loserRow.content).length,
|
|
349
|
+
});
|
|
350
|
+
}
|
|
343
351
|
/** Tombstones the loser's digest and removes its same-tenant duplicates into `removal`; returns the digest. */
|
|
344
352
|
function tombstoneLoserValue(db, t, loserRow, who, removal) {
|
|
345
353
|
if (isPersonalScope(loserRow.scope)) {
|
|
@@ -347,28 +355,10 @@ function tombstoneLoserValue(db, t, loserRow, who, removal) {
|
|
|
347
355
|
}
|
|
348
356
|
const { actor, reason } = who;
|
|
349
357
|
const rejectedDigest = rejectionDigest(loserRow.content);
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
rejectedBy: actor,
|
|
355
|
-
rejectedAt: new Date().toISOString(),
|
|
356
|
-
sourceMemoryId: t.loserId,
|
|
357
|
-
normalizedChars: normalizeValueForRejection(loserRow.content).length,
|
|
358
|
-
});
|
|
359
|
-
// AT1 P1 fix (codex): reject-flow.ts's `rejectValue` removes ALL
|
|
360
|
-
// live same-tenant rows whose normalized digest matches, not just
|
|
361
|
-
// the one id passed — but this branch only ever removed loserId,
|
|
362
|
-
// leaving same-TENANT duplicates live while their shared content
|
|
363
|
-
// was tombstoned. Same O(N) scan pattern as reject-flow.ts (human-
|
|
364
|
-
// triggered command, tenant's row count is human-scale). CRITICAL
|
|
365
|
-
// BOUNDARY: tenant-scoped ONLY — tombstones are tenant-scoped by
|
|
366
|
-
// design, so a same-content row in ANOTHER tenant is legitimately
|
|
367
|
-
// live and must NOT be touched here. `keepId` is excluded even if
|
|
368
|
-
// its content coincidentally matches: the human explicitly chose
|
|
369
|
-
// to keep it in this same resolution, and this branch must not
|
|
370
|
-
// undo that choice in the same transaction.
|
|
371
|
-
const loserTenantId = loserRow.tenant_id ?? 'default';
|
|
358
|
+
recordRejectedLoserValue(db, t, loserRow, rejectedDigest, who);
|
|
359
|
+
// Remove ALL live same-tenant rows whose digest matches (as reject-flow.ts rejectValue does), not just loserId; the O(N) scan is human-scale.
|
|
360
|
+
// Tenant-scoped ONLY, since tombstones are; `keepId` is excluded even if its content matches, because the human chose to keep it.
|
|
361
|
+
const loserTenantId = loserRow.tenant_id ?? DEFAULT_TENANT_ID;
|
|
372
362
|
// SAFETY: dupRows' shape matches the four columns named in the SELECT above.
|
|
373
363
|
const dupRows = db
|
|
374
364
|
.prepare(`SELECT id, kind, content, scope FROM memories WHERE tenant_id = ? AND id != ? AND id != ?`)
|
|
@@ -393,9 +383,8 @@ function tombstoneLoserValue(db, t, loserRow, who, removal) {
|
|
|
393
383
|
function stripConflictRefs(db, t, loserRemoved) {
|
|
394
384
|
const { memScope, memArgs } = t.scope;
|
|
395
385
|
const { keepId, loserId } = t;
|
|
396
|
-
// Clean up conflicts_with references
|
|
397
|
-
// SAFETY: keepRow's shape matches the single `conflicts_with_json`
|
|
398
|
-
// column selected above.
|
|
386
|
+
// Clean up conflicts_with references.
|
|
387
|
+
// SAFETY: keepRow's shape matches the single `conflicts_with_json` column selected above.
|
|
399
388
|
const keepRow = db.prepare(`SELECT conflicts_with_json FROM memories WHERE id = ?${memScope}`).get(keepId, ...memArgs);
|
|
400
389
|
if (keepRow) {
|
|
401
390
|
const refs = JSON.parse(keepRow.conflicts_with_json || '[]');
|
|
@@ -417,60 +406,43 @@ function stripConflictRefs(db, t, loserRemoved) {
|
|
|
417
406
|
}
|
|
418
407
|
function auditConflictResolve(db, t, removal, tenantId) {
|
|
419
408
|
const { loserRemoved, loserWasRaw, rejectedDigest, extraRemovedIds } = removal;
|
|
420
|
-
//
|
|
421
|
-
// rows on any path before this). Every path — weaken, forget, reject —
|
|
422
|
-
// lands exactly one conflict_resolve row.
|
|
409
|
+
// Every path (weaken, forget, reject) lands exactly one conflict_resolve audit row.
|
|
423
410
|
const conflictResolveMeta = {
|
|
424
411
|
conflictId: t.conflictId,
|
|
425
412
|
keepId: t.keepId,
|
|
426
413
|
loserId: t.loserId,
|
|
427
414
|
disposition: loserRemoved ? (loserWasRaw ? 'archived_raw' : 'deleted') : 'weakened',
|
|
428
415
|
rejected: Boolean(t.opts?.rejectLoserValue),
|
|
429
|
-
//
|
|
430
|
-
// same-tenant duplicate sweep above (extraRemovedIds) needs an
|
|
431
|
-
// audit trail too.
|
|
416
|
+
// Every row this call removed, not just loserId, so the duplicate sweep (extraRemovedIds) is audited too.
|
|
432
417
|
removedIds: loserRemoved ? [t.loserId, ...extraRemovedIds] : [],
|
|
433
418
|
};
|
|
434
419
|
// Assigned only when present so the serialized audit payload keeps
|
|
435
420
|
// omitting the key, exactly as the pre-migration object literal did.
|
|
436
421
|
if (rejectedDigest !== undefined)
|
|
437
422
|
conflictResolveMeta.rejectedDigest = rejectedDigest;
|
|
438
|
-
// Fresh spread literal: ConflictResolveMeta is a closed interface (
|
|
439
|
-
|
|
440
|
-
// Record<string, JsonValue> metadata param; a spread into a fresh
|
|
441
|
-
// object literal satisfies it without widening the declared type above.
|
|
442
|
-
audit(db, 'conflict_resolve', t.keepId, { ...conflictResolveMeta }, t.opts?.rejectedBy ?? 'cli', tenantId);
|
|
423
|
+
// Fresh spread literal: ConflictResolveMeta is a closed interface, not assignable to audit()'s Record<string, JsonValue> metadata otherwise.
|
|
424
|
+
audit(db, 'conflict_resolve', { targetId: t.keepId, metadata: { ...conflictResolveMeta }, actor: t.opts?.rejectedBy ?? 'cli', tenantId });
|
|
443
425
|
}
|
|
444
426
|
function purgeRemovedLoserMirrors(hippoRoot, db, loserId, removal) {
|
|
445
|
-
//
|
|
446
|
-
//
|
|
447
|
-
// a raw loser crashed outright (bare DELETE FROM memories hit the
|
|
448
|
-
// append-only trigger) — there is no legacy "successful forget, no
|
|
449
|
-
// purge" behavior to preserve for that case. Post-AT1's kind-aware
|
|
450
|
-
// removal (archiveRawMemory / deleteEntryCore above) makes plain
|
|
451
|
-
// --forget succeed on every kind, but until this fix the mirror was
|
|
452
|
-
// only purged when rejectLoserValue was ALSO set: a plain raw --forget
|
|
453
|
-
// left its markdown mirror orphaned (the reaper still catches it
|
|
454
|
-
// eventually, since archiveRawMemory's own raw_archive insert leaves
|
|
455
|
-
// mirror_cleaned_at NULL) and a plain non-raw --forget left its mirror
|
|
456
|
-
// orphaned FOREVER (no reaper exists for non-raw rows). Same post-commit
|
|
457
|
-
// purge+reaper pattern as the reject verb (src/reject-flow.ts) and
|
|
458
|
-
// api.archiveRaw — reusing removeEntryMirrors + raw_archive bookkeeping.
|
|
459
|
-
// AT1 P1 fix: loop over loserId AND every same-tenant duplicate the
|
|
460
|
-
// rejectLoserValue sweep above removed (extraRemovedIds) — previously
|
|
461
|
-
// only loserId's mirror was purged, leaving duplicate mirrors orphaned
|
|
462
|
-
// despite their rows being gone.
|
|
427
|
+
// Mirror purge and reaper stamp for EVERY removed loser (loserId and each extraRemovedIds duplicate), post-commit like the reject verb.
|
|
428
|
+
// A non-raw mirror has no reaper, so skipping the purge would orphan it forever.
|
|
463
429
|
for (const removedId of [loserId, ...removal.extraRemovedIds]) {
|
|
464
430
|
const isRaw = removedId === loserId ? removal.loserWasRaw : removal.extraRemovedRawIds.includes(removedId);
|
|
465
|
-
//
|
|
466
|
-
// which cleanupArchivedMirrors' reaper never scans — reports the
|
|
467
|
-
// EXPLICIT leftover path(s) instead of the false "will retry via
|
|
468
|
-
// reaper" claim. See its own doc comment (store.ts, near
|
|
469
|
-
// removeEntryMirrors) for the full rationale.
|
|
431
|
+
// purgeMirrorBestEffort retries once, then reports the explicit leftover paths for non-raw ids, which the cleanupArchivedMirrors reaper never scans.
|
|
470
432
|
const mirrorOk = purgeMirrorBestEffort(hippoRoot, removedId, isRaw, 'resolveConflict');
|
|
471
433
|
if (mirrorOk && isRaw) {
|
|
472
434
|
db.prepare(`UPDATE raw_archive SET mirror_cleaned_at = ? WHERE memory_id = ?`).run(new Date().toISOString(), removedId);
|
|
473
435
|
}
|
|
474
436
|
}
|
|
475
437
|
}
|
|
438
|
+
/** The conflict and loser ids every conflict_resolve audit row names. */
|
|
439
|
+
export function conflictResolveAuditsAt(db) {
|
|
440
|
+
// SAFETY: SELECT of two fields every conflict_resolve audit row carries (ConflictResolveMeta above).
|
|
441
|
+
return db.prepare(`SELECT json_extract(metadata_json, '$.conflictId') AS conflictId, json_extract(metadata_json, '$.loserId') AS loserId FROM audit_log WHERE op = 'conflict_resolve'`).all();
|
|
442
|
+
}
|
|
443
|
+
/** Every resolved conflict with both sides. */
|
|
444
|
+
export function resolvedConflictsAt(db) {
|
|
445
|
+
// SAFETY: SELECT of three columns of resolved conflicts.
|
|
446
|
+
return db.prepare(`SELECT id, memory_a_id, memory_b_id FROM memory_conflicts WHERE status = 'resolved'`).all();
|
|
447
|
+
}
|
|
476
448
|
//# sourceMappingURL=conflicts.js.map
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { type DatabaseSyncLike } from '../../db/index.js';
|
|
2
|
+
/** One github_event_log row to write; `memoryId` is null for an event that produced no memory. */
|
|
3
|
+
export interface GitHubEventLogEntry {
|
|
4
|
+
idempotencyKey: string;
|
|
5
|
+
deliveryId: string;
|
|
6
|
+
eventName: string;
|
|
7
|
+
memoryId: string | null;
|
|
8
|
+
}
|
|
9
|
+
export declare function eventSeenAt(db: DatabaseSyncLike, idempotencyKey: string): boolean;
|
|
10
|
+
export declare function eventMemoryAt(db: DatabaseSyncLike, idempotencyKey: string): string | null;
|
|
11
|
+
/** False when the key was already logged, so a caller inside a write scope can roll its own row back. */
|
|
12
|
+
export declare function logEventAt(db: DatabaseSyncLike, entry: GitHubEventLogEntry): boolean;
|
|
13
|
+
/** The memory an already-seen key points at, or null when the key is new. */
|
|
14
|
+
export declare function seenEvent(hippoRoot: string, idempotencyKey: string): {
|
|
15
|
+
memoryId: string | null;
|
|
16
|
+
} | null;
|
|
17
|
+
export declare function logEvent(hippoRoot: string, entry: GitHubEventLogEntry): void;
|
|
18
|
+
export interface ArtifactDeletion {
|
|
19
|
+
tenantId: string;
|
|
20
|
+
artifactRef: string;
|
|
21
|
+
idempotencyKey: string;
|
|
22
|
+
deliveryId: string;
|
|
23
|
+
eventName: string;
|
|
24
|
+
reason: string;
|
|
25
|
+
who: string;
|
|
26
|
+
}
|
|
27
|
+
/** Archives every active raw row of one tenant's artifact and logs the delete event; a failed archive rolls back the batch and the log row. */
|
|
28
|
+
export declare function archiveDeletedArtifact(hippoRoot: string, del: ArtifactDeletion): {
|
|
29
|
+
duplicate: boolean;
|
|
30
|
+
archived: number;
|
|
31
|
+
};
|
|
32
|
+
export type DlqBucket = 'parse_error' | 'unroutable' | 'signature_failed' | 'unhandled';
|
|
33
|
+
export interface DlqItem {
|
|
34
|
+
id: number;
|
|
35
|
+
tenantId: string;
|
|
36
|
+
rawPayload: string;
|
|
37
|
+
error: string;
|
|
38
|
+
eventName: string | null;
|
|
39
|
+
deliveryId: string | null;
|
|
40
|
+
signature: string | null;
|
|
41
|
+
installationId: string | null;
|
|
42
|
+
repoFullName: string | null;
|
|
43
|
+
retryCount: number;
|
|
44
|
+
receivedAt: string;
|
|
45
|
+
retriedAt: string | null;
|
|
46
|
+
bucket: DlqBucket | string;
|
|
47
|
+
}
|
|
48
|
+
/** One github_dlq row to write, already redacted by the caller; the four GitHub-only columns are stored NULL when left out. */
|
|
49
|
+
export interface GitHubDlqInsert {
|
|
50
|
+
tenantId: string;
|
|
51
|
+
rawPayload: string;
|
|
52
|
+
error: string;
|
|
53
|
+
eventName?: string | null;
|
|
54
|
+
deliveryId?: string | null;
|
|
55
|
+
signature: string | null;
|
|
56
|
+
installationId?: string | null;
|
|
57
|
+
repoFullName?: string | null;
|
|
58
|
+
bucket: DlqBucket;
|
|
59
|
+
}
|
|
60
|
+
export declare function insertGitHubDlq(hippoRoot: string, row: GitHubDlqInsert): number;
|
|
61
|
+
export declare function listGitHubDlq(hippoRoot: string, tenantId: string, limit: number): DlqItem[];
|
|
62
|
+
export declare function githubDlqEntry(hippoRoot: string, id: number): DlqItem | null;
|
|
63
|
+
export declare function bumpGitHubDlqRetryCount(hippoRoot: string, id: number): void;
|
|
64
|
+
/** What the routing tables say about one webhook; `tenant` is the installation match, or the repo match when no installation was sent. */
|
|
65
|
+
export interface GitHubRouting {
|
|
66
|
+
installations: number;
|
|
67
|
+
repositories: number;
|
|
68
|
+
tenant: string | null;
|
|
69
|
+
}
|
|
70
|
+
export declare function githubRouting(hippoRoot: string, args: {
|
|
71
|
+
installationId?: string | null;
|
|
72
|
+
repoFullName?: string | null;
|
|
73
|
+
}): GitHubRouting;
|
|
74
|
+
export type HwmColumn = 'issues_hwm' | 'issue_comments_hwm' | 'pr_review_comments_hwm';
|
|
75
|
+
export interface StoredCursors {
|
|
76
|
+
issues: string | null;
|
|
77
|
+
issueComments: string | null;
|
|
78
|
+
prReviewComments: string | null;
|
|
79
|
+
}
|
|
80
|
+
export declare function readCursors(hippoRoot: string, tenantId: string, repo: string): StoredCursors;
|
|
81
|
+
export declare function writeHwm(hippoRoot: string, tenantId: string, repo: string, column: HwmColumn, value: string): void;
|
|
82
|
+
/** Sets all three HWMs to `since` for a first run; COALESCE keeps any HWM a stream has already saved. */
|
|
83
|
+
export declare function seedCursors(hippoRoot: string, tenantId: string, repo: string, since: string): void;
|
|
84
|
+
//# sourceMappingURL=github.d.ts.map
|