hippo-memory 1.72.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -4
- package/dist/agent-memories/apply.d.ts +7 -5
- package/dist/agent-memories/apply.js +66 -39
- package/dist/agent-memories/claude-code.d.ts +8 -2
- package/dist/agent-memories/claude-code.js +26 -7
- package/dist/agent-memories/copilot.js +2 -1
- package/dist/agent-memories/files.js +2 -1
- package/dist/agent-memories/legacy.d.ts +6 -3
- package/dist/agent-memories/legacy.js +35 -14
- package/dist/agent-memories/markdown.d.ts +3 -1
- package/dist/agent-memories/markdown.js +3 -1
- package/dist/agent-memories/openclaw.js +5 -2
- package/dist/agent-memories/plan.js +11 -1
- package/dist/agent-memories/project-folds.js +2 -1
- package/dist/agent-memories/report.d.ts +4 -1
- package/dist/agent-memories/report.js +43 -9
- package/dist/agent-memories/source.d.ts +8 -2
- package/dist/agent-memories/source.js +11 -3
- package/dist/agent-memories/sync.d.ts +7 -2
- package/dist/agent-memories/sync.js +141 -101
- package/dist/api/assemble.d.ts +6 -4
- package/dist/api/assemble.js +11 -5
- package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
- package/dist/api/auth/audit.js +58 -0
- package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -16
- package/dist/api/{auth.js → auth/auth.js} +66 -54
- package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
- package/dist/api/{quarantine.js → auth/quarantine.js} +8 -7
- package/dist/api/auth/session-owners.d.ts +10 -0
- package/dist/api/auth/session-owners.js +35 -0
- package/dist/api/availability.d.ts +3 -1
- package/dist/api/availability.js +3 -1
- package/dist/api/busy.d.ts +2 -0
- package/dist/api/busy.js +2 -0
- package/dist/api/cli-surface.d.ts +6 -0
- package/dist/api/cli-surface.js +6 -0
- package/dist/api/config-of.d.ts +5 -0
- package/dist/api/config-of.js +6 -0
- package/dist/api/context-auto.d.ts +4 -1
- package/dist/api/context-auto.js +14 -4
- package/dist/api/context-render.js +14 -7
- package/dist/api/context-select.d.ts +4 -1
- package/dist/api/context-select.js +31 -34
- package/dist/api/context-types.d.ts +38 -12
- package/dist/api/context.d.ts +8 -5
- package/dist/api/context.js +120 -63
- package/dist/api/continuity.d.ts +24 -21
- package/dist/api/continuity.js +18 -20
- package/dist/api/correction-latency.d.ts +3 -1
- package/dist/api/correction-latency.js +3 -1
- package/dist/api/error-reply.d.ts +4 -1
- package/dist/api/error-reply.js +12 -3
- package/dist/api/index.d.ts +39 -23
- package/dist/api/index.js +21 -23
- package/dist/api/instruction-detect.d.ts +4 -1
- package/dist/api/instruction-detect.js +75 -20
- package/dist/api/ledger-db.d.ts +15 -11
- package/dist/api/ledger-db.js +21 -23
- package/dist/api/memories/conflicts.d.ts +33 -0
- package/dist/api/memories/conflicts.js +67 -0
- package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
- package/dist/api/{forget.js → memories/forget.js} +23 -17
- package/dist/api/memories/memories.d.ts +27 -0
- package/dist/api/memories/memories.js +52 -0
- package/dist/api/memories/outcome.d.ts +22 -0
- package/dist/api/memories/outcome.js +28 -0
- package/dist/api/memories/promote.d.ts +40 -0
- package/dist/api/memories/promote.js +76 -0
- package/dist/api/memories/refine.d.ts +10 -0
- package/dist/api/memories/refine.js +12 -0
- package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +17 -9
- package/dist/api/{remember-local.js → memories/remember-local.js} +46 -24
- package/dist/api/{remember.d.ts → memories/remember.d.ts} +22 -13
- package/dist/api/{remember.js → memories/remember.js} +50 -32
- package/dist/api/objects/cards.d.ts +39 -0
- package/dist/api/{cards.js → objects/cards.js} +12 -14
- package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
- package/dist/api/{drill-down.js → objects/drill-down.js} +7 -7
- package/dist/api/objects/goals.d.ts +18 -0
- package/dist/api/{goals.js → objects/goals.js} +12 -12
- package/dist/api/objects/graph.d.ts +11 -0
- package/dist/api/objects/graph.js +16 -0
- package/dist/api/objects/objects.d.ts +9 -0
- package/dist/api/{objects.js → objects/objects.js} +2 -3
- package/dist/api/objects/predictions.d.ts +11 -0
- package/dist/api/{predictions.js → objects/predictions.js} +7 -5
- package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
- package/dist/api/{projects.js → objects/projects.js} +8 -4
- package/dist/api/pilot-arm.d.ts +8 -4
- package/dist/api/pilot-arm.js +5 -4
- package/dist/api/prompt-hook.d.ts +35 -20
- package/dist/api/prompt-hook.js +66 -44
- package/dist/api/provenance-coverage.d.ts +3 -1
- package/dist/api/provenance-coverage.js +3 -1
- package/dist/api/recall/finish.d.ts +185 -0
- package/dist/api/recall/finish.js +301 -0
- package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
- package/dist/api/{recall-pipeline.js → recall/pipeline.js} +185 -101
- package/dist/api/recall/recall.d.ts +6 -0
- package/dist/api/{recall.js → recall/recall.js} +116 -72
- package/dist/api/recall/render.d.ts +39 -0
- package/dist/api/recall/render.js +60 -0
- package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
- package/dist/api/recall/request.js +261 -0
- package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
- package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
- package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -68
- package/dist/api/{recall-types.js → recall/types.js} +1 -1
- package/dist/api/session-end.d.ts +36 -8
- package/dist/api/session-end.js +71 -25
- package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
- package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
- package/dist/api/sleep/dormant.d.ts +25 -0
- package/dist/api/sleep/dormant.js +64 -0
- package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
- package/dist/api/sleep/learn.js +138 -0
- package/dist/api/sleep/sleep-run.d.ts +38 -0
- package/dist/api/{sleep-run.js → sleep/sleep-run.js} +54 -45
- package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
- package/dist/api/sleep/sleep.js +9 -0
- package/dist/api/status.d.ts +3 -1
- package/dist/api/status.js +3 -1
- package/dist/api/store-init.d.ts +4 -1
- package/dist/api/store-init.js +4 -1
- package/dist/api/tokens.d.ts +10 -9
- package/dist/api/tokens.js +9 -10
- package/dist/api/types.d.ts +27 -12
- package/dist/api/types.js +13 -4
- package/dist/capture/caller-session.d.ts +8 -2
- package/dist/capture/caller-session.js +16 -6
- package/dist/capture/capture-error.d.ts +3 -1
- package/dist/capture/capture-error.js +3 -1
- package/dist/capture/codex-patch.js +7 -2
- package/dist/capture/command.d.ts +4 -2
- package/dist/capture/command.js +34 -15
- package/dist/capture/compact-resume-caller.js +15 -8
- package/dist/capture/compact.d.ts +8 -5
- package/dist/capture/compact.js +34 -23
- package/dist/capture/compaction-items-caller.js +9 -3
- package/dist/capture/compaction-record.d.ts +4 -3
- package/dist/capture/compaction-record.js +20 -12
- package/dist/capture/compaction-spool.d.ts +18 -9
- package/dist/capture/compaction-spool.js +105 -63
- package/dist/capture/copilot-transcript.d.ts +11 -3
- package/dist/capture/copilot-transcript.js +16 -6
- package/dist/capture/extract.js +20 -8
- package/dist/capture/failure-caller.js +23 -12
- package/dist/capture/failure-reading.d.ts +10 -3
- package/dist/capture/failure-reading.js +24 -7
- package/dist/capture/pre-compact-caller.js +11 -4
- package/dist/capture/session-digest.d.ts +15 -4
- package/dist/capture/session-digest.js +39 -13
- package/dist/capture/session-end-caller.d.ts +4 -1
- package/dist/capture/session-end-caller.js +20 -8
- package/dist/capture/session-texts.d.ts +6 -2
- package/dist/capture/session-texts.js +22 -7
- package/dist/capture/session-worker.d.ts +4 -2
- package/dist/capture/session-worker.js +58 -17
- package/dist/capture/transcript.d.ts +13 -4
- package/dist/capture/transcript.js +32 -10
- package/dist/capture/working-state.d.ts +13 -4
- package/dist/capture/working-state.js +50 -56
- package/dist/cli/api-context.d.ts +14 -2
- package/dist/cli/api-context.js +45 -2
- package/dist/cli/audit.js +33 -33
- package/dist/cli/auth.js +23 -31
- package/dist/cli/briefs.d.ts +1 -1
- package/dist/cli/briefs.js +20 -15
- package/dist/cli/card.d.ts +1 -1
- package/dist/cli/card.js +56 -73
- package/dist/cli/client.d.ts +12 -5
- package/dist/cli/client.js +53 -23
- package/dist/cli/compact-resume-payload.d.ts +4 -1
- package/dist/cli/compact-resume-payload.js +12 -5
- package/dist/cli/context.js +43 -18
- package/dist/cli/continuity.d.ts +5 -5
- package/dist/cli/continuity.js +90 -107
- package/dist/cli/curate.d.ts +5 -4
- package/dist/cli/curate.js +55 -77
- package/dist/cli/dag.d.ts +1 -1
- package/dist/cli/dag.js +14 -17
- package/dist/cli/decisions.js +30 -30
- package/dist/cli/eval.js +16 -21
- package/dist/cli/exit.d.ts +4 -1
- package/dist/cli/exit.js +10 -2
- package/dist/cli/explain.js +12 -11
- package/dist/cli/flag-values.d.ts +1 -1
- package/dist/cli/flag-values.js +9 -18
- package/dist/cli/github.d.ts +6 -0
- package/dist/cli/github.js +25 -13
- package/dist/cli/goals.d.ts +1 -1
- package/dist/cli/goals.js +39 -56
- package/dist/cli/graph.d.ts +1 -1
- package/dist/cli/graph.js +15 -11
- package/dist/cli/hook-runtime.d.ts +34 -10
- package/dist/cli/hook-runtime.js +41 -16
- package/dist/cli/incidents.d.ts +1 -1
- package/dist/cli/incidents.js +25 -25
- package/dist/cli/init.d.ts +1 -1
- package/dist/cli/init.js +35 -20
- package/dist/cli/install-steps.d.ts +12 -3
- package/dist/cli/install-steps.js +42 -18
- package/dist/cli/last-sleep.d.ts +4 -1
- package/dist/cli/last-sleep.js +9 -4
- package/dist/cli/maintenance.d.ts +1 -1
- package/dist/cli/maintenance.js +11 -12
- package/dist/cli/notes.d.ts +1 -1
- package/dist/cli/notes.js +8 -5
- package/dist/cli/object-verbs.d.ts +5 -5
- package/dist/cli/object-verbs.js +13 -16
- package/dist/cli/open-browser.js +11 -2
- package/dist/cli/playbooks.d.ts +3 -3
- package/dist/cli/playbooks.js +40 -32
- package/dist/cli/predictions.js +17 -22
- package/dist/cli/print.js +4 -2
- package/dist/cli/projects.js +21 -11
- package/dist/cli/quality-repair-once.d.ts +1 -1
- package/dist/cli/quality-repair-once.js +7 -6
- package/dist/cli/recall.js +129 -93
- package/dist/cli/refine-llm.d.ts +15 -4
- package/dist/cli/refine-llm.js +17 -7
- package/dist/cli/remember.js +51 -55
- package/dist/cli/scheduler.d.ts +4 -1
- package/dist/cli/scheduler.js +9 -5
- package/dist/cli/serve.js +28 -18
- package/dist/cli/session-hooks.d.ts +2 -6
- package/dist/cli/session-hooks.js +140 -112
- package/dist/cli/setup.d.ts +1 -1
- package/dist/cli/setup.js +56 -34
- package/dist/cli/shared.d.ts +4 -2
- package/dist/cli/shared.js +26 -11
- package/dist/cli/slack.js +15 -24
- package/dist/cli/sleep-render.d.ts +3 -1
- package/dist/cli/sleep-render.js +8 -5
- package/dist/cli/sleep.js +16 -8
- package/dist/cli/status.d.ts +4 -4
- package/dist/cli/status.js +32 -27
- package/dist/cli/stdin.d.ts +10 -3
- package/dist/cli/stdin.js +10 -3
- package/dist/cli/transfer.d.ts +4 -4
- package/dist/cli/transfer.js +97 -82
- package/dist/cli/usage.d.ts +1 -1
- package/dist/cli/usage.js +1 -1
- package/dist/cli/verb-row.d.ts +2 -0
- package/dist/cli/verbs/health.js +2 -0
- package/dist/cli/verbs/memory.js +47 -53
- package/dist/cli/verbs/objects.js +16 -7
- package/dist/cli/verbs/sessions.js +4 -2
- package/dist/cli/versioned-verbs.d.ts +8 -7
- package/dist/cli/versioned-verbs.js +31 -21
- package/dist/cli.js +14 -18
- package/dist/connectors/dlq.d.ts +6 -6
- package/dist/connectors/dlq.js +12 -7
- package/dist/connectors/github/backfill.d.ts +4 -4
- package/dist/connectors/github/backfill.js +6 -4
- package/dist/connectors/github/deletion.d.ts +6 -4
- package/dist/connectors/github/deletion.js +5 -4
- package/dist/connectors/github/dlq.d.ts +8 -6
- package/dist/connectors/github/dlq.js +11 -5
- package/dist/connectors/github/ingest.d.ts +2 -2
- package/dist/connectors/github/ingest.js +9 -5
- package/dist/connectors/github/octokit-client.d.ts +3 -1
- package/dist/connectors/github/octokit-client.js +7 -2
- package/dist/connectors/github/ratelimit.d.ts +6 -2
- package/dist/connectors/github/ratelimit.js +6 -2
- package/dist/connectors/github/signature.d.ts +14 -3
- package/dist/connectors/github/signature.js +17 -3
- package/dist/connectors/github/tenant-routing.d.ts +6 -4
- package/dist/connectors/github/tenant-routing.js +6 -5
- package/dist/connectors/github/transform.js +50 -67
- package/dist/connectors/github/types.d.ts +10 -3
- package/dist/connectors/github/types.js +6 -2
- package/dist/connectors/github/webhook.d.ts +5 -5
- package/dist/connectors/github/webhook.js +36 -23
- package/dist/connectors/ingest.d.ts +5 -3
- package/dist/connectors/ingest.js +3 -3
- package/dist/connectors/slack/backfill.d.ts +5 -5
- package/dist/connectors/slack/backfill.js +3 -3
- package/dist/connectors/slack/deletion.d.ts +4 -4
- package/dist/connectors/slack/deletion.js +6 -5
- package/dist/connectors/slack/dlq.d.ts +4 -4
- package/dist/connectors/slack/dlq.js +6 -6
- package/dist/connectors/slack/ingest.d.ts +6 -4
- package/dist/connectors/slack/ingest.js +5 -4
- package/dist/connectors/slack/signature.d.ts +4 -1
- package/dist/connectors/slack/tenant-routing.d.ts +6 -4
- package/dist/connectors/slack/tenant-routing.js +6 -5
- package/dist/connectors/slack/transform.d.ts +6 -2
- package/dist/connectors/slack/transform.js +6 -2
- package/dist/connectors/slack/types.d.ts +3 -1
- package/dist/connectors/slack/web-client.js +8 -3
- package/dist/connectors/slack/webhook.d.ts +5 -5
- package/dist/connectors/slack/webhook.js +19 -11
- package/dist/connectors/slack/workspaces.d.ts +7 -3
- package/dist/connectors/slack/workspaces.js +7 -3
- package/dist/connectors/store.d.ts +8 -0
- package/dist/connectors/store.js +2 -0
- package/dist/consolidate/conflicts.js +24 -10
- package/dist/consolidate/dag-summary.js +2 -1
- package/dist/consolidate/dag.d.ts +10 -5
- package/dist/consolidate/dag.js +45 -39
- package/dist/consolidate/decay.js +19 -6
- package/dist/consolidate/dedupe.d.ts +14 -5
- package/dist/consolidate/dedupe.js +28 -17
- package/dist/consolidate/flush-units.d.ts +4 -1
- package/dist/consolidate/flush-units.js +4 -1
- package/dist/consolidate/half-life-migration.d.ts +18 -8
- package/dist/consolidate/half-life-migration.js +48 -18
- package/dist/consolidate/llm-passes.js +27 -11
- package/dist/consolidate/memory-value-weights.d.ts +6 -2
- package/dist/consolidate/memory-value-weights.js +6 -2
- package/dist/consolidate/memory-value.d.ts +30 -10
- package/dist/consolidate/memory-value.js +37 -14
- package/dist/consolidate/merge.d.ts +4 -1
- package/dist/consolidate/merge.js +47 -37
- package/dist/consolidate/overlap-index.d.ts +8 -2
- package/dist/consolidate/overlap-index.js +11 -4
- package/dist/consolidate/physics-pass.d.ts +3 -1
- package/dist/consolidate/physics-pass.js +10 -7
- package/dist/consolidate/replay.d.ts +11 -4
- package/dist/consolidate/replay.js +19 -7
- package/dist/consolidate/run.d.ts +13 -5
- package/dist/consolidate/run.js +4 -4
- package/dist/consolidate/sleep.d.ts +14 -6
- package/dist/consolidate/sleep.js +42 -39
- package/dist/consolidate/trace.d.ts +7 -2
- package/dist/consolidate/trace.js +7 -2
- package/dist/consolidate/traces.js +27 -30
- package/dist/core/ablation.d.ts +9 -3
- package/dist/core/ablation.js +14 -4
- package/dist/core/active-scope.d.ts +3 -1
- package/dist/core/active-scope.js +3 -1
- package/dist/core/agent-memory-tools.d.ts +2 -0
- package/dist/core/agent-memory-tools.js +2 -0
- package/dist/core/ambient.d.ts +4 -3
- package/dist/core/ambient.js +8 -6
- package/dist/core/api-errors.d.ts +9 -3
- package/dist/core/api-errors.js +9 -3
- package/dist/core/capture-contract.d.ts +4 -1
- package/dist/core/capture-contract.js +27 -8
- package/dist/core/compare.d.ts +24 -8
- package/dist/core/compare.js +24 -8
- package/dist/core/config.d.ts +18 -9
- package/dist/core/config.js +38 -29
- package/dist/core/cosine.d.ts +4 -1
- package/dist/core/cosine.js +4 -1
- package/dist/core/handoff.d.ts +7 -2
- package/dist/core/handoff.js +4 -1
- package/dist/core/markdown.js +22 -17
- package/dist/core/memory-audit.js +14 -3
- package/dist/core/memory-quality.d.ts +12 -3
- package/dist/core/memory-quality.js +57 -21
- package/dist/core/memory.d.ts +87 -30
- package/dist/core/memory.js +82 -33
- package/dist/core/merged-row.d.ts +8 -2
- package/dist/core/merged-row.js +10 -3
- package/dist/core/package-root.d.ts +3 -1
- package/dist/core/package-root.js +3 -1
- package/dist/core/particle-refresh.d.ts +8 -0
- package/dist/core/particle-refresh.js +22 -0
- package/dist/core/physics-config.d.ts +4 -1
- package/dist/core/physics-config.js +6 -2
- package/dist/core/physics.d.ts +39 -11
- package/dist/core/physics.js +71 -21
- package/dist/core/project-identity.d.ts +34 -17
- package/dist/core/project-identity.js +35 -18
- package/dist/core/project-remote.d.ts +8 -4
- package/dist/core/project-remote.js +31 -14
- package/dist/core/recall-scope.d.ts +33 -11
- package/dist/core/recall-scope.js +42 -15
- package/dist/core/rejection-digest.d.ts +7 -0
- package/dist/core/rejection-digest.js +13 -0
- package/dist/core/salience.d.ts +3 -1
- package/dist/core/salience.js +10 -4
- package/dist/core/search-types.d.ts +15 -2
- package/dist/core/search-types.js +11 -0
- package/dist/dashboard/dashboard-actions.d.ts +2 -2
- package/dist/dashboard/dashboard-actions.js +18 -7
- package/dist/dashboard/dashboard-queries.js +2 -7
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
- package/dist/dashboard/dashboard-snapshot.js +5 -7
- package/dist/dashboard/dashboard.js +22 -8
- package/dist/db/backup.js +2 -2
- package/dist/db/busy.d.ts +10 -3
- package/dist/db/busy.js +27 -5
- package/dist/db/connect.d.ts +10 -2
- package/dist/db/connect.js +8 -2
- package/dist/db/continuity.d.ts +1 -1
- package/dist/db/continuity.js +27 -11
- package/dist/db/meta.d.ts +4 -1
- package/dist/db/meta.js +4 -1
- package/dist/db/migrate.d.ts +10 -5
- package/dist/db/migrate.js +40 -20
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/types.d.ts +2 -1
- package/dist/db/migrations/v11.js +1 -0
- package/dist/db/migrations/v12.js +2 -1
- package/dist/db/migrations/v14.js +2 -0
- package/dist/db/migrations/v15.js +4 -2
- package/dist/db/migrations/v16.js +6 -3
- package/dist/db/migrations/v17.js +2 -1
- package/dist/db/migrations/v19.js +4 -2
- package/dist/db/migrations/v20.js +2 -1
- package/dist/db/migrations/v22.js +12 -6
- package/dist/db/migrations/v23.js +6 -3
- package/dist/db/migrations/v24.js +6 -3
- package/dist/db/migrations/v25.js +4 -2
- package/dist/db/migrations/v26.js +4 -2
- package/dist/db/migrations/v27.js +6 -3
- package/dist/db/migrations/v28.js +4 -2
- package/dist/db/migrations/v29.js +4 -2
- package/dist/db/migrations/v30.js +6 -3
- package/dist/db/migrations/v31.js +4 -2
- package/dist/db/migrations/v32.js +6 -3
- package/dist/db/migrations/v33.js +4 -2
- package/dist/db/migrations/v34.js +2 -1
- package/dist/db/migrations/v35.js +2 -1
- package/dist/db/migrations/v36.js +2 -1
- package/dist/db/migrations/v37.js +10 -5
- package/dist/db/migrations/v38.js +10 -5
- package/dist/db/migrations/v39.js +14 -6
- package/dist/db/migrations/v40.js +4 -2
- package/dist/db/migrations/v41.js +4 -2
- package/dist/db/migrations/v42.js +2 -1
- package/dist/db/migrations/v44.js +4 -2
- package/dist/db/migrations/v45.js +4 -2
- package/dist/db/migrations/v49.js +2 -1
- package/dist/db/migrations/v50.js +4 -2
- package/dist/db/migrations/v51.js +4 -2
- package/dist/db/migrations/v52.js +2 -1
- package/dist/db/migrations/v53.js +8 -4
- package/dist/db/migrations/v54.js +2 -1
- package/dist/db/migrations/v55.js +4 -2
- package/dist/db/migrations/v56.d.ts +3 -0
- package/dist/db/migrations/v56.js +28 -0
- package/dist/db/open.d.ts +24 -12
- package/dist/db/open.js +25 -13
- package/dist/db/physics-state.d.ts +8 -8
- package/dist/db/physics-state.js +17 -50
- package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
- package/dist/db/raw-archive-mirror-cleanup.js +6 -4
- package/dist/db/request-stores.d.ts +20 -5
- package/dist/db/request-stores.js +15 -5
- package/dist/db/tables.d.ts +2 -1
- package/dist/db/tables.js +12 -4
- package/dist/db/vector-store.d.ts +13 -4
- package/dist/db/vector-store.js +35 -14
- package/dist/db/wal-checkpointer.d.ts +2 -1
- package/dist/db/wal-checkpointer.js +19 -7
- package/dist/doctor.d.ts +7 -1
- package/dist/doctor.js +128 -46
- package/dist/embeddings/local.d.ts +8 -4
- package/dist/embeddings/local.js +11 -7
- package/dist/embeddings/provider.d.ts +19 -10
- package/dist/embeddings/provider.js +32 -27
- package/dist/embeddings/transformers.d.ts +16 -4
- package/dist/embeddings/transformers.js +32 -15
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.js +2 -1
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +1 -1
- package/dist/entry/sqlite-handles.d.ts +10 -0
- package/dist/entry/sqlite-handles.js +9 -0
- package/dist/entry/store-kit.d.ts +50 -0
- package/dist/entry/store-kit.js +27 -0
- package/dist/entry/testing.d.ts +6 -0
- package/dist/entry/testing.js +7 -0
- package/dist/eval/eval-stats.d.ts +27 -8
- package/dist/eval/eval-stats.js +17 -5
- package/dist/eval/eval-suite.d.ts +3 -1
- package/dist/eval/eval-suite.js +409 -187
- package/dist/eval/eval.d.ts +8 -2
- package/dist/eval/eval.js +8 -2
- package/dist/eval/judgment.js +17 -7
- package/dist/graph/delta.d.ts +9 -42
- package/dist/graph/delta.js +17 -11
- package/dist/graph/extract.d.ts +10 -7
- package/dist/graph/extract.js +57 -25
- package/dist/graph/recall.d.ts +12 -4
- package/dist/graph/recall.js +30 -13
- package/dist/graph/stream.d.ts +18 -6
- package/dist/graph/stream.js +32 -10
- package/dist/graph/view.d.ts +19 -6
- package/dist/graph/view.js +42 -17
- package/dist/hooks/codex-session.js +2 -2
- package/dist/hooks/codex-wrapper.d.ts +3 -1
- package/dist/hooks/codex-wrapper.js +9 -4
- package/dist/hooks/copilot.d.ts +19 -5
- package/dist/hooks/copilot.js +54 -15
- package/dist/hooks/hook-blocks.d.ts +4 -1
- package/dist/hooks/hook-blocks.js +8 -3
- package/dist/hooks/json-hooks.d.ts +9 -5
- package/dist/hooks/json-hooks.js +72 -33
- package/dist/hooks/opencode.js +15 -5
- package/dist/hooks/shared.d.ts +27 -8
- package/dist/hooks/shared.js +57 -16
- package/dist/importers/core.d.ts +12 -4
- package/dist/importers/core.js +11 -10
- package/dist/importers/markdown-parse.d.ts +15 -5
- package/dist/importers/markdown-parse.js +16 -7
- package/dist/importers/markdown.js +6 -9
- package/dist/importers/sources.js +10 -23
- package/dist/importers/vault.d.ts +3 -3
- package/dist/importers/vault.js +61 -45
- package/dist/index.d.ts +33 -7
- package/dist/index.js +26 -8
- package/dist/learn/autolearn.d.ts +21 -6
- package/dist/learn/autolearn.js +57 -26
- package/dist/learn/churn-git.d.ts +4 -1
- package/dist/learn/churn-git.js +29 -5
- package/dist/learn/extract.d.ts +4 -1
- package/dist/learn/extract.js +17 -10
- package/dist/learn/forward-claim-detector.d.ts +17 -5
- package/dist/learn/forward-claim-detector.js +34 -15
- package/dist/learn/invalidation.d.ts +12 -6
- package/dist/learn/invalidation.js +62 -28
- package/dist/learn/roots.d.ts +3 -0
- package/dist/learn/roots.js +5 -0
- package/dist/mcp/admin-tools.d.ts +5 -5
- package/dist/mcp/admin-tools.js +28 -23
- package/dist/mcp/format.d.ts +1 -1
- package/dist/mcp/format.js +4 -2
- package/dist/mcp/framing.d.ts +3 -1
- package/dist/mcp/framing.js +20 -8
- package/dist/mcp/memory-tools.d.ts +3 -3
- package/dist/mcp/memory-tools.js +21 -20
- package/dist/mcp/protocol.d.ts +32 -16
- package/dist/mcp/protocol.js +12 -9
- package/dist/mcp/recall-tools.d.ts +3 -3
- package/dist/mcp/recall-tools.js +62 -74
- package/dist/mcp/request.d.ts +7 -5
- package/dist/mcp/request.js +61 -77
- package/dist/mcp/server.d.ts +3 -1
- package/dist/mcp/server.js +8 -3
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +4 -3
- package/dist/mcp/shared-gate.d.ts +3 -2
- package/dist/mcp/shared-gate.js +3 -2
- package/dist/mcp/stdio.d.ts +6 -3
- package/dist/mcp/stdio.js +59 -23
- package/dist/mcp/tool-args.d.ts +4 -1
- package/dist/mcp/tool-args.js +8 -3
- package/dist/mcp/tools.js +76 -32
- package/dist/objects/customer-notes.d.ts +12 -10
- package/dist/objects/customer-notes.js +21 -15
- package/dist/objects/decisions.d.ts +18 -10
- package/dist/objects/decisions.js +23 -17
- package/dist/objects/descriptor.js +2 -1
- package/dist/objects/fields.d.ts +4 -1
- package/dist/objects/fields.js +6 -2
- package/dist/objects/incidents.d.ts +14 -16
- package/dist/objects/incidents.js +29 -30
- package/dist/objects/lifecycle.d.ts +0 -4
- package/dist/objects/lifecycle.js +21 -24
- package/dist/objects/policies.d.ts +12 -16
- package/dist/objects/policies.js +17 -21
- package/dist/objects/processes.d.ts +16 -10
- package/dist/objects/processes.js +20 -15
- package/dist/objects/project-briefs.d.ts +13 -14
- package/dist/objects/project-briefs.js +33 -39
- package/dist/objects/skills.d.ts +10 -12
- package/dist/objects/skills.js +17 -22
- package/dist/postinstall.js +15 -7
- package/dist/predictions/planning-fallacy.d.ts +19 -6
- package/dist/predictions/planning-fallacy.js +4 -2
- package/dist/rerankers/clef.d.ts +8 -2
- package/dist/rerankers/clef.js +14 -9
- package/dist/rerankers/cross-encoder.d.ts +2 -1
- package/dist/rerankers/cross-encoder.js +19 -9
- package/dist/rerankers/index.js +2 -1
- package/dist/rerankers/jev.js +2 -1
- package/dist/rerankers/llm.d.ts +6 -2
- package/dist/rerankers/llm.js +8 -3
- package/dist/rerankers/remote.d.ts +3 -1
- package/dist/rerankers/remote.js +5 -2
- package/dist/rerankers/types.d.ts +6 -2
- package/dist/search/bm25-search.d.ts +3 -1
- package/dist/search/bm25-search.js +15 -2
- package/dist/search/boosts.js +4 -3
- package/dist/search/embed-memories.d.ts +12 -4
- package/dist/search/embed-memories.js +96 -58
- package/dist/search/engine.d.ts +11 -0
- package/dist/search/engine.js +14 -0
- package/dist/search/goal-boost.d.ts +10 -3
- package/dist/search/goal-boost.js +13 -6
- package/dist/search/hybrid-score.d.ts +4 -1
- package/dist/search/hybrid-score.js +4 -1
- package/dist/search/hybrid.d.ts +23 -8
- package/dist/search/hybrid.js +12 -7
- package/dist/search/multihop.js +14 -13
- package/dist/search/path-context.d.ts +10 -3
- package/dist/search/path-context.js +10 -3
- package/dist/search/physics-search.d.ts +9 -4
- package/dist/search/physics-search.js +38 -14
- package/dist/search/rerank.d.ts +2 -1
- package/dist/search/rerank.js +2 -1
- package/dist/search/rrf.d.ts +14 -5
- package/dist/search/rrf.js +11 -4
- package/dist/search/vector.d.ts +8 -2
- package/dist/search/vector.js +14 -8
- package/dist/server/auth.d.ts +19 -15
- package/dist/server/auth.js +68 -38
- package/dist/server/boot.d.ts +4 -1
- package/dist/server/boot.js +115 -67
- package/dist/server/client-ip.d.ts +17 -5
- package/dist/server/client-ip.js +56 -21
- package/dist/server/cursor.d.ts +10 -3
- package/dist/server/cursor.js +10 -3
- package/dist/server/deadline.d.ts +5 -2
- package/dist/server/deadline.js +10 -3
- package/dist/server/key-check-bounds.js +12 -4
- package/dist/server/lifecycle.d.ts +4 -1
- package/dist/server/lifecycle.js +10 -4
- package/dist/server/mcp-http.d.ts +2 -1
- package/dist/server/mcp-http.js +37 -22
- package/dist/server/rate-limit.d.ts +17 -5
- package/dist/server/rate-limit.js +55 -26
- package/dist/server/ready.js +7 -4
- package/dist/server/request.d.ts +15 -4
- package/dist/server/request.js +42 -15
- package/dist/server/route-checks.d.ts +4 -1
- package/dist/server/route-checks.js +8 -3
- package/dist/server/route-table.d.ts +8 -6
- package/dist/server/route-table.js +550 -97
- package/dist/server/routes/admin.d.ts +7 -7
- package/dist/server/routes/admin.js +36 -15
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +5 -4
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +12 -6
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +10 -4
- package/dist/server/routes/memories.d.ts +8 -8
- package/dist/server/routes/memories.js +12 -17
- package/dist/server/routes/object-routes.d.ts +8 -5
- package/dist/server/routes/object-routes.js +4 -2
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +11 -4
- package/dist/server/routes/predictions.d.ts +5 -5
- package/dist/server/routes/predictions.js +9 -4
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +15 -6
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +3 -2
- package/dist/server/routes/recall.d.ts +3 -3
- package/dist/server/routes/recall.js +21 -10
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +12 -4
- package/dist/server/server-detect.d.ts +24 -8
- package/dist/server/server-detect.js +57 -22
- package/dist/server/sleep-child.js +16 -10
- package/dist/server/sleep-offload.d.ts +8 -5
- package/dist/server/sleep-offload.js +40 -18
- package/dist/server/tls.d.ts +10 -2
- package/dist/server/tls.js +25 -5
- package/dist/server/types.d.ts +41 -24
- package/dist/server/validation.d.ts +4 -1
- package/dist/server/validation.js +22 -9
- package/dist/server.d.ts +17 -49
- package/dist/server.js +33 -40
- package/dist/sharing/global-store.d.ts +6 -12
- package/dist/sharing/global-store.js +8 -48
- package/dist/sharing/global-sync.d.ts +3 -1
- package/dist/sharing/global-sync.js +17 -7
- package/dist/sharing/project-merge.d.ts +25 -7
- package/dist/sharing/project-merge.js +49 -17
- package/dist/sharing/search-both.d.ts +8 -4
- package/dist/sharing/search-both.js +28 -14
- package/dist/sharing/share.d.ts +8 -4
- package/dist/sharing/share.js +40 -18
- package/dist/store/ambient.js +10 -5
- package/dist/store/audit-event.d.ts +2 -2
- package/dist/store/audit-event.js +8 -3
- package/dist/store/audit.d.ts +6 -3
- package/dist/store/audit.js +16 -6
- package/dist/store/auth.d.ts +4 -2
- package/dist/store/auth.js +63 -20
- package/dist/store/busy.d.ts +9 -0
- package/dist/store/busy.js +16 -0
- package/dist/store/candidates.d.ts +12 -5
- package/dist/store/candidates.js +90 -41
- package/dist/store/capture-write.d.ts +2 -1
- package/dist/store/capture-write.js +2 -1
- package/dist/store/card-detail.d.ts +4 -4
- package/dist/store/card-detail.js +15 -8
- package/dist/store/cards.d.ts +24 -10
- package/dist/store/cards.js +97 -63
- package/dist/store/compaction-caller.d.ts +2 -1
- package/dist/store/compaction-caller.js +2 -1
- package/dist/store/compactions-record.d.ts +14 -8
- package/dist/store/compactions-record.js +101 -37
- package/dist/store/compactions.js +35 -15
- package/dist/store/conflicts.d.ts +16 -5
- package/dist/store/conflicts.js +104 -48
- package/dist/store/connectors/dlq.d.ts +17 -5
- package/dist/store/connectors/dlq.js +58 -6
- package/dist/store/connectors/event-log.d.ts +122 -0
- package/dist/store/connectors/event-log.js +25 -0
- package/dist/store/connectors/github.d.ts +6 -3
- package/dist/store/connectors/github.js +30 -48
- package/dist/store/connectors/slack.d.ts +2 -1
- package/dist/store/connectors/slack.js +31 -47
- package/dist/store/dashboard-reads.d.ts +7 -3
- package/dist/store/dashboard-reads.js +32 -10
- package/dist/store/delete-and-batch.d.ts +17 -11
- package/dist/store/delete-and-batch.js +70 -28
- package/dist/store/delivery-recorder.d.ts +10 -7
- package/dist/store/delivery-recorder.js +70 -37
- package/dist/store/descendant-page.d.ts +2 -1
- package/dist/store/descendant-page.js +26 -10
- package/dist/store/diagnostics.d.ts +2 -1
- package/dist/store/diagnostics.js +2 -1
- package/dist/store/doctor-reads.d.ts +2 -1
- package/dist/store/doctor-reads.js +13 -5
- package/dist/store/dormant.d.ts +19 -11
- package/dist/store/dormant.js +45 -19
- package/dist/store/embeddings/index.d.ts +13 -9
- package/dist/store/embeddings/index.js +19 -12
- package/dist/store/entry-reads.d.ts +72 -21
- package/dist/store/entry-reads.js +215 -69
- package/dist/store/entry-row.d.ts +10 -6
- package/dist/store/entry-row.js +26 -14
- package/dist/store/entry-writes.d.ts +28 -13
- package/dist/store/entry-writes.js +61 -22
- package/dist/store/failure-log-at.js +1 -1
- package/dist/store/failure-log.d.ts +4 -2
- package/dist/store/failure-log.js +13 -6
- package/dist/store/gated-write.d.ts +3 -3
- package/dist/store/gated-write.js +3 -3
- package/dist/store/goals.d.ts +5 -4
- package/dist/store/goals.js +11 -12
- package/dist/store/graph-apply.d.ts +21 -0
- package/dist/{graph/write.js → store/graph-apply.js} +31 -11
- package/dist/store/graph-queue.d.ts +9 -6
- package/dist/store/graph-queue.js +15 -10
- package/dist/store/graph-reads.d.ts +16 -11
- package/dist/store/graph-reads.js +29 -19
- package/dist/store/graph-rows.d.ts +41 -3
- package/dist/store/graph-rows.js +10 -7
- package/dist/store/graph-view-rows.js +15 -7
- package/dist/store/graph-writes.d.ts +16 -10
- package/dist/store/graph-writes.js +59 -36
- package/dist/store/half-life.js +2 -2
- package/dist/store/handoffs.d.ts +13 -7
- package/dist/store/handoffs.js +44 -22
- package/dist/store/index-and-stats.d.ts +2 -2
- package/dist/store/index-and-stats.js +6 -5
- package/dist/store/index.d.ts +4 -2
- package/dist/store/index.js +2 -1
- package/dist/store/key-audit.d.ts +2 -1
- package/dist/store/key-audit.js +2 -1
- package/dist/store/key-writes.d.ts +2 -1
- package/dist/store/key-writes.js +9 -2
- package/dist/store/ledger-turn.d.ts +4 -1
- package/dist/store/ledger-turn.js +7 -2
- package/dist/store/mirrors.d.ts +11 -4
- package/dist/store/mirrors.js +96 -19
- package/dist/store/narrow.d.ts +6 -0
- package/dist/store/narrow.js +11 -0
- package/dist/store/open.d.ts +6 -3
- package/dist/store/open.js +20 -10
- package/dist/store/pilot-arm.d.ts +2 -1
- package/dist/store/pilot-arm.js +18 -6
- package/dist/store/planning-fallacy-evidence.d.ts +2 -2
- package/dist/store/planning-fallacy-evidence.js +8 -5
- package/dist/store/port/agent-import.d.ts +62 -0
- package/dist/store/port/agent-import.js +2 -0
- package/dist/store/port/consolidation.d.ts +129 -0
- package/dist/store/port/consolidation.js +2 -0
- package/dist/store/port/learning.d.ts +19 -0
- package/dist/store/port/learning.js +2 -0
- package/dist/store/port/local-files.d.ts +18 -0
- package/dist/store/port/local-files.js +2 -0
- package/dist/store/port/promotion.d.ts +20 -0
- package/dist/store/port/promotion.js +3 -0
- package/dist/store/port-groups.d.ts +160 -0
- package/dist/store/port-groups.js +2 -0
- package/dist/store/port.d.ts +261 -219
- package/dist/store/port.js +3 -9
- package/dist/store/predictions.d.ts +14 -10
- package/dist/store/predictions.js +37 -17
- package/dist/store/project-tags.d.ts +4 -1
- package/dist/store/project-tags.js +16 -5
- package/dist/store/quality-repair.d.ts +8 -4
- package/dist/store/quality-repair.js +53 -20
- package/dist/store/quarantine.d.ts +1 -0
- package/dist/store/quarantine.js +23 -9
- package/dist/store/raw-archive.d.ts +5 -4
- package/dist/store/raw-archive.js +11 -10
- package/dist/store/recall-trace.d.ts +22 -17
- package/dist/store/recall-trace.js +128 -64
- package/dist/store/rejected-values.d.ts +15 -10
- package/dist/store/rejected-values.js +46 -20
- package/dist/store/rejection.d.ts +12 -11
- package/dist/store/rejection.js +18 -19
- package/dist/store/report-reads.d.ts +2 -1
- package/dist/store/report-reads.js +2 -1
- package/dist/store/rows.d.ts +7 -5
- package/dist/store/rows.js +20 -13
- package/dist/store/rule-sql.d.ts +7 -3
- package/dist/store/rule-sql.js +26 -13
- package/dist/store/search-rows.d.ts +16 -11
- package/dist/store/search-rows.js +54 -32
- package/dist/store/sessions.d.ts +12 -10
- package/dist/store/sessions.js +40 -21
- package/dist/store/set-aside.d.ts +2 -2
- package/dist/store/set-aside.js +18 -5
- package/dist/store/sqlite/agent-import.d.ts +3 -0
- package/dist/store/sqlite/agent-import.js +77 -0
- package/dist/store/sqlite/cards-group.d.ts +6 -0
- package/dist/store/sqlite/cards-group.js +37 -0
- package/dist/store/sqlite/conflicts-group.d.ts +6 -0
- package/dist/store/sqlite/conflicts-group.js +18 -0
- package/dist/store/sqlite/connector-events-group.d.ts +2 -1
- package/dist/store/sqlite/connector-events-group.js +17 -6
- package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
- package/dist/store/sqlite/connector-writes-group.js +12 -5
- package/dist/store/sqlite/consolidation-group.d.ts +4 -0
- package/dist/store/sqlite/consolidation-group.js +64 -0
- package/dist/store/sqlite/dag-reads-group.js +1 -1
- package/dist/store/sqlite/dormant-group.d.ts +6 -0
- package/dist/store/sqlite/dormant-group.js +29 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +9 -6
- package/dist/store/sqlite/entry-writes-group.js +37 -14
- package/dist/store/sqlite/error-codec.d.ts +4 -2
- package/dist/store/sqlite/error-codec.js +32 -10
- package/dist/store/sqlite/executor-counts.js +2 -1
- package/dist/store/sqlite/executor.d.ts +8 -3
- package/dist/store/sqlite/executor.js +56 -18
- package/dist/store/sqlite/global-promote.d.ts +5 -0
- package/dist/store/sqlite/global-promote.js +48 -0
- package/dist/store/sqlite/goals-group.d.ts +6 -0
- package/dist/store/sqlite/goals-group.js +23 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
- package/dist/store/sqlite/graph-reads-group.js +2 -1
- package/dist/store/sqlite/held-connection.d.ts +8 -0
- package/dist/store/sqlite/held-connection.js +34 -7
- package/dist/store/sqlite/last-recall-group.d.ts +15 -0
- package/dist/store/sqlite/last-recall-group.js +62 -0
- package/dist/store/sqlite/learning-group.d.ts +4 -0
- package/dist/store/sqlite/learning-group.js +17 -0
- package/dist/store/sqlite/maintenance-groups.d.ts +6 -0
- package/dist/store/sqlite/maintenance-groups.js +61 -0
- package/dist/store/sqlite/object-rows.d.ts +6 -3
- package/dist/store/sqlite/object-rows.js +34 -5
- package/dist/store/sqlite/objects-group.d.ts +5 -4
- package/dist/store/sqlite/objects-group.js +97 -38
- package/dist/store/sqlite/predictions-group.d.ts +2 -1
- package/dist/store/sqlite/predictions-group.js +4 -2
- package/dist/store/sqlite/promotion-group.d.ts +3 -0
- package/dist/store/sqlite/promotion-group.js +10 -0
- package/dist/store/sqlite/quarantine-group.d.ts +2 -1
- package/dist/store/sqlite/quarantine-group.js +4 -2
- package/dist/store/sqlite/reports-group.d.ts +6 -0
- package/dist/store/sqlite/reports-group.js +33 -0
- package/dist/store/sqlite/request-scope.d.ts +6 -0
- package/dist/store/sqlite/request-scope.js +18 -0
- package/dist/store/sqlite/sessions-group.d.ts +6 -0
- package/dist/store/sqlite/sessions-group.js +46 -0
- package/dist/store/sqlite/store.d.ts +22 -18
- package/dist/store/sqlite/store.js +95 -33
- package/dist/store/sqlite/vector-pack.js +2 -1
- package/dist/store/sqlite/vector-reads-group.js +2 -1
- package/dist/store/sqlite/worker-jobs.d.ts +2 -1
- package/dist/store/sqlite/worker-jobs.js +19 -7
- package/dist/store/sqlite/worker-ops.d.ts +10 -5
- package/dist/store/sqlite/worker-ops.js +6 -3
- package/dist/store/sqlite/worker-store.d.ts +4 -3
- package/dist/store/sqlite/worker-store.js +24 -14
- package/dist/store/summaries.d.ts +25 -11
- package/dist/store/summaries.js +84 -27
- package/dist/store/summary-dirty.d.ts +2 -1
- package/dist/store/summary-dirty.js +2 -1
- package/dist/store/tenant.d.ts +3 -2
- package/dist/store/tenant.js +5 -4
- package/dist/store/token-ledger-rows.js +8 -4
- package/dist/store/token-ledger.d.ts +19 -13
- package/dist/store/token-ledger.js +27 -14
- package/dist/store/tombstone-checks.d.ts +4 -1
- package/dist/store/tombstone-checks.js +10 -1
- package/dist/store/usage-reports.js +2 -1
- package/dist/store/vector-index.d.ts +8 -5
- package/dist/store/vector-index.js +28 -11
- package/dist/store/working-memory.d.ts +6 -4
- package/dist/store/working-memory.js +14 -9
- package/dist/support-bundle.js +10 -5
- package/dist/trust/quarantine.d.ts +1 -2
- package/dist/trust/quarantine.js +1 -5
- package/dist/trust/reject-flow.d.ts +12 -3
- package/dist/trust/reject-flow.js +12 -4
- package/dist/util/anthropic-messages.d.ts +7 -2
- package/dist/util/anthropic-messages.js +18 -7
- package/dist/util/atomic-write.d.ts +8 -3
- package/dist/util/atomic-write.js +36 -21
- package/dist/util/compaction-items.d.ts +4 -1
- package/dist/util/compaction-items.js +8 -2
- package/dist/util/crash-handlers.d.ts +7 -2
- package/dist/util/crash-handlers.js +13 -4
- package/dist/util/env.d.ts +26 -5
- package/dist/util/env.js +87 -25
- package/dist/util/format.d.ts +2 -0
- package/dist/util/format.js +4 -0
- package/dist/util/home-path.js +12 -6
- package/dist/util/hook-payload.d.ts +3 -1
- package/dist/util/hook-payload.js +3 -1
- package/dist/util/http-retry.d.ts +12 -6
- package/dist/util/http-retry.js +16 -6
- package/dist/util/http-util.d.ts +20 -5
- package/dist/util/http-util.js +28 -9
- package/dist/util/json.d.ts +4 -1
- package/dist/util/json.js +4 -1
- package/dist/util/keyset.js +2 -1
- package/dist/util/limits.js +4 -2
- package/dist/util/log.d.ts +13 -5
- package/dist/util/log.js +29 -6
- package/dist/util/net.d.ts +5 -0
- package/dist/util/net.js +19 -0
- package/dist/util/real-path.d.ts +2 -1
- package/dist/util/real-path.js +4 -3
- package/dist/util/request-scope.d.ts +16 -4
- package/dist/util/request-scope.js +19 -6
- package/dist/util/same-text.d.ts +10 -3
- package/dist/util/same-text.js +10 -3
- package/dist/util/secret-detect.d.ts +24 -7
- package/dist/util/secret-detect.js +49 -14
- package/dist/util/spawn-argv.d.ts +11 -0
- package/dist/util/spawn-argv.js +66 -0
- package/dist/util/sql.d.ts +3 -0
- package/dist/util/sql.js +6 -0
- package/dist/util/sqlite-blocked.d.ts +15 -4
- package/dist/util/sqlite-blocked.js +19 -6
- package/dist/util/stored-json.d.ts +4 -1
- package/dist/util/stored-json.js +6 -2
- package/dist/util/stream-tee.d.ts +2 -1
- package/dist/util/stream-tee.js +8 -5
- package/dist/util/transcript-tail.d.ts +4 -1
- package/dist/util/transcript-tail.js +4 -1
- package/dist/util/vector-codec.d.ts +4 -0
- package/dist/util/vector-codec.js +15 -0
- package/dist/util/version.d.ts +8 -3
- package/dist/util/version.js +8 -3
- package/dist/util/write-budget.d.ts +7 -2
- package/dist/util/write-budget.js +5 -2
- package/dist/util/yaml.d.ts +4 -1
- package/dist/util/yaml.js +4 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +4 -1
- package/scripts/postinstall.cjs +3 -1
- package/dist/api/audit.js +0 -56
- package/dist/api/cards.d.ts +0 -42
- package/dist/api/conflicts.d.ts +0 -28
- package/dist/api/conflicts.js +0 -61
- package/dist/api/dormant.d.ts +0 -14
- package/dist/api/dormant.js +0 -58
- package/dist/api/goals.d.ts +0 -18
- package/dist/api/graph.d.ts +0 -8
- package/dist/api/graph.js +0 -7
- package/dist/api/learn.js +0 -124
- package/dist/api/memories.d.ts +0 -23
- package/dist/api/memories.js +0 -46
- package/dist/api/objects.d.ts +0 -9
- package/dist/api/on-store.d.ts +0 -16
- package/dist/api/on-store.js +0 -38
- package/dist/api/outcome.d.ts +0 -19
- package/dist/api/outcome.js +0 -21
- package/dist/api/predictions.d.ts +0 -11
- package/dist/api/promote.d.ts +0 -36
- package/dist/api/promote.js +0 -65
- package/dist/api/recall-core.d.ts +0 -4
- package/dist/api/recall-core.js +0 -120
- package/dist/api/recall-finish.d.ts +0 -53
- package/dist/api/recall-finish.js +0 -30
- package/dist/api/recall-history.d.ts +0 -64
- package/dist/api/recall-history.js +0 -159
- package/dist/api/recall-record.d.ts +0 -43
- package/dist/api/recall-record.js +0 -78
- package/dist/api/recall-request.js +0 -121
- package/dist/api/recall.d.ts +0 -6
- package/dist/api/refine.d.ts +0 -7
- package/dist/api/refine.js +0 -10
- package/dist/api/session-owners.d.ts +0 -4
- package/dist/api/session-owners.js +0 -17
- package/dist/api/sleep-run.d.ts +0 -26
- package/dist/api/sleep.js +0 -10
- package/dist/cli/lenient-id.d.ts +0 -2
- package/dist/cli/lenient-id.js +0 -13
- package/dist/graph/write.d.ts +0 -14
- package/dist/store/sqlite/busy.d.ts +0 -3
- package/dist/store/sqlite/busy.js +0 -8
- package/dist/store/sqlite/local.d.ts +0 -21
- package/dist/store/sqlite/local.js +0 -39
package/dist/store/port.js
CHANGED
|
@@ -6,7 +6,8 @@ export function isObjectRefusal(written) {
|
|
|
6
6
|
export function hasGroup(store, group) {
|
|
7
7
|
return group === 'base' || store[group] !== undefined;
|
|
8
8
|
}
|
|
9
|
-
/** The group's methods; a store without them throws
|
|
9
|
+
/** The group's methods; a store without them throws
|
|
10
|
+
* StoreNotPortedError, which answers 501 as any unported path does. */
|
|
10
11
|
export function requireGroup(store, group) {
|
|
11
12
|
const groups = store;
|
|
12
13
|
const methods = groups[group];
|
|
@@ -14,12 +15,5 @@ export function requireGroup(store, group) {
|
|
|
14
15
|
throw new StoreNotPortedError(store.kind, group);
|
|
15
16
|
return methods;
|
|
16
17
|
}
|
|
17
|
-
export
|
|
18
|
-
/** A store behind the port throws this when its lock wait runs out, so the server answers 503 as it does for a busy hippo.db. */
|
|
19
|
-
export class StoreBusyError extends Error {
|
|
20
|
-
constructor(message = STORE_BUSY_MESSAGE, options) {
|
|
21
|
-
super(message, options);
|
|
22
|
-
this.name = 'StoreBusyError';
|
|
23
|
-
}
|
|
24
|
-
}
|
|
18
|
+
export { isStoreBusy, STORE_BUSY_MESSAGE, StoreBusyError } from './busy.js';
|
|
25
19
|
//# sourceMappingURL=port.js.map
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
/** First-class prediction: an ex-ante claim closed against an outcome. The `predictions` table is the source of truth;
|
|
2
|
-
* Every helper requires tenantId; `trg_predictions_tenant_match_*` triggers
|
|
3
|
-
*
|
|
1
|
+
/** First-class prediction: an ex-ante claim closed against an outcome. The `predictions` table is the source of truth;
|
|
2
|
+
* the memory row only mirrors the claim. Every helper requires tenantId; `trg_predictions_tenant_match_*` triggers
|
|
3
|
+
* enforce the prediction's tenant matches the referenced memory's. `savePrediction` writes memory and prediction inside
|
|
4
|
+
* `writeEntry`'s SAVEPOINT (via afterWrite), so a failure in either rolls back both. */
|
|
4
5
|
import { type MemoryEntry } from '../core/memory.js';
|
|
5
6
|
import { type KeysetPosition } from '../util/keyset.js';
|
|
6
7
|
import type { PredictionSave } from './port.js';
|
|
@@ -40,16 +41,17 @@ export interface ListPredictionsOpts {
|
|
|
40
41
|
/** Resume after this row: the position the previous page ended on. */
|
|
41
42
|
after?: KeysetPosition;
|
|
42
43
|
}
|
|
43
|
-
/** Create a prediction: memory mirror and predictions row land atomically inside `writeEntry`'s SAVEPOINT; any failure
|
|
44
|
-
* The memory (tags `['prediction', classTag]`, kind 'distilled') surfaces in `hippo recall`; the
|
|
44
|
+
/** Create a prediction: memory mirror and predictions row land atomically inside `writeEntry`'s SAVEPOINT; any failure
|
|
45
|
+
* rolls back both. The memory (tags `['prediction', classTag]`, kind 'distilled') surfaces in `hippo recall`; the
|
|
46
|
+
* predictions table feeds the planning-fallacy detector. */
|
|
45
47
|
export declare function savePrediction(hippoRoot: string, tenantId: string, opts: SavePredictionOpts, actor?: string): Prediction;
|
|
46
48
|
/** The memory row that mirrors a claim into recall, built here alone so every store keeps the same row for it. */
|
|
47
49
|
export declare function predictionMirror(tenantId: string, claim: SavePredictionOpts, baseHalfLifeDays: number): MemoryEntry;
|
|
48
50
|
/** The store port's save on hippo.db: the mirror goes in as the port's writeEntry has it, tenant
|
|
49
51
|
* check included, and its predictions row shares that write scope, so neither lands alone. */
|
|
50
52
|
export declare function writePrediction(hippoRoot: string, tenantId: string, save: PredictionSave, actor: string): Prediction;
|
|
51
|
-
/** Close an open prediction. Updates the predictions row only; the memory mirror is not mutated (the predictions table
|
|
52
|
-
* Accuracy is computed from (estimateValue, actualValue) at query time. */
|
|
53
|
+
/** Close an open prediction. Updates the predictions row only; the memory mirror is not mutated (the predictions table
|
|
54
|
+
* is the source of truth). Accuracy is computed from (estimateValue, actualValue) at query time. */
|
|
53
55
|
export declare function closePrediction(hippoRoot: string, tenantId: string, id: number, opts: ClosePredictionOpts, actor?: string): Prediction;
|
|
54
56
|
export declare function loadPredictionById(hippoRoot: string, tenantId: string, id: number): Prediction | null;
|
|
55
57
|
export declare function loadPredictionsByClass(hippoRoot: string, tenantId: string, classTag: string, opts?: ListPredictionsOpts): Prediction[];
|
|
@@ -84,13 +86,15 @@ export interface BaserateRow {
|
|
|
84
86
|
estimate_value: number;
|
|
85
87
|
actual_value: number;
|
|
86
88
|
}
|
|
87
|
-
/** Base-rate stats for closed predictions in a class (Lovallo-Kahneman inside-vs-outside view): closure_state='closed'
|
|
88
|
-
* closed-unknown and open are excluded. Audit-emit is built in here, not at the 3
|
|
89
|
+
/** Base-rate stats for closed predictions in a class (Lovallo-Kahneman inside-vs-outside view): closure_state='closed'
|
|
90
|
+
* with estimate and actual non-null; closed-unknown and open are excluded. Audit-emit is built in here, not at the 3
|
|
91
|
+
* call sites, so callers cannot drift. */
|
|
89
92
|
export declare function computePredictionBaserate(hippoRoot: string, tenantId: string, classTag: string, actor?: string,
|
|
90
93
|
/** False skips the predict_baserate audit so that channel only records deliberate
|
|
91
94
|
* baserate calls, not every recall the planning-fallacy orchestrator inspects. */
|
|
92
95
|
emitAudit?: boolean): PredictionBaserate;
|
|
93
|
-
/** A class's stats over its closed rows, summed in the order given. Every store computes them here, so no two can
|
|
96
|
+
/** A class's stats over its closed rows, summed in the order given. Every store computes them here, so no two can
|
|
97
|
+
* disagree on the arithmetic. */
|
|
94
98
|
export declare function predictionBaserateOf(classTag: string, rows: readonly BaserateRow[]): PredictionBaserate;
|
|
95
99
|
export declare function loadOpenPredictions(hippoRoot: string, tenantId: string, opts?: {
|
|
96
100
|
classTag?: string;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
/** First-class prediction: an ex-ante claim closed against an outcome. The `predictions` table is the source of truth;
|
|
2
|
-
* Every helper requires tenantId; `trg_predictions_tenant_match_*` triggers
|
|
3
|
-
*
|
|
1
|
+
/** First-class prediction: an ex-ante claim closed against an outcome. The `predictions` table is the source of truth;
|
|
2
|
+
* the memory row only mirrors the claim. Every helper requires tenantId; `trg_predictions_tenant_match_*` triggers
|
|
3
|
+
* enforce the prediction's tenant matches the referenced memory's. `savePrediction` writes memory and prediction inside
|
|
4
|
+
* `writeEntry`'s SAVEPOINT (via afterWrite), so a failure in either rolls back both. */
|
|
4
5
|
import { DEFAULT_LIST_LIMIT } from '../util/limits.js';
|
|
5
6
|
import { BadRequestError, NotFoundError } from '../core/api-errors.js';
|
|
6
7
|
import { withWriteScope } from '../db/index.js';
|
|
@@ -35,8 +36,9 @@ function rowToPrediction(row) {
|
|
|
35
36
|
createdAt: row.created_at,
|
|
36
37
|
};
|
|
37
38
|
}
|
|
38
|
-
/** Create a prediction: memory mirror and predictions row land atomically inside `writeEntry`'s SAVEPOINT; any failure
|
|
39
|
-
* The memory (tags `['prediction', classTag]`, kind 'distilled') surfaces in `hippo recall`; the
|
|
39
|
+
/** Create a prediction: memory mirror and predictions row land atomically inside `writeEntry`'s SAVEPOINT; any failure
|
|
40
|
+
* rolls back both. The memory (tags `['prediction', classTag]`, kind 'distilled') surfaces in `hippo recall`; the
|
|
41
|
+
* predictions table feeds the planning-fallacy detector. */
|
|
40
42
|
export function savePrediction(hippoRoot, tenantId, opts, actor = 'cli') {
|
|
41
43
|
assertTenantId('savePrediction', tenantId);
|
|
42
44
|
if (!opts.classTag)
|
|
@@ -114,12 +116,13 @@ function auditPredictionCreate(db, who, opts) {
|
|
|
114
116
|
},
|
|
115
117
|
});
|
|
116
118
|
}
|
|
117
|
-
/** Close an open prediction. Updates the predictions row only; the memory mirror is not mutated (the predictions table
|
|
118
|
-
* Accuracy is computed from (estimateValue, actualValue) at query time. */
|
|
119
|
+
/** Close an open prediction. Updates the predictions row only; the memory mirror is not mutated (the predictions table
|
|
120
|
+
* is the source of truth). Accuracy is computed from (estimateValue, actualValue) at query time. */
|
|
119
121
|
export function closePrediction(hippoRoot, tenantId, id, opts, actor = 'cli') {
|
|
120
122
|
assertTenantId('closePrediction', tenantId);
|
|
121
123
|
if (!VALID_CLOSURE_STATES.has(opts.closureState)) {
|
|
122
|
-
throw new BadRequestError(`closePrediction: closureState must be one of ${Array.from(VALID_CLOSURE_STATES).join('|')}; got
|
|
124
|
+
throw new BadRequestError(`closePrediction: closureState must be one of ${Array.from(VALID_CLOSURE_STATES).join('|')}; got ` +
|
|
125
|
+
`${opts.closureState}`);
|
|
123
126
|
}
|
|
124
127
|
const now = new Date().toISOString();
|
|
125
128
|
return onHandle(hippoRoot, (db) => {
|
|
@@ -191,7 +194,8 @@ export function loadPredictionsByClass(hippoRoot, tenantId, classTag, opts = {})
|
|
|
191
194
|
let rows;
|
|
192
195
|
if (opts.closureState) {
|
|
193
196
|
if (!VALID_CLOSURE_STATES.has(opts.closureState)) {
|
|
194
|
-
throw new BadRequestError(`loadPredictionsByClass: closureState must be one of ${Array.from(VALID_CLOSURE_STATES).join('|')}; got
|
|
197
|
+
throw new BadRequestError(`loadPredictionsByClass: closureState must be one of ${Array.from(VALID_CLOSURE_STATES).join('|')}; got ` +
|
|
198
|
+
`${opts.closureState}`);
|
|
195
199
|
}
|
|
196
200
|
// SAFETY: rows' shape matches the columns named in the SELECT above.
|
|
197
201
|
rows = db.prepare(`
|
|
@@ -231,8 +235,9 @@ export function loadAllPredictions(hippoRoot, tenantId, opts = {}) {
|
|
|
231
235
|
return rows.map(rowToPrediction);
|
|
232
236
|
});
|
|
233
237
|
}
|
|
234
|
-
/** Base-rate stats for closed predictions in a class (Lovallo-Kahneman inside-vs-outside view): closure_state='closed'
|
|
235
|
-
* closed-unknown and open are excluded. Audit-emit is built in here, not at the 3
|
|
238
|
+
/** Base-rate stats for closed predictions in a class (Lovallo-Kahneman inside-vs-outside view): closure_state='closed'
|
|
239
|
+
* with estimate and actual non-null; closed-unknown and open are excluded. Audit-emit is built in here, not at the 3
|
|
240
|
+
* call sites, so callers cannot drift. */
|
|
236
241
|
export function computePredictionBaserate(hippoRoot, tenantId, classTag, actor = 'cli',
|
|
237
242
|
/** False skips the predict_baserate audit so that channel only records deliberate
|
|
238
243
|
* baserate calls, not every recall the planning-fallacy orchestrator inspects. */
|
|
@@ -254,7 +259,8 @@ emitAudit = true) {
|
|
|
254
259
|
ORDER BY id
|
|
255
260
|
`).all(tenantId, classTag);
|
|
256
261
|
const baserate = predictionBaserateOf(classTag, rows);
|
|
257
|
-
// An empty class is audited too, since an agent probing one is a signal; the recall path passes false and audits
|
|
262
|
+
// An empty class is audited too, since an agent probing one is a signal; the recall path passes false and audits
|
|
263
|
+
// its own hint.
|
|
258
264
|
if (emitAudit)
|
|
259
265
|
auditBaserateRead(db, tenantId, actor, classTag, baserate.nClosed);
|
|
260
266
|
return baserate;
|
|
@@ -269,12 +275,25 @@ function auditBaserateRead(db, tenantId, actor, classTag, nClosed) {
|
|
|
269
275
|
metadata: { class_tag: classTag, n_closed: nClosed },
|
|
270
276
|
});
|
|
271
277
|
}
|
|
272
|
-
|
|
278
|
+
function emptyBaserate(classTag) {
|
|
279
|
+
return {
|
|
280
|
+
classTag,
|
|
281
|
+
nClosed: 0,
|
|
282
|
+
nRatioEligible: 0,
|
|
283
|
+
meanEstimate: null,
|
|
284
|
+
meanActual: null,
|
|
285
|
+
meanRatio: null,
|
|
286
|
+
p50Ratio: null,
|
|
287
|
+
mae: null,
|
|
288
|
+
summary: '',
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
/** A class's stats over its closed rows, summed in the order given. Every store computes them here, so no two can
|
|
292
|
+
* disagree on the arithmetic. */
|
|
273
293
|
export function predictionBaserateOf(classTag, rows) {
|
|
274
294
|
const nClosed = rows.length;
|
|
275
|
-
if (nClosed === 0)
|
|
276
|
-
return
|
|
277
|
-
}
|
|
295
|
+
if (nClosed === 0)
|
|
296
|
+
return emptyBaserate(classTag);
|
|
278
297
|
const ratioEligible = rows.filter((r) => r.estimate_value > 0);
|
|
279
298
|
const nRatioEligible = ratioEligible.length;
|
|
280
299
|
const meanEstimate = rows.reduce((s, r) => s + r.estimate_value, 0) / nClosed;
|
|
@@ -293,7 +312,8 @@ export function predictionBaserateOf(classTag, rows) {
|
|
|
293
312
|
const ratioPart = meanRatio !== null
|
|
294
313
|
? `averaged ${meanRatio.toFixed(2)}x actual`
|
|
295
314
|
: 'no ratio-eligible rows (all estimates were 0)';
|
|
296
|
-
const summary = `Last ${nClosed} estimate${nClosed === 1 ? '' : 's'} in class ${classTag} ${ratioPart} (MAE
|
|
315
|
+
const summary = `Last ${nClosed} estimate${nClosed === 1 ? '' : 's'} in class ${classTag} ${ratioPart} (MAE ` +
|
|
316
|
+
`${mae.toFixed(2)}).`;
|
|
297
317
|
return {
|
|
298
318
|
classTag,
|
|
299
319
|
nClosed,
|
|
@@ -41,7 +41,8 @@ export interface TagRewrite<T> {
|
|
|
41
41
|
}
|
|
42
42
|
export interface ProjectTagStore extends ProjectTagReads {
|
|
43
43
|
readonly hippoRoot: string;
|
|
44
|
-
/** One transaction; a dry run rolls back with no backup, else the store is backed up first and mirrors follow the
|
|
44
|
+
/** One transaction; a dry run rolls back with no backup, else the store is backed up first and mirrors follow the
|
|
45
|
+
* commit. */
|
|
45
46
|
rewrite<T>(opts: {
|
|
46
47
|
readonly dryRun: boolean;
|
|
47
48
|
readonly backupLabel: string;
|
|
@@ -57,6 +58,8 @@ export interface ProjectTagScope {
|
|
|
57
58
|
}
|
|
58
59
|
/** Reads on a handle the caller opened and closes, for doctor's read-only check and the note sync. */
|
|
59
60
|
export declare function projectTagReads(db: DatabaseSyncLike, tenantId: string): ProjectTagReads;
|
|
61
|
+
/** `projectTagReads` on a read-only handle this call opens and closes, for doctor; `fn` must finish with the reads. */
|
|
62
|
+
export declare function readProjectTags<T>(hippoRoot: string, tenantId: string, fn: (reads: ProjectTagReads) => T): T;
|
|
60
63
|
/** Runs `fn` on hippo.db under `scope.hippoRoot`, opened for this call and closed after. */
|
|
61
64
|
export declare function onProjectTags<T>(scope: ProjectTagScope, fn: (store: ProjectTagStore) => T): T;
|
|
62
65
|
//# sourceMappingURL=project-tags.d.ts.map
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
// The rows `hippo projects` and sleep's tag repair read and write, bound to one hippo.db handle and tenant,
|
|
2
2
|
// so the merge and repair rules in src/sharing/project-merge.ts decide without holding the handle.
|
|
3
|
-
import { getMeta, setMeta, withTrialScope, withWriteScope } from '../db/index.js';
|
|
3
|
+
import { closeHippoDb, getMeta, openHippoDbReadOnly, setMeta, withTrialScope, withWriteScope, } from '../db/index.js';
|
|
4
4
|
import { withBackup } from '../db/backup.js';
|
|
5
5
|
import { calculateStrength } from '../core/memory.js';
|
|
6
6
|
import { appendAuditEvent, queryAuditEvents } from './audit.js';
|
|
7
|
-
import { compactionOriginsWithCwd, compactionTranscripts, holdsOrigin, restampCompactionOrigin } from './compactions.js';
|
|
8
|
-
import { insertDormantRow, listDormantSnapshots, replaceDormantEntry } from './dormant.js';
|
|
7
|
+
import { compactionOriginsWithCwd, compactionTranscripts, holdsOrigin, restampCompactionOrigin, } from './compactions.js';
|
|
8
|
+
import { insertDormantRow, listDormantSnapshots, replaceDormantEntry, } from './dormant.js';
|
|
9
9
|
import { selectAllEntries, selectEntriesByIds, selectLiveEntriesBySourcePrefix } from './entry-reads.js';
|
|
10
|
-
import { deleteEntryRowInTx, restampOriginProjectAt, stampOriginProjectsAt, writeEntryMirrors } from './entry-writes.js';
|
|
10
|
+
import { deleteEntryRowInTx, restampOriginProjectAt, stampOriginProjectsAt, writeEntryMirrors, } from './entry-writes.js';
|
|
11
11
|
import { removeEntryMirrors } from './mirrors.js';
|
|
12
12
|
import { onHandle } from './open.js';
|
|
13
13
|
import { setAsideRow } from './set-aside.js';
|
|
@@ -27,6 +27,16 @@ export function projectTagReads(db, tenantId) {
|
|
|
27
27
|
holdsOrigin: (table, name) => holdsOrigin(db, table, tenantId, name),
|
|
28
28
|
};
|
|
29
29
|
}
|
|
30
|
+
/** `projectTagReads` on a read-only handle this call opens and closes, for doctor; `fn` must finish with the reads. */
|
|
31
|
+
export function readProjectTags(hippoRoot, tenantId, fn) {
|
|
32
|
+
const db = openHippoDbReadOnly(hippoRoot);
|
|
33
|
+
try {
|
|
34
|
+
return fn(projectTagReads(db, tenantId));
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
closeHippoDb(db);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
30
40
|
function projectTagWrites(db, { tenantId, actor }) {
|
|
31
41
|
return {
|
|
32
42
|
...projectTagReads(db, tenantId),
|
|
@@ -48,8 +58,9 @@ function rewriteOn(db, scope, opts, body) {
|
|
|
48
58
|
return withTrialScope(db, TX_LABEL, () => body(tx, null)).result;
|
|
49
59
|
const done = withBackup(db, scope.hippoRoot, opts.backupLabel, (backup) => withWriteScope(db, TX_LABEL, () => body(tx, backup)));
|
|
50
60
|
// After commit, as the agent memory sync does: a stale mirror would bring the old tag back on the next rebuild.
|
|
51
|
-
for (const entry of selectEntriesByIds(db, done.rewrite, scope.tenantId).values())
|
|
61
|
+
for (const entry of selectEntriesByIds(db, done.rewrite, scope.tenantId).values()) {
|
|
52
62
|
writeEntryMirrors(scope.hippoRoot, entry);
|
|
63
|
+
}
|
|
53
64
|
for (const id of done.purge)
|
|
54
65
|
removeEntryMirrors(scope.hippoRoot, id);
|
|
55
66
|
return done.result;
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
/** One automatic row with a defect. `set-aside` moves to dormant storage on apply, `review` is listed only, `protected`
|
|
1
|
+
/** One automatic row with a defect. `set-aside` moves to dormant storage on apply, `review` is listed only, `protected`
|
|
2
|
+
* is kept. */
|
|
2
3
|
export interface QualityRepairIssue {
|
|
3
4
|
readonly id: string;
|
|
4
5
|
readonly reason: string;
|
|
5
6
|
readonly disposition: 'set-aside' | 'review' | 'protected';
|
|
6
7
|
readonly protection?: string;
|
|
7
8
|
}
|
|
8
|
-
/** One tenant's plan; `supported` is false, with `blockers` naming each gap, when the schema cannot be changed
|
|
9
|
+
/** One tenant's plan; `supported` is false, with `blockers` naming each gap, when the schema cannot be changed
|
|
10
|
+
* safely. */
|
|
9
11
|
export interface QualityRepairResult {
|
|
10
12
|
readonly root: string;
|
|
11
13
|
readonly schema: number;
|
|
@@ -17,11 +19,13 @@ export interface QualityRepairResult {
|
|
|
17
19
|
readonly backup: string | null;
|
|
18
20
|
readonly warnings: readonly string[];
|
|
19
21
|
}
|
|
20
|
-
/** Preview by default; apply backs the database up, then moves certain defects to dormant storage, without running
|
|
22
|
+
/** Preview by default; apply backs the database up, then moves certain defects to dormant storage, without running
|
|
23
|
+
* migrations. */
|
|
21
24
|
export declare function repairAutomaticMemories(root: string, opts: {
|
|
22
25
|
tenantId: string;
|
|
23
26
|
apply?: boolean;
|
|
24
27
|
}): QualityRepairResult;
|
|
25
|
-
/** Applies the repair once per store, so stores that predate the quality gate are cleaned on upgrade with no command;
|
|
28
|
+
/** Applies the repair once per store, so stores that predate the quality gate are cleaned on upgrade with no command;
|
|
29
|
+
* null once done. */
|
|
26
30
|
export declare function repairQualityOnce(root: string, tenantId: string): QualityRepairResult | null;
|
|
27
31
|
//# sourceMappingURL=quality-repair.d.ts.map
|
|
@@ -7,7 +7,7 @@ import { tableColumns } from '../db/tables.js';
|
|
|
7
7
|
import { assertBinaryCompatible } from '../db/migrate.js';
|
|
8
8
|
import { insertDormantRow, listDormantSnapshots } from './dormant.js';
|
|
9
9
|
import { calculateStrength, canAutoDelete } from '../core/memory.js';
|
|
10
|
-
import { assessAutomaticMemory, BUNDLE_HEADER, isAutomaticEntry, isCertainReason } from '../core/memory-quality.js';
|
|
10
|
+
import { assessAutomaticMemory, BUNDLE_HEADER, isAutomaticEntry, isCertainReason, } from '../core/memory-quality.js';
|
|
11
11
|
import { heldTexts } from '../util/same-text.js';
|
|
12
12
|
import { deleteEntryCore, MEMORY_BACKED_TABLES, memoriesBackingObjectsOn } from './delete-and-batch.js';
|
|
13
13
|
import { selectAllEntries, selectPreviewRows } from './entry-reads.js';
|
|
@@ -32,8 +32,9 @@ function capabilityBlockers(db) {
|
|
|
32
32
|
if (!columns.has(column))
|
|
33
33
|
blockers.push(`missing column: ${table}.${column}`);
|
|
34
34
|
}
|
|
35
|
-
if (blockers.some((blocker) => blocker === 'missing table: meta' || blocker.startsWith('missing column: meta.')))
|
|
35
|
+
if (blockers.some((blocker) => blocker === 'missing table: meta' || blocker.startsWith('missing column: meta.'))) {
|
|
36
36
|
return blockers;
|
|
37
|
+
}
|
|
37
38
|
assertBinaryCompatible(db);
|
|
38
39
|
if (getMeta(db, 'fts5_available', '0') === '1') {
|
|
39
40
|
const columns = tableColumns(db, 'memories_fts');
|
|
@@ -76,11 +77,16 @@ function contentIssue(entry, rows) {
|
|
|
76
77
|
const texts = heldTexts({ ...entry, source: 'consolidation' });
|
|
77
78
|
if (texts.length === 0)
|
|
78
79
|
return { reason: 'derived bundle has no safely parsed constituents', disposition: 'review' };
|
|
79
|
-
const reasons = texts
|
|
80
|
+
const reasons = texts
|
|
81
|
+
.map((text) => assessAutomaticMemory(text).reason)
|
|
82
|
+
.filter((reason) => reason !== null);
|
|
80
83
|
if (reasons.length === 0)
|
|
81
84
|
return null;
|
|
82
85
|
const certain = reasons.length === texts.length && reasons.every(isCertainReason) && fromAutomaticParents(entry, rows);
|
|
83
|
-
return {
|
|
86
|
+
return {
|
|
87
|
+
reason: `derived constituents: ${[...new Set(reasons)].join('; ')}`,
|
|
88
|
+
disposition: certain ? 'set-aside' : 'review',
|
|
89
|
+
};
|
|
84
90
|
}
|
|
85
91
|
function planRows(db, tenantId) {
|
|
86
92
|
const all = selectAllEntries(db, tenantId);
|
|
@@ -95,9 +101,11 @@ function planRows(db, tenantId) {
|
|
|
95
101
|
if (issue === null)
|
|
96
102
|
continue;
|
|
97
103
|
const kept = protection(entry, backing);
|
|
98
|
-
issues.push(kept === undefined
|
|
104
|
+
issues.push(kept === undefined
|
|
105
|
+
? { id: entry.id, ...issue }
|
|
106
|
+
: { id: entry.id, ...issue, disposition: 'protected', protection: kept });
|
|
99
107
|
}
|
|
100
|
-
return { total: entries.length, issues };
|
|
108
|
+
return { total: entries.length, issues, all };
|
|
101
109
|
}
|
|
102
110
|
function unsupportedPreview(db, tenantId) {
|
|
103
111
|
const columns = tableColumns(db, 'memories');
|
|
@@ -106,42 +114,64 @@ function unsupportedPreview(db, tenantId) {
|
|
|
106
114
|
const rows = selectPreviewRows(db, columns, tenantId);
|
|
107
115
|
const issues = rows.flatMap((row) => {
|
|
108
116
|
const tags = parseJsonArray(row.tags_json, { table: 'memories', id: row.id, column: 'tags_json' });
|
|
109
|
-
const provenance = {
|
|
117
|
+
const provenance = {
|
|
118
|
+
...row,
|
|
119
|
+
source: row.source ?? '',
|
|
120
|
+
confidence: row.confidence ?? 'observed',
|
|
121
|
+
dag_level: row.dag_level ?? 0,
|
|
122
|
+
tags,
|
|
123
|
+
};
|
|
110
124
|
if (!isAutomaticEntry(provenance))
|
|
111
125
|
return [];
|
|
112
126
|
const { reason } = assessAutomaticMemory(row.content);
|
|
113
|
-
return reason === null
|
|
127
|
+
return reason === null
|
|
128
|
+
? []
|
|
129
|
+
: [{ id: row.id, reason, disposition: 'review', protection: 'unsupported schema; no changes permitted' }];
|
|
114
130
|
});
|
|
115
131
|
return { total: rows.length, issues };
|
|
116
132
|
}
|
|
117
|
-
|
|
133
|
+
/** The plan plus the tenant rows it was read from, so the apply step does not read them again. */
|
|
134
|
+
function plannedResult(db, root, tenantId) {
|
|
118
135
|
const blockers = capabilityBlockers(db);
|
|
119
136
|
const schema = pragmaUserVersion(db);
|
|
120
|
-
const plan = blockers.length > 0 ? unsupportedPreview(db, tenantId) : planRows(db, tenantId);
|
|
121
|
-
|
|
137
|
+
const plan = blockers.length > 0 ? { ...unsupportedPreview(db, tenantId), all: [] } : planRows(db, tenantId);
|
|
138
|
+
const result = {
|
|
122
139
|
root, schema, supported: blockers.length === 0, blockers,
|
|
123
140
|
total: plan.total,
|
|
124
141
|
issues: plan.issues, appliedIds: [], backup: null, warnings: [],
|
|
125
142
|
};
|
|
143
|
+
return { result, all: plan.all };
|
|
126
144
|
}
|
|
127
|
-
// No rejection record, as in project repair: the writers refuse these defects themselves, and a record would also
|
|
145
|
+
// No rejection record, as in project repair: the writers refuse these defects themselves, and a record would also
|
|
146
|
+
// refuse a person's copy.
|
|
128
147
|
function setAsideIssue(db, entry, reason, now, backup) {
|
|
129
148
|
const actor = 'quality-repair';
|
|
130
149
|
if (deleteEntryCore(db, entry.id, { actor, automatic: true, suppressForgetAudit: true }) === null)
|
|
131
150
|
return false;
|
|
132
|
-
insertDormantRow(db, {
|
|
151
|
+
insertDormantRow(db, {
|
|
152
|
+
entry,
|
|
153
|
+
strength: calculateStrength(entry, now),
|
|
154
|
+
reason: 'quality-repair',
|
|
155
|
+
dormantAt: now.toISOString(),
|
|
156
|
+
});
|
|
133
157
|
if (getMeta(db, 'fts5_available', '0') === '1' && ftsRowExists(db, entry.id)) {
|
|
134
158
|
throw new Error(`Quality repair could not remove the full-text row for ${entry.id}`);
|
|
135
159
|
}
|
|
136
|
-
appendAuditEvent(db, {
|
|
160
|
+
appendAuditEvent(db, {
|
|
161
|
+
tenantId: entry.tenant_id,
|
|
162
|
+
actor,
|
|
163
|
+
op: 'quality_repair',
|
|
164
|
+
targetId: entry.id,
|
|
165
|
+
metadata: { reason, backup },
|
|
166
|
+
});
|
|
137
167
|
return true;
|
|
138
168
|
}
|
|
139
169
|
function applyPlan(db, root, tenantId, backup, doneKey) {
|
|
140
170
|
return withWriteScope(db, 'quality_repair_apply', () => {
|
|
141
|
-
const result =
|
|
171
|
+
const { result, all } = plannedResult(db, root, tenantId);
|
|
142
172
|
if (!result.supported)
|
|
143
173
|
throw new Error(`Quality repair capability changed: ${result.blockers.join('; ')}`);
|
|
144
|
-
const entries = new Map(
|
|
174
|
+
const entries = new Map(all.map((entry) => [entry.id, entry]));
|
|
145
175
|
const appliedIds = [];
|
|
146
176
|
const warnings = [];
|
|
147
177
|
const now = new Date();
|
|
@@ -159,9 +189,10 @@ function applyPlan(db, root, tenantId, backup, doneKey) {
|
|
|
159
189
|
});
|
|
160
190
|
}
|
|
161
191
|
function repairOn(db, root, opts) {
|
|
162
|
-
const initial = withTrialScope(db, 'quality_repair_plan', () =>
|
|
163
|
-
if (!opts.apply || !initial.supported || !initial.issues.some((issue) => issue.disposition === 'set-aside'))
|
|
192
|
+
const initial = withTrialScope(db, 'quality_repair_plan', () => plannedResult(db, root, opts.tenantId).result);
|
|
193
|
+
if (!opts.apply || !initial.supported || !initial.issues.some((issue) => issue.disposition === 'set-aside')) {
|
|
164
194
|
return initial;
|
|
195
|
+
}
|
|
165
196
|
db.exec('PRAGMA foreign_keys = ON');
|
|
166
197
|
const result = withBackup(db, root, 'before-quality-repair', (backup) => applyPlan(db, root, opts.tenantId, backup, opts.doneKey));
|
|
167
198
|
const warnings = [...result.warnings];
|
|
@@ -172,12 +203,14 @@ function repairOn(db, root, opts) {
|
|
|
172
203
|
}
|
|
173
204
|
return { ...result, warnings };
|
|
174
205
|
}
|
|
175
|
-
/** Preview by default; apply backs the database up, then moves certain defects to dormant storage, without running
|
|
206
|
+
/** Preview by default; apply backs the database up, then moves certain defects to dormant storage, without running
|
|
207
|
+
* migrations. */
|
|
176
208
|
export function repairAutomaticMemories(root, opts) {
|
|
177
209
|
return withUnmigratedDb(root, !opts.apply, (db) => repairOn(db, root, opts));
|
|
178
210
|
}
|
|
179
211
|
const AUTO_REPAIR_META_KEY = 'quality_repair_auto';
|
|
180
|
-
/** Applies the repair once per store, so stores that predate the quality gate are cleaned on upgrade with no command;
|
|
212
|
+
/** Applies the repair once per store, so stores that predate the quality gate are cleaned on upgrade with no command;
|
|
213
|
+
* null once done. */
|
|
181
214
|
export function repairQualityOnce(root, tenantId) {
|
|
182
215
|
return withUnmigratedDb(root, false, (db) => {
|
|
183
216
|
if (getMeta(db, AUTO_REPAIR_META_KEY) === '1')
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type DatabaseSyncLike } from '../db/index.js';
|
|
2
2
|
import type { QuarantineApproval, QuarantineListQuery, QuarantineRejection, QuarantinedMemory } from './port.js';
|
|
3
3
|
export declare const QUARANTINE_SCOPE_PREFIX = "quarantine:private:";
|
|
4
|
+
export declare function isQuarantineScope(scope: string | null | undefined): boolean;
|
|
4
5
|
/** Scope a quarantined memory is stored under; matches PRIVATE_SCOPE_RE so every default-deny site hides it. */
|
|
5
6
|
export declare function quarantineScopeFor(original: string | null): string;
|
|
6
7
|
export type QuarantineStatus = 'pending' | 'approved' | 'rejected';
|
package/dist/store/quarantine.js
CHANGED
|
@@ -5,6 +5,9 @@ import { withWriteScopeOr } from '../db/index.js';
|
|
|
5
5
|
import { keysetAfter } from '../util/keyset.js';
|
|
6
6
|
import { selectEntriesByIds } from './entry-reads.js';
|
|
7
7
|
export const QUARANTINE_SCOPE_PREFIX = 'quarantine:private:';
|
|
8
|
+
export function isQuarantineScope(scope) {
|
|
9
|
+
return scope != null && scope.startsWith(QUARANTINE_SCOPE_PREFIX);
|
|
10
|
+
}
|
|
8
11
|
/** Scope a quarantined memory is stored under; matches PRIVATE_SCOPE_RE so every default-deny site hides it. */
|
|
9
12
|
export function quarantineScopeFor(original) {
|
|
10
13
|
return `${QUARANTINE_SCOPE_PREFIX}${original ?? 'unscoped'}`;
|
|
@@ -29,16 +32,21 @@ function getQuarantineRow(db, tenantId, memoryId) {
|
|
|
29
32
|
return row ? fromDbRow(row) : null;
|
|
30
33
|
}
|
|
31
34
|
function listQuarantineRows(db, tenantId, status = 'pending', limit = DEFAULT_LIST_LIMIT, afterRow) {
|
|
32
|
-
// A pending row whose memory was deleted (e.g. Slack message_deleted) is dead; keep its history, drop it from the
|
|
35
|
+
// A pending row whose memory was deleted (e.g. Slack message_deleted) is dead; keep its history, drop it from the
|
|
36
|
+
// queue.
|
|
33
37
|
const live = status === 'pending'
|
|
34
|
-
? ' AND EXISTS (SELECT 1 FROM memories m WHERE m.id = memory_quarantine.memory_id AND m.tenant_id =
|
|
38
|
+
? ' AND EXISTS (SELECT 1 FROM memories m WHERE m.id = memory_quarantine.memory_id AND m.tenant_id = ' +
|
|
39
|
+
'memory_quarantine.tenant_id)'
|
|
35
40
|
: '';
|
|
36
41
|
const after = keysetAfter('quarantined_at', 'memory_id', afterRow);
|
|
37
42
|
const order = 'ORDER BY quarantined_at DESC, memory_id DESC LIMIT ?';
|
|
38
43
|
const rows = status === 'all'
|
|
39
|
-
? db
|
|
44
|
+
? db
|
|
45
|
+
.prepare(`SELECT ${SELECT_COLUMNS} FROM memory_quarantine WHERE tenant_id = ?${after.sql} ${order}`)
|
|
40
46
|
.all(tenantId, ...after.params, limit)
|
|
41
|
-
: db
|
|
47
|
+
: db
|
|
48
|
+
.prepare(`SELECT ${SELECT_COLUMNS} FROM memory_quarantine WHERE tenant_id = ? AND status = ?${live}${after.sql} ` +
|
|
49
|
+
`${order}`)
|
|
42
50
|
.all(tenantId, status, ...after.params, limit);
|
|
43
51
|
// SAFETY: both branches select SELECT_COLUMNS, matching QuarantineDbRow's field set.
|
|
44
52
|
return rows.map(fromDbRow);
|
|
@@ -56,12 +64,12 @@ export function recordQuarantine(db, opts) {
|
|
|
56
64
|
});
|
|
57
65
|
}
|
|
58
66
|
function approveQuarantineRow(db, tenantId, memoryId, decidedBy) {
|
|
59
|
-
db.prepare(`UPDATE memory_quarantine SET status = 'approved', decided_at = ?, decided_by = ? WHERE tenant_id = ? AND
|
|
60
|
-
.run(new Date().toISOString(), decidedBy, tenantId, memoryId);
|
|
67
|
+
db.prepare(`UPDATE memory_quarantine SET status = 'approved', decided_at = ?, decided_by = ? WHERE tenant_id = ? AND ` +
|
|
68
|
+
`memory_id = ?`).run(new Date().toISOString(), decidedBy, tenantId, memoryId);
|
|
61
69
|
}
|
|
62
70
|
function rejectQuarantineRow(db, tenantId, memoryId, decidedBy) {
|
|
63
|
-
db.prepare(`UPDATE memory_quarantine SET status = 'rejected', decided_at = ?, decided_by = ? WHERE tenant_id = ? AND
|
|
64
|
-
.run(new Date().toISOString(), decidedBy, tenantId, memoryId);
|
|
71
|
+
db.prepare(`UPDATE memory_quarantine SET status = 'rejected', decided_at = ?, decided_by = ? WHERE tenant_id = ? AND ` +
|
|
72
|
+
`memory_id = ?`).run(new Date().toISOString(), decidedBy, tenantId, memoryId);
|
|
65
73
|
}
|
|
66
74
|
/** A page of the tenant's records, each with its memory's content read in the same query batch. */
|
|
67
75
|
export function listQuarantinedAt(db, tenantId, { status, limit, after }) {
|
|
@@ -91,7 +99,13 @@ export function approveQuarantinedAt(db, tenantId, id, actor) {
|
|
|
91
99
|
if (Number(updated.changes ?? 0) !== 1)
|
|
92
100
|
return rollback({ outcome: 'scope_moved' });
|
|
93
101
|
approveQuarantineRow(db, tenantId, id, actor);
|
|
94
|
-
appendAuditEvent(db, {
|
|
102
|
+
appendAuditEvent(db, {
|
|
103
|
+
tenantId,
|
|
104
|
+
actor,
|
|
105
|
+
op: 'quarantine_approve',
|
|
106
|
+
targetId: id,
|
|
107
|
+
metadata: { originalScope: row.originalScope },
|
|
108
|
+
});
|
|
95
109
|
return { outcome: 'approved' };
|
|
96
110
|
});
|
|
97
111
|
}
|
|
@@ -2,13 +2,14 @@ import type { DatabaseSyncLike } from '../db/index.js';
|
|
|
2
2
|
export interface ArchiveOpts {
|
|
3
3
|
reason: string;
|
|
4
4
|
who: string;
|
|
5
|
-
/** Hook run inside the archive SAVEPOINT after the audit row and before RELEASE (the Slack deletion connector marks
|
|
6
|
-
* throwing rolls back the whole archive, audit row included. */
|
|
5
|
+
/** Hook run inside the archive SAVEPOINT after the audit row and before RELEASE (the Slack deletion connector marks
|
|
6
|
+
* the event seen atomically); throwing rolls back the whole archive, audit row included. */
|
|
7
7
|
afterArchive?: (db: DatabaseSyncLike, archivedMemoryId: string) => void;
|
|
8
8
|
}
|
|
9
9
|
/** Stamps the archived copy of `memoryId` as having its markdown mirror cleaned at `at`. */
|
|
10
10
|
export declare function markMirrorCleaned(db: DatabaseSyncLike, memoryId: string, at: string): void;
|
|
11
|
-
/** The only way to remove a `kind='raw'` row: snapshots it into `raw_archive`, flips `kind` to 'archived' so the
|
|
12
|
-
* all in one write scope that nests in an outer transaction. Throws if the row
|
|
11
|
+
/** The only way to remove a `kind='raw'` row: snapshots it into `raw_archive`, flips `kind` to 'archived' so the
|
|
12
|
+
* append-only trigger allows the delete, all in one write scope that nests in an outer transaction. Throws if the row
|
|
13
|
+
* is missing or not raw; returns the archived_at. */
|
|
13
14
|
export declare function archiveRawMemory(db: DatabaseSyncLike, id: string, opts: ArchiveOpts): string;
|
|
14
15
|
//# sourceMappingURL=raw-archive.d.ts.map
|
|
@@ -8,8 +8,8 @@ export function markMirrorCleaned(db, memoryId, at) {
|
|
|
8
8
|
db.prepare(`UPDATE raw_archive SET mirror_cleaned_at = ? WHERE memory_id = ?`).run(at, memoryId);
|
|
9
9
|
}
|
|
10
10
|
function loadRawRow(db, id) {
|
|
11
|
-
// SAFETY: SELECT * returns every memories column; only kind, tenant_id and dag_parent_id are read below, all
|
|
12
|
-
// schema.
|
|
11
|
+
// SAFETY: SELECT * returns every memories column; only kind, tenant_id and dag_parent_id are read below, all
|
|
12
|
+
// guaranteed present (possibly null) by the 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,8 +19,8 @@ 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, never the original content; the archive_raw audit row is the compliance
|
|
23
|
-
// so the content is unrecoverable from here on.
|
|
22
|
+
// GDPR: raw_archive stores ONLY metadata, never the original content; the archive_raw audit row is the compliance
|
|
23
|
+
// trail, so the content is unrecoverable from here on.
|
|
24
24
|
const archivedAt = new Date().toISOString();
|
|
25
25
|
const redactedPayload = JSON.stringify({
|
|
26
26
|
redacted: true,
|
|
@@ -38,8 +38,8 @@ function moveRowToArchive(db, id, row, opts) {
|
|
|
38
38
|
db.prepare(`DELETE FROM memories_fts WHERE id = ?`).run(id);
|
|
39
39
|
return archivedAt;
|
|
40
40
|
}
|
|
41
|
-
// Emit the archive_raw audit inside the SAVEPOINT so it commits atomically with the row deletion, attributed to the
|
|
42
|
-
// not whatever HIPPO_TENANT the calling shell has set.
|
|
41
|
+
// Emit the archive_raw audit inside the SAVEPOINT so it commits atomically with the row deletion, attributed to the
|
|
42
|
+
// row's own tenant_id, not whatever HIPPO_TENANT the calling shell has set.
|
|
43
43
|
function auditArchive(db, id, row, opts) {
|
|
44
44
|
try {
|
|
45
45
|
appendAuditEvent(db, {
|
|
@@ -55,8 +55,9 @@ function auditArchive(db, id, row, opts) {
|
|
|
55
55
|
reportAuditWriteFailure('archive_raw', String(error), id);
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
|
-
/** The only way to remove a `kind='raw'` row: snapshots it into `raw_archive`, flips `kind` to 'archived' so the
|
|
59
|
-
* all in one write scope that nests in an outer transaction. Throws if the row
|
|
58
|
+
/** The only way to remove a `kind='raw'` row: snapshots it into `raw_archive`, flips `kind` to 'archived' so the
|
|
59
|
+
* append-only trigger allows the delete, all in one write scope that nests in an outer transaction. Throws if the row
|
|
60
|
+
* is missing or not raw; returns the archived_at. */
|
|
60
61
|
export function archiveRawMemory(db, id, opts) {
|
|
61
62
|
const row = loadRawRow(db, id);
|
|
62
63
|
// A SAVEPOINT when already inside a transaction (e.g. batchWriteAndDelete), so a throw here
|
|
@@ -69,8 +70,8 @@ export function archiveRawMemory(db, id, opts) {
|
|
|
69
70
|
if (row.dag_parent_id) {
|
|
70
71
|
markSummaryDirtyInTx(db, String(row.dag_parent_id), String(row.tenant_id ?? DEFAULT_TENANT_ID), opts.who || 'cli');
|
|
71
72
|
}
|
|
72
|
-
// afterArchive hook: connector idempotency markers (e.g. slack_event_log) must commit atomically with the archive,
|
|
73
|
-
// throwing rolls back both.
|
|
73
|
+
// afterArchive hook: connector idempotency markers (e.g. slack_event_log) must commit atomically with the archive,
|
|
74
|
+
// so it runs INSIDE the SAVEPOINT; throwing rolls back both.
|
|
74
75
|
if (opts.afterArchive) {
|
|
75
76
|
opts.afterArchive(db, id);
|
|
76
77
|
}
|