harnery 0.39.0 → 0.41.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 +1 -0
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +25 -19
- package/dist/commands/browse-ai.d.ts.map +1 -1
- package/dist/commands/browse-ai.js +4 -0
- package/dist/commands/browse.d.ts.map +1 -1
- package/dist/commands/browse.js +141 -10
- package/dist/commands/checkpoint.js +8 -12
- 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/docs.d.ts.map +1 -1
- package/dist/commands/docs.js +2 -0
- package/dist/commands/doctor.js +10 -2
- package/dist/commands/fetch.d.ts.map +1 -1
- package/dist/commands/fetch.js +10 -0
- package/dist/commands/init.d.ts +19 -3
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +232 -104
- 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/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 +20 -3
- package/dist/core/adapters/profiles.d.ts.map +1 -1
- package/dist/core/adapters/profiles.js +32 -1
- package/dist/core/adapters/registry.d.ts.map +1 -1
- package/dist/core/adapters/registry.js +33 -0
- 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 +30 -19
- package/dist/core/agents/coord-client.d.ts.map +1 -1
- package/dist/core/agents/coord-client.js +7 -2
- 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.map +1 -1
- package/dist/core/agents/state/live-coordination-view.js +1 -0
- package/dist/core/agents/state/live-coordination-writer.js +3 -0
- package/dist/core/agents/state/names.d.ts +4 -4
- package/dist/core/agents/state/names.d.ts.map +1 -1
- package/dist/core/agents/state/names.js +5 -7
- 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 +2 -1
- package/dist/core/artifacts/index.d.ts.map +1 -1
- package/dist/core/artifacts/index.js +4 -3
- package/dist/core/config.d.ts +5 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +14 -0
- 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 +3 -2
- 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 +109 -101
- 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 +29 -1
- package/dist/core/hooks/adapter/events.d.ts.map +1 -1
- package/dist/core/hooks/adapter/events.js +31 -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/wiring.d.ts +15 -1
- package/dist/core/hooks/adapter/wiring.d.ts.map +1 -1
- package/dist/core/hooks/adapter/wiring.js +74 -11
- package/dist/core/hooks/cli.js +640 -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/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/storage/atomic-json.d.ts.map +1 -1
- package/dist/core/storage/atomic-json.js +7 -3
- 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/live-session-v3.d.ts.map +1 -1
- package/dist/core/workflow/live-session-v3.js +6 -4
- package/dist/core/workflow/run-state.d.ts.map +1 -1
- package/dist/core/workflow/run-state.js +3 -2
- 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 +132 -0
- package/dist/core/workflow/transcript.d.ts.map +1 -1
- package/dist/core/workflow/transcript.js +3 -2
- 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/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/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 +2 -1
- 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/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/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/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/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/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 +15 -10
- 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 +11 -4
- package/schemas/config.schema.json +13 -0
- package/schemas/event-v3.schema.json +164 -0
- package/src/commander.ts +7 -0
- package/src/commands/agents.ts +33 -18
- package/src/commands/browse-ai.ts +8 -0
- package/src/commands/browse.ts +189 -10
- package/src/commands/checkpoint.ts +7 -9
- package/src/commands/deinit.ts +9 -4
- package/src/commands/docs.ts +2 -0
- package/src/commands/doctor.ts +11 -2
- package/src/commands/fetch.ts +14 -0
- package/src/commands/init.ts +281 -119
- package/src/commands/instructions.ts +8 -4
- package/src/commands/ledger-v3.ts +2 -1
- 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 +42 -1
- package/src/core/adapters/registry.ts +37 -0
- package/src/core/agents/canonical-emit.ts +2 -5
- package/src/core/agents/cli.ts +31 -20
- package/src/core/agents/coord-client.ts +9 -3
- 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 +1 -0
- package/src/core/agents/state/live-coordination-writer.ts +3 -0
- package/src/core/agents/state/names.ts +7 -9
- 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 +2 -1
- package/src/core/artifacts/index.ts +4 -3
- package/src/core/config.ts +23 -0
- package/src/core/context/index.ts +2 -1
- package/src/core/conversations/archive.ts +4 -3
- package/src/core/diagnostics/bundle.ts +3 -2
- 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 +123 -114
- 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 +53 -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/wiring.ts +85 -11
- package/src/core/hooks/cli.ts +738 -538
- 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/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/storage/atomic-json.ts +7 -3
- 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/live-session-v3.ts +6 -4
- package/src/core/workflow/run-state.ts +3 -2
- package/src/core/workflow/spawn-opencode.ts +150 -0
- package/src/core/workflow/transcript.ts +3 -2
- 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/client.ts +147 -9
- package/src/lib/browser/identity.ts +64 -0
- package/src/lib/browser/index.ts +15 -1
- package/src/lib/browser/launch-args.ts +53 -1
- package/src/lib/browser/user-agent.ts +130 -0
- package/src/lib/docs-metadata-managed.ts +21 -0
- package/src/lib/identities/assume.ts +7 -7
- package/src/lib/instructions/apply.ts +2 -0
- package/src/lib/pace/index.ts +14 -0
- package/src/lib/pace/pace.ts +370 -0
- package/src/lib/tunnel/forward-headers.ts +16 -0
- package/src/lib/tunnel/gate.ts +18 -10
- package/src/lib/webview/index.ts +13 -0
- package/src/lib/webview/webview.ts +457 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { commandPaceGate } from "../lib/pace/index.js";
|
|
3
|
+
import { parseWebViewTypeStep, parseWebViewViewport, runWebView, WebViewUnavailableError, } from "../lib/webview/index.js";
|
|
4
|
+
export function registerWebviewCommand(program, emit, binName) {
|
|
5
|
+
program
|
|
6
|
+
.command("webview <url>")
|
|
7
|
+
.description("Lightweight headless page probe through Bun.WebView (experimental, Bun 1.4+). " +
|
|
8
|
+
`Fresh ephemeral browser per call; use ${binName} browse for login, cookies, HAR, and QA.`)
|
|
9
|
+
.option("--backend <engine>", "Browser engine: auto | chrome | webkit", "auto")
|
|
10
|
+
.option("--user-agent <ua>", "Chrome user agent: shared store by default; auto refreshes, native disables")
|
|
11
|
+
.option("--viewport <WxH>", "Viewport in CSS pixels", "1280x800")
|
|
12
|
+
.option("--profile <dir>", "Persist cookies and local storage in this directory (default is ephemeral)")
|
|
13
|
+
.option("--chrome-path <path>", "Chrome-family executable; implies the Chrome backend")
|
|
14
|
+
.option("--browser-arg <flag>", "Extra Chrome launch flag (repeatable)", collect, [])
|
|
15
|
+
.option("--timeout <ms>", "Navigation and selector timeout in milliseconds", "30000")
|
|
16
|
+
.option("--wait-for <css>", "Wait for a CSS selector after navigation")
|
|
17
|
+
.option("--type <css=>text>", "Focus a selector and insert text (repeatable; runs before clicks)", collect, [])
|
|
18
|
+
.option("--click <css>", "Scroll to and click a CSS selector (repeatable)", collect, [])
|
|
19
|
+
.option("--press <key>", "Press a key in the currently focused element (repeatable)", collect, [])
|
|
20
|
+
.option("--evaluate <expression>", "Evaluate a JavaScript expression after actions")
|
|
21
|
+
.option("--settle <ms>", "Extra delay after actions before capture", "0")
|
|
22
|
+
.option("--screenshot <path>", "Save a viewport PNG (Bun.WebView does not provide full-page capture)")
|
|
23
|
+
.option("--html", "Print the final document HTML instead of body text")
|
|
24
|
+
.option("--json", "Print the full result envelope")
|
|
25
|
+
.option("--no-pace", "Skip the human-pace gap (3 to 9 s) between page loads of the same site for this run. " +
|
|
26
|
+
"HARNERY_PACE=off disables it machine-wide; local and private hosts never wait.")
|
|
27
|
+
.action(async (url, opts) => {
|
|
28
|
+
try {
|
|
29
|
+
await runWebview(url, opts, emit);
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
33
|
+
emit.error({
|
|
34
|
+
code: err instanceof WebViewUnavailableError ? err.code : "webview_error",
|
|
35
|
+
message,
|
|
36
|
+
});
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
async function runWebview(url, opts, emit) {
|
|
42
|
+
if (!isBackend(opts.backend)) {
|
|
43
|
+
throw new Error(`Invalid backend "${opts.backend}". Expected auto, chrome, or webkit.`);
|
|
44
|
+
}
|
|
45
|
+
const backend = opts.backend === "auto" && opts.chromePath ? "chrome" : opts.backend;
|
|
46
|
+
const result = await runWebView(url, {
|
|
47
|
+
backend,
|
|
48
|
+
viewport: parseWebViewViewport(opts.viewport),
|
|
49
|
+
profileDir: opts.profile ? resolve(opts.profile) : undefined,
|
|
50
|
+
chromePath: opts.chromePath ? resolve(opts.chromePath) : undefined,
|
|
51
|
+
browserArgs: opts.browserArg,
|
|
52
|
+
timeoutMs: parseNonNegativeInteger(opts.timeout, "--timeout", false),
|
|
53
|
+
waitFor: opts.waitFor,
|
|
54
|
+
typeSteps: opts.type.map(parseWebViewTypeStep),
|
|
55
|
+
clicks: opts.click,
|
|
56
|
+
presses: opts.press,
|
|
57
|
+
evaluate: opts.evaluate,
|
|
58
|
+
settleMs: parseNonNegativeInteger(opts.settle, "--settle", true),
|
|
59
|
+
screenshotPath: opts.screenshot ? resolve(opts.screenshot) : undefined,
|
|
60
|
+
captureHtml: opts.html === true,
|
|
61
|
+
pace: commandPaceGate(opts.pace !== false, (message) => emit.log(message, "info")),
|
|
62
|
+
userAgent: opts.userAgent,
|
|
63
|
+
});
|
|
64
|
+
if (opts.json) {
|
|
65
|
+
emit.data(result);
|
|
66
|
+
}
|
|
67
|
+
else if (opts.html) {
|
|
68
|
+
emit.text(result.html?.endsWith("\n") ? result.html : `${result.html ?? ""}\n`);
|
|
69
|
+
}
|
|
70
|
+
else if (opts.evaluate !== undefined) {
|
|
71
|
+
const value = typeof result.evaluation === "string"
|
|
72
|
+
? result.evaluation
|
|
73
|
+
: JSON.stringify(result.evaluation, null, 2);
|
|
74
|
+
emit.text(`${value ?? "undefined"}\n`);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
emit.text(result.text.endsWith("\n") ? result.text : `${result.text}\n`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function collect(value, previous) {
|
|
81
|
+
return [...previous, value];
|
|
82
|
+
}
|
|
83
|
+
function isBackend(value) {
|
|
84
|
+
return value === "auto" || value === "chrome" || value === "webkit";
|
|
85
|
+
}
|
|
86
|
+
function parseNonNegativeInteger(value, flag, allowZero) {
|
|
87
|
+
if (!/^\d+$/.test(value))
|
|
88
|
+
throw new Error(`${flag} expects an integer, got "${value}".`);
|
|
89
|
+
const parsed = Number.parseInt(value, 10);
|
|
90
|
+
if ((!allowZero && parsed < 1) || (allowZero && parsed < 0)) {
|
|
91
|
+
throw new Error(`${flag} must be ${allowZero ? "zero or greater" : "greater than zero"}.`);
|
|
92
|
+
}
|
|
93
|
+
return parsed;
|
|
94
|
+
}
|
package/dist/core/adapter.d.ts
CHANGED
|
@@ -1,5 +1,54 @@
|
|
|
1
1
|
/** First-party harness adapters supported by Harnery's canonical V3 ledger. */
|
|
2
|
-
export type Adapter = "claude-code" | "cursor" | "codex";
|
|
2
|
+
export type Adapter = "claude-code" | "cursor" | "codex" | "opencode";
|
|
3
3
|
/** Canonical producer classes used by V3 provenance. */
|
|
4
4
|
export type EventSource = "agent-hooks" | "agent-coord" | "user" | "system";
|
|
5
|
+
/**
|
|
6
|
+
* Runtime census of the workflow adapters. Adding a member to `Adapter`
|
|
7
|
+
* without listing it here is a compile error (see `adaptersComplete`), so a
|
|
8
|
+
* new adapter can never slip past the shared normalizer.
|
|
9
|
+
*/
|
|
10
|
+
export declare const ADAPTERS: readonly ["claude-code", "cursor", "codex", "opencode"];
|
|
11
|
+
/** Every adapter falls back to this identity when a platform value carries no usable evidence. */
|
|
12
|
+
export declare const DEFAULT_ADAPTER: Adapter;
|
|
13
|
+
/** Why a platform value could not be normalized to a known adapter. */
|
|
14
|
+
export type AdapterFallbackReason = "missing" | "unknown";
|
|
15
|
+
export interface AdapterFallback {
|
|
16
|
+
/** The raw value that was normalized. */
|
|
17
|
+
value: unknown;
|
|
18
|
+
/** `missing` for null, undefined, or an empty string; `unknown` for anything else. */
|
|
19
|
+
reason: AdapterFallbackReason;
|
|
20
|
+
/** The adapter that was substituted. */
|
|
21
|
+
fallback: string;
|
|
22
|
+
/** Caller-supplied label naming the code path, for the diagnostic line. */
|
|
23
|
+
context?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface AdapterFallbackOptions {
|
|
26
|
+
/** Names the caller in the diagnostic line, e.g. `"claim-conflict"`. */
|
|
27
|
+
context?: string;
|
|
28
|
+
/**
|
|
29
|
+
* Receives every fallback. The default writes one stderr line per unknown
|
|
30
|
+
* value; a missing value is a pre-heartbeat state rather than a
|
|
31
|
+
* misattribution, so it is passed here but not printed.
|
|
32
|
+
*/
|
|
33
|
+
onFallback?: (fallback: AdapterFallback) => void;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Generic membership normalizer shared by every adapter census. Returns the
|
|
37
|
+
* matching id or `null`; it never substitutes a default.
|
|
38
|
+
*/
|
|
39
|
+
export declare function normalizeAdapterId<T extends string>(value: unknown, census: readonly T[]): T | null;
|
|
40
|
+
/**
|
|
41
|
+
* Normalize with an explicit, reported fallback. Every caller that must end up
|
|
42
|
+
* with *some* adapter routes through here so the substitution is visible.
|
|
43
|
+
*/
|
|
44
|
+
export declare function resolveAdapterId<T extends string>(value: unknown, census: readonly T[], fallback: T, options?: AdapterFallbackOptions): T;
|
|
45
|
+
/** Default fallback sink: one stderr line for an unrecognized platform value. */
|
|
46
|
+
export declare function reportAdapterFallback(fallback: AdapterFallback): void;
|
|
47
|
+
/** Strict workflow-adapter normalizer: a known id or `null`. */
|
|
48
|
+
export declare function normalizeAdapter(value: unknown): Adapter | null;
|
|
49
|
+
/**
|
|
50
|
+
* Heartbeat `platform` (or any adapter-shaped string) to a workflow adapter,
|
|
51
|
+
* substituting `DEFAULT_ADAPTER` and reporting the substitution.
|
|
52
|
+
*/
|
|
53
|
+
export declare function adapterFromPlatform(value: unknown, options?: AdapterFallbackOptions): Adapter;
|
|
5
54
|
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/core/adapter.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,MAAM,MAAM,OAAO,GAAG,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/core/adapter.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,MAAM,MAAM,OAAO,GAAG,aAAa,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;AAEtE,wDAAwD;AACxD,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,aAAa,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE5E;;;;GAIG;AACH,eAAO,MAAM,QAAQ,yDAKkB,CAAC;AAMxC,kGAAkG;AAClG,eAAO,MAAM,eAAe,EAAE,OAAuB,CAAC;AAEtD,uEAAuE;AACvE,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,SAAS,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,yCAAyC;IACzC,KAAK,EAAE,OAAO,CAAC;IACf,sFAAsF;IACtF,MAAM,EAAE,qBAAqB,CAAC;IAC9B,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,IAAI,CAAC;CAClD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,EACjD,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,SAAS,CAAC,EAAE,GACnB,CAAC,GAAG,IAAI,CAGV;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAC/C,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,SAAS,CAAC,EAAE,EACpB,QAAQ,EAAE,CAAC,EACX,OAAO,GAAE,sBAA2B,GACnC,CAAC,CAYH;AAED,iFAAiF;AACjF,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAMrE;AAED,gEAAgE;AAChE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI,CAE/D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAE7F"}
|
package/dist/core/adapter.js
CHANGED
|
@@ -1 +1,59 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Runtime census of the workflow adapters. Adding a member to `Adapter`
|
|
3
|
+
* without listing it here is a compile error (see `adaptersComplete`), so a
|
|
4
|
+
* new adapter can never slip past the shared normalizer.
|
|
5
|
+
*/
|
|
6
|
+
export const ADAPTERS = [
|
|
7
|
+
"claude-code",
|
|
8
|
+
"cursor",
|
|
9
|
+
"codex",
|
|
10
|
+
"opencode",
|
|
11
|
+
];
|
|
12
|
+
const adaptersComplete = true;
|
|
13
|
+
void adaptersComplete;
|
|
14
|
+
/** Every adapter falls back to this identity when a platform value carries no usable evidence. */
|
|
15
|
+
export const DEFAULT_ADAPTER = "claude-code";
|
|
16
|
+
/**
|
|
17
|
+
* Generic membership normalizer shared by every adapter census. Returns the
|
|
18
|
+
* matching id or `null`; it never substitutes a default.
|
|
19
|
+
*/
|
|
20
|
+
export function normalizeAdapterId(value, census) {
|
|
21
|
+
if (typeof value !== "string")
|
|
22
|
+
return null;
|
|
23
|
+
return census.includes(value) ? value : null;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Normalize with an explicit, reported fallback. Every caller that must end up
|
|
27
|
+
* with *some* adapter routes through here so the substitution is visible.
|
|
28
|
+
*/
|
|
29
|
+
export function resolveAdapterId(value, census, fallback, options = {}) {
|
|
30
|
+
const normalized = normalizeAdapterId(value, census);
|
|
31
|
+
if (normalized !== null)
|
|
32
|
+
return normalized;
|
|
33
|
+
const reason = value === undefined || value === null || value === "" ? "missing" : "unknown";
|
|
34
|
+
(options.onFallback ?? reportAdapterFallback)({
|
|
35
|
+
value,
|
|
36
|
+
reason,
|
|
37
|
+
fallback,
|
|
38
|
+
context: options.context,
|
|
39
|
+
});
|
|
40
|
+
return fallback;
|
|
41
|
+
}
|
|
42
|
+
/** Default fallback sink: one stderr line for an unrecognized platform value. */
|
|
43
|
+
export function reportAdapterFallback(fallback) {
|
|
44
|
+
if (fallback.reason !== "unknown")
|
|
45
|
+
return;
|
|
46
|
+
const where = fallback.context ? ` (${fallback.context})` : "";
|
|
47
|
+
process.stderr.write(`harnery: unknown adapter platform ${JSON.stringify(fallback.value)}${where}; treating it as ${fallback.fallback}\n`);
|
|
48
|
+
}
|
|
49
|
+
/** Strict workflow-adapter normalizer: a known id or `null`. */
|
|
50
|
+
export function normalizeAdapter(value) {
|
|
51
|
+
return normalizeAdapterId(value, ADAPTERS);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Heartbeat `platform` (or any adapter-shaped string) to a workflow adapter,
|
|
55
|
+
* substituting `DEFAULT_ADAPTER` and reporting the substitution.
|
|
56
|
+
*/
|
|
57
|
+
export function adapterFromPlatform(value, options) {
|
|
58
|
+
return resolveAdapterId(value, ADAPTERS, DEFAULT_ADAPTER, options);
|
|
59
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attestation.d.ts","sourceRoot":"","sources":["../../../src/core/adapters/attestation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"attestation.d.ts","sourceRoot":"","sources":["../../../src/core/adapters/attestation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAcH,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/E,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAE5C;;uBAEuB;AACvB,eAAO,MAAM,qBAAqB,2FAMxB,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzE,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,SAAS,CAAC;IACnB;kFAC8E;IAC9E,cAAc,EAAE,MAAM,CAAC;IACvB;kDAC8C;IAC9C,cAAc,EAAE,MAAM,CAAC;IACvB;;8DAE0D;IAC1D,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB;6DACyD;IACzD,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACtE,kEAAkE;IAClE,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,IAAI,GAAE,uBAA4B,GAAG,MAAM,CAI1E;AAED;wDACwD;AACxD,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAM7D;AAMD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,IAAI,CAAC,kBAAkB,EAAE,eAAe,CAAC,GAChD,kBAAkB,CAEpB;AASD;;aAEa;AACb,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,kBAAkB,EAC1B,IAAI,GAAE,uBAA4B,GACjC,MAAM,CAmBR;AAED;;kEAEkE;AAClE,wBAAgB,eAAe,CAC7B,OAAO,EAAE,SAAS,EAClB,IAAI,GAAE,uBAA4B,GACjC,kBAAkB,GAAG,IAAI,CAc3B;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,SAAS,GAClB,kBAAkB,GAAG,IAAI,CAe3B;AAED;uBACuB;AACvB,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,kBAAkB,GAAG,IAAI,EACjC,aAAa,EAAE,MAAM,GAAG,IAAI,EAC5B,OAAO,EAAE,cAAc,EACvB,gBAAgB,CAAC,EAAE,OAAO,GACzB,MAAM,IAAI,kBAAkB,CAK9B;AAED,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,uBAA4B,GAAG,kBAAkB,EAAE,CAczF;AAED;;;oDAGoD;AACpD,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,SAAS,cAAc,EAAE,EACnC,IAAI,EAAE,uBAAuB,GAAG;IAC9B,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAChD;wCACoC;IACpC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,GACA;IACD,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,YAAY,EAAE,cAAc,CAAC,cAAc,CAAC,CAAC,cAAc,CAAC,CAAA;KAAE,CAAC,CAAC;IAClG,mBAAmB,EAAE,MAAM,CACzB,MAAM,EACN;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CACvE,CAAC;CACH,CAoCA"}
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
import { mkdirSync, readdirSync, readFileSync, renameSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
15
15
|
import { resolve } from "node:path";
|
|
16
16
|
import { monorepoRoot } from "../agents/coord-client.js";
|
|
17
|
+
import { stateDirMode, stateFileMode } from "../storage/modes.js";
|
|
17
18
|
import { stableDigest } from "../workflow/durable-record.js";
|
|
18
19
|
export const ATTESTATION_SCHEMA_VERSION = 2;
|
|
19
20
|
/** Dimensions one minimal live turn can honestly establish. Everything else
|
|
@@ -58,12 +59,12 @@ function attestationPath(adapter, opts) {
|
|
|
58
59
|
* create. */
|
|
59
60
|
export function writeAttestation(record, opts = {}) {
|
|
60
61
|
const path = attestationPath(record.adapter, opts);
|
|
61
|
-
mkdirSync(attestationsDir(opts), { recursive: true, mode:
|
|
62
|
+
mkdirSync(attestationsDir(opts), { recursive: true, mode: stateDirMode() });
|
|
62
63
|
const temporary = `${path}.tmp-${process.pid}`;
|
|
63
64
|
try {
|
|
64
65
|
writeFileSync(temporary, `${JSON.stringify(record, null, 2)}\n`, {
|
|
65
66
|
encoding: "utf8",
|
|
66
|
-
mode:
|
|
67
|
+
mode: stateFileMode(),
|
|
67
68
|
});
|
|
68
69
|
renameSync(temporary, path);
|
|
69
70
|
}
|
|
@@ -55,14 +55,31 @@ export declare const BUILTIN_ADAPTER_PROFILES: {
|
|
|
55
55
|
readonly modelFamily: "multi";
|
|
56
56
|
readonly effortValues: readonly [];
|
|
57
57
|
readonly verified: {
|
|
58
|
-
readonly date: "2026-
|
|
59
|
-
readonly version: "2026.
|
|
58
|
+
readonly date: "2026-09-20";
|
|
59
|
+
readonly version: "2026.09.18-9a7762b";
|
|
60
|
+
};
|
|
61
|
+
readonly capabilities: AdapterCapabilities;
|
|
62
|
+
};
|
|
63
|
+
readonly opencode: {
|
|
64
|
+
readonly id: "opencode";
|
|
65
|
+
readonly displayName: "OpenCode";
|
|
66
|
+
readonly binary: "opencode";
|
|
67
|
+
readonly installHint: "curl -fsSL https://opencode.ai/install | bash";
|
|
68
|
+
readonly loginHint: "opencode auth login";
|
|
69
|
+
readonly apiKeyEnv: "OPENCODE_API_KEY";
|
|
70
|
+
readonly integrationMode: "cli-subprocess";
|
|
71
|
+
readonly authModel: "own-auth";
|
|
72
|
+
readonly modelFamily: "multi";
|
|
73
|
+
readonly effortValues: readonly [];
|
|
74
|
+
readonly verified: {
|
|
75
|
+
readonly date: "2026-09-20";
|
|
76
|
+
readonly version: "opencode v2.0.11";
|
|
60
77
|
};
|
|
61
78
|
readonly capabilities: AdapterCapabilities;
|
|
62
79
|
};
|
|
63
80
|
};
|
|
64
81
|
export type BuiltinAdapterId = keyof typeof BUILTIN_ADAPTER_PROFILES;
|
|
65
|
-
export declare const BUILTIN_ADAPTER_IDS: readonly ("claude-code" | "cursor" | "codex")[];
|
|
82
|
+
export declare const BUILTIN_ADAPTER_IDS: readonly ("claude-code" | "cursor" | "codex" | "opencode")[];
|
|
66
83
|
export declare function isBuiltinAdapter(id: string): id is BuiltinAdapterId;
|
|
67
84
|
export declare function builtinAdapterProfile(id: string): AdapterProfile | undefined;
|
|
68
85
|
export declare function validateAdapterEffort(id: string, effort: string | undefined): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../../src/core/adapters/profiles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAmB,MAAM,YAAY,CAAC;AAgCvF;gFACgF;AAChF,eAAO,MAAM,wBAAwB
|
|
1
|
+
{"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../../src/core/adapters/profiles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAmB,MAAM,YAAY,CAAC;AAgCvF;gFACgF;AAChF,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkIc,CAAC;AAEpD,MAAM,MAAM,gBAAgB,GAAG,MAAM,OAAO,wBAAwB,CAAC;AAErE,eAAO,MAAM,mBAAmB,8DAE/B,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,EAAE,IAAI,gBAAgB,CAEnE;AAED,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAE5E;AAED,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAUlF"}
|
|
@@ -92,17 +92,48 @@ export const BUILTIN_ADAPTER_PROFILES = {
|
|
|
92
92
|
authModel: "own-auth",
|
|
93
93
|
modelFamily: "multi",
|
|
94
94
|
effortValues: [],
|
|
95
|
-
verified: { date: "2026-
|
|
95
|
+
verified: { date: "2026-09-20", version: "2026.09.18-9a7762b" },
|
|
96
96
|
capabilities: capabilities({
|
|
97
97
|
effortSelection: unsupported("Cursor embeds effort in some parameterized model ids; Harnery does not rewrite model ids."),
|
|
98
98
|
maxTurns: unsupported("cursor-agent exposes no turn-ceiling flag."),
|
|
99
99
|
sessionId: supported("Read from the JSON result envelope."),
|
|
100
100
|
cost: unsupported("The JSON result envelope carries no cost."),
|
|
101
|
+
// Still unknown on 2026-09-20 against cursor-agent 2026.09.18: the live
|
|
102
|
+
// `cursor_composer_context_percent` reader serves IDE hook sessions from
|
|
103
|
+
// the composer `state.vscdb`, and headless `cursor-agent` children (this
|
|
104
|
+
// workflow adapter) leave no composer row and no usage in the JSON result.
|
|
101
105
|
contextTelemetry: unknown("No stable Cursor context-usage payload has been certified."),
|
|
102
106
|
preCompactionSignal: supported("Cursor preCompact is wired to a durable checkpoint."),
|
|
103
107
|
postCompactionSignal: unsupported("Harnery does not wire an unverified Cursor postCompact hook."),
|
|
104
108
|
}),
|
|
105
109
|
},
|
|
110
|
+
opencode: {
|
|
111
|
+
id: "opencode",
|
|
112
|
+
displayName: "OpenCode",
|
|
113
|
+
binary: "opencode",
|
|
114
|
+
installHint: "curl -fsSL https://opencode.ai/install | bash",
|
|
115
|
+
loginHint: "opencode auth login",
|
|
116
|
+
apiKeyEnv: "OPENCODE_API_KEY",
|
|
117
|
+
integrationMode: "cli-subprocess",
|
|
118
|
+
authModel: "own-auth",
|
|
119
|
+
modelFamily: "multi",
|
|
120
|
+
// Model reasoning is selected through the `provider/model#variant` id;
|
|
121
|
+
// OpenCode exposes no separate effort dial for Harnery to map.
|
|
122
|
+
effortValues: [],
|
|
123
|
+
verified: { date: "2026-09-20", version: "opencode v2.0.11" },
|
|
124
|
+
capabilities: capabilities({
|
|
125
|
+
effortSelection: unsupported("OpenCode selects reasoning through the model id variant; there is no separate effort flag."),
|
|
126
|
+
maxTurns: unsupported("`opencode run` exposes no turn-ceiling flag."),
|
|
127
|
+
sessionId: supported("Read from the `sessionID` on every `--format json` NDJSON line."),
|
|
128
|
+
cost: unsupported("`opencode run --format json` streams parts without a final cost; cost lives in `session export`."),
|
|
129
|
+
// Tool evidence is delivered on the event axis by the Harnery OpenCode
|
|
130
|
+
// plugin, not by the final-result workflow spawn, which retains no tool
|
|
131
|
+
// events (as with Codex and Cursor).
|
|
132
|
+
contextTelemetry: unknown("OpenCode stores context in SQLite; no context-window bridge is certified yet."),
|
|
133
|
+
preCompactionSignal: supported('OpenCode session.hook("compaction") is bridged to a durable checkpoint.'),
|
|
134
|
+
postCompactionSignal: unsupported("No post-compact hook is wired; OpenCode post-compaction recovery is not yet certified."),
|
|
135
|
+
}),
|
|
136
|
+
},
|
|
106
137
|
};
|
|
107
138
|
export const BUILTIN_ADAPTER_IDS = Object.freeze(Object.keys(BUILTIN_ADAPTER_PROFILES));
|
|
108
139
|
export function isBuiltinAdapter(id) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/core/adapters/registry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/core/adapters/registry.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAqGrD;+EAC+E;AAC/E,qBAAa,eAAe;;gBAGd,QAAQ,GAAE,QAAQ,CAAC,OAAO,CAAM;IAI5C,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAYhC,GAAG,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS;IAIvC,OAAO,CAAC,EAAE,EAAE,SAAS,GAAG,OAAO;IAU/B,IAAI,IAAI,OAAO,EAAE;IAIjB,GAAG,IAAI,SAAS,EAAE;IAIlB,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;CAGhD;AAED,wBAAgB,4BAA4B,IAAI,eAAe,CAE9D"}
|
|
@@ -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. */
|
|
@@ -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;
|
|
@@ -237,7 +232,10 @@ async function handleStateAction(root, action, rest) {
|
|
|
237
232
|
// same durable, idempotent pool path used by normal SessionStart.
|
|
238
233
|
if (task && before && humanFacing && !before.name?.trim()) {
|
|
239
234
|
const { assignName } = await import("./state/names.js");
|
|
240
|
-
const
|
|
235
|
+
const { coordFreshnessSeconds } = await import("../config.js");
|
|
236
|
+
const name = assignName(root, owner, "session", {
|
|
237
|
+
freshnessSecs: coordFreshnessSeconds(root),
|
|
238
|
+
});
|
|
241
239
|
before = writer.setAssignedNameCache(root, owner, name, "session");
|
|
242
240
|
if (!before) {
|
|
243
241
|
process.stderr.write(`agent-coord set-task: could not restore assigned name for ${owner}\n`);
|
|
@@ -253,7 +251,7 @@ async function handleStateAction(root, action, rest) {
|
|
|
253
251
|
coordRoot: root,
|
|
254
252
|
owner,
|
|
255
253
|
nativeSessionId: before?.session_id ?? owner,
|
|
256
|
-
adapter:
|
|
254
|
+
adapter: sharedAdapterFromPlatform(before?.platform, { context: "agent-coord" }),
|
|
257
255
|
task,
|
|
258
256
|
});
|
|
259
257
|
break;
|
|
@@ -273,12 +271,21 @@ async function handleStateAction(root, action, rest) {
|
|
|
273
271
|
currentHumanFacing &&
|
|
274
272
|
(!hb.name?.trim() || /^Agent unknown - /.test(hb.suggested_session_name ?? ""))) {
|
|
275
273
|
const { assignName } = await import("./state/names.js");
|
|
276
|
-
const
|
|
274
|
+
const { coordFreshnessSeconds } = await import("../config.js");
|
|
275
|
+
const name = hb.name?.trim() ||
|
|
276
|
+
assignName(root, owner, "session", { freshnessSecs: coordFreshnessSeconds(root) });
|
|
277
277
|
hb = writer.setAssignedNameCache(root, owner, name, "session");
|
|
278
278
|
}
|
|
279
279
|
}
|
|
280
280
|
catch (error) {
|
|
281
|
-
|
|
281
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
282
|
+
// A missing heartbeat here means the session's generation ended
|
|
283
|
+
// while its process lived on. Name the reopen command (ADR 0088);
|
|
284
|
+
// set-task is usually the first thing such a session runs.
|
|
285
|
+
const hint = detail.includes("heartbeat_missing:")
|
|
286
|
+
? `; run \`${resolveBinName(root)} agents lifecycle active\` to open a fresh generation for this continuing session`
|
|
287
|
+
: "";
|
|
288
|
+
process.stderr.write(`agent-coord set-task: V3 authority refused (${detail})${hint}\n`);
|
|
282
289
|
return 1;
|
|
283
290
|
}
|
|
284
291
|
if (!hb) {
|
|
@@ -308,7 +315,7 @@ async function handleStateAction(root, action, rest) {
|
|
|
308
315
|
coordRoot: root,
|
|
309
316
|
owner,
|
|
310
317
|
nativeSessionId: before?.session_id ?? owner,
|
|
311
|
-
adapter:
|
|
318
|
+
adapter: sharedAdapterFromPlatform(before?.platform, { context: "agent-coord" }),
|
|
312
319
|
operation: "released",
|
|
313
320
|
path,
|
|
314
321
|
access: "write",
|
|
@@ -366,11 +373,11 @@ async function handleStateAction(root, action, rest) {
|
|
|
366
373
|
coordRoot: root,
|
|
367
374
|
owner,
|
|
368
375
|
nativeSessionId: sessionId ?? owner,
|
|
369
|
-
adapter:
|
|
376
|
+
adapter: sharedAdapterFromPlatform(adapter, { context: "agent-coord" }),
|
|
370
377
|
});
|
|
371
378
|
}
|
|
372
379
|
const { repairLiveCoordinationHeartbeat } = await import("./state/live-coordination-writer.js");
|
|
373
|
-
hb = repairLiveCoordinationHeartbeat(root, owner, sessionId ?? owner,
|
|
380
|
+
hb = repairLiveCoordinationHeartbeat(root, owner, sessionId ?? owner, sharedAdapterFromPlatform(adapter, { context: "agent-coord" }), model);
|
|
374
381
|
}
|
|
375
382
|
catch (error) {
|
|
376
383
|
process.stderr.write(`agent-coord repair-coordination-cache: V3 route refused (${error instanceof Error ? error.message : String(error)})\n`);
|
|
@@ -392,7 +399,7 @@ async function handleStateAction(root, action, rest) {
|
|
|
392
399
|
liveCoordinationWriteModeV3(root);
|
|
393
400
|
const { liveInstanceIdV3 } = await import("../events/v3/live-routing.js");
|
|
394
401
|
const { repairLiveCoordinationHeartbeat } = await import("./state/live-coordination-writer.js");
|
|
395
|
-
const heartbeat = repairLiveCoordinationHeartbeat(root, owner, sessionId ?? owner,
|
|
402
|
+
const heartbeat = repairLiveCoordinationHeartbeat(root, owner, sessionId ?? owner, sharedAdapterFromPlatform(adapter, { context: "agent-coord" }));
|
|
396
403
|
if (!heartbeat) {
|
|
397
404
|
throw new Error("authoritative coordination cache could not be materialized");
|
|
398
405
|
}
|
|
@@ -403,7 +410,7 @@ async function handleStateAction(root, action, rest) {
|
|
|
403
410
|
observed_current_state_digest: coordinationAuthorityStateDigestV3(heartbeat),
|
|
404
411
|
approval_record_id: approvalRecordId,
|
|
405
412
|
});
|
|
406
|
-
const repaired = repairLiveCoordinationHeartbeat(root, owner, sessionId ?? owner,
|
|
413
|
+
const repaired = repairLiveCoordinationHeartbeat(root, owner, sessionId ?? owner, sharedAdapterFromPlatform(adapter, { context: "agent-coord" }));
|
|
407
414
|
process.stdout.write(`${JSON.stringify({
|
|
408
415
|
instance_id: owner,
|
|
409
416
|
receipt,
|
|
@@ -557,7 +564,11 @@ async function handleAssignName(root, rest) {
|
|
|
557
564
|
process.stderr.write(`agent-coord assign-name: invalid kind ${kindArg}\n`);
|
|
558
565
|
return 2;
|
|
559
566
|
}
|
|
560
|
-
const
|
|
567
|
+
const { coordFreshnessSeconds } = await import("../config.js");
|
|
568
|
+
const name = assignName(root, owner, kindArg, {
|
|
569
|
+
freshnessSecs: coordFreshnessSeconds(root),
|
|
570
|
+
...(forkedFrom ? { forkedFrom } : {}),
|
|
571
|
+
});
|
|
561
572
|
process.stdout.write(`${JSON.stringify({
|
|
562
573
|
instance_id: owner,
|
|
563
574
|
name,
|
|
@@ -768,7 +779,7 @@ async function handleEmitEvent(root, rest) {
|
|
|
768
779
|
const eventType = args.type;
|
|
769
780
|
const instanceId = args.owner;
|
|
770
781
|
const sessionId = args.session;
|
|
771
|
-
const adapter = args.adapter;
|
|
782
|
+
const adapter = normalizeAdapter(args.adapter) ?? undefined;
|
|
772
783
|
const dataJson = args["data-stdin"] === "true" ? await readStdin() : "";
|
|
773
784
|
if (!eventType || !instanceId || !sessionId || !adapter || !dataJson) {
|
|
774
785
|
process.stderr.write("agent-coord emit-event --type <V3_TYPE> --owner <id> --session <id> --adapter <h> --data-stdin\n");
|
|
@@ -936,7 +947,7 @@ async function handleGitHook(fallbackRoot, rest) {
|
|
|
936
947
|
owner,
|
|
937
948
|
subject: hit.instance_id,
|
|
938
949
|
nativeSessionId: hit.session_id ?? owner,
|
|
939
|
-
adapter:
|
|
950
|
+
adapter: sharedAdapterFromPlatform(hit.platform, { context: "agent-coord" }),
|
|
940
951
|
operation: "released",
|
|
941
952
|
path,
|
|
942
953
|
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":"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"}
|