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
|
@@ -5,18 +5,12 @@ import { spawn } from 'child_process';
|
|
|
5
5
|
import { resolveCodexSessionTranscript } from '../hooks/codex-session.js';
|
|
6
6
|
import { resolveCodexWrapperPaths } from '../hooks/codex-wrapper.js';
|
|
7
7
|
import { resolveJsonHookPaths } from '../hooks/json-hooks.js';
|
|
8
|
-
import { isInitialized } from '../store/open.js';
|
|
9
|
-
import { loadActiveTaskSnapshot, loadFreshActiveTaskSnapshot, closeTaskSnapshotsForSession, listSessionEvents, } from '../store/sessions.js';
|
|
10
|
-
import { writeSessionEndHandoff } from '../store/handoffs.js';
|
|
11
8
|
import { readSessionScan, recordSessionDigest } from '../capture/session-digest.js';
|
|
12
|
-
import { openHippoDb, closeHippoDb } from '../db/index.js';
|
|
13
9
|
import { captureToolFailure } from '../capture/capture-error.js';
|
|
14
|
-
import { readApiCalls, recordRereads, } from '../store/token-ledger.js';
|
|
15
10
|
import { estimateTokens } from '../util/token-text.js';
|
|
16
11
|
import { currentMachine, importSessionFolder } from '../agent-memories/sync.js';
|
|
17
12
|
import { summaryLine } from '../agent-memories/report.js';
|
|
18
|
-
import { resolveProjectIdentity } from '../core/project-identity.js';
|
|
19
|
-
import { getGlobalRoot } from '../sharing/shared.js';
|
|
13
|
+
import { resolveProjectIdentity, isInitialized } from '../core/project-identity.js';
|
|
20
14
|
import { cmdCapture } from '../capture/command.js';
|
|
21
15
|
import { cmdPreCompact, cmdPostCompact } from '../capture/compact.js';
|
|
22
16
|
import { transcriptWorkingState } from '../capture/working-state.js';
|
|
@@ -26,88 +20,63 @@ import { loadTurnPosition, runSessionWorker, saveTurnPosition, turnsAfter } from
|
|
|
26
20
|
import { isStringValue, readSessionEnd, readVscodeStop } from '../core/capture-contract.js';
|
|
27
21
|
import { loadConfig } from '../core/config.js';
|
|
28
22
|
import { autoSleepDue } from '../api/auto-sleep.js';
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
31
|
-
import { COMPACT_RESUME_EVENT_CONTENT_CAP, COMPACT_RESUME_MAX_AGE_MS, compactResumeText } from '../api/context-render.js';
|
|
23
|
+
import { COMPACTION_DB_WAIT_MS } from '../core/compaction-timing.js';
|
|
24
|
+
import { bookSessionRereads, closeEndedSession, compactResumeBlock } from '../api/session-end.js';
|
|
32
25
|
import { normaliseHookPayload, readHookStdin, readStdinBounded } from './stdin.js';
|
|
33
|
-
import { resolveTenantId } from '../store/tenant.js';
|
|
34
26
|
import { errorMessage, log } from '../util/log.js';
|
|
35
27
|
import { bookLedgerTurn } from '../api/ledger-db.js';
|
|
36
|
-
import { flushDeliveryRecorder } from '../api/prompt-hook.js';
|
|
28
|
+
import { flushDeliveryRecorder, startDeliveryRecorder, startToolFailureRecorder } from '../api/prompt-hook.js';
|
|
37
29
|
import { printError } from './output.js';
|
|
38
30
|
import { cmdLastSleep } from './last-sleep.js';
|
|
39
31
|
import { readCompactResumePayload } from './compact-resume-payload.js';
|
|
32
|
+
import { cliApiContext } from './api-context.js';
|
|
40
33
|
import { boolFlag, flagIsTrue, stringFlag } from './flag-values.js';
|
|
41
|
-
import { logSessionEndImport, appendSessionEndCloseLog, resetHookInjection, hookStoreRoot, hookRuntime, payloadCwdRoot, runHookWithStores, inPilotHoldout,
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
*
|
|
45
|
-
|
|
46
|
-
* memories here — the UserPromptSubmit hook already re-injects those every
|
|
47
|
-
* turn, so duplicating them here would double token cost for nothing.
|
|
48
|
-
*
|
|
49
|
-
* Same exit-0/crash-safety contract as `hippo pre-compact`: every path
|
|
50
|
-
* exits 0. A malformed payload or a store read failure
|
|
51
|
-
* degrades to empty stdout, never a thrown error — a failing SessionStart
|
|
52
|
-
* hook must not pollute session startup.
|
|
53
|
-
*/
|
|
54
|
-
function cmdCompactResume(hippoRoot, stdinText, stdinTimedOut) {
|
|
34
|
+
import { logSessionEndImport, appendSessionEndCloseLog, reportSessionEndFailure, resetHookInjection, hookStoreRoot, hookRuntime, payloadCwdRoot, runHookWithStores, inPilotHoldout, hostSessionId, } from './hook-runtime.js';
|
|
35
|
+
import { CliExit } from './exit.js';
|
|
36
|
+
/** SessionStart(compact) injector: prints the task snapshot and session trail lost to compaction; no pinned memories (UserPromptSubmit re-injects them).
|
|
37
|
+
* Every path exits 0: a malformed payload or store read failure degrades to empty stdout, never a throw. */
|
|
38
|
+
function cmdCompactResume(hippoRoot, tenantId, stdinText, stdinTimedOut) {
|
|
55
39
|
let rec = null;
|
|
56
40
|
try {
|
|
57
41
|
// Gate on the non-exiting isInitialized check first: the store reads below call initStore, which would
|
|
58
42
|
// silently create a store in a project that never ran `hippo init`, and this hook fires globally.
|
|
59
43
|
if (!isInitialized(hippoRoot)) {
|
|
60
|
-
|
|
44
|
+
throw new CliExit(0);
|
|
61
45
|
}
|
|
62
46
|
const payloadState = readCompactResumePayload(stdinText, stdinTimedOut);
|
|
63
47
|
let suppressOutput = payloadState.suppressOutput;
|
|
64
48
|
const payloadSessionId = payloadState.payloadSessionId;
|
|
65
|
-
if (payloadState.boundary)
|
|
66
|
-
rec = startDeliveryRecorder(hippoRoot,
|
|
49
|
+
if (payloadState.boundary) {
|
|
50
|
+
rec = startDeliveryRecorder(cliApiContext(hippoRoot, tenantId), {
|
|
51
|
+
stdinText, runtime: 'claude-code', eventType: 'compact-resume', envSessionId: hostSessionId(),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
67
54
|
// A compaction follows a prompt or SessionStart that booked the arm, so this only reads it.
|
|
68
|
-
if (!suppressOutput && payloadSessionId !== null && inPilotHoldout(hippoRoot,
|
|
55
|
+
if (!suppressOutput && payloadSessionId !== null && inPilotHoldout(hippoRoot, tenantId, payloadSessionId, false)) {
|
|
69
56
|
suppressOutput = true;
|
|
70
57
|
rec?.disabled();
|
|
71
58
|
}
|
|
72
59
|
if (!suppressOutput)
|
|
73
|
-
restoreCompactSnapshot(hippoRoot, payloadSessionId, rec);
|
|
60
|
+
restoreCompactSnapshot(hippoRoot, tenantId, payloadSessionId, rec);
|
|
74
61
|
}
|
|
75
62
|
catch (err) {
|
|
63
|
+
if (err instanceof CliExit)
|
|
64
|
+
throw err;
|
|
76
65
|
// Empty stdout on any store error, never a crashed SessionStart; the reason goes to stderr, which the model never sees.
|
|
77
66
|
log.warn(`hippo compact-resume: skipped: ${errorMessage(err)}`);
|
|
78
67
|
}
|
|
79
68
|
// A no-op when the token ledger's handle already wrote the row; exit would drop it otherwise.
|
|
80
69
|
flushDeliveryRecorder(rec);
|
|
81
|
-
|
|
70
|
+
throw new CliExit(0);
|
|
82
71
|
}
|
|
83
|
-
function restoreCompactSnapshot(hippoRoot, payloadSessionId, rec) {
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
// Concurrent sessions must not cross-restore. Only suppress when BOTH ids are present and differ;
|
|
87
|
-
// either side missing, or a manual invocation with no payload session_id, still prints.
|
|
88
|
-
const sessionMismatch = !!snapshot &&
|
|
89
|
-
payloadSessionId !== null &&
|
|
90
|
-
snapshot.session_id !== null &&
|
|
91
|
-
payloadSessionId !== snapshot.session_id;
|
|
92
|
-
if (!snapshot || sessionMismatch)
|
|
72
|
+
function restoreCompactSnapshot(hippoRoot, tenantId, payloadSessionId, rec) {
|
|
73
|
+
const text = compactResumeBlock(cliApiContext(hippoRoot, tenantId), payloadSessionId);
|
|
74
|
+
if (text === null)
|
|
93
75
|
return;
|
|
94
|
-
// Loaded before the print so a bad trail row costs the trail, not the snapshot; stderr stays out of the model's context.
|
|
95
|
-
let events = [];
|
|
96
|
-
try {
|
|
97
|
-
if (snapshot.session_id) {
|
|
98
|
-
events = listSessionEvents(hippoRoot, tenantId, { session_id: snapshot.session_id }).map((e) => ({
|
|
99
|
-
...e,
|
|
100
|
-
content: truncateCodePointSafe(e.content, COMPACT_RESUME_EVENT_CONTENT_CAP),
|
|
101
|
-
}));
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
catch (err) {
|
|
105
|
-
log.warn(`hippo compact-resume: trail skipped: ${errorMessage(err)}`);
|
|
106
|
-
}
|
|
107
76
|
// Printed in one write so the ledger books exactly the text the model is handed.
|
|
108
|
-
const text = compactResumeText(snapshot, events);
|
|
109
77
|
console.log(text);
|
|
110
|
-
rec?.delivered({ state: 'sent', emittedText: `${text}
|
|
78
|
+
rec?.delivered({ state: 'sent', emittedText: `${text}
|
|
79
|
+
` });
|
|
111
80
|
bookLedgerTurn(hippoRoot, {
|
|
112
81
|
uses: [{
|
|
113
82
|
tenantId, sessionId: payloadSessionId, surface: 'compact_resume', event: 'inject', items: 1, tokens: estimateTokens(text),
|
|
@@ -115,18 +84,9 @@ function restoreCompactSnapshot(hippoRoot, payloadSessionId, rec) {
|
|
|
115
84
|
delivery: (write) => flushDeliveryRecorder(rec, write),
|
|
116
85
|
});
|
|
117
86
|
}
|
|
118
|
-
/**
|
|
119
|
-
*
|
|
120
|
-
|
|
121
|
-
* the parent returns. Running sleep + capture synchronously here means both
|
|
122
|
-
* get SIGTERM'd mid-consolidation.
|
|
123
|
-
*
|
|
124
|
-
* So we do the minimum inline (read stdin for transcript_path), then spawn
|
|
125
|
-
* a fully detached Node child that runs sleep → capture and exit the parent
|
|
126
|
-
* immediately. The child writes to the log file and survives TUI teardown;
|
|
127
|
-
* the next SessionStart reads the log via `hippo last-sleep`.
|
|
128
|
-
*/
|
|
129
|
-
export async function cmdSessionEnd(hippoRoot, flags) {
|
|
87
|
+
/** SessionEnd entry: TUI teardown kills children still running, so read stdin inline, spawn a detached child that runs sleep then capture, and exit.
|
|
88
|
+
* The child logs to a file that the next SessionStart reads via `hippo last-sleep`. */
|
|
89
|
+
export async function handleSessionEnd({ hippoRoot, tenantId, flags }) {
|
|
130
90
|
const runtime = hookRuntime(flags);
|
|
131
91
|
const turn = flagIsTrue(flags, 'turn');
|
|
132
92
|
// Copilot's hook command carries no path, since one quoted into it would need escaping for each shell; the log goes where the hook table used to point.
|
|
@@ -141,6 +101,10 @@ export async function cmdSessionEnd(hippoRoot, flags) {
|
|
|
141
101
|
// Before the spawn, since the worker finds its store from the folder it inherits.
|
|
142
102
|
const root = payloadCwdRoot(hippoRoot, stdinText, runtime);
|
|
143
103
|
const input = stop ?? sessionEndInput(stdinText, raw.timedOut, runtime);
|
|
104
|
+
// Only a host payload ends a session: a manual run and a reply's end (turn mode) are not boundaries.
|
|
105
|
+
const rec = !turn && input !== null && !input.manual
|
|
106
|
+
? startDeliveryRecorder(cliApiContext(hookStoreRoot(root), tenantId), { stdinText, runtime, eventType: 'session-end', envSessionId: hostSessionId() })
|
|
107
|
+
: null;
|
|
144
108
|
const sessionId = input?.sessionId ?? null;
|
|
145
109
|
// Resolved here because only this process saw the payload; the worker captures just the path it is handed.
|
|
146
110
|
// Always a hook, so never scan: an empty stdin here is not a manual run. The Copilot CLI's sessionEnd names no transcript, so its log is found by id.
|
|
@@ -159,9 +123,16 @@ export async function cmdSessionEnd(hippoRoot, flags) {
|
|
|
159
123
|
flags['transcript'] = transcriptPath;
|
|
160
124
|
if (sessionId)
|
|
161
125
|
flags['session-id'] = sessionId;
|
|
162
|
-
|
|
126
|
+
try {
|
|
127
|
+
await cmdSessionEndWorker(root, tenantId, flags);
|
|
128
|
+
}
|
|
129
|
+
finally {
|
|
130
|
+
await runHookWithStores(() => flushDeliveryRecorder(rec));
|
|
131
|
+
}
|
|
163
132
|
return;
|
|
164
133
|
}
|
|
134
|
+
// After the spawn, so a locked store delays only the row; the hook's short lock wait bounds it.
|
|
135
|
+
await runHookWithStores(() => flushDeliveryRecorder(rec));
|
|
165
136
|
}
|
|
166
137
|
/** What the session-end payload named; null for one hippo refuses or one that never arrived, and the worker then runs with neither value. */
|
|
167
138
|
function sessionEndInput(stdinText, timedOut, runtime) {
|
|
@@ -198,15 +169,18 @@ function vscodeStopInput(raw) {
|
|
|
198
169
|
const receipt = readVscodeStop(raw.text, raw.timedOut);
|
|
199
170
|
return receipt.status === 'received' && receipt.input.sessionId !== null && SESSION_ID_RE.test(receipt.input.sessionId) ? receipt.input : null;
|
|
200
171
|
}
|
|
201
|
-
|
|
172
|
+
async function cmdSessionEndWorker(hippoRoot, tenantId, flags) {
|
|
202
173
|
const sessionId = flags['session-id'];
|
|
203
|
-
await runSessionWorker(isStringValue(sessionId) ? sessionId : null, flagIsTrue(flags, 'turn') ? 'turn' : 'full', (mode) => sessionEndWork(hippoRoot, flags, mode));
|
|
174
|
+
await runSessionWorker(isStringValue(sessionId) ? sessionId : null, flagIsTrue(flags, 'turn') ? 'turn' : 'full', (mode) => sessionEndWork(hippoRoot, tenantId, flags, mode));
|
|
204
175
|
}
|
|
205
|
-
|
|
176
|
+
export function handleSessionEndWorker({ hippoRoot, tenantId, flags }) {
|
|
177
|
+
return cmdSessionEndWorker(hippoRoot, tenantId, flags);
|
|
178
|
+
}
|
|
179
|
+
async function sessionEndWork(hippoRoot, tenantId, flags, mode) {
|
|
206
180
|
const transcriptPath = stringFlag(flags, 'transcript');
|
|
207
181
|
const closeLogFile = stringFlag(flags, 'log-file') ?? null;
|
|
208
182
|
const closeSessionId = stringFlag(flags, 'session-id') ?? null;
|
|
209
|
-
const rereadLog = await bookSessionRereads(hippoRoot, transcriptPath, closeSessionId)
|
|
183
|
+
const rereadLog = await bookSessionRereads(cliApiContext(hippoRoot, tenantId), transcriptPath, closeSessionId)
|
|
210
184
|
.catch((err) => [`re-read count failed: ${errorMessage(err)}`]);
|
|
211
185
|
// Sleep starts the log file afresh, so the lines go in after it; on exit too, in case sleep exits the process.
|
|
212
186
|
const flushRereadLog = () => { for (const line of rereadLog.splice(0))
|
|
@@ -220,57 +194,41 @@ async function sessionEndWork(hippoRoot, flags, mode) {
|
|
|
220
194
|
return;
|
|
221
195
|
}
|
|
222
196
|
if (mode === 'turn' && closeSessionId)
|
|
223
|
-
await sleepIfDue(hippoRoot, flags, closeLogFile, transcriptPath, closeSessionId);
|
|
197
|
+
await sleepIfDue(hippoRoot, tenantId, flags, closeLogFile, transcriptPath, closeSessionId);
|
|
224
198
|
else
|
|
225
|
-
await sleepProjectStore(hippoRoot, flags, closeLogFile, transcriptPath);
|
|
199
|
+
await sleepProjectStore(hippoRoot, tenantId, flags, closeLogFile, transcriptPath);
|
|
226
200
|
flushRereadLog();
|
|
227
201
|
const digestLog = (message) => appendSessionEndCloseLog(closeLogFile, message);
|
|
228
202
|
const scan = transcriptPath ? readSessionScan(transcriptPath, digestLog) : null;
|
|
229
|
-
const capture = (turns) => captureEndedSession(hippoRoot, store, flags, transcriptPath, turns);
|
|
203
|
+
const capture = (turns) => captureEndedSession(hippoRoot, tenantId, store, flags, transcriptPath, turns);
|
|
230
204
|
if (mode === 'turn')
|
|
231
205
|
captureNewTurns(transcriptPath, closeSessionId, scan, capture, digestLog);
|
|
232
206
|
else
|
|
233
207
|
capture(scan?.turns);
|
|
234
208
|
recordSessionDigest(hippoRoot, scan, {
|
|
235
209
|
key: closeSessionId || path.basename(transcriptPath ?? '', '.jsonl'),
|
|
236
|
-
tenantId
|
|
210
|
+
tenantId,
|
|
237
211
|
log: digestLog,
|
|
238
212
|
});
|
|
239
|
-
//
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
}
|
|
249
|
-
closeEndedSessionSnapshot(store, closeSessionId, closeLogFile);
|
|
250
|
-
}
|
|
251
|
-
function closeEndedSessionSnapshot(store, closeSessionId, closeLogFile) {
|
|
252
|
-
try {
|
|
253
|
-
if (closeSessionId) {
|
|
254
|
-
const closed = closeTaskSnapshotsForSession(store, resolveTenantId({}), closeSessionId);
|
|
255
|
-
appendSessionEndCloseLog(closeLogFile, `closed ${closed} active snapshot(s) for session ${closeSessionId}`);
|
|
256
|
-
}
|
|
257
|
-
else {
|
|
258
|
-
appendSessionEndCloseLog(closeLogFile, 'skip: no session_id in SessionEnd payload, active snapshot left untouched');
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
catch (err) {
|
|
262
|
-
appendSessionEndCloseLog(closeLogFile, `snapshot close failed: ${errorMessage(err)}`);
|
|
263
|
-
}
|
|
213
|
+
// Only this session's snapshot, and only after sleep and capture.
|
|
214
|
+
const closeLog = (line) => appendSessionEndCloseLog(closeLogFile, line);
|
|
215
|
+
closeEndedSession(cliApiContext(store, tenantId), {
|
|
216
|
+
sessionId: closeSessionId,
|
|
217
|
+
turn: mode === 'turn',
|
|
218
|
+
workingState: () => (transcriptPath ? transcriptWorkingState(transcriptPath, closeLog) : null),
|
|
219
|
+
evidence: () => collectHandoffEvidence(process.cwd(), 'unknown'),
|
|
220
|
+
log: closeLog,
|
|
221
|
+
});
|
|
264
222
|
}
|
|
265
|
-
async function sleepProjectStore(hippoRoot, flags, closeLogFile, transcriptPath) {
|
|
223
|
+
async function sleepProjectStore(hippoRoot, tenantId, flags, closeLogFile, transcriptPath) {
|
|
266
224
|
// Sleeping the global store from here would learn this folder's git commits into it; it has its own daily sleep.
|
|
267
225
|
if (isInitialized(hippoRoot)) {
|
|
268
226
|
try {
|
|
269
|
-
await (await import('./sleep.js')).cmdSleep(hippoRoot, flags);
|
|
227
|
+
await (await import('./sleep.js')).cmdSleep(hippoRoot, tenantId, flags);
|
|
270
228
|
}
|
|
271
229
|
catch (err) {
|
|
272
|
-
// cmdSleep writes its failure line only
|
|
273
|
-
|
|
230
|
+
// cmdSleep writes its own failure line only once its log tee is open, and capture runs regardless.
|
|
231
|
+
reportSessionEndFailure(closeLogFile, 'session-end: sleep', err);
|
|
274
232
|
}
|
|
275
233
|
}
|
|
276
234
|
else {
|
|
@@ -279,18 +237,18 @@ async function sleepProjectStore(hippoRoot, flags, closeLogFile, transcriptPath)
|
|
|
279
237
|
}
|
|
280
238
|
}
|
|
281
239
|
/** A close after every reply sleeps only at the MCP server's auto-sleep threshold; each line starts the log afresh, as a sleep does. */
|
|
282
|
-
async function sleepIfDue(hippoRoot, flags, closeLogFile, transcriptPath, sessionId) {
|
|
240
|
+
async function sleepIfDue(hippoRoot, tenantId, flags, closeLogFile, transcriptPath, sessionId) {
|
|
283
241
|
if (!isInitialized(hippoRoot))
|
|
284
|
-
return sleepProjectStore(hippoRoot, flags, closeLogFile, transcriptPath);
|
|
242
|
+
return sleepProjectStore(hippoRoot, tenantId, flags, closeLogFile, transcriptPath);
|
|
285
243
|
const prefix = `turn close, session ${sessionId}`;
|
|
286
244
|
try {
|
|
287
|
-
const { enabled, count, threshold, due } = autoSleepDue(hippoRoot,
|
|
245
|
+
const { enabled, count, threshold, due } = autoSleepDue(hippoRoot, tenantId, loadConfig(hippoRoot).autoSleep);
|
|
288
246
|
if (!due) {
|
|
289
247
|
const why = enabled ? `${count} new memories, threshold ${threshold}` : 'auto-sleep is off';
|
|
290
248
|
appendSessionEndCloseLog(closeLogFile, `${prefix}: skip sleep, ${why}`, { startFresh: true });
|
|
291
249
|
return;
|
|
292
250
|
}
|
|
293
|
-
await sleepProjectStore(hippoRoot, flags, closeLogFile, transcriptPath);
|
|
251
|
+
await sleepProjectStore(hippoRoot, tenantId, flags, closeLogFile, transcriptPath);
|
|
294
252
|
appendSessionEndCloseLog(closeLogFile, `${prefix}: ran sleep at ${count} new memories (threshold ${threshold})`);
|
|
295
253
|
}
|
|
296
254
|
catch (err) {
|
|
@@ -312,7 +270,7 @@ function captureNewTurns(transcriptPath, sessionId, scan, capture, log) {
|
|
|
312
270
|
saveTurnPosition(sessionId, transcriptPath, scan.turns, log);
|
|
313
271
|
}
|
|
314
272
|
/** True when capture ran to the end, so a turn close may move its cursor past these turns. */
|
|
315
|
-
function captureEndedSession(hippoRoot, store, flags, transcriptPath, turns) {
|
|
273
|
+
function captureEndedSession(hippoRoot, tenantId, store, flags, transcriptPath, turns) {
|
|
316
274
|
try {
|
|
317
275
|
const logFile = stringFlag(flags, 'log-file');
|
|
318
276
|
// With no stdin of its own, capture would read this as a manual run and scan every project.
|
|
@@ -326,7 +284,7 @@ function captureEndedSession(hippoRoot, store, flags, transcriptPath, turns) {
|
|
|
326
284
|
logFile,
|
|
327
285
|
dryRun: false,
|
|
328
286
|
global: false,
|
|
329
|
-
tenantId
|
|
287
|
+
tenantId,
|
|
330
288
|
// In the global store, rows would otherwise read as user-global and show up in every project.
|
|
331
289
|
originProject: store === hippoRoot ? undefined : resolveProjectIdentity(process.cwd()),
|
|
332
290
|
sessionTurns: turns,
|
|
@@ -334,69 +292,16 @@ function captureEndedSession(hippoRoot, store, flags, transcriptPath, turns) {
|
|
|
334
292
|
return true;
|
|
335
293
|
}
|
|
336
294
|
catch (err) {
|
|
337
|
-
log
|
|
295
|
+
reportSessionEndFailure(stringFlag(flags, 'log-file') ?? null, 'session-end: capture', err);
|
|
338
296
|
return false;
|
|
339
297
|
}
|
|
340
298
|
}
|
|
341
|
-
function writeEndHandoff(store, closeSessionId, transcriptPath, closeLogFile, inPlace = false) {
|
|
342
|
-
try {
|
|
343
|
-
const tenantId = resolveTenantId({});
|
|
344
|
-
const ownSnapshot = loadActiveTaskSnapshot(store, tenantId)?.session_id === closeSessionId;
|
|
345
|
-
// A never-compacted session has no snapshot; read even when it has one, as another session's PreCompact can take the slot before the write.
|
|
346
|
-
const derived = transcriptPath
|
|
347
|
-
? transcriptWorkingState(transcriptPath, (message) => appendSessionEndCloseLog(closeLogFile, message))
|
|
348
|
-
: null;
|
|
349
|
-
if (!ownSnapshot && !derived) {
|
|
350
|
-
appendSessionEndCloseLog(closeLogFile, 'skip: no snapshot or transcript for session');
|
|
351
|
-
}
|
|
352
|
-
else {
|
|
353
|
-
const evidence = collectHandoffEvidence(process.cwd(), 'unknown');
|
|
354
|
-
const handoff = writeSessionEndHandoff(store, tenantId, closeSessionId, evidence, derived, undefined, { inPlace });
|
|
355
|
-
appendSessionEndCloseLog(closeLogFile, handoff ? `wrote handoff for session ${closeSessionId}` : `skip: kept the existing handoff for session ${closeSessionId}`);
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
catch (err) {
|
|
359
|
-
// SAFETY: catch clauses bind unknown, but Node/V8 always throws an Error here.
|
|
360
|
-
appendSessionEndCloseLog(closeLogFile, `handoff write failed: ${errorMessage(err)}`);
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
/** Books the ending session's re-reads in each store its ledger rows can land in (project and global); returns the log lines. */
|
|
364
|
-
async function bookSessionRereads(hippoRoot, transcriptPath, sessionId) {
|
|
365
|
-
if (!transcriptPath || !sessionId)
|
|
366
|
-
return [];
|
|
367
|
-
let read;
|
|
368
|
-
try {
|
|
369
|
-
read = await readApiCalls(transcriptPath);
|
|
370
|
-
}
|
|
371
|
-
catch (err) {
|
|
372
|
-
return [`skip re-read count: cannot read the transcript: ${errorMessage(err)}`];
|
|
373
|
-
}
|
|
374
|
-
const roots = new Set([hippoRoot, getGlobalRoot()].filter((root) => isInitialized(root)).map((root) => path.resolve(root)));
|
|
375
|
-
const lines = [];
|
|
376
|
-
let tokens = 0;
|
|
377
|
-
for (const root of roots) {
|
|
378
|
-
try {
|
|
379
|
-
const db = openHippoDb(root);
|
|
380
|
-
try {
|
|
381
|
-
tokens += recordRereads(db, resolveTenantId({}), sessionId, read.calls);
|
|
382
|
-
}
|
|
383
|
-
finally {
|
|
384
|
-
closeHippoDb(db);
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
catch (err) {
|
|
388
|
-
lines.push(`re-read count failed: ${errorMessage(err)}`);
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
const skipped = read.malformed > 0 ? `, ${read.malformed} unparsable transcript lines skipped` : '';
|
|
392
|
-
lines.push(`re-read ${tokens} tokens over ${read.calls.length} model calls for session ${sessionId}${skipped}`);
|
|
393
|
-
return lines;
|
|
394
|
-
}
|
|
395
299
|
function loadCodexWrapperMetadata() {
|
|
396
300
|
const { metadataPath } = resolveCodexWrapperPaths();
|
|
397
301
|
if (!fs.existsSync(metadataPath)) {
|
|
398
302
|
throw new Error('Codex wrapper is not installed. Run `hippo hook install codex` first.');
|
|
399
303
|
}
|
|
304
|
+
// SAFETY: the file is the one installCodexWrapper wrote; handleCodexRun reads only logFile and realCodexPath from it.
|
|
400
305
|
return JSON.parse(fs.readFileSync(metadataPath, 'utf8'));
|
|
401
306
|
}
|
|
402
307
|
/** Quotes one cmd.exe argument; each `%` leaves the quotes as `^%`, so no %NAME% pair can expand. */
|
|
@@ -423,7 +328,7 @@ function spawnRealCodex(realCodexPath, forwardArgs, cwd) {
|
|
|
423
328
|
}
|
|
424
329
|
return spawn(realCodexPath, forwardArgs, { cwd, stdio: 'inherit', windowsHide: false });
|
|
425
330
|
}
|
|
426
|
-
export function
|
|
331
|
+
export function handleCodexRun({ hippoRoot, tenantId, args }) {
|
|
427
332
|
const metadata = loadCodexWrapperMetadata();
|
|
428
333
|
const startedAtMs = Date.now();
|
|
429
334
|
// Codex reads CODEX_HOME at each launch, so resolve it now, not from the install-time metadata.
|
|
@@ -441,11 +346,11 @@ export function cmdCodexRun(hippoRoot, args) {
|
|
|
441
346
|
process.exit(1);
|
|
442
347
|
});
|
|
443
348
|
child.on('exit', async (code, signal) => {
|
|
444
|
-
await launchCodexSessionEndWorker(hippoRoot, historyPath, startOffsetBytes, startedAtMs, metadata.logFile);
|
|
349
|
+
await launchCodexSessionEndWorker(hippoRoot, tenantId, historyPath, startOffsetBytes, startedAtMs, metadata.logFile);
|
|
445
350
|
exitLikeChild(code, signal);
|
|
446
351
|
});
|
|
447
352
|
}
|
|
448
|
-
async function launchCodexSessionEndWorker(hippoRoot, historyPath, startOffsetBytes, startedAtMs, logFile) {
|
|
353
|
+
async function launchCodexSessionEndWorker(hippoRoot, tenantId, historyPath, startOffsetBytes, startedAtMs, logFile) {
|
|
449
354
|
const workerArgs = [
|
|
450
355
|
process.argv[1],
|
|
451
356
|
'__codex-session-end-worker',
|
|
@@ -460,30 +365,40 @@ async function launchCodexSessionEndWorker(hippoRoot, historyPath, startOffsetBy
|
|
|
460
365
|
'--log-file',
|
|
461
366
|
logFile,
|
|
462
367
|
];
|
|
368
|
+
if (await detachedWorkerStarted(workerArgs))
|
|
369
|
+
return;
|
|
370
|
+
// Awaited so the sleep write can't be killed by the exit calls below.
|
|
463
371
|
try {
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
372
|
+
await cmdCodexSessionEndWorker(hippoRoot, tenantId, {
|
|
373
|
+
'codex-home': path.dirname(historyPath),
|
|
374
|
+
'history-path': historyPath,
|
|
375
|
+
'start-offset': String(startOffsetBytes),
|
|
376
|
+
'started-at': String(startedAtMs),
|
|
377
|
+
'log-file': logFile,
|
|
468
378
|
});
|
|
469
|
-
worker.unref();
|
|
470
379
|
}
|
|
471
|
-
catch (
|
|
472
|
-
log.debug(`codex run: the session-end
|
|
473
|
-
|
|
380
|
+
catch (inlineErr) {
|
|
381
|
+
log.debug(`codex run: the inline session-end failed: ${errorMessage(inlineErr)}`);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
/** Resolves true once the detached worker is running, false when the spawn fails, whether it throws or reports later. */
|
|
385
|
+
function detachedWorkerStarted(workerArgs) {
|
|
386
|
+
return new Promise((resolve) => {
|
|
387
|
+
const failed = (reason) => {
|
|
388
|
+
log.debug(`codex run: the session-end worker did not spawn, running inline: ${reason}`);
|
|
389
|
+
resolve(false);
|
|
390
|
+
};
|
|
474
391
|
try {
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
'log-file': logFile,
|
|
481
|
-
});
|
|
392
|
+
const worker = spawn(process.execPath, workerArgs, { detached: true, stdio: 'ignore', windowsHide: true });
|
|
393
|
+
// An async spawn failure (ENOENT, EAGAIN) arrives as an 'error' event, which a try cannot catch.
|
|
394
|
+
worker.on('error', (err) => failed(err.message));
|
|
395
|
+
worker.once('spawn', () => resolve(true));
|
|
396
|
+
worker.unref();
|
|
482
397
|
}
|
|
483
|
-
catch (
|
|
484
|
-
|
|
398
|
+
catch (err) {
|
|
399
|
+
failed(errorMessage(err));
|
|
485
400
|
}
|
|
486
|
-
}
|
|
401
|
+
});
|
|
487
402
|
}
|
|
488
403
|
function exitLikeChild(code, signal) {
|
|
489
404
|
if (signal) {
|
|
@@ -498,7 +413,7 @@ function exitLikeChild(code, signal) {
|
|
|
498
413
|
}
|
|
499
414
|
process.exit(code ?? 0);
|
|
500
415
|
}
|
|
501
|
-
export async function cmdCodexSessionEndWorker(hippoRoot, flags) {
|
|
416
|
+
export async function cmdCodexSessionEndWorker(hippoRoot, tenantId, flags) {
|
|
502
417
|
const logFile = stringFlag(flags, 'log-file');
|
|
503
418
|
// Like the other hooks: project store, else global; a folder with neither must not get one made.
|
|
504
419
|
const store = hookStoreRoot(hippoRoot);
|
|
@@ -506,17 +421,20 @@ export async function cmdCodexSessionEndWorker(hippoRoot, flags) {
|
|
|
506
421
|
appendSessionEndCloseLog(logFile ?? null, 'skip: no hippo store for this folder or globally', { startFresh: true });
|
|
507
422
|
return;
|
|
508
423
|
}
|
|
509
|
-
await sleepCodexProjectStore(hippoRoot, logFile);
|
|
510
|
-
captureCodexTranscript(hippoRoot, store, flags, logFile);
|
|
424
|
+
await sleepCodexProjectStore(hippoRoot, tenantId, logFile);
|
|
425
|
+
captureCodexTranscript(hippoRoot, tenantId, store, flags, logFile);
|
|
426
|
+
}
|
|
427
|
+
export function handleCodexSessionEndWorker({ hippoRoot, tenantId, flags }) {
|
|
428
|
+
return cmdCodexSessionEndWorker(hippoRoot, tenantId, flags);
|
|
511
429
|
}
|
|
512
|
-
async function sleepCodexProjectStore(hippoRoot, logFile) {
|
|
430
|
+
async function sleepCodexProjectStore(hippoRoot, tenantId, logFile) {
|
|
513
431
|
// Sleeping the global store from here would learn this folder's git commits into it; it has its own daily sleep.
|
|
514
432
|
if (isInitialized(hippoRoot)) {
|
|
515
433
|
try {
|
|
516
|
-
await (await import('./sleep.js')).cmdSleep(hippoRoot, logFile ? { 'log-file': logFile } : {});
|
|
434
|
+
await (await import('./sleep.js')).cmdSleep(hippoRoot, tenantId, logFile ? { 'log-file': logFile } : {});
|
|
517
435
|
}
|
|
518
436
|
catch (err) {
|
|
519
|
-
|
|
437
|
+
reportSessionEndFailure(logFile ?? null, 'codex session-end: sleep', err);
|
|
520
438
|
}
|
|
521
439
|
}
|
|
522
440
|
else {
|
|
@@ -524,7 +442,7 @@ async function sleepCodexProjectStore(hippoRoot, logFile) {
|
|
|
524
442
|
logSessionEndImport(logFile ?? null, undefined);
|
|
525
443
|
}
|
|
526
444
|
}
|
|
527
|
-
function captureCodexTranscript(hippoRoot, store, flags, logFile) {
|
|
445
|
+
function captureCodexTranscript(hippoRoot, tenantId, store, flags, logFile) {
|
|
528
446
|
try {
|
|
529
447
|
const codexHome = stringFlag(flags, 'codex-home') ?? resolveCodexWrapperPaths().codexHome;
|
|
530
448
|
const historyPath = stringFlag(flags, 'history-path') ?? path.join(codexHome, 'history.jsonl');
|
|
@@ -549,7 +467,7 @@ function captureCodexTranscript(hippoRoot, store, flags, logFile) {
|
|
|
549
467
|
logFile,
|
|
550
468
|
dryRun: false,
|
|
551
469
|
global: false,
|
|
552
|
-
tenantId
|
|
470
|
+
tenantId,
|
|
553
471
|
originProject: store === hippoRoot ? undefined : resolveProjectIdentity(process.cwd()),
|
|
554
472
|
sessionTurns: scan?.turns,
|
|
555
473
|
};
|
|
@@ -557,24 +475,26 @@ function captureCodexTranscript(hippoRoot, store, flags, logFile) {
|
|
|
557
475
|
cmdCapture(store, captureOpts);
|
|
558
476
|
}
|
|
559
477
|
catch (err) {
|
|
560
|
-
|
|
478
|
+
reportSessionEndFailure(logFile ?? null, 'codex session-end: capture', err);
|
|
561
479
|
}
|
|
562
480
|
// The Codex wrapper passes no session id, so the rollout file names the session.
|
|
563
|
-
recordSessionDigest(hippoRoot, scan, { key: path.basename(transcriptPath, '.jsonl'), tenantId
|
|
481
|
+
recordSessionDigest(hippoRoot, scan, { key: path.basename(transcriptPath, '.jsonl'), tenantId, log: digestLog });
|
|
564
482
|
}
|
|
565
483
|
catch (err) {
|
|
566
|
-
|
|
484
|
+
reportSessionEndFailure(logFile ?? null, 'codex session-end: transcript scan or digest', err);
|
|
567
485
|
}
|
|
568
486
|
}
|
|
569
|
-
export async function handlePreCompact({ hippoRoot, flags }) {
|
|
487
|
+
export async function handlePreCompact({ hippoRoot, tenantId, flags }) {
|
|
570
488
|
// Bounded wait, not a TTY guard: an idle non-TTY pipe must not hang.
|
|
571
489
|
const { text: stdinText, timedOut: stdinTimedOut } = await readHookStdin();
|
|
572
490
|
const runtime = hookRuntime(flags);
|
|
573
491
|
const root = payloadCwdRoot(hippoRoot, stdinText, runtime);
|
|
574
492
|
await runHookWithStores(async () => {
|
|
575
493
|
// Started before any store wait, so two fires of one hook carry timestamps close enough to match as duplicates.
|
|
576
|
-
const rec = startDeliveryRecorder(hookStoreRoot(root),
|
|
577
|
-
|
|
494
|
+
const rec = startDeliveryRecorder(cliApiContext(hookStoreRoot(root), tenantId), {
|
|
495
|
+
stdinText, runtime, eventType: 'pre-compact', envSessionId: hostSessionId(),
|
|
496
|
+
});
|
|
497
|
+
resetHookInjection(root, tenantId, stdinText, null);
|
|
578
498
|
await cmdPreCompact(hookStoreRoot(root), {
|
|
579
499
|
stdinText,
|
|
580
500
|
stdinTimedOut,
|
|
@@ -588,7 +508,8 @@ export async function handlePreCompact({ hippoRoot, flags }) {
|
|
|
588
508
|
});
|
|
589
509
|
}
|
|
590
510
|
export async function handlePostCompact({ hippoRoot, flags }) {
|
|
591
|
-
// PostCompact hook: saves the compaction summary and its memories, then prints one plain line, because Claude Code shows this hook's
|
|
511
|
+
// PostCompact hook: saves the compaction summary and its memories, then prints one plain line, because Claude Code shows this hook's
|
|
512
|
+
// stdout as-is. Always exits 0.
|
|
592
513
|
const { text, timedOut } = await readHookStdin();
|
|
593
514
|
const logFlag = flags['log-file'];
|
|
594
515
|
const store = hookStoreRoot(hippoRoot);
|
|
@@ -596,7 +517,7 @@ export async function handlePostCompact({ hippoRoot, flags }) {
|
|
|
596
517
|
stdinText: text,
|
|
597
518
|
stdinTimedOut: timedOut,
|
|
598
519
|
logFile: logFlag === true || logFlag === false || Array.isArray(logFlag) ? undefined : logFlag,
|
|
599
|
-
// Passed in, since capture
|
|
520
|
+
// Passed in, since src/capture/ importing the sync would close an import cycle.
|
|
600
521
|
afterSave: (transcriptPath, cwd, log) => {
|
|
601
522
|
const report = importSessionFolder(store, transcriptPath, cwd, { machine: currentMachine(), busyWaitMs: COMPACTION_DB_WAIT_MS });
|
|
602
523
|
const summary = summaryLine(report);
|
|
@@ -609,7 +530,7 @@ export async function handlePostCompact({ hippoRoot, flags }) {
|
|
|
609
530
|
if (line !== null && line !== undefined)
|
|
610
531
|
console.log(line);
|
|
611
532
|
}
|
|
612
|
-
export async function handleCaptureError({ hippoRoot, flags }) {
|
|
533
|
+
export async function handleCaptureError({ hippoRoot, tenantId, flags }) {
|
|
613
534
|
// PostToolUseFailure hook: every path exits 0, and nothing is created
|
|
614
535
|
// when no store exists (the hook fires in every directory).
|
|
615
536
|
const { text } = await readHookStdin();
|
|
@@ -619,7 +540,15 @@ export async function handleCaptureError({ hippoRoot, flags }) {
|
|
|
619
540
|
if (isInitialized(root) && payload) {
|
|
620
541
|
// SAFETY: JSON.parse returns a JSON value by definition.
|
|
621
542
|
const failure = JSON.parse(payload);
|
|
622
|
-
|
|
543
|
+
const rec = startToolFailureRecorder(cliApiContext(root, tenantId), { stdinText: text, runtime: hookRuntime(flags), envSessionId: hostSessionId() });
|
|
544
|
+
await runHookWithStores(() => {
|
|
545
|
+
try {
|
|
546
|
+
return captureToolFailure(root, tenantId, failure, (id) => rec?.logged(id));
|
|
547
|
+
}
|
|
548
|
+
finally {
|
|
549
|
+
flushDeliveryRecorder(rec);
|
|
550
|
+
}
|
|
551
|
+
});
|
|
623
552
|
}
|
|
624
553
|
}
|
|
625
554
|
catch (err) {
|
|
@@ -627,14 +556,14 @@ export async function handleCaptureError({ hippoRoot, flags }) {
|
|
|
627
556
|
log.warn(`failure capture skipped: ${errorMessage(err)}`);
|
|
628
557
|
}
|
|
629
558
|
}
|
|
630
|
-
export async function handleCompactResume({ hippoRoot }) {
|
|
559
|
+
export async function handleCompactResume({ hippoRoot, tenantId }) {
|
|
631
560
|
const { text: stdinText, timedOut: stdinTimedOut } = await readHookStdin();
|
|
632
561
|
await runHookWithStores(() => {
|
|
633
|
-
resetHookInjection(hippoRoot, stdinText, 'compact');
|
|
634
|
-
cmdCompactResume(hookStoreRoot(hippoRoot), stdinText, stdinTimedOut);
|
|
562
|
+
resetHookInjection(hippoRoot, tenantId, stdinText, 'compact');
|
|
563
|
+
cmdCompactResume(hookStoreRoot(hippoRoot), tenantId, stdinText, stdinTimedOut);
|
|
635
564
|
});
|
|
636
565
|
}
|
|
637
|
-
export async function handleCapture({ hippoRoot, flags }) {
|
|
566
|
+
export async function handleCapture({ hippoRoot, tenantId, flags }) {
|
|
638
567
|
let captureSource = null;
|
|
639
568
|
let captureFile;
|
|
640
569
|
let transcriptPath;
|
|
@@ -655,10 +584,10 @@ export async function handleCapture({ hippoRoot, flags }) {
|
|
|
655
584
|
}
|
|
656
585
|
if (!captureSource) {
|
|
657
586
|
printError('Usage: hippo capture --stdin|--file <path>|--last-session [--transcript <path>] [--log-file <path>] [--dry-run] [--global]');
|
|
658
|
-
|
|
587
|
+
throw new CliExit(1);
|
|
659
588
|
}
|
|
660
589
|
// Bounded, and only when last-session has no explicit path: the
|
|
661
|
-
// --stdin source keeps its own blocking read in capture
|
|
590
|
+
// --stdin source keeps its own blocking read in src/capture/ by design.
|
|
662
591
|
const bounded = captureSource === 'last-session' && !transcriptPath
|
|
663
592
|
? await readHookStdin()
|
|
664
593
|
: { text: undefined, timedOut: false };
|
|
@@ -671,7 +600,7 @@ export async function handleCapture({ hippoRoot, flags }) {
|
|
|
671
600
|
logFile: stringFlag(flags, 'log-file'),
|
|
672
601
|
dryRun: boolFlag(flags, 'dry-run'),
|
|
673
602
|
global: boolFlag(flags, 'global'),
|
|
674
|
-
tenantId
|
|
603
|
+
tenantId,
|
|
675
604
|
});
|
|
676
605
|
}
|
|
677
606
|
//# sourceMappingURL=session-hooks.js.map
|