hippo-memory 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-memories/apply.d.ts +7 -5
- package/dist/agent-memories/apply.js +66 -39
- package/dist/agent-memories/claude-code.d.ts +8 -2
- package/dist/agent-memories/claude-code.js +26 -7
- package/dist/agent-memories/copilot.js +2 -1
- package/dist/agent-memories/files.js +2 -1
- package/dist/agent-memories/legacy.d.ts +6 -3
- package/dist/agent-memories/legacy.js +35 -14
- package/dist/agent-memories/markdown.d.ts +3 -1
- package/dist/agent-memories/markdown.js +3 -1
- package/dist/agent-memories/openclaw.js +5 -2
- package/dist/agent-memories/plan.js +11 -1
- package/dist/agent-memories/project-folds.js +2 -1
- package/dist/agent-memories/report.d.ts +4 -1
- package/dist/agent-memories/report.js +43 -9
- package/dist/agent-memories/source.d.ts +8 -2
- package/dist/agent-memories/source.js +11 -3
- package/dist/agent-memories/sync.d.ts +7 -2
- package/dist/agent-memories/sync.js +141 -101
- package/dist/api/assemble.d.ts +6 -4
- package/dist/api/assemble.js +11 -6
- package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
- package/dist/api/{audit.js → auth/audit.js} +11 -11
- package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -15
- package/dist/api/{auth.js → auth/auth.js} +46 -29
- package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
- package/dist/api/{quarantine.js → auth/quarantine.js} +8 -8
- package/dist/api/auth/session-owners.d.ts +10 -0
- package/dist/api/auth/session-owners.js +35 -0
- package/dist/api/availability.d.ts +3 -1
- package/dist/api/availability.js +3 -1
- package/dist/api/busy.d.ts +2 -0
- package/dist/api/busy.js +2 -0
- package/dist/api/cli-surface.d.ts +6 -0
- package/dist/api/cli-surface.js +6 -0
- package/dist/api/config-of.d.ts +5 -0
- package/dist/api/config-of.js +6 -0
- package/dist/api/context-auto.d.ts +4 -1
- package/dist/api/context-auto.js +10 -2
- package/dist/api/context-render.js +14 -7
- package/dist/api/context-select.d.ts +4 -1
- package/dist/api/context-select.js +23 -14
- package/dist/api/context-types.d.ts +38 -12
- package/dist/api/context.d.ts +8 -5
- package/dist/api/context.js +112 -57
- package/dist/api/continuity.d.ts +24 -21
- package/dist/api/continuity.js +18 -20
- package/dist/api/correction-latency.d.ts +3 -1
- package/dist/api/correction-latency.js +3 -1
- package/dist/api/error-reply.d.ts +4 -1
- package/dist/api/error-reply.js +12 -3
- package/dist/api/index.d.ts +39 -23
- package/dist/api/index.js +21 -23
- package/dist/api/instruction-detect.d.ts +4 -1
- package/dist/api/instruction-detect.js +75 -20
- package/dist/api/ledger-db.d.ts +15 -11
- package/dist/api/ledger-db.js +21 -23
- package/dist/api/memories/conflicts.d.ts +33 -0
- package/dist/api/memories/conflicts.js +67 -0
- package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
- package/dist/api/{forget.js → memories/forget.js} +22 -15
- package/dist/api/memories/memories.d.ts +27 -0
- package/dist/api/{memories.js → memories/memories.js} +16 -21
- package/dist/api/memories/outcome.d.ts +22 -0
- package/dist/api/{outcome.js → memories/outcome.js} +14 -8
- package/dist/api/memories/promote.d.ts +40 -0
- package/dist/api/{promote.js → memories/promote.js} +35 -22
- package/dist/api/memories/refine.d.ts +10 -0
- package/dist/api/memories/refine.js +12 -0
- package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +16 -11
- package/dist/api/{remember-local.js → memories/remember-local.js} +34 -20
- package/dist/api/{remember.d.ts → memories/remember.d.ts} +19 -13
- package/dist/api/{remember.js → memories/remember.js} +42 -26
- package/dist/api/objects/cards.d.ts +39 -0
- package/dist/api/{cards.js → objects/cards.js} +12 -14
- package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
- package/dist/api/{drill-down.js → objects/drill-down.js} +7 -8
- package/dist/api/objects/goals.d.ts +18 -0
- package/dist/api/{goals.js → objects/goals.js} +12 -12
- package/dist/api/objects/graph.d.ts +11 -0
- package/dist/api/objects/graph.js +16 -0
- package/dist/api/objects/objects.d.ts +9 -0
- package/dist/api/{objects.js → objects/objects.js} +2 -4
- package/dist/api/objects/predictions.d.ts +11 -0
- package/dist/api/{predictions.js → objects/predictions.js} +7 -6
- package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
- package/dist/api/{projects.js → objects/projects.js} +8 -4
- package/dist/api/pilot-arm.d.ts +8 -4
- package/dist/api/pilot-arm.js +5 -4
- package/dist/api/prompt-hook.d.ts +32 -19
- package/dist/api/prompt-hook.js +65 -44
- package/dist/api/provenance-coverage.d.ts +3 -1
- package/dist/api/provenance-coverage.js +3 -1
- package/dist/api/recall/finish.d.ts +185 -0
- package/dist/api/recall/finish.js +301 -0
- package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
- package/dist/api/{recall-pipeline.js → recall/pipeline.js} +176 -92
- package/dist/api/recall/recall.d.ts +6 -0
- package/dist/api/{recall.js → recall/recall.js} +101 -60
- package/dist/api/recall/render.d.ts +39 -0
- package/dist/api/recall/render.js +60 -0
- package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
- package/dist/api/recall/request.js +261 -0
- package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
- package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
- package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -70
- package/dist/api/{recall-types.js → recall/types.js} +1 -1
- package/dist/api/session-end.d.ts +16 -12
- package/dist/api/session-end.js +46 -30
- package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
- package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
- package/dist/api/sleep/dormant.d.ts +25 -0
- package/dist/api/sleep/dormant.js +64 -0
- package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
- package/dist/api/sleep/learn.js +138 -0
- package/dist/api/sleep/sleep-run.d.ts +38 -0
- package/dist/api/{sleep-run.js → sleep/sleep-run.js} +51 -43
- package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
- package/dist/api/sleep/sleep.js +9 -0
- package/dist/api/status.d.ts +3 -1
- package/dist/api/status.js +3 -1
- package/dist/api/store-init.d.ts +4 -1
- package/dist/api/store-init.js +4 -1
- package/dist/api/tokens.d.ts +10 -9
- package/dist/api/tokens.js +9 -10
- package/dist/api/types.d.ts +28 -7
- package/dist/api/types.js +13 -4
- package/dist/capture/caller-session.d.ts +8 -2
- package/dist/capture/caller-session.js +16 -6
- package/dist/capture/capture-error.d.ts +3 -1
- package/dist/capture/capture-error.js +3 -1
- package/dist/capture/codex-patch.js +7 -2
- package/dist/capture/command.d.ts +4 -2
- package/dist/capture/command.js +33 -14
- package/dist/capture/compact-resume-caller.js +15 -8
- package/dist/capture/compact.d.ts +8 -5
- package/dist/capture/compact.js +34 -23
- package/dist/capture/compaction-items-caller.js +9 -3
- package/dist/capture/compaction-record.d.ts +4 -3
- package/dist/capture/compaction-record.js +20 -12
- package/dist/capture/compaction-spool.d.ts +15 -4
- package/dist/capture/compaction-spool.js +64 -17
- package/dist/capture/copilot-transcript.d.ts +11 -3
- package/dist/capture/copilot-transcript.js +16 -6
- package/dist/capture/extract.js +20 -8
- package/dist/capture/failure-caller.js +23 -12
- package/dist/capture/failure-reading.d.ts +10 -3
- package/dist/capture/failure-reading.js +24 -7
- package/dist/capture/pre-compact-caller.js +11 -4
- package/dist/capture/session-digest.d.ts +15 -4
- package/dist/capture/session-digest.js +39 -13
- package/dist/capture/session-end-caller.d.ts +4 -1
- package/dist/capture/session-end-caller.js +20 -8
- package/dist/capture/session-texts.d.ts +6 -2
- package/dist/capture/session-texts.js +22 -7
- package/dist/capture/session-worker.d.ts +4 -2
- package/dist/capture/session-worker.js +45 -17
- package/dist/capture/transcript.d.ts +13 -4
- package/dist/capture/transcript.js +32 -10
- package/dist/capture/working-state.d.ts +13 -4
- package/dist/capture/working-state.js +50 -56
- package/dist/cli/api-context.d.ts +14 -2
- package/dist/cli/api-context.js +45 -2
- package/dist/cli/audit.js +23 -23
- package/dist/cli/auth.js +19 -27
- package/dist/cli/briefs.d.ts +1 -1
- package/dist/cli/briefs.js +20 -15
- package/dist/cli/card.d.ts +1 -1
- package/dist/cli/card.js +56 -73
- package/dist/cli/client.d.ts +12 -4
- package/dist/cli/client.js +43 -13
- package/dist/cli/compact-resume-payload.d.ts +4 -1
- package/dist/cli/compact-resume-payload.js +12 -5
- package/dist/cli/context.js +42 -17
- package/dist/cli/continuity.d.ts +5 -5
- package/dist/cli/continuity.js +90 -107
- package/dist/cli/curate.d.ts +4 -3
- package/dist/cli/curate.js +46 -68
- package/dist/cli/dag.d.ts +1 -1
- package/dist/cli/dag.js +14 -17
- package/dist/cli/decisions.js +27 -26
- package/dist/cli/eval.js +16 -21
- package/dist/cli/exit.d.ts +4 -1
- package/dist/cli/exit.js +10 -2
- package/dist/cli/explain.js +12 -11
- package/dist/cli/flag-values.d.ts +1 -1
- package/dist/cli/flag-values.js +9 -18
- package/dist/cli/github.d.ts +6 -0
- package/dist/cli/github.js +25 -13
- package/dist/cli/goals.d.ts +1 -1
- package/dist/cli/goals.js +39 -56
- package/dist/cli/graph.d.ts +1 -1
- package/dist/cli/graph.js +15 -11
- package/dist/cli/hook-runtime.d.ts +31 -9
- package/dist/cli/hook-runtime.js +40 -15
- package/dist/cli/incidents.d.ts +1 -1
- package/dist/cli/incidents.js +25 -25
- package/dist/cli/init.js +26 -11
- package/dist/cli/install-steps.d.ts +12 -3
- package/dist/cli/install-steps.js +42 -18
- package/dist/cli/last-sleep.d.ts +4 -1
- package/dist/cli/last-sleep.js +9 -4
- package/dist/cli/maintenance.d.ts +1 -1
- package/dist/cli/maintenance.js +11 -12
- package/dist/cli/notes.d.ts +1 -1
- package/dist/cli/notes.js +8 -5
- package/dist/cli/object-verbs.d.ts +4 -4
- package/dist/cli/object-verbs.js +10 -13
- package/dist/cli/open-browser.js +11 -2
- package/dist/cli/playbooks.d.ts +3 -3
- package/dist/cli/playbooks.js +40 -32
- package/dist/cli/predictions.js +15 -19
- package/dist/cli/print.js +4 -2
- package/dist/cli/projects.js +21 -11
- package/dist/cli/quality-repair-once.js +5 -4
- package/dist/cli/recall.js +129 -93
- package/dist/cli/refine-llm.d.ts +15 -4
- package/dist/cli/refine-llm.js +16 -7
- package/dist/cli/remember.js +46 -50
- package/dist/cli/scheduler.d.ts +4 -1
- package/dist/cli/scheduler.js +9 -5
- package/dist/cli/serve.js +22 -17
- package/dist/cli/session-hooks.d.ts +2 -2
- package/dist/cli/session-hooks.js +87 -50
- package/dist/cli/setup.js +54 -32
- package/dist/cli/shared.d.ts +3 -1
- package/dist/cli/shared.js +24 -9
- package/dist/cli/slack.js +15 -24
- package/dist/cli/sleep-render.d.ts +3 -1
- package/dist/cli/sleep-render.js +8 -5
- package/dist/cli/sleep.js +14 -6
- package/dist/cli/status.d.ts +4 -4
- package/dist/cli/status.js +32 -27
- package/dist/cli/stdin.d.ts +10 -3
- package/dist/cli/stdin.js +10 -3
- package/dist/cli/transfer.d.ts +1 -1
- package/dist/cli/transfer.js +71 -75
- package/dist/cli/verbs/memory.js +8 -6
- package/dist/cli/verbs/objects.js +10 -4
- package/dist/cli/versioned-verbs.d.ts +8 -7
- package/dist/cli/versioned-verbs.js +31 -21
- package/dist/cli.js +13 -16
- package/dist/connectors/dlq.d.ts +6 -6
- package/dist/connectors/dlq.js +12 -8
- package/dist/connectors/github/backfill.d.ts +4 -4
- package/dist/connectors/github/backfill.js +6 -4
- package/dist/connectors/github/deletion.d.ts +6 -4
- package/dist/connectors/github/deletion.js +5 -5
- package/dist/connectors/github/dlq.d.ts +8 -6
- package/dist/connectors/github/dlq.js +11 -5
- package/dist/connectors/github/ingest.d.ts +2 -2
- package/dist/connectors/github/ingest.js +9 -6
- package/dist/connectors/github/octokit-client.d.ts +3 -1
- package/dist/connectors/github/octokit-client.js +7 -2
- package/dist/connectors/github/ratelimit.d.ts +6 -2
- package/dist/connectors/github/ratelimit.js +6 -2
- package/dist/connectors/github/signature.d.ts +14 -3
- package/dist/connectors/github/signature.js +17 -3
- package/dist/connectors/github/tenant-routing.d.ts +6 -4
- package/dist/connectors/github/tenant-routing.js +6 -6
- package/dist/connectors/github/transform.js +50 -67
- package/dist/connectors/github/types.d.ts +10 -3
- package/dist/connectors/github/types.js +6 -2
- package/dist/connectors/github/webhook.d.ts +5 -5
- package/dist/connectors/github/webhook.js +34 -23
- package/dist/connectors/ingest.d.ts +5 -3
- package/dist/connectors/ingest.js +3 -4
- package/dist/connectors/slack/backfill.d.ts +5 -5
- package/dist/connectors/slack/backfill.js +3 -3
- package/dist/connectors/slack/deletion.d.ts +4 -4
- package/dist/connectors/slack/deletion.js +6 -6
- package/dist/connectors/slack/dlq.d.ts +4 -4
- package/dist/connectors/slack/dlq.js +6 -6
- package/dist/connectors/slack/ingest.d.ts +6 -4
- package/dist/connectors/slack/ingest.js +5 -5
- package/dist/connectors/slack/signature.d.ts +4 -1
- package/dist/connectors/slack/tenant-routing.d.ts +6 -4
- package/dist/connectors/slack/tenant-routing.js +6 -6
- package/dist/connectors/slack/transform.d.ts +6 -2
- package/dist/connectors/slack/transform.js +6 -2
- package/dist/connectors/slack/types.d.ts +3 -1
- package/dist/connectors/slack/web-client.js +8 -3
- package/dist/connectors/slack/webhook.d.ts +5 -5
- package/dist/connectors/slack/webhook.js +19 -11
- package/dist/connectors/slack/workspaces.d.ts +7 -3
- package/dist/connectors/slack/workspaces.js +7 -3
- package/dist/connectors/store.d.ts +8 -0
- package/dist/connectors/store.js +2 -0
- package/dist/consolidate/conflicts.js +23 -9
- package/dist/consolidate/dag-summary.js +2 -1
- package/dist/consolidate/dag.d.ts +10 -5
- package/dist/consolidate/dag.js +37 -36
- package/dist/consolidate/decay.js +19 -6
- package/dist/consolidate/dedupe.d.ts +14 -5
- package/dist/consolidate/dedupe.js +27 -16
- package/dist/consolidate/flush-units.d.ts +4 -1
- package/dist/consolidate/flush-units.js +4 -1
- package/dist/consolidate/half-life-migration.d.ts +18 -8
- package/dist/consolidate/half-life-migration.js +48 -18
- package/dist/consolidate/llm-passes.js +27 -11
- package/dist/consolidate/memory-value-weights.d.ts +6 -2
- package/dist/consolidate/memory-value-weights.js +6 -2
- package/dist/consolidate/memory-value.d.ts +30 -10
- package/dist/consolidate/memory-value.js +36 -13
- package/dist/consolidate/merge.d.ts +4 -1
- package/dist/consolidate/merge.js +42 -32
- package/dist/consolidate/overlap-index.d.ts +8 -2
- package/dist/consolidate/overlap-index.js +11 -4
- package/dist/consolidate/physics-pass.d.ts +3 -1
- package/dist/consolidate/physics-pass.js +10 -7
- package/dist/consolidate/replay.d.ts +11 -4
- package/dist/consolidate/replay.js +19 -7
- package/dist/consolidate/run.d.ts +13 -5
- package/dist/consolidate/run.js +4 -4
- package/dist/consolidate/sleep.d.ts +14 -6
- package/dist/consolidate/sleep.js +41 -38
- package/dist/consolidate/trace.d.ts +7 -2
- package/dist/consolidate/trace.js +7 -2
- package/dist/consolidate/traces.js +26 -29
- package/dist/core/ablation.d.ts +9 -3
- package/dist/core/ablation.js +14 -4
- package/dist/core/active-scope.d.ts +3 -1
- package/dist/core/active-scope.js +3 -1
- package/dist/core/agent-memory-tools.d.ts +2 -0
- package/dist/core/agent-memory-tools.js +2 -0
- package/dist/core/ambient.d.ts +4 -3
- package/dist/core/ambient.js +8 -6
- package/dist/core/api-errors.d.ts +9 -3
- package/dist/core/api-errors.js +9 -3
- package/dist/core/capture-contract.d.ts +4 -1
- package/dist/core/capture-contract.js +27 -8
- package/dist/core/compare.d.ts +24 -8
- package/dist/core/compare.js +24 -8
- package/dist/core/config.d.ts +18 -9
- package/dist/core/config.js +24 -14
- package/dist/core/cosine.d.ts +4 -1
- package/dist/core/cosine.js +4 -1
- package/dist/core/handoff.d.ts +7 -2
- package/dist/core/handoff.js +4 -1
- package/dist/core/markdown.js +21 -16
- package/dist/core/memory-audit.js +14 -3
- package/dist/core/memory-quality.d.ts +12 -3
- package/dist/core/memory-quality.js +57 -21
- package/dist/core/memory.d.ts +84 -27
- package/dist/core/memory.js +73 -29
- package/dist/core/merged-row.d.ts +8 -2
- package/dist/core/merged-row.js +10 -3
- package/dist/core/package-root.d.ts +3 -1
- package/dist/core/package-root.js +3 -1
- package/dist/core/particle-refresh.d.ts +8 -0
- package/dist/core/particle-refresh.js +22 -0
- package/dist/core/physics-config.d.ts +4 -1
- package/dist/core/physics-config.js +6 -2
- package/dist/core/physics.d.ts +37 -11
- package/dist/core/physics.js +55 -20
- package/dist/core/project-identity.d.ts +34 -17
- package/dist/core/project-identity.js +33 -17
- package/dist/core/project-remote.d.ts +8 -4
- package/dist/core/project-remote.js +31 -14
- package/dist/core/recall-scope.d.ts +33 -11
- package/dist/core/recall-scope.js +42 -15
- package/dist/core/rejection-digest.d.ts +7 -0
- package/dist/core/rejection-digest.js +13 -0
- package/dist/core/salience.d.ts +3 -1
- package/dist/core/salience.js +10 -4
- package/dist/core/search-types.d.ts +15 -2
- package/dist/core/search-types.js +11 -0
- package/dist/dashboard/dashboard-actions.js +13 -2
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
- package/dist/dashboard/dashboard-snapshot.js +4 -4
- package/dist/dashboard/dashboard.js +6 -3
- package/dist/db/backup.js +2 -2
- package/dist/db/busy.d.ts +10 -3
- package/dist/db/busy.js +27 -5
- package/dist/db/connect.d.ts +10 -3
- package/dist/db/connect.js +8 -3
- package/dist/db/continuity.d.ts +1 -1
- package/dist/db/continuity.js +27 -11
- package/dist/db/meta.d.ts +4 -1
- package/dist/db/meta.js +4 -1
- package/dist/db/migrate.d.ts +10 -5
- package/dist/db/migrate.js +26 -13
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/types.d.ts +2 -1
- package/dist/db/migrations/v12.js +2 -1
- package/dist/db/migrations/v14.js +2 -1
- package/dist/db/migrations/v15.js +4 -2
- package/dist/db/migrations/v16.js +6 -3
- package/dist/db/migrations/v17.js +2 -1
- package/dist/db/migrations/v19.js +4 -2
- package/dist/db/migrations/v20.js +2 -1
- package/dist/db/migrations/v22.js +12 -6
- package/dist/db/migrations/v23.js +6 -3
- package/dist/db/migrations/v24.js +6 -3
- package/dist/db/migrations/v25.js +4 -2
- package/dist/db/migrations/v26.js +4 -2
- package/dist/db/migrations/v27.js +6 -3
- package/dist/db/migrations/v28.js +4 -2
- package/dist/db/migrations/v29.js +4 -2
- package/dist/db/migrations/v30.js +6 -3
- package/dist/db/migrations/v31.js +4 -2
- package/dist/db/migrations/v32.js +6 -3
- package/dist/db/migrations/v33.js +4 -2
- package/dist/db/migrations/v34.js +2 -1
- package/dist/db/migrations/v35.js +2 -1
- package/dist/db/migrations/v36.js +2 -1
- package/dist/db/migrations/v37.js +10 -5
- package/dist/db/migrations/v38.js +10 -5
- package/dist/db/migrations/v39.js +14 -6
- package/dist/db/migrations/v40.js +4 -2
- package/dist/db/migrations/v41.js +4 -2
- package/dist/db/migrations/v42.js +2 -1
- package/dist/db/migrations/v44.js +4 -2
- package/dist/db/migrations/v45.js +4 -2
- package/dist/db/migrations/v49.js +2 -1
- package/dist/db/migrations/v50.js +4 -2
- package/dist/db/migrations/v51.js +4 -2
- package/dist/db/migrations/v52.js +2 -1
- package/dist/db/migrations/v53.js +8 -4
- package/dist/db/migrations/v54.js +2 -1
- package/dist/db/migrations/v55.js +4 -2
- package/dist/db/migrations/v56.d.ts +3 -0
- package/dist/db/migrations/v56.js +28 -0
- package/dist/db/open.d.ts +24 -12
- package/dist/db/open.js +25 -13
- package/dist/db/physics-state.d.ts +8 -4
- package/dist/db/physics-state.js +13 -20
- package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
- package/dist/db/raw-archive-mirror-cleanup.js +6 -4
- package/dist/db/request-stores.d.ts +19 -5
- package/dist/db/request-stores.js +14 -5
- package/dist/db/tables.d.ts +2 -1
- package/dist/db/tables.js +12 -4
- package/dist/db/vector-store.d.ts +13 -4
- package/dist/db/vector-store.js +34 -14
- package/dist/db/wal-checkpointer.d.ts +2 -1
- package/dist/db/wal-checkpointer.js +19 -7
- package/dist/doctor.d.ts +4 -1
- package/dist/doctor.js +121 -39
- package/dist/embeddings/local.d.ts +8 -4
- package/dist/embeddings/local.js +9 -5
- package/dist/embeddings/provider.d.ts +19 -10
- package/dist/embeddings/provider.js +31 -17
- package/dist/embeddings/transformers.d.ts +16 -4
- package/dist/embeddings/transformers.js +32 -15
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.js +2 -1
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +1 -1
- package/dist/entry/sqlite-handles.d.ts +10 -0
- package/dist/entry/sqlite-handles.js +9 -0
- package/dist/entry/store-kit.d.ts +19 -6
- package/dist/entry/store-kit.js +6 -4
- package/dist/eval/eval-stats.d.ts +27 -8
- package/dist/eval/eval-stats.js +17 -5
- package/dist/eval/eval-suite.d.ts +3 -1
- package/dist/eval/eval-suite.js +409 -187
- package/dist/eval/eval.d.ts +8 -2
- package/dist/eval/eval.js +8 -2
- package/dist/eval/judgment.js +16 -6
- package/dist/graph/delta.d.ts +9 -42
- package/dist/graph/delta.js +17 -11
- package/dist/graph/extract.d.ts +10 -7
- package/dist/graph/extract.js +57 -25
- package/dist/graph/recall.d.ts +12 -4
- package/dist/graph/recall.js +30 -13
- package/dist/graph/stream.d.ts +18 -6
- package/dist/graph/stream.js +32 -10
- package/dist/graph/view.d.ts +19 -6
- package/dist/graph/view.js +42 -17
- package/dist/hooks/codex-session.js +2 -2
- package/dist/hooks/codex-wrapper.d.ts +3 -1
- package/dist/hooks/codex-wrapper.js +9 -4
- package/dist/hooks/copilot.d.ts +19 -5
- package/dist/hooks/copilot.js +54 -15
- package/dist/hooks/hook-blocks.d.ts +4 -1
- package/dist/hooks/hook-blocks.js +8 -3
- package/dist/hooks/json-hooks.d.ts +9 -5
- package/dist/hooks/json-hooks.js +69 -34
- package/dist/hooks/opencode.js +15 -5
- package/dist/hooks/shared.d.ts +27 -8
- package/dist/hooks/shared.js +57 -16
- package/dist/importers/core.d.ts +12 -4
- package/dist/importers/core.js +8 -7
- package/dist/importers/markdown-parse.d.ts +15 -5
- package/dist/importers/markdown-parse.js +16 -7
- package/dist/importers/markdown.js +6 -9
- package/dist/importers/sources.js +10 -23
- package/dist/importers/vault.d.ts +2 -2
- package/dist/importers/vault.js +43 -27
- package/dist/index.d.ts +32 -6
- package/dist/index.js +25 -7
- package/dist/learn/autolearn.d.ts +17 -6
- package/dist/learn/autolearn.js +53 -24
- package/dist/learn/churn-git.d.ts +4 -1
- package/dist/learn/churn-git.js +29 -5
- package/dist/learn/extract.d.ts +4 -1
- package/dist/learn/extract.js +16 -9
- package/dist/learn/forward-claim-detector.d.ts +17 -5
- package/dist/learn/forward-claim-detector.js +34 -15
- package/dist/learn/invalidation.d.ts +12 -7
- package/dist/learn/invalidation.js +56 -27
- package/dist/learn/roots.d.ts +3 -0
- package/dist/learn/roots.js +5 -0
- package/dist/mcp/admin-tools.d.ts +5 -5
- package/dist/mcp/admin-tools.js +28 -23
- package/dist/mcp/format.d.ts +1 -1
- package/dist/mcp/format.js +4 -2
- package/dist/mcp/framing.d.ts +3 -1
- package/dist/mcp/framing.js +20 -8
- package/dist/mcp/memory-tools.d.ts +3 -3
- package/dist/mcp/memory-tools.js +18 -14
- package/dist/mcp/protocol.d.ts +32 -16
- package/dist/mcp/protocol.js +12 -9
- package/dist/mcp/recall-tools.d.ts +3 -3
- package/dist/mcp/recall-tools.js +62 -74
- package/dist/mcp/request.d.ts +7 -5
- package/dist/mcp/request.js +57 -74
- package/dist/mcp/server.d.ts +3 -1
- package/dist/mcp/server.js +8 -3
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +4 -3
- package/dist/mcp/shared-gate.d.ts +3 -2
- package/dist/mcp/shared-gate.js +3 -2
- package/dist/mcp/stdio.d.ts +6 -3
- package/dist/mcp/stdio.js +52 -21
- package/dist/mcp/tool-args.d.ts +4 -1
- package/dist/mcp/tool-args.js +8 -3
- package/dist/mcp/tools.js +76 -32
- package/dist/objects/customer-notes.d.ts +12 -10
- package/dist/objects/customer-notes.js +21 -15
- package/dist/objects/decisions.d.ts +18 -10
- package/dist/objects/decisions.js +23 -17
- package/dist/objects/descriptor.js +2 -1
- package/dist/objects/fields.d.ts +4 -1
- package/dist/objects/fields.js +6 -2
- package/dist/objects/incidents.d.ts +14 -16
- package/dist/objects/incidents.js +29 -30
- package/dist/objects/lifecycle.d.ts +0 -4
- package/dist/objects/lifecycle.js +21 -24
- package/dist/objects/policies.d.ts +12 -16
- package/dist/objects/policies.js +17 -21
- package/dist/objects/processes.d.ts +16 -10
- package/dist/objects/processes.js +20 -15
- package/dist/objects/project-briefs.d.ts +13 -14
- package/dist/objects/project-briefs.js +33 -39
- package/dist/objects/skills.d.ts +10 -12
- package/dist/objects/skills.js +17 -22
- package/dist/postinstall.js +15 -7
- package/dist/predictions/planning-fallacy.d.ts +19 -6
- package/dist/predictions/planning-fallacy.js +4 -2
- package/dist/rerankers/clef.d.ts +8 -2
- package/dist/rerankers/clef.js +14 -9
- package/dist/rerankers/cross-encoder.d.ts +2 -1
- package/dist/rerankers/cross-encoder.js +9 -6
- package/dist/rerankers/index.js +2 -1
- package/dist/rerankers/jev.js +2 -1
- package/dist/rerankers/llm.d.ts +6 -2
- package/dist/rerankers/llm.js +8 -3
- package/dist/rerankers/remote.d.ts +3 -1
- package/dist/rerankers/remote.js +5 -2
- package/dist/rerankers/types.d.ts +6 -2
- package/dist/search/bm25-search.d.ts +3 -1
- package/dist/search/bm25-search.js +15 -2
- package/dist/search/boosts.js +4 -3
- package/dist/search/embed-memories.d.ts +10 -5
- package/dist/search/embed-memories.js +62 -36
- package/dist/search/engine.d.ts +4 -1
- package/dist/search/engine.js +6 -2
- package/dist/search/goal-boost.d.ts +10 -3
- package/dist/search/goal-boost.js +13 -6
- package/dist/search/hybrid-score.d.ts +4 -1
- package/dist/search/hybrid-score.js +4 -1
- package/dist/search/hybrid.d.ts +23 -8
- package/dist/search/hybrid.js +12 -7
- package/dist/search/multihop.js +14 -13
- package/dist/search/path-context.d.ts +10 -3
- package/dist/search/path-context.js +10 -3
- package/dist/search/physics-search.d.ts +9 -4
- package/dist/search/physics-search.js +38 -14
- package/dist/search/rerank.d.ts +2 -1
- package/dist/search/rerank.js +2 -1
- package/dist/search/rrf.d.ts +14 -5
- package/dist/search/rrf.js +11 -4
- package/dist/search/vector.d.ts +8 -2
- package/dist/search/vector.js +9 -3
- package/dist/server/auth.d.ts +18 -14
- package/dist/server/auth.js +69 -38
- package/dist/server/boot.d.ts +3 -1
- package/dist/server/boot.js +95 -56
- package/dist/server/client-ip.d.ts +11 -4
- package/dist/server/client-ip.js +27 -10
- package/dist/server/cursor.d.ts +10 -3
- package/dist/server/cursor.js +10 -3
- package/dist/server/deadline.d.ts +5 -2
- package/dist/server/deadline.js +10 -3
- package/dist/server/key-check-bounds.js +12 -4
- package/dist/server/lifecycle.d.ts +4 -1
- package/dist/server/lifecycle.js +10 -4
- package/dist/server/mcp-http.d.ts +2 -1
- package/dist/server/mcp-http.js +37 -22
- package/dist/server/rate-limit.d.ts +17 -5
- package/dist/server/rate-limit.js +55 -26
- package/dist/server/ready.js +7 -4
- package/dist/server/request.d.ts +15 -4
- package/dist/server/request.js +42 -15
- package/dist/server/route-checks.d.ts +4 -1
- package/dist/server/route-checks.js +8 -3
- package/dist/server/route-table.d.ts +8 -6
- package/dist/server/route-table.js +547 -93
- package/dist/server/routes/admin.d.ts +7 -7
- package/dist/server/routes/admin.js +36 -15
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +5 -4
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +12 -6
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +10 -4
- package/dist/server/routes/memories.d.ts +8 -8
- package/dist/server/routes/memories.js +12 -19
- package/dist/server/routes/object-routes.d.ts +8 -5
- package/dist/server/routes/object-routes.js +4 -2
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +11 -4
- package/dist/server/routes/predictions.d.ts +5 -5
- package/dist/server/routes/predictions.js +9 -4
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +15 -6
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +3 -2
- package/dist/server/routes/recall.d.ts +3 -3
- package/dist/server/routes/recall.js +21 -10
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +12 -4
- package/dist/server/server-detect.d.ts +24 -8
- package/dist/server/server-detect.js +57 -22
- package/dist/server/sleep-child.js +16 -10
- package/dist/server/sleep-offload.d.ts +8 -5
- package/dist/server/sleep-offload.js +41 -19
- package/dist/server/tls.d.ts +4 -1
- package/dist/server/tls.js +13 -5
- package/dist/server/types.d.ts +38 -26
- package/dist/server/validation.d.ts +4 -1
- package/dist/server/validation.js +22 -9
- package/dist/server.d.ts +15 -10
- package/dist/server.js +32 -12
- package/dist/sharing/global-store.d.ts +5 -10
- package/dist/sharing/global-store.js +8 -43
- package/dist/sharing/global-sync.d.ts +3 -1
- package/dist/sharing/global-sync.js +16 -6
- package/dist/sharing/project-merge.d.ts +25 -7
- package/dist/sharing/project-merge.js +49 -17
- package/dist/sharing/search-both.d.ts +8 -4
- package/dist/sharing/search-both.js +19 -12
- package/dist/sharing/share.d.ts +8 -4
- package/dist/sharing/share.js +39 -15
- package/dist/store/ambient.js +9 -5
- package/dist/store/audit-event.d.ts +2 -2
- package/dist/store/audit-event.js +8 -3
- package/dist/store/audit.d.ts +6 -3
- package/dist/store/audit.js +16 -6
- package/dist/store/auth.d.ts +4 -2
- package/dist/store/auth.js +63 -20
- package/dist/store/busy.d.ts +9 -0
- package/dist/store/busy.js +16 -0
- package/dist/store/candidates.d.ts +12 -5
- package/dist/store/candidates.js +75 -36
- package/dist/store/capture-write.d.ts +2 -1
- package/dist/store/capture-write.js +2 -1
- package/dist/store/card-detail.d.ts +4 -4
- package/dist/store/card-detail.js +15 -8
- package/dist/store/cards.d.ts +24 -10
- package/dist/store/cards.js +93 -60
- package/dist/store/compaction-caller.d.ts +2 -1
- package/dist/store/compaction-caller.js +2 -1
- package/dist/store/compactions-record.d.ts +14 -8
- package/dist/store/compactions-record.js +95 -32
- package/dist/store/compactions.js +35 -15
- package/dist/store/conflicts.d.ts +9 -4
- package/dist/store/conflicts.js +100 -45
- package/dist/store/connectors/dlq.d.ts +17 -5
- package/dist/store/connectors/dlq.js +56 -5
- package/dist/store/connectors/event-log.d.ts +111 -2
- package/dist/store/connectors/event-log.js +2 -1
- package/dist/store/connectors/github.d.ts +6 -3
- package/dist/store/connectors/github.js +24 -40
- package/dist/store/connectors/slack.d.ts +2 -1
- package/dist/store/connectors/slack.js +25 -37
- package/dist/store/dashboard-reads.d.ts +7 -3
- package/dist/store/dashboard-reads.js +32 -11
- package/dist/store/delete-and-batch.d.ts +17 -11
- package/dist/store/delete-and-batch.js +67 -26
- package/dist/store/delivery-recorder.d.ts +8 -5
- package/dist/store/delivery-recorder.js +70 -32
- package/dist/store/descendant-page.d.ts +2 -1
- package/dist/store/descendant-page.js +24 -9
- package/dist/store/diagnostics.d.ts +2 -1
- package/dist/store/diagnostics.js +2 -1
- package/dist/store/doctor-reads.d.ts +2 -1
- package/dist/store/doctor-reads.js +13 -5
- package/dist/store/dormant.d.ts +19 -11
- package/dist/store/dormant.js +40 -18
- package/dist/store/embeddings/index.d.ts +13 -9
- package/dist/store/embeddings/index.js +19 -12
- package/dist/store/entry-reads.d.ts +49 -20
- package/dist/store/entry-reads.js +181 -66
- package/dist/store/entry-row.d.ts +10 -6
- package/dist/store/entry-row.js +17 -12
- package/dist/store/entry-writes.d.ts +22 -10
- package/dist/store/entry-writes.js +41 -14
- package/dist/store/failure-log-at.js +1 -1
- package/dist/store/failure-log.d.ts +4 -2
- package/dist/store/failure-log.js +13 -6
- package/dist/store/gated-write.d.ts +3 -3
- package/dist/store/gated-write.js +3 -3
- package/dist/store/goals.d.ts +5 -4
- package/dist/store/goals.js +8 -10
- package/dist/store/graph-apply.d.ts +21 -0
- package/dist/{graph/write.js → store/graph-apply.js} +31 -11
- package/dist/store/graph-queue.d.ts +9 -6
- package/dist/store/graph-queue.js +15 -10
- package/dist/store/graph-reads.d.ts +16 -11
- package/dist/store/graph-reads.js +24 -15
- package/dist/store/graph-rows.d.ts +41 -3
- package/dist/store/graph-rows.js +10 -7
- package/dist/store/graph-view-rows.js +14 -7
- package/dist/store/graph-writes.d.ts +16 -10
- package/dist/store/graph-writes.js +59 -36
- package/dist/store/handoffs.d.ts +4 -4
- package/dist/store/handoffs.js +40 -19
- package/dist/store/index-and-stats.d.ts +2 -2
- package/dist/store/index-and-stats.js +6 -5
- package/dist/store/index.d.ts +3 -1
- package/dist/store/index.js +1 -0
- package/dist/store/key-audit.d.ts +2 -1
- package/dist/store/key-audit.js +2 -1
- package/dist/store/key-writes.d.ts +2 -1
- package/dist/store/key-writes.js +9 -2
- package/dist/store/ledger-turn.d.ts +4 -1
- package/dist/store/ledger-turn.js +7 -2
- package/dist/store/mirrors.d.ts +11 -4
- package/dist/store/mirrors.js +88 -16
- package/dist/store/narrow.d.ts +6 -0
- package/dist/store/narrow.js +11 -0
- package/dist/store/open.d.ts +4 -2
- package/dist/store/open.js +18 -9
- package/dist/store/pilot-arm.d.ts +2 -1
- package/dist/store/pilot-arm.js +18 -6
- package/dist/store/planning-fallacy-evidence.d.ts +2 -2
- package/dist/store/planning-fallacy-evidence.js +8 -5
- package/dist/store/port/agent-import.d.ts +62 -0
- package/dist/store/port/agent-import.js +2 -0
- package/dist/store/port/consolidation.d.ts +129 -0
- package/dist/store/port/consolidation.js +2 -0
- package/dist/store/port/learning.d.ts +19 -0
- package/dist/store/port/learning.js +2 -0
- package/dist/store/port/local-files.d.ts +18 -0
- package/dist/store/port/local-files.js +2 -0
- package/dist/store/port/promotion.d.ts +20 -0
- package/dist/store/port/promotion.js +3 -0
- package/dist/store/port-groups.d.ts +160 -0
- package/dist/store/port-groups.js +2 -0
- package/dist/store/port.d.ts +215 -229
- package/dist/store/port.js +3 -9
- package/dist/store/predictions.d.ts +14 -10
- package/dist/store/predictions.js +37 -17
- package/dist/store/project-tags.d.ts +4 -1
- package/dist/store/project-tags.js +16 -5
- package/dist/store/quality-repair.d.ts +8 -4
- package/dist/store/quality-repair.js +53 -20
- package/dist/store/quarantine.d.ts +1 -0
- package/dist/store/quarantine.js +23 -9
- package/dist/store/raw-archive.d.ts +5 -4
- package/dist/store/raw-archive.js +11 -10
- package/dist/store/recall-trace.d.ts +22 -17
- package/dist/store/recall-trace.js +126 -63
- package/dist/store/rejected-values.d.ts +15 -10
- package/dist/store/rejected-values.js +33 -12
- package/dist/store/rejection.d.ts +12 -11
- package/dist/store/rejection.js +18 -19
- package/dist/store/report-reads.d.ts +2 -1
- package/dist/store/report-reads.js +2 -1
- package/dist/store/rows.d.ts +7 -5
- package/dist/store/rows.js +18 -11
- package/dist/store/rule-sql.d.ts +6 -4
- package/dist/store/rule-sql.js +16 -9
- package/dist/store/search-rows.d.ts +14 -9
- package/dist/store/search-rows.js +48 -23
- package/dist/store/sessions.d.ts +12 -10
- package/dist/store/sessions.js +40 -21
- package/dist/store/set-aside.d.ts +2 -2
- package/dist/store/set-aside.js +18 -5
- package/dist/store/sqlite/agent-import.d.ts +3 -0
- package/dist/store/sqlite/agent-import.js +77 -0
- package/dist/store/sqlite/cards-group.d.ts +6 -0
- package/dist/store/sqlite/cards-group.js +37 -0
- package/dist/store/sqlite/conflicts-group.d.ts +6 -0
- package/dist/store/sqlite/conflicts-group.js +18 -0
- package/dist/store/sqlite/connector-events-group.d.ts +2 -1
- package/dist/store/sqlite/connector-events-group.js +17 -6
- package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
- package/dist/store/sqlite/connector-writes-group.js +9 -4
- package/dist/store/sqlite/consolidation-group.d.ts +4 -0
- package/dist/store/sqlite/consolidation-group.js +64 -0
- package/dist/store/sqlite/dag-reads-group.js +1 -1
- package/dist/store/sqlite/dormant-group.d.ts +6 -0
- package/dist/store/sqlite/dormant-group.js +29 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +6 -3
- package/dist/store/sqlite/entry-writes-group.js +37 -14
- package/dist/store/sqlite/error-codec.d.ts +4 -2
- package/dist/store/sqlite/error-codec.js +32 -10
- package/dist/store/sqlite/executor-counts.js +2 -1
- package/dist/store/sqlite/executor.d.ts +8 -3
- package/dist/store/sqlite/executor.js +56 -18
- package/dist/store/sqlite/global-promote.d.ts +5 -0
- package/dist/store/sqlite/global-promote.js +48 -0
- package/dist/store/sqlite/goals-group.d.ts +6 -0
- package/dist/store/sqlite/goals-group.js +23 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
- package/dist/store/sqlite/graph-reads-group.js +2 -1
- package/dist/store/sqlite/held-connection.d.ts +7 -1
- package/dist/store/sqlite/held-connection.js +34 -7
- package/dist/store/sqlite/last-recall-group.d.ts +4 -2
- package/dist/store/sqlite/last-recall-group.js +9 -4
- package/dist/store/sqlite/learning-group.d.ts +4 -0
- package/dist/store/sqlite/learning-group.js +17 -0
- package/dist/store/sqlite/maintenance-groups.js +2 -1
- package/dist/store/sqlite/object-rows.d.ts +6 -3
- package/dist/store/sqlite/object-rows.js +34 -5
- package/dist/store/sqlite/objects-group.d.ts +5 -4
- package/dist/store/sqlite/objects-group.js +84 -33
- package/dist/store/sqlite/predictions-group.d.ts +2 -1
- package/dist/store/sqlite/predictions-group.js +4 -2
- package/dist/store/sqlite/promotion-group.d.ts +3 -0
- package/dist/store/sqlite/promotion-group.js +10 -0
- package/dist/store/sqlite/quarantine-group.d.ts +2 -1
- package/dist/store/sqlite/quarantine-group.js +4 -2
- package/dist/store/sqlite/reports-group.d.ts +6 -0
- package/dist/store/sqlite/reports-group.js +33 -0
- package/dist/store/sqlite/request-scope.d.ts +6 -0
- package/dist/store/sqlite/request-scope.js +18 -0
- package/dist/store/sqlite/sessions-group.d.ts +6 -0
- package/dist/store/sqlite/sessions-group.js +46 -0
- package/dist/store/sqlite/store.d.ts +22 -11
- package/dist/store/sqlite/store.js +84 -11
- package/dist/store/sqlite/vector-pack.js +2 -1
- package/dist/store/sqlite/vector-reads-group.js +2 -1
- package/dist/store/sqlite/worker-jobs.d.ts +2 -1
- package/dist/store/sqlite/worker-jobs.js +19 -7
- package/dist/store/sqlite/worker-ops.d.ts +10 -5
- package/dist/store/sqlite/worker-ops.js +6 -3
- package/dist/store/sqlite/worker-store.d.ts +4 -3
- package/dist/store/sqlite/worker-store.js +24 -14
- package/dist/store/summaries.d.ts +19 -12
- package/dist/store/summaries.js +36 -21
- package/dist/store/summary-dirty.d.ts +2 -1
- package/dist/store/summary-dirty.js +2 -1
- package/dist/store/tenant.d.ts +3 -2
- package/dist/store/tenant.js +5 -4
- package/dist/store/token-ledger-rows.js +6 -3
- package/dist/store/token-ledger.d.ts +19 -13
- package/dist/store/token-ledger.js +27 -14
- package/dist/store/tombstone-checks.d.ts +4 -1
- package/dist/store/tombstone-checks.js +10 -1
- package/dist/store/usage-reports.js +2 -1
- package/dist/store/vector-index.d.ts +8 -5
- package/dist/store/vector-index.js +24 -10
- package/dist/store/working-memory.d.ts +6 -4
- package/dist/store/working-memory.js +14 -9
- package/dist/support-bundle.js +10 -5
- package/dist/trust/quarantine.d.ts +1 -2
- package/dist/trust/quarantine.js +1 -5
- package/dist/trust/reject-flow.d.ts +12 -3
- package/dist/trust/reject-flow.js +12 -4
- package/dist/util/anthropic-messages.d.ts +4 -1
- package/dist/util/anthropic-messages.js +14 -5
- package/dist/util/atomic-write.d.ts +4 -2
- package/dist/util/atomic-write.js +25 -14
- package/dist/util/compaction-items.d.ts +4 -1
- package/dist/util/compaction-items.js +8 -2
- package/dist/util/crash-handlers.d.ts +7 -2
- package/dist/util/crash-handlers.js +13 -4
- package/dist/util/env.d.ts +16 -4
- package/dist/util/env.js +78 -25
- package/dist/util/home-path.js +12 -6
- package/dist/util/hook-payload.d.ts +3 -1
- package/dist/util/hook-payload.js +3 -1
- package/dist/util/http-retry.d.ts +12 -6
- package/dist/util/http-retry.js +16 -6
- package/dist/util/http-util.d.ts +20 -5
- package/dist/util/http-util.js +28 -9
- package/dist/util/json.d.ts +4 -1
- package/dist/util/json.js +4 -1
- package/dist/util/keyset.js +2 -1
- package/dist/util/limits.js +4 -2
- package/dist/util/log.d.ts +13 -5
- package/dist/util/log.js +29 -6
- package/dist/util/net.d.ts +5 -0
- package/dist/util/net.js +19 -0
- package/dist/util/real-path.d.ts +2 -1
- package/dist/util/real-path.js +4 -3
- package/dist/util/request-scope.d.ts +11 -3
- package/dist/util/request-scope.js +13 -4
- package/dist/util/same-text.d.ts +10 -3
- package/dist/util/same-text.js +10 -3
- package/dist/util/secret-detect.d.ts +24 -7
- package/dist/util/secret-detect.js +49 -14
- package/dist/util/spawn-argv.d.ts +3 -1
- package/dist/util/spawn-argv.js +13 -4
- package/dist/util/sqlite-blocked.d.ts +15 -4
- package/dist/util/sqlite-blocked.js +19 -6
- package/dist/util/stored-json.d.ts +4 -1
- package/dist/util/stored-json.js +6 -2
- package/dist/util/stream-tee.d.ts +2 -1
- package/dist/util/stream-tee.js +8 -5
- package/dist/util/transcript-tail.d.ts +4 -1
- package/dist/util/transcript-tail.js +4 -1
- package/dist/util/version.d.ts +8 -3
- package/dist/util/version.js +8 -3
- package/dist/util/write-budget.d.ts +7 -2
- package/dist/util/write-budget.js +5 -2
- package/dist/util/yaml.d.ts +4 -1
- package/dist/util/yaml.js +4 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -1
- package/scripts/postinstall.cjs +3 -1
- package/dist/api/cards.d.ts +0 -42
- package/dist/api/conflicts.d.ts +0 -28
- package/dist/api/conflicts.js +0 -61
- package/dist/api/dormant.d.ts +0 -14
- package/dist/api/dormant.js +0 -58
- package/dist/api/goals.d.ts +0 -18
- package/dist/api/graph.d.ts +0 -8
- package/dist/api/graph.js +0 -8
- package/dist/api/learn.js +0 -125
- package/dist/api/memories.d.ts +0 -25
- package/dist/api/objects.d.ts +0 -9
- package/dist/api/outcome.d.ts +0 -19
- package/dist/api/predictions.d.ts +0 -11
- package/dist/api/promote.d.ts +0 -36
- package/dist/api/recall-core.d.ts +0 -4
- package/dist/api/recall-core.js +0 -125
- package/dist/api/recall-finish.d.ts +0 -53
- package/dist/api/recall-finish.js +0 -30
- package/dist/api/recall-history.d.ts +0 -64
- package/dist/api/recall-history.js +0 -159
- package/dist/api/recall-record.d.ts +0 -43
- package/dist/api/recall-record.js +0 -78
- package/dist/api/recall-request.js +0 -121
- package/dist/api/recall.d.ts +0 -6
- package/dist/api/refine.d.ts +0 -7
- package/dist/api/refine.js +0 -10
- package/dist/api/session-owners.d.ts +0 -4
- package/dist/api/session-owners.js +0 -17
- package/dist/api/sleep-run.d.ts +0 -26
- package/dist/api/sleep.js +0 -11
- package/dist/graph/write.d.ts +0 -14
- package/dist/store/sqlite/busy.d.ts +0 -3
- package/dist/store/sqlite/busy.js +0 -8
- package/dist/store/sqlite/local.d.ts +0 -4
- package/dist/store/sqlite/local.js +0 -8
|
@@ -7,21 +7,38 @@ import { RejectedValueError } from '../core/api-errors.js';
|
|
|
7
7
|
import { markSummaryDirtyInTx } from './summary-dirty.js';
|
|
8
8
|
import { errorMessage, log } from '../util/log.js';
|
|
9
9
|
import { auditRejectionRefusal, audit } from './audit-event.js';
|
|
10
|
+
import { appendAuditEvent } from './audit.js';
|
|
10
11
|
import { selectEntriesByIds } from './entry-reads.js';
|
|
11
12
|
import { stampOriginProject, upsertEntryRow, syncFtsRow, deleteFtsRow } from './entry-row.js';
|
|
12
13
|
import { mirrorBestEffort, writeMarkdownMirror } from './mirrors.js';
|
|
13
14
|
import { onHandle, openStore } from './open.js';
|
|
14
|
-
/** Write an entry to SQLite and refresh mirrors. `opts.actor` defaults to 'cli'; the api layer passes the resolved
|
|
15
|
-
* so the audit log gets one row per write. */
|
|
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. */
|
|
16
17
|
export function writeEntry(hippoRoot, entry, opts) {
|
|
17
18
|
writeEntryWithHook(hippoRoot, entry, opts);
|
|
18
19
|
}
|
|
19
20
|
/** writeEntry for store code that needs the write's own handle: `opts.afterWrite` shares the INSERT's SAVEPOINT. */
|
|
20
|
-
|
|
21
|
+
function writeEntryWithHook(hippoRoot, entry, opts) {
|
|
21
22
|
onHandle(hippoRoot, (db) => {
|
|
22
23
|
writeEntryOn(db, hippoRoot, entry, opts);
|
|
23
24
|
}, openStore);
|
|
24
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
|
+
}
|
|
25
42
|
/** writeEntry for each of `entries` in one transaction, so all land or none; each
|
|
26
43
|
* keeps its audit row, and mirrors follow the commit. Returns how many were written; an empty list opens no store. */
|
|
27
44
|
export function writeEntriesTogether(hippoRoot, entries) {
|
|
@@ -49,7 +66,8 @@ export function writeEntriesTogether(hippoRoot, entries) {
|
|
|
49
66
|
return stamped.length;
|
|
50
67
|
}
|
|
51
68
|
/** Runs `fill` in one transaction; each `put` writes one entry and returns false when the store rejects its value,
|
|
52
|
-
* 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. */
|
|
53
71
|
export function writeEntriesSkippingRejected(hippoRoot, fill, actor = 'cli') {
|
|
54
72
|
const written = [];
|
|
55
73
|
onHandle(hippoRoot, (db) => {
|
|
@@ -104,8 +122,9 @@ function writeEntryOn(db, hippoRoot, entry, opts) {
|
|
|
104
122
|
throw error;
|
|
105
123
|
}
|
|
106
124
|
}
|
|
107
|
-
/** DB-only write path: upsert, afterWrite hook and audit row inside one withWriteScope; the caller owns `db` and must
|
|
108
|
-
* 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. */
|
|
109
128
|
export function writeEntryDbOnly(db, entry, opts) {
|
|
110
129
|
// Inside a caller's transaction (e.g. supersede's BEGIN IMMEDIATE) the scope is a SAVEPOINT,
|
|
111
130
|
// so a throw here rolls back only this write and leaves the outer open.
|
|
@@ -117,7 +136,8 @@ export function writeEntryDbOnly(db, entry, opts) {
|
|
|
117
136
|
auditEntryWrite(db, entry, opts?.actor ?? 'cli');
|
|
118
137
|
});
|
|
119
138
|
}
|
|
120
|
-
/** 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. */
|
|
121
141
|
export function auditEntryWrite(db, entry, actor) {
|
|
122
142
|
audit(db, 'remember', { targetId: entry.id, metadata: {
|
|
123
143
|
kind: entry.kind ?? 'distilled',
|
|
@@ -154,7 +174,8 @@ export function strengthenRetrieved(hippoRoot, ids, opts) {
|
|
|
154
174
|
closeHippoDb(db);
|
|
155
175
|
}
|
|
156
176
|
}
|
|
157
|
-
/** 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. */
|
|
158
179
|
export function strengthenRetrievedInOwnTx(db, ids, opts) {
|
|
159
180
|
if (ids.length === 0 || opts.recallBoostAblated)
|
|
160
181
|
return new Set();
|
|
@@ -196,7 +217,8 @@ export function setEntryTagsInTx(db, entry) {
|
|
|
196
217
|
.run(JSON.stringify(entry.tags), entry.id, entry.tenant_id);
|
|
197
218
|
syncFtsRow(db, entry);
|
|
198
219
|
}
|
|
199
|
-
/** 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. */
|
|
200
222
|
export function deleteEntryRowInTx(db, entry, actor) {
|
|
201
223
|
db.prepare('DELETE FROM memories WHERE id = ? AND tenant_id = ?').run(entry.id, entry.tenant_id);
|
|
202
224
|
deleteFtsRow(db, entry.id);
|
|
@@ -211,8 +233,7 @@ export function setHalfLivesAt(db, rows) {
|
|
|
211
233
|
}
|
|
212
234
|
/** Moves every row of `from` in a tenant to project `into`. */
|
|
213
235
|
export function restampOriginProjectAt(db, tenantId, from, into) {
|
|
214
|
-
db.prepare(`UPDATE memories SET origin_project = ?, updated_at = datetime('now') WHERE tenant_id = ? AND origin_project = ?`)
|
|
215
|
-
.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);
|
|
216
237
|
}
|
|
217
238
|
/** Stamps each id with its project. */
|
|
218
239
|
export function stampOriginProjectsAt(db, tenantId, rows) {
|
|
@@ -222,18 +243,24 @@ export function stampOriginProjectsAt(db, tenantId, rows) {
|
|
|
222
243
|
}
|
|
223
244
|
/** Renames a live row's source from `from` to `to`; the count is 0 when another writer moved or superseded it first. */
|
|
224
245
|
export function renameEntrySourceAt(db, tenantId, id, from, to) {
|
|
225
|
-
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);
|
|
226
249
|
return Number(moved.changes ?? 0);
|
|
227
250
|
}
|
|
228
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. */
|
|
229
252
|
export function renameEntrySourceAndOriginAt(db, tenantId, id, options) {
|
|
230
253
|
const { from, to, origin } = options;
|
|
231
|
-
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);
|
|
232
258
|
return Number(done.changes ?? 0);
|
|
233
259
|
}
|
|
234
260
|
/** Marks `id` superseded by `newId`; false when another writer superseded it first. */
|
|
235
261
|
export function supersedeEntryAt(db, tenantId, id, newId) {
|
|
236
|
-
const result = db
|
|
262
|
+
const result = db
|
|
263
|
+
.prepare(`UPDATE memories SET superseded_by = ? WHERE id = ? AND tenant_id = ? AND superseded_by IS NULL`)
|
|
237
264
|
.run(newId, id, tenantId);
|
|
238
265
|
return Number(result.changes ?? 0) !== 0;
|
|
239
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
|
@@ -25,8 +25,8 @@ export function pushGoal(hippoRoot, opts) {
|
|
|
25
25
|
return pushGoalWithDb(db, opts);
|
|
26
26
|
});
|
|
27
27
|
}
|
|
28
|
-
/** Depth-cap enforcer for pushGoalWithDb and resumeGoal: suspends the oldest `overflow` goals; **caller MUST be inside
|
|
29
|
-
* @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. */
|
|
30
30
|
function enforceDepthCapWithinTx(db, tenantId, sessionId) {
|
|
31
31
|
// SAFETY: the row comes from the SELECT above, which projects exactly one
|
|
32
32
|
// column, `c`, as a COUNT(*).
|
|
@@ -106,11 +106,6 @@ function insertRetrievalPolicy(db, goalId, policy) {
|
|
|
106
106
|
db.prepare(`UPDATE goal_stack SET retrieval_policy_id = ? WHERE id = ?`).run(policyId, goalId);
|
|
107
107
|
return policyId;
|
|
108
108
|
}
|
|
109
|
-
export function getActiveGoals(hippoRoot, opts) {
|
|
110
|
-
return onHandle(hippoRoot, (db) => {
|
|
111
|
-
return getActiveGoalsWithDb(db, opts);
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
109
|
/** The active goals and their policies on one handle, so a goal and its policy never disagree. */
|
|
115
110
|
export function activeGoalsWithPolicies(hippoRoot, opts) {
|
|
116
111
|
return onHandle(hippoRoot, (db) => {
|
|
@@ -144,7 +139,8 @@ function getActiveGoalsWithDb(db, opts) {
|
|
|
144
139
|
`).all(opts.tenantId, opts.sessionId);
|
|
145
140
|
return rows.map(rowToGoal);
|
|
146
141
|
}
|
|
147
|
-
// 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.
|
|
148
144
|
function loadGoalPolicies(db, active) {
|
|
149
145
|
const policiesByGoalId = new Map();
|
|
150
146
|
const policyIds = [...new Set(active.flatMap((g) => (g.retrievalPolicyId ? [g.retrievalPolicyId] : [])))];
|
|
@@ -183,7 +179,8 @@ export function localGoalRecallRows(db, rows) {
|
|
|
183
179
|
const localIds = new Set(local.map((r) => r.id));
|
|
184
180
|
return rows.filter((r) => localIds.has(r.memoryId));
|
|
185
181
|
}
|
|
186
|
-
/** 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. */
|
|
187
184
|
export function writeGoalRecallLog(db, rows) {
|
|
188
185
|
if (rows.length === 0)
|
|
189
186
|
return;
|
|
@@ -226,7 +223,8 @@ export function completeGoal(hippoRoot, goalId, opts) {
|
|
|
226
223
|
else if (score < NEGATIVE_OUTCOME_THRESHOLD)
|
|
227
224
|
multiplier = STRENGTH_DECAY;
|
|
228
225
|
if (multiplier !== 1) {
|
|
229
|
-
// 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.
|
|
230
228
|
db.prepare(`
|
|
231
229
|
UPDATE memories
|
|
232
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)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type DatabaseSyncLike } from '../db/index.js';
|
|
2
2
|
import { type EntityType, type Entity, type Relation, type StoredGraph } from './graph-rows.js';
|
|
3
|
-
/** Entities with an exact `name`, bounded by `limit` in SQL with a deterministic order, so graph-view focus finds
|
|
4
|
-
* without materializing every same-name row. */
|
|
3
|
+
/** Entities with an exact `name`, bounded by `limit` in SQL with a deterministic order, so graph-view focus finds
|
|
4
|
+
* `--entity NAME` directly without materializing every same-name row. */
|
|
5
5
|
export declare function loadEntitiesByName(hippoRoot: string, tenantId: string, name: string, opts?: {
|
|
6
6
|
limit?: number;
|
|
7
7
|
}, txDb?: DatabaseSyncLike): Entity[];
|
|
@@ -16,26 +16,31 @@ export declare function loadRelations(hippoRoot: string, tenantId: string, opts?
|
|
|
16
16
|
/** Chunk size for IN-list queries: well under SQLite's 999-bound-variable default
|
|
17
17
|
* (leaves headroom for the tenant_id param + the doubled list in neighbour lookups). */
|
|
18
18
|
export declare const IN_LIST_CHUNK = 400;
|
|
19
|
-
/** Load entities by primary id (the BFS-reached rows whose `memory_id` maps back to a recall result). Tenant-scoped,
|
|
19
|
+
/** Load entities by primary id (the BFS-reached rows whose `memory_id` maps back to a recall result). Tenant-scoped,
|
|
20
|
+
* read-only. */
|
|
20
21
|
export declare function loadEntitiesByIds(hippoRoot: string, tenantId: string, ids: number[], txDb?: DatabaseSyncLike): Entity[];
|
|
21
|
-
/** All relations touching ANY of `entityIds` in EITHER direction: the per-hop neighbour query for multi-hop traversal,
|
|
22
|
-
* (no N+1). `limit` caps rows and must be a non-negative integer (raw `LIMIT ?`
|
|
22
|
+
/** All relations touching ANY of `entityIds` in EITHER direction: the per-hop neighbour query for multi-hop traversal,
|
|
23
|
+
* one query for the whole frontier (no N+1). `limit` caps rows and must be a non-negative integer (raw `LIMIT ?`
|
|
24
|
+
* rejects a fraction). */
|
|
23
25
|
export declare function loadNeighborRelations(hippoRoot: string, tenantId: string, entityIds: number[], opts?: {
|
|
24
26
|
limit?: number;
|
|
25
27
|
}, txDb?: DatabaseSyncLike): Relation[];
|
|
26
|
-
/** Relations with BOTH endpoints in `entityIds` (edges AMONG the set), for the graph-view focus subgraph; `LIMIT` caps
|
|
27
|
-
* so no out-of-union row evicts a valid one. The caller bounds `entityIds` (<= view limit), so
|
|
28
|
+
/** Relations with BOTH endpoints in `entityIds` (edges AMONG the set), for the graph-view focus subgraph; `LIMIT` caps
|
|
29
|
+
* only intra-union edges, so no out-of-union row evicts a valid one. The caller bounds `entityIds` (<= view limit), so
|
|
30
|
+
* a single query is safe. */
|
|
28
31
|
export declare function loadRelationsAmong(hippoRoot: string, tenantId: string, entityIds: number[], opts?: {
|
|
29
32
|
limit?: number;
|
|
30
33
|
}, txDb?: DatabaseSyncLike): Relation[];
|
|
31
|
-
/** Map consolidated source memory ids to their graph entities: the SEED step of multi-hop recall. Tenant-scoped,
|
|
32
|
-
* SQLite variable cap. */
|
|
34
|
+
/** Map consolidated source memory ids to their graph entities: the SEED step of multi-hop recall. Tenant-scoped,
|
|
35
|
+
* read-only; chunks the IN-list under the SQLite variable cap. */
|
|
33
36
|
export declare function loadEntitiesByMemoryId(hippoRoot: string, tenantId: string, memoryIds: string[]): Entity[];
|
|
34
|
-
/** The stored rows a rebuild diffs against, read on the caller's handle so the diff and the apply can share one write
|
|
37
|
+
/** The stored rows a rebuild diffs against, read on the caller's handle so the diff and the apply can share one write
|
|
38
|
+
* lock. */
|
|
35
39
|
export declare function storedGraphOn(db: DatabaseSyncLike, tenantId: string, memoryIds: readonly string[]): StoredGraph;
|
|
36
40
|
/** storedGraphOn on its own connection, outside any write lock. */
|
|
37
41
|
export declare function loadStoredGraph(hippoRoot: string, tenantId: string, memoryIds: readonly string[]): StoredGraph;
|
|
38
42
|
/** Run `fn` in ONE read transaction (a single WAL snapshot) so every `load*` read via `txDb` sees a consistent view
|
|
39
|
-
* even if a rebuild commits concurrently (it clears and reinserts entities, so separate reads could mix old entity ids
|
|
43
|
+
* even if a rebuild commits concurrently (it clears and reinserts entities, so separate reads could mix old entity ids
|
|
44
|
+
* with new relation ids). */
|
|
40
45
|
export declare function withGraphReadSnapshot<T>(hippoRoot: string, fn: (txDb: DatabaseSyncLike) => T): T;
|
|
41
46
|
//# sourceMappingURL=graph-reads.d.ts.map
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
// The graph reads a view and a traversal share. Each opens hippo.db itself unless the caller hands it the handle its
|
|
1
|
+
// The graph reads a view and a traversal share. Each opens hippo.db itself unless the caller hands it the handle its
|
|
2
|
+
// snapshot runs on.
|
|
2
3
|
import { DEFAULT_LIST_LIMIT } from '../util/limits.js';
|
|
3
4
|
import { openHippoDb, closeHippoDb, withReadSnapshot } from '../db/index.js';
|
|
4
5
|
import { onHandle } from './open.js';
|
|
@@ -7,8 +8,8 @@ import { GRAPH_ENTITY_TYPES, rowToEntity, rowToRelation, ENTITY_COLS, RELATION_C
|
|
|
7
8
|
import { placeholders } from '../util/sql.js';
|
|
8
9
|
const DEFAULT_GRAPH_PAGE_SIZE = DEFAULT_LIST_LIMIT;
|
|
9
10
|
const DEFAULT_GRAPH_SCAN_LIMIT = 1000;
|
|
10
|
-
/** Entities with an exact `name`, bounded by `limit` in SQL with a deterministic order, so graph-view focus finds
|
|
11
|
-
* without materializing every same-name row. */
|
|
11
|
+
/** Entities with an exact `name`, bounded by `limit` in SQL with a deterministic order, so graph-view focus finds
|
|
12
|
+
* `--entity NAME` directly without materializing every same-name row. */
|
|
12
13
|
export function loadEntitiesByName(hippoRoot, tenantId, name, opts = {}, txDb) {
|
|
13
14
|
assertTenantId('loadEntitiesByName', tenantId);
|
|
14
15
|
const limit = opts.limit ?? DEFAULT_GRAPH_PAGE_SIZE;
|
|
@@ -90,7 +91,8 @@ export function loadRelations(hippoRoot, tenantId, opts = {}, txDb) {
|
|
|
90
91
|
/** Chunk size for IN-list queries: well under SQLite's 999-bound-variable default
|
|
91
92
|
* (leaves headroom for the tenant_id param + the doubled list in neighbour lookups). */
|
|
92
93
|
export const IN_LIST_CHUNK = 400;
|
|
93
|
-
/** Load entities by primary id (the BFS-reached rows whose `memory_id` maps back to a recall result). Tenant-scoped,
|
|
94
|
+
/** Load entities by primary id (the BFS-reached rows whose `memory_id` maps back to a recall result). Tenant-scoped,
|
|
95
|
+
* read-only. */
|
|
94
96
|
export function loadEntitiesByIds(hippoRoot, tenantId, ids, txDb) {
|
|
95
97
|
assertTenantId('loadEntitiesByIds', tenantId);
|
|
96
98
|
if (ids.length === 0)
|
|
@@ -116,8 +118,9 @@ export function loadEntitiesByIds(hippoRoot, tenantId, ids, txDb) {
|
|
|
116
118
|
closeHippoDb(ownDb);
|
|
117
119
|
}
|
|
118
120
|
}
|
|
119
|
-
/** All relations touching ANY of `entityIds` in EITHER direction: the per-hop neighbour query for multi-hop traversal,
|
|
120
|
-
* (no N+1). `limit` caps rows and must be a non-negative integer (raw `LIMIT ?`
|
|
121
|
+
/** All relations touching ANY of `entityIds` in EITHER direction: the per-hop neighbour query for multi-hop traversal,
|
|
122
|
+
* one query for the whole frontier (no N+1). `limit` caps rows and must be a non-negative integer (raw `LIMIT ?`
|
|
123
|
+
* rejects a fraction). */
|
|
121
124
|
export function loadNeighborRelations(hippoRoot, tenantId, entityIds, opts = {}, txDb) {
|
|
122
125
|
assertTenantId('loadNeighborRelations', tenantId);
|
|
123
126
|
if (entityIds.length === 0)
|
|
@@ -129,8 +132,8 @@ export function loadNeighborRelations(hippoRoot, tenantId, entityIds, opts = {},
|
|
|
129
132
|
const ownDb = txDb ? null : openHippoDb(hippoRoot);
|
|
130
133
|
const db = txDb ?? ownDb;
|
|
131
134
|
try {
|
|
132
|
-
// `limit` applies PER CHUNK, so a frontier over IN_LIST_CHUNK ids could return limit*chunks rows before the dedup
|
|
133
|
-
// harmless today (frontier <= maxNeighbors 200, one chunk, BFS re-enforces the fanout cap).
|
|
135
|
+
// `limit` applies PER CHUNK, so a frontier over IN_LIST_CHUNK ids could return limit*chunks rows before the dedup
|
|
136
|
+
// below; harmless today (frontier <= maxNeighbors 200, one chunk, BFS re-enforces the fanout cap).
|
|
134
137
|
const byId = new Map();
|
|
135
138
|
for (let i = 0; i < entityIds.length; i += IN_LIST_CHUNK) {
|
|
136
139
|
const slice = entityIds.slice(i, i + IN_LIST_CHUNK);
|
|
@@ -152,8 +155,9 @@ export function loadNeighborRelations(hippoRoot, tenantId, entityIds, opts = {},
|
|
|
152
155
|
closeHippoDb(ownDb);
|
|
153
156
|
}
|
|
154
157
|
}
|
|
155
|
-
/** Relations with BOTH endpoints in `entityIds` (edges AMONG the set), for the graph-view focus subgraph; `LIMIT` caps
|
|
156
|
-
* so no out-of-union row evicts a valid one. The caller bounds `entityIds` (<= view limit), so
|
|
158
|
+
/** Relations with BOTH endpoints in `entityIds` (edges AMONG the set), for the graph-view focus subgraph; `LIMIT` caps
|
|
159
|
+
* only intra-union edges, so no out-of-union row evicts a valid one. The caller bounds `entityIds` (<= view limit), so
|
|
160
|
+
* a single query is safe. */
|
|
157
161
|
export function loadRelationsAmong(hippoRoot, tenantId, entityIds, opts = {}, txDb) {
|
|
158
162
|
assertTenantId('loadRelationsAmong', tenantId);
|
|
159
163
|
if (entityIds.length === 0)
|
|
@@ -180,8 +184,8 @@ export function loadRelationsAmong(hippoRoot, tenantId, entityIds, opts = {}, tx
|
|
|
180
184
|
closeHippoDb(ownDb);
|
|
181
185
|
}
|
|
182
186
|
}
|
|
183
|
-
/** Map consolidated source memory ids to their graph entities: the SEED step of multi-hop recall. Tenant-scoped,
|
|
184
|
-
* SQLite variable cap. */
|
|
187
|
+
/** Map consolidated source memory ids to their graph entities: the SEED step of multi-hop recall. Tenant-scoped,
|
|
188
|
+
* read-only; chunks the IN-list under the SQLite variable cap. */
|
|
185
189
|
export function loadEntitiesByMemoryId(hippoRoot, tenantId, memoryIds) {
|
|
186
190
|
assertTenantId('loadEntitiesByMemoryId', tenantId);
|
|
187
191
|
if (memoryIds.length === 0)
|
|
@@ -203,11 +207,15 @@ export function loadEntitiesByMemoryId(hippoRoot, tenantId, memoryIds) {
|
|
|
203
207
|
return out;
|
|
204
208
|
});
|
|
205
209
|
}
|
|
206
|
-
/** The stored rows a rebuild diffs against, read on the caller's handle so the diff and the apply can share one write
|
|
210
|
+
/** The stored rows a rebuild diffs against, read on the caller's handle so the diff and the apply can share one write
|
|
211
|
+
* lock. */
|
|
207
212
|
export function storedGraphOn(db, tenantId, memoryIds) {
|
|
208
213
|
const kinds = memoryKindsOn(db, memoryIds);
|
|
209
214
|
// SAFETY: the SELECT names exactly the columns of StoredEntity.
|
|
210
|
-
const entities = db
|
|
215
|
+
const entities = db
|
|
216
|
+
.prepare(`SELECT id, entity_type, name, memory_id, source_kind, source_object_type, source_object_id FROM entities ` +
|
|
217
|
+
`WHERE tenant_id = ? ORDER BY id`)
|
|
218
|
+
.all(tenantId);
|
|
211
219
|
// SAFETY: the SELECT names exactly the columns of StoredRelation.
|
|
212
220
|
const relations = db.prepare(`SELECT id, from_entity_id, to_entity_id, rel_type, memory_id, source_kind, source_object_type, source_object_id ` +
|
|
213
221
|
`FROM relations WHERE tenant_id = ? ORDER BY id`).all(tenantId);
|
|
@@ -228,7 +236,8 @@ export function loadStoredGraph(hippoRoot, tenantId, memoryIds) {
|
|
|
228
236
|
});
|
|
229
237
|
}
|
|
230
238
|
/** Run `fn` in ONE read transaction (a single WAL snapshot) so every `load*` read via `txDb` sees a consistent view
|
|
231
|
-
* even if a rebuild commits concurrently (it clears and reinserts entities, so separate reads could mix old entity ids
|
|
239
|
+
* even if a rebuild commits concurrently (it clears and reinserts entities, so separate reads could mix old entity ids
|
|
240
|
+
* with new relation ids). */
|
|
232
241
|
export function withGraphReadSnapshot(hippoRoot, fn) {
|
|
233
242
|
return onHandle(hippoRoot, (db) => {
|
|
234
243
|
return withReadSnapshot(db, () => fn(db));
|