oh-my-codex 0.20.2 → 0.20.5
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/Cargo.lock +36 -18
- package/Cargo.toml +1 -1
- package/README.md +28 -2
- package/crates/omx-runtime/Cargo.toml +4 -0
- package/crates/omx-runtime/src/main.rs +415 -2
- package/crates/omx-runtime/tests/execution.rs +483 -0
- package/crates/omx-runtime-core/src/dispatch.rs +96 -10
- package/crates/omx-runtime-core/src/engine.rs +839 -29
- package/crates/omx-runtime-core/src/lib.rs +8 -0
- package/dist/adapt/__tests__/herdr-target.test.d.ts +2 -0
- package/dist/adapt/__tests__/herdr-target.test.d.ts.map +1 -0
- package/dist/adapt/__tests__/herdr-target.test.js +72 -0
- package/dist/adapt/__tests__/herdr-target.test.js.map +1 -0
- package/dist/adapt/contracts.d.ts +1 -1
- package/dist/adapt/contracts.d.ts.map +1 -1
- package/dist/adapt/contracts.js +1 -1
- package/dist/adapt/contracts.js.map +1 -1
- package/dist/adapt/herdr/__tests__/authority.test.d.ts +2 -0
- package/dist/adapt/herdr/__tests__/authority.test.d.ts.map +1 -0
- package/dist/adapt/herdr/__tests__/authority.test.js +49 -0
- package/dist/adapt/herdr/__tests__/authority.test.js.map +1 -0
- package/dist/adapt/herdr/__tests__/bridge.test.d.ts +2 -0
- package/dist/adapt/herdr/__tests__/bridge.test.d.ts.map +1 -0
- package/dist/adapt/herdr/__tests__/bridge.test.js +176 -0
- package/dist/adapt/herdr/__tests__/bridge.test.js.map +1 -0
- package/dist/adapt/herdr/__tests__/sanitize.test.d.ts +2 -0
- package/dist/adapt/herdr/__tests__/sanitize.test.d.ts.map +1 -0
- package/dist/adapt/herdr/__tests__/sanitize.test.js +45 -0
- package/dist/adapt/herdr/__tests__/sanitize.test.js.map +1 -0
- package/dist/adapt/herdr/__tests__/semantic.test.d.ts +2 -0
- package/dist/adapt/herdr/__tests__/semantic.test.d.ts.map +1 -0
- package/dist/adapt/herdr/__tests__/semantic.test.js +130 -0
- package/dist/adapt/herdr/__tests__/semantic.test.js.map +1 -0
- package/dist/adapt/herdr/__tests__/seq-store.test.d.ts +2 -0
- package/dist/adapt/herdr/__tests__/seq-store.test.d.ts.map +1 -0
- package/dist/adapt/herdr/__tests__/seq-store.test.js +54 -0
- package/dist/adapt/herdr/__tests__/seq-store.test.js.map +1 -0
- package/dist/adapt/herdr/__tests__/socket-live.test.d.ts +2 -0
- package/dist/adapt/herdr/__tests__/socket-live.test.d.ts.map +1 -0
- package/dist/adapt/herdr/__tests__/socket-live.test.js +104 -0
- package/dist/adapt/herdr/__tests__/socket-live.test.js.map +1 -0
- package/dist/adapt/herdr/__tests__/team-map.test.d.ts +2 -0
- package/dist/adapt/herdr/__tests__/team-map.test.d.ts.map +1 -0
- package/dist/adapt/herdr/__tests__/team-map.test.js +46 -0
- package/dist/adapt/herdr/__tests__/team-map.test.js.map +1 -0
- package/dist/adapt/herdr/__tests__/transport.test.d.ts +2 -0
- package/dist/adapt/herdr/__tests__/transport.test.d.ts.map +1 -0
- package/dist/adapt/herdr/__tests__/transport.test.js +160 -0
- package/dist/adapt/herdr/__tests__/transport.test.js.map +1 -0
- package/dist/adapt/herdr/__tests__/wiring.test.d.ts +2 -0
- package/dist/adapt/herdr/__tests__/wiring.test.d.ts.map +1 -0
- package/dist/adapt/herdr/__tests__/wiring.test.js +118 -0
- package/dist/adapt/herdr/__tests__/wiring.test.js.map +1 -0
- package/dist/adapt/herdr/authority.d.ts +34 -0
- package/dist/adapt/herdr/authority.d.ts.map +1 -0
- package/dist/adapt/herdr/authority.js +71 -0
- package/dist/adapt/herdr/authority.js.map +1 -0
- package/dist/adapt/herdr/bridge.d.ts +84 -0
- package/dist/adapt/herdr/bridge.d.ts.map +1 -0
- package/dist/adapt/herdr/bridge.js +222 -0
- package/dist/adapt/herdr/bridge.js.map +1 -0
- package/dist/adapt/herdr/sanitize.d.ts +20 -0
- package/dist/adapt/herdr/sanitize.d.ts.map +1 -0
- package/dist/adapt/herdr/sanitize.js +70 -0
- package/dist/adapt/herdr/sanitize.js.map +1 -0
- package/dist/adapt/herdr/semantic.d.ts +67 -0
- package/dist/adapt/herdr/semantic.d.ts.map +1 -0
- package/dist/adapt/herdr/semantic.js +170 -0
- package/dist/adapt/herdr/semantic.js.map +1 -0
- package/dist/adapt/herdr/seq-store.d.ts +32 -0
- package/dist/adapt/herdr/seq-store.d.ts.map +1 -0
- package/dist/adapt/herdr/seq-store.js +126 -0
- package/dist/adapt/herdr/seq-store.js.map +1 -0
- package/dist/adapt/herdr/team-map.d.ts +30 -0
- package/dist/adapt/herdr/team-map.d.ts.map +1 -0
- package/dist/adapt/herdr/team-map.js +37 -0
- package/dist/adapt/herdr/team-map.js.map +1 -0
- package/dist/adapt/herdr/transport.d.ts +115 -0
- package/dist/adapt/herdr/transport.d.ts.map +1 -0
- package/dist/adapt/herdr/transport.js +260 -0
- package/dist/adapt/herdr/transport.js.map +1 -0
- package/dist/adapt/herdr/wiring.d.ts +24 -0
- package/dist/adapt/herdr/wiring.d.ts.map +1 -0
- package/dist/adapt/herdr/wiring.js +62 -0
- package/dist/adapt/herdr/wiring.js.map +1 -0
- package/dist/adapt/herdr.d.ts +19 -0
- package/dist/adapt/herdr.d.ts.map +1 -0
- package/dist/adapt/herdr.js +115 -0
- package/dist/adapt/herdr.js.map +1 -0
- package/dist/adapt/index.d.ts +4 -0
- package/dist/adapt/index.d.ts.map +1 -1
- package/dist/adapt/index.js +48 -0
- package/dist/adapt/index.js.map +1 -1
- package/dist/adapt/registry.d.ts.map +1 -1
- package/dist/adapt/registry.js +11 -0
- package/dist/adapt/registry.js.map +1 -1
- package/dist/agents/__tests__/definitions.test.js +81 -0
- package/dist/agents/__tests__/definitions.test.js.map +1 -1
- package/dist/agents/__tests__/native-config.test.js +25 -0
- package/dist/agents/__tests__/native-config.test.js.map +1 -1
- package/dist/agents/native-config.d.ts +2 -1
- package/dist/agents/native-config.d.ts.map +1 -1
- package/dist/agents/native-config.js.map +1 -1
- package/dist/auth/__tests__/hotswap.test.js +60 -1
- package/dist/auth/__tests__/hotswap.test.js.map +1 -1
- package/dist/auth/__tests__/storage.test.js +33 -1
- package/dist/auth/__tests__/storage.test.js.map +1 -1
- package/dist/auth/hotswap.d.ts +22 -2
- package/dist/auth/hotswap.d.ts.map +1 -1
- package/dist/auth/hotswap.js +107 -22
- package/dist/auth/hotswap.js.map +1 -1
- package/dist/auth/storage.js +1 -1
- package/dist/auth/storage.js.map +1 -1
- package/dist/autopilot/__tests__/ralplan-gate.test.js +86 -1333
- package/dist/autopilot/__tests__/ralplan-gate.test.js.map +1 -1
- package/dist/autopilot/ralplan-gate.d.ts.map +1 -1
- package/dist/autopilot/ralplan-gate.js +7 -6
- package/dist/autopilot/ralplan-gate.js.map +1 -1
- package/dist/cli/__tests__/agents-init.test.js +4 -23
- package/dist/cli/__tests__/agents-init.test.js.map +1 -1
- package/dist/cli/__tests__/api.test.js +61 -24
- package/dist/cli/__tests__/api.test.js.map +1 -1
- package/dist/cli/__tests__/auth.test.js +63 -7
- package/dist/cli/__tests__/auth.test.js.map +1 -1
- package/dist/cli/__tests__/codex-feature-probe.test.js +66 -1
- package/dist/cli/__tests__/codex-feature-probe.test.js.map +1 -1
- package/dist/cli/__tests__/codex-plugin-layout.test.js +150 -2
- package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -1
- package/dist/cli/__tests__/detached-leader-teardown.test.d.ts +2 -0
- package/dist/cli/__tests__/detached-leader-teardown.test.d.ts.map +1 -0
- package/dist/cli/__tests__/detached-leader-teardown.test.js +473 -0
- package/dist/cli/__tests__/detached-leader-teardown.test.js.map +1 -0
- package/dist/cli/__tests__/doctor-process-identity-readiness.test.d.ts +2 -0
- package/dist/cli/__tests__/doctor-process-identity-readiness.test.d.ts.map +1 -0
- package/dist/cli/__tests__/doctor-process-identity-readiness.test.js +103 -0
- package/dist/cli/__tests__/doctor-process-identity-readiness.test.js.map +1 -0
- package/dist/cli/__tests__/doctor-state-root-binding.test.d.ts +2 -0
- package/dist/cli/__tests__/doctor-state-root-binding.test.d.ts.map +1 -0
- package/dist/cli/__tests__/doctor-state-root-binding.test.js +139 -0
- package/dist/cli/__tests__/doctor-state-root-binding.test.js.map +1 -0
- package/dist/cli/__tests__/doctor-warning-copy.test.js +135 -1
- package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
- package/dist/cli/__tests__/exec.test.js +211 -0
- package/dist/cli/__tests__/exec.test.js.map +1 -1
- package/dist/cli/__tests__/index.test.js +878 -463
- package/dist/cli/__tests__/index.test.js.map +1 -1
- package/dist/cli/__tests__/launch-fallback.test.js +1290 -127
- package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
- package/dist/cli/__tests__/mcp-parity.test.js +8 -4
- package/dist/cli/__tests__/mcp-parity.test.js.map +1 -1
- package/dist/cli/__tests__/native-assets.test.js +398 -16
- package/dist/cli/__tests__/native-assets.test.js.map +1 -1
- package/dist/cli/__tests__/native-hook-claim-journal.test.js +132 -6
- package/dist/cli/__tests__/native-hook-claim-journal.test.js.map +1 -1
- package/dist/cli/__tests__/ralph-goal-mode-contract.test.js +3 -3
- package/dist/cli/__tests__/ralph-goal-mode-contract.test.js.map +1 -1
- package/dist/cli/__tests__/ralph.test.js +3 -3
- package/dist/cli/__tests__/ralph.test.js.map +1 -1
- package/dist/cli/__tests__/ralplan-bootstrap-3181.test.js +49 -164
- package/dist/cli/__tests__/ralplan-bootstrap-3181.test.js.map +1 -1
- package/dist/cli/__tests__/ralplan-child-binding-3212.test.d.ts +2 -0
- package/dist/cli/__tests__/ralplan-child-binding-3212.test.d.ts.map +1 -0
- package/dist/cli/__tests__/ralplan-child-binding-3212.test.js +56 -0
- package/dist/cli/__tests__/ralplan-child-binding-3212.test.js.map +1 -0
- package/dist/cli/__tests__/ralplan.test.js +107 -109
- package/dist/cli/__tests__/ralplan.test.js.map +1 -1
- package/dist/cli/__tests__/resume.test.js +11 -10
- package/dist/cli/__tests__/resume.test.js.map +1 -1
- package/dist/cli/__tests__/session-scoped-runtime.test.js +1118 -43
- package/dist/cli/__tests__/session-scoped-runtime.test.js.map +1 -1
- package/dist/cli/__tests__/session-search-help.test.js +25 -1
- package/dist/cli/__tests__/session-search-help.test.js.map +1 -1
- package/dist/cli/__tests__/setup-agents-overwrite.test.js +8 -55
- package/dist/cli/__tests__/setup-agents-overwrite.test.js.map +1 -1
- package/dist/cli/__tests__/setup-install-mode.test.js +224 -7
- package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
- package/dist/cli/__tests__/sparkshell-cli.test.js +93 -41
- package/dist/cli/__tests__/sparkshell-cli.test.js.map +1 -1
- package/dist/cli/__tests__/team.test.js +150 -8
- package/dist/cli/__tests__/team.test.js.map +1 -1
- package/dist/cli/__tests__/ultragoal.test.js +117 -2
- package/dist/cli/__tests__/ultragoal.test.js.map +1 -1
- package/dist/cli/__tests__/uninstall.test.js +95 -4
- package/dist/cli/__tests__/uninstall.test.js.map +1 -1
- package/dist/cli/__tests__/update.test.js +669 -177
- package/dist/cli/__tests__/update.test.js.map +1 -1
- package/dist/cli/__tests__/windows-popup-loop-contract.test.js +33 -2
- package/dist/cli/__tests__/windows-popup-loop-contract.test.js.map +1 -1
- package/dist/cli/api.d.ts.map +1 -1
- package/dist/cli/api.js +9 -10
- package/dist/cli/api.js.map +1 -1
- package/dist/cli/codex-feature-probe.d.ts +16 -0
- package/dist/cli/codex-feature-probe.d.ts.map +1 -1
- package/dist/cli/codex-feature-probe.js +44 -0
- package/dist/cli/codex-feature-probe.js.map +1 -1
- package/dist/cli/codex-home.d.ts.map +1 -1
- package/dist/cli/codex-home.js +7 -4
- package/dist/cli/codex-home.js.map +1 -1
- package/dist/cli/doctor.d.ts +20 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +290 -3
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/index.d.ts +234 -12
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2409 -746
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/mcp-parity.js +2 -2
- package/dist/cli/mcp-parity.js.map +1 -1
- package/dist/cli/native-assets.d.ts +25 -0
- package/dist/cli/native-assets.d.ts.map +1 -1
- package/dist/cli/native-assets.js +448 -51
- package/dist/cli/native-assets.js.map +1 -1
- package/dist/cli/native-hook-claim-journal.d.ts +20 -5
- package/dist/cli/native-hook-claim-journal.d.ts.map +1 -1
- package/dist/cli/native-hook-claim-journal.js +67 -32
- package/dist/cli/native-hook-claim-journal.js.map +1 -1
- package/dist/cli/package-manager-ownership.d.ts +63 -0
- package/dist/cli/package-manager-ownership.d.ts.map +1 -0
- package/dist/cli/package-manager-ownership.js +323 -0
- package/dist/cli/package-manager-ownership.js.map +1 -0
- package/dist/cli/ralph.js +2 -2
- package/dist/cli/ralph.js.map +1 -1
- package/dist/cli/ralplan.d.ts +5 -7
- package/dist/cli/ralplan.d.ts.map +1 -1
- package/dist/cli/ralplan.js +83 -134
- package/dist/cli/ralplan.js.map +1 -1
- package/dist/cli/session-search.d.ts +5 -0
- package/dist/cli/session-search.d.ts.map +1 -1
- package/dist/cli/session-search.js +87 -0
- package/dist/cli/session-search.js.map +1 -1
- package/dist/cli/setup-preferences.d.ts +15 -0
- package/dist/cli/setup-preferences.d.ts.map +1 -1
- package/dist/cli/setup-preferences.js +27 -1
- package/dist/cli/setup-preferences.js.map +1 -1
- package/dist/cli/setup.d.ts +8 -0
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +119 -47
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/sparkshell.d.ts.map +1 -1
- package/dist/cli/sparkshell.js +52 -9
- package/dist/cli/sparkshell.js.map +1 -1
- package/dist/cli/ultragoal.d.ts.map +1 -1
- package/dist/cli/ultragoal.js +2 -2
- package/dist/cli/ultragoal.js.map +1 -1
- package/dist/cli/uninstall.d.ts +9 -0
- package/dist/cli/uninstall.d.ts.map +1 -1
- package/dist/cli/uninstall.js +71 -30
- package/dist/cli/uninstall.js.map +1 -1
- package/dist/cli/update-worker.d.ts +2 -0
- package/dist/cli/update-worker.d.ts.map +1 -0
- package/dist/cli/update-worker.js +142 -0
- package/dist/cli/update-worker.js.map +1 -0
- package/dist/cli/update.d.ts +14 -22
- package/dist/cli/update.d.ts.map +1 -1
- package/dist/cli/update.js +192 -241
- package/dist/cli/update.js.map +1 -1
- package/dist/compat/__tests__/rust-runtime-compat.test.js +1 -1
- package/dist/config/__tests__/generator-idempotent.test.js +503 -30
- package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
- package/dist/config/__tests__/generator-notify.test.js +5 -3
- package/dist/config/__tests__/generator-notify.test.js.map +1 -1
- package/dist/config/__tests__/models.test.js +67 -3
- package/dist/config/__tests__/models.test.js.map +1 -1
- package/dist/config/generator.d.ts +27 -21
- package/dist/config/generator.d.ts.map +1 -1
- package/dist/config/generator.js +610 -152
- package/dist/config/generator.js.map +1 -1
- package/dist/config/models.d.ts +12 -2
- package/dist/config/models.d.ts.map +1 -1
- package/dist/config/models.js +15 -1
- package/dist/config/models.js.map +1 -1
- package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.js +25 -0
- package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.js.map +1 -1
- package/dist/goal-workflows/codex-goal-snapshot.d.ts +1 -1
- package/dist/goal-workflows/codex-goal-snapshot.d.ts.map +1 -1
- package/dist/goal-workflows/codex-goal-snapshot.js +2 -0
- package/dist/goal-workflows/codex-goal-snapshot.js.map +1 -1
- package/dist/hooks/__tests__/agents-overlay.test.js +5 -3
- package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -1
- package/dist/hooks/__tests__/autopilot-skill-contract.test.js +27 -4
- package/dist/hooks/__tests__/autopilot-skill-contract.test.js.map +1 -1
- package/dist/hooks/__tests__/issue-3293-autopilot-handoff.test.d.ts +2 -0
- package/dist/hooks/__tests__/issue-3293-autopilot-handoff.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/issue-3293-autopilot-handoff.test.js +172 -0
- package/dist/hooks/__tests__/issue-3293-autopilot-handoff.test.js.map +1 -0
- package/dist/hooks/__tests__/keyword-detector.test.js +176 -37
- package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-fallback-watcher.test.js +402 -545
- package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js +39 -4
- package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +161 -26
- package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-cross-worktree-heartbeat.test.js +27 -0
- package/dist/hooks/__tests__/notify-hook-cross-worktree-heartbeat.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-managed-tmux.test.js +10 -118
- package/dist/hooks/__tests__/notify-hook-managed-tmux.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-regression-205.test.js +7 -0
- package/dist/hooks/__tests__/notify-hook-regression-205.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +533 -14
- package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +159 -24
- package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js +482 -32
- package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-worker-fail-closed.test.js +2 -1
- package/dist/hooks/__tests__/notify-hook-team-worker-fail-closed.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js +68 -1
- package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-tmux-scrollback.test.js +7 -1
- package/dist/hooks/__tests__/notify-hook-tmux-scrollback.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-worker-idle.test.js +44 -4
- package/dist/hooks/__tests__/notify-hook-worker-idle.test.js.map +1 -1
- package/dist/hooks/__tests__/prompt-guidance-contract.test.js +9 -0
- package/dist/hooks/__tests__/prompt-guidance-contract.test.js.map +1 -1
- package/dist/hooks/__tests__/session.test.js +3130 -365
- package/dist/hooks/__tests__/session.test.js.map +1 -1
- package/dist/hooks/agents-overlay.js +1 -1
- package/dist/hooks/agents-overlay.js.map +1 -1
- package/dist/hooks/extensibility/__tests__/dispatcher.test.js +108 -2
- package/dist/hooks/extensibility/__tests__/dispatcher.test.js.map +1 -1
- package/dist/hooks/extensibility/__tests__/sdk.test.js +151 -1
- package/dist/hooks/extensibility/__tests__/sdk.test.js.map +1 -1
- package/dist/hooks/extensibility/dispatcher.d.ts.map +1 -1
- package/dist/hooks/extensibility/dispatcher.js +20 -3
- package/dist/hooks/extensibility/dispatcher.js.map +1 -1
- package/dist/hooks/extensibility/plugin-runner.js +1 -0
- package/dist/hooks/extensibility/plugin-runner.js.map +1 -1
- package/dist/hooks/extensibility/runtime.d.ts.map +1 -1
- package/dist/hooks/extensibility/runtime.js.map +1 -1
- package/dist/hooks/extensibility/sdk/paths.d.ts +1 -1
- package/dist/hooks/extensibility/sdk/paths.d.ts.map +1 -1
- package/dist/hooks/extensibility/sdk/paths.js +2 -2
- package/dist/hooks/extensibility/sdk/paths.js.map +1 -1
- package/dist/hooks/extensibility/sdk/runtime-state.d.ts +1 -1
- package/dist/hooks/extensibility/sdk/runtime-state.d.ts.map +1 -1
- package/dist/hooks/extensibility/sdk/runtime-state.js +55 -15
- package/dist/hooks/extensibility/sdk/runtime-state.js.map +1 -1
- package/dist/hooks/extensibility/sdk.d.ts +1 -0
- package/dist/hooks/extensibility/sdk.d.ts.map +1 -1
- package/dist/hooks/extensibility/sdk.js +1 -1
- package/dist/hooks/extensibility/sdk.js.map +1 -1
- package/dist/hooks/extensibility/types.d.ts +7 -0
- package/dist/hooks/extensibility/types.d.ts.map +1 -1
- package/dist/hooks/keyword-detector.d.ts +10 -3
- package/dist/hooks/keyword-detector.d.ts.map +1 -1
- package/dist/hooks/keyword-detector.js +116 -20
- package/dist/hooks/keyword-detector.js.map +1 -1
- package/dist/hooks/session.d.ts +204 -14
- package/dist/hooks/session.d.ts.map +1 -1
- package/dist/hooks/session.js +1500 -223
- package/dist/hooks/session.js.map +1 -1
- package/dist/hud/__tests__/hud-tmux-injection.test.js +6 -6
- package/dist/hud/__tests__/hud-tmux-injection.test.js.map +1 -1
- package/dist/hud/__tests__/index.test.js +26 -16
- package/dist/hud/__tests__/index.test.js.map +1 -1
- package/dist/hud/__tests__/reconcile.test.js +83 -78
- package/dist/hud/__tests__/reconcile.test.js.map +1 -1
- package/dist/hud/__tests__/state.test.js +36 -31
- package/dist/hud/__tests__/state.test.js.map +1 -1
- package/dist/hud/__tests__/tmux.test.js +155 -198
- package/dist/hud/__tests__/tmux.test.js.map +1 -1
- package/dist/hud/tmux.d.ts +42 -4
- package/dist/hud/tmux.d.ts.map +1 -1
- package/dist/hud/tmux.js +1017 -139
- package/dist/hud/tmux.js.map +1 -1
- package/dist/leader/__tests__/contract.test.js +124 -37
- package/dist/leader/__tests__/contract.test.js.map +1 -1
- package/dist/leader/contract.d.ts +17 -6
- package/dist/leader/contract.d.ts.map +1 -1
- package/dist/leader/contract.js +102 -26
- package/dist/leader/contract.js.map +1 -1
- package/dist/mcp/__tests__/code-intel-server.test.js +31 -3
- package/dist/mcp/__tests__/code-intel-server.test.js.map +1 -1
- package/dist/mcp/__tests__/hermes-bridge.test.js +17 -0
- package/dist/mcp/__tests__/hermes-bridge.test.js.map +1 -1
- package/dist/mcp/__tests__/server-lifecycle.test.js +4 -4
- package/dist/mcp/__tests__/state-paths.test.js +735 -4
- package/dist/mcp/__tests__/state-paths.test.js.map +1 -1
- package/dist/mcp/__tests__/state-server.test.js +1 -1
- package/dist/mcp/__tests__/state-server.test.js.map +1 -1
- package/dist/mcp/__tests__/trace-server.test.js +2 -2
- package/dist/mcp/__tests__/trace-server.test.js.map +1 -1
- package/dist/mcp/__tests__/wiki-server.test.js +18 -0
- package/dist/mcp/__tests__/wiki-server.test.js.map +1 -1
- package/dist/mcp/code-intel-server.d.ts.map +1 -1
- package/dist/mcp/code-intel-server.js +13 -3
- package/dist/mcp/code-intel-server.js.map +1 -1
- package/dist/mcp/hermes-bridge.d.ts.map +1 -1
- package/dist/mcp/hermes-bridge.js +2 -2
- package/dist/mcp/hermes-bridge.js.map +1 -1
- package/dist/mcp/state-paths.d.ts +78 -4
- package/dist/mcp/state-paths.d.ts.map +1 -1
- package/dist/mcp/state-paths.js +543 -40
- package/dist/mcp/state-paths.js.map +1 -1
- package/dist/mcp/state-server.d.ts +4 -4
- package/dist/mcp/state-server.d.ts.map +1 -1
- package/dist/mcp/wiki-server.d.ts +11 -0
- package/dist/mcp/wiki-server.d.ts.map +1 -1
- package/dist/mcp/wiki-server.js +9 -2
- package/dist/mcp/wiki-server.js.map +1 -1
- package/dist/modes/__tests__/base-autopilot-gates.test.js +36 -7
- package/dist/modes/__tests__/base-autopilot-gates.test.js.map +1 -1
- package/dist/modes/__tests__/base-multi-state-compat.test.js +1 -1
- package/dist/modes/__tests__/base-multi-state-compat.test.js.map +1 -1
- package/dist/modes/__tests__/base-session-scope.test.js +17 -8
- package/dist/modes/__tests__/base-session-scope.test.js.map +1 -1
- package/dist/modes/__tests__/base-tmux-pane.test.js +4 -4
- package/dist/modes/__tests__/base-tmux-pane.test.js.map +1 -1
- package/dist/modes/base.d.ts +5 -5
- package/dist/modes/base.d.ts.map +1 -1
- package/dist/modes/base.js +76 -21
- package/dist/modes/base.js.map +1 -1
- package/dist/native-assets/archive.d.ts +17 -0
- package/dist/native-assets/archive.d.ts.map +1 -0
- package/dist/native-assets/archive.js +238 -0
- package/dist/native-assets/archive.js.map +1 -0
- package/dist/native-assets/policy.d.ts +42 -0
- package/dist/native-assets/policy.d.ts.map +1 -0
- package/dist/native-assets/policy.js +155 -0
- package/dist/native-assets/policy.js.map +1 -0
- package/dist/notifications/temp-contract.d.ts.map +1 -1
- package/dist/notifications/temp-contract.js +4 -0
- package/dist/notifications/temp-contract.js.map +1 -1
- package/dist/pipeline/__tests__/orchestrator.test.js +164 -42
- package/dist/pipeline/__tests__/orchestrator.test.js.map +1 -1
- package/dist/pipeline/__tests__/stages.test.js +72 -155
- package/dist/pipeline/__tests__/stages.test.js.map +1 -1
- package/dist/pipeline/orchestrator.d.ts.map +1 -1
- package/dist/pipeline/orchestrator.js +124 -18
- package/dist/pipeline/orchestrator.js.map +1 -1
- package/dist/pipeline/stages/ralplan.d.ts.map +1 -1
- package/dist/pipeline/stages/ralplan.js +36 -8
- package/dist/pipeline/stages/ralplan.js.map +1 -1
- package/dist/ralplan/__tests__/consensus-gate.test.js +73 -1316
- package/dist/ralplan/__tests__/consensus-gate.test.js.map +1 -1
- package/dist/ralplan/__tests__/documented-leader-preflight.test.d.ts +2 -0
- package/dist/ralplan/__tests__/documented-leader-preflight.test.d.ts.map +1 -0
- package/dist/ralplan/__tests__/documented-leader-preflight.test.js +335 -0
- package/dist/ralplan/__tests__/documented-leader-preflight.test.js.map +1 -0
- package/dist/ralplan/__tests__/runtime.test.js +85 -101
- package/dist/ralplan/__tests__/runtime.test.js.map +1 -1
- package/dist/ralplan/consensus-gate.d.ts +9 -1
- package/dist/ralplan/consensus-gate.d.ts.map +1 -1
- package/dist/ralplan/consensus-gate.js +82 -338
- package/dist/ralplan/consensus-gate.js.map +1 -1
- package/dist/ralplan/documented-leader-preflight.d.ts +41 -0
- package/dist/ralplan/documented-leader-preflight.d.ts.map +1 -0
- package/dist/ralplan/documented-leader-preflight.js +360 -0
- package/dist/ralplan/documented-leader-preflight.js.map +1 -0
- package/dist/ralplan/runtime.d.ts +2 -1
- package/dist/ralplan/runtime.d.ts.map +1 -1
- package/dist/ralplan/runtime.js +67 -168
- package/dist/ralplan/runtime.js.map +1 -1
- package/dist/runtime/__tests__/bridge.test.js +42 -1
- package/dist/runtime/__tests__/bridge.test.js.map +1 -1
- package/dist/runtime/bridge.d.ts +12 -0
- package/dist/runtime/bridge.d.ts.map +1 -1
- package/dist/runtime/bridge.js +52 -1
- package/dist/runtime/bridge.js.map +1 -1
- package/dist/runtime/run-state.d.ts +5 -1
- package/dist/runtime/run-state.d.ts.map +1 -1
- package/dist/runtime/run-state.js +15 -8
- package/dist/runtime/run-state.js.map +1 -1
- package/dist/scripts/__tests__/codex-native-hook.test.js +16323 -8978
- package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
- package/dist/scripts/__tests__/issue-3293-callsite-parity.test.d.ts +2 -0
- package/dist/scripts/__tests__/issue-3293-callsite-parity.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/issue-3293-callsite-parity.test.js +225 -0
- package/dist/scripts/__tests__/issue-3293-callsite-parity.test.js.map +1 -0
- package/dist/scripts/__tests__/issue-3293-cancel-transaction.test.d.ts +2 -0
- package/dist/scripts/__tests__/issue-3293-cancel-transaction.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/issue-3293-cancel-transaction.test.js +188 -0
- package/dist/scripts/__tests__/issue-3293-cancel-transaction.test.js.map +1 -0
- package/dist/scripts/__tests__/issue-3293-hook-owned-cancel.test.d.ts +2 -0
- package/dist/scripts/__tests__/issue-3293-hook-owned-cancel.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/issue-3293-hook-owned-cancel.test.js +259 -0
- package/dist/scripts/__tests__/issue-3293-hook-owned-cancel.test.js.map +1 -0
- package/dist/scripts/__tests__/issue-3311-ultragoal-native-outside-tmux.test.d.ts +2 -0
- package/dist/scripts/__tests__/issue-3311-ultragoal-native-outside-tmux.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/issue-3311-ultragoal-native-outside-tmux.test.js +491 -0
- package/dist/scripts/__tests__/issue-3311-ultragoal-native-outside-tmux.test.js.map +1 -0
- package/dist/scripts/__tests__/issue-3358-ultragoal-cancel-lifecycle.test.d.ts +2 -0
- package/dist/scripts/__tests__/issue-3358-ultragoal-cancel-lifecycle.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/issue-3358-ultragoal-cancel-lifecycle.test.js +708 -0
- package/dist/scripts/__tests__/issue-3358-ultragoal-cancel-lifecycle.test.js.map +1 -0
- package/dist/scripts/__tests__/issue-3369-autopilot-ralplan-state-machine.test.d.ts +2 -0
- package/dist/scripts/__tests__/issue-3369-autopilot-ralplan-state-machine.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/issue-3369-autopilot-ralplan-state-machine.test.js +208 -0
- package/dist/scripts/__tests__/issue-3369-autopilot-ralplan-state-machine.test.js.map +1 -0
- package/dist/scripts/__tests__/notify-state-io.test.js +26 -0
- package/dist/scripts/__tests__/notify-state-io.test.js.map +1 -1
- package/dist/scripts/__tests__/notify-tmux-injection.test.js +23 -1
- package/dist/scripts/__tests__/notify-tmux-injection.test.js.map +1 -1
- package/dist/scripts/__tests__/postinstall.test.js +19 -1
- package/dist/scripts/__tests__/postinstall.test.js.map +1 -1
- package/dist/scripts/__tests__/reasoning-artifact-contract.test.d.ts +2 -0
- package/dist/scripts/__tests__/reasoning-artifact-contract.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/reasoning-artifact-contract.test.js +108 -0
- package/dist/scripts/__tests__/reasoning-artifact-contract.test.js.map +1 -0
- package/dist/scripts/__tests__/role-intent-bootstrap-e2e-3181.test.js +63 -173
- package/dist/scripts/__tests__/role-intent-bootstrap-e2e-3181.test.js.map +1 -1
- package/dist/scripts/__tests__/role-intent-durable-recovery-3181.test.js +74 -159
- package/dist/scripts/__tests__/role-intent-durable-recovery-3181.test.js.map +1 -1
- package/dist/scripts/__tests__/smoke-packed-install.test.js +404 -13
- package/dist/scripts/__tests__/smoke-packed-install.test.js.map +1 -1
- package/dist/scripts/__tests__/verify-native-release-assets.test.d.ts +2 -0
- package/dist/scripts/__tests__/verify-native-release-assets.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/verify-native-release-assets.test.js +235 -0
- package/dist/scripts/__tests__/verify-native-release-assets.test.js.map +1 -0
- package/dist/scripts/codex-native-hook.d.ts +53 -1
- package/dist/scripts/codex-native-hook.d.ts.map +1 -1
- package/dist/scripts/codex-native-hook.js +14448 -1480
- package/dist/scripts/codex-native-hook.js.map +1 -1
- package/dist/scripts/codex-native-pre-post.d.ts +9 -0
- package/dist/scripts/codex-native-pre-post.d.ts.map +1 -1
- package/dist/scripts/codex-native-pre-post.js +35 -12
- package/dist/scripts/codex-native-pre-post.js.map +1 -1
- package/dist/scripts/generate-native-release-manifest.js +80 -51
- package/dist/scripts/generate-native-release-manifest.js.map +1 -1
- package/dist/scripts/notify-fallback-watcher.js +78 -115
- package/dist/scripts/notify-fallback-watcher.js.map +1 -1
- package/dist/scripts/notify-hook/auto-nudge.d.ts.map +1 -1
- package/dist/scripts/notify-hook/auto-nudge.js +74 -3
- package/dist/scripts/notify-hook/auto-nudge.js.map +1 -1
- package/dist/scripts/notify-hook/state-io.d.ts.map +1 -1
- package/dist/scripts/notify-hook/state-io.js +5 -0
- package/dist/scripts/notify-hook/state-io.js.map +1 -1
- package/dist/scripts/notify-hook/team-dispatch.d.ts +9 -0
- package/dist/scripts/notify-hook/team-dispatch.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-dispatch.js +234 -79
- package/dist/scripts/notify-hook/team-dispatch.js.map +1 -1
- package/dist/scripts/notify-hook/team-leader-nudge.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-leader-nudge.js +71 -16
- package/dist/scripts/notify-hook/team-leader-nudge.js.map +1 -1
- package/dist/scripts/notify-hook/team-tmux-guard.d.ts +12 -4
- package/dist/scripts/notify-hook/team-tmux-guard.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-tmux-guard.js +365 -44
- package/dist/scripts/notify-hook/team-tmux-guard.js.map +1 -1
- package/dist/scripts/notify-hook/team-worker-stop.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-worker-stop.js +42 -21
- package/dist/scripts/notify-hook/team-worker-stop.js.map +1 -1
- package/dist/scripts/notify-hook/team-worker.d.ts +3 -0
- package/dist/scripts/notify-hook/team-worker.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-worker.js +82 -33
- package/dist/scripts/notify-hook/team-worker.js.map +1 -1
- package/dist/scripts/notify-hook/tmux-injection.d.ts +1 -0
- package/dist/scripts/notify-hook/tmux-injection.d.ts.map +1 -1
- package/dist/scripts/notify-hook/tmux-injection.js +32 -3
- package/dist/scripts/notify-hook/tmux-injection.js.map +1 -1
- package/dist/scripts/notify-hook.js +79 -82
- package/dist/scripts/notify-hook.js.map +1 -1
- package/dist/scripts/postinstall-advisory.d.ts +14 -0
- package/dist/scripts/postinstall-advisory.d.ts.map +1 -0
- package/dist/scripts/postinstall-advisory.js +49 -0
- package/dist/scripts/postinstall-advisory.js.map +1 -0
- package/dist/scripts/postinstall.d.ts +1 -1
- package/dist/scripts/postinstall.d.ts.map +1 -1
- package/dist/scripts/postinstall.js +1 -1
- package/dist/scripts/postinstall.js.map +1 -1
- package/dist/scripts/smoke-packed-install.d.ts +80 -4
- package/dist/scripts/smoke-packed-install.d.ts.map +1 -1
- package/dist/scripts/smoke-packed-install.js +3162 -26
- package/dist/scripts/smoke-packed-install.js.map +1 -1
- package/dist/scripts/sync-plugin-mirror.d.ts.map +1 -1
- package/dist/scripts/sync-plugin-mirror.js +16 -1
- package/dist/scripts/sync-plugin-mirror.js.map +1 -1
- package/dist/scripts/verify-native-release-assets.js +37 -23
- package/dist/scripts/verify-native-release-assets.js.map +1 -1
- package/dist/state/__tests__/mode-state-context.test.js +61 -0
- package/dist/state/__tests__/mode-state-context.test.js.map +1 -1
- package/dist/state/__tests__/operations.test.js +462 -850
- package/dist/state/__tests__/operations.test.js.map +1 -1
- package/dist/state/__tests__/skill-active.test.js +400 -2
- package/dist/state/__tests__/skill-active.test.js.map +1 -1
- package/dist/state/mode-state-context.d.ts +8 -0
- package/dist/state/mode-state-context.d.ts.map +1 -1
- package/dist/state/mode-state-context.js +73 -0
- package/dist/state/mode-state-context.js.map +1 -1
- package/dist/state/operations.d.ts +3 -0
- package/dist/state/operations.d.ts.map +1 -1
- package/dist/state/operations.js +144 -40
- package/dist/state/operations.js.map +1 -1
- package/dist/state/skill-active.d.ts +18 -1
- package/dist/state/skill-active.d.ts.map +1 -1
- package/dist/state/skill-active.js +420 -23
- package/dist/state/skill-active.js.map +1 -1
- package/dist/state/workflow-transition-reconcile.d.ts +3 -0
- package/dist/state/workflow-transition-reconcile.d.ts.map +1 -1
- package/dist/state/workflow-transition-reconcile.js +10 -4
- package/dist/state/workflow-transition-reconcile.js.map +1 -1
- package/dist/state/workflow-transition.d.ts.map +1 -1
- package/dist/state/workflow-transition.js +3 -1
- package/dist/state/workflow-transition.js.map +1 -1
- package/dist/subagents/__tests__/leader-bootstrap-3181.test.js +53 -247
- package/dist/subagents/__tests__/leader-bootstrap-3181.test.js.map +1 -1
- package/dist/subagents/__tests__/tracker.test.js +837 -1048
- package/dist/subagents/__tests__/tracker.test.js.map +1 -1
- package/dist/subagents/tracker.d.ts +58 -135
- package/dist/subagents/tracker.d.ts.map +1 -1
- package/dist/subagents/tracker.js +811 -632
- package/dist/subagents/tracker.js.map +1 -1
- package/dist/team/__tests__/api-interop.test.js +91 -1
- package/dist/team/__tests__/api-interop.test.js.map +1 -1
- package/dist/team/__tests__/delivery-e2e-smoke.test.js +58 -17
- package/dist/team/__tests__/delivery-e2e-smoke.test.js.map +1 -1
- package/dist/team/__tests__/idle-nudge.test.js +45 -15
- package/dist/team/__tests__/idle-nudge.test.js.map +1 -1
- package/dist/team/__tests__/mcp-comm.test.js +197 -30
- package/dist/team/__tests__/mcp-comm.test.js.map +1 -1
- package/dist/team/__tests__/model-contract.test.js +110 -3
- package/dist/team/__tests__/model-contract.test.js.map +1 -1
- package/dist/team/__tests__/notice-ledger.test.d.ts +2 -0
- package/dist/team/__tests__/notice-ledger.test.d.ts.map +1 -0
- package/dist/team/__tests__/notice-ledger.test.js +131 -0
- package/dist/team/__tests__/notice-ledger.test.js.map +1 -0
- package/dist/team/__tests__/pane-teardown-residue-e2e.test.d.ts +2 -0
- package/dist/team/__tests__/pane-teardown-residue-e2e.test.d.ts.map +1 -0
- package/dist/team/__tests__/pane-teardown-residue-e2e.test.js +410 -0
- package/dist/team/__tests__/pane-teardown-residue-e2e.test.js.map +1 -0
- package/dist/team/__tests__/phase-controller.test.js +20 -0
- package/dist/team/__tests__/phase-controller.test.js.map +1 -1
- package/dist/team/__tests__/runtime-cli.test.js +9 -0
- package/dist/team/__tests__/runtime-cli.test.js.map +1 -1
- package/dist/team/__tests__/runtime.test.js +3963 -428
- package/dist/team/__tests__/runtime.test.js.map +1 -1
- package/dist/team/__tests__/scaling.test.js +2405 -203
- package/dist/team/__tests__/scaling.test.js.map +1 -1
- package/dist/team/__tests__/state-root.test.js +117 -2
- package/dist/team/__tests__/state-root.test.js.map +1 -1
- package/dist/team/__tests__/state.test.js +804 -36
- package/dist/team/__tests__/state.test.js.map +1 -1
- package/dist/team/__tests__/team-ops-contract.test.js +6 -0
- package/dist/team/__tests__/team-ops-contract.test.js.map +1 -1
- package/dist/team/__tests__/tmux-session.test.js +4099 -1039
- package/dist/team/__tests__/tmux-session.test.js.map +1 -1
- package/dist/team/__tests__/tmux-source-authority-realtmux.test.d.ts +2 -0
- package/dist/team/__tests__/tmux-source-authority-realtmux.test.d.ts.map +1 -0
- package/dist/team/__tests__/tmux-source-authority-realtmux.test.js +149 -0
- package/dist/team/__tests__/tmux-source-authority-realtmux.test.js.map +1 -0
- package/dist/team/__tests__/tmux-test-fixture.d.ts +69 -0
- package/dist/team/__tests__/tmux-test-fixture.d.ts.map +1 -1
- package/dist/team/__tests__/tmux-test-fixture.js +242 -15
- package/dist/team/__tests__/tmux-test-fixture.js.map +1 -1
- package/dist/team/__tests__/tmux-test-fixture.test.js +177 -1
- package/dist/team/__tests__/tmux-test-fixture.test.js.map +1 -1
- package/dist/team/__tests__/worker-runtime-identity.test.js +53 -44
- package/dist/team/__tests__/worker-runtime-identity.test.js.map +1 -1
- package/dist/team/__tests__/worktree.test.js +6 -0
- package/dist/team/__tests__/worktree.test.js.map +1 -1
- package/dist/team/api-interop.d.ts.map +1 -1
- package/dist/team/api-interop.js +15 -9
- package/dist/team/api-interop.js.map +1 -1
- package/dist/team/exact-pane.d.ts +23 -0
- package/dist/team/exact-pane.d.ts.map +1 -0
- package/dist/team/exact-pane.js +133 -0
- package/dist/team/exact-pane.js.map +1 -0
- package/dist/team/idle-nudge.d.ts +12 -1
- package/dist/team/idle-nudge.d.ts.map +1 -1
- package/dist/team/idle-nudge.js +41 -14
- package/dist/team/idle-nudge.js.map +1 -1
- package/dist/team/model-contract.d.ts +2 -5
- package/dist/team/model-contract.d.ts.map +1 -1
- package/dist/team/model-contract.js +59 -17
- package/dist/team/model-contract.js.map +1 -1
- package/dist/team/notice-ledger.d.ts +54 -0
- package/dist/team/notice-ledger.d.ts.map +1 -0
- package/dist/team/notice-ledger.js +259 -0
- package/dist/team/notice-ledger.js.map +1 -0
- package/dist/team/phase-controller.d.ts.map +1 -1
- package/dist/team/phase-controller.js +2 -0
- package/dist/team/phase-controller.js.map +1 -1
- package/dist/team/runtime.d.ts +4 -1
- package/dist/team/runtime.d.ts.map +1 -1
- package/dist/team/runtime.js +1527 -291
- package/dist/team/runtime.js.map +1 -1
- package/dist/team/scaling.d.ts +13 -1
- package/dist/team/scaling.d.ts.map +1 -1
- package/dist/team/scaling.js +1503 -387
- package/dist/team/scaling.js.map +1 -1
- package/dist/team/state/dispatch.d.ts.map +1 -1
- package/dist/team/state/dispatch.js +26 -8
- package/dist/team/state/dispatch.js.map +1 -1
- package/dist/team/state/locks.d.ts.map +1 -1
- package/dist/team/state/locks.js +61 -13
- package/dist/team/state/locks.js.map +1 -1
- package/dist/team/state/monitor.d.ts +10 -0
- package/dist/team/state/monitor.d.ts.map +1 -1
- package/dist/team/state/monitor.js +13 -0
- package/dist/team/state/monitor.js.map +1 -1
- package/dist/team/state/tasks.d.ts.map +1 -1
- package/dist/team/state/tasks.js +4 -3
- package/dist/team/state/tasks.js.map +1 -1
- package/dist/team/state/types.d.ts +15 -0
- package/dist/team/state/types.d.ts.map +1 -1
- package/dist/team/state/types.js.map +1 -1
- package/dist/team/state-root.d.ts +12 -0
- package/dist/team/state-root.d.ts.map +1 -1
- package/dist/team/state-root.js +177 -0
- package/dist/team/state-root.js.map +1 -1
- package/dist/team/state.d.ts +85 -1
- package/dist/team/state.d.ts.map +1 -1
- package/dist/team/state.js +672 -129
- package/dist/team/state.js.map +1 -1
- package/dist/team/team-ops.d.ts +5 -0
- package/dist/team/team-ops.d.ts.map +1 -1
- package/dist/team/team-ops.js +4 -0
- package/dist/team/team-ops.js.map +1 -1
- package/dist/team/tmux-session.d.ts +163 -27
- package/dist/team/tmux-session.d.ts.map +1 -1
- package/dist/team/tmux-session.js +1682 -376
- package/dist/team/tmux-session.js.map +1 -1
- package/dist/team/worktree.d.ts.map +1 -1
- package/dist/team/worktree.js +4 -0
- package/dist/team/worktree.js.map +1 -1
- package/dist/ultragoal/__tests__/artifacts.test.js +950 -2
- package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -1
- package/dist/ultragoal/__tests__/docs-contract.test.js +1 -0
- package/dist/ultragoal/__tests__/docs-contract.test.js.map +1 -1
- package/dist/ultragoal/artifacts.d.ts +35 -1
- package/dist/ultragoal/artifacts.d.ts.map +1 -1
- package/dist/ultragoal/artifacts.js +232 -46
- package/dist/ultragoal/artifacts.js.map +1 -1
- package/dist/utils/__tests__/file-durability.test.d.ts +2 -0
- package/dist/utils/__tests__/file-durability.test.d.ts.map +1 -0
- package/dist/utils/__tests__/file-durability.test.js +114 -0
- package/dist/utils/__tests__/file-durability.test.js.map +1 -0
- package/dist/utils/__tests__/paths.test.js +21 -1
- package/dist/utils/__tests__/paths.test.js.map +1 -1
- package/dist/utils/file-durability.d.ts +25 -0
- package/dist/utils/file-durability.d.ts.map +1 -0
- package/dist/utils/file-durability.js +67 -0
- package/dist/utils/file-durability.js.map +1 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +14 -6
- package/dist/utils/paths.js.map +1 -1
- package/dist/verification/__tests__/ci-rust-gates.test.js +49 -4
- package/dist/verification/__tests__/ci-rust-gates.test.js.map +1 -1
- package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.js +3 -0
- package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.js.map +1 -1
- package/dist/verification/__tests__/explore-harness-release-workflow.test.js +60 -0
- package/dist/verification/__tests__/explore-harness-release-workflow.test.js.map +1 -1
- package/dist/verification/__tests__/native-release-manifest.test.js +157 -4
- package/dist/verification/__tests__/native-release-manifest.test.js.map +1 -1
- package/dist/wiki/lint.d.ts +4 -1
- package/dist/wiki/lint.d.ts.map +1 -1
- package/dist/wiki/lint.js +3 -2
- package/dist/wiki/lint.js.map +1 -1
- package/package.json +13 -5
- package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
- package/plugins/oh-my-codex/hooks/codex-native-hook.mjs +105 -17
- package/plugins/oh-my-codex/skills/autopilot/SKILL.md +13 -5
- package/plugins/oh-my-codex/skills/cancel/SKILL.md +30 -85
- package/plugins/oh-my-codex/skills/ralph/SKILL.md +6 -4
- package/plugins/oh-my-codex/skills/ralplan/SKILL.md +16 -17
- package/plugins/oh-my-codex/skills/team/SKILL.md +13 -9
- package/plugins/oh-my-codex/skills/ultragoal/SKILL.md +3 -2
- package/skills/autopilot/SKILL.md +13 -5
- package/skills/cancel/SKILL.md +30 -85
- package/skills/ralph/SKILL.md +6 -4
- package/skills/ralplan/SKILL.md +16 -17
- package/skills/team/SKILL.md +13 -9
- package/skills/ultragoal/SKILL.md +3 -2
- package/src/scripts/__tests__/codex-native-hook.test.ts +8831 -951
- package/src/scripts/__tests__/issue-3293-callsite-parity.test.ts +187 -0
- package/src/scripts/__tests__/issue-3293-cancel-transaction.test.ts +189 -0
- package/src/scripts/__tests__/issue-3293-hook-owned-cancel.test.ts +187 -0
- package/src/scripts/__tests__/issue-3311-ultragoal-native-outside-tmux.test.ts +591 -0
- package/src/scripts/__tests__/issue-3358-ultragoal-cancel-lifecycle.test.ts +701 -0
- package/src/scripts/__tests__/issue-3369-autopilot-ralplan-state-machine.test.ts +211 -0
- package/src/scripts/__tests__/notify-state-io.test.ts +29 -0
- package/src/scripts/__tests__/notify-tmux-injection.test.ts +26 -1
- package/src/scripts/__tests__/postinstall.test.ts +23 -1
- package/src/scripts/__tests__/reasoning-artifact-contract.test.ts +129 -0
- package/src/scripts/__tests__/role-intent-bootstrap-e2e-3181.test.ts +67 -185
- package/src/scripts/__tests__/role-intent-durable-recovery-3181.test.ts +79 -178
- package/src/scripts/__tests__/smoke-packed-install.test.ts +525 -16
- package/src/scripts/__tests__/verify-native-release-assets.test.ts +240 -0
- package/src/scripts/codex-native-hook.ts +14238 -1429
- package/src/scripts/codex-native-pre-post.ts +43 -12
- package/src/scripts/generate-native-release-manifest.ts +83 -79
- package/src/scripts/notify-fallback-watcher.ts +91 -122
- package/src/scripts/notify-hook/auto-nudge.ts +71 -3
- package/src/scripts/notify-hook/state-io.ts +11 -0
- package/src/scripts/notify-hook/team-dispatch.ts +242 -75
- package/src/scripts/notify-hook/team-leader-nudge.ts +72 -22
- package/src/scripts/notify-hook/team-tmux-guard.ts +366 -39
- package/src/scripts/notify-hook/team-worker-stop.ts +43 -20
- package/src/scripts/notify-hook/team-worker.ts +82 -31
- package/src/scripts/notify-hook/tmux-injection.ts +33 -3
- package/src/scripts/notify-hook.ts +84 -82
- package/src/scripts/postinstall-advisory.ts +67 -0
- package/src/scripts/postinstall.ts +1 -1
- package/src/scripts/smoke-packed-install.ts +3608 -39
- package/src/scripts/sync-plugin-mirror.ts +17 -1
- package/src/scripts/verify-native-release-assets.ts +39 -31
- package/templates/AGENTS.md +1 -0
- package/dist/subagents/__tests__/adapted-role-binding.test.d.ts +0 -2
- package/dist/subagents/__tests__/adapted-role-binding.test.d.ts.map +0 -1
- package/dist/subagents/__tests__/adapted-role-binding.test.js +0 -988
- package/dist/subagents/__tests__/adapted-role-binding.test.js.map +0 -1
- package/dist/subagents/adapted-role-binding.d.ts +0 -17
- package/dist/subagents/adapted-role-binding.d.ts.map +0 -1
- package/dist/subagents/adapted-role-binding.js +0 -75
- package/dist/subagents/adapted-role-binding.js.map +0 -1
package/dist/mcp/state-paths.js
CHANGED
|
@@ -1,7 +1,25 @@
|
|
|
1
1
|
import { delimiter, isAbsolute, join, relative, resolve as resolvePath } from 'path';
|
|
2
|
-
import { existsSync, realpathSync } from 'fs';
|
|
2
|
+
import { existsSync, realpathSync, readFileSync } from 'fs';
|
|
3
3
|
import { readFile, readdir } from 'fs/promises';
|
|
4
|
-
import {
|
|
4
|
+
import { classifySessionStateLiveness, isSessionStateUsable, } from '../hooks/session.js';
|
|
5
|
+
export const VERIFIED_SESSION_BINDING_FIELDS = [
|
|
6
|
+
'session_id',
|
|
7
|
+
'native_session_id',
|
|
8
|
+
'codex_session_id',
|
|
9
|
+
'previous_native_session_id',
|
|
10
|
+
'owner_omx_session_id',
|
|
11
|
+
'owner_codex_session_id',
|
|
12
|
+
];
|
|
13
|
+
function verifiedSessionAliases(state) {
|
|
14
|
+
const raw = state;
|
|
15
|
+
const aliases = {};
|
|
16
|
+
for (const field of VERIFIED_SESSION_BINDING_FIELDS) {
|
|
17
|
+
const normalized = normalizeSessionId(raw[field]);
|
|
18
|
+
if (normalized)
|
|
19
|
+
aliases[field] = normalized;
|
|
20
|
+
}
|
|
21
|
+
return aliases;
|
|
22
|
+
}
|
|
5
23
|
export const SESSION_ID_PATTERN = /^[A-Za-z0-9_-]{1,64}$/;
|
|
6
24
|
export const STATE_MODE_SEGMENT_PATTERN = /^[A-Za-z0-9_-]{1,64}$/;
|
|
7
25
|
const STATE_FILE_SUFFIX = '-state.json';
|
|
@@ -14,6 +32,8 @@ const OMX_SESSION_ID_ENV = 'OMX_SESSION_ID';
|
|
|
14
32
|
export const WRITABLE_STATE_SCOPE_ERRORS = {
|
|
15
33
|
unusableSession: 'Cannot resolve writable state scope: session.json is present but unusable.',
|
|
16
34
|
unboundEnvironment: 'Cannot resolve writable state scope: OMX_SESSION_ID is not bound to session.json.',
|
|
35
|
+
sessionBindingMismatch: 'Cannot resolve writable state scope: OMX_SESSION_ID does not match the live session recorded in session.json.',
|
|
36
|
+
scopeChangedDuringWrite: 'Cannot commit the state write: the writable state scope changed while the write was in progress.',
|
|
17
37
|
};
|
|
18
38
|
export function normalizeSessionId(sessionId) {
|
|
19
39
|
if (typeof sessionId !== 'string')
|
|
@@ -51,7 +71,7 @@ export function validateStateModeSegment(mode) {
|
|
|
51
71
|
}
|
|
52
72
|
return normalized;
|
|
53
73
|
}
|
|
54
|
-
function getStateFilename(mode) {
|
|
74
|
+
export function getStateFilename(mode) {
|
|
55
75
|
return `${validateStateModeSegment(mode)}${STATE_FILE_SUFFIX}`;
|
|
56
76
|
}
|
|
57
77
|
export function validateStateFileName(fileName) {
|
|
@@ -92,14 +112,14 @@ function convertWslToWindowsPath(raw) {
|
|
|
92
112
|
const rest = String(m[2] || '').replace(/\//g, '\\');
|
|
93
113
|
return rest ? `${drive}:\\${rest}` : `${drive}:\\`;
|
|
94
114
|
}
|
|
95
|
-
export function resolveWorkingDirectoryForState(workingDirectory) {
|
|
115
|
+
export function resolveWorkingDirectoryForState(workingDirectory, env = process.env) {
|
|
96
116
|
const raw = typeof workingDirectory === 'string' ? workingDirectory.trim() : '';
|
|
97
117
|
if (raw.includes('\0')) {
|
|
98
118
|
throw new Error('workingDirectory contains a NUL byte');
|
|
99
119
|
}
|
|
100
120
|
if (!raw) {
|
|
101
121
|
const cwd = resolvePath(process.cwd());
|
|
102
|
-
return enforceWorkingDirectoryPolicy(cwd);
|
|
122
|
+
return enforceWorkingDirectoryPolicy(cwd, env);
|
|
103
123
|
}
|
|
104
124
|
let normalized = raw;
|
|
105
125
|
if (process.platform === 'win32') {
|
|
@@ -118,7 +138,7 @@ export function resolveWorkingDirectoryForState(workingDirectory) {
|
|
|
118
138
|
throw new Error('workingDirectory contains a NUL byte');
|
|
119
139
|
}
|
|
120
140
|
const resolved = resolvePath(normalized);
|
|
121
|
-
return enforceWorkingDirectoryPolicy(resolved);
|
|
141
|
+
return enforceWorkingDirectoryPolicy(resolved, env);
|
|
122
142
|
}
|
|
123
143
|
function canonicalizeExistingPath(path) {
|
|
124
144
|
try {
|
|
@@ -147,8 +167,8 @@ function canonicalizeExistingPath(path) {
|
|
|
147
167
|
}
|
|
148
168
|
return path;
|
|
149
169
|
}
|
|
150
|
-
function parseAllowedWorkingDirectoryRoots() {
|
|
151
|
-
const raw =
|
|
170
|
+
function parseAllowedWorkingDirectoryRoots(env = process.env) {
|
|
171
|
+
const raw = env[WORKDIR_ALLOWLIST_ENV];
|
|
152
172
|
if (typeof raw !== 'string' || raw.trim() === '')
|
|
153
173
|
return [];
|
|
154
174
|
const roots = raw
|
|
@@ -172,8 +192,8 @@ function isWithinRoot(path, root) {
|
|
|
172
192
|
const rel = relative(root, path);
|
|
173
193
|
return rel === '' || (!rel.startsWith('..') && !isAbsolute(rel));
|
|
174
194
|
}
|
|
175
|
-
function enforceWorkingDirectoryPolicy(resolvedWorkingDirectory) {
|
|
176
|
-
const roots = parseAllowedWorkingDirectoryRoots();
|
|
195
|
+
function enforceWorkingDirectoryPolicy(resolvedWorkingDirectory, env = process.env) {
|
|
196
|
+
const roots = parseAllowedWorkingDirectoryRoots(env);
|
|
177
197
|
if (roots.length === 0)
|
|
178
198
|
return resolvedWorkingDirectory;
|
|
179
199
|
const canonicalWorkingDirectory = canonicalizeExistingPath(resolvedWorkingDirectory);
|
|
@@ -183,23 +203,366 @@ function enforceWorkingDirectoryPolicy(resolvedWorkingDirectory) {
|
|
|
183
203
|
}
|
|
184
204
|
return canonicalWorkingDirectory;
|
|
185
205
|
}
|
|
186
|
-
|
|
187
|
-
|
|
206
|
+
function sessionPointerMatchesId(pointer, sessionId) {
|
|
207
|
+
return [
|
|
208
|
+
pointer.session_id,
|
|
209
|
+
pointer.native_session_id,
|
|
210
|
+
pointer.owner_omx_session_id,
|
|
211
|
+
pointer.owner_codex_session_id,
|
|
212
|
+
pointer.codex_session_id,
|
|
213
|
+
].some((value) => normalizeSessionId(value) === sessionId);
|
|
214
|
+
}
|
|
215
|
+
function discoverSessionAuthorityBaseStateDir(workingDirectory, env = process.env, onMatch) {
|
|
216
|
+
const sessionId = normalizeSessionId(env[OMX_SESSION_ID_ENV]);
|
|
217
|
+
if (!sessionId)
|
|
218
|
+
return undefined;
|
|
219
|
+
let current = resolveWorkingDirectoryForState(workingDirectory, env);
|
|
220
|
+
const observedCwd = canonicalizeExistingPath(current);
|
|
221
|
+
const allowedRoots = parseAllowedWorkingDirectoryRoots(env);
|
|
222
|
+
const matches = [];
|
|
223
|
+
while (true) {
|
|
224
|
+
const canonicalCurrent = canonicalizeExistingPath(current);
|
|
225
|
+
if (allowedRoots.length > 0 && !allowedRoots.some((root) => isWithinRoot(canonicalCurrent, root)))
|
|
226
|
+
break;
|
|
227
|
+
const candidate = join(current, '.omx', 'state');
|
|
228
|
+
const canonicalCandidate = canonicalizeExistingPath(candidate);
|
|
229
|
+
if (allowedRoots.length > 0 && !allowedRoots.some((root) => isWithinRoot(canonicalCandidate, root))) {
|
|
230
|
+
const parent = resolvePath(current, '..');
|
|
231
|
+
if (parent === current)
|
|
232
|
+
break;
|
|
233
|
+
current = parent;
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
const pointerPath = join(canonicalCandidate, 'session.json');
|
|
237
|
+
if (existsSync(pointerPath)) {
|
|
238
|
+
try {
|
|
239
|
+
const raw = readFileSync(pointerPath, 'utf8');
|
|
240
|
+
const parsed = JSON.parse(raw);
|
|
241
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
242
|
+
const state = parsed;
|
|
243
|
+
const recordedCwd = typeof state.cwd === 'string'
|
|
244
|
+
? canonicalizeExistingPath(resolvePath(state.cwd))
|
|
245
|
+
: '';
|
|
246
|
+
const recordedStateRoot = typeof state.state_root === 'string'
|
|
247
|
+
? canonicalizeExistingPath(resolvePath(state.state_root))
|
|
248
|
+
: recordedCwd
|
|
249
|
+
? canonicalizeExistingPath(join(recordedCwd, '.omx', 'state'))
|
|
250
|
+
: '';
|
|
251
|
+
if (sessionPointerMatchesId(state, sessionId)
|
|
252
|
+
&& recordedCwd
|
|
253
|
+
&& recordedStateRoot === canonicalCandidate
|
|
254
|
+
&& isWithinRoot(observedCwd, recordedCwd)
|
|
255
|
+
&& isSessionStateUsable(state, recordedCwd)) {
|
|
256
|
+
matches.push(canonicalCandidate);
|
|
257
|
+
onMatch?.({ baseStateDir: canonicalCandidate, raw, state, recordedCwd });
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
catch {
|
|
262
|
+
// Malformed pointers are classified by the normal state-scope resolver.
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
const parent = resolvePath(current, '..');
|
|
266
|
+
if (parent === current)
|
|
267
|
+
break;
|
|
268
|
+
current = parent;
|
|
269
|
+
}
|
|
270
|
+
const uniqueMatches = [...new Set(matches)];
|
|
271
|
+
if (uniqueMatches.length > 1) {
|
|
272
|
+
throw new Error(`Conflicting authoritative state roots for OMX_SESSION_ID ${sessionId}: ${uniqueMatches.join(', ')}`);
|
|
273
|
+
}
|
|
274
|
+
return uniqueMatches[0];
|
|
275
|
+
}
|
|
276
|
+
function validateResolvedBaseStateDir(baseStateDir, rootSource, env) {
|
|
277
|
+
const allowedRoots = parseAllowedWorkingDirectoryRoots(env);
|
|
278
|
+
if (allowedRoots.length > 0) {
|
|
279
|
+
const canonicalBaseStateDir = canonicalizeExistingPath(baseStateDir);
|
|
280
|
+
if (!allowedRoots.some((root) => isWithinRoot(canonicalBaseStateDir, root))) {
|
|
281
|
+
throw new Error(`State root "${canonicalBaseStateDir}" is outside allowed roots (${WORKDIR_ALLOWLIST_ENV})`);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return { baseStateDir, rootSource };
|
|
285
|
+
}
|
|
286
|
+
export function getBaseStateDirWithSource(workingDirectory, env = process.env) {
|
|
287
|
+
const teamStateRootOverride = env[OMX_TEAM_STATE_ROOT_ENV]?.trim();
|
|
188
288
|
if (typeof teamStateRootOverride === 'string' && teamStateRootOverride !== '') {
|
|
189
|
-
return
|
|
289
|
+
return validateResolvedBaseStateDir(resolveWorkingDirectoryForState(teamStateRootOverride, env), 'team-env', env);
|
|
190
290
|
}
|
|
191
|
-
const omxRootOverride =
|
|
291
|
+
const omxRootOverride = env[OMX_ROOT_ENV]?.trim();
|
|
192
292
|
if (typeof omxRootOverride === 'string' && omxRootOverride !== '') {
|
|
193
|
-
return
|
|
293
|
+
return validateResolvedBaseStateDir(join(resolveWorkingDirectoryForState(omxRootOverride, env), '.omx', 'state'), 'omx-root-env', env);
|
|
194
294
|
}
|
|
195
|
-
const omxStateRootOverride =
|
|
295
|
+
const omxStateRootOverride = env[OMX_STATE_ROOT_ENV]?.trim();
|
|
196
296
|
if (typeof omxStateRootOverride === 'string' && omxStateRootOverride !== '') {
|
|
197
|
-
return
|
|
297
|
+
return validateResolvedBaseStateDir(join(resolveWorkingDirectoryForState(omxStateRootOverride, env), '.omx', 'state'), 'omx-state-root-env', env);
|
|
198
298
|
}
|
|
199
|
-
|
|
299
|
+
const sessionAuthority = discoverSessionAuthorityBaseStateDir(workingDirectory, env);
|
|
300
|
+
if (sessionAuthority) {
|
|
301
|
+
return validateResolvedBaseStateDir(sessionAuthority, 'session-authority', env);
|
|
302
|
+
}
|
|
303
|
+
return validateResolvedBaseStateDir(join(resolveWorkingDirectoryForState(workingDirectory, env), '.omx', 'state'), 'cwd-default', env);
|
|
304
|
+
}
|
|
305
|
+
export function getBaseStateDir(workingDirectory, env = process.env) {
|
|
306
|
+
return getBaseStateDirWithSource(workingDirectory, env).baseStateDir;
|
|
200
307
|
}
|
|
201
|
-
|
|
202
|
-
|
|
308
|
+
function bindingRootSelector(env) {
|
|
309
|
+
if (typeof env[OMX_TEAM_STATE_ROOT_ENV] === 'string' && env[OMX_TEAM_STATE_ROOT_ENV].trim() !== '') {
|
|
310
|
+
return { source: 'team-env', selector: OMX_TEAM_STATE_ROOT_ENV };
|
|
311
|
+
}
|
|
312
|
+
if (typeof env[OMX_ROOT_ENV] === 'string' && env[OMX_ROOT_ENV].trim() !== '') {
|
|
313
|
+
return { source: 'omx-root-env', selector: OMX_ROOT_ENV };
|
|
314
|
+
}
|
|
315
|
+
if (typeof env[OMX_STATE_ROOT_ENV] === 'string' && env[OMX_STATE_ROOT_ENV].trim() !== '') {
|
|
316
|
+
return { source: 'omx-state-root-env', selector: OMX_STATE_ROOT_ENV };
|
|
317
|
+
}
|
|
318
|
+
return undefined;
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Read the selected session pointer once and classify its canonical binding.
|
|
322
|
+
* This is intentionally read-only: it never probes fallback roots, repairs
|
|
323
|
+
* pointers, touches tmux, or mutates the supplied environment.
|
|
324
|
+
*/
|
|
325
|
+
export async function readCanonicalSessionBindingSnapshot(workingDirectory, env = process.env) {
|
|
326
|
+
let cwd;
|
|
327
|
+
try {
|
|
328
|
+
cwd = resolveWorkingDirectoryForState(workingDirectory, env);
|
|
329
|
+
}
|
|
330
|
+
catch {
|
|
331
|
+
let fallbackCwd = process.cwd();
|
|
332
|
+
try {
|
|
333
|
+
if (typeof workingDirectory === 'string' && workingDirectory.trim())
|
|
334
|
+
fallbackCwd = resolvePath(workingDirectory);
|
|
335
|
+
}
|
|
336
|
+
catch {
|
|
337
|
+
// Keep the process cwd as a safe diagnostic anchor.
|
|
338
|
+
}
|
|
339
|
+
return {
|
|
340
|
+
cwd: fallbackCwd,
|
|
341
|
+
...(bindingRootSelector(env) ? { rootSource: bindingRootSelector(env)?.source } : normalizeSessionId(env[OMX_SESSION_ID_ENV]) ? { rootSource: 'session-authority' } : {}),
|
|
342
|
+
status: 'resolution-error',
|
|
343
|
+
verifiedAliases: {},
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
let resolved;
|
|
347
|
+
let selectedObservation;
|
|
348
|
+
try {
|
|
349
|
+
const teamStateRootOverride = env[OMX_TEAM_STATE_ROOT_ENV]?.trim();
|
|
350
|
+
const omxRootOverride = env[OMX_ROOT_ENV]?.trim();
|
|
351
|
+
const omxStateRootOverride = env[OMX_STATE_ROOT_ENV]?.trim();
|
|
352
|
+
if (teamStateRootOverride) {
|
|
353
|
+
resolved = validateResolvedBaseStateDir(resolveWorkingDirectoryForState(teamStateRootOverride, env), 'team-env', env);
|
|
354
|
+
}
|
|
355
|
+
else if (omxRootOverride) {
|
|
356
|
+
resolved = validateResolvedBaseStateDir(join(resolveWorkingDirectoryForState(omxRootOverride, env), '.omx', 'state'), 'omx-root-env', env);
|
|
357
|
+
}
|
|
358
|
+
else if (omxStateRootOverride) {
|
|
359
|
+
resolved = validateResolvedBaseStateDir(join(resolveWorkingDirectoryForState(omxStateRootOverride, env), '.omx', 'state'), 'omx-state-root-env', env);
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
const sessionAuthority = discoverSessionAuthorityBaseStateDir(cwd, env, (observation) => {
|
|
363
|
+
selectedObservation = observation;
|
|
364
|
+
});
|
|
365
|
+
if (sessionAuthority) {
|
|
366
|
+
resolved = validateResolvedBaseStateDir(sessionAuthority, 'session-authority', env);
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
resolved = validateResolvedBaseStateDir(join(cwd, '.omx', 'state'), 'cwd-default', env);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
catch {
|
|
374
|
+
const selector = bindingRootSelector(env);
|
|
375
|
+
return {
|
|
376
|
+
cwd,
|
|
377
|
+
...(selector ? { rootSource: selector.source } : normalizeSessionId(env[OMX_SESSION_ID_ENV]) ? { rootSource: 'session-authority' } : {}),
|
|
378
|
+
status: 'resolution-error',
|
|
379
|
+
verifiedAliases: {},
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
const baseStateDir = resolved.baseStateDir;
|
|
383
|
+
const selectedSessionJson = join(baseStateDir, 'session.json');
|
|
384
|
+
let raw;
|
|
385
|
+
let parsed;
|
|
386
|
+
if (selectedObservation && selectedObservation.baseStateDir === baseStateDir) {
|
|
387
|
+
raw = selectedObservation.raw;
|
|
388
|
+
parsed = selectedObservation.state;
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
try {
|
|
392
|
+
raw = await readFile(selectedSessionJson, 'utf-8');
|
|
393
|
+
}
|
|
394
|
+
catch (error) {
|
|
395
|
+
if (error.code === 'ENOENT') {
|
|
396
|
+
return {
|
|
397
|
+
cwd,
|
|
398
|
+
baseStateDir,
|
|
399
|
+
rootSource: resolved.rootSource,
|
|
400
|
+
selectedSessionJson,
|
|
401
|
+
status: 'absent',
|
|
402
|
+
verifiedAliases: {},
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
return {
|
|
406
|
+
cwd,
|
|
407
|
+
baseStateDir,
|
|
408
|
+
rootSource: resolved.rootSource,
|
|
409
|
+
selectedSessionJson,
|
|
410
|
+
status: 'read-error',
|
|
411
|
+
verifiedAliases: {},
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
try {
|
|
415
|
+
parsed = JSON.parse(raw);
|
|
416
|
+
}
|
|
417
|
+
catch {
|
|
418
|
+
return {
|
|
419
|
+
cwd,
|
|
420
|
+
baseStateDir,
|
|
421
|
+
rootSource: resolved.rootSource,
|
|
422
|
+
selectedSessionJson,
|
|
423
|
+
raw,
|
|
424
|
+
status: 'malformed',
|
|
425
|
+
verifiedAliases: {},
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
430
|
+
return {
|
|
431
|
+
cwd,
|
|
432
|
+
baseStateDir,
|
|
433
|
+
rootSource: resolved.rootSource,
|
|
434
|
+
selectedSessionJson,
|
|
435
|
+
raw,
|
|
436
|
+
status: 'malformed',
|
|
437
|
+
verifiedAliases: {},
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
const state = parsed;
|
|
441
|
+
const aliases = verifiedSessionAliases(state);
|
|
442
|
+
if (!aliases.session_id) {
|
|
443
|
+
return {
|
|
444
|
+
cwd,
|
|
445
|
+
baseStateDir,
|
|
446
|
+
rootSource: resolved.rootSource,
|
|
447
|
+
selectedSessionJson,
|
|
448
|
+
raw,
|
|
449
|
+
state,
|
|
450
|
+
status: 'malformed',
|
|
451
|
+
verifiedAliases: aliases,
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
const recordedCwdRaw = typeof state.cwd === 'string' ? state.cwd.trim() : '';
|
|
455
|
+
if (Object.prototype.hasOwnProperty.call(state, 'state_root') && typeof state.state_root === 'string' && state.state_root.trim() === '') {
|
|
456
|
+
return {
|
|
457
|
+
cwd,
|
|
458
|
+
baseStateDir,
|
|
459
|
+
rootSource: resolved.rootSource,
|
|
460
|
+
selectedSessionJson,
|
|
461
|
+
raw,
|
|
462
|
+
state,
|
|
463
|
+
status: 'malformed',
|
|
464
|
+
verifiedAliases: aliases,
|
|
465
|
+
};
|
|
466
|
+
}
|
|
467
|
+
if (!recordedCwdRaw) {
|
|
468
|
+
return {
|
|
469
|
+
cwd,
|
|
470
|
+
baseStateDir,
|
|
471
|
+
rootSource: resolved.rootSource,
|
|
472
|
+
selectedSessionJson,
|
|
473
|
+
raw,
|
|
474
|
+
state,
|
|
475
|
+
status: 'missing-recorded-cwd',
|
|
476
|
+
verifiedAliases: aliases,
|
|
477
|
+
};
|
|
478
|
+
}
|
|
479
|
+
let recordedCwd;
|
|
480
|
+
let canonicalBaseStateDir;
|
|
481
|
+
let canonicalObservedCwd;
|
|
482
|
+
try {
|
|
483
|
+
recordedCwd = canonicalizeExistingPath(resolvePath(recordedCwdRaw));
|
|
484
|
+
canonicalBaseStateDir = canonicalizeExistingPath(baseStateDir);
|
|
485
|
+
canonicalObservedCwd = canonicalizeExistingPath(resolvePath(cwd));
|
|
486
|
+
}
|
|
487
|
+
catch {
|
|
488
|
+
return {
|
|
489
|
+
cwd,
|
|
490
|
+
baseStateDir,
|
|
491
|
+
rootSource: resolved.rootSource,
|
|
492
|
+
selectedSessionJson,
|
|
493
|
+
raw,
|
|
494
|
+
state,
|
|
495
|
+
status: 'read-error',
|
|
496
|
+
verifiedAliases: aliases,
|
|
497
|
+
};
|
|
498
|
+
}
|
|
499
|
+
const explicitRoot = typeof state.state_root === 'string' && state.state_root.trim() !== ''
|
|
500
|
+
? state.state_root.trim()
|
|
501
|
+
: undefined;
|
|
502
|
+
let recordedStateRoot;
|
|
503
|
+
try {
|
|
504
|
+
recordedStateRoot = explicitRoot
|
|
505
|
+
? canonicalizeExistingPath(resolvePath(explicitRoot))
|
|
506
|
+
: canonicalizeExistingPath(join(recordedCwd, '.omx', 'state'));
|
|
507
|
+
}
|
|
508
|
+
catch {
|
|
509
|
+
return {
|
|
510
|
+
cwd,
|
|
511
|
+
baseStateDir,
|
|
512
|
+
rootSource: resolved.rootSource,
|
|
513
|
+
selectedSessionJson,
|
|
514
|
+
recordedCwd,
|
|
515
|
+
raw,
|
|
516
|
+
state,
|
|
517
|
+
status: 'root-mismatch',
|
|
518
|
+
verifiedAliases: aliases,
|
|
519
|
+
};
|
|
520
|
+
}
|
|
521
|
+
if (recordedStateRoot !== canonicalBaseStateDir) {
|
|
522
|
+
return {
|
|
523
|
+
cwd,
|
|
524
|
+
baseStateDir,
|
|
525
|
+
rootSource: resolved.rootSource,
|
|
526
|
+
selectedSessionJson,
|
|
527
|
+
recordedCwd,
|
|
528
|
+
raw,
|
|
529
|
+
state,
|
|
530
|
+
status: 'root-mismatch',
|
|
531
|
+
verifiedAliases: aliases,
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
if (!isWithinRoot(canonicalObservedCwd, recordedCwd)) {
|
|
535
|
+
return {
|
|
536
|
+
cwd,
|
|
537
|
+
baseStateDir,
|
|
538
|
+
rootSource: resolved.rootSource,
|
|
539
|
+
selectedSessionJson,
|
|
540
|
+
recordedCwd,
|
|
541
|
+
raw,
|
|
542
|
+
state,
|
|
543
|
+
status: 'foreign-cwd',
|
|
544
|
+
verifiedAliases: aliases,
|
|
545
|
+
};
|
|
546
|
+
}
|
|
547
|
+
let liveness;
|
|
548
|
+
try {
|
|
549
|
+
liveness = classifySessionStateLiveness(state);
|
|
550
|
+
}
|
|
551
|
+
catch {
|
|
552
|
+
liveness = 'identity-indeterminate';
|
|
553
|
+
}
|
|
554
|
+
return {
|
|
555
|
+
cwd,
|
|
556
|
+
baseStateDir,
|
|
557
|
+
rootSource: resolved.rootSource,
|
|
558
|
+
selectedSessionJson,
|
|
559
|
+
recordedCwd,
|
|
560
|
+
raw,
|
|
561
|
+
state,
|
|
562
|
+
liveness,
|
|
563
|
+
status: liveness,
|
|
564
|
+
verifiedAliases: aliases,
|
|
565
|
+
};
|
|
203
566
|
}
|
|
204
567
|
export function getStateDir(workingDirectory, sessionId) {
|
|
205
568
|
const base = getBaseStateDir(workingDirectory);
|
|
@@ -225,22 +588,45 @@ function resolveCanonicalSessionId(candidate, metadata) {
|
|
|
225
588
|
return undefined;
|
|
226
589
|
if (!metadata)
|
|
227
590
|
return candidate;
|
|
228
|
-
return metadata.nativeSessionAliases.includes(candidate)
|
|
591
|
+
return metadata.nativeSessionAliases.includes(candidate)
|
|
592
|
+
|| metadata.ownerOmxSessionId === candidate
|
|
593
|
+
|| metadata.ownerCodexSessionId === candidate
|
|
229
594
|
? metadata.sessionId
|
|
230
595
|
: candidate;
|
|
231
596
|
}
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
597
|
+
/**
|
|
598
|
+
* Read the selected session.json once and return the parsed snapshot only
|
|
599
|
+
* when it holds full selected-root authority for this exact base state
|
|
600
|
+
* directory: a nonempty recorded cwd that contains the observed cwd, and a
|
|
601
|
+
* recorded state_root canonical-equal to the selected base (with the
|
|
602
|
+
* historical cwd-derived fallback when state_root is absent). Usability/
|
|
603
|
+
* liveness is deliberately NOT checked here so stale-dead recovery can
|
|
604
|
+
* evaluate authority AND liveness from the same immutable bytes. A malformed
|
|
605
|
+
* or non-authoritative pointer returns null (fail closed); unexpected read
|
|
606
|
+
* I/O errors propagate instead of being collapsed into a generic classification.
|
|
607
|
+
*/
|
|
608
|
+
async function readAuthoritativeSessionSnapshotFromBaseStateDir(cwd, baseStateDir, selectedSnapshot) {
|
|
609
|
+
const snapshot = selectedSnapshot ?? await readCanonicalSessionBindingSnapshot(cwd);
|
|
610
|
+
const selectedBaseStateDir = baseStateDir ?? snapshot.baseStateDir;
|
|
611
|
+
if (!selectedBaseStateDir)
|
|
235
612
|
return null;
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
const state = JSON.parse(content);
|
|
239
|
-
return isSessionStateUsable(state, cwd) ? state : null;
|
|
613
|
+
if (snapshot.status === 'read-error') {
|
|
614
|
+
throw new Error('selected session pointer read failed');
|
|
240
615
|
}
|
|
241
|
-
|
|
616
|
+
if (!snapshot.raw
|
|
617
|
+
|| !snapshot.state
|
|
618
|
+
|| !snapshot.recordedCwd
|
|
619
|
+
|| !snapshot.baseStateDir
|
|
620
|
+
|| canonicalizeExistingPath(snapshot.baseStateDir) !== canonicalizeExistingPath(selectedBaseStateDir)
|
|
621
|
+
|| !['usable', 'stale-dead', 'identity-indeterminate'].includes(snapshot.status)) {
|
|
242
622
|
return null;
|
|
243
623
|
}
|
|
624
|
+
return {
|
|
625
|
+
baseStateDir: selectedBaseStateDir,
|
|
626
|
+
raw: snapshot.raw,
|
|
627
|
+
state: snapshot.state,
|
|
628
|
+
recordedCwd: snapshot.recordedCwd,
|
|
629
|
+
};
|
|
244
630
|
}
|
|
245
631
|
function normalizeSessionMetadata(state, sourcePath) {
|
|
246
632
|
const sessionId = normalizeSessionId(state?.session_id);
|
|
@@ -283,16 +669,33 @@ function normalizeSessionMetadata(state, sourcePath) {
|
|
|
283
669
|
...(sourcePath ? { sourcePath } : {}),
|
|
284
670
|
};
|
|
285
671
|
}
|
|
286
|
-
async function readSessionMetadataFromBaseStateDir(cwd, baseStateDir =
|
|
287
|
-
const
|
|
288
|
-
const
|
|
672
|
+
export async function readSessionMetadataFromBaseStateDir(cwd, baseStateDir, options = {}) {
|
|
673
|
+
const selectedBaseStateDir = baseStateDir ?? getBaseStateDir(cwd);
|
|
674
|
+
const snapshot = await readCanonicalSessionBindingSnapshot(cwd, options.allowLegacyBoundHud
|
|
675
|
+
? { ...process.env, [OMX_TEAM_STATE_ROOT_ENV]: selectedBaseStateDir, [OMX_ROOT_ENV]: '', [OMX_STATE_ROOT_ENV]: '' }
|
|
676
|
+
: process.env);
|
|
677
|
+
if (!selectedBaseStateDir)
|
|
678
|
+
return undefined;
|
|
679
|
+
const sessionPath = join(selectedBaseStateDir, 'session.json');
|
|
680
|
+
const authoritative = await readAuthoritativeSessionSnapshotFromBaseStateDir(cwd, selectedBaseStateDir, snapshot);
|
|
681
|
+
const session = authoritative && isSessionStateUsable(authoritative.state, authoritative.recordedCwd)
|
|
682
|
+
? authoritative.state
|
|
683
|
+
: options.allowLegacyBoundHud
|
|
684
|
+
&& snapshot.status === 'identity-indeterminate'
|
|
685
|
+
&& snapshot.state
|
|
686
|
+
&& snapshot.baseStateDir
|
|
687
|
+
&& canonicalizeExistingPath(snapshot.baseStateDir) === canonicalizeExistingPath(selectedBaseStateDir)
|
|
688
|
+
? snapshot.state
|
|
689
|
+
: null;
|
|
289
690
|
return normalizeSessionMetadata(session, sessionPath);
|
|
290
691
|
}
|
|
291
692
|
export async function readCurrentSessionId(workingDirectory) {
|
|
292
693
|
const cwd = resolveWorkingDirectoryForState(workingDirectory);
|
|
293
|
-
const
|
|
694
|
+
const snapshot = await readCanonicalSessionBindingSnapshot(cwd);
|
|
695
|
+
const baseStateDir = snapshot.baseStateDir ?? getBaseStateDir(cwd);
|
|
294
696
|
const envSessionId = readSessionIdFromEnvironment();
|
|
295
|
-
const
|
|
697
|
+
const authoritative = await readAuthoritativeSessionSnapshotFromBaseStateDir(cwd, baseStateDir, snapshot);
|
|
698
|
+
const metadata = normalizeSessionMetadata(authoritative && isSessionStateUsable(authoritative.state, authoritative.recordedCwd) ? authoritative.state : null, join(baseStateDir, 'session.json'));
|
|
296
699
|
if (envSessionId)
|
|
297
700
|
return resolveCanonicalSessionId(envSessionId, metadata);
|
|
298
701
|
if (metadata?.sessionId)
|
|
@@ -301,25 +704,59 @@ export async function readCurrentSessionId(workingDirectory) {
|
|
|
301
704
|
if (resolvePath(baseStateDir) !== resolvePath(localStateDir)) {
|
|
302
705
|
return undefined;
|
|
303
706
|
}
|
|
304
|
-
|
|
707
|
+
if (authoritative && isSessionStateUsable(authoritative.state, authoritative.recordedCwd)) {
|
|
708
|
+
return authoritative.state.session_id;
|
|
709
|
+
}
|
|
710
|
+
// Legacy HUD readers may carry only a local session_id pointer. This is never
|
|
711
|
+
// used for explicit, foreign, malformed, or otherwise contaminated roots.
|
|
712
|
+
if (snapshot.status !== 'missing-recorded-cwd')
|
|
713
|
+
return undefined;
|
|
714
|
+
try {
|
|
715
|
+
const raw = JSON.parse(await readFile(join(baseStateDir, 'session.json'), 'utf-8'));
|
|
716
|
+
return typeof raw.session_id === 'string' ? normalizeSessionId(raw.session_id) : undefined;
|
|
717
|
+
}
|
|
718
|
+
catch {
|
|
719
|
+
return undefined;
|
|
720
|
+
}
|
|
305
721
|
}
|
|
306
722
|
function isKnownSessionAlias(sessionId, metadata) {
|
|
307
723
|
return metadata.nativeSessionAliases.includes(sessionId)
|
|
308
724
|
|| metadata.ownerOmxSessionId === sessionId
|
|
309
725
|
|| metadata.ownerCodexSessionId === sessionId;
|
|
310
726
|
}
|
|
727
|
+
let selectedPointerRecoveryHookForTests;
|
|
728
|
+
let writableScopeRevalidationHookForTests;
|
|
729
|
+
let selectedDecisionSnapshotReadHookForTests;
|
|
730
|
+
let recoveryStabilityRereadHookForTests;
|
|
731
|
+
export function __setWritableStateScopeTestHooksForTests(hooks) {
|
|
732
|
+
selectedPointerRecoveryHookForTests = hooks.beforeRecoveryReread;
|
|
733
|
+
writableScopeRevalidationHookForTests = hooks.beforeScopeRevalidation;
|
|
734
|
+
selectedDecisionSnapshotReadHookForTests = hooks.onSelectedDecisionSnapshotRead;
|
|
735
|
+
recoveryStabilityRereadHookForTests = hooks.onRecoveryStabilityReread;
|
|
736
|
+
}
|
|
311
737
|
/**
|
|
312
738
|
* Writable scope precedence:
|
|
313
739
|
* - explicit session_id preserves explicit fork writes;
|
|
314
740
|
* - a usable session.json supplies the only implicit session scope;
|
|
315
741
|
* - OMX_SESSION_ID may bind a known alias only when the live tmux pane proves
|
|
316
742
|
* the canonical session tag;
|
|
743
|
+
* - a stale-dead session.json yields to an explicit exact-current
|
|
744
|
+
* OMX_SESSION_ID binding (the dead owner holds no authority; SessionStart
|
|
745
|
+
* remains the only pointer writer);
|
|
746
|
+
* - an identity-indeterminate session.json may recover only when OMX_SESSION_ID
|
|
747
|
+
* exactly matches the pointer's own session_id (the owner may still be alive,
|
|
748
|
+
* so unlike stale-dead recovery, no looser validated binding is accepted);
|
|
317
749
|
* - root writes are allowed only when session.json is absent.
|
|
318
750
|
*/
|
|
319
751
|
export async function resolveWritableStateScope(workingDirectory, explicitSessionId) {
|
|
320
752
|
const cwd = resolveWorkingDirectoryForState(workingDirectory);
|
|
321
|
-
const
|
|
322
|
-
const
|
|
753
|
+
const canonicalSnapshot = await readCanonicalSessionBindingSnapshot(cwd);
|
|
754
|
+
const baseStateDir = canonicalSnapshot.baseStateDir ?? getBaseStateDir(cwd);
|
|
755
|
+
let selectedDecisionSnapshotReadOrdinalForTests = 0;
|
|
756
|
+
let recoveryStabilityRereadOrdinalForTests = 0;
|
|
757
|
+
const snapshot = await readAuthoritativeSessionSnapshotFromBaseStateDir(cwd, baseStateDir, canonicalSnapshot);
|
|
758
|
+
const liveness = snapshot ? classifySessionStateLiveness(snapshot.state) : undefined;
|
|
759
|
+
const metadata = normalizeSessionMetadata(snapshot && liveness === 'usable' ? snapshot.state : null, join(baseStateDir, 'session.json'));
|
|
323
760
|
const validatedExplicit = validateSessionId(explicitSessionId);
|
|
324
761
|
if (validatedExplicit) {
|
|
325
762
|
const sessionId = resolveCanonicalSessionId(validatedExplicit, metadata) ?? validatedExplicit;
|
|
@@ -330,7 +767,43 @@ export async function resolveWritableStateScope(workingDirectory, explicitSessio
|
|
|
330
767
|
};
|
|
331
768
|
}
|
|
332
769
|
if (!metadata) {
|
|
333
|
-
|
|
770
|
+
const sessionPath = join(baseStateDir, 'session.json');
|
|
771
|
+
if (existsSync(sessionPath)) {
|
|
772
|
+
const envSessionId = normalizeSessionId(process.env[OMX_SESSION_ID_ENV]);
|
|
773
|
+
if (snapshot && selectedDecisionSnapshotReadHookForTests) {
|
|
774
|
+
selectedDecisionSnapshotReadHookForTests({
|
|
775
|
+
ordinal: ++selectedDecisionSnapshotReadOrdinalForTests,
|
|
776
|
+
raw: snapshot.raw,
|
|
777
|
+
});
|
|
778
|
+
}
|
|
779
|
+
if (snapshot && envSessionId) {
|
|
780
|
+
const canonicalPointerSessionId = normalizeSessionId(snapshot.state.session_id);
|
|
781
|
+
const recoveryEligible = Boolean(canonicalPointerSessionId
|
|
782
|
+
&& (liveness === 'stale-dead'
|
|
783
|
+
|| (liveness === 'identity-indeterminate' && envSessionId === canonicalPointerSessionId)));
|
|
784
|
+
if (recoveryEligible) {
|
|
785
|
+
if (selectedPointerRecoveryHookForTests)
|
|
786
|
+
await selectedPointerRecoveryHookForTests();
|
|
787
|
+
const reread = await readFile(sessionPath, 'utf-8').catch((error) => {
|
|
788
|
+
if (error.code === 'ENOENT')
|
|
789
|
+
return undefined;
|
|
790
|
+
throw error;
|
|
791
|
+
});
|
|
792
|
+
if (recoveryStabilityRereadHookForTests) {
|
|
793
|
+
recoveryStabilityRereadHookForTests({
|
|
794
|
+
ordinal: ++recoveryStabilityRereadOrdinalForTests,
|
|
795
|
+
raw: reread,
|
|
796
|
+
});
|
|
797
|
+
}
|
|
798
|
+
if (reread === snapshot.raw) {
|
|
799
|
+
return {
|
|
800
|
+
source: 'session',
|
|
801
|
+
sessionId: envSessionId,
|
|
802
|
+
stateDir: join(baseStateDir, 'sessions', envSessionId),
|
|
803
|
+
};
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
}
|
|
334
807
|
throw new Error(WRITABLE_STATE_SCOPE_ERRORS.unusableSession);
|
|
335
808
|
}
|
|
336
809
|
if (normalizeSessionId(process.env[OMX_SESSION_ID_ENV])) {
|
|
@@ -350,7 +823,7 @@ export async function resolveWritableStateScope(workingDirectory, explicitSessio
|
|
|
350
823
|
};
|
|
351
824
|
}
|
|
352
825
|
if (!isKnownSessionAlias(envSessionId, metadata)) {
|
|
353
|
-
throw new Error(WRITABLE_STATE_SCOPE_ERRORS.
|
|
826
|
+
throw new Error(WRITABLE_STATE_SCOPE_ERRORS.sessionBindingMismatch);
|
|
354
827
|
}
|
|
355
828
|
return {
|
|
356
829
|
source: 'session',
|
|
@@ -358,6 +831,36 @@ export async function resolveWritableStateScope(workingDirectory, explicitSessio
|
|
|
358
831
|
stateDir: join(baseStateDir, 'sessions', metadata.sessionId),
|
|
359
832
|
};
|
|
360
833
|
}
|
|
834
|
+
/**
|
|
835
|
+
* Point-in-time check performed immediately before the caller's commit. It
|
|
836
|
+
* reduces, but does not eliminate, the window for a pointer or root
|
|
837
|
+
* publication to move the selected target: one can still land after this
|
|
838
|
+
* check returns and before the caller's write, rename, or unlink. Multi-file
|
|
839
|
+
* sequences are not atomic.
|
|
840
|
+
*/
|
|
841
|
+
export async function assertWritableStateScopeUnchanged(workingDirectory, explicitSessionId, expected, expectedBaseStateDir, event) {
|
|
842
|
+
if (writableScopeRevalidationHookForTests)
|
|
843
|
+
await writableScopeRevalidationHookForTests(event);
|
|
844
|
+
const current = await resolveWritableStateScope(workingDirectory, explicitSessionId);
|
|
845
|
+
const currentBaseStateDir = getBaseStateDirWithSource(workingDirectory).baseStateDir;
|
|
846
|
+
if (current.source !== expected.source
|
|
847
|
+
|| current.sessionId !== expected.sessionId
|
|
848
|
+
|| current.stateDir !== expected.stateDir
|
|
849
|
+
|| currentBaseStateDir !== expectedBaseStateDir) {
|
|
850
|
+
throw new Error(WRITABLE_STATE_SCOPE_ERRORS.scopeChangedDuringWrite);
|
|
851
|
+
}
|
|
852
|
+
}
|
|
853
|
+
export function createWritableCommitRevalidator(options) {
|
|
854
|
+
let commitOrdinal = 0;
|
|
855
|
+
return async (attempt) => {
|
|
856
|
+
const event = {
|
|
857
|
+
operation: options.operation,
|
|
858
|
+
commitOrdinal: ++commitOrdinal,
|
|
859
|
+
...attempt,
|
|
860
|
+
};
|
|
861
|
+
await assertWritableStateScopeUnchanged(options.cwd, options.explicitSessionId, options.capturedScope, options.baseStateDir, event);
|
|
862
|
+
};
|
|
863
|
+
}
|
|
361
864
|
export async function resolveStateScope(workingDirectory, explicitSessionId) {
|
|
362
865
|
const cwd = resolveWorkingDirectoryForState(workingDirectory);
|
|
363
866
|
const baseStateDir = getBaseStateDir(cwd);
|
|
@@ -516,7 +1019,7 @@ export async function getAllScopedStateDirs(workingDirectory) {
|
|
|
516
1019
|
return [getBaseStateDir(workingDirectory), ...(await getAllSessionScopedStateDirs(workingDirectory))];
|
|
517
1020
|
}
|
|
518
1021
|
export function isModeStateFilename(filename) {
|
|
519
|
-
return filename.endsWith(STATE_FILE_SUFFIX) && filename !== 'session.json';
|
|
1022
|
+
return filename.endsWith(STATE_FILE_SUFFIX) && filename !== 'session.json' && filename !== 'run-state.json';
|
|
520
1023
|
}
|
|
521
1024
|
async function listModeStateFilesInDir(dir, scope) {
|
|
522
1025
|
if (!existsSync(dir))
|