hippo-memory 1.70.0 → 1.72.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/agent-memories/apply.d.ts +0 -11
- package/dist/agent-memories/apply.js +6 -21
- package/dist/agent-memories/claude-code.d.ts +4 -2
- package/dist/agent-memories/claude-code.js +15 -6
- package/dist/agent-memories/codex.js +1 -1
- package/dist/agent-memories/copilot.d.ts +1 -3
- package/dist/agent-memories/copilot.js +1 -17
- package/dist/agent-memories/files.js +23 -12
- package/dist/agent-memories/markdown.d.ts +1 -3
- package/dist/agent-memories/markdown.js +1 -3
- package/dist/agent-memories/project-folds.d.ts +10 -0
- package/dist/agent-memories/project-folds.js +34 -0
- package/dist/agent-memories/report.js +2 -1
- package/dist/agent-memories/sync.d.ts +4 -2
- package/dist/agent-memories/sync.js +18 -11
- package/dist/api/assemble.d.ts +7 -44
- package/dist/api/assemble.js +3 -23
- package/dist/api/audit.d.ts +33 -1
- package/dist/api/audit.js +48 -1
- package/dist/api/auth.d.ts +20 -26
- package/dist/api/auth.js +43 -29
- package/dist/api/auto-sleep.d.ts +5 -2
- package/dist/api/auto-sleep.js +9 -5
- package/dist/api/availability.d.ts +2 -15
- package/dist/api/availability.js +4 -18
- package/dist/api/cards.d.ts +42 -0
- package/dist/api/cards.js +52 -0
- package/dist/api/conflicts.d.ts +28 -0
- package/dist/api/conflicts.js +61 -0
- package/dist/api/context-render.js +4 -3
- package/dist/api/context-select.js +12 -15
- package/dist/api/context-types.d.ts +10 -35
- package/dist/api/context.d.ts +5 -22
- package/dist/api/context.js +38 -46
- package/dist/api/continuity.d.ts +47 -0
- package/dist/api/continuity.js +66 -0
- package/dist/{cli → api}/correction-latency.d.ts +2 -14
- package/dist/{cli → api}/correction-latency.js +2 -14
- package/dist/api/dormant.d.ts +5 -21
- package/dist/api/dormant.js +11 -28
- package/dist/api/drill-down.d.ts +7 -46
- package/dist/api/drill-down.js +6 -27
- package/dist/api/embeddings.d.ts +17 -0
- package/dist/api/embeddings.js +28 -0
- package/dist/api/error-reply.d.ts +8 -0
- package/dist/api/error-reply.js +21 -0
- package/dist/api/forget.d.ts +11 -26
- package/dist/api/forget.js +23 -35
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +5 -9
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +6 -2
- package/dist/api/index.js +6 -2
- package/dist/api/instruction-detect.js +21 -6
- package/dist/api/learn.d.ts +4 -0
- package/dist/api/learn.js +53 -27
- package/dist/api/ledger-db.d.ts +2 -5
- package/dist/api/ledger-db.js +5 -35
- package/dist/api/memories.d.ts +23 -0
- package/dist/api/memories.js +46 -0
- package/dist/api/objects.d.ts +9 -0
- package/dist/api/objects.js +11 -0
- package/dist/api/on-store.js +5 -3
- package/dist/api/outcome.js +1 -1
- package/dist/api/pilot-arm.d.ts +1 -11
- package/dist/api/pilot-arm.js +5 -45
- package/dist/api/predictions.d.ts +11 -0
- package/dist/api/predictions.js +24 -0
- package/dist/api/projects.d.ts +21 -0
- package/dist/api/projects.js +24 -0
- package/dist/api/promote.d.ts +13 -17
- package/dist/api/promote.js +12 -20
- package/dist/api/prompt-hook.d.ts +19 -6
- package/dist/api/prompt-hook.js +54 -13
- package/dist/api/provenance-coverage.d.ts +14 -0
- package/dist/{cli → api}/provenance-coverage.js +2 -6
- package/dist/api/recall-cli.d.ts +58 -0
- package/dist/api/recall-cli.js +103 -0
- package/dist/api/recall-core.js +17 -9
- package/dist/api/recall-finish.d.ts +53 -0
- package/dist/api/recall-finish.js +30 -0
- package/dist/api/recall-history.d.ts +17 -84
- package/dist/api/recall-history.js +15 -88
- package/dist/api/recall-pipeline.d.ts +2 -3
- package/dist/api/recall-pipeline.js +21 -15
- package/dist/api/recall-request.js +1 -1
- package/dist/api/recall-types.d.ts +64 -304
- package/dist/api/recall.d.ts +3 -34
- package/dist/api/recall.js +63 -89
- package/dist/api/refine.d.ts +7 -0
- package/dist/api/refine.js +10 -0
- package/dist/api/remember-local.d.ts +57 -0
- package/dist/api/remember-local.js +90 -0
- package/dist/api/remember.d.ts +20 -2
- package/dist/api/remember.js +16 -3
- package/dist/api/session-end.d.ts +22 -0
- package/dist/api/session-end.js +101 -0
- package/dist/api/sleep-run.d.ts +2 -4
- package/dist/api/sleep-run.js +28 -28
- package/dist/api/sleep.d.ts +9 -28
- package/dist/api/status.d.ts +24 -0
- package/dist/api/status.js +40 -0
- package/dist/api/store-init.d.ts +4 -0
- package/dist/api/store-init.js +9 -0
- package/dist/api/tokens.d.ts +3 -10
- package/dist/api/tokens.js +4 -11
- package/dist/api/types.d.ts +8 -29
- package/dist/api/types.js +10 -23
- package/dist/capture/caller-session.d.ts +0 -3
- package/dist/capture/caller-session.js +1 -12
- package/dist/capture/capture-error.d.ts +2 -2
- package/dist/capture/capture-error.js +23 -18
- package/dist/capture/codex-patch.js +3 -1
- package/dist/capture/command.d.ts +4 -12
- package/dist/capture/command.js +39 -114
- package/dist/capture/compact.d.ts +4 -15
- package/dist/capture/compact.js +26 -30
- package/dist/capture/compaction-items-caller.js +11 -20
- package/dist/capture/compaction-record.d.ts +7 -93
- package/dist/capture/compaction-record.js +34 -399
- package/dist/capture/compaction-spool.d.ts +5 -3
- package/dist/capture/compaction-spool.js +21 -7
- package/dist/capture/copilot-transcript.d.ts +2 -1
- package/dist/capture/copilot-transcript.js +2 -1
- package/dist/capture/extract.d.ts +5 -2
- package/dist/capture/extract.js +4 -3
- package/dist/capture/failure-caller.d.ts +1 -1
- package/dist/capture/failure-caller.js +21 -16
- package/dist/capture/failure-reading.d.ts +2 -1
- package/dist/capture/failure-reading.js +7 -9
- package/dist/capture/pre-compact-caller.js +5 -4
- package/dist/capture/session-digest.d.ts +1 -1
- package/dist/capture/session-digest.js +17 -10
- package/dist/capture/session-end-caller.js +2 -1
- package/dist/capture/session-worker.js +3 -4
- package/dist/capture/transcript.d.ts +4 -11
- package/dist/capture/transcript.js +10 -21
- package/dist/capture/working-state.d.ts +4 -2
- package/dist/capture/working-state.js +4 -2
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +1 -59
- package/dist/cli/audit-prune.js +2 -61
- package/dist/cli/audit.d.ts +1 -1
- package/dist/cli/audit.js +42 -43
- package/dist/cli/auth.d.ts +2 -2
- package/dist/cli/auth.js +61 -44
- package/dist/cli/briefs.d.ts +1 -4
- package/dist/cli/briefs.js +42 -301
- package/dist/cli/card.d.ts +2 -2
- package/dist/cli/card.js +63 -56
- package/dist/cli/client.d.ts +12 -27
- package/dist/cli/client.js +41 -44
- package/dist/cli/compact-resume-payload.js +4 -3
- package/dist/cli/context.d.ts +2 -3
- package/dist/cli/context.js +22 -18
- package/dist/cli/continuity.d.ts +6 -6
- package/dist/cli/continuity.js +81 -86
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +88 -116
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +55 -34
- package/dist/cli/decisions.d.ts +2 -4
- package/dist/cli/decisions.js +18 -309
- package/dist/cli/eval.d.ts +1 -1
- package/dist/cli/eval.js +27 -26
- package/dist/cli/exit.d.ts +6 -0
- package/dist/cli/exit.js +11 -0
- package/dist/cli/explain.d.ts +2 -3
- package/dist/cli/explain.js +25 -27
- package/dist/cli/flag-values.d.ts +6 -1
- package/dist/cli/flag-values.js +42 -15
- package/dist/cli/flags.d.ts +0 -288
- package/dist/cli/flags.js +3 -138
- package/dist/cli/github.d.ts +14 -0
- package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
- package/dist/cli/goals.d.ts +2 -2
- package/dist/cli/goals.js +46 -50
- package/dist/cli/graph.d.ts +3 -0
- package/dist/cli/graph.js +83 -0
- package/dist/cli/hook-runtime.d.ts +12 -32
- package/dist/cli/hook-runtime.js +21 -64
- package/dist/cli/incidents.d.ts +3 -0
- package/dist/cli/incidents.js +112 -0
- package/dist/cli/init.d.ts +2 -2
- package/dist/cli/init.js +33 -30
- package/dist/cli/install-steps.d.ts +2 -1
- package/dist/cli/install-steps.js +13 -14
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +4 -1
- package/dist/cli/lenient-id.d.ts +2 -0
- package/dist/cli/lenient-id.js +13 -0
- package/dist/cli/maintenance.d.ts +5 -5
- package/dist/cli/maintenance.js +37 -43
- package/dist/cli/notes.d.ts +2 -0
- package/dist/cli/notes.js +41 -0
- package/dist/cli/object-verbs.js +4 -3
- package/dist/cli/open-browser.d.ts +14 -0
- package/dist/cli/open-browser.js +26 -0
- package/dist/cli/owner-validation.d.ts +5 -28
- package/dist/cli/owner-validation.js +5 -28
- package/dist/cli/playbooks.d.ts +3 -4
- package/dist/cli/playbooks.js +131 -300
- package/dist/cli/predictions.d.ts +3 -0
- package/dist/cli/predictions.js +175 -0
- package/dist/cli/print.d.ts +2 -5
- package/dist/cli/print.js +3 -5
- package/dist/cli/projects.d.ts +2 -2
- package/dist/cli/projects.js +31 -25
- package/dist/cli/quality-repair-once.d.ts +1 -1
- package/dist/cli/quality-repair-once.js +7 -6
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +67 -137
- package/dist/cli/refine-llm.d.ts +5 -31
- package/dist/cli/refine-llm.js +23 -50
- package/dist/cli/remember.d.ts +3 -3
- package/dist/cli/remember.js +134 -192
- package/dist/cli/scheduler.d.ts +2 -17
- package/dist/cli/scheduler.js +14 -19
- package/dist/cli/serve.js +23 -14
- package/dist/cli/session-hooks.d.ts +11 -19
- package/dist/cli/session-hooks.js +143 -214
- package/dist/cli/setup.d.ts +4 -4
- package/dist/cli/setup.js +35 -30
- package/dist/cli/shared.d.ts +7 -25
- package/dist/cli/shared.js +17 -60
- package/dist/cli/slack.d.ts +2 -2
- package/dist/cli/slack.js +19 -23
- package/dist/cli/sleep-render.js +6 -3
- package/dist/cli/sleep.d.ts +3 -2
- package/dist/cli/sleep.js +17 -49
- package/dist/cli/status.d.ts +11 -14
- package/dist/cli/status.js +74 -120
- package/dist/cli/stdin.d.ts +4 -6
- package/dist/cli/stdin.js +2 -3
- package/dist/cli/transfer.d.ts +9 -9
- package/dist/cli/transfer.js +87 -108
- package/dist/cli/usage.d.ts +0 -79
- package/dist/cli/usage.js +1 -689
- package/dist/cli/verb-row.d.ts +32 -0
- package/dist/cli/verb-row.js +6 -0
- package/dist/cli/verbs/health.d.ts +27 -0
- package/dist/cli/verbs/health.js +232 -0
- package/dist/cli/verbs/memory.d.ts +16 -0
- package/dist/cli/verbs/memory.js +244 -0
- package/dist/cli/verbs/objects.d.ts +20 -0
- package/dist/cli/verbs/objects.js +254 -0
- package/dist/cli/verbs/sessions.d.ts +31 -0
- package/dist/cli/verbs/sessions.js +312 -0
- package/dist/cli/verbs.d.ts +81 -0
- package/dist/cli/verbs.js +7 -0
- package/dist/cli/versioned-verbs.d.ts +51 -0
- package/dist/cli/versioned-verbs.js +79 -0
- package/dist/cli.d.ts +1 -654
- package/dist/cli.js +44 -510
- package/dist/connectors/dlq.d.ts +39 -3
- package/dist/connectors/dlq.js +37 -3
- package/dist/connectors/github/backfill.d.ts +5 -25
- package/dist/connectors/github/backfill.js +26 -52
- package/dist/connectors/github/deletion.d.ts +4 -18
- package/dist/connectors/github/deletion.js +2 -15
- package/dist/connectors/github/dlq.d.ts +8 -33
- package/dist/connectors/github/dlq.js +34 -93
- package/dist/connectors/github/ingest.d.ts +4 -12
- package/dist/connectors/github/ingest.js +5 -36
- package/dist/connectors/github/octokit-client.d.ts +4 -16
- package/dist/connectors/github/octokit-client.js +27 -24
- package/dist/connectors/github/ratelimit.d.ts +3 -14
- package/dist/connectors/github/ratelimit.js +3 -14
- package/dist/connectors/github/scope.d.ts +3 -5
- package/dist/connectors/github/scope.js +3 -5
- package/dist/connectors/github/signature.d.ts +4 -26
- package/dist/connectors/github/signature.js +4 -26
- package/dist/connectors/github/tenant-routing.d.ts +2 -24
- package/dist/connectors/github/tenant-routing.js +4 -26
- package/dist/connectors/github/transform.js +2 -16
- package/dist/connectors/github/types.d.ts +3 -15
- package/dist/connectors/github/types.js +2 -9
- package/dist/connectors/github/webhook.d.ts +3 -16
- package/dist/connectors/github/webhook.js +38 -23
- package/dist/connectors/ingest.d.ts +10 -0
- package/dist/connectors/ingest.js +28 -0
- package/dist/connectors/slack/backfill.d.ts +4 -17
- package/dist/connectors/slack/backfill.js +4 -13
- package/dist/connectors/slack/dlq.d.ts +2 -19
- package/dist/connectors/slack/dlq.js +51 -90
- package/dist/connectors/slack/ingest.d.ts +4 -9
- package/dist/connectors/slack/ingest.js +4 -30
- package/dist/connectors/slack/scope.d.ts +2 -8
- package/dist/connectors/slack/scope.js +2 -8
- package/dist/connectors/slack/signature.d.ts +1 -6
- package/dist/connectors/slack/tenant-routing.d.ts +2 -19
- package/dist/connectors/slack/tenant-routing.js +2 -21
- package/dist/connectors/slack/transform.d.ts +2 -18
- package/dist/connectors/slack/transform.js +2 -18
- package/dist/connectors/slack/types.d.ts +3 -9
- package/dist/connectors/slack/types.js +2 -4
- package/dist/connectors/slack/web-client.js +33 -27
- package/dist/connectors/slack/webhook.d.ts +3 -19
- package/dist/connectors/slack/webhook.js +6 -26
- package/dist/connectors/slack/workspaces.d.ts +4 -24
- package/dist/connectors/slack/workspaces.js +4 -24
- package/dist/consolidate/conflicts.js +7 -15
- package/dist/consolidate/dag-summary.d.ts +8 -0
- package/dist/consolidate/dag-summary.js +41 -0
- package/dist/consolidate/dag.d.ts +5 -28
- package/dist/consolidate/dag.js +29 -84
- package/dist/consolidate/decay.js +7 -19
- package/dist/consolidate/dedupe.d.ts +13 -52
- package/dist/consolidate/dedupe.js +18 -74
- package/dist/consolidate/flush-units.d.ts +3 -4
- package/dist/consolidate/flush-units.js +3 -3
- package/dist/consolidate/half-life-migration.d.ts +3 -26
- package/dist/consolidate/half-life-migration.js +11 -28
- package/dist/consolidate/llm-passes.js +49 -40
- package/dist/consolidate/memory-value-weights.d.ts +2 -13
- package/dist/consolidate/memory-value-weights.js +2 -13
- package/dist/consolidate/memory-value.d.ts +11 -84
- package/dist/consolidate/memory-value.js +18 -105
- package/dist/consolidate/merge.js +12 -33
- package/dist/consolidate/physics-pass.d.ts +6 -1
- package/dist/consolidate/physics-pass.js +27 -9
- package/dist/consolidate/replay.d.ts +6 -38
- package/dist/consolidate/replay.js +25 -56
- package/dist/consolidate/run.js +1 -1
- package/dist/consolidate/sleep.d.ts +1 -8
- package/dist/consolidate/sleep.js +13 -22
- package/dist/consolidate/trace.d.ts +3 -18
- package/dist/consolidate/trace.js +3 -18
- package/dist/consolidate/traces.js +9 -25
- package/dist/core/ablation.d.ts +14 -91
- package/dist/core/ablation.js +16 -91
- package/dist/core/active-scope.d.ts +7 -0
- package/dist/{sharing/scope.js → core/active-scope.js} +5 -12
- package/dist/core/ambient.d.ts +5 -8
- package/dist/core/ambient.js +40 -26
- package/dist/core/api-errors.d.ts +16 -0
- package/dist/core/api-errors.js +20 -0
- package/dist/core/capture-contract.d.ts +4 -2
- package/dist/core/capture-contract.js +4 -2
- package/dist/core/card.d.ts +4 -1
- package/dist/core/card.js +11 -1
- package/dist/core/compaction-timing.d.ts +7 -0
- package/dist/core/compaction-timing.js +9 -0
- package/dist/core/compare.d.ts +11 -67
- package/dist/core/compare.js +9 -63
- package/dist/core/config.d.ts +10 -24
- package/dist/core/config.js +20 -16
- package/dist/core/cosine.d.ts +3 -0
- package/dist/core/cosine.js +19 -0
- package/dist/core/handoff.d.ts +1 -7
- package/dist/core/handoff.js +1 -7
- package/dist/core/markdown.d.ts +6 -0
- package/dist/{store → core}/markdown.js +23 -22
- package/dist/core/memory-audit.d.ts +17 -0
- package/dist/core/memory-audit.js +54 -0
- package/dist/core/memory-quality.js +1 -1
- package/dist/core/memory.d.ts +51 -168
- package/dist/core/memory.js +76 -239
- package/dist/{consolidate → core}/merged-row.d.ts +1 -1
- package/dist/{consolidate → core}/merged-row.js +3 -2
- package/dist/core/package-root.d.ts +3 -0
- package/dist/core/package-root.js +5 -0
- package/dist/core/physics-config.d.ts +1 -4
- package/dist/core/physics-config.js +3 -8
- package/dist/core/physics.d.ts +15 -61
- package/dist/core/physics.js +65 -138
- package/dist/core/prediction.d.ts +3 -0
- package/dist/core/prediction.js +6 -0
- package/dist/core/project-identity.d.ts +20 -58
- package/dist/core/project-identity.js +27 -39
- package/dist/core/project-remote.js +13 -2
- package/dist/core/raw-append-only.d.ts +5 -0
- package/dist/core/raw-append-only.js +7 -0
- package/dist/core/recall-scope.d.ts +69 -0
- package/dist/core/recall-scope.js +138 -0
- package/dist/core/salience.d.ts +1 -7
- package/dist/core/salience.js +1 -7
- package/dist/dashboard/dashboard-actions.js +2 -2
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
- package/dist/dashboard/dashboard-snapshot.js +11 -2
- package/dist/dashboard/dashboard-types.d.ts +2 -1
- package/dist/dashboard/dashboard.d.ts +1 -0
- package/dist/dashboard/dashboard.js +50 -4
- package/dist/db/busy.d.ts +3 -8
- package/dist/db/busy.js +37 -33
- package/dist/db/connect.js +7 -8
- package/dist/db/index.d.ts +3 -3
- package/dist/db/index.js +3 -3
- package/dist/db/migrate.js +3 -3
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/types.d.ts +2 -5
- package/dist/db/migrations/v14.js +2 -3
- package/dist/db/migrations/v15.js +2 -8
- package/dist/db/migrations/v16.js +2 -3
- package/dist/db/migrations/v17.js +2 -3
- package/dist/db/migrations/v19.js +2 -5
- package/dist/db/migrations/v20.js +2 -7
- package/dist/db/migrations/v22.js +4 -17
- package/dist/db/migrations/v23.js +3 -14
- package/dist/db/migrations/v24.js +2 -4
- package/dist/db/migrations/v25.js +3 -8
- package/dist/db/migrations/v26.js +2 -13
- package/dist/db/migrations/v27.js +3 -11
- package/dist/db/migrations/v28.js +2 -14
- package/dist/db/migrations/v29.js +4 -18
- package/dist/db/migrations/v30.js +4 -16
- package/dist/db/migrations/v31.js +2 -15
- package/dist/db/migrations/v32.js +4 -22
- package/dist/db/migrations/v33.js +2 -15
- package/dist/db/migrations/v34.js +2 -11
- package/dist/db/migrations/v35.js +2 -11
- package/dist/db/migrations/v36.js +2 -11
- package/dist/db/migrations/v37.js +8 -33
- package/dist/db/migrations/v38.js +5 -38
- package/dist/db/migrations/v39.js +9 -20
- package/dist/db/migrations/v40.js +2 -9
- package/dist/db/migrations/v41.js +2 -24
- package/dist/db/migrations/v43.js +1 -1
- package/dist/db/migrations/v44.js +2 -8
- package/dist/db/migrations/v45.js +2 -7
- package/dist/db/migrations/v47.js +2 -3
- package/dist/db/migrations/v51.js +1 -1
- package/dist/db/migrations/v55.d.ts +3 -0
- package/dist/db/migrations/v55.js +17 -0
- package/dist/db/open.d.ts +2 -2
- package/dist/db/open.js +21 -9
- package/dist/db/physics-state.d.ts +6 -22
- package/dist/db/physics-state.js +28 -39
- package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
- package/dist/db/raw-archive-mirror-cleanup.js +2 -17
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -2
- package/dist/db/vector-store.d.ts +2 -0
- package/dist/db/vector-store.js +25 -5
- package/dist/db/wal-checkpointer.js +2 -1
- package/dist/doctor.js +85 -27
- package/dist/embeddings/local.d.ts +62 -0
- package/dist/embeddings/local.js +146 -0
- package/dist/embeddings/provider.d.ts +43 -0
- package/dist/{store/embeddings → embeddings}/provider.js +58 -83
- package/dist/embeddings/transformers.d.ts +26 -0
- package/dist/embeddings/transformers.js +89 -0
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +3 -2
- package/dist/eval/eval-stats.d.ts +15 -53
- package/dist/eval/eval-stats.js +12 -42
- package/dist/eval/eval-suite.d.ts +2 -13
- package/dist/eval/eval-suite.js +91 -45
- package/dist/eval/eval.d.ts +6 -24
- package/dist/eval/eval.js +8 -35
- package/dist/eval/judgment.d.ts +0 -3
- package/dist/eval/judgment.js +30 -15
- package/dist/extensions/openclaw-plugin/index.js +1 -1
- package/dist/graph/extract.d.ts +5 -27
- package/dist/graph/extract.js +10 -36
- package/dist/graph/recall.d.ts +7 -20
- package/dist/graph/recall.js +15 -77
- package/dist/graph/stream.d.ts +7 -39
- package/dist/graph/stream.js +11 -34
- package/dist/graph/view.d.ts +9 -35
- package/dist/graph/view.js +24 -44
- package/dist/graph/write.d.ts +1 -1
- package/dist/graph/write.js +9 -9
- package/dist/hooks/codex-session.js +3 -2
- package/dist/hooks/codex-wrapper.js +4 -3
- package/dist/hooks/copilot.js +2 -1
- package/dist/hooks/hook-blocks.d.ts +6 -2
- package/dist/hooks/hook-blocks.js +37 -124
- package/dist/hooks/json-hooks.d.ts +4 -36
- package/dist/hooks/json-hooks.js +22 -59
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +17 -81
- package/dist/hooks/shared.d.ts +6 -21
- package/dist/hooks/shared.js +31 -33
- package/dist/importers/core.d.ts +12 -37
- package/dist/importers/core.js +10 -28
- package/dist/importers/markdown-parse.d.ts +8 -22
- package/dist/importers/markdown-parse.js +8 -25
- package/dist/importers/markdown.js +3 -12
- package/dist/importers/sources.js +12 -39
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +31 -85
- package/dist/index.d.ts +8 -3
- package/dist/index.js +8 -3
- package/dist/learn/autolearn.d.ts +23 -42
- package/dist/learn/autolearn.js +45 -52
- package/dist/learn/churn-git.js +13 -4
- package/dist/learn/extract.d.ts +3 -2
- package/dist/learn/extract.js +8 -8
- package/dist/learn/forward-claim-detector.d.ts +6 -30
- package/dist/learn/forward-claim-detector.js +18 -68
- package/dist/learn/invalidation.d.ts +6 -18
- package/dist/learn/invalidation.js +18 -31
- package/dist/mcp/admin-tools.d.ts +2 -2
- package/dist/mcp/admin-tools.js +30 -53
- package/dist/mcp/format.js +3 -2
- package/dist/mcp/framing.d.ts +1 -0
- package/dist/mcp/framing.js +1 -1
- package/dist/mcp/memory-tools.js +7 -10
- package/dist/mcp/protocol.d.ts +15 -29
- package/dist/mcp/protocol.js +26 -16
- package/dist/mcp/recall-tools.js +14 -11
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +12 -27
- package/dist/mcp/server.d.ts +3 -9
- package/dist/mcp/server.js +5 -16
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +5 -11
- package/dist/mcp/stdio.d.ts +2 -6
- package/dist/mcp/stdio.js +68 -16
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +47 -22
- package/dist/objects/customer-notes.d.ts +9 -44
- package/dist/objects/customer-notes.js +7 -48
- package/dist/objects/decisions.d.ts +14 -52
- package/dist/objects/decisions.js +15 -53
- package/dist/objects/descriptor.d.ts +1 -1
- package/dist/objects/incidents.d.ts +9 -40
- package/dist/objects/incidents.js +7 -41
- package/dist/objects/lifecycle.d.ts +1 -1
- package/dist/objects/lifecycle.js +2 -1
- package/dist/objects/policies.d.ts +13 -91
- package/dist/objects/policies.js +13 -99
- package/dist/objects/processes.d.ts +9 -54
- package/dist/objects/processes.js +7 -61
- package/dist/objects/project-briefs.d.ts +13 -57
- package/dist/objects/project-briefs.js +16 -78
- package/dist/objects/skills.d.ts +9 -44
- package/dist/objects/skills.js +8 -54
- package/dist/postinstall.js +7 -20
- package/dist/predictions/planning-fallacy.d.ts +11 -34
- package/dist/rerankers/clef.js +6 -37
- package/dist/rerankers/cross-encoder.d.ts +31 -2
- package/dist/rerankers/cross-encoder.js +65 -101
- package/dist/rerankers/index.js +5 -4
- package/dist/rerankers/jev.js +11 -10
- package/dist/rerankers/llm.d.ts +2 -11
- package/dist/rerankers/llm.js +14 -14
- package/dist/rerankers/outage-warning.d.ts +5 -2
- package/dist/rerankers/outage-warning.js +7 -4
- package/dist/rerankers/remote.d.ts +1 -0
- package/dist/rerankers/remote.js +2 -0
- package/dist/rerankers/types.d.ts +2 -14
- package/dist/search/bm25-search.js +1 -1
- package/dist/search/boosts.d.ts +0 -2
- package/dist/search/boosts.js +3 -3
- package/dist/search/embed-memories.d.ts +9 -0
- package/dist/search/embed-memories.js +377 -0
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +93 -0
- package/dist/search/hybrid.d.ts +11 -2
- package/dist/search/hybrid.js +9 -4
- package/dist/search/multihop.js +2 -3
- package/dist/search/path-context.d.ts +5 -18
- package/dist/search/path-context.js +5 -18
- package/dist/search/physics-search.d.ts +6 -3
- package/dist/search/physics-search.js +29 -19
- package/dist/search/rerank.js +1 -1
- package/dist/search/rrf.d.ts +7 -35
- package/dist/search/rrf.js +5 -30
- package/dist/search/vector.d.ts +13 -4
- package/dist/search/vector.js +40 -13
- package/dist/server/auth.d.ts +11 -28
- package/dist/server/auth.js +49 -32
- package/dist/server/boot.d.ts +2 -21
- package/dist/server/boot.js +69 -161
- package/dist/server/client-ip.d.ts +3 -21
- package/dist/server/client-ip.js +8 -30
- package/dist/server/deadline.d.ts +0 -2
- package/dist/server/deadline.js +1 -7
- package/dist/server/defaults.d.ts +4 -0
- package/dist/server/defaults.js +5 -0
- package/dist/server/key-check-bounds.d.ts +2 -1
- package/dist/server/lifecycle.d.ts +5 -4
- package/dist/server/lifecycle.js +19 -4
- package/dist/server/mcp-http.js +24 -53
- package/dist/server/rate-limit.d.ts +5 -18
- package/dist/server/rate-limit.js +4 -13
- package/dist/server/request.d.ts +4 -8
- package/dist/server/request.js +16 -19
- package/dist/server/route-checks.d.ts +7 -0
- package/dist/server/route-checks.js +42 -0
- package/dist/server/route-table.d.ts +9 -8
- package/dist/server/route-table.js +127 -139
- package/dist/server/routes/admin.d.ts +8 -8
- package/dist/server/routes/admin.js +35 -49
- package/dist/server/routes/customer-notes.d.ts +6 -6
- package/dist/server/routes/customer-notes.js +8 -14
- package/dist/server/routes/decisions.d.ts +6 -6
- package/dist/server/routes/decisions.js +12 -21
- package/dist/server/routes/incidents.d.ts +6 -6
- package/dist/server/routes/incidents.js +14 -25
- package/dist/server/routes/memories.d.ts +9 -9
- package/dist/server/routes/memories.js +20 -63
- package/dist/server/routes/object-routes.d.ts +6 -11
- package/dist/server/routes/object-routes.js +11 -22
- package/dist/server/routes/policies.d.ts +7 -7
- package/dist/server/routes/policies.js +12 -22
- package/dist/server/routes/predictions.d.ts +6 -6
- package/dist/server/routes/predictions.js +22 -38
- package/dist/server/routes/processes.d.ts +6 -6
- package/dist/server/routes/processes.js +17 -28
- package/dist/server/routes/project-briefs.d.ts +7 -7
- package/dist/server/routes/project-briefs.js +11 -20
- package/dist/server/routes/recall.d.ts +5 -5
- package/dist/server/routes/recall.js +16 -45
- package/dist/server/routes/skills.d.ts +7 -7
- package/dist/server/routes/skills.js +10 -22
- package/dist/server/server-detect.d.ts +15 -53
- package/dist/server/server-detect.js +55 -96
- package/dist/server/sleep-child.js +26 -7
- package/dist/server/sleep-offload.d.ts +11 -5
- package/dist/server/sleep-offload.js +21 -12
- package/dist/server/types.d.ts +32 -18
- package/dist/server/validation.d.ts +3 -2
- package/dist/server/validation.js +15 -33
- package/dist/server.d.ts +7 -6
- package/dist/server.js +8 -6
- package/dist/sharing/global-store.d.ts +19 -0
- package/dist/sharing/global-store.js +75 -0
- package/dist/sharing/global-sync.d.ts +6 -0
- package/dist/sharing/global-sync.js +73 -0
- package/dist/sharing/project-merge.d.ts +11 -19
- package/dist/sharing/project-merge.js +63 -125
- package/dist/sharing/search-both.d.ts +60 -0
- package/dist/sharing/search-both.js +138 -0
- package/dist/sharing/share.d.ts +40 -0
- package/dist/sharing/share.js +229 -0
- package/dist/store/ambient.js +9 -15
- package/dist/store/audit-event.d.ts +5 -13
- package/dist/store/audit-event.js +4 -12
- package/dist/store/audit.d.ts +2 -21
- package/dist/store/audit.js +8 -67
- package/dist/store/auth.d.ts +10 -8
- package/dist/store/auth.js +17 -12
- package/dist/store/candidates.d.ts +23 -5
- package/dist/store/candidates.js +119 -71
- package/dist/store/capture-write.d.ts +17 -0
- package/dist/store/capture-write.js +35 -0
- package/dist/store/card-detail.d.ts +2 -1
- package/dist/store/card-detail.js +2 -1
- package/dist/store/cards.d.ts +14 -9
- package/dist/store/cards.js +72 -126
- package/dist/store/compaction-caller.d.ts +18 -0
- package/dist/store/compaction-caller.js +29 -0
- package/dist/store/compactions-record.d.ts +115 -0
- package/dist/store/compactions-record.js +417 -0
- package/dist/store/compactions.js +6 -4
- package/dist/store/conflicts.d.ts +4 -21
- package/dist/store/conflicts.js +76 -152
- package/dist/store/connectors/dlq.d.ts +10 -0
- package/dist/store/connectors/dlq.js +32 -0
- package/dist/store/connectors/github.d.ts +14 -16
- package/dist/store/connectors/github.js +34 -57
- package/dist/store/connectors/slack.d.ts +2 -11
- package/dist/store/connectors/slack.js +18 -47
- package/dist/store/dashboard-reads.js +11 -14
- package/dist/store/delete-and-batch.d.ts +17 -31
- package/dist/store/delete-and-batch.js +84 -67
- package/dist/store/delivery-recorder.d.ts +15 -4
- package/dist/store/delivery-recorder.js +34 -17
- package/dist/store/descendant-page.js +6 -3
- package/dist/store/diagnostics.js +6 -13
- package/dist/store/dormant.d.ts +8 -30
- package/dist/store/dormant.js +18 -57
- package/dist/store/embeddings/index.d.ts +11 -90
- package/dist/store/embeddings/index.js +18 -523
- package/dist/store/entry-reads.d.ts +34 -61
- package/dist/store/entry-reads.js +111 -136
- package/dist/store/entry-row.d.ts +6 -35
- package/dist/store/entry-row.js +9 -37
- package/dist/store/entry-writes.d.ts +12 -18
- package/dist/store/entry-writes.js +46 -44
- package/dist/store/failure-log-at.d.ts +8 -0
- package/dist/store/failure-log-at.js +16 -0
- package/dist/store/failure-log.d.ts +2 -2
- package/dist/store/failure-log.js +5 -3
- package/dist/{trust → store}/gated-write.d.ts +3 -1
- package/dist/{trust → store}/gated-write.js +7 -5
- package/dist/store/goals.d.ts +3 -40
- package/dist/store/goals.js +41 -178
- package/dist/store/graph-queue.d.ts +6 -22
- package/dist/store/graph-queue.js +14 -45
- package/dist/store/graph-reads.d.ts +11 -35
- package/dist/store/graph-reads.js +24 -60
- package/dist/store/graph-rows.d.ts +3 -6
- package/dist/store/graph-rows.js +6 -9
- package/dist/store/graph-view-rows.d.ts +2 -1
- package/dist/store/graph-view-rows.js +2 -1
- package/dist/store/graph-writes.d.ts +10 -35
- package/dist/store/graph-writes.js +59 -106
- package/dist/store/half-life.d.ts +2 -1
- package/dist/store/half-life.js +14 -16
- package/dist/store/handoffs.d.ts +6 -12
- package/dist/store/handoffs.js +22 -40
- package/dist/store/index-and-stats.d.ts +6 -19
- package/dist/store/index-and-stats.js +36 -84
- package/dist/store/key-writes.js +1 -1
- package/dist/store/ledger-turn.d.ts +9 -0
- package/dist/store/ledger-turn.js +38 -0
- package/dist/store/mirrors.d.ts +2 -6
- package/dist/store/mirrors.js +24 -29
- package/dist/store/open.d.ts +0 -4
- package/dist/store/open.js +42 -62
- package/dist/store/pilot-arm.d.ts +12 -0
- package/dist/store/pilot-arm.js +42 -0
- package/dist/store/planning-fallacy-evidence.d.ts +2 -30
- package/dist/store/planning-fallacy-evidence.js +8 -37
- package/dist/store/port.d.ts +91 -82
- package/dist/store/port.js +8 -0
- package/dist/store/predictions.d.ts +12 -53
- package/dist/store/predictions.js +41 -125
- package/dist/store/project-tags.d.ts +62 -0
- package/dist/store/project-tags.js +67 -0
- package/dist/{cli → store}/quality-repair.js +15 -31
- package/dist/store/quarantine.js +2 -1
- package/dist/store/raw-archive.d.ts +4 -16
- package/dist/store/raw-archive.js +14 -29
- package/dist/store/recall-trace.d.ts +12 -77
- package/dist/store/recall-trace.js +37 -97
- package/dist/store/rejected-values.js +9 -20
- package/dist/store/rejection-probe.d.ts +4 -0
- package/dist/store/rejection-probe.js +19 -0
- package/dist/store/rejection.d.ts +10 -73
- package/dist/store/rejection.js +12 -84
- package/dist/store/report-reads.d.ts +6 -0
- package/dist/store/report-reads.js +29 -0
- package/dist/store/rows.d.ts +9 -19
- package/dist/store/rows.js +36 -34
- package/dist/store/rule-sql.d.ts +14 -0
- package/dist/store/rule-sql.js +56 -0
- package/dist/store/search-rows.d.ts +7 -38
- package/dist/store/search-rows.js +23 -54
- package/dist/store/sessions.d.ts +10 -47
- package/dist/store/sessions.js +21 -75
- package/dist/store/set-aside.d.ts +14 -0
- package/dist/store/set-aside.js +23 -0
- package/dist/store/sqlite/busy.d.ts +3 -0
- package/dist/store/sqlite/busy.js +8 -0
- package/dist/store/sqlite/connector-events-group.js +5 -8
- package/dist/store/sqlite/connector-writes-group.js +3 -3
- package/dist/store/sqlite/entry-writes-group.js +4 -4
- package/dist/store/sqlite/error-codec.js +8 -5
- package/dist/store/sqlite/executor.d.ts +2 -1
- package/dist/store/sqlite/executor.js +12 -5
- package/dist/store/sqlite/graph-reads-group.js +1 -1
- package/dist/store/sqlite/held-connection.d.ts +9 -0
- package/dist/store/sqlite/held-connection.js +41 -0
- package/dist/store/sqlite/local.d.ts +3 -3
- package/dist/store/sqlite/local.js +1 -0
- package/dist/store/sqlite/object-rows.d.ts +1 -1
- package/dist/store/sqlite/object-rows.js +6 -3
- package/dist/store/sqlite/objects-group.d.ts +1 -1
- package/dist/store/sqlite/objects-group.js +5 -3
- package/dist/store/sqlite/quarantine-group.js +2 -2
- package/dist/store/sqlite/store.d.ts +1 -4
- package/dist/store/sqlite/store.js +16 -15
- package/dist/store/sqlite/vector-reads-group.js +2 -2
- package/dist/store/sqlite/worker-jobs.js +1 -1
- package/dist/store/sqlite/worker-ops.d.ts +13 -2
- package/dist/store/sqlite/worker-ops.js +13 -2
- package/dist/store/sqlite/worker-store.js +5 -2
- package/dist/store/summaries.d.ts +11 -63
- package/dist/store/summaries.js +37 -148
- package/dist/store/summary-dirty.js +1 -1
- package/dist/store/tenant-lookup.d.ts +6 -1
- package/dist/store/tenant-lookup.js +7 -0
- package/dist/store/tenant.d.ts +2 -16
- package/dist/store/tenant.js +4 -19
- package/dist/store/token-ledger.d.ts +13 -50
- package/dist/store/token-ledger.js +19 -85
- package/dist/store/usage-reports.js +5 -13
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +171 -0
- package/dist/store/working-memory.d.ts +6 -25
- package/dist/store/working-memory.js +18 -52
- package/dist/support-bundle.js +9 -8
- package/dist/trust/reject-flow.js +3 -5
- package/dist/util/agent-homes.d.ts +15 -0
- package/dist/util/agent-homes.js +34 -0
- package/dist/util/anthropic-messages.d.ts +3 -0
- package/dist/util/anthropic-messages.js +35 -6
- package/dist/util/atomic-write.d.ts +2 -1
- package/dist/util/atomic-write.js +35 -4
- package/dist/util/capped-json.d.ts +6 -0
- package/dist/util/capped-json.js +46 -0
- package/dist/util/chunked.d.ts +3 -0
- package/dist/util/chunked.js +10 -0
- package/dist/util/crash-handlers.d.ts +8 -1
- package/dist/util/crash-handlers.js +52 -10
- package/dist/util/ellipsize.d.ts +3 -0
- package/dist/util/ellipsize.js +5 -0
- package/dist/util/env.d.ts +14 -6
- package/dist/util/env.js +15 -7
- package/dist/util/format.d.ts +3 -0
- package/dist/util/format.js +6 -0
- package/dist/util/home-path.d.ts +2 -1
- package/dist/util/home-path.js +4 -2
- package/dist/util/hook-payload.d.ts +8 -0
- package/dist/util/hook-payload.js +37 -0
- package/dist/util/http-retry.d.ts +9 -1
- package/dist/util/http-retry.js +67 -8
- package/dist/util/http-util.d.ts +0 -8
- package/dist/util/http-util.js +10 -21
- package/dist/util/limits.d.ts +7 -0
- package/dist/util/limits.js +14 -0
- package/dist/util/log.d.ts +7 -2
- package/dist/util/log.js +34 -9
- package/dist/util/request-scope.d.ts +5 -2
- package/dist/util/request-scope.js +13 -7
- package/dist/util/secret-detect.d.ts +5 -30
- package/dist/util/secret-detect.js +19 -40
- package/dist/util/sqlite-blocked.d.ts +2 -0
- package/dist/util/sqlite-blocked.js +5 -0
- package/dist/util/stored-json.d.ts +1 -1
- package/dist/util/stored-json.js +1 -1
- package/dist/util/stream-tee.d.ts +3 -0
- package/dist/util/stream-tee.js +35 -0
- package/dist/util/time.d.ts +4 -0
- package/dist/util/time.js +4 -0
- package/dist/util/token-text.d.ts +1 -4
- package/dist/util/token-text.js +1 -4
- package/dist/util/transcript-tail.d.ts +2 -0
- package/dist/util/transcript-tail.js +24 -23
- package/dist/util/version.d.ts +5 -20
- package/dist/util/version.js +5 -20
- package/dist/{store → util}/yaml.d.ts +1 -5
- package/dist/{store → util}/yaml.js +2 -6
- package/extensions/openclaw-plugin/index.ts +1 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
- package/dist/cli/provenance-coverage.d.ts +0 -18
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/sharing/scope.d.ts +0 -14
- package/dist/sharing/shared.d.ts +0 -187
- package/dist/sharing/shared.js +0 -563
- package/dist/store/embeddings/local.d.ts +0 -15
- package/dist/store/embeddings/local.js +0 -192
- package/dist/store/embeddings/provider.d.ts +0 -77
- package/dist/store/markdown.d.ts +0 -10
- package/dist/store/recall-scope.d.ts +0 -138
- package/dist/store/recall-scope.js +0 -216
- package/dist/store/vector-writes.d.ts +0 -13
- package/dist/store/vector-writes.js +0 -89
- /package/dist/{store → core}/object-types.d.ts +0 -0
- /package/dist/{store → core}/object-types.js +0 -0
- /package/dist/{cli → store}/quality-repair.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.js +0 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
// The graph reads a view and a traversal share. Each opens hippo.db itself unless the caller hands it the handle its snapshot runs on.
|
|
2
|
+
import { DEFAULT_LIST_LIMIT } from '../util/limits.js';
|
|
2
3
|
import { openHippoDb, closeHippoDb, withReadSnapshot } from '../db/index.js';
|
|
4
|
+
import { onHandle } from './open.js';
|
|
3
5
|
import { assertTenantId } from './tenant.js';
|
|
4
6
|
import { GRAPH_ENTITY_TYPES, rowToEntity, rowToRelation, ENTITY_COLS, RELATION_COLS } from './graph-rows.js';
|
|
5
|
-
const DEFAULT_GRAPH_PAGE_SIZE =
|
|
7
|
+
const DEFAULT_GRAPH_PAGE_SIZE = DEFAULT_LIST_LIMIT;
|
|
6
8
|
const DEFAULT_GRAPH_SCAN_LIMIT = 1000;
|
|
7
|
-
/** Entities with an exact `name
|
|
8
|
-
*
|
|
9
|
-
* entity DIRECTLY (not from a globally-capped list) WITHOUT materializing every
|
|
10
|
-
* same-name row when a name maps to many entities. */
|
|
9
|
+
/** Entities with an exact `name`, bounded by `limit` in SQL with a deterministic order, so graph-view focus finds `--entity NAME` directly
|
|
10
|
+
* without materializing every same-name row. */
|
|
11
11
|
export function loadEntitiesByName(hippoRoot, tenantId, name, opts = {}, txDb) {
|
|
12
12
|
assertTenantId('loadEntitiesByName', tenantId);
|
|
13
13
|
const limit = opts.limit ?? DEFAULT_GRAPH_PAGE_SIZE;
|
|
@@ -89,10 +89,7 @@ export function loadRelations(hippoRoot, tenantId, opts = {}, txDb) {
|
|
|
89
89
|
/** Chunk size for IN-list queries: well under SQLite's 999-bound-variable default
|
|
90
90
|
* (leaves headroom for the tenant_id param + the doubled list in neighbour lookups). */
|
|
91
91
|
export const IN_LIST_CHUNK = 400;
|
|
92
|
-
/**
|
|
93
|
-
* Load entities by their primary ids. Resolves the entity rows reached during the BFS
|
|
94
|
-
* (whose `memory_id` maps back to a recall result). Tenant-scoped, read-only.
|
|
95
|
-
*/
|
|
92
|
+
/** Load entities by primary id (the BFS-reached rows whose `memory_id` maps back to a recall result). Tenant-scoped, read-only. */
|
|
96
93
|
export function loadEntitiesByIds(hippoRoot, tenantId, ids, txDb) {
|
|
97
94
|
assertTenantId('loadEntitiesByIds', tenantId);
|
|
98
95
|
if (ids.length === 0)
|
|
@@ -118,13 +115,8 @@ export function loadEntitiesByIds(hippoRoot, tenantId, ids, txDb) {
|
|
|
118
115
|
closeHippoDb(ownDb);
|
|
119
116
|
}
|
|
120
117
|
}
|
|
121
|
-
/**
|
|
122
|
-
*
|
|
123
|
-
* per-hop neighbour query for multi-hop traversal. ONE query for the whole frontier
|
|
124
|
-
* (not one per node): this is the bidirectional read `loadRelations` (from-only) lacks,
|
|
125
|
-
* and avoids an N+1 across BFS frontier nodes. `limit` caps rows for the frontier and
|
|
126
|
-
* must be a non-negative integer (the raw `LIMIT ?` rejects a fractional value).
|
|
127
|
-
*/
|
|
118
|
+
/** All relations touching ANY of `entityIds` in EITHER direction: the per-hop neighbour query for multi-hop traversal, one query for the whole frontier
|
|
119
|
+
* (no N+1). `limit` caps rows and must be a non-negative integer (raw `LIMIT ?` rejects a fraction). */
|
|
128
120
|
export function loadNeighborRelations(hippoRoot, tenantId, entityIds, opts = {}, txDb) {
|
|
129
121
|
assertTenantId('loadNeighborRelations', tenantId);
|
|
130
122
|
if (entityIds.length === 0)
|
|
@@ -136,11 +128,8 @@ export function loadNeighborRelations(hippoRoot, tenantId, entityIds, opts = {},
|
|
|
136
128
|
const ownDb = txDb ? null : openHippoDb(hippoRoot);
|
|
137
129
|
const db = txDb ?? ownDb;
|
|
138
130
|
try {
|
|
139
|
-
// `limit`
|
|
140
|
-
//
|
|
141
|
-
// frontier is bounded by maxNeighbors <= 200 << IN_LIST_CHUNK, so a single chunk,
|
|
142
|
-
// and the BFS re-enforces the per-hop fanout cap), but note the semantics if a
|
|
143
|
-
// tighter total cap is ever needed.
|
|
131
|
+
// `limit` applies PER CHUNK, so a frontier over IN_LIST_CHUNK ids could return limit*chunks rows before the dedup below;
|
|
132
|
+
// harmless today (frontier <= maxNeighbors 200, one chunk, BFS re-enforces the fanout cap).
|
|
144
133
|
const byId = new Map();
|
|
145
134
|
for (let i = 0; i < entityIds.length; i += IN_LIST_CHUNK) {
|
|
146
135
|
const slice = entityIds.slice(i, i + IN_LIST_CHUNK);
|
|
@@ -162,13 +151,8 @@ export function loadNeighborRelations(hippoRoot, tenantId, entityIds, opts = {},
|
|
|
162
151
|
closeHippoDb(ownDb);
|
|
163
152
|
}
|
|
164
153
|
}
|
|
165
|
-
/**
|
|
166
|
-
*
|
|
167
|
-
* touching it). Read. Used by the graph-view focus subgraph so the displayed
|
|
168
|
-
* edges are exactly the intra-union edges: the `LIMIT` only caps genuinely-many
|
|
169
|
-
* intra-union edges: no out-of-union row can evict a valid in-set edge. The
|
|
170
|
-
* caller bounds `entityIds` (<= the view limit), so a single query is safe.
|
|
171
|
-
*/
|
|
154
|
+
/** Relations with BOTH endpoints in `entityIds` (edges AMONG the set), for the graph-view focus subgraph; `LIMIT` caps only intra-union edges,
|
|
155
|
+
* so no out-of-union row evicts a valid one. The caller bounds `entityIds` (<= view limit), so a single query is safe. */
|
|
172
156
|
export function loadRelationsAmong(hippoRoot, tenantId, entityIds, opts = {}, txDb) {
|
|
173
157
|
assertTenantId('loadRelationsAmong', tenantId);
|
|
174
158
|
if (entityIds.length === 0)
|
|
@@ -195,17 +179,13 @@ export function loadRelationsAmong(hippoRoot, tenantId, entityIds, opts = {}, tx
|
|
|
195
179
|
closeHippoDb(ownDb);
|
|
196
180
|
}
|
|
197
181
|
}
|
|
198
|
-
/**
|
|
199
|
-
*
|
|
200
|
-
* multi-hop recall (recall result memory ids -> entities to traverse from). Tenant-
|
|
201
|
-
* scoped, read-only; chunks the IN-list under the SQLite variable cap.
|
|
202
|
-
*/
|
|
182
|
+
/** Map consolidated source memory ids to their graph entities: the SEED step of multi-hop recall. Tenant-scoped, read-only; chunks the IN-list under the
|
|
183
|
+
* SQLite variable cap. */
|
|
203
184
|
export function loadEntitiesByMemoryId(hippoRoot, tenantId, memoryIds) {
|
|
204
185
|
assertTenantId('loadEntitiesByMemoryId', tenantId);
|
|
205
186
|
if (memoryIds.length === 0)
|
|
206
187
|
return [];
|
|
207
|
-
|
|
208
|
-
try {
|
|
188
|
+
return onHandle(hippoRoot, (db) => {
|
|
209
189
|
const out = [];
|
|
210
190
|
for (let i = 0; i < memoryIds.length; i += IN_LIST_CHUNK) {
|
|
211
191
|
const slice = memoryIds.slice(i, i + IN_LIST_CHUNK);
|
|
@@ -220,10 +200,7 @@ export function loadEntitiesByMemoryId(hippoRoot, tenantId, memoryIds) {
|
|
|
220
200
|
out.push(...rows.map(rowToEntity));
|
|
221
201
|
}
|
|
222
202
|
return out;
|
|
223
|
-
}
|
|
224
|
-
finally {
|
|
225
|
-
closeHippoDb(db);
|
|
226
|
-
}
|
|
203
|
+
});
|
|
227
204
|
}
|
|
228
205
|
/** The stored rows a rebuild diffs against, read on the caller's handle so the diff and the apply can share one write lock. */
|
|
229
206
|
export function storedGraphOn(db, tenantId, memoryIds) {
|
|
@@ -231,7 +208,8 @@ export function storedGraphOn(db, tenantId, memoryIds) {
|
|
|
231
208
|
// SAFETY: the SELECT names exactly the columns of StoredEntity.
|
|
232
209
|
const entities = db.prepare(`SELECT id, entity_type, name, memory_id, source_kind, source_object_type, source_object_id FROM entities WHERE tenant_id = ? ORDER BY id`).all(tenantId);
|
|
233
210
|
// SAFETY: the SELECT names exactly the columns of StoredRelation.
|
|
234
|
-
const relations = db.prepare(`SELECT id, from_entity_id, to_entity_id, rel_type, memory_id, source_kind, source_object_type, source_object_id
|
|
211
|
+
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
|
+
`FROM relations WHERE tenant_id = ? ORDER BY id`).all(tenantId);
|
|
235
213
|
return { kinds, entities, relations };
|
|
236
214
|
}
|
|
237
215
|
function memoryKindsOn(db, memoryIds) {
|
|
@@ -244,29 +222,15 @@ function memoryKindsOn(db, memoryIds) {
|
|
|
244
222
|
}
|
|
245
223
|
/** storedGraphOn on its own connection, outside any write lock. */
|
|
246
224
|
export function loadStoredGraph(hippoRoot, tenantId, memoryIds) {
|
|
247
|
-
|
|
248
|
-
try {
|
|
225
|
+
return onHandle(hippoRoot, (db) => {
|
|
249
226
|
return storedGraphOn(db, tenantId, memoryIds);
|
|
250
|
-
}
|
|
251
|
-
finally {
|
|
252
|
-
closeHippoDb(db);
|
|
253
|
-
}
|
|
227
|
+
});
|
|
254
228
|
}
|
|
255
|
-
/**
|
|
256
|
-
*
|
|
257
|
-
* it performs (pass the supplied `txDb` to the `load*` functions) sees a consistent
|
|
258
|
-
* view, even if a `graph extract` / sleep-drain rebuild commits concurrently between
|
|
259
|
-
* reads (the rebuild clears + reinserts entities, so separate reads could otherwise
|
|
260
|
-
* mix old entity ids with new relation ids). Reads only; the connection is opened
|
|
261
|
-
* once and closed after.
|
|
262
|
-
*/
|
|
229
|
+
/** 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 with new relation ids). */
|
|
263
231
|
export function withGraphReadSnapshot(hippoRoot, fn) {
|
|
264
|
-
|
|
265
|
-
try {
|
|
232
|
+
return onHandle(hippoRoot, (db) => {
|
|
266
233
|
return withReadSnapshot(db, () => fn(db));
|
|
267
|
-
}
|
|
268
|
-
finally {
|
|
269
|
-
closeHippoDb(db);
|
|
270
|
-
}
|
|
234
|
+
});
|
|
271
235
|
}
|
|
272
236
|
//# sourceMappingURL=graph-reads.js.map
|
|
@@ -6,9 +6,8 @@ export type SourceKind = 'distilled' | 'superseded';
|
|
|
6
6
|
* provenance path, alongside the memory path). Maps to source_object_type. */
|
|
7
7
|
export type SourceObjectType = 'decision' | 'policy' | 'customer' | 'project';
|
|
8
8
|
export declare const GRAPH_ENTITY_TYPES: ReadonlySet<EntityType>;
|
|
9
|
-
/** A soft (type,id) pointer to the authoritative object row a graph row descends from
|
|
10
|
-
*
|
|
11
|
-
* re-validates it (it is not a hard FK). */
|
|
9
|
+
/** A soft (type,id) pointer to the authoritative object row a graph row descends from; survives a mirror forget/prune
|
|
10
|
+
* (memory_id may go NULL) and is re-validated by the rebuild, not a hard FK. */
|
|
12
11
|
export interface SourceObjectRef {
|
|
13
12
|
type: SourceObjectType;
|
|
14
13
|
id: number;
|
|
@@ -22,9 +21,7 @@ export interface Entity {
|
|
|
22
21
|
tenantId: string;
|
|
23
22
|
entityType: EntityType;
|
|
24
23
|
name: string;
|
|
25
|
-
/** The consolidated source memory this entity
|
|
26
|
-
* mirror is forgotten/pruned (ON DELETE SET NULL) - the entity then survives via
|
|
27
|
-
* its source_object provenance. */
|
|
24
|
+
/** The consolidated source memory this entity came from; NULL once the mirror is forgotten/pruned (ON DELETE SET NULL), then provenance is source_object. */
|
|
28
25
|
memoryId: string | null;
|
|
29
26
|
sourceKind: SourceKind;
|
|
30
27
|
/** The authoritative object this entity is anchored to (object-provenance path).
|
package/dist/store/graph-rows.js
CHANGED
|
@@ -10,9 +10,8 @@ export const VALID_QUEUE_STATES = new Set([
|
|
|
10
10
|
]);
|
|
11
11
|
export const MAX_ENTITY_NAME_LEN = 512;
|
|
12
12
|
export function rowToEntity(row) {
|
|
13
|
-
// SAFETY: entity_type/source_kind/source_object_type are DB CHECK-constrained
|
|
14
|
-
//
|
|
15
|
-
// SourceObjectType enum values, so the row's column values match those types.
|
|
13
|
+
// SAFETY: entity_type/source_kind/source_object_type are DB CHECK-constrained to exactly the EntityType/SourceKind/SourceObjectType enum values,
|
|
14
|
+
// so the row's column values match those types.
|
|
16
15
|
return {
|
|
17
16
|
id: row.id,
|
|
18
17
|
tenantId: row.tenant_id,
|
|
@@ -26,9 +25,8 @@ export function rowToEntity(row) {
|
|
|
26
25
|
};
|
|
27
26
|
}
|
|
28
27
|
export function rowToRelation(row) {
|
|
29
|
-
// SAFETY: rel_type/source_kind/source_object_type are DB CHECK-constrained
|
|
30
|
-
//
|
|
31
|
-
// SourceObjectType enum values, so the row's column values match those types.
|
|
28
|
+
// SAFETY: rel_type/source_kind/source_object_type are DB CHECK-constrained to exactly the RelationType/SourceKind/SourceObjectType enum values,
|
|
29
|
+
// so the row's column values match those types.
|
|
32
30
|
return {
|
|
33
31
|
id: row.id,
|
|
34
32
|
tenantId: row.tenant_id,
|
|
@@ -45,9 +43,8 @@ export function rowToRelation(row) {
|
|
|
45
43
|
export const ENTITY_COLS = `id, tenant_id, entity_type, name, memory_id, source_kind, source_object_type, source_object_id, created_at`;
|
|
46
44
|
export const RELATION_COLS = `id, tenant_id, from_entity_id, to_entity_id, rel_type, memory_id, source_kind, source_object_type, source_object_id, created_at`;
|
|
47
45
|
export function rowToQueueItem(row) {
|
|
48
|
-
// SAFETY: kind/status are DB CHECK-constrained
|
|
49
|
-
//
|
|
50
|
-
// values, so the row's column values match those types.
|
|
46
|
+
// SAFETY: kind/status are DB CHECK-constrained to exactly the SourceKind/GraphQueueStatus enum values,
|
|
47
|
+
// so the row's column values match those types.
|
|
51
48
|
return {
|
|
52
49
|
id: row.id,
|
|
53
50
|
tenantId: row.tenant_id,
|
|
@@ -6,7 +6,8 @@ export interface GraphViewSpec {
|
|
|
6
6
|
readonly limit: number;
|
|
7
7
|
readonly canRead?: CanRead;
|
|
8
8
|
}
|
|
9
|
-
/** What `GraphReads.graphRows` answers, read on `db`: the caller opens the one
|
|
9
|
+
/** What `GraphReads.graphRows` answers, read on `db`: the caller opens the one
|
|
10
|
+
* snapshot that keeps entity ids and relation ids from two different rebuilds apart. */
|
|
10
11
|
export declare function graphViewRows(hippoRoot: string, db: DatabaseSyncLike, tenantId: string, spec: GraphViewSpec): GraphRows;
|
|
11
12
|
export {};
|
|
12
13
|
//# sourceMappingURL=graph-view-rows.d.ts.map
|
|
@@ -52,7 +52,8 @@ function focusRows({ hippoRoot, db, tenantId }, name, limit, canRead) {
|
|
|
52
52
|
relations.length >= limit;
|
|
53
53
|
return { entities, relations, truncated };
|
|
54
54
|
}
|
|
55
|
-
/** What `GraphReads.graphRows` answers, read on `db`: the caller opens the one
|
|
55
|
+
/** What `GraphReads.graphRows` answers, read on `db`: the caller opens the one
|
|
56
|
+
* snapshot that keeps entity ids and relation ids from two different rebuilds apart. */
|
|
56
57
|
export function graphViewRows(hippoRoot, db, tenantId, spec) {
|
|
57
58
|
const source = { hippoRoot, db, tenantId };
|
|
58
59
|
const raw = spec.entity !== undefined ? focusRows(source, spec.entity, spec.limit, spec.canRead) : wholeGraphRows(source, spec.limit);
|
|
@@ -1,34 +1,19 @@
|
|
|
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
|
-
/**
|
|
4
|
-
*
|
|
5
|
-
* with the no-raw invariant intact. The code-level mirror of the DB trigger guard (the
|
|
6
|
-
* trigger is the unbypassable backstop). Two paths:
|
|
7
|
-
* - MEMORY path (`memoryId` not null): the memory must exist, be same-tenant, and be
|
|
8
|
-
* consolidated (distilled/superseded); raw is rejected. Returns its kind.
|
|
9
|
-
* - OBJECT path (`memoryId` null, `sourceObject` set): the object row must exist, be
|
|
10
|
-
* same-tenant, and have status active|superseded (4-way per object table). Objects are
|
|
11
|
-
* consolidated BY CONSTRUCTION, so this returns 'distilled'.
|
|
12
|
-
* All-null (no memory AND no source object) is rejected.
|
|
13
|
-
*/
|
|
3
|
+
/** Resolve `source_kind` for a graph row from AT LEAST ONE valid provenance path, mirroring the DB trigger guard; raw is rejected.
|
|
4
|
+
* MEMORY path: exists, same-tenant, consolidated. OBJECT path (`memoryId` null): same-tenant, active|superseded, yields 'distilled'. All-null is rejected. */
|
|
14
5
|
interface ResolvedGraphSource {
|
|
15
6
|
sourceKind: SourceKind;
|
|
16
7
|
memoryId: string | null;
|
|
17
8
|
}
|
|
18
9
|
export declare function resolveConsolidatedSource(db: DatabaseSyncLike, tenantId: string, memoryId: string | null, sourceObject: SourceObjectRef | null, label: string): ResolvedGraphSource;
|
|
19
|
-
/**
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
*/
|
|
23
|
-
export declare function insertEntity(hippoRoot: string, tenantId: string, opts: InsertEntityOpts, txDb?: DatabaseSyncLike): Entity;
|
|
24
|
-
/** Renames an entity or moves its memory provenance in place, keeping id and created_at; null when the row is gone.
|
|
10
|
+
/** Insert a graph entity on the caller's handle; throws if the source memory is missing / cross-tenant / raw (the DB trigger is the backstop). */
|
|
11
|
+
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 when the row is gone.
|
|
25
13
|
* A delete plus an insert would cascade away every relation that points at it. */
|
|
26
|
-
export declare function
|
|
27
|
-
/**
|
|
28
|
-
|
|
29
|
-
* Both entities must exist in the same tenant; the source memory must be consolidated.
|
|
30
|
-
*/
|
|
31
|
-
export declare function insertRelation(hippoRoot: string, tenantId: string, opts: InsertRelationOpts, txDb?: DatabaseSyncLike): Relation;
|
|
14
|
+
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 memory. */
|
|
16
|
+
export declare function insertRelationRow(db: DatabaseSyncLike, tenantId: string, opts: InsertRelationOpts): Relation;
|
|
32
17
|
/** The source object still holds the loader's rule (active or superseded); a closed or gone one gets no new graph row. */
|
|
33
18
|
export declare function objectInForce(db: DatabaseSyncLike, tenantId: string, ref: SourceObjectRef): boolean;
|
|
34
19
|
/** The lowest-id entity of this type anchored to the source object, which is the row a rebuild keeps. */
|
|
@@ -41,18 +26,8 @@ export declare function deleteRelationRow(db: DatabaseSyncLike, tenantId: string
|
|
|
41
26
|
export declare function runGraphRebuildTransaction<T>(hippoRoot: string, tenantId: string, fn: (txDb: DatabaseSyncLike) => T, opts?: {
|
|
42
27
|
busyWaitMs?: number;
|
|
43
28
|
}): T;
|
|
44
|
-
/**
|
|
45
|
-
*
|
|
46
|
-
* MIRRORLESS object is closed: it has no mirror memory, so `markGraphDirty` cannot
|
|
47
|
-
* enqueue a rebuild (the queue is memory-keyed). Closing must still drop the object's
|
|
48
|
-
* now-stale entity + edges from the graph, so we remove them directly here. Fail-soft
|
|
49
|
-
* like `markGraphDirty` (never throws into the object close caller; graph staleness is
|
|
50
|
-
* recoverable). Deleting the entity cascade-deletes any relation where it is an endpoint
|
|
51
|
-
* (relations FK entities ON DELETE CASCADE); the explicit relations DELETE also covers a
|
|
52
|
-
* relation whose OWN provenance is this object (defensive — every such edge has the object
|
|
53
|
-
* as an endpoint today, so the cascade already covers it). DELETE fires no BEFORE
|
|
54
|
-
* INSERT/UPDATE guard trigger.
|
|
55
|
-
*/
|
|
29
|
+
/** Remove graph rows sourced from one MIRRORLESS object by (type, id) on close: with no mirror memory `markGraphDirty` cannot enqueue a rebuild.
|
|
30
|
+
* Fail-soft like `markGraphDirty`; the explicit relations DELETE also covers a relation whose OWN provenance is this object. */
|
|
56
31
|
export declare function removeGraphEntitiesForObject(hippoRoot: string, tenantId: string, sourceObjectType: SourceObjectType, sourceObjectId: number): void;
|
|
57
32
|
export {};
|
|
58
33
|
//# sourceMappingURL=graph-writes.d.ts.map
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// The writer of the entities and relations tables. Every row resolves a consolidated source first, never a raw memory;
|
|
2
2
|
// the schema triggers are the backstop for a write that skips this module.
|
|
3
3
|
import { openHippoDb, closeHippoDb, withWriteScope } from '../db/index.js';
|
|
4
|
+
import { onHandle } from './open.js';
|
|
4
5
|
import { assertTenantId } from './tenant.js';
|
|
5
6
|
import { errorMessage, log } from '../util/log.js';
|
|
6
7
|
import { GRAPH_ENTITY_TYPES, GRAPH_RELATION_TYPES, MAX_ENTITY_NAME_LEN, rowToEntity, rowToRelation, ENTITY_COLS, RELATION_COLS } from './graph-rows.js';
|
|
@@ -29,10 +30,8 @@ function checkSourceMemory(db, tenantId, memoryId, sourceObject, label) {
|
|
|
29
30
|
// the SELECT above.
|
|
30
31
|
const row = db.prepare(`SELECT kind, tenant_id FROM memories WHERE id = ?`).get(memoryId);
|
|
31
32
|
if (!row) {
|
|
32
|
-
// Stale
|
|
33
|
-
//
|
|
34
|
-
// must NOT roll back the whole tenant rebuild - the active object survives mirror loss.
|
|
35
|
-
// Anchor to the object; drop the dead memory pointer.
|
|
33
|
+
// Stale/forgotten mirror: tolerate it IFF a valid source object gives provenance, so a mirror pruned mid graph-extract does not roll back the tenant
|
|
34
|
+
// rebuild; anchor to the object and drop the dead memory pointer.
|
|
36
35
|
if (sourceObject == null) {
|
|
37
36
|
throw new Error(`${label}: source memory ${memoryId} not found`);
|
|
38
37
|
}
|
|
@@ -54,18 +53,15 @@ function checkSourceMemory(db, tenantId, memoryId, sourceObject, label) {
|
|
|
54
53
|
return { memKind, effectiveMemoryId };
|
|
55
54
|
}
|
|
56
55
|
function assertSourceObjectUsable(db, tenantId, sourceObject, label) {
|
|
57
|
-
// Validate the object pointer WHENEVER
|
|
58
|
-
//
|
|
59
|
-
// the active provenance after ON DELETE SET NULL and could then block the memory delete.
|
|
56
|
+
// Validate the object pointer WHENEVER provided: a dual-set row with a bad object would become the provenance after ON DELETE SET NULL and could block
|
|
57
|
+
// the memory delete.
|
|
60
58
|
if (sourceObject != null) {
|
|
61
59
|
const table = SOURCE_OBJECT_TABLE[sourceObject.type];
|
|
62
60
|
if (!table) {
|
|
63
61
|
throw new Error(`${label}: unsupported source_object_type '${sourceObject.type}'`);
|
|
64
62
|
}
|
|
65
|
-
// `table` is a fixed
|
|
66
|
-
//
|
|
67
|
-
// SAFETY: row's shape matches the single `status` column named in the
|
|
68
|
-
// SELECT above.
|
|
63
|
+
// `table` is a fixed SOURCE_OBJECT_TABLE value (never user-supplied), so interpolation is safe; `id`/`tenant_id` stay parametrized.
|
|
64
|
+
// SAFETY: row's shape matches the single `status` column named in the SELECT above.
|
|
69
65
|
const row = db.prepare(`SELECT status FROM ${table} WHERE id = ? AND tenant_id = ?`).get(sourceObject.id, tenantId);
|
|
70
66
|
if (!row) {
|
|
71
67
|
throw new Error(`${label}: source ${sourceObject.type} ${sourceObject.id} not found for tenant ${tenantId}`);
|
|
@@ -75,11 +71,8 @@ function assertSourceObjectUsable(db, tenantId, sourceObject, label) {
|
|
|
75
71
|
}
|
|
76
72
|
}
|
|
77
73
|
}
|
|
78
|
-
/**
|
|
79
|
-
|
|
80
|
-
* memory is missing / cross-tenant / raw (the DB trigger is the backstop).
|
|
81
|
-
*/
|
|
82
|
-
export function insertEntity(hippoRoot, tenantId, opts, txDb) {
|
|
74
|
+
/** Insert a graph entity on the caller's handle; throws if the source memory is missing / cross-tenant / raw (the DB trigger is the backstop). */
|
|
75
|
+
export function insertEntityRow(db, tenantId, opts) {
|
|
83
76
|
assertTenantId('insertEntity', tenantId);
|
|
84
77
|
if (!GRAPH_ENTITY_TYPES.has(opts.entityType)) {
|
|
85
78
|
throw new Error(`insertEntity: entityType must be one of ${Array.from(GRAPH_ENTITY_TYPES).join('|')}; got ${opts.entityType}`);
|
|
@@ -88,25 +81,17 @@ export function insertEntity(hippoRoot, tenantId, opts, txDb) {
|
|
|
88
81
|
const now = new Date().toISOString();
|
|
89
82
|
const memoryId = opts.memoryId ?? null;
|
|
90
83
|
const sourceObject = opts.sourceObject ?? null;
|
|
91
|
-
const
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
if (!row)
|
|
103
|
-
throw new Error('insertEntity: failed to reload inserted entity');
|
|
104
|
-
return rowToEntity(row);
|
|
105
|
-
}
|
|
106
|
-
finally {
|
|
107
|
-
if (ownDb)
|
|
108
|
-
closeHippoDb(ownDb);
|
|
109
|
-
}
|
|
84
|
+
const { sourceKind, memoryId: effectiveMemoryId } = resolveConsolidatedSource(db, tenantId, memoryId, sourceObject, 'insertEntity');
|
|
85
|
+
const result = db.prepare(`
|
|
86
|
+
INSERT INTO entities(tenant_id, entity_type, name, memory_id, source_kind, source_object_type, source_object_id, created_at)
|
|
87
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
88
|
+
`).run(tenantId, opts.entityType, name, effectiveMemoryId, sourceKind, sourceObject?.type ?? null, sourceObject?.id ?? null, now);
|
|
89
|
+
const id = Number(result.lastInsertRowid ?? 0);
|
|
90
|
+
// SAFETY: row's shape matches the columns named in ENTITY_COLS above.
|
|
91
|
+
const row = db.prepare(`SELECT ${ENTITY_COLS} FROM entities WHERE id = ?`).get(id);
|
|
92
|
+
if (!row)
|
|
93
|
+
throw new Error('insertEntity: failed to reload inserted entity');
|
|
94
|
+
return rowToEntity(row);
|
|
110
95
|
}
|
|
111
96
|
function checkedName(label, raw) {
|
|
112
97
|
const name = (raw ?? '').trim();
|
|
@@ -117,36 +102,26 @@ function checkedName(label, raw) {
|
|
|
117
102
|
}
|
|
118
103
|
return name;
|
|
119
104
|
}
|
|
120
|
-
/** Renames an entity or moves its memory provenance in place, keeping id and created_at; null when the row is gone.
|
|
105
|
+
/** Renames an entity or moves its memory provenance in place on the caller's handle, keeping id and created_at; null when the row is gone.
|
|
121
106
|
* A delete plus an insert would cascade away every relation that points at it. */
|
|
122
|
-
export function
|
|
107
|
+
export function updateEntityRow(db, tenantId, id, opts) {
|
|
123
108
|
assertTenantId('updateEntity', tenantId);
|
|
124
109
|
const name = checkedName('updateEntity', opts.name);
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
.run(name, resolved.memoryId, resolved.sourceKind, id, tenantId);
|
|
138
|
-
return { ...entity, name, memoryId: resolved.memoryId, sourceKind: resolved.sourceKind };
|
|
139
|
-
}
|
|
140
|
-
finally {
|
|
141
|
-
if (db !== txDb)
|
|
142
|
-
closeHippoDb(db);
|
|
143
|
-
}
|
|
110
|
+
// SAFETY: row's shape matches the columns named in ENTITY_COLS above.
|
|
111
|
+
const row = db.prepare(`SELECT ${ENTITY_COLS} FROM entities WHERE id = ? AND tenant_id = ?`).get(id, tenantId);
|
|
112
|
+
if (!row)
|
|
113
|
+
return null;
|
|
114
|
+
const entity = rowToEntity(row);
|
|
115
|
+
const sourceObject = entity.sourceObjectType === undefined || entity.sourceObjectId === undefined
|
|
116
|
+
? null
|
|
117
|
+
: { type: entity.sourceObjectType, id: entity.sourceObjectId };
|
|
118
|
+
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);
|
|
121
|
+
return { ...entity, name, memoryId: resolved.memoryId, sourceKind: resolved.sourceKind };
|
|
144
122
|
}
|
|
145
|
-
/**
|
|
146
|
-
|
|
147
|
-
* Both entities must exist in the same tenant; the source memory must be consolidated.
|
|
148
|
-
*/
|
|
149
|
-
export function insertRelation(hippoRoot, tenantId, opts, txDb) {
|
|
123
|
+
/** Insert a graph relation between two same-tenant entities on the caller's handle, sourced from a consolidated memory. */
|
|
124
|
+
export function insertRelationRow(db, tenantId, opts) {
|
|
150
125
|
assertTenantId('insertRelation', tenantId);
|
|
151
126
|
if (!GRAPH_RELATION_TYPES.has(opts.relType)) {
|
|
152
127
|
throw new Error(`insertRelation: relType must be one of ${Array.from(GRAPH_RELATION_TYPES).join('|')}; got ${opts.relType}`);
|
|
@@ -154,35 +129,27 @@ export function insertRelation(hippoRoot, tenantId, opts, txDb) {
|
|
|
154
129
|
const now = new Date().toISOString();
|
|
155
130
|
const memoryId = opts.memoryId ?? null;
|
|
156
131
|
const sourceObject = opts.sourceObject ?? null;
|
|
157
|
-
const
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
throw new Error(`insertRelation: ${role}_entity ${eid} not found`);
|
|
166
|
-
if (ent.tenant_id !== tenantId) {
|
|
167
|
-
throw new Error(`insertRelation: ${role}_entity ${eid} belongs to another tenant (no cross-tenant edges)`);
|
|
168
|
-
}
|
|
132
|
+
for (const [eid, role] of [[opts.fromEntityId, 'from'], [opts.toEntityId, 'to']]) {
|
|
133
|
+
// SAFETY: ent's shape matches the single `tenant_id` column named in
|
|
134
|
+
// the SELECT above.
|
|
135
|
+
const ent = db.prepare(`SELECT tenant_id FROM entities WHERE id = ?`).get(eid);
|
|
136
|
+
if (!ent)
|
|
137
|
+
throw new Error(`insertRelation: ${role}_entity ${eid} not found`);
|
|
138
|
+
if (ent.tenant_id !== tenantId) {
|
|
139
|
+
throw new Error(`insertRelation: ${role}_entity ${eid} belongs to another tenant (no cross-tenant edges)`);
|
|
169
140
|
}
|
|
170
|
-
const { sourceKind, memoryId: effectiveMemoryId } = resolveConsolidatedSource(db, tenantId, memoryId, sourceObject, 'insertRelation');
|
|
171
|
-
const result = db.prepare(`
|
|
172
|
-
INSERT INTO relations(tenant_id, from_entity_id, to_entity_id, rel_type, memory_id, source_kind, source_object_type, source_object_id, created_at)
|
|
173
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
174
|
-
`).run(tenantId, opts.fromEntityId, opts.toEntityId, opts.relType, effectiveMemoryId, sourceKind, sourceObject?.type ?? null, sourceObject?.id ?? null, now);
|
|
175
|
-
const id = Number(result.lastInsertRowid ?? 0);
|
|
176
|
-
// SAFETY: row's shape matches the columns named in RELATION_COLS above.
|
|
177
|
-
const row = db.prepare(`SELECT ${RELATION_COLS} FROM relations WHERE id = ?`).get(id);
|
|
178
|
-
if (!row)
|
|
179
|
-
throw new Error('insertRelation: failed to reload inserted relation');
|
|
180
|
-
return rowToRelation(row);
|
|
181
|
-
}
|
|
182
|
-
finally {
|
|
183
|
-
if (ownDb)
|
|
184
|
-
closeHippoDb(ownDb);
|
|
185
141
|
}
|
|
142
|
+
const { sourceKind, memoryId: effectiveMemoryId } = resolveConsolidatedSource(db, tenantId, memoryId, sourceObject, 'insertRelation');
|
|
143
|
+
const result = db.prepare(`
|
|
144
|
+
INSERT INTO relations(tenant_id, from_entity_id, to_entity_id, rel_type, memory_id, source_kind, source_object_type, source_object_id, created_at)
|
|
145
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
146
|
+
`).run(tenantId, opts.fromEntityId, opts.toEntityId, opts.relType, effectiveMemoryId, sourceKind, sourceObject?.type ?? null, sourceObject?.id ?? null, now);
|
|
147
|
+
const id = Number(result.lastInsertRowid ?? 0);
|
|
148
|
+
// SAFETY: row's shape matches the columns named in RELATION_COLS above.
|
|
149
|
+
const row = db.prepare(`SELECT ${RELATION_COLS} FROM relations WHERE id = ?`).get(id);
|
|
150
|
+
if (!row)
|
|
151
|
+
throw new Error('insertRelation: failed to reload inserted relation');
|
|
152
|
+
return rowToRelation(row);
|
|
186
153
|
}
|
|
187
154
|
/** The source object still holds the loader's rule (active or superseded); a closed or gone one gets no new graph row. */
|
|
188
155
|
export function objectInForce(db, tenantId, ref) {
|
|
@@ -221,33 +188,19 @@ export function runGraphRebuildTransaction(hippoRoot, tenantId, fn, opts) {
|
|
|
221
188
|
closeHippoDb(db);
|
|
222
189
|
}
|
|
223
190
|
}
|
|
224
|
-
/**
|
|
225
|
-
*
|
|
226
|
-
* MIRRORLESS object is closed: it has no mirror memory, so `markGraphDirty` cannot
|
|
227
|
-
* enqueue a rebuild (the queue is memory-keyed). Closing must still drop the object's
|
|
228
|
-
* now-stale entity + edges from the graph, so we remove them directly here. Fail-soft
|
|
229
|
-
* like `markGraphDirty` (never throws into the object close caller; graph staleness is
|
|
230
|
-
* recoverable). Deleting the entity cascade-deletes any relation where it is an endpoint
|
|
231
|
-
* (relations FK entities ON DELETE CASCADE); the explicit relations DELETE also covers a
|
|
232
|
-
* relation whose OWN provenance is this object (defensive — every such edge has the object
|
|
233
|
-
* as an endpoint today, so the cascade already covers it). DELETE fires no BEFORE
|
|
234
|
-
* INSERT/UPDATE guard trigger.
|
|
235
|
-
*/
|
|
191
|
+
/** Remove graph rows sourced from one MIRRORLESS object by (type, id) on close: with no mirror memory `markGraphDirty` cannot enqueue a rebuild.
|
|
192
|
+
* Fail-soft like `markGraphDirty`; the explicit relations DELETE also covers a relation whose OWN provenance is this object. */
|
|
236
193
|
export function removeGraphEntitiesForObject(hippoRoot, tenantId, sourceObjectType, sourceObjectId) {
|
|
237
194
|
try {
|
|
238
195
|
assertTenantId('removeGraphEntitiesForObject', tenantId);
|
|
239
|
-
|
|
240
|
-
try {
|
|
196
|
+
onHandle(hippoRoot, (db) => {
|
|
241
197
|
withWriteScope(db, 'remove_graph_entities', () => {
|
|
242
198
|
db.prepare(`DELETE FROM relations WHERE tenant_id = ? AND source_object_type = ? AND source_object_id = ?`)
|
|
243
199
|
.run(tenantId, sourceObjectType, sourceObjectId);
|
|
244
200
|
db.prepare(`DELETE FROM entities WHERE tenant_id = ? AND source_object_type = ? AND source_object_id = ?`)
|
|
245
201
|
.run(tenantId, sourceObjectType, sourceObjectId);
|
|
246
202
|
});
|
|
247
|
-
}
|
|
248
|
-
finally {
|
|
249
|
-
closeHippoDb(db);
|
|
250
|
-
}
|
|
203
|
+
});
|
|
251
204
|
}
|
|
252
205
|
catch (err) {
|
|
253
206
|
log.warn(`removeGraphEntitiesForObject: failed for tenant=${tenantId} ${sourceObjectType}#${sourceObjectId}: ${errorMessage(err)}`);
|
|
@@ -20,7 +20,8 @@ export interface HalfLifeMove {
|
|
|
20
20
|
}
|
|
21
21
|
/** The base this store's memories are on: 7 days when none was ever recorded. */
|
|
22
22
|
export declare function recordedHalfLifeBase(hippoRoot: string): number;
|
|
23
|
-
/** Moves the store's half-lives to base `to` as `plan` decides from the rows read here, then
|
|
23
|
+
/** Moves the store's half-lives to base `to` as `plan` decides from the rows read here, then
|
|
24
|
+
* records the base. `outcome` is null when no move is due; a dry run plans and writes nothing. */
|
|
24
25
|
export declare function moveHalfLives<R>(hippoRoot: string, to: number, opts: {
|
|
25
26
|
dryRun: boolean;
|
|
26
27
|
actor: string;
|
package/dist/store/half-life.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
// A half-life move reads, writes, audits and records its base on one handle, so it commits whole or not at all.
|
|
2
|
-
import {
|
|
2
|
+
import { getMeta, setMeta, withWriteScope } from '../db/index.js';
|
|
3
3
|
import { appendAuditEvent } from './audit.js';
|
|
4
4
|
import { conflictResolveAuditsAt, resolvedConflictsAt } from './conflicts.js';
|
|
5
5
|
import { objectMemoryRowsAt, selectAllEntries } from './entry-reads.js';
|
|
6
6
|
import { setHalfLivesAt } from './entry-writes.js';
|
|
7
|
-
import { HALF_LIFE_BASE_META_KEY, TYPED_HALF_LIFE_META_KEY, openStore } from './open.js';
|
|
7
|
+
import { onHandle, HALF_LIFE_BASE_META_KEY, TYPED_HALF_LIFE_META_KEY, openStore } from './open.js';
|
|
8
8
|
/** The base every store used before the base was recorded. */
|
|
9
9
|
const LEGACY_HALF_LIFE_BASE = 7;
|
|
10
10
|
function readBase(db) {
|
|
@@ -13,13 +13,9 @@ function readBase(db) {
|
|
|
13
13
|
}
|
|
14
14
|
/** The base this store's memories are on: 7 days when none was ever recorded. */
|
|
15
15
|
export function recordedHalfLifeBase(hippoRoot) {
|
|
16
|
-
|
|
17
|
-
try {
|
|
16
|
+
return onHandle(hippoRoot, (db) => {
|
|
18
17
|
return readBase(db);
|
|
19
|
-
}
|
|
20
|
-
finally {
|
|
21
|
-
closeHippoDb(db);
|
|
22
|
-
}
|
|
18
|
+
});
|
|
23
19
|
}
|
|
24
20
|
function readRows(db, from, typedPending) {
|
|
25
21
|
const all = selectAllEntries(db);
|
|
@@ -44,13 +40,18 @@ function writeMove(db, move, old, actor) {
|
|
|
44
40
|
record[e.id] = old.get(e.id);
|
|
45
41
|
}
|
|
46
42
|
for (const [tenantId, oldHalfLives] of byTenant) {
|
|
47
|
-
appendAuditEvent(db, {
|
|
43
|
+
appendAuditEvent(db, {
|
|
44
|
+
tenantId,
|
|
45
|
+
actor,
|
|
46
|
+
op: 'half_life_migrate',
|
|
47
|
+
metadata: { from: move.from, to: move.to, ids: Object.keys(oldHalfLives), oldHalfLives }
|
|
48
|
+
});
|
|
48
49
|
}
|
|
49
50
|
}
|
|
50
|
-
/** Moves the store's half-lives to base `to` as `plan` decides from the rows read here, then
|
|
51
|
+
/** Moves the store's half-lives to base `to` as `plan` decides from the rows read here, then
|
|
52
|
+
* records the base. `outcome` is null when no move is due; a dry run plans and writes nothing. */
|
|
51
53
|
export function moveHalfLives(hippoRoot, to, opts, plan) {
|
|
52
|
-
|
|
53
|
-
try {
|
|
54
|
+
return onHandle(hippoRoot, (db) => {
|
|
54
55
|
const run = () => {
|
|
55
56
|
const from = readBase(db);
|
|
56
57
|
const typedPending = getMeta(db, TYPED_HALF_LIFE_META_KEY, '') === '';
|
|
@@ -69,9 +70,6 @@ export function moveHalfLives(hippoRoot, to, opts, plan) {
|
|
|
69
70
|
};
|
|
70
71
|
// Plan, write, audit and record the base under one write lock, so a concurrent write or sleep cannot interleave.
|
|
71
72
|
return opts.dryRun ? run() : withWriteScope(db, 'migrate_half_life', run);
|
|
72
|
-
}
|
|
73
|
-
finally {
|
|
74
|
-
closeHippoDb(db);
|
|
75
|
-
}
|
|
73
|
+
}, openStore);
|
|
76
74
|
}
|
|
77
75
|
//# sourceMappingURL=half-life.js.map
|