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.
Files changed (381) hide show
  1. package/Cargo.lock +13 -5
  2. package/Cargo.toml +2 -1
  3. package/README.md +44 -19
  4. package/crates/omx-api/Cargo.toml +19 -0
  5. package/crates/omx-api/src/lib.rs +2997 -0
  6. package/crates/omx-api/src/main.rs +10 -0
  7. package/crates/omx-api/tests/cli.rs +558 -0
  8. package/crates/omx-explore/src/main.rs +4 -0
  9. package/crates/omx-sparkshell/src/codex_bridge.rs +437 -123
  10. package/crates/omx-sparkshell/src/exec.rs +127 -1
  11. package/crates/omx-sparkshell/src/main.rs +829 -30
  12. package/crates/omx-sparkshell/src/prompt.rs +25 -3
  13. package/crates/omx-sparkshell/src/redaction.rs +241 -0
  14. package/crates/omx-sparkshell/tests/execution.rs +702 -237
  15. package/dist/cli/__tests__/api.test.d.ts +2 -0
  16. package/dist/cli/__tests__/api.test.d.ts.map +1 -0
  17. package/dist/cli/__tests__/api.test.js +175 -0
  18. package/dist/cli/__tests__/api.test.js.map +1 -0
  19. package/dist/cli/__tests__/ask.test.js +72 -5
  20. package/dist/cli/__tests__/ask.test.js.map +1 -1
  21. package/dist/cli/__tests__/autoresearch-goal.test.js +14 -1
  22. package/dist/cli/__tests__/autoresearch-goal.test.js.map +1 -1
  23. package/dist/cli/__tests__/codex-plugin-layout.test.js +15 -7
  24. package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -1
  25. package/dist/cli/__tests__/doctor-warning-copy.test.js +76 -3
  26. package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
  27. package/dist/cli/__tests__/explore.test.js +23 -0
  28. package/dist/cli/__tests__/explore.test.js.map +1 -1
  29. package/dist/cli/__tests__/index.test.js +171 -5
  30. package/dist/cli/__tests__/index.test.js.map +1 -1
  31. package/dist/cli/__tests__/install-docs-contract.test.d.ts +2 -0
  32. package/dist/cli/__tests__/install-docs-contract.test.d.ts.map +1 -0
  33. package/dist/cli/__tests__/install-docs-contract.test.js +55 -0
  34. package/dist/cli/__tests__/install-docs-contract.test.js.map +1 -0
  35. package/dist/cli/__tests__/launch-fallback.test.js +191 -0
  36. package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
  37. package/dist/cli/__tests__/package-bin-contract.test.js +4 -3
  38. package/dist/cli/__tests__/package-bin-contract.test.js.map +1 -1
  39. package/dist/cli/__tests__/question.test.js +27 -41
  40. package/dist/cli/__tests__/question.test.js.map +1 -1
  41. package/dist/cli/__tests__/setup-install-mode.test.js +232 -35
  42. package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
  43. package/dist/cli/__tests__/sparkshell-cli.test.js +25 -1
  44. package/dist/cli/__tests__/sparkshell-cli.test.js.map +1 -1
  45. package/dist/cli/__tests__/sparkshell-packaging.test.js +1 -0
  46. package/dist/cli/__tests__/sparkshell-packaging.test.js.map +1 -1
  47. package/dist/cli/__tests__/ultragoal.test.js +227 -4
  48. package/dist/cli/__tests__/ultragoal.test.js.map +1 -1
  49. package/dist/cli/__tests__/update.test.js +72 -1
  50. package/dist/cli/__tests__/update.test.js.map +1 -1
  51. package/dist/cli/__tests__/version-sync-contract.test.js +4 -0
  52. package/dist/cli/__tests__/version-sync-contract.test.js.map +1 -1
  53. package/dist/cli/__tests__/windows-popup-loop-contract.test.js +1 -1
  54. package/dist/cli/__tests__/windows-popup-loop-contract.test.js.map +1 -1
  55. package/dist/cli/api.d.ts +26 -0
  56. package/dist/cli/api.d.ts.map +1 -0
  57. package/dist/cli/api.js +153 -0
  58. package/dist/cli/api.js.map +1 -0
  59. package/dist/cli/codex-feature-probe.d.ts +5 -0
  60. package/dist/cli/codex-feature-probe.d.ts.map +1 -1
  61. package/dist/cli/codex-feature-probe.js +13 -7
  62. package/dist/cli/codex-feature-probe.js.map +1 -1
  63. package/dist/cli/doctor.d.ts +7 -0
  64. package/dist/cli/doctor.d.ts.map +1 -1
  65. package/dist/cli/doctor.js +119 -10
  66. package/dist/cli/doctor.js.map +1 -1
  67. package/dist/cli/explore.d.ts +2 -0
  68. package/dist/cli/explore.d.ts.map +1 -1
  69. package/dist/cli/explore.js +43 -1
  70. package/dist/cli/explore.js.map +1 -1
  71. package/dist/cli/index.d.ts +12 -4
  72. package/dist/cli/index.d.ts.map +1 -1
  73. package/dist/cli/index.js +460 -87
  74. package/dist/cli/index.js.map +1 -1
  75. package/dist/cli/native-assets.d.ts +2 -1
  76. package/dist/cli/native-assets.d.ts.map +1 -1
  77. package/dist/cli/native-assets.js +1 -0
  78. package/dist/cli/native-assets.js.map +1 -1
  79. package/dist/cli/plugin-marketplace.d.ts +2 -0
  80. package/dist/cli/plugin-marketplace.d.ts.map +1 -1
  81. package/dist/cli/plugin-marketplace.js +15 -1
  82. package/dist/cli/plugin-marketplace.js.map +1 -1
  83. package/dist/cli/setup.d.ts.map +1 -1
  84. package/dist/cli/setup.js +71 -11
  85. package/dist/cli/setup.js.map +1 -1
  86. package/dist/cli/sparkshell.d.ts +7 -1
  87. package/dist/cli/sparkshell.d.ts.map +1 -1
  88. package/dist/cli/sparkshell.js +31 -4
  89. package/dist/cli/sparkshell.js.map +1 -1
  90. package/dist/cli/ultragoal.d.ts +1 -1
  91. package/dist/cli/ultragoal.d.ts.map +1 -1
  92. package/dist/cli/ultragoal.js +184 -10
  93. package/dist/cli/ultragoal.js.map +1 -1
  94. package/dist/cli/update.d.ts +2 -0
  95. package/dist/cli/update.d.ts.map +1 -1
  96. package/dist/cli/update.js +14 -3
  97. package/dist/cli/update.js.map +1 -1
  98. package/dist/compat/__tests__/doctor-contract.test.js +3 -0
  99. package/dist/compat/__tests__/doctor-contract.test.js.map +1 -1
  100. package/dist/config/__tests__/codex-feature-flags.test.js +11 -1
  101. package/dist/config/__tests__/codex-feature-flags.test.js.map +1 -1
  102. package/dist/config/__tests__/codex-hooks.test.js +19 -8
  103. package/dist/config/__tests__/codex-hooks.test.js.map +1 -1
  104. package/dist/config/__tests__/commit-lore-guard.test.d.ts +2 -0
  105. package/dist/config/__tests__/commit-lore-guard.test.d.ts.map +1 -0
  106. package/dist/config/__tests__/commit-lore-guard.test.js +20 -0
  107. package/dist/config/__tests__/commit-lore-guard.test.js.map +1 -0
  108. package/dist/config/codex-feature-flags.d.ts +4 -0
  109. package/dist/config/codex-feature-flags.d.ts.map +1 -1
  110. package/dist/config/codex-feature-flags.js +4 -0
  111. package/dist/config/codex-feature-flags.js.map +1 -1
  112. package/dist/config/codex-hooks.js +6 -6
  113. package/dist/config/codex-hooks.js.map +1 -1
  114. package/dist/config/commit-lore-guard.d.ts +1 -0
  115. package/dist/config/commit-lore-guard.d.ts.map +1 -1
  116. package/dist/config/commit-lore-guard.js +29 -3
  117. package/dist/config/commit-lore-guard.js.map +1 -1
  118. package/dist/config/generator.d.ts +3 -1
  119. package/dist/config/generator.d.ts.map +1 -1
  120. package/dist/config/generator.js +114 -10
  121. package/dist/config/generator.js.map +1 -1
  122. package/dist/goal-workflows/codex-goal-snapshot.d.ts +1 -0
  123. package/dist/goal-workflows/codex-goal-snapshot.d.ts.map +1 -1
  124. package/dist/goal-workflows/codex-goal-snapshot.js +5 -1
  125. package/dist/goal-workflows/codex-goal-snapshot.js.map +1 -1
  126. package/dist/hooks/__tests__/autopilot-skill-contract.test.js +10 -6
  127. package/dist/hooks/__tests__/autopilot-skill-contract.test.js.map +1 -1
  128. package/dist/hooks/__tests__/best-practice-research-skill.test.d.ts +2 -0
  129. package/dist/hooks/__tests__/best-practice-research-skill.test.d.ts.map +1 -0
  130. package/dist/hooks/__tests__/best-practice-research-skill.test.js +27 -0
  131. package/dist/hooks/__tests__/best-practice-research-skill.test.js.map +1 -0
  132. package/dist/hooks/__tests__/consensus-execution-handoff.test.d.ts +1 -1
  133. package/dist/hooks/__tests__/consensus-execution-handoff.test.js +13 -11
  134. package/dist/hooks/__tests__/consensus-execution-handoff.test.js.map +1 -1
  135. package/dist/hooks/__tests__/deep-interview-contract.test.js +4 -3
  136. package/dist/hooks/__tests__/deep-interview-contract.test.js.map +1 -1
  137. package/dist/hooks/__tests__/keyword-detector.test.js +15 -3
  138. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  139. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +6 -0
  140. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -1
  141. package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js +33 -0
  142. package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js.map +1 -1
  143. package/dist/hooks/__tests__/prompt-guidance-wave-two.test.js +4 -0
  144. package/dist/hooks/__tests__/prompt-guidance-wave-two.test.js.map +1 -1
  145. package/dist/hooks/extensibility/__tests__/dispatcher.test.js +26 -3
  146. package/dist/hooks/extensibility/__tests__/dispatcher.test.js.map +1 -1
  147. package/dist/hooks/extensibility/dispatcher.d.ts.map +1 -1
  148. package/dist/hooks/extensibility/dispatcher.js +29 -14
  149. package/dist/hooks/extensibility/dispatcher.js.map +1 -1
  150. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  151. package/dist/hooks/keyword-detector.js +8 -3
  152. package/dist/hooks/keyword-detector.js.map +1 -1
  153. package/dist/hooks/keyword-registry.d.ts.map +1 -1
  154. package/dist/hooks/keyword-registry.js +1 -0
  155. package/dist/hooks/keyword-registry.js.map +1 -1
  156. package/dist/hooks/prompt-guidance-contract.d.ts.map +1 -1
  157. package/dist/hooks/prompt-guidance-contract.js +3 -2
  158. package/dist/hooks/prompt-guidance-contract.js.map +1 -1
  159. package/dist/hud/__tests__/hud-tmux-injection.test.js +14 -8
  160. package/dist/hud/__tests__/hud-tmux-injection.test.js.map +1 -1
  161. package/dist/hud/__tests__/reconcile.test.js +4 -4
  162. package/dist/hud/__tests__/reconcile.test.js.map +1 -1
  163. package/dist/hud/__tests__/resource-leak-watch.test.d.ts +2 -0
  164. package/dist/hud/__tests__/resource-leak-watch.test.d.ts.map +1 -0
  165. package/dist/hud/__tests__/resource-leak-watch.test.js +28 -0
  166. package/dist/hud/__tests__/resource-leak-watch.test.js.map +1 -0
  167. package/dist/hud/__tests__/tmux.test.js +23 -18
  168. package/dist/hud/__tests__/tmux.test.js.map +1 -1
  169. package/dist/hud/index.d.ts +1 -1
  170. package/dist/hud/index.d.ts.map +1 -1
  171. package/dist/hud/index.js +10 -4
  172. package/dist/hud/index.js.map +1 -1
  173. package/dist/hud/tmux.d.ts.map +1 -1
  174. package/dist/hud/tmux.js +9 -8
  175. package/dist/hud/tmux.js.map +1 -1
  176. package/dist/mcp/__tests__/bootstrap.test.js +75 -1
  177. package/dist/mcp/__tests__/bootstrap.test.js.map +1 -1
  178. package/dist/mcp/bootstrap.d.ts +3 -1
  179. package/dist/mcp/bootstrap.d.ts.map +1 -1
  180. package/dist/mcp/bootstrap.js +71 -2
  181. package/dist/mcp/bootstrap.js.map +1 -1
  182. package/dist/notifications/__tests__/http-client-resource.test.d.ts +2 -0
  183. package/dist/notifications/__tests__/http-client-resource.test.d.ts.map +1 -0
  184. package/dist/notifications/__tests__/http-client-resource.test.js +41 -0
  185. package/dist/notifications/__tests__/http-client-resource.test.js.map +1 -0
  186. package/dist/notifications/__tests__/verbosity.test.js +20 -0
  187. package/dist/notifications/__tests__/verbosity.test.js.map +1 -1
  188. package/dist/notifications/config.d.ts.map +1 -1
  189. package/dist/notifications/config.js +6 -3
  190. package/dist/notifications/config.js.map +1 -1
  191. package/dist/notifications/http-client.d.ts.map +1 -1
  192. package/dist/notifications/http-client.js +78 -27
  193. package/dist/notifications/http-client.js.map +1 -1
  194. package/dist/notifications/types.d.ts +2 -0
  195. package/dist/notifications/types.d.ts.map +1 -1
  196. package/dist/openclaw/__tests__/dispatcher.test.js +49 -1
  197. package/dist/openclaw/__tests__/dispatcher.test.js.map +1 -1
  198. package/dist/openclaw/dispatcher.d.ts +7 -4
  199. package/dist/openclaw/dispatcher.d.ts.map +1 -1
  200. package/dist/openclaw/dispatcher.js +32 -69
  201. package/dist/openclaw/dispatcher.js.map +1 -1
  202. package/dist/pipeline/__tests__/orchestrator.test.js +65 -3
  203. package/dist/pipeline/__tests__/orchestrator.test.js.map +1 -1
  204. package/dist/pipeline/__tests__/stages.test.js +50 -5
  205. package/dist/pipeline/__tests__/stages.test.js.map +1 -1
  206. package/dist/pipeline/index.d.ts +8 -2
  207. package/dist/pipeline/index.d.ts.map +1 -1
  208. package/dist/pipeline/index.js +5 -2
  209. package/dist/pipeline/index.js.map +1 -1
  210. package/dist/pipeline/orchestrator.d.ts +5 -4
  211. package/dist/pipeline/orchestrator.d.ts.map +1 -1
  212. package/dist/pipeline/orchestrator.js +56 -15
  213. package/dist/pipeline/orchestrator.js.map +1 -1
  214. package/dist/pipeline/stages/code-review.d.ts +2 -2
  215. package/dist/pipeline/stages/code-review.d.ts.map +1 -1
  216. package/dist/pipeline/stages/code-review.js +5 -3
  217. package/dist/pipeline/stages/code-review.js.map +1 -1
  218. package/dist/pipeline/stages/deep-interview.d.ts +15 -0
  219. package/dist/pipeline/stages/deep-interview.d.ts.map +1 -0
  220. package/dist/pipeline/stages/deep-interview.js +32 -0
  221. package/dist/pipeline/stages/deep-interview.js.map +1 -0
  222. package/dist/pipeline/stages/ralph-verify.d.ts +5 -5
  223. package/dist/pipeline/stages/ralph-verify.d.ts.map +1 -1
  224. package/dist/pipeline/stages/ralph-verify.js +2 -2
  225. package/dist/pipeline/stages/ralph-verify.js.map +1 -1
  226. package/dist/pipeline/stages/ultragoal.d.ts +19 -0
  227. package/dist/pipeline/stages/ultragoal.d.ts.map +1 -0
  228. package/dist/pipeline/stages/ultragoal.js +38 -0
  229. package/dist/pipeline/stages/ultragoal.js.map +1 -0
  230. package/dist/pipeline/stages/ultraqa.d.ts +30 -0
  231. package/dist/pipeline/stages/ultraqa.d.ts.map +1 -0
  232. package/dist/pipeline/stages/ultraqa.js +46 -0
  233. package/dist/pipeline/stages/ultraqa.js.map +1 -0
  234. package/dist/pipeline/types.d.ts +8 -6
  235. package/dist/pipeline/types.d.ts.map +1 -1
  236. package/dist/pipeline/types.js +2 -2
  237. package/dist/scripts/__tests__/codex-native-hook.test.js +1488 -117
  238. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  239. package/dist/scripts/__tests__/notify-dispatcher.test.js +183 -1
  240. package/dist/scripts/__tests__/notify-dispatcher.test.js.map +1 -1
  241. package/dist/scripts/__tests__/smoke-packed-install.test.js +27 -2
  242. package/dist/scripts/__tests__/smoke-packed-install.test.js.map +1 -1
  243. package/dist/scripts/__tests__/verify-native-agents.test.js +16 -1
  244. package/dist/scripts/__tests__/verify-native-agents.test.js.map +1 -1
  245. package/dist/scripts/build-api.d.ts +2 -0
  246. package/dist/scripts/build-api.d.ts.map +1 -0
  247. package/dist/scripts/build-api.js +44 -0
  248. package/dist/scripts/build-api.js.map +1 -0
  249. package/dist/scripts/cleanup-explore-harness.js +1 -0
  250. package/dist/scripts/cleanup-explore-harness.js.map +1 -1
  251. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  252. package/dist/scripts/codex-native-hook.js +364 -16
  253. package/dist/scripts/codex-native-hook.js.map +1 -1
  254. package/dist/scripts/codex-native-pre-post.d.ts.map +1 -1
  255. package/dist/scripts/codex-native-pre-post.js +98 -25
  256. package/dist/scripts/codex-native-pre-post.js.map +1 -1
  257. package/dist/scripts/notify-dispatcher.js +88 -0
  258. package/dist/scripts/notify-dispatcher.js.map +1 -1
  259. package/dist/scripts/notify-hook/process-runner.d.ts.map +1 -1
  260. package/dist/scripts/notify-hook/process-runner.js +39 -17
  261. package/dist/scripts/notify-hook/process-runner.js.map +1 -1
  262. package/dist/scripts/notify-hook/team-dispatch.d.ts.map +1 -1
  263. package/dist/scripts/notify-hook/team-dispatch.js +36 -14
  264. package/dist/scripts/notify-hook/team-dispatch.js.map +1 -1
  265. package/dist/scripts/notify-hook/team-leader-nudge.d.ts.map +1 -1
  266. package/dist/scripts/notify-hook/team-leader-nudge.js +26 -11
  267. package/dist/scripts/notify-hook/team-leader-nudge.js.map +1 -1
  268. package/dist/scripts/notify-hook/team-tmux-guard.d.ts +2 -1
  269. package/dist/scripts/notify-hook/team-tmux-guard.d.ts.map +1 -1
  270. package/dist/scripts/notify-hook/team-tmux-guard.js +45 -1
  271. package/dist/scripts/notify-hook/team-tmux-guard.js.map +1 -1
  272. package/dist/scripts/notify-hook/team-worker-stop.d.ts.map +1 -1
  273. package/dist/scripts/notify-hook/team-worker-stop.js +27 -14
  274. package/dist/scripts/notify-hook/team-worker-stop.js.map +1 -1
  275. package/dist/scripts/run-provider-advisor.js +9 -3
  276. package/dist/scripts/run-provider-advisor.js.map +1 -1
  277. package/dist/scripts/smoke-packed-install.d.ts +4 -1
  278. package/dist/scripts/smoke-packed-install.d.ts.map +1 -1
  279. package/dist/scripts/smoke-packed-install.js +101 -1
  280. package/dist/scripts/smoke-packed-install.js.map +1 -1
  281. package/dist/scripts/sync-plugin-mirror.js +2 -2
  282. package/dist/scripts/sync-plugin-mirror.js.map +1 -1
  283. package/dist/scripts/verify-native-agents.js +2 -2
  284. package/dist/scripts/verify-native-agents.js.map +1 -1
  285. package/dist/sidecar/__tests__/resource-leak-watch.test.d.ts +2 -0
  286. package/dist/sidecar/__tests__/resource-leak-watch.test.d.ts.map +1 -0
  287. package/dist/sidecar/__tests__/resource-leak-watch.test.js +38 -0
  288. package/dist/sidecar/__tests__/resource-leak-watch.test.js.map +1 -0
  289. package/dist/sidecar/index.d.ts +1 -1
  290. package/dist/sidecar/index.d.ts.map +1 -1
  291. package/dist/sidecar/index.js +29 -12
  292. package/dist/sidecar/index.js.map +1 -1
  293. package/dist/state/__tests__/operations-ralph-phase.test.js +88 -1
  294. package/dist/state/__tests__/operations-ralph-phase.test.js.map +1 -1
  295. package/dist/state/operations.d.ts.map +1 -1
  296. package/dist/state/operations.js +11 -0
  297. package/dist/state/operations.js.map +1 -1
  298. package/dist/team/__tests__/runtime.test.js +2 -2
  299. package/dist/team/__tests__/runtime.test.js.map +1 -1
  300. package/dist/team/__tests__/tmux-session.test.js +207 -22
  301. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  302. package/dist/team/tmux-session.d.ts +1 -0
  303. package/dist/team/tmux-session.d.ts.map +1 -1
  304. package/dist/team/tmux-session.js +73 -28
  305. package/dist/team/tmux-session.js.map +1 -1
  306. package/dist/ultragoal/__tests__/artifacts.test.js +714 -10
  307. package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -1
  308. package/dist/ultragoal/__tests__/docs-contract.test.js +57 -1
  309. package/dist/ultragoal/__tests__/docs-contract.test.js.map +1 -1
  310. package/dist/ultragoal/__tests__/steering-fixtures.d.ts +68 -0
  311. package/dist/ultragoal/__tests__/steering-fixtures.d.ts.map +1 -0
  312. package/dist/ultragoal/__tests__/steering-fixtures.js +259 -0
  313. package/dist/ultragoal/__tests__/steering-fixtures.js.map +1 -0
  314. package/dist/ultragoal/__tests__/steering-fixtures.test.d.ts +2 -0
  315. package/dist/ultragoal/__tests__/steering-fixtures.test.d.ts.map +1 -0
  316. package/dist/ultragoal/__tests__/steering-fixtures.test.js +65 -0
  317. package/dist/ultragoal/__tests__/steering-fixtures.test.js.map +1 -0
  318. package/dist/ultragoal/artifacts.d.ts +97 -2
  319. package/dist/ultragoal/artifacts.d.ts.map +1 -1
  320. package/dist/ultragoal/artifacts.js +811 -256
  321. package/dist/ultragoal/artifacts.js.map +1 -1
  322. package/dist/utils/__tests__/sleep-resource.test.d.ts +2 -0
  323. package/dist/utils/__tests__/sleep-resource.test.d.ts.map +1 -0
  324. package/dist/utils/__tests__/sleep-resource.test.js +39 -0
  325. package/dist/utils/__tests__/sleep-resource.test.js.map +1 -0
  326. package/dist/utils/sleep.d.ts.map +1 -1
  327. package/dist/utils/sleep.js +17 -6
  328. package/dist/utils/sleep.js.map +1 -1
  329. package/dist/verification/__tests__/ci-rust-gates.test.js +85 -10
  330. package/dist/verification/__tests__/ci-rust-gates.test.js.map +1 -1
  331. package/dist/verification/__tests__/explore-harness-release-workflow.test.js +1 -0
  332. package/dist/verification/__tests__/explore-harness-release-workflow.test.js.map +1 -1
  333. package/package.json +5 -3
  334. package/plugins/oh-my-codex/.codex-plugin/plugin.json +4 -3
  335. package/plugins/oh-my-codex/hooks/codex-native-hook.mjs +56 -0
  336. package/plugins/oh-my-codex/hooks/hooks.json +77 -0
  337. package/plugins/oh-my-codex/skills/autopilot/SKILL.md +77 -47
  338. package/plugins/oh-my-codex/skills/best-practice-research/SKILL.md +83 -0
  339. package/plugins/oh-my-codex/skills/cancel/SKILL.md +2 -2
  340. package/plugins/oh-my-codex/skills/deep-interview/SKILL.md +9 -8
  341. package/plugins/oh-my-codex/skills/omx-setup/SKILL.md +1 -1
  342. package/plugins/oh-my-codex/skills/pipeline/SKILL.md +22 -11
  343. package/plugins/oh-my-codex/skills/plan/SKILL.md +8 -8
  344. package/plugins/oh-my-codex/skills/ralph/SKILL.md +7 -0
  345. package/plugins/oh-my-codex/skills/ralplan/SKILL.md +5 -5
  346. package/plugins/oh-my-codex/skills/team/SKILL.md +1 -1
  347. package/plugins/oh-my-codex/skills/ultragoal/SKILL.md +38 -4
  348. package/plugins/oh-my-codex/skills/ultrawork/SKILL.md +1 -1
  349. package/prompts/planner.md +1 -1
  350. package/prompts/researcher.md +15 -10
  351. package/skills/autopilot/SKILL.md +77 -47
  352. package/skills/best-practice-research/SKILL.md +83 -0
  353. package/skills/cancel/SKILL.md +2 -2
  354. package/skills/deep-interview/SKILL.md +9 -8
  355. package/skills/omx-setup/SKILL.md +1 -1
  356. package/skills/pipeline/SKILL.md +22 -11
  357. package/skills/plan/SKILL.md +8 -8
  358. package/skills/ralph/SKILL.md +7 -0
  359. package/skills/ralplan/SKILL.md +5 -5
  360. package/skills/team/SKILL.md +1 -1
  361. package/skills/ultragoal/SKILL.md +38 -4
  362. package/skills/ultrawork/SKILL.md +1 -1
  363. package/src/scripts/__tests__/codex-native-hook.test.ts +1758 -166
  364. package/src/scripts/__tests__/notify-dispatcher.test.ts +223 -1
  365. package/src/scripts/__tests__/smoke-packed-install.test.ts +39 -2
  366. package/src/scripts/__tests__/verify-native-agents.test.ts +21 -1
  367. package/src/scripts/build-api.ts +48 -0
  368. package/src/scripts/cleanup-explore-harness.ts +1 -0
  369. package/src/scripts/codex-native-hook.ts +416 -18
  370. package/src/scripts/codex-native-pre-post.ts +119 -25
  371. package/src/scripts/notify-dispatcher.ts +97 -0
  372. package/src/scripts/notify-hook/process-runner.ts +40 -16
  373. package/src/scripts/notify-hook/team-dispatch.ts +36 -13
  374. package/src/scripts/notify-hook/team-leader-nudge.ts +25 -11
  375. package/src/scripts/notify-hook/team-tmux-guard.ts +49 -0
  376. package/src/scripts/notify-hook/team-worker-stop.ts +24 -13
  377. package/src/scripts/run-provider-advisor.ts +11 -3
  378. package/src/scripts/smoke-packed-install.ts +107 -0
  379. package/src/scripts/sync-plugin-mirror.ts +3 -3
  380. package/src/scripts/verify-native-agents.ts +2 -2
  381. 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: new Date().toISOString() }));
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[4] ?? "", />\/dev\/null 2>&1 \|\| true/);
2464
- assert.match(registerHook?.args[4] ?? "", new RegExp(`-y ${HUD_TMUX_HEIGHT_LINES}\\b`));
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[4] ?? "", /^client-resized\[\d+\]$/);
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", () => {