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
|
@@ -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,13 +1,15 @@
|
|
|
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';
|
|
5
6
|
import { assertTenantId } from './tenant.js';
|
|
6
7
|
import { GRAPH_ENTITY_TYPES, rowToEntity, rowToRelation, ENTITY_COLS, RELATION_COLS } from './graph-rows.js';
|
|
8
|
+
import { placeholders } from '../util/sql.js';
|
|
7
9
|
const DEFAULT_GRAPH_PAGE_SIZE = DEFAULT_LIST_LIMIT;
|
|
8
10
|
const DEFAULT_GRAPH_SCAN_LIMIT = 1000;
|
|
9
|
-
/** Entities with an exact `name`, bounded by `limit` in SQL with a deterministic order, so graph-view focus finds
|
|
10
|
-
* 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. */
|
|
11
13
|
export function loadEntitiesByName(hippoRoot, tenantId, name, opts = {}, txDb) {
|
|
12
14
|
assertTenantId('loadEntitiesByName', tenantId);
|
|
13
15
|
const limit = opts.limit ?? DEFAULT_GRAPH_PAGE_SIZE;
|
|
@@ -89,7 +91,8 @@ export function loadRelations(hippoRoot, tenantId, opts = {}, txDb) {
|
|
|
89
91
|
/** Chunk size for IN-list queries: well under SQLite's 999-bound-variable default
|
|
90
92
|
* (leaves headroom for the tenant_id param + the doubled list in neighbour lookups). */
|
|
91
93
|
export const IN_LIST_CHUNK = 400;
|
|
92
|
-
/** 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. */
|
|
93
96
|
export function loadEntitiesByIds(hippoRoot, tenantId, ids, txDb) {
|
|
94
97
|
assertTenantId('loadEntitiesByIds', tenantId);
|
|
95
98
|
if (ids.length === 0)
|
|
@@ -100,7 +103,7 @@ export function loadEntitiesByIds(hippoRoot, tenantId, ids, txDb) {
|
|
|
100
103
|
const out = [];
|
|
101
104
|
for (let i = 0; i < ids.length; i += IN_LIST_CHUNK) {
|
|
102
105
|
const slice = ids.slice(i, i + IN_LIST_CHUNK);
|
|
103
|
-
const ph = slice.
|
|
106
|
+
const ph = placeholders(slice.length);
|
|
104
107
|
// SAFETY: rows' shape matches the columns named in ENTITY_COLS above.
|
|
105
108
|
const rows = db.prepare(`
|
|
106
109
|
SELECT ${ENTITY_COLS} FROM entities
|
|
@@ -115,8 +118,9 @@ export function loadEntitiesByIds(hippoRoot, tenantId, ids, txDb) {
|
|
|
115
118
|
closeHippoDb(ownDb);
|
|
116
119
|
}
|
|
117
120
|
}
|
|
118
|
-
/** All relations touching ANY of `entityIds` in EITHER direction: the per-hop neighbour query for multi-hop traversal,
|
|
119
|
-
* (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). */
|
|
120
124
|
export function loadNeighborRelations(hippoRoot, tenantId, entityIds, opts = {}, txDb) {
|
|
121
125
|
assertTenantId('loadNeighborRelations', tenantId);
|
|
122
126
|
if (entityIds.length === 0)
|
|
@@ -128,12 +132,12 @@ export function loadNeighborRelations(hippoRoot, tenantId, entityIds, opts = {},
|
|
|
128
132
|
const ownDb = txDb ? null : openHippoDb(hippoRoot);
|
|
129
133
|
const db = txDb ?? ownDb;
|
|
130
134
|
try {
|
|
131
|
-
// `limit` applies PER CHUNK, so a frontier over IN_LIST_CHUNK ids could return limit*chunks rows before the dedup
|
|
132
|
-
// 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).
|
|
133
137
|
const byId = new Map();
|
|
134
138
|
for (let i = 0; i < entityIds.length; i += IN_LIST_CHUNK) {
|
|
135
139
|
const slice = entityIds.slice(i, i + IN_LIST_CHUNK);
|
|
136
|
-
const ph = slice.
|
|
140
|
+
const ph = placeholders(slice.length);
|
|
137
141
|
// SAFETY: rows' shape matches the columns named in RELATION_COLS above.
|
|
138
142
|
const rows = db.prepare(`
|
|
139
143
|
SELECT ${RELATION_COLS} FROM relations
|
|
@@ -151,8 +155,9 @@ export function loadNeighborRelations(hippoRoot, tenantId, entityIds, opts = {},
|
|
|
151
155
|
closeHippoDb(ownDb);
|
|
152
156
|
}
|
|
153
157
|
}
|
|
154
|
-
/** Relations with BOTH endpoints in `entityIds` (edges AMONG the set), for the graph-view focus subgraph; `LIMIT` caps
|
|
155
|
-
* 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. */
|
|
156
161
|
export function loadRelationsAmong(hippoRoot, tenantId, entityIds, opts = {}, txDb) {
|
|
157
162
|
assertTenantId('loadRelationsAmong', tenantId);
|
|
158
163
|
if (entityIds.length === 0)
|
|
@@ -164,7 +169,7 @@ export function loadRelationsAmong(hippoRoot, tenantId, entityIds, opts = {}, tx
|
|
|
164
169
|
const ownDb = txDb ? null : openHippoDb(hippoRoot);
|
|
165
170
|
const db = txDb ?? ownDb;
|
|
166
171
|
try {
|
|
167
|
-
const ph = entityIds.
|
|
172
|
+
const ph = placeholders(entityIds.length);
|
|
168
173
|
// SAFETY: rows' shape matches the columns named in RELATION_COLS above.
|
|
169
174
|
const rows = db.prepare(`
|
|
170
175
|
SELECT ${RELATION_COLS} FROM relations
|
|
@@ -179,8 +184,8 @@ export function loadRelationsAmong(hippoRoot, tenantId, entityIds, opts = {}, tx
|
|
|
179
184
|
closeHippoDb(ownDb);
|
|
180
185
|
}
|
|
181
186
|
}
|
|
182
|
-
/** Map consolidated source memory ids to their graph entities: the SEED step of multi-hop recall. Tenant-scoped,
|
|
183
|
-
* 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. */
|
|
184
189
|
export function loadEntitiesByMemoryId(hippoRoot, tenantId, memoryIds) {
|
|
185
190
|
assertTenantId('loadEntitiesByMemoryId', tenantId);
|
|
186
191
|
if (memoryIds.length === 0)
|
|
@@ -189,7 +194,7 @@ export function loadEntitiesByMemoryId(hippoRoot, tenantId, memoryIds) {
|
|
|
189
194
|
const out = [];
|
|
190
195
|
for (let i = 0; i < memoryIds.length; i += IN_LIST_CHUNK) {
|
|
191
196
|
const slice = memoryIds.slice(i, i + IN_LIST_CHUNK);
|
|
192
|
-
const ph = slice.
|
|
197
|
+
const ph = placeholders(slice.length);
|
|
193
198
|
// id ASC so chunk-local scan order never decides ties (id is an autoincrement PK).
|
|
194
199
|
// SAFETY: rows' shape matches the columns named in ENTITY_COLS above.
|
|
195
200
|
const rows = db.prepare(`
|
|
@@ -202,11 +207,15 @@ export function loadEntitiesByMemoryId(hippoRoot, tenantId, memoryIds) {
|
|
|
202
207
|
return out;
|
|
203
208
|
});
|
|
204
209
|
}
|
|
205
|
-
/** 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. */
|
|
206
212
|
export function storedGraphOn(db, tenantId, memoryIds) {
|
|
207
213
|
const kinds = memoryKindsOn(db, memoryIds);
|
|
208
214
|
// SAFETY: the SELECT names exactly the columns of StoredEntity.
|
|
209
|
-
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);
|
|
210
219
|
// SAFETY: the SELECT names exactly the columns of StoredRelation.
|
|
211
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 ` +
|
|
212
221
|
`FROM relations WHERE tenant_id = ? ORDER BY id`).all(tenantId);
|
|
@@ -227,7 +236,8 @@ export function loadStoredGraph(hippoRoot, tenantId, memoryIds) {
|
|
|
227
236
|
});
|
|
228
237
|
}
|
|
229
238
|
/** Run `fn` in ONE read transaction (a single WAL snapshot) so every `load*` read via `txDb` sees a consistent view
|
|
230
|
-
* 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). */
|
|
231
241
|
export function withGraphReadSnapshot(hippoRoot, fn) {
|
|
232
242
|
return onHandle(hippoRoot, (db) => {
|
|
233
243
|
return withReadSnapshot(db, () => fn(db));
|
|
@@ -21,7 +21,8 @@ export interface Entity {
|
|
|
21
21
|
tenantId: string;
|
|
22
22
|
entityType: EntityType;
|
|
23
23
|
name: string;
|
|
24
|
-
/** The consolidated source memory this entity came from; NULL once the mirror is forgotten/pruned (ON DELETE SET
|
|
24
|
+
/** The consolidated source memory this entity came from; NULL once the mirror is forgotten/pruned (ON DELETE SET
|
|
25
|
+
* NULL), then provenance is source_object. */
|
|
25
26
|
memoryId: string | null;
|
|
26
27
|
sourceKind: SourceKind;
|
|
27
28
|
/** The authoritative object this entity is anchored to (object-provenance path).
|
|
@@ -68,8 +69,8 @@ export interface RelationRow {
|
|
|
68
69
|
}
|
|
69
70
|
export declare function rowToEntity(row: EntityRow): Entity;
|
|
70
71
|
export declare function rowToRelation(row: RelationRow): Relation;
|
|
71
|
-
export declare const ENTITY_COLS
|
|
72
|
-
export declare const RELATION_COLS
|
|
72
|
+
export declare const ENTITY_COLS: string;
|
|
73
|
+
export declare const RELATION_COLS: string;
|
|
73
74
|
export interface GraphQueueItem {
|
|
74
75
|
id: number;
|
|
75
76
|
tenantId: string;
|
|
@@ -142,4 +143,41 @@ export interface StoredGraph {
|
|
|
142
143
|
readonly entities: readonly StoredEntity[];
|
|
143
144
|
readonly relations: readonly StoredRelation[];
|
|
144
145
|
}
|
|
146
|
+
/** What names an object-derived entity across rebuilds; v38 has no UNIQUE on it, so the diff keeps one row per key. */
|
|
147
|
+
export interface NaturalKey {
|
|
148
|
+
readonly entityType: EntityType;
|
|
149
|
+
readonly sourceObject: SourceObjectRef;
|
|
150
|
+
}
|
|
151
|
+
export interface DesiredEntity extends NaturalKey {
|
|
152
|
+
readonly name: string;
|
|
153
|
+
readonly memoryId: string | null;
|
|
154
|
+
}
|
|
155
|
+
export interface DesiredRelation {
|
|
156
|
+
readonly from: NaturalKey;
|
|
157
|
+
readonly to: NaturalKey;
|
|
158
|
+
readonly relType: RelationType;
|
|
159
|
+
readonly memoryId: string | null;
|
|
160
|
+
readonly sourceObject: SourceObjectRef;
|
|
161
|
+
}
|
|
162
|
+
export interface DesiredGraph {
|
|
163
|
+
readonly entities: readonly DesiredEntity[];
|
|
164
|
+
readonly relations: readonly DesiredRelation[];
|
|
165
|
+
}
|
|
166
|
+
export type GraphOp = {
|
|
167
|
+
readonly op: 'deleteEntity';
|
|
168
|
+
readonly id: number;
|
|
169
|
+
} | {
|
|
170
|
+
readonly op: 'updateEntity';
|
|
171
|
+
readonly id: number;
|
|
172
|
+
readonly entity: DesiredEntity;
|
|
173
|
+
} | {
|
|
174
|
+
readonly op: 'insertEntity';
|
|
175
|
+
readonly entity: DesiredEntity;
|
|
176
|
+
} | {
|
|
177
|
+
readonly op: 'deleteRelation';
|
|
178
|
+
readonly id: number;
|
|
179
|
+
} | {
|
|
180
|
+
readonly op: 'insertRelation';
|
|
181
|
+
readonly relation: DesiredRelation;
|
|
182
|
+
};
|
|
145
183
|
//# sourceMappingURL=graph-rows.d.ts.map
|
package/dist/store/graph-rows.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
// The graph's entity, relation and queue rows as hippo.db holds them, and the types every reader and writer of them
|
|
1
|
+
// The graph's entity, relation and queue rows as hippo.db holds them, and the types every reader and writer of them
|
|
2
|
+
// shares.
|
|
2
3
|
export const GRAPH_ENTITY_TYPES = new Set([
|
|
3
4
|
'person', 'project', 'customer', 'system', 'policy', 'decision',
|
|
4
5
|
]);
|
|
@@ -10,8 +11,8 @@ export const VALID_QUEUE_STATES = new Set([
|
|
|
10
11
|
]);
|
|
11
12
|
export const MAX_ENTITY_NAME_LEN = 512;
|
|
12
13
|
export function rowToEntity(row) {
|
|
13
|
-
// SAFETY: entity_type/source_kind/source_object_type are DB CHECK-constrained to exactly the
|
|
14
|
-
// so the row's column values match those types.
|
|
14
|
+
// SAFETY: entity_type/source_kind/source_object_type are DB CHECK-constrained to exactly the
|
|
15
|
+
// EntityType/SourceKind/SourceObjectType enum values, so the row's column values match those types.
|
|
15
16
|
return {
|
|
16
17
|
id: row.id,
|
|
17
18
|
tenantId: row.tenant_id,
|
|
@@ -25,8 +26,8 @@ export function rowToEntity(row) {
|
|
|
25
26
|
};
|
|
26
27
|
}
|
|
27
28
|
export function rowToRelation(row) {
|
|
28
|
-
// SAFETY: rel_type/source_kind/source_object_type are DB CHECK-constrained to exactly the
|
|
29
|
-
// so the row's column values match those types.
|
|
29
|
+
// SAFETY: rel_type/source_kind/source_object_type are DB CHECK-constrained to exactly the
|
|
30
|
+
// RelationType/SourceKind/SourceObjectType enum values, so the row's column values match those types.
|
|
30
31
|
return {
|
|
31
32
|
id: row.id,
|
|
32
33
|
tenantId: row.tenant_id,
|
|
@@ -40,8 +41,10 @@ export function rowToRelation(row) {
|
|
|
40
41
|
createdAt: row.created_at,
|
|
41
42
|
};
|
|
42
43
|
}
|
|
43
|
-
export const ENTITY_COLS = `id, tenant_id, entity_type, name, memory_id, source_kind, source_object_type,
|
|
44
|
-
|
|
44
|
+
export const ENTITY_COLS = `id, tenant_id, entity_type, name, memory_id, source_kind, source_object_type, ` +
|
|
45
|
+
`source_object_id, created_at`;
|
|
46
|
+
export const RELATION_COLS = `id, tenant_id, from_entity_id, to_entity_id, rel_type, memory_id, source_kind, ` +
|
|
47
|
+
`source_object_type, source_object_id, created_at`;
|
|
45
48
|
export function rowToQueueItem(row) {
|
|
46
49
|
// SAFETY: kind/status are DB CHECK-constrained to exactly the SourceKind/GraphQueueStatus enum values,
|
|
47
50
|
// so the row's column values match those types.
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import { IN_LIST_CHUNK, loadEntities, loadEntitiesByIds, loadEntitiesByName, loadNeighborRelations, loadRelations, loadRelationsAmong } from './graph-reads.js';
|
|
2
|
-
|
|
1
|
+
import { IN_LIST_CHUNK, loadEntities, loadEntitiesByIds, loadEntitiesByName, loadNeighborRelations, loadRelations, loadRelationsAmong, } from './graph-reads.js';
|
|
2
|
+
import { placeholders } from '../util/sql.js';
|
|
3
|
+
/** The items whose source memory `canRead` admits: a NULL memoryId has no scope to hide, and a missing memory fails
|
|
4
|
+
* closed. */
|
|
3
5
|
function readableOnly(db, tenantId, items, canRead) {
|
|
4
6
|
if (!canRead)
|
|
5
7
|
return items;
|
|
@@ -8,7 +10,8 @@ function readableOnly(db, tenantId, items, canRead) {
|
|
|
8
10
|
for (let i = 0; i < ids.length; i += IN_LIST_CHUNK) {
|
|
9
11
|
const slice = ids.slice(i, i + IN_LIST_CHUNK);
|
|
10
12
|
// SAFETY: rows' shape matches the id and scope columns named in the SELECT.
|
|
11
|
-
const rows = db
|
|
13
|
+
const rows = db
|
|
14
|
+
.prepare(`SELECT id, scope FROM memories WHERE +tenant_id = ? AND id IN (${placeholders(slice.length)})`)
|
|
12
15
|
.all(tenantId, ...slice);
|
|
13
16
|
for (const r of rows)
|
|
14
17
|
if (canRead(r.scope))
|
|
@@ -21,9 +24,11 @@ function wholeGraphRows({ hippoRoot, db, tenantId }, limit) {
|
|
|
21
24
|
const relations = loadRelations(hippoRoot, tenantId, { limit }, db);
|
|
22
25
|
return { entities, relations, truncated: entities.length >= limit || relations.length >= limit };
|
|
23
26
|
}
|
|
24
|
-
/** The named entities with their 1-hop neighbours and the edges among that union; null when the caller may read none of
|
|
27
|
+
/** The named entities with their 1-hop neighbours and the edges among that union; null when the caller may read none of
|
|
28
|
+
* the named ones. */
|
|
25
29
|
function focusRows({ hippoRoot, db, tenantId }, name, limit, canRead) {
|
|
26
|
-
// The name is queried directly, so it is found on a graph larger than `limit`; one name can map to many entities, so
|
|
30
|
+
// The name is queried directly, so it is found on a graph larger than `limit`; one name can map to many entities, so
|
|
31
|
+
// the matches are capped.
|
|
27
32
|
const named = loadEntitiesByName(hippoRoot, tenantId, name, { limit }, db);
|
|
28
33
|
// A hidden focus must not answer through its neighbours that the name exists.
|
|
29
34
|
const focus = readableOnly(db, tenantId, named, canRead);
|
|
@@ -43,7 +48,8 @@ function focusRows({ hippoRoot, db, tenantId }, name, limit, canRead) {
|
|
|
43
48
|
}
|
|
44
49
|
const unionIds = [...union].slice(0, limit);
|
|
45
50
|
const entities = loadEntitiesByIds(hippoRoot, tenantId, unionIds, db);
|
|
46
|
-
// Both endpoints in the set: neighbour-to-neighbour edges are included, and the LIMIT never drops one for an
|
|
51
|
+
// Both endpoints in the set: neighbour-to-neighbour edges are included, and the LIMIT never drops one for an
|
|
52
|
+
// out-of-union row.
|
|
47
53
|
const relations = loadRelationsAmong(hippoRoot, tenantId, unionIds, { limit }, db);
|
|
48
54
|
const truncated = named.length >= limit ||
|
|
49
55
|
hop.length >= limit || // neighbour scan capped -> a 1-hop neighbour may be omitted
|
|
@@ -56,7 +62,9 @@ function focusRows({ hippoRoot, db, tenantId }, name, limit, canRead) {
|
|
|
56
62
|
* snapshot that keeps entity ids and relation ids from two different rebuilds apart. */
|
|
57
63
|
export function graphViewRows(hippoRoot, db, tenantId, spec) {
|
|
58
64
|
const source = { hippoRoot, db, tenantId };
|
|
59
|
-
const raw = spec.entity !== undefined
|
|
65
|
+
const raw = spec.entity !== undefined
|
|
66
|
+
? focusRows(source, spec.entity, spec.limit, spec.canRead)
|
|
67
|
+
: wholeGraphRows(source, spec.limit);
|
|
60
68
|
if (raw === null)
|
|
61
69
|
return { entities: [], relations: [], truncated: false };
|
|
62
70
|
return {
|
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
import { type DatabaseSyncLike } from '../db/index.js';
|
|
2
2
|
import { type EntityType, type RelationType, type SourceKind, type SourceObjectType, type SourceObjectRef, type Entity, type Relation, type InsertEntityOpts, type InsertRelationOpts, type UpdateEntityOpts } from './graph-rows.js';
|
|
3
|
-
/** Resolve `source_kind` for a graph row from AT LEAST ONE valid provenance path, mirroring the DB trigger guard; raw
|
|
4
|
-
* MEMORY path: exists, same-tenant, consolidated. OBJECT path (`memoryId` null): same-tenant,
|
|
3
|
+
/** Resolve `source_kind` for a graph row from AT LEAST ONE valid provenance path, mirroring the DB trigger guard; raw
|
|
4
|
+
* is rejected. MEMORY path: exists, same-tenant, consolidated. OBJECT path (`memoryId` null): same-tenant,
|
|
5
|
+
* active|superseded, yields 'distilled'. All-null is rejected. */
|
|
5
6
|
interface ResolvedGraphSource {
|
|
6
7
|
sourceKind: SourceKind;
|
|
7
8
|
memoryId: string | null;
|
|
8
9
|
}
|
|
9
10
|
export declare function resolveConsolidatedSource(db: DatabaseSyncLike, tenantId: string, memoryId: string | null, sourceObject: SourceObjectRef | null, label: string): ResolvedGraphSource;
|
|
10
|
-
/** Insert a graph entity on the caller's handle; throws if the source memory is missing / cross-tenant / raw (the DB
|
|
11
|
+
/** Insert a graph entity on the caller's handle; throws if the source memory is missing / cross-tenant / raw (the DB
|
|
12
|
+
* trigger is the backstop). */
|
|
11
13
|
export declare function insertEntityRow(db: DatabaseSyncLike, tenantId: string, opts: InsertEntityOpts): Entity;
|
|
12
|
-
/** Renames an entity or moves its memory provenance in place on the caller's handle, keeping id and created_at; null
|
|
13
|
-
*
|
|
14
|
+
/** Renames an entity or moves its memory provenance in place on the caller's handle, keeping id and created_at; null
|
|
15
|
+
* when the row is gone. A delete plus an insert would cascade away every relation that points at it. */
|
|
14
16
|
export declare function updateEntityRow(db: DatabaseSyncLike, tenantId: string, id: number, opts: UpdateEntityOpts): Entity | null;
|
|
15
|
-
/** Insert a graph relation between two same-tenant entities on the caller's handle, sourced from a consolidated
|
|
17
|
+
/** Insert a graph relation between two same-tenant entities on the caller's handle, sourced from a consolidated
|
|
18
|
+
* memory. */
|
|
16
19
|
export declare function insertRelationRow(db: DatabaseSyncLike, tenantId: string, opts: InsertRelationOpts): Relation;
|
|
17
|
-
/** The source object still holds the loader's rule (active or superseded); a closed or gone one gets no new graph
|
|
20
|
+
/** The source object still holds the loader's rule (active or superseded); a closed or gone one gets no new graph
|
|
21
|
+
* row. */
|
|
18
22
|
export declare function objectInForce(db: DatabaseSyncLike, tenantId: string, ref: SourceObjectRef): boolean;
|
|
19
23
|
/** The lowest-id entity of this type anchored to the source object, which is the row a rebuild keeps. */
|
|
20
24
|
export declare function entityIdBySource(db: DatabaseSyncLike, tenantId: string, entityType: EntityType, sourceObject: SourceObjectRef): number | undefined;
|
|
@@ -22,12 +26,14 @@ export declare function relationPresent(db: DatabaseSyncLike, tenantId: string,
|
|
|
22
26
|
export declare function deleteEntityRow(db: DatabaseSyncLike, tenantId: string, id: number): void;
|
|
23
27
|
export declare function deleteRelationRow(db: DatabaseSyncLike, tenantId: string, id: number): void;
|
|
24
28
|
/** Runs one tenant's graph writes in `fn` on `txDb` under one BEGIN IMMEDIATE, so two rebuilds serialize instead of
|
|
25
|
-
*
|
|
29
|
+
* interleaving and a throw rolls back the whole chunk. The sole sanctioned place to wrap graph writes in a
|
|
30
|
+
* transaction. */
|
|
26
31
|
export declare function runGraphRebuildTransaction<T>(hippoRoot: string, tenantId: string, fn: (txDb: DatabaseSyncLike) => T, opts?: {
|
|
27
32
|
busyWaitMs?: number;
|
|
28
33
|
}): T;
|
|
29
|
-
/** Remove graph rows sourced from one MIRRORLESS object by (type, id) on close: with no mirror memory `markGraphDirty`
|
|
30
|
-
* Fail-soft like `markGraphDirty`; the explicit relations DELETE also covers a relation whose
|
|
34
|
+
/** Remove graph rows sourced from one MIRRORLESS object by (type, id) on close: with no mirror memory `markGraphDirty`
|
|
35
|
+
* cannot enqueue a rebuild. Fail-soft like `markGraphDirty`; the explicit relations DELETE also covers a relation whose
|
|
36
|
+
* OWN provenance is this object. */
|
|
31
37
|
export declare function removeGraphEntitiesForObject(hippoRoot: string, tenantId: string, sourceObjectType: SourceObjectType, sourceObjectId: number): void;
|
|
32
38
|
export {};
|
|
33
39
|
//# sourceMappingURL=graph-writes.d.ts.map
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { openHippoDb, closeHippoDb, withWriteScope } from '../db/index.js';
|
|
4
4
|
import { onHandle } from './open.js';
|
|
5
5
|
import { assertTenantId } from './tenant.js';
|
|
6
|
-
import { errorMessage, log } from '../util/log.js';
|
|
6
|
+
import { errorMessage, log, errorFields } from '../util/log.js';
|
|
7
7
|
import { GRAPH_ENTITY_TYPES, GRAPH_RELATION_TYPES, MAX_ENTITY_NAME_LEN, rowToEntity, rowToRelation, ENTITY_COLS, RELATION_COLS } from './graph-rows.js';
|
|
8
8
|
const SOURCE_OBJECT_TABLE = {
|
|
9
9
|
decision: 'decisions',
|
|
@@ -30,8 +30,8 @@ function checkSourceMemory(db, tenantId, memoryId, sourceObject, label) {
|
|
|
30
30
|
// the SELECT above.
|
|
31
31
|
const row = db.prepare(`SELECT kind, tenant_id FROM memories WHERE id = ?`).get(memoryId);
|
|
32
32
|
if (!row) {
|
|
33
|
-
// Stale/forgotten mirror: tolerate it IFF a valid source object gives provenance, so a mirror pruned mid
|
|
34
|
-
// rebuild; anchor to the object and drop the dead memory pointer.
|
|
33
|
+
// Stale/forgotten mirror: tolerate it IFF a valid source object gives provenance, so a mirror pruned mid
|
|
34
|
+
// graph-extract does not roll back the tenant rebuild; anchor to the object and drop the dead memory pointer.
|
|
35
35
|
if (sourceObject == null) {
|
|
36
36
|
throw new Error(`${label}: source memory ${memoryId} not found`);
|
|
37
37
|
}
|
|
@@ -53,25 +53,29 @@ function checkSourceMemory(db, tenantId, memoryId, sourceObject, label) {
|
|
|
53
53
|
return { memKind, effectiveMemoryId };
|
|
54
54
|
}
|
|
55
55
|
function assertSourceObjectUsable(db, tenantId, sourceObject, label) {
|
|
56
|
-
// Validate the object pointer WHENEVER provided: a dual-set row with a bad object would become the provenance after
|
|
57
|
-
// the memory delete.
|
|
56
|
+
// Validate the object pointer WHENEVER provided: a dual-set row with a bad object would become the provenance after
|
|
57
|
+
// ON DELETE SET NULL and could block the memory delete.
|
|
58
58
|
if (sourceObject != null) {
|
|
59
59
|
const table = SOURCE_OBJECT_TABLE[sourceObject.type];
|
|
60
60
|
if (!table) {
|
|
61
61
|
throw new Error(`${label}: unsupported source_object_type '${sourceObject.type}'`);
|
|
62
62
|
}
|
|
63
|
-
// `table` is a fixed SOURCE_OBJECT_TABLE value (never user-supplied), so interpolation is safe; `id`/`tenant_id`
|
|
64
|
-
// SAFETY: row's shape matches the single `status` column named in the SELECT above.
|
|
65
|
-
const row = db
|
|
63
|
+
// `table` is a fixed SOURCE_OBJECT_TABLE value (never user-supplied), so interpolation is safe; `id`/`tenant_id`
|
|
64
|
+
// stay parametrized. SAFETY: row's shape matches the single `status` column named in the SELECT above.
|
|
65
|
+
const row = db
|
|
66
|
+
.prepare(`SELECT status FROM ${table} WHERE id = ? AND tenant_id = ?`)
|
|
67
|
+
.get(sourceObject.id, tenantId);
|
|
66
68
|
if (!row) {
|
|
67
69
|
throw new Error(`${label}: source ${sourceObject.type} ${sourceObject.id} not found for tenant ${tenantId}`);
|
|
68
70
|
}
|
|
69
71
|
if (row.status !== 'active' && row.status !== 'superseded') {
|
|
70
|
-
throw new Error(`${label}: source ${sourceObject.type} ${sourceObject.id} has status '${row.status}' (must be
|
|
72
|
+
throw new Error(`${label}: source ${sourceObject.type} ${sourceObject.id} has status '${row.status}' (must be ` +
|
|
73
|
+
`active|superseded)`);
|
|
71
74
|
}
|
|
72
75
|
}
|
|
73
76
|
}
|
|
74
|
-
/** Insert a graph entity on the caller's handle; throws if the source memory is missing / cross-tenant / raw (the DB
|
|
77
|
+
/** Insert a graph entity on the caller's handle; throws if the source memory is missing / cross-tenant / raw (the DB
|
|
78
|
+
* trigger is the backstop). */
|
|
75
79
|
export function insertEntityRow(db, tenantId, opts) {
|
|
76
80
|
assertTenantId('insertEntity', tenantId);
|
|
77
81
|
if (!GRAPH_ENTITY_TYPES.has(opts.entityType)) {
|
|
@@ -82,10 +86,13 @@ export function insertEntityRow(db, tenantId, opts) {
|
|
|
82
86
|
const memoryId = opts.memoryId ?? null;
|
|
83
87
|
const sourceObject = opts.sourceObject ?? null;
|
|
84
88
|
const { sourceKind, memoryId: effectiveMemoryId } = resolveConsolidatedSource(db, tenantId, memoryId, sourceObject, 'insertEntity');
|
|
85
|
-
const result = db
|
|
86
|
-
|
|
89
|
+
const result = db
|
|
90
|
+
.prepare(`
|
|
91
|
+
INSERT INTO entities(tenant_id, entity_type, name, memory_id, source_kind, source_object_type, source_object_id,
|
|
92
|
+
created_at)
|
|
87
93
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
88
|
-
`)
|
|
94
|
+
`)
|
|
95
|
+
.run(tenantId, opts.entityType, name, effectiveMemoryId, sourceKind, sourceObject?.type ?? null, sourceObject?.id ?? null, now);
|
|
89
96
|
const id = Number(result.lastInsertRowid ?? 0);
|
|
90
97
|
// SAFETY: row's shape matches the columns named in ENTITY_COLS above.
|
|
91
98
|
const row = db.prepare(`SELECT ${ENTITY_COLS} FROM entities WHERE id = ?`).get(id);
|
|
@@ -102,8 +109,8 @@ function checkedName(label, raw) {
|
|
|
102
109
|
}
|
|
103
110
|
return name;
|
|
104
111
|
}
|
|
105
|
-
/** Renames an entity or moves its memory provenance in place on the caller's handle, keeping id and created_at; null
|
|
106
|
-
*
|
|
112
|
+
/** Renames an entity or moves its memory provenance in place on the caller's handle, keeping id and created_at; null
|
|
113
|
+
* when the row is gone. A delete plus an insert would cascade away every relation that points at it. */
|
|
107
114
|
export function updateEntityRow(db, tenantId, id, opts) {
|
|
108
115
|
assertTenantId('updateEntity', tenantId);
|
|
109
116
|
const name = checkedName('updateEntity', opts.name);
|
|
@@ -116,19 +123,10 @@ export function updateEntityRow(db, tenantId, id, opts) {
|
|
|
116
123
|
? null
|
|
117
124
|
: { type: entity.sourceObjectType, id: entity.sourceObjectId };
|
|
118
125
|
const resolved = resolveConsolidatedSource(db, tenantId, opts.memoryId ?? null, sourceObject, 'updateEntity');
|
|
119
|
-
db.prepare(`UPDATE entities SET name = ?, memory_id = ?, source_kind = ? WHERE id = ? AND tenant_id = ?`)
|
|
120
|
-
.run(name, resolved.memoryId, resolved.sourceKind, id, tenantId);
|
|
126
|
+
db.prepare(`UPDATE entities SET name = ?, memory_id = ?, source_kind = ? WHERE id = ? AND tenant_id = ?`).run(name, resolved.memoryId, resolved.sourceKind, id, tenantId);
|
|
121
127
|
return { ...entity, name, memoryId: resolved.memoryId, sourceKind: resolved.sourceKind };
|
|
122
128
|
}
|
|
123
|
-
|
|
124
|
-
export function insertRelationRow(db, tenantId, opts) {
|
|
125
|
-
assertTenantId('insertRelation', tenantId);
|
|
126
|
-
if (!GRAPH_RELATION_TYPES.has(opts.relType)) {
|
|
127
|
-
throw new Error(`insertRelation: relType must be one of ${Array.from(GRAPH_RELATION_TYPES).join('|')}; got ${opts.relType}`);
|
|
128
|
-
}
|
|
129
|
-
const now = new Date().toISOString();
|
|
130
|
-
const memoryId = opts.memoryId ?? null;
|
|
131
|
-
const sourceObject = opts.sourceObject ?? null;
|
|
129
|
+
function assertEndpointsInTenant(db, tenantId, opts) {
|
|
132
130
|
for (const [eid, role] of [[opts.fromEntityId, 'from'], [opts.toEntityId, 'to']]) {
|
|
133
131
|
// SAFETY: ent's shape matches the single `tenant_id` column named in
|
|
134
132
|
// the SELECT above.
|
|
@@ -139,11 +137,26 @@ export function insertRelationRow(db, tenantId, opts) {
|
|
|
139
137
|
throw new Error(`insertRelation: ${role}_entity ${eid} belongs to another tenant (no cross-tenant edges)`);
|
|
140
138
|
}
|
|
141
139
|
}
|
|
140
|
+
}
|
|
141
|
+
/** Insert a graph relation between two same-tenant entities on the caller's handle, sourced from a consolidated
|
|
142
|
+
* memory. */
|
|
143
|
+
export function insertRelationRow(db, tenantId, opts) {
|
|
144
|
+
assertTenantId('insertRelation', tenantId);
|
|
145
|
+
if (!GRAPH_RELATION_TYPES.has(opts.relType)) {
|
|
146
|
+
throw new Error(`insertRelation: relType must be one of ${Array.from(GRAPH_RELATION_TYPES).join('|')}; got ${opts.relType}`);
|
|
147
|
+
}
|
|
148
|
+
const now = new Date().toISOString();
|
|
149
|
+
const memoryId = opts.memoryId ?? null;
|
|
150
|
+
const sourceObject = opts.sourceObject ?? null;
|
|
151
|
+
assertEndpointsInTenant(db, tenantId, opts);
|
|
142
152
|
const { sourceKind, memoryId: effectiveMemoryId } = resolveConsolidatedSource(db, tenantId, memoryId, sourceObject, 'insertRelation');
|
|
143
|
-
const result = db
|
|
144
|
-
|
|
153
|
+
const result = db
|
|
154
|
+
.prepare(`
|
|
155
|
+
INSERT INTO relations(tenant_id, from_entity_id, to_entity_id, rel_type, memory_id, source_kind, source_object_type,
|
|
156
|
+
source_object_id, created_at)
|
|
145
157
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
146
|
-
`)
|
|
158
|
+
`)
|
|
159
|
+
.run(tenantId, opts.fromEntityId, opts.toEntityId, opts.relType, effectiveMemoryId, sourceKind, sourceObject?.type ?? null, sourceObject?.id ?? null, now);
|
|
147
160
|
const id = Number(result.lastInsertRowid ?? 0);
|
|
148
161
|
// SAFETY: row's shape matches the columns named in RELATION_COLS above.
|
|
149
162
|
const row = db.prepare(`SELECT ${RELATION_COLS} FROM relations WHERE id = ?`).get(id);
|
|
@@ -151,7 +164,8 @@ export function insertRelationRow(db, tenantId, opts) {
|
|
|
151
164
|
throw new Error('insertRelation: failed to reload inserted relation');
|
|
152
165
|
return rowToRelation(row);
|
|
153
166
|
}
|
|
154
|
-
/** The source object still holds the loader's rule (active or superseded); a closed or gone one gets no new graph
|
|
167
|
+
/** The source object still holds the loader's rule (active or superseded); a closed or gone one gets no new graph
|
|
168
|
+
* row. */
|
|
155
169
|
export function objectInForce(db, tenantId, ref) {
|
|
156
170
|
// `table` comes from the fixed SOURCE_OBJECT_TABLE map, never from input.
|
|
157
171
|
const table = SOURCE_OBJECT_TABLE[ref.type];
|
|
@@ -162,12 +176,18 @@ export function objectInForce(db, tenantId, ref) {
|
|
|
162
176
|
/** The lowest-id entity of this type anchored to the source object, which is the row a rebuild keeps. */
|
|
163
177
|
export function entityIdBySource(db, tenantId, entityType, sourceObject) {
|
|
164
178
|
// SAFETY: row's shape matches the single `id` column named in the SELECT.
|
|
165
|
-
const row = db
|
|
179
|
+
const row = db
|
|
180
|
+
.prepare(`SELECT id FROM entities WHERE tenant_id = ? AND entity_type = ? AND source_object_type = ? AND ` +
|
|
181
|
+
`source_object_id = ? ORDER BY id LIMIT 1`)
|
|
182
|
+
.get(tenantId, entityType, sourceObject.type, sourceObject.id);
|
|
166
183
|
return row?.id;
|
|
167
184
|
}
|
|
168
185
|
export function relationPresent(db, tenantId, fromEntityId, toEntityId, relType) {
|
|
169
186
|
// SAFETY: row's shape matches the single aliased column named in the SELECT.
|
|
170
|
-
const present = db
|
|
187
|
+
const present = db
|
|
188
|
+
.prepare(`SELECT 1 AS hit FROM relations WHERE tenant_id = ? AND from_entity_id = ? AND to_entity_id = ? AND rel_type = ` +
|
|
189
|
+
`? LIMIT 1`)
|
|
190
|
+
.get(tenantId, fromEntityId, toEntityId, relType);
|
|
171
191
|
return present !== undefined;
|
|
172
192
|
}
|
|
173
193
|
export function deleteEntityRow(db, tenantId, id) {
|
|
@@ -177,7 +197,8 @@ export function deleteRelationRow(db, tenantId, id) {
|
|
|
177
197
|
db.prepare(`DELETE FROM relations WHERE id = ? AND tenant_id = ?`).run(id, tenantId);
|
|
178
198
|
}
|
|
179
199
|
/** Runs one tenant's graph writes in `fn` on `txDb` under one BEGIN IMMEDIATE, so two rebuilds serialize instead of
|
|
180
|
-
*
|
|
200
|
+
* interleaving and a throw rolls back the whole chunk. The sole sanctioned place to wrap graph writes in a
|
|
201
|
+
* transaction. */
|
|
181
202
|
export function runGraphRebuildTransaction(hippoRoot, tenantId, fn, opts) {
|
|
182
203
|
assertTenantId('runGraphRebuildTransaction', tenantId);
|
|
183
204
|
const db = openHippoDb(hippoRoot, opts);
|
|
@@ -188,8 +209,9 @@ export function runGraphRebuildTransaction(hippoRoot, tenantId, fn, opts) {
|
|
|
188
209
|
closeHippoDb(db);
|
|
189
210
|
}
|
|
190
211
|
}
|
|
191
|
-
/** Remove graph rows sourced from one MIRRORLESS object by (type, id) on close: with no mirror memory `markGraphDirty`
|
|
192
|
-
* Fail-soft like `markGraphDirty`; the explicit relations DELETE also covers a relation whose
|
|
212
|
+
/** Remove graph rows sourced from one MIRRORLESS object by (type, id) on close: with no mirror memory `markGraphDirty`
|
|
213
|
+
* cannot enqueue a rebuild. Fail-soft like `markGraphDirty`; the explicit relations DELETE also covers a relation whose
|
|
214
|
+
* OWN provenance is this object. */
|
|
193
215
|
export function removeGraphEntitiesForObject(hippoRoot, tenantId, sourceObjectType, sourceObjectId) {
|
|
194
216
|
try {
|
|
195
217
|
assertTenantId('removeGraphEntitiesForObject', tenantId);
|
|
@@ -203,7 +225,8 @@ export function removeGraphEntitiesForObject(hippoRoot, tenantId, sourceObjectTy
|
|
|
203
225
|
});
|
|
204
226
|
}
|
|
205
227
|
catch (err) {
|
|
206
|
-
log.warn(`removeGraphEntitiesForObject: failed for tenant=${tenantId} ${sourceObjectType}#${sourceObjectId}:
|
|
228
|
+
log.warn(`removeGraphEntitiesForObject: failed for tenant=${tenantId} ${sourceObjectType}#${sourceObjectId}: ` +
|
|
229
|
+
`${errorMessage(err)}`, errorFields(err));
|
|
207
230
|
}
|
|
208
231
|
}
|
|
209
232
|
//# sourceMappingURL=graph-writes.js.map
|
package/dist/store/half-life.js
CHANGED
|
@@ -34,9 +34,9 @@ function writeMove(db, move, old, actor) {
|
|
|
34
34
|
const byTenant = new Map();
|
|
35
35
|
for (const e of move.entries) {
|
|
36
36
|
// One record per tenant, filled in place: copying it per row made the write grow with the square of the store.
|
|
37
|
-
let record = byTenant.get(e.
|
|
37
|
+
let record = byTenant.get(e.tenant_id);
|
|
38
38
|
if (!record)
|
|
39
|
-
byTenant.set(e.
|
|
39
|
+
byTenant.set(e.tenant_id, (record = {}));
|
|
40
40
|
record[e.id] = old.get(e.id);
|
|
41
41
|
}
|
|
42
42
|
for (const [tenantId, oldHalfLives] of byTenant) {
|