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
|
@@ -2,8 +2,11 @@ import { createHash, randomUUID } from "node:crypto";
|
|
|
2
2
|
import { chmodSync, closeSync, existsSync, fsyncSync, lstatSync, mkdirSync, openSync, readdirSync, readFileSync, renameSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
3
3
|
import { hostname } from "node:os";
|
|
4
4
|
import { basename, join, resolve } from "node:path";
|
|
5
|
+
import { normalizeAdapter } from "../../../adapter.js";
|
|
6
|
+
import { adapterBehavior } from "../../../hooks/adapter/behaviors/index.js";
|
|
5
7
|
import { extractBashCommand } from "../../../hooks/adapter/parse.js";
|
|
6
|
-
import {
|
|
8
|
+
import { readRuntimeContextTelemetry, readRuntimeTuning, } from "../../../hooks/adapter/runtime-telemetry.js";
|
|
9
|
+
import { stateDirMode, stateFileMode, stateModeTooOpen } from "../../../storage/modes.js";
|
|
7
10
|
import { fsyncParentDirectory } from "../../../workflow/durable-record.js";
|
|
8
11
|
import { acquireNoClobberLease } from "../../../workflow/workspaces/leases.js";
|
|
9
12
|
import { EVENT_ADAPTER_IDS_V3 } from "../adapter-id.js";
|
|
@@ -18,6 +21,7 @@ import { attestationIdV3, clockIdV3, delegationIdV3, eventIdV3, generationIdV3,
|
|
|
18
21
|
import { readLedgerV3 } from "../reader.js";
|
|
19
22
|
import { effectiveRuntimeTelemetryCapabilitiesV3, } from "../runtime-telemetry-capabilities.js";
|
|
20
23
|
import { closeSpanStateV3, openSpanStateV3, recoverSpanUpperBoundV3, } from "../span-state.js";
|
|
24
|
+
import { prepareToolLineChanges } from "../tool-line-changes.js";
|
|
21
25
|
import { extractTurnTelemetryV3, } from "../turn-telemetry.js";
|
|
22
26
|
import { assertEventV3, validateEventV3 } from "../validate.js";
|
|
23
27
|
import { EVENT_V3_LEDGER_RELATIVE_ROOT, writeEventV3, } from "../writer.js";
|
|
@@ -38,17 +42,6 @@ const ACTIVE_RUNTIME_CONTEXT_PROBE_INTERVAL_MS = 15_000;
|
|
|
38
42
|
const STOP_RUNTIME_CONTEXT_RETRY_DELAYS_MS = [75, 175];
|
|
39
43
|
/** Finalization is off the interactive hook path; briefly cover Codex's delayed transcript flush. */
|
|
40
44
|
const APPROVED_END_RUNTIME_CONTEXT_RETRY_DELAYS_MS = [0, 250, 250];
|
|
41
|
-
/**
|
|
42
|
-
* Adapters whose turn-boundary recovery and mid-flight onboarding are enabled.
|
|
43
|
-
* Kept in code, outside the digested capability profiles, so tuning recovery
|
|
44
|
-
* never changes an adapter capability digest (ADR 0078).
|
|
45
|
-
*/
|
|
46
|
-
const RECOVERY_ENABLED_ADAPTERS = new Set([
|
|
47
|
-
"claude-code",
|
|
48
|
-
"codex",
|
|
49
|
-
"cursor",
|
|
50
|
-
"openclaw",
|
|
51
|
-
]);
|
|
52
45
|
const STATE_LEASE_RETRY_ATTEMPTS = 8;
|
|
53
46
|
const STATE_LEASE_RETRY_DELAY_MS = 25;
|
|
54
47
|
/**
|
|
@@ -127,11 +120,11 @@ function sessionHashForSignal(input, context) {
|
|
|
127
120
|
if (nativeSession !== undefined) {
|
|
128
121
|
return normalizeNativeIdV3(context, `${input.adapter}.session`, nativeSession);
|
|
129
122
|
}
|
|
130
|
-
//
|
|
131
|
-
// hooks may still have an exact coordination instance, so reuse its
|
|
132
|
-
// live producer authority instead of hashing the instance into a
|
|
133
|
-
// state path. Ambiguous or absent matches keep the fail-closed fallback.
|
|
134
|
-
if (input.adapter
|
|
123
|
+
// Some adapters carry native session identity only on their start signal.
|
|
124
|
+
// Later hooks may still have an exact coordination instance, so reuse its
|
|
125
|
+
// single live producer authority instead of hashing the instance into a
|
|
126
|
+
// second state path. Ambiguous or absent matches keep the fail-closed fallback.
|
|
127
|
+
if (adapterBehavior(input.adapter).sessionIdentityOnStartOnly) {
|
|
135
128
|
const matches = listHookProducerStateRecordsV3(input.coordRoot).filter(({ state }) => state.adapter === input.adapter && state.instance_id === input.instance_id);
|
|
136
129
|
if (matches.length === 1) {
|
|
137
130
|
const name = basename(matches[0].path);
|
|
@@ -298,6 +291,7 @@ function sleepSync(milliseconds) {
|
|
|
298
291
|
}
|
|
299
292
|
/** The pre-spool body of the recorder: requires the session's state lease to be held. */
|
|
300
293
|
function processHookSignalLocked(control, input, sessionHash, path) {
|
|
294
|
+
const behavior = adapterBehavior(input.adapter);
|
|
301
295
|
const rootId = control.genesis.event.scope.root_id;
|
|
302
296
|
const epochId = control.genesis.profile.privacy_key_epoch;
|
|
303
297
|
const boundaryEventId = control.state === "candidate"
|
|
@@ -329,14 +323,15 @@ function processHookSignalLocked(control, input, sessionHash, path) {
|
|
|
329
323
|
state.capability_profile !== adapterCapabilityProfileDigestV3(input.adapter))) {
|
|
330
324
|
throw new Error("V3 producer state authority does not match the active boundary");
|
|
331
325
|
}
|
|
332
|
-
if (state
|
|
326
|
+
if (state &&
|
|
327
|
+
behavior.tracksExecutionMode &&
|
|
333
328
|
input.payload.cursor_mode &&
|
|
334
329
|
input.payload.cursor_mode !== "unknown") {
|
|
335
330
|
if (!state.cursor_mode || state.cursor_mode === "unknown") {
|
|
336
331
|
state.cursor_mode = input.payload.cursor_mode;
|
|
337
332
|
}
|
|
338
333
|
else if (state.cursor_mode !== input.payload.cursor_mode) {
|
|
339
|
-
throw new Error("
|
|
334
|
+
throw new Error("Execution mode changed within one V3 generation");
|
|
340
335
|
}
|
|
341
336
|
}
|
|
342
337
|
let recovered;
|
|
@@ -375,7 +370,7 @@ function processHookSignalLocked(control, input, sessionHash, path) {
|
|
|
375
370
|
// from the observer instance (that would split the real session).
|
|
376
371
|
const nativeSessionIdentity = input.payload.session_id ?? input.payload.conversation_id ?? input.payload.agent_id;
|
|
377
372
|
const onboardable = !state &&
|
|
378
|
-
|
|
373
|
+
behavior.turnRecovery &&
|
|
379
374
|
input.signal !== "session-end" &&
|
|
380
375
|
nativeSessionIdentity !== undefined;
|
|
381
376
|
if (!onboardable) {
|
|
@@ -407,16 +402,16 @@ function processHookSignalLocked(control, input, sessionHash, path) {
|
|
|
407
402
|
instance_id: input.instance_id,
|
|
408
403
|
signal: input.signal,
|
|
409
404
|
session_hash: sessionHash,
|
|
410
|
-
...(
|
|
405
|
+
...(behavior.midFlightDiagnosticContext?.(input.payload) ?? {}),
|
|
411
406
|
});
|
|
412
407
|
}
|
|
413
408
|
}
|
|
414
409
|
const fingerprintContext = fingerprintContextV3(input.coordRoot, rootId, state.generation_id, state.privacy_epoch_id);
|
|
415
|
-
const recoveryEnabled =
|
|
410
|
+
const recoveryEnabled = behavior.turnRecovery;
|
|
416
411
|
const nativeTid = input.payload.turn_id
|
|
417
412
|
? normalizeNativeIdV3(fingerprintContext, `${input.adapter}.turn`, input.payload.turn_id).replace(/^hid_/, "tid_")
|
|
418
413
|
: undefined;
|
|
419
|
-
const cursorPromptWithinOpenTurn =
|
|
414
|
+
const cursorPromptWithinOpenTurn = behavior.promptContinuesOpenTurn &&
|
|
420
415
|
input.signal === "user-prompt-submit" &&
|
|
421
416
|
state.current_turn_id !== undefined &&
|
|
422
417
|
state.current_turn_span !== undefined;
|
|
@@ -495,7 +490,29 @@ function processHookSignalLocked(control, input, sessionHash, path) {
|
|
|
495
490
|
// their self-contained timing cannot drift by a millisecond.
|
|
496
491
|
const eventClock = signalClock(input);
|
|
497
492
|
if (input.signal === "after-agent-response") {
|
|
498
|
-
|
|
493
|
+
// Cursor Stop followups auto-submit without beforeSubmitPrompt, so they
|
|
494
|
+
// never open a turn. The first stop already closed the human turn.
|
|
495
|
+
// Later completed replies still fire afterAgentResponse; bind them to a
|
|
496
|
+
// derived remediation turn so Stop can consume the new ritual instead of
|
|
497
|
+
// looping on the frozen first terminal.
|
|
498
|
+
const ritualFromResponseEvent = behavior.completedResponseEvent === input.signal;
|
|
499
|
+
if (ritualFromResponseEvent &&
|
|
500
|
+
input.turn_ritual &&
|
|
501
|
+
(!state.current_turn_id || !state.current_turn_span)) {
|
|
502
|
+
commitRecoveredToolTurnStart(input, state, path, rootId, fingerprintContext, {
|
|
503
|
+
stop_remediation: true,
|
|
504
|
+
});
|
|
505
|
+
writeProducerDiagnosticV3(input.coordRoot, "cursor_response_ritual_recovered_turn", {
|
|
506
|
+
adapter: input.adapter,
|
|
507
|
+
instance_id: input.instance_id,
|
|
508
|
+
generation_id: state.generation_id,
|
|
509
|
+
signal: input.signal,
|
|
510
|
+
reason: "no_open_turn",
|
|
511
|
+
turn_id: state.current_turn_id,
|
|
512
|
+
status_box_present_strict: input.turn_ritual.status_box_present_strict,
|
|
513
|
+
});
|
|
514
|
+
}
|
|
515
|
+
if (!ritualFromResponseEvent ||
|
|
499
516
|
!state.current_turn_id ||
|
|
500
517
|
!state.current_turn_span ||
|
|
501
518
|
!input.turn_ritual) {
|
|
@@ -588,6 +605,7 @@ function processHookSignalLocked(control, input, sessionHash, path) {
|
|
|
588
605
|
};
|
|
589
606
|
state.spans.push(span);
|
|
590
607
|
}
|
|
608
|
+
span.line_changes = prepareToolLineChanges(input.payload, input.payload.cwd ?? input.coordRoot);
|
|
591
609
|
}
|
|
592
610
|
else if (input.signal === "post-tool-use" || input.signal === "post-tool-use-failure") {
|
|
593
611
|
span = sourceId
|
|
@@ -740,11 +758,11 @@ function processHookSignalLocked(control, input, sessionHash, path) {
|
|
|
740
758
|
const turnTelemetry = input.signal === "stop" || input.signal === "stop-failure"
|
|
741
759
|
? turnTelemetryForTerminal(input, state, eventClock.observed_at)
|
|
742
760
|
: undefined;
|
|
743
|
-
const cursorToolChannelSupport =
|
|
761
|
+
const cursorToolChannelSupport = behavior.tracksExecutionMode
|
|
744
762
|
? cursorToolChannelSupportV3(state.cursor_mode ?? "unknown")
|
|
745
763
|
: undefined;
|
|
746
764
|
const cursorToolChannelUnattested = (input.signal === "stop" || input.signal === "stop-failure") &&
|
|
747
|
-
|
|
765
|
+
behavior.tracksExecutionMode &&
|
|
748
766
|
cursorToolChannelSupport !== "unsupported" &&
|
|
749
767
|
state.tool_call_count === 0;
|
|
750
768
|
if (input.signal === "sub-agent-start" && delegation && !delegation.open_event_id) {
|
|
@@ -755,13 +773,14 @@ function processHookSignalLocked(control, input, sessionHash, path) {
|
|
|
755
773
|
// Before the signal's own event: the tool call or turn that carries the
|
|
756
774
|
// new effort already ran under it, so it must ride the new attestation.
|
|
757
775
|
maybeAttestTuningChange(input, state, path, rootId);
|
|
758
|
-
const
|
|
776
|
+
const ritualArrivesSeparately = behavior.completedResponseEvent !== undefined;
|
|
777
|
+
const cursorResponseRitual = ritualArrivesSeparately &&
|
|
759
778
|
(input.signal === "stop" || input.signal === "stop-failure") &&
|
|
760
779
|
state.current_turn_id &&
|
|
761
780
|
state.cursor_response_ritual?.turn_id === state.current_turn_id
|
|
762
781
|
? state.cursor_response_ritual
|
|
763
782
|
: undefined;
|
|
764
|
-
const terminalTurnRitual =
|
|
783
|
+
const terminalTurnRitual = ritualArrivesSeparately && (input.signal === "stop" || input.signal === "stop-failure")
|
|
765
784
|
? cursorResponseRitual
|
|
766
785
|
? {
|
|
767
786
|
status_box_present: cursorResponseRitual.status_box_present,
|
|
@@ -814,6 +833,7 @@ function processHookSignalLocked(control, input, sessionHash, path) {
|
|
|
814
833
|
span_id: openingSpan?.span_id ?? closingSpan?.span_id,
|
|
815
834
|
parent_span_id: openingSpan?.parent_span_id ?? closingSpan?.parent_span_id,
|
|
816
835
|
terminal_span: terminalSpan,
|
|
836
|
+
tool_line_changes: span?.line_changes,
|
|
817
837
|
harness_timing: state.turn_harness,
|
|
818
838
|
turn_telemetry: turnTelemetry,
|
|
819
839
|
caused_by: [
|
|
@@ -1232,8 +1252,8 @@ function commitRecoveredTurnCompleted(input, state, path, rootId, fingerprintCon
|
|
|
1232
1252
|
assertEventV3(event);
|
|
1233
1253
|
commitEventLocked(input, state, path, event);
|
|
1234
1254
|
}
|
|
1235
|
-
/** Open a derived turn for
|
|
1236
|
-
function commitRecoveredToolTurnStart(input, state, path, rootId, fingerprintContext) {
|
|
1255
|
+
/** Open a derived turn for signals that arrive after their native turn closed. */
|
|
1256
|
+
function commitRecoveredToolTurnStart(input, state, path, rootId, fingerprintContext, options) {
|
|
1237
1257
|
const clock = signalClock(input);
|
|
1238
1258
|
const span = openSpanStateV3({
|
|
1239
1259
|
span_id: spanIdV3(),
|
|
@@ -1268,6 +1288,7 @@ function commitRecoveredToolTurnStart(input, state, path, rootId, fingerprintCon
|
|
|
1268
1288
|
observed_at: clock.observed_at,
|
|
1269
1289
|
monotonic_ns: orderedEventMonotonic(state, input.monotonic_ns),
|
|
1270
1290
|
clock_id: state.clock_id,
|
|
1291
|
+
...(options?.stop_remediation ? { stop_remediation: true } : {}),
|
|
1271
1292
|
});
|
|
1272
1293
|
if (event?.event_type !== "turn.started") {
|
|
1273
1294
|
throw new Error("recovered tool turn start could not be normalized");
|
|
@@ -1478,7 +1499,8 @@ function maybeCommitActiveRuntimeContextObservation(input, state, path, rootId,
|
|
|
1478
1499
|
}
|
|
1479
1500
|
const nativeSessionId = input.payload.session_id ?? input.payload.conversation_id;
|
|
1480
1501
|
const nativeTurnId = input.payload.turn_id ?? state.current_native_turn_id;
|
|
1481
|
-
|
|
1502
|
+
const behavior = adapterBehavior(input.adapter);
|
|
1503
|
+
if (!nativeSessionId || (!nativeTurnId && !behavior.nativeTurnIdOptional))
|
|
1482
1504
|
return;
|
|
1483
1505
|
const now = Date.now();
|
|
1484
1506
|
const configuredInterval = input.runtimeTelemetryOptions?.activeContextProbeIntervalMs;
|
|
@@ -1504,21 +1526,20 @@ function maybeCommitActiveRuntimeContextObservation(input, state, path, rootId,
|
|
|
1504
1526
|
commitActiveContextObservation(input, state, path, rootId, fingerprintContext, sourceEvent, native, nativeContextProvenance(input, state, native));
|
|
1505
1527
|
return;
|
|
1506
1528
|
}
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
if (input.adapter === "openclaw") {
|
|
1529
|
+
// Runtime readers exist only for workflow adapters; an event-only adapter
|
|
1530
|
+
// has no transcript to read.
|
|
1531
|
+
const runtimeAdapter = normalizeAdapter(input.adapter);
|
|
1532
|
+
if (!runtimeAdapter || !behavior.runtimeContextAvailable(state.cursor_mode)) {
|
|
1512
1533
|
publishProducerState(input.coordRoot, path, state);
|
|
1513
1534
|
return;
|
|
1514
1535
|
}
|
|
1515
1536
|
const transcriptPath = runtimeTranscriptPath(input, state);
|
|
1516
|
-
if (!transcriptPath &&
|
|
1537
|
+
if (!transcriptPath && !behavior.runtimeContextTranscriptOptional) {
|
|
1517
1538
|
publishProducerState(input.coordRoot, path, state);
|
|
1518
1539
|
return;
|
|
1519
1540
|
}
|
|
1520
1541
|
const runtime = readRuntimeContextTelemetry({
|
|
1521
|
-
adapter:
|
|
1542
|
+
adapter: runtimeAdapter,
|
|
1522
1543
|
session_id: nativeSessionId,
|
|
1523
1544
|
...(nativeTurnId ? { turn_id: nativeTurnId } : {}),
|
|
1524
1545
|
...(state.current_turn_span?.opened_at
|
|
@@ -1629,7 +1650,7 @@ function turnContextTarget(turnTerminal) {
|
|
|
1629
1650
|
};
|
|
1630
1651
|
}
|
|
1631
1652
|
function queuePendingRuntimeContext(input, state, target, measurement, nativeTurnId) {
|
|
1632
|
-
if (input.adapter
|
|
1653
|
+
if (!adapterBehavior(input.adapter).runtimeContextRetry ||
|
|
1633
1654
|
!target ||
|
|
1634
1655
|
measurement.state !== "expected_but_missing" ||
|
|
1635
1656
|
!retryableRuntimeContextReason(measurement.reason)) {
|
|
@@ -1654,8 +1675,10 @@ function queuePendingRuntimeContext(input, state, target, measurement, nativeTur
|
|
|
1654
1675
|
].slice(-PENDING_RUNTIME_CONTEXT_CAP);
|
|
1655
1676
|
}
|
|
1656
1677
|
function reconcilePendingRuntimeContexts(input, state, path, rootId, fingerprintContext, options = {}) {
|
|
1657
|
-
if (state.adapter
|
|
1678
|
+
if (!adapterBehavior(state.adapter).runtimeContextRetry ||
|
|
1679
|
+
!state.pending_runtime_contexts?.length) {
|
|
1658
1680
|
return;
|
|
1681
|
+
}
|
|
1659
1682
|
for (const pending of [...state.pending_runtime_contexts]) {
|
|
1660
1683
|
const runtime = readRuntimeContextTelemetry({
|
|
1661
1684
|
adapter: "codex",
|
|
@@ -1703,8 +1726,18 @@ function reconcilePendingRuntimeContexts(input, state, path, rootId, fingerprint
|
|
|
1703
1726
|
publishProducerState(input.coordRoot, path, state);
|
|
1704
1727
|
}
|
|
1705
1728
|
function reconcilePendingRuntimeContextsBeforeApprovedEnd(input, state, path, rootId, fingerprintContext) {
|
|
1706
|
-
if (state.adapter
|
|
1729
|
+
if (!adapterBehavior(state.adapter).runtimeContextRetry ||
|
|
1730
|
+
!state.pending_runtime_contexts?.length) {
|
|
1707
1731
|
return;
|
|
1732
|
+
}
|
|
1733
|
+
// Context reconciliation continues the hook boot's sequence, even when the
|
|
1734
|
+
// finalizer drives it. Recover that producer identity from its validated
|
|
1735
|
+
// session start instead of attaching the sequence to the finalizer's name.
|
|
1736
|
+
const ledger = readLedgerV3(input.coordRoot, { authority: input.mode });
|
|
1737
|
+
const start = ledger.events.find(({ event }) => event.event_id === state.started_event_id)?.event;
|
|
1738
|
+
if (!ledger.complete || !start || start.producer.boot_id !== state.boot_id) {
|
|
1739
|
+
throw new Error("event_v3_finalizer_context_producer_unavailable");
|
|
1740
|
+
}
|
|
1708
1741
|
for (const [index, delayMs] of APPROVED_END_RUNTIME_CONTEXT_RETRY_DELAYS_MS.entries()) {
|
|
1709
1742
|
if (delayMs > 0)
|
|
1710
1743
|
sleepSync(delayMs);
|
|
@@ -1715,7 +1748,7 @@ function reconcilePendingRuntimeContextsBeforeApprovedEnd(input, state, path, ro
|
|
|
1715
1748
|
payload: { raw: {} },
|
|
1716
1749
|
adapter: state.adapter,
|
|
1717
1750
|
instance_id: state.instance_id,
|
|
1718
|
-
producer_id:
|
|
1751
|
+
producer_id: start.producer.producer_id,
|
|
1719
1752
|
build_id: input.build_id,
|
|
1720
1753
|
platform: input.platform,
|
|
1721
1754
|
observed_at: new Date().toISOString(),
|
|
@@ -1735,18 +1768,20 @@ function retryableRuntimeContextReason(reason) {
|
|
|
1735
1768
|
}
|
|
1736
1769
|
function turnTelemetryForTerminal(input, state, observedAt) {
|
|
1737
1770
|
const native = extractTurnTelemetryV3(input.adapter, input.payload.raw, observedAt);
|
|
1771
|
+
const behavior = adapterBehavior(input.adapter);
|
|
1738
1772
|
if (native.context.state === "observed")
|
|
1739
1773
|
return native;
|
|
1740
|
-
|
|
1774
|
+
const runtimeAdapter = normalizeAdapter(input.adapter);
|
|
1775
|
+
if (!runtimeAdapter || behavior.nativeTelemetryOnly)
|
|
1741
1776
|
return native;
|
|
1742
|
-
if (
|
|
1777
|
+
if (!behavior.runtimeContextAvailable(state.cursor_mode)) {
|
|
1743
1778
|
return {
|
|
1744
1779
|
...native,
|
|
1745
1780
|
context: { state: "unsupported", capability: "context_usage" },
|
|
1746
1781
|
};
|
|
1747
1782
|
}
|
|
1748
1783
|
const request = {
|
|
1749
|
-
adapter:
|
|
1784
|
+
adapter: runtimeAdapter,
|
|
1750
1785
|
session_id: input.payload.session_id ?? input.payload.conversation_id,
|
|
1751
1786
|
turn_id: input.payload.turn_id ?? state.current_native_turn_id,
|
|
1752
1787
|
transcript_path: runtimeTranscriptPath(input, state),
|
|
@@ -1756,7 +1791,7 @@ function turnTelemetryForTerminal(input, state, observedAt) {
|
|
|
1756
1791
|
let runtime = readRuntimeContextTelemetry(request, input.runtimeTelemetryOptions);
|
|
1757
1792
|
if (runtime.bytes_read > 0)
|
|
1758
1793
|
recordRuntimeTelemetryTiming(state, runtime.io_duration_ms);
|
|
1759
|
-
if (
|
|
1794
|
+
if (behavior.runtimeContextRetry &&
|
|
1760
1795
|
runtime.state === "partial" &&
|
|
1761
1796
|
retryableRuntimeContextReason(runtime.reason)) {
|
|
1762
1797
|
for (const delayMs of STOP_RUNTIME_CONTEXT_RETRY_DELAYS_MS) {
|
|
@@ -1788,26 +1823,27 @@ function turnTelemetryForTerminal(input, state, observedAt) {
|
|
|
1788
1823
|
* events receive only numeric telemetry and an opaque source witness.
|
|
1789
1824
|
*/
|
|
1790
1825
|
function runtimeTranscriptPath(input, state) {
|
|
1791
|
-
|
|
1826
|
+
const discover = adapterBehavior(input.adapter).discoverTranscript;
|
|
1827
|
+
if (!discover)
|
|
1792
1828
|
return input.payload.transcript_path;
|
|
1793
1829
|
const nativeSessionId = input.payload.session_id ?? input.payload.conversation_id;
|
|
1794
1830
|
if (!nativeSessionId)
|
|
1795
1831
|
return input.payload.transcript_path;
|
|
1796
1832
|
const supplied = input.payload.transcript_path;
|
|
1797
1833
|
if (supplied) {
|
|
1798
|
-
const verified =
|
|
1834
|
+
const verified = discover(nativeSessionId, supplied, input.runtimeTelemetryOptions);
|
|
1799
1835
|
if (verified)
|
|
1800
1836
|
state.runtime_transcript_path = verified;
|
|
1801
1837
|
// Preserve a supplied mismatch so the typed reader reports it honestly.
|
|
1802
1838
|
return verified ?? supplied;
|
|
1803
1839
|
}
|
|
1804
1840
|
if (state.runtime_transcript_path) {
|
|
1805
|
-
const verified =
|
|
1841
|
+
const verified = discover(nativeSessionId, state.runtime_transcript_path, input.runtimeTelemetryOptions);
|
|
1806
1842
|
if (verified)
|
|
1807
1843
|
return verified;
|
|
1808
1844
|
state.runtime_transcript_path = undefined;
|
|
1809
1845
|
}
|
|
1810
|
-
const discovered =
|
|
1846
|
+
const discovered = discover(nativeSessionId, undefined, input.runtimeTelemetryOptions);
|
|
1811
1847
|
if (discovered)
|
|
1812
1848
|
state.runtime_transcript_path = discovered;
|
|
1813
1849
|
return discovered;
|
|
@@ -1889,12 +1925,13 @@ function maybeAttestTuningChange(input, state, path, rootId) {
|
|
|
1889
1925
|
let candidate;
|
|
1890
1926
|
let attestationSource = "native";
|
|
1891
1927
|
let sourceEvent = `${input.adapter}.effort-payload`;
|
|
1892
|
-
|
|
1928
|
+
const behavior = adapterBehavior(input.adapter);
|
|
1929
|
+
if (behavior.effortAttestation === "payload") {
|
|
1893
1930
|
if (!input.payload.effort)
|
|
1894
1931
|
return;
|
|
1895
1932
|
candidate = { effort: input.payload.effort };
|
|
1896
1933
|
}
|
|
1897
|
-
else if (
|
|
1934
|
+
else if (behavior.effortAttestation === "rollout-probe" &&
|
|
1898
1935
|
(input.signal === "stop" ||
|
|
1899
1936
|
// Early probe: without it, a Codex card shows no effort until the first
|
|
1900
1937
|
// turn terminal. One rollout read per turn while effort is unknown.
|
|
@@ -1936,9 +1973,9 @@ function maybeAttestTuningChange(input, state, path, rootId) {
|
|
|
1936
1973
|
if (baseline.effort === next.effort && (candidate.speed ?? baseline.speed) === baseline.speed) {
|
|
1937
1974
|
return;
|
|
1938
1975
|
}
|
|
1939
|
-
//
|
|
1940
|
-
// carries speed and the (possibly swapped) model, so refresh from it.
|
|
1941
|
-
if (
|
|
1976
|
+
// Payload change detection rides the payload; the paired transcript row
|
|
1977
|
+
// also carries speed and the (possibly swapped) model, so refresh from it.
|
|
1978
|
+
if (behavior.transcriptTuningRefresh) {
|
|
1942
1979
|
const runtime = readRuntimeTuning({
|
|
1943
1980
|
adapter: "claude-code",
|
|
1944
1981
|
transcript_path: input.payload.transcript_path,
|
|
@@ -2074,11 +2111,7 @@ function commitRuntimeAttestationChange(input, state, path, rootId, change) {
|
|
|
2074
2111
|
commitEventLocked(input, state, path, event);
|
|
2075
2112
|
}
|
|
2076
2113
|
function modelProviderFor(adapter) {
|
|
2077
|
-
|
|
2078
|
-
return "anthropic";
|
|
2079
|
-
if (adapter === "codex")
|
|
2080
|
-
return "openai";
|
|
2081
|
-
return adapter;
|
|
2114
|
+
return adapterBehavior(adapter).modelProvider;
|
|
2082
2115
|
}
|
|
2083
2116
|
function recordRuntimeTelemetryTiming(state, durationMs) {
|
|
2084
2117
|
const duration = Math.max(0, Math.ceil(durationMs));
|
|
@@ -2277,39 +2310,11 @@ function buildMidFlightSessionStart(input, state, rootId, cursorPromptBootstrap
|
|
|
2277
2310
|
* so it is a high-confidence session boundary rather than degraded recovery.
|
|
2278
2311
|
*/
|
|
2279
2312
|
function isCursorPromptBootstrap(input) {
|
|
2280
|
-
return (input.adapter
|
|
2313
|
+
return (adapterBehavior(input.adapter).promptMayPrecedeSessionStart &&
|
|
2281
2314
|
input.signal === "user-prompt-submit" &&
|
|
2282
2315
|
(input.payload.conversation_id !== undefined || input.payload.session_id !== undefined) &&
|
|
2283
2316
|
input.payload.turn_id !== undefined);
|
|
2284
2317
|
}
|
|
2285
|
-
/** Privacy-safe environment and recovery provenance for Codex mid-flight
|
|
2286
|
-
* onboarding. WSLENV values are never recorded, only normalized variable
|
|
2287
|
-
* names, and the native session identifier itself remains fingerprinted. */
|
|
2288
|
-
export function codexMidFlightDiagnosticContext(payload, env = process.env) {
|
|
2289
|
-
const wslenv = env.WSLENV?.trim() ?? "";
|
|
2290
|
-
const wslenvNames = [
|
|
2291
|
-
...new Set(wslenv
|
|
2292
|
-
.split(":")
|
|
2293
|
-
.map((entry) => entry.split("/", 1)[0]?.trim() ?? "")
|
|
2294
|
-
.filter((name) => /^[A-Za-z_][A-Za-z0-9_]*$/.test(name))),
|
|
2295
|
-
]
|
|
2296
|
-
.sort()
|
|
2297
|
-
.join(":")
|
|
2298
|
-
.slice(0, 512);
|
|
2299
|
-
const identityRecoverySource = payload.session_id
|
|
2300
|
-
? "native_session_id"
|
|
2301
|
-
: payload.conversation_id
|
|
2302
|
-
? "native_conversation_id"
|
|
2303
|
-
: payload.agent_id
|
|
2304
|
-
? "native_agent_id"
|
|
2305
|
-
: "unavailable";
|
|
2306
|
-
return {
|
|
2307
|
-
thread_id_present: Boolean(env.CODEX_THREAD_ID?.trim()),
|
|
2308
|
-
wslenv_present: wslenv.length > 0,
|
|
2309
|
-
wslenv_names: wslenvNames,
|
|
2310
|
-
identity_recovery_source: identityRecoverySource,
|
|
2311
|
-
};
|
|
2312
|
-
}
|
|
2313
2318
|
function suppressClosedSpanSignal(input, sessionHash, category) {
|
|
2314
2319
|
writeProducerDiagnosticV3(input.coordRoot, category, {
|
|
2315
2320
|
adapter: input.adapter,
|
|
@@ -2616,7 +2621,7 @@ export function reanchorArchivedHookProducersV3(input) {
|
|
|
2616
2621
|
payload: {
|
|
2617
2622
|
raw: {},
|
|
2618
2623
|
...(previous.current_native_turn_id ? { turn_id: previous.current_native_turn_id } : {}),
|
|
2619
|
-
...(previous.adapter
|
|
2624
|
+
...(adapterBehavior(previous.adapter).tracksExecutionMode && previous.cursor_mode
|
|
2620
2625
|
? { cursor_mode: previous.cursor_mode }
|
|
2621
2626
|
: {}),
|
|
2622
2627
|
},
|
|
@@ -2761,7 +2766,8 @@ export function reconcilePendingRuntimeContextV3(input) {
|
|
|
2761
2766
|
// holds everything this producer durably recorded.
|
|
2762
2767
|
return { state: "missing" };
|
|
2763
2768
|
}
|
|
2764
|
-
if (state.adapter
|
|
2769
|
+
if (!adapterBehavior(state.adapter).runtimeContextRetry ||
|
|
2770
|
+
!state.pending_runtime_contexts?.length) {
|
|
2765
2771
|
return { state: "not_pending" };
|
|
2766
2772
|
}
|
|
2767
2773
|
const context = fingerprintContextV3(input.coordRoot, rootId, state.generation_id, state.privacy_epoch_id);
|
|
@@ -2845,7 +2851,9 @@ function newProducerState(input, sessionId, epochId, boundaryEventId, genesisId)
|
|
|
2845
2851
|
generation_id: input.delegated_child?.generation_id ?? generationIdV3(),
|
|
2846
2852
|
attestation_id: attestationIdV3(),
|
|
2847
2853
|
capability_profile: adapterCapabilityProfileDigestV3(input.adapter),
|
|
2848
|
-
cursor_mode: input.adapter
|
|
2854
|
+
cursor_mode: adapterBehavior(input.adapter).tracksExecutionMode
|
|
2855
|
+
? (input.payload.cursor_mode ?? "unknown")
|
|
2856
|
+
: undefined,
|
|
2849
2857
|
privacy_epoch_id: epochId,
|
|
2850
2858
|
epoch_genesis_id: genesisId,
|
|
2851
2859
|
boot_id: bootId,
|
|
@@ -3006,7 +3014,7 @@ function sourceIdForSignal(input, context) {
|
|
|
3006
3014
|
: undefined;
|
|
3007
3015
|
}
|
|
3008
3016
|
function cursorShellSemanticKey(input, context) {
|
|
3009
|
-
if (input.adapter
|
|
3017
|
+
if (!adapterBehavior(input.adapter).shellOperationDedup)
|
|
3010
3018
|
return undefined;
|
|
3011
3019
|
const command = extractBashCommand(input.payload.tool_name, input.payload.tool_input);
|
|
3012
3020
|
return command
|
|
@@ -3134,9 +3142,9 @@ function producerStatePath(coordRoot, adapter, sessionHash) {
|
|
|
3134
3142
|
function acquireStateLease(coordRoot, statePath) {
|
|
3135
3143
|
const directory = join(statePath, "..");
|
|
3136
3144
|
const producerRoot = join(resolve(coordRoot), EVENT_V3_LEDGER_RELATIVE_ROOT, "private-producers");
|
|
3137
|
-
mkdirSync(directory, { recursive: true, mode:
|
|
3138
|
-
chmodSync(producerRoot,
|
|
3139
|
-
chmodSync(directory,
|
|
3145
|
+
mkdirSync(directory, { recursive: true, mode: stateDirMode() });
|
|
3146
|
+
chmodSync(producerRoot, stateDirMode());
|
|
3147
|
+
chmodSync(directory, stateDirMode());
|
|
3140
3148
|
const acquiredControl = readEventV3ControlState(coordRoot);
|
|
3141
3149
|
const acquiredGenesis = acquiredControl.state === "candidate" || acquiredControl.state === "active"
|
|
3142
3150
|
? acquiredControl.genesis.event.payload.genesis_id
|
|
@@ -3179,13 +3187,13 @@ function publishProducerState(coordRoot, path, state) {
|
|
|
3179
3187
|
const temporary = `${path}.tmp-${process.pid}-${randomUUID()}`;
|
|
3180
3188
|
let fd;
|
|
3181
3189
|
try {
|
|
3182
|
-
fd = openSync(temporary, "wx",
|
|
3190
|
+
fd = openSync(temporary, "wx", stateFileMode());
|
|
3183
3191
|
writeFileSync(fd, `${JSON.stringify(state)}\n`, "utf8");
|
|
3184
3192
|
fsyncSync(fd);
|
|
3185
3193
|
closeSync(fd);
|
|
3186
3194
|
fd = undefined;
|
|
3187
3195
|
renameSync(temporary, path);
|
|
3188
|
-
chmodSync(path,
|
|
3196
|
+
chmodSync(path, stateFileMode());
|
|
3189
3197
|
fsyncParentDirectory(path);
|
|
3190
3198
|
}
|
|
3191
3199
|
finally {
|
|
@@ -3200,8 +3208,8 @@ function readProducerState(path) {
|
|
|
3200
3208
|
if (!metadata.isFile() || metadata.isSymbolicLink()) {
|
|
3201
3209
|
throw new Error("V3 producer state path is unsafe");
|
|
3202
3210
|
}
|
|
3203
|
-
if ((metadata.mode
|
|
3204
|
-
throw new Error("V3 producer state is
|
|
3211
|
+
if (stateModeTooOpen(metadata.mode))
|
|
3212
|
+
throw new Error("V3 producer state is open to other users");
|
|
3205
3213
|
let parsed;
|
|
3206
3214
|
try {
|
|
3207
3215
|
parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
@@ -3230,7 +3238,7 @@ function readProducerState(path) {
|
|
|
3230
3238
|
state.pending_runtime_contexts.length === 0) {
|
|
3231
3239
|
state.pending_runtime_contexts = undefined;
|
|
3232
3240
|
}
|
|
3233
|
-
if (state.adapter
|
|
3241
|
+
if (adapterBehavior(state.adapter).tracksExecutionMode)
|
|
3234
3242
|
state.cursor_mode ??= "unknown";
|
|
3235
3243
|
const allowedKeys = new Set([
|
|
3236
3244
|
"active_runtime_context_probe",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../../../src/core/events/v3/recovery.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../../../src/core/events/v3/recovery.ts"],"names":[],"mappings":"AAuBA,OAAO,EAGL,KAAK,sBAAsB,EAO5B,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,gCAAgC;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,UAAU,MAAM,EAAE,CAAC;IACjC,gBAAgB,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,iCAAiC;IAChD,KAAK,EAAE,WAAW,GAAG,mBAAmB,CAAC;IACzC,OAAO,EAAE,sBAAsB,CAAC;CACjC;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,gCAAgC,GACtC,iCAAiC,CAoEnC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { chmodSync, closeSync, existsSync, fsyncSync, linkSync, mkdirSync, openSync, readdirSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
2
2
|
import { basename, join, resolve } from "node:path";
|
|
3
|
+
import { stateDirMode, stateFileMode } from "../../storage/modes.js";
|
|
3
4
|
import { fsyncParentDirectory } from "../../workflow/durable-record.js";
|
|
4
5
|
import { initializeEventLedgerV3 } from "./bootstrap.js";
|
|
5
6
|
import { canonicalJsonV3, sha256V3 } from "./canonical.js";
|
|
@@ -90,8 +91,8 @@ function recoveryIdFor(failure) {
|
|
|
90
91
|
function publishRecoveryIntent(root, value) {
|
|
91
92
|
const intent = validateEventV3RecoveryIntent(value);
|
|
92
93
|
const records = eventV3RecoveryRecordsRoot(root);
|
|
93
|
-
mkdirSync(records, { recursive: true, mode:
|
|
94
|
-
chmodSync(records,
|
|
94
|
+
mkdirSync(records, { recursive: true, mode: stateDirMode() });
|
|
95
|
+
chmodSync(records, stateDirMode());
|
|
95
96
|
const path = recoveryIntentPath(records, intent.recovery_id);
|
|
96
97
|
const serialized = `${canonicalJsonV3(intent)}\n`;
|
|
97
98
|
if (existsSync(path)) {
|
|
@@ -209,7 +210,7 @@ function publishExclusive(path, serialized) {
|
|
|
209
210
|
const temporary = `${path}.tmp.${process.pid}`;
|
|
210
211
|
let fd;
|
|
211
212
|
try {
|
|
212
|
-
fd = openSync(temporary, "wx",
|
|
213
|
+
fd = openSync(temporary, "wx", stateFileMode());
|
|
213
214
|
writeFileSync(fd, serialized, "utf8");
|
|
214
215
|
fsyncSync(fd);
|
|
215
216
|
closeSync(fd);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inventory.d.ts","sourceRoot":"","sources":["../../../../../src/core/events/v3/support-storage/inventory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"inventory.d.ts","sourceRoot":"","sources":["../../../../../src/core/events/v3/support-storage/inventory.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,KAAK,oCAAoC,EACzC,KAAK,yBAAyB,EAC/B,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE/D,MAAM,WAAW,+BAA+B;IAC9C,KAAK,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,4BAA4B;IAC3C,SAAS,EAAE,+BAA+B,CAAC;IAC3C,MAAM,EAAE,oBAAoB,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,MAAM,EAAE,CAAC;IAC3B,WAAW,EAAE,yBAAyB,CAAC;IACvC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE;QACR,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,4BAA4B;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,+BAA+B,CAAC;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CACf,MAAM,EACN,IAAI,CAAC,oCAAoC,EAAE,QAAQ,GAAG,iBAAiB,GAAG,KAAK,CAAC,CACjF,CAAC;CACH;AAQD,0FAA0F;AAC1F,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,4BAA4B,GAClC,OAAO,CAAC,4BAA4B,EAAE,CAAC,CAqEzC"}
|
|
@@ -2,6 +2,7 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
import { createReadStream } from "node:fs";
|
|
3
3
|
import { lstat, readdir, realpath } from "node:fs/promises";
|
|
4
4
|
import { basename, join, relative, resolve } from "node:path";
|
|
5
|
+
import { stateModeTooOpen } from "../../../storage/modes.js";
|
|
5
6
|
import { classifyEventV3Support, } from "./classify.js";
|
|
6
7
|
const SUPPORT_ROOTS = [
|
|
7
8
|
{ prefix: "diagnostics", family: "diagnostic" },
|
|
@@ -58,7 +59,7 @@ export async function inventoryEventV3Support(input) {
|
|
|
58
59
|
authority_state: input.authority.state,
|
|
59
60
|
now: input.now,
|
|
60
61
|
file_regular: true,
|
|
61
|
-
file_owner_only: (fileStat.mode
|
|
62
|
+
file_owner_only: !stateModeTooOpen(fileStat.mode),
|
|
62
63
|
});
|
|
63
64
|
results.push({
|
|
64
65
|
authority: input.authority,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"maintenance.d.ts","sourceRoot":"","sources":["../../../../../src/core/events/v3/support-storage/maintenance.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"maintenance.d.ts","sourceRoot":"","sources":["../../../../../src/core/events/v3/support-storage/maintenance.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
import { constants, createReadStream } from "node:fs";
|
|
3
3
|
import { chmod, lstat, mkdir, open, readdir, readFile, realpath } from "node:fs/promises";
|
|
4
4
|
import { join, relative, resolve } from "node:path";
|
|
5
|
+
import { stateDirMode, stateFileMode } from "../../../storage/modes.js";
|
|
5
6
|
import { canonicalJsonV3 } from "../canonical.js";
|
|
6
7
|
import { digestEventV3LogicalAuthority } from "./logical-authority.js";
|
|
7
8
|
import { assertEventV3SupportPackAuthority, logicalEntriesDigestV3 } from "./pack-contract.js";
|
|
@@ -68,7 +69,7 @@ export async function planEventV3SupportTransaction(input) {
|
|
|
68
69
|
};
|
|
69
70
|
const directory = transactionDirectory(input.transaction_root, transactionId);
|
|
70
71
|
try {
|
|
71
|
-
await mkdir(directory, { recursive: false, mode:
|
|
72
|
+
await mkdir(directory, { recursive: false, mode: stateDirMode() });
|
|
72
73
|
}
|
|
73
74
|
catch (error) {
|
|
74
75
|
if (error.code !== "EEXIST")
|
|
@@ -79,7 +80,7 @@ export async function planEventV3SupportTransaction(input) {
|
|
|
79
80
|
}
|
|
80
81
|
return existing;
|
|
81
82
|
}
|
|
82
|
-
await chmod(directory,
|
|
83
|
+
await chmod(directory, stateDirMode());
|
|
83
84
|
await publishState(directory, transaction);
|
|
84
85
|
return transaction;
|
|
85
86
|
}
|
|
@@ -284,7 +285,7 @@ function validTransition(from, to) {
|
|
|
284
285
|
}
|
|
285
286
|
async function publishState(directory, transaction) {
|
|
286
287
|
const path = join(directory, `state-${String(transaction.sequence).padStart(6, "0")}.json`);
|
|
287
|
-
const handle = await open(path, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL,
|
|
288
|
+
const handle = await open(path, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL, stateFileMode());
|
|
288
289
|
try {
|
|
289
290
|
await handle.writeFile(`${canonicalJsonV3(transaction)}\n`, "utf8");
|
|
290
291
|
await handle.sync();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pack-reader.d.ts","sourceRoot":"","sources":["../../../../../src/core/events/v3/support-storage/pack-reader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pack-reader.d.ts","sourceRoot":"","sources":["../../../../../src/core/events/v3/support-storage/pack-reader.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,EAI9B,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,wBAAwB;IACvC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,sBAAsB,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAClE;AAED,MAAM,WAAW,+BACf,SAAQ,IAAI,CAAC,wBAAwB,EAAE,gBAAgB,CAAC;IACxD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,0BAA0B,CAAC;IACrC,OAAO,EAAE,+BAA+B,EAAE,CAAC;CAC5C;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,0BAA0B,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAUD,wBAAsB,8BAA8B,CAClD,YAAY,EAAE,MAAM,EACpB,MAAM,GAAE,wBAA6B,GACpC,OAAO,CAAC,0BAA0B,CAAC,CAarC;AAED,4FAA4F;AAC5F,wBAAuB,+BAA+B,CACpD,YAAY,EAAE,MAAM,EACpB,MAAM,GAAE,wBAA6B,GACpC,cAAc,CAAC,+BAA+B,CAAC,CAGjD;AA2GD,wBAAsB,0BAA0B,CAC9C,YAAY,EAAE,MAAM,EACpB,MAAM,GAAE,wBAA6B,GACpC,OAAO,CAAC,2BAA2B,CAAC,CAWtC;AAED,yFAAyF;AACzF,wBAAsB,wBAAwB,CAC5C,YAAY,EAAE,MAAM,EACpB,MAAM,GAAE,wBAA6B,GACpC,OAAO,CAAC,0BAA0B,CAAC,CAarC;AAED,0FAA0F;AAC1F,wBAAsB,wBAAwB,CAC5C,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,wBAA6B,GACpC,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CA0BhE"}
|