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,41 +1,21 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
|
|
5
|
-
* outcomes. The `predictions` table holds every field (including
|
|
6
|
-
* `claim_text`); a memory row mirrors the claim for recall/inspect surfaces
|
|
7
|
-
* but is NOT the source of truth — ON DELETE SET NULL on memory_id means
|
|
8
|
-
* memory deletion gracefully orphans the prediction without losing data.
|
|
9
|
-
*
|
|
10
|
-
* Tenant scoping: every helper requires tenantId. The schema's BEFORE INSERT
|
|
11
|
-
* + BEFORE UPDATE triggers (`trg_predictions_tenant_match_*`) enforce that
|
|
12
|
-
* `predictions.tenant_id` matches the referenced memory's tenant_id when
|
|
13
|
-
* `memory_id IS NOT NULL`. Cross-tenant references are unrepresentable at
|
|
14
|
-
* the schema level.
|
|
15
|
-
*
|
|
16
|
-
* Dual-write atomicity: `savePrediction` writes the memory + predictions
|
|
17
|
-
* row inside `writeEntry`'s SAVEPOINT 'write_entry' (store/entry-writes.ts). The
|
|
18
|
-
* afterWrite hook (store/entry-writes.ts) runs inside the same SAVEPOINT, so
|
|
19
|
-
* a failure in either step rolls back both. Pattern matches supersede
|
|
20
|
-
* (api.ts:1486) and the Slack/GitHub connectors.
|
|
21
|
-
*
|
|
22
|
-
* The planning-fallacy detector reads `loadPredictionsByClass` and computes
|
|
23
|
-
* per-class base rates from (estimate_value, actual_value) at query time.
|
|
24
|
-
*/
|
|
1
|
+
/** First-class prediction: an ex-ante claim closed against an outcome. The `predictions` table is the source of truth; the memory row only mirrors the claim.
|
|
2
|
+
* Every helper requires tenantId; `trg_predictions_tenant_match_*` triggers enforce the prediction's tenant matches the referenced memory's.
|
|
3
|
+
* `savePrediction` writes memory and prediction inside `writeEntry`'s SAVEPOINT (via afterWrite), so a failure in either rolls back both. */
|
|
4
|
+
import { DEFAULT_LIST_LIMIT } from '../util/limits.js';
|
|
25
5
|
import { BadRequestError, NotFoundError } from '../core/api-errors.js';
|
|
26
|
-
import {
|
|
6
|
+
import { withWriteScope } from '../db/index.js';
|
|
7
|
+
import { onHandle } from './open.js';
|
|
27
8
|
import { writeEntryAt } from './sqlite/entry-writes-group.js';
|
|
28
9
|
import { assertTenantId } from './tenant.js';
|
|
29
10
|
import { createMemory, Layer } from '../core/memory.js';
|
|
30
11
|
import { appendAuditEvent } from './audit.js';
|
|
31
12
|
import { loadConfig } from '../core/config.js';
|
|
32
13
|
import { keysetAfter } from '../util/keyset.js';
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
]);
|
|
14
|
+
import { VALID_CLOSURE_STATES } from '../core/prediction.js';
|
|
15
|
+
const DEFAULT_PREDICTION_PAGE_SIZE = DEFAULT_LIST_LIMIT;
|
|
16
|
+
const SELECT_COLUMNS = `id, memory_id, tenant_id, class_tag, claim_text,
|
|
17
|
+
estimate_value, estimate_unit, target_date,
|
|
18
|
+
actual_value, closure_state, closed_at, closure_note, created_at`;
|
|
39
19
|
function rowToPrediction(row) {
|
|
40
20
|
return {
|
|
41
21
|
id: row.id,
|
|
@@ -55,20 +35,8 @@ function rowToPrediction(row) {
|
|
|
55
35
|
createdAt: row.created_at,
|
|
56
36
|
};
|
|
57
37
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
// ---------------------------------------------------------------------------
|
|
61
|
-
/**
|
|
62
|
-
* Create a new prediction. Writes a memory mirror + a predictions table
|
|
63
|
-
* row atomically inside `writeEntry`'s SAVEPOINT 'write_entry'. On any
|
|
64
|
-
* failure (audit write, predictions INSERT, trigger ABORT), the SAVEPOINT
|
|
65
|
-
* rolls back — neither the memory row nor the predictions row lands.
|
|
66
|
-
*
|
|
67
|
-
* The memory is tagged `['prediction', classTag]` with `source='prediction'`
|
|
68
|
-
* and `kind='distilled'`. It surfaces in `hippo recall` so the agent can
|
|
69
|
-
* see open predictions naturally; the predictions table is the canonical
|
|
70
|
-
* structured store used by the planning-fallacy detector.
|
|
71
|
-
*/
|
|
38
|
+
/** Create a prediction: memory mirror and predictions row land atomically inside `writeEntry`'s SAVEPOINT; any failure rolls back both.
|
|
39
|
+
* The memory (tags `['prediction', classTag]`, kind 'distilled') surfaces in `hippo recall`; the predictions table feeds the planning-fallacy detector. */
|
|
72
40
|
export function savePrediction(hippoRoot, tenantId, opts, actor = 'cli') {
|
|
73
41
|
assertTenantId('savePrediction', tenantId);
|
|
74
42
|
if (!opts.classTag)
|
|
@@ -91,7 +59,8 @@ export function predictionMirror(tenantId, claim, baseHalfLifeDays) {
|
|
|
91
59
|
tenantId,
|
|
92
60
|
});
|
|
93
61
|
}
|
|
94
|
-
/** The store port's save on hippo.db: the mirror goes in as the port's writeEntry has it, tenant
|
|
62
|
+
/** The store port's save on hippo.db: the mirror goes in as the port's writeEntry has it, tenant
|
|
63
|
+
* check included, and its predictions row shares that write scope, so neither lands alone. */
|
|
95
64
|
export function writePrediction(hippoRoot, tenantId, save, actor) {
|
|
96
65
|
assertTenantId('savePrediction', tenantId);
|
|
97
66
|
const now = new Date().toISOString();
|
|
@@ -120,9 +89,7 @@ function insertPredictionRow(db, memoryId, tenantId, opts, stamp) {
|
|
|
120
89
|
const predictionId = Number(result.lastInsertRowid ?? 0);
|
|
121
90
|
// SAFETY: row's shape matches the columns named in the SELECT above.
|
|
122
91
|
const row = db.prepare(`
|
|
123
|
-
SELECT
|
|
124
|
-
estimate_value, estimate_unit, target_date,
|
|
125
|
-
actual_value, closure_state, closed_at, closure_note, created_at
|
|
92
|
+
SELECT ${SELECT_COLUMNS}
|
|
126
93
|
FROM predictions WHERE id = ?
|
|
127
94
|
`).get(predictionId);
|
|
128
95
|
if (!row) {
|
|
@@ -147,25 +114,18 @@ function auditPredictionCreate(db, who, opts) {
|
|
|
147
114
|
},
|
|
148
115
|
});
|
|
149
116
|
}
|
|
150
|
-
/**
|
|
151
|
-
*
|
|
152
|
-
* the memory mirror is NOT mutated in v1 (predictions table is canonical).
|
|
153
|
-
* Accuracy is computed from (estimateValue, actualValue) at query time.
|
|
154
|
-
*/
|
|
117
|
+
/** Close an open prediction. Updates the predictions row only; the memory mirror is not mutated (the predictions table is the source of truth).
|
|
118
|
+
* Accuracy is computed from (estimateValue, actualValue) at query time. */
|
|
155
119
|
export function closePrediction(hippoRoot, tenantId, id, opts, actor = 'cli') {
|
|
156
120
|
assertTenantId('closePrediction', tenantId);
|
|
157
121
|
if (!VALID_CLOSURE_STATES.has(opts.closureState)) {
|
|
158
122
|
throw new BadRequestError(`closePrediction: closureState must be one of ${Array.from(VALID_CLOSURE_STATES).join('|')}; got ${opts.closureState}`);
|
|
159
123
|
}
|
|
160
124
|
const now = new Date().toISOString();
|
|
161
|
-
|
|
162
|
-
try {
|
|
125
|
+
return onHandle(hippoRoot, (db) => {
|
|
163
126
|
const row = withWriteScope(db, 'close_prediction', () => closeOpenPredictionRow(db, tenantId, id, opts, { now, actor }));
|
|
164
127
|
return rowToPrediction(row);
|
|
165
|
-
}
|
|
166
|
-
finally {
|
|
167
|
-
closeHippoDb(db);
|
|
168
|
-
}
|
|
128
|
+
});
|
|
169
129
|
}
|
|
170
130
|
/** Closes the row, reloads it and audits the close; the caller owns the transaction. */
|
|
171
131
|
function closeOpenPredictionRow(db, tenantId, id, opts, stamp) {
|
|
@@ -181,9 +141,7 @@ function closeOpenPredictionRow(db, tenantId, id, opts, stamp) {
|
|
|
181
141
|
throwCloseMiss(db, tenantId, id);
|
|
182
142
|
// SAFETY: row's shape matches the columns named in the SELECT above.
|
|
183
143
|
const row = db.prepare(`
|
|
184
|
-
SELECT
|
|
185
|
-
estimate_value, estimate_unit, target_date,
|
|
186
|
-
actual_value, closure_state, closed_at, closure_note, created_at
|
|
144
|
+
SELECT ${SELECT_COLUMNS}
|
|
187
145
|
FROM predictions WHERE id = ? AND tenant_id = ?
|
|
188
146
|
`).get(id, tenantId);
|
|
189
147
|
if (!row) {
|
|
@@ -203,10 +161,8 @@ function closeOpenPredictionRow(db, tenantId, id, opts, stamp) {
|
|
|
203
161
|
return row;
|
|
204
162
|
}
|
|
205
163
|
function throwCloseMiss(db, tenantId, id) {
|
|
206
|
-
// Distinguish
|
|
207
|
-
//
|
|
208
|
-
// SAFETY: row shape matches the single `closure_state` column named
|
|
209
|
-
// in the SELECT above.
|
|
164
|
+
// Distinguish 'not found' from 'already closed' so callers (CLI, HTTP) surface the right error.
|
|
165
|
+
// SAFETY: row shape matches the single `closure_state` column named in the SELECT above.
|
|
210
166
|
const existing = db.prepare(`
|
|
211
167
|
SELECT closure_state FROM predictions WHERE id = ? AND tenant_id = ?
|
|
212
168
|
`).get(id, tenantId);
|
|
@@ -218,27 +174,20 @@ function throwCloseMiss(db, tenantId, id) {
|
|
|
218
174
|
}
|
|
219
175
|
export function loadPredictionById(hippoRoot, tenantId, id) {
|
|
220
176
|
assertTenantId('loadPredictionById', tenantId);
|
|
221
|
-
|
|
222
|
-
try {
|
|
177
|
+
return onHandle(hippoRoot, (db) => {
|
|
223
178
|
// SAFETY: row's shape matches the columns named in the SELECT above.
|
|
224
179
|
const row = db.prepare(`
|
|
225
|
-
SELECT
|
|
226
|
-
estimate_value, estimate_unit, target_date,
|
|
227
|
-
actual_value, closure_state, closed_at, closure_note, created_at
|
|
180
|
+
SELECT ${SELECT_COLUMNS}
|
|
228
181
|
FROM predictions WHERE id = ? AND tenant_id = ?
|
|
229
182
|
`).get(id, tenantId);
|
|
230
183
|
return row ? rowToPrediction(row) : null;
|
|
231
|
-
}
|
|
232
|
-
finally {
|
|
233
|
-
closeHippoDb(db);
|
|
234
|
-
}
|
|
184
|
+
});
|
|
235
185
|
}
|
|
236
186
|
export function loadPredictionsByClass(hippoRoot, tenantId, classTag, opts = {}) {
|
|
237
187
|
assertTenantId('loadPredictionsByClass', tenantId);
|
|
238
188
|
const limit = opts.limit ?? DEFAULT_PREDICTION_PAGE_SIZE;
|
|
239
189
|
const after = keysetAfter('created_at', 'id', opts.after);
|
|
240
|
-
|
|
241
|
-
try {
|
|
190
|
+
return onHandle(hippoRoot, (db) => {
|
|
242
191
|
let rows;
|
|
243
192
|
if (opts.closureState) {
|
|
244
193
|
if (!VALID_CLOSURE_STATES.has(opts.closureState)) {
|
|
@@ -246,9 +195,7 @@ export function loadPredictionsByClass(hippoRoot, tenantId, classTag, opts = {})
|
|
|
246
195
|
}
|
|
247
196
|
// SAFETY: rows' shape matches the columns named in the SELECT above.
|
|
248
197
|
rows = db.prepare(`
|
|
249
|
-
SELECT
|
|
250
|
-
estimate_value, estimate_unit, target_date,
|
|
251
|
-
actual_value, closure_state, closed_at, closure_note, created_at
|
|
198
|
+
SELECT ${SELECT_COLUMNS}
|
|
252
199
|
FROM predictions
|
|
253
200
|
WHERE tenant_id = ? AND class_tag = ? AND closure_state = ?${after.sql}
|
|
254
201
|
ORDER BY created_at DESC, id DESC
|
|
@@ -258,9 +205,7 @@ export function loadPredictionsByClass(hippoRoot, tenantId, classTag, opts = {})
|
|
|
258
205
|
else {
|
|
259
206
|
// SAFETY: rows' shape matches the columns named in the SELECT above.
|
|
260
207
|
rows = db.prepare(`
|
|
261
|
-
SELECT
|
|
262
|
-
estimate_value, estimate_unit, target_date,
|
|
263
|
-
actual_value, closure_state, closed_at, closure_note, created_at
|
|
208
|
+
SELECT ${SELECT_COLUMNS}
|
|
264
209
|
FROM predictions
|
|
265
210
|
WHERE tenant_id = ? AND class_tag = ?${after.sql}
|
|
266
211
|
ORDER BY created_at DESC, id DESC
|
|
@@ -268,43 +213,26 @@ export function loadPredictionsByClass(hippoRoot, tenantId, classTag, opts = {})
|
|
|
268
213
|
`).all(tenantId, classTag, ...after.params, limit);
|
|
269
214
|
}
|
|
270
215
|
return rows.map(rowToPrediction);
|
|
271
|
-
}
|
|
272
|
-
finally {
|
|
273
|
-
closeHippoDb(db);
|
|
274
|
-
}
|
|
216
|
+
});
|
|
275
217
|
}
|
|
276
218
|
/** Every prediction in the tenant, open and closed, across all classes: the `status=all` list without a class. */
|
|
277
219
|
export function loadAllPredictions(hippoRoot, tenantId, opts = {}) {
|
|
278
220
|
assertTenantId('loadAllPredictions', tenantId);
|
|
279
221
|
const after = keysetAfter('created_at', 'id', opts.after);
|
|
280
|
-
|
|
281
|
-
try {
|
|
222
|
+
return onHandle(hippoRoot, (db) => {
|
|
282
223
|
// SAFETY: rows' shape matches the columns named in the SELECT.
|
|
283
224
|
const rows = db.prepare(`
|
|
284
|
-
SELECT
|
|
285
|
-
estimate_value, estimate_unit, target_date,
|
|
286
|
-
actual_value, closure_state, closed_at, closure_note, created_at
|
|
225
|
+
SELECT ${SELECT_COLUMNS}
|
|
287
226
|
FROM predictions
|
|
288
227
|
WHERE tenant_id = ?${after.sql}
|
|
289
228
|
ORDER BY created_at DESC, id DESC
|
|
290
229
|
LIMIT ?
|
|
291
230
|
`).all(tenantId, ...after.params, opts.limit ?? DEFAULT_PREDICTION_PAGE_SIZE);
|
|
292
231
|
return rows.map(rowToPrediction);
|
|
293
|
-
}
|
|
294
|
-
finally {
|
|
295
|
-
closeHippoDb(db);
|
|
296
|
-
}
|
|
232
|
+
});
|
|
297
233
|
}
|
|
298
|
-
/**
|
|
299
|
-
*
|
|
300
|
-
* planning-fallacy detector: Lovallo-Kahneman (2003) inside-vs-outside view.
|
|
301
|
-
*
|
|
302
|
-
* Filter: closure_state='closed' AND estimate_value IS NOT NULL AND
|
|
303
|
-
* actual_value IS NOT NULL. Excludes closed-unknown (no actual to
|
|
304
|
-
* compare against) and open (not yet resolved).
|
|
305
|
-
*
|
|
306
|
-
* Audit-emit is built in here, not at the 3 call sites, so callers cannot drift.
|
|
307
|
-
*/
|
|
234
|
+
/** Base-rate stats for closed predictions in a class (Lovallo-Kahneman inside-vs-outside view): closure_state='closed' with estimate and actual non-null;
|
|
235
|
+
* closed-unknown and open are excluded. Audit-emit is built in here, not at the 3 call sites, so callers cannot drift. */
|
|
308
236
|
export function computePredictionBaserate(hippoRoot, tenantId, classTag, actor = 'cli',
|
|
309
237
|
/** False skips the predict_baserate audit so that channel only records deliberate
|
|
310
238
|
* baserate calls, not every recall the planning-fallacy orchestrator inspects. */
|
|
@@ -312,8 +240,7 @@ emitAudit = true) {
|
|
|
312
240
|
assertTenantId('computePredictionBaserate', tenantId);
|
|
313
241
|
if (!classTag)
|
|
314
242
|
throw new BadRequestError('computePredictionBaserate: classTag is required');
|
|
315
|
-
|
|
316
|
-
try {
|
|
243
|
+
return onHandle(hippoRoot, (db) => {
|
|
317
244
|
// Ordered by id because the float sums differ with row order, and another store must reach the same figures.
|
|
318
245
|
// SAFETY: rows' shape matches the two columns named in the SELECT above.
|
|
319
246
|
const rows = db.prepare(`
|
|
@@ -331,10 +258,7 @@ emitAudit = true) {
|
|
|
331
258
|
if (emitAudit)
|
|
332
259
|
auditBaserateRead(db, tenantId, actor, classTag, baserate.nClosed);
|
|
333
260
|
return baserate;
|
|
334
|
-
}
|
|
335
|
-
finally {
|
|
336
|
-
closeHippoDb(db);
|
|
337
|
-
}
|
|
261
|
+
});
|
|
338
262
|
}
|
|
339
263
|
function auditBaserateRead(db, tenantId, actor, classTag, nClosed) {
|
|
340
264
|
appendAuditEvent(db, {
|
|
@@ -386,15 +310,12 @@ export function loadOpenPredictions(hippoRoot, tenantId, opts = {}) {
|
|
|
386
310
|
assertTenantId('loadOpenPredictions', tenantId);
|
|
387
311
|
const limit = opts.limit ?? DEFAULT_PREDICTION_PAGE_SIZE;
|
|
388
312
|
const after = keysetAfter('created_at', 'id', opts.after);
|
|
389
|
-
|
|
390
|
-
try {
|
|
313
|
+
return onHandle(hippoRoot, (db) => {
|
|
391
314
|
let rows;
|
|
392
315
|
if (opts.classTag) {
|
|
393
316
|
// SAFETY: rows' shape matches the columns named in the SELECT above.
|
|
394
317
|
rows = db.prepare(`
|
|
395
|
-
SELECT
|
|
396
|
-
estimate_value, estimate_unit, target_date,
|
|
397
|
-
actual_value, closure_state, closed_at, closure_note, created_at
|
|
318
|
+
SELECT ${SELECT_COLUMNS}
|
|
398
319
|
FROM predictions
|
|
399
320
|
WHERE tenant_id = ? AND class_tag = ? AND closure_state = 'open'${after.sql}
|
|
400
321
|
ORDER BY created_at DESC, id DESC
|
|
@@ -404,9 +325,7 @@ export function loadOpenPredictions(hippoRoot, tenantId, opts = {}) {
|
|
|
404
325
|
else {
|
|
405
326
|
// SAFETY: rows' shape matches the columns named in the SELECT above.
|
|
406
327
|
rows = db.prepare(`
|
|
407
|
-
SELECT
|
|
408
|
-
estimate_value, estimate_unit, target_date,
|
|
409
|
-
actual_value, closure_state, closed_at, closure_note, created_at
|
|
328
|
+
SELECT ${SELECT_COLUMNS}
|
|
410
329
|
FROM predictions
|
|
411
330
|
WHERE tenant_id = ? AND closure_state = 'open'${after.sql}
|
|
412
331
|
ORDER BY created_at DESC, id DESC
|
|
@@ -414,9 +333,6 @@ export function loadOpenPredictions(hippoRoot, tenantId, opts = {}) {
|
|
|
414
333
|
`).all(tenantId, ...after.params, limit);
|
|
415
334
|
}
|
|
416
335
|
return rows.map(rowToPrediction);
|
|
417
|
-
}
|
|
418
|
-
finally {
|
|
419
|
-
closeHippoDb(db);
|
|
420
|
-
}
|
|
336
|
+
});
|
|
421
337
|
}
|
|
422
338
|
//# sourceMappingURL=predictions.js.map
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { type DatabaseSyncLike } from '../db/index.js';
|
|
2
|
+
import { type MemoryEntry } from '../core/memory.js';
|
|
3
|
+
import { type AppendAuditOpts, type AuditEvent } from './audit.js';
|
|
4
|
+
import { type DormantReason, type DormantSnapshot } from './dormant.js';
|
|
5
|
+
import { type SetAsideResult, type SetAsideWhy } from './set-aside.js';
|
|
6
|
+
export type ProjectTagOp = 'project_merge' | 'project_repair';
|
|
7
|
+
export interface ProjectTagReads {
|
|
8
|
+
entries(): MemoryEntry[];
|
|
9
|
+
liveEntriesBySourcePrefix(prefix: string): MemoryEntry[];
|
|
10
|
+
entriesByIds(ids: readonly string[]): Map<string, MemoryEntry>;
|
|
11
|
+
dormant(): DormantSnapshot[];
|
|
12
|
+
auditEvents(op: ProjectTagOp): AuditEvent[];
|
|
13
|
+
compactionTranscripts(): Array<{
|
|
14
|
+
transcript: string;
|
|
15
|
+
cwd: string | null;
|
|
16
|
+
}>;
|
|
17
|
+
compactionOriginsWithCwd(): Array<{
|
|
18
|
+
origin: string;
|
|
19
|
+
cwd: string;
|
|
20
|
+
}>;
|
|
21
|
+
holdsOrigin(table: 'memories' | 'compactions', name: string): boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface ProjectTagWrites extends ProjectTagReads {
|
|
24
|
+
setAside(tag: string, row: MemoryEntry, why: SetAsideWhy): SetAsideResult;
|
|
25
|
+
restampOrigin(from: string, into: string): void;
|
|
26
|
+
restampCompactions(from: string, into: string): number;
|
|
27
|
+
replaceDormant(id: string, entry: MemoryEntry): void;
|
|
28
|
+
stampOrigins(rows: ReadonlyArray<{
|
|
29
|
+
readonly id: string;
|
|
30
|
+
readonly origin: string;
|
|
31
|
+
}>): void;
|
|
32
|
+
/** A live row to dormant storage, restorable, as sleep's dormant move does. */
|
|
33
|
+
retire(row: MemoryEntry, reason: DormantReason, now: Date): void;
|
|
34
|
+
audit(op: ProjectTagOp, metadata: AppendAuditOpts['metadata']): void;
|
|
35
|
+
}
|
|
36
|
+
/** A rewrite's answer plus the ids whose mirrors are rewritten, and those whose mirrors go, once it commits. */
|
|
37
|
+
export interface TagRewrite<T> {
|
|
38
|
+
readonly result: T;
|
|
39
|
+
readonly rewrite: readonly string[];
|
|
40
|
+
readonly purge: readonly string[];
|
|
41
|
+
}
|
|
42
|
+
export interface ProjectTagStore extends ProjectTagReads {
|
|
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 commit. */
|
|
45
|
+
rewrite<T>(opts: {
|
|
46
|
+
readonly dryRun: boolean;
|
|
47
|
+
readonly backupLabel: string;
|
|
48
|
+
}, body: (tx: ProjectTagWrites, backup: string | null) => TagRewrite<T>): T;
|
|
49
|
+
repairedOnce(): boolean;
|
|
50
|
+
markRepairedOnce(): void;
|
|
51
|
+
}
|
|
52
|
+
export interface ProjectTagScope {
|
|
53
|
+
readonly hippoRoot: string;
|
|
54
|
+
readonly tenantId: string;
|
|
55
|
+
/** Who the audit rows name. */
|
|
56
|
+
readonly actor: string;
|
|
57
|
+
}
|
|
58
|
+
/** Reads on a handle the caller opened and closes, for doctor's read-only check and the note sync. */
|
|
59
|
+
export declare function projectTagReads(db: DatabaseSyncLike, tenantId: string): ProjectTagReads;
|
|
60
|
+
/** Runs `fn` on hippo.db under `scope.hippoRoot`, opened for this call and closed after. */
|
|
61
|
+
export declare function onProjectTags<T>(scope: ProjectTagScope, fn: (store: ProjectTagStore) => T): T;
|
|
62
|
+
//# sourceMappingURL=project-tags.d.ts.map
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// The rows `hippo projects` and sleep's tag repair read and write, bound to one hippo.db handle and tenant,
|
|
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';
|
|
4
|
+
import { withBackup } from '../db/backup.js';
|
|
5
|
+
import { calculateStrength } from '../core/memory.js';
|
|
6
|
+
import { appendAuditEvent, queryAuditEvents } from './audit.js';
|
|
7
|
+
import { compactionOriginsWithCwd, compactionTranscripts, holdsOrigin, restampCompactionOrigin } from './compactions.js';
|
|
8
|
+
import { insertDormantRow, listDormantSnapshots, replaceDormantEntry } from './dormant.js';
|
|
9
|
+
import { selectAllEntries, selectEntriesByIds, selectLiveEntriesBySourcePrefix } from './entry-reads.js';
|
|
10
|
+
import { deleteEntryRowInTx, restampOriginProjectAt, stampOriginProjectsAt, writeEntryMirrors } from './entry-writes.js';
|
|
11
|
+
import { removeEntryMirrors } from './mirrors.js';
|
|
12
|
+
import { onHandle } from './open.js';
|
|
13
|
+
import { setAsideRow } from './set-aside.js';
|
|
14
|
+
const AUDIT_READ_CAP = 10000;
|
|
15
|
+
const TX_LABEL = 'merge_projects';
|
|
16
|
+
const AUTO_REPAIR_META_KEY = 'project_repair_auto';
|
|
17
|
+
/** Reads on a handle the caller opened and closes, for doctor's read-only check and the note sync. */
|
|
18
|
+
export function projectTagReads(db, tenantId) {
|
|
19
|
+
return {
|
|
20
|
+
entries: () => selectAllEntries(db, tenantId),
|
|
21
|
+
liveEntriesBySourcePrefix: (prefix) => selectLiveEntriesBySourcePrefix(db, tenantId, prefix),
|
|
22
|
+
entriesByIds: (ids) => selectEntriesByIds(db, ids, tenantId),
|
|
23
|
+
dormant: () => listDormantSnapshots(db, tenantId),
|
|
24
|
+
auditEvents: (op) => queryAuditEvents(db, { tenantId, op, limit: AUDIT_READ_CAP }),
|
|
25
|
+
compactionTranscripts: () => compactionTranscripts(db, tenantId),
|
|
26
|
+
compactionOriginsWithCwd: () => compactionOriginsWithCwd(db, tenantId),
|
|
27
|
+
holdsOrigin: (table, name) => holdsOrigin(db, table, tenantId, name),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function projectTagWrites(db, { tenantId, actor }) {
|
|
31
|
+
return {
|
|
32
|
+
...projectTagReads(db, tenantId),
|
|
33
|
+
setAside: (tag, row, why) => setAsideRow(db, tag, row, why),
|
|
34
|
+
restampOrigin: (from, into) => restampOriginProjectAt(db, tenantId, from, into),
|
|
35
|
+
restampCompactions: (from, into) => restampCompactionOrigin(db, tenantId, from, into),
|
|
36
|
+
replaceDormant: (id, entry) => replaceDormantEntry(db, tenantId, id, entry),
|
|
37
|
+
stampOrigins: (rows) => stampOriginProjectsAt(db, tenantId, rows),
|
|
38
|
+
retire: (row, reason, now) => {
|
|
39
|
+
insertDormantRow(db, { entry: row, strength: calculateStrength(row, now), reason, dormantAt: now.toISOString() });
|
|
40
|
+
deleteEntryRowInTx(db, row, actor);
|
|
41
|
+
},
|
|
42
|
+
audit: (op, metadata) => appendAuditEvent(db, { tenantId, actor, op, metadata }),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function rewriteOn(db, scope, opts, body) {
|
|
46
|
+
const tx = projectTagWrites(db, scope);
|
|
47
|
+
if (opts.dryRun)
|
|
48
|
+
return withTrialScope(db, TX_LABEL, () => body(tx, null)).result;
|
|
49
|
+
const done = withBackup(db, scope.hippoRoot, opts.backupLabel, (backup) => withWriteScope(db, TX_LABEL, () => body(tx, backup)));
|
|
50
|
+
// 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())
|
|
52
|
+
writeEntryMirrors(scope.hippoRoot, entry);
|
|
53
|
+
for (const id of done.purge)
|
|
54
|
+
removeEntryMirrors(scope.hippoRoot, id);
|
|
55
|
+
return done.result;
|
|
56
|
+
}
|
|
57
|
+
/** Runs `fn` on hippo.db under `scope.hippoRoot`, opened for this call and closed after. */
|
|
58
|
+
export function onProjectTags(scope, fn) {
|
|
59
|
+
return onHandle(scope.hippoRoot, (db) => fn({
|
|
60
|
+
...projectTagReads(db, scope.tenantId),
|
|
61
|
+
hippoRoot: scope.hippoRoot,
|
|
62
|
+
rewrite: (opts, body) => rewriteOn(db, scope, opts, body),
|
|
63
|
+
repairedOnce: () => getMeta(db, AUTO_REPAIR_META_KEY) === '1',
|
|
64
|
+
markRepairedOnce: () => setMeta(db, AUTO_REPAIR_META_KEY, '1'),
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=project-tags.js.map
|
|
@@ -1,22 +1,19 @@
|
|
|
1
|
-
import
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { appendAuditEvent } from '../store/audit.js';
|
|
1
|
+
import { appendAuditEvent } from './audit.js';
|
|
4
2
|
import { withBackup } from '../db/backup.js';
|
|
5
3
|
import { withTrialScope, withWriteScope } from '../db/busy.js';
|
|
6
|
-
import {
|
|
7
|
-
import { DatabaseSync } from '../db/sqlite.js';
|
|
4
|
+
import { withUnmigratedDb } from '../db/open.js';
|
|
8
5
|
import { getMeta, pragmaUserVersion, setMeta } from '../db/meta.js';
|
|
9
6
|
import { tableColumns } from '../db/tables.js';
|
|
10
7
|
import { assertBinaryCompatible } from '../db/migrate.js';
|
|
11
|
-
import { insertDormantRow, listDormantSnapshots } from '
|
|
8
|
+
import { insertDormantRow, listDormantSnapshots } from './dormant.js';
|
|
12
9
|
import { calculateStrength, canAutoDelete } from '../core/memory.js';
|
|
13
10
|
import { assessAutomaticMemory, BUNDLE_HEADER, isAutomaticEntry, isCertainReason } from '../core/memory-quality.js';
|
|
14
11
|
import { heldTexts } from '../util/same-text.js';
|
|
15
|
-
import { deleteEntryCore, MEMORY_BACKED_TABLES, memoriesBackingObjectsOn } from '
|
|
16
|
-
import { selectAllEntries, selectPreviewRows } from '
|
|
17
|
-
import { ftsRowExists } from '
|
|
18
|
-
import { MEMORY_SELECT_COLUMNS, parseJsonArray } from '
|
|
19
|
-
import { purgeMirrorBestEffort } from '
|
|
12
|
+
import { deleteEntryCore, MEMORY_BACKED_TABLES, memoriesBackingObjectsOn } from './delete-and-batch.js';
|
|
13
|
+
import { selectAllEntries, selectPreviewRows } from './entry-reads.js';
|
|
14
|
+
import { ftsRowExists } from './entry-row.js';
|
|
15
|
+
import { MEMORY_SELECT_COLUMNS, parseJsonArray } from './rows.js';
|
|
16
|
+
import { purgeMirrorBestEffort } from './mirrors.js';
|
|
20
17
|
const REQUIRED_COLUMNS = {
|
|
21
18
|
memories: MEMORY_SELECT_COLUMNS.split(',').map((s) => s.trim()),
|
|
22
19
|
meta: ['key', 'value'],
|
|
@@ -108,7 +105,8 @@ function unsupportedPreview(db, tenantId) {
|
|
|
108
105
|
return { total: 0, issues: [] };
|
|
109
106
|
const rows = selectPreviewRows(db, columns, tenantId);
|
|
110
107
|
const issues = rows.flatMap((row) => {
|
|
111
|
-
const
|
|
108
|
+
const tags = parseJsonArray(row.tags_json, { table: 'memories', id: row.id, column: 'tags_json' });
|
|
109
|
+
const provenance = { ...row, source: row.source ?? '', confidence: row.confidence ?? 'observed', dag_level: row.dag_level ?? 0, tags };
|
|
112
110
|
if (!isAutomaticEntry(provenance))
|
|
113
111
|
return [];
|
|
114
112
|
const { reason } = assessAutomaticMemory(row.content);
|
|
@@ -168,34 +166,20 @@ function repairOn(db, root, opts) {
|
|
|
168
166
|
const result = withBackup(db, root, 'before-quality-repair', (backup) => applyPlan(db, root, opts.tenantId, backup, opts.doneKey));
|
|
169
167
|
const warnings = [...result.warnings];
|
|
170
168
|
for (const id of result.appliedIds) {
|
|
171
|
-
if (
|
|
172
|
-
|
|
169
|
+
if (purgeMirrorBestEffort(root, id, false, 'quality repair'))
|
|
170
|
+
continue;
|
|
171
|
+
warnings.push(`Mirror cleanup failed for ${id}; remove its stale mirror before rebuilding the index.`);
|
|
173
172
|
}
|
|
174
173
|
return { ...result, warnings };
|
|
175
174
|
}
|
|
176
|
-
function openForRepair(root, readOnly, fn) {
|
|
177
|
-
// Opens without openHippoDb to skip migrations, so it takes the same refusal itself.
|
|
178
|
-
assertSqliteAllowed(root);
|
|
179
|
-
const file = path.join(root, 'hippo.db');
|
|
180
|
-
if (!fs.existsSync(file))
|
|
181
|
-
throw new Error(`No existing Hippo database at ${file}`);
|
|
182
|
-
const db = new DatabaseSync(file, { readOnly });
|
|
183
|
-
try {
|
|
184
|
-
db.exec('PRAGMA busy_timeout = 5000');
|
|
185
|
-
return fn(db);
|
|
186
|
-
}
|
|
187
|
-
finally {
|
|
188
|
-
db.close();
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
175
|
/** Preview by default; apply backs the database up, then moves certain defects to dormant storage, without running migrations. */
|
|
192
176
|
export function repairAutomaticMemories(root, opts) {
|
|
193
|
-
return
|
|
177
|
+
return withUnmigratedDb(root, !opts.apply, (db) => repairOn(db, root, opts));
|
|
194
178
|
}
|
|
195
179
|
const AUTO_REPAIR_META_KEY = 'quality_repair_auto';
|
|
196
180
|
/** Applies the repair once per store, so stores that predate the quality gate are cleaned on upgrade with no command; null once done. */
|
|
197
181
|
export function repairQualityOnce(root, tenantId) {
|
|
198
|
-
return
|
|
182
|
+
return withUnmigratedDb(root, false, (db) => {
|
|
199
183
|
if (getMeta(db, AUTO_REPAIR_META_KEY) === '1')
|
|
200
184
|
return null;
|
|
201
185
|
// The apply commits the flag with the moves, so a lock taken between them cannot hide what moved.
|
package/dist/store/quarantine.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// The memory_quarantine table: the review queue's rows, and the approve and reject writes with their audit rows.
|
|
2
|
+
import { DEFAULT_LIST_LIMIT } from '../util/limits.js';
|
|
2
3
|
import { appendAuditEvent } from './audit.js';
|
|
3
4
|
import { withWriteScopeOr } from '../db/index.js';
|
|
4
5
|
import { keysetAfter } from '../util/keyset.js';
|
|
@@ -27,7 +28,7 @@ function getQuarantineRow(db, tenantId, memoryId) {
|
|
|
27
28
|
.get(tenantId, memoryId);
|
|
28
29
|
return row ? fromDbRow(row) : null;
|
|
29
30
|
}
|
|
30
|
-
function listQuarantineRows(db, tenantId, status = 'pending', limit =
|
|
31
|
+
function listQuarantineRows(db, tenantId, status = 'pending', limit = DEFAULT_LIST_LIMIT, afterRow) {
|
|
31
32
|
// A pending row whose memory was deleted (e.g. Slack message_deleted) is dead; keep its history, drop it from the queue.
|
|
32
33
|
const live = status === 'pending'
|
|
33
34
|
? ' AND EXISTS (SELECT 1 FROM memories m WHERE m.id = memory_quarantine.memory_id AND m.tenant_id = memory_quarantine.tenant_id)'
|
|
@@ -2,25 +2,13 @@ import type { DatabaseSyncLike } from '../db/index.js';
|
|
|
2
2
|
export interface ArchiveOpts {
|
|
3
3
|
reason: string;
|
|
4
4
|
who: string;
|
|
5
|
-
/**
|
|
6
|
-
*
|
|
7
|
-
* after the audit row is appended and before RELEASE. Used by the Slack
|
|
8
|
-
* deletion connector to mark the deletion event seen atomically — a crash
|
|
9
|
-
* mid-archive must not leave the deletion event untracked. Throwing rolls
|
|
10
|
-
* back the entire archive (including the audit row).
|
|
11
|
-
*/
|
|
5
|
+
/** Hook run inside the archive SAVEPOINT after the audit row and before RELEASE (the Slack deletion connector marks the event seen atomically);
|
|
6
|
+
* throwing rolls back the whole archive, audit row included. */
|
|
12
7
|
afterArchive?: (db: DatabaseSyncLike, archivedMemoryId: string) => void;
|
|
13
8
|
}
|
|
14
9
|
/** Stamps the archived copy of `memoryId` as having its markdown mirror cleaned at `at`. */
|
|
15
10
|
export declare function markMirrorCleaned(db: DatabaseSyncLike, memoryId: string, at: string): void;
|
|
16
|
-
/**
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* Snapshots the full row into `raw_archive`, flips `kind` to `'archived'` so the
|
|
20
|
-
* append-only trigger lets the delete through, then deletes the row. All in one
|
|
21
|
-
* write scope, which nests inside an outer transaction (e.g. batchWriteAndDelete).
|
|
22
|
-
*
|
|
23
|
-
* Throws if the row does not exist or is not `kind='raw'`. Returns the archived_at it wrote.
|
|
24
|
-
*/
|
|
11
|
+
/** 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,
|
|
12
|
+
* all in one write scope that nests in an outer transaction. Throws if the row is missing or not raw; returns the archived_at. */
|
|
25
13
|
export declare function archiveRawMemory(db: DatabaseSyncLike, id: string, opts: ArchiveOpts): string;
|
|
26
14
|
//# sourceMappingURL=raw-archive.d.ts.map
|