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
|
@@ -2,29 +2,42 @@ import { type MemoryEntry } from '../core/memory.js';
|
|
|
2
2
|
import { type DatabaseSyncLike } from '../db/index.js';
|
|
3
3
|
export interface WriteEntryOptions {
|
|
4
4
|
actor?: string;
|
|
5
|
-
afterWrite?: (db: DatabaseSyncLike, memoryId: string) => void;
|
|
6
5
|
/** Runs after the row commits and before the mirrors, on an idle connection; keep it best-effort. */
|
|
7
6
|
afterCommit?: () => void;
|
|
8
7
|
}
|
|
9
|
-
/**
|
|
10
|
-
|
|
8
|
+
/** Store-side only, never exported from a package entry: `afterWrite` hands the write's own db handle to the hook. */
|
|
9
|
+
export interface WriteEntryInternalOptions extends WriteEntryOptions {
|
|
10
|
+
/** Runs in the same SAVEPOINT as the INSERT, so a throw rolls the row back. */
|
|
11
|
+
afterWrite?: (db: DatabaseSyncLike, memoryId: string) => void;
|
|
12
|
+
}
|
|
13
|
+
/** Write an entry to SQLite and refresh mirrors. `opts.actor` defaults to 'cli'; the api layer passes the resolved
|
|
14
|
+
* actor, so the audit log gets one row per write. */
|
|
11
15
|
export declare function writeEntry(hippoRoot: string, entry: MemoryEntry, opts?: WriteEntryOptions): void;
|
|
16
|
+
/** Writes a promoted copy; with `auditAs` the `promote` audit row joins the INSERT's SAVEPOINT, so both or neither. */
|
|
17
|
+
export declare function writePromotedEntry(hippoRoot: string, entry: MemoryEntry, opts: {
|
|
18
|
+
readonly actor?: string;
|
|
19
|
+
readonly sourceId: string;
|
|
20
|
+
readonly auditAs?: {
|
|
21
|
+
tenantId: string;
|
|
22
|
+
actor: string;
|
|
23
|
+
};
|
|
24
|
+
}): void;
|
|
12
25
|
/** writeEntry for each of `entries` in one transaction, so all land or none; each
|
|
13
26
|
* keeps its audit row, and mirrors follow the commit. Returns how many were written; an empty list opens no store. */
|
|
14
27
|
export declare function writeEntriesTogether(hippoRoot: string, entries: readonly MemoryEntry[]): number;
|
|
15
28
|
/** Runs `fill` in one transaction; each `put` writes one entry and returns false when the store rejects its value,
|
|
16
|
-
* leaving that row's refusal audit and the rest of the batch. Mirrors follow the commit. Returns how many were
|
|
29
|
+
* leaving that row's refusal audit and the rest of the batch. Mirrors follow the commit. Returns how many were
|
|
30
|
+
* written. */
|
|
17
31
|
export declare function writeEntriesSkippingRejected(hippoRoot: string, fill: (put: (entry: MemoryEntry) => boolean) => void, actor?: string): number;
|
|
18
32
|
/** Adds `tag` to each of a tenant's rows that lacks it, in `ids` order, each read fresh
|
|
19
33
|
* on one open store and committed alone; an id the tenant does not hold is skipped. */
|
|
20
34
|
export declare function addTagToEntries(hippoRoot: string, tenantId: string, ids: readonly string[], tag: string): void;
|
|
21
|
-
/** DB-only write path: upsert, afterWrite hook and audit row inside one withWriteScope; the caller owns `db` and must
|
|
22
|
-
* outer tx commits, so a rolled-back tx never leaves orphan markdown. The audit row
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
/** What follows a row's upsert inside its write scope: the remember row, last of the write's audit rows, then the summary parent's dirty mark. */
|
|
35
|
+
/** DB-only write path: upsert, afterWrite hook and audit row inside one withWriteScope; the caller owns `db` and must
|
|
36
|
+
* call `writeEntryMirrors` after any outer tx commits, so a rolled-back tx never leaves orphan markdown. The audit row
|
|
37
|
+
* commits atomically with the INSERT. */
|
|
38
|
+
export declare function writeEntryDbOnly(db: DatabaseSyncLike, entry: MemoryEntry, opts?: Pick<WriteEntryInternalOptions, 'actor' | 'afterWrite'>): void;
|
|
39
|
+
/** What follows a row's upsert inside its write scope: the remember row, last of the write's audit rows, then the
|
|
40
|
+
* summary parent's dirty mark. */
|
|
28
41
|
export declare function auditEntryWrite(db: DatabaseSyncLike, entry: MemoryEntry, actor: string): void;
|
|
29
42
|
/** Markdown mirror path, invoked AFTER commit (a rolled-back tx must leave no orphan markdown). */
|
|
30
43
|
export declare function writeEntryMirrors(hippoRoot: string, entry: MemoryEntry): void;
|
|
@@ -36,13 +49,15 @@ export interface StrengthenOptions {
|
|
|
36
49
|
/** Strengthen what a read returned: update only the four retrieval columns on the live row, never a stale copy.
|
|
37
50
|
* Best effort: a failure logs and never fails the read. Returns the ids found in this store. */
|
|
38
51
|
export declare function strengthenRetrieved(hippoRoot: string, ids: readonly string[], opts: StrengthenOptions): Set<string>;
|
|
39
|
-
/** strengthenRetrieved on an open handle in its own write scope, a savepoint inside a caller's transaction, so a
|
|
52
|
+
/** strengthenRetrieved on an open handle in its own write scope, a savepoint inside a caller's transaction, so a
|
|
53
|
+
* recall's last writes share one handle. */
|
|
40
54
|
export declare function strengthenRetrievedInOwnTx(db: DatabaseSyncLike, ids: readonly string[], opts: StrengthenOptions): Set<string>;
|
|
41
55
|
/** strengthenRetrieved on the caller's handle, inside the caller's transaction. Throws; the caller decides. */
|
|
42
56
|
export declare function strengthenRetrievedOn(db: DatabaseSyncLike, ids: readonly string[], opts: StrengthenOptions): Set<string>;
|
|
43
57
|
/** Rewrites a live row's tags and its full-text row on the caller's transaction, with no audit row. */
|
|
44
58
|
export declare function setEntryTagsInTx(db: DatabaseSyncLike, entry: MemoryEntry): void;
|
|
45
|
-
/** Removes a row from `memories` and full-text search on the caller's transaction, as sleep's dormant move does, and
|
|
59
|
+
/** Removes a row from `memories` and full-text search on the caller's transaction, as sleep's dormant move does, and
|
|
60
|
+
* marks its summary parent dirty. */
|
|
46
61
|
export declare function deleteEntryRowInTx(db: DatabaseSyncLike, entry: MemoryEntry, actor: string): void;
|
|
47
62
|
/** One half-life per memory id, on the caller's transaction. */
|
|
48
63
|
export declare function setHalfLivesAt(db: DatabaseSyncLike, rows: readonly {
|
|
@@ -2,21 +2,43 @@ import { strengthAblation } from '../core/ablation.js';
|
|
|
2
2
|
import { markRetrieved } from '../core/memory.js';
|
|
3
3
|
import { closeHippoDb, openHippoDb, withWriteScope } from '../db/index.js';
|
|
4
4
|
import { rethrowIfSqliteBlocked } from '../util/sqlite-blocked.js';
|
|
5
|
+
import { chunked } from '../util/chunked.js';
|
|
5
6
|
import { RejectedValueError } from '../core/api-errors.js';
|
|
6
7
|
import { markSummaryDirtyInTx } from './summary-dirty.js';
|
|
7
8
|
import { errorMessage, log } from '../util/log.js';
|
|
8
9
|
import { auditRejectionRefusal, audit } from './audit-event.js';
|
|
10
|
+
import { appendAuditEvent } from './audit.js';
|
|
9
11
|
import { selectEntriesByIds } from './entry-reads.js';
|
|
10
12
|
import { stampOriginProject, upsertEntryRow, syncFtsRow, deleteFtsRow } from './entry-row.js';
|
|
11
13
|
import { mirrorBestEffort, writeMarkdownMirror } from './mirrors.js';
|
|
12
14
|
import { onHandle, openStore } from './open.js';
|
|
13
|
-
/** Write an entry to SQLite and refresh mirrors
|
|
14
|
-
*
|
|
15
|
+
/** Write an entry to SQLite and refresh mirrors. `opts.actor` defaults to 'cli'; the api layer passes the resolved
|
|
16
|
+
* actor, so the audit log gets one row per write. */
|
|
15
17
|
export function writeEntry(hippoRoot, entry, opts) {
|
|
18
|
+
writeEntryWithHook(hippoRoot, entry, opts);
|
|
19
|
+
}
|
|
20
|
+
/** writeEntry for store code that needs the write's own handle: `opts.afterWrite` shares the INSERT's SAVEPOINT. */
|
|
21
|
+
function writeEntryWithHook(hippoRoot, entry, opts) {
|
|
16
22
|
onHandle(hippoRoot, (db) => {
|
|
17
23
|
writeEntryOn(db, hippoRoot, entry, opts);
|
|
18
24
|
}, openStore);
|
|
19
25
|
}
|
|
26
|
+
/** Writes a promoted copy; with `auditAs` the `promote` audit row joins the INSERT's SAVEPOINT, so both or neither. */
|
|
27
|
+
export function writePromotedEntry(hippoRoot, entry, opts) {
|
|
28
|
+
const { auditAs, sourceId } = opts;
|
|
29
|
+
writeEntryWithHook(hippoRoot, entry, {
|
|
30
|
+
actor: opts.actor,
|
|
31
|
+
afterWrite: auditAs && ((db, globalId) => {
|
|
32
|
+
appendAuditEvent(db, {
|
|
33
|
+
tenantId: auditAs.tenantId,
|
|
34
|
+
actor: auditAs.actor,
|
|
35
|
+
op: 'promote',
|
|
36
|
+
targetId: globalId,
|
|
37
|
+
metadata: { sourceId },
|
|
38
|
+
});
|
|
39
|
+
}),
|
|
40
|
+
});
|
|
41
|
+
}
|
|
20
42
|
/** writeEntry for each of `entries` in one transaction, so all land or none; each
|
|
21
43
|
* keeps its audit row, and mirrors follow the commit. Returns how many were written; an empty list opens no store. */
|
|
22
44
|
export function writeEntriesTogether(hippoRoot, entries) {
|
|
@@ -44,7 +66,8 @@ export function writeEntriesTogether(hippoRoot, entries) {
|
|
|
44
66
|
return stamped.length;
|
|
45
67
|
}
|
|
46
68
|
/** Runs `fill` in one transaction; each `put` writes one entry and returns false when the store rejects its value,
|
|
47
|
-
* leaving that row's refusal audit and the rest of the batch. Mirrors follow the commit. Returns how many were
|
|
69
|
+
* leaving that row's refusal audit and the rest of the batch. Mirrors follow the commit. Returns how many were
|
|
70
|
+
* written. */
|
|
48
71
|
export function writeEntriesSkippingRejected(hippoRoot, fill, actor = 'cli') {
|
|
49
72
|
const written = [];
|
|
50
73
|
onHandle(hippoRoot, (db) => {
|
|
@@ -99,8 +122,9 @@ function writeEntryOn(db, hippoRoot, entry, opts) {
|
|
|
99
122
|
throw error;
|
|
100
123
|
}
|
|
101
124
|
}
|
|
102
|
-
/** DB-only write path: upsert, afterWrite hook and audit row inside one withWriteScope; the caller owns `db` and must
|
|
103
|
-
* outer tx commits, so a rolled-back tx never leaves orphan markdown. The audit row
|
|
125
|
+
/** DB-only write path: upsert, afterWrite hook and audit row inside one withWriteScope; the caller owns `db` and must
|
|
126
|
+
* call `writeEntryMirrors` after any outer tx commits, so a rolled-back tx never leaves orphan markdown. The audit row
|
|
127
|
+
* commits atomically with the INSERT. */
|
|
104
128
|
export function writeEntryDbOnly(db, entry, opts) {
|
|
105
129
|
// Inside a caller's transaction (e.g. supersede's BEGIN IMMEDIATE) the scope is a SAVEPOINT,
|
|
106
130
|
// so a throw here rolls back only this write and leaves the outer open.
|
|
@@ -112,16 +136,17 @@ export function writeEntryDbOnly(db, entry, opts) {
|
|
|
112
136
|
auditEntryWrite(db, entry, opts?.actor ?? 'cli');
|
|
113
137
|
});
|
|
114
138
|
}
|
|
115
|
-
/** What follows a row's upsert inside its write scope: the remember row, last of the write's audit rows, then the
|
|
139
|
+
/** What follows a row's upsert inside its write scope: the remember row, last of the write's audit rows, then the
|
|
140
|
+
* summary parent's dirty mark. */
|
|
116
141
|
export function auditEntryWrite(db, entry, actor) {
|
|
117
142
|
audit(db, 'remember', { targetId: entry.id, metadata: {
|
|
118
143
|
kind: entry.kind ?? 'distilled',
|
|
119
144
|
scope: entry.scope ?? null,
|
|
120
|
-
}, actor, tenantId: entry.
|
|
145
|
+
}, actor, tenantId: entry.tenant_id });
|
|
121
146
|
// A child write marks its summary parent dirty for the sleep-cycle rebuild; most writes
|
|
122
147
|
// have no parent, so the hot path pays one null check.
|
|
123
148
|
if (entry.dag_parent_id) {
|
|
124
|
-
markSummaryDirtyInTx(db, entry.dag_parent_id, entry.
|
|
149
|
+
markSummaryDirtyInTx(db, entry.dag_parent_id, entry.tenant_id, actor);
|
|
125
150
|
}
|
|
126
151
|
}
|
|
127
152
|
/** Markdown mirror path, invoked AFTER commit (a rolled-back tx must leave no orphan markdown). */
|
|
@@ -149,7 +174,8 @@ export function strengthenRetrieved(hippoRoot, ids, opts) {
|
|
|
149
174
|
closeHippoDb(db);
|
|
150
175
|
}
|
|
151
176
|
}
|
|
152
|
-
/** strengthenRetrieved on an open handle in its own write scope, a savepoint inside a caller's transaction, so a
|
|
177
|
+
/** strengthenRetrieved on an open handle in its own write scope, a savepoint inside a caller's transaction, so a
|
|
178
|
+
* recall's last writes share one handle. */
|
|
153
179
|
export function strengthenRetrievedInOwnTx(db, ids, opts) {
|
|
154
180
|
if (ids.length === 0 || opts.recallBoostAblated)
|
|
155
181
|
return new Set();
|
|
@@ -164,6 +190,8 @@ export function strengthenRetrievedInOwnTx(db, ids, opts) {
|
|
|
164
190
|
function warnStrengthenFailed(error) {
|
|
165
191
|
log.warn(`retrieval stats not saved (${errorMessage(error)})`);
|
|
166
192
|
}
|
|
193
|
+
/** Rows per recall-write statement: five bound values each, far under SQLite's parameter limit. */
|
|
194
|
+
const RETRIEVAL_UPDATE_CHUNK = 100;
|
|
167
195
|
/** strengthenRetrieved on the caller's handle, inside the caller's transaction. Throws; the caller decides. */
|
|
168
196
|
export function strengthenRetrievedOn(db, ids, opts) {
|
|
169
197
|
const found = new Set();
|
|
@@ -171,25 +199,31 @@ export function strengthenRetrievedOn(db, ids, opts) {
|
|
|
171
199
|
return found;
|
|
172
200
|
const byId = selectEntriesByIds(db, ids, opts.tenantId);
|
|
173
201
|
const live = [...new Set(ids)].flatMap((id) => byId.get(id) ?? []);
|
|
174
|
-
const
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
202
|
+
const updated = markRetrieved(live, undefined, { ablation: strengthAblation() });
|
|
203
|
+
// One UPDATE ... FROM per chunk of rows instead of one statement per row.
|
|
204
|
+
for (const chunk of chunked(updated, RETRIEVAL_UPDATE_CHUNK)) {
|
|
205
|
+
const values = chunk.map(() => '(?, ?, ?, ?, ?)').join(', ');
|
|
206
|
+
db.prepare(`WITH v(id, rc, lr, hl, st) AS (VALUES ${values})
|
|
207
|
+
UPDATE memories SET retrieval_count = v.rc, last_retrieved = v.lr, half_life_days = v.hl, strength = v.st
|
|
208
|
+
FROM v WHERE memories.id = v.id`).run(...chunk.flatMap((e) => [e.id, e.retrieval_count, e.last_retrieved, e.half_life_days, e.strength]));
|
|
209
|
+
for (const e of chunk)
|
|
210
|
+
found.add(e.id);
|
|
178
211
|
}
|
|
179
212
|
return found;
|
|
180
213
|
}
|
|
181
214
|
/** Rewrites a live row's tags and its full-text row on the caller's transaction, with no audit row. */
|
|
182
215
|
export function setEntryTagsInTx(db, entry) {
|
|
183
216
|
db.prepare(`UPDATE memories SET tags_json = ?, updated_at = datetime('now') WHERE id = ? AND tenant_id = ?`)
|
|
184
|
-
.run(JSON.stringify(entry.tags), entry.id, entry.
|
|
217
|
+
.run(JSON.stringify(entry.tags), entry.id, entry.tenant_id);
|
|
185
218
|
syncFtsRow(db, entry);
|
|
186
219
|
}
|
|
187
|
-
/** Removes a row from `memories` and full-text search on the caller's transaction, as sleep's dormant move does, and
|
|
220
|
+
/** Removes a row from `memories` and full-text search on the caller's transaction, as sleep's dormant move does, and
|
|
221
|
+
* marks its summary parent dirty. */
|
|
188
222
|
export function deleteEntryRowInTx(db, entry, actor) {
|
|
189
|
-
db.prepare('DELETE FROM memories WHERE id = ? AND tenant_id = ?').run(entry.id, entry.
|
|
223
|
+
db.prepare('DELETE FROM memories WHERE id = ? AND tenant_id = ?').run(entry.id, entry.tenant_id);
|
|
190
224
|
deleteFtsRow(db, entry.id);
|
|
191
225
|
if (entry.dag_parent_id)
|
|
192
|
-
markSummaryDirtyInTx(db, entry.dag_parent_id, entry.
|
|
226
|
+
markSummaryDirtyInTx(db, entry.dag_parent_id, entry.tenant_id, actor);
|
|
193
227
|
}
|
|
194
228
|
/** One half-life per memory id, on the caller's transaction. */
|
|
195
229
|
export function setHalfLivesAt(db, rows) {
|
|
@@ -199,8 +233,7 @@ export function setHalfLivesAt(db, rows) {
|
|
|
199
233
|
}
|
|
200
234
|
/** Moves every row of `from` in a tenant to project `into`. */
|
|
201
235
|
export function restampOriginProjectAt(db, tenantId, from, into) {
|
|
202
|
-
db.prepare(`UPDATE memories SET origin_project = ?, updated_at = datetime('now') WHERE tenant_id = ? AND origin_project = ?`)
|
|
203
|
-
.run(into, tenantId, from);
|
|
236
|
+
db.prepare(`UPDATE memories SET origin_project = ?, updated_at = datetime('now') WHERE tenant_id = ? AND origin_project = ?`).run(into, tenantId, from);
|
|
204
237
|
}
|
|
205
238
|
/** Stamps each id with its project. */
|
|
206
239
|
export function stampOriginProjectsAt(db, tenantId, rows) {
|
|
@@ -210,18 +243,24 @@ export function stampOriginProjectsAt(db, tenantId, rows) {
|
|
|
210
243
|
}
|
|
211
244
|
/** Renames a live row's source from `from` to `to`; the count is 0 when another writer moved or superseded it first. */
|
|
212
245
|
export function renameEntrySourceAt(db, tenantId, id, from, to) {
|
|
213
|
-
const moved = db
|
|
246
|
+
const moved = db
|
|
247
|
+
.prepare(`UPDATE memories SET source = ? WHERE id = ? AND tenant_id = ? AND source = ? AND superseded_by IS NULL`)
|
|
248
|
+
.run(to, id, tenantId, from);
|
|
214
249
|
return Number(moved.changes ?? 0);
|
|
215
250
|
}
|
|
216
251
|
/** Renames a row's source and, when `origin` is not null, its project; the count is 0 when the row is gone or moved. */
|
|
217
252
|
export function renameEntrySourceAndOriginAt(db, tenantId, id, options) {
|
|
218
253
|
const { from, to, origin } = options;
|
|
219
|
-
const done = db
|
|
254
|
+
const done = db
|
|
255
|
+
.prepare(`UPDATE memories SET source = ?, origin_project = COALESCE(?, origin_project) WHERE id = ? AND tenant_id = ? ` +
|
|
256
|
+
`AND source = ?`)
|
|
257
|
+
.run(to, origin, id, tenantId, from);
|
|
220
258
|
return Number(done.changes ?? 0);
|
|
221
259
|
}
|
|
222
260
|
/** Marks `id` superseded by `newId`; false when another writer superseded it first. */
|
|
223
261
|
export function supersedeEntryAt(db, tenantId, id, newId) {
|
|
224
|
-
const result = db
|
|
262
|
+
const result = db
|
|
263
|
+
.prepare(`UPDATE memories SET superseded_by = ? WHERE id = ? AND tenant_id = ? AND superseded_by IS NULL`)
|
|
225
264
|
.run(newId, id, tenantId);
|
|
226
265
|
return Number(result.changes ?? 0) !== 0;
|
|
227
266
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// The failure log on a handle of its own, for code that has a folder and no connection.
|
|
2
2
|
import { onHandle } from './open.js';
|
|
3
|
-
import { recordFailure, requestOutcome, settleFailureOutcome } from './failure-log.js';
|
|
3
|
+
import { recordFailure, requestOutcome, settleFailureOutcome, } from './failure-log.js';
|
|
4
4
|
/** {@link recordFailure} on a handle of its own. */
|
|
5
5
|
export function recordFailureAt(hippoRoot, event) {
|
|
6
6
|
return onHandle(hippoRoot, (db) => recordFailure(db, event));
|
|
@@ -30,9 +30,11 @@ export interface FailureEvent {
|
|
|
30
30
|
}
|
|
31
31
|
/** Prune rows past {@link FAILURE_LOG_RETENTION_DAYS}, then append one failure row; returns the new row's id. */
|
|
32
32
|
export declare function recordFailure(db: DatabaseSyncLike, event: FailureEvent): number;
|
|
33
|
-
/** The outcome logged for a caller's request id, or null, so a retried send finds the first one; another session's id
|
|
33
|
+
/** The outcome logged for a caller's request id, or null, so a retried send finds the first one; another session's id
|
|
34
|
+
* is a ConflictError. */
|
|
34
35
|
export declare function requestOutcome(db: DatabaseSyncLike, tenantId: string, requestId: string, sessionId: string): FailureOutcome | null;
|
|
35
|
-
/** A retry that stored what the first try could not rewrites that row, since the request id allows one row per
|
|
36
|
+
/** A retry that stored what the first try could not rewrites that row, since the request id allows one row per
|
|
37
|
+
* tenant. */
|
|
36
38
|
export declare function settleFailureOutcome(db: DatabaseSyncLike, tenantId: string, requestId: string, outcome: FailureOutcome): void;
|
|
37
39
|
/** Rated failures and repeats in one session, for {@link failuresBySession}. */
|
|
38
40
|
export interface SessionFailures {
|
|
@@ -12,22 +12,29 @@ export function recordFailure(db, event) {
|
|
|
12
12
|
// Prune first: nothing after the insert can throw, so a returned id always means a committed row.
|
|
13
13
|
const cutoff = new Date(Date.parse(now) - FAILURE_LOG_RETENTION_DAYS * DAY_MS).toISOString();
|
|
14
14
|
db.prepare(`DELETE FROM failure_log WHERE ts < ?`).run(cutoff);
|
|
15
|
-
const inserted = db
|
|
16
|
-
|
|
15
|
+
const inserted = db
|
|
16
|
+
.prepare(`INSERT INTO failure_log (ts, tenant_id, session_id, tool, outcome, skip_rule, sig_hash, detail_hash, ` +
|
|
17
|
+
`owner_subject, origin_project, request_id)
|
|
18
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
19
|
+
.run(now, event.tenantId, event.sessionId?.slice(0, MAX_FIELD) ?? null, event.tool?.slice(0, MAX_FIELD) ?? null, event.outcome, event.rule ?? null, event.sigHash ?? null, event.detailHash ?? null, event.ownerSubject ?? null, event.originProject ?? null, event.requestId ?? null);
|
|
17
20
|
return Number(inserted.lastInsertRowid);
|
|
18
21
|
}
|
|
19
|
-
/** The outcome logged for a caller's request id, or null, so a retried send finds the first one; another session's id
|
|
22
|
+
/** The outcome logged for a caller's request id, or null, so a retried send finds the first one; another session's id
|
|
23
|
+
* is a ConflictError. */
|
|
20
24
|
export function requestOutcome(db, tenantId, requestId, sessionId) {
|
|
21
|
-
const row = db
|
|
25
|
+
const row = db
|
|
26
|
+
.prepare(`SELECT outcome, session_id FROM failure_log WHERE tenant_id = ? AND request_id = ?`)
|
|
22
27
|
.get(tenantId, requestId);
|
|
23
28
|
if (row === undefined)
|
|
24
29
|
return null;
|
|
25
30
|
// Sessions are owner-bound, so this also keeps one owner from reading or settling another's row; compared as stored.
|
|
26
|
-
if (row.session_id !== sessionId.slice(0, MAX_FIELD))
|
|
31
|
+
if (row.session_id !== sessionId.slice(0, MAX_FIELD)) {
|
|
27
32
|
throw new ConflictError('request id belongs to another session');
|
|
33
|
+
}
|
|
28
34
|
return row.outcome;
|
|
29
35
|
}
|
|
30
|
-
/** A retry that stored what the first try could not rewrites that row, since the request id allows one row per
|
|
36
|
+
/** A retry that stored what the first try could not rewrites that row, since the request id allows one row per
|
|
37
|
+
* tenant. */
|
|
31
38
|
export function settleFailureOutcome(db, tenantId, requestId, outcome) {
|
|
32
39
|
db.prepare(`UPDATE failure_log SET outcome = ? WHERE tenant_id = ? AND request_id = ?`).run(outcome, tenantId, requestId);
|
|
33
40
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { DatabaseSyncLike } from '../db/index.js';
|
|
2
2
|
import type { MemoryEntry } from '../core/memory.js';
|
|
3
3
|
export type GatedWriteResult = 'written' | 'skipped:not-worth-storing' | 'skipped:secret' | 'skipped:rejected';
|
|
4
|
-
/** Runs on the caller's handle so it nests in the caller's transaction (writeEntry would open a second handle and wait
|
|
5
|
-
* caller mirrors after commit with an entry it stamped itself. The rejection audit lands inside that
|
|
6
|
-
* a batch that rolls back stays `summarised` and replay writes the audit again. */
|
|
4
|
+
/** Runs on the caller's handle so it nests in the caller's transaction (writeEntry would open a second handle and wait
|
|
5
|
+
* on that lock); the caller mirrors after commit with an entry it stamped itself. The rejection audit lands inside that
|
|
6
|
+
* transaction, which is safe because a batch that rolls back stays `summarised` and replay writes the audit again. */
|
|
7
7
|
export declare function gatedWrite(db: DatabaseSyncLike, hippoRoot: string, entry: MemoryEntry, opts?: {
|
|
8
8
|
actor?: string;
|
|
9
9
|
worthCheck?: boolean;
|
|
@@ -5,9 +5,9 @@ import { detectSecret } from '../util/secret-detect.js';
|
|
|
5
5
|
import { auditRejectionRefusal } from './audit-event.js';
|
|
6
6
|
import { stampOriginProject } from './entry-row.js';
|
|
7
7
|
import { writeEntryDbOnly } from './entry-writes.js';
|
|
8
|
-
/** Runs on the caller's handle so it nests in the caller's transaction (writeEntry would open a second handle and wait
|
|
9
|
-
* caller mirrors after commit with an entry it stamped itself. The rejection audit lands inside that
|
|
10
|
-
* a batch that rolls back stays `summarised` and replay writes the audit again. */
|
|
8
|
+
/** Runs on the caller's handle so it nests in the caller's transaction (writeEntry would open a second handle and wait
|
|
9
|
+
* on that lock); the caller mirrors after commit with an entry it stamped itself. The rejection audit lands inside that
|
|
10
|
+
* transaction, which is safe because a batch that rolls back stays `summarised` and replay writes the audit again. */
|
|
11
11
|
export function gatedWrite(db, hippoRoot, entry, opts) {
|
|
12
12
|
// Off for imported agent memories: a person wrote those notes, and a one-line preference fails the check.
|
|
13
13
|
if (opts?.worthCheck !== false && !isContentWorthStoring(entry.content))
|
package/dist/store/goals.d.ts
CHANGED
|
@@ -60,7 +60,6 @@ export interface GetActiveGoalsOpts {
|
|
|
60
60
|
sessionId: string;
|
|
61
61
|
tenantId: string;
|
|
62
62
|
}
|
|
63
|
-
export declare function getActiveGoals(hippoRoot: string, opts: GetActiveGoalsOpts): Goal[];
|
|
64
63
|
/** A session's active goals, oldest first, and the retrieval policy of each goal that names one. */
|
|
65
64
|
export interface ActiveGoals {
|
|
66
65
|
readonly goals: Goal[];
|
|
@@ -82,12 +81,14 @@ export interface GoalRecallLogRow {
|
|
|
82
81
|
/** The rows whose memory lives in this store: goal_recall_log.memory_id references memories, so a global row would fail
|
|
83
82
|
* the insert. A global result keeps its boost; it only earns no log row, so no outcome propagation. */
|
|
84
83
|
export declare function localGoalRecallRows(db: DatabaseSyncLike, rows: readonly GoalRecallLogRow[]): GoalRecallLogRow[];
|
|
85
|
-
/** INSERT OR IGNORE: UNIQUE(memory_id, goal_id) makes a re-recall during the same goal life a no-op for outcome
|
|
84
|
+
/** INSERT OR IGNORE: UNIQUE(memory_id, goal_id) makes a re-recall during the same goal life a no-op for outcome
|
|
85
|
+
* attribution. */
|
|
86
86
|
export declare function writeGoalRecallLog(db: DatabaseSyncLike, rows: readonly GoalRecallLogRow[]): void;
|
|
87
87
|
export interface CompleteGoalOpts {
|
|
88
88
|
outcomeScore?: number;
|
|
89
|
-
/** When true, skip the strength-multiplier propagation (default false); status still goes to 'completed' and
|
|
90
|
-
* The idempotency guard returns early on a second `completeGoal` call before this
|
|
89
|
+
/** When true, skip the strength-multiplier propagation (default false); status still goes to 'completed' and
|
|
90
|
+
* `outcome_score` is still recorded. The idempotency guard returns early on a second `completeGoal` call before this
|
|
91
|
+
* flag is read. */
|
|
91
92
|
noPropagate?: boolean;
|
|
92
93
|
}
|
|
93
94
|
export declare function completeGoal(hippoRoot: string, goalId: string, opts: CompleteGoalOpts): void;
|
package/dist/store/goals.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { randomUUID } from 'node:crypto';
|
|
3
3
|
import { withWriteScope } from '../db/index.js';
|
|
4
4
|
import { onHandle } from './open.js';
|
|
5
|
+
import { placeholders } from '../util/sql.js';
|
|
5
6
|
const MAX_ACTIVE_GOAL_DEPTH = 3;
|
|
6
7
|
export function rowToGoal(row) {
|
|
7
8
|
return {
|
|
@@ -24,8 +25,8 @@ export function pushGoal(hippoRoot, opts) {
|
|
|
24
25
|
return pushGoalWithDb(db, opts);
|
|
25
26
|
});
|
|
26
27
|
}
|
|
27
|
-
/** Depth-cap enforcer for pushGoalWithDb and resumeGoal: suspends the oldest `overflow` goals; **caller MUST be inside
|
|
28
|
-
* @internal Internal goal-stack invariant. Subject to change. */
|
|
28
|
+
/** Depth-cap enforcer for pushGoalWithDb and resumeGoal: suspends the oldest `overflow` goals; **caller MUST be inside
|
|
29
|
+
* a `BEGIN IMMEDIATE` transaction**. @internal Internal goal-stack invariant. Subject to change. */
|
|
29
30
|
function enforceDepthCapWithinTx(db, tenantId, sessionId) {
|
|
30
31
|
// SAFETY: the row comes from the SELECT above, which projects exactly one
|
|
31
32
|
// column, `c`, as a COUNT(*).
|
|
@@ -105,11 +106,6 @@ function insertRetrievalPolicy(db, goalId, policy) {
|
|
|
105
106
|
db.prepare(`UPDATE goal_stack SET retrieval_policy_id = ? WHERE id = ?`).run(policyId, goalId);
|
|
106
107
|
return policyId;
|
|
107
108
|
}
|
|
108
|
-
export function getActiveGoals(hippoRoot, opts) {
|
|
109
|
-
return onHandle(hippoRoot, (db) => {
|
|
110
|
-
return getActiveGoalsWithDb(db, opts);
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
109
|
/** The active goals and their policies on one handle, so a goal and its policy never disagree. */
|
|
114
110
|
export function activeGoalsWithPolicies(hippoRoot, opts) {
|
|
115
111
|
return onHandle(hippoRoot, (db) => {
|
|
@@ -143,7 +139,8 @@ function getActiveGoalsWithDb(db, opts) {
|
|
|
143
139
|
`).all(opts.tenantId, opts.sessionId);
|
|
144
140
|
return rows.map(rowToGoal);
|
|
145
141
|
}
|
|
146
|
-
// Per-goal retrieval_policy multipliers compose onto the base goal-tag boost and are hard-capped at
|
|
142
|
+
// Per-goal retrieval_policy multipliers compose onto the base goal-tag boost and are hard-capped at
|
|
143
|
+
// MAX_FINAL_MULTIPLIER (3.0x) before scoring.
|
|
147
144
|
function loadGoalPolicies(db, active) {
|
|
148
145
|
const policiesByGoalId = new Map();
|
|
149
146
|
const policyIds = [...new Set(active.flatMap((g) => (g.retrievalPolicyId ? [g.retrievalPolicyId] : [])))];
|
|
@@ -152,7 +149,7 @@ function loadGoalPolicies(db, active) {
|
|
|
152
149
|
// SAFETY: the SELECT projects exactly these seven retrieval_policy columns; MAX_ACTIVE_GOAL_DEPTH bounds the IN list.
|
|
153
150
|
const rows = db.prepare(`
|
|
154
151
|
SELECT id, goal_id, policy_type, weight_schema_fit, weight_recency, weight_outcome, error_priority
|
|
155
|
-
FROM retrieval_policy WHERE id IN (${policyIds.
|
|
152
|
+
FROM retrieval_policy WHERE id IN (${placeholders(policyIds.length)})
|
|
156
153
|
`).all(...policyIds);
|
|
157
154
|
const byId = new Map(rows.map((row) => [row.id, row]));
|
|
158
155
|
for (const g of active) {
|
|
@@ -178,11 +175,12 @@ export function localGoalRecallRows(db, rows) {
|
|
|
178
175
|
return [];
|
|
179
176
|
const ids = [...new Set(rows.map((r) => r.memoryId))];
|
|
180
177
|
// SAFETY: the SELECT projects exactly one column, `id`, from memories.
|
|
181
|
-
const local = db.prepare(`SELECT id FROM memories WHERE id IN (${ids.
|
|
178
|
+
const local = db.prepare(`SELECT id FROM memories WHERE id IN (${placeholders(ids.length)})`).all(...ids);
|
|
182
179
|
const localIds = new Set(local.map((r) => r.id));
|
|
183
180
|
return rows.filter((r) => localIds.has(r.memoryId));
|
|
184
181
|
}
|
|
185
|
-
/** INSERT OR IGNORE: UNIQUE(memory_id, goal_id) makes a re-recall during the same goal life a no-op for outcome
|
|
182
|
+
/** INSERT OR IGNORE: UNIQUE(memory_id, goal_id) makes a re-recall during the same goal life a no-op for outcome
|
|
183
|
+
* attribution. */
|
|
186
184
|
export function writeGoalRecallLog(db, rows) {
|
|
187
185
|
if (rows.length === 0)
|
|
188
186
|
return;
|
|
@@ -225,7 +223,8 @@ export function completeGoal(hippoRoot, goalId, opts) {
|
|
|
225
223
|
else if (score < NEGATIVE_OUTCOME_THRESHOLD)
|
|
226
224
|
multiplier = STRENGTH_DECAY;
|
|
227
225
|
if (multiplier !== 1) {
|
|
228
|
-
// Lifespan window: only recalls during this goal's active life; UNIQUE(memory_id, goal_id) gives one
|
|
226
|
+
// Lifespan window: only recalls during this goal's active life; UNIQUE(memory_id, goal_id) gives one
|
|
227
|
+
// adjustment per pair.
|
|
229
228
|
db.prepare(`
|
|
230
229
|
UPDATE memories
|
|
231
230
|
SET strength = MIN(1.0, MAX(0.0, strength * ?))
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { GraphOp, StoredGraph } from './graph-rows.js';
|
|
2
|
+
export interface ApplyGraphOpsResult {
|
|
3
|
+
readonly next: number;
|
|
4
|
+
readonly skipped: number;
|
|
5
|
+
}
|
|
6
|
+
export interface ApplyGraphOpsOptions {
|
|
7
|
+
readonly from: number;
|
|
8
|
+
readonly holdMs: number;
|
|
9
|
+
readonly clock?: () => number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Applies `ops` from index `opts.from` in one rebuild transaction and stops at the first op boundary past
|
|
13
|
+
* `opts.holdMs`.
|
|
14
|
+
* Returns where the next chunk starts and how many ops were skipped as stale. */
|
|
15
|
+
export declare function applyGraphOps(hippoRoot: string, tenantId: string, ops: readonly GraphOp[], opts: ApplyGraphOpsOptions & {
|
|
16
|
+
readonly busyWaitMs?: number;
|
|
17
|
+
}): ApplyGraphOpsResult;
|
|
18
|
+
/** Reads the stored graph, diffs it with `diff` and applies every op under one lock, so two concurrent rebuilds
|
|
19
|
+
* serialize instead of both inserting a missing row. Returns how many ops were skipped as stale. */
|
|
20
|
+
export declare function rebuildGraphUnderLock(hippoRoot: string, tenantId: string, memoryIds: readonly string[], diff: (stored: StoredGraph) => readonly GraphOp[]): number;
|
|
21
|
+
//# sourceMappingURL=graph-apply.d.ts.map
|
|
@@ -1,15 +1,21 @@
|
|
|
1
|
-
// Applies a rebuild's op list on the caller's transaction. The statements and the consolidated-source guard sit in the store's graph writers.
|
|
2
|
-
import { assertTenantId } from '../store/tenant.js';
|
|
3
1
|
import { clock } from '../util/write-budget.js';
|
|
4
|
-
import {
|
|
2
|
+
import { storedGraphOn } from './graph-reads.js';
|
|
3
|
+
import { deleteEntityRow, deleteRelationRow, entityIdBySource, insertEntityRow, insertRelationRow, objectInForce, relationPresent, runGraphRebuildTransaction, updateEntityRow, } from './graph-writes.js';
|
|
5
4
|
function insertDesiredRelation(db, tenantId, rel) {
|
|
6
5
|
const fromEntityId = entityIdBySource(db, tenantId, rel.from.entityType, rel.from.sourceObject);
|
|
7
6
|
const toEntityId = entityIdBySource(db, tenantId, rel.to.entityType, rel.to.sourceObject);
|
|
8
|
-
if (fromEntityId === undefined || toEntityId === undefined || !objectInForce(db, tenantId, rel.sourceObject))
|
|
7
|
+
if (fromEntityId === undefined || toEntityId === undefined || !objectInForce(db, tenantId, rel.sourceObject)) {
|
|
9
8
|
return false;
|
|
9
|
+
}
|
|
10
10
|
if (relationPresent(db, tenantId, fromEntityId, toEntityId, rel.relType))
|
|
11
11
|
return false;
|
|
12
|
-
insertRelationRow(db, tenantId, {
|
|
12
|
+
insertRelationRow(db, tenantId, {
|
|
13
|
+
fromEntityId,
|
|
14
|
+
toEntityId,
|
|
15
|
+
relType: rel.relType,
|
|
16
|
+
memoryId: rel.memoryId,
|
|
17
|
+
sourceObject: rel.sourceObject,
|
|
18
|
+
});
|
|
13
19
|
return true;
|
|
14
20
|
}
|
|
15
21
|
/** Applies one op; false when a writer since the diff made it stale, which the next run's diff repairs. */
|
|
@@ -27,18 +33,17 @@ function applyGraphOp(db, tenantId, op) {
|
|
|
27
33
|
return updateEntityRow(db, tenantId, op.id, op.entity) !== null;
|
|
28
34
|
case 'insertEntity':
|
|
29
35
|
// A mirrorless object closed since the load is never enqueued again, so a stale insert would stay for good.
|
|
30
|
-
if (!objectInForce(db, tenantId, op.entity.sourceObject) ||
|
|
36
|
+
if (!objectInForce(db, tenantId, op.entity.sourceObject) ||
|
|
37
|
+
entityIdBySource(db, tenantId, op.entity.entityType, op.entity.sourceObject) !== undefined) {
|
|
31
38
|
return false;
|
|
39
|
+
}
|
|
32
40
|
insertEntityRow(db, tenantId, op.entity);
|
|
33
41
|
return true;
|
|
34
42
|
case 'insertRelation':
|
|
35
43
|
return insertDesiredRelation(db, tenantId, op.relation);
|
|
36
44
|
}
|
|
37
45
|
}
|
|
38
|
-
|
|
39
|
-
* Returns where the next chunk starts and how many ops were skipped as stale. */
|
|
40
|
-
export function applyGraphOps(db, tenantId, ops, opts) {
|
|
41
|
-
assertTenantId('applyGraphOps', tenantId);
|
|
46
|
+
function applyGraphOpsOn(db, tenantId, ops, opts) {
|
|
42
47
|
const now = opts.clock ?? clock;
|
|
43
48
|
const begunAt = now();
|
|
44
49
|
let next = opts.from;
|
|
@@ -52,4 +57,19 @@ export function applyGraphOps(db, tenantId, ops, opts) {
|
|
|
52
57
|
}
|
|
53
58
|
return { next, skipped };
|
|
54
59
|
}
|
|
55
|
-
|
|
60
|
+
/**
|
|
61
|
+
* Applies `ops` from index `opts.from` in one rebuild transaction and stops at the first op boundary past
|
|
62
|
+
* `opts.holdMs`.
|
|
63
|
+
* Returns where the next chunk starts and how many ops were skipped as stale. */
|
|
64
|
+
export function applyGraphOps(hippoRoot, tenantId, ops, opts) {
|
|
65
|
+
return runGraphRebuildTransaction(hippoRoot, tenantId, (db) => applyGraphOpsOn(db, tenantId, ops, opts), { busyWaitMs: opts.busyWaitMs });
|
|
66
|
+
}
|
|
67
|
+
/** Reads the stored graph, diffs it with `diff` and applies every op under one lock, so two concurrent rebuilds
|
|
68
|
+
* serialize instead of both inserting a missing row. Returns how many ops were skipped as stale. */
|
|
69
|
+
export function rebuildGraphUnderLock(hippoRoot, tenantId, memoryIds, diff) {
|
|
70
|
+
return runGraphRebuildTransaction(hippoRoot, tenantId, (db) => {
|
|
71
|
+
const ops = diff(storedGraphOn(db, tenantId, memoryIds));
|
|
72
|
+
return applyGraphOpsOn(db, tenantId, ops, { from: 0, holdMs: Infinity }).skipped;
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=graph-apply.js.map
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
/** Fail-soft producer hook: mark a tenant dirty for graph re-extraction by enqueuing its consolidated mirror memory.
|
|
2
|
-
* must not abort an object write. Call POST-COMMIT from the graph-source save/close
|
|
1
|
+
/** Fail-soft producer hook: mark a tenant dirty for graph re-extraction by enqueuing its consolidated mirror memory.
|
|
2
|
+
* NEVER throws: a failed dirty signal must not abort an object write. Call POST-COMMIT from the graph-source save/close
|
|
3
|
+
* mutations; a null memoryId (forgotten mirror) is a no-op. */
|
|
3
4
|
export declare function markGraphDirty(hippoRoot: string, tenantId: string, memoryId: string | null): void;
|
|
4
|
-
/** Mark every pending item for a tenant with `id <= maxId` processed in one UPDATE (status/processed_at only, so the
|
|
5
|
-
* The watermark excludes items enqueued after the drain snapshot. Returns the
|
|
5
|
+
/** Mark every pending item for a tenant with `id <= maxId` processed in one UPDATE (status/processed_at only, so the
|
|
6
|
+
* source guard trigger is not involved). The watermark excludes items enqueued after the drain snapshot. Returns the
|
|
7
|
+
* count marked. */
|
|
6
8
|
export declare function markPendingProcessedUpTo(hippoRoot: string, tenantId: string, maxId: number): number;
|
|
7
|
-
/** Dirty tenants awaiting graph re-extraction, each with the MAX pending queue id at read time (a watermark);
|
|
8
|
-
* The drain marks only items at or below it processed, so items enqueued DURING
|
|
9
|
+
/** Dirty tenants awaiting graph re-extraction, each with the MAX pending queue id at read time (a watermark);
|
|
10
|
+
* host-wide, as sleep is cross-tenant. The drain marks only items at or below it processed, so items enqueued DURING
|
|
11
|
+
* the rebuild stay pending (no lost update). */
|
|
9
12
|
export declare function loadPendingExtractionTenants(hippoRoot: string): {
|
|
10
13
|
tenantId: string;
|
|
11
14
|
maxPendingId: number;
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
// The graph extraction queue: the consolidated memories that wait for a graph rebuild, and the watermark the sleep
|
|
1
|
+
// The graph extraction queue: the consolidated memories that wait for a graph rebuild, and the watermark the sleep
|
|
2
|
+
// drain marks them by.
|
|
2
3
|
import { onHandle } from './open.js';
|
|
3
4
|
import { assertTenantId } from './tenant.js';
|
|
4
|
-
import { errorMessage, log } from '../util/log.js';
|
|
5
|
+
import { errorMessage, log, errorFields } from '../util/log.js';
|
|
5
6
|
import { rowToQueueItem, QUEUE_COLS } from './graph-rows.js';
|
|
6
7
|
import { resolveConsolidatedSource } from './graph-writes.js';
|
|
7
|
-
/** Enqueue a consolidated memory for later graph extraction; rejects a raw / missing / cross-tenant memory (the DB
|
|
8
|
+
/** Enqueue a consolidated memory for later graph extraction; rejects a raw / missing / cross-tenant memory (the DB
|
|
9
|
+
* trigger is the backstop). */
|
|
8
10
|
function enqueueExtraction(hippoRoot, tenantId, memoryId) {
|
|
9
11
|
assertTenantId('enqueueExtraction', tenantId);
|
|
10
12
|
const now = new Date().toISOString();
|
|
@@ -24,8 +26,9 @@ function enqueueExtraction(hippoRoot, tenantId, memoryId) {
|
|
|
24
26
|
return rowToQueueItem(row);
|
|
25
27
|
});
|
|
26
28
|
}
|
|
27
|
-
/** Fail-soft producer hook: mark a tenant dirty for graph re-extraction by enqueuing its consolidated mirror memory.
|
|
28
|
-
* must not abort an object write. Call POST-COMMIT from the graph-source save/close
|
|
29
|
+
/** Fail-soft producer hook: mark a tenant dirty for graph re-extraction by enqueuing its consolidated mirror memory.
|
|
30
|
+
* NEVER throws: a failed dirty signal must not abort an object write. Call POST-COMMIT from the graph-source save/close
|
|
31
|
+
* mutations; a null memoryId (forgotten mirror) is a no-op. */
|
|
29
32
|
export function markGraphDirty(hippoRoot, tenantId, memoryId) {
|
|
30
33
|
if (!memoryId)
|
|
31
34
|
return;
|
|
@@ -35,11 +38,12 @@ export function markGraphDirty(hippoRoot, tenantId, memoryId) {
|
|
|
35
38
|
catch (err) {
|
|
36
39
|
// Logged (warn) so a SYSTEMATIC enqueue failure surfaces to operators, but
|
|
37
40
|
// swallowed so the already-committed object write is never rolled back.
|
|
38
|
-
log.warn(`markGraphDirty: enqueue failed for tenant=${tenantId} memory=${memoryId}: ${errorMessage(err)}
|
|
41
|
+
log.warn(`markGraphDirty: enqueue failed for tenant=${tenantId} memory=${memoryId}: ${errorMessage(err)}`, errorFields(err));
|
|
39
42
|
}
|
|
40
43
|
}
|
|
41
|
-
/** Mark every pending item for a tenant with `id <= maxId` processed in one UPDATE (status/processed_at only, so the
|
|
42
|
-
* The watermark excludes items enqueued after the drain snapshot. Returns the
|
|
44
|
+
/** Mark every pending item for a tenant with `id <= maxId` processed in one UPDATE (status/processed_at only, so the
|
|
45
|
+
* source guard trigger is not involved). The watermark excludes items enqueued after the drain snapshot. Returns the
|
|
46
|
+
* count marked. */
|
|
43
47
|
export function markPendingProcessedUpTo(hippoRoot, tenantId, maxId) {
|
|
44
48
|
assertTenantId('markPendingProcessedUpTo', tenantId);
|
|
45
49
|
const now = new Date().toISOString();
|
|
@@ -52,8 +56,9 @@ export function markPendingProcessedUpTo(hippoRoot, tenantId, maxId) {
|
|
|
52
56
|
return Number(res.changes ?? 0);
|
|
53
57
|
});
|
|
54
58
|
}
|
|
55
|
-
/** Dirty tenants awaiting graph re-extraction, each with the MAX pending queue id at read time (a watermark);
|
|
56
|
-
* The drain marks only items at or below it processed, so items enqueued DURING
|
|
59
|
+
/** Dirty tenants awaiting graph re-extraction, each with the MAX pending queue id at read time (a watermark);
|
|
60
|
+
* host-wide, as sleep is cross-tenant. The drain marks only items at or below it processed, so items enqueued DURING
|
|
61
|
+
* the rebuild stay pending (no lost update). */
|
|
57
62
|
export function loadPendingExtractionTenants(hippoRoot) {
|
|
58
63
|
return onHandle(hippoRoot, (db) => {
|
|
59
64
|
// SAFETY: rows' shape matches the two aliased columns (tenant_id, max_id)
|