hippo-memory 1.69.0 → 1.71.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 +5 -2
- package/dist/agent-memories/apply.d.ts +3 -3
- package/dist/agent-memories/apply.js +16 -31
- package/dist/agent-memories/claude-code.d.ts +5 -5
- package/dist/agent-memories/claude-code.js +25 -12
- package/dist/agent-memories/copilot.js +3 -2
- package/dist/agent-memories/files.js +26 -14
- package/dist/agent-memories/gemini.js +6 -5
- package/dist/agent-memories/keys.js +3 -2
- package/dist/agent-memories/legacy.d.ts +2 -2
- package/dist/agent-memories/legacy.js +2 -2
- package/dist/agent-memories/markdown.d.ts +1 -3
- package/dist/agent-memories/markdown.js +1 -3
- package/dist/agent-memories/report.d.ts +1 -1
- package/dist/agent-memories/report.js +3 -2
- package/dist/agent-memories/source.d.ts +1 -1
- package/dist/agent-memories/source.js +6 -5
- package/dist/agent-memories/sync.d.ts +5 -3
- package/dist/agent-memories/sync.js +34 -38
- package/dist/agent-memories/types.d.ts +1 -1
- package/dist/api/assemble.d.ts +9 -46
- package/dist/api/assemble.js +44 -54
- package/dist/api/audit.d.ts +8 -7
- package/dist/api/audit.js +15 -21
- package/dist/api/auth.d.ts +17 -39
- package/dist/api/auth.js +76 -216
- package/dist/api/auto-sleep.d.ts +13 -0
- package/dist/api/auto-sleep.js +32 -0
- package/dist/{availability.d.ts → api/availability.d.ts} +4 -17
- package/dist/{availability.js → api/availability.js} +14 -44
- package/dist/{context-auto.js → api/context-auto.js} +2 -1
- package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
- package/dist/{context-render.js → api/context-render.js} +7 -6
- package/dist/api/context-select.d.ts +5 -5
- package/dist/api/context-select.js +39 -48
- package/dist/api/context-types.d.ts +15 -40
- package/dist/api/context.d.ts +7 -26
- package/dist/api/context.js +67 -97
- package/dist/api/dormant.d.ts +7 -23
- package/dist/api/dormant.js +40 -128
- package/dist/api/drill-down.d.ts +9 -48
- package/dist/api/drill-down.js +41 -90
- package/dist/api/forget.d.ts +5 -33
- package/dist/api/forget.js +17 -73
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +2 -2
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +28 -0
- package/dist/api/index.js +31 -0
- package/dist/api/instruction-detect.js +85 -0
- package/dist/api/learn.js +63 -55
- package/dist/api/ledger-db.d.ts +21 -0
- package/dist/api/ledger-db.js +81 -0
- package/dist/api/memories.d.ts +5 -0
- package/dist/api/memories.js +7 -0
- package/dist/api/objects.d.ts +9 -0
- package/dist/api/objects.js +11 -0
- package/dist/api/on-store.d.ts +16 -0
- package/dist/api/on-store.js +38 -0
- package/dist/api/outcome.d.ts +5 -42
- package/dist/api/outcome.js +15 -80
- package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
- package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
- package/dist/api/predictions.d.ts +9 -0
- package/dist/api/predictions.js +18 -0
- package/dist/api/promote.d.ts +16 -31
- package/dist/api/promote.js +38 -123
- package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +11 -11
- package/dist/{prompt-hook.js → api/prompt-hook.js} +42 -60
- package/dist/api/quarantine.d.ts +5 -5
- package/dist/api/quarantine.js +30 -106
- package/dist/api/recall-cli.d.ts +55 -0
- package/dist/api/recall-cli.js +94 -0
- package/dist/api/recall-core.d.ts +4 -0
- package/dist/api/recall-core.js +120 -0
- package/dist/api/recall-finish.d.ts +53 -0
- package/dist/api/recall-finish.js +30 -0
- package/dist/api/recall-history.d.ts +64 -0
- package/dist/api/recall-history.js +159 -0
- package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +7 -8
- package/dist/{recall-pipeline.js → api/recall-pipeline.js} +60 -48
- package/dist/api/recall-record.d.ts +10 -13
- package/dist/api/recall-record.js +10 -30
- package/dist/api/recall-request.d.ts +2 -2
- package/dist/api/recall-request.js +3 -3
- package/dist/api/recall-types.d.ts +101 -316
- package/dist/api/recall.d.ts +5 -33
- package/dist/api/recall.js +92 -91
- 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 +27 -12
- package/dist/api/remember.js +42 -46
- package/dist/api/session-owners.d.ts +4 -0
- package/dist/api/session-owners.js +17 -0
- package/dist/api/sleep-run.d.ts +7 -9
- package/dist/api/sleep-run.js +78 -94
- package/dist/api/sleep.d.ts +10 -29
- package/dist/api/tokens.d.ts +5 -12
- package/dist/api/tokens.js +12 -31
- package/dist/api/types.d.ts +8 -31
- package/dist/api/types.js +5 -23
- package/dist/capture/caller-session.d.ts +2 -2
- package/dist/capture/caller-session.js +8 -8
- package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
- package/dist/{capture-error.js → capture/capture-error.js} +7 -7
- package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
- package/dist/capture/command.d.ts +5 -13
- package/dist/capture/command.js +57 -60
- package/dist/capture/compact-resume-caller.d.ts +1 -1
- package/dist/capture/compact-resume-caller.js +7 -7
- package/dist/capture/compact.d.ts +8 -16
- package/dist/capture/compact.js +56 -47
- package/dist/capture/compaction-items-caller.d.ts +1 -1
- package/dist/capture/compaction-items-caller.js +7 -5
- package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
- package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
- package/dist/{compaction-record.js → capture/compaction-record.js} +143 -157
- package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +1 -1
- package/dist/{compaction-spool.js → capture/compaction-spool.js} +18 -14
- package/dist/capture/copilot-transcript.js +1 -1
- package/dist/capture/extract.js +2 -2
- package/dist/capture/failure-caller.d.ts +2 -2
- package/dist/capture/failure-caller.js +6 -6
- package/dist/capture/failure-reading.d.ts +2 -5
- package/dist/capture/failure-reading.js +11 -12
- package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
- package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
- package/dist/capture/pre-compact-caller.d.ts +1 -1
- package/dist/capture/pre-compact-caller.js +2 -2
- package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +2 -6
- package/dist/{session-digest.js → capture/session-digest.js} +29 -29
- package/dist/capture/session-end-caller.d.ts +2 -2
- package/dist/capture/session-end-caller.js +1 -1
- package/dist/capture/session-texts.d.ts +1 -1
- package/dist/capture/session-texts.js +5 -5
- package/dist/capture/session-worker.js +6 -4
- package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
- package/dist/capture/transcript.d.ts +2 -10
- package/dist/capture/transcript.js +72 -92
- package/dist/capture/working-state.d.ts +0 -3
- package/dist/capture/working-state.js +7 -7
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +28 -0
- package/dist/cli/audit-prune.js +40 -0
- package/dist/cli/audit.d.ts +2 -2
- package/dist/cli/audit.js +92 -88
- package/dist/cli/auth.d.ts +2 -1
- package/dist/cli/auth.js +69 -53
- package/dist/cli/briefs.d.ts +4 -3
- package/dist/cli/briefs.js +76 -202
- package/dist/cli/card.d.ts +2 -1
- package/dist/cli/card.js +55 -54
- package/dist/cli/client.d.ts +28 -0
- package/dist/{client.js → cli/client.js} +25 -44
- package/dist/cli/compact-resume-payload.d.ts +8 -0
- package/dist/cli/compact-resume-payload.js +40 -0
- package/dist/cli/context.d.ts +1 -13
- package/dist/cli/context.js +51 -77
- package/dist/cli/continuity.d.ts +6 -5
- package/dist/cli/continuity.js +153 -145
- package/dist/cli/correction-latency.d.ts +24 -0
- package/dist/{correction-latency.js → cli/correction-latency.js} +2 -14
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +226 -222
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +70 -52
- package/dist/cli/decisions.d.ts +4 -3
- package/dist/cli/decisions.js +129 -253
- package/dist/cli/eval.d.ts +1 -3
- package/dist/cli/eval.js +56 -42
- package/dist/cli/exit.d.ts +6 -0
- package/dist/cli/exit.js +11 -0
- package/dist/cli/explain.d.ts +1 -2
- package/dist/cli/explain.js +39 -21
- package/dist/cli/flag-values.d.ts +30 -0
- package/dist/cli/flag-values.js +120 -0
- package/dist/cli/flags.d.ts +304 -0
- package/dist/cli/flags.js +169 -0
- package/dist/cli/github.d.ts +14 -0
- package/dist/cli/github.js +184 -0
- package/dist/cli/goals.d.ts +2 -1
- package/dist/cli/goals.js +76 -75
- package/dist/cli/hook-runtime.d.ts +31 -0
- package/dist/cli/hook-runtime.js +139 -0
- package/dist/cli/init.d.ts +2 -1
- package/dist/cli/init.js +153 -126
- package/dist/cli/install-steps.d.ts +7 -0
- package/dist/cli/install-steps.js +101 -0
- package/dist/cli/last-sleep.d.ts +3 -1
- package/dist/cli/last-sleep.js +12 -7
- package/dist/cli/maintenance.d.ts +5 -4
- package/dist/cli/maintenance.js +41 -42
- package/dist/cli/object-verbs.d.ts +40 -0
- package/dist/cli/object-verbs.js +66 -0
- package/dist/cli/owner-validation.d.ts +18 -0
- package/dist/cli/owner-validation.js +33 -0
- package/dist/cli/playbooks.d.ts +4 -3
- package/dist/cli/playbooks.js +98 -306
- package/dist/cli/print.d.ts +15 -0
- package/dist/cli/print.js +82 -0
- package/dist/cli/projects.d.ts +2 -3
- package/dist/cli/projects.js +56 -51
- package/dist/cli/provenance-coverage.d.ts +14 -0
- package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +2 -6
- package/dist/cli/quality-repair-once.js +4 -4
- package/dist/cli/recall.d.ts +2 -6
- package/dist/cli/recall.js +128 -253
- package/dist/cli/refine-llm.d.ts +35 -0
- package/dist/cli/refine-llm.js +128 -0
- package/dist/cli/remember.d.ts +4 -6
- package/dist/cli/remember.js +193 -230
- package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +4 -17
- package/dist/{scheduler.js → cli/scheduler.js} +22 -22
- package/dist/cli/serve.d.ts +1 -1
- package/dist/cli/serve.js +46 -7
- package/dist/cli/session-hooks.d.ts +11 -19
- package/dist/cli/session-hooks.js +263 -258
- package/dist/cli/setup.d.ts +4 -3
- package/dist/cli/setup.js +55 -37
- package/dist/cli/shared.d.ts +14 -118
- package/dist/cli/shared.js +26 -400
- package/dist/cli/slack.d.ts +2 -1
- package/dist/cli/slack.js +46 -74
- package/dist/cli/sleep-render.d.ts +4 -0
- package/dist/cli/sleep-render.js +61 -0
- package/dist/cli/sleep.d.ts +3 -8
- package/dist/cli/sleep.js +34 -91
- package/dist/cli/status.d.ts +9 -12
- package/dist/cli/status.js +86 -131
- package/dist/{stdin.d.ts → cli/stdin.d.ts} +4 -6
- package/dist/{stdin.js → cli/stdin.js} +8 -9
- package/dist/cli/transfer.d.ts +9 -9
- package/dist/cli/transfer.js +125 -122
- package/dist/cli/usage.js +13 -5
- package/dist/cli.d.ts +69 -167
- package/dist/cli.js +187 -296
- package/dist/connectors/dlq.d.ts +44 -0
- package/dist/connectors/dlq.js +30 -0
- package/dist/connectors/github/backfill.d.ts +6 -26
- package/dist/connectors/github/backfill.js +42 -114
- package/dist/connectors/github/deletion.d.ts +6 -21
- package/dist/connectors/github/deletion.js +17 -64
- package/dist/connectors/github/dlq.d.ts +12 -91
- package/dist/connectors/github/dlq.js +23 -140
- package/dist/connectors/github/ingest.d.ts +4 -37
- package/dist/connectors/github/ingest.js +24 -93
- package/dist/connectors/github/octokit-client.d.ts +5 -17
- package/dist/connectors/github/octokit-client.js +29 -25
- 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 +4 -26
- package/dist/connectors/github/tenant-routing.js +13 -61
- package/dist/connectors/github/transform.d.ts +1 -1
- package/dist/connectors/github/transform.js +2 -16
- package/dist/connectors/github/types.d.ts +4 -16
- package/dist/connectors/github/types.js +17 -27
- package/dist/connectors/github/webhook.d.ts +5 -18
- package/dist/connectors/github/webhook.js +86 -105
- package/dist/connectors/slack/backfill.d.ts +5 -18
- package/dist/connectors/slack/backfill.js +9 -42
- package/dist/connectors/slack/deletion.d.ts +4 -7
- package/dist/connectors/slack/deletion.js +20 -49
- package/dist/connectors/slack/dlq.d.ts +9 -68
- package/dist/connectors/slack/dlq.js +26 -136
- package/dist/connectors/slack/ingest.d.ts +4 -18
- package/dist/connectors/slack/ingest.js +26 -91
- 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/signature.js +2 -1
- package/dist/connectors/slack/tenant-routing.d.ts +4 -18
- package/dist/connectors/slack/tenant-routing.js +11 -31
- package/dist/connectors/slack/transform.d.ts +3 -19
- package/dist/connectors/slack/transform.js +2 -18
- package/dist/connectors/slack/types.d.ts +4 -10
- package/dist/connectors/slack/types.js +5 -16
- package/dist/connectors/slack/web-client.js +34 -28
- package/dist/connectors/slack/webhook.d.ts +5 -21
- package/dist/connectors/slack/webhook.js +80 -108
- package/dist/connectors/slack/workspaces.d.ts +8 -41
- package/dist/connectors/slack/workspaces.js +8 -58
- package/dist/consolidate/conflicts.d.ts +1 -1
- package/dist/consolidate/conflicts.js +10 -18
- package/dist/consolidate/dag-summary.d.ts +8 -0
- package/dist/consolidate/dag-summary.js +41 -0
- package/dist/{dag.d.ts → consolidate/dag.d.ts} +6 -29
- package/dist/{dag.js → consolidate/dag.js} +49 -131
- package/dist/consolidate/decay.d.ts +2 -2
- package/dist/consolidate/decay.js +35 -41
- package/dist/consolidate/dedupe.d.ts +29 -0
- package/dist/consolidate/dedupe.js +103 -0
- package/dist/consolidate/flush-units.d.ts +5 -6
- package/dist/consolidate/flush-units.js +3 -3
- package/dist/consolidate/half-life-migration.d.ts +34 -0
- package/dist/consolidate/half-life-migration.js +89 -0
- package/dist/consolidate/llm-passes.js +12 -29
- package/dist/consolidate/memory-value-weights.d.ts +8 -0
- package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +2 -13
- package/dist/consolidate/memory-value.d.ts +45 -0
- package/dist/consolidate/memory-value.js +164 -0
- package/dist/consolidate/merge.js +65 -83
- package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
- package/dist/{merged-row.js → consolidate/merged-row.js} +4 -3
- package/dist/consolidate/physics-pass.js +46 -48
- package/dist/consolidate/replay.d.ts +9 -0
- package/dist/consolidate/replay.js +84 -0
- package/dist/consolidate/run.d.ts +7 -13
- package/dist/consolidate/run.js +6 -37
- package/dist/consolidate/sleep.d.ts +2 -9
- package/dist/consolidate/sleep.js +69 -151
- package/dist/consolidate/trace.d.ts +19 -0
- package/dist/{trace.js → consolidate/trace.js} +7 -24
- package/dist/consolidate/traces.js +40 -51
- package/dist/core/ablation.d.ts +15 -0
- package/dist/core/ablation.js +49 -0
- package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
- package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
- package/dist/{ambient.d.ts → core/ambient.d.ts} +1 -8
- package/dist/{ambient.js → core/ambient.js} +13 -18
- package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +16 -3
- package/dist/{capture-contract.js → core/capture-contract.js} +67 -1
- package/dist/{card.d.ts → core/card.d.ts} +4 -1
- package/dist/{card.js → core/card.js} +8 -0
- package/dist/core/compare.d.ts +32 -0
- package/dist/core/compare.js +70 -0
- package/dist/{config.d.ts → core/config.d.ts} +14 -28
- package/dist/{config.js → core/config.js} +101 -75
- package/dist/{handoff.d.ts → core/handoff.d.ts} +1 -7
- package/dist/core/handoff.js +81 -0
- package/dist/{memory-quality.js → core/memory-quality.js} +2 -2
- package/dist/core/memory.d.ts +183 -0
- package/dist/core/memory.js +380 -0
- package/dist/core/package-root.d.ts +3 -0
- package/dist/core/package-root.js +5 -0
- package/dist/{physics-config.d.ts → core/physics-config.d.ts} +1 -4
- package/dist/{physics-config.js → core/physics-config.js} +3 -8
- package/dist/{physics.d.ts → core/physics.d.ts} +16 -62
- package/dist/{physics.js → core/physics.js} +60 -122
- package/dist/{project-identity.d.ts → core/project-identity.d.ts} +17 -63
- package/dist/{project-identity.js → core/project-identity.js} +22 -55
- package/dist/{project-remote.js → core/project-remote.js} +17 -6
- package/dist/{prompt-recall.js → core/prompt-recall.js} +1 -1
- package/dist/core/raw-append-only.d.ts +5 -0
- package/dist/core/raw-append-only.js +7 -0
- package/dist/{salience.d.ts → core/salience.d.ts} +1 -7
- package/dist/{salience.js → core/salience.js} +36 -27
- package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
- package/dist/{search/types.js → core/search-types.js} +1 -1
- package/dist/core/session-digest-row.d.ts +5 -0
- package/dist/core/session-digest-row.js +6 -0
- package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
- package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +7 -7
- package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
- package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
- package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +11 -10
- package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +110 -104
- package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +2 -1
- package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +1 -0
- package/dist/{dashboard.js → dashboard/dashboard.js} +172 -55
- package/dist/db/backup.js +1 -1
- package/dist/db/busy.d.ts +19 -2
- package/dist/db/busy.js +88 -14
- package/dist/db/connect.d.ts +11 -2
- package/dist/db/connect.js +43 -10
- package/dist/db/index.d.ts +9 -0
- package/dist/db/index.js +8 -0
- package/dist/db/meta.d.ts +4 -0
- package/dist/db/meta.js +11 -1
- package/dist/db/migrate.d.ts +8 -1
- package/dist/db/migrate.js +28 -33
- package/dist/db/migrations/types.d.ts +2 -5
- package/dist/db/migrations/v08.js +1 -1
- package/dist/db/migrations/v14.js +39 -36
- package/dist/db/migrations/v15.js +2 -8
- package/dist/db/migrations/v16.js +31 -29
- package/dist/db/migrations/v17.js +2 -3
- package/dist/db/migrations/v18.js +6 -5
- package/dist/db/migrations/v19.js +2 -5
- package/dist/db/migrations/v20.js +5 -8
- package/dist/db/migrations/v22.js +28 -38
- package/dist/db/migrations/v23.js +3 -14
- package/dist/db/migrations/v24.js +25 -22
- 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 +23 -32
- package/dist/db/migrations/v30.js +4 -16
- package/dist/db/migrations/v31.js +23 -31
- 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 +10 -21
- package/dist/db/migrations/v40.js +8 -14
- package/dist/db/migrations/v41.js +2 -24
- package/dist/db/migrations/v43.js +7 -6
- package/dist/db/migrations/v44.js +2 -8
- package/dist/db/migrations/v45.js +2 -7
- package/dist/db/migrations/v46.js +1 -1
- package/dist/db/migrations/v47.js +2 -3
- package/dist/db/migrations/v48.js +1 -1
- package/dist/db/migrations/v49.js +1 -1
- package/dist/db/migrations/v50.js +8 -7
- package/dist/db/migrations/v51.js +1 -1
- package/dist/db/migrations/v52.js +1 -1
- package/dist/db/open.d.ts +11 -1
- package/dist/db/open.js +37 -4
- package/dist/db/physics-state.d.ts +23 -0
- package/dist/{physics-state.js → db/physics-state.js} +34 -52
- package/dist/db/raw-archive-mirror-cleanup.d.ts +5 -0
- package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +10 -20
- package/dist/db/request-stores.d.ts +15 -2
- package/dist/db/request-stores.js +37 -15
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -0
- package/dist/{vector-store.d.ts → db/vector-store.d.ts} +6 -2
- package/dist/{vector-store.js → db/vector-store.js} +83 -51
- package/dist/db/wal-checkpointer.d.ts +11 -0
- package/dist/db/wal-checkpointer.js +92 -0
- package/dist/doctor.js +176 -152
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.d.ts +1 -1
- package/dist/entry/project-identity.js +1 -1
- package/dist/entry/session-text.d.ts +3 -3
- package/dist/entry/session-text.js +5 -4
- package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +15 -53
- package/dist/{eval-stats.js → eval/eval-stats.js} +24 -51
- package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +3 -14
- package/dist/{eval-suite.js → eval/eval-suite.js} +99 -57
- package/dist/{eval.d.ts → eval/eval.d.ts} +7 -25
- package/dist/{eval.js → eval/eval.js} +35 -55
- package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -6
- package/dist/{judgment.js → eval/judgment.js} +23 -20
- package/dist/extensions/openclaw-plugin/index.js +2 -3
- package/dist/graph/delta.d.ts +3 -2
- package/dist/graph/delta.js +9 -23
- package/dist/{graph-extract.d.ts → graph/extract.d.ts} +10 -32
- package/dist/{graph-extract.js → graph/extract.js} +40 -81
- package/dist/{graph-recall.d.ts → graph/recall.d.ts} +9 -22
- package/dist/{graph-recall.js → graph/recall.js} +65 -108
- package/dist/graph/stream.d.ts +38 -0
- package/dist/{graph-stream.js → graph/stream.js} +20 -41
- package/dist/graph/view.d.ts +50 -0
- package/dist/graph/view.js +265 -0
- package/dist/graph/write.d.ts +4 -76
- package/dist/graph/write.js +13 -397
- package/dist/hooks/codex-session.js +1 -1
- package/dist/hooks/codex-wrapper.js +16 -17
- package/dist/hooks/copilot.d.ts +1 -8
- package/dist/hooks/copilot.js +16 -16
- package/dist/{cli → hooks}/hook-blocks.d.ts +6 -2
- package/dist/{cli → hooks}/hook-blocks.js +38 -125
- package/dist/hooks/json-hooks.d.ts +5 -37
- package/dist/hooks/json-hooks.js +49 -179
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +44 -103
- package/dist/hooks/shared.d.ts +8 -21
- package/dist/hooks/shared.js +30 -25
- package/dist/importers/core.d.ts +13 -42
- package/dist/importers/core.js +48 -64
- package/dist/importers/markdown-parse.d.ts +9 -32
- package/dist/importers/markdown-parse.js +10 -44
- package/dist/importers/markdown.js +5 -13
- package/dist/importers/sources.js +57 -81
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +95 -172
- package/dist/index.d.ts +26 -22
- package/dist/index.js +25 -21
- package/dist/learn/autolearn.d.ts +29 -0
- package/dist/{autolearn.js → learn/autolearn.js} +26 -51
- package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
- package/dist/{churn-git.js → learn/churn-git.js} +6 -4
- package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
- package/dist/learn/extract.js +123 -0
- package/dist/learn/forward-claim-detector.d.ts +12 -0
- package/dist/learn/forward-claim-detector.js +60 -0
- package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +10 -18
- package/dist/{invalidation.js → learn/invalidation.js} +92 -125
- package/dist/mcp/admin-tools.d.ts +1 -1
- package/dist/mcp/admin-tools.js +39 -64
- package/dist/mcp/format.d.ts +5 -5
- package/dist/mcp/format.js +7 -6
- package/dist/mcp/framing.d.ts +6 -0
- package/dist/mcp/framing.js +11 -3
- package/dist/mcp/memory-tools.js +10 -35
- package/dist/mcp/protocol.d.ts +14 -36
- package/dist/mcp/protocol.js +10 -19
- package/dist/mcp/recall-tools.d.ts +2 -2
- package/dist/mcp/recall-tools.js +70 -52
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +71 -85
- package/dist/mcp/server.d.ts +3 -9
- package/dist/mcp/server.js +6 -17
- package/dist/mcp/session-state.d.ts +2 -3
- package/dist/mcp/session-state.js +7 -13
- package/dist/mcp/shared-gate.js +1 -1
- package/dist/mcp/stdio.d.ts +2 -6
- package/dist/mcp/stdio.js +112 -38
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +7 -5
- package/dist/objects/customer-notes.d.ts +44 -0
- package/dist/objects/customer-notes.js +71 -0
- package/dist/objects/decisions.d.ts +41 -0
- package/dist/objects/decisions.js +63 -0
- package/dist/objects/descriptor.d.ts +52 -0
- package/dist/objects/descriptor.js +4 -0
- package/dist/objects/fields.d.ts +15 -0
- package/dist/objects/fields.js +21 -0
- package/dist/objects/incidents.d.ts +45 -0
- package/dist/objects/incidents.js +96 -0
- package/dist/objects/lifecycle.d.ts +27 -0
- package/dist/objects/lifecycle.js +96 -0
- package/dist/objects/policies.d.ts +60 -0
- package/dist/objects/policies.js +102 -0
- package/dist/objects/processes.d.ts +43 -0
- package/dist/objects/processes.js +92 -0
- package/dist/objects/project-briefs.d.ts +63 -0
- package/dist/objects/project-briefs.js +194 -0
- package/dist/objects/skills.d.ts +51 -0
- package/dist/objects/skills.js +110 -0
- package/dist/postinstall.js +10 -21
- package/dist/predictions/planning-fallacy.d.ts +14 -109
- package/dist/predictions/planning-fallacy.js +4 -129
- package/dist/rerankers/clef.d.ts +2 -6
- package/dist/rerankers/clef.js +28 -76
- package/dist/rerankers/cross-encoder.d.ts +0 -7
- package/dist/rerankers/cross-encoder.js +18 -28
- package/dist/rerankers/index.js +8 -7
- package/dist/rerankers/jev.d.ts +1 -4
- package/dist/rerankers/jev.js +36 -52
- package/dist/rerankers/llm.d.ts +2 -13
- package/dist/rerankers/llm.js +42 -59
- package/dist/rerankers/outage-warning.d.ts +8 -0
- package/dist/rerankers/outage-warning.js +32 -0
- package/dist/rerankers/remote.d.ts +4 -0
- package/dist/rerankers/remote.js +25 -0
- package/dist/rerankers/types.d.ts +3 -15
- package/dist/search/as-of.d.ts +1 -1
- package/dist/search/bm25-search.d.ts +2 -2
- package/dist/search/bm25-search.js +7 -7
- package/dist/search/bm25.d.ts +1 -1
- package/dist/search/bm25.js +1 -1
- package/dist/search/boosts.d.ts +5 -3
- package/dist/search/boosts.js +36 -15
- package/dist/search/breakdown.d.ts +2 -2
- package/dist/search/breakdown.js +2 -1
- package/dist/search/explain.d.ts +1 -1
- package/dist/search/explain.js +3 -2
- package/dist/search/finalize.d.ts +2 -2
- package/dist/search/finalize.js +4 -3
- package/dist/search/fusion.d.ts +1 -1
- package/dist/search/fusion.js +3 -3
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +90 -0
- package/dist/search/hybrid-score.d.ts +2 -2
- package/dist/search/hybrid-score.js +1 -1
- package/dist/search/hybrid.d.ts +6 -4
- package/dist/search/hybrid.js +11 -8
- package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
- package/dist/{multihop.js → search/multihop.js} +9 -8
- package/dist/search/path-context.d.ts +11 -0
- package/dist/{path-context.js → search/path-context.js} +8 -19
- package/dist/search/physics-search.d.ts +4 -4
- package/dist/search/physics-search.js +25 -22
- package/dist/search/rerank.d.ts +3 -3
- package/dist/search/rerank.js +4 -3
- package/dist/search/rrf.d.ts +15 -0
- package/dist/search/rrf.js +36 -0
- package/dist/search/temporal.d.ts +1 -1
- package/dist/search/temporal.js +5 -2
- package/dist/search/vector.d.ts +10 -3
- package/dist/search/vector.js +51 -15
- package/dist/server/auth.d.ts +10 -29
- package/dist/server/auth.js +57 -42
- package/dist/server/boot.d.ts +5 -0
- package/dist/server/boot.js +432 -0
- package/dist/server/client-ip.d.ts +8 -20
- package/dist/server/client-ip.js +23 -34
- package/dist/server/cursor.d.ts +1 -1
- package/dist/server/cursor.js +2 -3
- package/dist/server/deadline.d.ts +13 -0
- package/dist/server/deadline.js +45 -0
- package/dist/server/defaults.d.ts +3 -0
- package/dist/server/defaults.js +4 -0
- package/dist/server/key-check-bounds.d.ts +9 -0
- package/dist/server/key-check-bounds.js +46 -0
- package/dist/server/lifecycle.d.ts +5 -4
- package/dist/server/lifecycle.js +20 -5
- package/dist/server/mcp-http.d.ts +1 -4
- package/dist/server/mcp-http.js +44 -68
- package/dist/server/rate-limit.d.ts +21 -0
- package/dist/{rate-limit.js → server/rate-limit.js} +4 -13
- package/dist/server/ready.d.ts +7 -0
- package/dist/server/ready.js +38 -0
- package/dist/server/request.d.ts +14 -12
- package/dist/server/request.js +71 -28
- package/dist/server/route-table.d.ts +15 -0
- package/dist/server/route-table.js +202 -0
- package/dist/server/routes/admin.js +29 -30
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +35 -105
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +45 -115
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +44 -105
- package/dist/server/routes/memories.js +21 -43
- package/dist/server/routes/object-routes.d.ts +35 -0
- package/dist/server/routes/object-routes.js +72 -0
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +42 -134
- package/dist/server/routes/predictions.js +35 -63
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +44 -134
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +41 -120
- package/dist/server/routes/recall.js +21 -44
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +40 -138
- package/dist/server/server-detect.d.ts +28 -0
- package/dist/server/server-detect.js +156 -0
- package/dist/server/sleep-child.d.ts +2 -0
- package/dist/server/sleep-child.js +19 -0
- package/dist/server/sleep-offload.d.ts +20 -0
- package/dist/server/sleep-offload.js +73 -0
- package/dist/server/tls.d.ts +6 -0
- package/dist/server/tls.js +24 -0
- package/dist/server/types.d.ts +35 -14
- package/dist/server/validation.d.ts +6 -5
- package/dist/server/validation.js +16 -34
- package/dist/server.d.ts +39 -61
- package/dist/server.js +26 -569
- 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 +80 -0
- package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +5 -6
- package/dist/{project-merge.js → sharing/project-merge.js} +34 -51
- package/dist/sharing/scope.d.ts +7 -0
- package/dist/{scope.js → sharing/scope.js} +5 -12
- package/dist/sharing/search-both.d.ts +60 -0
- package/dist/sharing/search-both.js +138 -0
- package/dist/sharing/share.d.ts +38 -0
- package/dist/sharing/share.js +226 -0
- package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
- package/dist/{ambient-store.js → store/ambient.js} +11 -16
- package/dist/store/audit-event.d.ts +15 -17
- package/dist/store/audit-event.js +9 -16
- package/dist/{audit.d.ts → store/audit.d.ts} +29 -8
- package/dist/{audit.js → store/audit.js} +95 -18
- package/dist/{auth.d.ts → store/auth.d.ts} +19 -36
- package/dist/{auth.js → store/auth.js} +108 -99
- package/dist/store/candidates.d.ts +41 -13
- package/dist/store/candidates.js +141 -60
- package/dist/{card-detail.d.ts → store/card-detail.d.ts} +5 -4
- package/dist/{card-detail.js → store/card-detail.js} +3 -2
- package/dist/{store-cards.d.ts → store/cards.d.ts} +26 -16
- package/dist/{store-cards.js → store/cards.js} +133 -248
- package/dist/store/compactions.d.ts +78 -0
- package/dist/store/compactions.js +93 -0
- package/dist/store/conflicts.d.ts +26 -26
- package/dist/store/conflicts.js +194 -222
- package/dist/store/connectors/github.d.ts +84 -0
- package/dist/store/connectors/github.js +180 -0
- package/dist/store/connectors/slack.d.ts +69 -0
- package/dist/store/connectors/slack.js +177 -0
- package/dist/store/dashboard-reads.d.ts +27 -0
- package/dist/store/dashboard-reads.js +88 -0
- package/dist/store/delete-and-batch.d.ts +27 -51
- package/dist/store/delete-and-batch.js +100 -92
- package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +16 -5
- package/dist/{delivery-recorder.js → store/delivery-recorder.js} +60 -38
- package/dist/store/descendant-page.d.ts +12 -0
- package/dist/store/descendant-page.js +99 -0
- package/dist/store/diagnostics.d.ts +47 -0
- package/dist/store/diagnostics.js +44 -0
- package/dist/store/doctor-reads.d.ts +16 -0
- package/dist/store/doctor-reads.js +19 -0
- package/dist/store/dormant.d.ts +105 -0
- package/dist/store/dormant.js +241 -0
- package/dist/store/embeddings/index.d.ts +36 -0
- package/dist/{embeddings.js → store/embeddings/index.js} +104 -224
- package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
- package/dist/{local-embedding.js → store/embeddings/local.js} +69 -75
- package/dist/store/embeddings/provider.d.ts +40 -0
- package/dist/{embedding-provider.js → store/embeddings/provider.js} +78 -91
- package/dist/store/entry-reads.d.ts +66 -63
- package/dist/store/entry-reads.js +159 -121
- package/dist/store/entry-row.d.ts +14 -37
- package/dist/store/entry-row.js +37 -45
- package/dist/store/entry-writes.d.ts +40 -17
- package/dist/store/entry-writes.js +105 -41
- package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
- package/dist/{failure-log.js → store/failure-log.js} +9 -2
- package/dist/store/goals.d.ts +96 -0
- package/dist/store/goals.js +260 -0
- package/dist/store/graph-queue.d.ts +13 -0
- package/dist/store/graph-queue.js +70 -0
- package/dist/store/graph-reads.d.ts +41 -0
- package/dist/{graph/read.js → store/graph-reads.js} +72 -162
- package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +71 -14
- package/dist/{graph/rows.js → store/graph-rows.js} +20 -12
- package/dist/store/graph-view-rows.d.ts +13 -0
- package/dist/store/graph-view-rows.js +68 -0
- package/dist/store/graph-writes.d.ts +33 -0
- package/dist/store/graph-writes.js +232 -0
- package/dist/store/half-life.d.ts +35 -0
- package/dist/store/half-life.js +75 -0
- package/dist/store/handoffs.d.ts +6 -12
- package/dist/store/handoffs.js +54 -63
- package/dist/store/index-and-stats.d.ts +14 -20
- package/dist/store/index-and-stats.js +74 -119
- package/dist/store/index.d.ts +4 -0
- package/dist/store/index.js +3 -0
- package/dist/store/key-audit.d.ts +2 -2
- package/dist/store/key-audit.js +4 -4
- package/dist/store/key-writes.d.ts +12 -5
- package/dist/store/key-writes.js +30 -4
- package/dist/store/ledger-turn.d.ts +17 -0
- package/dist/store/ledger-turn.js +27 -0
- package/dist/store/markdown.d.ts +3 -7
- package/dist/store/markdown.js +25 -23
- package/dist/store/mirrors.d.ts +7 -13
- package/dist/store/mirrors.js +52 -47
- package/dist/store/object-types.d.ts +189 -0
- package/dist/store/object-types.js +4 -0
- package/dist/store/open.d.ts +6 -4
- package/dist/store/open.js +30 -36
- package/dist/store/planning-fallacy-evidence.d.ts +14 -0
- package/dist/store/planning-fallacy-evidence.js +52 -0
- package/dist/store/port.d.ts +649 -0
- package/dist/store/port.js +17 -0
- package/dist/{predictions/store.d.ts → store/predictions.d.ts} +25 -52
- package/dist/{predictions/store.js → store/predictions.js} +88 -184
- package/dist/{quality-repair.js → store/quality-repair.js} +27 -57
- package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
- package/dist/{quarantine.js → store/quarantine.js} +64 -22
- package/dist/store/raw-archive.d.ts +14 -0
- package/dist/{raw-archive.js → store/raw-archive.js} +20 -31
- package/dist/store/recall-scope.d.ts +78 -0
- package/dist/{recall-scope.js → store/recall-scope.js} +23 -84
- package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -81
- package/dist/{recall-trace.js → store/recall-trace.js} +41 -122
- package/dist/store/rejected-values.d.ts +55 -0
- package/dist/store/rejected-values.js +150 -0
- package/dist/store/rejection.d.ts +54 -0
- package/dist/{rejection.js → store/rejection.js} +16 -67
- package/dist/store/report-reads.d.ts +6 -0
- package/dist/store/report-reads.js +29 -0
- package/dist/store/rows.d.ts +11 -22
- package/dist/store/rows.js +52 -43
- package/dist/store/rule-sql.d.ts +5 -0
- package/dist/store/rule-sql.js +37 -0
- package/dist/store/search-rows.d.ts +22 -42
- package/dist/store/search-rows.js +55 -78
- package/dist/store/sessions.d.ts +23 -49
- package/dist/store/sessions.js +96 -118
- package/dist/store/sqlite/commit-watch.d.ts +4 -0
- package/dist/store/sqlite/commit-watch.js +29 -0
- package/dist/store/sqlite/connector-events-group.d.ts +5 -0
- package/dist/store/sqlite/connector-events-group.js +50 -0
- package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
- package/dist/store/sqlite/connector-writes-group.js +65 -0
- package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
- package/dist/store/sqlite/dag-reads-group.js +45 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
- package/dist/store/{entry-writes-group.js → sqlite/entry-writes-group.js} +73 -60
- package/dist/store/sqlite/error-codec.d.ts +17 -0
- package/dist/store/sqlite/error-codec.js +61 -0
- package/dist/store/sqlite/executor-counts.d.ts +10 -0
- package/dist/store/sqlite/executor-counts.js +11 -0
- package/dist/store/sqlite/executor.d.ts +29 -0
- package/dist/store/sqlite/executor.js +287 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
- package/dist/store/sqlite/graph-reads-group.js +18 -0
- package/dist/store/sqlite/local.d.ts +21 -0
- package/dist/store/sqlite/local.js +39 -0
- package/dist/store/sqlite/object-rows.d.ts +102 -0
- package/dist/store/sqlite/object-rows.js +221 -0
- package/dist/store/sqlite/objects-group.d.ts +20 -0
- package/dist/store/sqlite/objects-group.js +316 -0
- package/dist/store/sqlite/predictions-group.d.ts +5 -0
- package/dist/store/sqlite/predictions-group.js +28 -0
- package/dist/store/sqlite/quarantine-group.d.ts +5 -0
- package/dist/store/sqlite/quarantine-group.js +38 -0
- package/dist/store/sqlite/store.d.ts +23 -0
- package/dist/store/sqlite/store.js +294 -0
- package/dist/store/sqlite/vector-pack.d.ts +18 -0
- package/dist/store/sqlite/vector-pack.js +46 -0
- package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
- package/dist/store/sqlite/vector-reads-group.js +23 -0
- package/dist/store/sqlite/worker-entry.d.ts +2 -0
- package/dist/store/sqlite/worker-entry.js +8 -0
- package/dist/store/sqlite/worker-jobs.d.ts +5 -0
- package/dist/store/sqlite/worker-jobs.js +116 -0
- package/dist/store/sqlite/worker-ops.d.ts +135 -0
- package/dist/store/sqlite/worker-ops.js +93 -0
- package/dist/store/sqlite/worker-store.d.ts +8 -0
- package/dist/store/sqlite/worker-store.js +79 -0
- package/dist/store/summaries.d.ts +11 -72
- package/dist/store/summaries.js +47 -186
- package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
- package/dist/{summary-dirty.js → 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 +11 -0
- package/dist/store/tenant.js +28 -0
- package/dist/store/token-ledger-rows.d.ts +61 -0
- package/dist/store/token-ledger-rows.js +68 -0
- package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +14 -51
- package/dist/{token-ledger.js → store/token-ledger.js} +51 -129
- package/dist/store/tombstone-checks.d.ts +12 -0
- package/dist/store/tombstone-checks.js +31 -0
- package/dist/store/usage-reports.d.ts +7 -0
- package/dist/store/usage-reports.js +18 -0
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +170 -0
- package/dist/{working-memory.d.ts → store/working-memory.d.ts} +11 -26
- package/dist/store/working-memory.js +118 -0
- package/dist/{yaml.d.ts → store/yaml.d.ts} +1 -5
- package/dist/{yaml.js → store/yaml.js} +2 -6
- package/dist/support-bundle.d.ts +1 -1
- package/dist/support-bundle.js +19 -37
- package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
- package/dist/{gated-write.js → trust/gated-write.js} +6 -6
- package/dist/trust/quarantine.d.ts +4 -0
- package/dist/trust/quarantine.js +8 -0
- package/dist/trust/reject-flow.d.ts +23 -0
- package/dist/trust/reject-flow.js +65 -0
- package/dist/util/anthropic-messages.d.ts +31 -0
- package/dist/util/anthropic-messages.js +58 -0
- package/dist/util/atomic-write.d.ts +4 -0
- package/dist/util/atomic-write.js +138 -0
- package/dist/util/capped-json.d.ts +6 -0
- package/dist/util/capped-json.js +46 -0
- package/dist/util/crash-handlers.d.ts +12 -0
- package/dist/util/crash-handlers.js +72 -0
- package/dist/{env.d.ts → util/env.d.ts} +27 -7
- package/dist/{env.js → util/env.js} +33 -8
- package/dist/{home-path.d.ts → util/home-path.d.ts} +2 -1
- package/dist/util/home-path.js +69 -0
- package/dist/{http-retry.d.ts → util/http-retry.d.ts} +8 -2
- package/dist/util/http-retry.js +103 -0
- package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
- package/dist/{http-util.js → util/http-util.js} +31 -11
- package/dist/util/json.d.ts +17 -0
- package/dist/util/json.js +25 -0
- package/dist/{log.d.ts → util/log.d.ts} +7 -3
- package/dist/{log.js → util/log.js} +36 -11
- package/dist/util/real-path.d.ts +3 -0
- package/dist/util/real-path.js +15 -0
- package/dist/util/request-scope.d.ts +28 -0
- package/dist/util/request-scope.js +48 -0
- package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
- package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +5 -30
- package/dist/{secret-detect.js → util/secret-detect.js} +17 -42
- package/dist/util/stored-json.d.ts +9 -0
- package/dist/util/stored-json.js +8 -0
- package/dist/util/time.d.ts +2 -0
- package/dist/util/time.js +3 -0
- package/dist/util/token-text.d.ts +15 -0
- package/dist/util/token-text.js +20 -0
- package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +2 -0
- package/dist/util/transcript-tail.js +49 -0
- package/dist/util/version.d.ts +11 -0
- package/dist/util/version.js +26 -0
- package/extensions/openclaw-plugin/index.ts +2 -6
- 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/ablation.d.ts +0 -102
- package/dist/ablation.js +0 -136
- package/dist/api.d.ts +0 -26
- package/dist/api.js +0 -29
- package/dist/audit-prune.d.ts +0 -62
- package/dist/audit-prune.js +0 -107
- package/dist/autolearn.d.ts +0 -56
- package/dist/client.d.ts +0 -48
- package/dist/compare.d.ts +0 -86
- package/dist/compare.js +0 -117
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/connectors/github/cli-impl.js +0 -227
- package/dist/connectors/github/idempotency.d.ts +0 -19
- package/dist/connectors/github/idempotency.js +0 -27
- package/dist/connectors/slack/idempotency.d.ts +0 -17
- package/dist/connectors/slack/idempotency.js +0 -31
- package/dist/correction-latency.d.ts +0 -36
- package/dist/customer-notes.d.ts +0 -96
- package/dist/customer-notes.js +0 -336
- package/dist/db.d.ts +0 -9
- package/dist/db.js +0 -8
- package/dist/decisions.d.ts +0 -94
- package/dist/decisions.js +0 -326
- package/dist/dedupe.d.ts +0 -75
- package/dist/dedupe.js +0 -169
- package/dist/dormant.d.ts +0 -93
- package/dist/dormant.js +0 -137
- package/dist/embedding-provider.d.ts +0 -77
- package/dist/embeddings.d.ts +0 -101
- package/dist/extract.js +0 -133
- package/dist/forward-claim-detector.d.ts +0 -36
- package/dist/forward-claim-detector.js +0 -112
- package/dist/goals.d.ts +0 -173
- package/dist/goals.js +0 -448
- package/dist/graph/read.d.ts +0 -73
- package/dist/graph/rows.d.ts +0 -45
- package/dist/graph/types.js +0 -11
- package/dist/graph-stream.d.ts +0 -70
- package/dist/graph-view.d.ts +0 -73
- package/dist/graph-view.js +0 -333
- package/dist/half-life-migration.d.ts +0 -63
- package/dist/half-life-migration.js +0 -182
- package/dist/handoff.js +0 -68
- package/dist/home-path.js +0 -24
- package/dist/http-retry.js +0 -51
- package/dist/incidents.d.ts +0 -103
- package/dist/incidents.js +0 -349
- package/dist/instruction-detect.js +0 -27
- package/dist/json.d.ts +0 -7
- package/dist/json.js +0 -11
- package/dist/ledger-db.d.ts +0 -10
- package/dist/ledger-db.js +0 -42
- package/dist/memory-value-weights.d.ts +0 -19
- package/dist/memory-value.d.ts +0 -113
- package/dist/memory-value.js +0 -250
- package/dist/memory.d.ts +0 -294
- package/dist/memory.js +0 -522
- package/dist/owner-validation.d.ts +0 -42
- package/dist/owner-validation.js +0 -56
- package/dist/path-context.d.ts +0 -24
- package/dist/physics-state.d.ts +0 -39
- package/dist/policies.d.ts +0 -151
- package/dist/policies.js +0 -434
- package/dist/processes.d.ts +0 -108
- package/dist/processes.js +0 -371
- package/dist/project-briefs.d.ts +0 -128
- package/dist/project-briefs.js +0 -523
- package/dist/provenance-coverage.d.ts +0 -18
- package/dist/rate-limit.d.ts +0 -34
- package/dist/raw-archive-mirror-cleanup.d.ts +0 -20
- package/dist/raw-archive.d.ts +0 -24
- package/dist/recall-history.d.ts +0 -131
- package/dist/recall-history.js +0 -227
- package/dist/recall-scope.d.ts +0 -138
- package/dist/refine-llm.d.ts +0 -61
- package/dist/refine-llm.js +0 -167
- package/dist/reject-flow.d.ts +0 -69
- package/dist/reject-flow.js +0 -260
- package/dist/rejection.d.ts +0 -100
- package/dist/replay.d.ts +0 -41
- package/dist/replay.js +0 -122
- package/dist/rrf.d.ts +0 -43
- package/dist/rrf.js +0 -61
- package/dist/scope.d.ts +0 -14
- package/dist/server-detect.d.ts +0 -72
- package/dist/server-detect.js +0 -222
- package/dist/session-owners.d.ts +0 -7
- package/dist/session-owners.js +0 -54
- package/dist/shared.d.ts +0 -186
- package/dist/shared.js +0 -540
- package/dist/skills.d.ts +0 -101
- package/dist/skills.js +0 -367
- package/dist/store/entry-writes-group.d.ts +0 -9
- package/dist/store/vector-writes.d.ts +0 -6
- package/dist/store/vector-writes.js +0 -59
- package/dist/store-port.d.ts +0 -262
- package/dist/store-port.js +0 -178
- package/dist/tenant.d.ts +0 -25
- package/dist/tenant.js +0 -43
- package/dist/trace.d.ts +0 -34
- package/dist/transcript-tail.js +0 -48
- package/dist/version.d.ts +0 -26
- package/dist/version.js +0 -41
- package/dist/working-memory.js +0 -154
- /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
- /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
- /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
- /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
- /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
- /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
- /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
- /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
- /package/dist/{api-errors.js → core/api-errors.js} +0 -0
- /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
- /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
- /package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +0 -0
- /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
- /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
- /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
- /package/dist/{quality-repair.d.ts → store/quality-repair.d.ts} +0 -0
- /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
- /package/dist/{escape.js → util/escape.js} +0 -0
- /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
- /package/dist/{keyset.js → util/keyset.js} +0 -0
- /package/dist/{same-text.js → util/same-text.js} +0 -0
- /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
- /package/dist/{db → util}/sqlite-blocked.js +0 -0
- /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
- /package/dist/{tokenize.js → util/tokenize.js} +0 -0
- /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
- /package/dist/{write-budget.js → util/write-budget.js} +0 -0
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
// The writer of the entities and relations tables. Every row resolves a consolidated source first, never a raw memory;
|
|
2
|
+
// the schema triggers are the backstop for a write that skips this module.
|
|
3
|
+
import { openHippoDb, closeHippoDb, withWriteScope } from '../db/index.js';
|
|
4
|
+
import { onHandle } from './open.js';
|
|
5
|
+
import { assertTenantId } from './tenant.js';
|
|
6
|
+
import { errorMessage, log } from '../util/log.js';
|
|
7
|
+
import { GRAPH_ENTITY_TYPES, GRAPH_RELATION_TYPES, MAX_ENTITY_NAME_LEN, rowToEntity, rowToRelation, ENTITY_COLS, RELATION_COLS } from './graph-rows.js';
|
|
8
|
+
const SOURCE_OBJECT_TABLE = {
|
|
9
|
+
decision: 'decisions',
|
|
10
|
+
policy: 'policies',
|
|
11
|
+
customer: 'customer_notes',
|
|
12
|
+
project: 'project_briefs',
|
|
13
|
+
};
|
|
14
|
+
export function resolveConsolidatedSource(db, tenantId, memoryId, sourceObject, label) {
|
|
15
|
+
const { memKind, effectiveMemoryId } = checkSourceMemory(db, tenantId, memoryId, sourceObject, label);
|
|
16
|
+
assertSourceObjectUsable(db, tenantId, sourceObject, label);
|
|
17
|
+
// source_kind is the memory's kind when a memory is present, else 'distilled' for an
|
|
18
|
+
// object-only row (objects are consolidated by construction). All-null is rejected.
|
|
19
|
+
if (memKind != null)
|
|
20
|
+
return { sourceKind: memKind, memoryId: effectiveMemoryId };
|
|
21
|
+
if (sourceObject != null)
|
|
22
|
+
return { sourceKind: 'distilled', memoryId: null };
|
|
23
|
+
throw new Error(`${label}: graph row needs a memory or a source object`);
|
|
24
|
+
}
|
|
25
|
+
function checkSourceMemory(db, tenantId, memoryId, sourceObject, label) {
|
|
26
|
+
let memKind = null;
|
|
27
|
+
let effectiveMemoryId = memoryId;
|
|
28
|
+
if (memoryId != null) {
|
|
29
|
+
// SAFETY: row's shape matches the two columns (kind, tenant_id) named in
|
|
30
|
+
// the SELECT above.
|
|
31
|
+
const row = db.prepare(`SELECT kind, tenant_id FROM memories WHERE id = ?`).get(memoryId);
|
|
32
|
+
if (!row) {
|
|
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.
|
|
35
|
+
if (sourceObject == null) {
|
|
36
|
+
throw new Error(`${label}: source memory ${memoryId} not found`);
|
|
37
|
+
}
|
|
38
|
+
effectiveMemoryId = null;
|
|
39
|
+
}
|
|
40
|
+
else if (row.tenant_id !== tenantId) {
|
|
41
|
+
throw new Error(`${label}: source memory ${memoryId} belongs to another tenant`);
|
|
42
|
+
}
|
|
43
|
+
else if (row.kind === 'raw') {
|
|
44
|
+
throw new Error(`${label}: source memory ${memoryId} is raw; the graph indexes consolidated state only`);
|
|
45
|
+
}
|
|
46
|
+
else if (row.kind !== 'distilled' && row.kind !== 'superseded') {
|
|
47
|
+
throw new Error(`${label}: source memory ${memoryId} has unsupported kind '${row.kind}'`);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
memKind = row.kind;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return { memKind, effectiveMemoryId };
|
|
54
|
+
}
|
|
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 ON DELETE SET NULL and could block
|
|
57
|
+
// the memory delete.
|
|
58
|
+
if (sourceObject != null) {
|
|
59
|
+
const table = SOURCE_OBJECT_TABLE[sourceObject.type];
|
|
60
|
+
if (!table) {
|
|
61
|
+
throw new Error(`${label}: unsupported source_object_type '${sourceObject.type}'`);
|
|
62
|
+
}
|
|
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.
|
|
65
|
+
const row = db.prepare(`SELECT status FROM ${table} WHERE id = ? AND tenant_id = ?`).get(sourceObject.id, tenantId);
|
|
66
|
+
if (!row) {
|
|
67
|
+
throw new Error(`${label}: source ${sourceObject.type} ${sourceObject.id} not found for tenant ${tenantId}`);
|
|
68
|
+
}
|
|
69
|
+
if (row.status !== 'active' && row.status !== 'superseded') {
|
|
70
|
+
throw new Error(`${label}: source ${sourceObject.type} ${sourceObject.id} has status '${row.status}' (must be active|superseded)`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/** Insert a graph entity extracted from a consolidated memory; throws if the source memory is missing / cross-tenant / raw (the DB trigger is the backstop). */
|
|
75
|
+
export function insertEntity(hippoRoot, tenantId, opts, txDb) {
|
|
76
|
+
assertTenantId('insertEntity', tenantId);
|
|
77
|
+
if (!GRAPH_ENTITY_TYPES.has(opts.entityType)) {
|
|
78
|
+
throw new Error(`insertEntity: entityType must be one of ${Array.from(GRAPH_ENTITY_TYPES).join('|')}; got ${opts.entityType}`);
|
|
79
|
+
}
|
|
80
|
+
const name = checkedName('insertEntity', opts.name);
|
|
81
|
+
const now = new Date().toISOString();
|
|
82
|
+
const memoryId = opts.memoryId ?? null;
|
|
83
|
+
const sourceObject = opts.sourceObject ?? null;
|
|
84
|
+
const ownDb = txDb ? null : openHippoDb(hippoRoot);
|
|
85
|
+
const db = txDb ?? ownDb;
|
|
86
|
+
try {
|
|
87
|
+
const { sourceKind, memoryId: effectiveMemoryId } = resolveConsolidatedSource(db, tenantId, memoryId, sourceObject, 'insertEntity');
|
|
88
|
+
const result = db.prepare(`
|
|
89
|
+
INSERT INTO entities(tenant_id, entity_type, name, memory_id, source_kind, source_object_type, source_object_id, created_at)
|
|
90
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
91
|
+
`).run(tenantId, opts.entityType, name, effectiveMemoryId, sourceKind, sourceObject?.type ?? null, sourceObject?.id ?? null, now);
|
|
92
|
+
const id = Number(result.lastInsertRowid ?? 0);
|
|
93
|
+
// SAFETY: row's shape matches the columns named in ENTITY_COLS above.
|
|
94
|
+
const row = db.prepare(`SELECT ${ENTITY_COLS} FROM entities WHERE id = ?`).get(id);
|
|
95
|
+
if (!row)
|
|
96
|
+
throw new Error('insertEntity: failed to reload inserted entity');
|
|
97
|
+
return rowToEntity(row);
|
|
98
|
+
}
|
|
99
|
+
finally {
|
|
100
|
+
if (ownDb)
|
|
101
|
+
closeHippoDb(ownDb);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function checkedName(label, raw) {
|
|
105
|
+
const name = (raw ?? '').trim();
|
|
106
|
+
if (name.length === 0)
|
|
107
|
+
throw new Error(`${label}: name is required`);
|
|
108
|
+
if (name.length > MAX_ENTITY_NAME_LEN) {
|
|
109
|
+
throw new Error(`${label}: name exceeds the ${MAX_ENTITY_NAME_LEN}-char cap`);
|
|
110
|
+
}
|
|
111
|
+
return name;
|
|
112
|
+
}
|
|
113
|
+
/** Renames an entity or moves its memory provenance in place, keeping id and created_at; null when the row is gone.
|
|
114
|
+
* A delete plus an insert would cascade away every relation that points at it. */
|
|
115
|
+
export function updateEntity(hippoRoot, tenantId, id, opts, txDb) {
|
|
116
|
+
assertTenantId('updateEntity', tenantId);
|
|
117
|
+
const name = checkedName('updateEntity', opts.name);
|
|
118
|
+
const db = txDb ?? openHippoDb(hippoRoot);
|
|
119
|
+
try {
|
|
120
|
+
// SAFETY: row's shape matches the columns named in ENTITY_COLS above.
|
|
121
|
+
const row = db.prepare(`SELECT ${ENTITY_COLS} FROM entities WHERE id = ? AND tenant_id = ?`).get(id, tenantId);
|
|
122
|
+
if (!row)
|
|
123
|
+
return null;
|
|
124
|
+
const entity = rowToEntity(row);
|
|
125
|
+
const sourceObject = entity.sourceObjectType === undefined || entity.sourceObjectId === undefined
|
|
126
|
+
? null
|
|
127
|
+
: { type: entity.sourceObjectType, id: entity.sourceObjectId };
|
|
128
|
+
const resolved = resolveConsolidatedSource(db, tenantId, opts.memoryId ?? null, sourceObject, 'updateEntity');
|
|
129
|
+
db.prepare(`UPDATE entities SET name = ?, memory_id = ?, source_kind = ? WHERE id = ? AND tenant_id = ?`)
|
|
130
|
+
.run(name, resolved.memoryId, resolved.sourceKind, id, tenantId);
|
|
131
|
+
return { ...entity, name, memoryId: resolved.memoryId, sourceKind: resolved.sourceKind };
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
if (db !== txDb)
|
|
135
|
+
closeHippoDb(db);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/** Insert a graph relation between two same-tenant entities, sourced from a consolidated memory. */
|
|
139
|
+
export function insertRelation(hippoRoot, tenantId, opts, txDb) {
|
|
140
|
+
assertTenantId('insertRelation', tenantId);
|
|
141
|
+
if (!GRAPH_RELATION_TYPES.has(opts.relType)) {
|
|
142
|
+
throw new Error(`insertRelation: relType must be one of ${Array.from(GRAPH_RELATION_TYPES).join('|')}; got ${opts.relType}`);
|
|
143
|
+
}
|
|
144
|
+
const now = new Date().toISOString();
|
|
145
|
+
const memoryId = opts.memoryId ?? null;
|
|
146
|
+
const sourceObject = opts.sourceObject ?? null;
|
|
147
|
+
const ownDb = txDb ? null : openHippoDb(hippoRoot);
|
|
148
|
+
const db = txDb ?? ownDb;
|
|
149
|
+
try {
|
|
150
|
+
for (const [eid, role] of [[opts.fromEntityId, 'from'], [opts.toEntityId, 'to']]) {
|
|
151
|
+
// SAFETY: ent's shape matches the single `tenant_id` column named in
|
|
152
|
+
// the SELECT above.
|
|
153
|
+
const ent = db.prepare(`SELECT tenant_id FROM entities WHERE id = ?`).get(eid);
|
|
154
|
+
if (!ent)
|
|
155
|
+
throw new Error(`insertRelation: ${role}_entity ${eid} not found`);
|
|
156
|
+
if (ent.tenant_id !== tenantId) {
|
|
157
|
+
throw new Error(`insertRelation: ${role}_entity ${eid} belongs to another tenant (no cross-tenant edges)`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
const { sourceKind, memoryId: effectiveMemoryId } = resolveConsolidatedSource(db, tenantId, memoryId, sourceObject, 'insertRelation');
|
|
161
|
+
const result = db.prepare(`
|
|
162
|
+
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)
|
|
163
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
164
|
+
`).run(tenantId, opts.fromEntityId, opts.toEntityId, opts.relType, effectiveMemoryId, sourceKind, sourceObject?.type ?? null, sourceObject?.id ?? null, now);
|
|
165
|
+
const id = Number(result.lastInsertRowid ?? 0);
|
|
166
|
+
// SAFETY: row's shape matches the columns named in RELATION_COLS above.
|
|
167
|
+
const row = db.prepare(`SELECT ${RELATION_COLS} FROM relations WHERE id = ?`).get(id);
|
|
168
|
+
if (!row)
|
|
169
|
+
throw new Error('insertRelation: failed to reload inserted relation');
|
|
170
|
+
return rowToRelation(row);
|
|
171
|
+
}
|
|
172
|
+
finally {
|
|
173
|
+
if (ownDb)
|
|
174
|
+
closeHippoDb(ownDb);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/** The source object still holds the loader's rule (active or superseded); a closed or gone one gets no new graph row. */
|
|
178
|
+
export function objectInForce(db, tenantId, ref) {
|
|
179
|
+
// `table` comes from the fixed SOURCE_OBJECT_TABLE map, never from input.
|
|
180
|
+
const table = SOURCE_OBJECT_TABLE[ref.type];
|
|
181
|
+
// SAFETY: row's shape matches the single `status` column named in the SELECT.
|
|
182
|
+
const row = db.prepare(`SELECT status FROM ${table} WHERE id = ? AND tenant_id = ?`).get(ref.id, tenantId);
|
|
183
|
+
return row?.status === 'active' || row?.status === 'superseded';
|
|
184
|
+
}
|
|
185
|
+
/** The lowest-id entity of this type anchored to the source object, which is the row a rebuild keeps. */
|
|
186
|
+
export function entityIdBySource(db, tenantId, entityType, sourceObject) {
|
|
187
|
+
// SAFETY: row's shape matches the single `id` column named in the SELECT.
|
|
188
|
+
const row = db.prepare(`SELECT id FROM entities WHERE tenant_id = ? AND entity_type = ? AND source_object_type = ? AND source_object_id = ? ORDER BY id LIMIT 1`).get(tenantId, entityType, sourceObject.type, sourceObject.id);
|
|
189
|
+
return row?.id;
|
|
190
|
+
}
|
|
191
|
+
export function relationPresent(db, tenantId, fromEntityId, toEntityId, relType) {
|
|
192
|
+
// SAFETY: row's shape matches the single aliased column named in the SELECT.
|
|
193
|
+
const present = db.prepare(`SELECT 1 AS hit FROM relations WHERE tenant_id = ? AND from_entity_id = ? AND to_entity_id = ? AND rel_type = ? LIMIT 1`).get(tenantId, fromEntityId, toEntityId, relType);
|
|
194
|
+
return present !== undefined;
|
|
195
|
+
}
|
|
196
|
+
export function deleteEntityRow(db, tenantId, id) {
|
|
197
|
+
db.prepare(`DELETE FROM entities WHERE id = ? AND tenant_id = ?`).run(id, tenantId);
|
|
198
|
+
}
|
|
199
|
+
export function deleteRelationRow(db, tenantId, id) {
|
|
200
|
+
db.prepare(`DELETE FROM relations WHERE id = ? AND tenant_id = ?`).run(id, tenantId);
|
|
201
|
+
}
|
|
202
|
+
/** Runs one tenant's graph writes in `fn` on `txDb` under one BEGIN IMMEDIATE, so two rebuilds serialize instead of
|
|
203
|
+
* interleaving and a throw rolls back the whole chunk. The sole sanctioned place to wrap graph writes in a transaction. */
|
|
204
|
+
export function runGraphRebuildTransaction(hippoRoot, tenantId, fn, opts) {
|
|
205
|
+
assertTenantId('runGraphRebuildTransaction', tenantId);
|
|
206
|
+
const db = openHippoDb(hippoRoot, opts);
|
|
207
|
+
try {
|
|
208
|
+
return withWriteScope(db, 'graph_rebuild', () => fn(db));
|
|
209
|
+
}
|
|
210
|
+
finally {
|
|
211
|
+
closeHippoDb(db);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/** Remove graph rows sourced from one MIRRORLESS object by (type, id) on close: with no mirror memory `markGraphDirty` cannot enqueue a rebuild.
|
|
215
|
+
* Fail-soft like `markGraphDirty`; the explicit relations DELETE also covers a relation whose OWN provenance is this object. */
|
|
216
|
+
export function removeGraphEntitiesForObject(hippoRoot, tenantId, sourceObjectType, sourceObjectId) {
|
|
217
|
+
try {
|
|
218
|
+
assertTenantId('removeGraphEntitiesForObject', tenantId);
|
|
219
|
+
onHandle(hippoRoot, (db) => {
|
|
220
|
+
withWriteScope(db, 'remove_graph_entities', () => {
|
|
221
|
+
db.prepare(`DELETE FROM relations WHERE tenant_id = ? AND source_object_type = ? AND source_object_id = ?`)
|
|
222
|
+
.run(tenantId, sourceObjectType, sourceObjectId);
|
|
223
|
+
db.prepare(`DELETE FROM entities WHERE tenant_id = ? AND source_object_type = ? AND source_object_id = ?`)
|
|
224
|
+
.run(tenantId, sourceObjectType, sourceObjectId);
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
catch (err) {
|
|
229
|
+
log.warn(`removeGraphEntitiesForObject: failed for tenant=${tenantId} ${sourceObjectType}#${sourceObjectId}: ${errorMessage(err)}`);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=graph-writes.js.map
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { MemoryEntry } from '../core/memory.js';
|
|
2
|
+
import { conflictResolveAuditsAt, resolvedConflictsAt } from './conflicts.js';
|
|
3
|
+
import { objectMemoryRowsAt } from './entry-reads.js';
|
|
4
|
+
/** What a move is planned from. The object and conflict rows are read only while the typed move is pending. */
|
|
5
|
+
export interface HalfLifeRows {
|
|
6
|
+
/** The base the store's memories are on. */
|
|
7
|
+
from: number;
|
|
8
|
+
/** True until the store has moved its object memories off their old flat half-life. */
|
|
9
|
+
typedPending: boolean;
|
|
10
|
+
all: MemoryEntry[];
|
|
11
|
+
objectRows: ReturnType<typeof objectMemoryRowsAt>;
|
|
12
|
+
conflictAudits: ReturnType<typeof conflictResolveAuditsAt>;
|
|
13
|
+
resolvedConflicts: ReturnType<typeof resolvedConflictsAt>;
|
|
14
|
+
}
|
|
15
|
+
/** Copies carrying their new half-life, and the bases their audit rows name. */
|
|
16
|
+
export interface HalfLifeMove {
|
|
17
|
+
from: number;
|
|
18
|
+
to: number;
|
|
19
|
+
entries: readonly MemoryEntry[];
|
|
20
|
+
}
|
|
21
|
+
/** The base this store's memories are on: 7 days when none was ever recorded. */
|
|
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
|
|
24
|
+
* records the base. `outcome` is null when no move is due; a dry run plans and writes nothing. */
|
|
25
|
+
export declare function moveHalfLives<R>(hippoRoot: string, to: number, opts: {
|
|
26
|
+
dryRun: boolean;
|
|
27
|
+
actor: string;
|
|
28
|
+
}, plan: (rows: HalfLifeRows) => {
|
|
29
|
+
moves: readonly HalfLifeMove[];
|
|
30
|
+
outcome: R;
|
|
31
|
+
}): {
|
|
32
|
+
from: number;
|
|
33
|
+
outcome: R | null;
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=half-life.d.ts.map
|
|
@@ -0,0 +1,75 @@
|
|
|
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 { getMeta, setMeta, withWriteScope } from '../db/index.js';
|
|
3
|
+
import { appendAuditEvent } from './audit.js';
|
|
4
|
+
import { conflictResolveAuditsAt, resolvedConflictsAt } from './conflicts.js';
|
|
5
|
+
import { objectMemoryRowsAt, selectAllEntries } from './entry-reads.js';
|
|
6
|
+
import { setHalfLivesAt } from './entry-writes.js';
|
|
7
|
+
import { onHandle, HALF_LIFE_BASE_META_KEY, TYPED_HALF_LIFE_META_KEY, openStore } from './open.js';
|
|
8
|
+
/** The base every store used before the base was recorded. */
|
|
9
|
+
const LEGACY_HALF_LIFE_BASE = 7;
|
|
10
|
+
function readBase(db) {
|
|
11
|
+
const raw = Number(getMeta(db, HALF_LIFE_BASE_META_KEY, String(LEGACY_HALF_LIFE_BASE)));
|
|
12
|
+
return Number.isFinite(raw) && raw > 0 ? raw : LEGACY_HALF_LIFE_BASE;
|
|
13
|
+
}
|
|
14
|
+
/** The base this store's memories are on: 7 days when none was ever recorded. */
|
|
15
|
+
export function recordedHalfLifeBase(hippoRoot) {
|
|
16
|
+
return onHandle(hippoRoot, (db) => {
|
|
17
|
+
return readBase(db);
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
function readRows(db, from, typedPending) {
|
|
21
|
+
const all = selectAllEntries(db);
|
|
22
|
+
return {
|
|
23
|
+
from,
|
|
24
|
+
typedPending,
|
|
25
|
+
all,
|
|
26
|
+
objectRows: typedPending ? objectMemoryRowsAt(db) : [],
|
|
27
|
+
conflictAudits: typedPending ? conflictResolveAuditsAt(db) : [],
|
|
28
|
+
resolvedConflicts: typedPending ? resolvedConflictsAt(db) : [],
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/** Writes the move, then one audit event per tenant with each id's old half-life, so the move can be undone. */
|
|
32
|
+
function writeMove(db, move, old, actor) {
|
|
33
|
+
setHalfLivesAt(db, move.entries.map((e) => ({ id: e.id, halfLifeDays: e.half_life_days })));
|
|
34
|
+
const byTenant = new Map();
|
|
35
|
+
for (const e of move.entries) {
|
|
36
|
+
// One record per tenant, filled in place: copying it per row made the write grow with the square of the store.
|
|
37
|
+
let record = byTenant.get(e.tenantId);
|
|
38
|
+
if (!record)
|
|
39
|
+
byTenant.set(e.tenantId, (record = {}));
|
|
40
|
+
record[e.id] = old.get(e.id);
|
|
41
|
+
}
|
|
42
|
+
for (const [tenantId, oldHalfLives] of byTenant) {
|
|
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
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
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. */
|
|
53
|
+
export function moveHalfLives(hippoRoot, to, opts, plan) {
|
|
54
|
+
return onHandle(hippoRoot, (db) => {
|
|
55
|
+
const run = () => {
|
|
56
|
+
const from = readBase(db);
|
|
57
|
+
const typedPending = getMeta(db, TYPED_HALF_LIFE_META_KEY, '') === '';
|
|
58
|
+
if (!(Number.isFinite(to) && to > 0) || (from === to && !typedPending))
|
|
59
|
+
return { from, outcome: null };
|
|
60
|
+
const rows = readRows(db, from, typedPending);
|
|
61
|
+
const { moves, outcome } = plan(rows);
|
|
62
|
+
if (opts.dryRun)
|
|
63
|
+
return { from, outcome };
|
|
64
|
+
const old = new Map(rows.all.map((e) => [e.id, e.half_life_days]));
|
|
65
|
+
for (const move of moves)
|
|
66
|
+
writeMove(db, move, old, opts.actor);
|
|
67
|
+
setMeta(db, HALF_LIFE_BASE_META_KEY, String(to));
|
|
68
|
+
setMeta(db, TYPED_HALF_LIFE_META_KEY, '1');
|
|
69
|
+
return { from, outcome };
|
|
70
|
+
};
|
|
71
|
+
// Plan, write, audit and record the base under one write lock, so a concurrent write or sleep cannot interleave.
|
|
72
|
+
return opts.dryRun ? run() : withWriteScope(db, 'migrate_half_life', run);
|
|
73
|
+
}, openStore);
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=half-life.js.map
|
package/dist/store/handoffs.d.ts
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import { type SessionHandoff, type HandoffOutcome, type HandoffEvidence } from '../handoff.js';
|
|
1
|
+
import { type SessionHandoff, type HandoffOutcome, type HandoffEvidence } from '../core/handoff.js';
|
|
2
2
|
import type { TaskSnapshot } from './rows.js';
|
|
3
3
|
import { type ContinuityKey } from './sessions.js';
|
|
4
|
-
/** Column list shared by every session_handoffs SELECT;
|
|
4
|
+
/** Column list shared by every session_handoffs SELECT; cards.ts reuses it for the card handoff lookup. */
|
|
5
5
|
export declare const HANDOFF_COLUMNS = "id, session_id, repo_root, task_id, summary, next_action, artifacts_json, scope, created_at, constraints_json, evidence_json, outcome, target_runtime, card_id";
|
|
6
|
-
/**
|
|
7
|
-
* Save a session handoff record. Returns the persisted handoff.
|
|
8
|
-
*/
|
|
6
|
+
/** Save a session handoff record; returns the persisted handoff. */
|
|
9
7
|
export declare function saveSessionHandoff(hippoRoot: string, tenantId: string, handoff: Omit<SessionHandoff, 'updatedAt'>, key?: ContinuityKey): SessionHandoff;
|
|
10
8
|
interface HandoffFilter {
|
|
11
9
|
unfinishedOnly?: boolean;
|
|
@@ -15,16 +13,12 @@ interface HandoffFilter {
|
|
|
15
13
|
}
|
|
16
14
|
/** Load the most recent handoff, optionally filtered by session ID. */
|
|
17
15
|
export declare function loadLatestHandoff(hippoRoot: string, tenantId: string, sessionId?: string, opts?: HandoffFilter, key?: ContinuityKey): SessionHandoff | null;
|
|
18
|
-
/**
|
|
19
|
-
* Load a specific handoff by its row ID.
|
|
20
|
-
*/
|
|
16
|
+
/** Load a specific handoff by its row ID. */
|
|
21
17
|
export declare function loadHandoffById(hippoRoot: string, tenantId: string, id: number): SessionHandoff | null;
|
|
22
18
|
/** Stamp the outcome on a session's newest handoff, only if it has none yet. Returns rows changed. */
|
|
23
19
|
export declare function stampHandoffOutcome(hippoRoot: string, tenantId: string, sessionId: string, outcome: HandoffOutcome): number;
|
|
24
|
-
/**
|
|
25
|
-
*
|
|
26
|
-
* @param options.inPlace rewrite an earlier transcript read instead of adding a revision, for a close that runs after every reply.
|
|
27
|
-
* @returns null when neither source is the session's, a newer handoff covers the snapshot, the session's latest handoff was not read off its transcript or already holds `derived`, or, in place, a handoff landed after the read. */
|
|
20
|
+
/** Session-end handoff from the active snapshot, else `derived` transcript state; `inPlace` rewrites an earlier transcript read instead of adding a revision.
|
|
21
|
+
* Returns null when no source is the session's, a newer handoff covers it, or the latest one is not transcript-derived or already holds `derived`. */
|
|
28
22
|
export declare function writeSessionEndHandoff(hippoRoot: string, tenantId: string, sessionId: string, evidence: HandoffEvidence | null, derived?: Pick<TaskSnapshot, 'task' | 'summary' | 'next_step'> | null, key?: ContinuityKey, options?: {
|
|
29
23
|
inPlace?: boolean;
|
|
30
24
|
}): SessionHandoff | null;
|
package/dist/store/handoffs.js
CHANGED
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
import { closeHippoDb
|
|
2
|
-
import { rowToSessionHandoff, isHandoffOutcome, } from '../handoff.js';
|
|
3
|
-
import { scopeAdmitSql } from '
|
|
4
|
-
import { assertTenantId } from '
|
|
5
|
-
import { openStore } from './open.js';
|
|
1
|
+
import { closeHippoDb } from '../db/index.js';
|
|
2
|
+
import { rowToSessionHandoff, isHandoffOutcome, } from '../core/handoff.js';
|
|
3
|
+
import { scopeAdmitSql } from './recall-scope.js';
|
|
4
|
+
import { assertTenantId } from './tenant.js';
|
|
5
|
+
import { onHandle, openStore } from './open.js';
|
|
6
6
|
import { continuityStamp, continuityWhere, loadActiveTaskSnapshot } from './sessions.js';
|
|
7
|
-
/** Column list shared by every session_handoffs SELECT;
|
|
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, evidence_json, outcome, target_runtime, card_id';
|
|
9
|
-
/**
|
|
10
|
-
* Save a session handoff record. Returns the persisted handoff.
|
|
11
|
-
*/
|
|
9
|
+
/** Save a session handoff record; returns the persisted handoff. */
|
|
12
10
|
export function saveSessionHandoff(hippoRoot, tenantId, handoff, key) {
|
|
13
11
|
assertTenantId('saveSessionHandoff', tenantId);
|
|
14
12
|
const stamp = key ? continuityStamp(key) : null;
|
|
@@ -50,8 +48,7 @@ function handoffConditions(tenantId, sessionId, opts, key) {
|
|
|
50
48
|
params.push(opts.excludeSessionId);
|
|
51
49
|
}
|
|
52
50
|
if (opts.unfinishedOnly) {
|
|
53
|
-
// Restrict to each session's newest revision first: stampHandoffOutcome
|
|
54
|
-
// only stamps the newest row, so an older null-outcome revision must not resurrect.
|
|
51
|
+
// Restrict to each session's newest revision first: stampHandoffOutcome only stamps the newest row, so an older null-outcome revision must not resurrect.
|
|
55
52
|
// Keyed, the newest is the owner's own, so another owner's newer revision cannot hide it.
|
|
56
53
|
conditions.push(`id IN (SELECT MAX(id) FROM session_handoffs WHERE tenant_id = ?${owned ? ` AND ${owned.sql}` : ''} GROUP BY session_id)`);
|
|
57
54
|
params.push(tenantId, ...(owned?.params ?? []));
|
|
@@ -89,9 +86,7 @@ export function loadLatestHandoff(hippoRoot, tenantId, sessionId, opts = {}, key
|
|
|
89
86
|
closeHippoDb(db);
|
|
90
87
|
}
|
|
91
88
|
}
|
|
92
|
-
/**
|
|
93
|
-
* Load a specific handoff by its row ID.
|
|
94
|
-
*/
|
|
89
|
+
/** Load a specific handoff by its row ID. */
|
|
95
90
|
export function loadHandoffById(hippoRoot, tenantId, id) {
|
|
96
91
|
assertTenantId('loadHandoffById', tenantId);
|
|
97
92
|
const db = openStore(hippoRoot);
|
|
@@ -111,8 +106,7 @@ export function loadHandoffById(hippoRoot, tenantId, id) {
|
|
|
111
106
|
/** Stamp the outcome on a session's newest handoff, only if it has none yet. Returns rows changed. */
|
|
112
107
|
export function stampHandoffOutcome(hippoRoot, tenantId, sessionId, outcome) {
|
|
113
108
|
assertTenantId('stampHandoffOutcome', tenantId);
|
|
114
|
-
|
|
115
|
-
try {
|
|
109
|
+
return onHandle(hippoRoot, (db) => {
|
|
116
110
|
const result = db.prepare(`
|
|
117
111
|
UPDATE session_handoffs SET outcome = ?
|
|
118
112
|
WHERE tenant_id = ? AND session_id = ? AND outcome IS NULL
|
|
@@ -123,17 +117,14 @@ export function stampHandoffOutcome(hippoRoot, tenantId, sessionId, outcome) {
|
|
|
123
117
|
)
|
|
124
118
|
`).run(outcome, tenantId, sessionId, tenantId, sessionId);
|
|
125
119
|
return Number(result.changes ?? 0);
|
|
126
|
-
}
|
|
127
|
-
finally {
|
|
128
|
-
closeHippoDb(db);
|
|
129
|
-
}
|
|
120
|
+
}, openStore);
|
|
130
121
|
}
|
|
131
|
-
/** Rewrites the session's newest handoff when it is still a transcript read, in one statement so a handoff written meanwhile is never overwritten; null
|
|
122
|
+
/** Rewrites the session's newest handoff when it is still a transcript read, in one statement so a handoff written meanwhile is never overwritten; null
|
|
123
|
+
* when none was rewritten. */
|
|
132
124
|
function replaceTranscriptHandoff(hippoRoot, tenantId, handoff, key) {
|
|
133
125
|
const { conditions, params } = handoffConditions(tenantId, handoff.sessionId, {}, key);
|
|
134
126
|
const newest = `SELECT id FROM session_handoffs WHERE ${conditions.join(' AND ')} ORDER BY created_at DESC, id DESC LIMIT 1`;
|
|
135
|
-
|
|
136
|
-
try {
|
|
127
|
+
return onHandle(hippoRoot, (db) => {
|
|
137
128
|
const result = db.prepare(`
|
|
138
129
|
UPDATE session_handoffs SET repo_root = ?, task_id = ?, summary = ?, next_action = ?, artifacts_json = ?, scope = ?, created_at = ?,
|
|
139
130
|
constraints_json = ?, evidence_json = ?, outcome = ?, target_runtime = ?, card_id = ?
|
|
@@ -144,15 +135,40 @@ function replaceTranscriptHandoff(hippoRoot, tenantId, handoff, key) {
|
|
|
144
135
|
// SAFETY: row's shape matches HANDOFF_COLUMNS.
|
|
145
136
|
const row = db.prepare(`SELECT ${HANDOFF_COLUMNS} FROM session_handoffs WHERE id = (${newest})`).get(...params);
|
|
146
137
|
return row ? rowToSessionHandoff(row) : null;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
138
|
+
}, openStore);
|
|
139
|
+
}
|
|
140
|
+
function transcriptHandoffSource(existing, derived, evidence) {
|
|
141
|
+
// Only an earlier transcript read gives way; `hippo handoff create` and unmarked older handoffs keep winning.
|
|
142
|
+
if (!derived || (existing && existing.evidence?.derivedFrom !== 'transcript'))
|
|
143
|
+
return null;
|
|
144
|
+
// A retried session end reads the same transcript, so it must not add a second revision.
|
|
145
|
+
if (existing && existing.taskId === derived.task && existing.summary === derived.summary && existing.nextAction === derived.next_step)
|
|
146
|
+
return null;
|
|
147
|
+
return { snapshot: { ...derived, scope: null }, evidence: { ...evidence, derivedFrom: 'transcript' } };
|
|
148
|
+
}
|
|
149
|
+
function buildSessionEndHandoff(sessionId, snapshot, existing, handoffEvidence, outcome) {
|
|
150
|
+
// A same-task refresh carries forward envelope fields nobody cleared; a scope
|
|
151
|
+
// mismatch must not leak private metadata into an unscoped envelope.
|
|
152
|
+
const carryForward = existing != null && existing.taskId === snapshot.task
|
|
153
|
+
&& (existing.scope ?? null) === (snapshot.scope ?? null);
|
|
154
|
+
return {
|
|
155
|
+
version: 1,
|
|
156
|
+
sessionId,
|
|
157
|
+
repoRoot: carryForward ? existing.repoRoot : undefined,
|
|
158
|
+
taskId: snapshot.task,
|
|
159
|
+
summary: snapshot.summary,
|
|
160
|
+
nextAction: snapshot.next_step,
|
|
161
|
+
artifacts: carryForward ? existing.artifacts : [],
|
|
162
|
+
scope: snapshot.scope,
|
|
163
|
+
evidence: handoffEvidence,
|
|
164
|
+
outcome,
|
|
165
|
+
constraints: carryForward ? existing.constraints : undefined,
|
|
166
|
+
targetRuntime: carryForward ? existing.targetRuntime : undefined,
|
|
167
|
+
cardId: carryForward ? existing.cardId : undefined,
|
|
168
|
+
};
|
|
151
169
|
}
|
|
152
|
-
/**
|
|
153
|
-
*
|
|
154
|
-
* @param options.inPlace rewrite an earlier transcript read instead of adding a revision, for a close that runs after every reply.
|
|
155
|
-
* @returns null when neither source is the session's, a newer handoff covers the snapshot, the session's latest handoff was not read off its transcript or already holds `derived`, or, in place, a handoff landed after the read. */
|
|
170
|
+
/** Session-end handoff from the active snapshot, else `derived` transcript state; `inPlace` rewrites an earlier transcript read instead of adding a revision.
|
|
171
|
+
* Returns null when no source is the session's, a newer handoff covers it, or the latest one is not transcript-derived or already holds `derived`. */
|
|
156
172
|
export function writeSessionEndHandoff(hippoRoot, tenantId, sessionId, evidence, derived = null, key, options = {}) {
|
|
157
173
|
assertTenantId('writeSessionEndHandoff', tenantId);
|
|
158
174
|
if (key)
|
|
@@ -171,44 +187,22 @@ export function writeSessionEndHandoff(hippoRoot, tenantId, sessionId, evidence,
|
|
|
171
187
|
snapshot = active;
|
|
172
188
|
}
|
|
173
189
|
else {
|
|
174
|
-
|
|
175
|
-
if (!
|
|
190
|
+
const fromDerived = transcriptHandoffSource(existing, derived, evidence);
|
|
191
|
+
if (!fromDerived)
|
|
176
192
|
return null;
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
return null;
|
|
180
|
-
snapshot = { ...derived, scope: null };
|
|
181
|
-
handoffEvidence = { ...evidence, derivedFrom: 'transcript' };
|
|
193
|
+
snapshot = fromDerived.snapshot;
|
|
194
|
+
handoffEvidence = fromDerived.evidence;
|
|
182
195
|
fromTranscript = true;
|
|
183
196
|
}
|
|
184
197
|
const outcome = sessionOutcome(hippoRoot, tenantId, sessionId);
|
|
185
|
-
|
|
186
|
-
// mismatch must not leak private metadata into an unscoped envelope.
|
|
187
|
-
const carryForward = existing != null && existing.taskId === snapshot.task
|
|
188
|
-
&& (existing.scope ?? null) === (snapshot.scope ?? null);
|
|
189
|
-
const handoff = {
|
|
190
|
-
version: 1,
|
|
191
|
-
sessionId,
|
|
192
|
-
repoRoot: carryForward ? existing.repoRoot : undefined,
|
|
193
|
-
taskId: snapshot.task,
|
|
194
|
-
summary: snapshot.summary,
|
|
195
|
-
nextAction: snapshot.next_step,
|
|
196
|
-
artifacts: carryForward ? existing.artifacts : [],
|
|
197
|
-
scope: snapshot.scope,
|
|
198
|
-
evidence: handoffEvidence,
|
|
199
|
-
outcome,
|
|
200
|
-
constraints: carryForward ? existing.constraints : undefined,
|
|
201
|
-
targetRuntime: carryForward ? existing.targetRuntime : undefined,
|
|
202
|
-
cardId: carryForward ? existing.cardId : undefined,
|
|
203
|
-
};
|
|
198
|
+
const handoff = buildSessionEndHandoff(sessionId, snapshot, existing, handoffEvidence, outcome);
|
|
204
199
|
// A miss means a handoff landed since the read, and a new transcript row would hide it.
|
|
205
200
|
if (fromTranscript && options.inPlace && existing)
|
|
206
201
|
return replaceTranscriptHandoff(hippoRoot, tenantId, handoff, key);
|
|
207
202
|
return saveSessionHandoff(hippoRoot, tenantId, handoff, key);
|
|
208
203
|
}
|
|
209
204
|
function sessionOutcome(hippoRoot, tenantId, sessionId) {
|
|
210
|
-
|
|
211
|
-
try {
|
|
205
|
+
return onHandle(hippoRoot, (db) => {
|
|
212
206
|
// SAFETY: row's shape matches the single `content` column below.
|
|
213
207
|
const content = db.prepare(`
|
|
214
208
|
SELECT content FROM session_events
|
|
@@ -216,9 +210,6 @@ function sessionOutcome(hippoRoot, tenantId, sessionId) {
|
|
|
216
210
|
ORDER BY created_at DESC, id DESC LIMIT 1
|
|
217
211
|
`).get(tenantId, sessionId)?.content;
|
|
218
212
|
return isHandoffOutcome(content) ? content : null;
|
|
219
|
-
}
|
|
220
|
-
finally {
|
|
221
|
-
closeHippoDb(db);
|
|
222
|
-
}
|
|
213
|
+
});
|
|
223
214
|
}
|
|
224
215
|
//# sourceMappingURL=handoffs.js.map
|
|
@@ -1,22 +1,21 @@
|
|
|
1
|
+
import { type DatabaseSyncLike } from '../db/index.js';
|
|
1
2
|
import type { HippoIndex, LegacyStats } from './rows.js';
|
|
2
3
|
/** Load the derived index from SQLite. Read-only: index.json is only ever written by `rebuildIndex`. */
|
|
3
4
|
export declare function loadIndex(hippoRoot: string): HippoIndex;
|
|
4
|
-
/**
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
*
|
|
8
|
-
|
|
9
|
-
*/
|
|
10
|
-
export declare function saveIndex(hippoRoot: string, index: HippoIndex): void;
|
|
11
|
-
/**
|
|
12
|
-
* Rebuild mirrors from SQLite, importing any legacy markdown files not already present.
|
|
13
|
-
*/
|
|
5
|
+
/** The last recall's ids and its trace alone, for a caller that needs no index entry. */
|
|
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 in one transaction, as callers
|
|
8
|
+
* rely on both moving together. index.json is left to `rebuildIndex`. */
|
|
9
|
+
export declare function saveIndex(hippoRoot: string, index: Pick<HippoIndex, 'last_retrieval_ids' | 'last_trace_id'>): void;
|
|
10
|
+
/** Rebuild mirrors from SQLite, importing any legacy markdown files not already present. */
|
|
14
11
|
export declare function rebuildIndex(hippoRoot: string): HippoIndex;
|
|
15
12
|
export declare function updateStats(hippoRoot: string, delta: {
|
|
16
13
|
remembered?: number;
|
|
17
14
|
recalled?: number;
|
|
18
15
|
forgotten?: number;
|
|
19
16
|
}): void;
|
|
17
|
+
/** updateStats on the caller's open store, so a loop of writes opens the store once. */
|
|
18
|
+
export declare function updateStatsOn(db: DatabaseSyncLike, hippoRoot: string, delta: Parameters<typeof updateStats>[1]): void;
|
|
20
19
|
export declare function updateStatsUnlessBusy(hippoRoot: string, delta: Parameters<typeof updateStats>[1], committed: string): void;
|
|
21
20
|
export declare function loadStats(hippoRoot: string): LegacyStats;
|
|
22
21
|
export declare function appendConsolidationRun(hippoRoot: string, run: {
|
|
@@ -27,22 +26,17 @@ export declare function appendConsolidationRun(hippoRoot: string, run: {
|
|
|
27
26
|
}): void;
|
|
28
27
|
/** Rows a tenant created since the last sleep (runs are host-wide), looking back at most 24 hours. */
|
|
29
28
|
export declare function countCreatedSinceLastSleep(hippoRoot: string, tenantId: string, now?: Date): number;
|
|
30
|
-
/**
|
|
31
|
-
* Session decay context: provides the data needed for session-based and adaptive decay.
|
|
32
|
-
*/
|
|
29
|
+
/** Session decay context: the data needed for session-based and adaptive decay. */
|
|
33
30
|
export interface SessionDecayContext {
|
|
34
31
|
/** Total number of sleep (consolidation) cycles completed. */
|
|
35
32
|
sleepCount: number;
|
|
36
33
|
/** Average interval between recent sleep cycles, in days. 0 if < 2 cycles. */
|
|
37
34
|
avgSessionIntervalDays: number;
|
|
38
35
|
}
|
|
39
|
-
/**
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
*/
|
|
36
|
+
/** Timestamp of the latest consolidation run, or undefined when there is none. */
|
|
37
|
+
export declare function lastConsolidationAt(db: DatabaseSyncLike): string | undefined;
|
|
38
|
+
/** Load the session decay context; session intervals come from consolidation_runs timestamps. */
|
|
43
39
|
export declare function loadSessionDecayContext(hippoRoot: string): SessionDecayContext;
|
|
44
|
-
/**
|
|
45
|
-
* Increment the sleep counter. Called after each consolidation run.
|
|
46
|
-
*/
|
|
40
|
+
/** Increment the sleep counter after each consolidation run. */
|
|
47
41
|
export declare function incrementSleepCount(hippoRoot: string): void;
|
|
48
42
|
//# sourceMappingURL=index-and-stats.d.ts.map
|