hippo-memory 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-memories/apply.d.ts +7 -5
- package/dist/agent-memories/apply.js +66 -39
- package/dist/agent-memories/claude-code.d.ts +8 -2
- package/dist/agent-memories/claude-code.js +26 -7
- package/dist/agent-memories/copilot.js +2 -1
- package/dist/agent-memories/files.js +2 -1
- package/dist/agent-memories/legacy.d.ts +6 -3
- package/dist/agent-memories/legacy.js +35 -14
- package/dist/agent-memories/markdown.d.ts +3 -1
- package/dist/agent-memories/markdown.js +3 -1
- package/dist/agent-memories/openclaw.js +5 -2
- package/dist/agent-memories/plan.js +11 -1
- package/dist/agent-memories/project-folds.js +2 -1
- package/dist/agent-memories/report.d.ts +4 -1
- package/dist/agent-memories/report.js +43 -9
- package/dist/agent-memories/source.d.ts +8 -2
- package/dist/agent-memories/source.js +11 -3
- package/dist/agent-memories/sync.d.ts +7 -2
- package/dist/agent-memories/sync.js +141 -101
- package/dist/api/assemble.d.ts +6 -4
- package/dist/api/assemble.js +11 -6
- package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
- package/dist/api/{audit.js → auth/audit.js} +11 -11
- package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -15
- package/dist/api/{auth.js → auth/auth.js} +46 -29
- package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
- package/dist/api/{quarantine.js → auth/quarantine.js} +8 -8
- package/dist/api/auth/session-owners.d.ts +10 -0
- package/dist/api/auth/session-owners.js +35 -0
- package/dist/api/availability.d.ts +3 -1
- package/dist/api/availability.js +3 -1
- package/dist/api/busy.d.ts +2 -0
- package/dist/api/busy.js +2 -0
- package/dist/api/cli-surface.d.ts +6 -0
- package/dist/api/cli-surface.js +6 -0
- package/dist/api/config-of.d.ts +5 -0
- package/dist/api/config-of.js +6 -0
- package/dist/api/context-auto.d.ts +4 -1
- package/dist/api/context-auto.js +10 -2
- package/dist/api/context-render.js +14 -7
- package/dist/api/context-select.d.ts +4 -1
- package/dist/api/context-select.js +23 -14
- package/dist/api/context-types.d.ts +38 -12
- package/dist/api/context.d.ts +8 -5
- package/dist/api/context.js +112 -57
- package/dist/api/continuity.d.ts +24 -21
- package/dist/api/continuity.js +18 -20
- package/dist/api/correction-latency.d.ts +3 -1
- package/dist/api/correction-latency.js +3 -1
- package/dist/api/error-reply.d.ts +4 -1
- package/dist/api/error-reply.js +12 -3
- package/dist/api/index.d.ts +39 -23
- package/dist/api/index.js +21 -23
- package/dist/api/instruction-detect.d.ts +4 -1
- package/dist/api/instruction-detect.js +75 -20
- package/dist/api/ledger-db.d.ts +15 -11
- package/dist/api/ledger-db.js +21 -23
- package/dist/api/memories/conflicts.d.ts +33 -0
- package/dist/api/memories/conflicts.js +67 -0
- package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
- package/dist/api/{forget.js → memories/forget.js} +22 -15
- package/dist/api/memories/memories.d.ts +27 -0
- package/dist/api/{memories.js → memories/memories.js} +16 -21
- package/dist/api/memories/outcome.d.ts +22 -0
- package/dist/api/{outcome.js → memories/outcome.js} +14 -8
- package/dist/api/memories/promote.d.ts +40 -0
- package/dist/api/{promote.js → memories/promote.js} +35 -22
- package/dist/api/memories/refine.d.ts +10 -0
- package/dist/api/memories/refine.js +12 -0
- package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +16 -11
- package/dist/api/{remember-local.js → memories/remember-local.js} +34 -20
- package/dist/api/{remember.d.ts → memories/remember.d.ts} +19 -13
- package/dist/api/{remember.js → memories/remember.js} +42 -26
- package/dist/api/objects/cards.d.ts +39 -0
- package/dist/api/{cards.js → objects/cards.js} +12 -14
- package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
- package/dist/api/{drill-down.js → objects/drill-down.js} +7 -8
- package/dist/api/objects/goals.d.ts +18 -0
- package/dist/api/{goals.js → objects/goals.js} +12 -12
- package/dist/api/objects/graph.d.ts +11 -0
- package/dist/api/objects/graph.js +16 -0
- package/dist/api/objects/objects.d.ts +9 -0
- package/dist/api/{objects.js → objects/objects.js} +2 -4
- package/dist/api/objects/predictions.d.ts +11 -0
- package/dist/api/{predictions.js → objects/predictions.js} +7 -6
- package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
- package/dist/api/{projects.js → objects/projects.js} +8 -4
- package/dist/api/pilot-arm.d.ts +8 -4
- package/dist/api/pilot-arm.js +5 -4
- package/dist/api/prompt-hook.d.ts +32 -19
- package/dist/api/prompt-hook.js +65 -44
- package/dist/api/provenance-coverage.d.ts +3 -1
- package/dist/api/provenance-coverage.js +3 -1
- package/dist/api/recall/finish.d.ts +185 -0
- package/dist/api/recall/finish.js +301 -0
- package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
- package/dist/api/{recall-pipeline.js → recall/pipeline.js} +176 -92
- package/dist/api/recall/recall.d.ts +6 -0
- package/dist/api/{recall.js → recall/recall.js} +101 -60
- package/dist/api/recall/render.d.ts +39 -0
- package/dist/api/recall/render.js +60 -0
- package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
- package/dist/api/recall/request.js +261 -0
- package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
- package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
- package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -70
- package/dist/api/{recall-types.js → recall/types.js} +1 -1
- package/dist/api/session-end.d.ts +16 -12
- package/dist/api/session-end.js +46 -30
- package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
- package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
- package/dist/api/sleep/dormant.d.ts +25 -0
- package/dist/api/sleep/dormant.js +64 -0
- package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
- package/dist/api/sleep/learn.js +138 -0
- package/dist/api/sleep/sleep-run.d.ts +38 -0
- package/dist/api/{sleep-run.js → sleep/sleep-run.js} +51 -43
- package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
- package/dist/api/sleep/sleep.js +9 -0
- package/dist/api/status.d.ts +3 -1
- package/dist/api/status.js +3 -1
- package/dist/api/store-init.d.ts +4 -1
- package/dist/api/store-init.js +4 -1
- package/dist/api/tokens.d.ts +10 -9
- package/dist/api/tokens.js +9 -10
- package/dist/api/types.d.ts +28 -7
- package/dist/api/types.js +13 -4
- package/dist/capture/caller-session.d.ts +8 -2
- package/dist/capture/caller-session.js +16 -6
- package/dist/capture/capture-error.d.ts +3 -1
- package/dist/capture/capture-error.js +3 -1
- package/dist/capture/codex-patch.js +7 -2
- package/dist/capture/command.d.ts +4 -2
- package/dist/capture/command.js +33 -14
- package/dist/capture/compact-resume-caller.js +15 -8
- package/dist/capture/compact.d.ts +8 -5
- package/dist/capture/compact.js +34 -23
- package/dist/capture/compaction-items-caller.js +9 -3
- package/dist/capture/compaction-record.d.ts +4 -3
- package/dist/capture/compaction-record.js +20 -12
- package/dist/capture/compaction-spool.d.ts +15 -4
- package/dist/capture/compaction-spool.js +64 -17
- package/dist/capture/copilot-transcript.d.ts +11 -3
- package/dist/capture/copilot-transcript.js +16 -6
- package/dist/capture/extract.js +20 -8
- package/dist/capture/failure-caller.js +23 -12
- package/dist/capture/failure-reading.d.ts +10 -3
- package/dist/capture/failure-reading.js +24 -7
- package/dist/capture/pre-compact-caller.js +11 -4
- package/dist/capture/session-digest.d.ts +15 -4
- package/dist/capture/session-digest.js +39 -13
- package/dist/capture/session-end-caller.d.ts +4 -1
- package/dist/capture/session-end-caller.js +20 -8
- package/dist/capture/session-texts.d.ts +6 -2
- package/dist/capture/session-texts.js +22 -7
- package/dist/capture/session-worker.d.ts +4 -2
- package/dist/capture/session-worker.js +45 -17
- package/dist/capture/transcript.d.ts +13 -4
- package/dist/capture/transcript.js +32 -10
- package/dist/capture/working-state.d.ts +13 -4
- package/dist/capture/working-state.js +50 -56
- package/dist/cli/api-context.d.ts +14 -2
- package/dist/cli/api-context.js +45 -2
- package/dist/cli/audit.js +23 -23
- package/dist/cli/auth.js +19 -27
- package/dist/cli/briefs.d.ts +1 -1
- package/dist/cli/briefs.js +20 -15
- package/dist/cli/card.d.ts +1 -1
- package/dist/cli/card.js +56 -73
- package/dist/cli/client.d.ts +12 -4
- package/dist/cli/client.js +43 -13
- package/dist/cli/compact-resume-payload.d.ts +4 -1
- package/dist/cli/compact-resume-payload.js +12 -5
- package/dist/cli/context.js +42 -17
- package/dist/cli/continuity.d.ts +5 -5
- package/dist/cli/continuity.js +90 -107
- package/dist/cli/curate.d.ts +4 -3
- package/dist/cli/curate.js +46 -68
- package/dist/cli/dag.d.ts +1 -1
- package/dist/cli/dag.js +14 -17
- package/dist/cli/decisions.js +27 -26
- package/dist/cli/eval.js +16 -21
- package/dist/cli/exit.d.ts +4 -1
- package/dist/cli/exit.js +10 -2
- package/dist/cli/explain.js +12 -11
- package/dist/cli/flag-values.d.ts +1 -1
- package/dist/cli/flag-values.js +9 -18
- package/dist/cli/github.d.ts +6 -0
- package/dist/cli/github.js +25 -13
- package/dist/cli/goals.d.ts +1 -1
- package/dist/cli/goals.js +39 -56
- package/dist/cli/graph.d.ts +1 -1
- package/dist/cli/graph.js +15 -11
- package/dist/cli/hook-runtime.d.ts +31 -9
- package/dist/cli/hook-runtime.js +40 -15
- package/dist/cli/incidents.d.ts +1 -1
- package/dist/cli/incidents.js +25 -25
- package/dist/cli/init.js +26 -11
- package/dist/cli/install-steps.d.ts +12 -3
- package/dist/cli/install-steps.js +42 -18
- package/dist/cli/last-sleep.d.ts +4 -1
- package/dist/cli/last-sleep.js +9 -4
- package/dist/cli/maintenance.d.ts +1 -1
- package/dist/cli/maintenance.js +11 -12
- package/dist/cli/notes.d.ts +1 -1
- package/dist/cli/notes.js +8 -5
- package/dist/cli/object-verbs.d.ts +4 -4
- package/dist/cli/object-verbs.js +10 -13
- package/dist/cli/open-browser.js +11 -2
- package/dist/cli/playbooks.d.ts +3 -3
- package/dist/cli/playbooks.js +40 -32
- package/dist/cli/predictions.js +15 -19
- package/dist/cli/print.js +4 -2
- package/dist/cli/projects.js +21 -11
- package/dist/cli/quality-repair-once.js +5 -4
- package/dist/cli/recall.js +129 -93
- package/dist/cli/refine-llm.d.ts +15 -4
- package/dist/cli/refine-llm.js +16 -7
- package/dist/cli/remember.js +46 -50
- package/dist/cli/scheduler.d.ts +4 -1
- package/dist/cli/scheduler.js +9 -5
- package/dist/cli/serve.js +22 -17
- package/dist/cli/session-hooks.d.ts +2 -2
- package/dist/cli/session-hooks.js +87 -50
- package/dist/cli/setup.js +54 -32
- package/dist/cli/shared.d.ts +3 -1
- package/dist/cli/shared.js +24 -9
- package/dist/cli/slack.js +15 -24
- package/dist/cli/sleep-render.d.ts +3 -1
- package/dist/cli/sleep-render.js +8 -5
- package/dist/cli/sleep.js +14 -6
- package/dist/cli/status.d.ts +4 -4
- package/dist/cli/status.js +32 -27
- package/dist/cli/stdin.d.ts +10 -3
- package/dist/cli/stdin.js +10 -3
- package/dist/cli/transfer.d.ts +1 -1
- package/dist/cli/transfer.js +71 -75
- package/dist/cli/verbs/memory.js +8 -6
- package/dist/cli/verbs/objects.js +10 -4
- package/dist/cli/versioned-verbs.d.ts +8 -7
- package/dist/cli/versioned-verbs.js +31 -21
- package/dist/cli.js +13 -16
- package/dist/connectors/dlq.d.ts +6 -6
- package/dist/connectors/dlq.js +12 -8
- package/dist/connectors/github/backfill.d.ts +4 -4
- package/dist/connectors/github/backfill.js +6 -4
- package/dist/connectors/github/deletion.d.ts +6 -4
- package/dist/connectors/github/deletion.js +5 -5
- package/dist/connectors/github/dlq.d.ts +8 -6
- package/dist/connectors/github/dlq.js +11 -5
- package/dist/connectors/github/ingest.d.ts +2 -2
- package/dist/connectors/github/ingest.js +9 -6
- package/dist/connectors/github/octokit-client.d.ts +3 -1
- package/dist/connectors/github/octokit-client.js +7 -2
- package/dist/connectors/github/ratelimit.d.ts +6 -2
- package/dist/connectors/github/ratelimit.js +6 -2
- package/dist/connectors/github/signature.d.ts +14 -3
- package/dist/connectors/github/signature.js +17 -3
- package/dist/connectors/github/tenant-routing.d.ts +6 -4
- package/dist/connectors/github/tenant-routing.js +6 -6
- package/dist/connectors/github/transform.js +50 -67
- package/dist/connectors/github/types.d.ts +10 -3
- package/dist/connectors/github/types.js +6 -2
- package/dist/connectors/github/webhook.d.ts +5 -5
- package/dist/connectors/github/webhook.js +34 -23
- package/dist/connectors/ingest.d.ts +5 -3
- package/dist/connectors/ingest.js +3 -4
- package/dist/connectors/slack/backfill.d.ts +5 -5
- package/dist/connectors/slack/backfill.js +3 -3
- package/dist/connectors/slack/deletion.d.ts +4 -4
- package/dist/connectors/slack/deletion.js +6 -6
- package/dist/connectors/slack/dlq.d.ts +4 -4
- package/dist/connectors/slack/dlq.js +6 -6
- package/dist/connectors/slack/ingest.d.ts +6 -4
- package/dist/connectors/slack/ingest.js +5 -5
- package/dist/connectors/slack/signature.d.ts +4 -1
- package/dist/connectors/slack/tenant-routing.d.ts +6 -4
- package/dist/connectors/slack/tenant-routing.js +6 -6
- package/dist/connectors/slack/transform.d.ts +6 -2
- package/dist/connectors/slack/transform.js +6 -2
- package/dist/connectors/slack/types.d.ts +3 -1
- package/dist/connectors/slack/web-client.js +8 -3
- package/dist/connectors/slack/webhook.d.ts +5 -5
- package/dist/connectors/slack/webhook.js +19 -11
- package/dist/connectors/slack/workspaces.d.ts +7 -3
- package/dist/connectors/slack/workspaces.js +7 -3
- package/dist/connectors/store.d.ts +8 -0
- package/dist/connectors/store.js +2 -0
- package/dist/consolidate/conflicts.js +23 -9
- package/dist/consolidate/dag-summary.js +2 -1
- package/dist/consolidate/dag.d.ts +10 -5
- package/dist/consolidate/dag.js +37 -36
- package/dist/consolidate/decay.js +19 -6
- package/dist/consolidate/dedupe.d.ts +14 -5
- package/dist/consolidate/dedupe.js +27 -16
- package/dist/consolidate/flush-units.d.ts +4 -1
- package/dist/consolidate/flush-units.js +4 -1
- package/dist/consolidate/half-life-migration.d.ts +18 -8
- package/dist/consolidate/half-life-migration.js +48 -18
- package/dist/consolidate/llm-passes.js +27 -11
- package/dist/consolidate/memory-value-weights.d.ts +6 -2
- package/dist/consolidate/memory-value-weights.js +6 -2
- package/dist/consolidate/memory-value.d.ts +30 -10
- package/dist/consolidate/memory-value.js +36 -13
- package/dist/consolidate/merge.d.ts +4 -1
- package/dist/consolidate/merge.js +42 -32
- package/dist/consolidate/overlap-index.d.ts +8 -2
- package/dist/consolidate/overlap-index.js +11 -4
- package/dist/consolidate/physics-pass.d.ts +3 -1
- package/dist/consolidate/physics-pass.js +10 -7
- package/dist/consolidate/replay.d.ts +11 -4
- package/dist/consolidate/replay.js +19 -7
- package/dist/consolidate/run.d.ts +13 -5
- package/dist/consolidate/run.js +4 -4
- package/dist/consolidate/sleep.d.ts +14 -6
- package/dist/consolidate/sleep.js +41 -38
- package/dist/consolidate/trace.d.ts +7 -2
- package/dist/consolidate/trace.js +7 -2
- package/dist/consolidate/traces.js +26 -29
- package/dist/core/ablation.d.ts +9 -3
- package/dist/core/ablation.js +14 -4
- package/dist/core/active-scope.d.ts +3 -1
- package/dist/core/active-scope.js +3 -1
- package/dist/core/agent-memory-tools.d.ts +2 -0
- package/dist/core/agent-memory-tools.js +2 -0
- package/dist/core/ambient.d.ts +4 -3
- package/dist/core/ambient.js +8 -6
- package/dist/core/api-errors.d.ts +9 -3
- package/dist/core/api-errors.js +9 -3
- package/dist/core/capture-contract.d.ts +4 -1
- package/dist/core/capture-contract.js +27 -8
- package/dist/core/compare.d.ts +24 -8
- package/dist/core/compare.js +24 -8
- package/dist/core/config.d.ts +18 -9
- package/dist/core/config.js +24 -14
- package/dist/core/cosine.d.ts +4 -1
- package/dist/core/cosine.js +4 -1
- package/dist/core/handoff.d.ts +7 -2
- package/dist/core/handoff.js +4 -1
- package/dist/core/markdown.js +21 -16
- package/dist/core/memory-audit.js +14 -3
- package/dist/core/memory-quality.d.ts +12 -3
- package/dist/core/memory-quality.js +57 -21
- package/dist/core/memory.d.ts +84 -27
- package/dist/core/memory.js +73 -29
- package/dist/core/merged-row.d.ts +8 -2
- package/dist/core/merged-row.js +10 -3
- package/dist/core/package-root.d.ts +3 -1
- package/dist/core/package-root.js +3 -1
- package/dist/core/particle-refresh.d.ts +8 -0
- package/dist/core/particle-refresh.js +22 -0
- package/dist/core/physics-config.d.ts +4 -1
- package/dist/core/physics-config.js +6 -2
- package/dist/core/physics.d.ts +37 -11
- package/dist/core/physics.js +55 -20
- package/dist/core/project-identity.d.ts +34 -17
- package/dist/core/project-identity.js +33 -17
- package/dist/core/project-remote.d.ts +8 -4
- package/dist/core/project-remote.js +31 -14
- package/dist/core/recall-scope.d.ts +33 -11
- package/dist/core/recall-scope.js +42 -15
- package/dist/core/rejection-digest.d.ts +7 -0
- package/dist/core/rejection-digest.js +13 -0
- package/dist/core/salience.d.ts +3 -1
- package/dist/core/salience.js +10 -4
- package/dist/core/search-types.d.ts +15 -2
- package/dist/core/search-types.js +11 -0
- package/dist/dashboard/dashboard-actions.js +13 -2
- package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
- package/dist/dashboard/dashboard-snapshot.js +4 -4
- package/dist/dashboard/dashboard.js +6 -3
- package/dist/db/backup.js +2 -2
- package/dist/db/busy.d.ts +10 -3
- package/dist/db/busy.js +27 -5
- package/dist/db/connect.d.ts +10 -3
- package/dist/db/connect.js +8 -3
- package/dist/db/continuity.d.ts +1 -1
- package/dist/db/continuity.js +27 -11
- package/dist/db/meta.d.ts +4 -1
- package/dist/db/meta.js +4 -1
- package/dist/db/migrate.d.ts +10 -5
- package/dist/db/migrate.js +26 -13
- package/dist/db/migrations/index.d.ts +1 -1
- package/dist/db/migrations/index.js +3 -1
- package/dist/db/migrations/types.d.ts +2 -1
- package/dist/db/migrations/v12.js +2 -1
- package/dist/db/migrations/v14.js +2 -1
- package/dist/db/migrations/v15.js +4 -2
- package/dist/db/migrations/v16.js +6 -3
- package/dist/db/migrations/v17.js +2 -1
- package/dist/db/migrations/v19.js +4 -2
- package/dist/db/migrations/v20.js +2 -1
- package/dist/db/migrations/v22.js +12 -6
- package/dist/db/migrations/v23.js +6 -3
- package/dist/db/migrations/v24.js +6 -3
- package/dist/db/migrations/v25.js +4 -2
- package/dist/db/migrations/v26.js +4 -2
- package/dist/db/migrations/v27.js +6 -3
- package/dist/db/migrations/v28.js +4 -2
- package/dist/db/migrations/v29.js +4 -2
- package/dist/db/migrations/v30.js +6 -3
- package/dist/db/migrations/v31.js +4 -2
- package/dist/db/migrations/v32.js +6 -3
- package/dist/db/migrations/v33.js +4 -2
- package/dist/db/migrations/v34.js +2 -1
- package/dist/db/migrations/v35.js +2 -1
- package/dist/db/migrations/v36.js +2 -1
- package/dist/db/migrations/v37.js +10 -5
- package/dist/db/migrations/v38.js +10 -5
- package/dist/db/migrations/v39.js +14 -6
- package/dist/db/migrations/v40.js +4 -2
- package/dist/db/migrations/v41.js +4 -2
- package/dist/db/migrations/v42.js +2 -1
- package/dist/db/migrations/v44.js +4 -2
- package/dist/db/migrations/v45.js +4 -2
- package/dist/db/migrations/v49.js +2 -1
- package/dist/db/migrations/v50.js +4 -2
- package/dist/db/migrations/v51.js +4 -2
- package/dist/db/migrations/v52.js +2 -1
- package/dist/db/migrations/v53.js +8 -4
- package/dist/db/migrations/v54.js +2 -1
- package/dist/db/migrations/v55.js +4 -2
- package/dist/db/migrations/v56.d.ts +3 -0
- package/dist/db/migrations/v56.js +28 -0
- package/dist/db/open.d.ts +24 -12
- package/dist/db/open.js +25 -13
- package/dist/db/physics-state.d.ts +8 -4
- package/dist/db/physics-state.js +13 -20
- package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
- package/dist/db/raw-archive-mirror-cleanup.js +6 -4
- package/dist/db/request-stores.d.ts +19 -5
- package/dist/db/request-stores.js +14 -5
- package/dist/db/tables.d.ts +2 -1
- package/dist/db/tables.js +12 -4
- package/dist/db/vector-store.d.ts +13 -4
- package/dist/db/vector-store.js +34 -14
- package/dist/db/wal-checkpointer.d.ts +2 -1
- package/dist/db/wal-checkpointer.js +19 -7
- package/dist/doctor.d.ts +4 -1
- package/dist/doctor.js +121 -39
- package/dist/embeddings/local.d.ts +8 -4
- package/dist/embeddings/local.js +9 -5
- package/dist/embeddings/provider.d.ts +19 -10
- package/dist/embeddings/provider.js +31 -17
- package/dist/embeddings/transformers.d.ts +16 -4
- package/dist/embeddings/transformers.js +32 -15
- package/dist/entry/json-hooks.d.ts +1 -1
- package/dist/entry/json-hooks.js +1 -1
- package/dist/entry/project-identity.js +2 -1
- package/dist/entry/session-text.d.ts +1 -1
- package/dist/entry/session-text.js +1 -1
- package/dist/entry/sqlite-handles.d.ts +10 -0
- package/dist/entry/sqlite-handles.js +9 -0
- package/dist/entry/store-kit.d.ts +19 -6
- package/dist/entry/store-kit.js +6 -4
- package/dist/eval/eval-stats.d.ts +27 -8
- package/dist/eval/eval-stats.js +17 -5
- package/dist/eval/eval-suite.d.ts +3 -1
- package/dist/eval/eval-suite.js +409 -187
- package/dist/eval/eval.d.ts +8 -2
- package/dist/eval/eval.js +8 -2
- package/dist/eval/judgment.js +16 -6
- package/dist/graph/delta.d.ts +9 -42
- package/dist/graph/delta.js +17 -11
- package/dist/graph/extract.d.ts +10 -7
- package/dist/graph/extract.js +57 -25
- package/dist/graph/recall.d.ts +12 -4
- package/dist/graph/recall.js +30 -13
- package/dist/graph/stream.d.ts +18 -6
- package/dist/graph/stream.js +32 -10
- package/dist/graph/view.d.ts +19 -6
- package/dist/graph/view.js +42 -17
- package/dist/hooks/codex-session.js +2 -2
- package/dist/hooks/codex-wrapper.d.ts +3 -1
- package/dist/hooks/codex-wrapper.js +9 -4
- package/dist/hooks/copilot.d.ts +19 -5
- package/dist/hooks/copilot.js +54 -15
- package/dist/hooks/hook-blocks.d.ts +4 -1
- package/dist/hooks/hook-blocks.js +8 -3
- package/dist/hooks/json-hooks.d.ts +9 -5
- package/dist/hooks/json-hooks.js +69 -34
- package/dist/hooks/opencode.js +15 -5
- package/dist/hooks/shared.d.ts +27 -8
- package/dist/hooks/shared.js +57 -16
- package/dist/importers/core.d.ts +12 -4
- package/dist/importers/core.js +8 -7
- package/dist/importers/markdown-parse.d.ts +15 -5
- package/dist/importers/markdown-parse.js +16 -7
- package/dist/importers/markdown.js +6 -9
- package/dist/importers/sources.js +10 -23
- package/dist/importers/vault.d.ts +2 -2
- package/dist/importers/vault.js +43 -27
- package/dist/index.d.ts +32 -6
- package/dist/index.js +25 -7
- package/dist/learn/autolearn.d.ts +17 -6
- package/dist/learn/autolearn.js +53 -24
- package/dist/learn/churn-git.d.ts +4 -1
- package/dist/learn/churn-git.js +29 -5
- package/dist/learn/extract.d.ts +4 -1
- package/dist/learn/extract.js +16 -9
- package/dist/learn/forward-claim-detector.d.ts +17 -5
- package/dist/learn/forward-claim-detector.js +34 -15
- package/dist/learn/invalidation.d.ts +12 -7
- package/dist/learn/invalidation.js +56 -27
- package/dist/learn/roots.d.ts +3 -0
- package/dist/learn/roots.js +5 -0
- package/dist/mcp/admin-tools.d.ts +5 -5
- package/dist/mcp/admin-tools.js +28 -23
- package/dist/mcp/format.d.ts +1 -1
- package/dist/mcp/format.js +4 -2
- package/dist/mcp/framing.d.ts +3 -1
- package/dist/mcp/framing.js +20 -8
- package/dist/mcp/memory-tools.d.ts +3 -3
- package/dist/mcp/memory-tools.js +18 -14
- package/dist/mcp/protocol.d.ts +32 -16
- package/dist/mcp/protocol.js +12 -9
- package/dist/mcp/recall-tools.d.ts +3 -3
- package/dist/mcp/recall-tools.js +62 -74
- package/dist/mcp/request.d.ts +7 -5
- package/dist/mcp/request.js +57 -74
- package/dist/mcp/server.d.ts +3 -1
- package/dist/mcp/server.js +8 -3
- package/dist/mcp/session-state.d.ts +1 -1
- package/dist/mcp/session-state.js +4 -3
- package/dist/mcp/shared-gate.d.ts +3 -2
- package/dist/mcp/shared-gate.js +3 -2
- package/dist/mcp/stdio.d.ts +6 -3
- package/dist/mcp/stdio.js +52 -21
- package/dist/mcp/tool-args.d.ts +4 -1
- package/dist/mcp/tool-args.js +8 -3
- package/dist/mcp/tools.js +76 -32
- package/dist/objects/customer-notes.d.ts +12 -10
- package/dist/objects/customer-notes.js +21 -15
- package/dist/objects/decisions.d.ts +18 -10
- package/dist/objects/decisions.js +23 -17
- package/dist/objects/descriptor.js +2 -1
- package/dist/objects/fields.d.ts +4 -1
- package/dist/objects/fields.js +6 -2
- package/dist/objects/incidents.d.ts +14 -16
- package/dist/objects/incidents.js +29 -30
- package/dist/objects/lifecycle.d.ts +0 -4
- package/dist/objects/lifecycle.js +21 -24
- package/dist/objects/policies.d.ts +12 -16
- package/dist/objects/policies.js +17 -21
- package/dist/objects/processes.d.ts +16 -10
- package/dist/objects/processes.js +20 -15
- package/dist/objects/project-briefs.d.ts +13 -14
- package/dist/objects/project-briefs.js +33 -39
- package/dist/objects/skills.d.ts +10 -12
- package/dist/objects/skills.js +17 -22
- package/dist/postinstall.js +15 -7
- package/dist/predictions/planning-fallacy.d.ts +19 -6
- package/dist/predictions/planning-fallacy.js +4 -2
- package/dist/rerankers/clef.d.ts +8 -2
- package/dist/rerankers/clef.js +14 -9
- package/dist/rerankers/cross-encoder.d.ts +2 -1
- package/dist/rerankers/cross-encoder.js +9 -6
- package/dist/rerankers/index.js +2 -1
- package/dist/rerankers/jev.js +2 -1
- package/dist/rerankers/llm.d.ts +6 -2
- package/dist/rerankers/llm.js +8 -3
- package/dist/rerankers/remote.d.ts +3 -1
- package/dist/rerankers/remote.js +5 -2
- package/dist/rerankers/types.d.ts +6 -2
- package/dist/search/bm25-search.d.ts +3 -1
- package/dist/search/bm25-search.js +15 -2
- package/dist/search/boosts.js +4 -3
- package/dist/search/embed-memories.d.ts +10 -5
- package/dist/search/embed-memories.js +62 -36
- package/dist/search/engine.d.ts +4 -1
- package/dist/search/engine.js +6 -2
- package/dist/search/goal-boost.d.ts +10 -3
- package/dist/search/goal-boost.js +13 -6
- package/dist/search/hybrid-score.d.ts +4 -1
- package/dist/search/hybrid-score.js +4 -1
- package/dist/search/hybrid.d.ts +23 -8
- package/dist/search/hybrid.js +12 -7
- package/dist/search/multihop.js +14 -13
- package/dist/search/path-context.d.ts +10 -3
- package/dist/search/path-context.js +10 -3
- package/dist/search/physics-search.d.ts +9 -4
- package/dist/search/physics-search.js +38 -14
- package/dist/search/rerank.d.ts +2 -1
- package/dist/search/rerank.js +2 -1
- package/dist/search/rrf.d.ts +14 -5
- package/dist/search/rrf.js +11 -4
- package/dist/search/vector.d.ts +8 -2
- package/dist/search/vector.js +9 -3
- package/dist/server/auth.d.ts +18 -14
- package/dist/server/auth.js +69 -38
- package/dist/server/boot.d.ts +3 -1
- package/dist/server/boot.js +95 -56
- package/dist/server/client-ip.d.ts +11 -4
- package/dist/server/client-ip.js +27 -10
- package/dist/server/cursor.d.ts +10 -3
- package/dist/server/cursor.js +10 -3
- package/dist/server/deadline.d.ts +5 -2
- package/dist/server/deadline.js +10 -3
- package/dist/server/key-check-bounds.js +12 -4
- package/dist/server/lifecycle.d.ts +4 -1
- package/dist/server/lifecycle.js +10 -4
- package/dist/server/mcp-http.d.ts +2 -1
- package/dist/server/mcp-http.js +37 -22
- package/dist/server/rate-limit.d.ts +17 -5
- package/dist/server/rate-limit.js +55 -26
- package/dist/server/ready.js +7 -4
- package/dist/server/request.d.ts +15 -4
- package/dist/server/request.js +42 -15
- package/dist/server/route-checks.d.ts +4 -1
- package/dist/server/route-checks.js +8 -3
- package/dist/server/route-table.d.ts +8 -6
- package/dist/server/route-table.js +547 -93
- package/dist/server/routes/admin.d.ts +7 -7
- package/dist/server/routes/admin.js +36 -15
- package/dist/server/routes/customer-notes.d.ts +5 -5
- package/dist/server/routes/customer-notes.js +5 -4
- package/dist/server/routes/decisions.d.ts +5 -5
- package/dist/server/routes/decisions.js +12 -6
- package/dist/server/routes/incidents.d.ts +5 -5
- package/dist/server/routes/incidents.js +10 -4
- package/dist/server/routes/memories.d.ts +8 -8
- package/dist/server/routes/memories.js +12 -19
- package/dist/server/routes/object-routes.d.ts +8 -5
- package/dist/server/routes/object-routes.js +4 -2
- package/dist/server/routes/policies.d.ts +6 -6
- package/dist/server/routes/policies.js +11 -4
- package/dist/server/routes/predictions.d.ts +5 -5
- package/dist/server/routes/predictions.js +9 -4
- package/dist/server/routes/processes.d.ts +5 -5
- package/dist/server/routes/processes.js +15 -6
- package/dist/server/routes/project-briefs.d.ts +6 -6
- package/dist/server/routes/project-briefs.js +3 -2
- package/dist/server/routes/recall.d.ts +3 -3
- package/dist/server/routes/recall.js +21 -10
- package/dist/server/routes/skills.d.ts +6 -6
- package/dist/server/routes/skills.js +12 -4
- package/dist/server/server-detect.d.ts +24 -8
- package/dist/server/server-detect.js +57 -22
- package/dist/server/sleep-child.js +16 -10
- package/dist/server/sleep-offload.d.ts +8 -5
- package/dist/server/sleep-offload.js +41 -19
- package/dist/server/tls.d.ts +4 -1
- package/dist/server/tls.js +13 -5
- package/dist/server/types.d.ts +38 -26
- package/dist/server/validation.d.ts +4 -1
- package/dist/server/validation.js +22 -9
- package/dist/server.d.ts +15 -10
- package/dist/server.js +32 -12
- package/dist/sharing/global-store.d.ts +5 -10
- package/dist/sharing/global-store.js +8 -43
- package/dist/sharing/global-sync.d.ts +3 -1
- package/dist/sharing/global-sync.js +16 -6
- package/dist/sharing/project-merge.d.ts +25 -7
- package/dist/sharing/project-merge.js +49 -17
- package/dist/sharing/search-both.d.ts +8 -4
- package/dist/sharing/search-both.js +19 -12
- package/dist/sharing/share.d.ts +8 -4
- package/dist/sharing/share.js +39 -15
- package/dist/store/ambient.js +9 -5
- package/dist/store/audit-event.d.ts +2 -2
- package/dist/store/audit-event.js +8 -3
- package/dist/store/audit.d.ts +6 -3
- package/dist/store/audit.js +16 -6
- package/dist/store/auth.d.ts +4 -2
- package/dist/store/auth.js +63 -20
- package/dist/store/busy.d.ts +9 -0
- package/dist/store/busy.js +16 -0
- package/dist/store/candidates.d.ts +12 -5
- package/dist/store/candidates.js +75 -36
- package/dist/store/capture-write.d.ts +2 -1
- package/dist/store/capture-write.js +2 -1
- package/dist/store/card-detail.d.ts +4 -4
- package/dist/store/card-detail.js +15 -8
- package/dist/store/cards.d.ts +24 -10
- package/dist/store/cards.js +93 -60
- package/dist/store/compaction-caller.d.ts +2 -1
- package/dist/store/compaction-caller.js +2 -1
- package/dist/store/compactions-record.d.ts +14 -8
- package/dist/store/compactions-record.js +95 -32
- package/dist/store/compactions.js +35 -15
- package/dist/store/conflicts.d.ts +9 -4
- package/dist/store/conflicts.js +100 -45
- package/dist/store/connectors/dlq.d.ts +17 -5
- package/dist/store/connectors/dlq.js +56 -5
- package/dist/store/connectors/event-log.d.ts +111 -2
- package/dist/store/connectors/event-log.js +2 -1
- package/dist/store/connectors/github.d.ts +6 -3
- package/dist/store/connectors/github.js +24 -40
- package/dist/store/connectors/slack.d.ts +2 -1
- package/dist/store/connectors/slack.js +25 -37
- package/dist/store/dashboard-reads.d.ts +7 -3
- package/dist/store/dashboard-reads.js +32 -11
- package/dist/store/delete-and-batch.d.ts +17 -11
- package/dist/store/delete-and-batch.js +67 -26
- package/dist/store/delivery-recorder.d.ts +8 -5
- package/dist/store/delivery-recorder.js +70 -32
- package/dist/store/descendant-page.d.ts +2 -1
- package/dist/store/descendant-page.js +24 -9
- package/dist/store/diagnostics.d.ts +2 -1
- package/dist/store/diagnostics.js +2 -1
- package/dist/store/doctor-reads.d.ts +2 -1
- package/dist/store/doctor-reads.js +13 -5
- package/dist/store/dormant.d.ts +19 -11
- package/dist/store/dormant.js +40 -18
- package/dist/store/embeddings/index.d.ts +13 -9
- package/dist/store/embeddings/index.js +19 -12
- package/dist/store/entry-reads.d.ts +49 -20
- package/dist/store/entry-reads.js +181 -66
- package/dist/store/entry-row.d.ts +10 -6
- package/dist/store/entry-row.js +17 -12
- package/dist/store/entry-writes.d.ts +22 -10
- package/dist/store/entry-writes.js +41 -14
- package/dist/store/failure-log-at.js +1 -1
- package/dist/store/failure-log.d.ts +4 -2
- package/dist/store/failure-log.js +13 -6
- package/dist/store/gated-write.d.ts +3 -3
- package/dist/store/gated-write.js +3 -3
- package/dist/store/goals.d.ts +5 -4
- package/dist/store/goals.js +8 -10
- package/dist/store/graph-apply.d.ts +21 -0
- package/dist/{graph/write.js → store/graph-apply.js} +31 -11
- package/dist/store/graph-queue.d.ts +9 -6
- package/dist/store/graph-queue.js +15 -10
- package/dist/store/graph-reads.d.ts +16 -11
- package/dist/store/graph-reads.js +24 -15
- package/dist/store/graph-rows.d.ts +41 -3
- package/dist/store/graph-rows.js +10 -7
- package/dist/store/graph-view-rows.js +14 -7
- package/dist/store/graph-writes.d.ts +16 -10
- package/dist/store/graph-writes.js +59 -36
- package/dist/store/handoffs.d.ts +4 -4
- package/dist/store/handoffs.js +40 -19
- package/dist/store/index-and-stats.d.ts +2 -2
- package/dist/store/index-and-stats.js +6 -5
- package/dist/store/index.d.ts +3 -1
- package/dist/store/index.js +1 -0
- package/dist/store/key-audit.d.ts +2 -1
- package/dist/store/key-audit.js +2 -1
- package/dist/store/key-writes.d.ts +2 -1
- package/dist/store/key-writes.js +9 -2
- package/dist/store/ledger-turn.d.ts +4 -1
- package/dist/store/ledger-turn.js +7 -2
- package/dist/store/mirrors.d.ts +11 -4
- package/dist/store/mirrors.js +88 -16
- package/dist/store/narrow.d.ts +6 -0
- package/dist/store/narrow.js +11 -0
- package/dist/store/open.d.ts +4 -2
- package/dist/store/open.js +18 -9
- package/dist/store/pilot-arm.d.ts +2 -1
- package/dist/store/pilot-arm.js +18 -6
- package/dist/store/planning-fallacy-evidence.d.ts +2 -2
- package/dist/store/planning-fallacy-evidence.js +8 -5
- package/dist/store/port/agent-import.d.ts +62 -0
- package/dist/store/port/agent-import.js +2 -0
- package/dist/store/port/consolidation.d.ts +129 -0
- package/dist/store/port/consolidation.js +2 -0
- package/dist/store/port/learning.d.ts +19 -0
- package/dist/store/port/learning.js +2 -0
- package/dist/store/port/local-files.d.ts +18 -0
- package/dist/store/port/local-files.js +2 -0
- package/dist/store/port/promotion.d.ts +20 -0
- package/dist/store/port/promotion.js +3 -0
- package/dist/store/port-groups.d.ts +160 -0
- package/dist/store/port-groups.js +2 -0
- package/dist/store/port.d.ts +215 -229
- package/dist/store/port.js +3 -9
- package/dist/store/predictions.d.ts +14 -10
- package/dist/store/predictions.js +37 -17
- package/dist/store/project-tags.d.ts +4 -1
- package/dist/store/project-tags.js +16 -5
- package/dist/store/quality-repair.d.ts +8 -4
- package/dist/store/quality-repair.js +53 -20
- package/dist/store/quarantine.d.ts +1 -0
- package/dist/store/quarantine.js +23 -9
- package/dist/store/raw-archive.d.ts +5 -4
- package/dist/store/raw-archive.js +11 -10
- package/dist/store/recall-trace.d.ts +22 -17
- package/dist/store/recall-trace.js +126 -63
- package/dist/store/rejected-values.d.ts +15 -10
- package/dist/store/rejected-values.js +33 -12
- package/dist/store/rejection.d.ts +12 -11
- package/dist/store/rejection.js +18 -19
- package/dist/store/report-reads.d.ts +2 -1
- package/dist/store/report-reads.js +2 -1
- package/dist/store/rows.d.ts +7 -5
- package/dist/store/rows.js +18 -11
- package/dist/store/rule-sql.d.ts +6 -4
- package/dist/store/rule-sql.js +16 -9
- package/dist/store/search-rows.d.ts +14 -9
- package/dist/store/search-rows.js +48 -23
- package/dist/store/sessions.d.ts +12 -10
- package/dist/store/sessions.js +40 -21
- package/dist/store/set-aside.d.ts +2 -2
- package/dist/store/set-aside.js +18 -5
- package/dist/store/sqlite/agent-import.d.ts +3 -0
- package/dist/store/sqlite/agent-import.js +77 -0
- package/dist/store/sqlite/cards-group.d.ts +6 -0
- package/dist/store/sqlite/cards-group.js +37 -0
- package/dist/store/sqlite/conflicts-group.d.ts +6 -0
- package/dist/store/sqlite/conflicts-group.js +18 -0
- package/dist/store/sqlite/connector-events-group.d.ts +2 -1
- package/dist/store/sqlite/connector-events-group.js +17 -6
- package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
- package/dist/store/sqlite/connector-writes-group.js +9 -4
- package/dist/store/sqlite/consolidation-group.d.ts +4 -0
- package/dist/store/sqlite/consolidation-group.js +64 -0
- package/dist/store/sqlite/dag-reads-group.js +1 -1
- package/dist/store/sqlite/dormant-group.d.ts +6 -0
- package/dist/store/sqlite/dormant-group.js +29 -0
- package/dist/store/sqlite/entry-writes-group.d.ts +6 -3
- package/dist/store/sqlite/entry-writes-group.js +37 -14
- package/dist/store/sqlite/error-codec.d.ts +4 -2
- package/dist/store/sqlite/error-codec.js +32 -10
- package/dist/store/sqlite/executor-counts.js +2 -1
- package/dist/store/sqlite/executor.d.ts +8 -3
- package/dist/store/sqlite/executor.js +56 -18
- package/dist/store/sqlite/global-promote.d.ts +5 -0
- package/dist/store/sqlite/global-promote.js +48 -0
- package/dist/store/sqlite/goals-group.d.ts +6 -0
- package/dist/store/sqlite/goals-group.js +23 -0
- package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
- package/dist/store/sqlite/graph-reads-group.js +2 -1
- package/dist/store/sqlite/held-connection.d.ts +7 -1
- package/dist/store/sqlite/held-connection.js +34 -7
- package/dist/store/sqlite/last-recall-group.d.ts +4 -2
- package/dist/store/sqlite/last-recall-group.js +9 -4
- package/dist/store/sqlite/learning-group.d.ts +4 -0
- package/dist/store/sqlite/learning-group.js +17 -0
- package/dist/store/sqlite/maintenance-groups.js +2 -1
- package/dist/store/sqlite/object-rows.d.ts +6 -3
- package/dist/store/sqlite/object-rows.js +34 -5
- package/dist/store/sqlite/objects-group.d.ts +5 -4
- package/dist/store/sqlite/objects-group.js +84 -33
- package/dist/store/sqlite/predictions-group.d.ts +2 -1
- package/dist/store/sqlite/predictions-group.js +4 -2
- package/dist/store/sqlite/promotion-group.d.ts +3 -0
- package/dist/store/sqlite/promotion-group.js +10 -0
- package/dist/store/sqlite/quarantine-group.d.ts +2 -1
- package/dist/store/sqlite/quarantine-group.js +4 -2
- package/dist/store/sqlite/reports-group.d.ts +6 -0
- package/dist/store/sqlite/reports-group.js +33 -0
- package/dist/store/sqlite/request-scope.d.ts +6 -0
- package/dist/store/sqlite/request-scope.js +18 -0
- package/dist/store/sqlite/sessions-group.d.ts +6 -0
- package/dist/store/sqlite/sessions-group.js +46 -0
- package/dist/store/sqlite/store.d.ts +22 -11
- package/dist/store/sqlite/store.js +84 -11
- package/dist/store/sqlite/vector-pack.js +2 -1
- package/dist/store/sqlite/vector-reads-group.js +2 -1
- package/dist/store/sqlite/worker-jobs.d.ts +2 -1
- package/dist/store/sqlite/worker-jobs.js +19 -7
- package/dist/store/sqlite/worker-ops.d.ts +10 -5
- package/dist/store/sqlite/worker-ops.js +6 -3
- package/dist/store/sqlite/worker-store.d.ts +4 -3
- package/dist/store/sqlite/worker-store.js +24 -14
- package/dist/store/summaries.d.ts +19 -12
- package/dist/store/summaries.js +36 -21
- package/dist/store/summary-dirty.d.ts +2 -1
- package/dist/store/summary-dirty.js +2 -1
- package/dist/store/tenant.d.ts +3 -2
- package/dist/store/tenant.js +5 -4
- package/dist/store/token-ledger-rows.js +6 -3
- package/dist/store/token-ledger.d.ts +19 -13
- package/dist/store/token-ledger.js +27 -14
- package/dist/store/tombstone-checks.d.ts +4 -1
- package/dist/store/tombstone-checks.js +10 -1
- package/dist/store/usage-reports.js +2 -1
- package/dist/store/vector-index.d.ts +8 -5
- package/dist/store/vector-index.js +24 -10
- package/dist/store/working-memory.d.ts +6 -4
- package/dist/store/working-memory.js +14 -9
- package/dist/support-bundle.js +10 -5
- package/dist/trust/quarantine.d.ts +1 -2
- package/dist/trust/quarantine.js +1 -5
- package/dist/trust/reject-flow.d.ts +12 -3
- package/dist/trust/reject-flow.js +12 -4
- package/dist/util/anthropic-messages.d.ts +4 -1
- package/dist/util/anthropic-messages.js +14 -5
- package/dist/util/atomic-write.d.ts +4 -2
- package/dist/util/atomic-write.js +25 -14
- package/dist/util/compaction-items.d.ts +4 -1
- package/dist/util/compaction-items.js +8 -2
- package/dist/util/crash-handlers.d.ts +7 -2
- package/dist/util/crash-handlers.js +13 -4
- package/dist/util/env.d.ts +16 -4
- package/dist/util/env.js +78 -25
- package/dist/util/home-path.js +12 -6
- package/dist/util/hook-payload.d.ts +3 -1
- package/dist/util/hook-payload.js +3 -1
- package/dist/util/http-retry.d.ts +12 -6
- package/dist/util/http-retry.js +16 -6
- package/dist/util/http-util.d.ts +20 -5
- package/dist/util/http-util.js +28 -9
- package/dist/util/json.d.ts +4 -1
- package/dist/util/json.js +4 -1
- package/dist/util/keyset.js +2 -1
- package/dist/util/limits.js +4 -2
- package/dist/util/log.d.ts +13 -5
- package/dist/util/log.js +29 -6
- package/dist/util/net.d.ts +5 -0
- package/dist/util/net.js +19 -0
- package/dist/util/real-path.d.ts +2 -1
- package/dist/util/real-path.js +4 -3
- package/dist/util/request-scope.d.ts +11 -3
- package/dist/util/request-scope.js +13 -4
- package/dist/util/same-text.d.ts +10 -3
- package/dist/util/same-text.js +10 -3
- package/dist/util/secret-detect.d.ts +24 -7
- package/dist/util/secret-detect.js +49 -14
- package/dist/util/spawn-argv.d.ts +3 -1
- package/dist/util/spawn-argv.js +13 -4
- package/dist/util/sqlite-blocked.d.ts +15 -4
- package/dist/util/sqlite-blocked.js +19 -6
- package/dist/util/stored-json.d.ts +4 -1
- package/dist/util/stored-json.js +6 -2
- package/dist/util/stream-tee.d.ts +2 -1
- package/dist/util/stream-tee.js +8 -5
- package/dist/util/transcript-tail.d.ts +4 -1
- package/dist/util/transcript-tail.js +4 -1
- package/dist/util/version.d.ts +8 -3
- package/dist/util/version.js +8 -3
- package/dist/util/write-budget.d.ts +7 -2
- package/dist/util/write-budget.js +5 -2
- package/dist/util/yaml.d.ts +4 -1
- package/dist/util/yaml.js +4 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -1
- package/scripts/postinstall.cjs +3 -1
- package/dist/api/cards.d.ts +0 -42
- package/dist/api/conflicts.d.ts +0 -28
- package/dist/api/conflicts.js +0 -61
- package/dist/api/dormant.d.ts +0 -14
- package/dist/api/dormant.js +0 -58
- package/dist/api/goals.d.ts +0 -18
- package/dist/api/graph.d.ts +0 -8
- package/dist/api/graph.js +0 -8
- package/dist/api/learn.js +0 -125
- package/dist/api/memories.d.ts +0 -25
- package/dist/api/objects.d.ts +0 -9
- package/dist/api/outcome.d.ts +0 -19
- package/dist/api/predictions.d.ts +0 -11
- package/dist/api/promote.d.ts +0 -36
- package/dist/api/recall-core.d.ts +0 -4
- package/dist/api/recall-core.js +0 -125
- package/dist/api/recall-finish.d.ts +0 -53
- package/dist/api/recall-finish.js +0 -30
- package/dist/api/recall-history.d.ts +0 -64
- package/dist/api/recall-history.js +0 -159
- package/dist/api/recall-record.d.ts +0 -43
- package/dist/api/recall-record.js +0 -78
- package/dist/api/recall-request.js +0 -121
- package/dist/api/recall.d.ts +0 -6
- package/dist/api/refine.d.ts +0 -7
- package/dist/api/refine.js +0 -10
- package/dist/api/session-owners.d.ts +0 -4
- package/dist/api/session-owners.js +0 -17
- package/dist/api/sleep-run.d.ts +0 -26
- package/dist/api/sleep.js +0 -11
- package/dist/graph/write.d.ts +0 -14
- package/dist/store/sqlite/busy.d.ts +0 -3
- package/dist/store/sqlite/busy.js +0 -8
- package/dist/store/sqlite/local.d.ts +0 -4
- package/dist/store/sqlite/local.js +0 -8
package/dist/api/tokens.js
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
// Token-use and failure reports.
|
|
2
2
|
import { rethrowIfSqliteBlocked } from '../util/sqlite-blocked.js';
|
|
3
|
-
import {
|
|
4
|
-
import { failureLogSummary, tokenUseSummary } from '../store/usage-reports.js';
|
|
5
|
-
import { errorMessage, log } from '../util/log.js';
|
|
3
|
+
import { errorMessage, log, errorFields } from '../util/log.js';
|
|
6
4
|
import { DAY_MS } from '../util/time.js';
|
|
7
|
-
/** Records memory text handed to an agent in the token ledger. Best-effort: never throws, since a ledger failure must
|
|
5
|
+
/** Records memory text handed to an agent in the token ledger. Best-effort: never throws, since a ledger failure must
|
|
6
|
+
* not fail the recall or context call. */
|
|
8
7
|
export async function recordTokens(ctx, surface, use) {
|
|
9
8
|
try {
|
|
10
|
-
await
|
|
9
|
+
await ctx.store.recordTokens({
|
|
11
10
|
tenantId: ctx.tenantId,
|
|
12
11
|
sessionId: use.sessionId ?? null,
|
|
13
12
|
surface,
|
|
@@ -18,17 +17,17 @@ export async function recordTokens(ctx, surface, use) {
|
|
|
18
17
|
}
|
|
19
18
|
catch (err) {
|
|
20
19
|
rethrowIfSqliteBlocked(err);
|
|
21
|
-
log.warnThenDebug('api-token-ledger', `token ledger write failed; the reply is unaffected: ${errorMessage(err)}
|
|
20
|
+
log.warnThenDebug('api-token-ledger', `token ledger write failed; the reply is unaffected: ${errorMessage(err)}`, errorFields(err));
|
|
22
21
|
}
|
|
23
22
|
}
|
|
24
|
-
/** Token ledger totals for the tenant over the last `days` days (default 30): tokens sent, skipped as unchanged and
|
|
25
|
-
* per surface, with session counts and mean tokens per session. */
|
|
23
|
+
/** Token ledger totals for the tenant over the last `days` days (default 30): tokens sent, skipped as unchanged and
|
|
24
|
+
* re-read, per surface, with session counts and mean tokens per session. */
|
|
26
25
|
export function tokenSummary(ctx, opts = {}) {
|
|
27
|
-
return
|
|
26
|
+
return ctx.store.reports.tokenUse(ctx.tenantId, reportWindowStart(opts.days));
|
|
28
27
|
}
|
|
29
28
|
/** Failed tool calls by outcome, and repeats across sessions, over the last `days` days (default 30). */
|
|
30
29
|
export function failureSummary(ctx, opts = {}) {
|
|
31
|
-
return
|
|
30
|
+
return ctx.store.reports.failures(ctx.tenantId, reportWindowStart(opts.days));
|
|
32
31
|
}
|
|
33
32
|
function reportWindowStart(days) {
|
|
34
33
|
const span = days !== undefined && Number.isFinite(days) && days > 0 ? days : 30;
|
package/dist/api/types.d.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { BadRequestError } from '../core/api-errors.js';
|
|
2
|
-
import type
|
|
3
|
-
|
|
2
|
+
import { type HippoStore, type StoreGroup, type StoreWith } from '../store/index.js';
|
|
3
|
+
import type { HippoConfig } from '../core/config.js';
|
|
4
|
+
import type { StoreReach } from '../store/port.js';
|
|
5
|
+
/** Actor identity + role for a Context: the audit-log subject (pass `ctx.actor.subject` to audit helpers) and the role
|
|
6
|
+
* for admin gating.
|
|
4
7
|
* Role checks happen at the request boundary (e.g. /v1/sleep), except in authCreate and authRevoke (ForbiddenError). */
|
|
5
8
|
export interface Actor {
|
|
6
9
|
/** 'cli' | 'localhost:cli' | 'api_key:<key_id>' | 'mcp' | 'connector:slack' | 'connector:github' */
|
|
@@ -10,7 +13,8 @@ export interface Actor {
|
|
|
10
13
|
scopes?: readonly string[];
|
|
11
14
|
/** An auth resolver vouched for this caller, so its admin role stops at its own tenant. */
|
|
12
15
|
viaAuthResolver?: true;
|
|
13
|
-
/** The host's operator (CLI, stdio MCP, keyless loopback set to
|
|
16
|
+
/** The host's operator (CLI, stdio MCP, keyless loopback set to
|
|
17
|
+
* admin, host-tenant admin key): may act beyond its tenant. */
|
|
14
18
|
hostAdmin?: true;
|
|
15
19
|
owner?: string;
|
|
16
20
|
}
|
|
@@ -19,19 +23,36 @@ export interface Context {
|
|
|
19
23
|
tenantId: string;
|
|
20
24
|
actor: Actor;
|
|
21
25
|
store?: HippoStore;
|
|
26
|
+
/** Set by a composition root. Absent, the api reads one project and no global store, as for an integrator's store. */
|
|
27
|
+
reach?: StoreReach;
|
|
28
|
+
/** Set by a composition root per command or request; absent, the api reads the store's config.json. */
|
|
29
|
+
config?: HippoConfig;
|
|
22
30
|
}
|
|
23
31
|
export type HippoDbContext = Context & {
|
|
24
32
|
store?: undefined;
|
|
25
33
|
};
|
|
26
|
-
/**
|
|
27
|
-
*
|
|
34
|
+
/** A Context whose store a composition root already built; every
|
|
35
|
+
* api function that reads or writes the store takes this. */
|
|
36
|
+
export type StoreContext = Context & {
|
|
37
|
+
readonly store: HippoStore;
|
|
38
|
+
};
|
|
39
|
+
/** A Context whose store a gate proved holds `G`; the api function reads `ctx.store.<group>` directly. */
|
|
40
|
+
export type ContextWith<G extends StoreGroup> = Context & {
|
|
41
|
+
readonly store: StoreWith<G>;
|
|
42
|
+
};
|
|
43
|
+
/** `ctx` itself once its store proves every group, so a gate hands a handler the type with no copy; throws
|
|
44
|
+
* StoreNotPortedError for the first missing one. */
|
|
45
|
+
export declare function narrowContext<G extends StoreGroup>(ctx: StoreContext, ...groups: readonly [G, ...G[]]): ContextWith<G>;
|
|
46
|
+
/** Builds process-local Actor values (admin and host admin) for CLI and CLI-run connector Contexts; Bearer-authed
|
|
47
|
+
* callers build Actor from the api_keys row instead. */
|
|
28
48
|
export declare function adminActor(subject: string): Actor;
|
|
29
49
|
/** Throws unless the caller is the host's operator: `action` reaches past the caller's tenant. */
|
|
30
50
|
export declare function requireHostAdmin(ctx: Context, action: string): void;
|
|
31
51
|
/** The per-person key: an unowned key gets its own bucket by key id rather than sharing one. */
|
|
32
52
|
export declare function ownerOrSubject(actor: Actor): string;
|
|
33
|
-
/** Thrown by `api.recall` on a contract violation; the stable `code` lets callers discriminate without parsing the
|
|
34
|
-
* 'fresh_tail_requires_session_id' (needs HIPPO_REQUIRE_SESSION_SCOPED_FRESH_TAIL=1) or
|
|
53
|
+
/** Thrown by `api.recall` on a contract violation; the stable `code` lets callers discriminate without parsing the
|
|
54
|
+
* message. 'fresh_tail_requires_session_id' (needs HIPPO_REQUIRE_SESSION_SCOPED_FRESH_TAIL=1) or
|
|
55
|
+
* 'invalid_scorer_window' (0 would hit an uncapped fallback). */
|
|
35
56
|
export declare class RecallContractError extends BadRequestError {
|
|
36
57
|
readonly code: 'fresh_tail_requires_session_id' | 'invalid_scorer_window';
|
|
37
58
|
constructor(code: 'fresh_tail_requires_session_id' | 'invalid_scorer_window', message: string);
|
package/dist/api/types.js
CHANGED
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
// Request context (caller identity and tenant) shared by every API module, plus the recall contract error.
|
|
2
2
|
import { BadRequestError, ForbiddenError } from '../core/api-errors.js';
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
import { narrowStore } from '../store/index.js';
|
|
4
|
+
/** `ctx` itself once its store proves every group, so a gate hands a handler the type with no copy; throws
|
|
5
|
+
* StoreNotPortedError for the first missing one. */
|
|
6
|
+
export function narrowContext(ctx, ...groups) {
|
|
7
|
+
narrowStore(ctx.store, ...groups);
|
|
8
|
+
// SAFETY: narrowStore above proved every group on ctx.store.
|
|
9
|
+
return ctx;
|
|
10
|
+
}
|
|
11
|
+
/** Builds process-local Actor values (admin and host admin) for CLI and CLI-run connector Contexts; Bearer-authed
|
|
12
|
+
* callers build Actor from the api_keys row instead. */
|
|
5
13
|
export function adminActor(subject) {
|
|
6
14
|
return { subject, role: 'admin', hostAdmin: true };
|
|
7
15
|
}
|
|
@@ -14,8 +22,9 @@ export function requireHostAdmin(ctx, action) {
|
|
|
14
22
|
export function ownerOrSubject(actor) {
|
|
15
23
|
return actor.owner ?? actor.subject;
|
|
16
24
|
}
|
|
17
|
-
/** Thrown by `api.recall` on a contract violation; the stable `code` lets callers discriminate without parsing the
|
|
18
|
-
* 'fresh_tail_requires_session_id' (needs HIPPO_REQUIRE_SESSION_SCOPED_FRESH_TAIL=1) or
|
|
25
|
+
/** Thrown by `api.recall` on a contract violation; the stable `code` lets callers discriminate without parsing the
|
|
26
|
+
* message. 'fresh_tail_requires_session_id' (needs HIPPO_REQUIRE_SESSION_SCOPED_FRESH_TAIL=1) or
|
|
27
|
+
* 'invalid_scorer_window' (0 would hit an uncapped fallback). */
|
|
19
28
|
export class RecallContractError extends BadRequestError {
|
|
20
29
|
code;
|
|
21
30
|
constructor(code, message) {
|
|
@@ -2,11 +2,17 @@ import { type Context } from '../api/types.js';
|
|
|
2
2
|
import { type CallerProject } from '../api/prompt-hook.js';
|
|
3
3
|
import type { ContinuityKey } from '../store/sessions.js';
|
|
4
4
|
import { type WorkingState } from './working-state.js';
|
|
5
|
-
/**
|
|
5
|
+
/**
|
|
6
|
+
* Checks the ids, then binds the session to the caller's owner (a ConflictError when another owner holds it). Returns
|
|
7
|
+
* the key the call's rows go under.
|
|
8
|
+
*/
|
|
6
9
|
export declare function bindCaller(ctx: Context, sessionId: string, project: CallerProject): ContinuityKey;
|
|
7
10
|
/** Read only: the session's first prompt booked its arm, and a holdout session gets nothing from hippo. */
|
|
8
11
|
export declare function callerInHoldout(ctx: Context, sessionId: string): boolean;
|
|
9
|
-
/**
|
|
12
|
+
/**
|
|
13
|
+
* Refuses a field past the cap a transcript read gives, naming it; scrubbed again, since the caller's scrub is not
|
|
14
|
+
* trusted, then cut back to the cap.
|
|
15
|
+
*/
|
|
10
16
|
export declare function checkedWorkingState(state: WorkingState | null): WorkingState | null;
|
|
11
17
|
export declare function assertTrigger(trigger: string | null): void;
|
|
12
18
|
export declare function assertRequestId(requestId: string): void;
|
|
@@ -1,14 +1,19 @@
|
|
|
1
|
-
// The checks every caller call shares: ids, project, the session's owner and the pilot arm, all from the request, never
|
|
1
|
+
// The checks every caller call shares: ids, project, the session's owner and the pilot arm, all from the request, never
|
|
2
|
+
// the server's env or folder.
|
|
2
3
|
import { BadRequestError } from '../core/api-errors.js';
|
|
3
4
|
import { ownerOrSubject } from '../api/types.js';
|
|
4
5
|
import { MAX_ID_LEN } from '../util/limits.js';
|
|
5
6
|
import { sessionPilotArm } from '../api/pilot-arm.js';
|
|
7
|
+
import { ledgerReachOf } from '../api/ledger-db.js';
|
|
6
8
|
import { assertCallerIds } from '../api/prompt-hook.js';
|
|
7
9
|
import { assertCallerProject, projectNames } from '../core/project-identity.js';
|
|
8
10
|
import { maskEmails, redactSecretsStrict } from '../util/secret-detect.js';
|
|
9
|
-
import { bindSessionOwner } from '../api/session-owners.js';
|
|
11
|
+
import { bindSessionOwner } from '../api/auth/session-owners.js';
|
|
10
12
|
import { fitWorkingState, WORKING_STATE_CAPS } from './working-state.js';
|
|
11
|
-
/**
|
|
13
|
+
/**
|
|
14
|
+
* Checks the ids, then binds the session to the caller's owner (a ConflictError when another owner holds it). Returns
|
|
15
|
+
* the key the call's rows go under.
|
|
16
|
+
*/
|
|
12
17
|
export function bindCaller(ctx, sessionId, project) {
|
|
13
18
|
assertCallerIds(sessionId, project);
|
|
14
19
|
if (sessionId.trim() === '')
|
|
@@ -20,9 +25,13 @@ export function bindCaller(ctx, sessionId, project) {
|
|
|
20
25
|
}
|
|
21
26
|
/** Read only: the session's first prompt booked its arm, and a holdout session gets nothing from hippo. */
|
|
22
27
|
export function callerInHoldout(ctx, sessionId) {
|
|
23
|
-
|
|
28
|
+
const reach = ledgerReachOf(ctx, true);
|
|
29
|
+
return sessionPilotArm(ctx.hippoRoot, ctx.tenantId, sessionId, false, { reach, ownTenantOnly: true }) === 'holdout';
|
|
24
30
|
}
|
|
25
|
-
/**
|
|
31
|
+
/**
|
|
32
|
+
* Refuses a field past the cap a transcript read gives, naming it; scrubbed again, since the caller's scrub is not
|
|
33
|
+
* trusted, then cut back to the cap.
|
|
34
|
+
*/
|
|
26
35
|
export function checkedWorkingState(state) {
|
|
27
36
|
if (state === null)
|
|
28
37
|
return null;
|
|
@@ -35,8 +44,9 @@ export function checkedWorkingState(state) {
|
|
|
35
44
|
return fitWorkingState({ task: scrub(state.task), summary: scrub(state.summary), next_step: scrub(state.next_step) });
|
|
36
45
|
}
|
|
37
46
|
export function assertTrigger(trigger) {
|
|
38
|
-
if (trigger !== null && trigger.length > MAX_ID_LEN)
|
|
47
|
+
if (trigger !== null && trigger.length > MAX_ID_LEN) {
|
|
39
48
|
throw new BadRequestError(`trigger: at most ${MAX_ID_LEN} characters`);
|
|
49
|
+
}
|
|
40
50
|
}
|
|
41
51
|
export function assertRequestId(requestId) {
|
|
42
52
|
if (requestId.trim() === '')
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { CaptureErrorOutcome } from '../store/failure-log.js';
|
|
2
2
|
import type { JsonValue } from '../util/json.js';
|
|
3
|
-
/**
|
|
3
|
+
/**
|
|
4
|
+
* Store a failure as an error memory unless it is routine or a repeat, and log it either way, even when storing throws.
|
|
5
|
+
*/
|
|
4
6
|
export declare function captureToolFailure(hippoRoot: string, tenantId: string, payload: JsonValue, onLogged?: (failureId: number | null) => void): CaptureErrorOutcome;
|
|
5
7
|
/** Who sent a failure from another machine: the audit actor and the project its lesson and repeat check belong to. */
|
|
6
8
|
export interface LessonCaller {
|
|
@@ -7,7 +7,9 @@ import { loadContentsWithTag } from '../store/entry-reads.js';
|
|
|
7
7
|
import { loadConfig } from '../core/config.js';
|
|
8
8
|
import { recordFailureAt } from '../store/failure-log-at.js';
|
|
9
9
|
import { failureHash, failureSignature, lessonFromFailure, payloadString, } from './failure-reading.js';
|
|
10
|
-
/**
|
|
10
|
+
/**
|
|
11
|
+
* Store a failure as an error memory unless it is routine or a repeat, and log it either way, even when storing throws.
|
|
12
|
+
*/
|
|
11
13
|
export function captureToolFailure(hippoRoot, tenantId, payload, onLogged) {
|
|
12
14
|
const lesson = lessonFromFailure(payload);
|
|
13
15
|
let outcome = 'store-failed';
|
|
@@ -40,9 +40,14 @@ const HEREDOC = new RegExp(String.raw `^\s*(?:cd\s+(?<cd>'[^']*'|"[^"]*"|[^\s'"&
|
|
|
40
40
|
String.raw `(?<body>[\s\S]*?)\r?\n\s*\k<tag>\s*$`);
|
|
41
41
|
/** The script a shell argv runs, for the shells Codex checks for an apply_patch heredoc. */
|
|
42
42
|
function shellScript(argv) {
|
|
43
|
-
const exe = path
|
|
44
|
-
|
|
43
|
+
const exe = path
|
|
44
|
+
.basename(argv[0] ?? '')
|
|
45
|
+
.toLowerCase()
|
|
46
|
+
.replace(/\.exe$/, '');
|
|
47
|
+
const isPosixShell = exe === 'bash' || exe === 'zsh' || exe === 'sh';
|
|
48
|
+
if (isPosixShell && argv.length === 3 && (argv[1] === '-lc' || argv[1] === '-c')) {
|
|
45
49
|
return argv[2];
|
|
50
|
+
}
|
|
46
51
|
if (exe === 'pwsh' || exe === 'powershell') {
|
|
47
52
|
const rest = argv.slice(1).filter((a) => a.toLowerCase() !== '-noprofile');
|
|
48
53
|
if (rest.length === 2 && rest[0].toLowerCase() === '-command')
|
|
@@ -12,12 +12,14 @@ export interface CaptureOptions {
|
|
|
12
12
|
stdinText?: string;
|
|
13
13
|
stdinTimedOut?: boolean;
|
|
14
14
|
sessionTurns?: readonly SessionTurn[];
|
|
15
|
-
/** Tee stdout/stderr to this log file while capture runs, so SessionEnd output (lost in TUI teardown) shows via
|
|
15
|
+
/** Tee stdout/stderr to this log file while capture runs, so SessionEnd output (lost in TUI teardown) shows via
|
|
16
|
+
* `hippo last-sleep`.
|
|
16
17
|
* Appends, because `hippo sleep` writes the same file first. */
|
|
17
18
|
logFile?: string;
|
|
18
19
|
dryRun: boolean;
|
|
19
20
|
global: boolean;
|
|
20
|
-
/** Tenant scope for the dedup read in `cmdCaptureCore`: when set and `global` is false, only this tenant's
|
|
21
|
+
/** Tenant scope for the dedup read in `cmdCaptureCore`: when set and `global` is false, only this tenant's
|
|
22
|
+
* memories count.
|
|
21
23
|
* Undefined means host-wide dedup; ignored when `global: true`. */
|
|
22
24
|
tenantId?: string;
|
|
23
25
|
/** The session's project: rows are stamped with its id, and dedup reads its rows under either name. */
|
package/dist/capture/command.js
CHANGED
|
@@ -10,12 +10,13 @@ import { maskEmails, redactSecretsStrict } from '../util/secret-detect.js';
|
|
|
10
10
|
import { withRejectionProbe } from '../store/rejection-probe.js';
|
|
11
11
|
import { loadConfig } from '../core/config.js';
|
|
12
12
|
import { classifyOriginProject, projectId, isInitialized } from '../core/project-identity.js';
|
|
13
|
-
import { errorMessage, log } from '../util/log.js';
|
|
13
|
+
import { errorMessage, log, errorFields } from '../util/log.js';
|
|
14
14
|
import { teeStdStreams } from '../util/stream-tee.js';
|
|
15
15
|
import { extractFromTexts } from './extract.js';
|
|
16
16
|
import { collectSessionTurns, sessionTail, resolveLastSessionTranscript } from './transcript.js';
|
|
17
17
|
export function cmdCapture(hippoRoot, options) {
|
|
18
|
-
// Tee to a log file for the SessionEnd hook; APPEND, because `hippo sleep` runs first in that sequence and already
|
|
18
|
+
// Tee to a log file for the SessionEnd hook; APPEND, because `hippo sleep` runs first in that sequence and already
|
|
19
|
+
// wrote its header and body.
|
|
19
20
|
const restoreStdio = options.logFile ? beginLogTee(options.logFile) : null;
|
|
20
21
|
try {
|
|
21
22
|
cmdCaptureCore(hippoRoot, options);
|
|
@@ -45,7 +46,7 @@ function writeLogBanner(logFile) {
|
|
|
45
46
|
fs.appendFileSync(logFile, `[hippo] ${new Date().toISOString()} capturing session...\n`, 'utf8');
|
|
46
47
|
}
|
|
47
48
|
catch (err) {
|
|
48
|
-
log.warn(`could not open log file ${logFile}: ${errorMessage(err)}
|
|
49
|
+
log.warn(`could not open log file ${logFile}: ${errorMessage(err)}`, errorFields(err));
|
|
49
50
|
return false;
|
|
50
51
|
}
|
|
51
52
|
return true;
|
|
@@ -59,8 +60,11 @@ function cmdCaptureCore(hippoRoot, options) {
|
|
|
59
60
|
}
|
|
60
61
|
else {
|
|
61
62
|
if (!isInitialized(hippoRoot)) {
|
|
62
|
-
console.error(`No hippo store at ${hippoRoot} (searched ${process.cwd()} and its parents up to your home directory).
|
|
63
|
-
|
|
63
|
+
console.error(`No hippo store at ${hippoRoot} (searched ${process.cwd()} and its parents up to your home directory). ` +
|
|
64
|
+
`Run \`hippo init\` first.`);
|
|
65
|
+
// Set, not exit, so cmdCapture's finally restores the tee'd stdio.
|
|
66
|
+
process.exitCode = 1;
|
|
67
|
+
return;
|
|
64
68
|
}
|
|
65
69
|
}
|
|
66
70
|
const read = readCaptureTexts(options);
|
|
@@ -71,7 +75,8 @@ function cmdCaptureCore(hippoRoot, options) {
|
|
|
71
75
|
console.log('No text to capture from.');
|
|
72
76
|
return;
|
|
73
77
|
}
|
|
74
|
-
// Scrub once here, as the snapshot fields are: every source can
|
|
78
|
+
// Scrub once here, as the snapshot fields are: every source can
|
|
79
|
+
// carry a pasted token (AGENTS.md: no secrets in memories).
|
|
75
80
|
const extracted = extractFromTexts(texts.map((text) => maskEmails(redactSecretsStrict(text))), userTexts);
|
|
76
81
|
if (extracted.length === 0) {
|
|
77
82
|
console.log('No actionable items found in the input.');
|
|
@@ -86,7 +91,8 @@ function cmdCaptureCore(hippoRoot, options) {
|
|
|
86
91
|
};
|
|
87
92
|
printCaptureTally(options, captureExtractedItems(targetRoot, writeOpts, extracted, keys));
|
|
88
93
|
}
|
|
89
|
-
// Dedup only against rows this capture's reader sees: another tenant's or project's rows are hidden, so they must not
|
|
94
|
+
// Dedup only against rows this capture's reader sees: another tenant's or project's rows are hidden, so they must not
|
|
95
|
+
// stop its own copy.
|
|
90
96
|
// Only a row holding an item's longest word can hold that item, so the store returns those rows and no others.
|
|
91
97
|
function storedKeysInView(targetRoot, options, extracted) {
|
|
92
98
|
const stored = loadTextsHoldingWords(targetRoot, options.global ? undefined : options.tenantId, extracted.map((item) => longestWord(item.content)), undefined, EVERY_SCOPE);
|
|
@@ -102,7 +108,8 @@ function printCaptureTally(options, { captured, skipped, rejected }) {
|
|
|
102
108
|
(rejected > 0 ? `, ${rejected} rejected` : '') +
|
|
103
109
|
')');
|
|
104
110
|
}
|
|
105
|
-
/** The raw texts for the chosen source, one per session turn, the person's turns first; null after printing why a
|
|
111
|
+
/** The raw texts for the chosen source, one per session turn, the person's turns first; null after printing why a
|
|
112
|
+
* last-session capture has nothing.
|
|
106
113
|
* Only a session says who spoke, so a piped or file capture counts no user texts. */
|
|
107
114
|
function readCaptureTexts(options) {
|
|
108
115
|
switch (options.source) {
|
|
@@ -112,17 +119,20 @@ function readCaptureTexts(options) {
|
|
|
112
119
|
}
|
|
113
120
|
catch {
|
|
114
121
|
console.error('No input on stdin. Pipe text in or use --file <path>.');
|
|
115
|
-
process.
|
|
122
|
+
process.exitCode = 1;
|
|
123
|
+
return null;
|
|
116
124
|
}
|
|
117
125
|
}
|
|
118
126
|
case 'file': {
|
|
119
127
|
if (!options.filePath) {
|
|
120
128
|
console.error('Missing file path. Usage: hippo capture --file <path>');
|
|
121
|
-
process.
|
|
129
|
+
process.exitCode = 1;
|
|
130
|
+
return null;
|
|
122
131
|
}
|
|
123
132
|
if (!fs.existsSync(options.filePath)) {
|
|
124
133
|
console.error(`File not found: ${options.filePath}`);
|
|
125
|
-
process.
|
|
134
|
+
process.exitCode = 1;
|
|
135
|
+
return null;
|
|
126
136
|
}
|
|
127
137
|
return { texts: [fs.readFileSync(options.filePath, 'utf8')], userTexts: 0 };
|
|
128
138
|
}
|
|
@@ -149,7 +159,14 @@ export function captureExtractedItems(targetRoot, options, extracted, keys) {
|
|
|
149
159
|
const tally = { captured: 0, skipped: 0, rejected: 0 };
|
|
150
160
|
const baseHalfLifeDays = loadConfig(targetRoot).defaultHalfLifeDays;
|
|
151
161
|
if (!options.dryRun) {
|
|
152
|
-
const outcomes = writeCapturedItems(targetRoot, extracted.map((item) => ({
|
|
162
|
+
const outcomes = writeCapturedItems(targetRoot, extracted.map((item) => ({
|
|
163
|
+
content: item.content,
|
|
164
|
+
makeEntry: () => captureEntry(item, options, baseHalfLifeDays),
|
|
165
|
+
})), keys, {
|
|
166
|
+
actor: options.actor,
|
|
167
|
+
lean: options.lean,
|
|
168
|
+
onCaptured: options.lean ? undefined : (entry) => void embedMemory(targetRoot, entry),
|
|
169
|
+
});
|
|
153
170
|
for (const outcome of outcomes)
|
|
154
171
|
tally[outcome]++;
|
|
155
172
|
return tally;
|
|
@@ -187,9 +204,11 @@ function captureEntry(item, options, baseHalfLifeDays) {
|
|
|
187
204
|
confidence: 'observed',
|
|
188
205
|
pinned: item.fromUser === true && item.category === 'rule',
|
|
189
206
|
tenantId: options.tenantId,
|
|
190
|
-
|
|
207
|
+
sourceSessionId: options.sessionId,
|
|
191
208
|
baseHalfLifeDays,
|
|
192
209
|
});
|
|
193
|
-
|
|
210
|
+
if (options.originProject === undefined)
|
|
211
|
+
return created;
|
|
212
|
+
return { ...created, origin_project: projectId(options.originProject) };
|
|
194
213
|
}
|
|
195
214
|
//# sourceMappingURL=command.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { COMPACT_RESUME_EVENT_CONTENT_CAP, COMPACT_RESUME_MAX_AGE_MS, compactResumeText } from '../api/context-render.js';
|
|
2
|
-
import { bookTokenUse } from '../api/ledger-db.js';
|
|
3
|
-
import { errorMessage, log } from '../util/log.js';
|
|
1
|
+
import { COMPACT_RESUME_EVENT_CONTENT_CAP, COMPACT_RESUME_MAX_AGE_MS, compactResumeText, } from '../api/context-render.js';
|
|
2
|
+
import { bookTokenUse, ledgerReachOf } from '../api/ledger-db.js';
|
|
3
|
+
import { errorMessage, log, errorFields } from '../util/log.js';
|
|
4
4
|
import { listSessionEvents, loadFreshActiveTaskSnapshot } from '../store/sessions.js';
|
|
5
5
|
import { estimateTokens } from '../util/token-text.js';
|
|
6
6
|
import { truncateCodePointSafe } from '../util/transcript-tail.js';
|
|
@@ -10,13 +10,20 @@ export function compactResumeForCaller(ctx, req) {
|
|
|
10
10
|
if (req.source !== 'compact' || callerInHoldout(ctx, req.sessionId))
|
|
11
11
|
return { stdout: '' };
|
|
12
12
|
const snapshot = loadFreshActiveTaskSnapshot(ctx.hippoRoot, ctx.tenantId, { maxAgeMs: COMPACT_RESUME_MAX_AGE_MS }, key);
|
|
13
|
-
// One owner's concurrent sessions must not cross-restore; a
|
|
14
|
-
|
|
13
|
+
// One owner's concurrent sessions must not cross-restore; a
|
|
14
|
+
// snapshot with no session still restores, as on the local path.
|
|
15
|
+
if (snapshot === null || (snapshot.session_id !== null && snapshot.session_id !== req.sessionId)) {
|
|
15
16
|
return { stdout: '' };
|
|
17
|
+
}
|
|
16
18
|
const text = compactResumeText(snapshot, sessionTrail(ctx, snapshot.session_id));
|
|
17
19
|
bookTokenUse(ctx.hippoRoot, {
|
|
18
|
-
tenantId: ctx.tenantId,
|
|
19
|
-
|
|
20
|
+
tenantId: ctx.tenantId,
|
|
21
|
+
sessionId: req.sessionId,
|
|
22
|
+
surface: 'compact_resume',
|
|
23
|
+
event: 'inject',
|
|
24
|
+
items: 1,
|
|
25
|
+
tokens: estimateTokens(text),
|
|
26
|
+
}, ledgerReachOf(ctx, true));
|
|
20
27
|
return { stdout: text };
|
|
21
28
|
}
|
|
22
29
|
/** A bad trail row costs the trail, not the snapshot. */
|
|
@@ -28,7 +35,7 @@ function sessionTrail(ctx, sessionId) {
|
|
|
28
35
|
.map((e) => ({ ...e, content: truncateCodePointSafe(e.content, COMPACT_RESUME_EVENT_CONTENT_CAP) }));
|
|
29
36
|
}
|
|
30
37
|
catch (err) {
|
|
31
|
-
log.warn(`compact-resume: trail skipped: ${errorMessage(err)}
|
|
38
|
+
log.warn(`compact-resume: trail skipped: ${errorMessage(err)}`, errorFields(err));
|
|
32
39
|
return [];
|
|
33
40
|
}
|
|
34
41
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type HookRuntime } from '../core/capture-contract.js';
|
|
2
|
-
/** Log-forgery guard: strip C0 control chars (newlines above all) from payload-controlled values so a crafted value
|
|
3
|
-
*
|
|
2
|
+
/** Log-forgery guard: strip C0 control chars (newlines above all) from payload-controlled values so a crafted value
|
|
3
|
+
* cannot inject fake `[hippo]` log lines. Exported as the one shared guard for every `[hippo]`-prefixed log writer that
|
|
4
|
+
* interpolates payload values. */
|
|
4
5
|
export declare function sanitizeLogMessage(message: string): string;
|
|
5
6
|
export interface PreCompactOptions {
|
|
6
7
|
stdinText?: string;
|
|
@@ -10,8 +11,9 @@ export interface PreCompactOptions {
|
|
|
10
11
|
/** Called once when the hook accepts a compaction, with the text it printed or null when it printed none. */
|
|
11
12
|
onBoundary?: (printed: string | null) => void;
|
|
12
13
|
}
|
|
13
|
-
/** PreCompact hook entry point. Exit code 2 BLOCKS compaction, so every path (bad stdin, missing transcript, store
|
|
14
|
-
*
|
|
14
|
+
/** PreCompact hook entry point. Exit code 2 BLOCKS compaction, so every path (bad stdin, missing transcript, store
|
|
15
|
+
* error) must exit 0 as a logged no-op. Callers must not wrap this in anything that turns a caught-and-logged failure
|
|
16
|
+
* into a non-zero exit. */
|
|
15
17
|
export declare function cmdPreCompact(hippoRoot: string, options: PreCompactOptions): Promise<void>;
|
|
16
18
|
export interface PostCompactOptions {
|
|
17
19
|
stdinText?: string;
|
|
@@ -19,6 +21,7 @@ export interface PostCompactOptions {
|
|
|
19
21
|
logFile?: string;
|
|
20
22
|
afterSave?: (transcriptPath: string, cwd: string | null, log: (message: string) => void) => void;
|
|
21
23
|
}
|
|
22
|
-
/** PostCompact entry point: saves the summary and its items, replays earlier leftovers, returns the one line to show.
|
|
24
|
+
/** PostCompact entry point: saves the summary and its items, replays earlier leftovers, returns the one line to show.
|
|
25
|
+
* Never throws, so the hook exits 0. */
|
|
23
26
|
export declare function cmdPostCompact(hippoRoot: string, options: PostCompactOptions): string | null;
|
|
24
27
|
//# sourceMappingURL=compact.d.ts.map
|
package/dist/capture/compact.js
CHANGED
|
@@ -7,15 +7,16 @@ import { recordCompactionStart, recordSnapshotSaved } from '../store/compactions
|
|
|
7
7
|
import { COMPACTION_DB_WAIT_MS } from '../core/compaction-timing.js';
|
|
8
8
|
import { resolveTenantId } from '../store/tenant.js';
|
|
9
9
|
import { defaultPreCompactLogPath, vscodeUserHooksFile } from '../hooks/shared.js';
|
|
10
|
-
import { readClaudeCodePostCompact, readClaudeCodePreCompact } from '../core/capture-contract.js';
|
|
11
|
-
import { errorMessage, log as logger } from '../util/log.js';
|
|
10
|
+
import { readClaudeCodePostCompact, readClaudeCodePreCompact, } from '../core/capture-contract.js';
|
|
11
|
+
import { errorMessage, log as logger, errorFields } from '../util/log.js';
|
|
12
12
|
import { resolveLastSessionTranscript } from './transcript.js';
|
|
13
13
|
import { isVscodeTranscript } from './copilot-transcript.js';
|
|
14
14
|
import { mergeWorkingState, transcriptWorkingState } from './working-state.js';
|
|
15
15
|
// Diagnostic-only log; a long-lived install must not grow it unbounded.
|
|
16
16
|
const PRE_COMPACT_LOG_MAX_BYTES = 256 * 1024;
|
|
17
|
-
/** Log-forgery guard: strip C0 control chars (newlines above all) from payload-controlled values so a crafted value
|
|
18
|
-
*
|
|
17
|
+
/** Log-forgery guard: strip C0 control chars (newlines above all) from payload-controlled values so a crafted value
|
|
18
|
+
* cannot inject fake `[hippo]` log lines. Exported as the one shared guard for every `[hippo]`-prefixed log writer that
|
|
19
|
+
* interpolates payload values. */
|
|
19
20
|
export function sanitizeLogMessage(message) {
|
|
20
21
|
// eslint-disable-next-line no-control-regex
|
|
21
22
|
return message.replace(/[\x00-\x1f]/g, '');
|
|
@@ -23,14 +24,16 @@ export function sanitizeLogMessage(message) {
|
|
|
23
24
|
function appendPreCompactLog(logFile, message) {
|
|
24
25
|
try {
|
|
25
26
|
fs.mkdirSync(path.dirname(logFile), { recursive: true });
|
|
26
|
-
// One handle, so the cap acts on the file it measured; two hooks writing in the same instant can overwrite one
|
|
27
|
+
// One handle, so the cap acts on the file it measured; two hooks writing in the same instant can overwrite one
|
|
28
|
+
// diagnostic line, which this log accepts.
|
|
27
29
|
const fd = fs.openSync(logFile, fs.constants.O_RDWR | fs.constants.O_CREAT);
|
|
28
30
|
try {
|
|
29
31
|
const size = fs.fstatSync(fd).size;
|
|
30
32
|
const startFresh = size > PRE_COMPACT_LOG_MAX_BYTES; // a dumb cap, no rotation
|
|
31
33
|
if (startFresh)
|
|
32
34
|
fs.ftruncateSync(fd, 0);
|
|
33
|
-
|
|
35
|
+
const line = `[hippo] ${new Date().toISOString()} ${sanitizeLogMessage(message)}\n`;
|
|
36
|
+
fs.writeSync(fd, line, startFresh ? 0 : size, 'utf8');
|
|
34
37
|
}
|
|
35
38
|
finally {
|
|
36
39
|
fs.closeSync(fd);
|
|
@@ -38,7 +41,7 @@ function appendPreCompactLog(logFile, message) {
|
|
|
38
41
|
}
|
|
39
42
|
catch (err) {
|
|
40
43
|
// Diagnostic-only; a log write failure must never affect the exit-0 contract.
|
|
41
|
-
logger.debug(`pre-compact log not written: ${errorMessage(err)}
|
|
44
|
+
logger.debug(`pre-compact log not written: ${errorMessage(err)}`, errorFields(err));
|
|
42
45
|
}
|
|
43
46
|
}
|
|
44
47
|
/** True iff `filePath` exists and is readable — checks both in one call. */
|
|
@@ -51,8 +54,8 @@ function isReadableFile(filePath) {
|
|
|
51
54
|
return false; // missing and unreadable both mean "no file" to the caller
|
|
52
55
|
}
|
|
53
56
|
}
|
|
54
|
-
/** PreCompact stdout is the summariser's instructions; sent before the snapshot work because a locked store can run the
|
|
55
|
-
* s limit, and via writeSync because process.exit drops buffered pipe output. */
|
|
57
|
+
/** PreCompact stdout is the summariser's instructions; sent before the snapshot work because a locked store can run the
|
|
58
|
+
* hook past its 30 s limit, and via writeSync because process.exit drops buffered pipe output. */
|
|
56
59
|
function printPreCompactInstruction(logFile) {
|
|
57
60
|
const text = `${PRE_COMPACT_INSTRUCTION}\n`;
|
|
58
61
|
try {
|
|
@@ -70,13 +73,15 @@ function snapshotJustSaved(hippoRoot, sessionId) {
|
|
|
70
73
|
if (sessionId === null || sessionId === '')
|
|
71
74
|
return false;
|
|
72
75
|
const active = loadActiveTaskSnapshot(hippoRoot, resolveTenantId({}));
|
|
73
|
-
return active?.session_id === sessionId && active.source === 'pre-compact' &&
|
|
76
|
+
return active?.session_id === sessionId && active.source === 'pre-compact' &&
|
|
77
|
+
Date.now() - Date.parse(active.updated_at) < TWIN_FIRE_MS;
|
|
74
78
|
}
|
|
75
|
-
/** Runs the PreCompact producer: records the compaction, asks the summariser for memories, saves a working-state
|
|
76
|
-
* memories itself; SessionEnd capture owns that. */
|
|
79
|
+
/** Runs the PreCompact producer: records the compaction, asks the summariser for memories, saves a working-state
|
|
80
|
+
* snapshot. Never extracts memories itself; SessionEnd capture owns that. */
|
|
77
81
|
function runPreCompact(hippoRoot, options, logFile) {
|
|
78
82
|
const { stdinText, stdinTimedOut = false, runtime = 'claude-code' } = options;
|
|
79
|
-
// PreCompact fires in every Claude Code project, including ones that never ran `hippo init`; gate before any call
|
|
83
|
+
// PreCompact fires in every Claude Code project, including ones that never ran `hippo init`; gate before any call
|
|
84
|
+
// that would create a store.
|
|
80
85
|
if (!isInitialized(hippoRoot)) {
|
|
81
86
|
appendPreCompactLog(logFile, 'skip: store not initialized');
|
|
82
87
|
return;
|
|
@@ -87,7 +92,8 @@ function runPreCompact(hippoRoot, options, logFile) {
|
|
|
87
92
|
return;
|
|
88
93
|
}
|
|
89
94
|
const { sessionId, transcriptPath: payloadTranscriptPath } = receipt.input;
|
|
90
|
-
// With chat.useClaudeHooks on, VS Code runs Claude Code's hooks too; it never sends PostCompact to close a record,
|
|
95
|
+
// With chat.useClaudeHooks on, VS Code runs Claude Code's hooks too; it never sends PostCompact to close a record,
|
|
96
|
+
// nor reads the summariser text.
|
|
91
97
|
const vscode = runtime === 'claude-code' && isVscodeTranscript(payloadTranscriptPath);
|
|
92
98
|
if (vscode && fs.existsSync(vscodeUserHooksFile())) {
|
|
93
99
|
appendPreCompactLog(logFile, 'skip: VS Code payload, hippo.json runs pre-compact for this chat');
|
|
@@ -97,7 +103,8 @@ function runPreCompact(hippoRoot, options, logFile) {
|
|
|
97
103
|
appendPreCompactLog(logFile, `skip: snapshot for session ${sessionId} saved under ${TWIN_FIRE_MS / 1000} s ago, by the other preCompact entry`);
|
|
98
104
|
return;
|
|
99
105
|
}
|
|
100
|
-
const
|
|
106
|
+
const closable = runtime === 'claude-code' && !vscode;
|
|
107
|
+
const recordId = markCompactionBoundary(hippoRoot, options, logFile, receipt.input, closable);
|
|
101
108
|
const transcriptPath = resolvePreCompactTranscript(payloadTranscriptPath, stdinText, logFile, runtime);
|
|
102
109
|
if (!transcriptPath)
|
|
103
110
|
return;
|
|
@@ -107,8 +114,8 @@ function runPreCompact(hippoRoot, options, logFile) {
|
|
|
107
114
|
return;
|
|
108
115
|
saveDerivedSnapshot(hippoRoot, logFile, sessionId, recordId, derived);
|
|
109
116
|
}
|
|
110
|
-
/** Starts the compaction record when the host will close one (`closable`), then tells `onBoundary` what was printed;
|
|
111
|
-
* null without a record. */
|
|
117
|
+
/** Starts the compaction record when the host will close one (`closable`), then tells `onBoundary` what was printed;
|
|
118
|
+
* the record id, or null without a record. */
|
|
112
119
|
function markCompactionBoundary(hippoRoot, options, logFile, input, closable) {
|
|
113
120
|
const { sessionId } = input;
|
|
114
121
|
// The record is the "something saved before every compaction", so it lands even when no snapshot is derivable later.
|
|
@@ -162,9 +169,10 @@ function saveDerivedSnapshot(hippoRoot, logFile, sessionId, recordId, derived) {
|
|
|
162
169
|
existing = loadActiveTaskSnapshot(hippoRoot, tenantId);
|
|
163
170
|
}
|
|
164
171
|
catch (err) {
|
|
165
|
-
logger.
|
|
172
|
+
logger.warn(`pre-compact: stored snapshot unreadable, saving the derived one alone: ${errorMessage(err)}`, errorFields(err));
|
|
166
173
|
}
|
|
167
|
-
// Carried-over fields are not re-capped, as `hippo snapshot save` stays uncapped; saveActiveTaskSnapshot scrubs every
|
|
174
|
+
// Carried-over fields are not re-capped, as `hippo snapshot save` stays uncapped; saveActiveTaskSnapshot scrubs every
|
|
175
|
+
// field.
|
|
168
176
|
const merged = mergeWorkingState(derived, existing, sessionId);
|
|
169
177
|
if (merged === null) {
|
|
170
178
|
appendPreCompactLog(logFile, 'skip: no snapshot content for this session (nothing derivable; fallback blocked or empty)');
|
|
@@ -173,16 +181,18 @@ function saveDerivedSnapshot(hippoRoot, logFile, sessionId, recordId, derived) {
|
|
|
173
181
|
try {
|
|
174
182
|
saveActiveTaskSnapshot(hippoRoot, tenantId, { ...merged, source: 'pre-compact', session_id: sessionId });
|
|
175
183
|
appendPreCompactLog(logFile, 'snapshot saved');
|
|
176
|
-
if (recordId !== null)
|
|
184
|
+
if (recordId !== null) {
|
|
177
185
|
recordSnapshotSaved(hippoRoot, tenantId, recordId, (message) => appendPreCompactLog(logFile, message));
|
|
186
|
+
}
|
|
178
187
|
}
|
|
179
188
|
catch (err) {
|
|
180
189
|
appendPreCompactLog(logFile, `snapshot save failed: ${errorMessage(err)}`);
|
|
181
190
|
}
|
|
182
191
|
}
|
|
183
192
|
}
|
|
184
|
-
/** PreCompact hook entry point. Exit code 2 BLOCKS compaction, so every path (bad stdin, missing transcript, store
|
|
185
|
-
*
|
|
193
|
+
/** PreCompact hook entry point. Exit code 2 BLOCKS compaction, so every path (bad stdin, missing transcript, store
|
|
194
|
+
* error) must exit 0 as a logged no-op. Callers must not wrap this in anything that turns a caught-and-logged failure
|
|
195
|
+
* into a non-zero exit. */
|
|
186
196
|
export async function cmdPreCompact(hippoRoot, options) {
|
|
187
197
|
const logFile = options.logFile ?? defaultPreCompactLogPath();
|
|
188
198
|
try {
|
|
@@ -195,7 +205,8 @@ export async function cmdPreCompact(hippoRoot, options) {
|
|
|
195
205
|
}
|
|
196
206
|
/** A PostCompact hook has 10 s in all; replay stops starting new records after this. */
|
|
197
207
|
const POST_COMPACT_REPLAY_BUDGET_MS = 6000;
|
|
198
|
-
/** PostCompact entry point: saves the summary and its items, replays earlier leftovers, returns the one line to show.
|
|
208
|
+
/** PostCompact entry point: saves the summary and its items, replays earlier leftovers, returns the one line to show.
|
|
209
|
+
* Never throws, so the hook exits 0. */
|
|
199
210
|
export function cmdPostCompact(hippoRoot, options) {
|
|
200
211
|
const logFile = options.logFile ?? defaultPreCompactLogPath();
|
|
201
212
|
const log = (message) => appendPreCompactLog(logFile, `post-compact: ${message}`);
|