hippo-memory 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-memories/apply.d.ts +7 -5
- package/dist/agent-memories/apply.js +66 -39
- package/dist/agent-memories/claude-code.d.ts +8 -2
- package/dist/agent-memories/claude-code.js +26 -7
- package/dist/agent-memories/copilot.js +2 -1
- package/dist/agent-memories/files.js +2 -1
- package/dist/agent-memories/legacy.d.ts +6 -3
- package/dist/agent-memories/legacy.js +35 -14
- package/dist/agent-memories/markdown.d.ts +3 -1
- package/dist/agent-memories/markdown.js +3 -1
- package/dist/agent-memories/openclaw.js +5 -2
- package/dist/agent-memories/plan.js +11 -1
- package/dist/agent-memories/project-folds.js +2 -1
- package/dist/agent-memories/report.d.ts +4 -1
- package/dist/agent-memories/report.js +43 -9
- package/dist/agent-memories/source.d.ts +8 -2
- package/dist/agent-memories/source.js +11 -3
- package/dist/agent-memories/sync.d.ts +7 -2
- package/dist/agent-memories/sync.js +141 -101
- package/dist/api/assemble.d.ts +6 -4
- package/dist/api/assemble.js +11 -6
- package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
- package/dist/api/{audit.js → auth/audit.js} +11 -11
- package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -15
- package/dist/api/{auth.js → auth/auth.js} +46 -29
- package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
- package/dist/api/{quarantine.js → auth/quarantine.js} +8 -8
- package/dist/api/auth/session-owners.d.ts +10 -0
- package/dist/api/auth/session-owners.js +35 -0
- package/dist/api/availability.d.ts +3 -1
- package/dist/api/availability.js +3 -1
- package/dist/api/busy.d.ts +2 -0
- package/dist/api/busy.js +2 -0
- package/dist/api/cli-surface.d.ts +6 -0
- package/dist/api/cli-surface.js +6 -0
- package/dist/api/config-of.d.ts +5 -0
- package/dist/api/config-of.js +6 -0
- package/dist/api/context-auto.d.ts +4 -1
- package/dist/api/context-auto.js +10 -2
- package/dist/api/context-render.js +14 -7
- package/dist/api/context-select.d.ts +4 -1
- package/dist/api/context-select.js +23 -14
- package/dist/api/context-types.d.ts +38 -12
- package/dist/api/context.d.ts +8 -5
- package/dist/api/context.js +112 -57
- package/dist/api/continuity.d.ts +24 -21
- package/dist/api/continuity.js +18 -20
- package/dist/api/correction-latency.d.ts +3 -1
- package/dist/api/correction-latency.js +3 -1
- package/dist/api/error-reply.d.ts +4 -1
- package/dist/api/error-reply.js +12 -3
- package/dist/api/index.d.ts +39 -23
- package/dist/api/index.js +21 -23
- package/dist/api/instruction-detect.d.ts +4 -1
- package/dist/api/instruction-detect.js +75 -20
- package/dist/api/ledger-db.d.ts +15 -11
- package/dist/api/ledger-db.js +21 -23
- package/dist/api/memories/conflicts.d.ts +33 -0
- package/dist/api/memories/conflicts.js +67 -0
- package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
- package/dist/api/{forget.js → memories/forget.js} +22 -15
- package/dist/api/memories/memories.d.ts +27 -0
- package/dist/api/{memories.js → memories/memories.js} +16 -21
- package/dist/api/memories/outcome.d.ts +22 -0
- package/dist/api/{outcome.js → memories/outcome.js} +14 -8
- package/dist/api/memories/promote.d.ts +40 -0
- package/dist/api/{promote.js → memories/promote.js} +35 -22
- package/dist/api/memories/refine.d.ts +10 -0
- package/dist/api/memories/refine.js +12 -0
- package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +16 -11
- package/dist/api/{remember-local.js → memories/remember-local.js} +34 -20
- package/dist/api/{remember.d.ts → memories/remember.d.ts} +19 -13
- package/dist/api/{remember.js → memories/remember.js} +42 -26
- package/dist/api/objects/cards.d.ts +39 -0
- package/dist/api/{cards.js → objects/cards.js} +12 -14
- package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
- package/dist/api/{drill-down.js → objects/drill-down.js} +7 -8
- package/dist/api/objects/goals.d.ts +18 -0
- package/dist/api/{goals.js → objects/goals.js} +12 -12
- package/dist/api/objects/graph.d.ts +11 -0
- package/dist/api/objects/graph.js +16 -0
- package/dist/api/objects/objects.d.ts +9 -0
- package/dist/api/{objects.js → objects/objects.js} +2 -4
- package/dist/api/objects/predictions.d.ts +11 -0
- package/dist/api/{predictions.js → objects/predictions.js} +7 -6
- package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
- package/dist/api/{projects.js → objects/projects.js} +8 -4
- package/dist/api/pilot-arm.d.ts +8 -4
- package/dist/api/pilot-arm.js +5 -4
- package/dist/api/prompt-hook.d.ts +32 -19
- package/dist/api/prompt-hook.js +65 -44
- package/dist/api/provenance-coverage.d.ts +3 -1
- package/dist/api/provenance-coverage.js +3 -1
- package/dist/api/recall/finish.d.ts +185 -0
- package/dist/api/recall/finish.js +301 -0
- package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
- package/dist/api/{recall-pipeline.js → recall/pipeline.js} +176 -92
- package/dist/api/recall/recall.d.ts +6 -0
- package/dist/api/{recall.js → recall/recall.js} +101 -60
- package/dist/api/recall/render.d.ts +39 -0
- package/dist/api/recall/render.js +60 -0
- package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
- package/dist/api/recall/request.js +261 -0
- package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
- package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
- package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -70
- package/dist/api/{recall-types.js → recall/types.js} +1 -1
- package/dist/api/session-end.d.ts +16 -12
- package/dist/api/session-end.js +46 -30
- package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
- package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
- package/dist/api/sleep/dormant.d.ts +25 -0
- package/dist/api/sleep/dormant.js +64 -0
- package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
- package/dist/api/sleep/learn.js +138 -0
- package/dist/api/sleep/sleep-run.d.ts +38 -0
- package/dist/api/{sleep-run.js → sleep/sleep-run.js} +51 -43
- package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
- package/dist/api/sleep/sleep.js +9 -0
- package/dist/api/status.d.ts +3 -1
- package/dist/api/status.js +3 -1
- package/dist/api/store-init.d.ts +4 -1
- package/dist/api/store-init.js +4 -1
- package/dist/api/tokens.d.ts +10 -9
- package/dist/api/tokens.js +9 -10
- package/dist/api/types.d.ts +28 -7
- package/dist/api/types.js +13 -4
- package/dist/capture/caller-session.d.ts +8 -2
- package/dist/capture/caller-session.js +16 -6
- package/dist/capture/capture-error.d.ts +3 -1
- package/dist/capture/capture-error.js +3 -1
- package/dist/capture/codex-patch.js +7 -2
- package/dist/capture/command.d.ts +4 -2
- package/dist/capture/command.js +33 -14
- package/dist/capture/compact-resume-caller.js +15 -8
- package/dist/capture/compact.d.ts +8 -5
- package/dist/capture/compact.js +34 -23
- package/dist/capture/compaction-items-caller.js +9 -3
- package/dist/capture/compaction-record.d.ts +4 -3
- package/dist/capture/compaction-record.js +20 -12
- package/dist/capture/compaction-spool.d.ts +15 -4
- package/dist/capture/compaction-spool.js +64 -17
- package/dist/capture/copilot-transcript.d.ts +11 -3
- package/dist/capture/copilot-transcript.js +16 -6
- package/dist/capture/extract.js +20 -8
- package/dist/capture/failure-caller.js +23 -12
- package/dist/capture/failure-reading.d.ts +10 -3
- package/dist/capture/failure-reading.js +24 -7
- package/dist/capture/pre-compact-caller.js +11 -4
- package/dist/capture/session-digest.d.ts +15 -4
- package/dist/capture/session-digest.js +39 -13
- package/dist/capture/session-end-caller.d.ts +4 -1
- package/dist/capture/session-end-caller.js +20 -8
- package/dist/capture/session-texts.d.ts +6 -2
- package/dist/capture/session-texts.js +22 -7
- package/dist/capture/session-worker.d.ts +4 -2
- package/dist/capture/session-worker.js +45 -17
- package/dist/capture/transcript.d.ts +13 -4
- package/dist/capture/transcript.js +32 -10
- package/dist/capture/working-state.d.ts +13 -4
- package/dist/capture/working-state.js +50 -56
- package/dist/cli/api-context.d.ts +14 -2
- package/dist/cli/api-context.js +45 -2
- package/dist/cli/audit.js +23 -23
- package/dist/cli/auth.js +19 -27
- package/dist/cli/briefs.d.ts +1 -1
- package/dist/cli/briefs.js +20 -15
- package/dist/cli/card.d.ts +1 -1
- package/dist/cli/card.js +56 -73
- package/dist/cli/client.d.ts +12 -4
- package/dist/cli/client.js +43 -13
- package/dist/cli/compact-resume-payload.d.ts +4 -1
- package/dist/cli/compact-resume-payload.js +12 -5
- package/dist/cli/context.js +42 -17
- package/dist/cli/continuity.d.ts +5 -5
- package/dist/cli/continuity.js +90 -107
- package/dist/cli/curate.d.ts +4 -3
- package/dist/cli/curate.js +46 -68
- package/dist/cli/dag.d.ts +1 -1
- package/dist/cli/dag.js +14 -17
- package/dist/cli/decisions.js +27 -26
- package/dist/cli/eval.js +16 -21
- package/dist/cli/exit.d.ts +4 -1
- package/dist/cli/exit.js +10 -2
- package/dist/cli/explain.js +12 -11
- package/dist/cli/flag-values.d.ts +1 -1
- package/dist/cli/flag-values.js +9 -18
- package/dist/cli/github.d.ts +6 -0
- package/dist/cli/github.js +25 -13
- package/dist/cli/goals.d.ts +1 -1
- package/dist/cli/goals.js +39 -56
- package/dist/cli/graph.d.ts +1 -1
- package/dist/cli/graph.js +15 -11
- package/dist/cli/hook-runtime.d.ts +31 -9
- package/dist/cli/hook-runtime.js +40 -15
- package/dist/cli/incidents.d.ts +1 -1
- package/dist/cli/incidents.js +25 -25
- package/dist/cli/init.js +26 -11
- package/dist/cli/install-steps.d.ts +12 -3
- package/dist/cli/install-steps.js +42 -18
- package/dist/cli/last-sleep.d.ts +4 -1
- package/dist/cli/last-sleep.js +9 -4
- package/dist/cli/maintenance.d.ts +1 -1
- package/dist/cli/maintenance.js +11 -12
- package/dist/cli/notes.d.ts +1 -1
- package/dist/cli/notes.js +8 -5
- package/dist/cli/object-verbs.d.ts +4 -4
- package/dist/cli/object-verbs.js +10 -13
- package/dist/cli/open-browser.js +11 -2
- package/dist/cli/playbooks.d.ts +3 -3
- package/dist/cli/playbooks.js +40 -32
- package/dist/cli/predictions.js +15 -19
- package/dist/cli/print.js +4 -2
- package/dist/cli/projects.js +21 -11
- package/dist/cli/quality-repair-once.js +5 -4
- package/dist/cli/recall.js +129 -93
- package/dist/cli/refine-llm.d.ts +15 -4
- package/dist/cli/refine-llm.js +16 -7
- package/dist/cli/remember.js +46 -50
- package/dist/cli/scheduler.d.ts +4 -1
- package/dist/cli/scheduler.js +9 -5
- package/dist/cli/serve.js +22 -17
- package/dist/cli/session-hooks.d.ts +2 -2
- package/dist/cli/session-hooks.js +87 -50
- package/dist/cli/setup.js +54 -32
- package/dist/cli/shared.d.ts +3 -1
- package/dist/cli/shared.js +24 -9
- package/dist/cli/slack.js +15 -24
- package/dist/cli/sleep-render.d.ts +3 -1
- package/dist/cli/sleep-render.js +8 -5
- package/dist/cli/sleep.js +14 -6
- package/dist/cli/status.d.ts +4 -4
- package/dist/cli/status.js +32 -27
- package/dist/cli/stdin.d.ts +10 -3
- package/dist/cli/stdin.js +10 -3
- package/dist/cli/transfer.d.ts +1 -1
- package/dist/cli/transfer.js +71 -75
- package/dist/cli/verbs/memory.js +8 -6
- package/dist/cli/verbs/objects.js +10 -4
- package/dist/cli/versioned-verbs.d.ts +8 -7
- package/dist/cli/versioned-verbs.js +31 -21
- package/dist/cli.js +13 -16
- package/dist/connectors/dlq.d.ts +6 -6
- package/dist/connectors/dlq.js +12 -8
- package/dist/connectors/github/backfill.d.ts +4 -4
- package/dist/connectors/github/backfill.js +6 -4
- package/dist/connectors/github/deletion.d.ts +6 -4
- package/dist/connectors/github/deletion.js +5 -5
- package/dist/connectors/github/dlq.d.ts +8 -6
- package/dist/connectors/github/dlq.js +11 -5
- package/dist/connectors/github/ingest.d.ts +2 -2
- package/dist/connectors/github/ingest.js +9 -6
- package/dist/connectors/github/octokit-client.d.ts +3 -1
- package/dist/connectors/github/octokit-client.js +7 -2
- package/dist/connectors/github/ratelimit.d.ts +6 -2
- package/dist/connectors/github/ratelimit.js +6 -2
- package/dist/connectors/github/signature.d.ts +14 -3
- package/dist/connectors/github/signature.js +17 -3
- package/dist/connectors/github/tenant-routing.d.ts +6 -4
- package/dist/connectors/github/tenant-routing.js +6 -6
- package/dist/connectors/github/transform.js +50 -67
- package/dist/connectors/github/types.d.ts +10 -3
- package/dist/connectors/github/types.js +6 -2
- package/dist/connectors/github/webhook.d.ts +5 -5
- package/dist/connectors/github/webhook.js +34 -23
- package/dist/connectors/ingest.d.ts +5 -3
- package/dist/connectors/ingest.js +3 -4
- package/dist/connectors/slack/backfill.d.ts +5 -5
- package/dist/connectors/slack/backfill.js +3 -3
- package/dist/connectors/slack/deletion.d.ts +4 -4
- package/dist/connectors/slack/deletion.js +6 -6
- package/dist/connectors/slack/dlq.d.ts +4 -4
- package/dist/connectors/slack/dlq.js +6 -6
- package/dist/connectors/slack/ingest.d.ts +6 -4
- package/dist/connectors/slack/ingest.js +5 -5
- package/dist/connectors/slack/signature.d.ts +4 -1
- package/dist/connectors/slack/tenant-routing.d.ts +6 -4
- package/dist/connectors/slack/tenant-routing.js +6 -6
- package/dist/connectors/slack/transform.d.ts +6 -2
- package/dist/connectors/slack/transform.js +6 -2
- package/dist/connectors/slack/types.d.ts +3 -1
- package/dist/connectors/slack/web-client.js +8 -3
- package/dist/connectors/slack/webhook.d.ts +5 -5
- package/dist/connectors/slack/webhook.js +19 -11
- package/dist/connectors/slack/workspaces.d.ts +7 -3
- package/dist/connectors/slack/workspaces.js +7 -3
- package/dist/connectors/store.d.ts +8 -0
- package/dist/connectors/store.js +2 -0
- package/dist/consolidate/conflicts.js +23 -9
- package/dist/consolidate/dag-summary.js +2 -1
- package/dist/consolidate/dag.d.ts +10 -5
- package/dist/consolidate/dag.js +37 -36
- package/dist/consolidate/decay.js +19 -6
- package/dist/consolidate/dedupe.d.ts +14 -5
- package/dist/consolidate/dedupe.js +27 -16
- package/dist/consolidate/flush-units.d.ts +4 -1
- package/dist/consolidate/flush-units.js +4 -1
- package/dist/consolidate/half-life-migration.d.ts +18 -8
- package/dist/consolidate/half-life-migration.js +48 -18
- package/dist/consolidate/llm-passes.js +27 -11
- package/dist/consolidate/memory-value-weights.d.ts +6 -2
- package/dist/consolidate/memory-value-weights.js +6 -2
- package/dist/consolidate/memory-value.d.ts +30 -10
- package/dist/consolidate/memory-value.js +36 -13
- package/dist/consolidate/merge.d.ts +4 -1
- package/dist/consolidate/merge.js +42 -32
- package/dist/consolidate/overlap-index.d.ts +8 -2
- package/dist/consolidate/overlap-index.js +11 -4
- package/dist/consolidate/physics-pass.d.ts +3 -1
- package/dist/consolidate/physics-pass.js +10 -7
- package/dist/consolidate/replay.d.ts +11 -4
- package/dist/consolidate/replay.js +19 -7
- package/dist/consolidate/run.d.ts +13 -5
- package/dist/consolidate/run.js +4 -4
- package/dist/consolidate/sleep.d.ts +14 -6
- package/dist/consolidate/sleep.js +41 -38
- package/dist/consolidate/trace.d.ts +7 -2
- package/dist/consolidate/trace.js +7 -2
- package/dist/consolidate/traces.js +26 -29
- package/dist/core/ablation.d.ts +9 -3
- package/dist/core/ablation.js +14 -4
- package/dist/core/active-scope.d.ts +3 -1
- package/dist/core/active-scope.js +3 -1
- package/dist/core/agent-memory-tools.d.ts +2 -0
- package/dist/core/agent-memory-tools.js +2 -0
- package/dist/core/ambient.d.ts +4 -3
- package/dist/core/ambient.js +8 -6
- package/dist/core/api-errors.d.ts +9 -3
- package/dist/core/api-errors.js +9 -3
- package/dist/core/capture-contract.d.ts +4 -1
- package/dist/core/capture-contract.js +27 -8
- package/dist/core/compare.d.ts +24 -8
- package/dist/core/compare.js +24 -8
- package/dist/core/config.d.ts +18 -9
- package/dist/core/config.js +24 -14
- package/dist/core/cosine.d.ts +4 -1
- package/dist/core/cosine.js +4 -1
- package/dist/core/handoff.d.ts +7 -2
- package/dist/core/handoff.js +4 -1
- package/dist/core/markdown.js +21 -16
- package/dist/core/memory-audit.js +14 -3
- package/dist/core/memory-quality.d.ts +12 -3
- package/dist/core/memory-quality.js +57 -21
- package/dist/core/memory.d.ts +84 -27
- package/dist/core/memory.js +73 -29
- package/dist/core/merged-row.d.ts +8 -2
- package/dist/core/merged-row.js +10 -3
- package/dist/core/package-root.d.ts +3 -1
- package/dist/core/package-root.js +3 -1
- package/dist/core/particle-refresh.d.ts +8 -0
- package/dist/core/particle-refresh.js +22 -0
- package/dist/core/physics-config.d.ts +4 -1
- package/dist/core/physics-config.js +6 -2
- package/dist/core/physics.d.ts +37 -11
- package/dist/core/physics.js +55 -20
- package/dist/core/project-identity.d.ts +34 -17
- package/dist/core/project-identity.js +33 -17
- package/dist/core/project-remote.d.ts +8 -4
- package/dist/core/project-remote.js +31 -14
- package/dist/core/recall-scope.d.ts +33 -11
- package/dist/core/recall-scope.js +42 -15
- package/dist/core/rejection-digest.d.ts +7 -0
- package/dist/core/rejection-digest.js +13 -0
- package/dist/core/salience.d.ts +3 -1
- package/dist/core/salience.js +10 -4
- package/dist/core/search-types.d.ts +15 -2
- package/dist/core/search-types.js +11 -0
- package/dist/dashboard/dashboard-actions.js +13 -2
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
- package/dist/dashboard/dashboard-snapshot.js +4 -4
- package/dist/dashboard/dashboard.js +6 -3
- package/dist/db/backup.js +2 -2
- package/dist/db/busy.d.ts +10 -3
- package/dist/db/busy.js +27 -5
- package/dist/db/connect.d.ts +10 -3
- package/dist/db/connect.js +8 -3
- package/dist/db/continuity.d.ts +1 -1
- package/dist/db/continuity.js +27 -11
- package/dist/db/meta.d.ts +4 -1
- package/dist/db/meta.js +4 -1
- package/dist/db/migrate.d.ts +10 -5
- package/dist/db/migrate.js +26 -13
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/types.d.ts +2 -1
- package/dist/db/migrations/v12.js +2 -1
- package/dist/db/migrations/v14.js +2 -1
- package/dist/db/migrations/v15.js +4 -2
- package/dist/db/migrations/v16.js +6 -3
- package/dist/db/migrations/v17.js +2 -1
- package/dist/db/migrations/v19.js +4 -2
- package/dist/db/migrations/v20.js +2 -1
- package/dist/db/migrations/v22.js +12 -6
- package/dist/db/migrations/v23.js +6 -3
- package/dist/db/migrations/v24.js +6 -3
- package/dist/db/migrations/v25.js +4 -2
- package/dist/db/migrations/v26.js +4 -2
- package/dist/db/migrations/v27.js +6 -3
- package/dist/db/migrations/v28.js +4 -2
- package/dist/db/migrations/v29.js +4 -2
- package/dist/db/migrations/v30.js +6 -3
- package/dist/db/migrations/v31.js +4 -2
- package/dist/db/migrations/v32.js +6 -3
- package/dist/db/migrations/v33.js +4 -2
- package/dist/db/migrations/v34.js +2 -1
- package/dist/db/migrations/v35.js +2 -1
- package/dist/db/migrations/v36.js +2 -1
- package/dist/db/migrations/v37.js +10 -5
- package/dist/db/migrations/v38.js +10 -5
- package/dist/db/migrations/v39.js +14 -6
- package/dist/db/migrations/v40.js +4 -2
- package/dist/db/migrations/v41.js +4 -2
- package/dist/db/migrations/v42.js +2 -1
- package/dist/db/migrations/v44.js +4 -2
- package/dist/db/migrations/v45.js +4 -2
- package/dist/db/migrations/v49.js +2 -1
- package/dist/db/migrations/v50.js +4 -2
- package/dist/db/migrations/v51.js +4 -2
- package/dist/db/migrations/v52.js +2 -1
- package/dist/db/migrations/v53.js +8 -4
- package/dist/db/migrations/v54.js +2 -1
- package/dist/db/migrations/v55.js +4 -2
- package/dist/db/migrations/v56.d.ts +3 -0
- package/dist/db/migrations/v56.js +28 -0
- package/dist/db/open.d.ts +24 -12
- package/dist/db/open.js +25 -13
- package/dist/db/physics-state.d.ts +8 -4
- package/dist/db/physics-state.js +13 -20
- package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
- package/dist/db/raw-archive-mirror-cleanup.js +6 -4
- package/dist/db/request-stores.d.ts +19 -5
- package/dist/db/request-stores.js +14 -5
- package/dist/db/tables.d.ts +2 -1
- package/dist/db/tables.js +12 -4
- package/dist/db/vector-store.d.ts +13 -4
- package/dist/db/vector-store.js +34 -14
- package/dist/db/wal-checkpointer.d.ts +2 -1
- package/dist/db/wal-checkpointer.js +19 -7
- package/dist/doctor.d.ts +4 -1
- package/dist/doctor.js +121 -39
- package/dist/embeddings/local.d.ts +8 -4
- package/dist/embeddings/local.js +9 -5
- package/dist/embeddings/provider.d.ts +19 -10
- package/dist/embeddings/provider.js +31 -17
- package/dist/embeddings/transformers.d.ts +16 -4
- package/dist/embeddings/transformers.js +32 -15
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.js +2 -1
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +1 -1
- package/dist/entry/sqlite-handles.d.ts +10 -0
- package/dist/entry/sqlite-handles.js +9 -0
- package/dist/entry/store-kit.d.ts +19 -6
- package/dist/entry/store-kit.js +6 -4
- package/dist/eval/eval-stats.d.ts +27 -8
- package/dist/eval/eval-stats.js +17 -5
- package/dist/eval/eval-suite.d.ts +3 -1
- package/dist/eval/eval-suite.js +409 -187
- package/dist/eval/eval.d.ts +8 -2
- package/dist/eval/eval.js +8 -2
- package/dist/eval/judgment.js +16 -6
- package/dist/graph/delta.d.ts +9 -42
- package/dist/graph/delta.js +17 -11
- package/dist/graph/extract.d.ts +10 -7
- package/dist/graph/extract.js +57 -25
- package/dist/graph/recall.d.ts +12 -4
- package/dist/graph/recall.js +30 -13
- package/dist/graph/stream.d.ts +18 -6
- package/dist/graph/stream.js +32 -10
- package/dist/graph/view.d.ts +19 -6
- package/dist/graph/view.js +42 -17
- package/dist/hooks/codex-session.js +2 -2
- package/dist/hooks/codex-wrapper.d.ts +3 -1
- package/dist/hooks/codex-wrapper.js +9 -4
- package/dist/hooks/copilot.d.ts +19 -5
- package/dist/hooks/copilot.js +54 -15
- package/dist/hooks/hook-blocks.d.ts +4 -1
- package/dist/hooks/hook-blocks.js +8 -3
- package/dist/hooks/json-hooks.d.ts +9 -5
- package/dist/hooks/json-hooks.js +69 -34
- package/dist/hooks/opencode.js +15 -5
- package/dist/hooks/shared.d.ts +27 -8
- package/dist/hooks/shared.js +57 -16
- package/dist/importers/core.d.ts +12 -4
- package/dist/importers/core.js +8 -7
- package/dist/importers/markdown-parse.d.ts +15 -5
- package/dist/importers/markdown-parse.js +16 -7
- package/dist/importers/markdown.js +6 -9
- package/dist/importers/sources.js +10 -23
- package/dist/importers/vault.d.ts +2 -2
- package/dist/importers/vault.js +43 -27
- package/dist/index.d.ts +32 -6
- package/dist/index.js +25 -7
- package/dist/learn/autolearn.d.ts +17 -6
- package/dist/learn/autolearn.js +53 -24
- package/dist/learn/churn-git.d.ts +4 -1
- package/dist/learn/churn-git.js +29 -5
- package/dist/learn/extract.d.ts +4 -1
- package/dist/learn/extract.js +16 -9
- package/dist/learn/forward-claim-detector.d.ts +17 -5
- package/dist/learn/forward-claim-detector.js +34 -15
- package/dist/learn/invalidation.d.ts +12 -7
- package/dist/learn/invalidation.js +56 -27
- package/dist/learn/roots.d.ts +3 -0
- package/dist/learn/roots.js +5 -0
- package/dist/mcp/admin-tools.d.ts +5 -5
- package/dist/mcp/admin-tools.js +28 -23
- package/dist/mcp/format.d.ts +1 -1
- package/dist/mcp/format.js +4 -2
- package/dist/mcp/framing.d.ts +3 -1
- package/dist/mcp/framing.js +20 -8
- package/dist/mcp/memory-tools.d.ts +3 -3
- package/dist/mcp/memory-tools.js +18 -14
- package/dist/mcp/protocol.d.ts +32 -16
- package/dist/mcp/protocol.js +12 -9
- package/dist/mcp/recall-tools.d.ts +3 -3
- package/dist/mcp/recall-tools.js +62 -74
- package/dist/mcp/request.d.ts +7 -5
- package/dist/mcp/request.js +57 -74
- package/dist/mcp/server.d.ts +3 -1
- package/dist/mcp/server.js +8 -3
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +4 -3
- package/dist/mcp/shared-gate.d.ts +3 -2
- package/dist/mcp/shared-gate.js +3 -2
- package/dist/mcp/stdio.d.ts +6 -3
- package/dist/mcp/stdio.js +52 -21
- package/dist/mcp/tool-args.d.ts +4 -1
- package/dist/mcp/tool-args.js +8 -3
- package/dist/mcp/tools.js +76 -32
- package/dist/objects/customer-notes.d.ts +12 -10
- package/dist/objects/customer-notes.js +21 -15
- package/dist/objects/decisions.d.ts +18 -10
- package/dist/objects/decisions.js +23 -17
- package/dist/objects/descriptor.js +2 -1
- package/dist/objects/fields.d.ts +4 -1
- package/dist/objects/fields.js +6 -2
- package/dist/objects/incidents.d.ts +14 -16
- package/dist/objects/incidents.js +29 -30
- package/dist/objects/lifecycle.d.ts +0 -4
- package/dist/objects/lifecycle.js +21 -24
- package/dist/objects/policies.d.ts +12 -16
- package/dist/objects/policies.js +17 -21
- package/dist/objects/processes.d.ts +16 -10
- package/dist/objects/processes.js +20 -15
- package/dist/objects/project-briefs.d.ts +13 -14
- package/dist/objects/project-briefs.js +33 -39
- package/dist/objects/skills.d.ts +10 -12
- package/dist/objects/skills.js +17 -22
- package/dist/postinstall.js +15 -7
- package/dist/predictions/planning-fallacy.d.ts +19 -6
- package/dist/predictions/planning-fallacy.js +4 -2
- package/dist/rerankers/clef.d.ts +8 -2
- package/dist/rerankers/clef.js +14 -9
- package/dist/rerankers/cross-encoder.d.ts +2 -1
- package/dist/rerankers/cross-encoder.js +9 -6
- package/dist/rerankers/index.js +2 -1
- package/dist/rerankers/jev.js +2 -1
- package/dist/rerankers/llm.d.ts +6 -2
- package/dist/rerankers/llm.js +8 -3
- package/dist/rerankers/remote.d.ts +3 -1
- package/dist/rerankers/remote.js +5 -2
- package/dist/rerankers/types.d.ts +6 -2
- package/dist/search/bm25-search.d.ts +3 -1
- package/dist/search/bm25-search.js +15 -2
- package/dist/search/boosts.js +4 -3
- package/dist/search/embed-memories.d.ts +10 -5
- package/dist/search/embed-memories.js +62 -36
- package/dist/search/engine.d.ts +4 -1
- package/dist/search/engine.js +6 -2
- package/dist/search/goal-boost.d.ts +10 -3
- package/dist/search/goal-boost.js +13 -6
- package/dist/search/hybrid-score.d.ts +4 -1
- package/dist/search/hybrid-score.js +4 -1
- package/dist/search/hybrid.d.ts +23 -8
- package/dist/search/hybrid.js +12 -7
- package/dist/search/multihop.js +14 -13
- package/dist/search/path-context.d.ts +10 -3
- package/dist/search/path-context.js +10 -3
- package/dist/search/physics-search.d.ts +9 -4
- package/dist/search/physics-search.js +38 -14
- package/dist/search/rerank.d.ts +2 -1
- package/dist/search/rerank.js +2 -1
- package/dist/search/rrf.d.ts +14 -5
- package/dist/search/rrf.js +11 -4
- package/dist/search/vector.d.ts +8 -2
- package/dist/search/vector.js +9 -3
- package/dist/server/auth.d.ts +18 -14
- package/dist/server/auth.js +69 -38
- package/dist/server/boot.d.ts +3 -1
- package/dist/server/boot.js +95 -56
- package/dist/server/client-ip.d.ts +11 -4
- package/dist/server/client-ip.js +27 -10
- package/dist/server/cursor.d.ts +10 -3
- package/dist/server/cursor.js +10 -3
- package/dist/server/deadline.d.ts +5 -2
- package/dist/server/deadline.js +10 -3
- package/dist/server/key-check-bounds.js +12 -4
- package/dist/server/lifecycle.d.ts +4 -1
- package/dist/server/lifecycle.js +10 -4
- package/dist/server/mcp-http.d.ts +2 -1
- package/dist/server/mcp-http.js +37 -22
- package/dist/server/rate-limit.d.ts +17 -5
- package/dist/server/rate-limit.js +55 -26
- package/dist/server/ready.js +7 -4
- package/dist/server/request.d.ts +15 -4
- package/dist/server/request.js +42 -15
- package/dist/server/route-checks.d.ts +4 -1
- package/dist/server/route-checks.js +8 -3
- package/dist/server/route-table.d.ts +8 -6
- package/dist/server/route-table.js +547 -93
- package/dist/server/routes/admin.d.ts +7 -7
- package/dist/server/routes/admin.js +36 -15
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +5 -4
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +12 -6
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +10 -4
- package/dist/server/routes/memories.d.ts +8 -8
- package/dist/server/routes/memories.js +12 -19
- package/dist/server/routes/object-routes.d.ts +8 -5
- package/dist/server/routes/object-routes.js +4 -2
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +11 -4
- package/dist/server/routes/predictions.d.ts +5 -5
- package/dist/server/routes/predictions.js +9 -4
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +15 -6
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +3 -2
- package/dist/server/routes/recall.d.ts +3 -3
- package/dist/server/routes/recall.js +21 -10
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +12 -4
- package/dist/server/server-detect.d.ts +24 -8
- package/dist/server/server-detect.js +57 -22
- package/dist/server/sleep-child.js +16 -10
- package/dist/server/sleep-offload.d.ts +8 -5
- package/dist/server/sleep-offload.js +41 -19
- package/dist/server/tls.d.ts +4 -1
- package/dist/server/tls.js +13 -5
- package/dist/server/types.d.ts +38 -26
- package/dist/server/validation.d.ts +4 -1
- package/dist/server/validation.js +22 -9
- package/dist/server.d.ts +15 -10
- package/dist/server.js +32 -12
- package/dist/sharing/global-store.d.ts +5 -10
- package/dist/sharing/global-store.js +8 -43
- package/dist/sharing/global-sync.d.ts +3 -1
- package/dist/sharing/global-sync.js +16 -6
- package/dist/sharing/project-merge.d.ts +25 -7
- package/dist/sharing/project-merge.js +49 -17
- package/dist/sharing/search-both.d.ts +8 -4
- package/dist/sharing/search-both.js +19 -12
- package/dist/sharing/share.d.ts +8 -4
- package/dist/sharing/share.js +39 -15
- package/dist/store/ambient.js +9 -5
- package/dist/store/audit-event.d.ts +2 -2
- package/dist/store/audit-event.js +8 -3
- package/dist/store/audit.d.ts +6 -3
- package/dist/store/audit.js +16 -6
- package/dist/store/auth.d.ts +4 -2
- package/dist/store/auth.js +63 -20
- package/dist/store/busy.d.ts +9 -0
- package/dist/store/busy.js +16 -0
- package/dist/store/candidates.d.ts +12 -5
- package/dist/store/candidates.js +75 -36
- package/dist/store/capture-write.d.ts +2 -1
- package/dist/store/capture-write.js +2 -1
- package/dist/store/card-detail.d.ts +4 -4
- package/dist/store/card-detail.js +15 -8
- package/dist/store/cards.d.ts +24 -10
- package/dist/store/cards.js +93 -60
- package/dist/store/compaction-caller.d.ts +2 -1
- package/dist/store/compaction-caller.js +2 -1
- package/dist/store/compactions-record.d.ts +14 -8
- package/dist/store/compactions-record.js +95 -32
- package/dist/store/compactions.js +35 -15
- package/dist/store/conflicts.d.ts +9 -4
- package/dist/store/conflicts.js +100 -45
- package/dist/store/connectors/dlq.d.ts +17 -5
- package/dist/store/connectors/dlq.js +56 -5
- package/dist/store/connectors/event-log.d.ts +111 -2
- package/dist/store/connectors/event-log.js +2 -1
- package/dist/store/connectors/github.d.ts +6 -3
- package/dist/store/connectors/github.js +24 -40
- package/dist/store/connectors/slack.d.ts +2 -1
- package/dist/store/connectors/slack.js +25 -37
- package/dist/store/dashboard-reads.d.ts +7 -3
- package/dist/store/dashboard-reads.js +32 -11
- package/dist/store/delete-and-batch.d.ts +17 -11
- package/dist/store/delete-and-batch.js +67 -26
- package/dist/store/delivery-recorder.d.ts +8 -5
- package/dist/store/delivery-recorder.js +70 -32
- package/dist/store/descendant-page.d.ts +2 -1
- package/dist/store/descendant-page.js +24 -9
- package/dist/store/diagnostics.d.ts +2 -1
- package/dist/store/diagnostics.js +2 -1
- package/dist/store/doctor-reads.d.ts +2 -1
- package/dist/store/doctor-reads.js +13 -5
- package/dist/store/dormant.d.ts +19 -11
- package/dist/store/dormant.js +40 -18
- package/dist/store/embeddings/index.d.ts +13 -9
- package/dist/store/embeddings/index.js +19 -12
- package/dist/store/entry-reads.d.ts +49 -20
- package/dist/store/entry-reads.js +181 -66
- package/dist/store/entry-row.d.ts +10 -6
- package/dist/store/entry-row.js +17 -12
- package/dist/store/entry-writes.d.ts +22 -10
- package/dist/store/entry-writes.js +41 -14
- package/dist/store/failure-log-at.js +1 -1
- package/dist/store/failure-log.d.ts +4 -2
- package/dist/store/failure-log.js +13 -6
- package/dist/store/gated-write.d.ts +3 -3
- package/dist/store/gated-write.js +3 -3
- package/dist/store/goals.d.ts +5 -4
- package/dist/store/goals.js +8 -10
- package/dist/store/graph-apply.d.ts +21 -0
- package/dist/{graph/write.js → store/graph-apply.js} +31 -11
- package/dist/store/graph-queue.d.ts +9 -6
- package/dist/store/graph-queue.js +15 -10
- package/dist/store/graph-reads.d.ts +16 -11
- package/dist/store/graph-reads.js +24 -15
- package/dist/store/graph-rows.d.ts +41 -3
- package/dist/store/graph-rows.js +10 -7
- package/dist/store/graph-view-rows.js +14 -7
- package/dist/store/graph-writes.d.ts +16 -10
- package/dist/store/graph-writes.js +59 -36
- package/dist/store/handoffs.d.ts +4 -4
- package/dist/store/handoffs.js +40 -19
- package/dist/store/index-and-stats.d.ts +2 -2
- package/dist/store/index-and-stats.js +6 -5
- package/dist/store/index.d.ts +3 -1
- package/dist/store/index.js +1 -0
- package/dist/store/key-audit.d.ts +2 -1
- package/dist/store/key-audit.js +2 -1
- package/dist/store/key-writes.d.ts +2 -1
- package/dist/store/key-writes.js +9 -2
- package/dist/store/ledger-turn.d.ts +4 -1
- package/dist/store/ledger-turn.js +7 -2
- package/dist/store/mirrors.d.ts +11 -4
- package/dist/store/mirrors.js +88 -16
- package/dist/store/narrow.d.ts +6 -0
- package/dist/store/narrow.js +11 -0
- package/dist/store/open.d.ts +4 -2
- package/dist/store/open.js +18 -9
- package/dist/store/pilot-arm.d.ts +2 -1
- package/dist/store/pilot-arm.js +18 -6
- package/dist/store/planning-fallacy-evidence.d.ts +2 -2
- package/dist/store/planning-fallacy-evidence.js +8 -5
- package/dist/store/port/agent-import.d.ts +62 -0
- package/dist/store/port/agent-import.js +2 -0
- package/dist/store/port/consolidation.d.ts +129 -0
- package/dist/store/port/consolidation.js +2 -0
- package/dist/store/port/learning.d.ts +19 -0
- package/dist/store/port/learning.js +2 -0
- package/dist/store/port/local-files.d.ts +18 -0
- package/dist/store/port/local-files.js +2 -0
- package/dist/store/port/promotion.d.ts +20 -0
- package/dist/store/port/promotion.js +3 -0
- package/dist/store/port-groups.d.ts +160 -0
- package/dist/store/port-groups.js +2 -0
- package/dist/store/port.d.ts +215 -229
- package/dist/store/port.js +3 -9
- package/dist/store/predictions.d.ts +14 -10
- package/dist/store/predictions.js +37 -17
- package/dist/store/project-tags.d.ts +4 -1
- package/dist/store/project-tags.js +16 -5
- package/dist/store/quality-repair.d.ts +8 -4
- package/dist/store/quality-repair.js +53 -20
- package/dist/store/quarantine.d.ts +1 -0
- package/dist/store/quarantine.js +23 -9
- package/dist/store/raw-archive.d.ts +5 -4
- package/dist/store/raw-archive.js +11 -10
- package/dist/store/recall-trace.d.ts +22 -17
- package/dist/store/recall-trace.js +126 -63
- package/dist/store/rejected-values.d.ts +15 -10
- package/dist/store/rejected-values.js +33 -12
- package/dist/store/rejection.d.ts +12 -11
- package/dist/store/rejection.js +18 -19
- package/dist/store/report-reads.d.ts +2 -1
- package/dist/store/report-reads.js +2 -1
- package/dist/store/rows.d.ts +7 -5
- package/dist/store/rows.js +18 -11
- package/dist/store/rule-sql.d.ts +6 -4
- package/dist/store/rule-sql.js +16 -9
- package/dist/store/search-rows.d.ts +14 -9
- package/dist/store/search-rows.js +48 -23
- package/dist/store/sessions.d.ts +12 -10
- package/dist/store/sessions.js +40 -21
- package/dist/store/set-aside.d.ts +2 -2
- package/dist/store/set-aside.js +18 -5
- package/dist/store/sqlite/agent-import.d.ts +3 -0
- package/dist/store/sqlite/agent-import.js +77 -0
- package/dist/store/sqlite/cards-group.d.ts +6 -0
- package/dist/store/sqlite/cards-group.js +37 -0
- package/dist/store/sqlite/conflicts-group.d.ts +6 -0
- package/dist/store/sqlite/conflicts-group.js +18 -0
- package/dist/store/sqlite/connector-events-group.d.ts +2 -1
- package/dist/store/sqlite/connector-events-group.js +17 -6
- package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
- package/dist/store/sqlite/connector-writes-group.js +9 -4
- package/dist/store/sqlite/consolidation-group.d.ts +4 -0
- package/dist/store/sqlite/consolidation-group.js +64 -0
- package/dist/store/sqlite/dag-reads-group.js +1 -1
- package/dist/store/sqlite/dormant-group.d.ts +6 -0
- package/dist/store/sqlite/dormant-group.js +29 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +6 -3
- package/dist/store/sqlite/entry-writes-group.js +37 -14
- package/dist/store/sqlite/error-codec.d.ts +4 -2
- package/dist/store/sqlite/error-codec.js +32 -10
- package/dist/store/sqlite/executor-counts.js +2 -1
- package/dist/store/sqlite/executor.d.ts +8 -3
- package/dist/store/sqlite/executor.js +56 -18
- package/dist/store/sqlite/global-promote.d.ts +5 -0
- package/dist/store/sqlite/global-promote.js +48 -0
- package/dist/store/sqlite/goals-group.d.ts +6 -0
- package/dist/store/sqlite/goals-group.js +23 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
- package/dist/store/sqlite/graph-reads-group.js +2 -1
- package/dist/store/sqlite/held-connection.d.ts +7 -1
- package/dist/store/sqlite/held-connection.js +34 -7
- package/dist/store/sqlite/last-recall-group.d.ts +4 -2
- package/dist/store/sqlite/last-recall-group.js +9 -4
- package/dist/store/sqlite/learning-group.d.ts +4 -0
- package/dist/store/sqlite/learning-group.js +17 -0
- package/dist/store/sqlite/maintenance-groups.js +2 -1
- package/dist/store/sqlite/object-rows.d.ts +6 -3
- package/dist/store/sqlite/object-rows.js +34 -5
- package/dist/store/sqlite/objects-group.d.ts +5 -4
- package/dist/store/sqlite/objects-group.js +84 -33
- package/dist/store/sqlite/predictions-group.d.ts +2 -1
- package/dist/store/sqlite/predictions-group.js +4 -2
- package/dist/store/sqlite/promotion-group.d.ts +3 -0
- package/dist/store/sqlite/promotion-group.js +10 -0
- package/dist/store/sqlite/quarantine-group.d.ts +2 -1
- package/dist/store/sqlite/quarantine-group.js +4 -2
- package/dist/store/sqlite/reports-group.d.ts +6 -0
- package/dist/store/sqlite/reports-group.js +33 -0
- package/dist/store/sqlite/request-scope.d.ts +6 -0
- package/dist/store/sqlite/request-scope.js +18 -0
- package/dist/store/sqlite/sessions-group.d.ts +6 -0
- package/dist/store/sqlite/sessions-group.js +46 -0
- package/dist/store/sqlite/store.d.ts +22 -11
- package/dist/store/sqlite/store.js +84 -11
- package/dist/store/sqlite/vector-pack.js +2 -1
- package/dist/store/sqlite/vector-reads-group.js +2 -1
- package/dist/store/sqlite/worker-jobs.d.ts +2 -1
- package/dist/store/sqlite/worker-jobs.js +19 -7
- package/dist/store/sqlite/worker-ops.d.ts +10 -5
- package/dist/store/sqlite/worker-ops.js +6 -3
- package/dist/store/sqlite/worker-store.d.ts +4 -3
- package/dist/store/sqlite/worker-store.js +24 -14
- package/dist/store/summaries.d.ts +19 -12
- package/dist/store/summaries.js +36 -21
- package/dist/store/summary-dirty.d.ts +2 -1
- package/dist/store/summary-dirty.js +2 -1
- package/dist/store/tenant.d.ts +3 -2
- package/dist/store/tenant.js +5 -4
- package/dist/store/token-ledger-rows.js +6 -3
- package/dist/store/token-ledger.d.ts +19 -13
- package/dist/store/token-ledger.js +27 -14
- package/dist/store/tombstone-checks.d.ts +4 -1
- package/dist/store/tombstone-checks.js +10 -1
- package/dist/store/usage-reports.js +2 -1
- package/dist/store/vector-index.d.ts +8 -5
- package/dist/store/vector-index.js +24 -10
- package/dist/store/working-memory.d.ts +6 -4
- package/dist/store/working-memory.js +14 -9
- package/dist/support-bundle.js +10 -5
- package/dist/trust/quarantine.d.ts +1 -2
- package/dist/trust/quarantine.js +1 -5
- package/dist/trust/reject-flow.d.ts +12 -3
- package/dist/trust/reject-flow.js +12 -4
- package/dist/util/anthropic-messages.d.ts +4 -1
- package/dist/util/anthropic-messages.js +14 -5
- package/dist/util/atomic-write.d.ts +4 -2
- package/dist/util/atomic-write.js +25 -14
- package/dist/util/compaction-items.d.ts +4 -1
- package/dist/util/compaction-items.js +8 -2
- package/dist/util/crash-handlers.d.ts +7 -2
- package/dist/util/crash-handlers.js +13 -4
- package/dist/util/env.d.ts +16 -4
- package/dist/util/env.js +78 -25
- package/dist/util/home-path.js +12 -6
- package/dist/util/hook-payload.d.ts +3 -1
- package/dist/util/hook-payload.js +3 -1
- package/dist/util/http-retry.d.ts +12 -6
- package/dist/util/http-retry.js +16 -6
- package/dist/util/http-util.d.ts +20 -5
- package/dist/util/http-util.js +28 -9
- package/dist/util/json.d.ts +4 -1
- package/dist/util/json.js +4 -1
- package/dist/util/keyset.js +2 -1
- package/dist/util/limits.js +4 -2
- package/dist/util/log.d.ts +13 -5
- package/dist/util/log.js +29 -6
- package/dist/util/net.d.ts +5 -0
- package/dist/util/net.js +19 -0
- package/dist/util/real-path.d.ts +2 -1
- package/dist/util/real-path.js +4 -3
- package/dist/util/request-scope.d.ts +11 -3
- package/dist/util/request-scope.js +13 -4
- package/dist/util/same-text.d.ts +10 -3
- package/dist/util/same-text.js +10 -3
- package/dist/util/secret-detect.d.ts +24 -7
- package/dist/util/secret-detect.js +49 -14
- package/dist/util/spawn-argv.d.ts +3 -1
- package/dist/util/spawn-argv.js +13 -4
- package/dist/util/sqlite-blocked.d.ts +15 -4
- package/dist/util/sqlite-blocked.js +19 -6
- package/dist/util/stored-json.d.ts +4 -1
- package/dist/util/stored-json.js +6 -2
- package/dist/util/stream-tee.d.ts +2 -1
- package/dist/util/stream-tee.js +8 -5
- package/dist/util/transcript-tail.d.ts +4 -1
- package/dist/util/transcript-tail.js +4 -1
- package/dist/util/version.d.ts +8 -3
- package/dist/util/version.js +8 -3
- package/dist/util/write-budget.d.ts +7 -2
- package/dist/util/write-budget.js +5 -2
- package/dist/util/yaml.d.ts +4 -1
- package/dist/util/yaml.js +4 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -1
- package/scripts/postinstall.cjs +3 -1
- package/dist/api/cards.d.ts +0 -42
- package/dist/api/conflicts.d.ts +0 -28
- package/dist/api/conflicts.js +0 -61
- package/dist/api/dormant.d.ts +0 -14
- package/dist/api/dormant.js +0 -58
- package/dist/api/goals.d.ts +0 -18
- package/dist/api/graph.d.ts +0 -8
- package/dist/api/graph.js +0 -8
- package/dist/api/learn.js +0 -125
- package/dist/api/memories.d.ts +0 -25
- package/dist/api/objects.d.ts +0 -9
- package/dist/api/outcome.d.ts +0 -19
- package/dist/api/predictions.d.ts +0 -11
- package/dist/api/promote.d.ts +0 -36
- package/dist/api/recall-core.d.ts +0 -4
- package/dist/api/recall-core.js +0 -125
- package/dist/api/recall-finish.d.ts +0 -53
- package/dist/api/recall-finish.js +0 -30
- package/dist/api/recall-history.d.ts +0 -64
- package/dist/api/recall-history.js +0 -159
- package/dist/api/recall-record.d.ts +0 -43
- package/dist/api/recall-record.js +0 -78
- package/dist/api/recall-request.js +0 -121
- package/dist/api/recall.d.ts +0 -6
- package/dist/api/refine.d.ts +0 -7
- package/dist/api/refine.js +0 -10
- package/dist/api/session-owners.d.ts +0 -4
- package/dist/api/session-owners.js +0 -17
- package/dist/api/sleep-run.d.ts +0 -26
- package/dist/api/sleep.js +0 -11
- package/dist/graph/write.d.ts +0 -14
- package/dist/store/sqlite/busy.d.ts +0 -3
- package/dist/store/sqlite/busy.js +0 -8
- package/dist/store/sqlite/local.d.ts +0 -4
- package/dist/store/sqlite/local.js +0 -8
|
@@ -5,12 +5,16 @@ import { isJsonObject, isJsonString } from '../../util/json.js';
|
|
|
5
5
|
/** Build a SlackHistoryFetcher that pages `conversations.history` over HTTP via `fetchWithRetry` (429 and 5xx handled).
|
|
6
6
|
* Slack omits `channel` from history messages, so the request channel id is stamped onto each one for ingest. */
|
|
7
7
|
const SLACK_TIMEOUT_MS = 30_000;
|
|
8
|
-
// A page is at most 200 messages, each up to 40,000 characters at 4 bytes, carried once as text and once as rich-text
|
|
8
|
+
// A page is at most 200 messages, each up to 40,000 characters at 4 bytes, carried once as text and once as rich-text
|
|
9
|
+
// blocks.
|
|
9
10
|
const SLACK_MAX_REPLY_BYTES = 64 * 1024 * 1024;
|
|
10
11
|
function isSlackMessage(m) {
|
|
11
12
|
return isJsonObject(m) && m.type === 'message' && isJsonString(m.ts);
|
|
12
13
|
}
|
|
13
|
-
/**
|
|
14
|
+
/**
|
|
15
|
+
* The reply as a JSON object. The error names the status and the path only, since the query string carries channel ids
|
|
16
|
+
* and cursors.
|
|
17
|
+
*/
|
|
14
18
|
async function readHistoryReply(r, url) {
|
|
15
19
|
const where = `slack: HTTP ${r.status} on ${url.pathname}`;
|
|
16
20
|
let body;
|
|
@@ -22,8 +26,9 @@ async function readHistoryReply(r, url) {
|
|
|
22
26
|
}
|
|
23
27
|
if (!isJsonObject(body))
|
|
24
28
|
throw new Error(`${where}: the reply is not a JSON object`);
|
|
25
|
-
if (body.messages !== undefined && !Array.isArray(body.messages))
|
|
29
|
+
if (body.messages !== undefined && !Array.isArray(body.messages)) {
|
|
26
30
|
throw new Error(`${where}: \`messages\` is not an array`);
|
|
31
|
+
}
|
|
27
32
|
return body;
|
|
28
33
|
}
|
|
29
34
|
export function slackHistoryFetcher(token, fetchImpl) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ConnectorStore } from '../store.js';
|
|
2
2
|
import { type WebhookRequest } from '../../util/http-util.js';
|
|
3
|
-
/** Slack Events API webhook: HMAC over the raw body with SLACK_SIGNING_SECRET, no Bearer (its route row declares
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
export declare function handleSlackEventsWebhook(request: WebhookRequest, store
|
|
3
|
+
/** Slack Events API webhook: HMAC over the raw body with SLACK_SIGNING_SECRET, no Bearer (its route row declares
|
|
4
|
+
* webhook-signature); malformed payloads go to slack_dlq, ACK 200. 404 (not 503) when the secret is unset, so a probe
|
|
5
|
+
* cannot tell a gated-off route from a missing one. */
|
|
6
|
+
export declare function handleSlackEventsWebhook(request: WebhookRequest, store: ConnectorStore): Promise<void>;
|
|
7
7
|
//# sourceMappingURL=webhook.d.ts.map
|
|
@@ -7,11 +7,11 @@ import { parkInDlq } from '../dlq.js';
|
|
|
7
7
|
import { slackDlq } from './dlq.js';
|
|
8
8
|
import { resolveTenantForSlackTeam } from './tenant-routing.js';
|
|
9
9
|
import { resolveTenantId } from '../../store/tenant.js';
|
|
10
|
-
import { HttpError, JSON_HEADERS, isHeaderString, closeIfBodyUnread, readWebhookBody, sendJson } from '../../util/http-util.js';
|
|
10
|
+
import { HttpError, JSON_HEADERS, isHeaderString, closeIfBodyUnread, readWebhookBody, sendJson, } from '../../util/http-util.js';
|
|
11
11
|
import { isJsonObject } from '../../util/json.js';
|
|
12
|
-
/** Slack Events API webhook: HMAC over the raw body with SLACK_SIGNING_SECRET, no Bearer (its route row declares
|
|
13
|
-
*
|
|
14
|
-
*
|
|
12
|
+
/** Slack Events API webhook: HMAC over the raw body with SLACK_SIGNING_SECRET, no Bearer (its route row declares
|
|
13
|
+
* webhook-signature); malformed payloads go to slack_dlq, ACK 200. 404 (not 503) when the secret is unset, so a probe
|
|
14
|
+
* cannot tell a gated-off route from a missing one. */
|
|
15
15
|
export async function handleSlackEventsWebhook(request, store) {
|
|
16
16
|
const { req, res, opts } = request;
|
|
17
17
|
// Secret and headers before the body, so a caller with neither cannot make the server buffer one.
|
|
@@ -41,7 +41,14 @@ export async function handleSlackEventsWebhook(request, store) {
|
|
|
41
41
|
})) {
|
|
42
42
|
throw new HttpError(401, 'invalid Slack signature');
|
|
43
43
|
}
|
|
44
|
-
await routeSignedSlackPayload({
|
|
44
|
+
await routeSignedSlackPayload({
|
|
45
|
+
hippoRoot: opts.hippoRoot,
|
|
46
|
+
store,
|
|
47
|
+
res,
|
|
48
|
+
rawBody,
|
|
49
|
+
signature: sigStr,
|
|
50
|
+
slackTimestamp: tsStr,
|
|
51
|
+
});
|
|
45
52
|
}
|
|
46
53
|
async function parkAndAck(d, park) {
|
|
47
54
|
const row = {
|
|
@@ -53,7 +60,7 @@ async function parkAndAck(d, park) {
|
|
|
53
60
|
signature: d.signature,
|
|
54
61
|
slackTimestamp: d.slackTimestamp,
|
|
55
62
|
};
|
|
56
|
-
await parkInDlq(slackDlq, d.
|
|
63
|
+
await parkInDlq(slackDlq, d.store, row);
|
|
57
64
|
sendJson(d.res, 200, { ok: true, status: 'dlq' });
|
|
58
65
|
}
|
|
59
66
|
function teamIdInRawBody(rawBody) {
|
|
@@ -88,11 +95,11 @@ async function routeSignedSlackPayload(d) {
|
|
|
88
95
|
}
|
|
89
96
|
if (answerUrlVerification(res, body))
|
|
90
97
|
return;
|
|
91
|
-
// Fail closed: resolveTenantForSlackTeam returns null for an unknown team on a non-empty slack_workspaces; park it in
|
|
92
|
-
// and still ACKs 200 so Slack stops retrying; never call ingest.
|
|
98
|
+
// Fail closed: resolveTenantForSlackTeam returns null for an unknown team on a non-empty slack_workspaces; park it in
|
|
99
|
+
// slack_dlq (bucket='unroutable') and still ACKs 200 so Slack stops retrying; never call ingest.
|
|
93
100
|
let resolvedTenant = null;
|
|
94
101
|
if (body !== undefined && isSlackEventEnvelope(body)) {
|
|
95
|
-
resolvedTenant = await resolveTenantForSlackTeam(d.
|
|
102
|
+
resolvedTenant = await resolveTenantForSlackTeam(d.store, body.team_id);
|
|
96
103
|
if (resolvedTenant === null) {
|
|
97
104
|
await parkAndAck(d, {
|
|
98
105
|
tenantId: null, // unroutable - stored as '__unroutable__'
|
|
@@ -127,7 +134,7 @@ async function routeSignedSlackPayload(d) {
|
|
|
127
134
|
async function parkUnparseable(d, teamIdFromRaw) {
|
|
128
135
|
// Attribute the parse failure to the originating workspace via the regex-extracted
|
|
129
136
|
// team_id; a null or unknown team writes tenantId=null, which lands as '__unroutable__'.
|
|
130
|
-
const parseFailTenant = teamIdFromRaw !== null ? await resolveTenantForSlackTeam(d.
|
|
137
|
+
const parseFailTenant = teamIdFromRaw !== null ? await resolveTenantForSlackTeam(d.store, teamIdFromRaw) : null;
|
|
131
138
|
await parkAndAck(d, {
|
|
132
139
|
tenantId: parseFailTenant, // null → '__unroutable__' sentinel
|
|
133
140
|
teamId: teamIdFromRaw,
|
|
@@ -151,7 +158,8 @@ async function dispatchSlackEvent(d, ctx, body) {
|
|
|
151
158
|
}
|
|
152
159
|
const r = await ingestMessage(ctx, {
|
|
153
160
|
teamId: body.team_id,
|
|
154
|
-
// Channel privacy is not on the inner event, so channel_type is the proxy: 'group'|'im'|'mpim' private, 'channel'
|
|
161
|
+
// Channel privacy is not on the inner event, so channel_type is the proxy: 'group'|'im'|'mpim' private, 'channel'
|
|
162
|
+
// public, unknown private.
|
|
155
163
|
channel: {
|
|
156
164
|
id: inner.channel,
|
|
157
165
|
is_private: inner.channel_type !== 'channel',
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
1
|
+
/**
|
|
2
|
+
* Slack workspace registration helpers: the `slack_workspaces` table maps `team_id` to `tenant_id` (empty =
|
|
3
|
+
* single-tenant, non-empty = fail-closed routing).
|
|
4
|
+
* `add` is an upsert that overwrites an existing team_id's tenant on purpose, so moving a workspace needs no
|
|
5
|
+
* delete+add.
|
|
6
|
+
*/
|
|
3
7
|
import { type SlackWorkspace } from '../../store/connectors/slack.js';
|
|
4
8
|
export type { SlackWorkspace };
|
|
5
|
-
export { listSlackWorkspaces as listWorkspaces, removeSlackWorkspace as removeWorkspace } from '../../store/connectors/slack.js';
|
|
9
|
+
export { listSlackWorkspaces as listWorkspaces, removeSlackWorkspace as removeWorkspace, } from '../../store/connectors/slack.js';
|
|
6
10
|
export interface AddWorkspaceOpts {
|
|
7
11
|
teamId: string;
|
|
8
12
|
tenantId: string;
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
1
|
+
/**
|
|
2
|
+
* Slack workspace registration helpers: the `slack_workspaces` table maps `team_id` to `tenant_id` (empty =
|
|
3
|
+
* single-tenant, non-empty = fail-closed routing).
|
|
4
|
+
* `add` is an upsert that overwrites an existing team_id's tenant on purpose, so moving a workspace needs no
|
|
5
|
+
* delete+add.
|
|
6
|
+
*/
|
|
3
7
|
import { upsertSlackWorkspace } from '../../store/connectors/slack.js';
|
|
4
|
-
export { listSlackWorkspaces as listWorkspaces, removeSlackWorkspace as removeWorkspace } from '../../store/connectors/slack.js';
|
|
8
|
+
export { listSlackWorkspaces as listWorkspaces, removeSlackWorkspace as removeWorkspace, } from '../../store/connectors/slack.js';
|
|
5
9
|
/** Register or re-register a Slack team → tenant mapping. Upserts on
|
|
6
10
|
* team_id conflict (operators move workspaces between tenants). */
|
|
7
11
|
export function addWorkspace(hippoRoot, opts) {
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ContextWith } from '../api/index.js';
|
|
2
|
+
import type { StoreWith } from '../store/index.js';
|
|
3
|
+
/** The groups a connector delivery writes through; the webhook gate proves all three before any delivery runs. */
|
|
4
|
+
type ConnectorGroup = 'entryWrites' | 'connectorWrites' | 'connectorEvents';
|
|
5
|
+
export type ConnectorStore = StoreWith<ConnectorGroup>;
|
|
6
|
+
export type ConnectorContext = ContextWith<ConnectorGroup>;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -3,7 +3,8 @@ import { jaccardMinShared, overlapPartners } from './overlap-index.js';
|
|
|
3
3
|
import { isQuarantineScope } from '../trust/quarantine.js';
|
|
4
4
|
import { isPersonalScope } from '../core/recall-scope.js';
|
|
5
5
|
import { DECAY_THRESHOLD } from './decay.js';
|
|
6
|
-
// Gate contradictions on content overlap, not shared tags (`feedback`/`policy` are too coarse). The Jaccard threshold
|
|
6
|
+
// Gate contradictions on content overlap, not shared tags (`feedback`/`policy` are too coarse). The Jaccard threshold
|
|
7
|
+
// on stopword-filtered tokens
|
|
7
8
|
// only applies after a polarity signal, so it filters drive-by topic similarity, not semantic drift.
|
|
8
9
|
const CONFLICT_OVERLAP_THRESHOLD = 0.5;
|
|
9
10
|
// Minimum distinctive shared tokens before we trust an overlap score. Filters
|
|
@@ -45,8 +46,9 @@ rescuedIds = new Set()) {
|
|
|
45
46
|
continue;
|
|
46
47
|
if (!recalledTogether(survivors[i], survivors[j]))
|
|
47
48
|
continue;
|
|
48
|
-
if ([survivors[i], survivors[j]].some((e) => e.tags.includes('extracted') || e.tags.includes('session-digest')))
|
|
49
|
+
if ([survivors[i], survivors[j]].some((e) => e.tags.includes('extracted') || e.tags.includes('session-digest'))) {
|
|
49
50
|
continue;
|
|
51
|
+
}
|
|
50
52
|
const reasonAndScore = describeConflict(profiles[i], profiles[j]);
|
|
51
53
|
if (!reasonAndScore)
|
|
52
54
|
continue;
|
|
@@ -60,7 +62,10 @@ rescuedIds = new Set()) {
|
|
|
60
62
|
}
|
|
61
63
|
return detected;
|
|
62
64
|
}
|
|
63
|
-
/**
|
|
65
|
+
/**
|
|
66
|
+
* One project's ambient context can show both: same tenant, and the same project or a user-global row beside a
|
|
67
|
+
* project's.
|
|
68
|
+
*/
|
|
64
69
|
function recalledTogether(a, b) {
|
|
65
70
|
// A personal row pairs only inside its own scope; any other pair shows its id to someone else.
|
|
66
71
|
if ((isPersonalScope(a.scope) || isPersonalScope(b.scope)) && a.scope !== b.scope)
|
|
@@ -72,9 +77,14 @@ function recalledTogether(a, b) {
|
|
|
72
77
|
}
|
|
73
78
|
function conflictProfile(text) {
|
|
74
79
|
const opening = openingWindow(text);
|
|
75
|
-
// Polarity is measured only in the first POLARITY_WINDOW_WORDS, so a stray negation deep in a prose memory doesn't
|
|
80
|
+
// Polarity is measured only in the first POLARITY_WINDOW_WORDS, so a stray negation deep in a prose memory doesn't
|
|
81
|
+
// flip the intent.
|
|
76
82
|
// Pad with spaces so space-delimited patterns match words at the start/end.
|
|
77
|
-
return {
|
|
83
|
+
return {
|
|
84
|
+
distinct: distinctiveTokens(text),
|
|
85
|
+
polarity: inferConflictPolarity(opening),
|
|
86
|
+
window: ' ' + opening.toLowerCase() + ' ',
|
|
87
|
+
};
|
|
78
88
|
}
|
|
79
89
|
function describeConflict(a, b) {
|
|
80
90
|
// Jaccard on stopword-stripped tokens. Defer the threshold check until we
|
|
@@ -122,20 +132,24 @@ function openingWindow(text) {
|
|
|
122
132
|
}
|
|
123
133
|
// Takes opening windows only, so " on " and " off " as prepositions deep in long prose don't read as enabled/disabled.
|
|
124
134
|
function classifyConflictType(a, b, aPolarity, bPolarity) {
|
|
125
|
-
// Whole-word boundaries so " on " alone doesn't match "on/off"; pair only `enabled` <-> `disabled` and explicit
|
|
135
|
+
// Whole-word boundaries so " on " alone doesn't match "on/off"; pair only `enabled` <-> `disabled` and explicit
|
|
136
|
+
// on/off in imperative context.
|
|
126
137
|
const enabledDisabled = (containsAny(a, [' enabled ', ' enable ']) && containsAny(b, [' disabled ', ' disable ']))
|
|
127
138
|
|| (containsAny(b, [' enabled ', ' enable ']) && containsAny(a, [' disabled ', ' disable ']));
|
|
128
139
|
if (enabledDisabled)
|
|
129
140
|
return 'enabled/disabled mismatch on overlapping statement';
|
|
130
|
-
const trueFalse = (containsAny(a, [' true ', ' true.', ' true,', ' yes ']) &&
|
|
131
|
-
|
|
141
|
+
const trueFalse = (containsAny(a, [' true ', ' true.', ' true,', ' yes ']) &&
|
|
142
|
+
containsAny(b, [' false ', ' false.', ' false,', ' no '])) ||
|
|
143
|
+
(containsAny(b, [' true ', ' true.', ' true,', ' yes ']) &&
|
|
144
|
+
containsAny(a, [' false ', ' false.', ' false,', ' no ']));
|
|
132
145
|
if (trueFalse)
|
|
133
146
|
return 'true/false mismatch on overlapping statement';
|
|
134
147
|
const alwaysNever = (containsAny(a, [' always ', ' must ']) && containsAny(b, [' never ', ' must not ']))
|
|
135
148
|
|| (containsAny(b, [' always ', ' must ']) && containsAny(a, [' never ', ' must not ']));
|
|
136
149
|
if (alwaysNever)
|
|
137
150
|
return 'always/never mismatch on overlapping statement';
|
|
138
|
-
if ((aPolarity === 'positive' && bPolarity === 'negative') ||
|
|
151
|
+
if ((aPolarity === 'positive' && bPolarity === 'negative') ||
|
|
152
|
+
(aPolarity === 'negative' && bPolarity === 'positive')) {
|
|
139
153
|
return 'negation polarity mismatch on overlapping statement';
|
|
140
154
|
}
|
|
141
155
|
return null;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
// The one LLM call behind every DAG summary, kept apart from the graph writes so its request bytes are tested on their
|
|
1
|
+
// The one LLM call behind every DAG summary, kept apart from the graph writes so its request bytes are tested on their
|
|
2
|
+
// own.
|
|
2
3
|
import { redactSecretsStrict } from '../util/secret-detect.js';
|
|
3
4
|
import { describeMessageFailure, sendAnthropicMessage } from '../util/anthropic-messages.js';
|
|
4
5
|
import { certainDefect } from '../core/memory-quality.js';
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { type MemoryEntry } from '../core/memory.js';
|
|
2
|
+
import type { Consolidation, LocalFiles } from '../store/port.js';
|
|
2
3
|
import { type DagSummaryOptions } from './dag-summary.js';
|
|
4
|
+
/** Sleep's store, with the folder whose config sets a new summary's half-life. */
|
|
5
|
+
type DagStore = Pick<LocalFiles, 'hippoRoot' | 'consolidation'>;
|
|
3
6
|
export interface FactCluster {
|
|
4
7
|
label: string;
|
|
5
8
|
members: MemoryEntry[];
|
|
@@ -14,7 +17,7 @@ export interface DagBuildResult {
|
|
|
14
17
|
* guard-exempt (same id + content), so only summary-creation refusals count. */
|
|
15
18
|
rejected: number;
|
|
16
19
|
}
|
|
17
|
-
export declare function buildDag(
|
|
20
|
+
export declare function buildDag(local: DagStore, facts: MemoryEntry[], opts: DagSummaryOptions): Promise<DagBuildResult>;
|
|
18
21
|
export interface DagRebuildResult {
|
|
19
22
|
attempted: number;
|
|
20
23
|
rebuilt: number;
|
|
@@ -23,9 +26,10 @@ export interface DagRebuildResult {
|
|
|
23
26
|
failed: number;
|
|
24
27
|
capped: boolean;
|
|
25
28
|
}
|
|
26
|
-
/** Sleep-cycle phase draining the dirty L2 summary queue; one throwing rebuild does not abort the rest.
|
|
27
|
-
*
|
|
28
|
-
|
|
29
|
+
/** Sleep-cycle phase draining the dirty L2 summary queue; one throwing rebuild does not abort the rest. A concurrent
|
|
30
|
+
* sleep's second writer gets changed=false (UPDATE requires summary_dirty=1) and is skipped silently; a tombstone hit
|
|
31
|
+
* counts as `refused`. */
|
|
32
|
+
export declare function rebuildDirtySummaries(store: Consolidation, opts: DagSummaryOptions & {
|
|
29
33
|
cap?: number;
|
|
30
34
|
}): Promise<DagRebuildResult>;
|
|
31
35
|
export interface EntityProfilesBuildResult {
|
|
@@ -39,5 +43,6 @@ export interface EntityProfilesBuildResult {
|
|
|
39
43
|
}
|
|
40
44
|
/** Build L3 entity profiles by clustering L2 summaries sharing entity tags (2+ L2s per entity).
|
|
41
45
|
* Each L2 link write marks the new L3 dirty, so clear it or the same cycle re-rebuilds it. */
|
|
42
|
-
export declare function buildEntityProfiles(
|
|
46
|
+
export declare function buildEntityProfiles(local: DagStore, l2Summaries: MemoryEntry[], opts: DagSummaryOptions): Promise<EntityProfilesBuildResult>;
|
|
47
|
+
export {};
|
|
43
48
|
//# sourceMappingURL=dag.d.ts.map
|
package/dist/consolidate/dag.js
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import { createMemory, Layer } from '../core/memory.js';
|
|
2
|
-
import { writeEntry, writeEntriesTogether } from '../store/entry-writes.js';
|
|
3
|
-
import { loadAllDirtySummaries, loadChildrenOfSummary, loadChildrenOfSummaries, childrenKey, applyRebuildResult, clearSummaryDirtyAfterBuild, } from '../store/summaries.js';
|
|
4
2
|
import { RejectedValueError } from '../core/api-errors.js';
|
|
5
3
|
import { generateDagSummary } from './dag-summary.js';
|
|
6
4
|
import { overlapPartners } from './overlap-index.js';
|
|
@@ -17,7 +15,8 @@ export function clusterFacts(facts) {
|
|
|
17
15
|
return [];
|
|
18
16
|
const entityTags = facts.map((f) => f.tags.filter((t) => t.startsWith('speaker:') || t.startsWith('topic:')));
|
|
19
17
|
const tagSets = entityTags.map((tags) => new Set(tags));
|
|
20
|
-
// Every tag indexed, not a prefix: a repeated tag counts twice in `shared`, so the prefix-filter bound would not
|
|
18
|
+
// Every tag indexed, not a prefix: a repeated tag counts twice in `shared`, so the prefix-filter bound would not
|
|
19
|
+
// hold.
|
|
21
20
|
const partnersOf = overlapPartners(tagSets, () => 1);
|
|
22
21
|
const assigned = new Set();
|
|
23
22
|
const clusters = [];
|
|
@@ -45,8 +44,8 @@ export function clusterFacts(facts) {
|
|
|
45
44
|
}
|
|
46
45
|
return clusters;
|
|
47
46
|
}
|
|
48
|
-
// Partition before clustering so one LLM summary never mixes tenants; Map keeps insertion order, so a single-tenant
|
|
49
|
-
// buildEntityProfiles partitions its L2s with this same key.
|
|
47
|
+
// Partition before clustering so one LLM summary never mixes tenants; Map keeps insertion order, so a single-tenant
|
|
48
|
+
// store iterates as before. buildEntityProfiles partitions its L2s with this same key.
|
|
50
49
|
function partitionFactsByTenant(unparented) {
|
|
51
50
|
const unparentedByTenant = new Map();
|
|
52
51
|
for (const fact of unparented) {
|
|
@@ -62,12 +61,13 @@ function partitionFactsByTenant(unparented) {
|
|
|
62
61
|
/** The L2 summary entry for one cluster, landing in the facts' own tenant and scope. */
|
|
63
62
|
function createClusterSummaryEntry(summary, cluster, home) {
|
|
64
63
|
const memberCreatedAts = cluster.members.map((m) => m.created).sort();
|
|
65
|
-
// Every cluster member shares home.tenantId (tenant partition above), so the summary lands in the facts' tenant,
|
|
64
|
+
// Every cluster member shares home.tenantId (tenant partition above), so the summary lands in the facts' tenant,
|
|
65
|
+
// not 'default'.
|
|
66
66
|
const summaryEntry = createMemory(summary, {
|
|
67
67
|
layer: Layer.Semantic,
|
|
68
68
|
tags: [...cluster.entityTags, ...neverAutoShareTags(cluster.members), 'dag-summary'],
|
|
69
69
|
confidence: 'inferred',
|
|
70
|
-
|
|
70
|
+
dagLevel: 2,
|
|
71
71
|
tenantId: home.tenantId,
|
|
72
72
|
scope: home.scope,
|
|
73
73
|
baseHalfLifeDays: home.baseHalfLifeDays,
|
|
@@ -81,7 +81,7 @@ function createClusterSummaryEntry(summary, cluster, home) {
|
|
|
81
81
|
return summaryEntry;
|
|
82
82
|
}
|
|
83
83
|
/** Summarize one eligible cluster, write the summary, then re-parent its members under it. */
|
|
84
|
-
async function summarizeCluster(
|
|
84
|
+
async function summarizeCluster(store, cluster, home, opts, result) {
|
|
85
85
|
const summary = await generateDagSummary(cluster.label, cluster.members.map((m) => m.content), opts);
|
|
86
86
|
if (!summary)
|
|
87
87
|
return;
|
|
@@ -89,25 +89,25 @@ async function summarizeCluster(hippoRoot, cluster, home, opts, result) {
|
|
|
89
89
|
// A refused summary skips only this cluster. writeEntry's guard reads tenantId off the entry
|
|
90
90
|
// (home.tenantId), so it already checks this tenant's tombstones: no separate check here.
|
|
91
91
|
try {
|
|
92
|
-
writeEntry(
|
|
92
|
+
store.writeEntry(summaryEntry);
|
|
93
93
|
}
|
|
94
94
|
catch (err) {
|
|
95
95
|
if (err instanceof RejectedValueError) {
|
|
96
96
|
result.rejected++;
|
|
97
|
-
log.warn(`buildDag: cluster "${cluster.label}" skipped: summary matches a rejected value
|
|
97
|
+
log.warn(`buildDag: cluster "${cluster.label}" skipped: summary matches a rejected value`, errorFields(err));
|
|
98
98
|
return;
|
|
99
99
|
}
|
|
100
100
|
throw err;
|
|
101
101
|
}
|
|
102
102
|
result.summariesCreated++;
|
|
103
|
-
result.factsLinked +=
|
|
103
|
+
result.factsLinked += store.writeTogether(cluster.members.map((member) => ({ ...member, dag_parent_id: summaryEntry.id })));
|
|
104
104
|
// Member writes just marked this fresh summary dirty; clear it, or the same sleep cycle's
|
|
105
105
|
// rebuild pass would re-rebuild every new summary at twice the LLM cost.
|
|
106
|
-
|
|
106
|
+
store.clearSummaryDirty(summaryEntry.id, summaryEntry.tenant_id, 'buildDag');
|
|
107
107
|
}
|
|
108
|
-
export async function buildDag(
|
|
108
|
+
export async function buildDag(local, facts, opts) {
|
|
109
109
|
const result = { candidateClusters: 0, summariesCreated: 0, factsLinked: 0, rejected: 0 };
|
|
110
|
-
const baseHalfLifeDays = loadConfig(hippoRoot).defaultHalfLifeDays;
|
|
110
|
+
const baseHalfLifeDays = loadConfig(local.hippoRoot).defaultHalfLifeDays;
|
|
111
111
|
const unparented = facts.filter((f) => f.dag_level === 1 && !f.dag_parent_id && f.tags.includes('extracted'));
|
|
112
112
|
for (const [, tenantFacts] of partitionFactsByTenant(unparented)) {
|
|
113
113
|
const home = {
|
|
@@ -120,19 +120,19 @@ export async function buildDag(hippoRoot, facts, opts) {
|
|
|
120
120
|
const eligibleClusters = clusters.filter((c) => c.members.length >= 3);
|
|
121
121
|
result.candidateClusters += eligibleClusters.length;
|
|
122
122
|
for (const cluster of eligibleClusters) {
|
|
123
|
-
await summarizeCluster(
|
|
123
|
+
await summarizeCluster(local.consolidation, cluster, home, opts, result);
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
126
|
return result;
|
|
127
127
|
}
|
|
128
128
|
/** Regenerate one dirty summary from its children and tally the outcome; throws reach the caller's isolation. */
|
|
129
|
-
async function rebuildOneSummary(
|
|
129
|
+
async function rebuildOneSummary(store, summary, opts, result, preloaded, queuedIds) {
|
|
130
130
|
// A queued child may have been rebuilt earlier in this drain, so its preloaded content is stale: reread then.
|
|
131
131
|
const children = preloaded.some((c) => queuedIds.has(c.id))
|
|
132
|
-
?
|
|
132
|
+
? store.childrenOfSummary(summary.id, summary.tenant_id)
|
|
133
133
|
: preloaded;
|
|
134
134
|
if (children.length === 0) {
|
|
135
|
-
clearZeroChildSummary(
|
|
135
|
+
clearZeroChildSummary(store, summary, result);
|
|
136
136
|
return;
|
|
137
137
|
}
|
|
138
138
|
const newContent = await generateDagSummary(summaryLabel(summary), children.map((c) => c.content), opts);
|
|
@@ -142,7 +142,7 @@ async function rebuildOneSummary(hippoRoot, summary, opts, result, preloaded, qu
|
|
|
142
142
|
return;
|
|
143
143
|
}
|
|
144
144
|
const childCreatedAts = children.map((c) => c.created).sort();
|
|
145
|
-
const { changed, refused } =
|
|
145
|
+
const { changed, refused } = store.applyRebuild(summary, {
|
|
146
146
|
content: newContent,
|
|
147
147
|
descendant_count: children.length,
|
|
148
148
|
earliest_at: childCreatedAts[0],
|
|
@@ -161,8 +161,8 @@ async function rebuildOneSummary(hippoRoot, summary, opts, result, preloaded, qu
|
|
|
161
161
|
// success, silently skip
|
|
162
162
|
}
|
|
163
163
|
/** Zero-child case: clear dirty + zero counts, no LLM call, no rebuild_count bump. */
|
|
164
|
-
function clearZeroChildSummary(
|
|
165
|
-
const { changed } =
|
|
164
|
+
function clearZeroChildSummary(store, summary, result) {
|
|
165
|
+
const { changed } = store.applyRebuild(summary, {
|
|
166
166
|
content: summary.content,
|
|
167
167
|
descendant_count: 0,
|
|
168
168
|
earliest_at: null,
|
|
@@ -183,12 +183,13 @@ function summaryLabel(summary) {
|
|
|
183
183
|
? entityTags.map((t) => t.split(':')[1]).join(': ')
|
|
184
184
|
: summary.content.slice(0, SUMMARY_FALLBACK_CHARS);
|
|
185
185
|
}
|
|
186
|
-
/** Sleep-cycle phase draining the dirty L2 summary queue; one throwing rebuild does not abort the rest.
|
|
187
|
-
*
|
|
188
|
-
|
|
186
|
+
/** Sleep-cycle phase draining the dirty L2 summary queue; one throwing rebuild does not abort the rest. A concurrent
|
|
187
|
+
* sleep's second writer gets changed=false (UPDATE requires summary_dirty=1) and is skipped silently; a tombstone hit
|
|
188
|
+
* counts as `refused`. */
|
|
189
|
+
export async function rebuildDirtySummaries(store, opts) {
|
|
189
190
|
const cap = opts.cap ?? DEFAULT_REBUILD_CAP;
|
|
190
191
|
// One past the cap tells whether more were waiting without reading the rest.
|
|
191
|
-
const dirty =
|
|
192
|
+
const dirty = store.dirtySummaries(cap + 1);
|
|
192
193
|
const capped = dirty.length > cap;
|
|
193
194
|
const queue = dirty.slice(0, cap);
|
|
194
195
|
const result = {
|
|
@@ -199,7 +200,7 @@ export async function rebuildDirtySummaries(hippoRoot, opts) {
|
|
|
199
200
|
failed: 0,
|
|
200
201
|
capped,
|
|
201
202
|
};
|
|
202
|
-
const
|
|
203
|
+
const childrenOf = store.childrenOfSummaries(queue);
|
|
203
204
|
const queuedIds = new Set(queue.map((s) => s.id));
|
|
204
205
|
for (const [index, summary] of queue.entries()) {
|
|
205
206
|
// Yield the macrotask queue every 25 summaries: each iteration is synchronous SQLite, so a batch of up to 1000
|
|
@@ -208,7 +209,7 @@ export async function rebuildDirtySummaries(hippoRoot, opts) {
|
|
|
208
209
|
await new Promise((resolve) => setImmediate(resolve));
|
|
209
210
|
}
|
|
210
211
|
try {
|
|
211
|
-
await rebuildOneSummary(
|
|
212
|
+
await rebuildOneSummary(store, summary, opts, result, childrenOf(summary), queuedIds);
|
|
212
213
|
}
|
|
213
214
|
catch (err) {
|
|
214
215
|
// One throw doesn't abort the queue; log enough to triage an exotic
|
|
@@ -227,7 +228,7 @@ function createProfileEntry(summary, cluster, home) {
|
|
|
227
228
|
layer: Layer.Semantic,
|
|
228
229
|
tags: [...cluster.entityTags, ...neverAutoShareTags(cluster.members), 'dag-entity-profile'],
|
|
229
230
|
confidence: 'inferred',
|
|
230
|
-
|
|
231
|
+
dagLevel: 3,
|
|
231
232
|
tenantId: home.tenantId,
|
|
232
233
|
scope: home.scope,
|
|
233
234
|
baseHalfLifeDays: home.baseHalfLifeDays,
|
|
@@ -240,7 +241,7 @@ function createProfileEntry(summary, cluster, home) {
|
|
|
240
241
|
return profileEntry;
|
|
241
242
|
}
|
|
242
243
|
/** Profile one eligible cluster of L2s, write it, then re-link the L2s under it. */
|
|
243
|
-
async function profileCluster(
|
|
244
|
+
async function profileCluster(store, cluster, home, opts, result) {
|
|
244
245
|
const summary = await generateDagSummary(cluster.label, cluster.members.map((m) => m.content), opts);
|
|
245
246
|
if (!summary) {
|
|
246
247
|
result.failed++;
|
|
@@ -249,25 +250,25 @@ async function profileCluster(hippoRoot, cluster, home, opts, result) {
|
|
|
249
250
|
const profileEntry = createProfileEntry(summary, cluster, home);
|
|
250
251
|
// A refused profile skips only this cluster; the re-linking below never runs for it.
|
|
251
252
|
try {
|
|
252
|
-
writeEntry(
|
|
253
|
+
store.writeEntry(profileEntry);
|
|
253
254
|
}
|
|
254
255
|
catch (err) {
|
|
255
256
|
if (err instanceof RejectedValueError) {
|
|
256
257
|
result.rejected++;
|
|
257
|
-
log.warn(`buildEntityProfiles: cluster "${cluster.label}" skipped: profile matches a rejected value
|
|
258
|
+
log.warn(`buildEntityProfiles: cluster "${cluster.label}" skipped: profile matches a rejected value`, errorFields(err));
|
|
258
259
|
return;
|
|
259
260
|
}
|
|
260
261
|
throw err;
|
|
261
262
|
}
|
|
262
263
|
result.profilesCreated++;
|
|
263
|
-
result.l2sLinked +=
|
|
264
|
+
result.l2sLinked += store.writeTogether(cluster.members.map((member) => ({ ...member, dag_parent_id: profileEntry.id })));
|
|
264
265
|
// Re-linking just marked the fresh L3 dirty; clear it so this cycle's rebuild skips it.
|
|
265
266
|
// The distinct source tags the audit row.
|
|
266
|
-
|
|
267
|
+
store.clearSummaryDirty(profileEntry.id, home.tenantId, 'buildEntityProfiles', 'buildEntityProfiles-clean');
|
|
267
268
|
}
|
|
268
269
|
/** Build L3 entity profiles by clustering L2 summaries sharing entity tags (2+ L2s per entity).
|
|
269
270
|
* Each L2 link write marks the new L3 dirty, so clear it or the same cycle re-rebuilds it. */
|
|
270
|
-
export async function buildEntityProfiles(
|
|
271
|
+
export async function buildEntityProfiles(local, l2Summaries, opts) {
|
|
271
272
|
const result = {
|
|
272
273
|
candidateClusters: 0,
|
|
273
274
|
profilesCreated: 0,
|
|
@@ -275,7 +276,7 @@ export async function buildEntityProfiles(hippoRoot, l2Summaries, opts) {
|
|
|
275
276
|
failed: 0,
|
|
276
277
|
rejected: 0,
|
|
277
278
|
};
|
|
278
|
-
const baseHalfLifeDays = loadConfig(hippoRoot).defaultHalfLifeDays;
|
|
279
|
+
const baseHalfLifeDays = loadConfig(local.hippoRoot).defaultHalfLifeDays;
|
|
279
280
|
// Only L2 with no L3 parent yet (avoid re-clustering already-profiled L2s).
|
|
280
281
|
const unparented = l2Summaries.filter((s) => s.dag_level === 2 && !s.dag_parent_id);
|
|
281
282
|
for (const [, tenantL2s] of partitionFactsByTenant(unparented)) {
|
|
@@ -289,7 +290,7 @@ export async function buildEntityProfiles(hippoRoot, l2Summaries, opts) {
|
|
|
289
290
|
const eligible = clusters.filter((c) => c.members.length >= 2);
|
|
290
291
|
result.candidateClusters += eligible.length;
|
|
291
292
|
for (const cluster of eligible) {
|
|
292
|
-
await profileCluster(
|
|
293
|
+
await profileCluster(local.consolidation, cluster, home, opts, result);
|
|
293
294
|
}
|
|
294
295
|
}
|
|
295
296
|
return result;
|
|
@@ -4,7 +4,8 @@ import { rescueSet, rankNonPinnedByTenant, validateWeights } from './memory-valu
|
|
|
4
4
|
import { MEMORY_VALUE_WEIGHTS, SOURCE_ARTIFACT_SHA256 } from './memory-value-weights.js';
|
|
5
5
|
const STRENGTH_DECIMALS = 4;
|
|
6
6
|
export const DECAY_THRESHOLD = 0.05;
|
|
7
|
-
// Leaving active memory: a raw receipt stays (the append-only trigger aborts DELETE for the whole batch; stored
|
|
7
|
+
// Leaving active memory: a raw receipt stays (the append-only trigger aborts DELETE for the whole batch; stored
|
|
8
|
+
// strength refreshed) but sits out this cycle;
|
|
8
9
|
// others go dormant when config.dormant is on, else are deleted. Only called for rows `retirable` allows.
|
|
9
10
|
function retireFaded(run, entry, strength) {
|
|
10
11
|
const { result } = run;
|
|
@@ -14,7 +15,12 @@ function retireFaded(run, entry, strength) {
|
|
|
14
15
|
if (run.config.dormant.enabled && !detectSecret(entry).flagged) {
|
|
15
16
|
result.dormant++;
|
|
16
17
|
result.details.push(` 💤 dormant ${entry.id} ${why}`);
|
|
17
|
-
run.pendingDormant.push({
|
|
18
|
+
run.pendingDormant.push({
|
|
19
|
+
entry: { ...entry, strength },
|
|
20
|
+
strength,
|
|
21
|
+
reason: 'decay',
|
|
22
|
+
dormantAt: run.now.toISOString(),
|
|
23
|
+
});
|
|
18
24
|
return;
|
|
19
25
|
}
|
|
20
26
|
result.removed++;
|
|
@@ -31,7 +37,8 @@ function keepSurvivor(run, entry, strength) {
|
|
|
31
37
|
run.result.decayed++;
|
|
32
38
|
return updated;
|
|
33
39
|
}
|
|
34
|
-
// 1. Decay pass. Memory-value flag OFF runs the single-phase loop below; ON classifies every entry with zero commits,
|
|
40
|
+
// 1. Decay pass. Memory-value flag OFF runs the single-phase loop below; ON classifies every entry with zero commits,
|
|
41
|
+
// runs rescueSet per tenant, then commits.
|
|
35
42
|
// Rescued entries stay full survivors for this cycle's later passes.
|
|
36
43
|
export function decayPass(run) {
|
|
37
44
|
if (run.config.memoryValue.enabled)
|
|
@@ -85,14 +92,19 @@ function decayWithMemoryValue(run) {
|
|
|
85
92
|
let rescuedIds = new Set();
|
|
86
93
|
let rankById = new Map();
|
|
87
94
|
const { strengthById, condemnedIds } = classifyByStrength(run);
|
|
88
|
-
// Phase 2a: rescue decision (pure compute); runs under --dry-run too (only the pendingDeletes flush and the logRun
|
|
95
|
+
// Phase 2a: rescue decision (pure compute); runs under --dry-run too (only the pendingDeletes flush and the logRun
|
|
96
|
+
// audit write are !dryRun-gated).
|
|
89
97
|
// Fail-loud must not depend on condemnation traffic: validate the frozen weights even when nothing is condemned.
|
|
90
98
|
validateWeights();
|
|
91
99
|
if (condemnedIds.size > 0) {
|
|
92
100
|
// Rank per tenant ONCE: rankById feeds both rescueSet (via precomputedRanks) and the detail/audit
|
|
93
101
|
// context below, so the whole-store ranking runs once per sleep and only when something is condemned.
|
|
94
102
|
rankById = rankNonPinnedByTenant(all, now);
|
|
95
|
-
rescuedIds = rescueSet(all, condemnedIds, now, {
|
|
103
|
+
rescuedIds = rescueSet(all, condemnedIds, now, {
|
|
104
|
+
weights: MEMORY_VALUE_WEIGHTS,
|
|
105
|
+
digest: SOURCE_ARTIFACT_SHA256,
|
|
106
|
+
precomputedRanks: rankById,
|
|
107
|
+
});
|
|
96
108
|
reportNonFiniteScores(result, rankById);
|
|
97
109
|
}
|
|
98
110
|
// --- Phase 2b: commit, one pass over `all` in ITS ORIGINAL ORDER ---
|
|
@@ -101,7 +113,8 @@ function decayWithMemoryValue(run) {
|
|
|
101
113
|
const strength = strengthById.get(entry.id);
|
|
102
114
|
if (run.retirable(entry) && strength < DECAY_THRESHOLD) {
|
|
103
115
|
if (rescuedIds.has(entry.id)) {
|
|
104
|
-
// Rescued: standard survivor stored-strength refresh. Confidence is left alone: it is an epistemic tier, not a
|
|
116
|
+
// Rescued: standard survivor stored-strength refresh. Confidence is left alone: it is an epistemic tier, not a
|
|
117
|
+
// cached
|
|
105
118
|
// computation, so resolveConfidence derives it on read.
|
|
106
119
|
rescuedEntries.push(keepSurvivor(run, entry, strength));
|
|
107
120
|
reportRescue(result, entry, strength, rankById.get(entry.id));
|
|
@@ -1,5 +1,10 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
1
|
+
/**
|
|
2
|
+
* Store-level dedup: same text apart from spacing, keeping the stronger copy; split out so `api.sleep` can dedupe
|
|
3
|
+
* without cli -> api imports.
|
|
4
|
+
* Survivor order is total and tenant-scoped: strength bucket, retrieval_count, then compareEntryIdentity; raw and
|
|
5
|
+
* superseded rows are not candidates.
|
|
6
|
+
*/
|
|
7
|
+
import type { Consolidation } from '../store/port.js';
|
|
3
8
|
import { type MemoryEntry } from '../core/memory.js';
|
|
4
9
|
export interface DedupPair {
|
|
5
10
|
kept: string;
|
|
@@ -17,7 +22,9 @@ export interface DedupResult {
|
|
|
17
22
|
removed: number;
|
|
18
23
|
pairs: DedupPair[];
|
|
19
24
|
}
|
|
20
|
-
/**
|
|
25
|
+
/**
|
|
26
|
+
* Quantize strength to an integer bucket so ties are a true equivalence relation (equal iff same multiple of
|
|
27
|
+
* `STRENGTH_TIE_EPSILON`).
|
|
21
28
|
* Non-finite input maps to 0: a NaN bucket would make the comparator return NaN and break the total order. */
|
|
22
29
|
export declare function strengthBucket(strength: number | null | undefined): number;
|
|
23
30
|
/** Every row of the store, read once by a caller that also needs them, with the ids of rows backing an object. */
|
|
@@ -25,9 +32,11 @@ export interface LoadedStore {
|
|
|
25
32
|
readonly entries: readonly MemoryEntry[];
|
|
26
33
|
readonly backing: ReadonlySet<string>;
|
|
27
34
|
}
|
|
28
|
-
/**
|
|
35
|
+
/**
|
|
36
|
+
* Remove the weaker copy of same-text (apart from spacing) memories within one tenant; cross-tenant pairs are never
|
|
37
|
+
* duplicates (isolation boundary).
|
|
29
38
|
* Higher strength wins, then more retrievals; `threshold` is accepted for old callers and ignored. */
|
|
30
|
-
export declare function deduplicateStore(
|
|
39
|
+
export declare function deduplicateStore(store: Consolidation, options?: {
|
|
31
40
|
threshold?: number;
|
|
32
41
|
dryRun?: boolean;
|
|
33
42
|
actor?: string;
|