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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"durable-history.d.ts","sourceRoot":"","sources":["../../../src/core/storage/durable-history.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"durable-history.d.ts","sourceRoot":"","sources":["../../../src/core/storage/durable-history.ts"],"names":[],"mappings":"AAwBA,eAAO,MAAM,8BAA8B,EAAG,4BAAqC,CAAC;AAEpF,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,2BAA2B,KAAK,IAAI,CAAC;IACxD,wEAAwE;IACxE,UAAU,CAAC,EAAE,uBAAuB,CAAC;CACtC;AAED,MAAM,MAAM,uBAAuB,GAAG,CACpC,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,KACX,MAAM,CAAC;AAEZ,MAAM,MAAM,2BAA2B,GACnC,sBAAsB,GACtB,eAAe,GACf,0BAA0B,GAC1B,yBAAyB,GACzB,uBAAuB,CAAC;AAE5B,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,OAAO,8BAA8B,CAAC;IAC9C,OAAO,EAAE,QAAQ,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,IAAI,CAAC;CACd;AAED,MAAM,WAAW,yBAAyB;IACxC,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IAC5B,MAAM,EAAE,CAAC,CAAC;CACX;AAED,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,qBAAqB,GAC7B,2BAA2B,CA+B7B;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,EACf,cAAc,EAAE,MAAM,EACtB,KAAK,CAAC,EAAE,qBAAqB,CAAC,OAAO,CAAC,GACrC,MAAM,CAQR;AAED,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,qBAAqB,GAC7B,2BAA2B,CA8B7B;AAED,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,CAAC,EAC3C,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,yBAAyB,EAClC,MAAM,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,KAAK,oBAAoB,CAAC,CAAC,CAAC,EAC1D,KAAK,CAAC,EAAE,qBAAqB,CAAC,OAAO,CAAC,GACrC,CAAC,CAcH;AAED,wBAAuB,oBAAoB,CAAC,CAAC,EAC3C,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,yBAAyB,GACjC,cAAc,CAAC,CAAC,CAAC,CAYnB;AAED,wBAAgB,sBAAsB,CAAC,CAAC,EACtC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,yBAAyB,GACjC,CAAC,EAAE,CAgBL;AAED,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,yBAAyB,GAAG,CAAC,EAAE,CAgB/F;AAED,wBAAgB,0BAA0B,CAAC,CAAC,EAC1C,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,yBAAyB,GACjC,CAAC,EAAE,CAwBL;AAED,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,SAAS,OAAO,EAAE,EAC3B,cAAc,EAAE,MAAM,EACtB,KAAK,CAAC,EAAE,qBAAqB,CAAC,OAAO,CAAC,GACrC,OAAO,CAAC,IAAI,CAAC,CA2Bf;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAqB/D"}
|
|
@@ -2,6 +2,7 @@ import { randomUUID } from "node:crypto";
|
|
|
2
2
|
import { closeSync, existsSync, constants as fsConstants, fstatSync, fsyncSync, lstatSync, mkdirSync, openSync, readdirSync, readFileSync, readSync, realpathSync, renameSync, rmSync, statSync, writeSync, } from "node:fs";
|
|
3
3
|
import { open, rename, rm } from "node:fs/promises";
|
|
4
4
|
import { basename, dirname, isAbsolute, join, relative } from "node:path";
|
|
5
|
+
import { stateDirMode, stateFileMode } from "./modes.js";
|
|
5
6
|
export const HARNERY_DURABLE_HISTORY_SCHEMA = "harnery.durable-history/v1";
|
|
6
7
|
export function appendDurableHistoryRecord(objectDir, record, options) {
|
|
7
8
|
validateOptions(options);
|
|
@@ -174,7 +175,7 @@ export async function rewriteCrashSafeJsonlFile(path, records, maxRecordBytes, f
|
|
|
174
175
|
rejectExistingSymlink(path);
|
|
175
176
|
const temp = `${path}.rewrite-${process.pid}`;
|
|
176
177
|
await withLeaseAsync(`${path}.lease`, async () => {
|
|
177
|
-
const handle = await open(temp, fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL | noFollowFlag(),
|
|
178
|
+
const handle = await open(temp, fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL | noFollowFlag(), stateFileMode());
|
|
178
179
|
try {
|
|
179
180
|
await writeAll(handle, Buffer.from(body, "utf8"));
|
|
180
181
|
await handle.sync();
|
|
@@ -220,7 +221,7 @@ export function durableHistoryPaths(objectDir) {
|
|
|
220
221
|
function appendAndSync(path, line, fault, writer = nativeWriteSync) {
|
|
221
222
|
const parent = captureDirectoryIdentity(dirname(path));
|
|
222
223
|
rejectExistingSymlink(path);
|
|
223
|
-
const fd = openSync(path, fsConstants.O_RDWR | fsConstants.O_APPEND | fsConstants.O_CREAT | noFollowFlag(),
|
|
224
|
+
const fd = openSync(path, fsConstants.O_RDWR | fsConstants.O_APPEND | fsConstants.O_CREAT | noFollowFlag(), stateFileMode());
|
|
224
225
|
try {
|
|
225
226
|
assertOpenFileIdentity(path, fd, parent);
|
|
226
227
|
assertCompleteTail(fd, path);
|
|
@@ -235,7 +236,7 @@ function appendAndSync(path, line, fault, writer = nativeWriteSync) {
|
|
|
235
236
|
}
|
|
236
237
|
}
|
|
237
238
|
function ensurePrivateDirectory(path) {
|
|
238
|
-
mkdirSync(path, { recursive: true, mode:
|
|
239
|
+
mkdirSync(path, { recursive: true, mode: stateDirMode() });
|
|
239
240
|
return captureDirectoryIdentity(path);
|
|
240
241
|
}
|
|
241
242
|
function regularFileBytes(path) {
|
|
@@ -395,7 +396,7 @@ function acquireLease(lease) {
|
|
|
395
396
|
};
|
|
396
397
|
let claimed;
|
|
397
398
|
try {
|
|
398
|
-
mkdirSync(lease, { mode:
|
|
399
|
+
mkdirSync(lease, { mode: stateDirMode() });
|
|
399
400
|
assertDirectoryWithinParent(lease, parent);
|
|
400
401
|
claimed = captureDirectoryIdentity(lease);
|
|
401
402
|
writeOwner(join(lease, "owner.json"), owner);
|
|
@@ -421,7 +422,7 @@ function acquireLease(lease) {
|
|
|
421
422
|
}
|
|
422
423
|
function writeOwner(path, owner) {
|
|
423
424
|
const parent = captureDirectoryIdentity(dirname(path));
|
|
424
|
-
const fd = openSync(path, fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL | noFollowFlag(),
|
|
425
|
+
const fd = openSync(path, fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL | noFollowFlag(), stateFileMode());
|
|
425
426
|
try {
|
|
426
427
|
assertOpenFileIdentity(path, fd, parent);
|
|
427
428
|
writeAllSync(fd, Buffer.from(`${JSON.stringify(owner)}\n`, "utf8"), nativeWriteSync);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"maintenance-providers.d.ts","sourceRoot":"","sources":["../../../src/core/storage/maintenance-providers.ts"],"names":[],"mappings":"AAGA,OAAO,EAAwB,KAAK,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAGhF,OAAO,EAEL,KAAK,iCAAiC,EACtC,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAGhC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"maintenance-providers.d.ts","sourceRoot":"","sources":["../../../src/core/storage/maintenance-providers.ts"],"names":[],"mappings":"AAGA,OAAO,EAAwB,KAAK,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAGhF,OAAO,EAEL,KAAK,iCAAiC,EACtC,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAGhC,MAAM,kBAAkB,CAAC;AAK1B,eAAO,MAAM,gCAAgC,EAAE,wBAI7C,CAAC;AAEH,MAAM,WAAW,2BAA2B;IAC1C,OAAO,IAAI,OAAO,CAAC;IACnB,MAAM,IAAI,OAAO,CAAC;IAClB,SAAS,IAAI,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,+BAA+B;IAC9C,OAAO,EAAE,qBAAqB,CAAC;IAC/B,SAAS,EAAE,SAAS,0BAA0B,EAAE,CAAC;CAClD;AAED,wBAAgB,kCAAkC,CAChD,QAAQ,EAAE,2BAA2B,GACpC,SAAS,0BAA0B,EAAE,CAMvC;AAED,mFAAmF;AACnF,wBAAgB,uCAAuC,CACrD,OAAO,EAAE,qBAAqB,GAC7B,SAAS,0BAA0B,EAAE,CAYvC;AAED,wBAAgB,qCAAqC,CACnD,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,2BAA2B,GACpC,+BAA+B,CAMjC;AAED;;;;GAIG;AACH,wBAAsB,2BAA2B,CAC/C,WAAW,EAAE,+BAA+B,EAC5C,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,wBAAwB,CAAA;CAAO,GAC9D,OAAO,CAAC,iCAAiC,CAAC,CAS5C"}
|
|
@@ -5,6 +5,7 @@ import { createStorageCatalog } from "./catalog.js";
|
|
|
5
5
|
import { HARNERY_STRUCTURED_LOG_PROVIDER_ID } from "./contract.js";
|
|
6
6
|
import { createStructuredLogRetentionProvider } from "./log-retention.js";
|
|
7
7
|
import { HARNERY_MAINTENANCE_CURSOR_SCHEMA, readMaintenanceTransaction, runAutomaticMaintenanceSlice, } from "./maintenance.js";
|
|
8
|
+
import { stateFileMode } from "./modes.js";
|
|
8
9
|
const STALE_RUNNING_CLAIM_MS = 10 * 60 * 1_000;
|
|
9
10
|
export const SESSION_START_MAINTENANCE_BUDGET = Object.freeze({
|
|
10
11
|
max_duration_ms: 250,
|
|
@@ -133,7 +134,7 @@ function recoverInterruptedDailyClaim(coordRoot, now) {
|
|
|
133
134
|
}
|
|
134
135
|
function atomicCursor(path, cursor) {
|
|
135
136
|
const temporary = `${path}.tmp-${process.pid}-${randomUUID()}`;
|
|
136
|
-
writeFileSync(temporary, `${JSON.stringify(cursor, null, 2)}\n`, { mode:
|
|
137
|
+
writeFileSync(temporary, `${JSON.stringify(cursor, null, 2)}\n`, { mode: stateFileMode() });
|
|
137
138
|
renameSync(temporary, path);
|
|
138
139
|
}
|
|
139
140
|
function disabledResult() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"maintenance.d.ts","sourceRoot":"","sources":["../../../src/core/storage/maintenance.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"maintenance.d.ts","sourceRoot":"","sources":["../../../src/core/storage/maintenance.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import { appendFileSync, closeSync, existsSync, fsyncSync, lstatSync, mkdirSync,
|
|
|
3
3
|
import { basename, dirname, join, resolve } from "node:path";
|
|
4
4
|
import { acquireNoClobberLease } from "../workflow/workspaces/leases.js";
|
|
5
5
|
import { HARNERY_STRUCTURED_LOG_PROVIDER_ID, } from "./contract.js";
|
|
6
|
+
import { stateDirMode, stateFileMode } from "./modes.js";
|
|
6
7
|
export const HARNERY_MAINTENANCE_TRANSACTION_SCHEMA = "harnery.storage-maintenance-transaction/v1";
|
|
7
8
|
export const HARNERY_MAINTENANCE_RECEIPT_SCHEMA = "harnery.storage-maintenance-receipt/v1";
|
|
8
9
|
export const HARNERY_MAINTENANCE_CURSOR_SCHEMA = "harnery.storage-maintenance-cursor/v1";
|
|
@@ -413,7 +414,7 @@ function writeReceipt(coordRoot, transactionId, action, mutation, now) {
|
|
|
413
414
|
committed_at: now.toISOString(),
|
|
414
415
|
};
|
|
415
416
|
const path = receiptPath(coordRoot, transactionId, action.action_id);
|
|
416
|
-
mkdirSync(dirname(path), { recursive: true, mode:
|
|
417
|
+
mkdirSync(dirname(path), { recursive: true, mode: stateDirMode() });
|
|
417
418
|
writeExclusiveDurable(path, `${JSON.stringify(receipt, null, 2)}\n`);
|
|
418
419
|
}
|
|
419
420
|
function writeTransaction(coordRoot, transaction, replace) {
|
|
@@ -434,12 +435,12 @@ function updateTransaction(transaction, now, state, reasonCodes = transaction.re
|
|
|
434
435
|
}
|
|
435
436
|
function writeRunOutcome(coordRoot, transaction, now) {
|
|
436
437
|
const root = join(resolve(coordRoot), ".harnery", "logs", "storage-maintenance");
|
|
437
|
-
mkdirSync(root, { recursive: true, mode:
|
|
438
|
+
mkdirSync(root, { recursive: true, mode: stateDirMode() });
|
|
438
439
|
const active = join(root, "active.jsonl");
|
|
439
440
|
if (existsSync(active) && statSync(active).size > 1_048_576) {
|
|
440
441
|
renameSync(active, join(root, `sealed-${now.toISOString().replaceAll(/[:.]/g, "-")}.jsonl`));
|
|
441
442
|
}
|
|
442
|
-
appendFileSync(active, `${JSON.stringify({ ts: now.toISOString(), transaction_id: transaction.transaction_id, state: transaction.state, actions: transaction.actions.length, files: transaction.actions.reduce((n, action) => n + action.files, 0), bytes: transaction.actions.reduce((n, action) => n + action.bytes, 0), reason_codes: transaction.reason_codes })}\n`, { encoding: "utf8", mode:
|
|
443
|
+
appendFileSync(active, `${JSON.stringify({ ts: now.toISOString(), transaction_id: transaction.transaction_id, state: transaction.state, actions: transaction.actions.length, files: transaction.actions.reduce((n, action) => n + action.files, 0), bytes: transaction.actions.reduce((n, action) => n + action.bytes, 0), reason_codes: transaction.reason_codes })}\n`, { encoding: "utf8", mode: stateFileMode() });
|
|
443
444
|
}
|
|
444
445
|
function readDailyCursor(coordRoot) {
|
|
445
446
|
const path = join(resolve(coordRoot), ".harnery", "maintenance", "cursors", "daily.json");
|
|
@@ -554,9 +555,9 @@ function readJsonFile(path) {
|
|
|
554
555
|
return JSON.parse(readFileSync(path, "utf8"));
|
|
555
556
|
}
|
|
556
557
|
function atomicJson(path, value, fsync) {
|
|
557
|
-
mkdirSync(dirname(path), { recursive: true, mode:
|
|
558
|
+
mkdirSync(dirname(path), { recursive: true, mode: stateDirMode() });
|
|
558
559
|
const temporary = `${path}.tmp-${process.pid}-${randomUUID()}`;
|
|
559
|
-
const fd = openSync(temporary, "wx",
|
|
560
|
+
const fd = openSync(temporary, "wx", stateFileMode());
|
|
560
561
|
try {
|
|
561
562
|
writeFileSync(fd, `${JSON.stringify(value, null, 2)}\n`, "utf8");
|
|
562
563
|
if (fsync)
|
|
@@ -568,7 +569,7 @@ function atomicJson(path, value, fsync) {
|
|
|
568
569
|
renameSync(temporary, path);
|
|
569
570
|
}
|
|
570
571
|
function writeExclusiveDurable(path, value) {
|
|
571
|
-
const fd = openSync(path, "wx",
|
|
572
|
+
const fd = openSync(path, "wx", stateFileMode());
|
|
572
573
|
try {
|
|
573
574
|
writeFileSync(fd, value, "utf8");
|
|
574
575
|
fsyncSync(fd);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../src/core/storage/metrics.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../src/core/storage/metrics.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;QACd,cAAc,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,wBAAwB,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,wBAAwB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,uBAAuB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,KAAK,CAAC,EAAE,sBAAsB,CAAC,OAAO,CAAC,CAAC;CACzC;AAID,qBAAa,qBAAqB;;IAIhC,SAAS,CAAC,CAAC,SAAS,MAAM,sBAAsB,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,SAAI,GAAG,IAAI;IAO3E,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,IAAI;IAMzC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,IAAI;IAUnE,cAAc,CAAC,IAAI,EAAE,mBAAmB,GAAG,kBAAkB,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAI1F,IAAI,IAAI,sBAAsB;CAM/B;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,sBAAsB,EAC7B,GAAG,OAAa,GACf;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,gBAAgB,EAAE,OAAO,CAAA;CAAE,CAwBhD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAOhF"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
2
|
import { existsSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { stateFileMode } from "./modes.js";
|
|
3
4
|
const HISTOGRAM_BUCKETS = [1, 2, 5, 10, 25, 50, 100, 250, 500, 1_000, 5_000];
|
|
4
5
|
export class LogMetricsAccumulator {
|
|
5
6
|
#delta = {};
|
|
@@ -54,7 +55,10 @@ export function mergeMetricsSidecar(path, delta, now = new Date()) {
|
|
|
54
55
|
const merged = mergeMetrics(current, delta, now);
|
|
55
56
|
const temporary = `${path}.tmp-${process.pid}-${randomUUID()}`;
|
|
56
57
|
try {
|
|
57
|
-
writeFileSync(temporary, `${JSON.stringify(merged)}\n`, {
|
|
58
|
+
writeFileSync(temporary, `${JSON.stringify(merged)}\n`, {
|
|
59
|
+
encoding: "utf8",
|
|
60
|
+
mode: stateFileMode(),
|
|
61
|
+
});
|
|
58
62
|
renameSync(temporary, path);
|
|
59
63
|
return { merged: true, generation_reset: generationReset };
|
|
60
64
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** The sharing mode for this process, resolved once. Tests reset it with `resetStorageSharing`. */
|
|
2
|
+
export declare function stateSharing(): "private" | "group";
|
|
3
|
+
export declare function resetStorageSharing(): void;
|
|
4
|
+
/**
|
|
5
|
+
* Mode for a directory of project state. Group mode includes setgid: Harnery chmods directories
|
|
6
|
+
* after creating them, and a plain 0770 would clear the bit, so files made inside would take the
|
|
7
|
+
* writer's own group instead of the project's, and other users could not read them.
|
|
8
|
+
*/
|
|
9
|
+
export declare function stateDirMode(): number;
|
|
10
|
+
/** Mode for a file of project state. */
|
|
11
|
+
export declare function stateFileMode(): number;
|
|
12
|
+
/**
|
|
13
|
+
* True when a state file or directory is readable or writable by someone it should not be: anyone
|
|
14
|
+
* but the owner in private mode, anyone outside the owner and group in group mode.
|
|
15
|
+
*/
|
|
16
|
+
export declare function stateModeTooOpen(mode: number): boolean;
|
|
17
|
+
//# sourceMappingURL=modes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modes.d.ts","sourceRoot":"","sources":["../../../src/core/storage/modes.ts"],"names":[],"mappings":"AAgBA,mGAAmG;AACnG,wBAAgB,YAAY,IAAI,SAAS,GAAG,OAAO,CASlD;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED;;;;GAIG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wCAAwC;AACxC,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtD"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The permission modes for everything Harnery writes as project state under `.harnery/`.
|
|
3
|
+
*
|
|
4
|
+
* `private` (the default) is owner-only: 0700 directories and 0600 files, exactly as before this
|
|
5
|
+
* module existed. `group` is for a project several Unix users share through one group, such as a
|
|
6
|
+
* workspace that several people's agents work in at once: 2770 (setgid) and 0660, with nothing ever granted
|
|
7
|
+
* to other users. Every state write takes its mode from here, and every integrity check that
|
|
8
|
+
* rejects a loosely permissioned file asks `stateModeTooOpen`, so the two cannot disagree.
|
|
9
|
+
*
|
|
10
|
+
* Personal state outside the project (browser cookies, sessions, pacing ledgers in the user's home)
|
|
11
|
+
* is not project state and stays owner-only regardless.
|
|
12
|
+
*/
|
|
13
|
+
import { storageSharing } from "../config.js";
|
|
14
|
+
let resolved;
|
|
15
|
+
/** The sharing mode for this process, resolved once. Tests reset it with `resetStorageSharing`. */
|
|
16
|
+
export function stateSharing() {
|
|
17
|
+
if (resolved === undefined) {
|
|
18
|
+
resolved = storageSharing();
|
|
19
|
+
// A umask that strips group bits would quietly turn every group file back into an owner-only
|
|
20
|
+
// one, and the next user's write would fail. Keep the process's other-bits mask as it was.
|
|
21
|
+
if (resolved === "group" && typeof process.umask === "function")
|
|
22
|
+
process.umask(process.umask() & ~0o070);
|
|
23
|
+
}
|
|
24
|
+
return resolved;
|
|
25
|
+
}
|
|
26
|
+
export function resetStorageSharing() {
|
|
27
|
+
resolved = undefined;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Mode for a directory of project state. Group mode includes setgid: Harnery chmods directories
|
|
31
|
+
* after creating them, and a plain 0770 would clear the bit, so files made inside would take the
|
|
32
|
+
* writer's own group instead of the project's, and other users could not read them.
|
|
33
|
+
*/
|
|
34
|
+
export function stateDirMode() {
|
|
35
|
+
return stateSharing() === "group" ? 0o2770 : 0o700;
|
|
36
|
+
}
|
|
37
|
+
/** Mode for a file of project state. */
|
|
38
|
+
export function stateFileMode() {
|
|
39
|
+
return stateSharing() === "group" ? 0o660 : 0o600;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* True when a state file or directory is readable or writable by someone it should not be: anyone
|
|
43
|
+
* but the owner in private mode, anyone outside the owner and group in group mode.
|
|
44
|
+
*/
|
|
45
|
+
export function stateModeTooOpen(mode) {
|
|
46
|
+
return (mode & (stateSharing() === "group" ? 0o007 : 0o077)) !== 0;
|
|
47
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-log.d.ts","sourceRoot":"","sources":["../../../src/core/storage/process-log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAoB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"process-log.d.ts","sourceRoot":"","sources":["../../../src/core/storage/process-log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAoB,MAAM,oBAAoB,CAAC;AAiBzE,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,4BAA4B;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAKD,kFAAkF;AAClF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,4BAA4B,GAAG,MAAM,CAcnF;AAED,qBAAa,gBAAgB;;gBAIf,OAAO,EAAE,uBAAuB;IAa5C,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAuB1B,eAAe,IAAI,IAAI;IAKvB,KAAK,IAAI,IAAI;IACb,KAAK,IAAI,IAAI;CAWd;AAED,6FAA6F;AAC7F,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,sBAAsB,GAAG,YAAY,CAqBlF;AAED,mFAAmF;AACnF,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM,GAAG,IAAI,CAgBrF"}
|
|
@@ -3,6 +3,7 @@ import { closeSync, existsSync, fdatasyncSync, mkdirSync, openSync, renameSync,
|
|
|
3
3
|
import { basename, dirname, join, resolve } from "node:path";
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
5
|
import { createStorageCatalog } from "./catalog.js";
|
|
6
|
+
import { stateDirMode, stateFileMode } from "./modes.js";
|
|
6
7
|
import { familyLogDirectory } from "./segments.js";
|
|
7
8
|
const DEFAULT_PROCESS_LOG_BYTES = 5 * 1024 * 1024;
|
|
8
9
|
const DEFAULT_PROCESS_LOG_BACKUPS = 3;
|
|
@@ -40,7 +41,7 @@ export class RotatingTextSink {
|
|
|
40
41
|
if (this.#closed)
|
|
41
42
|
throw new Error("text sink is closed");
|
|
42
43
|
const bytes = Buffer.from(text, "utf8");
|
|
43
|
-
mkdirSync(dirname(this.#options.path), { recursive: true, mode:
|
|
44
|
+
mkdirSync(dirname(this.#options.path), { recursive: true, mode: stateDirMode() });
|
|
44
45
|
let offset = 0;
|
|
45
46
|
while (offset < bytes.byteLength) {
|
|
46
47
|
let current = existsSync(this.#options.path) ? statSync(this.#options.path).size : 0;
|
|
@@ -49,7 +50,7 @@ export class RotatingTextSink {
|
|
|
49
50
|
current = 0;
|
|
50
51
|
}
|
|
51
52
|
const length = Math.min(bytes.byteLength - offset, this.#options.max_bytes - current);
|
|
52
|
-
const fd = openSync(this.#options.path, "a",
|
|
53
|
+
const fd = openSync(this.#options.path, "a", stateFileMode());
|
|
53
54
|
try {
|
|
54
55
|
writeSync(fd, bytes.subarray(offset, offset + length));
|
|
55
56
|
if (this.#options.durable)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"receipts.d.ts","sourceRoot":"","sources":["../../../src/core/storage/receipts.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"receipts.d.ts","sourceRoot":"","sources":["../../../src/core/storage/receipts.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,uCAAuC,EAClD,gDAAyD,CAAC;AAE5D,MAAM,WAAW,+BAA+B;IAC9C,MAAM,EAAE,OAAO,uCAAuC,CAAC;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IACP,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACtB,GACL,+BAA+B,GAAG,SAAS,CAyD7C"}
|
|
@@ -2,6 +2,7 @@ import { createHash, randomUUID } from "node:crypto";
|
|
|
2
2
|
import { closeSync, existsSync, fsyncSync, lstatSync, mkdirSync, openSync, readdirSync, readFileSync, renameSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
3
3
|
import { dirname, join, relative, resolve, sep } from "node:path";
|
|
4
4
|
import { HARNERY_MAINTENANCE_RECEIPT_SCHEMA, HarneryMaintenanceError, } from "./maintenance.js";
|
|
5
|
+
import { stateDirMode, stateFileMode } from "./modes.js";
|
|
5
6
|
export const HARNERY_RECEIPT_SEGMENT_MANIFEST_SCHEMA = "harnery.storage-maintenance-receipt-segment/v1";
|
|
6
7
|
/**
|
|
7
8
|
* Losslessly packs immutable maintenance receipts. The default is a pure plan;
|
|
@@ -45,7 +46,7 @@ export function consolidateMutationReceipts(coordRoot, options = {}) {
|
|
|
45
46
|
throw new HarneryMaintenanceError("confirmation_required", "receipt replacement requires an exact consolidation id and --yes");
|
|
46
47
|
}
|
|
47
48
|
const segments = join(root, "segments");
|
|
48
|
-
mkdirSync(segments, { recursive: true, mode:
|
|
49
|
+
mkdirSync(segments, { recursive: true, mode: stateDirMode() });
|
|
49
50
|
const payloadPath = join(segments, `${segmentId}.jsonl`);
|
|
50
51
|
const manifestPath = join(segments, `${segmentId}.manifest.json`);
|
|
51
52
|
writeExclusiveDurable(payloadPath, payload);
|
|
@@ -98,9 +99,9 @@ function readReceipt(path) {
|
|
|
98
99
|
return { path, bytes: bytes.byteLength, digest: sha256(bytes), receipt };
|
|
99
100
|
}
|
|
100
101
|
function writeExclusiveDurable(path, bytes) {
|
|
101
|
-
mkdirSync(dirname(path), { recursive: true, mode:
|
|
102
|
+
mkdirSync(dirname(path), { recursive: true, mode: stateDirMode() });
|
|
102
103
|
const temporary = `${path}.tmp-${process.pid}-${randomUUID()}`;
|
|
103
|
-
const fd = openSync(temporary, "wx",
|
|
104
|
+
const fd = openSync(temporary, "wx", stateFileMode());
|
|
104
105
|
try {
|
|
105
106
|
writeFileSync(fd, bytes, "utf8");
|
|
106
107
|
fsyncSync(fd);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"segments.d.ts","sourceRoot":"","sources":["../../../src/core/storage/segments.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,eAAe,CAAC;AAEpE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"segments.d.ts","sourceRoot":"","sources":["../../../src/core/storage/segments.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import { basename, dirname, isAbsolute, join, relative } from "node:path";
|
|
|
4
4
|
import { gzipSync } from "node:zlib";
|
|
5
5
|
import { parseLogRecord } from "./jsonl.js";
|
|
6
6
|
import { mergeMetricsSidecar } from "./metrics.js";
|
|
7
|
+
import { stateDirMode, stateFileMode } from "./modes.js";
|
|
7
8
|
export class HarneryLogLeaseError extends Error {
|
|
8
9
|
reason;
|
|
9
10
|
constructor(reason, message) {
|
|
@@ -46,7 +47,7 @@ export class FileSegmentSink {
|
|
|
46
47
|
rotated = true;
|
|
47
48
|
}
|
|
48
49
|
rejectExistingSymlink(active);
|
|
49
|
-
const fd = openSync(active, fsConstants.O_RDWR | fsConstants.O_APPEND | fsConstants.O_CREAT | noFollowFlag(),
|
|
50
|
+
const fd = openSync(active, fsConstants.O_RDWR | fsConstants.O_APPEND | fsConstants.O_CREAT | noFollowFlag(), stateFileMode());
|
|
50
51
|
let bytes = 0;
|
|
51
52
|
try {
|
|
52
53
|
assertOpenFileIdentity(active, fd, directory);
|
|
@@ -190,7 +191,7 @@ export async function withFamilyLease(directory, policy, operation) {
|
|
|
190
191
|
let owner;
|
|
191
192
|
while (true) {
|
|
192
193
|
try {
|
|
193
|
-
mkdirSync(lease, { mode:
|
|
194
|
+
mkdirSync(lease, { mode: stateDirMode() });
|
|
194
195
|
const leaseIdentity = captureDirectoryIdentity(lease);
|
|
195
196
|
owner = {
|
|
196
197
|
owner_id: randomUUID(),
|
|
@@ -245,7 +246,7 @@ function sealActive(active, options, now) {
|
|
|
245
246
|
const sequence = manifest.next_sequence;
|
|
246
247
|
const name = `${now.toISOString().slice(0, 10).replaceAll("-", "")}-${String(sequence).padStart(8, "0")}.jsonl.gz`;
|
|
247
248
|
const target = join(directory, "segments", name);
|
|
248
|
-
mkdirSync(dirname(target), { recursive: true, mode:
|
|
249
|
+
mkdirSync(dirname(target), { recursive: true, mode: stateDirMode() });
|
|
249
250
|
const temporary = `${target}.tmp-${process.pid}-${randomUUID()}`;
|
|
250
251
|
const compressed = gzipSync(content);
|
|
251
252
|
writeNewFile(temporary, compressed);
|
|
@@ -273,7 +274,7 @@ function sealActive(active, options, now) {
|
|
|
273
274
|
],
|
|
274
275
|
};
|
|
275
276
|
const sealedManifest = join(directory, "manifests", `${String(sequence).padStart(8, "0")}.json`);
|
|
276
|
-
mkdirSync(dirname(sealedManifest), { recursive: true, mode:
|
|
277
|
+
mkdirSync(dirname(sealedManifest), { recursive: true, mode: stateDirMode() });
|
|
277
278
|
writeNewFile(sealedManifest, Buffer.from(`${JSON.stringify(next)}\n`));
|
|
278
279
|
atomicJson(join(directory, "manifest.json"), next);
|
|
279
280
|
truncateRegularFile(active);
|
|
@@ -371,7 +372,7 @@ function processIsAlive(pid) {
|
|
|
371
372
|
}
|
|
372
373
|
}
|
|
373
374
|
function ensurePrivateDirectory(path) {
|
|
374
|
-
mkdirSync(path, { recursive: true, mode:
|
|
375
|
+
mkdirSync(path, { recursive: true, mode: stateDirMode() });
|
|
375
376
|
return captureDirectoryIdentity(path);
|
|
376
377
|
}
|
|
377
378
|
function captureDirectoryIdentity(path) {
|
|
@@ -458,7 +459,7 @@ function readRegularFile(path, maximumBytes) {
|
|
|
458
459
|
}
|
|
459
460
|
function writeNewFile(path, content) {
|
|
460
461
|
const parent = captureDirectoryIdentity(dirname(path));
|
|
461
|
-
const fd = openSync(path, fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL | noFollowFlag(),
|
|
462
|
+
const fd = openSync(path, fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL | noFollowFlag(), stateFileMode());
|
|
462
463
|
try {
|
|
463
464
|
assertOpenFileIdentity(path, fd, parent);
|
|
464
465
|
writeAllSync(fd, content, nativeWriteSync);
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type EventAdapterIdV3 } from "../events/v3/adapter-id.js";
|
|
1
2
|
import { type HookHealthOutcome } from "../hooks/health.js";
|
|
2
3
|
import type { HarneryLogRecordV1 } from "../storage/jsonl.js";
|
|
3
4
|
import type { SupervisorLogFeed } from "./contract.js";
|
|
@@ -12,7 +13,7 @@ export interface CompletedHookHealth {
|
|
|
12
13
|
id: string;
|
|
13
14
|
observed_at: string;
|
|
14
15
|
hook_name: string;
|
|
15
|
-
adapter:
|
|
16
|
+
adapter: EventAdapterIdV3 | "unknown";
|
|
16
17
|
outcome: HookHealthOutcome;
|
|
17
18
|
duration_ms: number;
|
|
18
19
|
rss_start_bytes: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook-health.d.ts","sourceRoot":"","sources":["../../../src/core/supervisor/hook-health.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD,eAAO,MAAM,qCAAqC,EAAG,CAAU,CAAC;AAChE,eAAO,MAAM,mCAAmC,KAAK,CAAC;AACtD,eAAO,MAAM,sCAAsC,KAAK,CAAC;AACzD,eAAO,MAAM,iCAAiC,QAAS,CAAC;AACxD,eAAO,MAAM,wCAAwC,QAAoB,CAAC;AAC1E,eAAO,MAAM,mCAAmC,IAAI,CAAC;AACrD,eAAO,MAAM,uCAAuC,QAAa,CAAC;AAElE,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"hook-health.d.ts","sourceRoot":"","sources":["../../../src/core/supervisor/hook-health.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { normalizeEventAdapterIdV3 } from "../events/v3/adapter-id.js";
|
|
1
2
|
import { HOOK_HEALTH_EVENT, HOOK_HEALTH_RECEIPT_VERSION, } from "../hooks/health.js";
|
|
2
3
|
export const SUPERVISOR_HOOK_HEALTH_SCHEMA_VERSION = 1;
|
|
3
4
|
export const SUPERVISOR_HOOK_HEALTH_RECENT_LIMIT = 50;
|
|
@@ -177,9 +178,9 @@ function token(value) {
|
|
|
177
178
|
: undefined;
|
|
178
179
|
}
|
|
179
180
|
function adapterValue(value) {
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
181
|
+
if (value === "unknown")
|
|
182
|
+
return value;
|
|
183
|
+
return normalizeEventAdapterIdV3(value) ?? undefined;
|
|
183
184
|
}
|
|
184
185
|
function outcomeValue(value) {
|
|
185
186
|
return value === "completed" || value === "skipped" || value === "degraded" || value === "faulted"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/core/supervisor/service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/core/supervisor/service.ts"],"names":[],"mappings":"AAgCA,OAAO,EAML,KAAK,6BAA6B,EAElC,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAC;AAsBvB,eAAO,MAAM,8BAA8B,OAAQ,CAAC;AACpD,eAAO,MAAM,+BAA+B,QAAa,CAAC;AAe1D,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAED,MAAM,MAAM,sBAAsB,GAC9B;IAAE,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,GAC1D;IAAE,KAAK,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtE,wBAAsB,eAAe,CACnC,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GAC9E,OAAO,CAAC,gBAAgB,CAAC,CAwD3B;AAED,wBAAsB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAahG;AAED,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,gBAAgB,CAiB5E;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,6BAA6B,CAAC,CAyQxC"}
|
|
@@ -17,6 +17,7 @@ import { readResourceServiceStatus } from "../resources/service-status.js";
|
|
|
17
17
|
import { resourcePaths } from "../resources/storage.js";
|
|
18
18
|
import { writePrivateJsonAtomic } from "../storage/atomic-json.js";
|
|
19
19
|
import { closeProcessLoggers, legacyLogFields, processLogger } from "../storage/logger.js";
|
|
20
|
+
import { stateDirMode, stateFileMode } from "../storage/modes.js";
|
|
20
21
|
import { collectSupervisorActivitySnapshot } from "./activity.js";
|
|
21
22
|
import { SUPERVISOR_PRESSURE_SCHEMA_VERSION, SUPERVISOR_SNAPSHOT_SCHEMA_VERSION, SUPERVISOR_STATUS_SCHEMA_VERSION, } from "./contract.js";
|
|
22
23
|
import { explainSupervisorFinding } from "./explanations.js";
|
|
@@ -47,7 +48,7 @@ export async function spawnSupervisor(coordRootRaw, options = {}) {
|
|
|
47
48
|
const intervalMs = normalizeInterval(options.intervalMs);
|
|
48
49
|
const idleExitMs = normalizeIdleExit(options.idleExitMs);
|
|
49
50
|
const paths = supervisorPaths(coordRoot);
|
|
50
|
-
mkdirSync(paths.root, { recursive: true, mode:
|
|
51
|
+
mkdirSync(paths.root, { recursive: true, mode: stateDirMode() });
|
|
51
52
|
rmSync(paths.stop, { force: true });
|
|
52
53
|
const cliPath = fileURLToPath(new URL(import.meta.url.endsWith(".ts") ? "../../cli.ts" : "../../cli.js", import.meta.url));
|
|
53
54
|
if (!existsSync(cliPath))
|
|
@@ -112,7 +113,7 @@ export function requestSupervisorStop(coordRootRaw) {
|
|
|
112
113
|
const coordRoot = resolve(coordRootRaw);
|
|
113
114
|
const paths = supervisorPaths(coordRoot);
|
|
114
115
|
const status = readSupervisorStatus(coordRoot);
|
|
115
|
-
mkdirSync(paths.root, { recursive: true, mode:
|
|
116
|
+
mkdirSync(paths.root, { recursive: true, mode: stateDirMode() });
|
|
116
117
|
writePrivateJsonAtomic(paths.stop, {
|
|
117
118
|
requested_at: new Date().toISOString(),
|
|
118
119
|
requested_by_pid: process.pid,
|
|
@@ -294,8 +295,8 @@ export async function runSupervisor(input) {
|
|
|
294
295
|
});
|
|
295
296
|
}
|
|
296
297
|
pressureHysteresis = assessment.hysteresis;
|
|
297
|
-
mkdirSync(paths.timelines, { recursive: true, mode:
|
|
298
|
-
mkdirSync(paths.explanations, { recursive: true, mode:
|
|
298
|
+
mkdirSync(paths.timelines, { recursive: true, mode: stateDirMode() });
|
|
299
|
+
mkdirSync(paths.explanations, { recursive: true, mode: stateDirMode() });
|
|
299
300
|
const projectionUpdates = [
|
|
300
301
|
...findings.active.filter((finding) => !priorActiveFindingIds.has(finding.id)),
|
|
301
302
|
...findings.transitions.filter((finding) => !priorTransitionKeys.has(`${finding.id}:${finding.state}`)),
|
|
@@ -426,7 +427,7 @@ function observeLedgerControlState(coordRoot, now) {
|
|
|
426
427
|
}
|
|
427
428
|
function acquireLease(coordRoot, now) {
|
|
428
429
|
const paths = supervisorPaths(coordRoot);
|
|
429
|
-
mkdirSync(paths.root, { recursive: true, mode:
|
|
430
|
+
mkdirSync(paths.root, { recursive: true, mode: stateDirMode() });
|
|
430
431
|
for (let attempt = 0; attempt < 2; attempt++) {
|
|
431
432
|
const startToken = processStartToken(process.pid);
|
|
432
433
|
const lease = {
|
|
@@ -437,7 +438,7 @@ function acquireLease(coordRoot, now) {
|
|
|
437
438
|
created_at: now.toISOString(),
|
|
438
439
|
};
|
|
439
440
|
try {
|
|
440
|
-
const fd = openSync(paths.lease, "wx",
|
|
441
|
+
const fd = openSync(paths.lease, "wx", stateFileMode());
|
|
441
442
|
try {
|
|
442
443
|
writeFileSync(fd, `${JSON.stringify(lease)}\n`, "utf8");
|
|
443
444
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/core/work/state.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/core/work/state.ts"],"names":[],"mappings":"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"}
|
package/dist/core/work/state.js
CHANGED
|
@@ -3,6 +3,7 @@ import { chmodSync, closeSync, existsSync, mkdirSync, openSync, readdirSync, rea
|
|
|
3
3
|
import { hostname } from "node:os";
|
|
4
4
|
import { dirname, isAbsolute, join, resolve } from "node:path";
|
|
5
5
|
import { appendSegmentedJsonlFile, readSegmentedJsonlFileSync, } from "../storage/durable-history.js";
|
|
6
|
+
import { stateDirMode, stateFileMode } from "../storage/modes.js";
|
|
6
7
|
import { readWorkflowApproval } from "../workflow/approvals.js";
|
|
7
8
|
import { stableDigest } from "../workflow/durable-record.js";
|
|
8
9
|
import { readWorkflowProof } from "../workflow/proof.js";
|
|
@@ -77,9 +78,9 @@ export function createWorkItem(input) {
|
|
|
77
78
|
created_at: new Date().toISOString(),
|
|
78
79
|
};
|
|
79
80
|
const dir = workDir(coordRoot, id);
|
|
80
|
-
mkdirSync(dirname(dir), { recursive: true, mode:
|
|
81
|
-
mkdirSync(dir, { mode:
|
|
82
|
-
chmodSync(dir,
|
|
81
|
+
mkdirSync(dirname(dir), { recursive: true, mode: stateDirMode() });
|
|
82
|
+
mkdirSync(dir, { mode: stateDirMode() });
|
|
83
|
+
chmodSync(dir, stateDirMode());
|
|
83
84
|
writePrivateJson(join(dir, "intent.json"), intent, MAX_INTENT_BYTES);
|
|
84
85
|
const release = acquireWorkLease(coordRoot, id);
|
|
85
86
|
try {
|
|
@@ -897,14 +898,14 @@ function acquireWorkFileLease(coordRoot, workId, filename, activeMessage) {
|
|
|
897
898
|
};
|
|
898
899
|
const acquire = () => {
|
|
899
900
|
try {
|
|
900
|
-
const fd = openSync(path, "wx",
|
|
901
|
+
const fd = openSync(path, "wx", stateFileMode());
|
|
901
902
|
try {
|
|
902
903
|
writeFileSync(fd, `${JSON.stringify(owner)}\n`, "utf8");
|
|
903
904
|
}
|
|
904
905
|
finally {
|
|
905
906
|
closeSync(fd);
|
|
906
907
|
}
|
|
907
|
-
chmodSync(path,
|
|
908
|
+
chmodSync(path, stateFileMode());
|
|
908
909
|
return true;
|
|
909
910
|
}
|
|
910
911
|
catch (error) {
|
|
@@ -982,8 +983,8 @@ function writePrivateJson(path, value, maxBytes) {
|
|
|
982
983
|
const body = `${JSON.stringify(value, null, 2)}\n`;
|
|
983
984
|
if (Buffer.byteLength(body) > maxBytes)
|
|
984
985
|
throw new Error(`private record exceeds ${maxBytes} bytes`);
|
|
985
|
-
writeFileSync(path, body, { encoding: "utf8", flag: "wx", mode:
|
|
986
|
-
chmodSync(path,
|
|
986
|
+
writeFileSync(path, body, { encoding: "utf8", flag: "wx", mode: stateFileMode() });
|
|
987
|
+
chmodSync(path, stateFileMode());
|
|
987
988
|
}
|
|
988
989
|
function readBoundedLines(path, maxBytes, maxRecordBytes, field) {
|
|
989
990
|
const size = statSync(path).size;
|