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
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { type DatabaseSyncLike } from '../db/index.js';
|
|
2
|
+
import { type CompactionStatus } from './compactions.js';
|
|
3
|
+
export type { CompactionStatus };
|
|
4
|
+
export interface CompactionRecord {
|
|
5
|
+
id: string;
|
|
6
|
+
tenantId: string;
|
|
7
|
+
sessionId: string;
|
|
8
|
+
originProject: string;
|
|
9
|
+
trigger: string | null;
|
|
10
|
+
cwd: string | null;
|
|
11
|
+
transcriptPath: string | null;
|
|
12
|
+
snapshotSaved: boolean;
|
|
13
|
+
startedAt: string;
|
|
14
|
+
summarisedAt: string | null;
|
|
15
|
+
summary: string | null;
|
|
16
|
+
items: string[];
|
|
17
|
+
itemsWritten: number;
|
|
18
|
+
status: CompactionStatus;
|
|
19
|
+
}
|
|
20
|
+
export type Log = (message: string) => void;
|
|
21
|
+
export interface CompactionStart {
|
|
22
|
+
sessionId: string;
|
|
23
|
+
originProject: string;
|
|
24
|
+
trigger: string | null;
|
|
25
|
+
cwd: string | null;
|
|
26
|
+
transcriptPath: string | null;
|
|
27
|
+
}
|
|
28
|
+
export declare function startCompaction(db: DatabaseSyncLike, tenantId: string, start: CompactionStart, at?: Date): string;
|
|
29
|
+
/** A session's newest record, or null. */
|
|
30
|
+
export declare function latestCompaction(db: DatabaseSyncLike, tenantId: string, sessionId: string): CompactionRecord | null;
|
|
31
|
+
/** The record a caller's request made, whatever state it reached, so a retry neither writes its items twice nor starts a second record.
|
|
32
|
+
* Another session's id is a ConflictError. */
|
|
33
|
+
export declare function compactionByRequest(db: DatabaseSyncLike, tenantId: string, requestId: string, sessionId: string): CompactionRecord | null;
|
|
34
|
+
/** Best effort, never throws: a compaction must not fail because its record could not be written. */
|
|
35
|
+
export declare function recordCompactionStart(hippoRoot: string, start: Omit<CompactionStart, 'originProject'>, log: Log): string | null;
|
|
36
|
+
/** On the caller's handle and tenant, so a server marks the record under the caller's tenant with its own wait. */
|
|
37
|
+
export declare function markSnapshotSaved(db: DatabaseSyncLike, tenantId: string, recordId: string): void;
|
|
38
|
+
export declare function recordSnapshotSaved(hippoRoot: string, tenantId: string, recordId: string, log: Log): void;
|
|
39
|
+
export interface CompactionText {
|
|
40
|
+
summary: string;
|
|
41
|
+
items: string[];
|
|
42
|
+
}
|
|
43
|
+
/** A caller's checked project, and the id its retries carry so a retry finds this record. */
|
|
44
|
+
export interface SummaryCaller {
|
|
45
|
+
originProject?: string;
|
|
46
|
+
requestId?: string;
|
|
47
|
+
}
|
|
48
|
+
export interface RecordSummaryOptions {
|
|
49
|
+
readonly meta: Omit<CompactionStart, 'originProject'>;
|
|
50
|
+
readonly text: CompactionText;
|
|
51
|
+
readonly at: Date;
|
|
52
|
+
readonly caller?: SummaryCaller;
|
|
53
|
+
}
|
|
54
|
+
/** Puts the summary on the session's `started` record, or inserts a `summarised` one when pre-compact wrote none. One statement each. */
|
|
55
|
+
export declare function recordSummary(db: DatabaseSyncLike, hippoRoot: string, tenantId: string, options: RecordSummaryOptions): CompactionRecord;
|
|
56
|
+
export interface ItemContext {
|
|
57
|
+
tenantId: string;
|
|
58
|
+
/** null when the record step failed: the items still go in, with no record to close. */
|
|
59
|
+
recordId: string | null;
|
|
60
|
+
sessionId: string;
|
|
61
|
+
originProject: string;
|
|
62
|
+
/** Where the session ran, so rows held under the project's older folder name count too. */
|
|
63
|
+
cwd: string | null;
|
|
64
|
+
items: string[];
|
|
65
|
+
/** Set when another machine sent the items: its audit actor and its project's names, since the server's folder is neither. */
|
|
66
|
+
caller?: {
|
|
67
|
+
actor: string;
|
|
68
|
+
origins: readonly string[];
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/** Items that become rows, then the record `done`, in one transaction so two sessions cannot both insert one text. Mirrors after commit. */
|
|
72
|
+
export declare function saveItems(db: DatabaseSyncLike, hippoRoot: string, ctx: ItemContext, log: Log): number;
|
|
73
|
+
export interface CompactionSaveResult {
|
|
74
|
+
/** Memories written; null when neither the record nor the items could be saved. */
|
|
75
|
+
written: number | null;
|
|
76
|
+
/** True when the rest waits for the next sleep or post-compact. */
|
|
77
|
+
deferred: boolean;
|
|
78
|
+
snapshotSaved: boolean;
|
|
79
|
+
}
|
|
80
|
+
/** What one PostCompact save did; `spoolReason` is set when the store was busy or would not open, so the caller keeps the summary on disk. */
|
|
81
|
+
export interface CompactionSaveOutcome {
|
|
82
|
+
result: CompactionSaveResult;
|
|
83
|
+
spoolReason: string | null;
|
|
84
|
+
}
|
|
85
|
+
/** The PostCompact store work, on a handle of its own: record the summary, then write its items. Each step is independent. Never throws. */
|
|
86
|
+
export declare function saveCompactionAt(hippoRoot: string, meta: Omit<CompactionStart, 'originProject'>, text: CompactionText, at: Date, log: Log): CompactionSaveOutcome;
|
|
87
|
+
/** One spooled summary, as plain data. */
|
|
88
|
+
export interface SpooledSummary {
|
|
89
|
+
tenantId: string;
|
|
90
|
+
payload: Omit<CompactionStart, 'originProject'>;
|
|
91
|
+
text: CompactionText;
|
|
92
|
+
at: Date;
|
|
93
|
+
}
|
|
94
|
+
/** Records one spooled summary; it calls `recorded` once the store holds it, so the file is done even if a later step throws. */
|
|
95
|
+
export type SpoolRecorder = (spooled: SpooledSummary, recorded: () => void) => void;
|
|
96
|
+
/** A summary read out of a transcript, scrubbed; `listed` is false when it had no memories section. */
|
|
97
|
+
export interface TranscriptText {
|
|
98
|
+
text: CompactionText;
|
|
99
|
+
listed: boolean;
|
|
100
|
+
}
|
|
101
|
+
/** The file work a replay needs, handed in by the caller so the store holds none of it. */
|
|
102
|
+
export interface ReplaySources {
|
|
103
|
+
/** Feeds each spooled summary to `record`; returns how many it imported. */
|
|
104
|
+
importSpool(tenantId: string, deadline: number, record: SpoolRecorder): number;
|
|
105
|
+
transcriptExists(transcriptPath: string): boolean;
|
|
106
|
+
/** The summary a transcript holds between two moments, or null when it is not (yet) there. */
|
|
107
|
+
transcriptText(transcriptPath: string, afterMs: number, beforeMs: number): TranscriptText | null;
|
|
108
|
+
}
|
|
109
|
+
export interface ReplayOptions {
|
|
110
|
+
busyWaitMs?: number;
|
|
111
|
+
deadline?: number;
|
|
112
|
+
}
|
|
113
|
+
/** For `hippo sleep` and post-compact: opens the store itself and never throws. */
|
|
114
|
+
export declare function replayStoredCompactions(hippoRoot: string, sources: ReplaySources, log: Log, opts?: ReplayOptions): number;
|
|
115
|
+
//# sourceMappingURL=compactions-record.d.ts.map
|
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
// The compaction record's SQL: one record per Claude Code compaction, and the rows its summary's items become.
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { ConflictError } from '../core/api-errors.js';
|
|
4
|
+
import { COMPACTION_DB_WAIT_MS, REPLAY_AFTER_MS, TRANSCRIPT_FILL_WINDOW_MS } from '../core/compaction-timing.js';
|
|
5
|
+
import { isStringValue } from '../core/capture-contract.js';
|
|
6
|
+
import { selectItemRows } from '../util/compaction-items.js';
|
|
7
|
+
import { isSharedStore, loadConfig } from '../core/config.js';
|
|
8
|
+
import { closeHippoDb, isSqliteBusy, openHippoDb, withWriteScopeOr } from '../db/index.js';
|
|
9
|
+
import { gatedWrite } from './gated-write.js';
|
|
10
|
+
import { COMPACTION_MEMORY_TAG, COMPACTION_SOURCE_PREFIX, Layer, createMemory, generateId } from '../core/memory.js';
|
|
11
|
+
import { fallbackOrigin, isGlobalStoreRoot, projectId, projectNames, resolveProjectIdentity } from '../core/project-identity.js';
|
|
12
|
+
import { closeStartedWithoutSummary, compactionProgress, compactionRowsByRequest, heldMemoryRows, insertStartedCompaction, insertSummarisedCompaction, latestCompactionRows, latestStartedRows, markCompactionDone, markCompactionSummarised, markSnapshotSavedRow, nextCompactionStart, openTranscriptRows, stalledSummarisedRows, } from './compactions.js';
|
|
13
|
+
import { strengthenRetrievedOn, writeEntryMirrors } from './entry-writes.js';
|
|
14
|
+
import { isRecallBoostAblated } from '../core/ablation.js';
|
|
15
|
+
import { updateStats } from './index-and-stats.js';
|
|
16
|
+
import { resolveTenantId } from './tenant.js';
|
|
17
|
+
import { errorMessage, reportCompactionFailure } from '../util/log.js';
|
|
18
|
+
/** The marker redactSecretsStrict writes; an item holding it was a secret before it was stored. */
|
|
19
|
+
const REDACTED = '[REDACTED]';
|
|
20
|
+
/** Where the session ran: rows written through the global store or a shared store keep the project the session was in. */
|
|
21
|
+
function compactionProject(hippoRoot, cwd) {
|
|
22
|
+
if (!isGlobalStoreRoot(hippoRoot) && !isSharedStore(hippoRoot))
|
|
23
|
+
return resolveProjectIdentity(path.dirname(hippoRoot));
|
|
24
|
+
// No cwd means user-global, as stampOriginProject gives the global store; undefined would fall back to the hook's own cwd.
|
|
25
|
+
return cwd === null ? '' : resolveProjectIdentity(cwd);
|
|
26
|
+
}
|
|
27
|
+
/** The record column cannot hold NULL, but an item from an unknown folder on a shared store must not read as user-global. */
|
|
28
|
+
function itemOrigin(hippoRoot, ctx) {
|
|
29
|
+
return ctx.cwd === null && isSharedStore(hippoRoot) ? fallbackOrigin(hippoRoot) : ctx.originProject;
|
|
30
|
+
}
|
|
31
|
+
function compactionOrigin(hippoRoot, cwd) {
|
|
32
|
+
return projectId(compactionProject(hippoRoot, cwd));
|
|
33
|
+
}
|
|
34
|
+
/** The names a record's held rows may carry: its origin, plus the folder name rows saved before project ids used. */
|
|
35
|
+
function heldOrigins(hippoRoot, cwd, originProject) {
|
|
36
|
+
const names = projectNames(compactionProject(hippoRoot, cwd));
|
|
37
|
+
return names.includes(originProject) ? names : [originProject];
|
|
38
|
+
}
|
|
39
|
+
function toRecord(row) {
|
|
40
|
+
const listed = row.items_json === null ? [] : JSON.parse(row.items_json);
|
|
41
|
+
return {
|
|
42
|
+
id: row.id,
|
|
43
|
+
tenantId: row.tenant_id,
|
|
44
|
+
sessionId: row.session_id,
|
|
45
|
+
originProject: row.origin_project,
|
|
46
|
+
trigger: row.compact_trigger,
|
|
47
|
+
cwd: row.cwd,
|
|
48
|
+
transcriptPath: row.transcript_path,
|
|
49
|
+
snapshotSaved: row.snapshot_saved === 1,
|
|
50
|
+
startedAt: row.started_at,
|
|
51
|
+
summarisedAt: row.summarised_at,
|
|
52
|
+
summary: row.summary,
|
|
53
|
+
items: Array.isArray(listed) ? listed.filter(isStringValue) : [],
|
|
54
|
+
itemsWritten: row.items_written,
|
|
55
|
+
status: row.status,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export function startCompaction(db, tenantId, start, at = new Date()) {
|
|
59
|
+
const id = generateId('cmp');
|
|
60
|
+
insertStartedCompaction(db, tenantId, { id, ...start, startedAt: at.toISOString() });
|
|
61
|
+
return id;
|
|
62
|
+
}
|
|
63
|
+
/** A session's newest record, or null. */
|
|
64
|
+
export function latestCompaction(db, tenantId, sessionId) {
|
|
65
|
+
return latestCompactionRows(db, tenantId, sessionId).map(toRecord)[0] ?? null;
|
|
66
|
+
}
|
|
67
|
+
/** The record a caller's request made, whatever state it reached, so a retry neither writes its items twice nor starts a second record.
|
|
68
|
+
* Another session's id is a ConflictError. */
|
|
69
|
+
export function compactionByRequest(db, tenantId, requestId, sessionId) {
|
|
70
|
+
const record = compactionRowsByRequest(db, tenantId, requestId).map(toRecord)[0] ?? null;
|
|
71
|
+
// Sessions are owner-bound, so this also keeps one owner from reading or finishing another's record.
|
|
72
|
+
if (record !== null && record.sessionId !== sessionId)
|
|
73
|
+
throw new ConflictError('request id belongs to another session');
|
|
74
|
+
return record;
|
|
75
|
+
}
|
|
76
|
+
/** Pre-compact's record for the compaction that is ending: the session's newest `started` one within REPLAY_AFTER_MS before `at`.
|
|
77
|
+
* An older one is left for the transcript fill. */
|
|
78
|
+
function latestStarted(db, tenantId, sessionId, at) {
|
|
79
|
+
return latestStartedRows(db, tenantId, sessionId, at.toISOString(), new Date(at.getTime() - REPLAY_AFTER_MS).toISOString()).map(toRecord)[0] ?? null;
|
|
80
|
+
}
|
|
81
|
+
function markSummarised(db, tenantId, id, options) {
|
|
82
|
+
const { text, summarisedAt, requestId } = options;
|
|
83
|
+
return markCompactionSummarised(db, tenantId, id, { summary: text.summary, itemsJson: JSON.stringify(text.items), summarisedAt, requestId });
|
|
84
|
+
}
|
|
85
|
+
/** Best effort, never throws: a compaction must not fail because its record could not be written. */
|
|
86
|
+
export function recordCompactionStart(hippoRoot, start, log) {
|
|
87
|
+
let db;
|
|
88
|
+
try {
|
|
89
|
+
db = openHippoDb(hippoRoot, { busyWaitMs: COMPACTION_DB_WAIT_MS });
|
|
90
|
+
return startCompaction(db, resolveTenantId({}), { ...start, originProject: compactionOrigin(hippoRoot, start.cwd) });
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
log(`compaction record not started: ${errorMessage(err)}`);
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
if (db)
|
|
98
|
+
closeHippoDb(db);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/** On the caller's handle and tenant, so a server marks the record under the caller's tenant with its own wait. */
|
|
102
|
+
export function markSnapshotSaved(db, tenantId, recordId) {
|
|
103
|
+
markSnapshotSavedRow(db, tenantId, recordId);
|
|
104
|
+
}
|
|
105
|
+
export function recordSnapshotSaved(hippoRoot, tenantId, recordId, log) {
|
|
106
|
+
let db;
|
|
107
|
+
try {
|
|
108
|
+
db = openHippoDb(hippoRoot, { busyWaitMs: COMPACTION_DB_WAIT_MS });
|
|
109
|
+
markSnapshotSaved(db, tenantId, recordId);
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
log(`compaction record not marked with its snapshot: ${errorMessage(err)}`);
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
if (db)
|
|
116
|
+
closeHippoDb(db);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/** Puts the summary on the session's `started` record, or inserts a `summarised` one when pre-compact wrote none. One statement each. */
|
|
120
|
+
export function recordSummary(db, hippoRoot, tenantId, options) {
|
|
121
|
+
const { meta, text, at, caller = {} } = options;
|
|
122
|
+
const now = new Date().toISOString();
|
|
123
|
+
const itemsJson = JSON.stringify(text.items);
|
|
124
|
+
const { requestId } = caller;
|
|
125
|
+
const started = latestStarted(db, tenantId, meta.sessionId, at);
|
|
126
|
+
if (started && markSummarised(db, tenantId, started.id, { text, summarisedAt: now, requestId })) {
|
|
127
|
+
return { ...started, summary: text.summary, items: text.items, summarisedAt: now, status: 'summarised' };
|
|
128
|
+
}
|
|
129
|
+
const originProject = caller.originProject ?? compactionOrigin(hippoRoot, meta.cwd);
|
|
130
|
+
const id = generateId('cmp');
|
|
131
|
+
insertSummarisedCompaction(db, tenantId, { ...meta, originProject, startedAt: at.toISOString() }, { id, summary: text.summary, itemsJson, summarisedAt: now, requestId });
|
|
132
|
+
return {
|
|
133
|
+
id, tenantId, sessionId: meta.sessionId, originProject, trigger: meta.trigger, cwd: meta.cwd, transcriptPath: meta.transcriptPath,
|
|
134
|
+
snapshotSaved: false, startedAt: at.toISOString(), summarisedAt: now, summary: text.summary, items: text.items, itemsWritten: 0, status: 'summarised',
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/** Words whose loss reverses or narrows a statement: "do not", "can't", "only", "unless". */
|
|
138
|
+
const PROTECTED_WORDS = new Set(['not', 'no', 'never', 'none', 'nor', 'without', 'cannot', 't', 'only', 'except', 'unless', 'until']);
|
|
139
|
+
/** Below this share of the held text's words, an item is a fragment of something longer, not a restatement. */
|
|
140
|
+
const RESTATE_MIN_SHARE = 0.5;
|
|
141
|
+
function words(text) {
|
|
142
|
+
return text.normalize('NFC').toLowerCase().split(/[^\p{L}\p{M}\p{N}_]+/u).filter(Boolean);
|
|
143
|
+
}
|
|
144
|
+
/** True when `item` is `held` with words left out, in the same order, keeping every number and protected word. Spacing, case and punctuation may differ. */
|
|
145
|
+
function restates(item, held) {
|
|
146
|
+
if (item.length === 0 || item.length < RESTATE_MIN_SHARE * held.length)
|
|
147
|
+
return false;
|
|
148
|
+
const kept = new Set(item);
|
|
149
|
+
let next = 0;
|
|
150
|
+
for (const w of held) {
|
|
151
|
+
if (next < item.length && w === item[next])
|
|
152
|
+
next++;
|
|
153
|
+
else if (!kept.has(w) && (PROTECTED_WORDS.has(w) || /\p{N}/u.test(w)))
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
return next === item.length;
|
|
157
|
+
}
|
|
158
|
+
/** Live rows of one tenant and origin that default recall shows: a compaction often restates what an earlier one, or the user, already saved. */
|
|
159
|
+
function heldRows(db, tenantId, origins) {
|
|
160
|
+
return heldMemoryRows(db, tenantId, origins).map((r) => ({ id: r.id, sessionId: r.source_session_id, words: words(r.content) }));
|
|
161
|
+
}
|
|
162
|
+
function compactionEntry(text, ctx, origin, baseHalfLifeDays) {
|
|
163
|
+
return {
|
|
164
|
+
...createMemory(text, {
|
|
165
|
+
layer: Layer.Episodic,
|
|
166
|
+
tags: [COMPACTION_MEMORY_TAG],
|
|
167
|
+
source: `${COMPACTION_SOURCE_PREFIX}${ctx.sessionId}`,
|
|
168
|
+
confidence: 'observed',
|
|
169
|
+
kind: 'distilled',
|
|
170
|
+
source_session_id: ctx.sessionId,
|
|
171
|
+
tenantId: ctx.tenantId,
|
|
172
|
+
baseHalfLifeDays,
|
|
173
|
+
}),
|
|
174
|
+
origin_project: origin,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
/** Runs inside saveItems' transaction: restatements of held rows are counted, the rest go through the write gate. */
|
|
178
|
+
function writeItemRows(db, hippoRoot, ctx, rows, baseHalfLifeDays) {
|
|
179
|
+
const out = { written: [], repeats: 0, refused: 0, restated: [] };
|
|
180
|
+
const held = heldRows(db, ctx.tenantId, ctx.caller?.origins ?? heldOrigins(hippoRoot, ctx.cwd, ctx.originProject));
|
|
181
|
+
const origin = ctx.caller === undefined ? itemOrigin(hippoRoot, ctx) : ctx.originProject;
|
|
182
|
+
const restated = new Set();
|
|
183
|
+
for (const text of rows) {
|
|
184
|
+
const itemWords = words(text);
|
|
185
|
+
const match = held.find((h) => restates(itemWords, h.words));
|
|
186
|
+
if (match) {
|
|
187
|
+
out.repeats++;
|
|
188
|
+
if (match.id !== null && match.sessionId !== ctx.sessionId)
|
|
189
|
+
restated.add(match.id);
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
// createMemory throws below 3 chars, which would sink the whole transaction.
|
|
193
|
+
if (text.trim().length < 3) {
|
|
194
|
+
out.refused++;
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
const entry = compactionEntry(text, ctx, origin, baseHalfLifeDays);
|
|
198
|
+
if (gatedWrite(db, hippoRoot, entry, { actor: ctx.caller?.actor ?? 'post-compact' }) === 'written') {
|
|
199
|
+
out.written.push(entry);
|
|
200
|
+
held.push({ id: null, sessionId: ctx.sessionId, words: itemWords });
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
out.refused++;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
out.restated = [...restated];
|
|
207
|
+
return out;
|
|
208
|
+
}
|
|
209
|
+
/** After commit: report skips, mirror the new rows, bump the counter. */
|
|
210
|
+
function finishItemWrites(hippoRoot, writes, log) {
|
|
211
|
+
if (writes.repeats > 0)
|
|
212
|
+
log(`skipped ${writes.repeats} item(s) the store already holds`);
|
|
213
|
+
if (writes.refused > 0)
|
|
214
|
+
log(`skipped ${writes.refused} item(s) the write gate refused`);
|
|
215
|
+
for (const entry of writes.written)
|
|
216
|
+
writeEntryMirrors(hippoRoot, entry);
|
|
217
|
+
if (writes.written.length > 0) {
|
|
218
|
+
try {
|
|
219
|
+
updateStats(hippoRoot, { remembered: writes.written.length });
|
|
220
|
+
}
|
|
221
|
+
catch (err) {
|
|
222
|
+
// The rows are committed; a counter that could not be bumped must not turn that into a failed step.
|
|
223
|
+
log(`remembered counter not updated: ${errorMessage(err)}`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/** Items that become rows, then the record `done`, in one transaction so two sessions cannot both insert one text. Mirrors after commit. */
|
|
228
|
+
export function saveItems(db, hippoRoot, ctx, log) {
|
|
229
|
+
const usable = ctx.items.filter((item) => !item.includes(REDACTED));
|
|
230
|
+
if (usable.length < ctx.items.length)
|
|
231
|
+
log(`skipped ${ctx.items.length - usable.length} item(s) as secret`);
|
|
232
|
+
const { rows, tooLong, capped } = selectItemRows(usable);
|
|
233
|
+
if (tooLong > 0)
|
|
234
|
+
log(`item too long: ${tooLong} kept in the record only`);
|
|
235
|
+
if (capped > 0)
|
|
236
|
+
log(`capped: ${capped} more kept in the record only`);
|
|
237
|
+
const baseHalfLifeDays = loadConfig(hippoRoot).defaultHalfLifeDays;
|
|
238
|
+
let finishedItems = 0;
|
|
239
|
+
const writes = withWriteScopeOr(db, 'save_items', (rollback) => {
|
|
240
|
+
if (ctx.recordId !== null) {
|
|
241
|
+
// A replayer that read the record before another finished it must not write its items again.
|
|
242
|
+
const current = compactionProgress(db, ctx.tenantId, ctx.recordId);
|
|
243
|
+
if (current?.status !== 'summarised') {
|
|
244
|
+
finishedItems = current?.items_written ?? 0;
|
|
245
|
+
return rollback(null);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
const written = writeItemRows(db, hippoRoot, ctx, rows, baseHalfLifeDays);
|
|
249
|
+
// Said again by another session is the same signal as being recalled; the same session carrying it forward is not.
|
|
250
|
+
strengthenRetrievedOn(db, written.restated, { tenantId: ctx.tenantId, recallBoostAblated: isRecallBoostAblated() });
|
|
251
|
+
if (ctx.recordId !== null) {
|
|
252
|
+
markCompactionDone(db, ctx.tenantId, ctx.recordId, written.written.length);
|
|
253
|
+
}
|
|
254
|
+
return written;
|
|
255
|
+
});
|
|
256
|
+
if (writes === null) {
|
|
257
|
+
log(`${ctx.recordId} was already finished by another process`);
|
|
258
|
+
return finishedItems;
|
|
259
|
+
}
|
|
260
|
+
finishItemWrites(hippoRoot, writes, log);
|
|
261
|
+
return writes.written.length;
|
|
262
|
+
}
|
|
263
|
+
function recordStep(step) {
|
|
264
|
+
try {
|
|
265
|
+
const record = recordSummary(step.db, step.hippoRoot, step.tenantId, { meta: step.meta, text: step.text, at: step.at });
|
|
266
|
+
step.result.snapshotSaved = record.snapshotSaved;
|
|
267
|
+
return record;
|
|
268
|
+
}
|
|
269
|
+
catch (err) {
|
|
270
|
+
if (isSqliteBusy(err))
|
|
271
|
+
throw err;
|
|
272
|
+
reportCompactionFailure(step.log, 'record step', errorMessage(err));
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
/** Busy with a saved record defers to sleep; any other failure goes to the caller. */
|
|
277
|
+
function itemsStep(step, record) {
|
|
278
|
+
const { meta, hippoRoot, log } = step;
|
|
279
|
+
try {
|
|
280
|
+
step.result.written = saveItems(step.db, hippoRoot, {
|
|
281
|
+
tenantId: step.tenantId,
|
|
282
|
+
recordId: record?.id ?? null,
|
|
283
|
+
sessionId: meta.sessionId,
|
|
284
|
+
originProject: record?.originProject ?? compactionOrigin(hippoRoot, meta.cwd),
|
|
285
|
+
cwd: meta.cwd,
|
|
286
|
+
items: step.text.items,
|
|
287
|
+
}, log);
|
|
288
|
+
}
|
|
289
|
+
catch (err) {
|
|
290
|
+
if (!isSqliteBusy(err) || record === null)
|
|
291
|
+
throw err;
|
|
292
|
+
// The record already holds the items; sleep finishes them.
|
|
293
|
+
step.result.deferred = true;
|
|
294
|
+
log(`store busy, items left for the next sleep: ${errorMessage(err)}`);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
/** The PostCompact store work, on a handle of its own: record the summary, then write its items. Each step is independent. Never throws. */
|
|
298
|
+
export function saveCompactionAt(hippoRoot, meta, text, at, log) {
|
|
299
|
+
const result = { written: null, deferred: false, snapshotSaved: false };
|
|
300
|
+
let db;
|
|
301
|
+
try {
|
|
302
|
+
db = openHippoDb(hippoRoot, { busyWaitMs: COMPACTION_DB_WAIT_MS });
|
|
303
|
+
const step = { db, hippoRoot, tenantId: resolveTenantId({}), meta, text, at, result, log };
|
|
304
|
+
itemsStep(step, recordStep(step));
|
|
305
|
+
}
|
|
306
|
+
catch (err) {
|
|
307
|
+
if (isSqliteBusy(err) || db === undefined)
|
|
308
|
+
return { result, spoolReason: errorMessage(err) };
|
|
309
|
+
reportCompactionFailure(log, 'items step', errorMessage(err));
|
|
310
|
+
}
|
|
311
|
+
finally {
|
|
312
|
+
if (db)
|
|
313
|
+
closeHippoDb(db);
|
|
314
|
+
}
|
|
315
|
+
return { result, spoolReason: null };
|
|
316
|
+
}
|
|
317
|
+
function closeWithoutSummary(db, tenantId, id, log) {
|
|
318
|
+
if (closeStartedWithoutSummary(db, tenantId, id) > 0)
|
|
319
|
+
log(`${id} closed as no-summary: its transcript holds no summary for it`);
|
|
320
|
+
}
|
|
321
|
+
function nextStartedAt(db, record) {
|
|
322
|
+
return nextCompactionStart(db, record.tenantId, record.sessionId, record.startedAt);
|
|
323
|
+
}
|
|
324
|
+
/** The one place a record becomes the argument saveItems takes. */
|
|
325
|
+
function itemContext(tenantId, record, items = record.items) {
|
|
326
|
+
return { tenantId, recordId: record.id, sessionId: record.sessionId, originProject: record.originProject, cwd: record.cwd, items };
|
|
327
|
+
}
|
|
328
|
+
/** Records a spooled summary, then writes its items. */
|
|
329
|
+
function spoolRecorder(db, hippoRoot, log) {
|
|
330
|
+
return (spooled, recorded) => {
|
|
331
|
+
const record = recordSummary(db, hippoRoot, spooled.tenantId, { meta: spooled.payload, text: spooled.text, at: spooled.at });
|
|
332
|
+
// The record holds the items now, so the file is done even if the write below fails.
|
|
333
|
+
recorded();
|
|
334
|
+
saveItems(db, hippoRoot, itemContext(spooled.tenantId, record), log);
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
/** Runs `step` over each record until the deadline; a record that throws is logged and the rest still run. Returns how many `step` finished. */
|
|
338
|
+
function replayEach(run, records, what, step) {
|
|
339
|
+
let finished = 0;
|
|
340
|
+
for (const record of records) {
|
|
341
|
+
if (Date.now() > run.deadline)
|
|
342
|
+
break;
|
|
343
|
+
try {
|
|
344
|
+
if (step(record))
|
|
345
|
+
finished++;
|
|
346
|
+
}
|
|
347
|
+
catch (err) {
|
|
348
|
+
run.log(`${what} of ${record.id} failed: ${errorMessage(err)}`);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
return finished;
|
|
352
|
+
}
|
|
353
|
+
function replayStalled(run) {
|
|
354
|
+
const stalled = stalledSummarisedRows(run.db, run.tenantId, new Date(run.now - REPLAY_AFTER_MS).toISOString()).map(toRecord);
|
|
355
|
+
return replayEach(run, stalled, 'replay', (record) => {
|
|
356
|
+
saveItems(run.db, run.hippoRoot, itemContext(run.tenantId, record), run.log);
|
|
357
|
+
return true;
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
function replaySpool(run) {
|
|
361
|
+
try {
|
|
362
|
+
return run.sources.importSpool(run.tenantId, run.deadline, spoolRecorder(run.db, run.hippoRoot, run.log));
|
|
363
|
+
}
|
|
364
|
+
catch (err) {
|
|
365
|
+
run.log(`spool import failed: ${errorMessage(err)}`);
|
|
366
|
+
return 0;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
/** Fills one open record from its transcript; true when it saved items. */
|
|
370
|
+
function fillFromTranscript(run, record) {
|
|
371
|
+
const { db, hippoRoot, tenantId, sources, log } = run;
|
|
372
|
+
if (record.transcriptPath === null || !sources.transcriptExists(record.transcriptPath))
|
|
373
|
+
return false;
|
|
374
|
+
const next = nextStartedAt(db, record);
|
|
375
|
+
const found = sources.transcriptText(record.transcriptPath, Date.parse(record.startedAt), next === null ? Number.POSITIVE_INFINITY : Date.parse(next));
|
|
376
|
+
if (found === null) {
|
|
377
|
+
// The record is past REPLAY_AFTER_MS, so a window that is fully scanned or out of reach stays empty.
|
|
378
|
+
closeWithoutSummary(db, tenantId, record.id, log);
|
|
379
|
+
return false;
|
|
380
|
+
}
|
|
381
|
+
const { text, listed } = found;
|
|
382
|
+
if (!listed)
|
|
383
|
+
log(`no memories section in the transcript summary for ${record.id}`);
|
|
384
|
+
if (!markSummarised(db, tenantId, record.id, { text, summarisedAt: new Date().toISOString() })) {
|
|
385
|
+
log(`${record.id} was filled by another process`);
|
|
386
|
+
return false;
|
|
387
|
+
}
|
|
388
|
+
saveItems(db, hippoRoot, itemContext(tenantId, record, text.items), log);
|
|
389
|
+
return true;
|
|
390
|
+
}
|
|
391
|
+
function replayOpen(run) {
|
|
392
|
+
const open = openTranscriptRows(run.db, run.tenantId, new Date(run.now - REPLAY_AFTER_MS).toISOString(), new Date(run.now - TRANSCRIPT_FILL_WINDOW_MS).toISOString()).map(toRecord);
|
|
393
|
+
return replayEach(run, open, 'transcript fill', (record) => fillFromTranscript(run, record));
|
|
394
|
+
}
|
|
395
|
+
/** Finishes what a killed hook or a busy store left: `summarised` records, spool files, and `started` records the transcript can fill.
|
|
396
|
+
* Returns how many compactions it saved. */
|
|
397
|
+
function replayCompactions(db, hippoRoot, sources, log, deadline) {
|
|
398
|
+
const run = { db, hippoRoot, tenantId: resolveTenantId({}), now: Date.now(), sources, log, deadline };
|
|
399
|
+
return replayStalled(run) + replaySpool(run) + replayOpen(run);
|
|
400
|
+
}
|
|
401
|
+
/** For `hippo sleep` and post-compact: opens the store itself and never throws. */
|
|
402
|
+
export function replayStoredCompactions(hippoRoot, sources, log, opts = {}) {
|
|
403
|
+
let db;
|
|
404
|
+
try {
|
|
405
|
+
db = openHippoDb(hippoRoot, { busyWaitMs: opts.busyWaitMs });
|
|
406
|
+
return replayCompactions(db, hippoRoot, sources, log, opts.deadline ?? Number.POSITIVE_INFINITY);
|
|
407
|
+
}
|
|
408
|
+
catch (err) {
|
|
409
|
+
log(`replay failed: ${errorMessage(err)}`);
|
|
410
|
+
return 0;
|
|
411
|
+
}
|
|
412
|
+
finally {
|
|
413
|
+
if (db)
|
|
414
|
+
closeHippoDb(db);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
//# sourceMappingURL=compactions-record.js.map
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { originInSql } from '../core/project-identity.js';
|
|
2
|
-
import { scopeAdmitSql } from './
|
|
3
|
-
const COLUMNS = 'tenant_id, id, session_id, origin_project, compact_trigger, cwd, transcript_path, snapshot_saved, started_at, summarised_at, summary,
|
|
2
|
+
import { scopeAdmitSql } from './rule-sql.js';
|
|
3
|
+
const COLUMNS = 'tenant_id, id, session_id, origin_project, compact_trigger, cwd, transcript_path, snapshot_saved, started_at, summarised_at, summary, ' +
|
|
4
|
+
'items_json, items_written, status';
|
|
4
5
|
function selectRows(db, where, ...params) {
|
|
5
6
|
// SAFETY: the SELECT names exactly COLUMNS, matching CompactionRow's field set.
|
|
6
7
|
return db.prepare(`SELECT ${COLUMNS} FROM compactions WHERE ${where}`).all(...params);
|
|
@@ -42,8 +43,9 @@ export function insertSummarisedCompaction(db, tenantId, meta, row) {
|
|
|
42
43
|
// Only a caller names the column, so a store from before it was added still takes local writes.
|
|
43
44
|
const stamp = requestId === undefined ? [] : [requestId];
|
|
44
45
|
const [col, mark] = stamp.length === 0 ? ['', ''] : [', request_id', ', ?'];
|
|
45
|
-
db.prepare(`INSERT INTO compactions(tenant_id, id, session_id, origin_project, compact_trigger, cwd, transcript_path, started_at,
|
|
46
|
-
|
|
46
|
+
db.prepare(`INSERT INTO compactions(tenant_id, id, session_id, origin_project, compact_trigger, cwd, transcript_path, started_at, ` +
|
|
47
|
+
`summarised_at, summary, items_json, status${col})\n` +
|
|
48
|
+
` VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'summarised'${mark})`).run(tenantId, id, meta.sessionId, meta.originProject, meta.trigger, meta.cwd, meta.transcriptPath, meta.startedAt, summarisedAt, summary, itemsJson, ...stamp);
|
|
47
49
|
}
|
|
48
50
|
export function markSnapshotSavedRow(db, tenantId, recordId) {
|
|
49
51
|
db.prepare(`UPDATE compactions SET snapshot_saved = 1 WHERE tenant_id = ? AND id = ?`).run(tenantId, recordId);
|
|
@@ -23,16 +23,12 @@ type DetectedConflict = {
|
|
|
23
23
|
};
|
|
24
24
|
type SameTenant = (a: string, b: string) => boolean;
|
|
25
25
|
export declare function replaceDetectedConflicts(hippoRoot: string, detected: Array<DetectedConflict>, detectedAt?: string): void;
|
|
26
|
-
/**
|
|
26
|
+
/** The tenant of every memory the refresh can compare, and each stored conflicts_with_json other than '[]', read before the refresh takes the write lock. */
|
|
27
27
|
export interface ConflictRefreshReads {
|
|
28
28
|
sameTenant: SameTenant;
|
|
29
29
|
storedRefs: ReadonlyMap<string, string | null>;
|
|
30
30
|
}
|
|
31
|
-
/**
|
|
32
|
-
* AT1 (plan §5): additive-optional opts for resolveConflict.
|
|
33
|
-
* `rejectLoserValue` implies removal of the loser regardless of
|
|
34
|
-
* `forgetLoser` — you cannot tombstone a value and leave it live.
|
|
35
|
-
*/
|
|
31
|
+
/** `rejectLoserValue` implies removal of the loser regardless of `forgetLoser`: a tombstoned value cannot stay live. */
|
|
36
32
|
export interface ResolveConflictOpts {
|
|
37
33
|
/** Tombstone the loser's normalized digest + kind-aware remove it. */
|
|
38
34
|
rejectLoserValue?: boolean;
|
|
@@ -42,21 +38,8 @@ export interface ResolveConflictOpts {
|
|
|
42
38
|
* loser is kind='raw'). Defaults to a conflict-context string. */
|
|
43
39
|
reason?: string;
|
|
44
40
|
}
|
|
45
|
-
/**
|
|
46
|
-
*
|
|
47
|
-
* Sets conflict status to 'resolved' and halves the loser's half-life.
|
|
48
|
-
* If --forget is used, the loser is removed entirely (kind-aware: raw rows
|
|
49
|
-
* are archived via archiveRawMemory, others deleted via deleteEntryCore —
|
|
50
|
-
* AT1 fix for the pre-existing crash where a raw loser aborted the whole
|
|
51
|
-
* resolve transaction against the append-only trigger). `opts.rejectLoserValue`
|
|
52
|
-
* additionally tombstones the loser's normalized digest so it cannot be
|
|
53
|
-
* re-asserted later.
|
|
54
|
-
*
|
|
55
|
-
* Every resolution path (weaken / forget / reject) emits a `conflict_resolve`
|
|
56
|
-
* audit row (AT1 — previously resolveConflict wrote zero audit rows on any path).
|
|
57
|
-
*
|
|
58
|
-
* Returns the resolved conflict, or null if not found.
|
|
59
|
-
*/
|
|
41
|
+
/** Resolve a conflict by keeping one memory and halving the loser's half-life; `--forget` removes the loser, `opts.rejectLoserValue` also tombstones its
|
|
42
|
+
* digest. Every path emits a `conflict_resolve` audit row. Returns the resolved conflict, or null if not found. */
|
|
60
43
|
export declare function resolveConflict(hippoRoot: string, conflictId: number, keepId: string, forgetLoser?: boolean, tenantId?: string, opts?: ResolveConflictOpts): {
|
|
61
44
|
conflict: MemoryConflict;
|
|
62
45
|
loserId: string;
|