hippo-memory 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-memories/apply.d.ts +7 -5
- package/dist/agent-memories/apply.js +66 -39
- package/dist/agent-memories/claude-code.d.ts +8 -2
- package/dist/agent-memories/claude-code.js +26 -7
- package/dist/agent-memories/copilot.js +2 -1
- package/dist/agent-memories/files.js +2 -1
- package/dist/agent-memories/legacy.d.ts +6 -3
- package/dist/agent-memories/legacy.js +35 -14
- package/dist/agent-memories/markdown.d.ts +3 -1
- package/dist/agent-memories/markdown.js +3 -1
- package/dist/agent-memories/openclaw.js +5 -2
- package/dist/agent-memories/plan.js +11 -1
- package/dist/agent-memories/project-folds.js +2 -1
- package/dist/agent-memories/report.d.ts +4 -1
- package/dist/agent-memories/report.js +43 -9
- package/dist/agent-memories/source.d.ts +8 -2
- package/dist/agent-memories/source.js +11 -3
- package/dist/agent-memories/sync.d.ts +7 -2
- package/dist/agent-memories/sync.js +141 -101
- package/dist/api/assemble.d.ts +6 -4
- package/dist/api/assemble.js +11 -6
- package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
- package/dist/api/{audit.js → auth/audit.js} +11 -11
- package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -15
- package/dist/api/{auth.js → auth/auth.js} +46 -29
- package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
- package/dist/api/{quarantine.js → auth/quarantine.js} +8 -8
- package/dist/api/auth/session-owners.d.ts +10 -0
- package/dist/api/auth/session-owners.js +35 -0
- package/dist/api/availability.d.ts +3 -1
- package/dist/api/availability.js +3 -1
- package/dist/api/busy.d.ts +2 -0
- package/dist/api/busy.js +2 -0
- package/dist/api/cli-surface.d.ts +6 -0
- package/dist/api/cli-surface.js +6 -0
- package/dist/api/config-of.d.ts +5 -0
- package/dist/api/config-of.js +6 -0
- package/dist/api/context-auto.d.ts +4 -1
- package/dist/api/context-auto.js +10 -2
- package/dist/api/context-render.js +14 -7
- package/dist/api/context-select.d.ts +4 -1
- package/dist/api/context-select.js +23 -14
- package/dist/api/context-types.d.ts +38 -12
- package/dist/api/context.d.ts +8 -5
- package/dist/api/context.js +112 -57
- package/dist/api/continuity.d.ts +24 -21
- package/dist/api/continuity.js +18 -20
- package/dist/api/correction-latency.d.ts +3 -1
- package/dist/api/correction-latency.js +3 -1
- package/dist/api/error-reply.d.ts +4 -1
- package/dist/api/error-reply.js +12 -3
- package/dist/api/index.d.ts +39 -23
- package/dist/api/index.js +21 -23
- package/dist/api/instruction-detect.d.ts +4 -1
- package/dist/api/instruction-detect.js +75 -20
- package/dist/api/ledger-db.d.ts +15 -11
- package/dist/api/ledger-db.js +21 -23
- package/dist/api/memories/conflicts.d.ts +33 -0
- package/dist/api/memories/conflicts.js +67 -0
- package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
- package/dist/api/{forget.js → memories/forget.js} +22 -15
- package/dist/api/memories/memories.d.ts +27 -0
- package/dist/api/{memories.js → memories/memories.js} +16 -21
- package/dist/api/memories/outcome.d.ts +22 -0
- package/dist/api/{outcome.js → memories/outcome.js} +14 -8
- package/dist/api/memories/promote.d.ts +40 -0
- package/dist/api/{promote.js → memories/promote.js} +35 -22
- package/dist/api/memories/refine.d.ts +10 -0
- package/dist/api/memories/refine.js +12 -0
- package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +16 -11
- package/dist/api/{remember-local.js → memories/remember-local.js} +34 -20
- package/dist/api/{remember.d.ts → memories/remember.d.ts} +19 -13
- package/dist/api/{remember.js → memories/remember.js} +42 -26
- package/dist/api/objects/cards.d.ts +39 -0
- package/dist/api/{cards.js → objects/cards.js} +12 -14
- package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
- package/dist/api/{drill-down.js → objects/drill-down.js} +7 -8
- package/dist/api/objects/goals.d.ts +18 -0
- package/dist/api/{goals.js → objects/goals.js} +12 -12
- package/dist/api/objects/graph.d.ts +11 -0
- package/dist/api/objects/graph.js +16 -0
- package/dist/api/objects/objects.d.ts +9 -0
- package/dist/api/{objects.js → objects/objects.js} +2 -4
- package/dist/api/objects/predictions.d.ts +11 -0
- package/dist/api/{predictions.js → objects/predictions.js} +7 -6
- package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
- package/dist/api/{projects.js → objects/projects.js} +8 -4
- package/dist/api/pilot-arm.d.ts +8 -4
- package/dist/api/pilot-arm.js +5 -4
- package/dist/api/prompt-hook.d.ts +32 -19
- package/dist/api/prompt-hook.js +65 -44
- package/dist/api/provenance-coverage.d.ts +3 -1
- package/dist/api/provenance-coverage.js +3 -1
- package/dist/api/recall/finish.d.ts +185 -0
- package/dist/api/recall/finish.js +301 -0
- package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
- package/dist/api/{recall-pipeline.js → recall/pipeline.js} +176 -92
- package/dist/api/recall/recall.d.ts +6 -0
- package/dist/api/{recall.js → recall/recall.js} +101 -60
- package/dist/api/recall/render.d.ts +39 -0
- package/dist/api/recall/render.js +60 -0
- package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
- package/dist/api/recall/request.js +261 -0
- package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
- package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
- package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -70
- package/dist/api/{recall-types.js → recall/types.js} +1 -1
- package/dist/api/session-end.d.ts +16 -12
- package/dist/api/session-end.js +46 -30
- package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
- package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
- package/dist/api/sleep/dormant.d.ts +25 -0
- package/dist/api/sleep/dormant.js +64 -0
- package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
- package/dist/api/sleep/learn.js +138 -0
- package/dist/api/sleep/sleep-run.d.ts +38 -0
- package/dist/api/{sleep-run.js → sleep/sleep-run.js} +51 -43
- package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
- package/dist/api/sleep/sleep.js +9 -0
- package/dist/api/status.d.ts +3 -1
- package/dist/api/status.js +3 -1
- package/dist/api/store-init.d.ts +4 -1
- package/dist/api/store-init.js +4 -1
- package/dist/api/tokens.d.ts +10 -9
- package/dist/api/tokens.js +9 -10
- package/dist/api/types.d.ts +28 -7
- package/dist/api/types.js +13 -4
- package/dist/capture/caller-session.d.ts +8 -2
- package/dist/capture/caller-session.js +16 -6
- package/dist/capture/capture-error.d.ts +3 -1
- package/dist/capture/capture-error.js +3 -1
- package/dist/capture/codex-patch.js +7 -2
- package/dist/capture/command.d.ts +4 -2
- package/dist/capture/command.js +33 -14
- package/dist/capture/compact-resume-caller.js +15 -8
- package/dist/capture/compact.d.ts +8 -5
- package/dist/capture/compact.js +34 -23
- package/dist/capture/compaction-items-caller.js +9 -3
- package/dist/capture/compaction-record.d.ts +4 -3
- package/dist/capture/compaction-record.js +20 -12
- package/dist/capture/compaction-spool.d.ts +15 -4
- package/dist/capture/compaction-spool.js +64 -17
- package/dist/capture/copilot-transcript.d.ts +11 -3
- package/dist/capture/copilot-transcript.js +16 -6
- package/dist/capture/extract.js +20 -8
- package/dist/capture/failure-caller.js +23 -12
- package/dist/capture/failure-reading.d.ts +10 -3
- package/dist/capture/failure-reading.js +24 -7
- package/dist/capture/pre-compact-caller.js +11 -4
- package/dist/capture/session-digest.d.ts +15 -4
- package/dist/capture/session-digest.js +39 -13
- package/dist/capture/session-end-caller.d.ts +4 -1
- package/dist/capture/session-end-caller.js +20 -8
- package/dist/capture/session-texts.d.ts +6 -2
- package/dist/capture/session-texts.js +22 -7
- package/dist/capture/session-worker.d.ts +4 -2
- package/dist/capture/session-worker.js +45 -17
- package/dist/capture/transcript.d.ts +13 -4
- package/dist/capture/transcript.js +32 -10
- package/dist/capture/working-state.d.ts +13 -4
- package/dist/capture/working-state.js +50 -56
- package/dist/cli/api-context.d.ts +14 -2
- package/dist/cli/api-context.js +45 -2
- package/dist/cli/audit.js +23 -23
- package/dist/cli/auth.js +19 -27
- package/dist/cli/briefs.d.ts +1 -1
- package/dist/cli/briefs.js +20 -15
- package/dist/cli/card.d.ts +1 -1
- package/dist/cli/card.js +56 -73
- package/dist/cli/client.d.ts +12 -4
- package/dist/cli/client.js +43 -13
- package/dist/cli/compact-resume-payload.d.ts +4 -1
- package/dist/cli/compact-resume-payload.js +12 -5
- package/dist/cli/context.js +42 -17
- package/dist/cli/continuity.d.ts +5 -5
- package/dist/cli/continuity.js +90 -107
- package/dist/cli/curate.d.ts +4 -3
- package/dist/cli/curate.js +46 -68
- package/dist/cli/dag.d.ts +1 -1
- package/dist/cli/dag.js +14 -17
- package/dist/cli/decisions.js +27 -26
- package/dist/cli/eval.js +16 -21
- package/dist/cli/exit.d.ts +4 -1
- package/dist/cli/exit.js +10 -2
- package/dist/cli/explain.js +12 -11
- package/dist/cli/flag-values.d.ts +1 -1
- package/dist/cli/flag-values.js +9 -18
- package/dist/cli/github.d.ts +6 -0
- package/dist/cli/github.js +25 -13
- package/dist/cli/goals.d.ts +1 -1
- package/dist/cli/goals.js +39 -56
- package/dist/cli/graph.d.ts +1 -1
- package/dist/cli/graph.js +15 -11
- package/dist/cli/hook-runtime.d.ts +31 -9
- package/dist/cli/hook-runtime.js +40 -15
- package/dist/cli/incidents.d.ts +1 -1
- package/dist/cli/incidents.js +25 -25
- package/dist/cli/init.js +26 -11
- package/dist/cli/install-steps.d.ts +12 -3
- package/dist/cli/install-steps.js +42 -18
- package/dist/cli/last-sleep.d.ts +4 -1
- package/dist/cli/last-sleep.js +9 -4
- package/dist/cli/maintenance.d.ts +1 -1
- package/dist/cli/maintenance.js +11 -12
- package/dist/cli/notes.d.ts +1 -1
- package/dist/cli/notes.js +8 -5
- package/dist/cli/object-verbs.d.ts +4 -4
- package/dist/cli/object-verbs.js +10 -13
- package/dist/cli/open-browser.js +11 -2
- package/dist/cli/playbooks.d.ts +3 -3
- package/dist/cli/playbooks.js +40 -32
- package/dist/cli/predictions.js +15 -19
- package/dist/cli/print.js +4 -2
- package/dist/cli/projects.js +21 -11
- package/dist/cli/quality-repair-once.js +5 -4
- package/dist/cli/recall.js +129 -93
- package/dist/cli/refine-llm.d.ts +15 -4
- package/dist/cli/refine-llm.js +16 -7
- package/dist/cli/remember.js +46 -50
- package/dist/cli/scheduler.d.ts +4 -1
- package/dist/cli/scheduler.js +9 -5
- package/dist/cli/serve.js +22 -17
- package/dist/cli/session-hooks.d.ts +2 -2
- package/dist/cli/session-hooks.js +87 -50
- package/dist/cli/setup.js +54 -32
- package/dist/cli/shared.d.ts +3 -1
- package/dist/cli/shared.js +24 -9
- package/dist/cli/slack.js +15 -24
- package/dist/cli/sleep-render.d.ts +3 -1
- package/dist/cli/sleep-render.js +8 -5
- package/dist/cli/sleep.js +14 -6
- package/dist/cli/status.d.ts +4 -4
- package/dist/cli/status.js +32 -27
- package/dist/cli/stdin.d.ts +10 -3
- package/dist/cli/stdin.js +10 -3
- package/dist/cli/transfer.d.ts +1 -1
- package/dist/cli/transfer.js +71 -75
- package/dist/cli/verbs/memory.js +8 -6
- package/dist/cli/verbs/objects.js +10 -4
- package/dist/cli/versioned-verbs.d.ts +8 -7
- package/dist/cli/versioned-verbs.js +31 -21
- package/dist/cli.js +13 -16
- package/dist/connectors/dlq.d.ts +6 -6
- package/dist/connectors/dlq.js +12 -8
- package/dist/connectors/github/backfill.d.ts +4 -4
- package/dist/connectors/github/backfill.js +6 -4
- package/dist/connectors/github/deletion.d.ts +6 -4
- package/dist/connectors/github/deletion.js +5 -5
- package/dist/connectors/github/dlq.d.ts +8 -6
- package/dist/connectors/github/dlq.js +11 -5
- package/dist/connectors/github/ingest.d.ts +2 -2
- package/dist/connectors/github/ingest.js +9 -6
- package/dist/connectors/github/octokit-client.d.ts +3 -1
- package/dist/connectors/github/octokit-client.js +7 -2
- package/dist/connectors/github/ratelimit.d.ts +6 -2
- package/dist/connectors/github/ratelimit.js +6 -2
- package/dist/connectors/github/signature.d.ts +14 -3
- package/dist/connectors/github/signature.js +17 -3
- package/dist/connectors/github/tenant-routing.d.ts +6 -4
- package/dist/connectors/github/tenant-routing.js +6 -6
- package/dist/connectors/github/transform.js +50 -67
- package/dist/connectors/github/types.d.ts +10 -3
- package/dist/connectors/github/types.js +6 -2
- package/dist/connectors/github/webhook.d.ts +5 -5
- package/dist/connectors/github/webhook.js +34 -23
- package/dist/connectors/ingest.d.ts +5 -3
- package/dist/connectors/ingest.js +3 -4
- package/dist/connectors/slack/backfill.d.ts +5 -5
- package/dist/connectors/slack/backfill.js +3 -3
- package/dist/connectors/slack/deletion.d.ts +4 -4
- package/dist/connectors/slack/deletion.js +6 -6
- package/dist/connectors/slack/dlq.d.ts +4 -4
- package/dist/connectors/slack/dlq.js +6 -6
- package/dist/connectors/slack/ingest.d.ts +6 -4
- package/dist/connectors/slack/ingest.js +5 -5
- package/dist/connectors/slack/signature.d.ts +4 -1
- package/dist/connectors/slack/tenant-routing.d.ts +6 -4
- package/dist/connectors/slack/tenant-routing.js +6 -6
- package/dist/connectors/slack/transform.d.ts +6 -2
- package/dist/connectors/slack/transform.js +6 -2
- package/dist/connectors/slack/types.d.ts +3 -1
- package/dist/connectors/slack/web-client.js +8 -3
- package/dist/connectors/slack/webhook.d.ts +5 -5
- package/dist/connectors/slack/webhook.js +19 -11
- package/dist/connectors/slack/workspaces.d.ts +7 -3
- package/dist/connectors/slack/workspaces.js +7 -3
- package/dist/connectors/store.d.ts +8 -0
- package/dist/connectors/store.js +2 -0
- package/dist/consolidate/conflicts.js +23 -9
- package/dist/consolidate/dag-summary.js +2 -1
- package/dist/consolidate/dag.d.ts +10 -5
- package/dist/consolidate/dag.js +37 -36
- package/dist/consolidate/decay.js +19 -6
- package/dist/consolidate/dedupe.d.ts +14 -5
- package/dist/consolidate/dedupe.js +27 -16
- package/dist/consolidate/flush-units.d.ts +4 -1
- package/dist/consolidate/flush-units.js +4 -1
- package/dist/consolidate/half-life-migration.d.ts +18 -8
- package/dist/consolidate/half-life-migration.js +48 -18
- package/dist/consolidate/llm-passes.js +27 -11
- package/dist/consolidate/memory-value-weights.d.ts +6 -2
- package/dist/consolidate/memory-value-weights.js +6 -2
- package/dist/consolidate/memory-value.d.ts +30 -10
- package/dist/consolidate/memory-value.js +36 -13
- package/dist/consolidate/merge.d.ts +4 -1
- package/dist/consolidate/merge.js +42 -32
- package/dist/consolidate/overlap-index.d.ts +8 -2
- package/dist/consolidate/overlap-index.js +11 -4
- package/dist/consolidate/physics-pass.d.ts +3 -1
- package/dist/consolidate/physics-pass.js +10 -7
- package/dist/consolidate/replay.d.ts +11 -4
- package/dist/consolidate/replay.js +19 -7
- package/dist/consolidate/run.d.ts +13 -5
- package/dist/consolidate/run.js +4 -4
- package/dist/consolidate/sleep.d.ts +14 -6
- package/dist/consolidate/sleep.js +41 -38
- package/dist/consolidate/trace.d.ts +7 -2
- package/dist/consolidate/trace.js +7 -2
- package/dist/consolidate/traces.js +26 -29
- package/dist/core/ablation.d.ts +9 -3
- package/dist/core/ablation.js +14 -4
- package/dist/core/active-scope.d.ts +3 -1
- package/dist/core/active-scope.js +3 -1
- package/dist/core/agent-memory-tools.d.ts +2 -0
- package/dist/core/agent-memory-tools.js +2 -0
- package/dist/core/ambient.d.ts +4 -3
- package/dist/core/ambient.js +8 -6
- package/dist/core/api-errors.d.ts +9 -3
- package/dist/core/api-errors.js +9 -3
- package/dist/core/capture-contract.d.ts +4 -1
- package/dist/core/capture-contract.js +27 -8
- package/dist/core/compare.d.ts +24 -8
- package/dist/core/compare.js +24 -8
- package/dist/core/config.d.ts +18 -9
- package/dist/core/config.js +24 -14
- package/dist/core/cosine.d.ts +4 -1
- package/dist/core/cosine.js +4 -1
- package/dist/core/handoff.d.ts +7 -2
- package/dist/core/handoff.js +4 -1
- package/dist/core/markdown.js +21 -16
- package/dist/core/memory-audit.js +14 -3
- package/dist/core/memory-quality.d.ts +12 -3
- package/dist/core/memory-quality.js +57 -21
- package/dist/core/memory.d.ts +84 -27
- package/dist/core/memory.js +73 -29
- package/dist/core/merged-row.d.ts +8 -2
- package/dist/core/merged-row.js +10 -3
- package/dist/core/package-root.d.ts +3 -1
- package/dist/core/package-root.js +3 -1
- package/dist/core/particle-refresh.d.ts +8 -0
- package/dist/core/particle-refresh.js +22 -0
- package/dist/core/physics-config.d.ts +4 -1
- package/dist/core/physics-config.js +6 -2
- package/dist/core/physics.d.ts +37 -11
- package/dist/core/physics.js +55 -20
- package/dist/core/project-identity.d.ts +34 -17
- package/dist/core/project-identity.js +33 -17
- package/dist/core/project-remote.d.ts +8 -4
- package/dist/core/project-remote.js +31 -14
- package/dist/core/recall-scope.d.ts +33 -11
- package/dist/core/recall-scope.js +42 -15
- package/dist/core/rejection-digest.d.ts +7 -0
- package/dist/core/rejection-digest.js +13 -0
- package/dist/core/salience.d.ts +3 -1
- package/dist/core/salience.js +10 -4
- package/dist/core/search-types.d.ts +15 -2
- package/dist/core/search-types.js +11 -0
- package/dist/dashboard/dashboard-actions.js +13 -2
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
- package/dist/dashboard/dashboard-snapshot.js +4 -4
- package/dist/dashboard/dashboard.js +6 -3
- package/dist/db/backup.js +2 -2
- package/dist/db/busy.d.ts +10 -3
- package/dist/db/busy.js +27 -5
- package/dist/db/connect.d.ts +10 -3
- package/dist/db/connect.js +8 -3
- package/dist/db/continuity.d.ts +1 -1
- package/dist/db/continuity.js +27 -11
- package/dist/db/meta.d.ts +4 -1
- package/dist/db/meta.js +4 -1
- package/dist/db/migrate.d.ts +10 -5
- package/dist/db/migrate.js +26 -13
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/types.d.ts +2 -1
- package/dist/db/migrations/v12.js +2 -1
- package/dist/db/migrations/v14.js +2 -1
- package/dist/db/migrations/v15.js +4 -2
- package/dist/db/migrations/v16.js +6 -3
- package/dist/db/migrations/v17.js +2 -1
- package/dist/db/migrations/v19.js +4 -2
- package/dist/db/migrations/v20.js +2 -1
- package/dist/db/migrations/v22.js +12 -6
- package/dist/db/migrations/v23.js +6 -3
- package/dist/db/migrations/v24.js +6 -3
- package/dist/db/migrations/v25.js +4 -2
- package/dist/db/migrations/v26.js +4 -2
- package/dist/db/migrations/v27.js +6 -3
- package/dist/db/migrations/v28.js +4 -2
- package/dist/db/migrations/v29.js +4 -2
- package/dist/db/migrations/v30.js +6 -3
- package/dist/db/migrations/v31.js +4 -2
- package/dist/db/migrations/v32.js +6 -3
- package/dist/db/migrations/v33.js +4 -2
- package/dist/db/migrations/v34.js +2 -1
- package/dist/db/migrations/v35.js +2 -1
- package/dist/db/migrations/v36.js +2 -1
- package/dist/db/migrations/v37.js +10 -5
- package/dist/db/migrations/v38.js +10 -5
- package/dist/db/migrations/v39.js +14 -6
- package/dist/db/migrations/v40.js +4 -2
- package/dist/db/migrations/v41.js +4 -2
- package/dist/db/migrations/v42.js +2 -1
- package/dist/db/migrations/v44.js +4 -2
- package/dist/db/migrations/v45.js +4 -2
- package/dist/db/migrations/v49.js +2 -1
- package/dist/db/migrations/v50.js +4 -2
- package/dist/db/migrations/v51.js +4 -2
- package/dist/db/migrations/v52.js +2 -1
- package/dist/db/migrations/v53.js +8 -4
- package/dist/db/migrations/v54.js +2 -1
- package/dist/db/migrations/v55.js +4 -2
- package/dist/db/migrations/v56.d.ts +3 -0
- package/dist/db/migrations/v56.js +28 -0
- package/dist/db/open.d.ts +24 -12
- package/dist/db/open.js +25 -13
- package/dist/db/physics-state.d.ts +8 -4
- package/dist/db/physics-state.js +13 -20
- package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
- package/dist/db/raw-archive-mirror-cleanup.js +6 -4
- package/dist/db/request-stores.d.ts +19 -5
- package/dist/db/request-stores.js +14 -5
- package/dist/db/tables.d.ts +2 -1
- package/dist/db/tables.js +12 -4
- package/dist/db/vector-store.d.ts +13 -4
- package/dist/db/vector-store.js +34 -14
- package/dist/db/wal-checkpointer.d.ts +2 -1
- package/dist/db/wal-checkpointer.js +19 -7
- package/dist/doctor.d.ts +4 -1
- package/dist/doctor.js +121 -39
- package/dist/embeddings/local.d.ts +8 -4
- package/dist/embeddings/local.js +9 -5
- package/dist/embeddings/provider.d.ts +19 -10
- package/dist/embeddings/provider.js +31 -17
- package/dist/embeddings/transformers.d.ts +16 -4
- package/dist/embeddings/transformers.js +32 -15
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.js +2 -1
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +1 -1
- package/dist/entry/sqlite-handles.d.ts +10 -0
- package/dist/entry/sqlite-handles.js +9 -0
- package/dist/entry/store-kit.d.ts +19 -6
- package/dist/entry/store-kit.js +6 -4
- package/dist/eval/eval-stats.d.ts +27 -8
- package/dist/eval/eval-stats.js +17 -5
- package/dist/eval/eval-suite.d.ts +3 -1
- package/dist/eval/eval-suite.js +409 -187
- package/dist/eval/eval.d.ts +8 -2
- package/dist/eval/eval.js +8 -2
- package/dist/eval/judgment.js +16 -6
- package/dist/graph/delta.d.ts +9 -42
- package/dist/graph/delta.js +17 -11
- package/dist/graph/extract.d.ts +10 -7
- package/dist/graph/extract.js +57 -25
- package/dist/graph/recall.d.ts +12 -4
- package/dist/graph/recall.js +30 -13
- package/dist/graph/stream.d.ts +18 -6
- package/dist/graph/stream.js +32 -10
- package/dist/graph/view.d.ts +19 -6
- package/dist/graph/view.js +42 -17
- package/dist/hooks/codex-session.js +2 -2
- package/dist/hooks/codex-wrapper.d.ts +3 -1
- package/dist/hooks/codex-wrapper.js +9 -4
- package/dist/hooks/copilot.d.ts +19 -5
- package/dist/hooks/copilot.js +54 -15
- package/dist/hooks/hook-blocks.d.ts +4 -1
- package/dist/hooks/hook-blocks.js +8 -3
- package/dist/hooks/json-hooks.d.ts +9 -5
- package/dist/hooks/json-hooks.js +69 -34
- package/dist/hooks/opencode.js +15 -5
- package/dist/hooks/shared.d.ts +27 -8
- package/dist/hooks/shared.js +57 -16
- package/dist/importers/core.d.ts +12 -4
- package/dist/importers/core.js +8 -7
- package/dist/importers/markdown-parse.d.ts +15 -5
- package/dist/importers/markdown-parse.js +16 -7
- package/dist/importers/markdown.js +6 -9
- package/dist/importers/sources.js +10 -23
- package/dist/importers/vault.d.ts +2 -2
- package/dist/importers/vault.js +43 -27
- package/dist/index.d.ts +32 -6
- package/dist/index.js +25 -7
- package/dist/learn/autolearn.d.ts +17 -6
- package/dist/learn/autolearn.js +53 -24
- package/dist/learn/churn-git.d.ts +4 -1
- package/dist/learn/churn-git.js +29 -5
- package/dist/learn/extract.d.ts +4 -1
- package/dist/learn/extract.js +16 -9
- package/dist/learn/forward-claim-detector.d.ts +17 -5
- package/dist/learn/forward-claim-detector.js +34 -15
- package/dist/learn/invalidation.d.ts +12 -7
- package/dist/learn/invalidation.js +56 -27
- package/dist/learn/roots.d.ts +3 -0
- package/dist/learn/roots.js +5 -0
- package/dist/mcp/admin-tools.d.ts +5 -5
- package/dist/mcp/admin-tools.js +28 -23
- package/dist/mcp/format.d.ts +1 -1
- package/dist/mcp/format.js +4 -2
- package/dist/mcp/framing.d.ts +3 -1
- package/dist/mcp/framing.js +20 -8
- package/dist/mcp/memory-tools.d.ts +3 -3
- package/dist/mcp/memory-tools.js +18 -14
- package/dist/mcp/protocol.d.ts +32 -16
- package/dist/mcp/protocol.js +12 -9
- package/dist/mcp/recall-tools.d.ts +3 -3
- package/dist/mcp/recall-tools.js +62 -74
- package/dist/mcp/request.d.ts +7 -5
- package/dist/mcp/request.js +57 -74
- package/dist/mcp/server.d.ts +3 -1
- package/dist/mcp/server.js +8 -3
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +4 -3
- package/dist/mcp/shared-gate.d.ts +3 -2
- package/dist/mcp/shared-gate.js +3 -2
- package/dist/mcp/stdio.d.ts +6 -3
- package/dist/mcp/stdio.js +52 -21
- package/dist/mcp/tool-args.d.ts +4 -1
- package/dist/mcp/tool-args.js +8 -3
- package/dist/mcp/tools.js +76 -32
- package/dist/objects/customer-notes.d.ts +12 -10
- package/dist/objects/customer-notes.js +21 -15
- package/dist/objects/decisions.d.ts +18 -10
- package/dist/objects/decisions.js +23 -17
- package/dist/objects/descriptor.js +2 -1
- package/dist/objects/fields.d.ts +4 -1
- package/dist/objects/fields.js +6 -2
- package/dist/objects/incidents.d.ts +14 -16
- package/dist/objects/incidents.js +29 -30
- package/dist/objects/lifecycle.d.ts +0 -4
- package/dist/objects/lifecycle.js +21 -24
- package/dist/objects/policies.d.ts +12 -16
- package/dist/objects/policies.js +17 -21
- package/dist/objects/processes.d.ts +16 -10
- package/dist/objects/processes.js +20 -15
- package/dist/objects/project-briefs.d.ts +13 -14
- package/dist/objects/project-briefs.js +33 -39
- package/dist/objects/skills.d.ts +10 -12
- package/dist/objects/skills.js +17 -22
- package/dist/postinstall.js +15 -7
- package/dist/predictions/planning-fallacy.d.ts +19 -6
- package/dist/predictions/planning-fallacy.js +4 -2
- package/dist/rerankers/clef.d.ts +8 -2
- package/dist/rerankers/clef.js +14 -9
- package/dist/rerankers/cross-encoder.d.ts +2 -1
- package/dist/rerankers/cross-encoder.js +9 -6
- package/dist/rerankers/index.js +2 -1
- package/dist/rerankers/jev.js +2 -1
- package/dist/rerankers/llm.d.ts +6 -2
- package/dist/rerankers/llm.js +8 -3
- package/dist/rerankers/remote.d.ts +3 -1
- package/dist/rerankers/remote.js +5 -2
- package/dist/rerankers/types.d.ts +6 -2
- package/dist/search/bm25-search.d.ts +3 -1
- package/dist/search/bm25-search.js +15 -2
- package/dist/search/boosts.js +4 -3
- package/dist/search/embed-memories.d.ts +10 -5
- package/dist/search/embed-memories.js +62 -36
- package/dist/search/engine.d.ts +4 -1
- package/dist/search/engine.js +6 -2
- package/dist/search/goal-boost.d.ts +10 -3
- package/dist/search/goal-boost.js +13 -6
- package/dist/search/hybrid-score.d.ts +4 -1
- package/dist/search/hybrid-score.js +4 -1
- package/dist/search/hybrid.d.ts +23 -8
- package/dist/search/hybrid.js +12 -7
- package/dist/search/multihop.js +14 -13
- package/dist/search/path-context.d.ts +10 -3
- package/dist/search/path-context.js +10 -3
- package/dist/search/physics-search.d.ts +9 -4
- package/dist/search/physics-search.js +38 -14
- package/dist/search/rerank.d.ts +2 -1
- package/dist/search/rerank.js +2 -1
- package/dist/search/rrf.d.ts +14 -5
- package/dist/search/rrf.js +11 -4
- package/dist/search/vector.d.ts +8 -2
- package/dist/search/vector.js +9 -3
- package/dist/server/auth.d.ts +18 -14
- package/dist/server/auth.js +69 -38
- package/dist/server/boot.d.ts +3 -1
- package/dist/server/boot.js +95 -56
- package/dist/server/client-ip.d.ts +11 -4
- package/dist/server/client-ip.js +27 -10
- package/dist/server/cursor.d.ts +10 -3
- package/dist/server/cursor.js +10 -3
- package/dist/server/deadline.d.ts +5 -2
- package/dist/server/deadline.js +10 -3
- package/dist/server/key-check-bounds.js +12 -4
- package/dist/server/lifecycle.d.ts +4 -1
- package/dist/server/lifecycle.js +10 -4
- package/dist/server/mcp-http.d.ts +2 -1
- package/dist/server/mcp-http.js +37 -22
- package/dist/server/rate-limit.d.ts +17 -5
- package/dist/server/rate-limit.js +55 -26
- package/dist/server/ready.js +7 -4
- package/dist/server/request.d.ts +15 -4
- package/dist/server/request.js +42 -15
- package/dist/server/route-checks.d.ts +4 -1
- package/dist/server/route-checks.js +8 -3
- package/dist/server/route-table.d.ts +8 -6
- package/dist/server/route-table.js +547 -93
- package/dist/server/routes/admin.d.ts +7 -7
- package/dist/server/routes/admin.js +36 -15
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +5 -4
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +12 -6
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +10 -4
- package/dist/server/routes/memories.d.ts +8 -8
- package/dist/server/routes/memories.js +12 -19
- package/dist/server/routes/object-routes.d.ts +8 -5
- package/dist/server/routes/object-routes.js +4 -2
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +11 -4
- package/dist/server/routes/predictions.d.ts +5 -5
- package/dist/server/routes/predictions.js +9 -4
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +15 -6
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +3 -2
- package/dist/server/routes/recall.d.ts +3 -3
- package/dist/server/routes/recall.js +21 -10
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +12 -4
- package/dist/server/server-detect.d.ts +24 -8
- package/dist/server/server-detect.js +57 -22
- package/dist/server/sleep-child.js +16 -10
- package/dist/server/sleep-offload.d.ts +8 -5
- package/dist/server/sleep-offload.js +41 -19
- package/dist/server/tls.d.ts +4 -1
- package/dist/server/tls.js +13 -5
- package/dist/server/types.d.ts +38 -26
- package/dist/server/validation.d.ts +4 -1
- package/dist/server/validation.js +22 -9
- package/dist/server.d.ts +15 -10
- package/dist/server.js +32 -12
- package/dist/sharing/global-store.d.ts +5 -10
- package/dist/sharing/global-store.js +8 -43
- package/dist/sharing/global-sync.d.ts +3 -1
- package/dist/sharing/global-sync.js +16 -6
- package/dist/sharing/project-merge.d.ts +25 -7
- package/dist/sharing/project-merge.js +49 -17
- package/dist/sharing/search-both.d.ts +8 -4
- package/dist/sharing/search-both.js +19 -12
- package/dist/sharing/share.d.ts +8 -4
- package/dist/sharing/share.js +39 -15
- package/dist/store/ambient.js +9 -5
- package/dist/store/audit-event.d.ts +2 -2
- package/dist/store/audit-event.js +8 -3
- package/dist/store/audit.d.ts +6 -3
- package/dist/store/audit.js +16 -6
- package/dist/store/auth.d.ts +4 -2
- package/dist/store/auth.js +63 -20
- package/dist/store/busy.d.ts +9 -0
- package/dist/store/busy.js +16 -0
- package/dist/store/candidates.d.ts +12 -5
- package/dist/store/candidates.js +75 -36
- package/dist/store/capture-write.d.ts +2 -1
- package/dist/store/capture-write.js +2 -1
- package/dist/store/card-detail.d.ts +4 -4
- package/dist/store/card-detail.js +15 -8
- package/dist/store/cards.d.ts +24 -10
- package/dist/store/cards.js +93 -60
- package/dist/store/compaction-caller.d.ts +2 -1
- package/dist/store/compaction-caller.js +2 -1
- package/dist/store/compactions-record.d.ts +14 -8
- package/dist/store/compactions-record.js +95 -32
- package/dist/store/compactions.js +35 -15
- package/dist/store/conflicts.d.ts +9 -4
- package/dist/store/conflicts.js +100 -45
- package/dist/store/connectors/dlq.d.ts +17 -5
- package/dist/store/connectors/dlq.js +56 -5
- package/dist/store/connectors/event-log.d.ts +111 -2
- package/dist/store/connectors/event-log.js +2 -1
- package/dist/store/connectors/github.d.ts +6 -3
- package/dist/store/connectors/github.js +24 -40
- package/dist/store/connectors/slack.d.ts +2 -1
- package/dist/store/connectors/slack.js +25 -37
- package/dist/store/dashboard-reads.d.ts +7 -3
- package/dist/store/dashboard-reads.js +32 -11
- package/dist/store/delete-and-batch.d.ts +17 -11
- package/dist/store/delete-and-batch.js +67 -26
- package/dist/store/delivery-recorder.d.ts +8 -5
- package/dist/store/delivery-recorder.js +70 -32
- package/dist/store/descendant-page.d.ts +2 -1
- package/dist/store/descendant-page.js +24 -9
- package/dist/store/diagnostics.d.ts +2 -1
- package/dist/store/diagnostics.js +2 -1
- package/dist/store/doctor-reads.d.ts +2 -1
- package/dist/store/doctor-reads.js +13 -5
- package/dist/store/dormant.d.ts +19 -11
- package/dist/store/dormant.js +40 -18
- package/dist/store/embeddings/index.d.ts +13 -9
- package/dist/store/embeddings/index.js +19 -12
- package/dist/store/entry-reads.d.ts +49 -20
- package/dist/store/entry-reads.js +181 -66
- package/dist/store/entry-row.d.ts +10 -6
- package/dist/store/entry-row.js +17 -12
- package/dist/store/entry-writes.d.ts +22 -10
- package/dist/store/entry-writes.js +41 -14
- package/dist/store/failure-log-at.js +1 -1
- package/dist/store/failure-log.d.ts +4 -2
- package/dist/store/failure-log.js +13 -6
- package/dist/store/gated-write.d.ts +3 -3
- package/dist/store/gated-write.js +3 -3
- package/dist/store/goals.d.ts +5 -4
- package/dist/store/goals.js +8 -10
- package/dist/store/graph-apply.d.ts +21 -0
- package/dist/{graph/write.js → store/graph-apply.js} +31 -11
- package/dist/store/graph-queue.d.ts +9 -6
- package/dist/store/graph-queue.js +15 -10
- package/dist/store/graph-reads.d.ts +16 -11
- package/dist/store/graph-reads.js +24 -15
- package/dist/store/graph-rows.d.ts +41 -3
- package/dist/store/graph-rows.js +10 -7
- package/dist/store/graph-view-rows.js +14 -7
- package/dist/store/graph-writes.d.ts +16 -10
- package/dist/store/graph-writes.js +59 -36
- package/dist/store/handoffs.d.ts +4 -4
- package/dist/store/handoffs.js +40 -19
- package/dist/store/index-and-stats.d.ts +2 -2
- package/dist/store/index-and-stats.js +6 -5
- package/dist/store/index.d.ts +3 -1
- package/dist/store/index.js +1 -0
- package/dist/store/key-audit.d.ts +2 -1
- package/dist/store/key-audit.js +2 -1
- package/dist/store/key-writes.d.ts +2 -1
- package/dist/store/key-writes.js +9 -2
- package/dist/store/ledger-turn.d.ts +4 -1
- package/dist/store/ledger-turn.js +7 -2
- package/dist/store/mirrors.d.ts +11 -4
- package/dist/store/mirrors.js +88 -16
- package/dist/store/narrow.d.ts +6 -0
- package/dist/store/narrow.js +11 -0
- package/dist/store/open.d.ts +4 -2
- package/dist/store/open.js +18 -9
- package/dist/store/pilot-arm.d.ts +2 -1
- package/dist/store/pilot-arm.js +18 -6
- package/dist/store/planning-fallacy-evidence.d.ts +2 -2
- package/dist/store/planning-fallacy-evidence.js +8 -5
- package/dist/store/port/agent-import.d.ts +62 -0
- package/dist/store/port/agent-import.js +2 -0
- package/dist/store/port/consolidation.d.ts +129 -0
- package/dist/store/port/consolidation.js +2 -0
- package/dist/store/port/learning.d.ts +19 -0
- package/dist/store/port/learning.js +2 -0
- package/dist/store/port/local-files.d.ts +18 -0
- package/dist/store/port/local-files.js +2 -0
- package/dist/store/port/promotion.d.ts +20 -0
- package/dist/store/port/promotion.js +3 -0
- package/dist/store/port-groups.d.ts +160 -0
- package/dist/store/port-groups.js +2 -0
- package/dist/store/port.d.ts +215 -229
- package/dist/store/port.js +3 -9
- package/dist/store/predictions.d.ts +14 -10
- package/dist/store/predictions.js +37 -17
- package/dist/store/project-tags.d.ts +4 -1
- package/dist/store/project-tags.js +16 -5
- package/dist/store/quality-repair.d.ts +8 -4
- package/dist/store/quality-repair.js +53 -20
- package/dist/store/quarantine.d.ts +1 -0
- package/dist/store/quarantine.js +23 -9
- package/dist/store/raw-archive.d.ts +5 -4
- package/dist/store/raw-archive.js +11 -10
- package/dist/store/recall-trace.d.ts +22 -17
- package/dist/store/recall-trace.js +126 -63
- package/dist/store/rejected-values.d.ts +15 -10
- package/dist/store/rejected-values.js +33 -12
- package/dist/store/rejection.d.ts +12 -11
- package/dist/store/rejection.js +18 -19
- package/dist/store/report-reads.d.ts +2 -1
- package/dist/store/report-reads.js +2 -1
- package/dist/store/rows.d.ts +7 -5
- package/dist/store/rows.js +18 -11
- package/dist/store/rule-sql.d.ts +6 -4
- package/dist/store/rule-sql.js +16 -9
- package/dist/store/search-rows.d.ts +14 -9
- package/dist/store/search-rows.js +48 -23
- package/dist/store/sessions.d.ts +12 -10
- package/dist/store/sessions.js +40 -21
- package/dist/store/set-aside.d.ts +2 -2
- package/dist/store/set-aside.js +18 -5
- package/dist/store/sqlite/agent-import.d.ts +3 -0
- package/dist/store/sqlite/agent-import.js +77 -0
- package/dist/store/sqlite/cards-group.d.ts +6 -0
- package/dist/store/sqlite/cards-group.js +37 -0
- package/dist/store/sqlite/conflicts-group.d.ts +6 -0
- package/dist/store/sqlite/conflicts-group.js +18 -0
- package/dist/store/sqlite/connector-events-group.d.ts +2 -1
- package/dist/store/sqlite/connector-events-group.js +17 -6
- package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
- package/dist/store/sqlite/connector-writes-group.js +9 -4
- package/dist/store/sqlite/consolidation-group.d.ts +4 -0
- package/dist/store/sqlite/consolidation-group.js +64 -0
- package/dist/store/sqlite/dag-reads-group.js +1 -1
- package/dist/store/sqlite/dormant-group.d.ts +6 -0
- package/dist/store/sqlite/dormant-group.js +29 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +6 -3
- package/dist/store/sqlite/entry-writes-group.js +37 -14
- package/dist/store/sqlite/error-codec.d.ts +4 -2
- package/dist/store/sqlite/error-codec.js +32 -10
- package/dist/store/sqlite/executor-counts.js +2 -1
- package/dist/store/sqlite/executor.d.ts +8 -3
- package/dist/store/sqlite/executor.js +56 -18
- package/dist/store/sqlite/global-promote.d.ts +5 -0
- package/dist/store/sqlite/global-promote.js +48 -0
- package/dist/store/sqlite/goals-group.d.ts +6 -0
- package/dist/store/sqlite/goals-group.js +23 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
- package/dist/store/sqlite/graph-reads-group.js +2 -1
- package/dist/store/sqlite/held-connection.d.ts +7 -1
- package/dist/store/sqlite/held-connection.js +34 -7
- package/dist/store/sqlite/last-recall-group.d.ts +4 -2
- package/dist/store/sqlite/last-recall-group.js +9 -4
- package/dist/store/sqlite/learning-group.d.ts +4 -0
- package/dist/store/sqlite/learning-group.js +17 -0
- package/dist/store/sqlite/maintenance-groups.js +2 -1
- package/dist/store/sqlite/object-rows.d.ts +6 -3
- package/dist/store/sqlite/object-rows.js +34 -5
- package/dist/store/sqlite/objects-group.d.ts +5 -4
- package/dist/store/sqlite/objects-group.js +84 -33
- package/dist/store/sqlite/predictions-group.d.ts +2 -1
- package/dist/store/sqlite/predictions-group.js +4 -2
- package/dist/store/sqlite/promotion-group.d.ts +3 -0
- package/dist/store/sqlite/promotion-group.js +10 -0
- package/dist/store/sqlite/quarantine-group.d.ts +2 -1
- package/dist/store/sqlite/quarantine-group.js +4 -2
- package/dist/store/sqlite/reports-group.d.ts +6 -0
- package/dist/store/sqlite/reports-group.js +33 -0
- package/dist/store/sqlite/request-scope.d.ts +6 -0
- package/dist/store/sqlite/request-scope.js +18 -0
- package/dist/store/sqlite/sessions-group.d.ts +6 -0
- package/dist/store/sqlite/sessions-group.js +46 -0
- package/dist/store/sqlite/store.d.ts +22 -11
- package/dist/store/sqlite/store.js +84 -11
- package/dist/store/sqlite/vector-pack.js +2 -1
- package/dist/store/sqlite/vector-reads-group.js +2 -1
- package/dist/store/sqlite/worker-jobs.d.ts +2 -1
- package/dist/store/sqlite/worker-jobs.js +19 -7
- package/dist/store/sqlite/worker-ops.d.ts +10 -5
- package/dist/store/sqlite/worker-ops.js +6 -3
- package/dist/store/sqlite/worker-store.d.ts +4 -3
- package/dist/store/sqlite/worker-store.js +24 -14
- package/dist/store/summaries.d.ts +19 -12
- package/dist/store/summaries.js +36 -21
- package/dist/store/summary-dirty.d.ts +2 -1
- package/dist/store/summary-dirty.js +2 -1
- package/dist/store/tenant.d.ts +3 -2
- package/dist/store/tenant.js +5 -4
- package/dist/store/token-ledger-rows.js +6 -3
- package/dist/store/token-ledger.d.ts +19 -13
- package/dist/store/token-ledger.js +27 -14
- package/dist/store/tombstone-checks.d.ts +4 -1
- package/dist/store/tombstone-checks.js +10 -1
- package/dist/store/usage-reports.js +2 -1
- package/dist/store/vector-index.d.ts +8 -5
- package/dist/store/vector-index.js +24 -10
- package/dist/store/working-memory.d.ts +6 -4
- package/dist/store/working-memory.js +14 -9
- package/dist/support-bundle.js +10 -5
- package/dist/trust/quarantine.d.ts +1 -2
- package/dist/trust/quarantine.js +1 -5
- package/dist/trust/reject-flow.d.ts +12 -3
- package/dist/trust/reject-flow.js +12 -4
- package/dist/util/anthropic-messages.d.ts +4 -1
- package/dist/util/anthropic-messages.js +14 -5
- package/dist/util/atomic-write.d.ts +4 -2
- package/dist/util/atomic-write.js +25 -14
- package/dist/util/compaction-items.d.ts +4 -1
- package/dist/util/compaction-items.js +8 -2
- package/dist/util/crash-handlers.d.ts +7 -2
- package/dist/util/crash-handlers.js +13 -4
- package/dist/util/env.d.ts +16 -4
- package/dist/util/env.js +78 -25
- package/dist/util/home-path.js +12 -6
- package/dist/util/hook-payload.d.ts +3 -1
- package/dist/util/hook-payload.js +3 -1
- package/dist/util/http-retry.d.ts +12 -6
- package/dist/util/http-retry.js +16 -6
- package/dist/util/http-util.d.ts +20 -5
- package/dist/util/http-util.js +28 -9
- package/dist/util/json.d.ts +4 -1
- package/dist/util/json.js +4 -1
- package/dist/util/keyset.js +2 -1
- package/dist/util/limits.js +4 -2
- package/dist/util/log.d.ts +13 -5
- package/dist/util/log.js +29 -6
- package/dist/util/net.d.ts +5 -0
- package/dist/util/net.js +19 -0
- package/dist/util/real-path.d.ts +2 -1
- package/dist/util/real-path.js +4 -3
- package/dist/util/request-scope.d.ts +11 -3
- package/dist/util/request-scope.js +13 -4
- package/dist/util/same-text.d.ts +10 -3
- package/dist/util/same-text.js +10 -3
- package/dist/util/secret-detect.d.ts +24 -7
- package/dist/util/secret-detect.js +49 -14
- package/dist/util/spawn-argv.d.ts +3 -1
- package/dist/util/spawn-argv.js +13 -4
- package/dist/util/sqlite-blocked.d.ts +15 -4
- package/dist/util/sqlite-blocked.js +19 -6
- package/dist/util/stored-json.d.ts +4 -1
- package/dist/util/stored-json.js +6 -2
- package/dist/util/stream-tee.d.ts +2 -1
- package/dist/util/stream-tee.js +8 -5
- package/dist/util/transcript-tail.d.ts +4 -1
- package/dist/util/transcript-tail.js +4 -1
- package/dist/util/version.d.ts +8 -3
- package/dist/util/version.js +8 -3
- package/dist/util/write-budget.d.ts +7 -2
- package/dist/util/write-budget.js +5 -2
- package/dist/util/yaml.d.ts +4 -1
- package/dist/util/yaml.js +4 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -1
- package/scripts/postinstall.cjs +3 -1
- package/dist/api/cards.d.ts +0 -42
- package/dist/api/conflicts.d.ts +0 -28
- package/dist/api/conflicts.js +0 -61
- package/dist/api/dormant.d.ts +0 -14
- package/dist/api/dormant.js +0 -58
- package/dist/api/goals.d.ts +0 -18
- package/dist/api/graph.d.ts +0 -8
- package/dist/api/graph.js +0 -8
- package/dist/api/learn.js +0 -125
- package/dist/api/memories.d.ts +0 -25
- package/dist/api/objects.d.ts +0 -9
- package/dist/api/outcome.d.ts +0 -19
- package/dist/api/predictions.d.ts +0 -11
- package/dist/api/promote.d.ts +0 -36
- package/dist/api/recall-core.d.ts +0 -4
- package/dist/api/recall-core.js +0 -125
- package/dist/api/recall-finish.d.ts +0 -53
- package/dist/api/recall-finish.js +0 -30
- package/dist/api/recall-history.d.ts +0 -64
- package/dist/api/recall-history.js +0 -159
- package/dist/api/recall-record.d.ts +0 -43
- package/dist/api/recall-record.js +0 -78
- package/dist/api/recall-request.js +0 -121
- package/dist/api/recall.d.ts +0 -6
- package/dist/api/refine.d.ts +0 -7
- package/dist/api/refine.js +0 -10
- package/dist/api/session-owners.d.ts +0 -4
- package/dist/api/session-owners.js +0 -17
- package/dist/api/sleep-run.d.ts +0 -26
- package/dist/api/sleep.js +0 -11
- package/dist/graph/write.d.ts +0 -14
- package/dist/store/sqlite/busy.d.ts +0 -3
- package/dist/store/sqlite/busy.js +0 -8
- package/dist/store/sqlite/local.d.ts +0 -4
- package/dist/store/sqlite/local.js +0 -8
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
/** Retrieval-trace persistence: the single producer for `recall_traces`, `recall_trace_results` and
|
|
2
|
-
* One trace row per recall on api.recall, api.getContext and CLI cmdRecall: the (query, shown,
|
|
3
|
-
* All writes are fail-soft: a failed trace write is logged to stderr
|
|
1
|
+
/** Retrieval-trace persistence: the single producer for `recall_traces`, `recall_trace_results` and
|
|
2
|
+
* `recall_trace_outcomes`. One trace row per recall on api.recall, api.getContext and CLI cmdRecall: the (query, shown,
|
|
3
|
+
* outcome) triple the learned components train on. All writes are fail-soft: a failed trace write is logged to stderr
|
|
4
|
+
* and swallowed, never breaking the surrounding call. */
|
|
4
5
|
import { type DatabaseSyncLike } from '../db/index.js';
|
|
5
6
|
import type { RerankStep } from '../core/search-types.js';
|
|
6
7
|
import { type DeliveryEventInput } from './delivery-recorder.js';
|
|
@@ -12,7 +13,7 @@ export interface RecallTraceResultInput {
|
|
|
12
13
|
* (or empty) persists `rerank_json` as NULL. */
|
|
13
14
|
rerankSteps?: RerankStep[];
|
|
14
15
|
}
|
|
15
|
-
/** Input to `writeRecallTrace
|
|
16
|
+
/** Input to `writeRecallTrace`. */
|
|
16
17
|
export interface RecallTraceInput {
|
|
17
18
|
tenantId: string;
|
|
18
19
|
sessionId?: string | null;
|
|
@@ -26,12 +27,9 @@ export interface RecallTraceInput {
|
|
|
26
27
|
/** Results in returned rank order (index 0 = rank 1). */
|
|
27
28
|
results: RecallTraceResultInput[];
|
|
28
29
|
}
|
|
29
|
-
/** Insert a `recall_traces` row and its results rows in ONE transaction on the given connection. Fail-soft: logs to
|
|
30
|
-
* api.recall/getContext reach this via `finishRecallAt` on their own handle
|
|
30
|
+
/** Insert a `recall_traces` row and its results rows in ONE transaction on the given connection. Fail-soft: logs to
|
|
31
|
+
* stderr and returns null on failure. api.recall/getContext reach this via `finishRecallAt` on their own handle. */
|
|
31
32
|
export declare function writeRecallTrace(db: DatabaseSyncLike, input: RecallTraceInput): number | null;
|
|
32
|
-
/** Short-lived connection at `root`: writes the trace, closes; returns the id or null (fail-soft). For CLI cmdRecall; api.recall must reuse its open handle.
|
|
33
|
-
* LOCKSTEP: never touches `last_trace_id`, which advances only in the same `saveIndex` write as `last_retrieval_ids`; the caller sets it from the id. */
|
|
34
|
-
export declare function writeRecallTraceAtRoot(root: string, input: RecallTraceInput): number | null;
|
|
35
33
|
/** Input to `recordTraceOutcome`. */
|
|
36
34
|
export interface RecordTraceOutcomeInput {
|
|
37
35
|
traceId: number;
|
|
@@ -40,14 +38,17 @@ export interface RecordTraceOutcomeInput {
|
|
|
40
38
|
/** Ids actually credited by this outcome event (post tenant-filtering). */
|
|
41
39
|
memoryIds: string[];
|
|
42
40
|
}
|
|
43
|
-
/** Record an outcome against a trace; call ONLY with ids from last-retrieval state or an SDK `traceId`, never from
|
|
44
|
-
* Skips (log.warn) unless the trace is in `input.tenantId`; keeps only memoryIds it
|
|
41
|
+
/** Record an outcome against a trace; call ONLY with ids from last-retrieval state or an SDK `traceId`, never from
|
|
42
|
+
* api.outcome (stale-trace mislink). Skips (log.warn) unless the trace is in `input.tenantId`; keeps only memoryIds it
|
|
43
|
+
* returned. Own table so `pruneAuditLog` cannot erase training data. */
|
|
45
44
|
export declare function recordTraceOutcome(db: DatabaseSyncLike, input: RecordTraceOutcomeInput): void;
|
|
46
|
-
/** Pruned on write, counted back from the event's ts capped at the real clock, so a far-future fake time spares real
|
|
45
|
+
/** Pruned on write, counted back from the event's ts capped at the real clock, so a far-future fake time spares real
|
|
46
|
+
* rows. */
|
|
47
47
|
export declare const DELIVERY_LEDGER_RETENTION_DAYS = 90;
|
|
48
48
|
/** Lock wait for the ledger's own connection: a busy store drops the row rather than slow the hook. */
|
|
49
49
|
export declare const DELIVERY_LEDGER_WAIT_MS = 50;
|
|
50
|
-
/** Two prompt-identical events without a host turn id, or two boundary events of one type, this close are one fire
|
|
50
|
+
/** Two prompt-identical events without a host turn id, or two boundary events of one type, this close are one fire
|
|
51
|
+
* twice. */
|
|
51
52
|
export declare const DELIVERY_DUPLICATE_WINDOW_MS = 2000;
|
|
52
53
|
/** One stored `delivery_candidates` row. */
|
|
53
54
|
export interface DeliveryCandidateRow {
|
|
@@ -105,12 +106,16 @@ export interface DeliveryEventRow {
|
|
|
105
106
|
failure_id: number | null;
|
|
106
107
|
candidates: DeliveryCandidateRow[];
|
|
107
108
|
}
|
|
108
|
-
/** One event plus its candidates in one write transaction, then prune; fail-soft. The caller must not hold a
|
|
109
|
+
/** One event plus its candidates in one write transaction, then prune; fail-soft. The caller must not hold a
|
|
110
|
+
* transaction on `db`. */
|
|
109
111
|
export declare function writeDeliveryEvent(db: DatabaseSyncLike, input: DeliveryEventInput): number | null;
|
|
110
|
-
/** Write on the request's handle, or a short-lived one, waiting at most {@link DELIVERY_LEDGER_WAIT_MS} for the lock.
|
|
112
|
+
/** Write on the request's handle, or a short-lived one, waiting at most {@link DELIVERY_LEDGER_WAIT_MS} for the lock.
|
|
113
|
+
* Fail-soft. */
|
|
111
114
|
export declare function writeDeliveryEventAtRoot(root: string, input: DeliveryEventInput): number | null;
|
|
112
|
-
/** On a caller's open handle, which saves a second open and close per turn; the handle's own lock wait comes back
|
|
115
|
+
/** On a caller's open handle, which saves a second open and close per turn; the handle's own lock wait comes back
|
|
116
|
+
* after. */
|
|
113
117
|
export declare function writeDeliveryEventOnHandle(db: DatabaseSyncLike, input: DeliveryEventInput): number | null;
|
|
114
|
-
/** A session's delivery events in write order, each with its candidate rows; `sessionId` null reads session-less
|
|
118
|
+
/** A session's delivery events in write order, each with its candidate rows; `sessionId` null reads session-less
|
|
119
|
+
* events. */
|
|
115
120
|
export declare function readDeliveryEvents(db: DatabaseSyncLike, tenantId: string, sessionId: string | null): DeliveryEventRow[];
|
|
116
121
|
//# sourceMappingURL=recall-trace.d.ts.map
|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
/** Retrieval-trace persistence: the single producer for `recall_traces`, `recall_trace_results` and
|
|
2
|
-
* One trace row per recall on api.recall, api.getContext and CLI cmdRecall: the (query, shown,
|
|
3
|
-
* All writes are fail-soft: a failed trace write is logged to stderr
|
|
1
|
+
/** Retrieval-trace persistence: the single producer for `recall_traces`, `recall_trace_results` and
|
|
2
|
+
* `recall_trace_outcomes`. One trace row per recall on api.recall, api.getContext and CLI cmdRecall: the (query, shown,
|
|
3
|
+
* outcome) triple the learned components train on. All writes are fail-soft: a failed trace write is logged to stderr
|
|
4
|
+
* and swallowed, never breaking the surrounding call. */
|
|
4
5
|
import { openHippoDb, closeHippoDb, withWriteScope } from '../db/index.js';
|
|
5
|
-
import { rethrowIfSqliteBlocked } from '../util/sqlite-blocked.js';
|
|
6
6
|
import { DELIVERY_LEDGER_VERSION, isBoundaryEvent } from './delivery-recorder.js';
|
|
7
7
|
import { errorFields, errorMessage, log } from '../util/log.js';
|
|
8
8
|
import { DAY_MS } from '../util/time.js';
|
|
9
9
|
import { blockHash } from '../util/token-text.js';
|
|
10
10
|
import { placeholders } from '../util/sql.js';
|
|
11
|
-
/** Strip a RerankStep to {stage, multiplier, scoreBefore, scoreAfter}: `note` is free-form (the CLI goal-boost step
|
|
12
|
-
* user content into `rerank_json`; an allowlist, so any future free-form field is
|
|
11
|
+
/** Strip a RerankStep to {stage, multiplier, scoreBefore, scoreAfter}: `note` is free-form (the CLI goal-boost step
|
|
12
|
+
* embeds goal tag text) and would leak user content into `rerank_json`; an allowlist, so any future free-form field is
|
|
13
|
+
* dropped too. */
|
|
13
14
|
function sanitizeRerankSteps(steps) {
|
|
14
15
|
return steps.map((s) => ({
|
|
15
16
|
stage: s.stage,
|
|
@@ -18,15 +19,16 @@ function sanitizeRerankSteps(steps) {
|
|
|
18
19
|
scoreAfter: s.scoreAfter,
|
|
19
20
|
}));
|
|
20
21
|
}
|
|
21
|
-
/** Insert a `recall_traces` row and its results rows in ONE transaction on the given connection. Fail-soft: logs to
|
|
22
|
-
* api.recall/getContext reach this via `finishRecallAt` on their own handle
|
|
22
|
+
/** Insert a `recall_traces` row and its results rows in ONE transaction on the given connection. Fail-soft: logs to
|
|
23
|
+
* stderr and returns null on failure. api.recall/getContext reach this via `finishRecallAt` on their own handle. */
|
|
23
24
|
export function writeRecallTrace(db, input) {
|
|
24
25
|
try {
|
|
25
26
|
const queryHash = blockHash(input.query);
|
|
26
27
|
const ts = new Date().toISOString();
|
|
27
28
|
return withWriteScope(db, 'write_recall_trace', () => {
|
|
28
29
|
const insertTrace = db.prepare(`
|
|
29
|
-
INSERT INTO recall_traces (ts, tenant_id, session_id, pipeline, query_hash, query_length, result_count,
|
|
30
|
+
INSERT INTO recall_traces (ts, tenant_id, session_id, pipeline, query_hash, query_length, result_count,
|
|
31
|
+
explain_mode)
|
|
30
32
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
31
33
|
`);
|
|
32
34
|
const traceResult = insertTrace.run(ts, input.tenantId, input.sessionId ?? null, input.pipeline, queryHash, input.query.length, input.results.length, input.explainMode ? 1 : 0);
|
|
@@ -46,27 +48,9 @@ export function writeRecallTrace(db, input) {
|
|
|
46
48
|
return null;
|
|
47
49
|
}
|
|
48
50
|
}
|
|
49
|
-
/**
|
|
50
|
-
*
|
|
51
|
-
|
|
52
|
-
let db;
|
|
53
|
-
try {
|
|
54
|
-
db = openHippoDb(root);
|
|
55
|
-
}
|
|
56
|
-
catch (error) {
|
|
57
|
-
rethrowIfSqliteBlocked(error);
|
|
58
|
-
log.error(`recall trace connection failed: ${errorMessage(error)}`, errorFields(error));
|
|
59
|
-
return null;
|
|
60
|
-
}
|
|
61
|
-
try {
|
|
62
|
-
return writeRecallTrace(db, input);
|
|
63
|
-
}
|
|
64
|
-
finally {
|
|
65
|
-
closeHippoDb(db);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
/** Record an outcome against a trace; call ONLY with ids from last-retrieval state or an SDK `traceId`, never from api.outcome (stale-trace mislink).
|
|
69
|
-
* Skips (log.warn) unless the trace is in `input.tenantId`; keeps only memoryIds it returned. Own table so `pruneAuditLog` cannot erase training data. */
|
|
51
|
+
/** Record an outcome against a trace; call ONLY with ids from last-retrieval state or an SDK `traceId`, never from
|
|
52
|
+
* api.outcome (stale-trace mislink). Skips (log.warn) unless the trace is in `input.tenantId`; keeps only memoryIds it
|
|
53
|
+
* returned. Own table so `pruneAuditLog` cannot erase training data. */
|
|
70
54
|
export function recordTraceOutcome(db, input) {
|
|
71
55
|
try {
|
|
72
56
|
// SAFETY: row shape matches the single `tenant_id` column named in the
|
|
@@ -96,18 +80,52 @@ export function recordTraceOutcome(db, input) {
|
|
|
96
80
|
log.error(`recall trace outcome write failed: ${errorMessage(error)}`, errorFields(error));
|
|
97
81
|
}
|
|
98
82
|
}
|
|
99
|
-
/** Pruned on write, counted back from the event's ts capped at the real clock, so a far-future fake time spares real
|
|
83
|
+
/** Pruned on write, counted back from the event's ts capped at the real clock, so a far-future fake time spares real
|
|
84
|
+
* rows. */
|
|
100
85
|
export const DELIVERY_LEDGER_RETENTION_DAYS = 90;
|
|
101
86
|
/** Lock wait for the ledger's own connection: a busy store drops the row rather than slow the hook. */
|
|
102
87
|
export const DELIVERY_LEDGER_WAIT_MS = 50;
|
|
103
|
-
/** Two prompt-identical events without a host turn id, or two boundary events of one type, this close are one fire
|
|
88
|
+
/** Two prompt-identical events without a host turn id, or two boundary events of one type, this close are one fire
|
|
89
|
+
* twice. */
|
|
104
90
|
export const DELIVERY_DUPLICATE_WINDOW_MS = 2000;
|
|
105
91
|
const DELIVERY_EVENT_COLUMNS = [
|
|
106
|
-
'ts',
|
|
107
|
-
'
|
|
108
|
-
'
|
|
109
|
-
'
|
|
110
|
-
'
|
|
92
|
+
'ts',
|
|
93
|
+
'ledger_version',
|
|
94
|
+
'tenant_id',
|
|
95
|
+
'runtime',
|
|
96
|
+
'event_type',
|
|
97
|
+
'surface',
|
|
98
|
+
'store_hash',
|
|
99
|
+
'write_store',
|
|
100
|
+
'project_hash',
|
|
101
|
+
'session_id',
|
|
102
|
+
'session_state',
|
|
103
|
+
'host_turn_id',
|
|
104
|
+
'turn_seq',
|
|
105
|
+
'duplicate_of',
|
|
106
|
+
'prompt_hash',
|
|
107
|
+
'prompt_length',
|
|
108
|
+
'query_hash',
|
|
109
|
+
'recall_trace_id',
|
|
110
|
+
'block_state',
|
|
111
|
+
'prompt_recall',
|
|
112
|
+
'considered_count',
|
|
113
|
+
'filtered_count',
|
|
114
|
+
'selected_count',
|
|
115
|
+
'emitted_count',
|
|
116
|
+
'rejected_count',
|
|
117
|
+
'rejected_unlisted',
|
|
118
|
+
'sections_shown',
|
|
119
|
+
'sections_dropped',
|
|
120
|
+
'budget_tokens',
|
|
121
|
+
'selected_tokens',
|
|
122
|
+
'injected_tokens',
|
|
123
|
+
'static_hash',
|
|
124
|
+
'recall_hash',
|
|
125
|
+
'emitted_hash',
|
|
126
|
+
'elapsed_ms',
|
|
127
|
+
'tool_use_id',
|
|
128
|
+
'failure_id',
|
|
111
129
|
];
|
|
112
130
|
function findDuplicateBoundary(db, input) {
|
|
113
131
|
// SAFETY: rows carry exactly the `id` and `ts` columns selected.
|
|
@@ -149,11 +167,14 @@ function findDuplicateTurn(db, input) {
|
|
|
149
167
|
if (input.promptHash === null)
|
|
150
168
|
return null;
|
|
151
169
|
// SAFETY: rows carry exactly the `id` and `ts` columns selected.
|
|
152
|
-
const rows = db
|
|
170
|
+
const rows = db
|
|
171
|
+
.prepare(`
|
|
153
172
|
SELECT id, ts FROM delivery_events
|
|
154
|
-
WHERE tenant_id = ? AND session_id = ? AND event_type = ? AND prompt_hash = ? AND host_turn_id IS NULL AND turn_seq
|
|
173
|
+
WHERE tenant_id = ? AND session_id = ? AND event_type = ? AND prompt_hash = ? AND host_turn_id IS NULL AND turn_seq
|
|
174
|
+
IS NOT NULL
|
|
155
175
|
ORDER BY id
|
|
156
|
-
`)
|
|
176
|
+
`)
|
|
177
|
+
.all(input.tenantId, input.sessionId, input.eventType, input.promptHash);
|
|
157
178
|
const at = Date.parse(input.ts);
|
|
158
179
|
// Absolute difference: two hook processes can commit out of ts order.
|
|
159
180
|
return rows.find((r) => Math.abs(Date.parse(r.ts) - at) <= DELIVERY_DUPLICATE_WINDOW_MS)?.id ?? null;
|
|
@@ -166,7 +187,59 @@ function nextTurnSeq(db, input) {
|
|
|
166
187
|
`).get(input.tenantId, input.sessionId, input.eventType);
|
|
167
188
|
return (row.m ?? 0) + 1;
|
|
168
189
|
}
|
|
169
|
-
|
|
190
|
+
function deliveryEventValues(input, turnSeq, duplicateOf) {
|
|
191
|
+
return [
|
|
192
|
+
input.ts,
|
|
193
|
+
DELIVERY_LEDGER_VERSION,
|
|
194
|
+
input.tenantId,
|
|
195
|
+
input.runtime,
|
|
196
|
+
input.eventType,
|
|
197
|
+
input.surface,
|
|
198
|
+
input.storeHash,
|
|
199
|
+
input.writeStore,
|
|
200
|
+
input.projectHash,
|
|
201
|
+
input.sessionId,
|
|
202
|
+
input.sessionState,
|
|
203
|
+
input.hostTurnId,
|
|
204
|
+
turnSeq,
|
|
205
|
+
duplicateOf,
|
|
206
|
+
input.promptHash,
|
|
207
|
+
input.promptLength,
|
|
208
|
+
input.queryHash,
|
|
209
|
+
input.recallTraceId,
|
|
210
|
+
input.blockState,
|
|
211
|
+
input.promptRecall ? 1 : 0,
|
|
212
|
+
input.consideredCount,
|
|
213
|
+
input.filteredCount,
|
|
214
|
+
input.selectedCount,
|
|
215
|
+
input.emittedCount,
|
|
216
|
+
input.rejectedCount,
|
|
217
|
+
input.rejectedUnlisted,
|
|
218
|
+
input.sectionsShown,
|
|
219
|
+
input.sectionsDropped,
|
|
220
|
+
input.budgetTokens,
|
|
221
|
+
input.selectedTokens,
|
|
222
|
+
input.injectedTokens,
|
|
223
|
+
input.staticHash,
|
|
224
|
+
input.recallHash,
|
|
225
|
+
input.emittedHash,
|
|
226
|
+
Math.round(input.elapsedMs),
|
|
227
|
+
input.toolUseId ?? null,
|
|
228
|
+
input.failureId ?? null,
|
|
229
|
+
];
|
|
230
|
+
}
|
|
231
|
+
function insertDeliveryCandidates(db, eventId, input) {
|
|
232
|
+
const insertCandidate = db.prepare(`
|
|
233
|
+
INSERT INTO delivery_candidates (event_id, tenant_id, memory_id, source_store, pool, stage, outcome, reason,
|
|
234
|
+
cand_rank, score, tokens)
|
|
235
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
236
|
+
`);
|
|
237
|
+
for (const c of input.candidates) {
|
|
238
|
+
insertCandidate.run(eventId, input.tenantId, c.memoryId, c.sourceStore, c.pool, c.stage, c.outcome, c.reason, c.rank, c.score, c.tokens);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/** One event plus its candidates in one write transaction, then prune; fail-soft. The caller must not hold a
|
|
242
|
+
* transaction on `db`. */
|
|
170
243
|
export function writeDeliveryEvent(db, input) {
|
|
171
244
|
try {
|
|
172
245
|
return withWriteScope(db, 'write_delivery_event', () => {
|
|
@@ -174,26 +247,12 @@ export function writeDeliveryEvent(db, input) {
|
|
|
174
247
|
const isTurn = input.sessionId !== null && (input.sessionState === 'payload' || input.sessionState === 'env');
|
|
175
248
|
const duplicateOf = isTurn ? findDuplicateTurn(db, input) : null;
|
|
176
249
|
const turnSeq = isTurn && duplicateOf === null ? nextTurnSeq(db, input) : null;
|
|
177
|
-
const values =
|
|
178
|
-
input.ts, DELIVERY_LEDGER_VERSION, input.tenantId, input.runtime, input.eventType, input.surface, input.storeHash,
|
|
179
|
-
input.writeStore, input.projectHash, input.sessionId, input.sessionState, input.hostTurnId, turnSeq, duplicateOf,
|
|
180
|
-
input.promptHash, input.promptLength, input.queryHash, input.recallTraceId, input.blockState, input.promptRecall ? 1 : 0,
|
|
181
|
-
input.consideredCount, input.filteredCount, input.selectedCount, input.emittedCount, input.rejectedCount,
|
|
182
|
-
input.rejectedUnlisted, input.sectionsShown, input.sectionsDropped, input.budgetTokens, input.selectedTokens,
|
|
183
|
-
input.injectedTokens, input.staticHash, input.recallHash, input.emittedHash, Math.round(input.elapsedMs),
|
|
184
|
-
input.toolUseId ?? null, input.failureId ?? null,
|
|
185
|
-
];
|
|
250
|
+
const values = deliveryEventValues(input, turnSeq, duplicateOf);
|
|
186
251
|
const eventId = Number(db.prepare(`
|
|
187
252
|
INSERT INTO delivery_events (${DELIVERY_EVENT_COLUMNS.join(', ')})
|
|
188
253
|
VALUES (${placeholders(DELIVERY_EVENT_COLUMNS.length)})
|
|
189
254
|
`).run(...values).lastInsertRowid);
|
|
190
|
-
|
|
191
|
-
INSERT INTO delivery_candidates (event_id, tenant_id, memory_id, source_store, pool, stage, outcome, reason, cand_rank, score, tokens)
|
|
192
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
193
|
-
`);
|
|
194
|
-
for (const c of input.candidates) {
|
|
195
|
-
insertCandidate.run(eventId, input.tenantId, c.memoryId, c.sourceStore, c.pool, c.stage, c.outcome, c.reason, c.rank, c.score, c.tokens);
|
|
196
|
-
}
|
|
255
|
+
insertDeliveryCandidates(db, eventId, input);
|
|
197
256
|
const pruneFrom = Math.min(Date.parse(input.ts), Date.now());
|
|
198
257
|
const cutoff = new Date(pruneFrom - DELIVERY_LEDGER_RETENTION_DAYS * DAY_MS).toISOString();
|
|
199
258
|
db.prepare(`DELETE FROM delivery_events WHERE ts < ?`).run(cutoff);
|
|
@@ -201,18 +260,19 @@ export function writeDeliveryEvent(db, input) {
|
|
|
201
260
|
});
|
|
202
261
|
}
|
|
203
262
|
catch (error) {
|
|
204
|
-
log.error(`delivery ledger write failed: ${errorMessage(error)}
|
|
263
|
+
log.error(`delivery ledger write failed: ${errorMessage(error)}`, errorFields(error));
|
|
205
264
|
return null;
|
|
206
265
|
}
|
|
207
266
|
}
|
|
208
|
-
/** Write on the request's handle, or a short-lived one, waiting at most {@link DELIVERY_LEDGER_WAIT_MS} for the lock.
|
|
267
|
+
/** Write on the request's handle, or a short-lived one, waiting at most {@link DELIVERY_LEDGER_WAIT_MS} for the lock.
|
|
268
|
+
* Fail-soft. */
|
|
209
269
|
export function writeDeliveryEventAtRoot(root, input) {
|
|
210
270
|
let db;
|
|
211
271
|
try {
|
|
212
272
|
db = openHippoDb(root);
|
|
213
273
|
}
|
|
214
274
|
catch (error) {
|
|
215
|
-
log.error(`delivery ledger write failed: ${errorMessage(error)}
|
|
275
|
+
log.error(`delivery ledger write failed: ${errorMessage(error)}`, errorFields(error));
|
|
216
276
|
return null;
|
|
217
277
|
}
|
|
218
278
|
try {
|
|
@@ -222,7 +282,8 @@ export function writeDeliveryEventAtRoot(root, input) {
|
|
|
222
282
|
closeHippoDb(db);
|
|
223
283
|
}
|
|
224
284
|
}
|
|
225
|
-
/** On a caller's open handle, which saves a second open and close per turn; the handle's own lock wait comes back
|
|
285
|
+
/** On a caller's open handle, which saves a second open and close per turn; the handle's own lock wait comes back
|
|
286
|
+
* after. */
|
|
226
287
|
export function writeDeliveryEventOnHandle(db, input) {
|
|
227
288
|
const prior = Math.trunc(Number(db.prepare('PRAGMA busy_timeout').get().timeout));
|
|
228
289
|
db.exec(`PRAGMA busy_timeout = ${DELIVERY_LEDGER_WAIT_MS}`);
|
|
@@ -233,10 +294,12 @@ export function writeDeliveryEventOnHandle(db, input) {
|
|
|
233
294
|
db.exec(`PRAGMA busy_timeout = ${prior}`);
|
|
234
295
|
}
|
|
235
296
|
}
|
|
236
|
-
/** A session's delivery events in write order, each with its candidate rows; `sessionId` null reads session-less
|
|
297
|
+
/** A session's delivery events in write order, each with its candidate rows; `sessionId` null reads session-less
|
|
298
|
+
* events. */
|
|
237
299
|
export function readDeliveryEvents(db, tenantId, sessionId) {
|
|
238
300
|
// SAFETY: SELECT * over delivery_events returns exactly the columns DeliveryEventRow names, less `candidates`.
|
|
239
|
-
const events = db
|
|
301
|
+
const events = db
|
|
302
|
+
.prepare(`SELECT * FROM delivery_events WHERE tenant_id = ? AND session_id IS ? ORDER BY id`)
|
|
240
303
|
.all(tenantId, sessionId);
|
|
241
304
|
const candidates = db.prepare(`
|
|
242
305
|
SELECT * FROM delivery_candidates WHERE event_id = ?
|
|
@@ -4,25 +4,29 @@ import { type RejectedValueRow } from './rejection.js';
|
|
|
4
4
|
type HoldsValue = (text: string) => boolean;
|
|
5
5
|
/** The text, tenant and scope of the memory a rejection names. */
|
|
6
6
|
export type RejectionSource = NonNullable<ReturnType<typeof entryRejectRowAt>>;
|
|
7
|
-
/** One rejection as the store applies it. The three functions are the caller's policy over plain rows; none is handed
|
|
7
|
+
/** One rejection as the store applies it. The three functions are the caller's policy over plain rows; none is handed
|
|
8
|
+
* the handle. */
|
|
8
9
|
export interface Rejection {
|
|
9
10
|
readonly tenantId: string;
|
|
10
11
|
readonly actor: string;
|
|
11
12
|
readonly reason: string;
|
|
12
13
|
/** The memory whose row `textOf` is given; unset when the caller supplies the text itself. */
|
|
13
14
|
readonly memoryId?: string;
|
|
14
|
-
/** The text to reject. `source` is undefined when `memoryId` is unset or names no row; a throw refuses before any
|
|
15
|
+
/** The text to reject. `source` is undefined when `memoryId` is unset or names no row; a throw refuses before any
|
|
16
|
+
* write. */
|
|
15
17
|
readonly textOf: (source: RejectionSource | undefined) => string;
|
|
16
18
|
/** False for a row this caller may not remove. */
|
|
17
19
|
readonly inReach: (scope: string | null | undefined) => boolean;
|
|
18
|
-
/** What replaces a merged row once the rejected text leaves it: undefined when it holds none, null when nothing else
|
|
20
|
+
/** What replaces a merged row once the rejected text leaves it: undefined when it holds none, null when nothing else
|
|
21
|
+
* is left. */
|
|
19
22
|
readonly successorOf: (row: MemoryEntry, holdsValue: HoldsValue, removedIds: ReadonlySet<string>) => MemoryEntry | null | undefined;
|
|
20
23
|
}
|
|
21
24
|
export interface AppliedRejection {
|
|
22
25
|
digest: string;
|
|
23
26
|
/** The rejected text: the stored row keeps only its digest, so no later read can return it. */
|
|
24
27
|
content: string;
|
|
25
|
-
/** Every row removed, live or dormant: each whose digest matched, duplicates included, and each sleep-merged row
|
|
28
|
+
/** Every row removed, live or dormant: each whose digest matched, duplicates included, and each sleep-merged row
|
|
29
|
+
* holding the text. */
|
|
26
30
|
removedIds: string[];
|
|
27
31
|
/** The removedIds of kind 'raw', archived instead of deleted. */
|
|
28
32
|
removedRawIds: string[];
|
|
@@ -30,8 +34,9 @@ export interface AppliedRejection {
|
|
|
30
34
|
successorIds: string[];
|
|
31
35
|
dormantSuccessorIds: string[];
|
|
32
36
|
}
|
|
33
|
-
/** Applies one rejection on one handle and in one write scope: the rejected-value row, the removal of every row in
|
|
34
|
-
*
|
|
37
|
+
/** Applies one rejection on one handle and in one write scope: the rejected-value row, the removal of every row in
|
|
38
|
+
* reach that holds the text (live or dormant, whole or inside a merged row) and one reject_value audit row. Markdown
|
|
39
|
+
* mirrors follow the commit. */
|
|
35
40
|
export declare function applyRejection(hippoRoot: string, rejection: Rejection): AppliedRejection;
|
|
36
41
|
export type LiftedRejection = {
|
|
37
42
|
status: 'ok';
|
|
@@ -43,13 +48,13 @@ export type LiftedRejection = {
|
|
|
43
48
|
status: 'ambiguous';
|
|
44
49
|
candidates: RejectedValueRow[];
|
|
45
50
|
};
|
|
46
|
-
/** Deletes the tenant's one rejected value whose digest starts with `digestPrefix` and writes its unreject_value audit
|
|
47
|
-
*
|
|
51
|
+
/** Deletes the tenant's one rejected value whose digest starts with `digestPrefix` and writes its unreject_value audit
|
|
52
|
+
* row. No match, or more than one, writes nothing. */
|
|
48
53
|
export declare function liftRejection(hippoRoot: string, tenantId: string, digestPrefix: string, actor: string): LiftedRejection;
|
|
49
54
|
/** The tenant's rejected values, newest first. */
|
|
50
55
|
export declare function loadRejectedValues(hippoRoot: string, tenantId: string): RejectedValueRow[];
|
|
51
|
-
/** Whether the write guard would refuse `content` under `entryId`, as a write of that row would find it. Reads on a
|
|
52
|
-
*
|
|
56
|
+
/** Whether the write guard would refuse `content` under `entryId`, as a write of that row would find it. Reads on a
|
|
57
|
+
* plain open and writes nothing, so a dry run counts the values a real run refuses. */
|
|
53
58
|
export declare function rejectionGuardRefuses(hippoRoot: string, tenantId: string, entryId: string, content: string): boolean;
|
|
54
59
|
export {};
|
|
55
60
|
//# sourceMappingURL=rejected-values.d.ts.map
|
|
@@ -52,7 +52,8 @@ function removeLiveRows(db, hippoRoot, rejection, holdsValue, removal) {
|
|
|
52
52
|
successors.push(kept);
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
|
-
// Dormant copies go in the same write scope, so `hippo dormant restore` cannot bring the text back. They have no mirror
|
|
55
|
+
// Dormant copies go in the same write scope, so `hippo dormant restore` cannot bring the text back. They have no mirror
|
|
56
|
+
// to purge.
|
|
56
57
|
function removeDormantCopies(db, rejection, digest, holdsValue, removal) {
|
|
57
58
|
const { tenantId } = rejection;
|
|
58
59
|
const { removedIds, dormantSuccessorIds } = removal;
|
|
@@ -72,7 +73,8 @@ function removeDormantCopies(db, rejection, digest, holdsValue, removal) {
|
|
|
72
73
|
dormantSuccessorIds.push(successor.id);
|
|
73
74
|
}
|
|
74
75
|
}
|
|
75
|
-
// After the commit, on the same handle: a purged raw mirror is stamped so the reaper skips it, and one that stays is
|
|
76
|
+
// After the commit, on the same handle: a purged raw mirror is stamped so the reaper skips it, and one that stays is
|
|
77
|
+
// logged.
|
|
76
78
|
function purgeRemovedMirrors(db, hippoRoot, removal) {
|
|
77
79
|
for (const id of removal.removedIds) {
|
|
78
80
|
const isRaw = removal.removedRawIds.includes(id);
|
|
@@ -83,8 +85,9 @@ function purgeRemovedMirrors(db, hippoRoot, removal) {
|
|
|
83
85
|
for (const successor of removal.successors)
|
|
84
86
|
writeEntryMirrors(hippoRoot, successor);
|
|
85
87
|
}
|
|
86
|
-
/** Applies one rejection on one handle and in one write scope: the rejected-value row, the removal of every row in
|
|
87
|
-
*
|
|
88
|
+
/** Applies one rejection on one handle and in one write scope: the rejected-value row, the removal of every row in
|
|
89
|
+
* reach that holds the text (live or dormant, whole or inside a merged row) and one reject_value audit row. Markdown
|
|
90
|
+
* mirrors follow the commit. */
|
|
88
91
|
export function applyRejection(hippoRoot, rejection) {
|
|
89
92
|
const { tenantId, actor, reason, memoryId } = rejection;
|
|
90
93
|
return onHandle(hippoRoot, (db) => {
|
|
@@ -102,21 +105,34 @@ export function applyRejection(hippoRoot, rejection) {
|
|
|
102
105
|
sourceMemoryId: memoryId ?? null,
|
|
103
106
|
normalizedChars: normalizeValueForRejection(content).length,
|
|
104
107
|
});
|
|
105
|
-
// SHORTCUT: scans the tenant's text columns, fine for a human-run command; a digest column needs a schema
|
|
108
|
+
// SHORTCUT: scans the tenant's text columns, fine for a human-run command; a digest column needs a schema
|
|
109
|
+
// migration, held until approved.
|
|
106
110
|
const holdsValue = (text) => rejectionDigest(text) === digest;
|
|
107
111
|
removeLiveRows(db, hippoRoot, rejection, holdsValue, removal);
|
|
108
112
|
removeDormantCopies(db, rejection, digest, holdsValue, removal);
|
|
109
113
|
// Still inside the write scope: a failed audit row is reported and the reject commits without it.
|
|
110
114
|
const { removedIds } = removal;
|
|
111
|
-
audit(db, 'reject_value', {
|
|
115
|
+
audit(db, 'reject_value', {
|
|
116
|
+
tenantId,
|
|
117
|
+
actor,
|
|
118
|
+
targetId: memoryId,
|
|
119
|
+
metadata: { digest, removedIds, count: removedIds.length },
|
|
120
|
+
});
|
|
112
121
|
});
|
|
113
122
|
purgeRemovedMirrors(db, hippoRoot, removal);
|
|
114
123
|
const { removedIds, removedRawIds, successors, dormantSuccessorIds } = removal;
|
|
115
|
-
return {
|
|
124
|
+
return {
|
|
125
|
+
digest,
|
|
126
|
+
content,
|
|
127
|
+
removedIds,
|
|
128
|
+
removedRawIds,
|
|
129
|
+
successorIds: successors.map((s) => s.id),
|
|
130
|
+
dormantSuccessorIds,
|
|
131
|
+
};
|
|
116
132
|
}, openStore);
|
|
117
133
|
}
|
|
118
|
-
/** Deletes the tenant's one rejected value whose digest starts with `digestPrefix` and writes its unreject_value audit
|
|
119
|
-
*
|
|
134
|
+
/** Deletes the tenant's one rejected value whose digest starts with `digestPrefix` and writes its unreject_value audit
|
|
135
|
+
* row. No match, or more than one, writes nothing. */
|
|
120
136
|
export function liftRejection(hippoRoot, tenantId, digestPrefix, actor) {
|
|
121
137
|
return onHandle(hippoRoot, (db) => {
|
|
122
138
|
const matches = listRejectedValues(db, tenantId).filter((r) => r.digest.startsWith(digestPrefix));
|
|
@@ -126,7 +142,12 @@ export function liftRejection(hippoRoot, tenantId, digestPrefix, actor) {
|
|
|
126
142
|
if (matches.length > 1)
|
|
127
143
|
return { status: 'ambiguous', candidates: matches };
|
|
128
144
|
deleteRejectedValue(db, tenantId, target.digest);
|
|
129
|
-
audit(db, 'unreject_value', {
|
|
145
|
+
audit(db, 'unreject_value', {
|
|
146
|
+
tenantId,
|
|
147
|
+
actor,
|
|
148
|
+
targetId: target.sourceMemoryId ?? undefined,
|
|
149
|
+
metadata: { digest: target.digest, reason: target.reason },
|
|
150
|
+
});
|
|
130
151
|
return { status: 'ok', digest: target.digest, reason: target.reason };
|
|
131
152
|
}, openStore);
|
|
132
153
|
}
|
|
@@ -136,8 +157,8 @@ export function loadRejectedValues(hippoRoot, tenantId) {
|
|
|
136
157
|
return listRejectedValues(db, tenantId);
|
|
137
158
|
}, openStore);
|
|
138
159
|
}
|
|
139
|
-
/** Whether the write guard would refuse `content` under `entryId`, as a write of that row would find it. Reads on a
|
|
140
|
-
*
|
|
160
|
+
/** Whether the write guard would refuse `content` under `entryId`, as a write of that row would find it. Reads on a
|
|
161
|
+
* plain open and writes nothing, so a dry run counts the values a real run refuses. */
|
|
141
162
|
export function rejectionGuardRefuses(hippoRoot, tenantId, entryId, content) {
|
|
142
163
|
const db = openHippoDb(hippoRoot);
|
|
143
164
|
try {
|
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
/** Rejected-value tombstone: a human can refuse byte-stable re-ingestion of a rejected fact (exact normalized value);
|
|
2
|
-
* db-agnostic (helpers take a `DatabaseSyncLike`) and imports nothing from the
|
|
1
|
+
/** Rejected-value tombstone: a human can refuse byte-stable re-ingestion of a rejected fact (exact normalized value);
|
|
2
|
+
* paraphrase matching is out of scope. db-agnostic (helpers take a `DatabaseSyncLike`) and imports nothing from the
|
|
3
|
+
* store layer above it, which imports this (the reverse is a cycle). */
|
|
4
|
+
import { normalizeValueForRejection, rejectionDigest } from '../core/rejection-digest.js';
|
|
3
5
|
import type { DatabaseSyncLike } from '../db/index.js';
|
|
4
|
-
|
|
5
|
-
* refusals, worse than misses. */
|
|
6
|
-
export declare function normalizeValueForRejection(content: string): string;
|
|
7
|
-
/** Full 64-char sha256 hex of the normalized content: a tombstone key needs collision resistance, not the 16-char redaction hash used for query hashing. */
|
|
8
|
-
export declare function rejectionDigest(content: string): string;
|
|
6
|
+
export { normalizeValueForRejection, rejectionDigest };
|
|
9
7
|
export interface RejectedValueRow {
|
|
10
8
|
tenantId: string;
|
|
11
9
|
digest: string;
|
|
@@ -15,9 +13,11 @@ export interface RejectedValueRow {
|
|
|
15
13
|
sourceMemoryId: string | null;
|
|
16
14
|
normalizedChars: number | null;
|
|
17
15
|
}
|
|
18
|
-
/** Look up a tombstone by tenant + digest: one indexed point query, the guard's common-case cost; a miss ends the
|
|
16
|
+
/** Look up a tombstone by tenant + digest: one indexed point query, the guard's common-case cost; a miss ends the
|
|
17
|
+
* guard. */
|
|
19
18
|
export declare function findRejectedValue(db: DatabaseSyncLike, tenantId: string, digest: string): RejectedValueRow | null;
|
|
20
|
-
/** Insert (or refresh) a tombstone row; the caller owns the transaction (used by the `reject` verb and
|
|
19
|
+
/** Insert (or refresh) a tombstone row; the caller owns the transaction (used by the `reject` verb and
|
|
20
|
+
* `resolveConflict`'s `rejectLoserValue`). */
|
|
21
21
|
export declare function insertRejectedValue(db: DatabaseSyncLike, opts: {
|
|
22
22
|
tenantId: string;
|
|
23
23
|
digest: string;
|
|
@@ -31,7 +31,8 @@ export declare function insertRejectedValue(db: DatabaseSyncLike, opts: {
|
|
|
31
31
|
export declare function deleteRejectedValue(db: DatabaseSyncLike, tenantId: string, digest: string): boolean;
|
|
32
32
|
/** List tombstones for a tenant, newest first: the `rejections` verb. */
|
|
33
33
|
export declare function listRejectedValues(db: DatabaseSyncLike, tenantId: string): RejectedValueRow[];
|
|
34
|
-
/** Write-path guard check: fires when the digest matches a tombstone AND the write introduces that content (a new row,
|
|
35
|
-
* Unchanged same-id re-persists (recall boost, decay, star toggle) are exempt. A miss
|
|
34
|
+
/** Write-path guard check: fires when the digest matches a tombstone AND the write introduces that content (a new row,
|
|
35
|
+
* or a same-id UPSERT changing it). Unchanged same-id re-persists (recall boost, decay, star toggle) are exempt. A miss
|
|
36
|
+
* costs ONE indexed point query; only a hit SELECTs the stored row. */
|
|
36
37
|
export declare function checkRejectionGuard(db: DatabaseSyncLike, tenantId: string, entryId: string, content: string): void;
|
|
37
38
|
//# sourceMappingURL=rejection.d.ts.map
|
package/dist/store/rejection.js
CHANGED
|
@@ -1,16 +1,10 @@
|
|
|
1
|
-
/** Rejected-value tombstone: a human can refuse byte-stable re-ingestion of a rejected fact (exact normalized value);
|
|
2
|
-
* db-agnostic (helpers take a `DatabaseSyncLike`) and imports nothing from the
|
|
3
|
-
|
|
1
|
+
/** Rejected-value tombstone: a human can refuse byte-stable re-ingestion of a rejected fact (exact normalized value);
|
|
2
|
+
* paraphrase matching is out of scope. db-agnostic (helpers take a `DatabaseSyncLike`) and imports nothing from the
|
|
3
|
+
* store layer above it, which imports this (the reverse is a cycle). */
|
|
4
|
+
import { normalizeValueForRejection, rejectionDigest } from '../core/rejection-digest.js';
|
|
4
5
|
import { RejectedValueError } from '../core/api-errors.js';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
export function normalizeValueForRejection(content) {
|
|
8
|
-
return content.normalize('NFC').toLowerCase().replace(/\s+/g, ' ').trim();
|
|
9
|
-
}
|
|
10
|
-
/** Full 64-char sha256 hex of the normalized content: a tombstone key needs collision resistance, not the 16-char redaction hash used for query hashing. */
|
|
11
|
-
export function rejectionDigest(content) {
|
|
12
|
-
return createHash('sha256').update(normalizeValueForRejection(content)).digest('hex');
|
|
13
|
-
}
|
|
6
|
+
// store-kit publishes rejectionDigest from this path.
|
|
7
|
+
export { normalizeValueForRejection, rejectionDigest };
|
|
14
8
|
function rowToRejectedValue(row) {
|
|
15
9
|
return {
|
|
16
10
|
tenantId: row.tenant_id,
|
|
@@ -22,7 +16,8 @@ function rowToRejectedValue(row) {
|
|
|
22
16
|
normalizedChars: row.normalized_chars,
|
|
23
17
|
};
|
|
24
18
|
}
|
|
25
|
-
/** Look up a tombstone by tenant + digest: one indexed point query, the guard's common-case cost; a miss ends the
|
|
19
|
+
/** Look up a tombstone by tenant + digest: one indexed point query, the guard's common-case cost; a miss ends the
|
|
20
|
+
* guard. */
|
|
26
21
|
export function findRejectedValue(db, tenantId, digest) {
|
|
27
22
|
// SAFETY: row's shape matches the columns named in the SELECT above.
|
|
28
23
|
const row = db
|
|
@@ -31,9 +26,11 @@ export function findRejectedValue(db, tenantId, digest) {
|
|
|
31
26
|
.get(tenantId, digest);
|
|
32
27
|
return row ? rowToRejectedValue(row) : null;
|
|
33
28
|
}
|
|
34
|
-
/** Insert (or refresh) a tombstone row; the caller owns the transaction (used by the `reject` verb and
|
|
29
|
+
/** Insert (or refresh) a tombstone row; the caller owns the transaction (used by the `reject` verb and
|
|
30
|
+
* `resolveConflict`'s `rejectLoserValue`). */
|
|
35
31
|
export function insertRejectedValue(db, opts) {
|
|
36
|
-
db.prepare(`INSERT INTO rejected_values(tenant_id, digest, reason, rejected_by, rejected_at, source_memory_id,
|
|
32
|
+
db.prepare(`INSERT INTO rejected_values(tenant_id, digest, reason, rejected_by, rejected_at, source_memory_id, ` +
|
|
33
|
+
`normalized_chars)
|
|
37
34
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
38
35
|
ON CONFLICT(tenant_id, digest) DO UPDATE SET
|
|
39
36
|
reason = excluded.reason,
|
|
@@ -56,15 +53,17 @@ export function listRejectedValues(db, tenantId) {
|
|
|
56
53
|
.all(tenantId);
|
|
57
54
|
return rows.map(rowToRejectedValue);
|
|
58
55
|
}
|
|
59
|
-
/** Write-path guard check: fires when the digest matches a tombstone AND the write introduces that content (a new row,
|
|
60
|
-
* Unchanged same-id re-persists (recall boost, decay, star toggle) are exempt. A miss
|
|
56
|
+
/** Write-path guard check: fires when the digest matches a tombstone AND the write introduces that content (a new row,
|
|
57
|
+
* or a same-id UPSERT changing it). Unchanged same-id re-persists (recall boost, decay, star toggle) are exempt. A miss
|
|
58
|
+
* costs ONE indexed point query; only a hit SELECTs the stored row. */
|
|
61
59
|
export function checkRejectionGuard(db, tenantId, entryId, content) {
|
|
62
60
|
const incomingDigest = rejectionDigest(content);
|
|
63
61
|
const tombstone = findRejectedValue(db, tenantId, incomingDigest);
|
|
64
62
|
if (!tombstone)
|
|
65
63
|
return; // miss ends the guard — the overwhelmingly common case
|
|
66
|
-
// Id-only on purpose (ids are global ULIDs; the tombstone lookup is tenant-scoped); tenant_id is read as a
|
|
67
|
-
// SAFETY: storedRow's shape matches the two columns named in the
|
|
64
|
+
// Id-only on purpose (ids are global ULIDs; the tombstone lookup is tenant-scoped); tenant_id is read as a
|
|
65
|
+
// tenantId-only upsert introduces content there. SAFETY: storedRow's shape matches the two columns named in the
|
|
66
|
+
// SELECT above.
|
|
68
67
|
const storedRow = db.prepare(`SELECT content, tenant_id FROM memories WHERE id = ?`).get(entryId);
|
|
69
68
|
const isNewRow = storedRow === undefined;
|
|
70
69
|
const tenantChanged = !isNewRow && storedRow.tenant_id !== tenantId;
|