oh-my-codex 0.17.3 → 0.18.1
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 +13 -5
- package/Cargo.toml +2 -1
- package/README.md +44 -19
- package/crates/omx-api/Cargo.toml +19 -0
- package/crates/omx-api/src/lib.rs +2997 -0
- package/crates/omx-api/src/main.rs +10 -0
- package/crates/omx-api/tests/cli.rs +558 -0
- package/crates/omx-explore/src/main.rs +4 -0
- package/crates/omx-sparkshell/src/codex_bridge.rs +437 -123
- package/crates/omx-sparkshell/src/exec.rs +127 -1
- package/crates/omx-sparkshell/src/main.rs +829 -30
- package/crates/omx-sparkshell/src/prompt.rs +25 -3
- package/crates/omx-sparkshell/src/redaction.rs +241 -0
- package/crates/omx-sparkshell/tests/execution.rs +702 -237
- package/dist/cli/__tests__/api.test.d.ts +2 -0
- package/dist/cli/__tests__/api.test.d.ts.map +1 -0
- package/dist/cli/__tests__/api.test.js +175 -0
- package/dist/cli/__tests__/api.test.js.map +1 -0
- package/dist/cli/__tests__/ask.test.js +72 -5
- package/dist/cli/__tests__/ask.test.js.map +1 -1
- package/dist/cli/__tests__/autoresearch-goal.test.js +14 -1
- package/dist/cli/__tests__/autoresearch-goal.test.js.map +1 -1
- package/dist/cli/__tests__/codex-plugin-layout.test.js +15 -7
- package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -1
- package/dist/cli/__tests__/doctor-warning-copy.test.js +76 -3
- package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
- package/dist/cli/__tests__/explore.test.js +23 -0
- package/dist/cli/__tests__/explore.test.js.map +1 -1
- package/dist/cli/__tests__/index.test.js +171 -5
- package/dist/cli/__tests__/index.test.js.map +1 -1
- package/dist/cli/__tests__/install-docs-contract.test.d.ts +2 -0
- package/dist/cli/__tests__/install-docs-contract.test.d.ts.map +1 -0
- package/dist/cli/__tests__/install-docs-contract.test.js +55 -0
- package/dist/cli/__tests__/install-docs-contract.test.js.map +1 -0
- package/dist/cli/__tests__/launch-fallback.test.js +191 -0
- package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
- package/dist/cli/__tests__/package-bin-contract.test.js +4 -3
- package/dist/cli/__tests__/package-bin-contract.test.js.map +1 -1
- package/dist/cli/__tests__/question.test.js +27 -41
- package/dist/cli/__tests__/question.test.js.map +1 -1
- package/dist/cli/__tests__/setup-install-mode.test.js +232 -35
- package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
- package/dist/cli/__tests__/sparkshell-cli.test.js +25 -1
- package/dist/cli/__tests__/sparkshell-cli.test.js.map +1 -1
- package/dist/cli/__tests__/sparkshell-packaging.test.js +1 -0
- package/dist/cli/__tests__/sparkshell-packaging.test.js.map +1 -1
- package/dist/cli/__tests__/ultragoal.test.js +227 -4
- package/dist/cli/__tests__/ultragoal.test.js.map +1 -1
- package/dist/cli/__tests__/update.test.js +72 -1
- package/dist/cli/__tests__/update.test.js.map +1 -1
- package/dist/cli/__tests__/version-sync-contract.test.js +4 -0
- package/dist/cli/__tests__/version-sync-contract.test.js.map +1 -1
- package/dist/cli/__tests__/windows-popup-loop-contract.test.js +1 -1
- package/dist/cli/__tests__/windows-popup-loop-contract.test.js.map +1 -1
- package/dist/cli/api.d.ts +26 -0
- package/dist/cli/api.d.ts.map +1 -0
- package/dist/cli/api.js +153 -0
- package/dist/cli/api.js.map +1 -0
- package/dist/cli/codex-feature-probe.d.ts +5 -0
- package/dist/cli/codex-feature-probe.d.ts.map +1 -1
- package/dist/cli/codex-feature-probe.js +13 -7
- package/dist/cli/codex-feature-probe.js.map +1 -1
- package/dist/cli/doctor.d.ts +7 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +119 -10
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/explore.d.ts +2 -0
- package/dist/cli/explore.d.ts.map +1 -1
- package/dist/cli/explore.js +43 -1
- package/dist/cli/explore.js.map +1 -1
- package/dist/cli/index.d.ts +12 -4
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +460 -87
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/native-assets.d.ts +2 -1
- package/dist/cli/native-assets.d.ts.map +1 -1
- package/dist/cli/native-assets.js +1 -0
- package/dist/cli/native-assets.js.map +1 -1
- package/dist/cli/plugin-marketplace.d.ts +2 -0
- package/dist/cli/plugin-marketplace.d.ts.map +1 -1
- package/dist/cli/plugin-marketplace.js +15 -1
- package/dist/cli/plugin-marketplace.js.map +1 -1
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +71 -11
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/sparkshell.d.ts +7 -1
- package/dist/cli/sparkshell.d.ts.map +1 -1
- package/dist/cli/sparkshell.js +31 -4
- package/dist/cli/sparkshell.js.map +1 -1
- package/dist/cli/ultragoal.d.ts +1 -1
- package/dist/cli/ultragoal.d.ts.map +1 -1
- package/dist/cli/ultragoal.js +184 -10
- package/dist/cli/ultragoal.js.map +1 -1
- package/dist/cli/update.d.ts +2 -0
- package/dist/cli/update.d.ts.map +1 -1
- package/dist/cli/update.js +14 -3
- package/dist/cli/update.js.map +1 -1
- package/dist/compat/__tests__/doctor-contract.test.js +3 -0
- package/dist/compat/__tests__/doctor-contract.test.js.map +1 -1
- package/dist/config/__tests__/codex-feature-flags.test.js +11 -1
- package/dist/config/__tests__/codex-feature-flags.test.js.map +1 -1
- package/dist/config/__tests__/codex-hooks.test.js +19 -8
- package/dist/config/__tests__/codex-hooks.test.js.map +1 -1
- package/dist/config/__tests__/commit-lore-guard.test.d.ts +2 -0
- package/dist/config/__tests__/commit-lore-guard.test.d.ts.map +1 -0
- package/dist/config/__tests__/commit-lore-guard.test.js +20 -0
- package/dist/config/__tests__/commit-lore-guard.test.js.map +1 -0
- package/dist/config/codex-feature-flags.d.ts +4 -0
- package/dist/config/codex-feature-flags.d.ts.map +1 -1
- package/dist/config/codex-feature-flags.js +4 -0
- package/dist/config/codex-feature-flags.js.map +1 -1
- package/dist/config/codex-hooks.js +6 -6
- package/dist/config/codex-hooks.js.map +1 -1
- package/dist/config/commit-lore-guard.d.ts +1 -0
- package/dist/config/commit-lore-guard.d.ts.map +1 -1
- package/dist/config/commit-lore-guard.js +29 -3
- package/dist/config/commit-lore-guard.js.map +1 -1
- package/dist/config/generator.d.ts +3 -1
- package/dist/config/generator.d.ts.map +1 -1
- package/dist/config/generator.js +114 -10
- package/dist/config/generator.js.map +1 -1
- package/dist/goal-workflows/codex-goal-snapshot.d.ts +1 -0
- package/dist/goal-workflows/codex-goal-snapshot.d.ts.map +1 -1
- package/dist/goal-workflows/codex-goal-snapshot.js +5 -1
- package/dist/goal-workflows/codex-goal-snapshot.js.map +1 -1
- package/dist/hooks/__tests__/autopilot-skill-contract.test.js +10 -6
- package/dist/hooks/__tests__/autopilot-skill-contract.test.js.map +1 -1
- package/dist/hooks/__tests__/best-practice-research-skill.test.d.ts +2 -0
- package/dist/hooks/__tests__/best-practice-research-skill.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/best-practice-research-skill.test.js +27 -0
- package/dist/hooks/__tests__/best-practice-research-skill.test.js.map +1 -0
- package/dist/hooks/__tests__/consensus-execution-handoff.test.d.ts +1 -1
- package/dist/hooks/__tests__/consensus-execution-handoff.test.js +13 -11
- package/dist/hooks/__tests__/consensus-execution-handoff.test.js.map +1 -1
- package/dist/hooks/__tests__/deep-interview-contract.test.js +4 -3
- package/dist/hooks/__tests__/deep-interview-contract.test.js.map +1 -1
- package/dist/hooks/__tests__/keyword-detector.test.js +15 -3
- package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +6 -0
- 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 +33 -0
- package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js.map +1 -1
- package/dist/hooks/__tests__/prompt-guidance-wave-two.test.js +4 -0
- package/dist/hooks/__tests__/prompt-guidance-wave-two.test.js.map +1 -1
- package/dist/hooks/extensibility/__tests__/dispatcher.test.js +26 -3
- package/dist/hooks/extensibility/__tests__/dispatcher.test.js.map +1 -1
- package/dist/hooks/extensibility/dispatcher.d.ts.map +1 -1
- package/dist/hooks/extensibility/dispatcher.js +29 -14
- package/dist/hooks/extensibility/dispatcher.js.map +1 -1
- package/dist/hooks/keyword-detector.d.ts.map +1 -1
- package/dist/hooks/keyword-detector.js +8 -3
- package/dist/hooks/keyword-detector.js.map +1 -1
- package/dist/hooks/keyword-registry.d.ts.map +1 -1
- package/dist/hooks/keyword-registry.js +1 -0
- package/dist/hooks/keyword-registry.js.map +1 -1
- package/dist/hooks/prompt-guidance-contract.d.ts.map +1 -1
- package/dist/hooks/prompt-guidance-contract.js +3 -2
- package/dist/hooks/prompt-guidance-contract.js.map +1 -1
- package/dist/hud/__tests__/hud-tmux-injection.test.js +14 -8
- package/dist/hud/__tests__/hud-tmux-injection.test.js.map +1 -1
- package/dist/hud/__tests__/reconcile.test.js +4 -4
- package/dist/hud/__tests__/reconcile.test.js.map +1 -1
- package/dist/hud/__tests__/resource-leak-watch.test.d.ts +2 -0
- package/dist/hud/__tests__/resource-leak-watch.test.d.ts.map +1 -0
- package/dist/hud/__tests__/resource-leak-watch.test.js +28 -0
- package/dist/hud/__tests__/resource-leak-watch.test.js.map +1 -0
- package/dist/hud/__tests__/tmux.test.js +23 -18
- package/dist/hud/__tests__/tmux.test.js.map +1 -1
- package/dist/hud/index.d.ts +1 -1
- package/dist/hud/index.d.ts.map +1 -1
- package/dist/hud/index.js +10 -4
- package/dist/hud/index.js.map +1 -1
- package/dist/hud/tmux.d.ts.map +1 -1
- package/dist/hud/tmux.js +9 -8
- package/dist/hud/tmux.js.map +1 -1
- package/dist/mcp/__tests__/bootstrap.test.js +75 -1
- package/dist/mcp/__tests__/bootstrap.test.js.map +1 -1
- package/dist/mcp/bootstrap.d.ts +3 -1
- package/dist/mcp/bootstrap.d.ts.map +1 -1
- package/dist/mcp/bootstrap.js +71 -2
- package/dist/mcp/bootstrap.js.map +1 -1
- package/dist/notifications/__tests__/http-client-resource.test.d.ts +2 -0
- package/dist/notifications/__tests__/http-client-resource.test.d.ts.map +1 -0
- package/dist/notifications/__tests__/http-client-resource.test.js +41 -0
- package/dist/notifications/__tests__/http-client-resource.test.js.map +1 -0
- package/dist/notifications/__tests__/verbosity.test.js +20 -0
- package/dist/notifications/__tests__/verbosity.test.js.map +1 -1
- package/dist/notifications/config.d.ts.map +1 -1
- package/dist/notifications/config.js +6 -3
- package/dist/notifications/config.js.map +1 -1
- package/dist/notifications/http-client.d.ts.map +1 -1
- package/dist/notifications/http-client.js +78 -27
- package/dist/notifications/http-client.js.map +1 -1
- package/dist/notifications/types.d.ts +2 -0
- package/dist/notifications/types.d.ts.map +1 -1
- package/dist/openclaw/__tests__/dispatcher.test.js +49 -1
- package/dist/openclaw/__tests__/dispatcher.test.js.map +1 -1
- package/dist/openclaw/dispatcher.d.ts +7 -4
- package/dist/openclaw/dispatcher.d.ts.map +1 -1
- package/dist/openclaw/dispatcher.js +32 -69
- package/dist/openclaw/dispatcher.js.map +1 -1
- package/dist/pipeline/__tests__/orchestrator.test.js +65 -3
- package/dist/pipeline/__tests__/orchestrator.test.js.map +1 -1
- package/dist/pipeline/__tests__/stages.test.js +50 -5
- package/dist/pipeline/__tests__/stages.test.js.map +1 -1
- package/dist/pipeline/index.d.ts +8 -2
- package/dist/pipeline/index.d.ts.map +1 -1
- package/dist/pipeline/index.js +5 -2
- package/dist/pipeline/index.js.map +1 -1
- package/dist/pipeline/orchestrator.d.ts +5 -4
- package/dist/pipeline/orchestrator.d.ts.map +1 -1
- package/dist/pipeline/orchestrator.js +56 -15
- package/dist/pipeline/orchestrator.js.map +1 -1
- package/dist/pipeline/stages/code-review.d.ts +2 -2
- package/dist/pipeline/stages/code-review.d.ts.map +1 -1
- package/dist/pipeline/stages/code-review.js +5 -3
- package/dist/pipeline/stages/code-review.js.map +1 -1
- package/dist/pipeline/stages/deep-interview.d.ts +15 -0
- package/dist/pipeline/stages/deep-interview.d.ts.map +1 -0
- package/dist/pipeline/stages/deep-interview.js +32 -0
- package/dist/pipeline/stages/deep-interview.js.map +1 -0
- package/dist/pipeline/stages/ralph-verify.d.ts +5 -5
- package/dist/pipeline/stages/ralph-verify.d.ts.map +1 -1
- package/dist/pipeline/stages/ralph-verify.js +2 -2
- package/dist/pipeline/stages/ralph-verify.js.map +1 -1
- package/dist/pipeline/stages/ultragoal.d.ts +19 -0
- package/dist/pipeline/stages/ultragoal.d.ts.map +1 -0
- package/dist/pipeline/stages/ultragoal.js +38 -0
- package/dist/pipeline/stages/ultragoal.js.map +1 -0
- package/dist/pipeline/stages/ultraqa.d.ts +30 -0
- package/dist/pipeline/stages/ultraqa.d.ts.map +1 -0
- package/dist/pipeline/stages/ultraqa.js +46 -0
- package/dist/pipeline/stages/ultraqa.js.map +1 -0
- package/dist/pipeline/types.d.ts +8 -6
- package/dist/pipeline/types.d.ts.map +1 -1
- package/dist/pipeline/types.js +2 -2
- package/dist/scripts/__tests__/codex-native-hook.test.js +1488 -117
- package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
- package/dist/scripts/__tests__/notify-dispatcher.test.js +183 -1
- package/dist/scripts/__tests__/notify-dispatcher.test.js.map +1 -1
- package/dist/scripts/__tests__/smoke-packed-install.test.js +27 -2
- package/dist/scripts/__tests__/smoke-packed-install.test.js.map +1 -1
- package/dist/scripts/__tests__/verify-native-agents.test.js +16 -1
- package/dist/scripts/__tests__/verify-native-agents.test.js.map +1 -1
- package/dist/scripts/build-api.d.ts +2 -0
- package/dist/scripts/build-api.d.ts.map +1 -0
- package/dist/scripts/build-api.js +44 -0
- package/dist/scripts/build-api.js.map +1 -0
- package/dist/scripts/cleanup-explore-harness.js +1 -0
- package/dist/scripts/cleanup-explore-harness.js.map +1 -1
- package/dist/scripts/codex-native-hook.d.ts.map +1 -1
- package/dist/scripts/codex-native-hook.js +364 -16
- package/dist/scripts/codex-native-hook.js.map +1 -1
- package/dist/scripts/codex-native-pre-post.d.ts.map +1 -1
- package/dist/scripts/codex-native-pre-post.js +98 -25
- package/dist/scripts/codex-native-pre-post.js.map +1 -1
- package/dist/scripts/notify-dispatcher.js +88 -0
- package/dist/scripts/notify-dispatcher.js.map +1 -1
- package/dist/scripts/notify-hook/process-runner.d.ts.map +1 -1
- package/dist/scripts/notify-hook/process-runner.js +39 -17
- package/dist/scripts/notify-hook/process-runner.js.map +1 -1
- package/dist/scripts/notify-hook/team-dispatch.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-dispatch.js +36 -14
- 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 +26 -11
- package/dist/scripts/notify-hook/team-leader-nudge.js.map +1 -1
- package/dist/scripts/notify-hook/team-tmux-guard.d.ts +2 -1
- package/dist/scripts/notify-hook/team-tmux-guard.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-tmux-guard.js +45 -1
- 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 +27 -14
- package/dist/scripts/notify-hook/team-worker-stop.js.map +1 -1
- package/dist/scripts/run-provider-advisor.js +9 -3
- package/dist/scripts/run-provider-advisor.js.map +1 -1
- package/dist/scripts/smoke-packed-install.d.ts +4 -1
- package/dist/scripts/smoke-packed-install.d.ts.map +1 -1
- package/dist/scripts/smoke-packed-install.js +101 -1
- package/dist/scripts/smoke-packed-install.js.map +1 -1
- package/dist/scripts/sync-plugin-mirror.js +2 -2
- package/dist/scripts/sync-plugin-mirror.js.map +1 -1
- package/dist/scripts/verify-native-agents.js +2 -2
- package/dist/scripts/verify-native-agents.js.map +1 -1
- package/dist/sidecar/__tests__/resource-leak-watch.test.d.ts +2 -0
- package/dist/sidecar/__tests__/resource-leak-watch.test.d.ts.map +1 -0
- package/dist/sidecar/__tests__/resource-leak-watch.test.js +38 -0
- package/dist/sidecar/__tests__/resource-leak-watch.test.js.map +1 -0
- package/dist/sidecar/index.d.ts +1 -1
- package/dist/sidecar/index.d.ts.map +1 -1
- package/dist/sidecar/index.js +29 -12
- package/dist/sidecar/index.js.map +1 -1
- package/dist/state/__tests__/operations-ralph-phase.test.js +88 -1
- package/dist/state/__tests__/operations-ralph-phase.test.js.map +1 -1
- package/dist/state/operations.d.ts.map +1 -1
- package/dist/state/operations.js +11 -0
- package/dist/state/operations.js.map +1 -1
- package/dist/team/__tests__/runtime.test.js +2 -2
- package/dist/team/__tests__/runtime.test.js.map +1 -1
- package/dist/team/__tests__/tmux-session.test.js +207 -22
- package/dist/team/__tests__/tmux-session.test.js.map +1 -1
- package/dist/team/tmux-session.d.ts +1 -0
- package/dist/team/tmux-session.d.ts.map +1 -1
- package/dist/team/tmux-session.js +73 -28
- package/dist/team/tmux-session.js.map +1 -1
- package/dist/ultragoal/__tests__/artifacts.test.js +714 -10
- package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -1
- package/dist/ultragoal/__tests__/docs-contract.test.js +57 -1
- package/dist/ultragoal/__tests__/docs-contract.test.js.map +1 -1
- package/dist/ultragoal/__tests__/steering-fixtures.d.ts +68 -0
- package/dist/ultragoal/__tests__/steering-fixtures.d.ts.map +1 -0
- package/dist/ultragoal/__tests__/steering-fixtures.js +259 -0
- package/dist/ultragoal/__tests__/steering-fixtures.js.map +1 -0
- package/dist/ultragoal/__tests__/steering-fixtures.test.d.ts +2 -0
- package/dist/ultragoal/__tests__/steering-fixtures.test.d.ts.map +1 -0
- package/dist/ultragoal/__tests__/steering-fixtures.test.js +65 -0
- package/dist/ultragoal/__tests__/steering-fixtures.test.js.map +1 -0
- package/dist/ultragoal/artifacts.d.ts +97 -2
- package/dist/ultragoal/artifacts.d.ts.map +1 -1
- package/dist/ultragoal/artifacts.js +811 -256
- package/dist/ultragoal/artifacts.js.map +1 -1
- package/dist/utils/__tests__/sleep-resource.test.d.ts +2 -0
- package/dist/utils/__tests__/sleep-resource.test.d.ts.map +1 -0
- package/dist/utils/__tests__/sleep-resource.test.js +39 -0
- package/dist/utils/__tests__/sleep-resource.test.js.map +1 -0
- package/dist/utils/sleep.d.ts.map +1 -1
- package/dist/utils/sleep.js +17 -6
- package/dist/utils/sleep.js.map +1 -1
- package/dist/verification/__tests__/ci-rust-gates.test.js +85 -10
- package/dist/verification/__tests__/ci-rust-gates.test.js.map +1 -1
- package/dist/verification/__tests__/explore-harness-release-workflow.test.js +1 -0
- package/dist/verification/__tests__/explore-harness-release-workflow.test.js.map +1 -1
- package/package.json +5 -3
- package/plugins/oh-my-codex/.codex-plugin/plugin.json +4 -3
- package/plugins/oh-my-codex/hooks/codex-native-hook.mjs +56 -0
- package/plugins/oh-my-codex/hooks/hooks.json +77 -0
- package/plugins/oh-my-codex/skills/autopilot/SKILL.md +77 -47
- package/plugins/oh-my-codex/skills/best-practice-research/SKILL.md +83 -0
- package/plugins/oh-my-codex/skills/cancel/SKILL.md +2 -2
- package/plugins/oh-my-codex/skills/deep-interview/SKILL.md +9 -8
- package/plugins/oh-my-codex/skills/omx-setup/SKILL.md +1 -1
- package/plugins/oh-my-codex/skills/pipeline/SKILL.md +22 -11
- package/plugins/oh-my-codex/skills/plan/SKILL.md +8 -8
- package/plugins/oh-my-codex/skills/ralph/SKILL.md +7 -0
- package/plugins/oh-my-codex/skills/ralplan/SKILL.md +5 -5
- package/plugins/oh-my-codex/skills/team/SKILL.md +1 -1
- package/plugins/oh-my-codex/skills/ultragoal/SKILL.md +38 -4
- package/plugins/oh-my-codex/skills/ultrawork/SKILL.md +1 -1
- package/prompts/planner.md +1 -1
- package/prompts/researcher.md +15 -10
- package/skills/autopilot/SKILL.md +77 -47
- package/skills/best-practice-research/SKILL.md +83 -0
- package/skills/cancel/SKILL.md +2 -2
- package/skills/deep-interview/SKILL.md +9 -8
- package/skills/omx-setup/SKILL.md +1 -1
- package/skills/pipeline/SKILL.md +22 -11
- package/skills/plan/SKILL.md +8 -8
- package/skills/ralph/SKILL.md +7 -0
- package/skills/ralplan/SKILL.md +5 -5
- package/skills/team/SKILL.md +1 -1
- package/skills/ultragoal/SKILL.md +38 -4
- package/skills/ultrawork/SKILL.md +1 -1
- package/src/scripts/__tests__/codex-native-hook.test.ts +1758 -166
- package/src/scripts/__tests__/notify-dispatcher.test.ts +223 -1
- package/src/scripts/__tests__/smoke-packed-install.test.ts +39 -2
- package/src/scripts/__tests__/verify-native-agents.test.ts +21 -1
- package/src/scripts/build-api.ts +48 -0
- package/src/scripts/cleanup-explore-harness.ts +1 -0
- package/src/scripts/codex-native-hook.ts +416 -18
- package/src/scripts/codex-native-pre-post.ts +119 -25
- package/src/scripts/notify-dispatcher.ts +97 -0
- package/src/scripts/notify-hook/process-runner.ts +40 -16
- package/src/scripts/notify-hook/team-dispatch.ts +36 -13
- package/src/scripts/notify-hook/team-leader-nudge.ts +25 -11
- package/src/scripts/notify-hook/team-tmux-guard.ts +49 -0
- package/src/scripts/notify-hook/team-worker-stop.ts +24 -13
- package/src/scripts/run-provider-advisor.ts +11 -3
- package/src/scripts/smoke-packed-install.ts +107 -0
- package/src/scripts/sync-plugin-mirror.ts +3 -3
- package/src/scripts/verify-native-agents.ts +2 -2
- package/templates/catalog-manifest.json +7 -0
|
@@ -6,7 +6,7 @@ import { dirname, join } from "node:path";
|
|
|
6
6
|
import { tmpdir } from "node:os";
|
|
7
7
|
import { fileURLToPath } from "node:url";
|
|
8
8
|
import { once } from "node:events";
|
|
9
|
-
import { HELP, normalizeCodexLaunchArgs, buildTmuxShellCommand, buildTmuxPaneCommand, shouldSourceTmuxPaneShellRc, buildWindowsPromptCommand, buildTmuxSessionName, resolveCliInvocation, commandOwnsLocalHelp, resolveCodexLaunchPolicy, resolveEffectiveLeaderLaunchPolicyOverride, resolveEnvLaunchPolicyOverride, resolveLeaderLaunchPolicyOverride, classifyCodexExecFailure, resolveSignalExitCode, parseTmuxPaneSnapshot, findHudWatchPaneIds, buildHudPaneCleanupTargets, readTopLevelTomlString, upsertTopLevelTomlString, collectInheritableTeamWorkerArgs, resolveTeamWorkerLaunchArgsEnv, injectModelInstructionsBypassArgs, resolveWorkerSparkModel, resolveSetupInstallModeArg, resolveSetupMcpModeArg, resolveSetupScopeArg, resolveLaunchConfigRepairOptions, readPersistedSetupPreferences, readPersistedSetupScope, resolveCodexConfigPathForLaunch, resolveCodexHomeForLaunch, resolveProjectLocalCodexHomeForLaunch, shouldAutoIsolateMadmaxLaunch, createMadmaxIsolatedRoot, resolveOmxRootForLaunch, resolveDisposableWorktreeOmxRootForLaunch, prepareCodexHomeForLaunch, runtimeCodexHomePath, buildDetachedSessionBootstrapSteps, buildDetachedTmuxSessionName, buildDetachedSessionFinalizeSteps, buildDetachedSessionRollbackSteps, detectDetachedSessionWindowIndex, resolveNotifyTempContract, buildNotifyTempStartupMessages, buildNotifyFallbackWatcherEnv, shouldEnableNotifyFallbackWatcher, reapStaleNotifyFallbackWatcher, cleanupLaunchOrphanedMcpProcesses, reapPostLaunchOrphanedMcpProcesses, cleanupPostLaunchModeStateFiles, resolveBackgroundHelperLaunchMode, shouldDetachBackgroundHelper, resolveNotifyFallbackWatcherScript, resolveHookDerivedWatcherScript, resolveNotifyHookScript, buildDetachedWindowsBootstrapScript, acquireTmuxExtendedKeysLease, resolveNativeSessionName, releaseTmuxExtendedKeysLease, withTmuxExtendedKeys, CODEX_SQLITE_HOME_ENV, } from "../index.js";
|
|
9
|
+
import { HELP, normalizeCodexLaunchArgs, buildTmuxShellCommand, buildTmuxPaneCommand, shouldSourceTmuxPaneShellRc, buildWindowsPromptCommand, buildTmuxSessionName, resolveCliInvocation, commandOwnsLocalHelp, resolveCodexLaunchPolicy, resolveEffectiveLeaderLaunchPolicyOverride, resolveEnvLaunchPolicyOverride, resolveLeaderLaunchPolicyOverride, classifyCodexExecFailure, resolveSignalExitCode, parseTmuxPaneSnapshot, findHudWatchPaneIds, buildHudPaneCleanupTargets, readTopLevelTomlString, upsertTopLevelTomlString, collectInheritableTeamWorkerArgs, resolveTeamWorkerLaunchArgsEnv, injectModelInstructionsBypassArgs, resolveWorkerSparkModel, resolveSetupInstallModeArg, resolveSetupMcpModeArg, resolveSetupScopeArg, resolveLaunchConfigRepairOptions, readPersistedSetupPreferences, readPersistedSetupScope, resolveCodexConfigPathForLaunch, resolveCodexHomeForLaunch, resolveProjectLocalCodexHomeForLaunch, shouldAutoIsolateMadmaxLaunch, createMadmaxIsolatedRoot, buildMadmaxDetachedLaunchContextKey, resolveOmxRootForLaunch, resolveDisposableWorktreeOmxRootForLaunch, prepareCodexHomeForLaunch, persistProjectLaunchRuntimeAuthState, runtimeCodexHomePath, buildDetachedSessionBootstrapSteps, buildDetachedTmuxSessionName, buildDetachedSessionFinalizeSteps, buildDetachedSessionRollbackSteps, detectDetachedSessionWindowIndex, resolveNotifyTempContract, buildNotifyTempStartupMessages, buildNotifyFallbackWatcherEnv, shouldEnableNotifyFallbackWatcher, reapStaleNotifyFallbackWatcher, cleanupLaunchOrphanedMcpProcesses, reapPostLaunchOrphanedMcpProcesses, cleanupPostLaunchModeStateFiles, resolveBackgroundHelperLaunchMode, shouldDetachBackgroundHelper, resolveNotifyFallbackWatcherScript, resolveHookDerivedWatcherScript, resolveNotifyHookScript, buildDetachedWindowsBootstrapScript, acquireTmuxExtendedKeysLease, resolveNativeSessionName, releaseTmuxExtendedKeysLease, withTmuxExtendedKeys, serializeDetachedSessionParentEnv, CODEX_SQLITE_HOME_ENV, } from "../index.js";
|
|
10
10
|
import { mergeConfig, repairConfigIfNeeded } from "../../config/generator.js";
|
|
11
11
|
import { ensureReusableNodeModules } from "../../utils/repo-deps.js";
|
|
12
12
|
import { readAllState } from "../../hud/state.js";
|
|
@@ -57,6 +57,33 @@ describe("madmax state isolation", () => {
|
|
|
57
57
|
await rm(runs, { recursive: true, force: true });
|
|
58
58
|
}
|
|
59
59
|
});
|
|
60
|
+
it("stamps a stable detached launch context and exposes it to boxed launch", async () => {
|
|
61
|
+
const wd = await mkdtemp(join(tmpdir(), "omx-madmax-source-"));
|
|
62
|
+
const runs = await mkdtemp(join(tmpdir(), "omx-madmax-runs-"));
|
|
63
|
+
try {
|
|
64
|
+
const env = { OMX_RUNS_DIR: runs };
|
|
65
|
+
const runDir = createMadmaxIsolatedRoot(wd, ["--madmax", "--xhigh", "--tmux"], env);
|
|
66
|
+
const metadata = JSON.parse(await readFile(join(runDir, ".omxbox-run.json"), "utf-8"));
|
|
67
|
+
const expectedContext = buildMadmaxDetachedLaunchContextKey(wd, ["--madmax", "--xhigh", "--tmux"]);
|
|
68
|
+
assert.equal(metadata.detached_launch_context, expectedContext);
|
|
69
|
+
assert.equal(env.OMX_MADMAX_DETACHED_CONTEXT, expectedContext);
|
|
70
|
+
assert.equal(expectedContext, buildMadmaxDetachedLaunchContextKey(wd, ["--madmax", "--xhigh"]), "explicit --tmux is a transport choice and must not create a second context");
|
|
71
|
+
assert.equal(expectedContext, buildMadmaxDetachedLaunchContextKey(wd, ["--xhigh", "--madmax", "--direct"]), "argument order and transport choices must not create duplicate detached contexts");
|
|
72
|
+
assert.notEqual(expectedContext, buildMadmaxDetachedLaunchContextKey(wd, ["--madmax", "--low"]), "different launch semantics may run concurrently");
|
|
73
|
+
assert.notEqual(buildMadmaxDetachedLaunchContextKey(wd, ["--madmax", "--high", "--xhigh"]), buildMadmaxDetachedLaunchContextKey(wd, ["--madmax", "--xhigh", "--high"]), "last reasoning shorthand wins, so reversed reasoning order is a distinct context");
|
|
74
|
+
const otherWd = await mkdtemp(join(tmpdir(), "omx-madmax-other-source-"));
|
|
75
|
+
try {
|
|
76
|
+
assert.notEqual(expectedContext, buildMadmaxDetachedLaunchContextKey(otherWd, ["--madmax", "--xhigh"]), "different work contexts may run concurrently");
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
await rm(otherWd, { recursive: true, force: true });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
await rm(wd, { recursive: true, force: true });
|
|
84
|
+
await rm(runs, { recursive: true, force: true });
|
|
85
|
+
}
|
|
86
|
+
});
|
|
60
87
|
});
|
|
61
88
|
describe("resolveOmxRootForLaunch", () => {
|
|
62
89
|
it("preserves POSIX absolute OMX_ROOT", () => {
|
|
@@ -682,6 +709,72 @@ describe("cleanupPostLaunchModeStateFiles", () => {
|
|
|
682
709
|
await rm(wd, { recursive: true, force: true });
|
|
683
710
|
}
|
|
684
711
|
});
|
|
712
|
+
it("preserves review-pending Autopilot state across postLaunch compact cleanup", async () => {
|
|
713
|
+
const wd = await mkdtemp(join(tmpdir(), "omx-postlaunch-autopilot-review-pending-"));
|
|
714
|
+
const sessionId = "sess-autopilot-review-pending";
|
|
715
|
+
const stateDir = join(wd, ".omx", "state");
|
|
716
|
+
const sessionStateDir = join(stateDir, "sessions", sessionId);
|
|
717
|
+
try {
|
|
718
|
+
await mkdir(sessionStateDir, { recursive: true });
|
|
719
|
+
await writeFile(join(stateDir, "skill-active-state.json"), JSON.stringify({
|
|
720
|
+
version: 1,
|
|
721
|
+
active: true,
|
|
722
|
+
skill: "autopilot",
|
|
723
|
+
phase: "code-review",
|
|
724
|
+
session_id: sessionId,
|
|
725
|
+
initialized_state_path: `.omx/state/sessions/${sessionId}/autopilot-state.json`,
|
|
726
|
+
active_skills: [
|
|
727
|
+
{ skill: "autopilot", phase: "code-review", active: true, session_id: sessionId },
|
|
728
|
+
],
|
|
729
|
+
}, null, 2), "utf-8");
|
|
730
|
+
await writeFile(join(sessionStateDir, "skill-active-state.json"), JSON.stringify({
|
|
731
|
+
version: 1,
|
|
732
|
+
active: true,
|
|
733
|
+
skill: "autopilot",
|
|
734
|
+
phase: "code-review",
|
|
735
|
+
session_id: sessionId,
|
|
736
|
+
active_skills: [
|
|
737
|
+
{ skill: "autopilot", phase: "code-review", active: true, session_id: sessionId },
|
|
738
|
+
],
|
|
739
|
+
}, null, 2), "utf-8");
|
|
740
|
+
await writeFile(join(sessionStateDir, "autopilot-state.json"), JSON.stringify({
|
|
741
|
+
active: true,
|
|
742
|
+
mode: "autopilot",
|
|
743
|
+
current_phase: "code-review",
|
|
744
|
+
iteration: 1,
|
|
745
|
+
review_cycle: 0,
|
|
746
|
+
state: {
|
|
747
|
+
phase_cycle: ["ralplan", "ralph", "code-review"],
|
|
748
|
+
handoff_artifacts: {
|
|
749
|
+
ralplan: ".omx/plans/prd-issue-2366.md",
|
|
750
|
+
ralph: { verification: ["npm test"], changed_files: ["src/cli/index.ts"] },
|
|
751
|
+
code_review: null,
|
|
752
|
+
},
|
|
753
|
+
review_verdict: null,
|
|
754
|
+
return_to_ralplan_reason: null,
|
|
755
|
+
},
|
|
756
|
+
}, null, 2), "utf-8");
|
|
757
|
+
await cleanupPostLaunchModeStateFiles(wd, sessionId, {
|
|
758
|
+
now: () => new Date("2026-05-16T11:00:00.000Z"),
|
|
759
|
+
});
|
|
760
|
+
const autopilotState = JSON.parse(await readFile(join(sessionStateDir, "autopilot-state.json"), "utf-8"));
|
|
761
|
+
assert.equal(autopilotState.active, true);
|
|
762
|
+
assert.equal(autopilotState.current_phase, "code-review");
|
|
763
|
+
assert.equal(autopilotState.completed_at, undefined);
|
|
764
|
+
assert.equal(autopilotState.state?.review_verdict, null);
|
|
765
|
+
const sessionSkill = JSON.parse(await readFile(join(sessionStateDir, "skill-active-state.json"), "utf-8"));
|
|
766
|
+
assert.equal(sessionSkill.active, true);
|
|
767
|
+
assert.equal(sessionSkill.skill, "autopilot");
|
|
768
|
+
assert.equal(sessionSkill.phase, "code-review");
|
|
769
|
+
const rootSkill = JSON.parse(await readFile(join(stateDir, "skill-active-state.json"), "utf-8"));
|
|
770
|
+
assert.equal(rootSkill.active, true);
|
|
771
|
+
assert.equal(rootSkill.skill, "autopilot");
|
|
772
|
+
assert.equal(rootSkill.phase, "code-review");
|
|
773
|
+
}
|
|
774
|
+
finally {
|
|
775
|
+
await rm(wd, { recursive: true, force: true });
|
|
776
|
+
}
|
|
777
|
+
});
|
|
685
778
|
it("clears canonical skill-active entries during cleanup and hides them from HUD/overlay readers", async () => {
|
|
686
779
|
const wd = await mkdtemp(join(tmpdir(), "omx-postlaunch-skill-active-cleanup-"));
|
|
687
780
|
const sessionId = "sess-skill-active-cleanup";
|
|
@@ -888,6 +981,7 @@ describe("commandOwnsLocalHelp", () => {
|
|
|
888
981
|
for (const command of [
|
|
889
982
|
"adapt",
|
|
890
983
|
"agents-init",
|
|
984
|
+
"api",
|
|
891
985
|
"ask",
|
|
892
986
|
"question",
|
|
893
987
|
"autoresearch",
|
|
@@ -911,6 +1005,12 @@ describe("commandOwnsLocalHelp", () => {
|
|
|
911
1005
|
});
|
|
912
1006
|
});
|
|
913
1007
|
describe("resolveCliInvocation", () => {
|
|
1008
|
+
it("resolves api to api command", () => {
|
|
1009
|
+
assert.deepEqual(resolveCliInvocation(["api", "status"]), {
|
|
1010
|
+
command: "api",
|
|
1011
|
+
launchArgs: [],
|
|
1012
|
+
});
|
|
1013
|
+
});
|
|
914
1014
|
it("resolves explore to explore command", () => {
|
|
915
1015
|
assert.deepEqual(resolveCliInvocation(["explore", "--prompt", "find", "auth"]), {
|
|
916
1016
|
command: "explore",
|
|
@@ -1274,6 +1374,27 @@ describe("project launch scope helpers", () => {
|
|
|
1274
1374
|
await rm(wd, { recursive: true, force: true });
|
|
1275
1375
|
}
|
|
1276
1376
|
});
|
|
1377
|
+
it("persists project-scope Codex auth written into the runtime CODEX_HOME mirror", async () => {
|
|
1378
|
+
const wd = await mkdtemp(join(tmpdir(), "omx-launch-runtime-auth-home-"));
|
|
1379
|
+
try {
|
|
1380
|
+
const projectCodexHome = join(wd, ".codex");
|
|
1381
|
+
await mkdir(join(wd, ".omx"), { recursive: true });
|
|
1382
|
+
await mkdir(projectCodexHome, { recursive: true });
|
|
1383
|
+
await writeFile(join(wd, ".omx", "setup-scope.json"), JSON.stringify({ scope: "project" }));
|
|
1384
|
+
await writeFile(join(projectCodexHome, "config.toml"), 'model = "gpt-5.5"\n');
|
|
1385
|
+
const prepared = await prepareCodexHomeForLaunch(wd, "session-auth", {});
|
|
1386
|
+
const runtimeCodexHome = runtimeCodexHomePath(wd, "session-auth");
|
|
1387
|
+
const opaqueAuthState = JSON.stringify({ token: "opaque-test-token" });
|
|
1388
|
+
await writeFile(join(runtimeCodexHome, "auth.json"), opaqueAuthState);
|
|
1389
|
+
await writeFile(join(runtimeCodexHome, "config.toml"), 'model = "gpt-5.5"\n[tui.model_availability_nux]\n"gpt-5.5" = 1\n');
|
|
1390
|
+
await persistProjectLaunchRuntimeAuthState(prepared.runtimeCodexHomeForCleanup, prepared.projectLocalCodexHomeForCleanup);
|
|
1391
|
+
assert.equal(await readFile(join(projectCodexHome, "auth.json"), "utf-8"), opaqueAuthState);
|
|
1392
|
+
assert.equal(await readFile(join(projectCodexHome, "config.toml"), "utf-8"), 'model = "gpt-5.5"\n');
|
|
1393
|
+
}
|
|
1394
|
+
finally {
|
|
1395
|
+
await rm(wd, { recursive: true, force: true });
|
|
1396
|
+
}
|
|
1397
|
+
});
|
|
1277
1398
|
it("rewrites setup-owned hook trust state for the runtime CODEX_HOME mirror", async () => {
|
|
1278
1399
|
const wd = await mkdtemp(join(tmpdir(), "omx-launch-runtime-hook-trust-"));
|
|
1279
1400
|
try {
|
|
@@ -1650,10 +1771,40 @@ describe("detached tmux new-session sequencing", () => {
|
|
|
1650
1771
|
assert.equal(newSession.args.some((arg) => arg === "OMXBOX_ACTIVE=1"), true);
|
|
1651
1772
|
assert.equal(newSession.args.some((arg) => arg === "OMX_SOURCE_CWD=/tmp/source-project"), true);
|
|
1652
1773
|
});
|
|
1774
|
+
it("serializes custom parent env for the interactive detached tmux leader without logging values in tmux args", () => {
|
|
1775
|
+
const envFilePath = "/tmp/omx-runtime/tmux-env/sess.env";
|
|
1776
|
+
const steps = buildDetachedSessionBootstrapSteps("omx-demo", "/tmp/project", "'codex' '--model' 'gpt-5'", "'node' '/tmp/omx.js' 'hud' '--watch'", null, undefined, null, false, "sess-detached-managed", undefined, undefined, undefined, { CUSTOM_LLM_API_KEY: "fake-provider-key", IS_GAJAE_SLOP_GENERATOR: "1" }, undefined, envFilePath);
|
|
1777
|
+
const newSession = steps.find((step) => step.name === "new-session");
|
|
1778
|
+
assert.ok(newSession);
|
|
1779
|
+
const argsText = newSession.args.join("\n");
|
|
1780
|
+
assert.match(argsText, new RegExp(envFilePath.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")));
|
|
1781
|
+
assert.doesNotMatch(argsText, /fake-provider-key/);
|
|
1782
|
+
assert.doesNotMatch(argsText, /CUSTOM_LLM_API_KEY=/);
|
|
1783
|
+
const envScript = serializeDetachedSessionParentEnv({
|
|
1784
|
+
CUSTOM_LLM_API_KEY: "fake-provider-key",
|
|
1785
|
+
IS_GAJAE_SLOP_GENERATOR: "1",
|
|
1786
|
+
"not-a-shell-name": "ignored",
|
|
1787
|
+
});
|
|
1788
|
+
assert.match(envScript, /export CUSTOM_LLM_API_KEY='fake-provider-key'/);
|
|
1789
|
+
assert.match(envScript, /export IS_GAJAE_SLOP_GENERATOR='1'/);
|
|
1790
|
+
assert.doesNotMatch(envScript, /not-a-shell-name/);
|
|
1791
|
+
});
|
|
1792
|
+
it("keeps detached tmux bootstrap bounded when no interactive parent env file is requested", () => {
|
|
1793
|
+
const steps = buildDetachedSessionBootstrapSteps("omx-demo", "/tmp/project", "'codex' '--model' 'gpt-5'", "'node' '/tmp/omx.js' 'hud' '--watch'", null, undefined, null, false, "sess-detached-managed", undefined, undefined, undefined, { CUSTOM_LLM_API_KEY: "fake-provider-key" });
|
|
1794
|
+
const newSession = steps.find((step) => step.name === "new-session");
|
|
1795
|
+
assert.ok(newSession);
|
|
1796
|
+
const argsText = newSession.args.join("\n");
|
|
1797
|
+
assert.doesNotMatch(argsText, /CUSTOM_LLM_API_KEY/);
|
|
1798
|
+
assert.doesNotMatch(argsText, /fake-provider-key/);
|
|
1799
|
+
});
|
|
1653
1800
|
it("runCodex builds inside-tmux HUD command with OMX_SESSION_ID", async () => {
|
|
1654
1801
|
const source = await readFile(join(repoRoot, 'src', 'cli', 'index.ts'), 'utf-8');
|
|
1655
1802
|
assert.match(source, /buildTmuxPaneCommand\("env",\s*\[\s*`OMX_SESSION_ID=\$\{sessionId\}`,\s*`\$\{OMX_TMUX_HUD_OWNER_ENV\}=1`,\s*"node",\s*omxBin,\s*"hud",\s*"--watch",?\s*\]\)/);
|
|
1656
1803
|
});
|
|
1804
|
+
it("runCodex registers a HUD resize hook immediately for inside-tmux launches", async () => {
|
|
1805
|
+
const source = await readFile(join(repoRoot, 'src', 'cli', 'index.ts'), 'utf-8');
|
|
1806
|
+
assert.match(source, /registerHudResizeHook\(hudPaneId,\s*currentPaneId,\s*HUD_TMUX_HEIGHT_LINES\)/);
|
|
1807
|
+
});
|
|
1657
1808
|
it("buildDetachedSessionBootstrapSteps starts native Windows detached sessions with powershell", () => {
|
|
1658
1809
|
const hudCmd = buildWindowsPromptCommand("node", [
|
|
1659
1810
|
"omx.js",
|
|
@@ -2226,7 +2377,7 @@ exit 0
|
|
|
2226
2377
|
it("reapStaleNotifyFallbackWatcher sends SIGTERM only after confirming watcher identity", async () => {
|
|
2227
2378
|
const cwd = await mkdtemp(join(tmpdir(), "omx-reap-pid-confirmed-"));
|
|
2228
2379
|
const pidPath = join(cwd, "watcher.pid");
|
|
2229
|
-
await writeFile(pidPath, JSON.stringify({ pid: 12345, started_at:
|
|
2380
|
+
await writeFile(pidPath, JSON.stringify({ pid: 12345, started_at: "2026-04-05T00:00:00.000Z" }));
|
|
2230
2381
|
const killed = [];
|
|
2231
2382
|
await reapStaleNotifyFallbackWatcher(pidPath, {
|
|
2232
2383
|
isWatcherProcess: () => true,
|
|
@@ -2235,6 +2386,21 @@ exit 0
|
|
|
2235
2386
|
assert.deepEqual(killed, [12345], "should SIGTERM the verified watcher process");
|
|
2236
2387
|
await rm(cwd, { recursive: true, force: true });
|
|
2237
2388
|
});
|
|
2389
|
+
it("reapStaleNotifyFallbackWatcher skips recently started watcher records to avoid respawn loops", async () => {
|
|
2390
|
+
const cwd = await mkdtemp(join(tmpdir(), "omx-reap-pid-recent-"));
|
|
2391
|
+
const pidPath = join(cwd, "watcher.pid");
|
|
2392
|
+
await writeFile(pidPath, JSON.stringify({ pid: 24680, started_at: "2026-05-15T00:00:00.000Z" }));
|
|
2393
|
+
const killed = [];
|
|
2394
|
+
const result = await reapStaleNotifyFallbackWatcher(pidPath, {
|
|
2395
|
+
isWatcherProcess: () => true,
|
|
2396
|
+
nowMs: () => Date.parse("2026-05-15T00:00:03.000Z"),
|
|
2397
|
+
reapGraceMs: 5000,
|
|
2398
|
+
tryKillPid: (pid) => { killed.push(pid); return true; },
|
|
2399
|
+
});
|
|
2400
|
+
assert.equal(result, "recent_active");
|
|
2401
|
+
assert.equal(killed.length, 0, "should not kill a watcher still inside the startup grace window");
|
|
2402
|
+
await rm(cwd, { recursive: true, force: true });
|
|
2403
|
+
});
|
|
2238
2404
|
it("reuses legacy plain-text PID parsing without widening stale reap semantics across PID reuse", async () => {
|
|
2239
2405
|
const cwd = await mkdtemp(join(tmpdir(), "omx-reap-legacy-pid-"));
|
|
2240
2406
|
try {
|
|
@@ -2460,8 +2626,8 @@ exit 0
|
|
|
2460
2626
|
const registerHook = steps.find((step) => step.name === "register-resize-hook");
|
|
2461
2627
|
const schedule = steps.find((step) => step.name === "schedule-delayed-resize");
|
|
2462
2628
|
const reconcile = steps.find((step) => step.name === "reconcile-hud-resize");
|
|
2463
|
-
assert.match(registerHook?.args[
|
|
2464
|
-
assert.match(registerHook?.args[
|
|
2629
|
+
assert.match(registerHook?.args[5] ?? "", />\/dev\/null 2>&1 \|\| true/);
|
|
2630
|
+
assert.match(registerHook?.args[5] ?? "", new RegExp(`-y ${HUD_TMUX_HEIGHT_LINES}\\b`));
|
|
2465
2631
|
assert.match(schedule?.args[2] ?? "", />\/dev\/null 2>&1 \|\| true/);
|
|
2466
2632
|
assert.match(schedule?.args[2] ?? "", new RegExp(`-y ${HUD_TMUX_HEIGHT_LINES}\\b`));
|
|
2467
2633
|
assert.match((reconcile?.args ?? []).join(" "), />\/dev\/null 2>&1 \|\| true/);
|
|
@@ -2495,7 +2661,7 @@ exit 0
|
|
|
2495
2661
|
assert.equal(steps[0]?.args[2], "-t");
|
|
2496
2662
|
assert.equal(steps[0]?.args[3], "omx-demo:0");
|
|
2497
2663
|
assert.match(steps[0]?.args[4] ?? "", /^client-attached\[\d+\]$/);
|
|
2498
|
-
assert.match(steps[1]?.args[
|
|
2664
|
+
assert.match(steps[1]?.args[5] ?? "", /^window-resized\[\d+\]$/);
|
|
2499
2665
|
assert.deepEqual(steps[2]?.args, ["kill-session", "-t", "omx-demo"]);
|
|
2500
2666
|
});
|
|
2501
2667
|
it("buildDetachedSessionRollbackSteps only kills session when no hook metadata exists", () => {
|