hippo-memory 1.72.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -4
- package/dist/agent-memories/apply.d.ts +7 -5
- package/dist/agent-memories/apply.js +66 -39
- package/dist/agent-memories/claude-code.d.ts +8 -2
- package/dist/agent-memories/claude-code.js +26 -7
- package/dist/agent-memories/copilot.js +2 -1
- package/dist/agent-memories/files.js +2 -1
- package/dist/agent-memories/legacy.d.ts +6 -3
- package/dist/agent-memories/legacy.js +35 -14
- package/dist/agent-memories/markdown.d.ts +3 -1
- package/dist/agent-memories/markdown.js +3 -1
- package/dist/agent-memories/openclaw.js +5 -2
- package/dist/agent-memories/plan.js +11 -1
- package/dist/agent-memories/project-folds.js +2 -1
- package/dist/agent-memories/report.d.ts +4 -1
- package/dist/agent-memories/report.js +43 -9
- package/dist/agent-memories/source.d.ts +8 -2
- package/dist/agent-memories/source.js +11 -3
- package/dist/agent-memories/sync.d.ts +7 -2
- package/dist/agent-memories/sync.js +141 -101
- package/dist/api/assemble.d.ts +6 -4
- package/dist/api/assemble.js +11 -5
- package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
- package/dist/api/auth/audit.js +58 -0
- package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -16
- package/dist/api/{auth.js → auth/auth.js} +66 -54
- package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
- package/dist/api/{quarantine.js → auth/quarantine.js} +8 -7
- package/dist/api/auth/session-owners.d.ts +10 -0
- package/dist/api/auth/session-owners.js +35 -0
- package/dist/api/availability.d.ts +3 -1
- package/dist/api/availability.js +3 -1
- package/dist/api/busy.d.ts +2 -0
- package/dist/api/busy.js +2 -0
- package/dist/api/cli-surface.d.ts +6 -0
- package/dist/api/cli-surface.js +6 -0
- package/dist/api/config-of.d.ts +5 -0
- package/dist/api/config-of.js +6 -0
- package/dist/api/context-auto.d.ts +4 -1
- package/dist/api/context-auto.js +14 -4
- package/dist/api/context-render.js +14 -7
- package/dist/api/context-select.d.ts +4 -1
- package/dist/api/context-select.js +31 -34
- package/dist/api/context-types.d.ts +38 -12
- package/dist/api/context.d.ts +8 -5
- package/dist/api/context.js +120 -63
- package/dist/api/continuity.d.ts +24 -21
- package/dist/api/continuity.js +18 -20
- package/dist/api/correction-latency.d.ts +3 -1
- package/dist/api/correction-latency.js +3 -1
- package/dist/api/error-reply.d.ts +4 -1
- package/dist/api/error-reply.js +12 -3
- package/dist/api/index.d.ts +39 -23
- package/dist/api/index.js +21 -23
- package/dist/api/instruction-detect.d.ts +4 -1
- package/dist/api/instruction-detect.js +75 -20
- package/dist/api/ledger-db.d.ts +15 -11
- package/dist/api/ledger-db.js +21 -23
- package/dist/api/memories/conflicts.d.ts +33 -0
- package/dist/api/memories/conflicts.js +67 -0
- package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
- package/dist/api/{forget.js → memories/forget.js} +23 -17
- package/dist/api/memories/memories.d.ts +27 -0
- package/dist/api/memories/memories.js +52 -0
- package/dist/api/memories/outcome.d.ts +22 -0
- package/dist/api/memories/outcome.js +28 -0
- package/dist/api/memories/promote.d.ts +40 -0
- package/dist/api/memories/promote.js +76 -0
- package/dist/api/memories/refine.d.ts +10 -0
- package/dist/api/memories/refine.js +12 -0
- package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +17 -9
- package/dist/api/{remember-local.js → memories/remember-local.js} +46 -24
- package/dist/api/{remember.d.ts → memories/remember.d.ts} +22 -13
- package/dist/api/{remember.js → memories/remember.js} +50 -32
- package/dist/api/objects/cards.d.ts +39 -0
- package/dist/api/{cards.js → objects/cards.js} +12 -14
- package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
- package/dist/api/{drill-down.js → objects/drill-down.js} +7 -7
- package/dist/api/objects/goals.d.ts +18 -0
- package/dist/api/{goals.js → objects/goals.js} +12 -12
- package/dist/api/objects/graph.d.ts +11 -0
- package/dist/api/objects/graph.js +16 -0
- package/dist/api/objects/objects.d.ts +9 -0
- package/dist/api/{objects.js → objects/objects.js} +2 -3
- package/dist/api/objects/predictions.d.ts +11 -0
- package/dist/api/{predictions.js → objects/predictions.js} +7 -5
- package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
- package/dist/api/{projects.js → objects/projects.js} +8 -4
- package/dist/api/pilot-arm.d.ts +8 -4
- package/dist/api/pilot-arm.js +5 -4
- package/dist/api/prompt-hook.d.ts +35 -20
- package/dist/api/prompt-hook.js +66 -44
- package/dist/api/provenance-coverage.d.ts +3 -1
- package/dist/api/provenance-coverage.js +3 -1
- package/dist/api/recall/finish.d.ts +185 -0
- package/dist/api/recall/finish.js +301 -0
- package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
- package/dist/api/{recall-pipeline.js → recall/pipeline.js} +185 -101
- package/dist/api/recall/recall.d.ts +6 -0
- package/dist/api/{recall.js → recall/recall.js} +116 -72
- package/dist/api/recall/render.d.ts +39 -0
- package/dist/api/recall/render.js +60 -0
- package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
- package/dist/api/recall/request.js +261 -0
- package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
- package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
- package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -68
- package/dist/api/{recall-types.js → recall/types.js} +1 -1
- package/dist/api/session-end.d.ts +36 -8
- package/dist/api/session-end.js +71 -25
- package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
- package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
- package/dist/api/sleep/dormant.d.ts +25 -0
- package/dist/api/sleep/dormant.js +64 -0
- package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
- package/dist/api/sleep/learn.js +138 -0
- package/dist/api/sleep/sleep-run.d.ts +38 -0
- package/dist/api/{sleep-run.js → sleep/sleep-run.js} +54 -45
- package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
- package/dist/api/sleep/sleep.js +9 -0
- package/dist/api/status.d.ts +3 -1
- package/dist/api/status.js +3 -1
- package/dist/api/store-init.d.ts +4 -1
- package/dist/api/store-init.js +4 -1
- package/dist/api/tokens.d.ts +10 -9
- package/dist/api/tokens.js +9 -10
- package/dist/api/types.d.ts +27 -12
- package/dist/api/types.js +13 -4
- package/dist/capture/caller-session.d.ts +8 -2
- package/dist/capture/caller-session.js +16 -6
- package/dist/capture/capture-error.d.ts +3 -1
- package/dist/capture/capture-error.js +3 -1
- package/dist/capture/codex-patch.js +7 -2
- package/dist/capture/command.d.ts +4 -2
- package/dist/capture/command.js +34 -15
- package/dist/capture/compact-resume-caller.js +15 -8
- package/dist/capture/compact.d.ts +8 -5
- package/dist/capture/compact.js +34 -23
- package/dist/capture/compaction-items-caller.js +9 -3
- package/dist/capture/compaction-record.d.ts +4 -3
- package/dist/capture/compaction-record.js +20 -12
- package/dist/capture/compaction-spool.d.ts +18 -9
- package/dist/capture/compaction-spool.js +105 -63
- package/dist/capture/copilot-transcript.d.ts +11 -3
- package/dist/capture/copilot-transcript.js +16 -6
- package/dist/capture/extract.js +20 -8
- package/dist/capture/failure-caller.js +23 -12
- package/dist/capture/failure-reading.d.ts +10 -3
- package/dist/capture/failure-reading.js +24 -7
- package/dist/capture/pre-compact-caller.js +11 -4
- package/dist/capture/session-digest.d.ts +15 -4
- package/dist/capture/session-digest.js +39 -13
- package/dist/capture/session-end-caller.d.ts +4 -1
- package/dist/capture/session-end-caller.js +20 -8
- package/dist/capture/session-texts.d.ts +6 -2
- package/dist/capture/session-texts.js +22 -7
- package/dist/capture/session-worker.d.ts +4 -2
- package/dist/capture/session-worker.js +58 -17
- package/dist/capture/transcript.d.ts +13 -4
- package/dist/capture/transcript.js +32 -10
- package/dist/capture/working-state.d.ts +13 -4
- package/dist/capture/working-state.js +50 -56
- package/dist/cli/api-context.d.ts +14 -2
- package/dist/cli/api-context.js +45 -2
- package/dist/cli/audit.js +33 -33
- package/dist/cli/auth.js +23 -31
- package/dist/cli/briefs.d.ts +1 -1
- package/dist/cli/briefs.js +20 -15
- package/dist/cli/card.d.ts +1 -1
- package/dist/cli/card.js +56 -73
- package/dist/cli/client.d.ts +12 -5
- package/dist/cli/client.js +53 -23
- package/dist/cli/compact-resume-payload.d.ts +4 -1
- package/dist/cli/compact-resume-payload.js +12 -5
- package/dist/cli/context.js +43 -18
- package/dist/cli/continuity.d.ts +5 -5
- package/dist/cli/continuity.js +90 -107
- package/dist/cli/curate.d.ts +5 -4
- package/dist/cli/curate.js +55 -77
- package/dist/cli/dag.d.ts +1 -1
- package/dist/cli/dag.js +14 -17
- package/dist/cli/decisions.js +30 -30
- package/dist/cli/eval.js +16 -21
- package/dist/cli/exit.d.ts +4 -1
- package/dist/cli/exit.js +10 -2
- package/dist/cli/explain.js +12 -11
- package/dist/cli/flag-values.d.ts +1 -1
- package/dist/cli/flag-values.js +9 -18
- package/dist/cli/github.d.ts +6 -0
- package/dist/cli/github.js +25 -13
- package/dist/cli/goals.d.ts +1 -1
- package/dist/cli/goals.js +39 -56
- package/dist/cli/graph.d.ts +1 -1
- package/dist/cli/graph.js +15 -11
- package/dist/cli/hook-runtime.d.ts +34 -10
- package/dist/cli/hook-runtime.js +41 -16
- package/dist/cli/incidents.d.ts +1 -1
- package/dist/cli/incidents.js +25 -25
- package/dist/cli/init.d.ts +1 -1
- package/dist/cli/init.js +35 -20
- package/dist/cli/install-steps.d.ts +12 -3
- package/dist/cli/install-steps.js +42 -18
- package/dist/cli/last-sleep.d.ts +4 -1
- package/dist/cli/last-sleep.js +9 -4
- package/dist/cli/maintenance.d.ts +1 -1
- package/dist/cli/maintenance.js +11 -12
- package/dist/cli/notes.d.ts +1 -1
- package/dist/cli/notes.js +8 -5
- package/dist/cli/object-verbs.d.ts +5 -5
- package/dist/cli/object-verbs.js +13 -16
- package/dist/cli/open-browser.js +11 -2
- package/dist/cli/playbooks.d.ts +3 -3
- package/dist/cli/playbooks.js +40 -32
- package/dist/cli/predictions.js +17 -22
- package/dist/cli/print.js +4 -2
- package/dist/cli/projects.js +21 -11
- package/dist/cli/quality-repair-once.d.ts +1 -1
- package/dist/cli/quality-repair-once.js +7 -6
- package/dist/cli/recall.js +129 -93
- package/dist/cli/refine-llm.d.ts +15 -4
- package/dist/cli/refine-llm.js +17 -7
- package/dist/cli/remember.js +51 -55
- package/dist/cli/scheduler.d.ts +4 -1
- package/dist/cli/scheduler.js +9 -5
- package/dist/cli/serve.js +28 -18
- package/dist/cli/session-hooks.d.ts +2 -6
- package/dist/cli/session-hooks.js +140 -112
- package/dist/cli/setup.d.ts +1 -1
- package/dist/cli/setup.js +56 -34
- package/dist/cli/shared.d.ts +4 -2
- package/dist/cli/shared.js +26 -11
- package/dist/cli/slack.js +15 -24
- package/dist/cli/sleep-render.d.ts +3 -1
- package/dist/cli/sleep-render.js +8 -5
- package/dist/cli/sleep.js +16 -8
- package/dist/cli/status.d.ts +4 -4
- package/dist/cli/status.js +32 -27
- package/dist/cli/stdin.d.ts +10 -3
- package/dist/cli/stdin.js +10 -3
- package/dist/cli/transfer.d.ts +4 -4
- package/dist/cli/transfer.js +97 -82
- package/dist/cli/usage.d.ts +1 -1
- package/dist/cli/usage.js +1 -1
- package/dist/cli/verb-row.d.ts +2 -0
- package/dist/cli/verbs/health.js +2 -0
- package/dist/cli/verbs/memory.js +47 -53
- package/dist/cli/verbs/objects.js +16 -7
- package/dist/cli/verbs/sessions.js +4 -2
- package/dist/cli/versioned-verbs.d.ts +8 -7
- package/dist/cli/versioned-verbs.js +31 -21
- package/dist/cli.js +14 -18
- package/dist/connectors/dlq.d.ts +6 -6
- package/dist/connectors/dlq.js +12 -7
- package/dist/connectors/github/backfill.d.ts +4 -4
- package/dist/connectors/github/backfill.js +6 -4
- package/dist/connectors/github/deletion.d.ts +6 -4
- package/dist/connectors/github/deletion.js +5 -4
- package/dist/connectors/github/dlq.d.ts +8 -6
- package/dist/connectors/github/dlq.js +11 -5
- package/dist/connectors/github/ingest.d.ts +2 -2
- package/dist/connectors/github/ingest.js +9 -5
- package/dist/connectors/github/octokit-client.d.ts +3 -1
- package/dist/connectors/github/octokit-client.js +7 -2
- package/dist/connectors/github/ratelimit.d.ts +6 -2
- package/dist/connectors/github/ratelimit.js +6 -2
- package/dist/connectors/github/signature.d.ts +14 -3
- package/dist/connectors/github/signature.js +17 -3
- package/dist/connectors/github/tenant-routing.d.ts +6 -4
- package/dist/connectors/github/tenant-routing.js +6 -5
- package/dist/connectors/github/transform.js +50 -67
- package/dist/connectors/github/types.d.ts +10 -3
- package/dist/connectors/github/types.js +6 -2
- package/dist/connectors/github/webhook.d.ts +5 -5
- package/dist/connectors/github/webhook.js +36 -23
- package/dist/connectors/ingest.d.ts +5 -3
- package/dist/connectors/ingest.js +3 -3
- package/dist/connectors/slack/backfill.d.ts +5 -5
- package/dist/connectors/slack/backfill.js +3 -3
- package/dist/connectors/slack/deletion.d.ts +4 -4
- package/dist/connectors/slack/deletion.js +6 -5
- package/dist/connectors/slack/dlq.d.ts +4 -4
- package/dist/connectors/slack/dlq.js +6 -6
- package/dist/connectors/slack/ingest.d.ts +6 -4
- package/dist/connectors/slack/ingest.js +5 -4
- package/dist/connectors/slack/signature.d.ts +4 -1
- package/dist/connectors/slack/tenant-routing.d.ts +6 -4
- package/dist/connectors/slack/tenant-routing.js +6 -5
- package/dist/connectors/slack/transform.d.ts +6 -2
- package/dist/connectors/slack/transform.js +6 -2
- package/dist/connectors/slack/types.d.ts +3 -1
- package/dist/connectors/slack/web-client.js +8 -3
- package/dist/connectors/slack/webhook.d.ts +5 -5
- package/dist/connectors/slack/webhook.js +19 -11
- package/dist/connectors/slack/workspaces.d.ts +7 -3
- package/dist/connectors/slack/workspaces.js +7 -3
- package/dist/connectors/store.d.ts +8 -0
- package/dist/connectors/store.js +2 -0
- package/dist/consolidate/conflicts.js +24 -10
- package/dist/consolidate/dag-summary.js +2 -1
- package/dist/consolidate/dag.d.ts +10 -5
- package/dist/consolidate/dag.js +45 -39
- package/dist/consolidate/decay.js +19 -6
- package/dist/consolidate/dedupe.d.ts +14 -5
- package/dist/consolidate/dedupe.js +28 -17
- package/dist/consolidate/flush-units.d.ts +4 -1
- package/dist/consolidate/flush-units.js +4 -1
- package/dist/consolidate/half-life-migration.d.ts +18 -8
- package/dist/consolidate/half-life-migration.js +48 -18
- package/dist/consolidate/llm-passes.js +27 -11
- package/dist/consolidate/memory-value-weights.d.ts +6 -2
- package/dist/consolidate/memory-value-weights.js +6 -2
- package/dist/consolidate/memory-value.d.ts +30 -10
- package/dist/consolidate/memory-value.js +37 -14
- package/dist/consolidate/merge.d.ts +4 -1
- package/dist/consolidate/merge.js +47 -37
- package/dist/consolidate/overlap-index.d.ts +8 -2
- package/dist/consolidate/overlap-index.js +11 -4
- package/dist/consolidate/physics-pass.d.ts +3 -1
- package/dist/consolidate/physics-pass.js +10 -7
- package/dist/consolidate/replay.d.ts +11 -4
- package/dist/consolidate/replay.js +19 -7
- package/dist/consolidate/run.d.ts +13 -5
- package/dist/consolidate/run.js +4 -4
- package/dist/consolidate/sleep.d.ts +14 -6
- package/dist/consolidate/sleep.js +42 -39
- package/dist/consolidate/trace.d.ts +7 -2
- package/dist/consolidate/trace.js +7 -2
- package/dist/consolidate/traces.js +27 -30
- package/dist/core/ablation.d.ts +9 -3
- package/dist/core/ablation.js +14 -4
- package/dist/core/active-scope.d.ts +3 -1
- package/dist/core/active-scope.js +3 -1
- package/dist/core/agent-memory-tools.d.ts +2 -0
- package/dist/core/agent-memory-tools.js +2 -0
- package/dist/core/ambient.d.ts +4 -3
- package/dist/core/ambient.js +8 -6
- package/dist/core/api-errors.d.ts +9 -3
- package/dist/core/api-errors.js +9 -3
- package/dist/core/capture-contract.d.ts +4 -1
- package/dist/core/capture-contract.js +27 -8
- package/dist/core/compare.d.ts +24 -8
- package/dist/core/compare.js +24 -8
- package/dist/core/config.d.ts +18 -9
- package/dist/core/config.js +38 -29
- package/dist/core/cosine.d.ts +4 -1
- package/dist/core/cosine.js +4 -1
- package/dist/core/handoff.d.ts +7 -2
- package/dist/core/handoff.js +4 -1
- package/dist/core/markdown.js +22 -17
- package/dist/core/memory-audit.js +14 -3
- package/dist/core/memory-quality.d.ts +12 -3
- package/dist/core/memory-quality.js +57 -21
- package/dist/core/memory.d.ts +87 -30
- package/dist/core/memory.js +82 -33
- package/dist/core/merged-row.d.ts +8 -2
- package/dist/core/merged-row.js +10 -3
- package/dist/core/package-root.d.ts +3 -1
- package/dist/core/package-root.js +3 -1
- package/dist/core/particle-refresh.d.ts +8 -0
- package/dist/core/particle-refresh.js +22 -0
- package/dist/core/physics-config.d.ts +4 -1
- package/dist/core/physics-config.js +6 -2
- package/dist/core/physics.d.ts +39 -11
- package/dist/core/physics.js +71 -21
- package/dist/core/project-identity.d.ts +34 -17
- package/dist/core/project-identity.js +35 -18
- package/dist/core/project-remote.d.ts +8 -4
- package/dist/core/project-remote.js +31 -14
- package/dist/core/recall-scope.d.ts +33 -11
- package/dist/core/recall-scope.js +42 -15
- package/dist/core/rejection-digest.d.ts +7 -0
- package/dist/core/rejection-digest.js +13 -0
- package/dist/core/salience.d.ts +3 -1
- package/dist/core/salience.js +10 -4
- package/dist/core/search-types.d.ts +15 -2
- package/dist/core/search-types.js +11 -0
- package/dist/dashboard/dashboard-actions.d.ts +2 -2
- package/dist/dashboard/dashboard-actions.js +18 -7
- package/dist/dashboard/dashboard-queries.js +2 -7
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
- package/dist/dashboard/dashboard-snapshot.js +5 -7
- package/dist/dashboard/dashboard.js +22 -8
- package/dist/db/backup.js +2 -2
- package/dist/db/busy.d.ts +10 -3
- package/dist/db/busy.js +27 -5
- package/dist/db/connect.d.ts +10 -2
- package/dist/db/connect.js +8 -2
- package/dist/db/continuity.d.ts +1 -1
- package/dist/db/continuity.js +27 -11
- package/dist/db/meta.d.ts +4 -1
- package/dist/db/meta.js +4 -1
- package/dist/db/migrate.d.ts +10 -5
- package/dist/db/migrate.js +40 -20
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/types.d.ts +2 -1
- package/dist/db/migrations/v11.js +1 -0
- package/dist/db/migrations/v12.js +2 -1
- package/dist/db/migrations/v14.js +2 -0
- package/dist/db/migrations/v15.js +4 -2
- package/dist/db/migrations/v16.js +6 -3
- package/dist/db/migrations/v17.js +2 -1
- package/dist/db/migrations/v19.js +4 -2
- package/dist/db/migrations/v20.js +2 -1
- package/dist/db/migrations/v22.js +12 -6
- package/dist/db/migrations/v23.js +6 -3
- package/dist/db/migrations/v24.js +6 -3
- package/dist/db/migrations/v25.js +4 -2
- package/dist/db/migrations/v26.js +4 -2
- package/dist/db/migrations/v27.js +6 -3
- package/dist/db/migrations/v28.js +4 -2
- package/dist/db/migrations/v29.js +4 -2
- package/dist/db/migrations/v30.js +6 -3
- package/dist/db/migrations/v31.js +4 -2
- package/dist/db/migrations/v32.js +6 -3
- package/dist/db/migrations/v33.js +4 -2
- package/dist/db/migrations/v34.js +2 -1
- package/dist/db/migrations/v35.js +2 -1
- package/dist/db/migrations/v36.js +2 -1
- package/dist/db/migrations/v37.js +10 -5
- package/dist/db/migrations/v38.js +10 -5
- package/dist/db/migrations/v39.js +14 -6
- package/dist/db/migrations/v40.js +4 -2
- package/dist/db/migrations/v41.js +4 -2
- package/dist/db/migrations/v42.js +2 -1
- package/dist/db/migrations/v44.js +4 -2
- package/dist/db/migrations/v45.js +4 -2
- package/dist/db/migrations/v49.js +2 -1
- package/dist/db/migrations/v50.js +4 -2
- package/dist/db/migrations/v51.js +4 -2
- package/dist/db/migrations/v52.js +2 -1
- package/dist/db/migrations/v53.js +8 -4
- package/dist/db/migrations/v54.js +2 -1
- package/dist/db/migrations/v55.js +4 -2
- package/dist/db/migrations/v56.d.ts +3 -0
- package/dist/db/migrations/v56.js +28 -0
- package/dist/db/open.d.ts +24 -12
- package/dist/db/open.js +25 -13
- package/dist/db/physics-state.d.ts +8 -8
- package/dist/db/physics-state.js +17 -50
- package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
- package/dist/db/raw-archive-mirror-cleanup.js +6 -4
- package/dist/db/request-stores.d.ts +20 -5
- package/dist/db/request-stores.js +15 -5
- package/dist/db/tables.d.ts +2 -1
- package/dist/db/tables.js +12 -4
- package/dist/db/vector-store.d.ts +13 -4
- package/dist/db/vector-store.js +35 -14
- package/dist/db/wal-checkpointer.d.ts +2 -1
- package/dist/db/wal-checkpointer.js +19 -7
- package/dist/doctor.d.ts +7 -1
- package/dist/doctor.js +128 -46
- package/dist/embeddings/local.d.ts +8 -4
- package/dist/embeddings/local.js +11 -7
- package/dist/embeddings/provider.d.ts +19 -10
- package/dist/embeddings/provider.js +32 -27
- package/dist/embeddings/transformers.d.ts +16 -4
- package/dist/embeddings/transformers.js +32 -15
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.js +2 -1
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +1 -1
- package/dist/entry/sqlite-handles.d.ts +10 -0
- package/dist/entry/sqlite-handles.js +9 -0
- package/dist/entry/store-kit.d.ts +50 -0
- package/dist/entry/store-kit.js +27 -0
- package/dist/entry/testing.d.ts +6 -0
- package/dist/entry/testing.js +7 -0
- package/dist/eval/eval-stats.d.ts +27 -8
- package/dist/eval/eval-stats.js +17 -5
- package/dist/eval/eval-suite.d.ts +3 -1
- package/dist/eval/eval-suite.js +409 -187
- package/dist/eval/eval.d.ts +8 -2
- package/dist/eval/eval.js +8 -2
- package/dist/eval/judgment.js +17 -7
- package/dist/graph/delta.d.ts +9 -42
- package/dist/graph/delta.js +17 -11
- package/dist/graph/extract.d.ts +10 -7
- package/dist/graph/extract.js +57 -25
- package/dist/graph/recall.d.ts +12 -4
- package/dist/graph/recall.js +30 -13
- package/dist/graph/stream.d.ts +18 -6
- package/dist/graph/stream.js +32 -10
- package/dist/graph/view.d.ts +19 -6
- package/dist/graph/view.js +42 -17
- package/dist/hooks/codex-session.js +2 -2
- package/dist/hooks/codex-wrapper.d.ts +3 -1
- package/dist/hooks/codex-wrapper.js +9 -4
- package/dist/hooks/copilot.d.ts +19 -5
- package/dist/hooks/copilot.js +54 -15
- package/dist/hooks/hook-blocks.d.ts +4 -1
- package/dist/hooks/hook-blocks.js +8 -3
- package/dist/hooks/json-hooks.d.ts +9 -5
- package/dist/hooks/json-hooks.js +72 -33
- package/dist/hooks/opencode.js +15 -5
- package/dist/hooks/shared.d.ts +27 -8
- package/dist/hooks/shared.js +57 -16
- package/dist/importers/core.d.ts +12 -4
- package/dist/importers/core.js +11 -10
- package/dist/importers/markdown-parse.d.ts +15 -5
- package/dist/importers/markdown-parse.js +16 -7
- package/dist/importers/markdown.js +6 -9
- package/dist/importers/sources.js +10 -23
- package/dist/importers/vault.d.ts +3 -3
- package/dist/importers/vault.js +61 -45
- package/dist/index.d.ts +33 -7
- package/dist/index.js +26 -8
- package/dist/learn/autolearn.d.ts +21 -6
- package/dist/learn/autolearn.js +57 -26
- package/dist/learn/churn-git.d.ts +4 -1
- package/dist/learn/churn-git.js +29 -5
- package/dist/learn/extract.d.ts +4 -1
- package/dist/learn/extract.js +17 -10
- package/dist/learn/forward-claim-detector.d.ts +17 -5
- package/dist/learn/forward-claim-detector.js +34 -15
- package/dist/learn/invalidation.d.ts +12 -6
- package/dist/learn/invalidation.js +62 -28
- package/dist/learn/roots.d.ts +3 -0
- package/dist/learn/roots.js +5 -0
- package/dist/mcp/admin-tools.d.ts +5 -5
- package/dist/mcp/admin-tools.js +28 -23
- package/dist/mcp/format.d.ts +1 -1
- package/dist/mcp/format.js +4 -2
- package/dist/mcp/framing.d.ts +3 -1
- package/dist/mcp/framing.js +20 -8
- package/dist/mcp/memory-tools.d.ts +3 -3
- package/dist/mcp/memory-tools.js +21 -20
- package/dist/mcp/protocol.d.ts +32 -16
- package/dist/mcp/protocol.js +12 -9
- package/dist/mcp/recall-tools.d.ts +3 -3
- package/dist/mcp/recall-tools.js +62 -74
- package/dist/mcp/request.d.ts +7 -5
- package/dist/mcp/request.js +61 -77
- package/dist/mcp/server.d.ts +3 -1
- package/dist/mcp/server.js +8 -3
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +4 -3
- package/dist/mcp/shared-gate.d.ts +3 -2
- package/dist/mcp/shared-gate.js +3 -2
- package/dist/mcp/stdio.d.ts +6 -3
- package/dist/mcp/stdio.js +59 -23
- package/dist/mcp/tool-args.d.ts +4 -1
- package/dist/mcp/tool-args.js +8 -3
- package/dist/mcp/tools.js +76 -32
- package/dist/objects/customer-notes.d.ts +12 -10
- package/dist/objects/customer-notes.js +21 -15
- package/dist/objects/decisions.d.ts +18 -10
- package/dist/objects/decisions.js +23 -17
- package/dist/objects/descriptor.js +2 -1
- package/dist/objects/fields.d.ts +4 -1
- package/dist/objects/fields.js +6 -2
- package/dist/objects/incidents.d.ts +14 -16
- package/dist/objects/incidents.js +29 -30
- package/dist/objects/lifecycle.d.ts +0 -4
- package/dist/objects/lifecycle.js +21 -24
- package/dist/objects/policies.d.ts +12 -16
- package/dist/objects/policies.js +17 -21
- package/dist/objects/processes.d.ts +16 -10
- package/dist/objects/processes.js +20 -15
- package/dist/objects/project-briefs.d.ts +13 -14
- package/dist/objects/project-briefs.js +33 -39
- package/dist/objects/skills.d.ts +10 -12
- package/dist/objects/skills.js +17 -22
- package/dist/postinstall.js +15 -7
- package/dist/predictions/planning-fallacy.d.ts +19 -6
- package/dist/predictions/planning-fallacy.js +4 -2
- package/dist/rerankers/clef.d.ts +8 -2
- package/dist/rerankers/clef.js +14 -9
- package/dist/rerankers/cross-encoder.d.ts +2 -1
- package/dist/rerankers/cross-encoder.js +19 -9
- package/dist/rerankers/index.js +2 -1
- package/dist/rerankers/jev.js +2 -1
- package/dist/rerankers/llm.d.ts +6 -2
- package/dist/rerankers/llm.js +8 -3
- package/dist/rerankers/remote.d.ts +3 -1
- package/dist/rerankers/remote.js +5 -2
- package/dist/rerankers/types.d.ts +6 -2
- package/dist/search/bm25-search.d.ts +3 -1
- package/dist/search/bm25-search.js +15 -2
- package/dist/search/boosts.js +4 -3
- package/dist/search/embed-memories.d.ts +12 -4
- package/dist/search/embed-memories.js +96 -58
- package/dist/search/engine.d.ts +11 -0
- package/dist/search/engine.js +14 -0
- package/dist/search/goal-boost.d.ts +10 -3
- package/dist/search/goal-boost.js +13 -6
- package/dist/search/hybrid-score.d.ts +4 -1
- package/dist/search/hybrid-score.js +4 -1
- package/dist/search/hybrid.d.ts +23 -8
- package/dist/search/hybrid.js +12 -7
- package/dist/search/multihop.js +14 -13
- package/dist/search/path-context.d.ts +10 -3
- package/dist/search/path-context.js +10 -3
- package/dist/search/physics-search.d.ts +9 -4
- package/dist/search/physics-search.js +38 -14
- package/dist/search/rerank.d.ts +2 -1
- package/dist/search/rerank.js +2 -1
- package/dist/search/rrf.d.ts +14 -5
- package/dist/search/rrf.js +11 -4
- package/dist/search/vector.d.ts +8 -2
- package/dist/search/vector.js +14 -8
- package/dist/server/auth.d.ts +19 -15
- package/dist/server/auth.js +68 -38
- package/dist/server/boot.d.ts +4 -1
- package/dist/server/boot.js +115 -67
- package/dist/server/client-ip.d.ts +17 -5
- package/dist/server/client-ip.js +56 -21
- package/dist/server/cursor.d.ts +10 -3
- package/dist/server/cursor.js +10 -3
- package/dist/server/deadline.d.ts +5 -2
- package/dist/server/deadline.js +10 -3
- package/dist/server/key-check-bounds.js +12 -4
- package/dist/server/lifecycle.d.ts +4 -1
- package/dist/server/lifecycle.js +10 -4
- package/dist/server/mcp-http.d.ts +2 -1
- package/dist/server/mcp-http.js +37 -22
- package/dist/server/rate-limit.d.ts +17 -5
- package/dist/server/rate-limit.js +55 -26
- package/dist/server/ready.js +7 -4
- package/dist/server/request.d.ts +15 -4
- package/dist/server/request.js +42 -15
- package/dist/server/route-checks.d.ts +4 -1
- package/dist/server/route-checks.js +8 -3
- package/dist/server/route-table.d.ts +8 -6
- package/dist/server/route-table.js +550 -97
- package/dist/server/routes/admin.d.ts +7 -7
- package/dist/server/routes/admin.js +36 -15
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +5 -4
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +12 -6
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +10 -4
- package/dist/server/routes/memories.d.ts +8 -8
- package/dist/server/routes/memories.js +12 -17
- package/dist/server/routes/object-routes.d.ts +8 -5
- package/dist/server/routes/object-routes.js +4 -2
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +11 -4
- package/dist/server/routes/predictions.d.ts +5 -5
- package/dist/server/routes/predictions.js +9 -4
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +15 -6
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +3 -2
- package/dist/server/routes/recall.d.ts +3 -3
- package/dist/server/routes/recall.js +21 -10
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +12 -4
- package/dist/server/server-detect.d.ts +24 -8
- package/dist/server/server-detect.js +57 -22
- package/dist/server/sleep-child.js +16 -10
- package/dist/server/sleep-offload.d.ts +8 -5
- package/dist/server/sleep-offload.js +40 -18
- package/dist/server/tls.d.ts +10 -2
- package/dist/server/tls.js +25 -5
- package/dist/server/types.d.ts +41 -24
- package/dist/server/validation.d.ts +4 -1
- package/dist/server/validation.js +22 -9
- package/dist/server.d.ts +17 -49
- package/dist/server.js +33 -40
- package/dist/sharing/global-store.d.ts +6 -12
- package/dist/sharing/global-store.js +8 -48
- package/dist/sharing/global-sync.d.ts +3 -1
- package/dist/sharing/global-sync.js +17 -7
- package/dist/sharing/project-merge.d.ts +25 -7
- package/dist/sharing/project-merge.js +49 -17
- package/dist/sharing/search-both.d.ts +8 -4
- package/dist/sharing/search-both.js +28 -14
- package/dist/sharing/share.d.ts +8 -4
- package/dist/sharing/share.js +40 -18
- package/dist/store/ambient.js +10 -5
- package/dist/store/audit-event.d.ts +2 -2
- package/dist/store/audit-event.js +8 -3
- package/dist/store/audit.d.ts +6 -3
- package/dist/store/audit.js +16 -6
- package/dist/store/auth.d.ts +4 -2
- package/dist/store/auth.js +63 -20
- package/dist/store/busy.d.ts +9 -0
- package/dist/store/busy.js +16 -0
- package/dist/store/candidates.d.ts +12 -5
- package/dist/store/candidates.js +90 -41
- package/dist/store/capture-write.d.ts +2 -1
- package/dist/store/capture-write.js +2 -1
- package/dist/store/card-detail.d.ts +4 -4
- package/dist/store/card-detail.js +15 -8
- package/dist/store/cards.d.ts +24 -10
- package/dist/store/cards.js +97 -63
- package/dist/store/compaction-caller.d.ts +2 -1
- package/dist/store/compaction-caller.js +2 -1
- package/dist/store/compactions-record.d.ts +14 -8
- package/dist/store/compactions-record.js +101 -37
- package/dist/store/compactions.js +35 -15
- package/dist/store/conflicts.d.ts +16 -5
- package/dist/store/conflicts.js +104 -48
- package/dist/store/connectors/dlq.d.ts +17 -5
- package/dist/store/connectors/dlq.js +58 -6
- package/dist/store/connectors/event-log.d.ts +122 -0
- package/dist/store/connectors/event-log.js +25 -0
- package/dist/store/connectors/github.d.ts +6 -3
- package/dist/store/connectors/github.js +30 -48
- package/dist/store/connectors/slack.d.ts +2 -1
- package/dist/store/connectors/slack.js +31 -47
- package/dist/store/dashboard-reads.d.ts +7 -3
- package/dist/store/dashboard-reads.js +32 -10
- package/dist/store/delete-and-batch.d.ts +17 -11
- package/dist/store/delete-and-batch.js +70 -28
- package/dist/store/delivery-recorder.d.ts +10 -7
- package/dist/store/delivery-recorder.js +70 -37
- package/dist/store/descendant-page.d.ts +2 -1
- package/dist/store/descendant-page.js +26 -10
- package/dist/store/diagnostics.d.ts +2 -1
- package/dist/store/diagnostics.js +2 -1
- package/dist/store/doctor-reads.d.ts +2 -1
- package/dist/store/doctor-reads.js +13 -5
- package/dist/store/dormant.d.ts +19 -11
- package/dist/store/dormant.js +45 -19
- package/dist/store/embeddings/index.d.ts +13 -9
- package/dist/store/embeddings/index.js +19 -12
- package/dist/store/entry-reads.d.ts +72 -21
- package/dist/store/entry-reads.js +215 -69
- package/dist/store/entry-row.d.ts +10 -6
- package/dist/store/entry-row.js +26 -14
- package/dist/store/entry-writes.d.ts +28 -13
- package/dist/store/entry-writes.js +61 -22
- package/dist/store/failure-log-at.js +1 -1
- package/dist/store/failure-log.d.ts +4 -2
- package/dist/store/failure-log.js +13 -6
- package/dist/store/gated-write.d.ts +3 -3
- package/dist/store/gated-write.js +3 -3
- package/dist/store/goals.d.ts +5 -4
- package/dist/store/goals.js +11 -12
- package/dist/store/graph-apply.d.ts +21 -0
- package/dist/{graph/write.js → store/graph-apply.js} +31 -11
- package/dist/store/graph-queue.d.ts +9 -6
- package/dist/store/graph-queue.js +15 -10
- package/dist/store/graph-reads.d.ts +16 -11
- package/dist/store/graph-reads.js +29 -19
- package/dist/store/graph-rows.d.ts +41 -3
- package/dist/store/graph-rows.js +10 -7
- package/dist/store/graph-view-rows.js +15 -7
- package/dist/store/graph-writes.d.ts +16 -10
- package/dist/store/graph-writes.js +59 -36
- package/dist/store/half-life.js +2 -2
- package/dist/store/handoffs.d.ts +13 -7
- package/dist/store/handoffs.js +44 -22
- package/dist/store/index-and-stats.d.ts +2 -2
- package/dist/store/index-and-stats.js +6 -5
- package/dist/store/index.d.ts +4 -2
- package/dist/store/index.js +2 -1
- package/dist/store/key-audit.d.ts +2 -1
- package/dist/store/key-audit.js +2 -1
- package/dist/store/key-writes.d.ts +2 -1
- package/dist/store/key-writes.js +9 -2
- package/dist/store/ledger-turn.d.ts +4 -1
- package/dist/store/ledger-turn.js +7 -2
- package/dist/store/mirrors.d.ts +11 -4
- package/dist/store/mirrors.js +96 -19
- package/dist/store/narrow.d.ts +6 -0
- package/dist/store/narrow.js +11 -0
- package/dist/store/open.d.ts +6 -3
- package/dist/store/open.js +20 -10
- package/dist/store/pilot-arm.d.ts +2 -1
- package/dist/store/pilot-arm.js +18 -6
- package/dist/store/planning-fallacy-evidence.d.ts +2 -2
- package/dist/store/planning-fallacy-evidence.js +8 -5
- package/dist/store/port/agent-import.d.ts +62 -0
- package/dist/store/port/agent-import.js +2 -0
- package/dist/store/port/consolidation.d.ts +129 -0
- package/dist/store/port/consolidation.js +2 -0
- package/dist/store/port/learning.d.ts +19 -0
- package/dist/store/port/learning.js +2 -0
- package/dist/store/port/local-files.d.ts +18 -0
- package/dist/store/port/local-files.js +2 -0
- package/dist/store/port/promotion.d.ts +20 -0
- package/dist/store/port/promotion.js +3 -0
- package/dist/store/port-groups.d.ts +160 -0
- package/dist/store/port-groups.js +2 -0
- package/dist/store/port.d.ts +261 -219
- package/dist/store/port.js +3 -9
- package/dist/store/predictions.d.ts +14 -10
- package/dist/store/predictions.js +37 -17
- package/dist/store/project-tags.d.ts +4 -1
- package/dist/store/project-tags.js +16 -5
- package/dist/store/quality-repair.d.ts +8 -4
- package/dist/store/quality-repair.js +53 -20
- package/dist/store/quarantine.d.ts +1 -0
- package/dist/store/quarantine.js +23 -9
- package/dist/store/raw-archive.d.ts +5 -4
- package/dist/store/raw-archive.js +11 -10
- package/dist/store/recall-trace.d.ts +22 -17
- package/dist/store/recall-trace.js +128 -64
- package/dist/store/rejected-values.d.ts +15 -10
- package/dist/store/rejected-values.js +46 -20
- package/dist/store/rejection.d.ts +12 -11
- package/dist/store/rejection.js +18 -19
- package/dist/store/report-reads.d.ts +2 -1
- package/dist/store/report-reads.js +2 -1
- package/dist/store/rows.d.ts +7 -5
- package/dist/store/rows.js +20 -13
- package/dist/store/rule-sql.d.ts +7 -3
- package/dist/store/rule-sql.js +26 -13
- package/dist/store/search-rows.d.ts +16 -11
- package/dist/store/search-rows.js +54 -32
- package/dist/store/sessions.d.ts +12 -10
- package/dist/store/sessions.js +40 -21
- package/dist/store/set-aside.d.ts +2 -2
- package/dist/store/set-aside.js +18 -5
- package/dist/store/sqlite/agent-import.d.ts +3 -0
- package/dist/store/sqlite/agent-import.js +77 -0
- package/dist/store/sqlite/cards-group.d.ts +6 -0
- package/dist/store/sqlite/cards-group.js +37 -0
- package/dist/store/sqlite/conflicts-group.d.ts +6 -0
- package/dist/store/sqlite/conflicts-group.js +18 -0
- package/dist/store/sqlite/connector-events-group.d.ts +2 -1
- package/dist/store/sqlite/connector-events-group.js +17 -6
- package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
- package/dist/store/sqlite/connector-writes-group.js +12 -5
- package/dist/store/sqlite/consolidation-group.d.ts +4 -0
- package/dist/store/sqlite/consolidation-group.js +64 -0
- package/dist/store/sqlite/dag-reads-group.js +1 -1
- package/dist/store/sqlite/dormant-group.d.ts +6 -0
- package/dist/store/sqlite/dormant-group.js +29 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +9 -6
- package/dist/store/sqlite/entry-writes-group.js +37 -14
- package/dist/store/sqlite/error-codec.d.ts +4 -2
- package/dist/store/sqlite/error-codec.js +32 -10
- package/dist/store/sqlite/executor-counts.js +2 -1
- package/dist/store/sqlite/executor.d.ts +8 -3
- package/dist/store/sqlite/executor.js +56 -18
- package/dist/store/sqlite/global-promote.d.ts +5 -0
- package/dist/store/sqlite/global-promote.js +48 -0
- package/dist/store/sqlite/goals-group.d.ts +6 -0
- package/dist/store/sqlite/goals-group.js +23 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
- package/dist/store/sqlite/graph-reads-group.js +2 -1
- package/dist/store/sqlite/held-connection.d.ts +8 -0
- package/dist/store/sqlite/held-connection.js +34 -7
- package/dist/store/sqlite/last-recall-group.d.ts +15 -0
- package/dist/store/sqlite/last-recall-group.js +62 -0
- package/dist/store/sqlite/learning-group.d.ts +4 -0
- package/dist/store/sqlite/learning-group.js +17 -0
- package/dist/store/sqlite/maintenance-groups.d.ts +6 -0
- package/dist/store/sqlite/maintenance-groups.js +61 -0
- package/dist/store/sqlite/object-rows.d.ts +6 -3
- package/dist/store/sqlite/object-rows.js +34 -5
- package/dist/store/sqlite/objects-group.d.ts +5 -4
- package/dist/store/sqlite/objects-group.js +97 -38
- package/dist/store/sqlite/predictions-group.d.ts +2 -1
- package/dist/store/sqlite/predictions-group.js +4 -2
- package/dist/store/sqlite/promotion-group.d.ts +3 -0
- package/dist/store/sqlite/promotion-group.js +10 -0
- package/dist/store/sqlite/quarantine-group.d.ts +2 -1
- package/dist/store/sqlite/quarantine-group.js +4 -2
- package/dist/store/sqlite/reports-group.d.ts +6 -0
- package/dist/store/sqlite/reports-group.js +33 -0
- package/dist/store/sqlite/request-scope.d.ts +6 -0
- package/dist/store/sqlite/request-scope.js +18 -0
- package/dist/store/sqlite/sessions-group.d.ts +6 -0
- package/dist/store/sqlite/sessions-group.js +46 -0
- package/dist/store/sqlite/store.d.ts +22 -18
- package/dist/store/sqlite/store.js +95 -33
- package/dist/store/sqlite/vector-pack.js +2 -1
- package/dist/store/sqlite/vector-reads-group.js +2 -1
- package/dist/store/sqlite/worker-jobs.d.ts +2 -1
- package/dist/store/sqlite/worker-jobs.js +19 -7
- package/dist/store/sqlite/worker-ops.d.ts +10 -5
- package/dist/store/sqlite/worker-ops.js +6 -3
- package/dist/store/sqlite/worker-store.d.ts +4 -3
- package/dist/store/sqlite/worker-store.js +24 -14
- package/dist/store/summaries.d.ts +25 -11
- package/dist/store/summaries.js +84 -27
- package/dist/store/summary-dirty.d.ts +2 -1
- package/dist/store/summary-dirty.js +2 -1
- package/dist/store/tenant.d.ts +3 -2
- package/dist/store/tenant.js +5 -4
- package/dist/store/token-ledger-rows.js +8 -4
- package/dist/store/token-ledger.d.ts +19 -13
- package/dist/store/token-ledger.js +27 -14
- package/dist/store/tombstone-checks.d.ts +4 -1
- package/dist/store/tombstone-checks.js +10 -1
- package/dist/store/usage-reports.js +2 -1
- package/dist/store/vector-index.d.ts +8 -5
- package/dist/store/vector-index.js +28 -11
- package/dist/store/working-memory.d.ts +6 -4
- package/dist/store/working-memory.js +14 -9
- package/dist/support-bundle.js +10 -5
- package/dist/trust/quarantine.d.ts +1 -2
- package/dist/trust/quarantine.js +1 -5
- package/dist/trust/reject-flow.d.ts +12 -3
- package/dist/trust/reject-flow.js +12 -4
- package/dist/util/anthropic-messages.d.ts +7 -2
- package/dist/util/anthropic-messages.js +18 -7
- package/dist/util/atomic-write.d.ts +8 -3
- package/dist/util/atomic-write.js +36 -21
- package/dist/util/compaction-items.d.ts +4 -1
- package/dist/util/compaction-items.js +8 -2
- package/dist/util/crash-handlers.d.ts +7 -2
- package/dist/util/crash-handlers.js +13 -4
- package/dist/util/env.d.ts +26 -5
- package/dist/util/env.js +87 -25
- package/dist/util/format.d.ts +2 -0
- package/dist/util/format.js +4 -0
- package/dist/util/home-path.js +12 -6
- package/dist/util/hook-payload.d.ts +3 -1
- package/dist/util/hook-payload.js +3 -1
- package/dist/util/http-retry.d.ts +12 -6
- package/dist/util/http-retry.js +16 -6
- package/dist/util/http-util.d.ts +20 -5
- package/dist/util/http-util.js +28 -9
- package/dist/util/json.d.ts +4 -1
- package/dist/util/json.js +4 -1
- package/dist/util/keyset.js +2 -1
- package/dist/util/limits.js +4 -2
- package/dist/util/log.d.ts +13 -5
- package/dist/util/log.js +29 -6
- package/dist/util/net.d.ts +5 -0
- package/dist/util/net.js +19 -0
- package/dist/util/real-path.d.ts +2 -1
- package/dist/util/real-path.js +4 -3
- package/dist/util/request-scope.d.ts +16 -4
- package/dist/util/request-scope.js +19 -6
- package/dist/util/same-text.d.ts +10 -3
- package/dist/util/same-text.js +10 -3
- package/dist/util/secret-detect.d.ts +24 -7
- package/dist/util/secret-detect.js +49 -14
- package/dist/util/spawn-argv.d.ts +11 -0
- package/dist/util/spawn-argv.js +66 -0
- package/dist/util/sql.d.ts +3 -0
- package/dist/util/sql.js +6 -0
- package/dist/util/sqlite-blocked.d.ts +15 -4
- package/dist/util/sqlite-blocked.js +19 -6
- package/dist/util/stored-json.d.ts +4 -1
- package/dist/util/stored-json.js +6 -2
- package/dist/util/stream-tee.d.ts +2 -1
- package/dist/util/stream-tee.js +8 -5
- package/dist/util/transcript-tail.d.ts +4 -1
- package/dist/util/transcript-tail.js +4 -1
- package/dist/util/vector-codec.d.ts +4 -0
- package/dist/util/vector-codec.js +15 -0
- package/dist/util/version.d.ts +8 -3
- package/dist/util/version.js +8 -3
- package/dist/util/write-budget.d.ts +7 -2
- package/dist/util/write-budget.js +5 -2
- package/dist/util/yaml.d.ts +4 -1
- package/dist/util/yaml.js +4 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +4 -1
- package/scripts/postinstall.cjs +3 -1
- package/dist/api/audit.js +0 -56
- package/dist/api/cards.d.ts +0 -42
- package/dist/api/conflicts.d.ts +0 -28
- package/dist/api/conflicts.js +0 -61
- package/dist/api/dormant.d.ts +0 -14
- package/dist/api/dormant.js +0 -58
- package/dist/api/goals.d.ts +0 -18
- package/dist/api/graph.d.ts +0 -8
- package/dist/api/graph.js +0 -7
- package/dist/api/learn.js +0 -124
- package/dist/api/memories.d.ts +0 -23
- package/dist/api/memories.js +0 -46
- package/dist/api/objects.d.ts +0 -9
- package/dist/api/on-store.d.ts +0 -16
- package/dist/api/on-store.js +0 -38
- package/dist/api/outcome.d.ts +0 -19
- package/dist/api/outcome.js +0 -21
- package/dist/api/predictions.d.ts +0 -11
- package/dist/api/promote.d.ts +0 -36
- package/dist/api/promote.js +0 -65
- package/dist/api/recall-core.d.ts +0 -4
- package/dist/api/recall-core.js +0 -120
- package/dist/api/recall-finish.d.ts +0 -53
- package/dist/api/recall-finish.js +0 -30
- package/dist/api/recall-history.d.ts +0 -64
- package/dist/api/recall-history.js +0 -159
- package/dist/api/recall-record.d.ts +0 -43
- package/dist/api/recall-record.js +0 -78
- package/dist/api/recall-request.js +0 -121
- package/dist/api/recall.d.ts +0 -6
- package/dist/api/refine.d.ts +0 -7
- package/dist/api/refine.js +0 -10
- package/dist/api/session-owners.d.ts +0 -4
- package/dist/api/session-owners.js +0 -17
- package/dist/api/sleep-run.d.ts +0 -26
- package/dist/api/sleep.js +0 -10
- package/dist/cli/lenient-id.d.ts +0 -2
- package/dist/cli/lenient-id.js +0 -13
- package/dist/graph/write.d.ts +0 -14
- package/dist/store/sqlite/busy.d.ts +0 -3
- package/dist/store/sqlite/busy.js +0 -8
- package/dist/store/sqlite/local.d.ts +0 -21
- package/dist/store/sqlite/local.js +0 -39
package/dist/store/conflicts.js
CHANGED
|
@@ -2,7 +2,7 @@ import { DEFAULT_TENANT_ID } from '../util/env.js';
|
|
|
2
2
|
import { closeHippoDb, withWriteScope } from '../db/index.js';
|
|
3
3
|
import { rejectionDigest, insertRejectedValue, normalizeValueForRejection } from './rejection.js';
|
|
4
4
|
import { archiveRawMemory } from './raw-archive.js';
|
|
5
|
-
import { rowToMemoryConflict } from './rows.js';
|
|
5
|
+
import { parseJsonArray, rowToMemoryConflict } from './rows.js';
|
|
6
6
|
import { audit } from './audit-event.js';
|
|
7
7
|
import { syncChangedMirrors, purgeMirrorBestEffort } from './mirrors.js';
|
|
8
8
|
import { selectEntriesByIds } from './entry-reads.js';
|
|
@@ -12,6 +12,7 @@ import { deleteEntryCore } from './delete-and-batch.js';
|
|
|
12
12
|
import { BadRequestError } from '../core/api-errors.js';
|
|
13
13
|
import { canTouchScope, isPersonalScope } from '../core/recall-scope.js';
|
|
14
14
|
import { selectMemoryReach } from './tenant-lookup.js';
|
|
15
|
+
import { placeholders } from '../util/sql.js';
|
|
15
16
|
// The one place MemoryConflictRow's columns are listed; CONFLICT_COLS_MC is the same list under the `mc` alias.
|
|
16
17
|
const CONFLICT_COLS = 'id, memory_a_id, memory_b_id, reason, score, status, detected_at, updated_at';
|
|
17
18
|
const CONFLICT_COLS_MC = CONFLICT_COLS.split(', ').map((c) => `mc.${c}`).join(', ');
|
|
@@ -21,25 +22,30 @@ function canonicalConflictPair(aId, bId) {
|
|
|
21
22
|
: { memory_a_id: bId, memory_b_id: aId };
|
|
22
23
|
}
|
|
23
24
|
function selectConflictRowsInTenant(db, status, allStatuses, tenantId) {
|
|
24
|
-
// Tenanted query: JOIN memories on both members and require each in-tenant, so no cross-tenant or stale pre-fix pair
|
|
25
|
+
// Tenanted query: JOIN memories on both members and require each in-tenant, so no cross-tenant or stale pre-fix pair
|
|
26
|
+
// surfaces.
|
|
25
27
|
// SAFETY: both branches select CONFLICT_COLS_MC, MemoryConflictRow's columns.
|
|
26
28
|
return allStatuses
|
|
27
|
-
? db
|
|
29
|
+
? db
|
|
30
|
+
.prepare(`
|
|
28
31
|
SELECT ${CONFLICT_COLS_MC}
|
|
29
32
|
FROM memory_conflicts mc
|
|
30
33
|
JOIN memories ma ON ma.id = mc.memory_a_id
|
|
31
34
|
JOIN memories mb ON mb.id = mc.memory_b_id
|
|
32
35
|
WHERE ma.tenant_id = ? AND mb.tenant_id = ?
|
|
33
36
|
ORDER BY mc.updated_at DESC, mc.id DESC
|
|
34
|
-
`)
|
|
35
|
-
|
|
37
|
+
`)
|
|
38
|
+
.all(tenantId, tenantId)
|
|
39
|
+
: db
|
|
40
|
+
.prepare(`
|
|
36
41
|
SELECT ${CONFLICT_COLS_MC}
|
|
37
42
|
FROM memory_conflicts mc
|
|
38
43
|
JOIN memories ma ON ma.id = mc.memory_a_id
|
|
39
44
|
JOIN memories mb ON mb.id = mc.memory_b_id
|
|
40
45
|
WHERE mc.status = ? AND ma.tenant_id = ? AND mb.tenant_id = ?
|
|
41
46
|
ORDER BY mc.updated_at DESC, mc.id DESC
|
|
42
|
-
`)
|
|
47
|
+
`)
|
|
48
|
+
.all(status, tenantId, tenantId);
|
|
43
49
|
}
|
|
44
50
|
function selectConflictRowsUnscoped(db, status, allStatuses) {
|
|
45
51
|
// Unscoped query — legacy direct-mode (CLI, tests, consolidate).
|
|
@@ -59,7 +65,8 @@ function selectConflictRowsUnscoped(db, status, allStatuses) {
|
|
|
59
65
|
}
|
|
60
66
|
export function listMemoryConflicts(hippoRoot, status = 'open', tenantId) {
|
|
61
67
|
return onHandle(hippoRoot, (db) => {
|
|
62
|
-
// '*' is a sentinel for no status filter; the 4 SQL branches below
|
|
68
|
+
// '*' is a sentinel for no status filter; the 4 SQL branches below
|
|
69
|
+
// cover {tenanted | unscoped} x {all-statuses | specific-status}.
|
|
63
70
|
const allStatuses = status === '*';
|
|
64
71
|
const rows = tenantId !== undefined
|
|
65
72
|
? selectConflictRowsInTenant(db, status, allStatuses, tenantId)
|
|
@@ -74,13 +81,16 @@ const OPEN_IN_TENANT = `FROM memory_conflicts mc
|
|
|
74
81
|
WHERE mc.status = 'open' AND ma.tenant_id = ? AND mb.tenant_id = ?`;
|
|
75
82
|
/** How many open conflicts listMemoryConflicts returns for a tenant, without loading one. */
|
|
76
83
|
export function countOpenConflicts(hippoRoot, tenantId) {
|
|
77
|
-
return onHandle(hippoRoot, (db) =>
|
|
78
|
-
// SAFETY: one row with the single aliased count column.
|
|
79
|
-
const row = db.prepare(`SELECT COUNT(*) AS n ${OPEN_IN_TENANT}`).get(tenantId, tenantId);
|
|
80
|
-
return Number(row.n);
|
|
81
|
-
}, openStore);
|
|
84
|
+
return onHandle(hippoRoot, (db) => countOpenConflictsAt(db, tenantId), openStore);
|
|
82
85
|
}
|
|
83
|
-
/**
|
|
86
|
+
/** countOpenConflicts on a handle the caller holds, so it can share a snapshot with other reads. */
|
|
87
|
+
export function countOpenConflictsAt(db, tenantId) {
|
|
88
|
+
// SAFETY: one row with the single aliased count column.
|
|
89
|
+
const row = db.prepare(`SELECT COUNT(*) AS n ${OPEN_IN_TENANT}`).get(tenantId, tenantId);
|
|
90
|
+
return Number(row.n);
|
|
91
|
+
}
|
|
92
|
+
/** A tenant's open conflicts naming `memoryId`, in listMemoryConflicts'
|
|
93
|
+
* order, each with its other member read in one batch. */
|
|
84
94
|
export function loadOpenConflictsOf(hippoRoot, tenantId, memoryId) {
|
|
85
95
|
return onHandle(hippoRoot, (db) => {
|
|
86
96
|
// SAFETY: selects CONFLICT_COLS_MC, MemoryConflictRow's columns.
|
|
@@ -112,7 +122,8 @@ export function replaceDetectedConflicts(hippoRoot, detected, detectedAt = new D
|
|
|
112
122
|
syncChangedMirrors(hippoRoot, db, [...selectEntriesByIds(db, changedIds).values()]);
|
|
113
123
|
}, openStore);
|
|
114
124
|
}
|
|
115
|
-
/** The refresh's reads, kept out of the write lock; only rows holding refs, in an open conflict or in `detected` are
|
|
125
|
+
/** The refresh's reads, kept out of the write lock; only rows holding refs, in an open conflict or in `detected` are
|
|
126
|
+
* loaded, not the whole table. */
|
|
116
127
|
function readConflictRefresh(db, detected) {
|
|
117
128
|
// Tenant guard (E2): a conflict is meaningful only within one tenant, so cross-tenant pairs are
|
|
118
129
|
// skipped on insert and on rebuild, and a stale cross-tenant row can neither persist nor leak a foreign id.
|
|
@@ -132,7 +143,7 @@ function readConflictRefresh(db, detected) {
|
|
|
132
143
|
}
|
|
133
144
|
const given = [...new Set(detected.flatMap((c) => [c.memory_a_id, c.memory_b_id]))].filter((id) => !tenantById.has(id));
|
|
134
145
|
for (const ids of chunked(given)) {
|
|
135
|
-
const marks = ids.
|
|
146
|
+
const marks = placeholders(ids.length);
|
|
136
147
|
// SAFETY: rows' shape matches the two columns named in the SELECT.
|
|
137
148
|
const found = db.prepare(`SELECT id, tenant_id FROM memories WHERE id IN (${marks})`).all(...ids);
|
|
138
149
|
for (const r of found)
|
|
@@ -170,7 +181,8 @@ function resolveStaleOpenConflicts(db, canonicalDetected, sameTenant, detectedAt
|
|
|
170
181
|
for (const row of openRows) {
|
|
171
182
|
const key = `${row.memory_a_id}::${row.memory_b_id}`;
|
|
172
183
|
const stale = !detectedKeys.has(key);
|
|
173
|
-
// Auto-resolve any open cross-tenant row: the insert loop and refMap rebuild skip those pairs, so re-detected ones
|
|
184
|
+
// Auto-resolve any open cross-tenant row: the insert loop and refMap rebuild skip those pairs, so re-detected ones
|
|
185
|
+
// would linger as 'open'.
|
|
174
186
|
const crossTenant = !sameTenant(row.memory_a_id, row.memory_b_id);
|
|
175
187
|
if (stale || crossTenant)
|
|
176
188
|
resolve.run(detectedAt, row.id);
|
|
@@ -203,8 +215,8 @@ function rebuildConflictsWithJson(db, { sameTenant, storedRefs }) {
|
|
|
203
215
|
`).all();
|
|
204
216
|
const refMap = new Map();
|
|
205
217
|
for (const row of openConflicts) {
|
|
206
|
-
// Skip cross-tenant pairs so a stale row never
|
|
207
|
-
// into conflicts_with_json.
|
|
218
|
+
// Skip cross-tenant pairs so a stale row never
|
|
219
|
+
// seeds a foreign id into conflicts_with_json.
|
|
208
220
|
if (!sameTenant(row.memory_a_id, row.memory_b_id))
|
|
209
221
|
continue;
|
|
210
222
|
if (!refMap.has(row.memory_a_id))
|
|
@@ -214,8 +226,10 @@ function rebuildConflictsWithJson(db, { sameTenant, storedRefs }) {
|
|
|
214
226
|
refMap.get(row.memory_a_id).add(row.memory_b_id);
|
|
215
227
|
refMap.get(row.memory_b_id).add(row.memory_a_id);
|
|
216
228
|
}
|
|
217
|
-
// Only a row holding refs, or due some, can change. Compare-and-set, so a writer since the read keeps its value and
|
|
218
|
-
|
|
229
|
+
// Only a row holding refs, or due some, can change. Compare-and-set, so a writer since the read keeps its value and
|
|
230
|
+
// the next sleep redoes the row.
|
|
231
|
+
const update = db.prepare(`UPDATE memories SET conflicts_with_json = ?, updated_at = datetime('now') ` +
|
|
232
|
+
`WHERE id = ? AND conflicts_with_json IS ?`);
|
|
219
233
|
const changedIds = [];
|
|
220
234
|
for (const id of new Set([...storedRefs.keys(), ...refMap.keys()])) {
|
|
221
235
|
const stored = storedRefs.has(id) ? storedRefs.get(id) ?? null : '[]';
|
|
@@ -227,7 +241,8 @@ function rebuildConflictsWithJson(db, { sameTenant, storedRefs }) {
|
|
|
227
241
|
}
|
|
228
242
|
return changedIds;
|
|
229
243
|
}
|
|
230
|
-
// With tenantId, both members must be in-tenant and every memories mutation carries AND tenant_id = ?; a cross-tenant
|
|
244
|
+
// With tenantId, both members must be in-tenant and every memories mutation carries AND tenant_id = ?; a cross-tenant
|
|
245
|
+
// probe returns null like a bad id.
|
|
231
246
|
// Omitted tenantId = unscoped (CLI direct mode, tests).
|
|
232
247
|
function conflictMemScope(tenantId) {
|
|
233
248
|
return {
|
|
@@ -251,9 +266,10 @@ function findResolvableConflict(db, conflictId, keepId, tenantId) {
|
|
|
251
266
|
return null;
|
|
252
267
|
return { conflict, loserId };
|
|
253
268
|
}
|
|
254
|
-
/** Resolve a conflict by keeping one memory and halving the loser's half-life; `--forget` removes the loser,
|
|
269
|
+
/** Resolve a conflict by keeping one memory and halving the loser's half-life; `--forget` removes the loser,
|
|
270
|
+
* `opts.rejectLoserValue` also tombstones its
|
|
255
271
|
* digest. Every path emits a `conflict_resolve` audit row. Returns the resolved conflict, or null if not found. */
|
|
256
|
-
export function resolveConflict(hippoRoot, conflictId, keepId, forgetLoser = false, tenantId, opts) {
|
|
272
|
+
export function resolveConflict(hippoRoot, { conflictId, keepId, forgetLoser = false, tenantId }, opts) {
|
|
257
273
|
const db = openStore(hippoRoot);
|
|
258
274
|
const scope = conflictMemScope(tenantId);
|
|
259
275
|
try {
|
|
@@ -298,18 +314,26 @@ function selectConflictRow(db, conflictId, tenantId) {
|
|
|
298
314
|
}
|
|
299
315
|
function weakenConflictLoser(db, t) {
|
|
300
316
|
// Halve the loser's half-life (weakens it over time)
|
|
301
|
-
db.prepare(`UPDATE memories SET half_life_days = MAX(1, half_life_days / 2), updated_at = datetime('now')
|
|
302
|
-
.run(t.loserId, ...t.scope.memArgs);
|
|
303
|
-
return {
|
|
317
|
+
db.prepare(`UPDATE memories SET half_life_days = MAX(1, half_life_days / 2), updated_at = datetime('now') ` +
|
|
318
|
+
`WHERE id = ?${t.scope.memScope}`).run(t.loserId, ...t.scope.memArgs);
|
|
319
|
+
return {
|
|
320
|
+
loserRemoved: false,
|
|
321
|
+
loserWasRaw: false,
|
|
322
|
+
rejectedDigest: undefined,
|
|
323
|
+
extraRemovedIds: [],
|
|
324
|
+
extraRemovedRawIds: [],
|
|
325
|
+
};
|
|
304
326
|
}
|
|
305
327
|
function removeConflictLoser(db, t) {
|
|
306
|
-
// Removal is kind-aware: a bare DELETE on a raw loser fires the append-only trigger, so use the same helpers as the
|
|
328
|
+
// Removal is kind-aware: a bare DELETE on a raw loser fires the append-only trigger, so use the same helpers as the
|
|
329
|
+
// reject verb.
|
|
307
330
|
// loserRemoved / loserWasRaw drive the conflicts_with_json skip below and the post-commit mirror purge.
|
|
308
331
|
const removal = {
|
|
309
332
|
loserRemoved: false,
|
|
310
333
|
loserWasRaw: false,
|
|
311
334
|
rejectedDigest: undefined,
|
|
312
|
-
// Same-tenant duplicates of the loser's content that rejectLoserValue also removes; kept apart from loserId so
|
|
335
|
+
// Same-tenant duplicates of the loser's content that rejectLoserValue also removes; kept apart from loserId so
|
|
336
|
+
// audit and mirror purge cover all of them.
|
|
313
337
|
extraRemovedIds: [],
|
|
314
338
|
extraRemovedRawIds: [],
|
|
315
339
|
};
|
|
@@ -349,28 +373,31 @@ function recordRejectedLoserValue(db, t, loserRow, digest, who) {
|
|
|
349
373
|
normalizedChars: normalizeValueForRejection(loserRow.content).length,
|
|
350
374
|
});
|
|
351
375
|
}
|
|
352
|
-
/**
|
|
353
|
-
function
|
|
354
|
-
if (isPersonalScope(loserRow.scope)) {
|
|
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`);
|
|
357
|
-
}
|
|
376
|
+
/** Removes the live same-tenant rows whose digest matches the rejected value into `removal`; `keepId` is spared. */
|
|
377
|
+
function removeDuplicatesOfRejectedValue(db, t, loserRow, rejectedDigest, who, removal) {
|
|
358
378
|
const { actor, reason } = who;
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
//
|
|
362
|
-
//
|
|
379
|
+
// Remove ALL live same-tenant rows whose digest matches (as reject-flow.ts rejectValue does), not just loserId; the
|
|
380
|
+
// O(N) scan is human-scale.
|
|
381
|
+
// Tenant-scoped ONLY, since tombstones are; `keepId` is excluded even if its content matches, because the human chose
|
|
382
|
+
// to keep it.
|
|
363
383
|
const loserTenantId = loserRow.tenant_id ?? DEFAULT_TENANT_ID;
|
|
364
|
-
//
|
|
384
|
+
// SHORTCUT: streams the tenant to hold only the matches; a stored digest column with a (tenant_id, digest) index
|
|
385
|
+
// would read just those.
|
|
386
|
+
// SAFETY: each row has the four columns named in the SELECT.
|
|
365
387
|
const dupRows = db
|
|
366
388
|
.prepare(`SELECT id, kind, content, scope FROM memories WHERE tenant_id = ? AND id != ? AND id != ?`)
|
|
367
|
-
.
|
|
389
|
+
.iterate(loserTenantId, t.loserId, t.keepId);
|
|
390
|
+
const dups = [];
|
|
368
391
|
for (const dup of dupRows) {
|
|
369
392
|
if (rejectionDigest(dup.content) !== rejectedDigest)
|
|
370
393
|
continue;
|
|
371
394
|
// Another person's personal row is outside this resolver's reach, as it is outside their recall.
|
|
372
395
|
if (isPersonalScope(dup.scope) && dup.scope !== loserRow.scope)
|
|
373
396
|
continue;
|
|
397
|
+
dups.push({ id: dup.id, kind: dup.kind });
|
|
398
|
+
}
|
|
399
|
+
// Removed after the read ends, since deleting rows under an open cursor can skip or repeat rows.
|
|
400
|
+
for (const dup of dups) {
|
|
374
401
|
if (dup.kind === 'raw') {
|
|
375
402
|
archiveRawMemory(db, dup.id, { reason, who: actor });
|
|
376
403
|
removal.extraRemovedRawIds.push(dup.id);
|
|
@@ -380,6 +407,16 @@ function tombstoneLoserValue(db, t, loserRow, who, removal) {
|
|
|
380
407
|
}
|
|
381
408
|
removal.extraRemovedIds.push(dup.id);
|
|
382
409
|
}
|
|
410
|
+
}
|
|
411
|
+
/** Tombstones the loser's digest and removes its same-tenant duplicates into `removal`; returns the digest. */
|
|
412
|
+
function tombstoneLoserValue(db, t, loserRow, who, removal) {
|
|
413
|
+
if (isPersonalScope(loserRow.scope)) {
|
|
414
|
+
throw new BadRequestError(`cannot reject the value of personal memory ${t.loserId}: a rejection reaches the whole tenant, ` +
|
|
415
|
+
`so its reason would show to everyone; resolve with forget instead`);
|
|
416
|
+
}
|
|
417
|
+
const rejectedDigest = rejectionDigest(loserRow.content);
|
|
418
|
+
recordRejectedLoserValue(db, t, loserRow, rejectedDigest, who);
|
|
419
|
+
removeDuplicatesOfRejectedValue(db, t, loserRow, rejectedDigest, who, removal);
|
|
383
420
|
return rejectedDigest;
|
|
384
421
|
}
|
|
385
422
|
function stripConflictRefs(db, t, loserRemoved) {
|
|
@@ -389,7 +426,11 @@ function stripConflictRefs(db, t, loserRemoved) {
|
|
|
389
426
|
// SAFETY: keepRow's shape matches the single `conflicts_with_json` column selected above.
|
|
390
427
|
const keepRow = db.prepare(`SELECT conflicts_with_json FROM memories WHERE id = ?${memScope}`).get(keepId, ...memArgs);
|
|
391
428
|
if (keepRow) {
|
|
392
|
-
const refs =
|
|
429
|
+
const refs = parseJsonArray(keepRow.conflicts_with_json, {
|
|
430
|
+
table: 'memories',
|
|
431
|
+
id: keepId,
|
|
432
|
+
column: 'conflicts_with_json',
|
|
433
|
+
});
|
|
393
434
|
const cleaned = refs.filter((r) => r !== loserId);
|
|
394
435
|
db.prepare(`UPDATE memories SET conflicts_with_json = ?, updated_at = datetime('now') WHERE id = ?${memScope}`)
|
|
395
436
|
.run(JSON.stringify(cleaned), keepId, ...memArgs);
|
|
@@ -399,7 +440,11 @@ function stripConflictRefs(db, t, loserRemoved) {
|
|
|
399
440
|
// column named in the SELECT below.
|
|
400
441
|
const loserRow = db.prepare(`SELECT conflicts_with_json FROM memories WHERE id = ?${memScope}`).get(loserId, ...memArgs);
|
|
401
442
|
if (loserRow) {
|
|
402
|
-
const refs =
|
|
443
|
+
const refs = parseJsonArray(loserRow.conflicts_with_json, {
|
|
444
|
+
table: 'memories',
|
|
445
|
+
id: loserId,
|
|
446
|
+
column: 'conflicts_with_json',
|
|
447
|
+
});
|
|
403
448
|
const cleaned = refs.filter((r) => r !== keepId);
|
|
404
449
|
db.prepare(`UPDATE memories SET conflicts_with_json = ?, updated_at = datetime('now') WHERE id = ?${memScope}`)
|
|
405
450
|
.run(JSON.stringify(cleaned), loserId, ...memArgs);
|
|
@@ -422,15 +467,23 @@ function auditConflictResolve(db, t, removal, tenantId) {
|
|
|
422
467
|
// omitting the key, exactly as the pre-migration object literal did.
|
|
423
468
|
if (rejectedDigest !== undefined)
|
|
424
469
|
conflictResolveMeta.rejectedDigest = rejectedDigest;
|
|
425
|
-
// Fresh spread literal: ConflictResolveMeta is a closed interface, not assignable to audit()'s Record<string,
|
|
426
|
-
|
|
470
|
+
// Fresh spread literal: ConflictResolveMeta is a closed interface, not assignable to audit()'s Record<string,
|
|
471
|
+
// JsonValue> metadata otherwise.
|
|
472
|
+
audit(db, 'conflict_resolve', {
|
|
473
|
+
targetId: t.keepId,
|
|
474
|
+
metadata: { ...conflictResolveMeta },
|
|
475
|
+
actor: t.opts?.rejectedBy ?? 'cli',
|
|
476
|
+
tenantId,
|
|
477
|
+
});
|
|
427
478
|
}
|
|
428
479
|
function purgeRemovedLoserMirrors(hippoRoot, db, loserId, removal) {
|
|
429
|
-
// Mirror purge and reaper stamp for EVERY removed loser (loserId and each extraRemovedIds duplicate), post-commit
|
|
480
|
+
// Mirror purge and reaper stamp for EVERY removed loser (loserId and each extraRemovedIds duplicate), post-commit
|
|
481
|
+
// like the reject verb.
|
|
430
482
|
// A non-raw mirror has no reaper, so skipping the purge would orphan it forever.
|
|
431
483
|
for (const removedId of [loserId, ...removal.extraRemovedIds]) {
|
|
432
484
|
const isRaw = removedId === loserId ? removal.loserWasRaw : removal.extraRemovedRawIds.includes(removedId);
|
|
433
|
-
// purgeMirrorBestEffort retries once, then reports the explicit leftover paths for non-raw ids, which the
|
|
485
|
+
// purgeMirrorBestEffort retries once, then reports the explicit leftover paths for non-raw ids, which the
|
|
486
|
+
// cleanupArchivedMirrors reaper never scans.
|
|
434
487
|
const mirrorOk = purgeMirrorBestEffort(hippoRoot, removedId, isRaw, 'resolveConflict');
|
|
435
488
|
if (mirrorOk && isRaw) {
|
|
436
489
|
db.prepare(`UPDATE raw_archive SET mirror_cleaned_at = ? WHERE memory_id = ?`).run(new Date().toISOString(), removedId);
|
|
@@ -440,8 +493,11 @@ function purgeRemovedLoserMirrors(hippoRoot, db, loserId, removal) {
|
|
|
440
493
|
/** The conflict and loser ids every conflict_resolve audit row names. */
|
|
441
494
|
export function conflictResolveAuditsAt(db) {
|
|
442
495
|
// SAFETY: SELECT of two fields every conflict_resolve audit row carries (ConflictResolveMeta above).
|
|
443
|
-
return db
|
|
444
|
-
`
|
|
496
|
+
return db
|
|
497
|
+
.prepare(`SELECT json_extract(metadata_json, '$.conflictId') ` +
|
|
498
|
+
`AS conflictId, json_extract(metadata_json, '$.loserId') AS loserId ` +
|
|
499
|
+
`FROM audit_log WHERE op = 'conflict_resolve'`)
|
|
500
|
+
.all();
|
|
445
501
|
}
|
|
446
502
|
/** Every resolved conflict with both sides. */
|
|
447
503
|
export function resolvedConflictsAt(db) {
|
|
@@ -2,9 +2,21 @@ import type { DatabaseSyncLike } from '../../db/index.js';
|
|
|
2
2
|
export type DlqTable = 'slack_dlq' | 'github_dlq';
|
|
3
3
|
export type DlqRawValue = string | number | bigint | null;
|
|
4
4
|
export type DlqRawRow = Record<string, DlqRawValue>;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
export
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
type DlqKind = 'int' | 'text' | 'nullableText' | 'count' | 'bucket';
|
|
6
|
+
/** One DLQ column: the item field it fills, its kind, and whether insert writes it (the database sets the rest). */
|
|
7
|
+
export interface DlqColumn {
|
|
8
|
+
field: string;
|
|
9
|
+
column: string;
|
|
10
|
+
kind: DlqKind;
|
|
11
|
+
insert?: true;
|
|
12
|
+
}
|
|
13
|
+
export interface DlqAccess<Item, Insert> {
|
|
14
|
+
insert(db: DatabaseSyncLike, row: Insert): number;
|
|
15
|
+
list(db: DatabaseSyncLike, tenantId: string, limit: number): Item[];
|
|
16
|
+
get(db: DatabaseSyncLike, id: number): Item | null;
|
|
17
|
+
markRetried(db: DatabaseSyncLike, id: number): void;
|
|
18
|
+
}
|
|
19
|
+
/** The four statements and the row mapping of one dead-letter table, driven by its column map. */
|
|
20
|
+
export declare function dlqAccess<Item, Insert extends object>(table: DlqTable, columns: readonly DlqColumn[]): DlqAccess<Item, Insert>;
|
|
21
|
+
export {};
|
|
10
22
|
//# sourceMappingURL=dlq.d.ts.map
|
|
@@ -1,14 +1,33 @@
|
|
|
1
|
-
// The dead-letter statements both connectors share; each connector names its table and columns and maps rows to its own
|
|
1
|
+
// The dead-letter statements both connectors share; each connector names its table and columns and maps rows to its own
|
|
2
|
+
// item type.
|
|
3
|
+
import { placeholders } from '../../util/sql.js';
|
|
4
|
+
const DLQ_TABLES = ['slack_dlq', 'github_dlq'];
|
|
5
|
+
const COLUMN_NAME = /^[a-z_]+$/;
|
|
6
|
+
// The statements splice identifiers into SQL, so the typed union is backed by a runtime check.
|
|
7
|
+
function assertTable(table) {
|
|
8
|
+
if (!DLQ_TABLES.includes(table))
|
|
9
|
+
throw new Error(`Invalid DLQ table: ${table}`);
|
|
10
|
+
}
|
|
11
|
+
function assertColumns(names) {
|
|
12
|
+
for (const name of names) {
|
|
13
|
+
if (!COLUMN_NAME.test(name))
|
|
14
|
+
throw new Error(`Invalid DLQ column name: ${name}`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
2
17
|
/** Inserts one row, stamping received_at; `columns` pairs each column name with its value, in insert order. */
|
|
3
|
-
|
|
18
|
+
function insertDlqRow(db, table, columns) {
|
|
19
|
+
assertTable(table);
|
|
4
20
|
const names = [...columns.map(([name]) => name), 'received_at'];
|
|
21
|
+
assertColumns(names);
|
|
5
22
|
const values = [...columns.map(([, value]) => value), new Date().toISOString()];
|
|
6
23
|
const result = db
|
|
7
|
-
.prepare(`INSERT INTO ${table} (${names.join(', ')}) VALUES (${names.
|
|
24
|
+
.prepare(`INSERT INTO ${table} (${names.join(', ')}) VALUES (${placeholders(names.length)})`)
|
|
8
25
|
.run(...values);
|
|
9
26
|
return Number(result.lastInsertRowid);
|
|
10
27
|
}
|
|
11
|
-
|
|
28
|
+
function listDlqRows(db, table, selectColumns, tenantId, limit) {
|
|
29
|
+
assertTable(table);
|
|
30
|
+
assertColumns(selectColumns.split(',').map((name) => name.trim()));
|
|
12
31
|
// SAFETY: the caller's selectColumns names exactly the fields its rowToItem reads.
|
|
13
32
|
return db
|
|
14
33
|
.prepare(`SELECT ${selectColumns}
|
|
@@ -18,15 +37,48 @@ export function listDlqRows(db, table, selectColumns, tenantId, limit) {
|
|
|
18
37
|
LIMIT ?`)
|
|
19
38
|
.all(tenantId, limit);
|
|
20
39
|
}
|
|
21
|
-
|
|
40
|
+
function getDlqRow(db, table, selectColumns, id) {
|
|
41
|
+
assertTable(table);
|
|
42
|
+
assertColumns(selectColumns.split(',').map((name) => name.trim()));
|
|
22
43
|
// SAFETY: the caller's selectColumns names exactly the fields its rowToItem reads.
|
|
23
44
|
const row = db
|
|
24
45
|
.prepare(`SELECT ${selectColumns} FROM ${table} WHERE id = ?`)
|
|
25
46
|
.get(id);
|
|
26
47
|
return row ?? null;
|
|
27
48
|
}
|
|
28
|
-
|
|
49
|
+
function markDlqRetried(db, table, id) {
|
|
50
|
+
assertTable(table);
|
|
29
51
|
db.prepare(`UPDATE ${table} SET retried_at = ?, retry_count = retry_count + 1 WHERE id = ?`)
|
|
30
52
|
.run(new Date().toISOString(), id);
|
|
31
53
|
}
|
|
54
|
+
function coerceDlqValue(kind, raw) {
|
|
55
|
+
switch (kind) {
|
|
56
|
+
case 'int': return Number(raw);
|
|
57
|
+
case 'count': return Number(raw ?? 0);
|
|
58
|
+
case 'text': return String(raw);
|
|
59
|
+
case 'nullableText': return raw == null ? null : String(raw);
|
|
60
|
+
case 'bucket': return raw == null ? 'parse_error' : String(raw);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** The four statements and the row mapping of one dead-letter table, driven by its column map. */
|
|
64
|
+
export function dlqAccess(table, columns) {
|
|
65
|
+
const selectColumns = columns.map((c) => c.column).join(', ');
|
|
66
|
+
const insertColumns = columns.filter((c) => c.insert);
|
|
67
|
+
// SAFETY: the column map names every field of Item with the kind that coerces it.
|
|
68
|
+
const toItem = (raw) => Object.fromEntries(columns.map((c) => [c.field, coerceDlqValue(c.kind, raw[c.column])]));
|
|
69
|
+
return {
|
|
70
|
+
insert: (db, row) => {
|
|
71
|
+
// SAFETY: every insert field of the column map is a string, null or absent on Insert.
|
|
72
|
+
const fields = row;
|
|
73
|
+
const pairs = insertColumns.map((c) => [c.column, fields[c.field] ?? null]);
|
|
74
|
+
return insertDlqRow(db, table, pairs);
|
|
75
|
+
},
|
|
76
|
+
list: (db, tenantId, limit) => listDlqRows(db, table, selectColumns, tenantId, limit).map(toItem),
|
|
77
|
+
get: (db, id) => {
|
|
78
|
+
const row = getDlqRow(db, table, selectColumns, id);
|
|
79
|
+
return row ? toItem(row) : null;
|
|
80
|
+
},
|
|
81
|
+
markRetried: (db, id) => markDlqRetried(db, table, id),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
32
84
|
//# sourceMappingURL=dlq.js.map
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import type { DatabaseSyncLike } from '../../db/index.js';
|
|
2
|
+
import type { EntryWrite, RawArchive } from '../port.js';
|
|
3
|
+
import type { GitHubDlqInsert, GitHubRouting } from './github.js';
|
|
4
|
+
import type { SlackDlqInsert, SlackTeamRoute } from './slack.js';
|
|
5
|
+
/** Which log table a connector writes and the column its dedupe key lives in. */
|
|
6
|
+
export interface EventLogSpec {
|
|
7
|
+
readonly table: 'slack_event_log' | 'github_event_log';
|
|
8
|
+
readonly keyColumn: 'event_id' | 'idempotency_key';
|
|
9
|
+
}
|
|
10
|
+
export declare function eventSeenAt(db: DatabaseSyncLike, log: EventLogSpec, key: string): boolean;
|
|
11
|
+
export declare function eventMemoryAt(db: DatabaseSyncLike, log: EventLogSpec, key: string): string | null;
|
|
12
|
+
/** Records the key unless a row holds it already; false means another writer got there first. `extra` pairs
|
|
13
|
+
* connector-only columns with values. */
|
|
14
|
+
export declare function markEventSeenAt(db: DatabaseSyncLike, log: EventLogSpec, key: string, extra: ReadonlyArray<readonly [string, string]>, memoryId: string | null): boolean;
|
|
15
|
+
export declare function eventRecord(hippoRoot: string, log: EventLogSpec, key: string): ConnectorEventRecord;
|
|
16
|
+
/** The source event a connector's write answers, by the source's own key. The store logs each key once per connector,
|
|
17
|
+
* across every tenant. */
|
|
18
|
+
export type ConnectorEvent = {
|
|
19
|
+
readonly connector: 'slack';
|
|
20
|
+
readonly eventId: string;
|
|
21
|
+
} | {
|
|
22
|
+
readonly connector: 'github';
|
|
23
|
+
readonly idempotencyKey: string;
|
|
24
|
+
readonly deliveryId: string;
|
|
25
|
+
readonly eventName: string;
|
|
26
|
+
};
|
|
27
|
+
/** An entry a connector brings in. `quarantine` is the review record of flagged content, whose entry already carries
|
|
28
|
+
* its quarantine scope. */
|
|
29
|
+
export interface ConnectorWrite extends EntryWrite {
|
|
30
|
+
readonly event?: ConnectorEvent;
|
|
31
|
+
readonly quarantine?: {
|
|
32
|
+
readonly originalScope: string | null;
|
|
33
|
+
readonly reason: string;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/** 'duplicate': the event's key was logged before; `memoryId` is the id its log row holds, null for an event logged
|
|
37
|
+
* with no memory. */
|
|
38
|
+
export type ConnectorWriteOutcome = {
|
|
39
|
+
readonly outcome: 'written';
|
|
40
|
+
} | {
|
|
41
|
+
readonly outcome: 'duplicate';
|
|
42
|
+
readonly memoryId: string | null;
|
|
43
|
+
};
|
|
44
|
+
export interface ConnectorArchive extends RawArchive {
|
|
45
|
+
readonly event: ConnectorEvent;
|
|
46
|
+
}
|
|
47
|
+
/** A connector's writes with the rows that must commit with them: the event log row
|
|
48
|
+
* that turns a redelivery into a no-op, and the quarantine record of flagged content. */
|
|
49
|
+
export interface ConnectorWrites {
|
|
50
|
+
/** entryWrites.writeEntry plus, in its transaction: with `quarantine`, one pending record and quarantine row; with
|
|
51
|
+
* `event`, one log row. All commit or none. A key logged before resolves 'duplicate' and stores nothing (never a
|
|
52
|
+
* rejection); every other refusal is writeEntry's own, decided first. */
|
|
53
|
+
writeConnectorEntry(write: ConnectorWrite): Promise<ConnectorWriteOutcome>;
|
|
54
|
+
/** entryWrites.archiveRaw plus, in its transaction, one log row for `event` naming the archived id, so a redelivery
|
|
55
|
+
* finds it logged; a failed log write undoes the archive. A key logged before keeps its row and does not stop the
|
|
56
|
+
* archive. Reach and every rejection are archiveRaw's own. */
|
|
57
|
+
archiveConnectorEntry(archive: ConnectorArchive): Promise<string>;
|
|
58
|
+
}
|
|
59
|
+
/** What the event log holds for one event's key; `memoryId` is null for an event logged with no memory. */
|
|
60
|
+
export type ConnectorEventRecord = {
|
|
61
|
+
readonly seen: false;
|
|
62
|
+
} | {
|
|
63
|
+
readonly seen: true;
|
|
64
|
+
readonly memoryId: string | null;
|
|
65
|
+
};
|
|
66
|
+
export interface DeletionLookup {
|
|
67
|
+
readonly event: ConnectorEvent;
|
|
68
|
+
readonly artifactRef: string;
|
|
69
|
+
readonly tenantId: string;
|
|
70
|
+
}
|
|
71
|
+
/** `memoryId` is null when the tenant holds no raw row for the artifact. */
|
|
72
|
+
export type DeletionTarget = {
|
|
73
|
+
readonly seen: true;
|
|
74
|
+
} | {
|
|
75
|
+
readonly seen: false;
|
|
76
|
+
readonly memoryId: string | null;
|
|
77
|
+
};
|
|
78
|
+
export interface ArtifactArchive {
|
|
79
|
+
readonly tenantId: string;
|
|
80
|
+
readonly actor: string;
|
|
81
|
+
readonly artifactRef: string;
|
|
82
|
+
readonly reason: string;
|
|
83
|
+
readonly event: Extract<ConnectorEvent, {
|
|
84
|
+
readonly connector: 'github';
|
|
85
|
+
}>;
|
|
86
|
+
}
|
|
87
|
+
/** One payload a webhook could not use, already redacted, for the dead-letter queue of its connector. */
|
|
88
|
+
export type ConnectorDeadLetter = ({
|
|
89
|
+
readonly connector: 'slack';
|
|
90
|
+
} & SlackDlqInsert) | ({
|
|
91
|
+
readonly connector: 'github';
|
|
92
|
+
} & GitHubDlqInsert);
|
|
93
|
+
/** What a connector delivery reads and writes beside connectorWrites: the event log,
|
|
94
|
+
* tenant routing, the dead-letter queue and the archive of a deleted artifact. */
|
|
95
|
+
export interface ConnectorEvents {
|
|
96
|
+
/** The log row of the event's key, in its connector's own key space. */
|
|
97
|
+
eventRecord(event: ConnectorEvent): Promise<ConnectorEventRecord>;
|
|
98
|
+
/** Logs an event that stored no memory, so its redelivery finds it. A key logged before keeps its row, the memory id
|
|
99
|
+
* it names included. */
|
|
100
|
+
markEventSeen(event: ConnectorEvent): Promise<void>;
|
|
101
|
+
/** Both reads on one snapshot: an event logged before answers `seen`, else the raw row the
|
|
102
|
+
* tenant holds for the artifact. Another tenant's row under the same ref is never returned. */
|
|
103
|
+
deletionTarget(lookup: DeletionLookup): Promise<DeletionTarget>;
|
|
104
|
+
/** A logged event answers `duplicate` and changes nothing. Else one transaction archives every raw row of the
|
|
105
|
+
* artifact (archive_raw row each, under `actor`) and logs the event naming the first, or no memory if none; one
|
|
106
|
+
* failed archive undoes all and the log row. No reach check. */
|
|
107
|
+
archiveDeletedArtifact(archive: ArtifactArchive): Promise<{
|
|
108
|
+
readonly duplicate: boolean;
|
|
109
|
+
readonly archived: number;
|
|
110
|
+
}>;
|
|
111
|
+
/** The tenant a Slack team is registered to, or how many workspaces are registered when it is not. */
|
|
112
|
+
slackTeamRoute(teamId: string): Promise<SlackTeamRoute>;
|
|
113
|
+
/** The tenant of the installation, or of the repository when no installation is named, with the size of both routing
|
|
114
|
+
* tables. */
|
|
115
|
+
githubRouting(query: {
|
|
116
|
+
readonly installationId?: string | null;
|
|
117
|
+
readonly repoFullName?: string | null;
|
|
118
|
+
}): Promise<GitHubRouting>;
|
|
119
|
+
/** Appends the row and answers its id. */
|
|
120
|
+
parkDeadLetter(letter: ConnectorDeadLetter): Promise<number>;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=event-log.d.ts.map
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// The event-log statements both connectors share; each connector names its table, key column and extra columns.
|
|
2
|
+
import { placeholders } from '../../util/sql.js';
|
|
3
|
+
import { onHandle } from '../open.js';
|
|
4
|
+
export function eventSeenAt(db, log, key) {
|
|
5
|
+
return !!db.prepare(`SELECT 1 FROM ${log.table} WHERE ${log.keyColumn} = ?`).get(key);
|
|
6
|
+
}
|
|
7
|
+
export function eventMemoryAt(db, log, key) {
|
|
8
|
+
// SAFETY: the SELECT projects only `memory_id`, a nullable column; .get() returns undefined when no row matches.
|
|
9
|
+
const row = db.prepare(`SELECT memory_id FROM ${log.table} WHERE ${log.keyColumn} = ?`).get(key);
|
|
10
|
+
return row?.memory_id ?? null;
|
|
11
|
+
}
|
|
12
|
+
/** Records the key unless a row holds it already; false means another writer got there first. `extra` pairs
|
|
13
|
+
* connector-only columns with values. */
|
|
14
|
+
export function markEventSeenAt(db, log, key, extra, memoryId) {
|
|
15
|
+
const names = [log.keyColumn, ...extra.map(([name]) => name), 'ingested_at', 'memory_id'];
|
|
16
|
+
const values = [key, ...extra.map(([, value]) => value), new Date().toISOString(), memoryId];
|
|
17
|
+
const inserted = db
|
|
18
|
+
.prepare(`INSERT OR IGNORE INTO ${log.table} (${names.join(', ')}) VALUES (${placeholders(names.length)})`)
|
|
19
|
+
.run(...values);
|
|
20
|
+
return Number(inserted.changes ?? 0) !== 0;
|
|
21
|
+
}
|
|
22
|
+
export function eventRecord(hippoRoot, log, key) {
|
|
23
|
+
return onHandle(hippoRoot, (db) => eventSeenAt(db, log, key) ? { seen: true, memoryId: eventMemoryAt(db, log, key) } : { seen: false });
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=event-log.js.map
|
|
@@ -22,7 +22,8 @@ export interface ArtifactDeletion {
|
|
|
22
22
|
reason: string;
|
|
23
23
|
who: string;
|
|
24
24
|
}
|
|
25
|
-
/** Archives every active raw row of one tenant's artifact and logs the delete event; a failed archive rolls back the
|
|
25
|
+
/** Archives every active raw row of one tenant's artifact and logs the delete event; a failed archive rolls back the
|
|
26
|
+
* batch and the log row. */
|
|
26
27
|
export declare function archiveDeletedArtifact(hippoRoot: string, del: ArtifactDeletion): {
|
|
27
28
|
duplicate: boolean;
|
|
28
29
|
archived: number;
|
|
@@ -43,7 +44,8 @@ export interface DlqItem {
|
|
|
43
44
|
retriedAt: string | null;
|
|
44
45
|
bucket: DlqBucket | string;
|
|
45
46
|
}
|
|
46
|
-
/** One github_dlq row to write, already redacted by the caller; the four GitHub-only columns are stored NULL when left
|
|
47
|
+
/** One github_dlq row to write, already redacted by the caller; the four GitHub-only columns are stored NULL when left
|
|
48
|
+
* out. */
|
|
47
49
|
export interface GitHubDlqInsert {
|
|
48
50
|
tenantId: string;
|
|
49
51
|
rawPayload: string;
|
|
@@ -59,7 +61,8 @@ export declare function insertGitHubDlq(hippoRoot: string, row: GitHubDlqInsert)
|
|
|
59
61
|
export declare function listGitHubDlq(hippoRoot: string, tenantId: string, limit: number): DlqItem[];
|
|
60
62
|
export declare function githubDlqEntry(hippoRoot: string, id: number): DlqItem | null;
|
|
61
63
|
export declare function markGitHubDlqRetried(hippoRoot: string, id: number): void;
|
|
62
|
-
/** What the routing tables say about one webhook; `tenant` is the installation match, or the repo match when no
|
|
64
|
+
/** What the routing tables say about one webhook; `tenant` is the installation match, or the repo match when no
|
|
65
|
+
* installation was sent. */
|
|
63
66
|
export interface GitHubRouting {
|
|
64
67
|
installations: number;
|
|
65
68
|
repositories: number;
|