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/summaries.js
CHANGED
|
@@ -1,77 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { withWriteScope } from '../db/index.js';
|
|
2
2
|
import { assertTenantId } from './tenant.js';
|
|
3
3
|
import { findRejectedValue, rejectionDigest } from './rejection.js';
|
|
4
4
|
import { log } from '../util/log.js';
|
|
5
5
|
import { MEMORY_SELECT_COLUMNS, rowToEntry } from './rows.js';
|
|
6
6
|
import { audit } from './audit-event.js';
|
|
7
7
|
import { syncFtsRow } from './entry-row.js';
|
|
8
|
-
import { openStore } from './open.js';
|
|
8
|
+
import { onHandle, openStore } from './open.js';
|
|
9
9
|
import { DIGEST_DISPLAY_CHARS } from '../util/token-text.js';
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Mark a summary as dirty. Idempotent (re-marking dirty is a no-op + no
|
|
16
|
-
* second audit row). Tenant-scoped to prevent cross-tenant writes via
|
|
17
|
-
* parent-lookup. Called from invalidation.ts / writeEntry /
|
|
18
|
-
* forgetMemory / archiveRawMemory whenever a child is invalidated,
|
|
19
|
-
* superseded, forgotten, or archived.
|
|
20
|
-
*
|
|
21
|
-
* Quietly no-ops if the target row doesn't exist or isn't a level-2/3
|
|
22
|
-
* summary. Emits a 'summary_marked_dirty' audit row on actual
|
|
23
|
-
* state transitions (0 -> 1) via the audit() helper, which try/catches
|
|
24
|
-
* for missing audit_log (the v27 self-heal scenario).
|
|
25
|
-
*/
|
|
26
|
-
export function markSummaryDirty(hippoRoot, summaryId, tenantId, actor = 'cli') {
|
|
27
|
-
assertTenantId('markSummaryDirty', tenantId);
|
|
28
|
-
const db = openStore(hippoRoot);
|
|
29
|
-
try {
|
|
30
|
-
// RETURNING dag_level reads the actual level in the same round trip.
|
|
31
|
-
// SAFETY: result's shape matches the single `dag_level` column returned
|
|
32
|
-
// above.
|
|
33
|
-
const result = db.prepare(`
|
|
34
|
-
UPDATE memories
|
|
35
|
-
SET summary_dirty = 1
|
|
36
|
-
WHERE id = ?
|
|
37
|
-
AND tenant_id = ?
|
|
38
|
-
AND dag_level IN (2, 3)
|
|
39
|
-
AND summary_dirty = 0
|
|
40
|
-
AND kind != 'archived'
|
|
41
|
-
RETURNING dag_level
|
|
42
|
-
`).get(summaryId, tenantId);
|
|
43
|
-
if (result) {
|
|
44
|
-
// audit() wraps appendAuditEvent in try/catch (v27 heal scenario).
|
|
45
|
-
// metadata.source tells this dirty-mark apart from the other wiring layers' marks.
|
|
46
|
-
audit(db, 'summary_marked_dirty', { targetId: summaryId, metadata: { dag_level: result.dag_level, source: 'E1' }, actor, tenantId });
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
finally {
|
|
50
|
-
closeHippoDb(db);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
// ---------------------------------------------------------------------------
|
|
54
|
-
// Sleep-cycle rebuild surface.
|
|
55
|
-
//
|
|
56
|
-
// loadAllDirtySummaries / loadChildrenOfSummary / applyRebuildResult /
|
|
57
|
-
// clearSummaryDirtyAfterBuild live HERE (not in dag.ts) because they need
|
|
58
|
-
// module-private MEMORY_SELECT_COLUMNS, MemoryRow, rowToEntry, audit,
|
|
59
|
-
// syncFtsRow, assertTenantId. dag.ts owns only the thin orchestrator
|
|
60
|
-
// rebuildDirtySummaries() that calls into these.
|
|
61
|
-
// ---------------------------------------------------------------------------
|
|
62
|
-
/**
|
|
63
|
-
* Host-wide loader for L2 topic summaries without an L3 parent.
|
|
64
|
-
* Used by consolidate phase 1.9 (buildEntityProfiles) to cluster L2s into
|
|
65
|
-
* L3 entity profiles. Mirrors loadAllDirtySummaries: SQL-level
|
|
66
|
-
* filter is cheaper than reusing in-memory `survivors` (which doesn't
|
|
67
|
-
* contain L2s freshly created by phase 1.7 buildDag).
|
|
68
|
-
*
|
|
69
|
-
* Returns entries with tenantId attached so per-cluster writes stay
|
|
70
|
-
* tenant-scoped via summary.tenantId.
|
|
71
|
-
*/
|
|
10
|
+
// Sleep-cycle rebuild surface: lives here, not in src/consolidate/dag.ts, because it needs module-private MEMORY_SELECT_COLUMNS, MemoryRow, rowToEntry,
|
|
11
|
+
// audit, syncFtsRow and assertTenantId. dag.ts keeps only the thin orchestrator rebuildDirtySummaries().
|
|
12
|
+
/** Host-wide loader for L2 topic summaries without an L3 parent, for consolidate phase 1.9 (buildEntityProfiles); SQL-level filter, since in-memory
|
|
13
|
+
* `survivors` lacks L2s created by phase 1.7. Entries carry tenantId so per-cluster writes stay tenant-scoped. */
|
|
72
14
|
export function loadAllL2Summaries(hippoRoot) {
|
|
73
|
-
|
|
74
|
-
try {
|
|
15
|
+
return onHandle(hippoRoot, (db) => {
|
|
75
16
|
// SAFETY: this query selects exactly MEMORY_SELECT_COLUMNS, matching
|
|
76
17
|
// MemoryRow's field set.
|
|
77
18
|
const rows = db.prepare(`
|
|
@@ -84,23 +25,12 @@ export function loadAllL2Summaries(hippoRoot) {
|
|
|
84
25
|
ORDER BY created ASC, id ASC
|
|
85
26
|
`).all();
|
|
86
27
|
return rows.map(rowToEntry);
|
|
87
|
-
}
|
|
88
|
-
finally {
|
|
89
|
-
closeHippoDb(db);
|
|
90
|
-
}
|
|
28
|
+
}, openStore);
|
|
91
29
|
}
|
|
92
|
-
/**
|
|
93
|
-
*
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
* rowToEntry), so per-summary children + rebuild UPDATE stay tenant-scoped.
|
|
97
|
-
*
|
|
98
|
-
* Sort: latest_at DESC NULLS LAST, id ASC — same as per-tenant variant so
|
|
99
|
-
* HIPPO_DAG_REBUILD_CAP takes most-recently-changed summaries first.
|
|
100
|
-
*/
|
|
101
|
-
export function loadAllDirtySummaries(hippoRoot) {
|
|
102
|
-
const db = openStore(hippoRoot);
|
|
103
|
-
try {
|
|
30
|
+
/** Dirty summaries across all tenants, newest change first (latest_at DESC NULLS LAST, id ASC), at most `limit` (all when omitted)
|
|
31
|
+
* so HIPPO_DAG_REBUILD_CAP reads only the most recently changed. Each entry carries its tenantId so later writes stay tenant-scoped. */
|
|
32
|
+
export function loadAllDirtySummaries(hippoRoot, limit) {
|
|
33
|
+
return onHandle(hippoRoot, (db) => {
|
|
104
34
|
// SAFETY: this query selects exactly MEMORY_SELECT_COLUMNS, matching
|
|
105
35
|
// MemoryRow's field set.
|
|
106
36
|
const rows = db.prepare(`
|
|
@@ -109,24 +39,15 @@ export function loadAllDirtySummaries(hippoRoot) {
|
|
|
109
39
|
WHERE summary_dirty = 1
|
|
110
40
|
AND kind != 'archived'
|
|
111
41
|
ORDER BY latest_at DESC NULLS LAST, id ASC
|
|
112
|
-
|
|
42
|
+
LIMIT ?
|
|
43
|
+
`).all(limit ?? -1);
|
|
113
44
|
return rows.map(rowToEntry);
|
|
114
|
-
}
|
|
115
|
-
finally {
|
|
116
|
-
closeHippoDb(db);
|
|
117
|
-
}
|
|
45
|
+
}, openStore);
|
|
118
46
|
}
|
|
119
|
-
/**
|
|
120
|
-
* Load live children of a DAG summary. Used by
|
|
121
|
-
* rebuildDirtySummaries to regenerate content from the CURRENT child set
|
|
122
|
-
* (not the children at create-time). Skips archived. Tenant-scoped
|
|
123
|
-
* (defence in depth — dag_parent_id is unique-ish but tenant guard is
|
|
124
|
-
* cheap). created column is TEXT NOT NULL since db.ts schema v1.
|
|
125
|
-
*/
|
|
47
|
+
/** Live (non-archived) children of a DAG summary, so a rebuild regenerates from the CURRENT child set; tenant-scoped as defence in depth. */
|
|
126
48
|
export function loadChildrenOfSummary(hippoRoot, summaryId, tenantId) {
|
|
127
49
|
assertTenantId('loadChildrenOfSummary', tenantId);
|
|
128
|
-
|
|
129
|
-
try {
|
|
50
|
+
return onHandle(hippoRoot, (db) => {
|
|
130
51
|
// SAFETY: this query selects exactly MEMORY_SELECT_COLUMNS, matching
|
|
131
52
|
// MemoryRow's field set.
|
|
132
53
|
const rows = db.prepare(`
|
|
@@ -139,32 +60,15 @@ export function loadChildrenOfSummary(hippoRoot, summaryId, tenantId) {
|
|
|
139
60
|
ORDER BY created ASC
|
|
140
61
|
`).all(summaryId, tenantId);
|
|
141
62
|
return rows.map(rowToEntry);
|
|
142
|
-
}
|
|
143
|
-
finally {
|
|
144
|
-
closeHippoDb(db);
|
|
145
|
-
}
|
|
63
|
+
}, openStore);
|
|
146
64
|
}
|
|
147
|
-
/**
|
|
148
|
-
*
|
|
149
|
-
* prepared UPDATE statement plus syncFtsRow inside one write scope.
|
|
150
|
-
* WHERE includes `AND summary_dirty = 1` so concurrent sleep's race-loser
|
|
151
|
-
* becomes a no-op (no rebuild_count bump, no audit row).
|
|
152
|
-
*
|
|
153
|
-
* Returns `{ changed, refused }`. `changed` is true when this call's UPDATE
|
|
154
|
-
* (content or metadata-only) affected a row; false on race-loss / unknown id
|
|
155
|
-
* / archived / wrong dag_level. `refused` is true only when a tombstone hit
|
|
156
|
-
* suppressed the content write AND the metadata UPDATE still landed — see
|
|
157
|
-
* the return-semantics comment below for the full contract.
|
|
158
|
-
*/
|
|
65
|
+
/** Apply a rebuild result to a dirty summary in one write scope (UPDATE plus syncFtsRow); `AND summary_dirty = 1` makes a concurrent race-loser a no-op.
|
|
66
|
+
* Returns `{ changed, refused }`: `refused` only when a tombstone hit suppressed the content write while the metadata UPDATE still landed. */
|
|
159
67
|
export function applyRebuildResult(hippoRoot, summary, patch) {
|
|
160
68
|
assertTenantId('applyRebuildResult', summary.tenantId);
|
|
161
|
-
|
|
162
|
-
try {
|
|
69
|
+
return onHandle(hippoRoot, (db) => {
|
|
163
70
|
return withWriteScope(db, 'rebuild_summary', () => applyRebuildInSavepoint(db, summary, patch));
|
|
164
|
-
}
|
|
165
|
-
finally {
|
|
166
|
-
closeHippoDb(db);
|
|
167
|
-
}
|
|
71
|
+
}, openStore);
|
|
168
72
|
}
|
|
169
73
|
// ONE prepared UPDATE per branch. Test #8 inspects the SQL string.
|
|
170
74
|
const REBUILD_CONTENT_SQL = `UPDATE memories
|
|
@@ -197,13 +101,8 @@ function applyRebuildInSavepoint(db, summary, patch) {
|
|
|
197
101
|
const tombstone = patch.bumpRebuildCount
|
|
198
102
|
? findRejectedValue(db, summary.tenantId, rejectionDigest(patch.content))
|
|
199
103
|
: null;
|
|
200
|
-
// On a hit
|
|
201
|
-
//
|
|
202
|
-
// descendant_count/earliest_at/latest_at update + summary_dirty
|
|
203
|
-
// cleared, no content write, no rebuild_count bump. Clearing dirty
|
|
204
|
-
// (rather than leaving it set) is deliberate: leaving it dirty would
|
|
205
|
-
// make every following sleep cycle re-attempt and re-refuse the
|
|
206
|
-
// identical rebuild forever (the DAG-loop this fix closes).
|
|
104
|
+
// On a tombstone hit, write no content: take the zero-child metadata-only path (descendant_count/earliest_at/latest_at, summary_dirty cleared, no
|
|
105
|
+
// rebuild_count bump). Clearing dirty is deliberate: leaving it set would make every later sleep re-attempt and re-refuse the same rebuild forever.
|
|
207
106
|
const applyContentWrite = patch.bumpRebuildCount && !tombstone;
|
|
208
107
|
const result = applyContentWrite
|
|
209
108
|
? db.prepare(REBUILD_CONTENT_SQL).run(patch.content, patch.descendant_count, patch.earliest_at, patch.latest_at, nowIso, summary.id, summary.tenantId)
|
|
@@ -220,14 +119,14 @@ function applyRebuildInSavepoint(db, summary, patch) {
|
|
|
220
119
|
}
|
|
221
120
|
/** Audit and log a rebuild whose content matched a rejected value; metadata still landed. */
|
|
222
121
|
function auditRefusedRebuild(db, summary, patch, tombstone) {
|
|
223
|
-
// refused === true here (
|
|
224
|
-
//
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
122
|
+
// refused === true here (narrowed for the tombstone.* access). Best-effort refusal audit written INLINE in this still-open SAVEPOINT (the metadata
|
|
123
|
+
// UPDATE already committed to it), so a direct audit() call is correct, not the post-rollback auditRejectionRefusal.
|
|
124
|
+
audit(db, 'reject_refusal', {
|
|
125
|
+
targetId: summary.id,
|
|
126
|
+
metadata: { digest: tombstone.digest, reason: tombstone.reason },
|
|
127
|
+
actor: patch.actor,
|
|
128
|
+
tenantId: summary.tenantId
|
|
129
|
+
});
|
|
231
130
|
log.warn(`applyRebuildResult: refused rebuild content for ${summary.id} — matches a rejected value ` +
|
|
232
131
|
`(digest ${tombstone.digest.slice(0, DIGEST_DISPLAY_CHARS)}...); metadata updated, content unchanged`);
|
|
233
132
|
}
|
|
@@ -255,20 +154,13 @@ function syncRebuiltSummary(db, summary, patch, applyContentWrite, nowIso) {
|
|
|
255
154
|
descendant_count: patch.descendant_count,
|
|
256
155
|
}, actor: patch.actor, tenantId: summary.tenantId });
|
|
257
156
|
}
|
|
258
|
-
/**
|
|
259
|
-
*
|
|
260
|
-
* each member's writeEntry marks the new parent dirty, so the same cycle's rebuild would redo every new summary.
|
|
261
|
-
*
|
|
262
|
-
* Idempotent: no-op + no audit if summary isn't dirty. Audit
|
|
263
|
-
* source='buildDag-clean' distinguishes it from the rebuild's source.
|
|
264
|
-
*/
|
|
157
|
+
/** Clear summary_dirty on a new summary after buildDag's child-link loop (each member's writeEntry marks the parent dirty, so the same cycle would rebuild it).
|
|
158
|
+
* Idempotent (no-op, no audit if not dirty); audit source='buildDag-clean' distinguishes it from the rebuild's. */
|
|
265
159
|
export function clearSummaryDirtyAfterBuild(hippoRoot, summaryId, tenantId, actor = 'cli', source = 'buildDag-clean') {
|
|
266
160
|
assertTenantId('clearSummaryDirtyAfterBuild', tenantId);
|
|
267
|
-
|
|
268
|
-
try {
|
|
161
|
+
onHandle(hippoRoot, (db) => {
|
|
269
162
|
// RETURNING dag_level reads the actual level so audit metadata stays accurate without an extra SELECT.
|
|
270
|
-
// SAFETY: result's shape matches the single `dag_level` column returned
|
|
271
|
-
// below.
|
|
163
|
+
// SAFETY: result's shape matches the single `dag_level` column returned below.
|
|
272
164
|
const result = db.prepare(`
|
|
273
165
|
UPDATE memories
|
|
274
166
|
SET summary_dirty = 0
|
|
@@ -283,9 +175,6 @@ export function clearSummaryDirtyAfterBuild(hippoRoot, summaryId, tenantId, acto
|
|
|
283
175
|
// source tells buildDag-clean (L2) from buildEntityProfiles-clean (L3) and any future build path.
|
|
284
176
|
audit(db, 'summary_marked_clean', { targetId: summaryId, metadata: { dag_level: result.dag_level, source }, actor, tenantId });
|
|
285
177
|
}
|
|
286
|
-
}
|
|
287
|
-
finally {
|
|
288
|
-
closeHippoDb(db);
|
|
289
|
-
}
|
|
178
|
+
}, openStore);
|
|
290
179
|
}
|
|
291
180
|
//# sourceMappingURL=summaries.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Leaf module so
|
|
1
|
+
// Leaf module so entry-writes.ts and raw-archive.ts can both mark a parent summary dirty without importing each other.
|
|
2
2
|
import { appendAuditEvent, reportAuditWriteFailure } from './audit.js';
|
|
3
3
|
/** Runs in the caller's transaction so the mark commits or rolls back with the child change; only a 0 to 1 flip is audited. */
|
|
4
4
|
export function markSummaryDirtyInTx(db, summaryId, tenantId, actor) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type DatabaseSyncLike } from '../db/index.js';
|
|
2
2
|
/** The api_keys fields a tenant, revocation, rank or self-service ownership check reads. */
|
|
3
3
|
export interface ApiKeyOwner {
|
|
4
4
|
tenantId: string;
|
|
@@ -13,4 +13,9 @@ export declare function selectMemoryReach(db: DatabaseSyncLike, id: string): {
|
|
|
13
13
|
tenantId: string;
|
|
14
14
|
scope: string | null;
|
|
15
15
|
} | undefined;
|
|
16
|
+
/** `selectMemoryReach` for the store under `hippoRoot`, with no mirror setup and no full row read. */
|
|
17
|
+
export declare function memoryReach(hippoRoot: string, id: string): {
|
|
18
|
+
tenantId: string;
|
|
19
|
+
scope: string | null;
|
|
20
|
+
} | undefined;
|
|
16
21
|
//# sourceMappingURL=tenant-lookup.d.ts.map
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
// Owner lookups by id: the tenant and scope checks in src/api and the CLI's key-tenant lookup share these queries.
|
|
2
|
+
import { onHandle } from './open.js';
|
|
2
3
|
/** The owner row of `keyId`, or undefined when no such key exists. */
|
|
3
4
|
export function selectApiKeyOwner(db, keyId) {
|
|
4
5
|
// SAFETY: row's shape matches the four columns named in the SELECT.
|
|
@@ -13,4 +14,10 @@ export function selectMemoryReach(db, id) {
|
|
|
13
14
|
const row = db.prepare(`SELECT tenant_id, scope FROM memories WHERE id = ?`).get(id);
|
|
14
15
|
return row && { tenantId: row.tenant_id, scope: row.scope };
|
|
15
16
|
}
|
|
17
|
+
/** `selectMemoryReach` for the store under `hippoRoot`, with no mirror setup and no full row read. */
|
|
18
|
+
export function memoryReach(hippoRoot, id) {
|
|
19
|
+
return onHandle(hippoRoot, (db) => {
|
|
20
|
+
return selectMemoryReach(db, id);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
16
23
|
//# sourceMappingURL=tenant-lookup.js.map
|
package/dist/store/tenant.d.ts
CHANGED
|
@@ -5,21 +5,7 @@ export interface ResolveOpts {
|
|
|
5
5
|
apiKey?: string;
|
|
6
6
|
}
|
|
7
7
|
export declare function resolveTenantId(opts: ResolveOpts): string;
|
|
8
|
-
/**
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* The continuity helpers (saveActiveTaskSnapshot, listSessionEvents, etc.)
|
|
12
|
-
* gained a required `tenantId` parameter (schema v22) to close a
|
|
13
|
-
* cross-tenant data leak. TypeScript catches misbinding at compile time, but
|
|
14
|
-
* JavaScript callers from older versions can silently pass a `sessionId`
|
|
15
|
-
* where `tenantId` is now expected, e.g.
|
|
16
|
-
* loadLatestHandoff(root, 'sess-abc') // WRONG: 'sess-abc' becomes the tenant
|
|
17
|
-
* which would silently filter to a non-existent tenant and return null with
|
|
18
|
-
* no error. This guard rejects the most common shape of that mistake (any
|
|
19
|
-
* value beginning with the conventional `sess-` / `sess_` session prefix).
|
|
20
|
-
*
|
|
21
|
-
* False-positive cost: a tenant literally named `sess-...` will be rejected.
|
|
22
|
-
* Acceptable tradeoff for catching the silent-leak class.
|
|
23
|
-
*/
|
|
8
|
+
/** Runtime guard for tenant id args: an older JS caller can pass a `sessionId` as the tenant (`loadLatestHandoff(root, 'sess-abc')`) and silently get null.
|
|
9
|
+
* Rejects values starting `sess-` / `sess_`; a tenant literally named `sess-...` is refused, an accepted tradeoff. */
|
|
24
10
|
export declare function assertTenantId(fnName: string, value: JsonValue): asserts value is string;
|
|
25
11
|
//# sourceMappingURL=tenant.d.ts.map
|
package/dist/store/tenant.js
CHANGED
|
@@ -9,27 +9,12 @@ export function resolveTenantId(opts) {
|
|
|
9
9
|
throw new Error('invalid api key');
|
|
10
10
|
return ctx.tenantId;
|
|
11
11
|
}
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
// literal empty string and broke every downstream tenant filter.
|
|
12
|
+
// Empty/whitespace-only HIPPO_TENANT must fall through to 'default': `??` only catches undefined, so '' leaked through and broke every downstream tenant
|
|
13
|
+
// filter.
|
|
15
14
|
return envTenant();
|
|
16
15
|
}
|
|
17
|
-
/**
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* The continuity helpers (saveActiveTaskSnapshot, listSessionEvents, etc.)
|
|
21
|
-
* gained a required `tenantId` parameter (schema v22) to close a
|
|
22
|
-
* cross-tenant data leak. TypeScript catches misbinding at compile time, but
|
|
23
|
-
* JavaScript callers from older versions can silently pass a `sessionId`
|
|
24
|
-
* where `tenantId` is now expected, e.g.
|
|
25
|
-
* loadLatestHandoff(root, 'sess-abc') // WRONG: 'sess-abc' becomes the tenant
|
|
26
|
-
* which would silently filter to a non-existent tenant and return null with
|
|
27
|
-
* no error. This guard rejects the most common shape of that mistake (any
|
|
28
|
-
* value beginning with the conventional `sess-` / `sess_` session prefix).
|
|
29
|
-
*
|
|
30
|
-
* False-positive cost: a tenant literally named `sess-...` will be rejected.
|
|
31
|
-
* Acceptable tradeoff for catching the silent-leak class.
|
|
32
|
-
*/
|
|
16
|
+
/** Runtime guard for tenant id args: an older JS caller can pass a `sessionId` as the tenant (`loadLatestHandoff(root, 'sess-abc')`) and silently get null.
|
|
17
|
+
* Rejects values starting `sess-` / `sess_`; a tenant literally named `sess-...` is refused, an accepted tradeoff. */
|
|
33
18
|
export function assertTenantId(fnName, value) {
|
|
34
19
|
if (typeof value !== 'string' || value.length === 0) {
|
|
35
20
|
throw new Error(`${fnName}: tenantId is required (got ${typeof value})`);
|
|
@@ -1,27 +1,13 @@
|
|
|
1
1
|
import { type DatabaseSyncLike } from '../db/index.js';
|
|
2
|
-
/**
|
|
3
|
-
*
|
|
4
|
-
* - `hook`: the per-prompt `UserPromptSubmit` hook (`hippo context --pinned-only`).
|
|
5
|
-
* - `hook_recall`: the same hook's prompt-recall section.
|
|
6
|
-
* - `compact_resume`: the snapshot the SessionStart(compact) hook prints (`hippo compact-resume`).
|
|
7
|
-
* - `context`, `recall`: the CLI commands.
|
|
8
|
-
* - `mcp_recall`, `mcp_context`: the MCP tools.
|
|
9
|
-
* - `http_recall`, `http_context`, `http_assemble`: the HTTP API.
|
|
10
|
-
* - `pilot`: the session's pilot arm row (src/api/pilot-arm.ts); not a send, so it is in no surface list.
|
|
11
|
-
*/
|
|
2
|
+
/** Where a block was sent: `hook`/`hook_recall` (per-prompt hook), `compact_resume`, `context`/`recall` (CLI), `mcp_*`, `http_*`,
|
|
3
|
+
* and `pilot` (session pilot arm row, src/api/pilot-arm.ts; not a send, so in no surface list). */
|
|
12
4
|
export type TokenSurface = 'hook' | 'hook_recall' | 'compact_resume' | 'context' | 'recall' | 'mcp_recall' | 'mcp_context' | 'http_recall' | 'http_context' | 'http_assemble' | 'pilot';
|
|
13
5
|
/** All surfaces, in report order. */
|
|
14
6
|
export declare const TOKEN_SURFACES: readonly TokenSurface[];
|
|
15
7
|
/** Surfaces whose re-reads are counted: only a hook payload tells a sub-agent's block from its parent's, as both carry one session id. */
|
|
16
8
|
export declare const REREAD_SURFACES: readonly TokenSurface[];
|
|
17
|
-
/**
|
|
18
|
-
*
|
|
19
|
-
* - `inject`: sent to the agent.
|
|
20
|
-
* - `skip`: identical to the session's last injected block, so not sent again.
|
|
21
|
-
* - `reset`: the host compacted its context, so the next block must be sent.
|
|
22
|
-
* - `reread`: tokens later calls read again, booked at session end as one row per session, hook surface and UTC day of the calls.
|
|
23
|
-
* - `arm`: the pilot assignment; `block_hash` is `hippo` or `holdout`, `items` the holdout rate in basis points.
|
|
24
|
-
*/
|
|
9
|
+
/** What happened to a block: `inject` (sent), `skip` (identical to the last injected block), `reset` (host compacted, next must send), `reread` (tokens
|
|
10
|
+
* later calls read again, booked at session end), `arm` (pilot assignment; `block_hash` is `hippo` or `holdout`, `items` the holdout rate in bp). */
|
|
25
11
|
export type TokenEvent = 'inject' | 'skip' | 'reset' | 'reread' | 'arm';
|
|
26
12
|
/** Rows older than this are pruned on write. */
|
|
27
13
|
export declare const TOKEN_LEDGER_RETENTION_DAYS = 90;
|
|
@@ -41,9 +27,7 @@ export interface TokenUse {
|
|
|
41
27
|
/** Override the timestamp (tests). ISO string. */
|
|
42
28
|
now?: string;
|
|
43
29
|
}
|
|
44
|
-
/**
|
|
45
|
-
* Append one ledger row and prune rows past {@link TOKEN_LEDGER_RETENTION_DAYS}.
|
|
46
|
-
*/
|
|
30
|
+
/** Append one ledger row and prune rows past {@link TOKEN_LEDGER_RETENTION_DAYS}. */
|
|
47
31
|
export declare function recordTokenUse(db: DatabaseSyncLike, use: TokenUse): void;
|
|
48
32
|
/** What a session last sent on a surface, for {@link lastSentState}. */
|
|
49
33
|
export interface LastSent {
|
|
@@ -52,18 +36,10 @@ export interface LastSent {
|
|
|
52
36
|
/** Consecutive `skip` rows since that injection. */
|
|
53
37
|
skipsSince: number;
|
|
54
38
|
}
|
|
55
|
-
/**
|
|
56
|
-
* The last block this session injected on `surface`, or null when the
|
|
57
|
-
* session has injected nothing, a `reset` came after it, or there is no
|
|
58
|
-
* session id (without one, the caller always injects).
|
|
59
|
-
*/
|
|
39
|
+
/** The last block this session injected on `surface`, or null if none, a `reset` came after it, or there is no session id (the caller then always injects). */
|
|
60
40
|
export declare function lastSentState(db: DatabaseSyncLike, tenantId: string, sessionId: string | null | undefined, surface: TokenSurface): LastSent | null;
|
|
61
|
-
/**
|
|
62
|
-
*
|
|
63
|
-
* skipped. `refreshTurns` resends an unchanged block after that many
|
|
64
|
-
* consecutive skips, so a long session still sees its pinned rules near the
|
|
65
|
-
* latest turn; 0 never resends an unchanged block.
|
|
66
|
-
*/
|
|
41
|
+
/** Whether a block identical to the session's last injection should be skipped; `refreshTurns` resends it after that many consecutive skips so a long
|
|
42
|
+
* session still sees its pinned rules, 0 never resends. */
|
|
67
43
|
export declare function shouldSkipUnchanged(last: LastSent | null, hash: string, refreshTurns: number): boolean;
|
|
68
44
|
/** Per-surface totals for {@link summarizeTokenUse}. */
|
|
69
45
|
export interface TokenSurfaceSummary {
|
|
@@ -98,10 +74,7 @@ export interface TokenSummary {
|
|
|
98
74
|
/** Sessions whose re-reads were counted at session end; open or crashed sessions are not. */
|
|
99
75
|
rereadSessions: number;
|
|
100
76
|
}
|
|
101
|
-
/**
|
|
102
|
-
* Sum the ledger for one tenant since `sinceIso`. Surfaces with no rows are
|
|
103
|
-
* omitted.
|
|
104
|
-
*/
|
|
77
|
+
/** Sum the ledger for one tenant since `sinceIso`; surfaces with no rows are omitted. */
|
|
105
78
|
export declare function summarizeTokenUse(db: DatabaseSyncLike, tenantId: string, sinceIso: string): TokenSummary;
|
|
106
79
|
/** JSON-value string check without a runtime `typeof` (anti-slop rule). */
|
|
107
80
|
interface ModelTagged {
|
|
@@ -109,13 +82,6 @@ interface ModelTagged {
|
|
|
109
82
|
}
|
|
110
83
|
/** Claude Code writes its own API errors and limit notices as assistant lines from this model; no model call made them. */
|
|
111
84
|
export declare function isSyntheticMessage(message: ModelTagged): boolean;
|
|
112
|
-
/** A hook payload's non-empty `session_id`, or null; with `requiredSource`, also null when its `source` differs. */
|
|
113
|
-
export declare function hookPayloadSessionId(stdinText: string | undefined, requiredSource?: string | null): string | null;
|
|
114
|
-
/** A hook payload's string `field` as sent, or null when the payload or the field is missing or not a string. */
|
|
115
|
-
export declare function hookPayloadString(stdinText: string | undefined, field: string): string | null;
|
|
116
|
-
/** Whether a hook fired inside a sub-agent, the only payload with `agent_id` (https://code.claude.com/docs/en/hooks#common-input-fields).
|
|
117
|
-
* Its `session_id` is the parent's, so a sub-agent's blocks and compactions must not count as the parent's. */
|
|
118
|
-
export declare function isSubagentPayload(stdinText: string | undefined): boolean;
|
|
119
85
|
/** Tokens hippo sent and skipped in one session, for {@link tokensBySession}. */
|
|
120
86
|
export interface SessionTokens {
|
|
121
87
|
sessionId: string;
|
|
@@ -126,11 +92,8 @@ export interface SessionTokens {
|
|
|
126
92
|
/** Blocks sent. */
|
|
127
93
|
injections: number;
|
|
128
94
|
}
|
|
129
|
-
/**
|
|
130
|
-
*
|
|
131
|
-
* Claude Code hook rows carry the host's session id, which is also the
|
|
132
|
-
* transcript file name, so these join to the host's own usage records.
|
|
133
|
-
*/
|
|
95
|
+
/** Ledger totals per session id since `sinceIso`, across surfaces; hook rows carry the host's session id (the transcript file name), so they join to its
|
|
96
|
+
* usage records. */
|
|
134
97
|
export declare function tokensBySession(db: DatabaseSyncLike, tenantId: string, sinceIso: string): SessionTokens[];
|
|
135
98
|
/** One model API call in a host transcript, for {@link recordRereads}. */
|
|
136
99
|
export interface ApiCall {
|
|
@@ -149,7 +112,7 @@ export interface TranscriptCalls {
|
|
|
149
112
|
export declare function readApiCalls(transcriptPath: string): Promise<TranscriptCalls>;
|
|
150
113
|
/** Calls that carried a block sent at `at` (epoch ms): every later call in the first later call's context window. */
|
|
151
114
|
export declare function carryingCalls(calls: readonly ApiCall[], at: number): ApiCall[];
|
|
152
|
-
/** Replace a session's `reread` rows in
|
|
153
|
-
export declare function recordRereads(
|
|
115
|
+
/** Replace a session's `reread` rows in `hippoRoot`'s store, one per {@link REREAD_SURFACES} surface and UTC day; returns the tokens booked. */
|
|
116
|
+
export declare function recordRereads(hippoRoot: string, tenantId: string, sessionId: string, calls: readonly ApiCall[]): number;
|
|
154
117
|
export {};
|
|
155
118
|
//# sourceMappingURL=token-ledger.d.ts.map
|
|
@@ -1,30 +1,9 @@
|
|
|
1
|
-
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* One row per block of memory text sent to an agent, on every surface: the
|
|
6
|
-
* per-prompt hook, the block `hippo compact-resume` restores after compaction,
|
|
7
|
-
* `hippo context`, `hippo recall`, the MCP tools and the HTTP API. The ledger
|
|
8
|
-
* answers the question a buyer asks first ("what does this cost me per
|
|
9
|
-
* session?") and is the input for the token-savings evals.
|
|
10
|
-
*
|
|
11
|
-
* Every later model call re-reads a sent block until the host compacts; at session end the worker counts
|
|
12
|
-
* those calls from the transcript as `reread` rows for the {@link REREAD_SURFACES} blocks, dated by call day.
|
|
13
|
-
*
|
|
14
|
-
* It also backs inject-only-on-change: the per-prompt hook compares the
|
|
15
|
-
* hash of the block it is about to send with the last block it sent in the
|
|
16
|
-
* same session and records a `skip` instead of sending it again.
|
|
17
|
-
*
|
|
18
|
-
* Token counts use {@link estimateTokens} (characters / 4), the same estimate
|
|
19
|
-
* every budget in hippo uses. Rows hold counts, surfaces, session ids and
|
|
20
|
-
* hashes, never memory content or query text.
|
|
21
|
-
*
|
|
22
|
-
* DB helpers take the caller's handle; {@link readApiCalls} streams one
|
|
23
|
-
* transcript file. Writes are best-effort at the call sites; a ledger failure
|
|
24
|
-
* must never break recall.
|
|
25
|
-
*/
|
|
1
|
+
/** Token ledger: one row per block of memory text sent to an agent on any surface, with its token cost; the input for the token-savings evals.
|
|
2
|
+
* Backs inject-only-on-change: the hook records a `skip` when the block hash matches the session's last; `reread` rows cover {@link REREAD_SURFACES} blocks.
|
|
3
|
+
* Counts use {@link estimateTokens} (chars / 4); rows never hold content or query text. Writes are best-effort: a ledger failure must not break recall. */
|
|
26
4
|
import { open } from 'node:fs/promises';
|
|
27
5
|
import { withWriteScope } from '../db/index.js';
|
|
6
|
+
import { onHandle } from './open.js';
|
|
28
7
|
import { isJsonString, isJsonObjectLiteral } from '../util/json.js';
|
|
29
8
|
import { DAY_MS } from '../util/time.js';
|
|
30
9
|
import { countSkipsAfter, deleteRereadRows, injectedBlocks, insertTokenRow, latestInjectOrReset, pruneTokenRowsBefore, sessionTokenRows, sessionTotals, surfaceTotals, } from './token-ledger-rows.js';
|
|
@@ -38,9 +17,7 @@ export const TOKEN_SURFACES = [
|
|
|
38
17
|
export const REREAD_SURFACES = ['hook', 'hook_recall', 'compact_resume'];
|
|
39
18
|
/** Rows older than this are pruned on write. */
|
|
40
19
|
export const TOKEN_LEDGER_RETENTION_DAYS = 90;
|
|
41
|
-
/**
|
|
42
|
-
* Append one ledger row and prune rows past {@link TOKEN_LEDGER_RETENTION_DAYS}.
|
|
43
|
-
*/
|
|
20
|
+
/** Append one ledger row and prune rows past {@link TOKEN_LEDGER_RETENTION_DAYS}. */
|
|
44
21
|
export function recordTokenUse(db, use) {
|
|
45
22
|
const now = use.now ?? new Date().toISOString();
|
|
46
23
|
insertTokenRow(db, {
|
|
@@ -56,11 +33,7 @@ export function recordTokenUse(db, use) {
|
|
|
56
33
|
const cutoff = new Date(Date.parse(now) - TOKEN_LEDGER_RETENTION_DAYS * DAY_MS).toISOString();
|
|
57
34
|
pruneTokenRowsBefore(db, cutoff);
|
|
58
35
|
}
|
|
59
|
-
/**
|
|
60
|
-
* The last block this session injected on `surface`, or null when the
|
|
61
|
-
* session has injected nothing, a `reset` came after it, or there is no
|
|
62
|
-
* session id (without one, the caller always injects).
|
|
63
|
-
*/
|
|
36
|
+
/** The last block this session injected on `surface`, or null if none, a `reset` came after it, or there is no session id (the caller then always injects). */
|
|
64
37
|
export function lastSentState(db, tenantId, sessionId, surface) {
|
|
65
38
|
if (!sessionId)
|
|
66
39
|
return null;
|
|
@@ -70,12 +43,8 @@ export function lastSentState(db, tenantId, sessionId, surface) {
|
|
|
70
43
|
const skips = countSkipsAfter(db, tenantId, sessionId, surface, anchor.id);
|
|
71
44
|
return { hash: anchor.block_hash, skipsSince: Number(skips?.n ?? 0) };
|
|
72
45
|
}
|
|
73
|
-
/**
|
|
74
|
-
*
|
|
75
|
-
* skipped. `refreshTurns` resends an unchanged block after that many
|
|
76
|
-
* consecutive skips, so a long session still sees its pinned rules near the
|
|
77
|
-
* latest turn; 0 never resends an unchanged block.
|
|
78
|
-
*/
|
|
46
|
+
/** Whether a block identical to the session's last injection should be skipped; `refreshTurns` resends it after that many consecutive skips so a long
|
|
47
|
+
* session still sees its pinned rules, 0 never resends. */
|
|
79
48
|
export function shouldSkipUnchanged(last, hash, refreshTurns) {
|
|
80
49
|
if (!last || last.hash !== hash)
|
|
81
50
|
return false;
|
|
@@ -83,10 +52,7 @@ export function shouldSkipUnchanged(last, hash, refreshTurns) {
|
|
|
83
52
|
return false;
|
|
84
53
|
return true;
|
|
85
54
|
}
|
|
86
|
-
/**
|
|
87
|
-
* Sum the ledger for one tenant since `sinceIso`. Surfaces with no rows are
|
|
88
|
-
* omitted.
|
|
89
|
-
*/
|
|
55
|
+
/** Sum the ledger for one tenant since `sinceIso`; surfaces with no rows are omitted. */
|
|
90
56
|
export function summarizeTokenUse(db, tenantId, sinceIso) {
|
|
91
57
|
const rows = surfaceTotals(db, tenantId, sinceIso);
|
|
92
58
|
const bySurface = new Map(rows.map((r) => [r.surface, r]));
|
|
@@ -124,46 +90,8 @@ export function summarizeTokenUse(db, tenantId, sinceIso) {
|
|
|
124
90
|
export function isSyntheticMessage(message) {
|
|
125
91
|
return message.model === '<synthetic>';
|
|
126
92
|
}
|
|
127
|
-
/**
|
|
128
|
-
|
|
129
|
-
if (!stdinText || stdinText.trim() === '')
|
|
130
|
-
return null;
|
|
131
|
-
try {
|
|
132
|
-
// SAFETY: JSON.parse returns a JSON value by definition.
|
|
133
|
-
const payload = JSON.parse(stdinText.trim());
|
|
134
|
-
return isJsonObjectLiteral(payload) ? payload : null;
|
|
135
|
-
}
|
|
136
|
-
catch {
|
|
137
|
-
// Malformed is one of the null cases the docblock names.
|
|
138
|
-
return null;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
/** A hook payload's non-empty `session_id`, or null; with `requiredSource`, also null when its `source` differs. */
|
|
142
|
-
export function hookPayloadSessionId(stdinText, requiredSource = null) {
|
|
143
|
-
const payload = parseHookPayload(stdinText);
|
|
144
|
-
const sessionId = payload?.session_id;
|
|
145
|
-
if (!payload || !isJsonString(sessionId) || sessionId.trim() === '')
|
|
146
|
-
return null;
|
|
147
|
-
if (requiredSource !== null && payload.source !== requiredSource)
|
|
148
|
-
return null;
|
|
149
|
-
return sessionId;
|
|
150
|
-
}
|
|
151
|
-
/** A hook payload's string `field` as sent, or null when the payload or the field is missing or not a string. */
|
|
152
|
-
export function hookPayloadString(stdinText, field) {
|
|
153
|
-
const value = parseHookPayload(stdinText)?.[field];
|
|
154
|
-
return isJsonString(value) ? value : null;
|
|
155
|
-
}
|
|
156
|
-
/** Whether a hook fired inside a sub-agent, the only payload with `agent_id` (https://code.claude.com/docs/en/hooks#common-input-fields).
|
|
157
|
-
* Its `session_id` is the parent's, so a sub-agent's blocks and compactions must not count as the parent's. */
|
|
158
|
-
export function isSubagentPayload(stdinText) {
|
|
159
|
-
const agentId = parseHookPayload(stdinText)?.agent_id;
|
|
160
|
-
return isJsonString(agentId) && agentId.trim() !== '';
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* Ledger totals per session id since `sinceIso`, across every surface.
|
|
164
|
-
* Claude Code hook rows carry the host's session id, which is also the
|
|
165
|
-
* transcript file name, so these join to the host's own usage records.
|
|
166
|
-
*/
|
|
93
|
+
/** Ledger totals per session id since `sinceIso`, across surfaces; hook rows carry the host's session id (the transcript file name), so they join to its
|
|
94
|
+
* usage records. */
|
|
167
95
|
export function tokensBySession(db, tenantId, sinceIso) {
|
|
168
96
|
return sessionTokenRows(db, tenantId, sinceIso).map((r) => ({
|
|
169
97
|
sessionId: r.session_id,
|
|
@@ -227,8 +155,14 @@ export function carryingCalls(calls, at) {
|
|
|
227
155
|
return [];
|
|
228
156
|
return calls.filter((call) => call.at > at && call.compactions === first.compactions);
|
|
229
157
|
}
|
|
230
|
-
/** Replace a session's `reread` rows in
|
|
231
|
-
export function recordRereads(
|
|
158
|
+
/** Replace a session's `reread` rows in `hippoRoot`'s store, one per {@link REREAD_SURFACES} surface and UTC day; returns the tokens booked. */
|
|
159
|
+
export function recordRereads(hippoRoot, tenantId, sessionId, calls) {
|
|
160
|
+
return onHandle(hippoRoot, (db) => {
|
|
161
|
+
return replaceRereadRows(db, tenantId, sessionId, calls);
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
/** One transaction, so a refused row leaves the session's earlier re-read rows in place. */
|
|
165
|
+
function replaceRereadRows(db, tenantId, sessionId, calls) {
|
|
232
166
|
return withWriteScope(db, 'record_rereads', () => {
|
|
233
167
|
const rows = injectedBlocks(db, tenantId, sessionId, REREAD_SURFACES);
|
|
234
168
|
const days = new Map();
|