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
package/dist/commands/tunnel.js
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { spawnSync } from "node:child_process";
|
|
2
2
|
import { existsSync, readFileSync } from "node:fs";
|
|
3
3
|
import { resolve } from "node:path";
|
|
4
|
+
import { resolveCoordRoot } from "../core/agents/coord-client.js";
|
|
4
5
|
import { resolveBinName } from "../core/config.js";
|
|
6
|
+
import { tryRegisterServer, tunnelServerId, tunnelServerInput, unregisterServer, } from "../core/servers/index.js";
|
|
5
7
|
import { processLogDestination, runRotatingProcessSync, spawnRotatingProcess, } from "../core/storage/process-log.js";
|
|
8
|
+
import { ALLOW_PATHS_ENV, normalizeAllowPaths } from "../lib/tunnel/path-scope.js";
|
|
6
9
|
import { clearState, DEFAULT_INSTANCE, ensureCloudflared, gateLogFile, isProcessAlive, isTunnelStateLive, listStates, providerLogFile, readConfig, readState, writeConfig, writeState, } from "../lib/tunnel/state.js";
|
|
7
10
|
/**
|
|
8
11
|
* `tunnel`: provider-backed tunnel in front of a local upstream.
|
|
@@ -11,6 +14,8 @@ import { clearState, DEFAULT_INSTANCE, ensureCloudflared, gateLogFile, isProcess
|
|
|
11
14
|
* upstream. Cloudflare quick tunnels add an IP allowlist at the gate via the
|
|
12
15
|
* Cloudflare-set `CF-Connecting-IP` header; Tailscale Serve/Funnel exposes the
|
|
13
16
|
* same gate through tailscaled, with Tailscale owning the access boundary.
|
|
17
|
+
* Every provider also passes through a path scope: `up` requires at least one
|
|
18
|
+
* `--allow-path <prefix>`, and the gate refuses any request outside it.
|
|
14
19
|
*
|
|
15
20
|
* State + config persisted under `.cache/tunnel/`. cloudflared auto-installs
|
|
16
21
|
* to ~/.local/bin/ on first run (Linux only; macOS users `brew install`);
|
|
@@ -98,6 +103,42 @@ function resolveHttpsPort(raw) {
|
|
|
98
103
|
}
|
|
99
104
|
return port;
|
|
100
105
|
}
|
|
106
|
+
/**
|
|
107
|
+
* The path scope for `up`. At least one prefix is required: a tunnel forwards
|
|
108
|
+
* to a whole local app, and publishing all of it has to be a stated choice
|
|
109
|
+
* (`--allow-path /`), never the result of leaving a flag off.
|
|
110
|
+
*/
|
|
111
|
+
function resolveAllowPaths(raw) {
|
|
112
|
+
let paths;
|
|
113
|
+
try {
|
|
114
|
+
paths = normalizeAllowPaths(raw ?? []);
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
emit.error({
|
|
118
|
+
code: "tunnel_path_scope_invalid",
|
|
119
|
+
message: error instanceof Error ? error.message : String(error),
|
|
120
|
+
});
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
if (paths.length === 0) {
|
|
124
|
+
emit.error({
|
|
125
|
+
code: "tunnel_path_scope_empty",
|
|
126
|
+
message: "No path scope; refusing to start. Name what the tunnel shares with --allow-path <prefix> " +
|
|
127
|
+
"(repeatable), or pass --allow-path / to publish the whole upstream.",
|
|
128
|
+
});
|
|
129
|
+
process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
return paths;
|
|
132
|
+
}
|
|
133
|
+
function samePaths(a, b) {
|
|
134
|
+
return a.length === b.length && [...a].sort().join("\n") === [...b].sort().join("\n");
|
|
135
|
+
}
|
|
136
|
+
function formatPaths(paths) {
|
|
137
|
+
return paths.length === 0 ? "(none: every path refused)" : paths.join(", ");
|
|
138
|
+
}
|
|
139
|
+
function collectPath(value, previous) {
|
|
140
|
+
return [...previous, value];
|
|
141
|
+
}
|
|
101
142
|
function gateScriptPath() {
|
|
102
143
|
return resolve(import.meta.dirname, "..", "lib", "tunnel", "gate.ts");
|
|
103
144
|
}
|
|
@@ -366,6 +407,7 @@ function spawnGate(o) {
|
|
|
366
407
|
HARNERY_TUNNEL_TARGET: o.target,
|
|
367
408
|
HARNERY_TUNNEL_VHOST: o.vhost,
|
|
368
409
|
HARNERY_TUNNEL_PORT: String(o.gatePort),
|
|
410
|
+
[ALLOW_PATHS_ENV]: o.allowPaths.join(","),
|
|
369
411
|
},
|
|
370
412
|
});
|
|
371
413
|
gateProc.unref();
|
|
@@ -389,6 +431,7 @@ async function up(opts) {
|
|
|
389
431
|
const tailscaleMode = provider === "tailscale" ? resolveTailscaleMode(opts.visibility) : undefined;
|
|
390
432
|
const tailscalePath = provider === "tailscale" ? resolveTailscalePath(opts.path, name) : undefined;
|
|
391
433
|
const tailscaleHttpsPort = provider === "tailscale" ? resolveHttpsPort(opts.httpsPort) : undefined;
|
|
434
|
+
const allowPaths = resolveAllowPaths(opts.allowPath);
|
|
392
435
|
const existing = readState(name);
|
|
393
436
|
if (existing && tunnelIsAlive(existing)) {
|
|
394
437
|
if (existing.provider !== provider) {
|
|
@@ -398,9 +441,18 @@ async function up(opts) {
|
|
|
398
441
|
});
|
|
399
442
|
process.exit(1);
|
|
400
443
|
}
|
|
444
|
+
if (!samePaths(existing.allow_paths, allowPaths)) {
|
|
445
|
+
emit.error({
|
|
446
|
+
code: "tunnel_instance_in_use",
|
|
447
|
+
message: `Tunnel [${name}] is already up sharing ${formatPaths(existing.allow_paths)}. ` +
|
|
448
|
+
`Stop it before starting it with ${formatPaths(allowPaths)}.`,
|
|
449
|
+
});
|
|
450
|
+
process.exit(1);
|
|
451
|
+
}
|
|
401
452
|
emit.text(`Already up [${name}]: ${existing.url}\n`);
|
|
402
453
|
emit.text(` Provider: ${existing.provider}\n`);
|
|
403
454
|
emit.text(` Forwarding: ${existing.target} (Host: ${existing.vhost})\n`);
|
|
455
|
+
emit.text(` Paths: ${formatPaths(existing.allow_paths)}\n`);
|
|
404
456
|
return;
|
|
405
457
|
}
|
|
406
458
|
if (existing)
|
|
@@ -438,6 +490,7 @@ async function up(opts) {
|
|
|
438
490
|
vhost,
|
|
439
491
|
provider,
|
|
440
492
|
allowedIps: cfg.allowed_ips,
|
|
493
|
+
allowPaths,
|
|
441
494
|
gateLogPath,
|
|
442
495
|
});
|
|
443
496
|
await sleep(800);
|
|
@@ -507,16 +560,19 @@ async function up(opts) {
|
|
|
507
560
|
target,
|
|
508
561
|
vhost,
|
|
509
562
|
gate_port: gatePort,
|
|
563
|
+
allow_paths: allowPaths,
|
|
510
564
|
tailscale_mode: tailscaleMode,
|
|
511
565
|
tailscale_path: tailscalePath,
|
|
512
566
|
tailscale_https_port: tailscaleHttpsPort,
|
|
513
567
|
};
|
|
514
568
|
writeState(state);
|
|
569
|
+
recordTunnelServer(state);
|
|
515
570
|
const stopHint = name === DEFAULT_INSTANCE ? "harn tunnel down" : `harn tunnel down --name ${name}`;
|
|
516
571
|
emit.text(`\n Instance: ${name}\n`);
|
|
517
572
|
emit.text(` Provider: ${provider}${tailscaleMode ? ` (${tailscaleMode})` : ""}\n`);
|
|
518
573
|
emit.text(` URL: ${url}\n\n`);
|
|
519
574
|
emit.text(` Forwarding: ${target} (Host: ${vhost})\n`);
|
|
575
|
+
emit.text(` Paths: ${formatPaths(allowPaths)}\n`);
|
|
520
576
|
emit.text(` Gate port: ${gatePort}\n`);
|
|
521
577
|
if (provider === "cloudflare") {
|
|
522
578
|
emit.text(` Allowed IPs: ${cfg.allowed_ips.join(", ")}\n\n`);
|
|
@@ -533,6 +589,14 @@ async function up(opts) {
|
|
|
533
589
|
emit.text(` Stop: ${stopHint}\n`);
|
|
534
590
|
emit.text(" Status: harn tunnel status\n");
|
|
535
591
|
}
|
|
592
|
+
/** The server registry lists tunnels beside every other local server. */
|
|
593
|
+
function registryRoot() {
|
|
594
|
+
return resolveCoordRoot() ?? process.cwd();
|
|
595
|
+
}
|
|
596
|
+
function recordTunnelServer(state) {
|
|
597
|
+
const coordRoot = registryRoot();
|
|
598
|
+
tryRegisterServer(tunnelServerInput(state, coordRoot), { coordRoot });
|
|
599
|
+
}
|
|
536
600
|
/** Tear down a single instance by name. Returns the number of processes killed. */
|
|
537
601
|
function downOne(name, killed) {
|
|
538
602
|
const before = killed.size;
|
|
@@ -558,6 +622,7 @@ function downOne(name, killed) {
|
|
|
558
622
|
// lost; they'd otherwise squat on the port and break the next `up`.
|
|
559
623
|
sweepStrays(state?.gate_port ?? DEFAULT_GATE_PORT, killed);
|
|
560
624
|
clearState(name);
|
|
625
|
+
unregisterServer(tunnelServerId(name), { coordRoot: registryRoot() });
|
|
561
626
|
return killed.size - before;
|
|
562
627
|
}
|
|
563
628
|
function down(opts) {
|
|
@@ -633,6 +698,14 @@ export async function reloadOne(state) {
|
|
|
633
698
|
if (!bunAvailable()) {
|
|
634
699
|
return { ok: false, message: `[${name}] bun is not on PATH, so the gate can't be respawned.` };
|
|
635
700
|
}
|
|
701
|
+
if (state.allow_paths.length === 0) {
|
|
702
|
+
return {
|
|
703
|
+
ok: false,
|
|
704
|
+
message: `[${name}] has no recorded path scope, so a reloaded gate would refuse every request. ` +
|
|
705
|
+
`Restart it with \`${bin} tunnel down --name ${name}\` and ` +
|
|
706
|
+
`\`${bin} tunnel up --name ${name} --allow-path <prefix>\`.`,
|
|
707
|
+
};
|
|
708
|
+
}
|
|
636
709
|
// Kill ONLY the gate. sweepStrays() is deliberately avoided here: it also
|
|
637
710
|
// matches `--url http://localhost:<port>`, which is the provider process we
|
|
638
711
|
// are going out of our way to keep alive.
|
|
@@ -662,6 +735,7 @@ export async function reloadOne(state) {
|
|
|
662
735
|
vhost: state.vhost,
|
|
663
736
|
provider: state.provider,
|
|
664
737
|
allowedIps: cfg.allowed_ips,
|
|
738
|
+
allowPaths: state.allow_paths,
|
|
665
739
|
gateLogPath: tunnelLogDestinations(name, state.provider).gate,
|
|
666
740
|
});
|
|
667
741
|
await sleep(800);
|
|
@@ -676,6 +750,7 @@ export async function reloadOne(state) {
|
|
|
676
750
|
};
|
|
677
751
|
}
|
|
678
752
|
writeState({ ...state, gate_pid: pid });
|
|
753
|
+
recordTunnelServer({ ...state, gate_pid: pid });
|
|
679
754
|
const allowNote = state.provider === "cloudflare" ? ` Allowlist: ${cfg.allowed_ips.length} IP(s).` : "";
|
|
680
755
|
return { ok: true, message: `[${name}] gate reloaded, URL unchanged: ${state.url}.${allowNote}` };
|
|
681
756
|
}
|
|
@@ -745,6 +820,7 @@ function statusDetail(state) {
|
|
|
745
820
|
emit.text(` Provider: ${state.provider}${state.tailscale_mode ? ` (${state.tailscale_mode})` : ""}\n`);
|
|
746
821
|
emit.text(` URL: ${state.url}\n`);
|
|
747
822
|
emit.text(` Forwarding: ${state.target} (Host: ${state.vhost})\n`);
|
|
823
|
+
emit.text(` Paths: ${formatPaths(state.allow_paths)}\n`);
|
|
748
824
|
emit.text(` Gate port: ${state.gate_port}\n`);
|
|
749
825
|
if (state.provider === "cloudflare") {
|
|
750
826
|
emit.text(` Allowed IPs: ${cfg.allowed_ips.join(", ")}\n`);
|
|
@@ -786,6 +862,7 @@ function status(opts) {
|
|
|
786
862
|
state: instanceState(s),
|
|
787
863
|
url: s.url,
|
|
788
864
|
fwd: `${s.target} (${s.vhost})`,
|
|
865
|
+
paths: formatPaths(s.allow_paths),
|
|
789
866
|
port: String(s.gate_port),
|
|
790
867
|
up: fmtUptime(s.started_at),
|
|
791
868
|
}));
|
|
@@ -795,12 +872,13 @@ function status(opts) {
|
|
|
795
872
|
state: 5,
|
|
796
873
|
url: Math.max(3, ...rows.map((r) => r.url.length)),
|
|
797
874
|
fwd: Math.max(10, ...rows.map((r) => r.fwd.length)),
|
|
875
|
+
paths: Math.max(5, ...rows.map((r) => r.paths.length)),
|
|
798
876
|
port: 4,
|
|
799
877
|
};
|
|
800
878
|
const pad = (s, n) => s.padEnd(n);
|
|
801
|
-
emit.text(`${pad("NAME", w.name)} ${pad("PROVIDER", w.provider)} ${pad("STATE", w.state)} ${pad("URL", w.url)} ${pad("FORWARDING", w.fwd)} ${pad("PORT", w.port)} UPTIME\n`);
|
|
879
|
+
emit.text(`${pad("NAME", w.name)} ${pad("PROVIDER", w.provider)} ${pad("STATE", w.state)} ${pad("URL", w.url)} ${pad("FORWARDING", w.fwd)} ${pad("PATHS", w.paths)} ${pad("PORT", w.port)} UPTIME\n`);
|
|
802
880
|
for (const r of rows) {
|
|
803
|
-
emit.text(`${pad(r.name, w.name)} ${pad(r.provider, w.provider)} ${pad(r.state, w.state)} ${pad(r.url, w.url)} ${pad(r.fwd, w.fwd)} ${pad(r.port, w.port)} ${r.up}\n`);
|
|
881
|
+
emit.text(`${pad(r.name, w.name)} ${pad(r.provider, w.provider)} ${pad(r.state, w.state)} ${pad(r.url, w.url)} ${pad(r.fwd, w.fwd)} ${pad(r.paths, w.paths)} ${pad(r.port, w.port)} ${r.up}\n`);
|
|
804
882
|
}
|
|
805
883
|
}
|
|
806
884
|
function logs(opts) {
|
|
@@ -886,6 +964,8 @@ export function registerTunnelCommand(program, emitParam, contextParam) {
|
|
|
886
964
|
.option("--visibility <visibility>", "Tailscale only: tailnet (Serve, default) or public (Funnel)", "tailnet")
|
|
887
965
|
.option("--path <path>", "Tailscale only: URL path mount (default: / for default, /<name> for named instances)")
|
|
888
966
|
.option("--https-port <port>", "Tailscale only: HTTPS listen port (default: 443)", "443")
|
|
967
|
+
.option("--allow-path <prefix>", "URL path prefix the tunnel shares (repeatable, required). Every other path is refused; " +
|
|
968
|
+
"pass / to publish the whole upstream.", collectPath, [])
|
|
889
969
|
.action(up);
|
|
890
970
|
cmd
|
|
891
971
|
.command("down")
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webview.d.ts","sourceRoot":"","sources":["../../src/commands/webview.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAyCnD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CA2DjG"}
|
|
@@ -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
|
}
|
|
@@ -17,6 +17,9 @@ export declare const BUILTIN_ADAPTER_PROFILES: {
|
|
|
17
17
|
readonly date: "2026-08-18";
|
|
18
18
|
readonly version: "2.1.233 (Claude Code)";
|
|
19
19
|
};
|
|
20
|
+
readonly fullAccess: {
|
|
21
|
+
readonly argv: readonly ["--permission-mode", "bypassPermissions", "--settings", "{\"sandbox\":{\"enabled\":false}}"];
|
|
22
|
+
};
|
|
20
23
|
readonly capabilities: AdapterCapabilities;
|
|
21
24
|
};
|
|
22
25
|
readonly codex: {
|
|
@@ -41,6 +44,9 @@ export declare const BUILTIN_ADAPTER_PROFILES: {
|
|
|
41
44
|
};
|
|
42
45
|
readonly writableRoots: true;
|
|
43
46
|
};
|
|
47
|
+
readonly fullAccess: {
|
|
48
|
+
readonly argv: readonly ["--sandbox", "danger-full-access"];
|
|
49
|
+
};
|
|
44
50
|
readonly capabilities: AdapterCapabilities;
|
|
45
51
|
};
|
|
46
52
|
readonly cursor: {
|
|
@@ -55,14 +61,34 @@ export declare const BUILTIN_ADAPTER_PROFILES: {
|
|
|
55
61
|
readonly modelFamily: "multi";
|
|
56
62
|
readonly effortValues: readonly [];
|
|
57
63
|
readonly verified: {
|
|
58
|
-
readonly date: "2026-
|
|
59
|
-
readonly version: "2026.
|
|
64
|
+
readonly date: "2026-09-20";
|
|
65
|
+
readonly version: "2026.09.18-9a7762b";
|
|
66
|
+
};
|
|
67
|
+
readonly fullAccess: {
|
|
68
|
+
readonly argv: readonly ["--sandbox", "disabled"];
|
|
69
|
+
};
|
|
70
|
+
readonly capabilities: AdapterCapabilities;
|
|
71
|
+
};
|
|
72
|
+
readonly opencode: {
|
|
73
|
+
readonly id: "opencode";
|
|
74
|
+
readonly displayName: "OpenCode";
|
|
75
|
+
readonly binary: "opencode";
|
|
76
|
+
readonly installHint: "curl -fsSL https://opencode.ai/install | bash";
|
|
77
|
+
readonly loginHint: "opencode auth login";
|
|
78
|
+
readonly apiKeyEnv: "OPENCODE_API_KEY";
|
|
79
|
+
readonly integrationMode: "cli-subprocess";
|
|
80
|
+
readonly authModel: "own-auth";
|
|
81
|
+
readonly modelFamily: "multi";
|
|
82
|
+
readonly effortValues: readonly [];
|
|
83
|
+
readonly verified: {
|
|
84
|
+
readonly date: "2026-09-20";
|
|
85
|
+
readonly version: "opencode v2.0.11";
|
|
60
86
|
};
|
|
61
87
|
readonly capabilities: AdapterCapabilities;
|
|
62
88
|
};
|
|
63
89
|
};
|
|
64
90
|
export type BuiltinAdapterId = keyof typeof BUILTIN_ADAPTER_PROFILES;
|
|
65
|
-
export declare const BUILTIN_ADAPTER_IDS: readonly ("claude-code" | "cursor" | "codex")[];
|
|
91
|
+
export declare const BUILTIN_ADAPTER_IDS: readonly ("claude-code" | "cursor" | "codex" | "opencode")[];
|
|
66
92
|
export declare function isBuiltinAdapter(id: string): id is BuiltinAdapterId;
|
|
67
93
|
export declare function builtinAdapterProfile(id: string): AdapterProfile | undefined;
|
|
68
94
|
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuJc,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"}
|
|
@@ -41,6 +41,18 @@ export const BUILTIN_ADAPTER_PROFILES = {
|
|
|
41
41
|
modelFamily: "claude",
|
|
42
42
|
effortValues: ["low", "medium", "high", "xhigh", "max"],
|
|
43
43
|
verified: { date: "2026-08-18", version: "2.1.233 (Claude Code)" },
|
|
44
|
+
// Checked against 2.1.283 (ADR 0192). Claude Code has no sandbox mode flag;
|
|
45
|
+
// its permission mode and its optional Bash sandbox are separate, so full
|
|
46
|
+
// access needs both: bypass permissions, and a settings layer that turns
|
|
47
|
+
// the Bash sandbox off in case a user or project settings file enabled it.
|
|
48
|
+
fullAccess: {
|
|
49
|
+
argv: [
|
|
50
|
+
"--permission-mode",
|
|
51
|
+
"bypassPermissions",
|
|
52
|
+
"--settings",
|
|
53
|
+
'{"sandbox":{"enabled":false}}',
|
|
54
|
+
],
|
|
55
|
+
},
|
|
44
56
|
capabilities: capabilities({
|
|
45
57
|
effortSelection: supported("Mapped to `--effort <level>`."),
|
|
46
58
|
maxTurns: supported("Mapped to `--max-turns <n>`."),
|
|
@@ -70,6 +82,9 @@ export const BUILTIN_ADAPTER_PROFILES = {
|
|
|
70
82
|
modes: { "read-only": "read-only", "workspace-write": "workspace-write" },
|
|
71
83
|
writableRoots: true,
|
|
72
84
|
},
|
|
85
|
+
// Checked against codex-cli 0.155.1 (ADR 0192): `--sandbox` accepts
|
|
86
|
+
// danger-full-access, and `codex exec` never prompts for approval.
|
|
87
|
+
fullAccess: { argv: ["--sandbox", "danger-full-access"] },
|
|
73
88
|
capabilities: capabilities({
|
|
74
89
|
effortSelection: supported('Mapped to `-c model_reasoning_effort="<level>"`.'),
|
|
75
90
|
filesystemPolicyProjection: supported("Mode renders to --sandbox; writable roots to sandbox_workspace_write.writable_roots."),
|
|
@@ -92,17 +107,54 @@ export const BUILTIN_ADAPTER_PROFILES = {
|
|
|
92
107
|
authModel: "own-auth",
|
|
93
108
|
modelFamily: "multi",
|
|
94
109
|
effortValues: [],
|
|
95
|
-
verified: { date: "2026-
|
|
110
|
+
verified: { date: "2026-09-20", version: "2026.09.18-9a7762b" },
|
|
111
|
+
// Checked against 2026.09.26-dd393fe (ADR 0192): `--sandbox disabled`
|
|
112
|
+
// overrides the configured sandbox. Cursor carries effort inside the model
|
|
113
|
+
// id, so a full-access floor for it names exact model ids.
|
|
114
|
+
fullAccess: { argv: ["--sandbox", "disabled"] },
|
|
96
115
|
capabilities: capabilities({
|
|
97
116
|
effortSelection: unsupported("Cursor embeds effort in some parameterized model ids; Harnery does not rewrite model ids."),
|
|
98
117
|
maxTurns: unsupported("cursor-agent exposes no turn-ceiling flag."),
|
|
99
118
|
sessionId: supported("Read from the JSON result envelope."),
|
|
100
119
|
cost: unsupported("The JSON result envelope carries no cost."),
|
|
120
|
+
// Still unknown on 2026-09-20 against cursor-agent 2026.09.18: the live
|
|
121
|
+
// `cursor_composer_context_percent` reader serves IDE hook sessions from
|
|
122
|
+
// the composer `state.vscdb`, and headless `cursor-agent` children (this
|
|
123
|
+
// workflow adapter) leave no composer row and no usage in the JSON result.
|
|
101
124
|
contextTelemetry: unknown("No stable Cursor context-usage payload has been certified."),
|
|
102
125
|
preCompactionSignal: supported("Cursor preCompact is wired to a durable checkpoint."),
|
|
103
126
|
postCompactionSignal: unsupported("Harnery does not wire an unverified Cursor postCompact hook."),
|
|
104
127
|
}),
|
|
105
128
|
},
|
|
129
|
+
opencode: {
|
|
130
|
+
id: "opencode",
|
|
131
|
+
displayName: "OpenCode",
|
|
132
|
+
binary: "opencode",
|
|
133
|
+
installHint: "curl -fsSL https://opencode.ai/install | bash",
|
|
134
|
+
loginHint: "opencode auth login",
|
|
135
|
+
apiKeyEnv: "OPENCODE_API_KEY",
|
|
136
|
+
integrationMode: "cli-subprocess",
|
|
137
|
+
authModel: "own-auth",
|
|
138
|
+
modelFamily: "multi",
|
|
139
|
+
// Model reasoning is selected through the `provider/model#variant` id;
|
|
140
|
+
// OpenCode exposes no separate effort dial for Harnery to map. It also has
|
|
141
|
+
// no vendor sandbox to remove, so it declares no full-access rendering and
|
|
142
|
+
// a worker on it is never granted one (ADR 0192).
|
|
143
|
+
effortValues: [],
|
|
144
|
+
verified: { date: "2026-09-20", version: "opencode v2.0.11" },
|
|
145
|
+
capabilities: capabilities({
|
|
146
|
+
effortSelection: unsupported("OpenCode selects reasoning through the model id variant; there is no separate effort flag."),
|
|
147
|
+
maxTurns: unsupported("`opencode run` exposes no turn-ceiling flag."),
|
|
148
|
+
sessionId: supported("Read from the `sessionID` on every `--format json` NDJSON line."),
|
|
149
|
+
cost: unsupported("`opencode run --format json` streams parts without a final cost; cost lives in `session export`."),
|
|
150
|
+
// Tool evidence is delivered on the event axis by the Harnery OpenCode
|
|
151
|
+
// plugin, not by the final-result workflow spawn, which retains no tool
|
|
152
|
+
// events (as with Codex and Cursor).
|
|
153
|
+
contextTelemetry: unknown("OpenCode stores context in SQLite; no context-window bridge is certified yet."),
|
|
154
|
+
preCompactionSignal: supported('OpenCode session.hook("compaction") is bridged to a durable checkpoint.'),
|
|
155
|
+
postCompactionSignal: unsupported("No post-compact hook is wired; OpenCode post-compaction recovery is not yet certified."),
|
|
156
|
+
}),
|
|
157
|
+
},
|
|
106
158
|
};
|
|
107
159
|
export const BUILTIN_ADAPTER_IDS = Object.freeze(Object.keys(BUILTIN_ADAPTER_PROFILES));
|
|
108
160
|
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"}
|