hippo-memory 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-memories/apply.d.ts +7 -5
- package/dist/agent-memories/apply.js +66 -39
- package/dist/agent-memories/claude-code.d.ts +8 -2
- package/dist/agent-memories/claude-code.js +26 -7
- package/dist/agent-memories/copilot.js +2 -1
- package/dist/agent-memories/files.js +2 -1
- package/dist/agent-memories/legacy.d.ts +6 -3
- package/dist/agent-memories/legacy.js +35 -14
- package/dist/agent-memories/markdown.d.ts +3 -1
- package/dist/agent-memories/markdown.js +3 -1
- package/dist/agent-memories/openclaw.js +5 -2
- package/dist/agent-memories/plan.js +11 -1
- package/dist/agent-memories/project-folds.js +2 -1
- package/dist/agent-memories/report.d.ts +4 -1
- package/dist/agent-memories/report.js +43 -9
- package/dist/agent-memories/source.d.ts +8 -2
- package/dist/agent-memories/source.js +11 -3
- package/dist/agent-memories/sync.d.ts +7 -2
- package/dist/agent-memories/sync.js +141 -101
- package/dist/api/assemble.d.ts +6 -4
- package/dist/api/assemble.js +11 -6
- package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
- package/dist/api/{audit.js → auth/audit.js} +11 -11
- package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -15
- package/dist/api/{auth.js → auth/auth.js} +46 -29
- package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
- package/dist/api/{quarantine.js → auth/quarantine.js} +8 -8
- package/dist/api/auth/session-owners.d.ts +10 -0
- package/dist/api/auth/session-owners.js +35 -0
- package/dist/api/availability.d.ts +3 -1
- package/dist/api/availability.js +3 -1
- package/dist/api/busy.d.ts +2 -0
- package/dist/api/busy.js +2 -0
- package/dist/api/cli-surface.d.ts +6 -0
- package/dist/api/cli-surface.js +6 -0
- package/dist/api/config-of.d.ts +5 -0
- package/dist/api/config-of.js +6 -0
- package/dist/api/context-auto.d.ts +4 -1
- package/dist/api/context-auto.js +10 -2
- package/dist/api/context-render.js +14 -7
- package/dist/api/context-select.d.ts +4 -1
- package/dist/api/context-select.js +23 -14
- package/dist/api/context-types.d.ts +38 -12
- package/dist/api/context.d.ts +8 -5
- package/dist/api/context.js +112 -57
- package/dist/api/continuity.d.ts +24 -21
- package/dist/api/continuity.js +18 -20
- package/dist/api/correction-latency.d.ts +3 -1
- package/dist/api/correction-latency.js +3 -1
- package/dist/api/error-reply.d.ts +4 -1
- package/dist/api/error-reply.js +12 -3
- package/dist/api/index.d.ts +39 -23
- package/dist/api/index.js +21 -23
- package/dist/api/instruction-detect.d.ts +4 -1
- package/dist/api/instruction-detect.js +75 -20
- package/dist/api/ledger-db.d.ts +15 -11
- package/dist/api/ledger-db.js +21 -23
- package/dist/api/memories/conflicts.d.ts +33 -0
- package/dist/api/memories/conflicts.js +67 -0
- package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
- package/dist/api/{forget.js → memories/forget.js} +22 -15
- package/dist/api/memories/memories.d.ts +27 -0
- package/dist/api/{memories.js → memories/memories.js} +16 -21
- package/dist/api/memories/outcome.d.ts +22 -0
- package/dist/api/{outcome.js → memories/outcome.js} +14 -8
- package/dist/api/memories/promote.d.ts +40 -0
- package/dist/api/{promote.js → memories/promote.js} +35 -22
- package/dist/api/memories/refine.d.ts +10 -0
- package/dist/api/memories/refine.js +12 -0
- package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +16 -11
- package/dist/api/{remember-local.js → memories/remember-local.js} +34 -20
- package/dist/api/{remember.d.ts → memories/remember.d.ts} +19 -13
- package/dist/api/{remember.js → memories/remember.js} +42 -26
- package/dist/api/objects/cards.d.ts +39 -0
- package/dist/api/{cards.js → objects/cards.js} +12 -14
- package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
- package/dist/api/{drill-down.js → objects/drill-down.js} +7 -8
- package/dist/api/objects/goals.d.ts +18 -0
- package/dist/api/{goals.js → objects/goals.js} +12 -12
- package/dist/api/objects/graph.d.ts +11 -0
- package/dist/api/objects/graph.js +16 -0
- package/dist/api/objects/objects.d.ts +9 -0
- package/dist/api/{objects.js → objects/objects.js} +2 -4
- package/dist/api/objects/predictions.d.ts +11 -0
- package/dist/api/{predictions.js → objects/predictions.js} +7 -6
- package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
- package/dist/api/{projects.js → objects/projects.js} +8 -4
- package/dist/api/pilot-arm.d.ts +8 -4
- package/dist/api/pilot-arm.js +5 -4
- package/dist/api/prompt-hook.d.ts +32 -19
- package/dist/api/prompt-hook.js +65 -44
- package/dist/api/provenance-coverage.d.ts +3 -1
- package/dist/api/provenance-coverage.js +3 -1
- package/dist/api/recall/finish.d.ts +185 -0
- package/dist/api/recall/finish.js +301 -0
- package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
- package/dist/api/{recall-pipeline.js → recall/pipeline.js} +176 -92
- package/dist/api/recall/recall.d.ts +6 -0
- package/dist/api/{recall.js → recall/recall.js} +101 -60
- package/dist/api/recall/render.d.ts +39 -0
- package/dist/api/recall/render.js +60 -0
- package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
- package/dist/api/recall/request.js +261 -0
- package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
- package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
- package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -70
- package/dist/api/{recall-types.js → recall/types.js} +1 -1
- package/dist/api/session-end.d.ts +16 -12
- package/dist/api/session-end.js +46 -30
- package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
- package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
- package/dist/api/sleep/dormant.d.ts +25 -0
- package/dist/api/sleep/dormant.js +64 -0
- package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
- package/dist/api/sleep/learn.js +138 -0
- package/dist/api/sleep/sleep-run.d.ts +38 -0
- package/dist/api/{sleep-run.js → sleep/sleep-run.js} +51 -43
- package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
- package/dist/api/sleep/sleep.js +9 -0
- package/dist/api/status.d.ts +3 -1
- package/dist/api/status.js +3 -1
- package/dist/api/store-init.d.ts +4 -1
- package/dist/api/store-init.js +4 -1
- package/dist/api/tokens.d.ts +10 -9
- package/dist/api/tokens.js +9 -10
- package/dist/api/types.d.ts +28 -7
- package/dist/api/types.js +13 -4
- package/dist/capture/caller-session.d.ts +8 -2
- package/dist/capture/caller-session.js +16 -6
- package/dist/capture/capture-error.d.ts +3 -1
- package/dist/capture/capture-error.js +3 -1
- package/dist/capture/codex-patch.js +7 -2
- package/dist/capture/command.d.ts +4 -2
- package/dist/capture/command.js +33 -14
- package/dist/capture/compact-resume-caller.js +15 -8
- package/dist/capture/compact.d.ts +8 -5
- package/dist/capture/compact.js +34 -23
- package/dist/capture/compaction-items-caller.js +9 -3
- package/dist/capture/compaction-record.d.ts +4 -3
- package/dist/capture/compaction-record.js +20 -12
- package/dist/capture/compaction-spool.d.ts +15 -4
- package/dist/capture/compaction-spool.js +64 -17
- package/dist/capture/copilot-transcript.d.ts +11 -3
- package/dist/capture/copilot-transcript.js +16 -6
- package/dist/capture/extract.js +20 -8
- package/dist/capture/failure-caller.js +23 -12
- package/dist/capture/failure-reading.d.ts +10 -3
- package/dist/capture/failure-reading.js +24 -7
- package/dist/capture/pre-compact-caller.js +11 -4
- package/dist/capture/session-digest.d.ts +15 -4
- package/dist/capture/session-digest.js +39 -13
- package/dist/capture/session-end-caller.d.ts +4 -1
- package/dist/capture/session-end-caller.js +20 -8
- package/dist/capture/session-texts.d.ts +6 -2
- package/dist/capture/session-texts.js +22 -7
- package/dist/capture/session-worker.d.ts +4 -2
- package/dist/capture/session-worker.js +45 -17
- package/dist/capture/transcript.d.ts +13 -4
- package/dist/capture/transcript.js +32 -10
- package/dist/capture/working-state.d.ts +13 -4
- package/dist/capture/working-state.js +50 -56
- package/dist/cli/api-context.d.ts +14 -2
- package/dist/cli/api-context.js +45 -2
- package/dist/cli/audit.js +23 -23
- package/dist/cli/auth.js +19 -27
- package/dist/cli/briefs.d.ts +1 -1
- package/dist/cli/briefs.js +20 -15
- package/dist/cli/card.d.ts +1 -1
- package/dist/cli/card.js +56 -73
- package/dist/cli/client.d.ts +12 -4
- package/dist/cli/client.js +43 -13
- package/dist/cli/compact-resume-payload.d.ts +4 -1
- package/dist/cli/compact-resume-payload.js +12 -5
- package/dist/cli/context.js +42 -17
- package/dist/cli/continuity.d.ts +5 -5
- package/dist/cli/continuity.js +90 -107
- package/dist/cli/curate.d.ts +4 -3
- package/dist/cli/curate.js +46 -68
- package/dist/cli/dag.d.ts +1 -1
- package/dist/cli/dag.js +14 -17
- package/dist/cli/decisions.js +27 -26
- package/dist/cli/eval.js +16 -21
- package/dist/cli/exit.d.ts +4 -1
- package/dist/cli/exit.js +10 -2
- package/dist/cli/explain.js +12 -11
- package/dist/cli/flag-values.d.ts +1 -1
- package/dist/cli/flag-values.js +9 -18
- package/dist/cli/github.d.ts +6 -0
- package/dist/cli/github.js +25 -13
- package/dist/cli/goals.d.ts +1 -1
- package/dist/cli/goals.js +39 -56
- package/dist/cli/graph.d.ts +1 -1
- package/dist/cli/graph.js +15 -11
- package/dist/cli/hook-runtime.d.ts +31 -9
- package/dist/cli/hook-runtime.js +40 -15
- package/dist/cli/incidents.d.ts +1 -1
- package/dist/cli/incidents.js +25 -25
- package/dist/cli/init.js +26 -11
- package/dist/cli/install-steps.d.ts +12 -3
- package/dist/cli/install-steps.js +42 -18
- package/dist/cli/last-sleep.d.ts +4 -1
- package/dist/cli/last-sleep.js +9 -4
- package/dist/cli/maintenance.d.ts +1 -1
- package/dist/cli/maintenance.js +11 -12
- package/dist/cli/notes.d.ts +1 -1
- package/dist/cli/notes.js +8 -5
- package/dist/cli/object-verbs.d.ts +4 -4
- package/dist/cli/object-verbs.js +10 -13
- package/dist/cli/open-browser.js +11 -2
- package/dist/cli/playbooks.d.ts +3 -3
- package/dist/cli/playbooks.js +40 -32
- package/dist/cli/predictions.js +15 -19
- package/dist/cli/print.js +4 -2
- package/dist/cli/projects.js +21 -11
- package/dist/cli/quality-repair-once.js +5 -4
- package/dist/cli/recall.js +129 -93
- package/dist/cli/refine-llm.d.ts +15 -4
- package/dist/cli/refine-llm.js +16 -7
- package/dist/cli/remember.js +46 -50
- package/dist/cli/scheduler.d.ts +4 -1
- package/dist/cli/scheduler.js +9 -5
- package/dist/cli/serve.js +22 -17
- package/dist/cli/session-hooks.d.ts +2 -2
- package/dist/cli/session-hooks.js +87 -50
- package/dist/cli/setup.js +54 -32
- package/dist/cli/shared.d.ts +3 -1
- package/dist/cli/shared.js +24 -9
- package/dist/cli/slack.js +15 -24
- package/dist/cli/sleep-render.d.ts +3 -1
- package/dist/cli/sleep-render.js +8 -5
- package/dist/cli/sleep.js +14 -6
- package/dist/cli/status.d.ts +4 -4
- package/dist/cli/status.js +32 -27
- package/dist/cli/stdin.d.ts +10 -3
- package/dist/cli/stdin.js +10 -3
- package/dist/cli/transfer.d.ts +1 -1
- package/dist/cli/transfer.js +71 -75
- package/dist/cli/verbs/memory.js +8 -6
- package/dist/cli/verbs/objects.js +10 -4
- package/dist/cli/versioned-verbs.d.ts +8 -7
- package/dist/cli/versioned-verbs.js +31 -21
- package/dist/cli.js +13 -16
- package/dist/connectors/dlq.d.ts +6 -6
- package/dist/connectors/dlq.js +12 -8
- package/dist/connectors/github/backfill.d.ts +4 -4
- package/dist/connectors/github/backfill.js +6 -4
- package/dist/connectors/github/deletion.d.ts +6 -4
- package/dist/connectors/github/deletion.js +5 -5
- package/dist/connectors/github/dlq.d.ts +8 -6
- package/dist/connectors/github/dlq.js +11 -5
- package/dist/connectors/github/ingest.d.ts +2 -2
- package/dist/connectors/github/ingest.js +9 -6
- package/dist/connectors/github/octokit-client.d.ts +3 -1
- package/dist/connectors/github/octokit-client.js +7 -2
- package/dist/connectors/github/ratelimit.d.ts +6 -2
- package/dist/connectors/github/ratelimit.js +6 -2
- package/dist/connectors/github/signature.d.ts +14 -3
- package/dist/connectors/github/signature.js +17 -3
- package/dist/connectors/github/tenant-routing.d.ts +6 -4
- package/dist/connectors/github/tenant-routing.js +6 -6
- package/dist/connectors/github/transform.js +50 -67
- package/dist/connectors/github/types.d.ts +10 -3
- package/dist/connectors/github/types.js +6 -2
- package/dist/connectors/github/webhook.d.ts +5 -5
- package/dist/connectors/github/webhook.js +34 -23
- package/dist/connectors/ingest.d.ts +5 -3
- package/dist/connectors/ingest.js +3 -4
- package/dist/connectors/slack/backfill.d.ts +5 -5
- package/dist/connectors/slack/backfill.js +3 -3
- package/dist/connectors/slack/deletion.d.ts +4 -4
- package/dist/connectors/slack/deletion.js +6 -6
- package/dist/connectors/slack/dlq.d.ts +4 -4
- package/dist/connectors/slack/dlq.js +6 -6
- package/dist/connectors/slack/ingest.d.ts +6 -4
- package/dist/connectors/slack/ingest.js +5 -5
- package/dist/connectors/slack/signature.d.ts +4 -1
- package/dist/connectors/slack/tenant-routing.d.ts +6 -4
- package/dist/connectors/slack/tenant-routing.js +6 -6
- package/dist/connectors/slack/transform.d.ts +6 -2
- package/dist/connectors/slack/transform.js +6 -2
- package/dist/connectors/slack/types.d.ts +3 -1
- package/dist/connectors/slack/web-client.js +8 -3
- package/dist/connectors/slack/webhook.d.ts +5 -5
- package/dist/connectors/slack/webhook.js +19 -11
- package/dist/connectors/slack/workspaces.d.ts +7 -3
- package/dist/connectors/slack/workspaces.js +7 -3
- package/dist/connectors/store.d.ts +8 -0
- package/dist/connectors/store.js +2 -0
- package/dist/consolidate/conflicts.js +23 -9
- package/dist/consolidate/dag-summary.js +2 -1
- package/dist/consolidate/dag.d.ts +10 -5
- package/dist/consolidate/dag.js +37 -36
- package/dist/consolidate/decay.js +19 -6
- package/dist/consolidate/dedupe.d.ts +14 -5
- package/dist/consolidate/dedupe.js +27 -16
- package/dist/consolidate/flush-units.d.ts +4 -1
- package/dist/consolidate/flush-units.js +4 -1
- package/dist/consolidate/half-life-migration.d.ts +18 -8
- package/dist/consolidate/half-life-migration.js +48 -18
- package/dist/consolidate/llm-passes.js +27 -11
- package/dist/consolidate/memory-value-weights.d.ts +6 -2
- package/dist/consolidate/memory-value-weights.js +6 -2
- package/dist/consolidate/memory-value.d.ts +30 -10
- package/dist/consolidate/memory-value.js +36 -13
- package/dist/consolidate/merge.d.ts +4 -1
- package/dist/consolidate/merge.js +42 -32
- package/dist/consolidate/overlap-index.d.ts +8 -2
- package/dist/consolidate/overlap-index.js +11 -4
- package/dist/consolidate/physics-pass.d.ts +3 -1
- package/dist/consolidate/physics-pass.js +10 -7
- package/dist/consolidate/replay.d.ts +11 -4
- package/dist/consolidate/replay.js +19 -7
- package/dist/consolidate/run.d.ts +13 -5
- package/dist/consolidate/run.js +4 -4
- package/dist/consolidate/sleep.d.ts +14 -6
- package/dist/consolidate/sleep.js +41 -38
- package/dist/consolidate/trace.d.ts +7 -2
- package/dist/consolidate/trace.js +7 -2
- package/dist/consolidate/traces.js +26 -29
- package/dist/core/ablation.d.ts +9 -3
- package/dist/core/ablation.js +14 -4
- package/dist/core/active-scope.d.ts +3 -1
- package/dist/core/active-scope.js +3 -1
- package/dist/core/agent-memory-tools.d.ts +2 -0
- package/dist/core/agent-memory-tools.js +2 -0
- package/dist/core/ambient.d.ts +4 -3
- package/dist/core/ambient.js +8 -6
- package/dist/core/api-errors.d.ts +9 -3
- package/dist/core/api-errors.js +9 -3
- package/dist/core/capture-contract.d.ts +4 -1
- package/dist/core/capture-contract.js +27 -8
- package/dist/core/compare.d.ts +24 -8
- package/dist/core/compare.js +24 -8
- package/dist/core/config.d.ts +18 -9
- package/dist/core/config.js +24 -14
- package/dist/core/cosine.d.ts +4 -1
- package/dist/core/cosine.js +4 -1
- package/dist/core/handoff.d.ts +7 -2
- package/dist/core/handoff.js +4 -1
- package/dist/core/markdown.js +21 -16
- package/dist/core/memory-audit.js +14 -3
- package/dist/core/memory-quality.d.ts +12 -3
- package/dist/core/memory-quality.js +57 -21
- package/dist/core/memory.d.ts +84 -27
- package/dist/core/memory.js +73 -29
- package/dist/core/merged-row.d.ts +8 -2
- package/dist/core/merged-row.js +10 -3
- package/dist/core/package-root.d.ts +3 -1
- package/dist/core/package-root.js +3 -1
- package/dist/core/particle-refresh.d.ts +8 -0
- package/dist/core/particle-refresh.js +22 -0
- package/dist/core/physics-config.d.ts +4 -1
- package/dist/core/physics-config.js +6 -2
- package/dist/core/physics.d.ts +37 -11
- package/dist/core/physics.js +55 -20
- package/dist/core/project-identity.d.ts +34 -17
- package/dist/core/project-identity.js +33 -17
- package/dist/core/project-remote.d.ts +8 -4
- package/dist/core/project-remote.js +31 -14
- package/dist/core/recall-scope.d.ts +33 -11
- package/dist/core/recall-scope.js +42 -15
- package/dist/core/rejection-digest.d.ts +7 -0
- package/dist/core/rejection-digest.js +13 -0
- package/dist/core/salience.d.ts +3 -1
- package/dist/core/salience.js +10 -4
- package/dist/core/search-types.d.ts +15 -2
- package/dist/core/search-types.js +11 -0
- package/dist/dashboard/dashboard-actions.js +13 -2
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
- package/dist/dashboard/dashboard-snapshot.js +4 -4
- package/dist/dashboard/dashboard.js +6 -3
- package/dist/db/backup.js +2 -2
- package/dist/db/busy.d.ts +10 -3
- package/dist/db/busy.js +27 -5
- package/dist/db/connect.d.ts +10 -3
- package/dist/db/connect.js +8 -3
- package/dist/db/continuity.d.ts +1 -1
- package/dist/db/continuity.js +27 -11
- package/dist/db/meta.d.ts +4 -1
- package/dist/db/meta.js +4 -1
- package/dist/db/migrate.d.ts +10 -5
- package/dist/db/migrate.js +26 -13
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/types.d.ts +2 -1
- package/dist/db/migrations/v12.js +2 -1
- package/dist/db/migrations/v14.js +2 -1
- package/dist/db/migrations/v15.js +4 -2
- package/dist/db/migrations/v16.js +6 -3
- package/dist/db/migrations/v17.js +2 -1
- package/dist/db/migrations/v19.js +4 -2
- package/dist/db/migrations/v20.js +2 -1
- package/dist/db/migrations/v22.js +12 -6
- package/dist/db/migrations/v23.js +6 -3
- package/dist/db/migrations/v24.js +6 -3
- package/dist/db/migrations/v25.js +4 -2
- package/dist/db/migrations/v26.js +4 -2
- package/dist/db/migrations/v27.js +6 -3
- package/dist/db/migrations/v28.js +4 -2
- package/dist/db/migrations/v29.js +4 -2
- package/dist/db/migrations/v30.js +6 -3
- package/dist/db/migrations/v31.js +4 -2
- package/dist/db/migrations/v32.js +6 -3
- package/dist/db/migrations/v33.js +4 -2
- package/dist/db/migrations/v34.js +2 -1
- package/dist/db/migrations/v35.js +2 -1
- package/dist/db/migrations/v36.js +2 -1
- package/dist/db/migrations/v37.js +10 -5
- package/dist/db/migrations/v38.js +10 -5
- package/dist/db/migrations/v39.js +14 -6
- package/dist/db/migrations/v40.js +4 -2
- package/dist/db/migrations/v41.js +4 -2
- package/dist/db/migrations/v42.js +2 -1
- package/dist/db/migrations/v44.js +4 -2
- package/dist/db/migrations/v45.js +4 -2
- package/dist/db/migrations/v49.js +2 -1
- package/dist/db/migrations/v50.js +4 -2
- package/dist/db/migrations/v51.js +4 -2
- package/dist/db/migrations/v52.js +2 -1
- package/dist/db/migrations/v53.js +8 -4
- package/dist/db/migrations/v54.js +2 -1
- package/dist/db/migrations/v55.js +4 -2
- package/dist/db/migrations/v56.d.ts +3 -0
- package/dist/db/migrations/v56.js +28 -0
- package/dist/db/open.d.ts +24 -12
- package/dist/db/open.js +25 -13
- package/dist/db/physics-state.d.ts +8 -4
- package/dist/db/physics-state.js +13 -20
- package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
- package/dist/db/raw-archive-mirror-cleanup.js +6 -4
- package/dist/db/request-stores.d.ts +19 -5
- package/dist/db/request-stores.js +14 -5
- package/dist/db/tables.d.ts +2 -1
- package/dist/db/tables.js +12 -4
- package/dist/db/vector-store.d.ts +13 -4
- package/dist/db/vector-store.js +34 -14
- package/dist/db/wal-checkpointer.d.ts +2 -1
- package/dist/db/wal-checkpointer.js +19 -7
- package/dist/doctor.d.ts +4 -1
- package/dist/doctor.js +121 -39
- package/dist/embeddings/local.d.ts +8 -4
- package/dist/embeddings/local.js +9 -5
- package/dist/embeddings/provider.d.ts +19 -10
- package/dist/embeddings/provider.js +31 -17
- package/dist/embeddings/transformers.d.ts +16 -4
- package/dist/embeddings/transformers.js +32 -15
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.js +2 -1
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +1 -1
- package/dist/entry/sqlite-handles.d.ts +10 -0
- package/dist/entry/sqlite-handles.js +9 -0
- package/dist/entry/store-kit.d.ts +19 -6
- package/dist/entry/store-kit.js +6 -4
- package/dist/eval/eval-stats.d.ts +27 -8
- package/dist/eval/eval-stats.js +17 -5
- package/dist/eval/eval-suite.d.ts +3 -1
- package/dist/eval/eval-suite.js +409 -187
- package/dist/eval/eval.d.ts +8 -2
- package/dist/eval/eval.js +8 -2
- package/dist/eval/judgment.js +16 -6
- package/dist/graph/delta.d.ts +9 -42
- package/dist/graph/delta.js +17 -11
- package/dist/graph/extract.d.ts +10 -7
- package/dist/graph/extract.js +57 -25
- package/dist/graph/recall.d.ts +12 -4
- package/dist/graph/recall.js +30 -13
- package/dist/graph/stream.d.ts +18 -6
- package/dist/graph/stream.js +32 -10
- package/dist/graph/view.d.ts +19 -6
- package/dist/graph/view.js +42 -17
- package/dist/hooks/codex-session.js +2 -2
- package/dist/hooks/codex-wrapper.d.ts +3 -1
- package/dist/hooks/codex-wrapper.js +9 -4
- package/dist/hooks/copilot.d.ts +19 -5
- package/dist/hooks/copilot.js +54 -15
- package/dist/hooks/hook-blocks.d.ts +4 -1
- package/dist/hooks/hook-blocks.js +8 -3
- package/dist/hooks/json-hooks.d.ts +9 -5
- package/dist/hooks/json-hooks.js +69 -34
- package/dist/hooks/opencode.js +15 -5
- package/dist/hooks/shared.d.ts +27 -8
- package/dist/hooks/shared.js +57 -16
- package/dist/importers/core.d.ts +12 -4
- package/dist/importers/core.js +8 -7
- package/dist/importers/markdown-parse.d.ts +15 -5
- package/dist/importers/markdown-parse.js +16 -7
- package/dist/importers/markdown.js +6 -9
- package/dist/importers/sources.js +10 -23
- package/dist/importers/vault.d.ts +2 -2
- package/dist/importers/vault.js +43 -27
- package/dist/index.d.ts +32 -6
- package/dist/index.js +25 -7
- package/dist/learn/autolearn.d.ts +17 -6
- package/dist/learn/autolearn.js +53 -24
- package/dist/learn/churn-git.d.ts +4 -1
- package/dist/learn/churn-git.js +29 -5
- package/dist/learn/extract.d.ts +4 -1
- package/dist/learn/extract.js +16 -9
- package/dist/learn/forward-claim-detector.d.ts +17 -5
- package/dist/learn/forward-claim-detector.js +34 -15
- package/dist/learn/invalidation.d.ts +12 -7
- package/dist/learn/invalidation.js +56 -27
- package/dist/learn/roots.d.ts +3 -0
- package/dist/learn/roots.js +5 -0
- package/dist/mcp/admin-tools.d.ts +5 -5
- package/dist/mcp/admin-tools.js +28 -23
- package/dist/mcp/format.d.ts +1 -1
- package/dist/mcp/format.js +4 -2
- package/dist/mcp/framing.d.ts +3 -1
- package/dist/mcp/framing.js +20 -8
- package/dist/mcp/memory-tools.d.ts +3 -3
- package/dist/mcp/memory-tools.js +18 -14
- package/dist/mcp/protocol.d.ts +32 -16
- package/dist/mcp/protocol.js +12 -9
- package/dist/mcp/recall-tools.d.ts +3 -3
- package/dist/mcp/recall-tools.js +62 -74
- package/dist/mcp/request.d.ts +7 -5
- package/dist/mcp/request.js +57 -74
- package/dist/mcp/server.d.ts +3 -1
- package/dist/mcp/server.js +8 -3
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +4 -3
- package/dist/mcp/shared-gate.d.ts +3 -2
- package/dist/mcp/shared-gate.js +3 -2
- package/dist/mcp/stdio.d.ts +6 -3
- package/dist/mcp/stdio.js +52 -21
- package/dist/mcp/tool-args.d.ts +4 -1
- package/dist/mcp/tool-args.js +8 -3
- package/dist/mcp/tools.js +76 -32
- package/dist/objects/customer-notes.d.ts +12 -10
- package/dist/objects/customer-notes.js +21 -15
- package/dist/objects/decisions.d.ts +18 -10
- package/dist/objects/decisions.js +23 -17
- package/dist/objects/descriptor.js +2 -1
- package/dist/objects/fields.d.ts +4 -1
- package/dist/objects/fields.js +6 -2
- package/dist/objects/incidents.d.ts +14 -16
- package/dist/objects/incidents.js +29 -30
- package/dist/objects/lifecycle.d.ts +0 -4
- package/dist/objects/lifecycle.js +21 -24
- package/dist/objects/policies.d.ts +12 -16
- package/dist/objects/policies.js +17 -21
- package/dist/objects/processes.d.ts +16 -10
- package/dist/objects/processes.js +20 -15
- package/dist/objects/project-briefs.d.ts +13 -14
- package/dist/objects/project-briefs.js +33 -39
- package/dist/objects/skills.d.ts +10 -12
- package/dist/objects/skills.js +17 -22
- package/dist/postinstall.js +15 -7
- package/dist/predictions/planning-fallacy.d.ts +19 -6
- package/dist/predictions/planning-fallacy.js +4 -2
- package/dist/rerankers/clef.d.ts +8 -2
- package/dist/rerankers/clef.js +14 -9
- package/dist/rerankers/cross-encoder.d.ts +2 -1
- package/dist/rerankers/cross-encoder.js +9 -6
- package/dist/rerankers/index.js +2 -1
- package/dist/rerankers/jev.js +2 -1
- package/dist/rerankers/llm.d.ts +6 -2
- package/dist/rerankers/llm.js +8 -3
- package/dist/rerankers/remote.d.ts +3 -1
- package/dist/rerankers/remote.js +5 -2
- package/dist/rerankers/types.d.ts +6 -2
- package/dist/search/bm25-search.d.ts +3 -1
- package/dist/search/bm25-search.js +15 -2
- package/dist/search/boosts.js +4 -3
- package/dist/search/embed-memories.d.ts +10 -5
- package/dist/search/embed-memories.js +62 -36
- package/dist/search/engine.d.ts +4 -1
- package/dist/search/engine.js +6 -2
- package/dist/search/goal-boost.d.ts +10 -3
- package/dist/search/goal-boost.js +13 -6
- package/dist/search/hybrid-score.d.ts +4 -1
- package/dist/search/hybrid-score.js +4 -1
- package/dist/search/hybrid.d.ts +23 -8
- package/dist/search/hybrid.js +12 -7
- package/dist/search/multihop.js +14 -13
- package/dist/search/path-context.d.ts +10 -3
- package/dist/search/path-context.js +10 -3
- package/dist/search/physics-search.d.ts +9 -4
- package/dist/search/physics-search.js +38 -14
- package/dist/search/rerank.d.ts +2 -1
- package/dist/search/rerank.js +2 -1
- package/dist/search/rrf.d.ts +14 -5
- package/dist/search/rrf.js +11 -4
- package/dist/search/vector.d.ts +8 -2
- package/dist/search/vector.js +9 -3
- package/dist/server/auth.d.ts +18 -14
- package/dist/server/auth.js +69 -38
- package/dist/server/boot.d.ts +3 -1
- package/dist/server/boot.js +95 -56
- package/dist/server/client-ip.d.ts +11 -4
- package/dist/server/client-ip.js +27 -10
- package/dist/server/cursor.d.ts +10 -3
- package/dist/server/cursor.js +10 -3
- package/dist/server/deadline.d.ts +5 -2
- package/dist/server/deadline.js +10 -3
- package/dist/server/key-check-bounds.js +12 -4
- package/dist/server/lifecycle.d.ts +4 -1
- package/dist/server/lifecycle.js +10 -4
- package/dist/server/mcp-http.d.ts +2 -1
- package/dist/server/mcp-http.js +37 -22
- package/dist/server/rate-limit.d.ts +17 -5
- package/dist/server/rate-limit.js +55 -26
- package/dist/server/ready.js +7 -4
- package/dist/server/request.d.ts +15 -4
- package/dist/server/request.js +42 -15
- package/dist/server/route-checks.d.ts +4 -1
- package/dist/server/route-checks.js +8 -3
- package/dist/server/route-table.d.ts +8 -6
- package/dist/server/route-table.js +547 -93
- package/dist/server/routes/admin.d.ts +7 -7
- package/dist/server/routes/admin.js +36 -15
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +5 -4
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +12 -6
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +10 -4
- package/dist/server/routes/memories.d.ts +8 -8
- package/dist/server/routes/memories.js +12 -19
- package/dist/server/routes/object-routes.d.ts +8 -5
- package/dist/server/routes/object-routes.js +4 -2
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +11 -4
- package/dist/server/routes/predictions.d.ts +5 -5
- package/dist/server/routes/predictions.js +9 -4
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +15 -6
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +3 -2
- package/dist/server/routes/recall.d.ts +3 -3
- package/dist/server/routes/recall.js +21 -10
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +12 -4
- package/dist/server/server-detect.d.ts +24 -8
- package/dist/server/server-detect.js +57 -22
- package/dist/server/sleep-child.js +16 -10
- package/dist/server/sleep-offload.d.ts +8 -5
- package/dist/server/sleep-offload.js +41 -19
- package/dist/server/tls.d.ts +4 -1
- package/dist/server/tls.js +13 -5
- package/dist/server/types.d.ts +38 -26
- package/dist/server/validation.d.ts +4 -1
- package/dist/server/validation.js +22 -9
- package/dist/server.d.ts +15 -10
- package/dist/server.js +32 -12
- package/dist/sharing/global-store.d.ts +5 -10
- package/dist/sharing/global-store.js +8 -43
- package/dist/sharing/global-sync.d.ts +3 -1
- package/dist/sharing/global-sync.js +16 -6
- package/dist/sharing/project-merge.d.ts +25 -7
- package/dist/sharing/project-merge.js +49 -17
- package/dist/sharing/search-both.d.ts +8 -4
- package/dist/sharing/search-both.js +19 -12
- package/dist/sharing/share.d.ts +8 -4
- package/dist/sharing/share.js +39 -15
- package/dist/store/ambient.js +9 -5
- package/dist/store/audit-event.d.ts +2 -2
- package/dist/store/audit-event.js +8 -3
- package/dist/store/audit.d.ts +6 -3
- package/dist/store/audit.js +16 -6
- package/dist/store/auth.d.ts +4 -2
- package/dist/store/auth.js +63 -20
- package/dist/store/busy.d.ts +9 -0
- package/dist/store/busy.js +16 -0
- package/dist/store/candidates.d.ts +12 -5
- package/dist/store/candidates.js +75 -36
- package/dist/store/capture-write.d.ts +2 -1
- package/dist/store/capture-write.js +2 -1
- package/dist/store/card-detail.d.ts +4 -4
- package/dist/store/card-detail.js +15 -8
- package/dist/store/cards.d.ts +24 -10
- package/dist/store/cards.js +93 -60
- package/dist/store/compaction-caller.d.ts +2 -1
- package/dist/store/compaction-caller.js +2 -1
- package/dist/store/compactions-record.d.ts +14 -8
- package/dist/store/compactions-record.js +95 -32
- package/dist/store/compactions.js +35 -15
- package/dist/store/conflicts.d.ts +9 -4
- package/dist/store/conflicts.js +100 -45
- package/dist/store/connectors/dlq.d.ts +17 -5
- package/dist/store/connectors/dlq.js +56 -5
- package/dist/store/connectors/event-log.d.ts +111 -2
- package/dist/store/connectors/event-log.js +2 -1
- package/dist/store/connectors/github.d.ts +6 -3
- package/dist/store/connectors/github.js +24 -40
- package/dist/store/connectors/slack.d.ts +2 -1
- package/dist/store/connectors/slack.js +25 -37
- package/dist/store/dashboard-reads.d.ts +7 -3
- package/dist/store/dashboard-reads.js +32 -11
- package/dist/store/delete-and-batch.d.ts +17 -11
- package/dist/store/delete-and-batch.js +67 -26
- package/dist/store/delivery-recorder.d.ts +8 -5
- package/dist/store/delivery-recorder.js +70 -32
- package/dist/store/descendant-page.d.ts +2 -1
- package/dist/store/descendant-page.js +24 -9
- package/dist/store/diagnostics.d.ts +2 -1
- package/dist/store/diagnostics.js +2 -1
- package/dist/store/doctor-reads.d.ts +2 -1
- package/dist/store/doctor-reads.js +13 -5
- package/dist/store/dormant.d.ts +19 -11
- package/dist/store/dormant.js +40 -18
- package/dist/store/embeddings/index.d.ts +13 -9
- package/dist/store/embeddings/index.js +19 -12
- package/dist/store/entry-reads.d.ts +49 -20
- package/dist/store/entry-reads.js +181 -66
- package/dist/store/entry-row.d.ts +10 -6
- package/dist/store/entry-row.js +17 -12
- package/dist/store/entry-writes.d.ts +22 -10
- package/dist/store/entry-writes.js +41 -14
- package/dist/store/failure-log-at.js +1 -1
- package/dist/store/failure-log.d.ts +4 -2
- package/dist/store/failure-log.js +13 -6
- package/dist/store/gated-write.d.ts +3 -3
- package/dist/store/gated-write.js +3 -3
- package/dist/store/goals.d.ts +5 -4
- package/dist/store/goals.js +8 -10
- package/dist/store/graph-apply.d.ts +21 -0
- package/dist/{graph/write.js → store/graph-apply.js} +31 -11
- package/dist/store/graph-queue.d.ts +9 -6
- package/dist/store/graph-queue.js +15 -10
- package/dist/store/graph-reads.d.ts +16 -11
- package/dist/store/graph-reads.js +24 -15
- package/dist/store/graph-rows.d.ts +41 -3
- package/dist/store/graph-rows.js +10 -7
- package/dist/store/graph-view-rows.js +14 -7
- package/dist/store/graph-writes.d.ts +16 -10
- package/dist/store/graph-writes.js +59 -36
- package/dist/store/handoffs.d.ts +4 -4
- package/dist/store/handoffs.js +40 -19
- package/dist/store/index-and-stats.d.ts +2 -2
- package/dist/store/index-and-stats.js +6 -5
- package/dist/store/index.d.ts +3 -1
- package/dist/store/index.js +1 -0
- package/dist/store/key-audit.d.ts +2 -1
- package/dist/store/key-audit.js +2 -1
- package/dist/store/key-writes.d.ts +2 -1
- package/dist/store/key-writes.js +9 -2
- package/dist/store/ledger-turn.d.ts +4 -1
- package/dist/store/ledger-turn.js +7 -2
- package/dist/store/mirrors.d.ts +11 -4
- package/dist/store/mirrors.js +88 -16
- package/dist/store/narrow.d.ts +6 -0
- package/dist/store/narrow.js +11 -0
- package/dist/store/open.d.ts +4 -2
- package/dist/store/open.js +18 -9
- package/dist/store/pilot-arm.d.ts +2 -1
- package/dist/store/pilot-arm.js +18 -6
- package/dist/store/planning-fallacy-evidence.d.ts +2 -2
- package/dist/store/planning-fallacy-evidence.js +8 -5
- package/dist/store/port/agent-import.d.ts +62 -0
- package/dist/store/port/agent-import.js +2 -0
- package/dist/store/port/consolidation.d.ts +129 -0
- package/dist/store/port/consolidation.js +2 -0
- package/dist/store/port/learning.d.ts +19 -0
- package/dist/store/port/learning.js +2 -0
- package/dist/store/port/local-files.d.ts +18 -0
- package/dist/store/port/local-files.js +2 -0
- package/dist/store/port/promotion.d.ts +20 -0
- package/dist/store/port/promotion.js +3 -0
- package/dist/store/port-groups.d.ts +160 -0
- package/dist/store/port-groups.js +2 -0
- package/dist/store/port.d.ts +215 -229
- package/dist/store/port.js +3 -9
- package/dist/store/predictions.d.ts +14 -10
- package/dist/store/predictions.js +37 -17
- package/dist/store/project-tags.d.ts +4 -1
- package/dist/store/project-tags.js +16 -5
- package/dist/store/quality-repair.d.ts +8 -4
- package/dist/store/quality-repair.js +53 -20
- package/dist/store/quarantine.d.ts +1 -0
- package/dist/store/quarantine.js +23 -9
- package/dist/store/raw-archive.d.ts +5 -4
- package/dist/store/raw-archive.js +11 -10
- package/dist/store/recall-trace.d.ts +22 -17
- package/dist/store/recall-trace.js +126 -63
- package/dist/store/rejected-values.d.ts +15 -10
- package/dist/store/rejected-values.js +33 -12
- package/dist/store/rejection.d.ts +12 -11
- package/dist/store/rejection.js +18 -19
- package/dist/store/report-reads.d.ts +2 -1
- package/dist/store/report-reads.js +2 -1
- package/dist/store/rows.d.ts +7 -5
- package/dist/store/rows.js +18 -11
- package/dist/store/rule-sql.d.ts +6 -4
- package/dist/store/rule-sql.js +16 -9
- package/dist/store/search-rows.d.ts +14 -9
- package/dist/store/search-rows.js +48 -23
- package/dist/store/sessions.d.ts +12 -10
- package/dist/store/sessions.js +40 -21
- package/dist/store/set-aside.d.ts +2 -2
- package/dist/store/set-aside.js +18 -5
- package/dist/store/sqlite/agent-import.d.ts +3 -0
- package/dist/store/sqlite/agent-import.js +77 -0
- package/dist/store/sqlite/cards-group.d.ts +6 -0
- package/dist/store/sqlite/cards-group.js +37 -0
- package/dist/store/sqlite/conflicts-group.d.ts +6 -0
- package/dist/store/sqlite/conflicts-group.js +18 -0
- package/dist/store/sqlite/connector-events-group.d.ts +2 -1
- package/dist/store/sqlite/connector-events-group.js +17 -6
- package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
- package/dist/store/sqlite/connector-writes-group.js +9 -4
- package/dist/store/sqlite/consolidation-group.d.ts +4 -0
- package/dist/store/sqlite/consolidation-group.js +64 -0
- package/dist/store/sqlite/dag-reads-group.js +1 -1
- package/dist/store/sqlite/dormant-group.d.ts +6 -0
- package/dist/store/sqlite/dormant-group.js +29 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +6 -3
- package/dist/store/sqlite/entry-writes-group.js +37 -14
- package/dist/store/sqlite/error-codec.d.ts +4 -2
- package/dist/store/sqlite/error-codec.js +32 -10
- package/dist/store/sqlite/executor-counts.js +2 -1
- package/dist/store/sqlite/executor.d.ts +8 -3
- package/dist/store/sqlite/executor.js +56 -18
- package/dist/store/sqlite/global-promote.d.ts +5 -0
- package/dist/store/sqlite/global-promote.js +48 -0
- package/dist/store/sqlite/goals-group.d.ts +6 -0
- package/dist/store/sqlite/goals-group.js +23 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
- package/dist/store/sqlite/graph-reads-group.js +2 -1
- package/dist/store/sqlite/held-connection.d.ts +7 -1
- package/dist/store/sqlite/held-connection.js +34 -7
- package/dist/store/sqlite/last-recall-group.d.ts +4 -2
- package/dist/store/sqlite/last-recall-group.js +9 -4
- package/dist/store/sqlite/learning-group.d.ts +4 -0
- package/dist/store/sqlite/learning-group.js +17 -0
- package/dist/store/sqlite/maintenance-groups.js +2 -1
- package/dist/store/sqlite/object-rows.d.ts +6 -3
- package/dist/store/sqlite/object-rows.js +34 -5
- package/dist/store/sqlite/objects-group.d.ts +5 -4
- package/dist/store/sqlite/objects-group.js +84 -33
- package/dist/store/sqlite/predictions-group.d.ts +2 -1
- package/dist/store/sqlite/predictions-group.js +4 -2
- package/dist/store/sqlite/promotion-group.d.ts +3 -0
- package/dist/store/sqlite/promotion-group.js +10 -0
- package/dist/store/sqlite/quarantine-group.d.ts +2 -1
- package/dist/store/sqlite/quarantine-group.js +4 -2
- package/dist/store/sqlite/reports-group.d.ts +6 -0
- package/dist/store/sqlite/reports-group.js +33 -0
- package/dist/store/sqlite/request-scope.d.ts +6 -0
- package/dist/store/sqlite/request-scope.js +18 -0
- package/dist/store/sqlite/sessions-group.d.ts +6 -0
- package/dist/store/sqlite/sessions-group.js +46 -0
- package/dist/store/sqlite/store.d.ts +22 -11
- package/dist/store/sqlite/store.js +84 -11
- package/dist/store/sqlite/vector-pack.js +2 -1
- package/dist/store/sqlite/vector-reads-group.js +2 -1
- package/dist/store/sqlite/worker-jobs.d.ts +2 -1
- package/dist/store/sqlite/worker-jobs.js +19 -7
- package/dist/store/sqlite/worker-ops.d.ts +10 -5
- package/dist/store/sqlite/worker-ops.js +6 -3
- package/dist/store/sqlite/worker-store.d.ts +4 -3
- package/dist/store/sqlite/worker-store.js +24 -14
- package/dist/store/summaries.d.ts +19 -12
- package/dist/store/summaries.js +36 -21
- package/dist/store/summary-dirty.d.ts +2 -1
- package/dist/store/summary-dirty.js +2 -1
- package/dist/store/tenant.d.ts +3 -2
- package/dist/store/tenant.js +5 -4
- package/dist/store/token-ledger-rows.js +6 -3
- package/dist/store/token-ledger.d.ts +19 -13
- package/dist/store/token-ledger.js +27 -14
- package/dist/store/tombstone-checks.d.ts +4 -1
- package/dist/store/tombstone-checks.js +10 -1
- package/dist/store/usage-reports.js +2 -1
- package/dist/store/vector-index.d.ts +8 -5
- package/dist/store/vector-index.js +24 -10
- package/dist/store/working-memory.d.ts +6 -4
- package/dist/store/working-memory.js +14 -9
- package/dist/support-bundle.js +10 -5
- package/dist/trust/quarantine.d.ts +1 -2
- package/dist/trust/quarantine.js +1 -5
- package/dist/trust/reject-flow.d.ts +12 -3
- package/dist/trust/reject-flow.js +12 -4
- package/dist/util/anthropic-messages.d.ts +4 -1
- package/dist/util/anthropic-messages.js +14 -5
- package/dist/util/atomic-write.d.ts +4 -2
- package/dist/util/atomic-write.js +25 -14
- package/dist/util/compaction-items.d.ts +4 -1
- package/dist/util/compaction-items.js +8 -2
- package/dist/util/crash-handlers.d.ts +7 -2
- package/dist/util/crash-handlers.js +13 -4
- package/dist/util/env.d.ts +16 -4
- package/dist/util/env.js +78 -25
- package/dist/util/home-path.js +12 -6
- package/dist/util/hook-payload.d.ts +3 -1
- package/dist/util/hook-payload.js +3 -1
- package/dist/util/http-retry.d.ts +12 -6
- package/dist/util/http-retry.js +16 -6
- package/dist/util/http-util.d.ts +20 -5
- package/dist/util/http-util.js +28 -9
- package/dist/util/json.d.ts +4 -1
- package/dist/util/json.js +4 -1
- package/dist/util/keyset.js +2 -1
- package/dist/util/limits.js +4 -2
- package/dist/util/log.d.ts +13 -5
- package/dist/util/log.js +29 -6
- package/dist/util/net.d.ts +5 -0
- package/dist/util/net.js +19 -0
- package/dist/util/real-path.d.ts +2 -1
- package/dist/util/real-path.js +4 -3
- package/dist/util/request-scope.d.ts +11 -3
- package/dist/util/request-scope.js +13 -4
- package/dist/util/same-text.d.ts +10 -3
- package/dist/util/same-text.js +10 -3
- package/dist/util/secret-detect.d.ts +24 -7
- package/dist/util/secret-detect.js +49 -14
- package/dist/util/spawn-argv.d.ts +3 -1
- package/dist/util/spawn-argv.js +13 -4
- package/dist/util/sqlite-blocked.d.ts +15 -4
- package/dist/util/sqlite-blocked.js +19 -6
- package/dist/util/stored-json.d.ts +4 -1
- package/dist/util/stored-json.js +6 -2
- package/dist/util/stream-tee.d.ts +2 -1
- package/dist/util/stream-tee.js +8 -5
- package/dist/util/transcript-tail.d.ts +4 -1
- package/dist/util/transcript-tail.js +4 -1
- package/dist/util/version.d.ts +8 -3
- package/dist/util/version.js +8 -3
- package/dist/util/write-budget.d.ts +7 -2
- package/dist/util/write-budget.js +5 -2
- package/dist/util/yaml.d.ts +4 -1
- package/dist/util/yaml.js +4 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -1
- package/scripts/postinstall.cjs +3 -1
- package/dist/api/cards.d.ts +0 -42
- package/dist/api/conflicts.d.ts +0 -28
- package/dist/api/conflicts.js +0 -61
- package/dist/api/dormant.d.ts +0 -14
- package/dist/api/dormant.js +0 -58
- package/dist/api/goals.d.ts +0 -18
- package/dist/api/graph.d.ts +0 -8
- package/dist/api/graph.js +0 -8
- package/dist/api/learn.js +0 -125
- package/dist/api/memories.d.ts +0 -25
- package/dist/api/objects.d.ts +0 -9
- package/dist/api/outcome.d.ts +0 -19
- package/dist/api/predictions.d.ts +0 -11
- package/dist/api/promote.d.ts +0 -36
- package/dist/api/recall-core.d.ts +0 -4
- package/dist/api/recall-core.js +0 -125
- package/dist/api/recall-finish.d.ts +0 -53
- package/dist/api/recall-finish.js +0 -30
- package/dist/api/recall-history.d.ts +0 -64
- package/dist/api/recall-history.js +0 -159
- package/dist/api/recall-record.d.ts +0 -43
- package/dist/api/recall-record.js +0 -78
- package/dist/api/recall-request.js +0 -121
- package/dist/api/recall.d.ts +0 -6
- package/dist/api/refine.d.ts +0 -7
- package/dist/api/refine.js +0 -10
- package/dist/api/session-owners.d.ts +0 -4
- package/dist/api/session-owners.js +0 -17
- package/dist/api/sleep-run.d.ts +0 -26
- package/dist/api/sleep.js +0 -11
- package/dist/graph/write.d.ts +0 -14
- package/dist/store/sqlite/busy.d.ts +0 -3
- package/dist/store/sqlite/busy.js +0 -8
- package/dist/store/sqlite/local.d.ts +0 -4
- package/dist/store/sqlite/local.js +0 -8
|
@@ -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,6 +1,7 @@
|
|
|
1
|
-
import { IN_LIST_CHUNK, loadEntities, loadEntitiesByIds, loadEntitiesByName, loadNeighborRelations, loadRelations, loadRelationsAmong } from './graph-reads.js';
|
|
1
|
+
import { IN_LIST_CHUNK, loadEntities, loadEntitiesByIds, loadEntitiesByName, loadNeighborRelations, loadRelations, loadRelationsAmong, } from './graph-reads.js';
|
|
2
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
|
|
3
|
+
/** The items whose source memory `canRead` admits: a NULL memoryId has no scope to hide, and a missing memory fails
|
|
4
|
+
* closed. */
|
|
4
5
|
function readableOnly(db, tenantId, items, canRead) {
|
|
5
6
|
if (!canRead)
|
|
6
7
|
return items;
|
|
@@ -9,7 +10,8 @@ function readableOnly(db, tenantId, items, canRead) {
|
|
|
9
10
|
for (let i = 0; i < ids.length; i += IN_LIST_CHUNK) {
|
|
10
11
|
const slice = ids.slice(i, i + IN_LIST_CHUNK);
|
|
11
12
|
// SAFETY: rows' shape matches the id and scope columns named in the SELECT.
|
|
12
|
-
const rows = db
|
|
13
|
+
const rows = db
|
|
14
|
+
.prepare(`SELECT id, scope FROM memories WHERE +tenant_id = ? AND id IN (${placeholders(slice.length)})`)
|
|
13
15
|
.all(tenantId, ...slice);
|
|
14
16
|
for (const r of rows)
|
|
15
17
|
if (canRead(r.scope))
|
|
@@ -22,9 +24,11 @@ function wholeGraphRows({ hippoRoot, db, tenantId }, limit) {
|
|
|
22
24
|
const relations = loadRelations(hippoRoot, tenantId, { limit }, db);
|
|
23
25
|
return { entities, relations, truncated: entities.length >= limit || relations.length >= limit };
|
|
24
26
|
}
|
|
25
|
-
/** 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. */
|
|
26
29
|
function focusRows({ hippoRoot, db, tenantId }, name, limit, canRead) {
|
|
27
|
-
// 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.
|
|
28
32
|
const named = loadEntitiesByName(hippoRoot, tenantId, name, { limit }, db);
|
|
29
33
|
// A hidden focus must not answer through its neighbours that the name exists.
|
|
30
34
|
const focus = readableOnly(db, tenantId, named, canRead);
|
|
@@ -44,7 +48,8 @@ function focusRows({ hippoRoot, db, tenantId }, name, limit, canRead) {
|
|
|
44
48
|
}
|
|
45
49
|
const unionIds = [...union].slice(0, limit);
|
|
46
50
|
const entities = loadEntitiesByIds(hippoRoot, tenantId, unionIds, db);
|
|
47
|
-
// 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.
|
|
48
53
|
const relations = loadRelationsAmong(hippoRoot, tenantId, unionIds, { limit }, db);
|
|
49
54
|
const truncated = named.length >= limit ||
|
|
50
55
|
hop.length >= limit || // neighbour scan capped -> a 1-hop neighbour may be omitted
|
|
@@ -57,7 +62,9 @@ function focusRows({ hippoRoot, db, tenantId }, name, limit, canRead) {
|
|
|
57
62
|
* snapshot that keeps entity ids and relation ids from two different rebuilds apart. */
|
|
58
63
|
export function graphViewRows(hippoRoot, db, tenantId, spec) {
|
|
59
64
|
const source = { hippoRoot, db, tenantId };
|
|
60
|
-
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);
|
|
61
68
|
if (raw === null)
|
|
62
69
|
return { entities: [], relations: [], truncated: false };
|
|
63
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/handoffs.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { type ContinuityKey } from './sessions.js';
|
|
|
5
5
|
export declare const HANDOFF_COLUMNS: string;
|
|
6
6
|
/** Save a session handoff record; returns the persisted handoff. */
|
|
7
7
|
export declare function saveSessionHandoff(hippoRoot: string, tenantId: string, handoff: Omit<SessionHandoff, 'updatedAt'>, key?: ContinuityKey): SessionHandoff;
|
|
8
|
-
interface HandoffFilter {
|
|
8
|
+
export interface HandoffFilter {
|
|
9
9
|
unfinishedOnly?: boolean;
|
|
10
10
|
maxAgeMs?: number;
|
|
11
11
|
scopeFilter?: 'default-deny';
|
|
@@ -25,8 +25,8 @@ export interface SessionEndHandoffRequest {
|
|
|
25
25
|
readonly key?: ContinuityKey;
|
|
26
26
|
readonly inPlace?: boolean;
|
|
27
27
|
}
|
|
28
|
-
/** Session-end handoff from the active snapshot, else `derived` transcript state; `inPlace` rewrites an earlier
|
|
29
|
-
* Returns null when no source is the session's, a newer handoff covers
|
|
28
|
+
/** Session-end handoff from the active snapshot, else `derived` transcript state; `inPlace` rewrites an earlier
|
|
29
|
+
* transcript read instead of adding a revision. Returns null when no source is the session's, a newer handoff covers
|
|
30
|
+
* it, or the latest one is not transcript-derived or already holds `derived`. */
|
|
30
31
|
export declare function writeSessionEndHandoff(hippoRoot: string, request: SessionEndHandoffRequest): SessionHandoff | null;
|
|
31
|
-
export {};
|
|
32
32
|
//# sourceMappingURL=handoffs.d.ts.map
|
package/dist/store/handoffs.js
CHANGED
|
@@ -7,6 +7,14 @@ import { continuityStamp, continuityWhere, loadActiveTaskSnapshot } from './sess
|
|
|
7
7
|
/** Column list shared by every session_handoffs SELECT; cards.ts reuses it for the card handoff lookup. */
|
|
8
8
|
export const HANDOFF_COLUMNS = 'id, session_id, repo_root, task_id, summary, next_action, artifacts_json, scope, created_at, constraints_json, ' +
|
|
9
9
|
'evidence_json, outcome, target_runtime, card_id';
|
|
10
|
+
function insertHandoffRow(db, tenantId, handoff, stamp, now) {
|
|
11
|
+
return db
|
|
12
|
+
.prepare(`\n INSERT INTO session_handoffs(session_id, repo_root, task_id, summary, next_action, artifacts_json, ` +
|
|
13
|
+
`scope, tenant_id, created_at, ` +
|
|
14
|
+
`constraints_json, evidence_json, outcome, target_runtime, card_id, owner_subject, origin_project)\n` +
|
|
15
|
+
` VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `)
|
|
16
|
+
.run(handoff.sessionId, handoff.repoRoot ?? null, handoff.taskId ?? null, handoff.summary, handoff.nextAction ?? null, JSON.stringify(handoff.artifacts ?? []), handoff.scope ?? null, tenantId, now, JSON.stringify(handoff.constraints ?? []), handoff.evidence ? JSON.stringify(handoff.evidence) : null, handoff.outcome ?? null, handoff.targetRuntime ?? null, handoff.cardId ?? null, stamp?.owner ?? null, stamp?.origin ?? null);
|
|
17
|
+
}
|
|
10
18
|
/** Save a session handoff record; returns the persisted handoff. */
|
|
11
19
|
export function saveSessionHandoff(hippoRoot, tenantId, handoff, key) {
|
|
12
20
|
assertTenantId('saveSessionHandoff', tenantId);
|
|
@@ -16,9 +24,7 @@ export function saveSessionHandoff(hippoRoot, tenantId, handoff, key) {
|
|
|
16
24
|
// Scope is stored as given; read-side default-deny in api.recall + cmdRecall
|
|
17
25
|
// continuity excludes slack:private:* and 'unknown:legacy'.
|
|
18
26
|
try {
|
|
19
|
-
const result = db
|
|
20
|
-
`constraints_json, evidence_json, outcome, target_runtime, card_id, owner_subject, origin_project)\n` +
|
|
21
|
-
` VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).run(handoff.sessionId, handoff.repoRoot ?? null, handoff.taskId ?? null, handoff.summary, handoff.nextAction ?? null, JSON.stringify(handoff.artifacts ?? []), handoff.scope ?? null, tenantId, now, JSON.stringify(handoff.constraints ?? []), handoff.evidence ? JSON.stringify(handoff.evidence) : null, handoff.outcome ?? null, handoff.targetRuntime ?? null, handoff.cardId ?? null, stamp?.owner ?? null, stamp?.origin ?? null);
|
|
27
|
+
const result = insertHandoffRow(db, tenantId, handoff, stamp, now);
|
|
22
28
|
const id = Number(result.lastInsertRowid ?? 0);
|
|
23
29
|
// SAFETY: row's shape matches HANDOFF_COLUMNS.
|
|
24
30
|
const row = db.prepare(`SELECT ${HANDOFF_COLUMNS} FROM session_handoffs WHERE id = ?`).get(id);
|
|
@@ -48,9 +54,11 @@ function handoffConditions(tenantId, sessionId, opts, key) {
|
|
|
48
54
|
params.push(opts.excludeSessionId);
|
|
49
55
|
}
|
|
50
56
|
if (opts.unfinishedOnly) {
|
|
51
|
-
// Restrict to each session's newest revision first: stampHandoffOutcome only stamps the newest row, so an older
|
|
52
|
-
// Keyed, the newest is the owner's own, so another owner's newer revision
|
|
53
|
-
|
|
57
|
+
// Restrict to each session's newest revision first: stampHandoffOutcome only stamps the newest row, so an older
|
|
58
|
+
// null-outcome revision must not resurrect. Keyed, the newest is the owner's own, so another owner's newer revision
|
|
59
|
+
// cannot hide it.
|
|
60
|
+
conditions.push(`id IN (SELECT MAX(id) FROM session_handoffs WHERE tenant_id = ?${owned ? ` AND ${owned.sql}` : ''} GROUP BY ` +
|
|
61
|
+
`session_id)`);
|
|
54
62
|
params.push(tenantId, ...(owned?.params ?? []));
|
|
55
63
|
conditions.push(`(outcome IS NULL OR outcome IN ('partial','failure'))`);
|
|
56
64
|
}
|
|
@@ -107,7 +115,8 @@ export function loadHandoffById(hippoRoot, tenantId, id) {
|
|
|
107
115
|
export function stampHandoffOutcome(hippoRoot, tenantId, sessionId, outcome) {
|
|
108
116
|
assertTenantId('stampHandoffOutcome', tenantId);
|
|
109
117
|
return onHandle(hippoRoot, (db) => {
|
|
110
|
-
const result = db
|
|
118
|
+
const result = db
|
|
119
|
+
.prepare(`
|
|
111
120
|
UPDATE session_handoffs SET outcome = ?
|
|
112
121
|
WHERE tenant_id = ? AND session_id = ? AND outcome IS NULL
|
|
113
122
|
AND id = (
|
|
@@ -115,21 +124,27 @@ export function stampHandoffOutcome(hippoRoot, tenantId, sessionId, outcome) {
|
|
|
115
124
|
WHERE tenant_id = ? AND session_id = ?
|
|
116
125
|
ORDER BY created_at DESC, id DESC LIMIT 1
|
|
117
126
|
)
|
|
118
|
-
`)
|
|
127
|
+
`)
|
|
128
|
+
.run(outcome, tenantId, sessionId, tenantId, sessionId);
|
|
119
129
|
return Number(result.changes ?? 0);
|
|
120
130
|
}, openStore);
|
|
121
131
|
}
|
|
122
|
-
/** Rewrites the session's newest handoff when it is still a transcript read, in one statement so a handoff written
|
|
123
|
-
* when none was rewritten. */
|
|
132
|
+
/** Rewrites the session's newest handoff when it is still a transcript read, in one statement so a handoff written
|
|
133
|
+
* meanwhile is never overwritten; null when none was rewritten. */
|
|
124
134
|
function replaceTranscriptHandoff(hippoRoot, tenantId, handoff, key) {
|
|
125
135
|
const { conditions, params } = handoffConditions(tenantId, handoff.sessionId, {}, key);
|
|
126
|
-
const newest = `SELECT id FROM session_handoffs WHERE ${conditions.join(' AND ')} ORDER BY created_at DESC, id
|
|
136
|
+
const newest = `SELECT id FROM session_handoffs WHERE ${conditions.join(' AND ')} ORDER BY created_at DESC, id ` +
|
|
137
|
+
`DESC LIMIT 1`;
|
|
127
138
|
return onHandle(hippoRoot, (db) => {
|
|
128
|
-
const result = db
|
|
129
|
-
|
|
139
|
+
const result = db
|
|
140
|
+
.prepare(`
|
|
141
|
+
UPDATE session_handoffs SET repo_root = ?, task_id = ?, summary = ?, next_action = ?, artifacts_json = ?, scope =
|
|
142
|
+
?, created_at = ?,
|
|
130
143
|
constraints_json = ?, evidence_json = ?, outcome = ?, target_runtime = ?, card_id = ?
|
|
131
|
-
WHERE id = (${newest}) AND json_valid(evidence_json) AND json_extract(evidence_json, '$.derivedFrom') =
|
|
132
|
-
|
|
144
|
+
WHERE id = (${newest}) AND json_valid(evidence_json) AND json_extract(evidence_json, '$.derivedFrom') =
|
|
145
|
+
'transcript'
|
|
146
|
+
`)
|
|
147
|
+
.run(handoff.repoRoot ?? null, handoff.taskId ?? null, handoff.summary, handoff.nextAction ?? null, JSON.stringify(handoff.artifacts ?? []), handoff.scope ?? null, new Date().toISOString(), JSON.stringify(handoff.constraints ?? []), handoff.evidence ? JSON.stringify(handoff.evidence) : null, handoff.outcome ?? null, handoff.targetRuntime ?? null, handoff.cardId ?? null, ...params);
|
|
133
148
|
if (Number(result.changes ?? 0) === 0)
|
|
134
149
|
return null;
|
|
135
150
|
// SAFETY: row's shape matches HANDOFF_COLUMNS.
|
|
@@ -142,8 +157,12 @@ function transcriptHandoffSource(existing, derived, evidence) {
|
|
|
142
157
|
if (!derived || (existing && existing.evidence?.derivedFrom !== 'transcript'))
|
|
143
158
|
return null;
|
|
144
159
|
// A retried session end reads the same transcript, so it must not add a second revision.
|
|
145
|
-
if (existing &&
|
|
160
|
+
if (existing &&
|
|
161
|
+
existing.taskId === derived.task &&
|
|
162
|
+
existing.summary === derived.summary &&
|
|
163
|
+
existing.nextAction === derived.next_step) {
|
|
146
164
|
return null;
|
|
165
|
+
}
|
|
147
166
|
return { snapshot: { ...derived, scope: null }, evidence: { ...evidence, derivedFrom: 'transcript' } };
|
|
148
167
|
}
|
|
149
168
|
function buildSessionEndHandoff(sessionId, snapshot, existing, handoffEvidence, outcome) {
|
|
@@ -167,8 +186,9 @@ function buildSessionEndHandoff(sessionId, snapshot, existing, handoffEvidence,
|
|
|
167
186
|
cardId: carryForward ? existing.cardId : undefined,
|
|
168
187
|
};
|
|
169
188
|
}
|
|
170
|
-
/** Session-end handoff from the active snapshot, else `derived` transcript state; `inPlace` rewrites an earlier
|
|
171
|
-
* Returns null when no source is the session's, a newer handoff covers
|
|
189
|
+
/** Session-end handoff from the active snapshot, else `derived` transcript state; `inPlace` rewrites an earlier
|
|
190
|
+
* transcript read instead of adding a revision. Returns null when no source is the session's, a newer handoff covers
|
|
191
|
+
* it, or the latest one is not transcript-derived or already holds `derived`. */
|
|
172
192
|
export function writeSessionEndHandoff(hippoRoot, request) {
|
|
173
193
|
const { tenantId, sessionId, evidence, derived = null, key, inPlace } = request;
|
|
174
194
|
assertTenantId('writeSessionEndHandoff', tenantId);
|
|
@@ -179,7 +199,8 @@ export function writeSessionEndHandoff(hippoRoot, request) {
|
|
|
179
199
|
let snapshot;
|
|
180
200
|
let handoffEvidence = evidence;
|
|
181
201
|
let fromTranscript = false;
|
|
182
|
-
// After every reply the transcript is newer than the last compaction's snapshot, which the open chat keeps for the
|
|
202
|
+
// After every reply the transcript is newer than the last compaction's snapshot, which the open chat keeps for the
|
|
203
|
+
// next one.
|
|
183
204
|
const snapshotGivesWay = inPlace === true && derived !== null && active?.source === 'pre-compact';
|
|
184
205
|
if (active && active.session_id === sessionId && !snapshotGivesWay) {
|
|
185
206
|
// Strict '>': a same-millisecond tie must not swallow the session's only write (test 6e).
|
|
@@ -4,8 +4,8 @@ import type { HippoIndex, LegacyStats } from './rows.js';
|
|
|
4
4
|
export declare function loadIndex(hippoRoot: string): HippoIndex;
|
|
5
5
|
/** The last recall's ids and its trace alone, for a caller that needs no index entry. */
|
|
6
6
|
export declare function loadLastRecall(hippoRoot: string): Pick<HippoIndex, 'last_retrieval_ids' | 'last_trace_id'>;
|
|
7
|
-
/** Persist mutable index metadata (entry rows are derived from SQLite); `last_retrieval_ids` and `last_trace_id` commit
|
|
8
|
-
* rely on both moving together. index.json is left to `rebuildIndex`. */
|
|
7
|
+
/** Persist mutable index metadata (entry rows are derived from SQLite); `last_retrieval_ids` and `last_trace_id` commit
|
|
8
|
+
* in one transaction, as callers rely on both moving together. index.json is left to `rebuildIndex`. */
|
|
9
9
|
export declare function saveIndex(hippoRoot: string, index: Pick<HippoIndex, 'last_retrieval_ids' | 'last_trace_id'>): void;
|
|
10
10
|
/** Rebuild mirrors from SQLite, importing any legacy markdown files not already present. */
|
|
11
11
|
export declare function rebuildIndex(hippoRoot: string): HippoIndex;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { withWriteScope, setMeta, isSqliteBusy, pruneConsolidationRuns, getMeta } from '../db/index.js';
|
|
1
|
+
import { withWriteScope, setMeta, isSqliteBusy, pruneConsolidationRuns, getMeta, } from '../db/index.js';
|
|
2
2
|
import { RejectedValueError } from '../core/api-errors.js';
|
|
3
3
|
import { log } from '../util/log.js';
|
|
4
4
|
import { audit } from './audit-event.js';
|
|
5
5
|
import { stampOriginProjectForImport, upsertEntryRow } from './entry-row.js';
|
|
6
|
-
import { buildIndexFromDb, readLastRecall, syncMirrorFiles, writeIndexMirror, writeStatsMirror, buildStatsFromDb } from './mirrors.js';
|
|
6
|
+
import { buildIndexFromDb, readLastRecall, syncMirrorFiles, writeIndexMirror, writeStatsMirror, buildStatsFromDb, } from './mirrors.js';
|
|
7
7
|
import { onHandle, openStore, loadLegacyEntriesFromMarkdown } from './open.js';
|
|
8
8
|
import { DAY_MS } from '../util/time.js';
|
|
9
9
|
/** Load the derived index from SQLite. Read-only: index.json is only ever written by `rebuildIndex`. */
|
|
@@ -18,8 +18,8 @@ export function loadLastRecall(hippoRoot) {
|
|
|
18
18
|
return readLastRecall(db);
|
|
19
19
|
}, openStore);
|
|
20
20
|
}
|
|
21
|
-
/** Persist mutable index metadata (entry rows are derived from SQLite); `last_retrieval_ids` and `last_trace_id` commit
|
|
22
|
-
* rely on both moving together. index.json is left to `rebuildIndex`. */
|
|
21
|
+
/** Persist mutable index metadata (entry rows are derived from SQLite); `last_retrieval_ids` and `last_trace_id` commit
|
|
22
|
+
* in one transaction, as callers rely on both moving together. index.json is left to `rebuildIndex`. */
|
|
23
23
|
export function saveIndex(hippoRoot, index) {
|
|
24
24
|
onHandle(hippoRoot, (db) => {
|
|
25
25
|
withWriteScope(db, 'save_index', () => {
|
|
@@ -77,7 +77,8 @@ export function updateStats(hippoRoot, delta) {
|
|
|
77
77
|
}
|
|
78
78
|
/** updateStats on the caller's open store, so a loop of writes opens the store once. */
|
|
79
79
|
export function updateStatsOn(db, hippoRoot, delta) {
|
|
80
|
-
// One atomic statement per named counter: a read-modify-write loses concurrent increments and stamps stale values
|
|
80
|
+
// One atomic statement per named counter: a read-modify-write loses concurrent increments and stamps stale values
|
|
81
|
+
// over the untouched two.
|
|
81
82
|
const increments = [
|
|
82
83
|
['total_remembered', delta.remembered ?? 0],
|
|
83
84
|
['total_recalled', delta.recalled ?? 0],
|
package/dist/store/index.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
export type { AmbientCandidateRequest, ContextReads, EntryRemoval, EntryTarget, EntryWrite, EntryWrites, HippoStore, KeyAudit, KeyListQuery, KeyMint, KeyRevoke, KeyWrites, LastRecall, LastRecallWrites, OutcomeWrite, RawArchive, RecallSearchArgs, RecallWrites, SelfKeyMint, StoreGroup, StoreGroups, SupersedeWrite, VectorBackfillQuery, VectorReads, VectorRowWrite, VectorWrite, VectorWriteResult, VectorWrites, } from './port.js';
|
|
1
|
+
export type { AmbientCandidateRequest, ContextReads, EntryRemoval, EntryTarget, EntryWrite, EntryWrites, HippoStore, KeyAudit, KeyListQuery, KeyMint, KeyRevoke, KeyGrants, KeyWrites, LastRecall, LastRecallWrites, OutcomeWrite, RawArchive, RecallSearchArgs, RecallWrites, SelfKeyMint, StoreGroup, StoreGroups, SupersedeWrite, VectorBackfillQuery, VectorReads, VectorRowWrite, VectorWrite, VectorWriteResult, VectorWrites, } from './port.js';
|
|
2
|
+
export type { CardCreate, Cards, Conflicts, Dormant, DormantRestoreRequest, Goals, Reports, Sessions, WorkingMemoryFilter, WorkingMemoryPush, } from './port-groups.js';
|
|
2
3
|
export { hasGroup, requireGroup } from './port.js';
|
|
4
|
+
export { narrowStore, type StoreWith } from './narrow.js';
|
|
3
5
|
export { sqliteStore } from './sqlite/store.js';
|
|
4
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/store/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type DatabaseSyncLike } from '../db/index.js';
|
|
2
2
|
import type { KeyRevoke } from './port.js';
|
|
3
|
-
/** The revoke and its audit row commit together, so a failed audit write leaves the key live and the caller sees the
|
|
3
|
+
/** The revoke and its audit row commit together, so a failed audit write leaves the key live and the caller sees the
|
|
4
|
+
* error. */
|
|
4
5
|
export declare function revokeKeyAt(db: DatabaseSyncLike, revoke: KeyRevoke): string;
|
|
5
6
|
export declare function auditHighIdAt(db: DatabaseSyncLike): number;
|
|
6
7
|
//# sourceMappingURL=key-audit.d.ts.map
|