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