harnery 0.40.0 → 0.42.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 +1 -1
- package/dist/commander.js +4 -0
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +34 -20
- package/dist/commands/artifacts.d.ts.map +1 -1
- package/dist/commands/artifacts.js +113 -12
- package/dist/commands/browse-ai.d.ts.map +1 -1
- package/dist/commands/browse-ai.js +4 -0
- package/dist/commands/browse.d.ts +164 -0
- package/dist/commands/browse.d.ts.map +1 -1
- package/dist/commands/browse.js +388 -45
- package/dist/commands/checkpoint.js +8 -12
- package/dist/commands/claude-desktop.d.ts.map +1 -1
- package/dist/commands/claude-desktop.js +52 -0
- package/dist/commands/deinit.d.ts +1 -1
- package/dist/commands/deinit.d.ts.map +1 -1
- package/dist/commands/deinit.js +8 -4
- package/dist/commands/disk.d.ts +6 -0
- package/dist/commands/disk.d.ts.map +1 -0
- package/dist/commands/disk.js +80 -0
- package/dist/commands/docs.d.ts.map +1 -1
- package/dist/commands/docs.js +2 -0
- package/dist/commands/doctor.d.ts +8 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +58 -3
- package/dist/commands/fetch.d.ts.map +1 -1
- package/dist/commands/fetch.js +10 -0
- package/dist/commands/files.d.ts +16 -0
- package/dist/commands/files.d.ts.map +1 -1
- package/dist/commands/files.js +54 -2
- package/dist/commands/init.d.ts +21 -5
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +271 -109
- package/dist/commands/instructions.js +5 -4
- package/dist/commands/ledger-v3.d.ts.map +1 -1
- package/dist/commands/ledger-v3.js +2 -1
- package/dist/commands/rm.d.ts +4 -0
- package/dist/commands/rm.d.ts.map +1 -0
- package/dist/commands/rm.js +87 -0
- package/dist/commands/servers.d.ts +7 -0
- package/dist/commands/servers.d.ts.map +1 -0
- package/dist/commands/servers.js +394 -0
- package/dist/commands/tunnel.d.ts.map +1 -1
- package/dist/commands/tunnel.js +82 -2
- package/dist/commands/webview.d.ts +4 -0
- package/dist/commands/webview.d.ts.map +1 -0
- package/dist/commands/webview.js +94 -0
- package/dist/core/adapter.d.ts +50 -1
- package/dist/core/adapter.d.ts.map +1 -1
- package/dist/core/adapter.js +59 -1
- package/dist/core/adapters/attestation.d.ts.map +1 -1
- package/dist/core/adapters/attestation.js +3 -2
- package/dist/core/adapters/profiles.d.ts +29 -3
- package/dist/core/adapters/profiles.d.ts.map +1 -1
- package/dist/core/adapters/profiles.js +53 -1
- package/dist/core/adapters/registry.d.ts.map +1 -1
- package/dist/core/adapters/registry.js +33 -0
- package/dist/core/adapters/types.d.ts +9 -0
- package/dist/core/adapters/types.d.ts.map +1 -1
- package/dist/core/agents/canonical-emit.d.ts +1 -1
- package/dist/core/agents/canonical-emit.d.ts.map +1 -1
- package/dist/core/agents/canonical-emit.js +2 -7
- package/dist/core/agents/cli.js +25 -16
- package/dist/core/agents/coord-client.d.ts.map +1 -1
- package/dist/core/agents/coord-client.js +7 -2
- package/dist/core/agents/render/session-context.d.ts.map +1 -1
- package/dist/core/agents/render/session-context.js +2 -0
- package/dist/core/agents/rules/claim-conflict.d.ts.map +1 -1
- package/dist/core/agents/rules/claim-conflict.js +3 -9
- package/dist/core/agents/rules/commit-conflict.d.ts.map +1 -1
- package/dist/core/agents/rules/commit-conflict.js +2 -8
- package/dist/core/agents/rules/stop-hook.d.ts +2 -0
- package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
- package/dist/core/agents/rules/stop-hook.js +1 -1
- package/dist/core/agents/session-events.d.ts +6 -2
- package/dist/core/agents/session-events.d.ts.map +1 -1
- package/dist/core/agents/session-events.js +105 -26
- package/dist/core/agents/session-finalization-state-v3.d.ts.map +1 -1
- package/dist/core/agents/session-finalization-state-v3.js +2 -1
- package/dist/core/agents/session-finalizer-v3.d.ts.map +1 -1
- package/dist/core/agents/session-finalizer-v3.js +5 -4
- package/dist/core/agents/session-name-display.d.ts +28 -0
- package/dist/core/agents/session-name-display.d.ts.map +1 -1
- package/dist/core/agents/session-name-display.js +43 -0
- package/dist/core/agents/state/heartbeat-reader.d.ts +7 -0
- package/dist/core/agents/state/heartbeat-reader.d.ts.map +1 -1
- package/dist/core/agents/state/heartbeat-writer.d.ts +10 -0
- package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
- package/dist/core/agents/state/heartbeat-writer.js +21 -2
- package/dist/core/agents/state/live-coordination-view.d.ts +20 -0
- package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -1
- package/dist/core/agents/state/live-coordination-view.js +61 -0
- package/dist/core/agents/state/live-coordination-writer.js +3 -0
- package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
- package/dist/core/agents/state/stale-sweep.js +2 -10
- package/dist/core/agents/turn-changes.d.ts +17 -0
- package/dist/core/agents/turn-changes.d.ts.map +1 -0
- package/dist/core/agents/turn-changes.js +76 -0
- package/dist/core/artifacts/delivery-card.d.ts.map +1 -1
- package/dist/core/artifacts/delivery-card.js +11 -3
- package/dist/core/artifacts/index.d.ts +140 -4
- package/dist/core/artifacts/index.d.ts.map +1 -1
- package/dist/core/artifacts/index.js +526 -52
- package/dist/core/config.d.ts +73 -11
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +142 -3
- package/dist/core/context/index.d.ts.map +1 -1
- package/dist/core/context/index.js +2 -1
- package/dist/core/conversations/archive.d.ts.map +1 -1
- package/dist/core/conversations/archive.js +4 -3
- package/dist/core/diagnostics/bundle.d.ts.map +1 -1
- package/dist/core/diagnostics/bundle.js +5 -4
- package/dist/core/events/legacy-storage/canary.d.ts.map +1 -1
- package/dist/core/events/legacy-storage/canary.js +5 -4
- package/dist/core/events/legacy-storage/compression.d.ts.map +1 -1
- package/dist/core/events/legacy-storage/compression.js +2 -1
- package/dist/core/events/v3/adapter-id.d.ts +10 -2
- package/dist/core/events/v3/adapter-id.d.ts.map +1 -1
- package/dist/core/events/v3/adapter-id.js +16 -0
- package/dist/core/events/v3/authority-outbox.d.ts.map +1 -1
- package/dist/core/events/v3/authority-outbox.js +2 -1
- package/dist/core/events/v3/bootstrap.d.ts.map +1 -1
- package/dist/core/events/v3/bootstrap.js +5 -4
- package/dist/core/events/v3/capabilities.d.ts.map +1 -1
- package/dist/core/events/v3/capabilities.js +17 -0
- package/dist/core/events/v3/contract.d.ts +5 -0
- package/dist/core/events/v3/contract.d.ts.map +1 -1
- package/dist/core/events/v3/contract.js +7 -1
- package/dist/core/events/v3/control-witness.d.ts.map +1 -1
- package/dist/core/events/v3/control-witness.js +3 -2
- package/dist/core/events/v3/coordination-transaction-recovery.d.ts.map +1 -1
- package/dist/core/events/v3/coordination-transaction-recovery.js +4 -3
- package/dist/core/events/v3/fingerprint-keys.d.ts.map +1 -1
- package/dist/core/events/v3/fingerprint-keys.js +7 -6
- package/dist/core/events/v3/generated.d.ts +1 -1
- package/dist/core/events/v3/generated.js +1 -1
- package/dist/core/events/v3/live-feed.d.ts.map +1 -1
- package/dist/core/events/v3/live-feed.js +5 -4
- package/dist/core/events/v3/producers/command-recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/command-recorder.js +8 -7
- package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/coordination-recorder.js +8 -7
- package/dist/core/events/v3/producers/diagnostic-summaries.d.ts.map +1 -1
- package/dist/core/events/v3/producers/diagnostic-summaries.js +5 -4
- package/dist/core/events/v3/producers/hook-base.d.ts +1 -0
- package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -1
- package/dist/core/events/v3/producers/hook-base.js +10 -4
- package/dist/core/events/v3/producers/hook.d.ts +2 -0
- package/dist/core/events/v3/producers/hook.d.ts.map +1 -1
- package/dist/core/events/v3/producers/hook.js +16 -1
- package/dist/core/events/v3/producers/intake.d.ts.map +1 -1
- package/dist/core/events/v3/producers/intake.js +16 -6
- package/dist/core/events/v3/producers/recorder.d.ts +2 -4
- package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/recorder.js +125 -101
- package/dist/core/events/v3/projection.js +9 -1
- package/dist/core/events/v3/recovery.d.ts.map +1 -1
- package/dist/core/events/v3/recovery.js +4 -3
- package/dist/core/events/v3/support-storage/inventory.d.ts.map +1 -1
- package/dist/core/events/v3/support-storage/inventory.js +2 -1
- package/dist/core/events/v3/support-storage/maintenance.d.ts.map +1 -1
- package/dist/core/events/v3/support-storage/maintenance.js +4 -3
- package/dist/core/events/v3/support-storage/pack-reader.d.ts.map +1 -1
- package/dist/core/events/v3/support-storage/pack-reader.js +4 -3
- package/dist/core/events/v3/support-storage/pack-writer.d.ts.map +1 -1
- package/dist/core/events/v3/support-storage/pack-writer.js +6 -5
- package/dist/core/events/v3/tool-line-changes.d.ts +8 -0
- package/dist/core/events/v3/tool-line-changes.d.ts.map +1 -0
- package/dist/core/events/v3/tool-line-changes.js +135 -0
- package/dist/core/events/v3/writer.d.ts.map +1 -1
- package/dist/core/events/v3/writer.js +8 -7
- package/dist/core/governor/planning.d.ts.map +1 -1
- package/dist/core/governor/planning.js +6 -5
- package/dist/core/governor/service.d.ts.map +1 -1
- package/dist/core/governor/service.js +12 -11
- package/dist/core/governor/state.d.ts.map +1 -1
- package/dist/core/governor/state.js +7 -6
- package/dist/core/guard/evaluator.js +1 -0
- package/dist/core/guard/storage.d.ts.map +1 -1
- package/dist/core/guard/storage.js +3 -2
- package/dist/core/hooks/adapter/behaviors/claude-code.d.ts +4 -0
- package/dist/core/hooks/adapter/behaviors/claude-code.d.ts.map +1 -0
- package/dist/core/hooks/adapter/behaviors/claude-code.js +31 -0
- package/dist/core/hooks/adapter/behaviors/codex.d.ts +15 -0
- package/dist/core/hooks/adapter/behaviors/codex.d.ts.map +1 -0
- package/dist/core/hooks/adapter/behaviors/codex.js +82 -0
- package/dist/core/hooks/adapter/behaviors/cursor.d.ts +7 -0
- package/dist/core/hooks/adapter/behaviors/cursor.d.ts.map +1 -0
- package/dist/core/hooks/adapter/behaviors/cursor.js +35 -0
- package/dist/core/hooks/adapter/behaviors/index.d.ts +11 -0
- package/dist/core/hooks/adapter/behaviors/index.d.ts.map +1 -0
- package/dist/core/hooks/adapter/behaviors/index.js +20 -0
- package/dist/core/hooks/adapter/behaviors/openclaw.d.ts +7 -0
- package/dist/core/hooks/adapter/behaviors/openclaw.d.ts.map +1 -0
- package/dist/core/hooks/adapter/behaviors/openclaw.js +34 -0
- package/dist/core/hooks/adapter/behaviors/opencode.d.ts +7 -0
- package/dist/core/hooks/adapter/behaviors/opencode.d.ts.map +1 -0
- package/dist/core/hooks/adapter/behaviors/opencode.js +34 -0
- package/dist/core/hooks/adapter/behaviors/types.d.ts +89 -0
- package/dist/core/hooks/adapter/behaviors/types.d.ts.map +1 -0
- package/dist/core/hooks/adapter/behaviors/types.js +1 -0
- package/dist/core/hooks/adapter/detect.d.ts +1 -1
- package/dist/core/hooks/adapter/detect.d.ts.map +1 -1
- package/dist/core/hooks/adapter/detect.js +2 -3
- package/dist/core/hooks/adapter/events.d.ts +46 -1
- package/dist/core/hooks/adapter/events.d.ts.map +1 -1
- package/dist/core/hooks/adapter/events.js +36 -0
- package/dist/core/hooks/adapter/opencode-plugin.d.ts +60 -0
- package/dist/core/hooks/adapter/opencode-plugin.d.ts.map +1 -0
- package/dist/core/hooks/adapter/opencode-plugin.js +129 -0
- package/dist/core/hooks/adapter/output.d.ts +7 -0
- package/dist/core/hooks/adapter/output.d.ts.map +1 -1
- package/dist/core/hooks/adapter/output.js +8 -1
- package/dist/core/hooks/adapter/runtime-telemetry.js +3 -1
- package/dist/core/hooks/adapter/wiring.d.ts +52 -8
- package/dist/core/hooks/adapter/wiring.d.ts.map +1 -1
- package/dist/core/hooks/adapter/wiring.js +133 -12
- package/dist/core/hooks/cli.js +676 -531
- package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
- package/dist/core/hooks/effects/image-capture.js +2 -1
- package/dist/core/hooks/prompt-context/contract.d.ts.map +1 -1
- package/dist/core/hooks/prompt-context/contract.js +1 -0
- package/dist/core/hooks/resolve/transcript.d.ts +1 -1
- package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
- package/dist/core/hooks/resolve/transcript.js +35 -4
- package/dist/core/hooks/run-markers.d.ts +37 -0
- package/dist/core/hooks/run-markers.d.ts.map +1 -0
- package/dist/core/hooks/run-markers.js +109 -0
- package/dist/core/hooks/session-name-presence.d.ts +3 -1
- package/dist/core/hooks/session-name-presence.d.ts.map +1 -1
- package/dist/core/hooks/session-name-presence.js +7 -2
- package/dist/core/hooks/shell-waiter.d.ts +2 -0
- package/dist/core/hooks/shell-waiter.d.ts.map +1 -0
- package/dist/core/hooks/shell-waiter.js +173 -0
- package/dist/core/resources/service.d.ts.map +1 -1
- package/dist/core/resources/service.js +5 -4
- package/dist/core/semantic/review.d.ts.map +1 -1
- package/dist/core/semantic/review.js +5 -4
- package/dist/core/semantic/service.d.ts.map +1 -1
- package/dist/core/semantic/service.js +15 -14
- package/dist/core/semantic/storage.d.ts.map +1 -1
- package/dist/core/semantic/storage.js +5 -4
- package/dist/core/servers/index.d.ts +211 -0
- package/dist/core/servers/index.d.ts.map +1 -0
- package/dist/core/servers/index.js +560 -0
- package/dist/core/servers/net.d.ts +58 -0
- package/dist/core/servers/net.d.ts.map +1 -0
- package/dist/core/servers/net.js +270 -0
- package/dist/core/servers/tunnels.d.ts +14 -0
- package/dist/core/servers/tunnels.d.ts.map +1 -0
- package/dist/core/servers/tunnels.js +33 -0
- package/dist/core/storage/atomic-json.d.ts.map +1 -1
- package/dist/core/storage/atomic-json.js +7 -3
- package/dist/core/storage/builtins.js +1 -0
- package/dist/core/storage/durable-history.d.ts.map +1 -1
- package/dist/core/storage/durable-history.js +6 -5
- package/dist/core/storage/maintenance-providers.d.ts.map +1 -1
- package/dist/core/storage/maintenance-providers.js +2 -1
- package/dist/core/storage/maintenance.d.ts.map +1 -1
- package/dist/core/storage/maintenance.js +7 -6
- package/dist/core/storage/metrics.d.ts.map +1 -1
- package/dist/core/storage/metrics.js +5 -1
- package/dist/core/storage/modes.d.ts +17 -0
- package/dist/core/storage/modes.d.ts.map +1 -0
- package/dist/core/storage/modes.js +47 -0
- package/dist/core/storage/process-log.d.ts.map +1 -1
- package/dist/core/storage/process-log.js +3 -2
- package/dist/core/storage/receipts.d.ts.map +1 -1
- package/dist/core/storage/receipts.js +4 -3
- package/dist/core/storage/segments.d.ts.map +1 -1
- package/dist/core/storage/segments.js +7 -6
- package/dist/core/supervisor/hook-health.d.ts +2 -1
- package/dist/core/supervisor/hook-health.d.ts.map +1 -1
- package/dist/core/supervisor/hook-health.js +4 -3
- package/dist/core/supervisor/service.d.ts.map +1 -1
- package/dist/core/supervisor/service.js +7 -6
- package/dist/core/work/state.d.ts.map +1 -1
- package/dist/core/work/state.js +8 -7
- package/dist/core/workflow/adapters.d.ts +7 -0
- package/dist/core/workflow/adapters.d.ts.map +1 -1
- package/dist/core/workflow/adapters.js +9 -0
- package/dist/core/workflow/approvals.d.ts.map +1 -1
- package/dist/core/workflow/approvals.js +6 -5
- package/dist/core/workflow/billing.d.ts.map +1 -1
- package/dist/core/workflow/billing.js +33 -4
- package/dist/core/workflow/durable-record.d.ts.map +1 -1
- package/dist/core/workflow/durable-record.js +4 -3
- package/dist/core/workflow/engine.d.ts.map +1 -1
- package/dist/core/workflow/engine.js +30 -1
- package/dist/core/workflow/live-session-v3.d.ts.map +1 -1
- package/dist/core/workflow/live-session-v3.js +2 -3
- package/dist/core/workflow/run-state.d.ts.map +1 -1
- package/dist/core/workflow/run-state.js +3 -2
- package/dist/core/workflow/sandbox-projection.d.ts +13 -2
- package/dist/core/workflow/sandbox-projection.d.ts.map +1 -1
- package/dist/core/workflow/sandbox-projection.js +23 -0
- package/dist/core/workflow/spawn-claude.d.ts.map +1 -1
- package/dist/core/workflow/spawn-claude.js +6 -1
- package/dist/core/workflow/spawn-codex.d.ts +2 -0
- package/dist/core/workflow/spawn-codex.d.ts.map +1 -1
- package/dist/core/workflow/spawn-codex.js +20 -1
- package/dist/core/workflow/spawn-cursor.d.ts.map +1 -1
- package/dist/core/workflow/spawn-cursor.js +6 -1
- package/dist/core/workflow/spawn-opencode.d.ts +36 -0
- package/dist/core/workflow/spawn-opencode.d.ts.map +1 -0
- package/dist/core/workflow/spawn-opencode.js +135 -0
- package/dist/core/workflow/transcript.d.ts.map +1 -1
- package/dist/core/workflow/transcript.js +3 -2
- package/dist/core/workflow/types.d.ts +47 -2
- package/dist/core/workflow/types.d.ts.map +1 -1
- package/dist/core/workflow/worker-access.d.ts +92 -0
- package/dist/core/workflow/worker-access.d.ts.map +1 -0
- package/dist/core/workflow/worker-access.js +450 -0
- package/dist/core/workflow/workspaces/leases.d.ts.map +1 -1
- package/dist/core/workflow/workspaces/leases.js +5 -4
- package/dist/core/workflow/workspaces/local-git.d.ts.map +1 -1
- package/dist/core/workflow/workspaces/local-git.js +3 -2
- package/dist/core/workflow/workspaces/paths.d.ts.map +1 -1
- package/dist/core/workflow/workspaces/paths.js +2 -1
- package/dist/core/workflow/workspaces/state.d.ts.map +1 -1
- package/dist/core/workflow/workspaces/state.js +10 -9
- package/dist/lazy-commands.js +8 -1
- package/dist/lib/agent-browser/client.d.ts +9 -0
- package/dist/lib/agent-browser/client.d.ts.map +1 -1
- package/dist/lib/agent-browser/client.js +13 -0
- package/dist/lib/browser/batch-steps.d.ts +18 -0
- package/dist/lib/browser/batch-steps.d.ts.map +1 -0
- package/dist/lib/browser/batch-steps.js +82 -0
- package/dist/lib/browser/client.d.ts +35 -1
- package/dist/lib/browser/client.d.ts.map +1 -1
- package/dist/lib/browser/client.js +117 -8
- package/dist/lib/browser/collect/collector.d.ts +99 -0
- package/dist/lib/browser/collect/collector.d.ts.map +1 -0
- package/dist/lib/browser/collect/collector.js +202 -0
- package/dist/lib/browser/collect/fields.d.ts +31 -0
- package/dist/lib/browser/collect/fields.d.ts.map +1 -0
- package/dist/lib/browser/collect/fields.js +75 -0
- package/dist/lib/browser/collect/index.d.ts +6 -0
- package/dist/lib/browser/collect/index.d.ts.map +1 -0
- package/dist/lib/browser/collect/index.js +5 -0
- package/dist/lib/browser/collect/page-driver.d.ts +14 -0
- package/dist/lib/browser/collect/page-driver.d.ts.map +1 -0
- package/dist/lib/browser/collect/page-driver.js +306 -0
- package/dist/lib/browser/collect/presets.d.ts +52 -0
- package/dist/lib/browser/collect/presets.d.ts.map +1 -0
- package/dist/lib/browser/collect/presets.js +176 -0
- package/dist/lib/browser/collect/scroll-plan.d.ts +85 -0
- package/dist/lib/browser/collect/scroll-plan.d.ts.map +1 -0
- package/dist/lib/browser/collect/scroll-plan.js +118 -0
- package/dist/lib/browser/identity.d.ts +25 -0
- package/dist/lib/browser/identity.d.ts.map +1 -0
- package/dist/lib/browser/identity.js +66 -0
- package/dist/lib/browser/index.d.ts +3 -2
- package/dist/lib/browser/index.d.ts.map +1 -1
- package/dist/lib/browser/index.js +2 -1
- package/dist/lib/browser/launch-args.d.ts +26 -0
- package/dist/lib/browser/launch-args.d.ts.map +1 -1
- package/dist/lib/browser/launch-args.js +41 -1
- package/dist/lib/browser/page-review-judge.d.ts +2 -0
- package/dist/lib/browser/page-review-judge.d.ts.map +1 -1
- package/dist/lib/browser/page-review-judge.js +13 -0
- package/dist/lib/browser/qa-run-contracts.d.ts +10 -0
- package/dist/lib/browser/qa-run-contracts.d.ts.map +1 -1
- package/dist/lib/browser/qa-run.d.ts.map +1 -1
- package/dist/lib/browser/qa-run.js +1 -0
- package/dist/lib/browser/user-agent.d.ts +53 -0
- package/dist/lib/browser/user-agent.d.ts.map +1 -0
- package/dist/lib/browser/user-agent.js +79 -0
- package/dist/lib/browser/windows-chrome.d.ts +59 -0
- package/dist/lib/browser/windows-chrome.d.ts.map +1 -0
- package/dist/lib/browser/windows-chrome.js +179 -0
- package/dist/lib/claude-desktop-share.d.ts +136 -0
- package/dist/lib/claude-desktop-share.d.ts.map +1 -0
- package/dist/lib/claude-desktop-share.js +394 -0
- package/dist/lib/disk-usage.d.ts +50 -0
- package/dist/lib/disk-usage.d.ts.map +1 -0
- package/dist/lib/disk-usage.js +303 -0
- package/dist/lib/docs-lint.d.ts +6 -0
- package/dist/lib/docs-lint.d.ts.map +1 -1
- package/dist/lib/docs-lint.js +8 -3
- package/dist/lib/docs-metadata-managed.d.ts +1 -0
- package/dist/lib/docs-metadata-managed.d.ts.map +1 -1
- package/dist/lib/docs-metadata-managed.js +17 -1
- package/dist/lib/guarded-remove.d.ts +34 -0
- package/dist/lib/guarded-remove.d.ts.map +1 -0
- package/dist/lib/guarded-remove.js +310 -0
- package/dist/lib/identities/assume.d.ts.map +1 -1
- package/dist/lib/identities/assume.js +4 -9
- package/dist/lib/instructions/apply.d.ts.map +1 -1
- package/dist/lib/instructions/apply.js +2 -0
- package/dist/lib/instructions/templates.js +8 -8
- package/dist/lib/pace/index.d.ts +2 -0
- package/dist/lib/pace/index.d.ts.map +1 -0
- package/dist/lib/pace/index.js +1 -0
- package/dist/lib/pace/pace.d.ts +95 -0
- package/dist/lib/pace/pace.d.ts.map +1 -0
- package/dist/lib/pace/pace.js +313 -0
- package/dist/lib/tunnel/error-page.d.ts +1 -1
- package/dist/lib/tunnel/error-page.d.ts.map +1 -1
- package/dist/lib/tunnel/error-page.js +19 -8
- package/dist/lib/tunnel/forward-headers.d.ts +11 -0
- package/dist/lib/tunnel/forward-headers.d.ts.map +1 -0
- package/dist/lib/tunnel/forward-headers.js +17 -0
- package/dist/lib/tunnel/gate.js +34 -10
- package/dist/lib/tunnel/path-scope.d.ts +22 -0
- package/dist/lib/tunnel/path-scope.d.ts.map +1 -0
- package/dist/lib/tunnel/path-scope.js +62 -0
- package/dist/lib/tunnel/state.d.ts +5 -0
- package/dist/lib/tunnel/state.d.ts.map +1 -1
- package/dist/lib/tunnel/state.js +17 -3
- package/dist/lib/webview/index.d.ts +2 -0
- package/dist/lib/webview/index.d.ts.map +1 -0
- package/dist/lib/webview/index.js +1 -0
- package/dist/lib/webview/webview.d.ts +116 -0
- package/dist/lib/webview/webview.d.ts.map +1 -0
- package/dist/lib/webview/webview.js +289 -0
- package/opencode-plugin/package.json +19 -0
- package/opencode-plugin/src/index.ts +791 -0
- package/package.json +16 -4
- package/schemas/config.schema.json +104 -0
- package/schemas/event-v3.schema.json +164 -0
- package/src/commander.ts +26 -0
- package/src/commands/agents.ts +47 -18
- package/src/commands/artifacts.ts +171 -19
- package/src/commands/browse-ai.ts +8 -0
- package/src/commands/browse.ts +570 -48
- package/src/commands/checkpoint.ts +7 -9
- package/src/commands/claude-desktop.ts +61 -0
- package/src/commands/deinit.ts +9 -4
- package/src/commands/disk.ts +114 -0
- package/src/commands/docs.ts +2 -0
- package/src/commands/doctor.ts +63 -3
- package/src/commands/fetch.ts +14 -0
- package/src/commands/files.ts +93 -2
- package/src/commands/init.ts +334 -122
- package/src/commands/instructions.ts +8 -4
- package/src/commands/ledger-v3.ts +2 -1
- package/src/commands/rm.ts +115 -0
- package/src/commands/servers.ts +506 -0
- package/src/commands/tunnel.ts +102 -2
- package/src/commands/webview.ts +159 -0
- package/src/core/adapter.ts +102 -1
- package/src/core/adapters/attestation.ts +3 -2
- package/src/core/adapters/profiles.ts +63 -1
- package/src/core/adapters/registry.ts +37 -0
- package/src/core/adapters/types.ts +10 -0
- package/src/core/agents/canonical-emit.ts +2 -5
- package/src/core/agents/cli.ts +26 -17
- package/src/core/agents/coord-client.ts +9 -3
- package/src/core/agents/render/session-context.ts +1 -0
- package/src/core/agents/rules/claim-conflict.ts +3 -8
- package/src/core/agents/rules/commit-conflict.ts +2 -7
- package/src/core/agents/rules/stop-hook.ts +3 -1
- package/src/core/agents/session-events.ts +120 -26
- package/src/core/agents/session-finalization-state-v3.ts +2 -1
- package/src/core/agents/session-finalizer-v3.ts +5 -4
- package/src/core/agents/session-name-display.ts +48 -0
- package/src/core/agents/state/heartbeat-reader.ts +7 -0
- package/src/core/agents/state/heartbeat-writer.ts +24 -2
- package/src/core/agents/state/live-coordination-view.ts +74 -0
- package/src/core/agents/state/live-coordination-writer.ts +3 -0
- package/src/core/agents/state/stale-sweep.ts +2 -9
- package/src/core/agents/turn-changes.ts +97 -0
- package/src/core/artifacts/delivery-card.ts +12 -3
- package/src/core/artifacts/index.ts +701 -47
- package/src/core/config.ts +206 -4
- package/src/core/context/index.ts +2 -1
- package/src/core/conversations/archive.ts +4 -3
- package/src/core/diagnostics/bundle.ts +5 -3
- package/src/core/events/legacy-storage/canary.ts +5 -4
- package/src/core/events/legacy-storage/compression.ts +2 -1
- package/src/core/events/v3/adapter-id.ts +29 -1
- package/src/core/events/v3/authority-outbox.ts +2 -1
- package/src/core/events/v3/bootstrap.ts +5 -4
- package/src/core/events/v3/capabilities.ts +17 -0
- package/src/core/events/v3/contract.ts +9 -1
- package/src/core/events/v3/control-witness.ts +3 -2
- package/src/core/events/v3/coordination-transaction-recovery.ts +4 -3
- package/src/core/events/v3/fingerprint-keys.ts +7 -6
- package/src/core/events/v3/generated.ts +1 -1
- package/src/core/events/v3/live-feed.ts +5 -4
- package/src/core/events/v3/producers/command-recorder.ts +8 -6
- package/src/core/events/v3/producers/coordination-recorder.ts +8 -7
- package/src/core/events/v3/producers/diagnostic-summaries.ts +5 -4
- package/src/core/events/v3/producers/hook-base.ts +11 -4
- package/src/core/events/v3/producers/hook.ts +19 -1
- package/src/core/events/v3/producers/intake.ts +18 -6
- package/src/core/events/v3/producers/recorder.ts +139 -114
- package/src/core/events/v3/projection.ts +11 -1
- package/src/core/events/v3/recovery.ts +4 -3
- package/src/core/events/v3/support-storage/inventory.ts +2 -1
- package/src/core/events/v3/support-storage/maintenance.ts +8 -3
- package/src/core/events/v3/support-storage/pack-reader.ts +4 -3
- package/src/core/events/v3/support-storage/pack-writer.ts +6 -5
- package/src/core/events/v3/tool-line-changes.ts +139 -0
- package/src/core/events/v3/writer.ts +8 -7
- package/src/core/governor/planning.ts +6 -5
- package/src/core/governor/service.ts +12 -11
- package/src/core/governor/state.ts +7 -6
- package/src/core/guard/evaluator.ts +1 -0
- package/src/core/guard/storage.ts +3 -2
- package/src/core/hooks/adapter/behaviors/claude-code.ts +33 -0
- package/src/core/hooks/adapter/behaviors/codex.ts +96 -0
- package/src/core/hooks/adapter/behaviors/cursor.ts +37 -0
- package/src/core/hooks/adapter/behaviors/index.ts +31 -0
- package/src/core/hooks/adapter/behaviors/openclaw.ts +36 -0
- package/src/core/hooks/adapter/behaviors/opencode.ts +36 -0
- package/src/core/hooks/adapter/behaviors/types.ts +110 -0
- package/src/core/hooks/adapter/detect.ts +2 -3
- package/src/core/hooks/adapter/events.ts +72 -1
- package/src/core/hooks/adapter/opencode-plugin.ts +177 -0
- package/src/core/hooks/adapter/output.ts +8 -1
- package/src/core/hooks/adapter/runtime-telemetry.ts +3 -1
- package/src/core/hooks/adapter/wiring.ts +198 -16
- package/src/core/hooks/cli.ts +776 -539
- package/src/core/hooks/effects/image-capture.ts +2 -1
- package/src/core/hooks/prompt-context/contract.ts +1 -0
- package/src/core/hooks/resolve/transcript.ts +42 -5
- package/src/core/hooks/run-markers.ts +132 -0
- package/src/core/hooks/session-name-presence.ts +10 -3
- package/src/core/hooks/shell-waiter.ts +166 -0
- package/src/core/resources/service.ts +5 -4
- package/src/core/semantic/review.ts +5 -4
- package/src/core/semantic/service.ts +15 -14
- package/src/core/semantic/storage.ts +5 -4
- package/src/core/servers/index.ts +712 -0
- package/src/core/servers/net.ts +283 -0
- package/src/core/servers/tunnels.ts +39 -0
- package/src/core/storage/atomic-json.ts +7 -3
- package/src/core/storage/builtins.ts +1 -0
- package/src/core/storage/durable-history.ts +6 -5
- package/src/core/storage/maintenance-providers.ts +2 -1
- package/src/core/storage/maintenance.ts +7 -6
- package/src/core/storage/metrics.ts +5 -1
- package/src/core/storage/modes.ts +53 -0
- package/src/core/storage/process-log.ts +3 -2
- package/src/core/storage/receipts.ts +4 -3
- package/src/core/storage/segments.ts +7 -6
- package/src/core/supervisor/hook-health.ts +4 -4
- package/src/core/supervisor/service.ts +7 -6
- package/src/core/work/state.ts +8 -7
- package/src/core/workflow/adapters.ts +15 -0
- package/src/core/workflow/approvals.ts +6 -5
- package/src/core/workflow/billing.ts +34 -4
- package/src/core/workflow/durable-record.ts +4 -3
- package/src/core/workflow/engine.ts +38 -1
- package/src/core/workflow/live-session-v3.ts +2 -3
- package/src/core/workflow/run-state.ts +3 -2
- package/src/core/workflow/sandbox-projection.ts +38 -2
- package/src/core/workflow/spawn-claude.ts +5 -1
- package/src/core/workflow/spawn-codex.ts +18 -1
- package/src/core/workflow/spawn-cursor.ts +5 -1
- package/src/core/workflow/spawn-opencode.ts +153 -0
- package/src/core/workflow/transcript.ts +3 -2
- package/src/core/workflow/types.ts +62 -2
- package/src/core/workflow/worker-access.ts +525 -0
- package/src/core/workflow/workspaces/leases.ts +5 -4
- package/src/core/workflow/workspaces/local-git.ts +3 -2
- package/src/core/workflow/workspaces/paths.ts +2 -1
- package/src/core/workflow/workspaces/state.ts +10 -9
- package/src/lazy-commands.ts +11 -1
- package/src/lib/agent-browser/client.ts +18 -0
- package/src/lib/browser/batch-steps.ts +79 -0
- package/src/lib/browser/client.ts +147 -9
- package/src/lib/browser/collect/collector.ts +306 -0
- package/src/lib/browser/collect/fields.ts +87 -0
- package/src/lib/browser/collect/index.ts +47 -0
- package/src/lib/browser/collect/page-driver.ts +327 -0
- package/src/lib/browser/collect/presets.ts +237 -0
- package/src/lib/browser/collect/scroll-plan.ts +179 -0
- package/src/lib/browser/identity.ts +64 -0
- package/src/lib/browser/index.ts +16 -1
- package/src/lib/browser/launch-args.ts +53 -1
- package/src/lib/browser/page-review-judge.ts +16 -0
- package/src/lib/browser/qa-run-contracts.ts +11 -0
- package/src/lib/browser/qa-run.ts +1 -0
- package/src/lib/browser/user-agent.ts +130 -0
- package/src/lib/browser/windows-chrome.ts +227 -0
- package/src/lib/claude-desktop-share.ts +511 -0
- package/src/lib/disk-usage.ts +347 -0
- package/src/lib/docs-lint.ts +8 -3
- package/src/lib/docs-metadata-managed.ts +21 -0
- package/src/lib/guarded-remove.ts +376 -0
- package/src/lib/identities/assume.ts +7 -7
- package/src/lib/instructions/apply.ts +2 -0
- package/src/lib/instructions/templates.ts +8 -8
- package/src/lib/pace/index.ts +14 -0
- package/src/lib/pace/pace.ts +370 -0
- package/src/lib/tunnel/error-page.ts +25 -9
- package/src/lib/tunnel/forward-headers.ts +16 -0
- package/src/lib/tunnel/gate.ts +39 -10
- package/src/lib/tunnel/path-scope.ts +73 -0
- package/src/lib/tunnel/state.ts +20 -3
- package/src/lib/webview/index.ts +13 -0
- package/src/lib/webview/webview.ts +457 -0
|
@@ -2,8 +2,11 @@ import { createHash, randomUUID } from "node:crypto";
|
|
|
2
2
|
import { chmodSync, closeSync, existsSync, fsyncSync, lstatSync, mkdirSync, openSync, readdirSync, readFileSync, renameSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
3
3
|
import { hostname } from "node:os";
|
|
4
4
|
import { basename, join, resolve } from "node:path";
|
|
5
|
+
import { normalizeAdapter } from "../../../adapter.js";
|
|
6
|
+
import { adapterBehavior } from "../../../hooks/adapter/behaviors/index.js";
|
|
5
7
|
import { extractBashCommand } from "../../../hooks/adapter/parse.js";
|
|
6
|
-
import {
|
|
8
|
+
import { readRuntimeContextTelemetry, readRuntimeTuning, } from "../../../hooks/adapter/runtime-telemetry.js";
|
|
9
|
+
import { stateDirMode, stateFileMode, stateModeTooOpen } from "../../../storage/modes.js";
|
|
7
10
|
import { fsyncParentDirectory } from "../../../workflow/durable-record.js";
|
|
8
11
|
import { acquireNoClobberLease } from "../../../workflow/workspaces/leases.js";
|
|
9
12
|
import { EVENT_ADAPTER_IDS_V3 } from "../adapter-id.js";
|
|
@@ -18,6 +21,7 @@ import { attestationIdV3, clockIdV3, delegationIdV3, eventIdV3, generationIdV3,
|
|
|
18
21
|
import { readLedgerV3 } from "../reader.js";
|
|
19
22
|
import { effectiveRuntimeTelemetryCapabilitiesV3, } from "../runtime-telemetry-capabilities.js";
|
|
20
23
|
import { closeSpanStateV3, openSpanStateV3, recoverSpanUpperBoundV3, } from "../span-state.js";
|
|
24
|
+
import { prepareToolLineChanges } from "../tool-line-changes.js";
|
|
21
25
|
import { extractTurnTelemetryV3, } from "../turn-telemetry.js";
|
|
22
26
|
import { assertEventV3, validateEventV3 } from "../validate.js";
|
|
23
27
|
import { EVENT_V3_LEDGER_RELATIVE_ROOT, writeEventV3, } from "../writer.js";
|
|
@@ -38,17 +42,6 @@ const ACTIVE_RUNTIME_CONTEXT_PROBE_INTERVAL_MS = 15_000;
|
|
|
38
42
|
const STOP_RUNTIME_CONTEXT_RETRY_DELAYS_MS = [75, 175];
|
|
39
43
|
/** Finalization is off the interactive hook path; briefly cover Codex's delayed transcript flush. */
|
|
40
44
|
const APPROVED_END_RUNTIME_CONTEXT_RETRY_DELAYS_MS = [0, 250, 250];
|
|
41
|
-
/**
|
|
42
|
-
* Adapters whose turn-boundary recovery and mid-flight onboarding are enabled.
|
|
43
|
-
* Kept in code, outside the digested capability profiles, so tuning recovery
|
|
44
|
-
* never changes an adapter capability digest (ADR 0078).
|
|
45
|
-
*/
|
|
46
|
-
const RECOVERY_ENABLED_ADAPTERS = new Set([
|
|
47
|
-
"claude-code",
|
|
48
|
-
"codex",
|
|
49
|
-
"cursor",
|
|
50
|
-
"openclaw",
|
|
51
|
-
]);
|
|
52
45
|
const STATE_LEASE_RETRY_ATTEMPTS = 8;
|
|
53
46
|
const STATE_LEASE_RETRY_DELAY_MS = 25;
|
|
54
47
|
/**
|
|
@@ -127,11 +120,11 @@ function sessionHashForSignal(input, context) {
|
|
|
127
120
|
if (nativeSession !== undefined) {
|
|
128
121
|
return normalizeNativeIdV3(context, `${input.adapter}.session`, nativeSession);
|
|
129
122
|
}
|
|
130
|
-
//
|
|
131
|
-
// hooks may still have an exact coordination instance, so reuse its
|
|
132
|
-
// live producer authority instead of hashing the instance into a
|
|
133
|
-
// state path. Ambiguous or absent matches keep the fail-closed fallback.
|
|
134
|
-
if (input.adapter
|
|
123
|
+
// Some adapters carry native session identity only on their start signal.
|
|
124
|
+
// Later hooks may still have an exact coordination instance, so reuse its
|
|
125
|
+
// single live producer authority instead of hashing the instance into a
|
|
126
|
+
// second state path. Ambiguous or absent matches keep the fail-closed fallback.
|
|
127
|
+
if (adapterBehavior(input.adapter).sessionIdentityOnStartOnly) {
|
|
135
128
|
const matches = listHookProducerStateRecordsV3(input.coordRoot).filter(({ state }) => state.adapter === input.adapter && state.instance_id === input.instance_id);
|
|
136
129
|
if (matches.length === 1) {
|
|
137
130
|
const name = basename(matches[0].path);
|
|
@@ -298,6 +291,7 @@ function sleepSync(milliseconds) {
|
|
|
298
291
|
}
|
|
299
292
|
/** The pre-spool body of the recorder: requires the session's state lease to be held. */
|
|
300
293
|
function processHookSignalLocked(control, input, sessionHash, path) {
|
|
294
|
+
const behavior = adapterBehavior(input.adapter);
|
|
301
295
|
const rootId = control.genesis.event.scope.root_id;
|
|
302
296
|
const epochId = control.genesis.profile.privacy_key_epoch;
|
|
303
297
|
const boundaryEventId = control.state === "candidate"
|
|
@@ -329,14 +323,15 @@ function processHookSignalLocked(control, input, sessionHash, path) {
|
|
|
329
323
|
state.capability_profile !== adapterCapabilityProfileDigestV3(input.adapter))) {
|
|
330
324
|
throw new Error("V3 producer state authority does not match the active boundary");
|
|
331
325
|
}
|
|
332
|
-
if (state
|
|
326
|
+
if (state &&
|
|
327
|
+
behavior.tracksExecutionMode &&
|
|
333
328
|
input.payload.cursor_mode &&
|
|
334
329
|
input.payload.cursor_mode !== "unknown") {
|
|
335
330
|
if (!state.cursor_mode || state.cursor_mode === "unknown") {
|
|
336
331
|
state.cursor_mode = input.payload.cursor_mode;
|
|
337
332
|
}
|
|
338
333
|
else if (state.cursor_mode !== input.payload.cursor_mode) {
|
|
339
|
-
throw new Error("
|
|
334
|
+
throw new Error("Execution mode changed within one V3 generation");
|
|
340
335
|
}
|
|
341
336
|
}
|
|
342
337
|
let recovered;
|
|
@@ -375,7 +370,7 @@ function processHookSignalLocked(control, input, sessionHash, path) {
|
|
|
375
370
|
// from the observer instance (that would split the real session).
|
|
376
371
|
const nativeSessionIdentity = input.payload.session_id ?? input.payload.conversation_id ?? input.payload.agent_id;
|
|
377
372
|
const onboardable = !state &&
|
|
378
|
-
|
|
373
|
+
behavior.turnRecovery &&
|
|
379
374
|
input.signal !== "session-end" &&
|
|
380
375
|
nativeSessionIdentity !== undefined;
|
|
381
376
|
if (!onboardable) {
|
|
@@ -407,16 +402,16 @@ function processHookSignalLocked(control, input, sessionHash, path) {
|
|
|
407
402
|
instance_id: input.instance_id,
|
|
408
403
|
signal: input.signal,
|
|
409
404
|
session_hash: sessionHash,
|
|
410
|
-
...(
|
|
405
|
+
...(behavior.midFlightDiagnosticContext?.(input.payload) ?? {}),
|
|
411
406
|
});
|
|
412
407
|
}
|
|
413
408
|
}
|
|
414
409
|
const fingerprintContext = fingerprintContextV3(input.coordRoot, rootId, state.generation_id, state.privacy_epoch_id);
|
|
415
|
-
const recoveryEnabled =
|
|
410
|
+
const recoveryEnabled = behavior.turnRecovery;
|
|
416
411
|
const nativeTid = input.payload.turn_id
|
|
417
412
|
? normalizeNativeIdV3(fingerprintContext, `${input.adapter}.turn`, input.payload.turn_id).replace(/^hid_/, "tid_")
|
|
418
413
|
: undefined;
|
|
419
|
-
const cursorPromptWithinOpenTurn =
|
|
414
|
+
const cursorPromptWithinOpenTurn = behavior.promptContinuesOpenTurn &&
|
|
420
415
|
input.signal === "user-prompt-submit" &&
|
|
421
416
|
state.current_turn_id !== undefined &&
|
|
422
417
|
state.current_turn_span !== undefined;
|
|
@@ -495,7 +490,29 @@ function processHookSignalLocked(control, input, sessionHash, path) {
|
|
|
495
490
|
// their self-contained timing cannot drift by a millisecond.
|
|
496
491
|
const eventClock = signalClock(input);
|
|
497
492
|
if (input.signal === "after-agent-response") {
|
|
498
|
-
|
|
493
|
+
// Cursor Stop followups auto-submit without beforeSubmitPrompt, so they
|
|
494
|
+
// never open a turn. The first stop already closed the human turn.
|
|
495
|
+
// Later completed replies still fire afterAgentResponse; bind them to a
|
|
496
|
+
// derived remediation turn so Stop can consume the new ritual instead of
|
|
497
|
+
// looping on the frozen first terminal.
|
|
498
|
+
const ritualFromResponseEvent = behavior.completedResponseEvent === input.signal;
|
|
499
|
+
if (ritualFromResponseEvent &&
|
|
500
|
+
input.turn_ritual &&
|
|
501
|
+
(!state.current_turn_id || !state.current_turn_span)) {
|
|
502
|
+
commitRecoveredToolTurnStart(input, state, path, rootId, fingerprintContext, {
|
|
503
|
+
stop_remediation: true,
|
|
504
|
+
});
|
|
505
|
+
writeProducerDiagnosticV3(input.coordRoot, "cursor_response_ritual_recovered_turn", {
|
|
506
|
+
adapter: input.adapter,
|
|
507
|
+
instance_id: input.instance_id,
|
|
508
|
+
generation_id: state.generation_id,
|
|
509
|
+
signal: input.signal,
|
|
510
|
+
reason: "no_open_turn",
|
|
511
|
+
turn_id: state.current_turn_id,
|
|
512
|
+
status_box_present_strict: input.turn_ritual.status_box_present_strict,
|
|
513
|
+
});
|
|
514
|
+
}
|
|
515
|
+
if (!ritualFromResponseEvent ||
|
|
499
516
|
!state.current_turn_id ||
|
|
500
517
|
!state.current_turn_span ||
|
|
501
518
|
!input.turn_ritual) {
|
|
@@ -588,6 +605,7 @@ function processHookSignalLocked(control, input, sessionHash, path) {
|
|
|
588
605
|
};
|
|
589
606
|
state.spans.push(span);
|
|
590
607
|
}
|
|
608
|
+
span.line_changes = prepareToolLineChanges(input.payload, input.payload.cwd ?? input.coordRoot);
|
|
591
609
|
}
|
|
592
610
|
else if (input.signal === "post-tool-use" || input.signal === "post-tool-use-failure") {
|
|
593
611
|
span = sourceId
|
|
@@ -676,6 +694,22 @@ function processHookSignalLocked(control, input, sessionHash, path) {
|
|
|
676
694
|
if (!sourceId)
|
|
677
695
|
return { state: "ignored" };
|
|
678
696
|
delegation = state.delegations.find((candidate) => candidate.source_id === sourceId);
|
|
697
|
+
if (delegation?.open_event_id) {
|
|
698
|
+
// SendMessage to a running background agent re-fires SubagentStart.
|
|
699
|
+
// The delegation is already open; a second agent.started is noise.
|
|
700
|
+
writeProducerDiagnosticV3(input.coordRoot, "duplicate_subagent_start_suppressed", {
|
|
701
|
+
adapter: input.adapter,
|
|
702
|
+
signal: input.signal,
|
|
703
|
+
reason: "delegation_already_open",
|
|
704
|
+
instance_id: input.instance_id,
|
|
705
|
+
session_hash: sessionHash,
|
|
706
|
+
generation_id: state.generation_id,
|
|
707
|
+
delegation_id: delegation.delegation_id,
|
|
708
|
+
payload: input.payload,
|
|
709
|
+
});
|
|
710
|
+
publishProducerState(input.coordRoot, path, state);
|
|
711
|
+
return { state: "ignored" };
|
|
712
|
+
}
|
|
679
713
|
if (!delegation) {
|
|
680
714
|
const opened = openSpanStateV3({
|
|
681
715
|
span_id: spanIdV3(),
|
|
@@ -740,11 +774,11 @@ function processHookSignalLocked(control, input, sessionHash, path) {
|
|
|
740
774
|
const turnTelemetry = input.signal === "stop" || input.signal === "stop-failure"
|
|
741
775
|
? turnTelemetryForTerminal(input, state, eventClock.observed_at)
|
|
742
776
|
: undefined;
|
|
743
|
-
const cursorToolChannelSupport =
|
|
777
|
+
const cursorToolChannelSupport = behavior.tracksExecutionMode
|
|
744
778
|
? cursorToolChannelSupportV3(state.cursor_mode ?? "unknown")
|
|
745
779
|
: undefined;
|
|
746
780
|
const cursorToolChannelUnattested = (input.signal === "stop" || input.signal === "stop-failure") &&
|
|
747
|
-
|
|
781
|
+
behavior.tracksExecutionMode &&
|
|
748
782
|
cursorToolChannelSupport !== "unsupported" &&
|
|
749
783
|
state.tool_call_count === 0;
|
|
750
784
|
if (input.signal === "sub-agent-start" && delegation && !delegation.open_event_id) {
|
|
@@ -755,13 +789,14 @@ function processHookSignalLocked(control, input, sessionHash, path) {
|
|
|
755
789
|
// Before the signal's own event: the tool call or turn that carries the
|
|
756
790
|
// new effort already ran under it, so it must ride the new attestation.
|
|
757
791
|
maybeAttestTuningChange(input, state, path, rootId);
|
|
758
|
-
const
|
|
792
|
+
const ritualArrivesSeparately = behavior.completedResponseEvent !== undefined;
|
|
793
|
+
const cursorResponseRitual = ritualArrivesSeparately &&
|
|
759
794
|
(input.signal === "stop" || input.signal === "stop-failure") &&
|
|
760
795
|
state.current_turn_id &&
|
|
761
796
|
state.cursor_response_ritual?.turn_id === state.current_turn_id
|
|
762
797
|
? state.cursor_response_ritual
|
|
763
798
|
: undefined;
|
|
764
|
-
const terminalTurnRitual =
|
|
799
|
+
const terminalTurnRitual = ritualArrivesSeparately && (input.signal === "stop" || input.signal === "stop-failure")
|
|
765
800
|
? cursorResponseRitual
|
|
766
801
|
? {
|
|
767
802
|
status_box_present: cursorResponseRitual.status_box_present,
|
|
@@ -814,6 +849,7 @@ function processHookSignalLocked(control, input, sessionHash, path) {
|
|
|
814
849
|
span_id: openingSpan?.span_id ?? closingSpan?.span_id,
|
|
815
850
|
parent_span_id: openingSpan?.parent_span_id ?? closingSpan?.parent_span_id,
|
|
816
851
|
terminal_span: terminalSpan,
|
|
852
|
+
tool_line_changes: span?.line_changes,
|
|
817
853
|
harness_timing: state.turn_harness,
|
|
818
854
|
turn_telemetry: turnTelemetry,
|
|
819
855
|
caused_by: [
|
|
@@ -1232,8 +1268,8 @@ function commitRecoveredTurnCompleted(input, state, path, rootId, fingerprintCon
|
|
|
1232
1268
|
assertEventV3(event);
|
|
1233
1269
|
commitEventLocked(input, state, path, event);
|
|
1234
1270
|
}
|
|
1235
|
-
/** Open a derived turn for
|
|
1236
|
-
function commitRecoveredToolTurnStart(input, state, path, rootId, fingerprintContext) {
|
|
1271
|
+
/** Open a derived turn for signals that arrive after their native turn closed. */
|
|
1272
|
+
function commitRecoveredToolTurnStart(input, state, path, rootId, fingerprintContext, options) {
|
|
1237
1273
|
const clock = signalClock(input);
|
|
1238
1274
|
const span = openSpanStateV3({
|
|
1239
1275
|
span_id: spanIdV3(),
|
|
@@ -1268,6 +1304,7 @@ function commitRecoveredToolTurnStart(input, state, path, rootId, fingerprintCon
|
|
|
1268
1304
|
observed_at: clock.observed_at,
|
|
1269
1305
|
monotonic_ns: orderedEventMonotonic(state, input.monotonic_ns),
|
|
1270
1306
|
clock_id: state.clock_id,
|
|
1307
|
+
...(options?.stop_remediation ? { stop_remediation: true } : {}),
|
|
1271
1308
|
});
|
|
1272
1309
|
if (event?.event_type !== "turn.started") {
|
|
1273
1310
|
throw new Error("recovered tool turn start could not be normalized");
|
|
@@ -1478,7 +1515,8 @@ function maybeCommitActiveRuntimeContextObservation(input, state, path, rootId,
|
|
|
1478
1515
|
}
|
|
1479
1516
|
const nativeSessionId = input.payload.session_id ?? input.payload.conversation_id;
|
|
1480
1517
|
const nativeTurnId = input.payload.turn_id ?? state.current_native_turn_id;
|
|
1481
|
-
|
|
1518
|
+
const behavior = adapterBehavior(input.adapter);
|
|
1519
|
+
if (!nativeSessionId || (!nativeTurnId && !behavior.nativeTurnIdOptional))
|
|
1482
1520
|
return;
|
|
1483
1521
|
const now = Date.now();
|
|
1484
1522
|
const configuredInterval = input.runtimeTelemetryOptions?.activeContextProbeIntervalMs;
|
|
@@ -1504,21 +1542,20 @@ function maybeCommitActiveRuntimeContextObservation(input, state, path, rootId,
|
|
|
1504
1542
|
commitActiveContextObservation(input, state, path, rootId, fingerprintContext, sourceEvent, native, nativeContextProvenance(input, state, native));
|
|
1505
1543
|
return;
|
|
1506
1544
|
}
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
if (input.adapter === "openclaw") {
|
|
1545
|
+
// Runtime readers exist only for workflow adapters; an event-only adapter
|
|
1546
|
+
// has no transcript to read.
|
|
1547
|
+
const runtimeAdapter = normalizeAdapter(input.adapter);
|
|
1548
|
+
if (!runtimeAdapter || !behavior.runtimeContextAvailable(state.cursor_mode)) {
|
|
1512
1549
|
publishProducerState(input.coordRoot, path, state);
|
|
1513
1550
|
return;
|
|
1514
1551
|
}
|
|
1515
1552
|
const transcriptPath = runtimeTranscriptPath(input, state);
|
|
1516
|
-
if (!transcriptPath &&
|
|
1553
|
+
if (!transcriptPath && !behavior.runtimeContextTranscriptOptional) {
|
|
1517
1554
|
publishProducerState(input.coordRoot, path, state);
|
|
1518
1555
|
return;
|
|
1519
1556
|
}
|
|
1520
1557
|
const runtime = readRuntimeContextTelemetry({
|
|
1521
|
-
adapter:
|
|
1558
|
+
adapter: runtimeAdapter,
|
|
1522
1559
|
session_id: nativeSessionId,
|
|
1523
1560
|
...(nativeTurnId ? { turn_id: nativeTurnId } : {}),
|
|
1524
1561
|
...(state.current_turn_span?.opened_at
|
|
@@ -1629,7 +1666,7 @@ function turnContextTarget(turnTerminal) {
|
|
|
1629
1666
|
};
|
|
1630
1667
|
}
|
|
1631
1668
|
function queuePendingRuntimeContext(input, state, target, measurement, nativeTurnId) {
|
|
1632
|
-
if (input.adapter
|
|
1669
|
+
if (!adapterBehavior(input.adapter).runtimeContextRetry ||
|
|
1633
1670
|
!target ||
|
|
1634
1671
|
measurement.state !== "expected_but_missing" ||
|
|
1635
1672
|
!retryableRuntimeContextReason(measurement.reason)) {
|
|
@@ -1654,8 +1691,10 @@ function queuePendingRuntimeContext(input, state, target, measurement, nativeTur
|
|
|
1654
1691
|
].slice(-PENDING_RUNTIME_CONTEXT_CAP);
|
|
1655
1692
|
}
|
|
1656
1693
|
function reconcilePendingRuntimeContexts(input, state, path, rootId, fingerprintContext, options = {}) {
|
|
1657
|
-
if (state.adapter
|
|
1694
|
+
if (!adapterBehavior(state.adapter).runtimeContextRetry ||
|
|
1695
|
+
!state.pending_runtime_contexts?.length) {
|
|
1658
1696
|
return;
|
|
1697
|
+
}
|
|
1659
1698
|
for (const pending of [...state.pending_runtime_contexts]) {
|
|
1660
1699
|
const runtime = readRuntimeContextTelemetry({
|
|
1661
1700
|
adapter: "codex",
|
|
@@ -1703,8 +1742,18 @@ function reconcilePendingRuntimeContexts(input, state, path, rootId, fingerprint
|
|
|
1703
1742
|
publishProducerState(input.coordRoot, path, state);
|
|
1704
1743
|
}
|
|
1705
1744
|
function reconcilePendingRuntimeContextsBeforeApprovedEnd(input, state, path, rootId, fingerprintContext) {
|
|
1706
|
-
if (state.adapter
|
|
1745
|
+
if (!adapterBehavior(state.adapter).runtimeContextRetry ||
|
|
1746
|
+
!state.pending_runtime_contexts?.length) {
|
|
1707
1747
|
return;
|
|
1748
|
+
}
|
|
1749
|
+
// Context reconciliation continues the hook boot's sequence, even when the
|
|
1750
|
+
// finalizer drives it. Recover that producer identity from its validated
|
|
1751
|
+
// session start instead of attaching the sequence to the finalizer's name.
|
|
1752
|
+
const ledger = readLedgerV3(input.coordRoot, { authority: input.mode });
|
|
1753
|
+
const start = ledger.events.find(({ event }) => event.event_id === state.started_event_id)?.event;
|
|
1754
|
+
if (!ledger.complete || !start || start.producer.boot_id !== state.boot_id) {
|
|
1755
|
+
throw new Error("event_v3_finalizer_context_producer_unavailable");
|
|
1756
|
+
}
|
|
1708
1757
|
for (const [index, delayMs] of APPROVED_END_RUNTIME_CONTEXT_RETRY_DELAYS_MS.entries()) {
|
|
1709
1758
|
if (delayMs > 0)
|
|
1710
1759
|
sleepSync(delayMs);
|
|
@@ -1715,7 +1764,7 @@ function reconcilePendingRuntimeContextsBeforeApprovedEnd(input, state, path, ro
|
|
|
1715
1764
|
payload: { raw: {} },
|
|
1716
1765
|
adapter: state.adapter,
|
|
1717
1766
|
instance_id: state.instance_id,
|
|
1718
|
-
producer_id:
|
|
1767
|
+
producer_id: start.producer.producer_id,
|
|
1719
1768
|
build_id: input.build_id,
|
|
1720
1769
|
platform: input.platform,
|
|
1721
1770
|
observed_at: new Date().toISOString(),
|
|
@@ -1735,18 +1784,20 @@ function retryableRuntimeContextReason(reason) {
|
|
|
1735
1784
|
}
|
|
1736
1785
|
function turnTelemetryForTerminal(input, state, observedAt) {
|
|
1737
1786
|
const native = extractTurnTelemetryV3(input.adapter, input.payload.raw, observedAt);
|
|
1787
|
+
const behavior = adapterBehavior(input.adapter);
|
|
1738
1788
|
if (native.context.state === "observed")
|
|
1739
1789
|
return native;
|
|
1740
|
-
|
|
1790
|
+
const runtimeAdapter = normalizeAdapter(input.adapter);
|
|
1791
|
+
if (!runtimeAdapter || behavior.nativeTelemetryOnly)
|
|
1741
1792
|
return native;
|
|
1742
|
-
if (
|
|
1793
|
+
if (!behavior.runtimeContextAvailable(state.cursor_mode)) {
|
|
1743
1794
|
return {
|
|
1744
1795
|
...native,
|
|
1745
1796
|
context: { state: "unsupported", capability: "context_usage" },
|
|
1746
1797
|
};
|
|
1747
1798
|
}
|
|
1748
1799
|
const request = {
|
|
1749
|
-
adapter:
|
|
1800
|
+
adapter: runtimeAdapter,
|
|
1750
1801
|
session_id: input.payload.session_id ?? input.payload.conversation_id,
|
|
1751
1802
|
turn_id: input.payload.turn_id ?? state.current_native_turn_id,
|
|
1752
1803
|
transcript_path: runtimeTranscriptPath(input, state),
|
|
@@ -1756,7 +1807,7 @@ function turnTelemetryForTerminal(input, state, observedAt) {
|
|
|
1756
1807
|
let runtime = readRuntimeContextTelemetry(request, input.runtimeTelemetryOptions);
|
|
1757
1808
|
if (runtime.bytes_read > 0)
|
|
1758
1809
|
recordRuntimeTelemetryTiming(state, runtime.io_duration_ms);
|
|
1759
|
-
if (
|
|
1810
|
+
if (behavior.runtimeContextRetry &&
|
|
1760
1811
|
runtime.state === "partial" &&
|
|
1761
1812
|
retryableRuntimeContextReason(runtime.reason)) {
|
|
1762
1813
|
for (const delayMs of STOP_RUNTIME_CONTEXT_RETRY_DELAYS_MS) {
|
|
@@ -1788,26 +1839,27 @@ function turnTelemetryForTerminal(input, state, observedAt) {
|
|
|
1788
1839
|
* events receive only numeric telemetry and an opaque source witness.
|
|
1789
1840
|
*/
|
|
1790
1841
|
function runtimeTranscriptPath(input, state) {
|
|
1791
|
-
|
|
1842
|
+
const discover = adapterBehavior(input.adapter).discoverTranscript;
|
|
1843
|
+
if (!discover)
|
|
1792
1844
|
return input.payload.transcript_path;
|
|
1793
1845
|
const nativeSessionId = input.payload.session_id ?? input.payload.conversation_id;
|
|
1794
1846
|
if (!nativeSessionId)
|
|
1795
1847
|
return input.payload.transcript_path;
|
|
1796
1848
|
const supplied = input.payload.transcript_path;
|
|
1797
1849
|
if (supplied) {
|
|
1798
|
-
const verified =
|
|
1850
|
+
const verified = discover(nativeSessionId, supplied, input.runtimeTelemetryOptions);
|
|
1799
1851
|
if (verified)
|
|
1800
1852
|
state.runtime_transcript_path = verified;
|
|
1801
1853
|
// Preserve a supplied mismatch so the typed reader reports it honestly.
|
|
1802
1854
|
return verified ?? supplied;
|
|
1803
1855
|
}
|
|
1804
1856
|
if (state.runtime_transcript_path) {
|
|
1805
|
-
const verified =
|
|
1857
|
+
const verified = discover(nativeSessionId, state.runtime_transcript_path, input.runtimeTelemetryOptions);
|
|
1806
1858
|
if (verified)
|
|
1807
1859
|
return verified;
|
|
1808
1860
|
state.runtime_transcript_path = undefined;
|
|
1809
1861
|
}
|
|
1810
|
-
const discovered =
|
|
1862
|
+
const discovered = discover(nativeSessionId, undefined, input.runtimeTelemetryOptions);
|
|
1811
1863
|
if (discovered)
|
|
1812
1864
|
state.runtime_transcript_path = discovered;
|
|
1813
1865
|
return discovered;
|
|
@@ -1889,12 +1941,13 @@ function maybeAttestTuningChange(input, state, path, rootId) {
|
|
|
1889
1941
|
let candidate;
|
|
1890
1942
|
let attestationSource = "native";
|
|
1891
1943
|
let sourceEvent = `${input.adapter}.effort-payload`;
|
|
1892
|
-
|
|
1944
|
+
const behavior = adapterBehavior(input.adapter);
|
|
1945
|
+
if (behavior.effortAttestation === "payload") {
|
|
1893
1946
|
if (!input.payload.effort)
|
|
1894
1947
|
return;
|
|
1895
1948
|
candidate = { effort: input.payload.effort };
|
|
1896
1949
|
}
|
|
1897
|
-
else if (
|
|
1950
|
+
else if (behavior.effortAttestation === "rollout-probe" &&
|
|
1898
1951
|
(input.signal === "stop" ||
|
|
1899
1952
|
// Early probe: without it, a Codex card shows no effort until the first
|
|
1900
1953
|
// turn terminal. One rollout read per turn while effort is unknown.
|
|
@@ -1936,9 +1989,9 @@ function maybeAttestTuningChange(input, state, path, rootId) {
|
|
|
1936
1989
|
if (baseline.effort === next.effort && (candidate.speed ?? baseline.speed) === baseline.speed) {
|
|
1937
1990
|
return;
|
|
1938
1991
|
}
|
|
1939
|
-
//
|
|
1940
|
-
// carries speed and the (possibly swapped) model, so refresh from it.
|
|
1941
|
-
if (
|
|
1992
|
+
// Payload change detection rides the payload; the paired transcript row
|
|
1993
|
+
// also carries speed and the (possibly swapped) model, so refresh from it.
|
|
1994
|
+
if (behavior.transcriptTuningRefresh) {
|
|
1942
1995
|
const runtime = readRuntimeTuning({
|
|
1943
1996
|
adapter: "claude-code",
|
|
1944
1997
|
transcript_path: input.payload.transcript_path,
|
|
@@ -2074,11 +2127,7 @@ function commitRuntimeAttestationChange(input, state, path, rootId, change) {
|
|
|
2074
2127
|
commitEventLocked(input, state, path, event);
|
|
2075
2128
|
}
|
|
2076
2129
|
function modelProviderFor(adapter) {
|
|
2077
|
-
|
|
2078
|
-
return "anthropic";
|
|
2079
|
-
if (adapter === "codex")
|
|
2080
|
-
return "openai";
|
|
2081
|
-
return adapter;
|
|
2130
|
+
return adapterBehavior(adapter).modelProvider;
|
|
2082
2131
|
}
|
|
2083
2132
|
function recordRuntimeTelemetryTiming(state, durationMs) {
|
|
2084
2133
|
const duration = Math.max(0, Math.ceil(durationMs));
|
|
@@ -2277,39 +2326,11 @@ function buildMidFlightSessionStart(input, state, rootId, cursorPromptBootstrap
|
|
|
2277
2326
|
* so it is a high-confidence session boundary rather than degraded recovery.
|
|
2278
2327
|
*/
|
|
2279
2328
|
function isCursorPromptBootstrap(input) {
|
|
2280
|
-
return (input.adapter
|
|
2329
|
+
return (adapterBehavior(input.adapter).promptMayPrecedeSessionStart &&
|
|
2281
2330
|
input.signal === "user-prompt-submit" &&
|
|
2282
2331
|
(input.payload.conversation_id !== undefined || input.payload.session_id !== undefined) &&
|
|
2283
2332
|
input.payload.turn_id !== undefined);
|
|
2284
2333
|
}
|
|
2285
|
-
/** Privacy-safe environment and recovery provenance for Codex mid-flight
|
|
2286
|
-
* onboarding. WSLENV values are never recorded, only normalized variable
|
|
2287
|
-
* names, and the native session identifier itself remains fingerprinted. */
|
|
2288
|
-
export function codexMidFlightDiagnosticContext(payload, env = process.env) {
|
|
2289
|
-
const wslenv = env.WSLENV?.trim() ?? "";
|
|
2290
|
-
const wslenvNames = [
|
|
2291
|
-
...new Set(wslenv
|
|
2292
|
-
.split(":")
|
|
2293
|
-
.map((entry) => entry.split("/", 1)[0]?.trim() ?? "")
|
|
2294
|
-
.filter((name) => /^[A-Za-z_][A-Za-z0-9_]*$/.test(name))),
|
|
2295
|
-
]
|
|
2296
|
-
.sort()
|
|
2297
|
-
.join(":")
|
|
2298
|
-
.slice(0, 512);
|
|
2299
|
-
const identityRecoverySource = payload.session_id
|
|
2300
|
-
? "native_session_id"
|
|
2301
|
-
: payload.conversation_id
|
|
2302
|
-
? "native_conversation_id"
|
|
2303
|
-
: payload.agent_id
|
|
2304
|
-
? "native_agent_id"
|
|
2305
|
-
: "unavailable";
|
|
2306
|
-
return {
|
|
2307
|
-
thread_id_present: Boolean(env.CODEX_THREAD_ID?.trim()),
|
|
2308
|
-
wslenv_present: wslenv.length > 0,
|
|
2309
|
-
wslenv_names: wslenvNames,
|
|
2310
|
-
identity_recovery_source: identityRecoverySource,
|
|
2311
|
-
};
|
|
2312
|
-
}
|
|
2313
2334
|
function suppressClosedSpanSignal(input, sessionHash, category) {
|
|
2314
2335
|
writeProducerDiagnosticV3(input.coordRoot, category, {
|
|
2315
2336
|
adapter: input.adapter,
|
|
@@ -2616,7 +2637,7 @@ export function reanchorArchivedHookProducersV3(input) {
|
|
|
2616
2637
|
payload: {
|
|
2617
2638
|
raw: {},
|
|
2618
2639
|
...(previous.current_native_turn_id ? { turn_id: previous.current_native_turn_id } : {}),
|
|
2619
|
-
...(previous.adapter
|
|
2640
|
+
...(adapterBehavior(previous.adapter).tracksExecutionMode && previous.cursor_mode
|
|
2620
2641
|
? { cursor_mode: previous.cursor_mode }
|
|
2621
2642
|
: {}),
|
|
2622
2643
|
},
|
|
@@ -2761,7 +2782,8 @@ export function reconcilePendingRuntimeContextV3(input) {
|
|
|
2761
2782
|
// holds everything this producer durably recorded.
|
|
2762
2783
|
return { state: "missing" };
|
|
2763
2784
|
}
|
|
2764
|
-
if (state.adapter
|
|
2785
|
+
if (!adapterBehavior(state.adapter).runtimeContextRetry ||
|
|
2786
|
+
!state.pending_runtime_contexts?.length) {
|
|
2765
2787
|
return { state: "not_pending" };
|
|
2766
2788
|
}
|
|
2767
2789
|
const context = fingerprintContextV3(input.coordRoot, rootId, state.generation_id, state.privacy_epoch_id);
|
|
@@ -2845,7 +2867,9 @@ function newProducerState(input, sessionId, epochId, boundaryEventId, genesisId)
|
|
|
2845
2867
|
generation_id: input.delegated_child?.generation_id ?? generationIdV3(),
|
|
2846
2868
|
attestation_id: attestationIdV3(),
|
|
2847
2869
|
capability_profile: adapterCapabilityProfileDigestV3(input.adapter),
|
|
2848
|
-
cursor_mode: input.adapter
|
|
2870
|
+
cursor_mode: adapterBehavior(input.adapter).tracksExecutionMode
|
|
2871
|
+
? (input.payload.cursor_mode ?? "unknown")
|
|
2872
|
+
: undefined,
|
|
2849
2873
|
privacy_epoch_id: epochId,
|
|
2850
2874
|
epoch_genesis_id: genesisId,
|
|
2851
2875
|
boot_id: bootId,
|
|
@@ -3006,7 +3030,7 @@ function sourceIdForSignal(input, context) {
|
|
|
3006
3030
|
: undefined;
|
|
3007
3031
|
}
|
|
3008
3032
|
function cursorShellSemanticKey(input, context) {
|
|
3009
|
-
if (input.adapter
|
|
3033
|
+
if (!adapterBehavior(input.adapter).shellOperationDedup)
|
|
3010
3034
|
return undefined;
|
|
3011
3035
|
const command = extractBashCommand(input.payload.tool_name, input.payload.tool_input);
|
|
3012
3036
|
return command
|
|
@@ -3134,9 +3158,9 @@ function producerStatePath(coordRoot, adapter, sessionHash) {
|
|
|
3134
3158
|
function acquireStateLease(coordRoot, statePath) {
|
|
3135
3159
|
const directory = join(statePath, "..");
|
|
3136
3160
|
const producerRoot = join(resolve(coordRoot), EVENT_V3_LEDGER_RELATIVE_ROOT, "private-producers");
|
|
3137
|
-
mkdirSync(directory, { recursive: true, mode:
|
|
3138
|
-
chmodSync(producerRoot,
|
|
3139
|
-
chmodSync(directory,
|
|
3161
|
+
mkdirSync(directory, { recursive: true, mode: stateDirMode() });
|
|
3162
|
+
chmodSync(producerRoot, stateDirMode());
|
|
3163
|
+
chmodSync(directory, stateDirMode());
|
|
3140
3164
|
const acquiredControl = readEventV3ControlState(coordRoot);
|
|
3141
3165
|
const acquiredGenesis = acquiredControl.state === "candidate" || acquiredControl.state === "active"
|
|
3142
3166
|
? acquiredControl.genesis.event.payload.genesis_id
|
|
@@ -3179,13 +3203,13 @@ function publishProducerState(coordRoot, path, state) {
|
|
|
3179
3203
|
const temporary = `${path}.tmp-${process.pid}-${randomUUID()}`;
|
|
3180
3204
|
let fd;
|
|
3181
3205
|
try {
|
|
3182
|
-
fd = openSync(temporary, "wx",
|
|
3206
|
+
fd = openSync(temporary, "wx", stateFileMode());
|
|
3183
3207
|
writeFileSync(fd, `${JSON.stringify(state)}\n`, "utf8");
|
|
3184
3208
|
fsyncSync(fd);
|
|
3185
3209
|
closeSync(fd);
|
|
3186
3210
|
fd = undefined;
|
|
3187
3211
|
renameSync(temporary, path);
|
|
3188
|
-
chmodSync(path,
|
|
3212
|
+
chmodSync(path, stateFileMode());
|
|
3189
3213
|
fsyncParentDirectory(path);
|
|
3190
3214
|
}
|
|
3191
3215
|
finally {
|
|
@@ -3200,8 +3224,8 @@ function readProducerState(path) {
|
|
|
3200
3224
|
if (!metadata.isFile() || metadata.isSymbolicLink()) {
|
|
3201
3225
|
throw new Error("V3 producer state path is unsafe");
|
|
3202
3226
|
}
|
|
3203
|
-
if ((metadata.mode
|
|
3204
|
-
throw new Error("V3 producer state is
|
|
3227
|
+
if (stateModeTooOpen(metadata.mode))
|
|
3228
|
+
throw new Error("V3 producer state is open to other users");
|
|
3205
3229
|
let parsed;
|
|
3206
3230
|
try {
|
|
3207
3231
|
parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
@@ -3230,7 +3254,7 @@ function readProducerState(path) {
|
|
|
3230
3254
|
state.pending_runtime_contexts.length === 0) {
|
|
3231
3255
|
state.pending_runtime_contexts = undefined;
|
|
3232
3256
|
}
|
|
3233
|
-
if (state.adapter
|
|
3257
|
+
if (adapterBehavior(state.adapter).tracksExecutionMode)
|
|
3234
3258
|
state.cursor_mode ??= "unknown";
|
|
3235
3259
|
const allowedKeys = new Set([
|
|
3236
3260
|
"active_runtime_context_probe",
|
|
@@ -391,7 +391,15 @@ function applySweepObservation(projection, event) {
|
|
|
391
391
|
};
|
|
392
392
|
}
|
|
393
393
|
function applyAgentStarted(projection, event) {
|
|
394
|
-
|
|
394
|
+
const existing = projection.delegations[event.payload.delegation_id];
|
|
395
|
+
if (existing) {
|
|
396
|
+
// Claude Code re-fires SubagentStart when SendMessage resumes a background
|
|
397
|
+
// agent. A restart naming the same parent and child is that resume, not a
|
|
398
|
+
// conflicting delegation, and must not strip the parent's authority.
|
|
399
|
+
if (existing.parent_generation_id === generationIdOf(event) &&
|
|
400
|
+
existing.child_generation_id === event.payload.child_generation_id) {
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
395
403
|
addDiagnostic(projection, {
|
|
396
404
|
code: "delegation_duplicate_start",
|
|
397
405
|
event_id: event.event_id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../../../src/core/events/v3/recovery.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../../../src/core/events/v3/recovery.ts"],"names":[],"mappings":"AAuBA,OAAO,EAGL,KAAK,sBAAsB,EAO5B,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,gCAAgC;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,UAAU,MAAM,EAAE,CAAC;IACjC,gBAAgB,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,iCAAiC;IAChD,KAAK,EAAE,WAAW,GAAG,mBAAmB,CAAC;IACzC,OAAO,EAAE,sBAAsB,CAAC;CACjC;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,gCAAgC,GACtC,iCAAiC,CAoEnC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { chmodSync, closeSync, existsSync, fsyncSync, linkSync, mkdirSync, openSync, readdirSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
2
2
|
import { basename, join, resolve } from "node:path";
|
|
3
|
+
import { stateDirMode, stateFileMode } from "../../storage/modes.js";
|
|
3
4
|
import { fsyncParentDirectory } from "../../workflow/durable-record.js";
|
|
4
5
|
import { initializeEventLedgerV3 } from "./bootstrap.js";
|
|
5
6
|
import { canonicalJsonV3, sha256V3 } from "./canonical.js";
|
|
@@ -90,8 +91,8 @@ function recoveryIdFor(failure) {
|
|
|
90
91
|
function publishRecoveryIntent(root, value) {
|
|
91
92
|
const intent = validateEventV3RecoveryIntent(value);
|
|
92
93
|
const records = eventV3RecoveryRecordsRoot(root);
|
|
93
|
-
mkdirSync(records, { recursive: true, mode:
|
|
94
|
-
chmodSync(records,
|
|
94
|
+
mkdirSync(records, { recursive: true, mode: stateDirMode() });
|
|
95
|
+
chmodSync(records, stateDirMode());
|
|
95
96
|
const path = recoveryIntentPath(records, intent.recovery_id);
|
|
96
97
|
const serialized = `${canonicalJsonV3(intent)}\n`;
|
|
97
98
|
if (existsSync(path)) {
|
|
@@ -209,7 +210,7 @@ function publishExclusive(path, serialized) {
|
|
|
209
210
|
const temporary = `${path}.tmp.${process.pid}`;
|
|
210
211
|
let fd;
|
|
211
212
|
try {
|
|
212
|
-
fd = openSync(temporary, "wx",
|
|
213
|
+
fd = openSync(temporary, "wx", stateFileMode());
|
|
213
214
|
writeFileSync(fd, serialized, "utf8");
|
|
214
215
|
fsyncSync(fd);
|
|
215
216
|
closeSync(fd);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inventory.d.ts","sourceRoot":"","sources":["../../../../../src/core/events/v3/support-storage/inventory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"inventory.d.ts","sourceRoot":"","sources":["../../../../../src/core/events/v3/support-storage/inventory.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,KAAK,oCAAoC,EACzC,KAAK,yBAAyB,EAC/B,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE/D,MAAM,WAAW,+BAA+B;IAC9C,KAAK,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,4BAA4B;IAC3C,SAAS,EAAE,+BAA+B,CAAC;IAC3C,MAAM,EAAE,oBAAoB,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,MAAM,EAAE,CAAC;IAC3B,WAAW,EAAE,yBAAyB,CAAC;IACvC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE;QACR,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,4BAA4B;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,+BAA+B,CAAC;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CACf,MAAM,EACN,IAAI,CAAC,oCAAoC,EAAE,QAAQ,GAAG,iBAAiB,GAAG,KAAK,CAAC,CACjF,CAAC;CACH;AAQD,0FAA0F;AAC1F,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,4BAA4B,GAClC,OAAO,CAAC,4BAA4B,EAAE,CAAC,CAqEzC"}
|
|
@@ -2,6 +2,7 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
import { createReadStream } from "node:fs";
|
|
3
3
|
import { lstat, readdir, realpath } from "node:fs/promises";
|
|
4
4
|
import { basename, join, relative, resolve } from "node:path";
|
|
5
|
+
import { stateModeTooOpen } from "../../../storage/modes.js";
|
|
5
6
|
import { classifyEventV3Support, } from "./classify.js";
|
|
6
7
|
const SUPPORT_ROOTS = [
|
|
7
8
|
{ prefix: "diagnostics", family: "diagnostic" },
|
|
@@ -58,7 +59,7 @@ export async function inventoryEventV3Support(input) {
|
|
|
58
59
|
authority_state: input.authority.state,
|
|
59
60
|
now: input.now,
|
|
60
61
|
file_regular: true,
|
|
61
|
-
file_owner_only: (fileStat.mode
|
|
62
|
+
file_owner_only: !stateModeTooOpen(fileStat.mode),
|
|
62
63
|
});
|
|
63
64
|
results.push({
|
|
64
65
|
authority: input.authority,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"maintenance.d.ts","sourceRoot":"","sources":["../../../../../src/core/events/v3/support-storage/maintenance.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"maintenance.d.ts","sourceRoot":"","sources":["../../../../../src/core/events/v3/support-storage/maintenance.ts"],"names":[],"mappings":"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"}
|