harnery 0.40.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 +18 -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/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/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 +635 -529
- 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 +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/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 +18 -17
- 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/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 +733 -537
- 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 +2 -3
- 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
|
@@ -4,6 +4,7 @@ import { lstat, mkdir, open, realpath, rm, writeFile } from "node:fs/promises";
|
|
|
4
4
|
import { dirname, isAbsolute, relative, resolve } from "node:path";
|
|
5
5
|
import { StringDecoder } from "node:string_decoder";
|
|
6
6
|
import { createGunzip, createInflateRaw } from "node:zlib";
|
|
7
|
+
import { stateDirMode, stateFileMode } from "../../../storage/modes.js";
|
|
7
8
|
import { logicalEntriesDigestV3, validateEventV3SupportPackManifest, validateEventV3SupportPackRecord, } from "./pack-contract.js";
|
|
8
9
|
const DEFAULT_LIMITS = {
|
|
9
10
|
max_manifest_bytes: 1024 * 1024,
|
|
@@ -155,7 +156,7 @@ export async function unpackEventV3SupportPack(manifestPath, destination, limits
|
|
|
155
156
|
if (error.code !== "ENOENT")
|
|
156
157
|
throw error;
|
|
157
158
|
}
|
|
158
|
-
await mkdir(target, { recursive: false, mode:
|
|
159
|
+
await mkdir(target, { recursive: false, mode: stateDirMode() });
|
|
159
160
|
let files = 0;
|
|
160
161
|
let bytes = 0;
|
|
161
162
|
try {
|
|
@@ -163,8 +164,8 @@ export async function unpackEventV3SupportPack(manifestPath, destination, limits
|
|
|
163
164
|
const path = resolve(target, ...record.path.split("/"));
|
|
164
165
|
if (relative(target, path).startsWith(".."))
|
|
165
166
|
throw new Error("event_v3_support_unpack_path_escape");
|
|
166
|
-
await mkdir(dirname(path), { recursive: true, mode:
|
|
167
|
-
await writeFile(path, record.content, { flag: "wx", mode:
|
|
167
|
+
await mkdir(dirname(path), { recursive: true, mode: stateDirMode() });
|
|
168
|
+
await writeFile(path, record.content, { flag: "wx", mode: stateFileMode() });
|
|
168
169
|
files += 1;
|
|
169
170
|
bytes += record.bytes;
|
|
170
171
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pack-writer.d.ts","sourceRoot":"","sources":["../../../../../src/core/events/v3/support-storage/pack-writer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pack-writer.d.ts","sourceRoot":"","sources":["../../../../../src/core/events/v3/support-storage/pack-writer.ts"],"names":[],"mappings":"AASA,OAAO,EAGL,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,8BAA8B,EAIpC,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,UAAU,MAAM,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,4BAA4B;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,8BAA8B,CAAC;IAClD,uBAAuB,CAAC,EAAE,UAAU,MAAM,EAAE,CAAC;IAC7C,OAAO,EAAE,wBAAwB,EAAE,CAAC;IACpC,uBAAuB,EAAE,MAAM,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,mCAAmC,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/E;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,0BAA0B,CAAC;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AAMD,iGAAiG;AACjG,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,4BAA4B,GAClC,OAAO,CAAC,yBAAyB,CAAC,CA2GpC"}
|
|
@@ -5,6 +5,7 @@ import { chmod, lstat, mkdir, open, realpath, rename, rm } from "node:fs/promise
|
|
|
5
5
|
import { basename, isAbsolute, join, relative, resolve } from "node:path";
|
|
6
6
|
import { pipeline } from "node:stream/promises";
|
|
7
7
|
import { createGzip } from "node:zlib";
|
|
8
|
+
import { stateDirMode, stateFileMode } from "../../../storage/modes.js";
|
|
8
9
|
import { canonicalJsonV3 } from "../canonical.js";
|
|
9
10
|
import { EVENT_V3_SUPPORT_FAMILIES, logicalEntriesDigestV3, normalizeEventV3SupportPath, validateEventV3SupportPackManifest, } from "./pack-contract.js";
|
|
10
11
|
/** Write a deterministic gzip-NDJSON support pack without buffering source files or the pack. */
|
|
@@ -44,8 +45,8 @@ export async function writeEventV3SupportPack(input) {
|
|
|
44
45
|
.digest("hex")
|
|
45
46
|
.slice(0, 32)}`;
|
|
46
47
|
const outputDirectory = resolve(input.output_directory);
|
|
47
|
-
await mkdir(outputDirectory, { recursive: true, mode:
|
|
48
|
-
await chmod(outputDirectory,
|
|
48
|
+
await mkdir(outputDirectory, { recursive: true, mode: stateDirMode() });
|
|
49
|
+
await chmod(outputDirectory, stateDirMode());
|
|
49
50
|
const payloadName = `${packId}.ndjson.gz`;
|
|
50
51
|
const payloadPath = join(outputDirectory, payloadName);
|
|
51
52
|
const manifestPath = join(outputDirectory, `${packId}.manifest.json`);
|
|
@@ -54,7 +55,7 @@ export async function writeEventV3SupportPack(input) {
|
|
|
54
55
|
await rejectExisting([payloadPath, manifestPath, payloadPartial, manifestPartial]);
|
|
55
56
|
try {
|
|
56
57
|
await streamPayload(inspected, payloadPartial, authorityReal);
|
|
57
|
-
await chmod(payloadPartial,
|
|
58
|
+
await chmod(payloadPartial, stateFileMode());
|
|
58
59
|
await rename(payloadPartial, payloadPath);
|
|
59
60
|
const payload = await inspectRegularFile(payloadPath);
|
|
60
61
|
const manifest = validateEventV3SupportPackManifest({
|
|
@@ -88,7 +89,7 @@ export async function writeEventV3SupportPack(input) {
|
|
|
88
89
|
minimum_harnery_version: input.minimum_harnery_version,
|
|
89
90
|
created_at: input.created_at,
|
|
90
91
|
});
|
|
91
|
-
const handle = await open(manifestPartial, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL,
|
|
92
|
+
const handle = await open(manifestPartial, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL, stateFileMode());
|
|
92
93
|
try {
|
|
93
94
|
await handle.writeFile(`${canonicalJsonV3(manifest)}\n`, "utf8");
|
|
94
95
|
await handle.sync();
|
|
@@ -109,7 +110,7 @@ export async function writeEventV3SupportPack(input) {
|
|
|
109
110
|
}
|
|
110
111
|
async function streamPayload(entries, destination, authorityReal) {
|
|
111
112
|
const gzip = createGzip({ level: 9 });
|
|
112
|
-
const output = createWriteStream(destination, { flags: "wx", mode:
|
|
113
|
+
const output = createWriteStream(destination, { flags: "wx", mode: stateFileMode() });
|
|
113
114
|
const completed = pipeline(gzip, output);
|
|
114
115
|
try {
|
|
115
116
|
for (const entry of entries) {
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ParsedPayload } from "../../hooks/adapter/parse.js";
|
|
2
|
+
export interface LineChanges {
|
|
3
|
+
added: number;
|
|
4
|
+
removed: number;
|
|
5
|
+
}
|
|
6
|
+
/** Proposed edit counts, captured before execution; publish only on success. */
|
|
7
|
+
export declare function prepareToolLineChanges(payload: ParsedPayload, cwd: string): LineChanges | undefined;
|
|
8
|
+
//# sourceMappingURL=tool-line-changes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-line-changes.d.ts","sourceRoot":"","sources":["../../../../src/core/events/v3/tool-line-changes.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAGlE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAyDD,gFAAgF;AAChF,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE,MAAM,GACV,WAAW,GAAG,SAAS,CAmEzB"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { mkdtempSync, readFileSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join, resolve } from "node:path";
|
|
5
|
+
import { stateFileMode } from "../../storage/modes.js";
|
|
6
|
+
// Unknown tools remain unmeasured: a shell, script, or connector can write files.
|
|
7
|
+
const READ_TOOLS = new Set(["Read", "Glob", "Grep", "LS", "view_image"]);
|
|
8
|
+
const MAX_BYTES = 2 * 1024 * 1024;
|
|
9
|
+
function object(value) {
|
|
10
|
+
if (typeof value === "string") {
|
|
11
|
+
try {
|
|
12
|
+
return object(JSON.parse(value));
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return value && typeof value === "object" && !Array.isArray(value)
|
|
19
|
+
? value
|
|
20
|
+
: undefined;
|
|
21
|
+
}
|
|
22
|
+
function lineCount(text) {
|
|
23
|
+
return text === "" ? 0 : text.split("\n").length - (text.endsWith("\n") ? 1 : 0);
|
|
24
|
+
}
|
|
25
|
+
function readText(path) {
|
|
26
|
+
if (statSync(path).size > MAX_BYTES)
|
|
27
|
+
throw new Error("unmeasured file");
|
|
28
|
+
const bytes = readFileSync(path);
|
|
29
|
+
if (bytes.length > MAX_BYTES || bytes.includes(0))
|
|
30
|
+
throw new Error("unmeasured file");
|
|
31
|
+
return bytes.toString("utf8");
|
|
32
|
+
}
|
|
33
|
+
/** Use Git's line semantics without retaining file contents in producer state. */
|
|
34
|
+
function compare(before, after) {
|
|
35
|
+
if (Buffer.byteLength(after) > MAX_BYTES || after.includes("\0"))
|
|
36
|
+
return;
|
|
37
|
+
if (before === after)
|
|
38
|
+
return { added: 0, removed: 0 };
|
|
39
|
+
const directory = mkdtempSync(join(tmpdir(), "harnery-lines-"));
|
|
40
|
+
try {
|
|
41
|
+
const oldPath = join(directory, "before");
|
|
42
|
+
const newPath = join(directory, "after");
|
|
43
|
+
writeFileSync(oldPath, before, { mode: stateFileMode() });
|
|
44
|
+
writeFileSync(newPath, after, { mode: stateFileMode() });
|
|
45
|
+
const result = spawnSync("git", ["diff", "--no-index", "--no-ext-diff", "--no-textconv", "--numstat", "--", oldPath, newPath], {
|
|
46
|
+
encoding: "utf8",
|
|
47
|
+
timeout: 2000,
|
|
48
|
+
maxBuffer: 4096,
|
|
49
|
+
});
|
|
50
|
+
if (result.status !== 0 && result.status !== 1)
|
|
51
|
+
return;
|
|
52
|
+
const match = /^(\d+)\t(\d+)\t/.exec(result.stdout);
|
|
53
|
+
return match ? { added: Number(match[1]), removed: Number(match[2]) } : undefined;
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
rmSync(directory, { recursive: true, force: true });
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/** Proposed edit counts, captured before execution; publish only on success. */
|
|
60
|
+
export function prepareToolLineChanges(payload, cwd) {
|
|
61
|
+
try {
|
|
62
|
+
const name = payload.tool_name ?? "";
|
|
63
|
+
if (READ_TOOLS.has(name))
|
|
64
|
+
return { added: 0, removed: 0 };
|
|
65
|
+
const input = object(payload.tool_input);
|
|
66
|
+
if (name === "apply_patch") {
|
|
67
|
+
const patch = typeof payload.tool_input === "string" && payload.tool_input.startsWith("*** Begin Patch")
|
|
68
|
+
? payload.tool_input
|
|
69
|
+
: (input?.patch ?? input?.input ?? input?.command);
|
|
70
|
+
if (typeof patch !== "string" ||
|
|
71
|
+
!patch.startsWith("*** Begin Patch\n") ||
|
|
72
|
+
!patch.includes("*** End Patch"))
|
|
73
|
+
return;
|
|
74
|
+
let added = 0;
|
|
75
|
+
let removed = 0;
|
|
76
|
+
let inFile = false;
|
|
77
|
+
for (const line of patch.split("\n")) {
|
|
78
|
+
if (line.startsWith("*** Delete File: ")) {
|
|
79
|
+
removed += lineCount(readText(resolve(cwd, line.slice(17))));
|
|
80
|
+
inFile = false;
|
|
81
|
+
}
|
|
82
|
+
else if (/^\*\*\* (?:Add|Update) File: /.test(line)) {
|
|
83
|
+
inFile = true;
|
|
84
|
+
}
|
|
85
|
+
else if (line === "*** End Patch") {
|
|
86
|
+
inFile = false;
|
|
87
|
+
}
|
|
88
|
+
else if (inFile && line.startsWith("+"))
|
|
89
|
+
added++;
|
|
90
|
+
else if (inFile && line.startsWith("-"))
|
|
91
|
+
removed++;
|
|
92
|
+
}
|
|
93
|
+
return { added, removed };
|
|
94
|
+
}
|
|
95
|
+
if (!["Write", "Edit", "StrReplace", "MultiEdit"].includes(name) || !input)
|
|
96
|
+
return;
|
|
97
|
+
const path = input.file_path ?? input.path;
|
|
98
|
+
if (typeof path !== "string")
|
|
99
|
+
return;
|
|
100
|
+
let before;
|
|
101
|
+
try {
|
|
102
|
+
before = readText(resolve(cwd, path));
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
if (name !== "Write" || error.code !== "ENOENT")
|
|
106
|
+
return;
|
|
107
|
+
before = "";
|
|
108
|
+
}
|
|
109
|
+
if (name === "Write")
|
|
110
|
+
return typeof input.content === "string" ? compare(before, input.content) : undefined;
|
|
111
|
+
let after = before;
|
|
112
|
+
const edits = name === "MultiEdit" ? input.edits : [input];
|
|
113
|
+
if (!Array.isArray(edits))
|
|
114
|
+
return;
|
|
115
|
+
for (const entry of edits) {
|
|
116
|
+
const edit = object(entry);
|
|
117
|
+
if (!edit ||
|
|
118
|
+
typeof edit.old_string !== "string" ||
|
|
119
|
+
typeof edit.new_string !== "string" ||
|
|
120
|
+
!edit.old_string)
|
|
121
|
+
return;
|
|
122
|
+
const occurrences = after.split(edit.old_string).length - 1;
|
|
123
|
+
if (occurrences === 0 || (occurrences > 1 && edit.replace_all !== true))
|
|
124
|
+
return;
|
|
125
|
+
after =
|
|
126
|
+
edit.replace_all === true
|
|
127
|
+
? after.split(edit.old_string).join(edit.new_string)
|
|
128
|
+
: after.replace(edit.old_string, () => edit.new_string);
|
|
129
|
+
}
|
|
130
|
+
return compare(before, after);
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../../../src/core/events/v3/writer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../../../src/core/events/v3/writer.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAa7C,eAAO,MAAM,6BAA6B,EAAG,qBAA8B,CAAC;AAE5E,MAAM,MAAM,sBAAsB,GAAG,WAAW,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,sBAAsB,GAAG,gBAAgB,CAAC;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,UAAU,MAAM,EAAE,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,kBAAkB,CAAC;CACtC;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;;;OAQG;IACH,iBAAiB,CAAC,EAAE,OAAO,MAAM,EAAE,CAAC;IACpC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7D;AAED,MAAM,MAAM,gBAAgB,GACxB,oBAAoB,GACpB,iBAAiB,GACjB,sBAAsB,GACtB,qBAAqB,GACrB,oBAAoB,GACpB,mBAAmB,GACnB,iBAAiB,CAAC;AAEtB;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,mBAAwB,GAChC,kBAAkB,CAoDpB;AAED,sEAAsE;AACtE,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,MAAM,CAK/F;AAED,wBAAgB,sBAAsB,CAAC,CAAC,EACtC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,mBAAmB,EAC5B,SAAS,EAAE,MAAM,CAAC,GACjB,CAAC,CAoBH;AAED,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,EACtC,OAAO,GAAE,mBAAwB,GAChC,MAAM,CA4DR;AAkID,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM;;;;;;;;;;EAc7C;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM;;;;;;;;;;EA8BpD"}
|
|
@@ -2,6 +2,7 @@ import { createHash, randomUUID } from "node:crypto";
|
|
|
2
2
|
import { chmodSync, closeSync, existsSync, fsyncSync, lstatSync, mkdirSync, openSync, readdirSync, readFileSync, readSync, renameSync, statSync, truncateSync, unlinkSync, writeFileSync, writeSync, } from "node:fs";
|
|
3
3
|
import { hostname } from "node:os";
|
|
4
4
|
import { join, resolve } from "node:path";
|
|
5
|
+
import { stateDirMode, stateFileMode, stateModeTooOpen } from "../../storage/modes.js";
|
|
5
6
|
import { fsyncParentDirectory } from "../../workflow/durable-record.js";
|
|
6
7
|
import { acquireNoClobberLease } from "../../workflow/workspaces/leases.js";
|
|
7
8
|
import { canonicalJsonV3, sha256V3 } from "./canonical.js";
|
|
@@ -129,7 +130,7 @@ export function drainReadyEventsUnderLeaseV3(paths, options = {}) {
|
|
|
129
130
|
}), checkpoint?.genesis_id ? checkpoint : undefined);
|
|
130
131
|
if (readyRows.length === 0)
|
|
131
132
|
return 0;
|
|
132
|
-
const activeFd = openSync(paths.active, "a",
|
|
133
|
+
const activeFd = openSync(paths.active, "a", stateFileMode());
|
|
133
134
|
let committed = 0;
|
|
134
135
|
try {
|
|
135
136
|
for (const { readyName, readyPath, row } of readyRows) {
|
|
@@ -285,13 +286,13 @@ export function ensureEventV3Layout(coordRoot) {
|
|
|
285
286
|
paths.segments,
|
|
286
287
|
paths.authorityOutbox,
|
|
287
288
|
]) {
|
|
288
|
-
mkdirSync(path, { recursive: true, mode:
|
|
289
|
-
chmodSync(path,
|
|
289
|
+
mkdirSync(path, { recursive: true, mode: stateDirMode() });
|
|
290
|
+
chmodSync(path, stateDirMode());
|
|
290
291
|
}
|
|
291
292
|
if (!existsSync(paths.active)) {
|
|
292
293
|
let fd;
|
|
293
294
|
try {
|
|
294
|
-
fd = openSync(paths.active, "wx",
|
|
295
|
+
fd = openSync(paths.active, "wx", stateFileMode());
|
|
295
296
|
fsyncSync(fd);
|
|
296
297
|
fsyncParentDirectory(paths.active);
|
|
297
298
|
}
|
|
@@ -305,8 +306,8 @@ export function ensureEventV3Layout(coordRoot) {
|
|
|
305
306
|
}
|
|
306
307
|
}
|
|
307
308
|
const active = lstatSync(paths.active);
|
|
308
|
-
if (!active.isFile() || active.isSymbolicLink() || (active.mode
|
|
309
|
-
throw new Error("active V3 ledger must be
|
|
309
|
+
if (!active.isFile() || active.isSymbolicLink() || stateModeTooOpen(active.mode)) {
|
|
310
|
+
throw new Error("active V3 ledger must be a regular file closed to other users");
|
|
310
311
|
}
|
|
311
312
|
return paths;
|
|
312
313
|
}
|
|
@@ -314,7 +315,7 @@ function writeReadyRecord(spool, readyPath, row, eventId, onStep) {
|
|
|
314
315
|
const temporary = join(spool, `.tmp-${process.pid}-${randomUUID()}`);
|
|
315
316
|
let fd;
|
|
316
317
|
try {
|
|
317
|
-
fd = openSync(temporary, "wx",
|
|
318
|
+
fd = openSync(temporary, "wx", stateFileMode());
|
|
318
319
|
writeFileSync(fd, row, "utf8");
|
|
319
320
|
fsyncSync(fd);
|
|
320
321
|
onStep?.("ready_temp_flushed", eventId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"planning.d.ts","sourceRoot":"","sources":["../../../src/core/governor/planning.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"planning.d.ts","sourceRoot":"","sources":["../../../src/core/governor/planning.ts"],"names":[],"mappings":"AAeA,OAAO,EAEL,KAAK,UAAU,EAQhB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAIL,KAAK,mBAAmB,EAUzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAYjD,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,WAAW,GAAG,OAAO,GAAG,aAAa,GAAG,aAAa,CAAC,CAAC;IAChF,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,mBAAmB,CAAC,CAsM9B;AAkMD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,mBAAmB,CAkHtB;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,mBAAmB,CAYtB;AAED;;;;;;;;gEAQgE;AAChE,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,mBAAmB,CAoBtB;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,mBAAmB,CA4CtB"}
|
|
@@ -2,6 +2,7 @@ import { createHash, randomBytes, randomUUID } from "node:crypto";
|
|
|
2
2
|
import { chmodSync, existsSync, linkSync, mkdirSync, readFileSync, statSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
3
3
|
import { dirname, join, resolve } from "node:path";
|
|
4
4
|
import { appendSegmentedJsonlFile } from "../storage/durable-history.js";
|
|
5
|
+
import { stateDirMode, stateFileMode } from "../storage/modes.js";
|
|
5
6
|
import { createWorkItem, readWorkItem } from "../work/index.js";
|
|
6
7
|
import { digestResult, readWorkflowProof, runWorkflow, WorkflowParkedError, workflowScriptDigest, } from "../workflow/index.js";
|
|
7
8
|
import { readGovernorPlan, readGovernorPlanReviewReceipt, readGovernorPlans } from "./plan-read.js";
|
|
@@ -512,8 +513,8 @@ function createPlanRequest(coordRoot, record, sequence, triggerFingerprint, trig
|
|
|
512
513
|
};
|
|
513
514
|
const script = plannerScript(coordRoot, record, planId, trigger);
|
|
514
515
|
const dir = planDir(coordRoot, record.intent.id, planId);
|
|
515
|
-
mkdirSync(dir, { recursive: true, mode:
|
|
516
|
-
chmodSync(dir,
|
|
516
|
+
mkdirSync(dir, { recursive: true, mode: stateDirMode() });
|
|
517
|
+
chmodSync(dir, stateDirMode());
|
|
517
518
|
writeExclusiveJson(join(dir, "request.json"), request, "governor plan request");
|
|
518
519
|
writeExclusive(join(dir, "planner.mjs"), script, "governor planner script");
|
|
519
520
|
return request;
|
|
@@ -1282,10 +1283,10 @@ function writeExclusive(path, body, label) {
|
|
|
1282
1283
|
if (Buffer.byteLength(body) > MAX_RECORD_BYTES) {
|
|
1283
1284
|
throw new Error(`${label} exceeds ${MAX_RECORD_BYTES} bytes`);
|
|
1284
1285
|
}
|
|
1285
|
-
mkdirSync(dirname(path), { recursive: true, mode:
|
|
1286
|
+
mkdirSync(dirname(path), { recursive: true, mode: stateDirMode() });
|
|
1286
1287
|
const temporary = `${path}.tmp-${process.pid}-${randomUUID()}`;
|
|
1287
1288
|
try {
|
|
1288
|
-
writeFileSync(temporary, body, { encoding: "utf8", flag: "wx", mode:
|
|
1289
|
+
writeFileSync(temporary, body, { encoding: "utf8", flag: "wx", mode: stateFileMode() });
|
|
1289
1290
|
try {
|
|
1290
1291
|
linkSync(temporary, path);
|
|
1291
1292
|
}
|
|
@@ -1296,7 +1297,7 @@ function writeExclusive(path, body, label) {
|
|
|
1296
1297
|
if (existing !== body)
|
|
1297
1298
|
throw new Error(`${label} already exists with different content`);
|
|
1298
1299
|
}
|
|
1299
|
-
chmodSync(path,
|
|
1300
|
+
chmodSync(path, stateFileMode());
|
|
1300
1301
|
}
|
|
1301
1302
|
finally {
|
|
1302
1303
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/core/governor/service.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,KAAK,gBAAgB,EAAmB,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/core/governor/service.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,KAAK,gBAAgB,EAAmB,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAIlG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,kBAAkB,EAAe,MAAM,aAAa,CAAC;AAC3F,OAAO,EAAE,KAAK,cAAc,EAAgB,MAAM,YAAY,CAAC;AAE/D,eAAO,MAAM,sCAAsC,EAAG,CAAU,CAAC;AACjE,eAAO,MAAM,uCAAuC,EAAG,CAAU,CAAC;AAClE,eAAO,MAAM,sCAAsC,EAAG,CAAU,CAAC;AAOjE,MAAM,WAAW,2BAA2B;IAC1C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,OAAO,CAAC;IAC3B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IACpC,cAAc,EAAE,OAAO,sCAAsC,CAAC;IAC9D,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,MAAM,EAAE,2BAA2B,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,6BAA6B;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC,2BAA2B,CAAC,CAAC;CAC/C;AAED,MAAM,MAAM,wBAAwB,GAAG,MAAM,GAAG,SAAS,GAAG,iBAAiB,CAAC;AAE9E,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,wBAAwB,CAAC;IAChC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,kBAAkB,CAAC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,OAAO,uCAAuC,CAAC;IAC/D,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;CACnD;AAED,MAAM,MAAM,2BAA2B,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;AAE1F,MAAM,WAAW,2BAA2B;IAC1C,cAAc,EAAE,OAAO,sCAAsC,CAAC;IAC9D,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,2BAA2B,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,2BAA2B,CAAC;IACrC,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B,OAAO,CAAC,EAAE,sBAAsB,CAAC;CAClC;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,2BAA2B,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,4BAA4B;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,MAAM,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,WAAW,GAAG,aAAa,GAAG,aAAa,CAAC,CAAC;IACvF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,cAAc,CAAC;IACjE,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACzD,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,6BAA6B;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,WAAW,GAAG,aAAa,GAAG,aAAa,CAAC,CAAC;IACtF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AASD,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,6BAA6B,GACnC,qBAAqB,CAiDvB;AAED,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,qBAAqB,CAQrF;AAED,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,MAAM,GACnB,sBAAsB,GAAG,SAAS,CAkBpC;AAED,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,qBAAqB,CAkBrF;AAED,wBAAsB,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAyC/F;AAED,wBAAgB,0BAA0B,CAAC,YAAY,EAAE,MAAM,GAAG,qBAAqB,CAgBtF;AAED,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,4BAA4B,GAClC,OAAO,CAAC,0BAA0B,CAAC,CAwIrC;AAED,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,6BAA6B,GACnC,OAAO,CAAC,2BAA2B,CAAC,CA6GtC;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAKhE;AAiPD,wBAAgB,+BAA+B,CAC7C,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,QAAQ,GAAG,QAAQ,CAgBrB"}
|
|
@@ -6,6 +6,7 @@ import { dirname, join, resolve } from "node:path";
|
|
|
6
6
|
import { coordEnv } from "../../lib/env.js";
|
|
7
7
|
import { normalizePolicy } from "../policy/index.js";
|
|
8
8
|
import { closeProcessLoggers, legacyLogFields, processLogger } from "../storage/logger.js";
|
|
9
|
+
import { stateDirMode, stateFileMode } from "../storage/modes.js";
|
|
9
10
|
import { RotatingTextSink } from "../storage/process-log.js";
|
|
10
11
|
import { runGovernor } from "./runner.js";
|
|
11
12
|
import { readGovernor } from "./state.js";
|
|
@@ -46,8 +47,8 @@ export function configureGovernorService(input) {
|
|
|
46
47
|
created_at: new Date().toISOString(),
|
|
47
48
|
};
|
|
48
49
|
const dir = serviceDir(coordRoot);
|
|
49
|
-
mkdirSync(dir, { recursive: true, mode:
|
|
50
|
-
chmodSync(dir,
|
|
50
|
+
mkdirSync(dir, { recursive: true, mode: stateDirMode() });
|
|
51
|
+
chmodSync(dir, stateDirMode());
|
|
51
52
|
writePrivateJsonAtomic(serviceConfigPath(coordRoot), config);
|
|
52
53
|
return readGovernorServiceConfig(coordRoot);
|
|
53
54
|
}
|
|
@@ -101,11 +102,11 @@ export async function spawnGovernorService(coordRootRaw) {
|
|
|
101
102
|
if (current.running) {
|
|
102
103
|
throw new Error(`governor service is already running under pid ${current.record?.pid}`);
|
|
103
104
|
}
|
|
104
|
-
mkdirSync(serviceDir(coordRoot), { recursive: true, mode:
|
|
105
|
+
mkdirSync(serviceDir(coordRoot), { recursive: true, mode: stateDirMode() });
|
|
105
106
|
const sharedLogs = coordEnv("SHARED_LOGS") !== "0";
|
|
106
|
-
const logFd = sharedLogs ? undefined : openSync(serviceLogPath(coordRoot), "a",
|
|
107
|
+
const logFd = sharedLogs ? undefined : openSync(serviceLogPath(coordRoot), "a", stateFileMode());
|
|
107
108
|
if (logFd !== undefined)
|
|
108
|
-
chmodSync(serviceLogPath(coordRoot),
|
|
109
|
+
chmodSync(serviceLogPath(coordRoot), stateFileMode());
|
|
109
110
|
const harnBin = new URL("../../../bin/harn", import.meta.url).pathname;
|
|
110
111
|
if (!existsSync(harnBin)) {
|
|
111
112
|
if (logFd !== undefined)
|
|
@@ -510,7 +511,7 @@ function normalizeIsolation(value) {
|
|
|
510
511
|
}
|
|
511
512
|
function acquireServiceLease(coordRoot) {
|
|
512
513
|
const path = serviceLeasePath(coordRoot);
|
|
513
|
-
mkdirSync(dirname(path), { recursive: true, mode:
|
|
514
|
+
mkdirSync(dirname(path), { recursive: true, mode: stateDirMode() });
|
|
514
515
|
const owner = {
|
|
515
516
|
pid: process.pid,
|
|
516
517
|
host: hostname(),
|
|
@@ -519,7 +520,7 @@ function acquireServiceLease(coordRoot) {
|
|
|
519
520
|
};
|
|
520
521
|
const acquire = () => {
|
|
521
522
|
try {
|
|
522
|
-
const fd = openSync(path, "wx",
|
|
523
|
+
const fd = openSync(path, "wx", stateFileMode());
|
|
523
524
|
try {
|
|
524
525
|
writeFileSync(fd, `${JSON.stringify(owner)}\n`, "utf8");
|
|
525
526
|
}
|
|
@@ -666,12 +667,12 @@ function writePrivateJsonAtomic(path, value) {
|
|
|
666
667
|
if (Buffer.byteLength(body) > MAX_FILE_BYTES) {
|
|
667
668
|
throw new Error(`governor service file exceeds ${MAX_FILE_BYTES} bytes`);
|
|
668
669
|
}
|
|
669
|
-
mkdirSync(dirname(path), { recursive: true, mode:
|
|
670
|
-
chmodSync(dirname(path),
|
|
670
|
+
mkdirSync(dirname(path), { recursive: true, mode: stateDirMode() });
|
|
671
|
+
chmodSync(dirname(path), stateDirMode());
|
|
671
672
|
const temporary = `${path}.tmp-${process.pid}-${randomBytes(4).toString("hex")}`;
|
|
672
|
-
writeFileSync(temporary, body, { encoding: "utf8", flag: "wx", mode:
|
|
673
|
+
writeFileSync(temporary, body, { encoding: "utf8", flag: "wx", mode: stateFileMode() });
|
|
673
674
|
renameSync(temporary, path);
|
|
674
|
-
chmodSync(path,
|
|
675
|
+
chmodSync(path, stateFileMode());
|
|
675
676
|
}
|
|
676
677
|
function serviceDir(coordRoot) {
|
|
677
678
|
return join(resolve(coordRoot), ".harnery", "governor-service");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/core/governor/state.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/core/governor/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { randomBytes, randomUUID } from "node:crypto";
|
|
|
2
2
|
import { chmodSync, closeSync, existsSync, mkdirSync, openSync, readdirSync, readFileSync, statSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
3
3
|
import { hostname } from "node:os";
|
|
4
4
|
import { dirname, isAbsolute, join, resolve } from "node:path";
|
|
5
|
+
import { stateDirMode, stateFileMode } from "../storage/modes.js";
|
|
5
6
|
import { assertWorkId, readWorkItem } from "../work/read.js";
|
|
6
7
|
import { workflowScriptDigest } from "../workflow/run-state.js";
|
|
7
8
|
import { normalizeWorkflowSpecialists } from "../workflow/specialists.js";
|
|
@@ -68,8 +69,8 @@ export function createGovernor(input) {
|
|
|
68
69
|
created_at: new Date().toISOString(),
|
|
69
70
|
};
|
|
70
71
|
const path = governorIntentPath(coordRoot, id);
|
|
71
|
-
mkdirSync(dirname(path), { recursive: true, mode:
|
|
72
|
-
chmodSync(dirname(path),
|
|
72
|
+
mkdirSync(dirname(path), { recursive: true, mode: stateDirMode() });
|
|
73
|
+
chmodSync(dirname(path), stateDirMode());
|
|
73
74
|
writePrivateJson(path, intent);
|
|
74
75
|
return readGovernor(coordRoot, id);
|
|
75
76
|
}
|
|
@@ -143,14 +144,14 @@ export function acquireGovernorLease(coordRoot, goalId) {
|
|
|
143
144
|
};
|
|
144
145
|
const acquire = () => {
|
|
145
146
|
try {
|
|
146
|
-
const fd = openSync(path, "wx",
|
|
147
|
+
const fd = openSync(path, "wx", stateFileMode());
|
|
147
148
|
try {
|
|
148
149
|
writeFileSync(fd, `${JSON.stringify(owner)}\n`, "utf8");
|
|
149
150
|
}
|
|
150
151
|
finally {
|
|
151
152
|
closeSync(fd);
|
|
152
153
|
}
|
|
153
|
-
chmodSync(path,
|
|
154
|
+
chmodSync(path, stateFileMode());
|
|
154
155
|
return true;
|
|
155
156
|
}
|
|
156
157
|
catch (error) {
|
|
@@ -946,8 +947,8 @@ function writePrivateJson(path, value) {
|
|
|
946
947
|
if (Buffer.byteLength(body) > MAX_INTENT_BYTES) {
|
|
947
948
|
throw new Error(`governor intent exceeds ${MAX_INTENT_BYTES} bytes`);
|
|
948
949
|
}
|
|
949
|
-
writeFileSync(path, body, { encoding: "utf8", flag: "wx", mode:
|
|
950
|
-
chmodSync(path,
|
|
950
|
+
writeFileSync(path, body, { encoding: "utf8", flag: "wx", mode: stateFileMode() });
|
|
951
|
+
chmodSync(path, stateFileMode());
|
|
951
952
|
}
|
|
952
953
|
function bounded(value, field, max) {
|
|
953
954
|
if (typeof value !== "string")
|
|
@@ -145,6 +145,7 @@ function attestedContextSource(adapter, source, confidence) {
|
|
|
145
145
|
"claude-code": ["hook", "native_event", "result"],
|
|
146
146
|
codex: ["native_event", "result", "transcript"],
|
|
147
147
|
cursor: ["native_event"],
|
|
148
|
+
opencode: ["native_event", "result"],
|
|
148
149
|
};
|
|
149
150
|
return !!source && (allowed[adapter] ?? []).includes(source);
|
|
150
151
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/core/guard/storage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/core/guard/storage.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,MAAM,WAAW,WAAW;IAC1B,cAAc,EAAE,CAAC,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,kBAAkB,GAAG,IAAI,CAE3B;AAED,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,IAAiB,GACrB,kBAAkB,GAAG,IAAI,CAG3B;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAErE;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAI5F;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,kBAAkB,EAC5B,KAAK,EAAE,MAAM,GACZ,IAAI,CAIN;AAED,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,IAAI,EACT,YAAY,EAAE,MAAM,GACnB,cAAc,GAAG,IAAI,CAoBvB;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAK7E;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAQ5E;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAcpF;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,EACb,YAAY,CAAC,EAAE,MAAM,OAAO,GAC3B,IAAI,CAaN"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
2
|
import { closeSync, existsSync, mkdirSync, openSync, readdirSync, readFileSync, renameSync, statSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
3
3
|
import { dirname, join } from "node:path";
|
|
4
|
+
import { stateFileMode } from "../storage/modes.js";
|
|
4
5
|
export function guardDir(coordRoot) {
|
|
5
6
|
return join(coordRoot, ".harnery", "guard");
|
|
6
7
|
}
|
|
@@ -86,7 +87,7 @@ export function writeAtomicJson(path, value, nonce, beforeRename) {
|
|
|
86
87
|
try {
|
|
87
88
|
writeFileSync(temporary, `${JSON.stringify(value, null, 2)}\n`, {
|
|
88
89
|
encoding: "utf8",
|
|
89
|
-
mode:
|
|
90
|
+
mode: stateFileMode(),
|
|
90
91
|
});
|
|
91
92
|
if (beforeRename && !beforeRename())
|
|
92
93
|
throw new Error("run_quality_lock_stolen");
|
|
@@ -100,7 +101,7 @@ export function writeAtomicJson(path, value, nonce, beforeRename) {
|
|
|
100
101
|
function createExclusive(path, value) {
|
|
101
102
|
let fd;
|
|
102
103
|
try {
|
|
103
|
-
fd = openSync(path, "wx",
|
|
104
|
+
fd = openSync(path, "wx", stateFileMode());
|
|
104
105
|
writeFileSync(fd, `${JSON.stringify(value)}\n`, "utf8");
|
|
105
106
|
return true;
|
|
106
107
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../../../../src/core/hooks/adapter/behaviors/claude-code.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,gFAAgF;AAChF,eAAO,MAAM,kBAAkB,EAAE,eA6BhC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/** Claude Code: the reference adapter; host-default labels, full effect set. */
|
|
2
|
+
export const claudeCodeBehavior = {
|
|
3
|
+
id: "claude-code",
|
|
4
|
+
sessionStartPlatformLabel: undefined,
|
|
5
|
+
soundEffects: true,
|
|
6
|
+
journalMaintenance: true,
|
|
7
|
+
sessionTelemetrySync: true,
|
|
8
|
+
promptPresenceDetection: true,
|
|
9
|
+
promptContextNudges: {
|
|
10
|
+
taskNudge: false,
|
|
11
|
+
hostPromptReminder: false,
|
|
12
|
+
statusFooterNudge: false,
|
|
13
|
+
turnRitualNudge: "claude-code",
|
|
14
|
+
},
|
|
15
|
+
completedResponseEvent: undefined,
|
|
16
|
+
sessionIdentityOnStartOnly: false,
|
|
17
|
+
nativeTurnIdOptional: false,
|
|
18
|
+
tracksExecutionMode: false,
|
|
19
|
+
shellOperationDedup: false,
|
|
20
|
+
promptMayPrecedeSessionStart: false,
|
|
21
|
+
promptContinuesOpenTurn: false,
|
|
22
|
+
turnRecovery: true,
|
|
23
|
+
nativeTelemetryOnly: false,
|
|
24
|
+
runtimeContextTranscriptOptional: false,
|
|
25
|
+
runtimeContextRetry: false,
|
|
26
|
+
effortAttestation: "payload",
|
|
27
|
+
transcriptTuningRefresh: true,
|
|
28
|
+
modelProvider: "anthropic",
|
|
29
|
+
runtimeContextAvailable: () => true,
|
|
30
|
+
bridgeFor: () => undefined,
|
|
31
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ParsedPayload } from "../parse.js";
|
|
2
|
+
import type { AdapterBehavior } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Privacy-safe environment and recovery provenance for Codex mid-flight
|
|
5
|
+
* onboarding. WSLENV values are never recorded, only normalized variable
|
|
6
|
+
* names, and the native session identifier itself remains fingerprinted.
|
|
7
|
+
*/
|
|
8
|
+
export declare function codexMidFlightDiagnosticContext(payload: ParsedPayload, env?: NodeJS.ProcessEnv): Record<string, string | boolean>;
|
|
9
|
+
/**
|
|
10
|
+
* Codex: hook payloads omit `transcript_path`, so the rollout is discovered by
|
|
11
|
+
* session id; effort is probed from the rollout; a Windows-native Codex over a
|
|
12
|
+
* WSL UNC workspace is the one bridged deployment Harnery knows about.
|
|
13
|
+
*/
|
|
14
|
+
export declare const codexBehavior: AdapterBehavior;
|
|
15
|
+
//# sourceMappingURL=codex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../../../src/core/hooks/adapter/behaviors/codex.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,aAAa,EACtB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CA0BlC;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,eA0C3B,CAAC"}
|