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
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { buildClaudeInvocation, claudeCodeSpawner, normalizeClaudeResult, } from "../workflow/spawn-claude.js";
|
|
2
2
|
import { buildCodexInvocation, codexSpawner, normalizeCodexResult, } from "../workflow/spawn-codex.js";
|
|
3
3
|
import { buildCursorInvocation, cursorSpawner, normalizeCursorResult, } from "../workflow/spawn-cursor.js";
|
|
4
|
+
import { buildOpenCodeInvocation, normalizeOpenCodeResult, openCodeSpawner, } from "../workflow/spawn-opencode.js";
|
|
4
5
|
import { BUILTIN_ADAPTER_IDS, BUILTIN_ADAPTER_PROFILES, } from "./profiles.js";
|
|
5
6
|
const BUILTIN_ADAPTERS = {
|
|
6
7
|
"claude-code": {
|
|
@@ -67,6 +68,38 @@ const BUILTIN_ADAPTERS = {
|
|
|
67
68
|
},
|
|
68
69
|
},
|
|
69
70
|
},
|
|
71
|
+
opencode: {
|
|
72
|
+
profile: BUILTIN_ADAPTER_PROFILES.opencode,
|
|
73
|
+
spawn: openCodeSpawner,
|
|
74
|
+
buildInvocation: buildOpenCodeInvocation,
|
|
75
|
+
normalizeResult: normalizeOpenCodeResult,
|
|
76
|
+
fixture: {
|
|
77
|
+
// `opencode run --format json` streams NDJSON: a step-start line then one
|
|
78
|
+
// or more text parts, each carrying the same sessionID.
|
|
79
|
+
raw: {
|
|
80
|
+
stdout: [
|
|
81
|
+
JSON.stringify({
|
|
82
|
+
type: "step_start",
|
|
83
|
+
sessionID: "opencode-bench-session",
|
|
84
|
+
part: { type: "step-start" },
|
|
85
|
+
}),
|
|
86
|
+
JSON.stringify({
|
|
87
|
+
type: "text",
|
|
88
|
+
sessionID: "opencode-bench-session",
|
|
89
|
+
part: { type: "text", text: "HARNERY_BENCH_OK" },
|
|
90
|
+
}),
|
|
91
|
+
].join("\n"),
|
|
92
|
+
stderr: "",
|
|
93
|
+
exitCode: 0,
|
|
94
|
+
durationMs: 11,
|
|
95
|
+
},
|
|
96
|
+
expected: {
|
|
97
|
+
ok: true,
|
|
98
|
+
text: "HARNERY_BENCH_OK",
|
|
99
|
+
sessionId: "opencode-bench-session",
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
},
|
|
70
103
|
};
|
|
71
104
|
/** Mutable registry for embedders, initialized empty unless adapters are
|
|
72
105
|
* provided. Duplicate ids fail loud instead of silently replacing behavior. */
|
|
@@ -42,6 +42,15 @@ export interface AdapterProfile {
|
|
|
42
42
|
/** How this adapter projects host filesystem policy into the vendor's own
|
|
43
43
|
* sandbox (ADR 0039). Absent means it cannot project any of it. */
|
|
44
44
|
sandboxProjection?: AdapterSandboxProjection;
|
|
45
|
+
/** Vendor-native arguments that launch a worker with no vendor sandbox
|
|
46
|
+
* (ADR 0192). Absent means the adapter has no distinguishable full-access
|
|
47
|
+
* mode, so a worker on it never qualifies for one. */
|
|
48
|
+
fullAccess?: AdapterFullAccessRendering;
|
|
49
|
+
}
|
|
50
|
+
/** How an adapter renders an unsandboxed launch (ADR 0192). The spawner emits
|
|
51
|
+
* exactly these arguments, so the declaration and the argv cannot drift. */
|
|
52
|
+
export interface AdapterFullAccessRendering {
|
|
53
|
+
argv: readonly string[];
|
|
45
54
|
}
|
|
46
55
|
/** Fully planned child invocation. `resultFile` is used by adapters such as
|
|
47
56
|
* Codex that deliver the authoritative final answer out-of-band. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/adapters/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAE/E;uDACuD;AACvD,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAE/B,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,CAAC;AAEpF,eAAO,MAAM,6BAA6B,2TAoBhC,CAAC;AAEX,MAAM,MAAM,0BAA0B,GAAG,CAAC,OAAO,6BAA6B,CAAC,CAAC,MAAM,CAAC,CAAC;AAExF,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,iBAAiB,CAAC;IAC3B;iFAC6E;IAC7E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,0BAA0B,EAAE,eAAe,CAAC,CAAC;AAEtF;;;0DAG0D;AAC1D,MAAM,WAAW,wBAAwB;IACvC,8EAA8E;IAC9E,KAAK,EAAE,MAAM,CAAC,WAAW,GAAG,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IAC9D,iEAAiE;IACjE,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,SAAS,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,gBAAgB,CAAC;IAClC,SAAS,EAAE,UAAU,CAAC;IACtB,WAAW,EAAE,QAAQ,GAAG,KAAK,GAAG,OAAO,CAAC;IACxC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,YAAY,EAAE,mBAAmB,CAAC;IAClC,2EAA2E;IAC3E,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C;uEACmE;IACnE,iBAAiB,CAAC,EAAE,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/adapters/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAE/E;uDACuD;AACvD,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAE/B,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,CAAC;AAEpF,eAAO,MAAM,6BAA6B,2TAoBhC,CAAC;AAEX,MAAM,MAAM,0BAA0B,GAAG,CAAC,OAAO,6BAA6B,CAAC,CAAC,MAAM,CAAC,CAAC;AAExF,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,iBAAiB,CAAC;IAC3B;iFAC6E;IAC7E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,0BAA0B,EAAE,eAAe,CAAC,CAAC;AAEtF;;;0DAG0D;AAC1D,MAAM,WAAW,wBAAwB;IACvC,8EAA8E;IAC9E,KAAK,EAAE,MAAM,CAAC,WAAW,GAAG,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IAC9D,iEAAiE;IACjE,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,SAAS,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,gBAAgB,CAAC;IAClC,SAAS,EAAE,UAAU,CAAC;IACtB,WAAW,EAAE,QAAQ,GAAG,KAAK,GAAG,OAAO,CAAC;IACxC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,YAAY,EAAE,mBAAmB,CAAC;IAClC,2EAA2E;IAC3E,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C;uEACmE;IACnE,iBAAiB,CAAC,EAAE,wBAAwB,CAAC;IAC7C;;0DAEsD;IACtD,UAAU,CAAC,EAAE,0BAA0B,CAAC;CACzC;AAED;4EAC4E;AAC5E,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CACzB;AAED;oEACoE;AACpE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,yEAAyE;AACzE,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;0BAGsB;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;kFAG8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,gBAAgB,CAAC;IACtB,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,MAAM,CAAC,GAAG;QAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED;;wDAEwD;AACxD,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,cAAc,CAAC;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,eAAe,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,iBAAiB,CAAC;IACnF,eAAe,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,WAAW,CAAC;IACxD,OAAO,EAAE,mBAAmB,CAAC;CAC9B"}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* a 15-second safety budget; loaded-host checks normally finish in a few
|
|
10
10
|
* seconds and record the observation before the parent command exits.
|
|
11
11
|
*/
|
|
12
|
-
import type
|
|
12
|
+
import { type EventAdapterIdV3 } from "../events/v3/adapter-id.js";
|
|
13
13
|
import type { LiveCoordinationObservationV3 } from "../events/v3/live-observation.js";
|
|
14
14
|
import type { Heartbeat } from "./state/heartbeat-reader.js";
|
|
15
15
|
export type EventV3EmitObservation = LiveCoordinationObservationV3 | {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonical-emit.d.ts","sourceRoot":"","sources":["../../../src/core/agents/canonical-emit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"canonical-emit.d.ts","sourceRoot":"","sources":["../../../src/core/agents/canonical-emit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,KAAK,gBAAgB,EAAgC,MAAM,4BAA4B,CAAC;AACjG,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,kCAAkC,CAAC;AAGtF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAE7D,MAAM,MAAM,sBAAsB,GAC9B,6BAA6B,GAC7B;IACE,UAAU,EAAE,yBAAyB,CAAC;IACtC,SAAS,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AAEN,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,WAAW,EAAE,sBAAsB,CAAC;CACrC;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAE5E;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CA4C5D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,gBAAgB,CAE/E;AAED,kFAAkF;AAClF,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,mBAAmB,GAAG,YAAY,CAAC,GAAG,IAAI,GAAG,SAAS,EAC3E,QAAQ,EAAE,MAAM,GACf,MAAM,CAQR"}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* seconds and record the observation before the parent command exits.
|
|
11
11
|
*/
|
|
12
12
|
import { spawnSync } from "node:child_process";
|
|
13
|
+
import { eventAdapterIdV3FromPlatform } from "../events/v3/adapter-id.js";
|
|
13
14
|
import { coordBinPath } from "./coord-bin.js";
|
|
14
15
|
import { resolveCoordRoot } from "./coord-client.js";
|
|
15
16
|
/**
|
|
@@ -74,13 +75,7 @@ export function emitEventV3(input) {
|
|
|
74
75
|
* Normalize the heartbeat's `platform` field to the canonical Adapter type.
|
|
75
76
|
*/
|
|
76
77
|
export function normalizeAdapter(platform) {
|
|
77
|
-
|
|
78
|
-
return "cursor";
|
|
79
|
-
if (platform === "codex")
|
|
80
|
-
return "codex";
|
|
81
|
-
if (platform === "openclaw")
|
|
82
|
-
return "openclaw";
|
|
83
|
-
return "claude-code";
|
|
78
|
+
return eventAdapterIdV3FromPlatform(platform, { context: "canonical-emit" });
|
|
84
79
|
}
|
|
85
80
|
/** Producer joins use the private native session ID, never its V3 fingerprint. */
|
|
86
81
|
export function nativeSessionIdentity(row, fallback) {
|
package/dist/core/agents/cli.js
CHANGED
|
@@ -12,6 +12,8 @@ import { appendFile, mkdir } from "node:fs/promises";
|
|
|
12
12
|
import { hostname } from "node:os";
|
|
13
13
|
import { dirname, join, resolve } from "node:path";
|
|
14
14
|
import { coordEnv } from "../../lib/env.js";
|
|
15
|
+
import { normalizeAdapter, adapterFromPlatform as sharedAdapterFromPlatform } from "../adapter.js";
|
|
16
|
+
import { resolveBinName } from "../config.js";
|
|
15
17
|
import { closeProcessLoggers, legacyLogFields, processLogger } from "../storage/logger.js";
|
|
16
18
|
import { acquireNoClobberLease } from "../workflow/workspaces/leases.js";
|
|
17
19
|
function sharedDiagnostic(root, event, fields, error) {
|
|
@@ -152,13 +154,6 @@ async function handleProject(root, rest) {
|
|
|
152
154
|
process.stdout.write(`${JSON.stringify(report, null, rest.includes("--json") ? 2 : 0)}\n`);
|
|
153
155
|
return view.authority_safe ? 0 : 1;
|
|
154
156
|
}
|
|
155
|
-
function adapterFromPlatform(platform) {
|
|
156
|
-
if (platform === "cursor")
|
|
157
|
-
return "cursor";
|
|
158
|
-
if (platform === "codex")
|
|
159
|
-
return "codex";
|
|
160
|
-
return "claude-code";
|
|
161
|
-
}
|
|
162
157
|
const coordinationRetryCell = new Int32Array(new SharedArrayBuffer(4));
|
|
163
158
|
const COORDINATION_RETRY_ATTEMPTS = 240;
|
|
164
159
|
const COORDINATION_RETRY_DELAY_MS = 25;
|
|
@@ -256,7 +251,7 @@ async function handleStateAction(root, action, rest) {
|
|
|
256
251
|
coordRoot: root,
|
|
257
252
|
owner,
|
|
258
253
|
nativeSessionId: before?.session_id ?? owner,
|
|
259
|
-
adapter:
|
|
254
|
+
adapter: sharedAdapterFromPlatform(before?.platform, { context: "agent-coord" }),
|
|
260
255
|
task,
|
|
261
256
|
});
|
|
262
257
|
break;
|
|
@@ -283,7 +278,21 @@ async function handleStateAction(root, action, rest) {
|
|
|
283
278
|
}
|
|
284
279
|
}
|
|
285
280
|
catch (error) {
|
|
286
|
-
|
|
281
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
282
|
+
// A missing heartbeat usually means the session's generation ended
|
|
283
|
+
// while its process lived on, so name the reopen command (ADR 0088).
|
|
284
|
+
// A still-live generation whose authority the ledger withholds looks
|
|
285
|
+
// the same here; name its diagnostics instead, since reopen cannot apply.
|
|
286
|
+
const { describeLiveAuthorityBlockV3, liveAuthorityBlockHintV3, liveAuthorityBlockV3 } = await import("./state/live-coordination-view.js");
|
|
287
|
+
const block = detail.includes("heartbeat_missing:")
|
|
288
|
+
? liveAuthorityBlockV3(root, owner)
|
|
289
|
+
: null;
|
|
290
|
+
const hint = block
|
|
291
|
+
? `; ${describeLiveAuthorityBlockV3(block)}; ${liveAuthorityBlockHintV3(resolveBinName(root))}`
|
|
292
|
+
: detail.includes("heartbeat_missing:")
|
|
293
|
+
? `; run \`${resolveBinName(root)} agents lifecycle active\` to open a fresh generation for this continuing session`
|
|
294
|
+
: "";
|
|
295
|
+
process.stderr.write(`agent-coord set-task: V3 authority refused (${detail})${hint}\n`);
|
|
287
296
|
return 1;
|
|
288
297
|
}
|
|
289
298
|
if (!hb) {
|
|
@@ -313,7 +322,7 @@ async function handleStateAction(root, action, rest) {
|
|
|
313
322
|
coordRoot: root,
|
|
314
323
|
owner,
|
|
315
324
|
nativeSessionId: before?.session_id ?? owner,
|
|
316
|
-
adapter:
|
|
325
|
+
adapter: sharedAdapterFromPlatform(before?.platform, { context: "agent-coord" }),
|
|
317
326
|
operation: "released",
|
|
318
327
|
path,
|
|
319
328
|
access: "write",
|
|
@@ -371,11 +380,11 @@ async function handleStateAction(root, action, rest) {
|
|
|
371
380
|
coordRoot: root,
|
|
372
381
|
owner,
|
|
373
382
|
nativeSessionId: sessionId ?? owner,
|
|
374
|
-
adapter:
|
|
383
|
+
adapter: sharedAdapterFromPlatform(adapter, { context: "agent-coord" }),
|
|
375
384
|
});
|
|
376
385
|
}
|
|
377
386
|
const { repairLiveCoordinationHeartbeat } = await import("./state/live-coordination-writer.js");
|
|
378
|
-
hb = repairLiveCoordinationHeartbeat(root, owner, sessionId ?? owner,
|
|
387
|
+
hb = repairLiveCoordinationHeartbeat(root, owner, sessionId ?? owner, sharedAdapterFromPlatform(adapter, { context: "agent-coord" }), model);
|
|
379
388
|
}
|
|
380
389
|
catch (error) {
|
|
381
390
|
process.stderr.write(`agent-coord repair-coordination-cache: V3 route refused (${error instanceof Error ? error.message : String(error)})\n`);
|
|
@@ -397,7 +406,7 @@ async function handleStateAction(root, action, rest) {
|
|
|
397
406
|
liveCoordinationWriteModeV3(root);
|
|
398
407
|
const { liveInstanceIdV3 } = await import("../events/v3/live-routing.js");
|
|
399
408
|
const { repairLiveCoordinationHeartbeat } = await import("./state/live-coordination-writer.js");
|
|
400
|
-
const heartbeat = repairLiveCoordinationHeartbeat(root, owner, sessionId ?? owner,
|
|
409
|
+
const heartbeat = repairLiveCoordinationHeartbeat(root, owner, sessionId ?? owner, sharedAdapterFromPlatform(adapter, { context: "agent-coord" }));
|
|
401
410
|
if (!heartbeat) {
|
|
402
411
|
throw new Error("authoritative coordination cache could not be materialized");
|
|
403
412
|
}
|
|
@@ -408,7 +417,7 @@ async function handleStateAction(root, action, rest) {
|
|
|
408
417
|
observed_current_state_digest: coordinationAuthorityStateDigestV3(heartbeat),
|
|
409
418
|
approval_record_id: approvalRecordId,
|
|
410
419
|
});
|
|
411
|
-
const repaired = repairLiveCoordinationHeartbeat(root, owner, sessionId ?? owner,
|
|
420
|
+
const repaired = repairLiveCoordinationHeartbeat(root, owner, sessionId ?? owner, sharedAdapterFromPlatform(adapter, { context: "agent-coord" }));
|
|
412
421
|
process.stdout.write(`${JSON.stringify({
|
|
413
422
|
instance_id: owner,
|
|
414
423
|
receipt,
|
|
@@ -777,7 +786,7 @@ async function handleEmitEvent(root, rest) {
|
|
|
777
786
|
const eventType = args.type;
|
|
778
787
|
const instanceId = args.owner;
|
|
779
788
|
const sessionId = args.session;
|
|
780
|
-
const adapter = args.adapter;
|
|
789
|
+
const adapter = normalizeAdapter(args.adapter) ?? undefined;
|
|
781
790
|
const dataJson = args["data-stdin"] === "true" ? await readStdin() : "";
|
|
782
791
|
if (!eventType || !instanceId || !sessionId || !adapter || !dataJson) {
|
|
783
792
|
process.stderr.write("agent-coord emit-event --type <V3_TYPE> --owner <id> --session <id> --adapter <h> --data-stdin\n");
|
|
@@ -945,7 +954,7 @@ async function handleGitHook(fallbackRoot, rest) {
|
|
|
945
954
|
owner,
|
|
946
955
|
subject: hit.instance_id,
|
|
947
956
|
nativeSessionId: hit.session_id ?? owner,
|
|
948
|
-
adapter:
|
|
957
|
+
adapter: sharedAdapterFromPlatform(hit.platform, { context: "agent-coord" }),
|
|
949
958
|
operation: "released",
|
|
950
959
|
path,
|
|
951
960
|
access: "write",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coord-client.d.ts","sourceRoot":"","sources":["../../../src/core/agents/coord-client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAeH;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAWhE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAI5E;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOhF;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAE5C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CA+B7E;AAED,iEAAiE;AACjE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE7D;AAeD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGtD;AAiED,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIvD;AAED,+EAA+E;AAC/E,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,mFAAmF;AACnF,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAExE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA2CxD;AAgCD;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAE5C;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,IAAI;IACxC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,iBAAiB,GAAG,aAAa,GAAG,kBAAkB,GAAG,MAAM,CAAC;CAC5F,CAsEA;AAED;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,GACX;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAsB5C;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG;IAClD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,QAAQ,GAAG,iBAAiB,GAAG,MAAM,CAAC;CAC/C,CAyBA;
|
|
1
|
+
{"version":3,"file":"coord-client.d.ts","sourceRoot":"","sources":["../../../src/core/agents/coord-client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAeH;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAWhE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,MAAM,CAI5E;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOhF;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAE5C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CA+B7E;AAED,iEAAiE;AACjE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE7D;AAeD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGtD;AAiED,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIvD;AAED,+EAA+E;AAC/E,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,mFAAmF;AACnF,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAExE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA2CxD;AAgCD;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAE5C;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,IAAI;IACxC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,iBAAiB,GAAG,aAAa,GAAG,kBAAkB,GAAG,MAAM,CAAC;CAC5F,CAsEA;AAED;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,GACX;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAsB5C;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG;IAClD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,QAAQ,GAAG,iBAAiB,GAAG,MAAM,CAAC;CAC/C,CAyBA;AAyBD,sFAAsF;AACtF;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,IAAI,CAEtD;AAuCD;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEpE;AAED;;;;;;GAMG;AACH,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,MAAM,GACX;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAmB9C;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOpE"}
|
|
@@ -506,6 +506,10 @@ const SESSION_ID_ENV_VARS = [
|
|
|
506
506
|
"CURSOR_CONVERSATION_ID",
|
|
507
507
|
"CODEX_SESSION_ID",
|
|
508
508
|
"CODEX_THREAD_ID",
|
|
509
|
+
// OpenCode exports no session id into the tool shell; the Harnery OpenCode
|
|
510
|
+
// plugin stamps this via shell.hook("create.before") so a coord CLI run as a
|
|
511
|
+
// Bash tool recovers its identity.
|
|
512
|
+
"OPENCODE_SESSION_ID",
|
|
509
513
|
];
|
|
510
514
|
/** Read normalized candidates from the first non-empty adapter session-id env var. */
|
|
511
515
|
/**
|
|
@@ -607,9 +611,10 @@ export function resolveSingleActiveOwner(root) {
|
|
|
607
611
|
}
|
|
608
612
|
function adapterCandidatesFromEnv() {
|
|
609
613
|
const value = process.env.HARNERY_AGENT_COORD_PLATFORM?.trim();
|
|
610
|
-
if (value === "claude-code" || value === "codex" || value === "cursor")
|
|
614
|
+
if (value === "claude-code" || value === "codex" || value === "cursor" || value === "opencode") {
|
|
611
615
|
return [value];
|
|
612
|
-
|
|
616
|
+
}
|
|
617
|
+
return ["claude-code", "codex", "cursor", "opencode"];
|
|
613
618
|
}
|
|
614
619
|
function nativeOwnerForV3Instance(root, instanceId) {
|
|
615
620
|
const activeDir = resolve(root, ".harnery", "active");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-context.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/render/session-context.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAyC,QAAQ,EAAE,MAAM,SAAS,CAAC;AAM1E,OAAO,EAAuC,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAoB3F,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;+BAC2B;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"session-context.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/render/session-context.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAyC,QAAQ,EAAE,MAAM,SAAS,CAAC;AAM1E,OAAO,EAAuC,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAoB3F,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;+BAC2B;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAyF7D;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,SAAS,gBAAgB,EAAE,GACpC,IAAI,CAUN;AAkID;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAwBvD;AA0DD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAiDlF;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB,iBAAW,CAAC"}
|
|
@@ -93,6 +93,8 @@ export function renderSessionContext(opts) {
|
|
|
93
93
|
bits.push(`missing: ${d.missing.map((m) => m.subcommand).join(", ")}`);
|
|
94
94
|
if (d.orphans.length > 0)
|
|
95
95
|
bits.push(`orphaned: ${d.orphans.join(", ")}`);
|
|
96
|
+
if (d.stale.length > 0)
|
|
97
|
+
bits.push(`outdated: ${d.stale.map((m) => m.subcommand).join(", ")}`);
|
|
96
98
|
return ` - ${d.settingsFile} — ${bits.join("; ")}`;
|
|
97
99
|
});
|
|
98
100
|
messages.push(`Harnery hook wiring is out of date${verPart}: an upgrade changed the hook set but the adapter ` +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claim-conflict.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/rules/claim-conflict.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"claim-conflict.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/rules/claim-conflict.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAWH,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAgBlD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,aAAa,CA4GjF"}
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
import { spawnSync } from "node:child_process";
|
|
17
17
|
import { existsSync } from "node:fs";
|
|
18
18
|
import { join } from "node:path";
|
|
19
|
+
import { adapterFromPlatform as sharedAdapterFromPlatform } from "../../adapter.js";
|
|
19
20
|
import { recordLiveClaimChangeV3 } from "../live-authority-v3.js";
|
|
20
21
|
import { readLiveCoordinationRows } from "../state/live-coordination-view.js";
|
|
21
22
|
const FRESHNESS_SECS = 600;
|
|
@@ -211,7 +212,7 @@ function acquireClaimThroughLedger(coordRoot, req) {
|
|
|
211
212
|
coordRoot,
|
|
212
213
|
owner: req.instance_id,
|
|
213
214
|
nativeSessionId: req.session_id ?? owner?.session_id ?? req.instance_id,
|
|
214
|
-
adapter:
|
|
215
|
+
adapter: sharedAdapterFromPlatform(owner?.platform, { context: "claim-conflict" }),
|
|
215
216
|
operation: "acquired",
|
|
216
217
|
path: req.path,
|
|
217
218
|
access: "write",
|
|
@@ -230,7 +231,7 @@ function releaseClaimThroughLedger(coordRoot, subjectInstanceId, relPath, actor)
|
|
|
230
231
|
owner: actor.instance_id,
|
|
231
232
|
subject: subjectInstanceId,
|
|
232
233
|
nativeSessionId: actor.session_id ?? owner?.session_id ?? actor.instance_id,
|
|
233
|
-
adapter:
|
|
234
|
+
adapter: sharedAdapterFromPlatform(owner?.platform, { context: "claim-conflict" }),
|
|
234
235
|
operation: "released",
|
|
235
236
|
path: relPath,
|
|
236
237
|
access: "write",
|
|
@@ -241,13 +242,6 @@ function releaseClaimThroughLedger(coordRoot, subjectInstanceId, relPath, actor)
|
|
|
241
242
|
return false;
|
|
242
243
|
}
|
|
243
244
|
}
|
|
244
|
-
function adapterFromPlatform(platform) {
|
|
245
|
-
if (platform === "cursor")
|
|
246
|
-
return "cursor";
|
|
247
|
-
if (platform === "codex")
|
|
248
|
-
return "codex";
|
|
249
|
-
return "claude-code";
|
|
250
|
-
}
|
|
251
245
|
function authorityUnavailable(path, operation) {
|
|
252
246
|
return {
|
|
253
247
|
allow: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commit-conflict.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/rules/commit-conflict.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;
|
|
1
|
+
{"version":3,"file":"commit-conflict.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/rules/commit-conflict.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAqBH,UAAU,QAAQ;IAChB,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,YAAY,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB;wEACoE;IACpE,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,qFAAqF;IACrF,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,8DAA8D;IAC9D,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,oBAAoB,GAAG,mBAAmB,CAgIhG"}
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
import { spawnSync } from "node:child_process";
|
|
23
23
|
import { appendFileSync, existsSync } from "node:fs";
|
|
24
24
|
import { basename, dirname, join } from "node:path";
|
|
25
|
+
import { adapterFromPlatform as sharedAdapterFromPlatform } from "../../adapter.js";
|
|
25
26
|
import { coordFreshnessSeconds } from "../../config.js";
|
|
26
27
|
import { resolveOwner } from "../../hooks/resolve/owner.js";
|
|
27
28
|
import { recordLiveClaimChangeV3 } from "../live-authority-v3.js";
|
|
@@ -153,7 +154,7 @@ function retainBlockedStagedPaths(coordRoot, instanceId, sessionId, stagedPaths,
|
|
|
153
154
|
coordRoot,
|
|
154
155
|
owner: instanceId,
|
|
155
156
|
nativeSessionId: self.session_id ?? sessionId,
|
|
156
|
-
adapter:
|
|
157
|
+
adapter: sharedAdapterFromPlatform(self.platform, { context: "commit-conflict" }),
|
|
157
158
|
operation: "acquired",
|
|
158
159
|
path,
|
|
159
160
|
access: "write",
|
|
@@ -165,13 +166,6 @@ function retainBlockedStagedPaths(coordRoot, instanceId, sessionId, stagedPaths,
|
|
|
165
166
|
}
|
|
166
167
|
}
|
|
167
168
|
}
|
|
168
|
-
function adapterFromPlatform(platform) {
|
|
169
|
-
if (platform === "cursor")
|
|
170
|
-
return "cursor";
|
|
171
|
-
if (platform === "codex")
|
|
172
|
-
return "codex";
|
|
173
|
-
return "claude-code";
|
|
174
|
-
}
|
|
175
169
|
function findOverlap(staged, files, coordRoot, stagedIsGitlink) {
|
|
176
170
|
for (const claimed of files) {
|
|
177
171
|
if (claimed === staged)
|
|
@@ -22,6 +22,8 @@ export interface StopHookRequest {
|
|
|
22
22
|
};
|
|
23
23
|
stop_hook_active?: boolean;
|
|
24
24
|
status_box_present_strict?: boolean;
|
|
25
|
+
/** Current observation overrides an older failed terminal during remediation. */
|
|
26
|
+
session_name_observation_unavailable?: boolean;
|
|
25
27
|
bypass?: boolean;
|
|
26
28
|
workflow_child?: boolean;
|
|
27
29
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stop-hook.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/rules/stop-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAM3D,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,eAAO,MAAM,uBAAuB,8BAA8B,CAAC;AAInE,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,aAAa,CA6BvF;AAED,oFAAoF;AACpF,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,SAAS,OAAO,EAAE,GACzB,aAAa,CAiIf"}
|
|
1
|
+
{"version":3,"file":"stop-hook.d.ts","sourceRoot":"","sources":["../../../../src/core/agents/rules/stop-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAM3D,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,WAAW,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,iFAAiF;IACjF,oCAAoC,CAAC,EAAE,OAAO,CAAC;IAC/C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,eAAO,MAAM,uBAAuB,8BAA8B,CAAC;AAInE,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,GAAG,aAAa,CA6BvF;AAED,oFAAoF;AACpF,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,SAAS,OAAO,EAAE,GACzB,aAAa,CAiIf"}
|
|
@@ -123,7 +123,7 @@ export function evaluateStopHookV3Events(coordRoot, req, events) {
|
|
|
123
123
|
pending.push(rule33Block(coordRoot, req.session_id));
|
|
124
124
|
// Claude Code can prove session-name presentation from assistant-only text.
|
|
125
125
|
// Cursor cannot expose that text and Codex returned observe-only above.
|
|
126
|
-
if (req.adapter !== "cursor") {
|
|
126
|
+
if (req.adapter !== "cursor" && !req.session_name_observation_unavailable) {
|
|
127
127
|
const naming = turnTerminals
|
|
128
128
|
.map((event) => observedNaming(event.payload.ritual?.session_name))
|
|
129
129
|
.filter((value) => value !== undefined);
|
|
@@ -21,9 +21,13 @@ export declare function newCmdId(): string;
|
|
|
21
21
|
* Path: `.harnery/.last-intent.<instance_id>` next to the agent's heartbeat.
|
|
22
22
|
*/
|
|
23
23
|
export declare function readLastIntent(instanceId?: string): string | null;
|
|
24
|
+
/** Count the non-empty lines in one output chunk; a single event may carry many. */
|
|
25
|
+
export declare function countOutputLines(text: string): number;
|
|
24
26
|
/**
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
+
* Start/completion use the durable V3 recorder. Output only updates bounded
|
|
28
|
+
* per-stream counters and hashes; summaries flush before completion or at
|
|
29
|
+
* process exit. A forced kill can lose unflushed summaries (ADR 0188).
|
|
30
|
+
* Best-effort: telemetry never throws into the caller.
|
|
27
31
|
*/
|
|
28
32
|
export declare function writeSessionEvent(type: SessionEventType, fields?: Record<string, unknown>): void;
|
|
29
33
|
/** Trim long values to keep individual events small. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-events.d.ts","sourceRoot":"","sources":["../../../src/core/agents/session-events.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAkBH,mDAAmD;AACnD,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,GAAG,yBAAyB,GAAG,mBAAmB,CAAC;AAEnG;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAG7C;AAED,6EAA6E;AAC7E,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiBjE;
|
|
1
|
+
{"version":3,"file":"session-events.d.ts","sourceRoot":"","sources":["../../../src/core/agents/session-events.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAkBH,mDAAmD;AACnD,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,GAAG,yBAAyB,GAAG,mBAAmB,CAAC;AAEnG;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAG7C;AAED,6EAA6E;AAC7E,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiBjE;AA4GD,oFAAoF;AACpF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKrD;AAgED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,gBAAgB,EACtB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACnC,IAAI,CAkDN;AAED,wDAAwD;AACxD,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,SAAO,GAAG,MAAM,CAGxD"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* `writeSessionEvent` records command spans in the canonical V3 ledger.
|
|
5
5
|
*/
|
|
6
|
-
import { randomBytes } from "node:crypto";
|
|
6
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
7
7
|
import { existsSync, readFileSync } from "node:fs";
|
|
8
8
|
import { resolve } from "node:path";
|
|
9
9
|
// Kept dependency-light: vendored verbatim into a downstream consumer, so no coordEnv import.
|
|
@@ -55,19 +55,30 @@ export function readLastIntent(instanceId) {
|
|
|
55
55
|
return null;
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
|
-
const
|
|
58
|
+
const pendingCommands = new Map();
|
|
59
|
+
let exitFlushInstalled = false;
|
|
60
|
+
function commandKey(fields) {
|
|
61
|
+
return typeof fields.instance_id === "string" && typeof fields.cmd_id === "string"
|
|
62
|
+
? JSON.stringify([fields.instance_id, fields.cmd_id])
|
|
63
|
+
: undefined;
|
|
64
|
+
}
|
|
65
|
+
function flushCommandOutput(command) {
|
|
66
|
+
for (const summary of command.streams.values()) {
|
|
67
|
+
recordCommandObservation("command.output_observed", command.fields, command.coordRoot, summary);
|
|
68
|
+
}
|
|
69
|
+
command.streams.clear();
|
|
70
|
+
}
|
|
59
71
|
/** Emit a command/narration event to the canonical stream. Swallows every
|
|
60
72
|
* error and skips when identity can't be resolved: telemetry must never break
|
|
61
73
|
* or slow down a command. */
|
|
62
|
-
function recordCommandObservation(type, fields) {
|
|
74
|
+
function recordCommandObservation(type, fields, coordRoot, summary) {
|
|
63
75
|
const instanceId = typeof fields.instance_id === "string" ? fields.instance_id : undefined;
|
|
64
76
|
if (!instanceId)
|
|
65
|
-
return;
|
|
77
|
+
return false;
|
|
66
78
|
try {
|
|
67
|
-
const coordRoot = coordinationRootPath();
|
|
68
79
|
const route = resolveLiveEventLedgerRouteV3(coordRoot);
|
|
69
80
|
if (route.state === "blocked")
|
|
70
|
-
return;
|
|
81
|
+
return false;
|
|
71
82
|
const liveInstanceId = liveInstanceIdV3(instanceId);
|
|
72
83
|
const hook = readHookProducerStateByInstanceV3(coordRoot, liveInstanceId);
|
|
73
84
|
if (!hook) {
|
|
@@ -76,11 +87,11 @@ function recordCommandObservation(type, fields) {
|
|
|
76
87
|
instance_id: instanceId,
|
|
77
88
|
reason: "hook_generation_not_found",
|
|
78
89
|
});
|
|
79
|
-
return;
|
|
90
|
+
return false;
|
|
80
91
|
}
|
|
81
|
-
const command = commandSignalAndObservation(type, fields);
|
|
92
|
+
const command = commandSignalAndObservation(type, fields, summary);
|
|
82
93
|
if (!command)
|
|
83
|
-
return;
|
|
94
|
+
return false;
|
|
84
95
|
const result = recordCommandSignalV3({
|
|
85
96
|
coordRoot,
|
|
86
97
|
mode: route.mode,
|
|
@@ -98,7 +109,7 @@ function recordCommandObservation(type, fields) {
|
|
|
98
109
|
const expectedLifecycleReopenGap = result.reason === "turn_not_started" &&
|
|
99
110
|
hook.session_start_derivation === "approved_lifecycle_reopen";
|
|
100
111
|
if (expectedLifecycleReopenGap)
|
|
101
|
-
return;
|
|
112
|
+
return false;
|
|
102
113
|
writeProducerDiagnosticV3(coordRoot, "command_emit_unjoinable", {
|
|
103
114
|
type,
|
|
104
115
|
instance_id: instanceId,
|
|
@@ -114,11 +125,11 @@ function recordCommandObservation(type, fields) {
|
|
|
114
125
|
result_state: result.state,
|
|
115
126
|
});
|
|
116
127
|
}
|
|
128
|
+
return result.state === "recorded" || result.state === "already_recorded";
|
|
117
129
|
}
|
|
118
130
|
catch (error) {
|
|
119
131
|
// Telemetry must never break the command, but the loss is preserved.
|
|
120
132
|
try {
|
|
121
|
-
const coordRoot = coordinationRootPath();
|
|
122
133
|
writeProducerDiagnosticV3(coordRoot, "command_emit_failed", {
|
|
123
134
|
type,
|
|
124
135
|
instance_id: instanceId,
|
|
@@ -128,14 +139,24 @@ function recordCommandObservation(type, fields) {
|
|
|
128
139
|
catch {
|
|
129
140
|
/* diagnostics are best-effort */
|
|
130
141
|
}
|
|
142
|
+
return false;
|
|
131
143
|
}
|
|
132
144
|
}
|
|
133
|
-
|
|
145
|
+
/** Count the non-empty lines in one output chunk; a single event may carry many. */
|
|
146
|
+
export function countOutputLines(text) {
|
|
147
|
+
if (!text)
|
|
148
|
+
return 0;
|
|
149
|
+
let count = 0;
|
|
150
|
+
for (const line of text.split("\n"))
|
|
151
|
+
if (line.length > 0)
|
|
152
|
+
count += 1;
|
|
153
|
+
return count;
|
|
154
|
+
}
|
|
155
|
+
function commandSignalAndObservation(type, fields, summary) {
|
|
134
156
|
const commandId = typeof fields.cmd_id === "string" ? fields.cmd_id : undefined;
|
|
135
157
|
if (!commandId)
|
|
136
158
|
return undefined;
|
|
137
159
|
if (type === "command.started") {
|
|
138
|
-
outputSequence.set(commandId, 0);
|
|
139
160
|
const command = typeof fields.cmd === "string" ? fields.cmd : "";
|
|
140
161
|
const executable = command.trim().split(/\s+/, 1)[0] || "unknown";
|
|
141
162
|
return {
|
|
@@ -154,23 +175,26 @@ function commandSignalAndObservation(type, fields) {
|
|
|
154
175
|
};
|
|
155
176
|
}
|
|
156
177
|
if (type === "command.output_observed") {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
const line = typeof fields.line === "string" ? fields.line : "";
|
|
160
|
-
const stream = fields.stream === "stdout" || fields.stream === "stderr" ? fields.stream : "combined";
|
|
178
|
+
if (!summary)
|
|
179
|
+
return undefined;
|
|
161
180
|
return {
|
|
162
181
|
signal: "command.output_observed",
|
|
163
182
|
observation: {
|
|
164
183
|
native_command_id: commandId,
|
|
165
|
-
native_observation_id: `${commandId}:output:${
|
|
166
|
-
stream,
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
184
|
+
native_observation_id: `${commandId}:output-summary:${summary.stream}`,
|
|
185
|
+
stream: summary.stream,
|
|
186
|
+
// The normalizer HMACs this bounded descriptor with the generation key.
|
|
187
|
+
// Neither raw output nor its unkeyed digest is written to the ledger.
|
|
188
|
+
output: {
|
|
189
|
+
format: "harnery-output-chunks-v1",
|
|
190
|
+
chunks: summary.chunks,
|
|
191
|
+
sha256: summary.hash.digest("hex"),
|
|
192
|
+
},
|
|
193
|
+
output_bytes: summary.bytes,
|
|
194
|
+
output_lines: summary.lines,
|
|
170
195
|
},
|
|
171
196
|
};
|
|
172
197
|
}
|
|
173
|
-
outputSequence.delete(commandId);
|
|
174
198
|
const exitCode = typeof fields.exit === "number" && Number.isSafeInteger(fields.exit) ? fields.exit : undefined;
|
|
175
199
|
return {
|
|
176
200
|
signal: "command.completed",
|
|
@@ -186,11 +210,66 @@ function commandSignalAndObservation(type, fields) {
|
|
|
186
210
|
};
|
|
187
211
|
}
|
|
188
212
|
/**
|
|
189
|
-
*
|
|
190
|
-
*
|
|
213
|
+
* Start/completion use the durable V3 recorder. Output only updates bounded
|
|
214
|
+
* per-stream counters and hashes; summaries flush before completion or at
|
|
215
|
+
* process exit. A forced kill can lose unflushed summaries (ADR 0188).
|
|
216
|
+
* Best-effort: telemetry never throws into the caller.
|
|
191
217
|
*/
|
|
192
218
|
export function writeSessionEvent(type, fields = {}) {
|
|
193
|
-
|
|
219
|
+
try {
|
|
220
|
+
const key = commandKey(fields);
|
|
221
|
+
if (!key)
|
|
222
|
+
return;
|
|
223
|
+
if (type === "command.output_observed") {
|
|
224
|
+
const command = pendingCommands.get(key);
|
|
225
|
+
if (!command)
|
|
226
|
+
return;
|
|
227
|
+
const stream = fields.stream === "stdout" || fields.stream === "stderr" ? fields.stream : "combined";
|
|
228
|
+
let summary = command.streams.get(stream);
|
|
229
|
+
if (!summary) {
|
|
230
|
+
summary = { stream, bytes: 0, lines: 0, chunks: 0, hash: createHash("sha256") };
|
|
231
|
+
command.streams.set(stream, summary);
|
|
232
|
+
}
|
|
233
|
+
const line = typeof fields.line === "string" ? fields.line : "";
|
|
234
|
+
const normalized = line.normalize("NFC");
|
|
235
|
+
// Length framing preserves chunk boundaries, including empty chunks.
|
|
236
|
+
summary.hash.update(`${Buffer.byteLength(normalized, "utf8")}:`).update(normalized);
|
|
237
|
+
summary.bytes += Buffer.byteLength(line, "utf8");
|
|
238
|
+
summary.lines += countOutputLines(line);
|
|
239
|
+
summary.chunks += 1;
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
const command = pendingCommands.get(key);
|
|
243
|
+
const coordRoot = command?.coordRoot ?? coordinationRootPath();
|
|
244
|
+
if (type === "command.completed") {
|
|
245
|
+
pendingCommands.delete(key);
|
|
246
|
+
if (command)
|
|
247
|
+
flushCommandOutput(command);
|
|
248
|
+
recordCommandObservation(type, fields, coordRoot);
|
|
249
|
+
}
|
|
250
|
+
else if (recordCommandObservation(type, fields, coordRoot) && !command) {
|
|
251
|
+
pendingCommands.set(key, {
|
|
252
|
+
coordRoot,
|
|
253
|
+
fields: {
|
|
254
|
+
instance_id: fields.instance_id,
|
|
255
|
+
cmd_id: fields.cmd_id,
|
|
256
|
+
bridge: fields.bridge,
|
|
257
|
+
},
|
|
258
|
+
streams: new Map(),
|
|
259
|
+
});
|
|
260
|
+
if (!exitFlushInstalled) {
|
|
261
|
+
exitFlushInstalled = true;
|
|
262
|
+
process.once("exit", () => {
|
|
263
|
+
for (const pending of pendingCommands.values())
|
|
264
|
+
flushCommandOutput(pending);
|
|
265
|
+
pendingCommands.clear();
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
catch {
|
|
271
|
+
// Root resolution and in-memory bookkeeping must not break the command.
|
|
272
|
+
}
|
|
194
273
|
}
|
|
195
274
|
/** Trim long values to keep individual events small. */
|
|
196
275
|
export function clampField(v, max = 1024) {
|