hippo-memory 1.70.0 → 1.72.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/agent-memories/apply.d.ts +0 -11
- package/dist/agent-memories/apply.js +6 -21
- package/dist/agent-memories/claude-code.d.ts +4 -2
- package/dist/agent-memories/claude-code.js +15 -6
- package/dist/agent-memories/codex.js +1 -1
- package/dist/agent-memories/copilot.d.ts +1 -3
- package/dist/agent-memories/copilot.js +1 -17
- package/dist/agent-memories/files.js +23 -12
- package/dist/agent-memories/markdown.d.ts +1 -3
- package/dist/agent-memories/markdown.js +1 -3
- package/dist/agent-memories/project-folds.d.ts +10 -0
- package/dist/agent-memories/project-folds.js +34 -0
- package/dist/agent-memories/report.js +2 -1
- package/dist/agent-memories/sync.d.ts +4 -2
- package/dist/agent-memories/sync.js +18 -11
- package/dist/api/assemble.d.ts +7 -44
- package/dist/api/assemble.js +3 -23
- package/dist/api/audit.d.ts +33 -1
- package/dist/api/audit.js +48 -1
- package/dist/api/auth.d.ts +20 -26
- package/dist/api/auth.js +43 -29
- package/dist/api/auto-sleep.d.ts +5 -2
- package/dist/api/auto-sleep.js +9 -5
- package/dist/api/availability.d.ts +2 -15
- package/dist/api/availability.js +4 -18
- package/dist/api/cards.d.ts +42 -0
- package/dist/api/cards.js +52 -0
- package/dist/api/conflicts.d.ts +28 -0
- package/dist/api/conflicts.js +61 -0
- package/dist/api/context-render.js +4 -3
- package/dist/api/context-select.js +12 -15
- package/dist/api/context-types.d.ts +10 -35
- package/dist/api/context.d.ts +5 -22
- package/dist/api/context.js +38 -46
- package/dist/api/continuity.d.ts +47 -0
- package/dist/api/continuity.js +66 -0
- package/dist/{cli → api}/correction-latency.d.ts +2 -14
- package/dist/{cli → api}/correction-latency.js +2 -14
- package/dist/api/dormant.d.ts +5 -21
- package/dist/api/dormant.js +11 -28
- package/dist/api/drill-down.d.ts +7 -46
- package/dist/api/drill-down.js +6 -27
- package/dist/api/embeddings.d.ts +17 -0
- package/dist/api/embeddings.js +28 -0
- package/dist/api/error-reply.d.ts +8 -0
- package/dist/api/error-reply.js +21 -0
- package/dist/api/forget.d.ts +11 -26
- package/dist/api/forget.js +23 -35
- package/dist/api/goals.d.ts +1 -1
- package/dist/api/goals.js +5 -9
- package/dist/api/graph.d.ts +8 -0
- package/dist/api/graph.js +7 -0
- package/dist/api/index.d.ts +6 -2
- package/dist/api/index.js +6 -2
- package/dist/api/instruction-detect.js +21 -6
- package/dist/api/learn.d.ts +4 -0
- package/dist/api/learn.js +53 -27
- package/dist/api/ledger-db.d.ts +2 -5
- package/dist/api/ledger-db.js +5 -35
- package/dist/api/memories.d.ts +23 -0
- package/dist/api/memories.js +46 -0
- package/dist/api/objects.d.ts +9 -0
- package/dist/api/objects.js +11 -0
- package/dist/api/on-store.js +5 -3
- package/dist/api/outcome.js +1 -1
- package/dist/api/pilot-arm.d.ts +1 -11
- package/dist/api/pilot-arm.js +5 -45
- package/dist/api/predictions.d.ts +11 -0
- package/dist/api/predictions.js +24 -0
- package/dist/api/projects.d.ts +21 -0
- package/dist/api/projects.js +24 -0
- package/dist/api/promote.d.ts +13 -17
- package/dist/api/promote.js +12 -20
- package/dist/api/prompt-hook.d.ts +19 -6
- package/dist/api/prompt-hook.js +54 -13
- package/dist/api/provenance-coverage.d.ts +14 -0
- package/dist/{cli → api}/provenance-coverage.js +2 -6
- package/dist/api/recall-cli.d.ts +58 -0
- package/dist/api/recall-cli.js +103 -0
- package/dist/api/recall-core.js +17 -9
- package/dist/api/recall-finish.d.ts +53 -0
- package/dist/api/recall-finish.js +30 -0
- package/dist/api/recall-history.d.ts +17 -84
- package/dist/api/recall-history.js +15 -88
- package/dist/api/recall-pipeline.d.ts +2 -3
- package/dist/api/recall-pipeline.js +21 -15
- package/dist/api/recall-request.js +1 -1
- package/dist/api/recall-types.d.ts +64 -304
- package/dist/api/recall.d.ts +3 -34
- package/dist/api/recall.js +63 -89
- package/dist/api/refine.d.ts +7 -0
- package/dist/api/refine.js +10 -0
- package/dist/api/remember-local.d.ts +57 -0
- package/dist/api/remember-local.js +90 -0
- package/dist/api/remember.d.ts +20 -2
- package/dist/api/remember.js +16 -3
- package/dist/api/session-end.d.ts +22 -0
- package/dist/api/session-end.js +101 -0
- package/dist/api/sleep-run.d.ts +2 -4
- package/dist/api/sleep-run.js +28 -28
- package/dist/api/sleep.d.ts +9 -28
- package/dist/api/status.d.ts +24 -0
- package/dist/api/status.js +40 -0
- package/dist/api/store-init.d.ts +4 -0
- package/dist/api/store-init.js +9 -0
- package/dist/api/tokens.d.ts +3 -10
- package/dist/api/tokens.js +4 -11
- package/dist/api/types.d.ts +8 -29
- package/dist/api/types.js +10 -23
- package/dist/capture/caller-session.d.ts +0 -3
- package/dist/capture/caller-session.js +1 -12
- package/dist/capture/capture-error.d.ts +2 -2
- package/dist/capture/capture-error.js +23 -18
- package/dist/capture/codex-patch.js +3 -1
- package/dist/capture/command.d.ts +4 -12
- package/dist/capture/command.js +39 -114
- package/dist/capture/compact.d.ts +4 -15
- package/dist/capture/compact.js +26 -30
- package/dist/capture/compaction-items-caller.js +11 -20
- package/dist/capture/compaction-record.d.ts +7 -93
- package/dist/capture/compaction-record.js +34 -399
- package/dist/capture/compaction-spool.d.ts +5 -3
- package/dist/capture/compaction-spool.js +21 -7
- package/dist/capture/copilot-transcript.d.ts +2 -1
- package/dist/capture/copilot-transcript.js +2 -1
- package/dist/capture/extract.d.ts +5 -2
- package/dist/capture/extract.js +4 -3
- package/dist/capture/failure-caller.d.ts +1 -1
- package/dist/capture/failure-caller.js +21 -16
- package/dist/capture/failure-reading.d.ts +2 -1
- package/dist/capture/failure-reading.js +7 -9
- package/dist/capture/pre-compact-caller.js +5 -4
- package/dist/capture/session-digest.d.ts +1 -1
- package/dist/capture/session-digest.js +17 -10
- package/dist/capture/session-end-caller.js +2 -1
- package/dist/capture/session-worker.js +3 -4
- package/dist/capture/transcript.d.ts +4 -11
- package/dist/capture/transcript.js +10 -21
- package/dist/capture/working-state.d.ts +4 -2
- package/dist/capture/working-state.js +4 -2
- package/dist/cli/api-context.d.ts +3 -0
- package/dist/cli/api-context.js +6 -0
- package/dist/cli/audit-prune.d.ts +1 -59
- package/dist/cli/audit-prune.js +2 -61
- package/dist/cli/audit.d.ts +1 -1
- package/dist/cli/audit.js +42 -43
- package/dist/cli/auth.d.ts +2 -2
- package/dist/cli/auth.js +61 -44
- package/dist/cli/briefs.d.ts +1 -4
- package/dist/cli/briefs.js +42 -301
- package/dist/cli/card.d.ts +2 -2
- package/dist/cli/card.js +63 -56
- package/dist/cli/client.d.ts +12 -27
- package/dist/cli/client.js +41 -44
- package/dist/cli/compact-resume-payload.js +4 -3
- package/dist/cli/context.d.ts +2 -3
- package/dist/cli/context.js +22 -18
- package/dist/cli/continuity.d.ts +6 -6
- package/dist/cli/continuity.js +81 -86
- package/dist/cli/curate.d.ts +13 -17
- package/dist/cli/curate.js +88 -116
- package/dist/cli/dag.d.ts +4 -4
- package/dist/cli/dag.js +55 -34
- package/dist/cli/decisions.d.ts +2 -4
- package/dist/cli/decisions.js +18 -309
- package/dist/cli/eval.d.ts +1 -1
- package/dist/cli/eval.js +27 -26
- package/dist/cli/exit.d.ts +6 -0
- package/dist/cli/exit.js +11 -0
- package/dist/cli/explain.d.ts +2 -3
- package/dist/cli/explain.js +25 -27
- package/dist/cli/flag-values.d.ts +6 -1
- package/dist/cli/flag-values.js +42 -15
- package/dist/cli/flags.d.ts +0 -288
- package/dist/cli/flags.js +3 -138
- package/dist/cli/github.d.ts +14 -0
- package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
- package/dist/cli/goals.d.ts +2 -2
- package/dist/cli/goals.js +46 -50
- package/dist/cli/graph.d.ts +3 -0
- package/dist/cli/graph.js +83 -0
- package/dist/cli/hook-runtime.d.ts +12 -32
- package/dist/cli/hook-runtime.js +21 -64
- package/dist/cli/incidents.d.ts +3 -0
- package/dist/cli/incidents.js +112 -0
- package/dist/cli/init.d.ts +2 -2
- package/dist/cli/init.js +33 -30
- package/dist/cli/install-steps.d.ts +2 -1
- package/dist/cli/install-steps.js +13 -14
- package/dist/cli/last-sleep.d.ts +2 -1
- package/dist/cli/last-sleep.js +4 -1
- package/dist/cli/lenient-id.d.ts +2 -0
- package/dist/cli/lenient-id.js +13 -0
- package/dist/cli/maintenance.d.ts +5 -5
- package/dist/cli/maintenance.js +37 -43
- package/dist/cli/notes.d.ts +2 -0
- package/dist/cli/notes.js +41 -0
- package/dist/cli/object-verbs.js +4 -3
- package/dist/cli/open-browser.d.ts +14 -0
- package/dist/cli/open-browser.js +26 -0
- package/dist/cli/owner-validation.d.ts +5 -28
- package/dist/cli/owner-validation.js +5 -28
- package/dist/cli/playbooks.d.ts +3 -4
- package/dist/cli/playbooks.js +131 -300
- package/dist/cli/predictions.d.ts +3 -0
- package/dist/cli/predictions.js +175 -0
- package/dist/cli/print.d.ts +2 -5
- package/dist/cli/print.js +3 -5
- package/dist/cli/projects.d.ts +2 -2
- package/dist/cli/projects.js +31 -25
- package/dist/cli/quality-repair-once.d.ts +1 -1
- package/dist/cli/quality-repair-once.js +7 -6
- package/dist/cli/recall.d.ts +2 -4
- package/dist/cli/recall.js +67 -137
- package/dist/cli/refine-llm.d.ts +5 -31
- package/dist/cli/refine-llm.js +23 -50
- package/dist/cli/remember.d.ts +3 -3
- package/dist/cli/remember.js +134 -192
- package/dist/cli/scheduler.d.ts +2 -17
- package/dist/cli/scheduler.js +14 -19
- package/dist/cli/serve.js +23 -14
- package/dist/cli/session-hooks.d.ts +11 -19
- package/dist/cli/session-hooks.js +143 -214
- package/dist/cli/setup.d.ts +4 -4
- package/dist/cli/setup.js +35 -30
- package/dist/cli/shared.d.ts +7 -25
- package/dist/cli/shared.js +17 -60
- package/dist/cli/slack.d.ts +2 -2
- package/dist/cli/slack.js +19 -23
- package/dist/cli/sleep-render.js +6 -3
- package/dist/cli/sleep.d.ts +3 -2
- package/dist/cli/sleep.js +17 -49
- package/dist/cli/status.d.ts +11 -14
- package/dist/cli/status.js +74 -120
- package/dist/cli/stdin.d.ts +4 -6
- package/dist/cli/stdin.js +2 -3
- package/dist/cli/transfer.d.ts +9 -9
- package/dist/cli/transfer.js +87 -108
- package/dist/cli/usage.d.ts +0 -79
- package/dist/cli/usage.js +1 -689
- package/dist/cli/verb-row.d.ts +32 -0
- package/dist/cli/verb-row.js +6 -0
- package/dist/cli/verbs/health.d.ts +27 -0
- package/dist/cli/verbs/health.js +232 -0
- package/dist/cli/verbs/memory.d.ts +16 -0
- package/dist/cli/verbs/memory.js +244 -0
- package/dist/cli/verbs/objects.d.ts +20 -0
- package/dist/cli/verbs/objects.js +254 -0
- package/dist/cli/verbs/sessions.d.ts +31 -0
- package/dist/cli/verbs/sessions.js +312 -0
- package/dist/cli/verbs.d.ts +81 -0
- package/dist/cli/verbs.js +7 -0
- package/dist/cli/versioned-verbs.d.ts +51 -0
- package/dist/cli/versioned-verbs.js +79 -0
- package/dist/cli.d.ts +1 -654
- package/dist/cli.js +44 -510
- package/dist/connectors/dlq.d.ts +39 -3
- package/dist/connectors/dlq.js +37 -3
- package/dist/connectors/github/backfill.d.ts +5 -25
- package/dist/connectors/github/backfill.js +26 -52
- package/dist/connectors/github/deletion.d.ts +4 -18
- package/dist/connectors/github/deletion.js +2 -15
- package/dist/connectors/github/dlq.d.ts +8 -33
- package/dist/connectors/github/dlq.js +34 -93
- package/dist/connectors/github/ingest.d.ts +4 -12
- package/dist/connectors/github/ingest.js +5 -36
- package/dist/connectors/github/octokit-client.d.ts +4 -16
- package/dist/connectors/github/octokit-client.js +27 -24
- package/dist/connectors/github/ratelimit.d.ts +3 -14
- package/dist/connectors/github/ratelimit.js +3 -14
- package/dist/connectors/github/scope.d.ts +3 -5
- package/dist/connectors/github/scope.js +3 -5
- package/dist/connectors/github/signature.d.ts +4 -26
- package/dist/connectors/github/signature.js +4 -26
- package/dist/connectors/github/tenant-routing.d.ts +2 -24
- package/dist/connectors/github/tenant-routing.js +4 -26
- package/dist/connectors/github/transform.js +2 -16
- package/dist/connectors/github/types.d.ts +3 -15
- package/dist/connectors/github/types.js +2 -9
- package/dist/connectors/github/webhook.d.ts +3 -16
- package/dist/connectors/github/webhook.js +38 -23
- package/dist/connectors/ingest.d.ts +10 -0
- package/dist/connectors/ingest.js +28 -0
- package/dist/connectors/slack/backfill.d.ts +4 -17
- package/dist/connectors/slack/backfill.js +4 -13
- package/dist/connectors/slack/dlq.d.ts +2 -19
- package/dist/connectors/slack/dlq.js +51 -90
- package/dist/connectors/slack/ingest.d.ts +4 -9
- package/dist/connectors/slack/ingest.js +4 -30
- package/dist/connectors/slack/scope.d.ts +2 -8
- package/dist/connectors/slack/scope.js +2 -8
- package/dist/connectors/slack/signature.d.ts +1 -6
- package/dist/connectors/slack/tenant-routing.d.ts +2 -19
- package/dist/connectors/slack/tenant-routing.js +2 -21
- package/dist/connectors/slack/transform.d.ts +2 -18
- package/dist/connectors/slack/transform.js +2 -18
- package/dist/connectors/slack/types.d.ts +3 -9
- package/dist/connectors/slack/types.js +2 -4
- package/dist/connectors/slack/web-client.js +33 -27
- package/dist/connectors/slack/webhook.d.ts +3 -19
- package/dist/connectors/slack/webhook.js +6 -26
- package/dist/connectors/slack/workspaces.d.ts +4 -24
- package/dist/connectors/slack/workspaces.js +4 -24
- package/dist/consolidate/conflicts.js +7 -15
- package/dist/consolidate/dag-summary.d.ts +8 -0
- package/dist/consolidate/dag-summary.js +41 -0
- package/dist/consolidate/dag.d.ts +5 -28
- package/dist/consolidate/dag.js +29 -84
- package/dist/consolidate/decay.js +7 -19
- package/dist/consolidate/dedupe.d.ts +13 -52
- package/dist/consolidate/dedupe.js +18 -74
- package/dist/consolidate/flush-units.d.ts +3 -4
- package/dist/consolidate/flush-units.js +3 -3
- package/dist/consolidate/half-life-migration.d.ts +3 -26
- package/dist/consolidate/half-life-migration.js +11 -28
- package/dist/consolidate/llm-passes.js +49 -40
- package/dist/consolidate/memory-value-weights.d.ts +2 -13
- package/dist/consolidate/memory-value-weights.js +2 -13
- package/dist/consolidate/memory-value.d.ts +11 -84
- package/dist/consolidate/memory-value.js +18 -105
- package/dist/consolidate/merge.js +12 -33
- package/dist/consolidate/physics-pass.d.ts +6 -1
- package/dist/consolidate/physics-pass.js +27 -9
- package/dist/consolidate/replay.d.ts +6 -38
- package/dist/consolidate/replay.js +25 -56
- package/dist/consolidate/run.js +1 -1
- package/dist/consolidate/sleep.d.ts +1 -8
- package/dist/consolidate/sleep.js +13 -22
- package/dist/consolidate/trace.d.ts +3 -18
- package/dist/consolidate/trace.js +3 -18
- package/dist/consolidate/traces.js +9 -25
- package/dist/core/ablation.d.ts +14 -91
- package/dist/core/ablation.js +16 -91
- package/dist/core/active-scope.d.ts +7 -0
- package/dist/{sharing/scope.js → core/active-scope.js} +5 -12
- package/dist/core/ambient.d.ts +5 -8
- package/dist/core/ambient.js +40 -26
- package/dist/core/api-errors.d.ts +16 -0
- package/dist/core/api-errors.js +20 -0
- package/dist/core/capture-contract.d.ts +4 -2
- package/dist/core/capture-contract.js +4 -2
- package/dist/core/card.d.ts +4 -1
- package/dist/core/card.js +11 -1
- package/dist/core/compaction-timing.d.ts +7 -0
- package/dist/core/compaction-timing.js +9 -0
- package/dist/core/compare.d.ts +11 -67
- package/dist/core/compare.js +9 -63
- package/dist/core/config.d.ts +10 -24
- package/dist/core/config.js +20 -16
- package/dist/core/cosine.d.ts +3 -0
- package/dist/core/cosine.js +19 -0
- package/dist/core/handoff.d.ts +1 -7
- package/dist/core/handoff.js +1 -7
- package/dist/core/markdown.d.ts +6 -0
- package/dist/{store → core}/markdown.js +23 -22
- package/dist/core/memory-audit.d.ts +17 -0
- package/dist/core/memory-audit.js +54 -0
- package/dist/core/memory-quality.js +1 -1
- package/dist/core/memory.d.ts +51 -168
- package/dist/core/memory.js +76 -239
- package/dist/{consolidate → core}/merged-row.d.ts +1 -1
- package/dist/{consolidate → core}/merged-row.js +3 -2
- package/dist/core/package-root.d.ts +3 -0
- package/dist/core/package-root.js +5 -0
- package/dist/core/physics-config.d.ts +1 -4
- package/dist/core/physics-config.js +3 -8
- package/dist/core/physics.d.ts +15 -61
- package/dist/core/physics.js +65 -138
- package/dist/core/prediction.d.ts +3 -0
- package/dist/core/prediction.js +6 -0
- package/dist/core/project-identity.d.ts +20 -58
- package/dist/core/project-identity.js +27 -39
- package/dist/core/project-remote.js +13 -2
- package/dist/core/raw-append-only.d.ts +5 -0
- package/dist/core/raw-append-only.js +7 -0
- package/dist/core/recall-scope.d.ts +69 -0
- package/dist/core/recall-scope.js +138 -0
- package/dist/core/salience.d.ts +1 -7
- package/dist/core/salience.js +1 -7
- package/dist/dashboard/dashboard-actions.js +2 -2
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
- package/dist/dashboard/dashboard-snapshot.js +11 -2
- package/dist/dashboard/dashboard-types.d.ts +2 -1
- package/dist/dashboard/dashboard.d.ts +1 -0
- package/dist/dashboard/dashboard.js +50 -4
- package/dist/db/busy.d.ts +3 -8
- package/dist/db/busy.js +37 -33
- package/dist/db/connect.js +7 -8
- package/dist/db/index.d.ts +3 -3
- package/dist/db/index.js +3 -3
- package/dist/db/migrate.js +3 -3
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/types.d.ts +2 -5
- package/dist/db/migrations/v14.js +2 -3
- package/dist/db/migrations/v15.js +2 -8
- package/dist/db/migrations/v16.js +2 -3
- package/dist/db/migrations/v17.js +2 -3
- package/dist/db/migrations/v19.js +2 -5
- package/dist/db/migrations/v20.js +2 -7
- package/dist/db/migrations/v22.js +4 -17
- package/dist/db/migrations/v23.js +3 -14
- package/dist/db/migrations/v24.js +2 -4
- package/dist/db/migrations/v25.js +3 -8
- package/dist/db/migrations/v26.js +2 -13
- package/dist/db/migrations/v27.js +3 -11
- package/dist/db/migrations/v28.js +2 -14
- package/dist/db/migrations/v29.js +4 -18
- package/dist/db/migrations/v30.js +4 -16
- package/dist/db/migrations/v31.js +2 -15
- package/dist/db/migrations/v32.js +4 -22
- package/dist/db/migrations/v33.js +2 -15
- package/dist/db/migrations/v34.js +2 -11
- package/dist/db/migrations/v35.js +2 -11
- package/dist/db/migrations/v36.js +2 -11
- package/dist/db/migrations/v37.js +8 -33
- package/dist/db/migrations/v38.js +5 -38
- package/dist/db/migrations/v39.js +9 -20
- package/dist/db/migrations/v40.js +2 -9
- package/dist/db/migrations/v41.js +2 -24
- package/dist/db/migrations/v43.js +1 -1
- package/dist/db/migrations/v44.js +2 -8
- package/dist/db/migrations/v45.js +2 -7
- package/dist/db/migrations/v47.js +2 -3
- package/dist/db/migrations/v51.js +1 -1
- package/dist/db/migrations/v55.d.ts +3 -0
- package/dist/db/migrations/v55.js +17 -0
- package/dist/db/open.d.ts +2 -2
- package/dist/db/open.js +21 -9
- package/dist/db/physics-state.d.ts +6 -22
- package/dist/db/physics-state.js +28 -39
- package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
- package/dist/db/raw-archive-mirror-cleanup.js +2 -17
- package/dist/db/tables.d.ts +2 -0
- package/dist/db/tables.js +6 -2
- package/dist/db/vector-store.d.ts +2 -0
- package/dist/db/vector-store.js +25 -5
- package/dist/db/wal-checkpointer.js +2 -1
- package/dist/doctor.js +85 -27
- package/dist/embeddings/local.d.ts +62 -0
- package/dist/embeddings/local.js +146 -0
- package/dist/embeddings/provider.d.ts +43 -0
- package/dist/{store/embeddings → embeddings}/provider.js +58 -83
- package/dist/embeddings/transformers.d.ts +26 -0
- package/dist/embeddings/transformers.js +89 -0
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +3 -2
- package/dist/eval/eval-stats.d.ts +15 -53
- package/dist/eval/eval-stats.js +12 -42
- package/dist/eval/eval-suite.d.ts +2 -13
- package/dist/eval/eval-suite.js +91 -45
- package/dist/eval/eval.d.ts +6 -24
- package/dist/eval/eval.js +8 -35
- package/dist/eval/judgment.d.ts +0 -3
- package/dist/eval/judgment.js +30 -15
- package/dist/extensions/openclaw-plugin/index.js +1 -1
- package/dist/graph/extract.d.ts +5 -27
- package/dist/graph/extract.js +10 -36
- package/dist/graph/recall.d.ts +7 -20
- package/dist/graph/recall.js +15 -77
- package/dist/graph/stream.d.ts +7 -39
- package/dist/graph/stream.js +11 -34
- package/dist/graph/view.d.ts +9 -35
- package/dist/graph/view.js +24 -44
- package/dist/graph/write.d.ts +1 -1
- package/dist/graph/write.js +9 -9
- package/dist/hooks/codex-session.js +3 -2
- package/dist/hooks/codex-wrapper.js +4 -3
- package/dist/hooks/copilot.js +2 -1
- package/dist/hooks/hook-blocks.d.ts +6 -2
- package/dist/hooks/hook-blocks.js +37 -124
- package/dist/hooks/json-hooks.d.ts +4 -36
- package/dist/hooks/json-hooks.js +22 -59
- package/dist/hooks/opencode.d.ts +0 -38
- package/dist/hooks/opencode.js +17 -81
- package/dist/hooks/shared.d.ts +6 -21
- package/dist/hooks/shared.js +31 -33
- package/dist/importers/core.d.ts +12 -37
- package/dist/importers/core.js +10 -28
- package/dist/importers/markdown-parse.d.ts +8 -22
- package/dist/importers/markdown-parse.js +8 -25
- package/dist/importers/markdown.js +3 -12
- package/dist/importers/sources.js +12 -39
- package/dist/importers/vault.d.ts +2 -8
- package/dist/importers/vault.js +31 -85
- package/dist/index.d.ts +8 -3
- package/dist/index.js +8 -3
- package/dist/learn/autolearn.d.ts +23 -42
- package/dist/learn/autolearn.js +45 -52
- package/dist/learn/churn-git.js +13 -4
- package/dist/learn/extract.d.ts +3 -2
- package/dist/learn/extract.js +8 -8
- package/dist/learn/forward-claim-detector.d.ts +6 -30
- package/dist/learn/forward-claim-detector.js +18 -68
- package/dist/learn/invalidation.d.ts +6 -18
- package/dist/learn/invalidation.js +18 -31
- package/dist/mcp/admin-tools.d.ts +2 -2
- package/dist/mcp/admin-tools.js +30 -53
- package/dist/mcp/format.js +3 -2
- package/dist/mcp/framing.d.ts +1 -0
- package/dist/mcp/framing.js +1 -1
- package/dist/mcp/memory-tools.js +7 -10
- package/dist/mcp/protocol.d.ts +15 -29
- package/dist/mcp/protocol.js +26 -16
- package/dist/mcp/recall-tools.js +14 -11
- package/dist/mcp/request.d.ts +3 -11
- package/dist/mcp/request.js +12 -27
- package/dist/mcp/server.d.ts +3 -9
- package/dist/mcp/server.js +5 -16
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +5 -11
- package/dist/mcp/stdio.d.ts +2 -6
- package/dist/mcp/stdio.js +68 -16
- package/dist/mcp/tool-args.js +2 -1
- package/dist/mcp/tools.js +47 -22
- package/dist/objects/customer-notes.d.ts +9 -44
- package/dist/objects/customer-notes.js +7 -48
- package/dist/objects/decisions.d.ts +14 -52
- package/dist/objects/decisions.js +15 -53
- package/dist/objects/descriptor.d.ts +1 -1
- package/dist/objects/incidents.d.ts +9 -40
- package/dist/objects/incidents.js +7 -41
- package/dist/objects/lifecycle.d.ts +1 -1
- package/dist/objects/lifecycle.js +2 -1
- package/dist/objects/policies.d.ts +13 -91
- package/dist/objects/policies.js +13 -99
- package/dist/objects/processes.d.ts +9 -54
- package/dist/objects/processes.js +7 -61
- package/dist/objects/project-briefs.d.ts +13 -57
- package/dist/objects/project-briefs.js +16 -78
- package/dist/objects/skills.d.ts +9 -44
- package/dist/objects/skills.js +8 -54
- package/dist/postinstall.js +7 -20
- package/dist/predictions/planning-fallacy.d.ts +11 -34
- package/dist/rerankers/clef.js +6 -37
- package/dist/rerankers/cross-encoder.d.ts +31 -2
- package/dist/rerankers/cross-encoder.js +65 -101
- package/dist/rerankers/index.js +5 -4
- package/dist/rerankers/jev.js +11 -10
- package/dist/rerankers/llm.d.ts +2 -11
- package/dist/rerankers/llm.js +14 -14
- package/dist/rerankers/outage-warning.d.ts +5 -2
- package/dist/rerankers/outage-warning.js +7 -4
- package/dist/rerankers/remote.d.ts +1 -0
- package/dist/rerankers/remote.js +2 -0
- package/dist/rerankers/types.d.ts +2 -14
- package/dist/search/bm25-search.js +1 -1
- package/dist/search/boosts.d.ts +0 -2
- package/dist/search/boosts.js +3 -3
- package/dist/search/embed-memories.d.ts +9 -0
- package/dist/search/embed-memories.js +377 -0
- package/dist/search/goal-boost.d.ts +23 -0
- package/dist/search/goal-boost.js +93 -0
- package/dist/search/hybrid.d.ts +11 -2
- package/dist/search/hybrid.js +9 -4
- package/dist/search/multihop.js +2 -3
- package/dist/search/path-context.d.ts +5 -18
- package/dist/search/path-context.js +5 -18
- package/dist/search/physics-search.d.ts +6 -3
- package/dist/search/physics-search.js +29 -19
- package/dist/search/rerank.js +1 -1
- package/dist/search/rrf.d.ts +7 -35
- package/dist/search/rrf.js +5 -30
- package/dist/search/vector.d.ts +13 -4
- package/dist/search/vector.js +40 -13
- package/dist/server/auth.d.ts +11 -28
- package/dist/server/auth.js +49 -32
- package/dist/server/boot.d.ts +2 -21
- package/dist/server/boot.js +69 -161
- package/dist/server/client-ip.d.ts +3 -21
- package/dist/server/client-ip.js +8 -30
- package/dist/server/deadline.d.ts +0 -2
- package/dist/server/deadline.js +1 -7
- package/dist/server/defaults.d.ts +4 -0
- package/dist/server/defaults.js +5 -0
- package/dist/server/key-check-bounds.d.ts +2 -1
- package/dist/server/lifecycle.d.ts +5 -4
- package/dist/server/lifecycle.js +19 -4
- package/dist/server/mcp-http.js +24 -53
- package/dist/server/rate-limit.d.ts +5 -18
- package/dist/server/rate-limit.js +4 -13
- package/dist/server/request.d.ts +4 -8
- package/dist/server/request.js +16 -19
- package/dist/server/route-checks.d.ts +7 -0
- package/dist/server/route-checks.js +42 -0
- package/dist/server/route-table.d.ts +9 -8
- package/dist/server/route-table.js +127 -139
- package/dist/server/routes/admin.d.ts +8 -8
- package/dist/server/routes/admin.js +35 -49
- package/dist/server/routes/customer-notes.d.ts +6 -6
- package/dist/server/routes/customer-notes.js +8 -14
- package/dist/server/routes/decisions.d.ts +6 -6
- package/dist/server/routes/decisions.js +12 -21
- package/dist/server/routes/incidents.d.ts +6 -6
- package/dist/server/routes/incidents.js +14 -25
- package/dist/server/routes/memories.d.ts +9 -9
- package/dist/server/routes/memories.js +20 -63
- package/dist/server/routes/object-routes.d.ts +6 -11
- package/dist/server/routes/object-routes.js +11 -22
- package/dist/server/routes/policies.d.ts +7 -7
- package/dist/server/routes/policies.js +12 -22
- package/dist/server/routes/predictions.d.ts +6 -6
- package/dist/server/routes/predictions.js +22 -38
- package/dist/server/routes/processes.d.ts +6 -6
- package/dist/server/routes/processes.js +17 -28
- package/dist/server/routes/project-briefs.d.ts +7 -7
- package/dist/server/routes/project-briefs.js +11 -20
- package/dist/server/routes/recall.d.ts +5 -5
- package/dist/server/routes/recall.js +16 -45
- package/dist/server/routes/skills.d.ts +7 -7
- package/dist/server/routes/skills.js +10 -22
- package/dist/server/server-detect.d.ts +15 -53
- package/dist/server/server-detect.js +55 -96
- package/dist/server/sleep-child.js +26 -7
- package/dist/server/sleep-offload.d.ts +11 -5
- package/dist/server/sleep-offload.js +21 -12
- package/dist/server/types.d.ts +32 -18
- package/dist/server/validation.d.ts +3 -2
- package/dist/server/validation.js +15 -33
- package/dist/server.d.ts +7 -6
- package/dist/server.js +8 -6
- package/dist/sharing/global-store.d.ts +19 -0
- package/dist/sharing/global-store.js +75 -0
- package/dist/sharing/global-sync.d.ts +6 -0
- package/dist/sharing/global-sync.js +73 -0
- package/dist/sharing/project-merge.d.ts +11 -19
- package/dist/sharing/project-merge.js +63 -125
- package/dist/sharing/search-both.d.ts +60 -0
- package/dist/sharing/search-both.js +138 -0
- package/dist/sharing/share.d.ts +40 -0
- package/dist/sharing/share.js +229 -0
- package/dist/store/ambient.js +9 -15
- package/dist/store/audit-event.d.ts +5 -13
- package/dist/store/audit-event.js +4 -12
- package/dist/store/audit.d.ts +2 -21
- package/dist/store/audit.js +8 -67
- package/dist/store/auth.d.ts +10 -8
- package/dist/store/auth.js +17 -12
- package/dist/store/candidates.d.ts +23 -5
- package/dist/store/candidates.js +119 -71
- package/dist/store/capture-write.d.ts +17 -0
- package/dist/store/capture-write.js +35 -0
- package/dist/store/card-detail.d.ts +2 -1
- package/dist/store/card-detail.js +2 -1
- package/dist/store/cards.d.ts +14 -9
- package/dist/store/cards.js +72 -126
- package/dist/store/compaction-caller.d.ts +18 -0
- package/dist/store/compaction-caller.js +29 -0
- package/dist/store/compactions-record.d.ts +115 -0
- package/dist/store/compactions-record.js +417 -0
- package/dist/store/compactions.js +6 -4
- package/dist/store/conflicts.d.ts +4 -21
- package/dist/store/conflicts.js +76 -152
- package/dist/store/connectors/dlq.d.ts +10 -0
- package/dist/store/connectors/dlq.js +32 -0
- package/dist/store/connectors/github.d.ts +14 -16
- package/dist/store/connectors/github.js +34 -57
- package/dist/store/connectors/slack.d.ts +2 -11
- package/dist/store/connectors/slack.js +18 -47
- package/dist/store/dashboard-reads.js +11 -14
- package/dist/store/delete-and-batch.d.ts +17 -31
- package/dist/store/delete-and-batch.js +84 -67
- package/dist/store/delivery-recorder.d.ts +15 -4
- package/dist/store/delivery-recorder.js +34 -17
- package/dist/store/descendant-page.js +6 -3
- package/dist/store/diagnostics.js +6 -13
- package/dist/store/dormant.d.ts +8 -30
- package/dist/store/dormant.js +18 -57
- package/dist/store/embeddings/index.d.ts +11 -90
- package/dist/store/embeddings/index.js +18 -523
- package/dist/store/entry-reads.d.ts +34 -61
- package/dist/store/entry-reads.js +111 -136
- package/dist/store/entry-row.d.ts +6 -35
- package/dist/store/entry-row.js +9 -37
- package/dist/store/entry-writes.d.ts +12 -18
- package/dist/store/entry-writes.js +46 -44
- package/dist/store/failure-log-at.d.ts +8 -0
- package/dist/store/failure-log-at.js +16 -0
- package/dist/store/failure-log.d.ts +2 -2
- package/dist/store/failure-log.js +5 -3
- package/dist/{trust → store}/gated-write.d.ts +3 -1
- package/dist/{trust → store}/gated-write.js +7 -5
- package/dist/store/goals.d.ts +3 -40
- package/dist/store/goals.js +41 -178
- package/dist/store/graph-queue.d.ts +6 -22
- package/dist/store/graph-queue.js +14 -45
- package/dist/store/graph-reads.d.ts +11 -35
- package/dist/store/graph-reads.js +24 -60
- package/dist/store/graph-rows.d.ts +3 -6
- package/dist/store/graph-rows.js +6 -9
- package/dist/store/graph-view-rows.d.ts +2 -1
- package/dist/store/graph-view-rows.js +2 -1
- package/dist/store/graph-writes.d.ts +10 -35
- package/dist/store/graph-writes.js +59 -106
- package/dist/store/half-life.d.ts +2 -1
- package/dist/store/half-life.js +14 -16
- package/dist/store/handoffs.d.ts +6 -12
- package/dist/store/handoffs.js +22 -40
- package/dist/store/index-and-stats.d.ts +6 -19
- package/dist/store/index-and-stats.js +36 -84
- package/dist/store/key-writes.js +1 -1
- package/dist/store/ledger-turn.d.ts +9 -0
- package/dist/store/ledger-turn.js +38 -0
- package/dist/store/mirrors.d.ts +2 -6
- package/dist/store/mirrors.js +24 -29
- package/dist/store/open.d.ts +0 -4
- package/dist/store/open.js +42 -62
- package/dist/store/pilot-arm.d.ts +12 -0
- package/dist/store/pilot-arm.js +42 -0
- package/dist/store/planning-fallacy-evidence.d.ts +2 -30
- package/dist/store/planning-fallacy-evidence.js +8 -37
- package/dist/store/port.d.ts +91 -82
- package/dist/store/port.js +8 -0
- package/dist/store/predictions.d.ts +12 -53
- package/dist/store/predictions.js +41 -125
- package/dist/store/project-tags.d.ts +62 -0
- package/dist/store/project-tags.js +67 -0
- package/dist/{cli → store}/quality-repair.js +15 -31
- package/dist/store/quarantine.js +2 -1
- package/dist/store/raw-archive.d.ts +4 -16
- package/dist/store/raw-archive.js +14 -29
- package/dist/store/recall-trace.d.ts +12 -77
- package/dist/store/recall-trace.js +37 -97
- package/dist/store/rejected-values.js +9 -20
- package/dist/store/rejection-probe.d.ts +4 -0
- package/dist/store/rejection-probe.js +19 -0
- package/dist/store/rejection.d.ts +10 -73
- package/dist/store/rejection.js +12 -84
- package/dist/store/report-reads.d.ts +6 -0
- package/dist/store/report-reads.js +29 -0
- package/dist/store/rows.d.ts +9 -19
- package/dist/store/rows.js +36 -34
- package/dist/store/rule-sql.d.ts +14 -0
- package/dist/store/rule-sql.js +56 -0
- package/dist/store/search-rows.d.ts +7 -38
- package/dist/store/search-rows.js +23 -54
- package/dist/store/sessions.d.ts +10 -47
- package/dist/store/sessions.js +21 -75
- package/dist/store/set-aside.d.ts +14 -0
- package/dist/store/set-aside.js +23 -0
- package/dist/store/sqlite/busy.d.ts +3 -0
- package/dist/store/sqlite/busy.js +8 -0
- package/dist/store/sqlite/connector-events-group.js +5 -8
- package/dist/store/sqlite/connector-writes-group.js +3 -3
- package/dist/store/sqlite/entry-writes-group.js +4 -4
- package/dist/store/sqlite/error-codec.js +8 -5
- package/dist/store/sqlite/executor.d.ts +2 -1
- package/dist/store/sqlite/executor.js +12 -5
- package/dist/store/sqlite/graph-reads-group.js +1 -1
- package/dist/store/sqlite/held-connection.d.ts +9 -0
- package/dist/store/sqlite/held-connection.js +41 -0
- package/dist/store/sqlite/local.d.ts +3 -3
- package/dist/store/sqlite/local.js +1 -0
- package/dist/store/sqlite/object-rows.d.ts +1 -1
- package/dist/store/sqlite/object-rows.js +6 -3
- package/dist/store/sqlite/objects-group.d.ts +1 -1
- package/dist/store/sqlite/objects-group.js +5 -3
- package/dist/store/sqlite/quarantine-group.js +2 -2
- package/dist/store/sqlite/store.d.ts +1 -4
- package/dist/store/sqlite/store.js +16 -15
- package/dist/store/sqlite/vector-reads-group.js +2 -2
- package/dist/store/sqlite/worker-jobs.js +1 -1
- package/dist/store/sqlite/worker-ops.d.ts +13 -2
- package/dist/store/sqlite/worker-ops.js +13 -2
- package/dist/store/sqlite/worker-store.js +5 -2
- package/dist/store/summaries.d.ts +11 -63
- package/dist/store/summaries.js +37 -148
- package/dist/store/summary-dirty.js +1 -1
- package/dist/store/tenant-lookup.d.ts +6 -1
- package/dist/store/tenant-lookup.js +7 -0
- package/dist/store/tenant.d.ts +2 -16
- package/dist/store/tenant.js +4 -19
- package/dist/store/token-ledger.d.ts +13 -50
- package/dist/store/token-ledger.js +19 -85
- package/dist/store/usage-reports.js +5 -13
- package/dist/store/vector-index.d.ts +46 -0
- package/dist/store/vector-index.js +171 -0
- package/dist/store/working-memory.d.ts +6 -25
- package/dist/store/working-memory.js +18 -52
- package/dist/support-bundle.js +9 -8
- package/dist/trust/reject-flow.js +3 -5
- package/dist/util/agent-homes.d.ts +15 -0
- package/dist/util/agent-homes.js +34 -0
- package/dist/util/anthropic-messages.d.ts +3 -0
- package/dist/util/anthropic-messages.js +35 -6
- package/dist/util/atomic-write.d.ts +2 -1
- package/dist/util/atomic-write.js +35 -4
- package/dist/util/capped-json.d.ts +6 -0
- package/dist/util/capped-json.js +46 -0
- package/dist/util/chunked.d.ts +3 -0
- package/dist/util/chunked.js +10 -0
- package/dist/util/crash-handlers.d.ts +8 -1
- package/dist/util/crash-handlers.js +52 -10
- package/dist/util/ellipsize.d.ts +3 -0
- package/dist/util/ellipsize.js +5 -0
- package/dist/util/env.d.ts +14 -6
- package/dist/util/env.js +15 -7
- package/dist/util/format.d.ts +3 -0
- package/dist/util/format.js +6 -0
- package/dist/util/home-path.d.ts +2 -1
- package/dist/util/home-path.js +4 -2
- package/dist/util/hook-payload.d.ts +8 -0
- package/dist/util/hook-payload.js +37 -0
- package/dist/util/http-retry.d.ts +9 -1
- package/dist/util/http-retry.js +67 -8
- package/dist/util/http-util.d.ts +0 -8
- package/dist/util/http-util.js +10 -21
- package/dist/util/limits.d.ts +7 -0
- package/dist/util/limits.js +14 -0
- package/dist/util/log.d.ts +7 -2
- package/dist/util/log.js +34 -9
- package/dist/util/request-scope.d.ts +5 -2
- package/dist/util/request-scope.js +13 -7
- package/dist/util/secret-detect.d.ts +5 -30
- package/dist/util/secret-detect.js +19 -40
- package/dist/util/sqlite-blocked.d.ts +2 -0
- package/dist/util/sqlite-blocked.js +5 -0
- package/dist/util/stored-json.d.ts +1 -1
- package/dist/util/stored-json.js +1 -1
- package/dist/util/stream-tee.d.ts +3 -0
- package/dist/util/stream-tee.js +35 -0
- package/dist/util/time.d.ts +4 -0
- package/dist/util/time.js +4 -0
- package/dist/util/token-text.d.ts +1 -4
- package/dist/util/token-text.js +1 -4
- package/dist/util/transcript-tail.d.ts +2 -0
- package/dist/util/transcript-tail.js +24 -23
- package/dist/util/version.d.ts +5 -20
- package/dist/util/version.js +5 -20
- package/dist/{store → util}/yaml.d.ts +1 -5
- package/dist/{store → util}/yaml.js +2 -6
- package/extensions/openclaw-plugin/index.ts +1 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
- package/dist/cli/provenance-coverage.d.ts +0 -18
- package/dist/connectors/github/cli-impl.d.ts +0 -25
- package/dist/sharing/scope.d.ts +0 -14
- package/dist/sharing/shared.d.ts +0 -187
- package/dist/sharing/shared.js +0 -563
- package/dist/store/embeddings/local.d.ts +0 -15
- package/dist/store/embeddings/local.js +0 -192
- package/dist/store/embeddings/provider.d.ts +0 -77
- package/dist/store/markdown.d.ts +0 -10
- package/dist/store/recall-scope.d.ts +0 -138
- package/dist/store/recall-scope.js +0 -216
- package/dist/store/vector-writes.d.ts +0 -13
- package/dist/store/vector-writes.js +0 -89
- /package/dist/{store → core}/object-types.d.ts +0 -0
- /package/dist/{store → core}/object-types.js +0 -0
- /package/dist/{cli → store}/quality-repair.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.d.ts +0 -0
- /package/dist/{capture → util}/compaction-items.js +0 -0
package/dist/store/handoffs.d.ts
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
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;
|
|
5
|
-
export declare const HANDOFF_COLUMNS
|
|
6
|
-
/**
|
|
7
|
-
* Save a session handoff record. Returns the persisted handoff.
|
|
8
|
-
*/
|
|
4
|
+
/** Column list shared by every session_handoffs SELECT; cards.ts reuses it for the card handoff lookup. */
|
|
5
|
+
export declare const HANDOFF_COLUMNS: string;
|
|
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,13 @@
|
|
|
1
|
-
import { closeHippoDb
|
|
1
|
+
import { closeHippoDb } from '../db/index.js';
|
|
2
2
|
import { rowToSessionHandoff, isHandoffOutcome, } from '../core/handoff.js';
|
|
3
|
-
import { scopeAdmitSql } from './
|
|
3
|
+
import { scopeAdmitSql } from './rule-sql.js';
|
|
4
4
|
import { assertTenantId } from './tenant.js';
|
|
5
|
-
import { openStore } from './open.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;
|
|
8
|
-
export const HANDOFF_COLUMNS = 'id, session_id, repo_root, task_id, summary, next_action, artifacts_json, scope, created_at, constraints_json,
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
*/
|
|
7
|
+
/** Column list shared by every session_handoffs SELECT; cards.ts reuses it for the card handoff lookup. */
|
|
8
|
+
export const HANDOFF_COLUMNS = 'id, session_id, repo_root, task_id, summary, next_action, artifacts_json, scope, created_at, constraints_json, ' +
|
|
9
|
+
'evidence_json, outcome, target_runtime, card_id';
|
|
10
|
+
/** Save a session handoff record; returns the persisted handoff. */
|
|
12
11
|
export function saveSessionHandoff(hippoRoot, tenantId, handoff, key) {
|
|
13
12
|
assertTenantId('saveSessionHandoff', tenantId);
|
|
14
13
|
const stamp = key ? continuityStamp(key) : null;
|
|
@@ -17,10 +16,9 @@ export function saveSessionHandoff(hippoRoot, tenantId, handoff, key) {
|
|
|
17
16
|
// Scope is stored as given; read-side default-deny in api.recall + cmdRecall
|
|
18
17
|
// continuity excludes slack:private:* and 'unknown:legacy'.
|
|
19
18
|
try {
|
|
20
|
-
const result = db.prepare(`
|
|
21
|
-
|
|
22
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
23
|
-
`).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);
|
|
19
|
+
const result = db.prepare(`\n INSERT INTO session_handoffs(session_id, repo_root, task_id, summary, next_action, artifacts_json, scope, tenant_id, created_at, ` +
|
|
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);
|
|
24
22
|
const id = Number(result.lastInsertRowid ?? 0);
|
|
25
23
|
// SAFETY: row's shape matches HANDOFF_COLUMNS.
|
|
26
24
|
const row = db.prepare(`SELECT ${HANDOFF_COLUMNS} FROM session_handoffs WHERE id = ?`).get(id);
|
|
@@ -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,10 +135,7 @@ 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
|
-
finally {
|
|
149
|
-
closeHippoDb(db);
|
|
150
|
-
}
|
|
138
|
+
}, openStore);
|
|
151
139
|
}
|
|
152
140
|
function transcriptHandoffSource(existing, derived, evidence) {
|
|
153
141
|
// Only an earlier transcript read gives way; `hippo handoff create` and unmarked older handoffs keep winning.
|
|
@@ -179,10 +167,8 @@ function buildSessionEndHandoff(sessionId, snapshot, existing, handoffEvidence,
|
|
|
179
167
|
cardId: carryForward ? existing.cardId : undefined,
|
|
180
168
|
};
|
|
181
169
|
}
|
|
182
|
-
/**
|
|
183
|
-
*
|
|
184
|
-
* @param options.inPlace rewrite an earlier transcript read instead of adding a revision, for a close that runs after every reply.
|
|
185
|
-
* @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`. */
|
|
186
172
|
export function writeSessionEndHandoff(hippoRoot, tenantId, sessionId, evidence, derived = null, key, options = {}) {
|
|
187
173
|
assertTenantId('writeSessionEndHandoff', tenantId);
|
|
188
174
|
if (key)
|
|
@@ -216,8 +202,7 @@ export function writeSessionEndHandoff(hippoRoot, tenantId, sessionId, evidence,
|
|
|
216
202
|
return saveSessionHandoff(hippoRoot, tenantId, handoff, key);
|
|
217
203
|
}
|
|
218
204
|
function sessionOutcome(hippoRoot, tenantId, sessionId) {
|
|
219
|
-
|
|
220
|
-
try {
|
|
205
|
+
return onHandle(hippoRoot, (db) => {
|
|
221
206
|
// SAFETY: row's shape matches the single `content` column below.
|
|
222
207
|
const content = db.prepare(`
|
|
223
208
|
SELECT content FROM session_events
|
|
@@ -225,9 +210,6 @@ function sessionOutcome(hippoRoot, tenantId, sessionId) {
|
|
|
225
210
|
ORDER BY created_at DESC, id DESC LIMIT 1
|
|
226
211
|
`).get(tenantId, sessionId)?.content;
|
|
227
212
|
return isHandoffOutcome(content) ? content : null;
|
|
228
|
-
}
|
|
229
|
-
finally {
|
|
230
|
-
closeHippoDb(db);
|
|
231
|
-
}
|
|
213
|
+
});
|
|
232
214
|
}
|
|
233
215
|
//# sourceMappingURL=handoffs.js.map
|
|
@@ -4,16 +4,10 @@ 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
|
-
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* `last_retrieval_ids` and `last_trace_id` commit in one transaction: callers fold a fresh trace id
|
|
11
|
-
* into the index and rely on both keys moving together. index.json is left to `rebuildIndex`.
|
|
12
|
-
*/
|
|
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`. */
|
|
13
9
|
export declare function saveIndex(hippoRoot: string, index: Pick<HippoIndex, 'last_retrieval_ids' | 'last_trace_id'>): void;
|
|
14
|
-
/**
|
|
15
|
-
* Rebuild mirrors from SQLite, importing any legacy markdown files not already present.
|
|
16
|
-
*/
|
|
10
|
+
/** Rebuild mirrors from SQLite, importing any legacy markdown files not already present. */
|
|
17
11
|
export declare function rebuildIndex(hippoRoot: string): HippoIndex;
|
|
18
12
|
export declare function updateStats(hippoRoot: string, delta: {
|
|
19
13
|
remembered?: number;
|
|
@@ -32,9 +26,7 @@ export declare function appendConsolidationRun(hippoRoot: string, run: {
|
|
|
32
26
|
}): void;
|
|
33
27
|
/** Rows a tenant created since the last sleep (runs are host-wide), looking back at most 24 hours. */
|
|
34
28
|
export declare function countCreatedSinceLastSleep(hippoRoot: string, tenantId: string, now?: Date): number;
|
|
35
|
-
/**
|
|
36
|
-
* Session decay context: provides the data needed for session-based and adaptive decay.
|
|
37
|
-
*/
|
|
29
|
+
/** Session decay context: the data needed for session-based and adaptive decay. */
|
|
38
30
|
export interface SessionDecayContext {
|
|
39
31
|
/** Total number of sleep (consolidation) cycles completed. */
|
|
40
32
|
sleepCount: number;
|
|
@@ -43,13 +35,8 @@ export interface SessionDecayContext {
|
|
|
43
35
|
}
|
|
44
36
|
/** Timestamp of the latest consolidation run, or undefined when there is none. */
|
|
45
37
|
export declare function lastConsolidationAt(db: DatabaseSyncLike): string | undefined;
|
|
46
|
-
/**
|
|
47
|
-
* Load the session decay context from the store.
|
|
48
|
-
* Uses consolidation_runs timestamps to compute session intervals.
|
|
49
|
-
*/
|
|
38
|
+
/** Load the session decay context; session intervals come from consolidation_runs timestamps. */
|
|
50
39
|
export declare function loadSessionDecayContext(hippoRoot: string): SessionDecayContext;
|
|
51
|
-
/**
|
|
52
|
-
* Increment the sleep counter. Called after each consolidation run.
|
|
53
|
-
*/
|
|
40
|
+
/** Increment the sleep counter after each consolidation run. */
|
|
54
41
|
export declare function incrementSleepCount(hippoRoot: string): void;
|
|
55
42
|
//# sourceMappingURL=index-and-stats.d.ts.map
|
|
@@ -1,55 +1,36 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { RejectedValueError } from '
|
|
1
|
+
import { withWriteScope, setMeta, isSqliteBusy, pruneConsolidationRuns, getMeta } from '../db/index.js';
|
|
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
6
|
import { buildIndexFromDb, readLastRecall, syncMirrorFiles, writeIndexMirror, writeStatsMirror, buildStatsFromDb } from './mirrors.js';
|
|
7
|
-
import { openStore, loadLegacyEntriesFromMarkdown } from './open.js';
|
|
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`. */
|
|
10
10
|
export function loadIndex(hippoRoot) {
|
|
11
|
-
|
|
12
|
-
try {
|
|
11
|
+
return onHandle(hippoRoot, (db) => {
|
|
13
12
|
return buildIndexFromDb(db);
|
|
14
|
-
}
|
|
15
|
-
finally {
|
|
16
|
-
closeHippoDb(db);
|
|
17
|
-
}
|
|
13
|
+
}, openStore);
|
|
18
14
|
}
|
|
19
15
|
/** The last recall's ids and its trace alone, for a caller that needs no index entry. */
|
|
20
16
|
export function loadLastRecall(hippoRoot) {
|
|
21
|
-
|
|
22
|
-
try {
|
|
17
|
+
return onHandle(hippoRoot, (db) => {
|
|
23
18
|
return readLastRecall(db);
|
|
24
|
-
}
|
|
25
|
-
finally {
|
|
26
|
-
closeHippoDb(db);
|
|
27
|
-
}
|
|
19
|
+
}, openStore);
|
|
28
20
|
}
|
|
29
|
-
/**
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* `last_retrieval_ids` and `last_trace_id` commit in one transaction: callers fold a fresh trace id
|
|
33
|
-
* into the index and rely on both keys moving together. index.json is left to `rebuildIndex`.
|
|
34
|
-
*/
|
|
21
|
+
/** Persist mutable index metadata (entry rows are derived from SQLite); `last_retrieval_ids` and `last_trace_id` commit in one transaction, as callers
|
|
22
|
+
* rely on both moving together. index.json is left to `rebuildIndex`. */
|
|
35
23
|
export function saveIndex(hippoRoot, index) {
|
|
36
|
-
|
|
37
|
-
try {
|
|
24
|
+
onHandle(hippoRoot, (db) => {
|
|
38
25
|
withWriteScope(db, 'save_index', () => {
|
|
39
26
|
setMeta(db, 'last_retrieval_ids', JSON.stringify(index.last_retrieval_ids ?? []));
|
|
40
27
|
setMeta(db, 'last_trace_id', index.last_trace_id ?? '');
|
|
41
28
|
});
|
|
42
|
-
}
|
|
43
|
-
finally {
|
|
44
|
-
closeHippoDb(db);
|
|
45
|
-
}
|
|
29
|
+
}, openStore);
|
|
46
30
|
}
|
|
47
|
-
/**
|
|
48
|
-
* Rebuild mirrors from SQLite, importing any legacy markdown files not already present.
|
|
49
|
-
*/
|
|
31
|
+
/** Rebuild mirrors from SQLite, importing any legacy markdown files not already present. */
|
|
50
32
|
export function rebuildIndex(hippoRoot) {
|
|
51
|
-
|
|
52
|
-
try {
|
|
33
|
+
return onHandle(hippoRoot, (db) => {
|
|
53
34
|
// SAFETY: rows' shape matches the single `id` column selected above.
|
|
54
35
|
const existingIds = new Set(db.prepare(`SELECT id FROM memories`).all().map((row) => row.id));
|
|
55
36
|
const legacyEntries = loadLegacyEntriesFromMarkdown(hippoRoot).filter((entry) => !existingIds.has(entry.id));
|
|
@@ -67,7 +48,12 @@ export function rebuildIndex(hippoRoot) {
|
|
|
67
48
|
catch (err) {
|
|
68
49
|
if (err instanceof RejectedValueError) {
|
|
69
50
|
rejectedCount++;
|
|
70
|
-
audit(db, 'reject_refusal', {
|
|
51
|
+
audit(db, 'reject_refusal', {
|
|
52
|
+
targetId: err.entryId,
|
|
53
|
+
metadata: { digest: err.digest, reason: err.reason },
|
|
54
|
+
actor: 'cli',
|
|
55
|
+
tenantId: err.tenantId
|
|
56
|
+
});
|
|
71
57
|
continue;
|
|
72
58
|
}
|
|
73
59
|
throw err;
|
|
@@ -82,25 +68,16 @@ export function rebuildIndex(hippoRoot) {
|
|
|
82
68
|
const index = buildIndexFromDb(db);
|
|
83
69
|
writeIndexMirror(hippoRoot, index);
|
|
84
70
|
return index;
|
|
85
|
-
}
|
|
86
|
-
finally {
|
|
87
|
-
closeHippoDb(db);
|
|
88
|
-
}
|
|
71
|
+
}, openStore);
|
|
89
72
|
}
|
|
90
73
|
export function updateStats(hippoRoot, delta) {
|
|
91
|
-
|
|
92
|
-
try {
|
|
74
|
+
onHandle(hippoRoot, (db) => {
|
|
93
75
|
updateStatsOn(db, hippoRoot, delta);
|
|
94
|
-
}
|
|
95
|
-
finally {
|
|
96
|
-
closeHippoDb(db);
|
|
97
|
-
}
|
|
76
|
+
}, openStore);
|
|
98
77
|
}
|
|
99
78
|
/** updateStats on the caller's open store, so a loop of writes opens the store once. */
|
|
100
79
|
export function updateStatsOn(db, hippoRoot, delta) {
|
|
101
|
-
// One atomic statement per counter
|
|
102
|
-
// named: the read-modify-write this replaces both lost increments to a
|
|
103
|
-
// concurrent writer and stamped stale values over the untouched two.
|
|
80
|
+
// One atomic statement per named counter: a read-modify-write loses concurrent increments and stamps stale values over the untouched two.
|
|
104
81
|
const increments = [
|
|
105
82
|
['total_remembered', delta.remembered ?? 0],
|
|
106
83
|
['total_recalled', delta.recalled ?? 0],
|
|
@@ -129,37 +106,25 @@ export function updateStatsUnlessBusy(hippoRoot, delta, committed) {
|
|
|
129
106
|
}
|
|
130
107
|
}
|
|
131
108
|
export function loadStats(hippoRoot) {
|
|
132
|
-
|
|
133
|
-
try {
|
|
109
|
+
return onHandle(hippoRoot, (db) => {
|
|
134
110
|
return buildStatsFromDb(db);
|
|
135
|
-
}
|
|
136
|
-
finally {
|
|
137
|
-
closeHippoDb(db);
|
|
138
|
-
}
|
|
111
|
+
}, openStore);
|
|
139
112
|
}
|
|
140
113
|
export function appendConsolidationRun(hippoRoot, run) {
|
|
141
|
-
|
|
142
|
-
try {
|
|
114
|
+
onHandle(hippoRoot, (db) => {
|
|
143
115
|
db.prepare(`INSERT INTO consolidation_runs(timestamp, decayed, merged, removed) VALUES (?, ?, ?, ?)`).run(run.timestamp, run.decayed, run.merged, run.removed);
|
|
144
|
-
pruneConsolidationRuns(db
|
|
116
|
+
pruneConsolidationRuns(db);
|
|
145
117
|
writeStatsMirror(hippoRoot, buildStatsFromDb(db));
|
|
146
|
-
}
|
|
147
|
-
finally {
|
|
148
|
-
closeHippoDb(db);
|
|
149
|
-
}
|
|
118
|
+
}, openStore);
|
|
150
119
|
}
|
|
151
120
|
/** Rows a tenant created since the last sleep (runs are host-wide), looking back at most 24 hours. */
|
|
152
121
|
export function countCreatedSinceLastSleep(hippoRoot, tenantId, now = new Date()) {
|
|
153
|
-
|
|
154
|
-
try {
|
|
122
|
+
return onHandle(hippoRoot, (db) => {
|
|
155
123
|
const dayAgo = new Date(now.getTime() - DAY_MS).toISOString();
|
|
156
124
|
const row = db.prepare(`SELECT COUNT(*) AS n FROM memories WHERE tenant_id = ?
|
|
157
125
|
AND created > MAX(?, COALESCE((SELECT MAX(timestamp) FROM consolidation_runs), ''))`).get(tenantId, dayAgo);
|
|
158
126
|
return row.n;
|
|
159
|
-
}
|
|
160
|
-
finally {
|
|
161
|
-
closeHippoDb(db);
|
|
162
|
-
}
|
|
127
|
+
}, openStore);
|
|
163
128
|
}
|
|
164
129
|
/** Timestamp of the latest consolidation run, or undefined when there is none. */
|
|
165
130
|
export function lastConsolidationAt(db) {
|
|
@@ -167,13 +132,9 @@ export function lastConsolidationAt(db) {
|
|
|
167
132
|
const row = db.prepare(`SELECT timestamp FROM consolidation_runs ORDER BY timestamp DESC, id DESC LIMIT 1`).get();
|
|
168
133
|
return row?.timestamp;
|
|
169
134
|
}
|
|
170
|
-
/**
|
|
171
|
-
* Load the session decay context from the store.
|
|
172
|
-
* Uses consolidation_runs timestamps to compute session intervals.
|
|
173
|
-
*/
|
|
135
|
+
/** Load the session decay context; session intervals come from consolidation_runs timestamps. */
|
|
174
136
|
export function loadSessionDecayContext(hippoRoot) {
|
|
175
|
-
|
|
176
|
-
try {
|
|
137
|
+
return onHandle(hippoRoot, (db) => {
|
|
177
138
|
// Get recent consolidation timestamps (last 20)
|
|
178
139
|
// SAFETY: rows' shape matches the single `timestamp` column above.
|
|
179
140
|
const rows = db.prepare(`SELECT timestamp FROM consolidation_runs ORDER BY timestamp DESC, id DESC LIMIT 20`).all();
|
|
@@ -190,22 +151,13 @@ export function loadSessionDecayContext(hippoRoot) {
|
|
|
190
151
|
const avgMs = totalInterval / (timestamps.length - 1);
|
|
191
152
|
const avgDays = avgMs / DAY_MS;
|
|
192
153
|
return { sleepCount, avgSessionIntervalDays: Math.max(0, avgDays) };
|
|
193
|
-
}
|
|
194
|
-
finally {
|
|
195
|
-
closeHippoDb(db);
|
|
196
|
-
}
|
|
154
|
+
}, openStore);
|
|
197
155
|
}
|
|
198
|
-
/**
|
|
199
|
-
* Increment the sleep counter. Called after each consolidation run.
|
|
200
|
-
*/
|
|
156
|
+
/** Increment the sleep counter after each consolidation run. */
|
|
201
157
|
export function incrementSleepCount(hippoRoot) {
|
|
202
|
-
|
|
203
|
-
try {
|
|
158
|
+
onHandle(hippoRoot, (db) => {
|
|
204
159
|
const current = Number(getMeta(db, 'sleep_count', '0')) || 0;
|
|
205
160
|
setMeta(db, 'sleep_count', String(current + 1));
|
|
206
|
-
}
|
|
207
|
-
finally {
|
|
208
|
-
closeHippoDb(db);
|
|
209
|
-
}
|
|
161
|
+
}, openStore);
|
|
210
162
|
}
|
|
211
163
|
//# sourceMappingURL=index-and-stats.js.map
|
package/dist/store/key-writes.js
CHANGED
|
@@ -3,7 +3,7 @@ import { BadRequestError, ConflictError, NotFoundError } from '../core/api-error
|
|
|
3
3
|
import { appendAuditEvent } from './audit.js';
|
|
4
4
|
import { grantScope, insertApiKey, listLiveOwnedKeyIds, revokeApiKey, ungrantScope } from './auth.js';
|
|
5
5
|
import { withWriteScope } from '../db/index.js';
|
|
6
|
-
import { isRestrictedScope } from '
|
|
6
|
+
import { isRestrictedScope } from '../core/recall-scope.js';
|
|
7
7
|
import { selectApiKeyOwner } from './tenant-lookup.js';
|
|
8
8
|
/** The auth_create row a mint writes; the plaintext never reaches it. */
|
|
9
9
|
function createAuditOf({ key, actor, metadata }) {
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import type { DeliveryEventInput } from './delivery-recorder.js';
|
|
2
2
|
import { type LastSent, type TokenSurface, type TokenUse } from './token-ledger.js';
|
|
3
|
+
import { type PilotArm } from './pilot-arm.js';
|
|
4
|
+
/** Says why a ledger row did not land, at the level its class earns: busy warns once through
|
|
5
|
+
* noteStoreBusy, absent is debug with no stack, unexpected warns once with the error class and stack. */
|
|
6
|
+
export declare function noteLedgerRowSkipped<E>(error: E): void;
|
|
3
7
|
/** Stores one delivery event and returns its id, or null when the write failed. */
|
|
4
8
|
export type DeliveryWrite = (input: DeliveryEventInput) => number | null;
|
|
5
9
|
/** The token rows of one turn and the delivery event that follows them. */
|
|
@@ -14,4 +18,9 @@ export interface LedgerTurn {
|
|
|
14
18
|
export declare function recordLedgerTurn(hippoRoot: string, turn: LedgerTurn): void;
|
|
15
19
|
/** What the session last sent on `surface`, or null, as lastSentState reads it. */
|
|
16
20
|
export declare function lastSentOnSurface(hippoRoot: string, tenantId: string, sessionId: string | null | undefined, surface: TokenSurface): LastSent | null;
|
|
21
|
+
/** The session's pilot arm: `write` books it as ensurePilotArm does, else the stored arm or the hash arm. */
|
|
22
|
+
export declare function pilotArmOnRoot(hippoRoot: string, tenantId: string, sessionId: string, rateBp: number, opts: {
|
|
23
|
+
write: boolean;
|
|
24
|
+
ownTenantOnly?: boolean;
|
|
25
|
+
}): PilotArm;
|
|
17
26
|
//# sourceMappingURL=ledger-turn.d.ts.map
|
|
@@ -1,6 +1,37 @@
|
|
|
1
|
+
// One hook or context turn's token-ledger work by store root: each call opens hippo.db, runs on one connection and closes it.
|
|
2
|
+
import { isSqliteBusy, noteStoreBusy } from '../db/index.js';
|
|
3
|
+
import { errorFields, errorMessage, log } from '../util/log.js';
|
|
1
4
|
import { lastSentState, recordTokenUse } from './token-ledger.js';
|
|
2
5
|
import { onHandle } from './open.js';
|
|
6
|
+
import { ensurePilotArm, hashArm, readPilotArm } from './pilot-arm.js';
|
|
3
7
|
import { writeDeliveryEventOnHandle } from './recall-trace.js';
|
|
8
|
+
// SQLite's result codes for a hippo.db it cannot read: a corrupt image, and a file that is no database.
|
|
9
|
+
const SQLITE_CORRUPT = 11;
|
|
10
|
+
const SQLITE_NOTADB = 26;
|
|
11
|
+
/** The one rule for a skipped ledger row. `absent` is a store with no token_ledger table or a hippo.db
|
|
12
|
+
* SQLite cannot read; the command that owns the store reports that, and a hook must stay quiet about it. */
|
|
13
|
+
function ledgerSkipClass(error) {
|
|
14
|
+
if (isSqliteBusy(error))
|
|
15
|
+
return 'busy';
|
|
16
|
+
const code = error instanceof Error && 'errcode' in error ? error.errcode : undefined;
|
|
17
|
+
if (code === SQLITE_CORRUPT || code === SQLITE_NOTADB)
|
|
18
|
+
return 'absent';
|
|
19
|
+
return errorMessage(error).includes('no such table: token_ledger') ? 'absent' : 'unexpected';
|
|
20
|
+
}
|
|
21
|
+
/** Says why a ledger row did not land, at the level its class earns: busy warns once through
|
|
22
|
+
* noteStoreBusy, absent is debug with no stack, unexpected warns once with the error class and stack. */
|
|
23
|
+
export function noteLedgerRowSkipped(error) {
|
|
24
|
+
const skip = ledgerSkipClass(error);
|
|
25
|
+
if (skip === 'busy') {
|
|
26
|
+
noteStoreBusy('token ledger row skipped');
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const message = `token ledger row skipped: ${errorMessage(error)}`;
|
|
30
|
+
if (skip === 'absent')
|
|
31
|
+
log.debug(message);
|
|
32
|
+
else
|
|
33
|
+
log.warnThenDebug('token-ledger-row', message, errorFields(error));
|
|
34
|
+
}
|
|
4
35
|
/** Books a turn's token rows, then its delivery event, on one connection. */
|
|
5
36
|
export function recordLedgerTurn(hippoRoot, turn) {
|
|
6
37
|
const { onRowError } = turn;
|
|
@@ -24,4 +55,11 @@ export function recordLedgerTurn(hippoRoot, turn) {
|
|
|
24
55
|
export function lastSentOnSurface(hippoRoot, tenantId, sessionId, surface) {
|
|
25
56
|
return onHandle(hippoRoot, (db) => lastSentState(db, tenantId, sessionId, surface));
|
|
26
57
|
}
|
|
58
|
+
/** The session's pilot arm: `write` books it as ensurePilotArm does, else the stored arm or the hash arm. */
|
|
59
|
+
export function pilotArmOnRoot(hippoRoot, tenantId, sessionId, rateBp, opts) {
|
|
60
|
+
const { ownTenantOnly } = opts;
|
|
61
|
+
return onHandle(hippoRoot, (db) => opts.write
|
|
62
|
+
? ensurePilotArm(db, tenantId, sessionId, rateBp, { ownTenantOnly })
|
|
63
|
+
: readPilotArm(db, sessionId, ownTenantOnly ? tenantId : undefined) ?? hashArm(sessionId, rateBp));
|
|
64
|
+
}
|
|
27
65
|
//# sourceMappingURL=ledger-turn.js.map
|
package/dist/store/mirrors.d.ts
CHANGED
|
@@ -9,12 +9,8 @@ export declare function removeActiveTaskMirror(hippoRoot: string, tenantId: stri
|
|
|
9
9
|
export declare function writeRecentSessionMirror(hippoRoot: string, tenantId: string, events: SessionEvent[]): void;
|
|
10
10
|
export declare function writeMarkdownMirror(hippoRoot: string, entry: MemoryEntry): void;
|
|
11
11
|
export declare function removeEntryMirrors(hippoRoot: string, id: string): void;
|
|
12
|
-
/**
|
|
13
|
-
*
|
|
14
|
-
* scans `raw_archive`, so a non-raw id's second failure logs the leftover path(s) to delete by hand.
|
|
15
|
-
*
|
|
16
|
-
* Returns true if the mirror ended up purged (first or second attempt).
|
|
17
|
-
*/
|
|
12
|
+
/** Best-effort mirror purge: retries the unlink once (most failures are transient locks); the reaper only scans `raw_archive`,
|
|
13
|
+
* so a non-raw id's second failure logs the leftover path(s) to delete by hand. Returns true if the mirror ended up purged. */
|
|
18
14
|
export declare function purgeMirrorBestEffort(hippoRoot: string, id: string, isRaw: boolean, logPrefix: string): boolean;
|
|
19
15
|
/** Derive the current `HippoIndex` from SQLite. Exported for `rebuildIndex`
|
|
20
16
|
* (the only index.json writer) and the longmemeval benchmark. */
|
package/dist/store/mirrors.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
|
+
import { DEFAULT_TENANT_ID } from '../util/env.js';
|
|
1
2
|
import * as fs from 'fs';
|
|
2
3
|
import * as path from 'path';
|
|
3
4
|
import { Layer } from '../core/memory.js';
|
|
4
|
-
import { dumpFrontmatter } from '
|
|
5
|
-
import { getMeta } from '../db/index.js';
|
|
5
|
+
import { dumpFrontmatter } from '../util/yaml.js';
|
|
6
|
+
import { getMeta, CONSOLIDATION_RUNS_KEPT } from '../db/index.js';
|
|
6
7
|
import { oncePerStore } from '../db/connect.js';
|
|
7
|
-
import { errorMessage, log } from '../util/log.js';
|
|
8
|
+
import { errorFields, errorMessage, log } from '../util/log.js';
|
|
8
9
|
import { parseJsonArray, INDEX_VERSION, parseLastTraceId, MEMORY_SELECT_COLUMNS, rowToEntry, rowToMemoryConflict, } from './rows.js';
|
|
9
|
-
import { serializeEntry } from '
|
|
10
|
+
import { serializeEntry } from '../core/markdown.js';
|
|
10
11
|
const SCORE_DECIMALS = 3;
|
|
11
12
|
export function layerDir(root, layer) {
|
|
12
13
|
return path.join(root, layer);
|
|
@@ -21,16 +22,14 @@ export function ensureMirrorDirectories(hippoRoot) {
|
|
|
21
22
|
}
|
|
22
23
|
});
|
|
23
24
|
}
|
|
24
|
-
// Tenant-scoped mirror
|
|
25
|
-
//
|
|
26
|
-
// on-disk back-compat; multi-tenant deployments get a `.<tenantId>` suffix
|
|
27
|
-
// so tenant B saving cannot overwrite tenant A's mirror file.
|
|
25
|
+
// Tenant-scoped mirror paths: the 'default' tenant keeps the original `active-task.md` / `recent-session.md` names;
|
|
26
|
+
// other tenants get a `.<tenantId>` suffix so one cannot overwrite another's mirror.
|
|
28
27
|
function activeTaskMirrorPath(hippoRoot, tenantId) {
|
|
29
|
-
const file = tenantId ===
|
|
28
|
+
const file = tenantId === DEFAULT_TENANT_ID ? 'active-task.md' : `active-task.${tenantId}.md`;
|
|
30
29
|
return path.join(hippoRoot, 'buffer', file);
|
|
31
30
|
}
|
|
32
31
|
function recentSessionMirrorPath(hippoRoot, tenantId) {
|
|
33
|
-
const file = tenantId ===
|
|
32
|
+
const file = tenantId === DEFAULT_TENANT_ID ? 'recent-session.md' : `recent-session.${tenantId}.md`;
|
|
34
33
|
return path.join(hippoRoot, 'buffer', file);
|
|
35
34
|
}
|
|
36
35
|
export function writeActiveTaskMirror(hippoRoot, tenantId, snapshot) {
|
|
@@ -155,22 +154,15 @@ export function removeEntryMirrors(hippoRoot, id) {
|
|
|
155
154
|
}
|
|
156
155
|
}
|
|
157
156
|
}
|
|
158
|
-
/**
|
|
159
|
-
* Mirror paths for `id` still on disk, walked like `removeEntryMirrors`, so a failed purge
|
|
160
|
-
* with no reaper to retry it can name the stuck file.
|
|
161
|
-
*/
|
|
157
|
+
/** Mirror paths for `id` still on disk, walked like `removeEntryMirrors`, so a failed purge with no reaper to retry it can name the stuck file. */
|
|
162
158
|
function getExistingEntryMirrorPaths(hippoRoot, id) {
|
|
163
159
|
// Layer list kept in lockstep with removeEntryMirrors.
|
|
164
160
|
return [Layer.Buffer, Layer.Episodic, Layer.Semantic, Layer.Trace]
|
|
165
161
|
.map((layer) => path.join(layerDir(hippoRoot, layer), `${id}.md`))
|
|
166
162
|
.filter((file) => fs.existsSync(file));
|
|
167
163
|
}
|
|
168
|
-
/**
|
|
169
|
-
*
|
|
170
|
-
* scans `raw_archive`, so a non-raw id's second failure logs the leftover path(s) to delete by hand.
|
|
171
|
-
*
|
|
172
|
-
* Returns true if the mirror ended up purged (first or second attempt).
|
|
173
|
-
*/
|
|
164
|
+
/** Best-effort mirror purge: retries the unlink once (most failures are transient locks); the reaper only scans `raw_archive`,
|
|
165
|
+
* so a non-raw id's second failure logs the leftover path(s) to delete by hand. Returns true if the mirror ended up purged. */
|
|
174
166
|
export function purgeMirrorBestEffort(hippoRoot, id, isRaw, logPrefix) {
|
|
175
167
|
try {
|
|
176
168
|
removeEntryMirrors(hippoRoot, id);
|
|
@@ -184,13 +176,13 @@ export function purgeMirrorBestEffort(hippoRoot, id, isRaw, logPrefix) {
|
|
|
184
176
|
catch (secondErr) {
|
|
185
177
|
const msg = errorMessage(secondErr);
|
|
186
178
|
if (isRaw) {
|
|
187
|
-
log.error(`${logPrefix}: mirror cleanup failed for ${id} (will retry via reaper on next open): ${msg}
|
|
179
|
+
log.error(`${logPrefix}: mirror cleanup failed for ${id} (will retry via reaper on next open): ${msg}`, errorFields(secondErr));
|
|
188
180
|
}
|
|
189
181
|
else {
|
|
190
182
|
const leftover = getExistingEntryMirrorPaths(hippoRoot, id);
|
|
191
183
|
const pathsNote = leftover.length > 0 ? leftover.join(', ') : `${id}.md (path unresolved)`;
|
|
192
184
|
log.error(`${logPrefix}: mirror cleanup failed for ${id} - no automatic retry exists for this file, ` +
|
|
193
|
-
`delete it manually: ${pathsNote} (${msg})
|
|
185
|
+
`delete it manually: ${pathsNote} (${msg})`, errorFields(secondErr));
|
|
194
186
|
}
|
|
195
187
|
return false;
|
|
196
188
|
}
|
|
@@ -211,7 +203,7 @@ export function buildIndexFromDb(db) {
|
|
|
211
203
|
file: path.join(layer, `${row.id}.md`),
|
|
212
204
|
layer,
|
|
213
205
|
strength: Number(row.strength ?? 0),
|
|
214
|
-
tags: parseJsonArray(row.tags_json),
|
|
206
|
+
tags: parseJsonArray(row.tags_json, { table: 'memories', id: row.id, column: 'tags_json' }),
|
|
215
207
|
created: row.created,
|
|
216
208
|
last_retrieved: row.last_retrieved,
|
|
217
209
|
pinned: Boolean(row.pinned),
|
|
@@ -221,19 +213,22 @@ export function buildIndexFromDb(db) {
|
|
|
221
213
|
}
|
|
222
214
|
/** The last recall's ids and its trace, the two meta keys saveIndex writes together. */
|
|
223
215
|
export function readLastRecall(db) {
|
|
224
|
-
// Read both lockstep keys in ONE statement: two autocommit SELECTs could straddle a concurrent
|
|
225
|
-
// saveIndex and hand back a mismatched last_retrieval_ids / last_trace_id pair.
|
|
216
|
+
// Read both lockstep keys in ONE statement: two autocommit SELECTs could straddle a concurrent saveIndex and return a mismatched pair.
|
|
226
217
|
// SAFETY: lockstepRows' shape matches the key/value columns named above.
|
|
227
218
|
const lockstepRows = db.prepare(`SELECT key, value FROM meta WHERE key IN ('last_retrieval_ids', 'last_trace_id')`).all();
|
|
228
219
|
const lockstep = new Map(lockstepRows.map((r) => [r.key, r.value]));
|
|
229
220
|
return {
|
|
230
|
-
last_retrieval_ids: parseJsonArray(lockstep.get('last_retrieval_ids') ?? '[]'),
|
|
221
|
+
last_retrieval_ids: parseJsonArray(lockstep.get('last_retrieval_ids') ?? '[]', { table: 'meta', id: 'last_retrieval_ids', column: 'value' }),
|
|
231
222
|
last_trace_id: parseLastTraceId(lockstep.get('last_trace_id') ?? ''),
|
|
232
223
|
};
|
|
233
224
|
}
|
|
234
225
|
export function buildStatsFromDb(db) {
|
|
235
|
-
// SAFETY: runs' shape matches the four columns named in the SELECT
|
|
236
|
-
const runs = db.prepare(`
|
|
226
|
+
// SAFETY: runs' shape matches the four columns named in the SELECT below.
|
|
227
|
+
const runs = db.prepare(`
|
|
228
|
+
SELECT timestamp, decayed, merged, removed FROM (
|
|
229
|
+
SELECT id, timestamp, decayed, merged, removed FROM consolidation_runs ORDER BY timestamp DESC, id DESC LIMIT ?
|
|
230
|
+
) ORDER BY timestamp ASC, id ASC
|
|
231
|
+
`).all(CONSOLIDATION_RUNS_KEPT);
|
|
237
232
|
return {
|
|
238
233
|
total_remembered: Number(getMeta(db, 'total_remembered', '0')),
|
|
239
234
|
total_recalled: Number(getMeta(db, 'total_recalled', '0')),
|
|
@@ -249,7 +244,7 @@ export function buildStatsFromDb(db) {
|
|
|
249
244
|
/** Write the `index.json` mirror file for an already-derived index. Exported for
|
|
250
245
|
* `rebuildIndex` (the only index.json writer) and the longmemeval benchmark. */
|
|
251
246
|
export function writeIndexMirror(hippoRoot, index) {
|
|
252
|
-
mirrorBestEffort('index.json', () =>
|
|
247
|
+
mirrorBestEffort('index.json', () => overwriteInPlace(path.join(hippoRoot, 'index.json'), JSON.stringify(index, null, 2)));
|
|
253
248
|
}
|
|
254
249
|
export function writeStatsMirror(hippoRoot, stats) {
|
|
255
250
|
mirrorBestEffort('stats.json', () => overwriteInPlace(path.join(hippoRoot, 'stats.json'), JSON.stringify(stats, null, 2)));
|