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":"image-capture.d.ts","sourceRoot":"","sources":["../../../../src/core/hooks/effects/image-capture.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAeH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"image-capture.d.ts","sourceRoot":"","sources":["../../../../src/core/hooks/effects/image-capture.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAeH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAG3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAgBzD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAQD,mFAAmF;AACnF,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,gBAAgB,GAAG,gBAAgB,EAC9C,OAAO,EAAE,aAAa,GAAG,IAAI,GAC5B,qBAAqB,EAAE,CA0BzB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,OAAO,EACpB,SAAS,EAAE,SAAS,qBAAqB,EAAE,EAC3C,iBAAiB,CAAC,EAAE,OAAO,MAAM,EAAE,GAClC,IAAI,CAON;AAED,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,OAAO,EACpB,QAAQ,EAAE,qBAAqB,GAC9B,OAAO,CA4CT;AAED,wEAAwE;AACxE,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CA0CpD"}
|
|
@@ -11,6 +11,7 @@ import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, s
|
|
|
11
11
|
import { isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
12
12
|
import { buildEventV3 } from "../../events/v3/builder.js";
|
|
13
13
|
import { writeEventV3 } from "../../events/v3/writer.js";
|
|
14
|
+
import { stateFileMode } from "../../storage/modes.js";
|
|
14
15
|
const IMAGE_EXTS = new Set(["png", "jpg", "jpeg", "gif", "webp", "bmp", "svg"]);
|
|
15
16
|
const MEDIA_TYPES = {
|
|
16
17
|
png: "image/png",
|
|
@@ -217,7 +218,7 @@ function captureOne(imagesDir, candidate) {
|
|
|
217
218
|
if (!existsSync(destination)) {
|
|
218
219
|
mkdirSync(imagesDir, { recursive: true });
|
|
219
220
|
const temporary = `${destination}.tmp.${process.pid}.${randomUUID().slice(0, 8)}`;
|
|
220
|
-
writeFileSync(temporary, bytes, { mode:
|
|
221
|
+
writeFileSync(temporary, bytes, { mode: stateFileMode() });
|
|
221
222
|
renameSync(temporary, destination);
|
|
222
223
|
}
|
|
223
224
|
return { hash, ext, bytes: stat.size };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../../../src/core/hooks/prompt-context/contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEhD,eAAO,MAAM,6BAA6B,EAAG,mCAA4C,CAAC;AAC1F,eAAO,MAAM,4BAA4B,EAAG,kCAA2C,CAAC;AAExF,eAAO,MAAM,iCAAiC,QAAS,CAAC;AACxD,eAAO,MAAM,uCAAuC,QAAS,CAAC;AAC9D,eAAO,MAAM,6BAA6B,SAAU,CAAC;AACrD,eAAO,MAAM,+BAA+B,QAAkB,CAAC;AAM/D,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,aAAa,CAAC;AAE7D,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,OAAO,6BAA6B,CAAC;IAC7C,KAAK,EAAE,oBAAoB,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,OAAO,4BAA4B,CAAC;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EACF,UAAU,GACV,WAAW,GACX,mBAAmB,GACnB,SAAS,GACT,QAAQ,GACR,cAAc,GACd,gBAAgB,GAChB,kBAAkB,GAClB,OAAO,GACP,WAAW,CAAC;IAChB,QAAQ,EAAE,qBAAqB,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,MAAM,6BAA6B,GACrC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,qBAAqB,CAAA;CAAE,GAC1C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../../../src/core/hooks/prompt-context/contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEhD,eAAO,MAAM,6BAA6B,EAAG,mCAA4C,CAAC;AAC1F,eAAO,MAAM,4BAA4B,EAAG,kCAA2C,CAAC;AAExF,eAAO,MAAM,iCAAiC,QAAS,CAAC;AACxD,eAAO,MAAM,uCAAuC,QAAS,CAAC;AAC9D,eAAO,MAAM,6BAA6B,SAAU,CAAC;AACrD,eAAO,MAAM,+BAA+B,QAAkB,CAAC;AAM/D,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,aAAa,CAAC;AAE7D,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,OAAO,6BAA6B,CAAC;IAC7C,KAAK,EAAE,oBAAoB,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,OAAO,4BAA4B,CAAC;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EACF,UAAU,GACV,WAAW,GACX,mBAAmB,GACnB,SAAS,GACT,QAAQ,GACR,cAAc,GACd,gBAAgB,GAChB,kBAAkB,GAClB,OAAO,GACP,WAAW,CAAC;IAChB,QAAQ,EAAE,qBAAqB,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,MAAM,6BAA6B,GACrC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,qBAAqB,CAAA;CAAE,GAC1C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AASlC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,qBAAqB,CAE7E;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,GAAG,IAAI,CAgBnF;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAC/C,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,sBAAsB,CAUzB;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,6BAA6B,CA6CzF"}
|
|
@@ -48,7 +48,7 @@ export type SessionNameDisplayInspection = {
|
|
|
48
48
|
state: "absent";
|
|
49
49
|
} | {
|
|
50
50
|
state: "unavailable";
|
|
51
|
-
reason: "missing_transcript" | "transcript_not_ready";
|
|
51
|
+
reason: "missing_transcript" | "transcript_not_ready" | "transcript_parse_error";
|
|
52
52
|
};
|
|
53
53
|
/**
|
|
54
54
|
* Inspect the ordered post-mint reply without conflating a malformed display
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transcript.d.ts","sourceRoot":"","sources":["../../../../src/core/hooks/resolve/transcript.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,2BAA2B,wBAAc,CAAC;AAEvD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAQhF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,yBAAyB,CACvC,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,MAAM,EAAE,MAAM,GACb,OAAO,CAiCT;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,oBAAoB,EAAE,MAAM,GAAG,SAAS,GACvC,OAAO,CAKT;AAED,kFAAkF;AAClF,wBAAgB,uBAAuB,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAgB9F;AAED;;;;;GAKG;AACH,wBAAgB,mCAAmC,CACjD,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,OAAO,GAC/D,OAAO,CAIT;AAED,MAAM,MAAM,4BAA4B,GACpC;IAAE,KAAK,EAAE,SAAS,CAAA;CAAE,GACpB;IAAE,KAAK,EAAE,QAAQ,CAAA;CAAE,GACnB;
|
|
1
|
+
{"version":3,"file":"transcript.d.ts","sourceRoot":"","sources":["../../../../src/core/hooks/resolve/transcript.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,2BAA2B,wBAAc,CAAC;AAEvD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAQhF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,yBAAyB,CACvC,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,MAAM,EAAE,MAAM,GACb,OAAO,CAiCT;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,oBAAoB,EAAE,MAAM,GAAG,SAAS,GACvC,OAAO,CAKT;AAED,kFAAkF;AAClF,wBAAgB,uBAAuB,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAgB9F;AAED;;;;;GAKG;AACH,wBAAgB,mCAAmC,CACjD,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,OAAO,GAC/D,OAAO,CAIT;AAED,MAAM,MAAM,4BAA4B,GACpC;IAAE,KAAK,EAAE,SAAS,CAAA;CAAE,GACpB;IAAE,KAAK,EAAE,QAAQ,CAAA;CAAE,GACnB;IACE,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,EAAE,oBAAoB,GAAG,sBAAsB,GAAG,wBAAwB,CAAC;CAClF,CAAC;AAEN;;;;;GAKG;AACH,wBAAgB,oCAAoC,CAClD,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,OAAO,GAC/D,4BAA4B,CAqD9B;AAgBD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAUrF;AAwDD;4CAC4C;AAC5C,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd;+EAC2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,qBAAqB,CACnC,cAAc,EAAE,MAAM,GAAG,SAAS,GACjC,qBAAqB,GAAG,SAAS,CA8BnC;AAQD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,gBAAgB,CAC9B,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,SAAS,EAAE,MAAM,GAChB,MAAM,GAAG,SAAS,CAkDpB"}
|
|
@@ -136,19 +136,36 @@ export function inspectSessionNameDisplayImmediately(transcriptPath, name, start
|
|
|
136
136
|
return { state: "unavailable", reason: "transcript_not_ready" };
|
|
137
137
|
let sawMintResult = false;
|
|
138
138
|
let awaitingReply = false;
|
|
139
|
+
let sawParseError = false;
|
|
140
|
+
let missedReplyAtToolBoundary = false;
|
|
139
141
|
for (const line of text.split("\n")) {
|
|
140
142
|
const row = parseTranscriptRow(line);
|
|
141
|
-
if (!row)
|
|
143
|
+
if (!row) {
|
|
144
|
+
if (line.trim()) {
|
|
145
|
+
sawParseError = true;
|
|
146
|
+
// A corrupt row inside the evidence window could be the display.
|
|
147
|
+
// Never turn lost evidence into a negative observation.
|
|
148
|
+
if (awaitingReply)
|
|
149
|
+
return { state: "unavailable", reason: "transcript_parse_error" };
|
|
150
|
+
}
|
|
142
151
|
continue;
|
|
152
|
+
}
|
|
143
153
|
if (toolResponseMintedSessionName(row, name)) {
|
|
144
154
|
sawMintResult = true;
|
|
145
155
|
awaitingReply = true;
|
|
156
|
+
missedReplyAtToolBoundary = false;
|
|
146
157
|
continue;
|
|
147
158
|
}
|
|
148
159
|
if (!awaitingReply)
|
|
149
160
|
continue;
|
|
150
161
|
const assistantText = assistantTextFromRow(row);
|
|
151
|
-
if (assistantText
|
|
162
|
+
if (!assistantText?.trim() && rowContainsAssistantToolCall(row)) {
|
|
163
|
+
missedReplyAtToolBoundary = true;
|
|
164
|
+
}
|
|
165
|
+
// Claude Code streams thinking, text, and tool_use as separate rows with
|
|
166
|
+
// the same message id. Only visible text can satisfy or violate the
|
|
167
|
+
// display contract; an empty extraction is not a mismatching reply.
|
|
168
|
+
if (assistantText !== null && assistantText.trim().length > 0) {
|
|
152
169
|
if (startsWithBlock(assistantText, name))
|
|
153
170
|
return { state: "present" };
|
|
154
171
|
awaitingReply = false;
|
|
@@ -160,11 +177,25 @@ export function inspectSessionNameDisplayImmediately(transcriptPath, name, start
|
|
|
160
177
|
// rather than proof that the agent displayed the title incorrectly. Only a
|
|
161
178
|
// transcript that contains the mint followed by a non-matching assistant
|
|
162
179
|
// reply can safely deny the next tool.
|
|
163
|
-
if (!sawMintResult || awaitingReply) {
|
|
164
|
-
return {
|
|
180
|
+
if (!sawMintResult || awaitingReply || missedReplyAtToolBoundary) {
|
|
181
|
+
return {
|
|
182
|
+
state: "unavailable",
|
|
183
|
+
reason: !sawMintResult && sawParseError ? "transcript_parse_error" : "transcript_not_ready",
|
|
184
|
+
};
|
|
165
185
|
}
|
|
166
186
|
return { state: "absent" };
|
|
167
187
|
}
|
|
188
|
+
function rowContainsAssistantToolCall(row) {
|
|
189
|
+
if (row.type === "assistant") {
|
|
190
|
+
const content = objectValue(row.message)?.content;
|
|
191
|
+
return (Array.isArray(content) && content.some((block) => objectValue(block)?.type === "tool_use"));
|
|
192
|
+
}
|
|
193
|
+
if (row.type === "response_item") {
|
|
194
|
+
const type = objectValue(row.payload)?.type;
|
|
195
|
+
return type === "function_call" || type === "custom_tool_call";
|
|
196
|
+
}
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
168
199
|
/**
|
|
169
200
|
* Resolve a transcript path at the adapter boundary. Windows-native Codex can
|
|
170
201
|
* send `C:\...` while the managed hook executes inside WSL, where the same
|
|
@@ -21,9 +21,11 @@
|
|
|
21
21
|
*
|
|
22
22
|
* Never throws: coordination telemetry must not take down a hook.
|
|
23
23
|
*/
|
|
24
|
+
import type { SessionNameDisplayInspection } from "./resolve/transcript.js";
|
|
24
25
|
export interface SessionNamePresence {
|
|
25
26
|
session_name_present?: boolean;
|
|
26
27
|
session_name_present_for?: string;
|
|
28
|
+
session_name_unavailable_reason?: string;
|
|
27
29
|
}
|
|
28
|
-
export declare function sessionNamePresence(coordRoot: string, instanceId: string, scanAssistantText: (name: string) =>
|
|
30
|
+
export declare function sessionNamePresence(coordRoot: string, instanceId: string, scanAssistantText: (name: string) => SessionNameDisplayInspection): SessionNamePresence;
|
|
29
31
|
//# sourceMappingURL=session-name-presence.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-name-presence.d.ts","sourceRoot":"","sources":["../../../src/core/hooks/session-name-presence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;
|
|
1
|
+
{"version":3,"file":"session-name-presence.d.ts","sourceRoot":"","sources":["../../../src/core/hooks/session-name-presence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAKH,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AAE5E,MAAM,WAAW,mBAAmB;IAClC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,+BAA+B,CAAC,EAAE,MAAM,CAAC;CAC1C;AAED,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,4BAA4B,GAChE,mBAAmB,CAuBrB"}
|
|
@@ -35,12 +35,17 @@ export function sessionNamePresence(coordRoot, instanceId, scanAssistantText) {
|
|
|
35
35
|
}
|
|
36
36
|
// A display of the title Harnery last asked for counts here too, so Stop
|
|
37
37
|
// and the PreToolUse gate cannot disagree about the same reply.
|
|
38
|
-
const
|
|
38
|
+
const inspections = sessionNameDisplayAcceptedNames(row).map((candidate) => scanAssistantText(candidate));
|
|
39
|
+
const present = inspections.some((inspection) => inspection.state === "present");
|
|
40
|
+
const unavailable = inspections.find((inspection) => inspection.state === "unavailable");
|
|
41
|
+
if (!present && unavailable?.state === "unavailable") {
|
|
42
|
+
return { session_name_unavailable_reason: unavailable.reason };
|
|
43
|
+
}
|
|
39
44
|
if (present)
|
|
40
45
|
stampSessionNameSeen(coordRoot, instanceId, name);
|
|
41
46
|
return { session_name_present: present, session_name_present_for: name };
|
|
42
47
|
}
|
|
43
48
|
catch {
|
|
44
|
-
return {};
|
|
49
|
+
return { session_name_unavailable_reason: "observation_error" };
|
|
45
50
|
}
|
|
46
51
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell-waiter.d.ts","sourceRoot":"","sources":["../../../src/core/hooks/shell-waiter.ts"],"names":[],"mappings":"AAqJA,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAgBtF"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/** Recognize inline waiters; this is not a proof of arbitrary shell termination. */
|
|
2
|
+
const REASON = "Inline shell waiter blocked: polling loops and delayed log-only checks can outlive the job " +
|
|
3
|
+
"and accumulate as background tasks. Read the existing task output now, or wait on its " +
|
|
4
|
+
"existing task handle. If polling is necessary, use a reviewed script with a hard deadline, " +
|
|
5
|
+
"nonzero timeout exit, and producer-exit/failure detection. Do not create another waiter " +
|
|
6
|
+
"to check progress or infer completion from a broad pgrep -f pattern.";
|
|
7
|
+
/** Keep quoted arguments opaque, including examples and heredoc bodies. */
|
|
8
|
+
function tokenize(source) {
|
|
9
|
+
const out = [];
|
|
10
|
+
const heredocs = [];
|
|
11
|
+
for (let i = 0; i < source.length;) {
|
|
12
|
+
const ch = source[i];
|
|
13
|
+
if (ch === "\\" && source[i + 1] === "\n") {
|
|
14
|
+
i += 2;
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
if (ch === "\n") {
|
|
18
|
+
out.push({ value: ";", quoted: false, operator: true });
|
|
19
|
+
i++;
|
|
20
|
+
for (const doc of heredocs.splice(0)) {
|
|
21
|
+
while (i < source.length) {
|
|
22
|
+
const end = source.indexOf("\n", i);
|
|
23
|
+
const stop = end === -1 ? source.length : end;
|
|
24
|
+
const line = source.slice(i, stop);
|
|
25
|
+
i = end === -1 ? source.length : end + 1;
|
|
26
|
+
if ((doc.tabs ? line.replace(/^\t+/, "") : line) === doc.end)
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if (/\s/.test(ch)) {
|
|
33
|
+
i++;
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (ch === "#") {
|
|
37
|
+
const end = source.indexOf("\n", i);
|
|
38
|
+
i = end === -1 ? source.length : end;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (";|&(){}<>".includes(ch)) {
|
|
42
|
+
const op = source.slice(i).match(/^(?:<<-?|>>|&&|\|\||[;|&(){}<>])/)[0];
|
|
43
|
+
out.push({ value: op, quoted: false, operator: true });
|
|
44
|
+
i += op.length;
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
let value = "";
|
|
48
|
+
let quoted = false;
|
|
49
|
+
while (i < source.length && !/[\s;|&(){}<>]/.test(source[i])) {
|
|
50
|
+
const next = source[i++];
|
|
51
|
+
if (next === "'" || next === '"' || next === "`") {
|
|
52
|
+
quoted = true;
|
|
53
|
+
while (i < source.length && source[i] !== next) {
|
|
54
|
+
if (source[i] === "\\" && next !== "'" && i + 1 < source.length)
|
|
55
|
+
i++;
|
|
56
|
+
value += source[i++];
|
|
57
|
+
}
|
|
58
|
+
if (source[i] === next)
|
|
59
|
+
i++;
|
|
60
|
+
}
|
|
61
|
+
else if (next === "\\" && i < source.length) {
|
|
62
|
+
const escaped = source[i++];
|
|
63
|
+
if (escaped !== "\n")
|
|
64
|
+
value += escaped;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
value += next;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const previous = out.at(-1)?.value;
|
|
71
|
+
if (previous === "<<" || previous === "<<-") {
|
|
72
|
+
heredocs.push({ end: value, tabs: previous === "<<-" });
|
|
73
|
+
}
|
|
74
|
+
out.push({ value, quoted });
|
|
75
|
+
}
|
|
76
|
+
return out;
|
|
77
|
+
}
|
|
78
|
+
function basename(value) {
|
|
79
|
+
return value.split(/[\\/]/).at(-1) ?? value;
|
|
80
|
+
}
|
|
81
|
+
function isWaiter(source, depth = 0) {
|
|
82
|
+
if (depth > 8)
|
|
83
|
+
return false;
|
|
84
|
+
const tokens = tokenize(source);
|
|
85
|
+
let loops = 0;
|
|
86
|
+
const commands = [];
|
|
87
|
+
let start = true;
|
|
88
|
+
for (let i = 0; i < tokens.length; i++) {
|
|
89
|
+
const token = tokens[i];
|
|
90
|
+
if (token.operator) {
|
|
91
|
+
if ([";", "|", "||", "&", "&&", "(", ")", "{", "}"].includes(token.value))
|
|
92
|
+
start = true;
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
if (!start)
|
|
96
|
+
continue;
|
|
97
|
+
if (!token.quoted) {
|
|
98
|
+
if (["while", "until", "for", "select"].includes(token.value)) {
|
|
99
|
+
loops++;
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (token.value === "done") {
|
|
103
|
+
loops = Math.max(0, loops - 1);
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (["do", "if", "then", "elif", "else", "!"].includes(token.value))
|
|
107
|
+
continue;
|
|
108
|
+
if (/^[A-Za-z_][A-Za-z_0-9]*=/.test(token.value))
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
const name = basename(token.value);
|
|
112
|
+
if (name === "timeout") {
|
|
113
|
+
// Skip timeout options and its duration; inspect the wrapped executable.
|
|
114
|
+
let j = i + 1;
|
|
115
|
+
for (; j < tokens.length && !tokens[j].operator; j++) {
|
|
116
|
+
if (/^(?:\d+(?:\.\d*)?|\.\d+)[smhd]?$/.test(tokens[j].value)) {
|
|
117
|
+
// -k/--kill-after takes its own duration before the main duration.
|
|
118
|
+
const previous = tokens[j - 1]?.value;
|
|
119
|
+
if (previous === "-k" || previous === "--kill-after")
|
|
120
|
+
continue;
|
|
121
|
+
i = j;
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (i === j)
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (["command", "exec", "builtin", "nohup"].includes(name))
|
|
129
|
+
continue;
|
|
130
|
+
start = false;
|
|
131
|
+
commands.push(name);
|
|
132
|
+
if (loops && ["sleep", "pgrep"].includes(name))
|
|
133
|
+
return true;
|
|
134
|
+
if (["bash", "sh", "dash", "zsh", "ksh"].includes(name)) {
|
|
135
|
+
for (let j = i + 1; j < tokens.length && !tokens[j].operator; j++) {
|
|
136
|
+
if (/^-[a-z]*c[a-z]*$/.test(tokens[j].value)) {
|
|
137
|
+
const script = tokens[j + 1];
|
|
138
|
+
if (script && !script.operator && isWaiter(script.value, depth + 1))
|
|
139
|
+
return true;
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
const sleep = commands.indexOf("sleep");
|
|
146
|
+
// sed can edit files or execute commands; its name alone does not prove a log read.
|
|
147
|
+
const readers = new Set(["tail", "cat", "head", "grep", "rg", "wc"]);
|
|
148
|
+
const harmless = new Set(["sleep", "cd", "pwd", "echo", "printf", "date", ...readers]);
|
|
149
|
+
return (sleep !== -1 &&
|
|
150
|
+
commands.slice(sleep + 1).some((name) => readers.has(name)) &&
|
|
151
|
+
commands.every((name) => harmless.has(name)));
|
|
152
|
+
}
|
|
153
|
+
export function shellWaiterReason(toolName, toolInput) {
|
|
154
|
+
if (typeof toolName !== "string")
|
|
155
|
+
return null;
|
|
156
|
+
const name = toolName.toLowerCase().replace(/^functions\./, "");
|
|
157
|
+
if (!["bash", "shell", "shell_command", "exec_command"].includes(name))
|
|
158
|
+
return null;
|
|
159
|
+
let input = toolInput;
|
|
160
|
+
if (typeof input === "string") {
|
|
161
|
+
try {
|
|
162
|
+
input = JSON.parse(input);
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if (!input || typeof input !== "object")
|
|
169
|
+
return null;
|
|
170
|
+
const args = input;
|
|
171
|
+
const command = args.command ?? args.cmd;
|
|
172
|
+
return typeof command === "string" && isWaiter(command) ? REASON : null;
|
|
173
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/core/resources/service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/core/resources/service.ts"],"names":[],"mappings":"AAiBA,OAAO,EAGL,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,EACjC,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAI/C,eAAO,MAAM,oCAAoC,OAAQ,CAAC;AAY1D,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,eAAe,CAAC;IAChC,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAED,MAAM,MAAM,2BAA2B,GACnC;IAAE,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;IAAC,MAAM,EAAE,qBAAqB,CAAA;CAAE,GAC/D;IAAE,KAAK,EAAE,aAAa,GAAG,aAAa,CAAC;IAAC,MAAM,EAAE,qBAAqB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3F,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACpC,OAAO,CAAC,qBAAqB,CAAC,CAwChC;AAED,wBAAsB,4BAA4B,CAChD,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,2BAA2B,CAAC,CAoBtC;AAED,wBAAgB,0BAA0B,CAAC,YAAY,EAAE,MAAM,GAAG,qBAAqB,CAiBtF;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,2BAA2B,CAAC,CAwFtC"}
|
|
@@ -5,6 +5,7 @@ import { hostname, platform } from "node:os";
|
|
|
5
5
|
import { resolve } from "node:path";
|
|
6
6
|
import { checkPidToken, processStartToken } from "../agents/state/proc-start.js";
|
|
7
7
|
import { closeProcessLoggers, legacyLogFields, processLogger } from "../storage/logger.js";
|
|
8
|
+
import { stateDirMode, stateFileMode } from "../storage/modes.js";
|
|
8
9
|
import { RESOURCE_SERVICE_STATUS_SCHEMA_VERSION, } from "./contract.js";
|
|
9
10
|
import { sampleResources } from "./sampler.js";
|
|
10
11
|
import { readResourceServiceStatus } from "./service-status.js";
|
|
@@ -20,7 +21,7 @@ export async function spawnResourceService(coordRootRaw, options = {}) {
|
|
|
20
21
|
}
|
|
21
22
|
const intervalMs = normalizeInterval(options.intervalMs);
|
|
22
23
|
const paths = resourcePaths(coordRoot);
|
|
23
|
-
mkdirSync(paths.root, { recursive: true, mode:
|
|
24
|
+
mkdirSync(paths.root, { recursive: true, mode: stateDirMode() });
|
|
24
25
|
rmSync(paths.stop, { force: true });
|
|
25
26
|
const harnBin = new URL("../../../bin/harn", import.meta.url).pathname;
|
|
26
27
|
if (!existsSync(harnBin))
|
|
@@ -80,7 +81,7 @@ export function requestResourceServiceStop(coordRootRaw) {
|
|
|
80
81
|
const coordRoot = resolve(coordRootRaw);
|
|
81
82
|
const paths = resourcePaths(coordRoot);
|
|
82
83
|
const status = readResourceServiceStatus(coordRoot);
|
|
83
|
-
mkdirSync(paths.root, { recursive: true, mode:
|
|
84
|
+
mkdirSync(paths.root, { recursive: true, mode: stateDirMode() });
|
|
84
85
|
writePrivateJsonAtomic(paths.stop, {
|
|
85
86
|
requested_at: new Date().toISOString(),
|
|
86
87
|
requested_by_pid: process.pid,
|
|
@@ -187,7 +188,7 @@ export async function runResourceService(input) {
|
|
|
187
188
|
}
|
|
188
189
|
function acquireLease(coordRoot, now) {
|
|
189
190
|
const paths = resourcePaths(coordRoot);
|
|
190
|
-
mkdirSync(paths.root, { recursive: true, mode:
|
|
191
|
+
mkdirSync(paths.root, { recursive: true, mode: stateDirMode() });
|
|
191
192
|
for (let attempt = 0; attempt < 2; attempt++) {
|
|
192
193
|
const daemonStartToken = processStartToken(process.pid);
|
|
193
194
|
const lease = {
|
|
@@ -198,7 +199,7 @@ function acquireLease(coordRoot, now) {
|
|
|
198
199
|
created_at: now.toISOString(),
|
|
199
200
|
};
|
|
200
201
|
try {
|
|
201
|
-
const fd = openSync(paths.lease, "wx",
|
|
202
|
+
const fd = openSync(paths.lease, "wx", stateFileMode());
|
|
202
203
|
try {
|
|
203
204
|
writeFileSync(fd, `${JSON.stringify(lease)}\n`, "utf8");
|
|
204
205
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../../src/core/semantic/review.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../../src/core/semantic/review.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createHash, randomBytes, randomUUID } from "node:crypto";
|
|
2
2
|
import { chmodSync, existsSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, statSync, writeFileSync, } from "node:fs";
|
|
3
3
|
import { dirname, join, resolve } from "node:path";
|
|
4
|
+
import { stateDirMode, stateFileMode } from "../storage/modes.js";
|
|
4
5
|
import { SEMANTIC_EXPRESSION_CUES, SEMANTIC_HARNESSES, SEMANTIC_PHASES, SEMANTIC_TAGS, } from "./contract.js";
|
|
5
6
|
import { buildSemanticEvidenceV1 } from "./evidence.js";
|
|
6
7
|
import { listSemanticAgentDocuments } from "./storage.js";
|
|
@@ -415,12 +416,12 @@ function writePrivateJsonAtomic(path, value) {
|
|
|
415
416
|
const body = `${JSON.stringify(value, null, 2)}\n`;
|
|
416
417
|
if (Buffer.byteLength(body) > MAX_JSON_BYTES)
|
|
417
418
|
throw new Error("semantic review file is too large");
|
|
418
|
-
mkdirSync(dirname(path), { recursive: true, mode:
|
|
419
|
-
chmodSync(dirname(path),
|
|
419
|
+
mkdirSync(dirname(path), { recursive: true, mode: stateDirMode() });
|
|
420
|
+
chmodSync(dirname(path), stateDirMode());
|
|
420
421
|
const temporary = `${path}.tmp-${process.pid}-${randomBytes(4).toString("hex")}`;
|
|
421
|
-
writeFileSync(temporary, body, { encoding: "utf8", flag: "wx", mode:
|
|
422
|
+
writeFileSync(temporary, body, { encoding: "utf8", flag: "wx", mode: stateFileMode() });
|
|
422
423
|
renameSync(temporary, path);
|
|
423
|
-
chmodSync(path,
|
|
424
|
+
chmodSync(path, stateFileMode());
|
|
424
425
|
}
|
|
425
426
|
function isSemanticReviewCandidate(value) {
|
|
426
427
|
if (!isRecord(value) || value.schema_version !== SEMANTIC_REVIEW_SCHEMA_VERSION)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/core/semantic/service.ts"],"names":[],"mappings":"AAoBA,OAAO,EAGL,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/core/semantic/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ import { coordEnv } from "../../lib/env.js";
|
|
|
7
7
|
import { readEventV3ControlState, readLedgerV3Since, } from "../events/v3/index.js";
|
|
8
8
|
import { eventV3ActiveWatchPath } from "../events/v3/reader.js";
|
|
9
9
|
import { closeProcessLoggers, encodeBoundedLogObjectArray, legacyLogFields, processLogger, } from "../storage/logger.js";
|
|
10
|
+
import { stateDirMode, stateFileMode } from "../storage/modes.js";
|
|
10
11
|
import { runSemanticOnce } from "./once.js";
|
|
11
12
|
import { semanticPendingPassDue } from "./scheduler.js";
|
|
12
13
|
import { readSemanticServiceStatus, SEMANTIC_SERVICE_STATUS_SCHEMA_VERSION, } from "./service-status.js";
|
|
@@ -47,11 +48,11 @@ export async function spawnSemanticService(coordRootRaw, options = {}) {
|
|
|
47
48
|
throw new Error(`semantic service is already running under pid ${current.record?.pid}`);
|
|
48
49
|
}
|
|
49
50
|
const paths = semanticPaths(coordRoot);
|
|
50
|
-
mkdirSync(paths.root, { recursive: true, mode:
|
|
51
|
+
mkdirSync(paths.root, { recursive: true, mode: stateDirMode() });
|
|
51
52
|
const sharedLogs = coordEnv("SHARED_LOGS") !== "0";
|
|
52
|
-
const logFd = sharedLogs ? undefined : openSync(paths.log, "a",
|
|
53
|
+
const logFd = sharedLogs ? undefined : openSync(paths.log, "a", stateFileMode());
|
|
53
54
|
if (logFd !== undefined)
|
|
54
|
-
chmodSync(paths.log,
|
|
55
|
+
chmodSync(paths.log, stateFileMode());
|
|
55
56
|
const harnBin = new URL("../../../bin/harn", import.meta.url).pathname;
|
|
56
57
|
if (!existsSync(harnBin)) {
|
|
57
58
|
if (logFd !== undefined)
|
|
@@ -132,7 +133,7 @@ export async function ensureSemanticServiceRunning(coordRootRaw, overrides = {})
|
|
|
132
133
|
export function requestSemanticServiceStop(coordRootRaw) {
|
|
133
134
|
const coordRoot = resolve(coordRootRaw);
|
|
134
135
|
const status = readSemanticServiceStatus(coordRoot);
|
|
135
|
-
mkdirSync(semanticPaths(coordRoot).root, { recursive: true, mode:
|
|
136
|
+
mkdirSync(semanticPaths(coordRoot).root, { recursive: true, mode: stateDirMode() });
|
|
136
137
|
writePrivateJsonAtomic(semanticPaths(coordRoot).stop, {
|
|
137
138
|
requested_at: new Date().toISOString(),
|
|
138
139
|
requested_by_pid: process.pid,
|
|
@@ -339,7 +340,7 @@ export async function runSemanticServiceDaemon(input) {
|
|
|
339
340
|
}
|
|
340
341
|
export function acquireSemanticServiceLease(coordRootRaw) {
|
|
341
342
|
const path = semanticPaths(coordRootRaw).lease;
|
|
342
|
-
mkdirSync(dirname(path), { recursive: true, mode:
|
|
343
|
+
mkdirSync(dirname(path), { recursive: true, mode: stateDirMode() });
|
|
343
344
|
const owner = {
|
|
344
345
|
pid: process.pid,
|
|
345
346
|
host: hostname(),
|
|
@@ -348,7 +349,7 @@ export function acquireSemanticServiceLease(coordRootRaw) {
|
|
|
348
349
|
};
|
|
349
350
|
const acquire = () => {
|
|
350
351
|
try {
|
|
351
|
-
const fd = openSync(path, "wx",
|
|
352
|
+
const fd = openSync(path, "wx", stateFileMode());
|
|
352
353
|
try {
|
|
353
354
|
writeFileSync(fd, `${JSON.stringify(owner)}\n`, "utf8");
|
|
354
355
|
}
|
|
@@ -544,9 +545,9 @@ function prepareSemanticServiceDiagnostic(entry) {
|
|
|
544
545
|
}
|
|
545
546
|
function appendSemanticServiceLegacyLog(coordRoot, entry) {
|
|
546
547
|
const path = semanticPaths(coordRoot).log;
|
|
547
|
-
mkdirSync(dirname(path), { recursive: true, mode:
|
|
548
|
-
appendFileSync(path, `${JSON.stringify({ schema_version: 1, ts: new Date().toISOString(), ...entry })}\n`, { encoding: "utf8", mode:
|
|
549
|
-
chmodSync(path,
|
|
548
|
+
mkdirSync(dirname(path), { recursive: true, mode: stateDirMode() });
|
|
549
|
+
appendFileSync(path, `${JSON.stringify({ schema_version: 1, ts: new Date().toISOString(), ...entry })}\n`, { encoding: "utf8", mode: stateFileMode() });
|
|
550
|
+
chmodSync(path, stateFileMode());
|
|
550
551
|
if (statSync(path).size <= MAX_LOG_BYTES)
|
|
551
552
|
return;
|
|
552
553
|
const buffer = readFileSync(path);
|
|
@@ -554,7 +555,7 @@ function appendSemanticServiceLegacyLog(coordRoot, entry) {
|
|
|
554
555
|
const newline = tail.indexOf(10);
|
|
555
556
|
const body = newline >= 0 ? tail.subarray(newline + 1) : tail;
|
|
556
557
|
const temporary = `${path}.tmp-${process.pid}-${randomBytes(4).toString("hex")}`;
|
|
557
|
-
writeFileSync(temporary, body, { flag: "wx", mode:
|
|
558
|
+
writeFileSync(temporary, body, { flag: "wx", mode: stateFileMode() });
|
|
558
559
|
renameSync(temporary, path);
|
|
559
560
|
}
|
|
560
561
|
function writePrivateJsonAtomic(path, value) {
|
|
@@ -562,12 +563,12 @@ function writePrivateJsonAtomic(path, value) {
|
|
|
562
563
|
if (Buffer.byteLength(body) > MAX_FILE_BYTES) {
|
|
563
564
|
throw new Error(`semantic service file exceeds ${MAX_FILE_BYTES} bytes`);
|
|
564
565
|
}
|
|
565
|
-
mkdirSync(dirname(path), { recursive: true, mode:
|
|
566
|
-
chmodSync(dirname(path),
|
|
566
|
+
mkdirSync(dirname(path), { recursive: true, mode: stateDirMode() });
|
|
567
|
+
chmodSync(dirname(path), stateDirMode());
|
|
567
568
|
const temporary = `${path}.tmp-${process.pid}-${randomBytes(4).toString("hex")}`;
|
|
568
|
-
writeFileSync(temporary, body, { encoding: "utf8", flag: "wx", mode:
|
|
569
|
+
writeFileSync(temporary, body, { encoding: "utf8", flag: "wx", mode: stateFileMode() });
|
|
569
570
|
renameSync(temporary, path);
|
|
570
|
-
chmodSync(path,
|
|
571
|
+
chmodSync(path, stateFileMode());
|
|
571
572
|
}
|
|
572
573
|
function validTimestamp(value) {
|
|
573
574
|
return typeof value === "string" && Number.isFinite(Date.parse(value));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/core/semantic/storage.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/core/semantic/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { randomBytes } from "node:crypto";
|
|
|
2
2
|
import { chmodSync, existsSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, statSync, writeFileSync, } from "node:fs";
|
|
3
3
|
import { dirname, join, resolve } from "node:path";
|
|
4
4
|
import { canonicalJsonV3, sha256V3 } from "../events/v3/canonical.js";
|
|
5
|
+
import { stateDirMode, stateFileMode } from "../storage/modes.js";
|
|
5
6
|
import { validateSemanticReadModel } from "./validate.js";
|
|
6
7
|
export const SEMANTIC_MANIFEST_SCHEMA_VERSION = 2;
|
|
7
8
|
const MAX_JSON_BYTES = 512 * 1024;
|
|
@@ -171,10 +172,10 @@ function writePrivateJsonAtomic(path, value) {
|
|
|
171
172
|
if (Buffer.byteLength(body) > MAX_JSON_BYTES) {
|
|
172
173
|
throw new Error(`semantic file exceeds ${MAX_JSON_BYTES} bytes`);
|
|
173
174
|
}
|
|
174
|
-
mkdirSync(dirname(path), { recursive: true, mode:
|
|
175
|
-
chmodSync(dirname(path),
|
|
175
|
+
mkdirSync(dirname(path), { recursive: true, mode: stateDirMode() });
|
|
176
|
+
chmodSync(dirname(path), stateDirMode());
|
|
176
177
|
const temporary = `${path}.tmp-${process.pid}-${randomBytes(4).toString("hex")}`;
|
|
177
|
-
writeFileSync(temporary, body, { encoding: "utf8", flag: "wx", mode:
|
|
178
|
+
writeFileSync(temporary, body, { encoding: "utf8", flag: "wx", mode: stateFileMode() });
|
|
178
179
|
renameSync(temporary, path);
|
|
179
|
-
chmodSync(path,
|
|
180
|
+
chmodSync(path, stateFileMode());
|
|
180
181
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atomic-json.d.ts","sourceRoot":"","sources":["../../../src/core/storage/atomic-json.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"atomic-json.d.ts","sourceRoot":"","sources":["../../../src/core/storage/atomic-json.ts"],"names":[],"mappings":"AAIA,qFAAqF;AACrF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAazE"}
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import { chmodSync, mkdirSync, renameSync, writeFileSync } from "node:fs";
|
|
2
2
|
import { dirname } from "node:path";
|
|
3
|
+
import { stateDirMode, stateFileMode } from "./modes.js";
|
|
3
4
|
/** Write one private JSON projection without exposing a partial frame to readers. */
|
|
4
5
|
export function writePrivateJsonAtomic(path, value) {
|
|
5
|
-
mkdirSync(dirname(path), { recursive: true, mode:
|
|
6
|
+
mkdirSync(dirname(path), { recursive: true, mode: stateDirMode() });
|
|
6
7
|
const temporary = `${path}.tmp.${process.pid}.${Date.now()}`;
|
|
7
|
-
writeFileSync(temporary, `${JSON.stringify(value)}\n`, {
|
|
8
|
+
writeFileSync(temporary, `${JSON.stringify(value)}\n`, {
|
|
9
|
+
encoding: "utf8",
|
|
10
|
+
mode: stateFileMode(),
|
|
11
|
+
});
|
|
8
12
|
try {
|
|
9
|
-
chmodSync(temporary,
|
|
13
|
+
chmodSync(temporary, stateFileMode());
|
|
10
14
|
}
|
|
11
15
|
catch {
|
|
12
16
|
// Windows does not expose POSIX modes. The atomic write still applies.
|