hippo-memory 1.70.0 → 1.72.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/agent-memories/apply.d.ts +0 -11
- package/dist/agent-memories/apply.js +6 -21
- package/dist/agent-memories/claude-code.d.ts +4 -2
- package/dist/agent-memories/claude-code.js +15 -6
- package/dist/agent-memories/codex.js +1 -1
- package/dist/agent-memories/copilot.d.ts +1 -3
- package/dist/agent-memories/copilot.js +1 -17
- package/dist/agent-memories/files.js +23 -12
- package/dist/agent-memories/markdown.d.ts +1 -3
- package/dist/agent-memories/markdown.js +1 -3
- package/dist/agent-memories/project-folds.d.ts +10 -0
- package/dist/agent-memories/project-folds.js +34 -0
- package/dist/agent-memories/report.js +2 -1
- package/dist/agent-memories/sync.d.ts +4 -2
- package/dist/agent-memories/sync.js +18 -11
- package/dist/api/assemble.d.ts +7 -44
- package/dist/api/assemble.js +3 -23
- package/dist/api/audit.d.ts +33 -1
- package/dist/api/audit.js +48 -1
- package/dist/api/auth.d.ts +20 -26
- package/dist/api/auth.js +43 -29
- package/dist/api/auto-sleep.d.ts +5 -2
- package/dist/api/auto-sleep.js +9 -5
- package/dist/api/availability.d.ts +2 -15
- package/dist/api/availability.js +4 -18
- package/dist/api/cards.d.ts +42 -0
- package/dist/api/cards.js +52 -0
- package/dist/api/conflicts.d.ts +28 -0
- package/dist/api/conflicts.js +61 -0
- package/dist/api/context-render.js +4 -3
- package/dist/api/context-select.js +12 -15
- package/dist/api/context-types.d.ts +10 -35
- package/dist/api/context.d.ts +5 -22
- package/dist/api/context.js +38 -46
- package/dist/api/continuity.d.ts +47 -0
- package/dist/api/continuity.js +66 -0
- package/dist/{cli → api}/correction-latency.d.ts +2 -14
- package/dist/{cli → api}/correction-latency.js +2 -14
- package/dist/api/dormant.d.ts +5 -21
- package/dist/api/dormant.js +11 -28
- package/dist/api/drill-down.d.ts +7 -46
- package/dist/api/drill-down.js +6 -27
- package/dist/api/embeddings.d.ts +17 -0
- package/dist/api/embeddings.js +28 -0
- package/dist/api/error-reply.d.ts +8 -0
- package/dist/api/error-reply.js +21 -0
- package/dist/api/forget.d.ts +11 -26
- package/dist/api/forget.js +23 -35
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +5 -9
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +6 -2
- package/dist/api/index.js +6 -2
- package/dist/api/instruction-detect.js +21 -6
- package/dist/api/learn.d.ts +4 -0
- package/dist/api/learn.js +53 -27
- package/dist/api/ledger-db.d.ts +2 -5
- package/dist/api/ledger-db.js +5 -35
- package/dist/api/memories.d.ts +23 -0
- package/dist/api/memories.js +46 -0
- package/dist/api/objects.d.ts +9 -0
- package/dist/api/objects.js +11 -0
- package/dist/api/on-store.js +5 -3
- package/dist/api/outcome.js +1 -1
- package/dist/api/pilot-arm.d.ts +1 -11
- package/dist/api/pilot-arm.js +5 -45
- package/dist/api/predictions.d.ts +11 -0
- package/dist/api/predictions.js +24 -0
- package/dist/api/projects.d.ts +21 -0
- package/dist/api/projects.js +24 -0
- package/dist/api/promote.d.ts +13 -17
- package/dist/api/promote.js +12 -20
- package/dist/api/prompt-hook.d.ts +19 -6
- package/dist/api/prompt-hook.js +54 -13
- package/dist/api/provenance-coverage.d.ts +14 -0
- package/dist/{cli → api}/provenance-coverage.js +2 -6
- package/dist/api/recall-cli.d.ts +58 -0
- package/dist/api/recall-cli.js +103 -0
- package/dist/api/recall-core.js +17 -9
- package/dist/api/recall-finish.d.ts +53 -0
- package/dist/api/recall-finish.js +30 -0
- package/dist/api/recall-history.d.ts +17 -84
- package/dist/api/recall-history.js +15 -88
- package/dist/api/recall-pipeline.d.ts +2 -3
- package/dist/api/recall-pipeline.js +21 -15
- package/dist/api/recall-request.js +1 -1
- package/dist/api/recall-types.d.ts +64 -304
- package/dist/api/recall.d.ts +3 -34
- package/dist/api/recall.js +63 -89
- package/dist/api/refine.d.ts +7 -0
- package/dist/api/refine.js +10 -0
- package/dist/api/remember-local.d.ts +57 -0
- package/dist/api/remember-local.js +90 -0
- package/dist/api/remember.d.ts +20 -2
- package/dist/api/remember.js +16 -3
- package/dist/api/session-end.d.ts +22 -0
- package/dist/api/session-end.js +101 -0
- package/dist/api/sleep-run.d.ts +2 -4
- package/dist/api/sleep-run.js +28 -28
- package/dist/api/sleep.d.ts +9 -28
- package/dist/api/status.d.ts +24 -0
- package/dist/api/status.js +40 -0
- package/dist/api/store-init.d.ts +4 -0
- package/dist/api/store-init.js +9 -0
- package/dist/api/tokens.d.ts +3 -10
- package/dist/api/tokens.js +4 -11
- package/dist/api/types.d.ts +8 -29
- package/dist/api/types.js +10 -23
- package/dist/capture/caller-session.d.ts +0 -3
- package/dist/capture/caller-session.js +1 -12
- package/dist/capture/capture-error.d.ts +2 -2
- package/dist/capture/capture-error.js +23 -18
- package/dist/capture/codex-patch.js +3 -1
- package/dist/capture/command.d.ts +4 -12
- package/dist/capture/command.js +39 -114
- package/dist/capture/compact.d.ts +4 -15
- package/dist/capture/compact.js +26 -30
- package/dist/capture/compaction-items-caller.js +11 -20
- package/dist/capture/compaction-record.d.ts +7 -93
- package/dist/capture/compaction-record.js +34 -399
- package/dist/capture/compaction-spool.d.ts +5 -3
- package/dist/capture/compaction-spool.js +21 -7
- package/dist/capture/copilot-transcript.d.ts +2 -1
- package/dist/capture/copilot-transcript.js +2 -1
- package/dist/capture/extract.d.ts +5 -2
- package/dist/capture/extract.js +4 -3
- package/dist/capture/failure-caller.d.ts +1 -1
- package/dist/capture/failure-caller.js +21 -16
- package/dist/capture/failure-reading.d.ts +2 -1
- package/dist/capture/failure-reading.js +7 -9
- package/dist/capture/pre-compact-caller.js +5 -4
- package/dist/capture/session-digest.d.ts +1 -1
- package/dist/capture/session-digest.js +17 -10
- package/dist/capture/session-end-caller.js +2 -1
- package/dist/capture/session-worker.js +3 -4
- package/dist/capture/transcript.d.ts +4 -11
- package/dist/capture/transcript.js +10 -21
- package/dist/capture/working-state.d.ts +4 -2
- package/dist/capture/working-state.js +4 -2
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +1 -59
- package/dist/cli/audit-prune.js +2 -61
- package/dist/cli/audit.d.ts +1 -1
- package/dist/cli/audit.js +42 -43
- package/dist/cli/auth.d.ts +2 -2
- package/dist/cli/auth.js +61 -44
- package/dist/cli/briefs.d.ts +1 -4
- package/dist/cli/briefs.js +42 -301
- package/dist/cli/card.d.ts +2 -2
- package/dist/cli/card.js +63 -56
- package/dist/cli/client.d.ts +12 -27
- package/dist/cli/client.js +41 -44
- package/dist/cli/compact-resume-payload.js +4 -3
- package/dist/cli/context.d.ts +2 -3
- package/dist/cli/context.js +22 -18
- package/dist/cli/continuity.d.ts +6 -6
- package/dist/cli/continuity.js +81 -86
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +88 -116
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +55 -34
- package/dist/cli/decisions.d.ts +2 -4
- package/dist/cli/decisions.js +18 -309
- package/dist/cli/eval.d.ts +1 -1
- package/dist/cli/eval.js +27 -26
- package/dist/cli/exit.d.ts +6 -0
- package/dist/cli/exit.js +11 -0
- package/dist/cli/explain.d.ts +2 -3
- package/dist/cli/explain.js +25 -27
- package/dist/cli/flag-values.d.ts +6 -1
- package/dist/cli/flag-values.js +42 -15
- package/dist/cli/flags.d.ts +0 -288
- package/dist/cli/flags.js +3 -138
- package/dist/cli/github.d.ts +14 -0
- package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
- package/dist/cli/goals.d.ts +2 -2
- package/dist/cli/goals.js +46 -50
- package/dist/cli/graph.d.ts +3 -0
- package/dist/cli/graph.js +83 -0
- package/dist/cli/hook-runtime.d.ts +12 -32
- package/dist/cli/hook-runtime.js +21 -64
- package/dist/cli/incidents.d.ts +3 -0
- package/dist/cli/incidents.js +112 -0
- package/dist/cli/init.d.ts +2 -2
- package/dist/cli/init.js +33 -30
- package/dist/cli/install-steps.d.ts +2 -1
- package/dist/cli/install-steps.js +13 -14
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +4 -1
- package/dist/cli/lenient-id.d.ts +2 -0
- package/dist/cli/lenient-id.js +13 -0
- package/dist/cli/maintenance.d.ts +5 -5
- package/dist/cli/maintenance.js +37 -43
- package/dist/cli/notes.d.ts +2 -0
- package/dist/cli/notes.js +41 -0
- package/dist/cli/object-verbs.js +4 -3
- package/dist/cli/open-browser.d.ts +14 -0
- package/dist/cli/open-browser.js +26 -0
- package/dist/cli/owner-validation.d.ts +5 -28
- package/dist/cli/owner-validation.js +5 -28
- package/dist/cli/playbooks.d.ts +3 -4
- package/dist/cli/playbooks.js +131 -300
- package/dist/cli/predictions.d.ts +3 -0
- package/dist/cli/predictions.js +175 -0
- package/dist/cli/print.d.ts +2 -5
- package/dist/cli/print.js +3 -5
- package/dist/cli/projects.d.ts +2 -2
- package/dist/cli/projects.js +31 -25
- package/dist/cli/quality-repair-once.d.ts +1 -1
- package/dist/cli/quality-repair-once.js +7 -6
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +67 -137
- package/dist/cli/refine-llm.d.ts +5 -31
- package/dist/cli/refine-llm.js +23 -50
- package/dist/cli/remember.d.ts +3 -3
- package/dist/cli/remember.js +134 -192
- package/dist/cli/scheduler.d.ts +2 -17
- package/dist/cli/scheduler.js +14 -19
- package/dist/cli/serve.js +23 -14
- package/dist/cli/session-hooks.d.ts +11 -19
- package/dist/cli/session-hooks.js +143 -214
- package/dist/cli/setup.d.ts +4 -4
- package/dist/cli/setup.js +35 -30
- package/dist/cli/shared.d.ts +7 -25
- package/dist/cli/shared.js +17 -60
- package/dist/cli/slack.d.ts +2 -2
- package/dist/cli/slack.js +19 -23
- package/dist/cli/sleep-render.js +6 -3
- package/dist/cli/sleep.d.ts +3 -2
- package/dist/cli/sleep.js +17 -49
- package/dist/cli/status.d.ts +11 -14
- package/dist/cli/status.js +74 -120
- package/dist/cli/stdin.d.ts +4 -6
- package/dist/cli/stdin.js +2 -3
- package/dist/cli/transfer.d.ts +9 -9
- package/dist/cli/transfer.js +87 -108
- package/dist/cli/usage.d.ts +0 -79
- package/dist/cli/usage.js +1 -689
- package/dist/cli/verb-row.d.ts +32 -0
- package/dist/cli/verb-row.js +6 -0
- package/dist/cli/verbs/health.d.ts +27 -0
- package/dist/cli/verbs/health.js +232 -0
- package/dist/cli/verbs/memory.d.ts +16 -0
- package/dist/cli/verbs/memory.js +244 -0
- package/dist/cli/verbs/objects.d.ts +20 -0
- package/dist/cli/verbs/objects.js +254 -0
- package/dist/cli/verbs/sessions.d.ts +31 -0
- package/dist/cli/verbs/sessions.js +312 -0
- package/dist/cli/verbs.d.ts +81 -0
- package/dist/cli/verbs.js +7 -0
- package/dist/cli/versioned-verbs.d.ts +51 -0
- package/dist/cli/versioned-verbs.js +79 -0
- package/dist/cli.d.ts +1 -654
- package/dist/cli.js +44 -510
- package/dist/connectors/dlq.d.ts +39 -3
- package/dist/connectors/dlq.js +37 -3
- package/dist/connectors/github/backfill.d.ts +5 -25
- package/dist/connectors/github/backfill.js +26 -52
- package/dist/connectors/github/deletion.d.ts +4 -18
- package/dist/connectors/github/deletion.js +2 -15
- package/dist/connectors/github/dlq.d.ts +8 -33
- package/dist/connectors/github/dlq.js +34 -93
- package/dist/connectors/github/ingest.d.ts +4 -12
- package/dist/connectors/github/ingest.js +5 -36
- package/dist/connectors/github/octokit-client.d.ts +4 -16
- package/dist/connectors/github/octokit-client.js +27 -24
- package/dist/connectors/github/ratelimit.d.ts +3 -14
- package/dist/connectors/github/ratelimit.js +3 -14
- package/dist/connectors/github/scope.d.ts +3 -5
- package/dist/connectors/github/scope.js +3 -5
- package/dist/connectors/github/signature.d.ts +4 -26
- package/dist/connectors/github/signature.js +4 -26
- package/dist/connectors/github/tenant-routing.d.ts +2 -24
- package/dist/connectors/github/tenant-routing.js +4 -26
- package/dist/connectors/github/transform.js +2 -16
- package/dist/connectors/github/types.d.ts +3 -15
- package/dist/connectors/github/types.js +2 -9
- package/dist/connectors/github/webhook.d.ts +3 -16
- package/dist/connectors/github/webhook.js +38 -23
- package/dist/connectors/ingest.d.ts +10 -0
- package/dist/connectors/ingest.js +28 -0
- package/dist/connectors/slack/backfill.d.ts +4 -17
- package/dist/connectors/slack/backfill.js +4 -13
- package/dist/connectors/slack/dlq.d.ts +2 -19
- package/dist/connectors/slack/dlq.js +51 -90
- package/dist/connectors/slack/ingest.d.ts +4 -9
- package/dist/connectors/slack/ingest.js +4 -30
- package/dist/connectors/slack/scope.d.ts +2 -8
- package/dist/connectors/slack/scope.js +2 -8
- package/dist/connectors/slack/signature.d.ts +1 -6
- package/dist/connectors/slack/tenant-routing.d.ts +2 -19
- package/dist/connectors/slack/tenant-routing.js +2 -21
- package/dist/connectors/slack/transform.d.ts +2 -18
- package/dist/connectors/slack/transform.js +2 -18
- package/dist/connectors/slack/types.d.ts +3 -9
- package/dist/connectors/slack/types.js +2 -4
- package/dist/connectors/slack/web-client.js +33 -27
- package/dist/connectors/slack/webhook.d.ts +3 -19
- package/dist/connectors/slack/webhook.js +6 -26
- package/dist/connectors/slack/workspaces.d.ts +4 -24
- package/dist/connectors/slack/workspaces.js +4 -24
- package/dist/consolidate/conflicts.js +7 -15
- package/dist/consolidate/dag-summary.d.ts +8 -0
- package/dist/consolidate/dag-summary.js +41 -0
- package/dist/consolidate/dag.d.ts +5 -28
- package/dist/consolidate/dag.js +29 -84
- package/dist/consolidate/decay.js +7 -19
- package/dist/consolidate/dedupe.d.ts +13 -52
- package/dist/consolidate/dedupe.js +18 -74
- package/dist/consolidate/flush-units.d.ts +3 -4
- package/dist/consolidate/flush-units.js +3 -3
- package/dist/consolidate/half-life-migration.d.ts +3 -26
- package/dist/consolidate/half-life-migration.js +11 -28
- package/dist/consolidate/llm-passes.js +49 -40
- package/dist/consolidate/memory-value-weights.d.ts +2 -13
- package/dist/consolidate/memory-value-weights.js +2 -13
- package/dist/consolidate/memory-value.d.ts +11 -84
- package/dist/consolidate/memory-value.js +18 -105
- package/dist/consolidate/merge.js +12 -33
- package/dist/consolidate/physics-pass.d.ts +6 -1
- package/dist/consolidate/physics-pass.js +27 -9
- package/dist/consolidate/replay.d.ts +6 -38
- package/dist/consolidate/replay.js +25 -56
- package/dist/consolidate/run.js +1 -1
- package/dist/consolidate/sleep.d.ts +1 -8
- package/dist/consolidate/sleep.js +13 -22
- package/dist/consolidate/trace.d.ts +3 -18
- package/dist/consolidate/trace.js +3 -18
- package/dist/consolidate/traces.js +9 -25
- package/dist/core/ablation.d.ts +14 -91
- package/dist/core/ablation.js +16 -91
- package/dist/core/active-scope.d.ts +7 -0
- package/dist/{sharing/scope.js → core/active-scope.js} +5 -12
- package/dist/core/ambient.d.ts +5 -8
- package/dist/core/ambient.js +40 -26
- package/dist/core/api-errors.d.ts +16 -0
- package/dist/core/api-errors.js +20 -0
- package/dist/core/capture-contract.d.ts +4 -2
- package/dist/core/capture-contract.js +4 -2
- package/dist/core/card.d.ts +4 -1
- package/dist/core/card.js +11 -1
- package/dist/core/compaction-timing.d.ts +7 -0
- package/dist/core/compaction-timing.js +9 -0
- package/dist/core/compare.d.ts +11 -67
- package/dist/core/compare.js +9 -63
- package/dist/core/config.d.ts +10 -24
- package/dist/core/config.js +20 -16
- package/dist/core/cosine.d.ts +3 -0
- package/dist/core/cosine.js +19 -0
- package/dist/core/handoff.d.ts +1 -7
- package/dist/core/handoff.js +1 -7
- package/dist/core/markdown.d.ts +6 -0
- package/dist/{store → core}/markdown.js +23 -22
- package/dist/core/memory-audit.d.ts +17 -0
- package/dist/core/memory-audit.js +54 -0
- package/dist/core/memory-quality.js +1 -1
- package/dist/core/memory.d.ts +51 -168
- package/dist/core/memory.js +76 -239
- package/dist/{consolidate → core}/merged-row.d.ts +1 -1
- package/dist/{consolidate → core}/merged-row.js +3 -2
- package/dist/core/package-root.d.ts +3 -0
- package/dist/core/package-root.js +5 -0
- package/dist/core/physics-config.d.ts +1 -4
- package/dist/core/physics-config.js +3 -8
- package/dist/core/physics.d.ts +15 -61
- package/dist/core/physics.js +65 -138
- package/dist/core/prediction.d.ts +3 -0
- package/dist/core/prediction.js +6 -0
- package/dist/core/project-identity.d.ts +20 -58
- package/dist/core/project-identity.js +27 -39
- package/dist/core/project-remote.js +13 -2
- package/dist/core/raw-append-only.d.ts +5 -0
- package/dist/core/raw-append-only.js +7 -0
- package/dist/core/recall-scope.d.ts +69 -0
- package/dist/core/recall-scope.js +138 -0
- package/dist/core/salience.d.ts +1 -7
- package/dist/core/salience.js +1 -7
- package/dist/dashboard/dashboard-actions.js +2 -2
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
- package/dist/dashboard/dashboard-snapshot.js +11 -2
- package/dist/dashboard/dashboard-types.d.ts +2 -1
- package/dist/dashboard/dashboard.d.ts +1 -0
- package/dist/dashboard/dashboard.js +50 -4
- package/dist/db/busy.d.ts +3 -8
- package/dist/db/busy.js +37 -33
- package/dist/db/connect.js +7 -8
- package/dist/db/index.d.ts +3 -3
- package/dist/db/index.js +3 -3
- package/dist/db/migrate.js +3 -3
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/types.d.ts +2 -5
- package/dist/db/migrations/v14.js +2 -3
- package/dist/db/migrations/v15.js +2 -8
- package/dist/db/migrations/v16.js +2 -3
- package/dist/db/migrations/v17.js +2 -3
- package/dist/db/migrations/v19.js +2 -5
- package/dist/db/migrations/v20.js +2 -7
- package/dist/db/migrations/v22.js +4 -17
- package/dist/db/migrations/v23.js +3 -14
- package/dist/db/migrations/v24.js +2 -4
- package/dist/db/migrations/v25.js +3 -8
- package/dist/db/migrations/v26.js +2 -13
- package/dist/db/migrations/v27.js +3 -11
- package/dist/db/migrations/v28.js +2 -14
- package/dist/db/migrations/v29.js +4 -18
- package/dist/db/migrations/v30.js +4 -16
- package/dist/db/migrations/v31.js +2 -15
- package/dist/db/migrations/v32.js +4 -22
- package/dist/db/migrations/v33.js +2 -15
- package/dist/db/migrations/v34.js +2 -11
- package/dist/db/migrations/v35.js +2 -11
- package/dist/db/migrations/v36.js +2 -11
- package/dist/db/migrations/v37.js +8 -33
- package/dist/db/migrations/v38.js +5 -38
- package/dist/db/migrations/v39.js +9 -20
- package/dist/db/migrations/v40.js +2 -9
- package/dist/db/migrations/v41.js +2 -24
- package/dist/db/migrations/v43.js +1 -1
- package/dist/db/migrations/v44.js +2 -8
- package/dist/db/migrations/v45.js +2 -7
- package/dist/db/migrations/v47.js +2 -3
- package/dist/db/migrations/v51.js +1 -1
- package/dist/db/migrations/v55.d.ts +3 -0
- package/dist/db/migrations/v55.js +17 -0
- package/dist/db/open.d.ts +2 -2
- package/dist/db/open.js +21 -9
- package/dist/db/physics-state.d.ts +6 -22
- package/dist/db/physics-state.js +28 -39
- package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
- package/dist/db/raw-archive-mirror-cleanup.js +2 -17
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -2
- package/dist/db/vector-store.d.ts +2 -0
- package/dist/db/vector-store.js +25 -5
- package/dist/db/wal-checkpointer.js +2 -1
- package/dist/doctor.js +85 -27
- package/dist/embeddings/local.d.ts +62 -0
- package/dist/embeddings/local.js +146 -0
- package/dist/embeddings/provider.d.ts +43 -0
- package/dist/{store/embeddings → embeddings}/provider.js +58 -83
- package/dist/embeddings/transformers.d.ts +26 -0
- package/dist/embeddings/transformers.js +89 -0
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +3 -2
- package/dist/eval/eval-stats.d.ts +15 -53
- package/dist/eval/eval-stats.js +12 -42
- package/dist/eval/eval-suite.d.ts +2 -13
- package/dist/eval/eval-suite.js +91 -45
- package/dist/eval/eval.d.ts +6 -24
- package/dist/eval/eval.js +8 -35
- package/dist/eval/judgment.d.ts +0 -3
- package/dist/eval/judgment.js +30 -15
- package/dist/extensions/openclaw-plugin/index.js +1 -1
- package/dist/graph/extract.d.ts +5 -27
- package/dist/graph/extract.js +10 -36
- package/dist/graph/recall.d.ts +7 -20
- package/dist/graph/recall.js +15 -77
- package/dist/graph/stream.d.ts +7 -39
- package/dist/graph/stream.js +11 -34
- package/dist/graph/view.d.ts +9 -35
- package/dist/graph/view.js +24 -44
- package/dist/graph/write.d.ts +1 -1
- package/dist/graph/write.js +9 -9
- package/dist/hooks/codex-session.js +3 -2
- package/dist/hooks/codex-wrapper.js +4 -3
- package/dist/hooks/copilot.js +2 -1
- package/dist/hooks/hook-blocks.d.ts +6 -2
- package/dist/hooks/hook-blocks.js +37 -124
- package/dist/hooks/json-hooks.d.ts +4 -36
- package/dist/hooks/json-hooks.js +22 -59
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +17 -81
- package/dist/hooks/shared.d.ts +6 -21
- package/dist/hooks/shared.js +31 -33
- package/dist/importers/core.d.ts +12 -37
- package/dist/importers/core.js +10 -28
- package/dist/importers/markdown-parse.d.ts +8 -22
- package/dist/importers/markdown-parse.js +8 -25
- package/dist/importers/markdown.js +3 -12
- package/dist/importers/sources.js +12 -39
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +31 -85
- package/dist/index.d.ts +8 -3
- package/dist/index.js +8 -3
- package/dist/learn/autolearn.d.ts +23 -42
- package/dist/learn/autolearn.js +45 -52
- package/dist/learn/churn-git.js +13 -4
- package/dist/learn/extract.d.ts +3 -2
- package/dist/learn/extract.js +8 -8
- package/dist/learn/forward-claim-detector.d.ts +6 -30
- package/dist/learn/forward-claim-detector.js +18 -68
- package/dist/learn/invalidation.d.ts +6 -18
- package/dist/learn/invalidation.js +18 -31
- package/dist/mcp/admin-tools.d.ts +2 -2
- package/dist/mcp/admin-tools.js +30 -53
- package/dist/mcp/format.js +3 -2
- package/dist/mcp/framing.d.ts +1 -0
- package/dist/mcp/framing.js +1 -1
- package/dist/mcp/memory-tools.js +7 -10
- package/dist/mcp/protocol.d.ts +15 -29
- package/dist/mcp/protocol.js +26 -16
- package/dist/mcp/recall-tools.js +14 -11
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +12 -27
- package/dist/mcp/server.d.ts +3 -9
- package/dist/mcp/server.js +5 -16
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +5 -11
- package/dist/mcp/stdio.d.ts +2 -6
- package/dist/mcp/stdio.js +68 -16
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +47 -22
- package/dist/objects/customer-notes.d.ts +9 -44
- package/dist/objects/customer-notes.js +7 -48
- package/dist/objects/decisions.d.ts +14 -52
- package/dist/objects/decisions.js +15 -53
- package/dist/objects/descriptor.d.ts +1 -1
- package/dist/objects/incidents.d.ts +9 -40
- package/dist/objects/incidents.js +7 -41
- package/dist/objects/lifecycle.d.ts +1 -1
- package/dist/objects/lifecycle.js +2 -1
- package/dist/objects/policies.d.ts +13 -91
- package/dist/objects/policies.js +13 -99
- package/dist/objects/processes.d.ts +9 -54
- package/dist/objects/processes.js +7 -61
- package/dist/objects/project-briefs.d.ts +13 -57
- package/dist/objects/project-briefs.js +16 -78
- package/dist/objects/skills.d.ts +9 -44
- package/dist/objects/skills.js +8 -54
- package/dist/postinstall.js +7 -20
- package/dist/predictions/planning-fallacy.d.ts +11 -34
- package/dist/rerankers/clef.js +6 -37
- package/dist/rerankers/cross-encoder.d.ts +31 -2
- package/dist/rerankers/cross-encoder.js +65 -101
- package/dist/rerankers/index.js +5 -4
- package/dist/rerankers/jev.js +11 -10
- package/dist/rerankers/llm.d.ts +2 -11
- package/dist/rerankers/llm.js +14 -14
- package/dist/rerankers/outage-warning.d.ts +5 -2
- package/dist/rerankers/outage-warning.js +7 -4
- package/dist/rerankers/remote.d.ts +1 -0
- package/dist/rerankers/remote.js +2 -0
- package/dist/rerankers/types.d.ts +2 -14
- package/dist/search/bm25-search.js +1 -1
- package/dist/search/boosts.d.ts +0 -2
- package/dist/search/boosts.js +3 -3
- package/dist/search/embed-memories.d.ts +9 -0
- package/dist/search/embed-memories.js +377 -0
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +93 -0
- package/dist/search/hybrid.d.ts +11 -2
- package/dist/search/hybrid.js +9 -4
- package/dist/search/multihop.js +2 -3
- package/dist/search/path-context.d.ts +5 -18
- package/dist/search/path-context.js +5 -18
- package/dist/search/physics-search.d.ts +6 -3
- package/dist/search/physics-search.js +29 -19
- package/dist/search/rerank.js +1 -1
- package/dist/search/rrf.d.ts +7 -35
- package/dist/search/rrf.js +5 -30
- package/dist/search/vector.d.ts +13 -4
- package/dist/search/vector.js +40 -13
- package/dist/server/auth.d.ts +11 -28
- package/dist/server/auth.js +49 -32
- package/dist/server/boot.d.ts +2 -21
- package/dist/server/boot.js +69 -161
- package/dist/server/client-ip.d.ts +3 -21
- package/dist/server/client-ip.js +8 -30
- package/dist/server/deadline.d.ts +0 -2
- package/dist/server/deadline.js +1 -7
- package/dist/server/defaults.d.ts +4 -0
- package/dist/server/defaults.js +5 -0
- package/dist/server/key-check-bounds.d.ts +2 -1
- package/dist/server/lifecycle.d.ts +5 -4
- package/dist/server/lifecycle.js +19 -4
- package/dist/server/mcp-http.js +24 -53
- package/dist/server/rate-limit.d.ts +5 -18
- package/dist/server/rate-limit.js +4 -13
- package/dist/server/request.d.ts +4 -8
- package/dist/server/request.js +16 -19
- package/dist/server/route-checks.d.ts +7 -0
- package/dist/server/route-checks.js +42 -0
- package/dist/server/route-table.d.ts +9 -8
- package/dist/server/route-table.js +127 -139
- package/dist/server/routes/admin.d.ts +8 -8
- package/dist/server/routes/admin.js +35 -49
- package/dist/server/routes/customer-notes.d.ts +6 -6
- package/dist/server/routes/customer-notes.js +8 -14
- package/dist/server/routes/decisions.d.ts +6 -6
- package/dist/server/routes/decisions.js +12 -21
- package/dist/server/routes/incidents.d.ts +6 -6
- package/dist/server/routes/incidents.js +14 -25
- package/dist/server/routes/memories.d.ts +9 -9
- package/dist/server/routes/memories.js +20 -63
- package/dist/server/routes/object-routes.d.ts +6 -11
- package/dist/server/routes/object-routes.js +11 -22
- package/dist/server/routes/policies.d.ts +7 -7
- package/dist/server/routes/policies.js +12 -22
- package/dist/server/routes/predictions.d.ts +6 -6
- package/dist/server/routes/predictions.js +22 -38
- package/dist/server/routes/processes.d.ts +6 -6
- package/dist/server/routes/processes.js +17 -28
- package/dist/server/routes/project-briefs.d.ts +7 -7
- package/dist/server/routes/project-briefs.js +11 -20
- package/dist/server/routes/recall.d.ts +5 -5
- package/dist/server/routes/recall.js +16 -45
- package/dist/server/routes/skills.d.ts +7 -7
- package/dist/server/routes/skills.js +10 -22
- package/dist/server/server-detect.d.ts +15 -53
- package/dist/server/server-detect.js +55 -96
- package/dist/server/sleep-child.js +26 -7
- package/dist/server/sleep-offload.d.ts +11 -5
- package/dist/server/sleep-offload.js +21 -12
- package/dist/server/types.d.ts +32 -18
- package/dist/server/validation.d.ts +3 -2
- package/dist/server/validation.js +15 -33
- package/dist/server.d.ts +7 -6
- package/dist/server.js +8 -6
- package/dist/sharing/global-store.d.ts +19 -0
- package/dist/sharing/global-store.js +75 -0
- package/dist/sharing/global-sync.d.ts +6 -0
- package/dist/sharing/global-sync.js +73 -0
- package/dist/sharing/project-merge.d.ts +11 -19
- package/dist/sharing/project-merge.js +63 -125
- package/dist/sharing/search-both.d.ts +60 -0
- package/dist/sharing/search-both.js +138 -0
- package/dist/sharing/share.d.ts +40 -0
- package/dist/sharing/share.js +229 -0
- package/dist/store/ambient.js +9 -15
- package/dist/store/audit-event.d.ts +5 -13
- package/dist/store/audit-event.js +4 -12
- package/dist/store/audit.d.ts +2 -21
- package/dist/store/audit.js +8 -67
- package/dist/store/auth.d.ts +10 -8
- package/dist/store/auth.js +17 -12
- package/dist/store/candidates.d.ts +23 -5
- package/dist/store/candidates.js +119 -71
- package/dist/store/capture-write.d.ts +17 -0
- package/dist/store/capture-write.js +35 -0
- package/dist/store/card-detail.d.ts +2 -1
- package/dist/store/card-detail.js +2 -1
- package/dist/store/cards.d.ts +14 -9
- package/dist/store/cards.js +72 -126
- package/dist/store/compaction-caller.d.ts +18 -0
- package/dist/store/compaction-caller.js +29 -0
- package/dist/store/compactions-record.d.ts +115 -0
- package/dist/store/compactions-record.js +417 -0
- package/dist/store/compactions.js +6 -4
- package/dist/store/conflicts.d.ts +4 -21
- package/dist/store/conflicts.js +76 -152
- package/dist/store/connectors/dlq.d.ts +10 -0
- package/dist/store/connectors/dlq.js +32 -0
- package/dist/store/connectors/github.d.ts +14 -16
- package/dist/store/connectors/github.js +34 -57
- package/dist/store/connectors/slack.d.ts +2 -11
- package/dist/store/connectors/slack.js +18 -47
- package/dist/store/dashboard-reads.js +11 -14
- package/dist/store/delete-and-batch.d.ts +17 -31
- package/dist/store/delete-and-batch.js +84 -67
- package/dist/store/delivery-recorder.d.ts +15 -4
- package/dist/store/delivery-recorder.js +34 -17
- package/dist/store/descendant-page.js +6 -3
- package/dist/store/diagnostics.js +6 -13
- package/dist/store/dormant.d.ts +8 -30
- package/dist/store/dormant.js +18 -57
- package/dist/store/embeddings/index.d.ts +11 -90
- package/dist/store/embeddings/index.js +18 -523
- package/dist/store/entry-reads.d.ts +34 -61
- package/dist/store/entry-reads.js +111 -136
- package/dist/store/entry-row.d.ts +6 -35
- package/dist/store/entry-row.js +9 -37
- package/dist/store/entry-writes.d.ts +12 -18
- package/dist/store/entry-writes.js +46 -44
- package/dist/store/failure-log-at.d.ts +8 -0
- package/dist/store/failure-log-at.js +16 -0
- package/dist/store/failure-log.d.ts +2 -2
- package/dist/store/failure-log.js +5 -3
- package/dist/{trust → store}/gated-write.d.ts +3 -1
- package/dist/{trust → store}/gated-write.js +7 -5
- package/dist/store/goals.d.ts +3 -40
- package/dist/store/goals.js +41 -178
- package/dist/store/graph-queue.d.ts +6 -22
- package/dist/store/graph-queue.js +14 -45
- package/dist/store/graph-reads.d.ts +11 -35
- package/dist/store/graph-reads.js +24 -60
- package/dist/store/graph-rows.d.ts +3 -6
- package/dist/store/graph-rows.js +6 -9
- package/dist/store/graph-view-rows.d.ts +2 -1
- package/dist/store/graph-view-rows.js +2 -1
- package/dist/store/graph-writes.d.ts +10 -35
- package/dist/store/graph-writes.js +59 -106
- package/dist/store/half-life.d.ts +2 -1
- package/dist/store/half-life.js +14 -16
- package/dist/store/handoffs.d.ts +6 -12
- package/dist/store/handoffs.js +22 -40
- package/dist/store/index-and-stats.d.ts +6 -19
- package/dist/store/index-and-stats.js +36 -84
- package/dist/store/key-writes.js +1 -1
- package/dist/store/ledger-turn.d.ts +9 -0
- package/dist/store/ledger-turn.js +38 -0
- package/dist/store/mirrors.d.ts +2 -6
- package/dist/store/mirrors.js +24 -29
- package/dist/store/open.d.ts +0 -4
- package/dist/store/open.js +42 -62
- package/dist/store/pilot-arm.d.ts +12 -0
- package/dist/store/pilot-arm.js +42 -0
- package/dist/store/planning-fallacy-evidence.d.ts +2 -30
- package/dist/store/planning-fallacy-evidence.js +8 -37
- package/dist/store/port.d.ts +91 -82
- package/dist/store/port.js +8 -0
- package/dist/store/predictions.d.ts +12 -53
- package/dist/store/predictions.js +41 -125
- package/dist/store/project-tags.d.ts +62 -0
- package/dist/store/project-tags.js +67 -0
- package/dist/{cli → store}/quality-repair.js +15 -31
- package/dist/store/quarantine.js +2 -1
- package/dist/store/raw-archive.d.ts +4 -16
- package/dist/store/raw-archive.js +14 -29
- package/dist/store/recall-trace.d.ts +12 -77
- package/dist/store/recall-trace.js +37 -97
- package/dist/store/rejected-values.js +9 -20
- package/dist/store/rejection-probe.d.ts +4 -0
- package/dist/store/rejection-probe.js +19 -0
- package/dist/store/rejection.d.ts +10 -73
- package/dist/store/rejection.js +12 -84
- package/dist/store/report-reads.d.ts +6 -0
- package/dist/store/report-reads.js +29 -0
- package/dist/store/rows.d.ts +9 -19
- package/dist/store/rows.js +36 -34
- package/dist/store/rule-sql.d.ts +14 -0
- package/dist/store/rule-sql.js +56 -0
- package/dist/store/search-rows.d.ts +7 -38
- package/dist/store/search-rows.js +23 -54
- package/dist/store/sessions.d.ts +10 -47
- package/dist/store/sessions.js +21 -75
- package/dist/store/set-aside.d.ts +14 -0
- package/dist/store/set-aside.js +23 -0
- package/dist/store/sqlite/busy.d.ts +3 -0
- package/dist/store/sqlite/busy.js +8 -0
- package/dist/store/sqlite/connector-events-group.js +5 -8
- package/dist/store/sqlite/connector-writes-group.js +3 -3
- package/dist/store/sqlite/entry-writes-group.js +4 -4
- package/dist/store/sqlite/error-codec.js +8 -5
- package/dist/store/sqlite/executor.d.ts +2 -1
- package/dist/store/sqlite/executor.js +12 -5
- package/dist/store/sqlite/graph-reads-group.js +1 -1
- package/dist/store/sqlite/held-connection.d.ts +9 -0
- package/dist/store/sqlite/held-connection.js +41 -0
- package/dist/store/sqlite/local.d.ts +3 -3
- package/dist/store/sqlite/local.js +1 -0
- package/dist/store/sqlite/object-rows.d.ts +1 -1
- package/dist/store/sqlite/object-rows.js +6 -3
- package/dist/store/sqlite/objects-group.d.ts +1 -1
- package/dist/store/sqlite/objects-group.js +5 -3
- package/dist/store/sqlite/quarantine-group.js +2 -2
- package/dist/store/sqlite/store.d.ts +1 -4
- package/dist/store/sqlite/store.js +16 -15
- package/dist/store/sqlite/vector-reads-group.js +2 -2
- package/dist/store/sqlite/worker-jobs.js +1 -1
- package/dist/store/sqlite/worker-ops.d.ts +13 -2
- package/dist/store/sqlite/worker-ops.js +13 -2
- package/dist/store/sqlite/worker-store.js +5 -2
- package/dist/store/summaries.d.ts +11 -63
- package/dist/store/summaries.js +37 -148
- package/dist/store/summary-dirty.js +1 -1
- package/dist/store/tenant-lookup.d.ts +6 -1
- package/dist/store/tenant-lookup.js +7 -0
- package/dist/store/tenant.d.ts +2 -16
- package/dist/store/tenant.js +4 -19
- package/dist/store/token-ledger.d.ts +13 -50
- package/dist/store/token-ledger.js +19 -85
- package/dist/store/usage-reports.js +5 -13
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +171 -0
- package/dist/store/working-memory.d.ts +6 -25
- package/dist/store/working-memory.js +18 -52
- package/dist/support-bundle.js +9 -8
- package/dist/trust/reject-flow.js +3 -5
- package/dist/util/agent-homes.d.ts +15 -0
- package/dist/util/agent-homes.js +34 -0
- package/dist/util/anthropic-messages.d.ts +3 -0
- package/dist/util/anthropic-messages.js +35 -6
- package/dist/util/atomic-write.d.ts +2 -1
- package/dist/util/atomic-write.js +35 -4
- package/dist/util/capped-json.d.ts +6 -0
- package/dist/util/capped-json.js +46 -0
- package/dist/util/chunked.d.ts +3 -0
- package/dist/util/chunked.js +10 -0
- package/dist/util/crash-handlers.d.ts +8 -1
- package/dist/util/crash-handlers.js +52 -10
- package/dist/util/ellipsize.d.ts +3 -0
- package/dist/util/ellipsize.js +5 -0
- package/dist/util/env.d.ts +14 -6
- package/dist/util/env.js +15 -7
- package/dist/util/format.d.ts +3 -0
- package/dist/util/format.js +6 -0
- package/dist/util/home-path.d.ts +2 -1
- package/dist/util/home-path.js +4 -2
- package/dist/util/hook-payload.d.ts +8 -0
- package/dist/util/hook-payload.js +37 -0
- package/dist/util/http-retry.d.ts +9 -1
- package/dist/util/http-retry.js +67 -8
- package/dist/util/http-util.d.ts +0 -8
- package/dist/util/http-util.js +10 -21
- package/dist/util/limits.d.ts +7 -0
- package/dist/util/limits.js +14 -0
- package/dist/util/log.d.ts +7 -2
- package/dist/util/log.js +34 -9
- package/dist/util/request-scope.d.ts +5 -2
- package/dist/util/request-scope.js +13 -7
- package/dist/util/secret-detect.d.ts +5 -30
- package/dist/util/secret-detect.js +19 -40
- package/dist/util/sqlite-blocked.d.ts +2 -0
- package/dist/util/sqlite-blocked.js +5 -0
- package/dist/util/stored-json.d.ts +1 -1
- package/dist/util/stored-json.js +1 -1
- package/dist/util/stream-tee.d.ts +3 -0
- package/dist/util/stream-tee.js +35 -0
- package/dist/util/time.d.ts +4 -0
- package/dist/util/time.js +4 -0
- package/dist/util/token-text.d.ts +1 -4
- package/dist/util/token-text.js +1 -4
- package/dist/util/transcript-tail.d.ts +2 -0
- package/dist/util/transcript-tail.js +24 -23
- package/dist/util/version.d.ts +5 -20
- package/dist/util/version.js +5 -20
- package/dist/{store → util}/yaml.d.ts +1 -5
- package/dist/{store → util}/yaml.js +2 -6
- package/extensions/openclaw-plugin/index.ts +1 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
- package/dist/cli/provenance-coverage.d.ts +0 -18
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/sharing/scope.d.ts +0 -14
- package/dist/sharing/shared.d.ts +0 -187
- package/dist/sharing/shared.js +0 -563
- package/dist/store/embeddings/local.d.ts +0 -15
- package/dist/store/embeddings/local.js +0 -192
- package/dist/store/embeddings/provider.d.ts +0 -77
- package/dist/store/markdown.d.ts +0 -10
- package/dist/store/recall-scope.d.ts +0 -138
- package/dist/store/recall-scope.js +0 -216
- package/dist/store/vector-writes.d.ts +0 -13
- package/dist/store/vector-writes.js +0 -89
- /package/dist/{store → core}/object-types.d.ts +0 -0
- /package/dist/{store → core}/object-types.js +0 -0
- /package/dist/{cli → store}/quality-repair.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.js +0 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { DEFAULT_TENANT_ID } from '../util/env.js';
|
|
1
2
|
import { BadRequestError, NotFoundError } from '../core/api-errors.js';
|
|
2
3
|
import { isFtsAvailable, withWriteScope } from '../db/index.js';
|
|
3
4
|
import { appendAuditEvent, reportAuditWriteFailure } from './audit.js';
|
|
@@ -7,9 +8,8 @@ export function markMirrorCleaned(db, memoryId, at) {
|
|
|
7
8
|
db.prepare(`UPDATE raw_archive SET mirror_cleaned_at = ? WHERE memory_id = ?`).run(at, memoryId);
|
|
8
9
|
}
|
|
9
10
|
function loadRawRow(db, id) {
|
|
10
|
-
// SAFETY: SELECT *
|
|
11
|
-
//
|
|
12
|
-
// null) by the memories schema.
|
|
11
|
+
// SAFETY: SELECT * returns every memories column; only kind, tenant_id and dag_parent_id are read below, all guaranteed present (possibly null) by the
|
|
12
|
+
// schema.
|
|
13
13
|
const row = db.prepare(`SELECT * FROM memories WHERE id = ?`).get(id);
|
|
14
14
|
if (!row)
|
|
15
15
|
throw new NotFoundError(`memory not found: ${id}`);
|
|
@@ -19,15 +19,13 @@ function loadRawRow(db, id) {
|
|
|
19
19
|
return row;
|
|
20
20
|
}
|
|
21
21
|
function moveRowToArchive(db, id, row, opts) {
|
|
22
|
-
// GDPR: raw_archive stores ONLY metadata,
|
|
23
|
-
//
|
|
24
|
-
// for the compliance audit trail. True right-to-be-forgotten — the original
|
|
25
|
-
// content is unrecoverable from raw_archive after this point.
|
|
22
|
+
// GDPR: raw_archive stores ONLY metadata, never the original content; the archive_raw audit row is the compliance trail,
|
|
23
|
+
// so the content is unrecoverable from here on.
|
|
26
24
|
const archivedAt = new Date().toISOString();
|
|
27
25
|
const redactedPayload = JSON.stringify({
|
|
28
26
|
redacted: true,
|
|
29
27
|
archived_at: archivedAt,
|
|
30
|
-
tenant_id: row.tenant_id ??
|
|
28
|
+
tenant_id: row.tenant_id ?? DEFAULT_TENANT_ID,
|
|
31
29
|
kind: row.kind,
|
|
32
30
|
reason: opts.reason,
|
|
33
31
|
});
|
|
@@ -40,15 +38,12 @@ function moveRowToArchive(db, id, row, opts) {
|
|
|
40
38
|
db.prepare(`DELETE FROM memories_fts WHERE id = ?`).run(id);
|
|
41
39
|
return archivedAt;
|
|
42
40
|
}
|
|
43
|
-
// Emit the archive_raw audit
|
|
44
|
-
//
|
|
45
|
-
// (fetched above as part of SELECT *), not the env. Archives must be
|
|
46
|
-
// attributed to the tenant that owns the row, not whatever HIPPO_TENANT
|
|
47
|
-
// happens to be set to in the calling shell.
|
|
41
|
+
// Emit the archive_raw audit inside the SAVEPOINT so it commits atomically with the row deletion, attributed to the row's own tenant_id,
|
|
42
|
+
// not whatever HIPPO_TENANT the calling shell has set.
|
|
48
43
|
function auditArchive(db, id, row, opts) {
|
|
49
44
|
try {
|
|
50
45
|
appendAuditEvent(db, {
|
|
51
|
-
tenantId: String(row.tenant_id ??
|
|
46
|
+
tenantId: String(row.tenant_id ?? DEFAULT_TENANT_ID),
|
|
52
47
|
actor: opts.who || 'cli',
|
|
53
48
|
op: 'archive_raw',
|
|
54
49
|
targetId: id,
|
|
@@ -60,15 +55,8 @@ function auditArchive(db, id, row, opts) {
|
|
|
60
55
|
reportAuditWriteFailure('archive_raw', String(error), id);
|
|
61
56
|
}
|
|
62
57
|
}
|
|
63
|
-
/**
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
* Snapshots the full row into `raw_archive`, flips `kind` to `'archived'` so the
|
|
67
|
-
* append-only trigger lets the delete through, then deletes the row. All in one
|
|
68
|
-
* write scope, which nests inside an outer transaction (e.g. batchWriteAndDelete).
|
|
69
|
-
*
|
|
70
|
-
* Throws if the row does not exist or is not `kind='raw'`. Returns the archived_at it wrote.
|
|
71
|
-
*/
|
|
58
|
+
/** The only way to remove a `kind='raw'` row: snapshots it into `raw_archive`, flips `kind` to 'archived' so the append-only trigger allows the delete,
|
|
59
|
+
* all in one write scope that nests in an outer transaction. Throws if the row is missing or not raw; returns the archived_at. */
|
|
72
60
|
export function archiveRawMemory(db, id, opts) {
|
|
73
61
|
const row = loadRawRow(db, id);
|
|
74
62
|
// A SAVEPOINT when already inside a transaction (e.g. batchWriteAndDelete), so a throw here
|
|
@@ -79,13 +67,10 @@ export function archiveRawMemory(db, id, opts) {
|
|
|
79
67
|
// Archiving a child under a level-2 summary marks the parent dirty, inside the
|
|
80
68
|
// SAVEPOINT so the dirty-mark commits atomically with the archive.
|
|
81
69
|
if (row.dag_parent_id) {
|
|
82
|
-
markSummaryDirtyInTx(db, String(row.dag_parent_id), String(row.tenant_id ??
|
|
70
|
+
markSummaryDirtyInTx(db, String(row.dag_parent_id), String(row.tenant_id ?? DEFAULT_TENANT_ID), opts.who || 'cli');
|
|
83
71
|
}
|
|
84
|
-
// afterArchive hook: connector
|
|
85
|
-
//
|
|
86
|
-
// Throwing here rolls back the entire SAVEPOINT — both the archive and any
|
|
87
|
-
// hook side effects. The hook runs INSIDE the SAVEPOINT so its writes
|
|
88
|
-
// share the archive's transactional fate.
|
|
72
|
+
// afterArchive hook: connector idempotency markers (e.g. slack_event_log) must commit atomically with the archive, so it runs INSIDE the SAVEPOINT;
|
|
73
|
+
// throwing rolls back both.
|
|
89
74
|
if (opts.afterArchive) {
|
|
90
75
|
opts.afterArchive(db, id);
|
|
91
76
|
}
|
|
@@ -1,19 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Single producer for the `recall_traces` / `recall_trace_results` /
|
|
5
|
-
* `recall_trace_outcomes` tables (schema v40). Every recall on the three
|
|
6
|
-
* wired paths (api.recall, api.getContext, CLI cmdRecall) writes a trace
|
|
7
|
-
* row: the ids + ranks + scores actually returned. Outcome events that
|
|
8
|
-
* resolve their targets from last-retrieval state link back to the trace
|
|
9
|
-
* they judge via `recordTraceOutcome`. This is the (query, shown, outcome)
|
|
10
|
-
* training triple every Track LC learned component needs.
|
|
11
|
-
*
|
|
12
|
-
* All writes here are fail-soft: a broken trace write must never break the
|
|
13
|
-
* surrounding recall or outcome call. Failures are logged to stderr and
|
|
14
|
-
* swallowed (matches the api.ts ~2843 "audit emit failed" precedent — no
|
|
15
|
-
* new debug env var).
|
|
16
|
-
*/
|
|
1
|
+
/** Retrieval-trace persistence: the single producer for `recall_traces`, `recall_trace_results` and `recall_trace_outcomes`.
|
|
2
|
+
* One trace row per recall on api.recall, api.getContext and CLI cmdRecall: the (query, shown, outcome) triple the learned components train on.
|
|
3
|
+
* All writes are fail-soft: a failed trace write is logged to stderr and swallowed, never breaking the surrounding call. */
|
|
17
4
|
import { type DatabaseSyncLike } from '../db/index.js';
|
|
18
5
|
import type { RerankStep } from '../core/search-types.js';
|
|
19
6
|
import { type DeliveryEventInput } from './delivery-recorder.js';
|
|
@@ -31,7 +18,7 @@ export interface RecallTraceInput {
|
|
|
31
18
|
sessionId?: string | null;
|
|
32
19
|
pipeline: 'api' | 'cli' | 'context' | 'mcp';
|
|
33
20
|
/** Raw query text. NEVER persisted — only its sha256/16 hash + length are
|
|
34
|
-
* stored (GDPR Path A / audit convention,
|
|
21
|
+
* stored (GDPR Path A / audit convention, CLI). */
|
|
35
22
|
query: string;
|
|
36
23
|
/** True when the caller ran with explain/--why (per-result rerank steps
|
|
37
24
|
* may be present). Defaults to false. */
|
|
@@ -39,39 +26,11 @@ export interface RecallTraceInput {
|
|
|
39
26
|
/** Results in returned rank order (index 0 = rank 1). */
|
|
40
27
|
results: RecallTraceResultInput[];
|
|
41
28
|
}
|
|
42
|
-
/**
|
|
43
|
-
*
|
|
44
|
-
* transaction, on the connection handed in. Fail-soft: never throws —
|
|
45
|
-
* logs to stderr and returns null on any failure.
|
|
46
|
-
*
|
|
47
|
-
* Connection policy: api.recall and api.getContext reach this through
|
|
48
|
-
* `finishRecallAt`, on the handle that recall's other writes use. CLI
|
|
49
|
-
* cmdRecall goes through `writeRecallTraceAtRoot` instead, since its audit
|
|
50
|
-
* handle is already closed by the time tracing runs.
|
|
51
|
-
*/
|
|
29
|
+
/** Insert a `recall_traces` row and its results rows in ONE transaction on the given connection. Fail-soft: logs to stderr and returns null on failure.
|
|
30
|
+
* api.recall/getContext reach this via `finishRecallAt` on their own handle; CLI cmdRecall uses `writeRecallTraceAtRoot` (its audit handle is closed). */
|
|
52
31
|
export declare function writeRecallTrace(db: DatabaseSyncLike, input: RecallTraceInput): number | null;
|
|
53
|
-
/**
|
|
54
|
-
*
|
|
55
|
-
* writes the trace, and closes. Returns the new trace id, or null on any
|
|
56
|
-
* failure (fail-soft).
|
|
57
|
-
*
|
|
58
|
-
* Used at CLI cmdRecall, where the block's own convention is per-call
|
|
59
|
-
* handles (writeEntry, saveIndex) and the earlier audit handle is already
|
|
60
|
-
* closed. NOT used by api.recall, which must reuse the caller's open handle
|
|
61
|
-
* (no-side-effects contract, tests/api-recall-no-side-effects.test.ts).
|
|
62
|
-
*
|
|
63
|
-
* This function does NOT touch the `last_trace_id` meta key: its own connection
|
|
64
|
-
* would commit apart from `saveIndex`, so a crash could advance one key alone. LOCKSTEP
|
|
65
|
-
* INVARIANT: `last_trace_id` must only ever advance in the SAME write as
|
|
66
|
-
* `last_retrieval_ids`. The caller now does: call this function FIRST, set
|
|
67
|
-
* `localIndex.last_trace_id` from the returned id, THEN call `saveIndex`
|
|
68
|
-
* once — `saveIndex` persists both meta keys in one transaction
|
|
69
|
-
* (store.ts). Call sites that trace WITHOUT advancing `last_retrieval_ids`
|
|
70
|
-
* (CLI cmdRecall's zero-result path) simply never touch `localIndex` at
|
|
71
|
-
* all, so they can't desync by construction.
|
|
72
|
-
*
|
|
73
|
-
* Fail-soft: never throws, including on connection failure.
|
|
74
|
-
*/
|
|
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. */
|
|
75
34
|
export declare function writeRecallTraceAtRoot(root: string, input: RecallTraceInput): number | null;
|
|
76
35
|
/** Input to `recordTraceOutcome`. */
|
|
77
36
|
export interface RecordTraceOutcomeInput {
|
|
@@ -81,34 +40,8 @@ export interface RecordTraceOutcomeInput {
|
|
|
81
40
|
/** Ids actually credited by this outcome event (post tenant-filtering). */
|
|
82
41
|
memoryIds: string[];
|
|
83
42
|
}
|
|
84
|
-
/**
|
|
85
|
-
*
|
|
86
|
-
* outcome) triple. Called ONLY where the credited ids actually come from
|
|
87
|
-
* the last-retrieval mechanism (api.outcomeForLastRecall and any outcome
|
|
88
|
-
* flow that resolves its targets from last-retrieval state) or from an
|
|
89
|
-
* SDK caller's explicit `traceId` opt — never unconditionally from
|
|
90
|
-
* api.outcome, which would mislink an explicit-id caller to a stale,
|
|
91
|
-
* unrelated trace.
|
|
92
|
-
*
|
|
93
|
-
* Lives in its own append-only table, not audit_log metadata: audit_log is
|
|
94
|
-
* pruned by `pruneAuditLog`, and pruning must never erase training data.
|
|
95
|
-
*
|
|
96
|
-
* Validation: `traceId`/`memoryIds` reach
|
|
97
|
-
* this function from caller-side state (`last_trace_id` / applied outcome
|
|
98
|
-
* ids) that can go stale relative to the trace it names — a forgotten
|
|
99
|
-
* memory, a tenant switch mid-session, or a race between two callers. Two
|
|
100
|
-
* checks run before the insert, both skip with one log.warn line
|
|
101
|
-
* rather than throw:
|
|
102
|
-
* 1. The named trace must exist and belong to `input.tenantId` — a
|
|
103
|
-
* tenant mismatch or a dangling id (deleted trace) skips.
|
|
104
|
-
* 2. `input.memoryIds` is intersected against the trace's OWN
|
|
105
|
-
* `recall_trace_results.memory_id` set — only ids that trace actually
|
|
106
|
-
* returned are recorded. An id that was never in this trace's result
|
|
107
|
-
* set (stale caller state) is silently dropped rather than recorded
|
|
108
|
-
* as a false credit. If the intersection is empty, no row is written.
|
|
109
|
-
*
|
|
110
|
-
* Fail-soft: never throws.
|
|
111
|
-
*/
|
|
43
|
+
/** 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).
|
|
44
|
+
* Skips (log.warn) unless the trace is in `input.tenantId`; keeps only memoryIds it returned. Own table so `pruneAuditLog` cannot erase training data. */
|
|
112
45
|
export declare function recordTraceOutcome(db: DatabaseSyncLike, input: RecordTraceOutcomeInput): void;
|
|
113
46
|
/** Pruned on write, counted back from the event's ts capped at the real clock, so a far-future fake time spares real rows. */
|
|
114
47
|
export declare const DELIVERY_LEDGER_RETENTION_DAYS = 90;
|
|
@@ -168,6 +101,8 @@ export interface DeliveryEventRow {
|
|
|
168
101
|
recall_hash: string | null;
|
|
169
102
|
emitted_hash: string | null;
|
|
170
103
|
elapsed_ms: number;
|
|
104
|
+
tool_use_id: string | null;
|
|
105
|
+
failure_id: number | null;
|
|
171
106
|
candidates: DeliveryCandidateRow[];
|
|
172
107
|
}
|
|
173
108
|
/** One event plus its candidates in one write transaction, then prune; fail-soft. The caller must not hold a transaction on `db`. */
|
|
@@ -1,33 +1,14 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
* wired paths (api.recall, api.getContext, CLI cmdRecall) writes a trace
|
|
7
|
-
* row: the ids + ranks + scores actually returned. Outcome events that
|
|
8
|
-
* resolve their targets from last-retrieval state link back to the trace
|
|
9
|
-
* they judge via `recordTraceOutcome`. This is the (query, shown, outcome)
|
|
10
|
-
* training triple every Track LC learned component needs.
|
|
11
|
-
*
|
|
12
|
-
* All writes here are fail-soft: a broken trace write must never break the
|
|
13
|
-
* surrounding recall or outcome call. Failures are logged to stderr and
|
|
14
|
-
* swallowed (matches the api.ts ~2843 "audit emit failed" precedent — no
|
|
15
|
-
* new debug env var).
|
|
16
|
-
*/
|
|
17
|
-
import { createHash } from 'node:crypto';
|
|
18
|
-
import { openHippoDb, closeHippoDb, rethrowIfSqliteBlocked, withWriteScope } from '../db/index.js';
|
|
1
|
+
/** Retrieval-trace persistence: the single producer for `recall_traces`, `recall_trace_results` and `recall_trace_outcomes`.
|
|
2
|
+
* One trace row per recall on api.recall, api.getContext and CLI cmdRecall: the (query, shown, outcome) triple the learned components train on.
|
|
3
|
+
* All writes are fail-soft: a failed trace write is logged to stderr and swallowed, never breaking the surrounding call. */
|
|
4
|
+
import { openHippoDb, closeHippoDb, withWriteScope } from '../db/index.js';
|
|
5
|
+
import { rethrowIfSqliteBlocked } from '../util/sqlite-blocked.js';
|
|
19
6
|
import { DELIVERY_LEDGER_VERSION, isBoundaryEvent } from './delivery-recorder.js';
|
|
20
|
-
import { errorMessage, log } from '../util/log.js';
|
|
7
|
+
import { errorFields, errorMessage, log } from '../util/log.js';
|
|
21
8
|
import { DAY_MS } from '../util/time.js';
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
*
|
|
25
|
-
* free-form human text — the CLI's goal-boost step embeds matched goal tag
|
|
26
|
-
* text there, so persisting it verbatim would leak raw user content into
|
|
27
|
-
* training data via `rerank_json`. Only the four structured fields survive;
|
|
28
|
-
* any other/future free-form field is dropped by construction (allowlist,
|
|
29
|
-
* not a denylist).
|
|
30
|
-
*/
|
|
9
|
+
import { blockHash } from '../util/token-text.js';
|
|
10
|
+
/** Strip a RerankStep to {stage, multiplier, scoreBefore, scoreAfter}: `note` is free-form (the CLI goal-boost step embeds goal tag text) and would leak
|
|
11
|
+
* user content into `rerank_json`; an allowlist, so any future free-form field is dropped too. */
|
|
31
12
|
function sanitizeRerankSteps(steps) {
|
|
32
13
|
return steps.map((s) => ({
|
|
33
14
|
stage: s.stage,
|
|
@@ -36,19 +17,11 @@ function sanitizeRerankSteps(steps) {
|
|
|
36
17
|
scoreAfter: s.scoreAfter,
|
|
37
18
|
}));
|
|
38
19
|
}
|
|
39
|
-
/**
|
|
40
|
-
*
|
|
41
|
-
* transaction, on the connection handed in. Fail-soft: never throws —
|
|
42
|
-
* logs to stderr and returns null on any failure.
|
|
43
|
-
*
|
|
44
|
-
* Connection policy: api.recall and api.getContext reach this through
|
|
45
|
-
* `finishRecallAt`, on the handle that recall's other writes use. CLI
|
|
46
|
-
* cmdRecall goes through `writeRecallTraceAtRoot` instead, since its audit
|
|
47
|
-
* handle is already closed by the time tracing runs.
|
|
48
|
-
*/
|
|
20
|
+
/** Insert a `recall_traces` row and its results rows in ONE transaction on the given connection. Fail-soft: logs to stderr and returns null on failure.
|
|
21
|
+
* api.recall/getContext reach this via `finishRecallAt` on their own handle; CLI cmdRecall uses `writeRecallTraceAtRoot` (its audit handle is closed). */
|
|
49
22
|
export function writeRecallTrace(db, input) {
|
|
50
23
|
try {
|
|
51
|
-
const queryHash =
|
|
24
|
+
const queryHash = blockHash(input.query);
|
|
52
25
|
const ts = new Date().toISOString();
|
|
53
26
|
return withWriteScope(db, 'write_recall_trace', () => {
|
|
54
27
|
const insertTrace = db.prepare(`
|
|
@@ -68,32 +41,12 @@ export function writeRecallTrace(db, input) {
|
|
|
68
41
|
});
|
|
69
42
|
}
|
|
70
43
|
catch (error) {
|
|
71
|
-
log.error(`recall trace write failed: ${errorMessage(error)}
|
|
44
|
+
log.error(`recall trace write failed: ${errorMessage(error)}`, errorFields(error));
|
|
72
45
|
return null;
|
|
73
46
|
}
|
|
74
47
|
}
|
|
75
|
-
/**
|
|
76
|
-
*
|
|
77
|
-
* writes the trace, and closes. Returns the new trace id, or null on any
|
|
78
|
-
* failure (fail-soft).
|
|
79
|
-
*
|
|
80
|
-
* Used at CLI cmdRecall, where the block's own convention is per-call
|
|
81
|
-
* handles (writeEntry, saveIndex) and the earlier audit handle is already
|
|
82
|
-
* closed. NOT used by api.recall, which must reuse the caller's open handle
|
|
83
|
-
* (no-side-effects contract, tests/api-recall-no-side-effects.test.ts).
|
|
84
|
-
*
|
|
85
|
-
* This function does NOT touch the `last_trace_id` meta key: its own connection
|
|
86
|
-
* would commit apart from `saveIndex`, so a crash could advance one key alone. LOCKSTEP
|
|
87
|
-
* INVARIANT: `last_trace_id` must only ever advance in the SAME write as
|
|
88
|
-
* `last_retrieval_ids`. The caller now does: call this function FIRST, set
|
|
89
|
-
* `localIndex.last_trace_id` from the returned id, THEN call `saveIndex`
|
|
90
|
-
* once — `saveIndex` persists both meta keys in one transaction
|
|
91
|
-
* (store.ts). Call sites that trace WITHOUT advancing `last_retrieval_ids`
|
|
92
|
-
* (CLI cmdRecall's zero-result path) simply never touch `localIndex` at
|
|
93
|
-
* all, so they can't desync by construction.
|
|
94
|
-
*
|
|
95
|
-
* Fail-soft: never throws, including on connection failure.
|
|
96
|
-
*/
|
|
48
|
+
/** 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.
|
|
49
|
+
* 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. */
|
|
97
50
|
export function writeRecallTraceAtRoot(root, input) {
|
|
98
51
|
let db;
|
|
99
52
|
try {
|
|
@@ -101,7 +54,7 @@ export function writeRecallTraceAtRoot(root, input) {
|
|
|
101
54
|
}
|
|
102
55
|
catch (error) {
|
|
103
56
|
rethrowIfSqliteBlocked(error);
|
|
104
|
-
log.error(`recall trace connection failed: ${errorMessage(error)}
|
|
57
|
+
log.error(`recall trace connection failed: ${errorMessage(error)}`, errorFields(error));
|
|
105
58
|
return null;
|
|
106
59
|
}
|
|
107
60
|
try {
|
|
@@ -111,34 +64,8 @@ export function writeRecallTraceAtRoot(root, input) {
|
|
|
111
64
|
closeHippoDb(db);
|
|
112
65
|
}
|
|
113
66
|
}
|
|
114
|
-
/**
|
|
115
|
-
*
|
|
116
|
-
* outcome) triple. Called ONLY where the credited ids actually come from
|
|
117
|
-
* the last-retrieval mechanism (api.outcomeForLastRecall and any outcome
|
|
118
|
-
* flow that resolves its targets from last-retrieval state) or from an
|
|
119
|
-
* SDK caller's explicit `traceId` opt — never unconditionally from
|
|
120
|
-
* api.outcome, which would mislink an explicit-id caller to a stale,
|
|
121
|
-
* unrelated trace.
|
|
122
|
-
*
|
|
123
|
-
* Lives in its own append-only table, not audit_log metadata: audit_log is
|
|
124
|
-
* pruned by `pruneAuditLog`, and pruning must never erase training data.
|
|
125
|
-
*
|
|
126
|
-
* Validation: `traceId`/`memoryIds` reach
|
|
127
|
-
* this function from caller-side state (`last_trace_id` / applied outcome
|
|
128
|
-
* ids) that can go stale relative to the trace it names — a forgotten
|
|
129
|
-
* memory, a tenant switch mid-session, or a race between two callers. Two
|
|
130
|
-
* checks run before the insert, both skip with one log.warn line
|
|
131
|
-
* rather than throw:
|
|
132
|
-
* 1. The named trace must exist and belong to `input.tenantId` — a
|
|
133
|
-
* tenant mismatch or a dangling id (deleted trace) skips.
|
|
134
|
-
* 2. `input.memoryIds` is intersected against the trace's OWN
|
|
135
|
-
* `recall_trace_results.memory_id` set — only ids that trace actually
|
|
136
|
-
* returned are recorded. An id that was never in this trace's result
|
|
137
|
-
* set (stale caller state) is silently dropped rather than recorded
|
|
138
|
-
* as a false credit. If the intersection is empty, no row is written.
|
|
139
|
-
*
|
|
140
|
-
* Fail-soft: never throws.
|
|
141
|
-
*/
|
|
67
|
+
/** 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).
|
|
68
|
+
* Skips (log.warn) unless the trace is in `input.tenantId`; keeps only memoryIds it returned. Own table so `pruneAuditLog` cannot erase training data. */
|
|
142
69
|
export function recordTraceOutcome(db, input) {
|
|
143
70
|
try {
|
|
144
71
|
// SAFETY: row shape matches the single `tenant_id` column named in the
|
|
@@ -165,7 +92,7 @@ export function recordTraceOutcome(db, input) {
|
|
|
165
92
|
`).run(input.traceId, new Date().toISOString(), input.tenantId, input.outcome, JSON.stringify(credited));
|
|
166
93
|
}
|
|
167
94
|
catch (error) {
|
|
168
|
-
log.error(`recall trace outcome write failed: ${errorMessage(error)}
|
|
95
|
+
log.error(`recall trace outcome write failed: ${errorMessage(error)}`, errorFields(error));
|
|
169
96
|
}
|
|
170
97
|
}
|
|
171
98
|
/** Pruned on write, counted back from the event's ts capped at the real clock, so a far-future fake time spares real rows. */
|
|
@@ -179,7 +106,7 @@ const DELIVERY_EVENT_COLUMNS = [
|
|
|
179
106
|
'session_id', 'session_state', 'host_turn_id', 'turn_seq', 'duplicate_of', 'prompt_hash', 'prompt_length', 'query_hash',
|
|
180
107
|
'recall_trace_id', 'block_state', 'prompt_recall', 'considered_count', 'filtered_count', 'selected_count', 'emitted_count',
|
|
181
108
|
'rejected_count', 'rejected_unlisted', 'sections_shown', 'sections_dropped', 'budget_tokens', 'selected_tokens',
|
|
182
|
-
'injected_tokens', 'static_hash', 'recall_hash', 'emitted_hash', 'elapsed_ms',
|
|
109
|
+
'injected_tokens', 'static_hash', 'recall_hash', 'emitted_hash', 'elapsed_ms', 'tool_use_id', 'failure_id',
|
|
183
110
|
];
|
|
184
111
|
function findDuplicateBoundary(db, input) {
|
|
185
112
|
// SAFETY: rows carry exactly the `id` and `ts` columns selected.
|
|
@@ -191,7 +118,21 @@ function findDuplicateBoundary(db, input) {
|
|
|
191
118
|
const at = Date.parse(input.ts);
|
|
192
119
|
return rows.find((r) => Math.abs(Date.parse(r.ts) - at) <= DELIVERY_DUPLICATE_WINDOW_MS)?.id ?? null;
|
|
193
120
|
}
|
|
121
|
+
function findDuplicateToolFailure(db, input) {
|
|
122
|
+
// Without a call id a time window would merge parallel failures, so two such fires stay two rows.
|
|
123
|
+
if (input.toolUseId === undefined || input.toolUseId === null)
|
|
124
|
+
return null;
|
|
125
|
+
// SAFETY: a single `id` column, undefined when no row matches.
|
|
126
|
+
const row = db.prepare(`
|
|
127
|
+
SELECT id FROM delivery_events
|
|
128
|
+
WHERE tenant_id = ? AND session_id = ? AND event_type = ? AND tool_use_id = ? AND turn_seq IS NOT NULL
|
|
129
|
+
ORDER BY id LIMIT 1
|
|
130
|
+
`).get(input.tenantId, input.sessionId, input.eventType, input.toolUseId);
|
|
131
|
+
return row?.id ?? null;
|
|
132
|
+
}
|
|
194
133
|
function findDuplicateTurn(db, input) {
|
|
134
|
+
if (input.eventType === 'tool-failure')
|
|
135
|
+
return findDuplicateToolFailure(db, input);
|
|
195
136
|
// A boundary has no prompt, and two compactions of one session never start within the window, so time alone decides.
|
|
196
137
|
if (isBoundaryEvent(input.eventType))
|
|
197
138
|
return findDuplicateBoundary(db, input);
|
|
@@ -239,6 +180,7 @@ export function writeDeliveryEvent(db, input) {
|
|
|
239
180
|
input.consideredCount, input.filteredCount, input.selectedCount, input.emittedCount, input.rejectedCount,
|
|
240
181
|
input.rejectedUnlisted, input.sectionsShown, input.sectionsDropped, input.budgetTokens, input.selectedTokens,
|
|
241
182
|
input.injectedTokens, input.staticHash, input.recallHash, input.emittedHash, Math.round(input.elapsedMs),
|
|
183
|
+
input.toolUseId ?? null, input.failureId ?? null,
|
|
242
184
|
];
|
|
243
185
|
const eventId = Number(db.prepare(`
|
|
244
186
|
INSERT INTO delivery_events (${DELIVERY_EVENT_COLUMNS.join(', ')})
|
|
@@ -258,8 +200,7 @@ export function writeDeliveryEvent(db, input) {
|
|
|
258
200
|
});
|
|
259
201
|
}
|
|
260
202
|
catch (error) {
|
|
261
|
-
|
|
262
|
-
console.error(`[hippo] delivery ledger write failed: ${errorMessage(error)}`);
|
|
203
|
+
log.error(`delivery ledger write failed: ${errorMessage(error)}`);
|
|
263
204
|
return null;
|
|
264
205
|
}
|
|
265
206
|
}
|
|
@@ -270,8 +211,7 @@ export function writeDeliveryEventAtRoot(root, input) {
|
|
|
270
211
|
db = openHippoDb(root);
|
|
271
212
|
}
|
|
272
213
|
catch (error) {
|
|
273
|
-
|
|
274
|
-
console.error(`[hippo] delivery ledger write failed: ${errorMessage(error)}`);
|
|
214
|
+
log.error(`delivery ledger write failed: ${errorMessage(error)}`);
|
|
275
215
|
return null;
|
|
276
216
|
}
|
|
277
217
|
try {
|
|
@@ -9,9 +9,10 @@ import { entryRejectRowAt, selectAllEntries } from './entry-reads.js';
|
|
|
9
9
|
import { stampOriginProject } from './entry-row.js';
|
|
10
10
|
import { writeEntryDbOnly, writeEntryMirrors } from './entry-writes.js';
|
|
11
11
|
import { purgeMirrorBestEffort } from './mirrors.js';
|
|
12
|
-
import { openStore } from './open.js';
|
|
12
|
+
import { onHandle, openStore } from './open.js';
|
|
13
13
|
import { archiveRawMemory, markMirrorCleaned } from './raw-archive.js';
|
|
14
|
-
import {
|
|
14
|
+
import { checkRejectionGuard, deleteRejectedValue, insertRejectedValue, listRejectedValues, normalizeValueForRejection, rejectionDigest, } from './rejection.js';
|
|
15
|
+
import { RejectedValueError } from '../core/api-errors.js';
|
|
15
16
|
function removeLiveRows(db, hippoRoot, rejection, holdsValue, removal) {
|
|
16
17
|
const { tenantId, actor, reason } = rejection;
|
|
17
18
|
const { removedIds, removedRawIds, successors } = removal;
|
|
@@ -81,8 +82,7 @@ function purgeRemovedMirrors(db, hippoRoot, removal) {
|
|
|
81
82
|
* text (live or dormant, whole or inside a merged row) and one reject_value audit row. Markdown mirrors follow the commit. */
|
|
82
83
|
export function applyRejection(hippoRoot, rejection) {
|
|
83
84
|
const { tenantId, actor, reason, memoryId } = rejection;
|
|
84
|
-
|
|
85
|
-
try {
|
|
85
|
+
return onHandle(hippoRoot, (db) => {
|
|
86
86
|
const content = rejection.textOf(memoryId === undefined ? undefined : entryRejectRowAt(db, memoryId));
|
|
87
87
|
const digest = rejectionDigest(content);
|
|
88
88
|
const rejectedAt = new Date().toISOString();
|
|
@@ -108,16 +108,12 @@ export function applyRejection(hippoRoot, rejection) {
|
|
|
108
108
|
purgeRemovedMirrors(db, hippoRoot, removal);
|
|
109
109
|
const { removedIds, removedRawIds, successors, dormantSuccessorIds } = removal;
|
|
110
110
|
return { digest, content, removedIds, removedRawIds, successorIds: successors.map((s) => s.id), dormantSuccessorIds };
|
|
111
|
-
}
|
|
112
|
-
finally {
|
|
113
|
-
closeHippoDb(db);
|
|
114
|
-
}
|
|
111
|
+
}, openStore);
|
|
115
112
|
}
|
|
116
113
|
/** Deletes the tenant's one rejected value whose digest starts with `digestPrefix` and writes its unreject_value audit row.
|
|
117
114
|
* No match, or more than one, writes nothing. */
|
|
118
115
|
export function liftRejection(hippoRoot, tenantId, digestPrefix, actor) {
|
|
119
|
-
|
|
120
|
-
try {
|
|
116
|
+
return onHandle(hippoRoot, (db) => {
|
|
121
117
|
const matches = listRejectedValues(db, tenantId).filter((r) => r.digest.startsWith(digestPrefix));
|
|
122
118
|
const target = matches[0];
|
|
123
119
|
if (target === undefined)
|
|
@@ -127,20 +123,13 @@ export function liftRejection(hippoRoot, tenantId, digestPrefix, actor) {
|
|
|
127
123
|
deleteRejectedValue(db, tenantId, target.digest);
|
|
128
124
|
audit(db, 'unreject_value', { tenantId, actor, targetId: target.sourceMemoryId ?? undefined, metadata: { digest: target.digest, reason: target.reason } });
|
|
129
125
|
return { status: 'ok', digest: target.digest, reason: target.reason };
|
|
130
|
-
}
|
|
131
|
-
finally {
|
|
132
|
-
closeHippoDb(db);
|
|
133
|
-
}
|
|
126
|
+
}, openStore);
|
|
134
127
|
}
|
|
135
128
|
/** The tenant's rejected values, newest first. */
|
|
136
129
|
export function loadRejectedValues(hippoRoot, tenantId) {
|
|
137
|
-
|
|
138
|
-
try {
|
|
130
|
+
return onHandle(hippoRoot, (db) => {
|
|
139
131
|
return listRejectedValues(db, tenantId);
|
|
140
|
-
}
|
|
141
|
-
finally {
|
|
142
|
-
closeHippoDb(db);
|
|
143
|
-
}
|
|
132
|
+
}, openStore);
|
|
144
133
|
}
|
|
145
134
|
/** Whether the write guard would refuse `content` under `entryId`, as a write of that row would find it. Reads on a plain open
|
|
146
135
|
* and writes nothing, so a dry run counts the values a real run refuses. */
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type RejectionProbe = (tenantId: string, entryId: string, content: string) => boolean;
|
|
2
|
+
/** Runs `fn` with a probe that says whether the write guard would refuse the content; the handle closes after. */
|
|
3
|
+
export declare function withRejectionProbe<T>(hippoRoot: string, fn: (wouldReject: RejectionProbe) => T): T;
|
|
4
|
+
//# sourceMappingURL=rejection-probe.d.ts.map
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// A rejected-value check for a dry run, on a handle the caller never sees.
|
|
2
|
+
import { onHandle } from './open.js';
|
|
3
|
+
import { checkRejectionGuard } from './rejection.js';
|
|
4
|
+
import { RejectedValueError } from '../core/api-errors.js';
|
|
5
|
+
/** Runs `fn` with a probe that says whether the write guard would refuse the content; the handle closes after. */
|
|
6
|
+
export function withRejectionProbe(hippoRoot, fn) {
|
|
7
|
+
return onHandle(hippoRoot, (db) => fn((tenantId, entryId, content) => {
|
|
8
|
+
try {
|
|
9
|
+
checkRejectionGuard(db, tenantId, entryId, content);
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
catch (err) {
|
|
13
|
+
if (err instanceof RejectedValueError)
|
|
14
|
+
return true;
|
|
15
|
+
throw err;
|
|
16
|
+
}
|
|
17
|
+
}));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=rejection-probe.js.map
|
|
@@ -1,52 +1,11 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Exact-normalized-value semantics: a human who rejects a fact can refuse
|
|
5
|
-
* byte-stable re-ingestion of the same value across remember/capture/import/
|
|
6
|
-
* sync surfaces. Paraphrase/semantic matching is explicitly out of scope
|
|
7
|
-
* (documented limitation, plan "Design").
|
|
8
|
-
*
|
|
9
|
-
* Kept db-agnostic (helpers take a `DatabaseSyncLike` handle) and does NOT
|
|
10
|
-
* import from store.ts — store.ts imports from here, and the reverse would
|
|
11
|
-
* be a cycle.
|
|
12
|
-
*/
|
|
1
|
+
/** Rejected-value tombstone: a human can refuse byte-stable re-ingestion of a rejected fact (exact normalized value); paraphrase matching is out of scope.
|
|
2
|
+
* db-agnostic (helpers take a `DatabaseSyncLike`) and imports nothing from the store layer above it, which imports this (the reverse is a cycle). */
|
|
13
3
|
import type { DatabaseSyncLike } from '../db/index.js';
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
* Normalize content for rejection-digest comparisons: Unicode NFC →
|
|
17
|
-
* lowercase → collapse whitespace runs to a single space → trim. No
|
|
18
|
-
* punctuation stripping — over-normalization creates false refusals, which
|
|
19
|
-
* are worse than misses (plan §1).
|
|
20
|
-
*/
|
|
4
|
+
/** Normalize content for rejection digests: NFC, lowercase, collapse whitespace runs, trim. No punctuation stripping: over-normalizing causes false
|
|
5
|
+
* refusals, worse than misses. */
|
|
21
6
|
export declare function normalizeValueForRejection(content: string): string;
|
|
22
|
-
/**
|
|
23
|
-
* Full sha256 hex (64 chars) of the normalized content. Reuses the strong-
|
|
24
|
-
* identity convention (importers.ts:814 content-hash tag), NOT the privacy-
|
|
25
|
-
* lossy 16-char convention (recall-trace query hashing) — a tombstone lookup
|
|
26
|
-
* key needs collision resistance, not redaction (plan §1).
|
|
27
|
-
*/
|
|
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. */
|
|
28
8
|
export declare function rejectionDigest(content: string): string;
|
|
29
|
-
/**
|
|
30
|
-
* Thrown by the write-path guard (checkRejectionGuard, called from
|
|
31
|
-
* upsertEntryRow) when an incoming write would introduce a value matching a
|
|
32
|
-
* tombstoned digest. Carries enough context for the transaction-owner catch
|
|
33
|
-
* blocks (writeEntry, api.supersede) to write a post-rollback
|
|
34
|
-
* `reject_refusal` audit row via `auditRejectionRefusal` (plan §3).
|
|
35
|
-
*/
|
|
36
|
-
export declare class RejectedValueError extends BadRequestError {
|
|
37
|
-
readonly digest: string;
|
|
38
|
-
readonly tenantId: string;
|
|
39
|
-
readonly entryId: string;
|
|
40
|
-
readonly reason: string | null;
|
|
41
|
-
readonly rejectedAt: string;
|
|
42
|
-
constructor(opts: {
|
|
43
|
-
digest: string;
|
|
44
|
-
tenantId: string;
|
|
45
|
-
entryId: string;
|
|
46
|
-
reason: string | null;
|
|
47
|
-
rejectedAt: string;
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
9
|
export interface RejectedValueRow {
|
|
51
10
|
tenantId: string;
|
|
52
11
|
digest: string;
|
|
@@ -56,15 +15,9 @@ export interface RejectedValueRow {
|
|
|
56
15
|
sourceMemoryId: string | null;
|
|
57
16
|
normalizedChars: number | null;
|
|
58
17
|
}
|
|
59
|
-
/**
|
|
60
|
-
* Look up a tombstone by tenant + digest. One indexed point query — the
|
|
61
|
-
* guard's common-case cost, a miss ends the guard (plan §3).
|
|
62
|
-
*/
|
|
18
|
+
/** Look up a tombstone by tenant + digest: one indexed point query, the guard's common-case cost; a miss ends the guard. */
|
|
63
19
|
export declare function findRejectedValue(db: DatabaseSyncLike, tenantId: string, digest: string): RejectedValueRow | null;
|
|
64
|
-
/**
|
|
65
|
-
* Insert (or refresh) a tombstone row. Caller owns the transaction — used by
|
|
66
|
-
* the `reject` verb and `resolveConflict`'s `rejectLoserValue` path.
|
|
67
|
-
*/
|
|
20
|
+
/** Insert (or refresh) a tombstone row; the caller owns the transaction (used by the `reject` verb and `resolveConflict`'s `rejectLoserValue`). */
|
|
68
21
|
export declare function insertRejectedValue(db: DatabaseSyncLike, opts: {
|
|
69
22
|
tenantId: string;
|
|
70
23
|
digest: string;
|
|
@@ -74,27 +27,11 @@ export declare function insertRejectedValue(db: DatabaseSyncLike, opts: {
|
|
|
74
27
|
sourceMemoryId?: string | null;
|
|
75
28
|
normalizedChars: number;
|
|
76
29
|
}): void;
|
|
77
|
-
/**
|
|
78
|
-
* Delete a tombstone by tenant + exact digest: the `unreject` verb, the
|
|
79
|
-
* only escape hatch.
|
|
80
|
-
*/
|
|
30
|
+
/** Delete a tombstone by tenant + exact digest: the `unreject` verb, the only escape hatch. */
|
|
81
31
|
export declare function deleteRejectedValue(db: DatabaseSyncLike, tenantId: string, digest: string): boolean;
|
|
82
32
|
/** List tombstones for a tenant, newest first: the `rejections` verb. */
|
|
83
33
|
export declare function listRejectedValues(db: DatabaseSyncLike, tenantId: string): RejectedValueRow[];
|
|
84
|
-
/**
|
|
85
|
-
*
|
|
86
|
-
* (store.ts). Fires when the incoming content's digest matches a tombstone
|
|
87
|
-
* AND the write *introduces* that content: the row is new, OR the stored
|
|
88
|
-
* row's content digest differs from the incoming one — an UPSERT editing a
|
|
89
|
-
* same-id row TO a rejected value is a content introduction and must be
|
|
90
|
-
* refused. Unchanged same-id re-persists (recall boost, decay, star toggle)
|
|
91
|
-
* are exempt by construction (plan §3).
|
|
92
|
-
*
|
|
93
|
-
* Ordering minimizes queries on the common (miss) path: (a) caller has
|
|
94
|
-
* already computed nothing yet — this does the digest + point lookup first;
|
|
95
|
-
* (b) a miss returns immediately (ONE indexed point query); (c) only on a
|
|
96
|
-
* tombstone hit does it SELECT the stored row's content to classify
|
|
97
|
-
* new-row vs content-introduction (+1 query, rare path).
|
|
98
|
-
*/
|
|
34
|
+
/** Write-path guard check: fires when the digest matches a tombstone AND the write introduces that content (a new row, or a same-id UPSERT changing it).
|
|
35
|
+
* Unchanged same-id re-persists (recall boost, decay, star toggle) are exempt. A miss costs ONE indexed point query; only a hit SELECTs the stored row. */
|
|
99
36
|
export declare function checkRejectionGuard(db: DatabaseSyncLike, tenantId: string, entryId: string, content: string): void;
|
|
100
37
|
//# sourceMappingURL=rejection.d.ts.map
|