oh-my-codex 0.18.6 → 0.18.8

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 (444) hide show
  1. package/Cargo.lock +6 -6
  2. package/Cargo.toml +1 -1
  3. package/README.md +59 -10
  4. package/crates/omx-sparkshell/tests/execution.rs +1 -1
  5. package/dist/agents/__tests__/definitions.test.js +11 -0
  6. package/dist/agents/__tests__/definitions.test.js.map +1 -1
  7. package/dist/agents/__tests__/native-config.test.js +56 -6
  8. package/dist/agents/__tests__/native-config.test.js.map +1 -1
  9. package/dist/agents/definitions.d.ts +10 -0
  10. package/dist/agents/definitions.d.ts.map +1 -1
  11. package/dist/agents/definitions.js +5 -1
  12. package/dist/agents/definitions.js.map +1 -1
  13. package/dist/agents/native-config.d.ts +5 -1
  14. package/dist/agents/native-config.d.ts.map +1 -1
  15. package/dist/agents/native-config.js +19 -4
  16. package/dist/agents/native-config.js.map +1 -1
  17. package/dist/autopilot/__tests__/fsm.test.d.ts +2 -0
  18. package/dist/autopilot/__tests__/fsm.test.d.ts.map +1 -0
  19. package/dist/autopilot/__tests__/fsm.test.js +75 -0
  20. package/dist/autopilot/__tests__/fsm.test.js.map +1 -0
  21. package/dist/autopilot/__tests__/ralplan-gate.test.d.ts +2 -0
  22. package/dist/autopilot/__tests__/ralplan-gate.test.d.ts.map +1 -0
  23. package/dist/autopilot/__tests__/ralplan-gate.test.js +79 -0
  24. package/dist/autopilot/__tests__/ralplan-gate.test.js.map +1 -0
  25. package/dist/autopilot/deep-interview-gate.d.ts +18 -0
  26. package/dist/autopilot/deep-interview-gate.d.ts.map +1 -0
  27. package/dist/autopilot/deep-interview-gate.js +256 -0
  28. package/dist/autopilot/deep-interview-gate.js.map +1 -0
  29. package/dist/autopilot/fsm.d.ts +13 -0
  30. package/dist/autopilot/fsm.d.ts.map +1 -0
  31. package/dist/autopilot/fsm.js +70 -0
  32. package/dist/autopilot/fsm.js.map +1 -0
  33. package/dist/autopilot/ralplan-gate.d.ts +17 -0
  34. package/dist/autopilot/ralplan-gate.d.ts.map +1 -0
  35. package/dist/autopilot/ralplan-gate.js +61 -0
  36. package/dist/autopilot/ralplan-gate.js.map +1 -0
  37. package/dist/cli/__tests__/codex-plugin-layout.test.js +512 -1
  38. package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -1
  39. package/dist/cli/__tests__/doctor-warning-copy.test.js +39 -0
  40. package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
  41. package/dist/cli/__tests__/index.test.js +83 -7
  42. package/dist/cli/__tests__/index.test.js.map +1 -1
  43. package/dist/cli/__tests__/launch-fallback.test.js +175 -6
  44. package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
  45. package/dist/cli/__tests__/package-bin-contract.test.js +8 -4
  46. package/dist/cli/__tests__/package-bin-contract.test.js.map +1 -1
  47. package/dist/cli/__tests__/question.test.js +100 -0
  48. package/dist/cli/__tests__/question.test.js.map +1 -1
  49. package/dist/cli/__tests__/ralph-goal-mode-contract.test.js +13 -0
  50. package/dist/cli/__tests__/ralph-goal-mode-contract.test.js.map +1 -1
  51. package/dist/cli/__tests__/ralph.test.js +14 -0
  52. package/dist/cli/__tests__/ralph.test.js.map +1 -1
  53. package/dist/cli/__tests__/setup-install-mode.test.js +89 -0
  54. package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
  55. package/dist/cli/__tests__/setup-refresh.test.js +83 -0
  56. package/dist/cli/__tests__/setup-refresh.test.js.map +1 -1
  57. package/dist/cli/__tests__/state.test.js +21 -0
  58. package/dist/cli/__tests__/state.test.js.map +1 -1
  59. package/dist/cli/__tests__/team.test.js +2 -2
  60. package/dist/cli/__tests__/team.test.js.map +1 -1
  61. package/dist/cli/__tests__/update.test.js +110 -2
  62. package/dist/cli/__tests__/update.test.js.map +1 -1
  63. package/dist/cli/doctor.d.ts.map +1 -1
  64. package/dist/cli/doctor.js +8 -1
  65. package/dist/cli/doctor.js.map +1 -1
  66. package/dist/cli/index.d.ts +14 -3
  67. package/dist/cli/index.d.ts.map +1 -1
  68. package/dist/cli/index.js +298 -50
  69. package/dist/cli/index.js.map +1 -1
  70. package/dist/cli/plugin-marketplace.d.ts +14 -2
  71. package/dist/cli/plugin-marketplace.d.ts.map +1 -1
  72. package/dist/cli/plugin-marketplace.js +62 -15
  73. package/dist/cli/plugin-marketplace.js.map +1 -1
  74. package/dist/cli/question.d.ts.map +1 -1
  75. package/dist/cli/question.js +36 -5
  76. package/dist/cli/question.js.map +1 -1
  77. package/dist/cli/ralph.d.ts.map +1 -1
  78. package/dist/cli/ralph.js +3 -1
  79. package/dist/cli/ralph.js.map +1 -1
  80. package/dist/cli/setup-preferences.d.ts +2 -0
  81. package/dist/cli/setup-preferences.d.ts.map +1 -1
  82. package/dist/cli/setup-preferences.js +4 -0
  83. package/dist/cli/setup-preferences.js.map +1 -1
  84. package/dist/cli/setup.d.ts +3 -0
  85. package/dist/cli/setup.d.ts.map +1 -1
  86. package/dist/cli/setup.js +166 -27
  87. package/dist/cli/setup.js.map +1 -1
  88. package/dist/cli/state.d.ts.map +1 -1
  89. package/dist/cli/state.js +8 -1
  90. package/dist/cli/state.js.map +1 -1
  91. package/dist/cli/tmux-hook.d.ts.map +1 -1
  92. package/dist/cli/tmux-hook.js +16 -0
  93. package/dist/cli/tmux-hook.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 +47 -3
  97. package/dist/cli/update.js.map +1 -1
  98. package/dist/config/__tests__/deep-interview.test.js +7 -6
  99. package/dist/config/__tests__/deep-interview.test.js.map +1 -1
  100. package/dist/config/__tests__/generator-notify.test.js +1 -0
  101. package/dist/config/__tests__/generator-notify.test.js.map +1 -1
  102. package/dist/config/deep-interview.d.ts.map +1 -1
  103. package/dist/config/deep-interview.js +14 -4
  104. package/dist/config/deep-interview.js.map +1 -1
  105. package/dist/config/generator.d.ts +2 -2
  106. package/dist/config/generator.d.ts.map +1 -1
  107. package/dist/config/generator.js +2 -2
  108. package/dist/config/generator.js.map +1 -1
  109. package/dist/config/team-mode.d.ts +12 -0
  110. package/dist/config/team-mode.d.ts.map +1 -0
  111. package/dist/config/team-mode.js +91 -0
  112. package/dist/config/team-mode.js.map +1 -0
  113. package/dist/hooks/__tests__/agents-overlay.test.js +88 -0
  114. package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -1
  115. package/dist/hooks/__tests__/autopilot-skill-contract.test.js +8 -0
  116. package/dist/hooks/__tests__/autopilot-skill-contract.test.js.map +1 -1
  117. package/dist/hooks/__tests__/code-review-skill-contract.test.js +8 -0
  118. package/dist/hooks/__tests__/code-review-skill-contract.test.js.map +1 -1
  119. package/dist/hooks/__tests__/deep-interview-contract.test.js +10 -0
  120. package/dist/hooks/__tests__/deep-interview-contract.test.js.map +1 -1
  121. package/dist/hooks/__tests__/keyword-detector.test.js +1072 -14
  122. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  123. package/dist/hooks/__tests__/notify-fallback-watcher.test.js +64 -1
  124. package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
  125. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +189 -0
  126. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js.map +1 -1
  127. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +35 -2
  128. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -1
  129. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js +3 -3
  130. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js.map +1 -1
  131. package/dist/hooks/__tests__/session.test.js +25 -0
  132. package/dist/hooks/__tests__/session.test.js.map +1 -1
  133. package/dist/hooks/__tests__/skill-guidance-contract.test.js +21 -0
  134. package/dist/hooks/__tests__/skill-guidance-contract.test.js.map +1 -1
  135. package/dist/hooks/agents-overlay.d.ts.map +1 -1
  136. package/dist/hooks/agents-overlay.js +36 -50
  137. package/dist/hooks/agents-overlay.js.map +1 -1
  138. package/dist/hooks/deep-interview-config-instruction.js +1 -1
  139. package/dist/hooks/deep-interview-config-instruction.js.map +1 -1
  140. package/dist/hooks/extensibility/__tests__/plugin-runner.test.js +31 -0
  141. package/dist/hooks/extensibility/__tests__/plugin-runner.test.js.map +1 -1
  142. package/dist/hooks/extensibility/plugin-runner.js +17 -21
  143. package/dist/hooks/extensibility/plugin-runner.js.map +1 -1
  144. package/dist/hooks/keyword-detector.d.ts +1 -0
  145. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  146. package/dist/hooks/keyword-detector.js +428 -32
  147. package/dist/hooks/keyword-detector.js.map +1 -1
  148. package/dist/hooks/keyword-registry.d.ts.map +1 -1
  149. package/dist/hooks/keyword-registry.js +1 -0
  150. package/dist/hooks/keyword-registry.js.map +1 -1
  151. package/dist/hooks/prompt-guidance-contract.d.ts.map +1 -1
  152. package/dist/hooks/prompt-guidance-contract.js +6 -0
  153. package/dist/hooks/prompt-guidance-contract.js.map +1 -1
  154. package/dist/hooks/session.d.ts +3 -0
  155. package/dist/hooks/session.d.ts.map +1 -1
  156. package/dist/hooks/session.js +13 -5
  157. package/dist/hooks/session.js.map +1 -1
  158. package/dist/hud/__tests__/authority.test.js +469 -31
  159. package/dist/hud/__tests__/authority.test.js.map +1 -1
  160. package/dist/hud/__tests__/hud-tmux-injection.test.js +2 -1
  161. package/dist/hud/__tests__/hud-tmux-injection.test.js.map +1 -1
  162. package/dist/hud/__tests__/index.test.js +210 -2
  163. package/dist/hud/__tests__/index.test.js.map +1 -1
  164. package/dist/hud/__tests__/reconcile.test.js +588 -28
  165. package/dist/hud/__tests__/reconcile.test.js.map +1 -1
  166. package/dist/hud/__tests__/render.test.js +61 -0
  167. package/dist/hud/__tests__/render.test.js.map +1 -1
  168. package/dist/hud/__tests__/state.test.js +208 -0
  169. package/dist/hud/__tests__/state.test.js.map +1 -1
  170. package/dist/hud/__tests__/tmux.test.js +314 -22
  171. package/dist/hud/__tests__/tmux.test.js.map +1 -1
  172. package/dist/hud/authority.d.ts +5 -0
  173. package/dist/hud/authority.d.ts.map +1 -1
  174. package/dist/hud/authority.js +337 -30
  175. package/dist/hud/authority.js.map +1 -1
  176. package/dist/hud/index.d.ts +20 -2
  177. package/dist/hud/index.d.ts.map +1 -1
  178. package/dist/hud/index.js +103 -26
  179. package/dist/hud/index.js.map +1 -1
  180. package/dist/hud/reconcile.d.ts +3 -3
  181. package/dist/hud/reconcile.d.ts.map +1 -1
  182. package/dist/hud/reconcile.js +129 -20
  183. package/dist/hud/reconcile.js.map +1 -1
  184. package/dist/hud/render.d.ts.map +1 -1
  185. package/dist/hud/render.js +35 -0
  186. package/dist/hud/render.js.map +1 -1
  187. package/dist/hud/state.d.ts.map +1 -1
  188. package/dist/hud/state.js +64 -50
  189. package/dist/hud/state.js.map +1 -1
  190. package/dist/hud/tmux.d.ts +26 -6
  191. package/dist/hud/tmux.d.ts.map +1 -1
  192. package/dist/hud/tmux.js +173 -38
  193. package/dist/hud/tmux.js.map +1 -1
  194. package/dist/hud/types.d.ts +11 -0
  195. package/dist/hud/types.d.ts.map +1 -1
  196. package/dist/hud/types.js.map +1 -1
  197. package/dist/mcp/__tests__/hermes-bridge.test.js +203 -7
  198. package/dist/mcp/__tests__/hermes-bridge.test.js.map +1 -1
  199. package/dist/mcp/__tests__/state-paths.test.js +71 -1
  200. package/dist/mcp/__tests__/state-paths.test.js.map +1 -1
  201. package/dist/mcp/__tests__/state-server.test.js +13 -1
  202. package/dist/mcp/__tests__/state-server.test.js.map +1 -1
  203. package/dist/mcp/hermes-bridge.d.ts +12 -2
  204. package/dist/mcp/hermes-bridge.d.ts.map +1 -1
  205. package/dist/mcp/hermes-bridge.js +83 -9
  206. package/dist/mcp/hermes-bridge.js.map +1 -1
  207. package/dist/mcp/state-paths.d.ts +32 -0
  208. package/dist/mcp/state-paths.d.ts.map +1 -1
  209. package/dist/mcp/state-paths.js +113 -17
  210. package/dist/mcp/state-paths.js.map +1 -1
  211. package/dist/mcp/state-server.d.ts +4 -4
  212. package/dist/modes/__tests__/base-autoresearch-contract.test.js +7 -1
  213. package/dist/modes/__tests__/base-autoresearch-contract.test.js.map +1 -1
  214. package/dist/pipeline/__tests__/stages.test.js +130 -0
  215. package/dist/pipeline/__tests__/stages.test.js.map +1 -1
  216. package/dist/pipeline/orchestrator.js +1 -1
  217. package/dist/pipeline/orchestrator.js.map +1 -1
  218. package/dist/pipeline/stages/ralplan.d.ts +1 -0
  219. package/dist/pipeline/stages/ralplan.d.ts.map +1 -1
  220. package/dist/pipeline/stages/ralplan.js +14 -5
  221. package/dist/pipeline/stages/ralplan.js.map +1 -1
  222. package/dist/question/__tests__/deep-interview.test.js +160 -2
  223. package/dist/question/__tests__/deep-interview.test.js.map +1 -1
  224. package/dist/question/__tests__/policy.test.js +63 -3
  225. package/dist/question/__tests__/policy.test.js.map +1 -1
  226. package/dist/question/__tests__/renderer.test.js +191 -2
  227. package/dist/question/__tests__/renderer.test.js.map +1 -1
  228. package/dist/question/__tests__/state.test.js +94 -3
  229. package/dist/question/__tests__/state.test.js.map +1 -1
  230. package/dist/question/__tests__/ui.test.js +4 -0
  231. package/dist/question/__tests__/ui.test.js.map +1 -1
  232. package/dist/question/autopilot-wait.d.ts +12 -2
  233. package/dist/question/autopilot-wait.d.ts.map +1 -1
  234. package/dist/question/autopilot-wait.js +158 -47
  235. package/dist/question/autopilot-wait.js.map +1 -1
  236. package/dist/question/deep-interview.d.ts.map +1 -1
  237. package/dist/question/deep-interview.js +22 -6
  238. package/dist/question/deep-interview.js.map +1 -1
  239. package/dist/question/policy.d.ts.map +1 -1
  240. package/dist/question/policy.js +2 -5
  241. package/dist/question/policy.js.map +1 -1
  242. package/dist/question/renderer.d.ts +12 -0
  243. package/dist/question/renderer.d.ts.map +1 -1
  244. package/dist/question/renderer.js +87 -3
  245. package/dist/question/renderer.js.map +1 -1
  246. package/dist/question/state.d.ts +8 -1
  247. package/dist/question/state.d.ts.map +1 -1
  248. package/dist/question/state.js +54 -14
  249. package/dist/question/state.js.map +1 -1
  250. package/dist/question/types.d.ts +1 -1
  251. package/dist/question/types.d.ts.map +1 -1
  252. package/dist/question/ui.d.ts +1 -0
  253. package/dist/question/ui.d.ts.map +1 -1
  254. package/dist/question/ui.js +1 -0
  255. package/dist/question/ui.js.map +1 -1
  256. package/dist/ralplan/__tests__/runtime.test.js +191 -0
  257. package/dist/ralplan/__tests__/runtime.test.js.map +1 -1
  258. package/dist/ralplan/consensus-gate.d.ts +9 -1
  259. package/dist/ralplan/consensus-gate.d.ts.map +1 -1
  260. package/dist/ralplan/consensus-gate.js +84 -2
  261. package/dist/ralplan/consensus-gate.js.map +1 -1
  262. package/dist/ralplan/runtime.d.ts +9 -0
  263. package/dist/ralplan/runtime.d.ts.map +1 -1
  264. package/dist/ralplan/runtime.js +32 -11
  265. package/dist/ralplan/runtime.js.map +1 -1
  266. package/dist/scripts/__tests__/codex-native-hook.test.js +2315 -280
  267. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  268. package/dist/scripts/__tests__/notify-state-io.test.js +72 -1
  269. package/dist/scripts/__tests__/notify-state-io.test.js.map +1 -1
  270. package/dist/scripts/__tests__/notify-tmux-injection.test.d.ts +2 -0
  271. package/dist/scripts/__tests__/notify-tmux-injection.test.d.ts.map +1 -0
  272. package/dist/scripts/__tests__/notify-tmux-injection.test.js +57 -0
  273. package/dist/scripts/__tests__/notify-tmux-injection.test.js.map +1 -0
  274. package/dist/scripts/__tests__/run-test-files.test.js +74 -0
  275. package/dist/scripts/__tests__/run-test-files.test.js.map +1 -1
  276. package/dist/scripts/__tests__/verify-native-agents.test.js +65 -0
  277. package/dist/scripts/__tests__/verify-native-agents.test.js.map +1 -1
  278. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  279. package/dist/scripts/codex-native-hook.js +431 -56
  280. package/dist/scripts/codex-native-hook.js.map +1 -1
  281. package/dist/scripts/codex-native-pre-post.d.ts.map +1 -1
  282. package/dist/scripts/codex-native-pre-post.js +79 -1
  283. package/dist/scripts/codex-native-pre-post.js.map +1 -1
  284. package/dist/scripts/eval/eval-parity-smoke.js +1 -1
  285. package/dist/scripts/eval/eval-parity-smoke.js.map +1 -1
  286. package/dist/scripts/hook-payload-guard.d.ts +9 -0
  287. package/dist/scripts/hook-payload-guard.d.ts.map +1 -0
  288. package/dist/scripts/hook-payload-guard.js +111 -0
  289. package/dist/scripts/hook-payload-guard.js.map +1 -0
  290. package/dist/scripts/notify-fallback-watcher.js +8 -1
  291. package/dist/scripts/notify-fallback-watcher.js.map +1 -1
  292. package/dist/scripts/notify-hook/__tests__/payload-guard.test.d.ts +2 -0
  293. package/dist/scripts/notify-hook/__tests__/payload-guard.test.d.ts.map +1 -0
  294. package/dist/scripts/notify-hook/__tests__/payload-guard.test.js +39 -0
  295. package/dist/scripts/notify-hook/__tests__/payload-guard.test.js.map +1 -0
  296. package/dist/scripts/notify-hook/auto-nudge.d.ts.map +1 -1
  297. package/dist/scripts/notify-hook/auto-nudge.js +3 -1
  298. package/dist/scripts/notify-hook/auto-nudge.js.map +1 -1
  299. package/dist/scripts/notify-hook/ralph-session-resume.d.ts.map +1 -1
  300. package/dist/scripts/notify-hook/ralph-session-resume.js +3 -10
  301. package/dist/scripts/notify-hook/ralph-session-resume.js.map +1 -1
  302. package/dist/scripts/notify-hook/state-io.d.ts.map +1 -1
  303. package/dist/scripts/notify-hook/state-io.js +62 -38
  304. package/dist/scripts/notify-hook/state-io.js.map +1 -1
  305. package/dist/scripts/notify-hook/team-leader-nudge.d.ts.map +1 -1
  306. package/dist/scripts/notify-hook/team-leader-nudge.js +7 -0
  307. package/dist/scripts/notify-hook/team-leader-nudge.js.map +1 -1
  308. package/dist/scripts/notify-hook/team-worker-stop.d.ts.map +1 -1
  309. package/dist/scripts/notify-hook/team-worker-stop.js +234 -86
  310. package/dist/scripts/notify-hook/team-worker-stop.js.map +1 -1
  311. package/dist/scripts/notify-hook/tmux-injection.d.ts +7 -0
  312. package/dist/scripts/notify-hook/tmux-injection.d.ts.map +1 -1
  313. package/dist/scripts/notify-hook/tmux-injection.js +24 -18
  314. package/dist/scripts/notify-hook/tmux-injection.js.map +1 -1
  315. package/dist/scripts/notify-hook.js +86 -13
  316. package/dist/scripts/notify-hook.js.map +1 -1
  317. package/dist/scripts/run-test-files.js +193 -22
  318. package/dist/scripts/run-test-files.js.map +1 -1
  319. package/dist/scripts/sync-plugin-mirror.d.ts.map +1 -1
  320. package/dist/scripts/sync-plugin-mirror.js +61 -3
  321. package/dist/scripts/sync-plugin-mirror.js.map +1 -1
  322. package/dist/scripts/verify-native-agents.d.ts.map +1 -1
  323. package/dist/scripts/verify-native-agents.js +58 -1
  324. package/dist/scripts/verify-native-agents.js.map +1 -1
  325. package/dist/state/__tests__/operations.test.js +1125 -1
  326. package/dist/state/__tests__/operations.test.js.map +1 -1
  327. package/dist/state/__tests__/skill-active.test.js +46 -1
  328. package/dist/state/__tests__/skill-active.test.js.map +1 -1
  329. package/dist/state/__tests__/workflow-transition.test.js +98 -7
  330. package/dist/state/__tests__/workflow-transition.test.js.map +1 -1
  331. package/dist/state/operations.d.ts.map +1 -1
  332. package/dist/state/operations.js +159 -2
  333. package/dist/state/operations.js.map +1 -1
  334. package/dist/state/skill-active.js +6 -8
  335. package/dist/state/skill-active.js.map +1 -1
  336. package/dist/state/workflow-transition-reconcile.d.ts +6 -0
  337. package/dist/state/workflow-transition-reconcile.d.ts.map +1 -1
  338. package/dist/state/workflow-transition-reconcile.js +38 -15
  339. package/dist/state/workflow-transition-reconcile.js.map +1 -1
  340. package/dist/state/workflow-transition.d.ts.map +1 -1
  341. package/dist/state/workflow-transition.js +10 -3
  342. package/dist/state/workflow-transition.js.map +1 -1
  343. package/dist/subagents/__tests__/tracker.test.js +139 -0
  344. package/dist/subagents/__tests__/tracker.test.js.map +1 -1
  345. package/dist/subagents/tracker.d.ts +3 -0
  346. package/dist/subagents/tracker.d.ts.map +1 -1
  347. package/dist/subagents/tracker.js +41 -4
  348. package/dist/subagents/tracker.js.map +1 -1
  349. package/dist/team/__tests__/coordination-protocol.test.d.ts +2 -0
  350. package/dist/team/__tests__/coordination-protocol.test.d.ts.map +1 -0
  351. package/dist/team/__tests__/coordination-protocol.test.js +173 -0
  352. package/dist/team/__tests__/coordination-protocol.test.js.map +1 -0
  353. package/dist/team/__tests__/runtime.test.js +52 -3
  354. package/dist/team/__tests__/runtime.test.js.map +1 -1
  355. package/dist/team/__tests__/scaling.test.js +9 -4
  356. package/dist/team/__tests__/scaling.test.js.map +1 -1
  357. package/dist/team/__tests__/state.test.js +83 -0
  358. package/dist/team/__tests__/state.test.js.map +1 -1
  359. package/dist/team/__tests__/tmux-session.test.js +240 -2
  360. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  361. package/dist/team/__tests__/worker-bootstrap.test.js +84 -0
  362. package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -1
  363. package/dist/team/__tests__/worker-runtime-identity.test.js +4 -2
  364. package/dist/team/__tests__/worker-runtime-identity.test.js.map +1 -1
  365. package/dist/team/coordination-protocol.d.ts +14 -0
  366. package/dist/team/coordination-protocol.d.ts.map +1 -0
  367. package/dist/team/coordination-protocol.js +244 -0
  368. package/dist/team/coordination-protocol.js.map +1 -0
  369. package/dist/team/runtime.d.ts +1 -0
  370. package/dist/team/runtime.d.ts.map +1 -1
  371. package/dist/team/runtime.js +19 -3
  372. package/dist/team/runtime.js.map +1 -1
  373. package/dist/team/scaling.d.ts.map +1 -1
  374. package/dist/team/scaling.js +3 -2
  375. package/dist/team/scaling.js.map +1 -1
  376. package/dist/team/state/tasks.d.ts.map +1 -1
  377. package/dist/team/state/tasks.js +24 -0
  378. package/dist/team/state/tasks.js.map +1 -1
  379. package/dist/team/state/types.d.ts +21 -1
  380. package/dist/team/state/types.d.ts.map +1 -1
  381. package/dist/team/state/types.js.map +1 -1
  382. package/dist/team/state.d.ts +17 -1
  383. package/dist/team/state.d.ts.map +1 -1
  384. package/dist/team/state.js +12 -5
  385. package/dist/team/state.js.map +1 -1
  386. package/dist/team/team-ops.d.ts +1 -1
  387. package/dist/team/team-ops.d.ts.map +1 -1
  388. package/dist/team/team-ops.js.map +1 -1
  389. package/dist/team/tmux-session.d.ts +2 -0
  390. package/dist/team/tmux-session.d.ts.map +1 -1
  391. package/dist/team/tmux-session.js +161 -13
  392. package/dist/team/tmux-session.js.map +1 -1
  393. package/dist/team/worker-bootstrap.d.ts.map +1 -1
  394. package/dist/team/worker-bootstrap.js +63 -0
  395. package/dist/team/worker-bootstrap.js.map +1 -1
  396. package/dist/utils/__tests__/agents-model-table.test.js +4 -2
  397. package/dist/utils/__tests__/agents-model-table.test.js.map +1 -1
  398. package/dist/utils/agents-model-table.d.ts.map +1 -1
  399. package/dist/utils/agents-model-table.js +3 -0
  400. package/dist/utils/agents-model-table.js.map +1 -1
  401. package/dist/verification/__tests__/ci-rust-gates.test.js +81 -1
  402. package/dist/verification/__tests__/ci-rust-gates.test.js.map +1 -1
  403. package/package.json +8 -8
  404. package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
  405. package/plugins/oh-my-codex/hooks/codex-native-hook.mjs +334 -21
  406. package/plugins/oh-my-codex/hooks/hooks.json +1 -2
  407. package/plugins/oh-my-codex/skills/autopilot/SKILL.md +13 -6
  408. package/plugins/oh-my-codex/skills/code-review/SKILL.md +7 -7
  409. package/plugins/oh-my-codex/skills/deep-interview/SKILL.md +9 -4
  410. package/plugins/oh-my-codex/skills/ralph/SKILL.md +22 -22
  411. package/plugins/oh-my-codex/skills/ralplan/SKILL.md +12 -0
  412. package/plugins/oh-my-codex/skills/team/SKILL.md +16 -0
  413. package/plugins/oh-my-codex/skills/ultraqa/SKILL.md +9 -0
  414. package/plugins/oh-my-codex/skills/worker/SKILL.md +14 -0
  415. package/skills/autopilot/SKILL.md +13 -6
  416. package/skills/code-review/SKILL.md +7 -7
  417. package/skills/deep-interview/SKILL.md +9 -4
  418. package/skills/ralph/SKILL.md +22 -22
  419. package/skills/ralplan/SKILL.md +12 -0
  420. package/skills/team/SKILL.md +16 -0
  421. package/skills/ultraqa/SKILL.md +9 -0
  422. package/skills/worker/SKILL.md +14 -0
  423. package/src/scripts/__tests__/codex-native-hook.test.ts +4435 -2083
  424. package/src/scripts/__tests__/notify-state-io.test.ts +95 -0
  425. package/src/scripts/__tests__/notify-tmux-injection.test.ts +82 -0
  426. package/src/scripts/__tests__/run-test-files.test.ts +102 -0
  427. package/src/scripts/__tests__/verify-native-agents.test.ts +75 -0
  428. package/src/scripts/codex-native-hook.ts +536 -51
  429. package/src/scripts/codex-native-pre-post.ts +80 -0
  430. package/src/scripts/demo-team-e2e.sh +10 -7
  431. package/src/scripts/eval/eval-parity-smoke.ts +1 -1
  432. package/src/scripts/hook-payload-guard.ts +113 -0
  433. package/src/scripts/notify-fallback-watcher.ts +8 -1
  434. package/src/scripts/notify-hook/__tests__/payload-guard.test.ts +41 -0
  435. package/src/scripts/notify-hook/auto-nudge.ts +3 -1
  436. package/src/scripts/notify-hook/ralph-session-resume.ts +2 -8
  437. package/src/scripts/notify-hook/state-io.ts +75 -37
  438. package/src/scripts/notify-hook/team-leader-nudge.ts +7 -0
  439. package/src/scripts/notify-hook/team-worker-stop.ts +193 -52
  440. package/src/scripts/notify-hook/tmux-injection.ts +35 -19
  441. package/src/scripts/notify-hook.ts +105 -6
  442. package/src/scripts/run-test-files.ts +192 -22
  443. package/src/scripts/sync-plugin-mirror.ts +98 -9
  444. package/src/scripts/verify-native-agents.ts +65 -1
package/dist/cli/index.js CHANGED
@@ -8,7 +8,7 @@ import { existsSync, mkdirSync, readFileSync, rmSync, statSync, writeFileSync }
8
8
  import { copyFile, cp, lstat, mkdir, readFile, readdir, rm, symlink, writeFile } from "fs/promises";
9
9
  import { constants as osConstants, homedir } from "os";
10
10
  import { createHash } from "crypto";
11
- import { setup, SETUP_MCP_MODES, SETUP_SCOPES, } from "./setup.js";
11
+ import { setup, SETUP_MCP_MODES, SETUP_SCOPES, SETUP_TEAM_MODES, } from "./setup.js";
12
12
  import { uninstall } from "./uninstall.js";
13
13
  import { version } from "./version.js";
14
14
  import { tmuxHookCommand } from "./tmux-hook.js";
@@ -54,8 +54,8 @@ import { codexConfigPath, omxRoot, rememberOmxLaunchContext, resolveOmxEntryPath
54
54
  import { cleanCodexModelAvailabilityNuxIfNeeded, extractSharedMcpRegistryServersFromConfig, repairConfigIfNeeded, repairProjectScopeTrustStateForLaunch, syncProjectScopeTrustStateFromRuntime } from "../config/generator.js";
55
55
  import { OMX_FIRST_PARTY_MCP_SERVER_NAMES } from "../config/omx-first-party-mcp.js";
56
56
  import { HUD_TMUX_HEIGHT_LINES } from "../hud/constants.js";
57
- import { OMX_TMUX_HUD_OWNER_ENV } from "../hud/reconcile.js";
58
- import { createHudWatchPane as createSharedHudWatchPane, killTmuxPane as killSharedTmuxPane, listCurrentWindowHudPaneIds, listCurrentWindowPanes, OMX_TMUX_HUD_LEADER_PANE_ENV, parsePaneIdFromTmuxOutput, reapDeadHudPanes, registerHudResizeHook, } from "../hud/tmux.js";
57
+ import { readUltragoalState } from "../hud/state.js";
58
+ import { createHudWatchPane as createSharedHudWatchPane, killTmuxPane as killSharedTmuxPane, listCurrentWindowHudPaneIds, listCurrentWindowPanes, buildHudRuntimeEnv, parsePaneIdFromTmuxOutput, reapDeadHudPanes, registerHudResizeHook, resizeTmuxPane, } from "../hud/tmux.js";
59
59
  export { parseTmuxPaneSnapshot, isHudWatchPane, findHudWatchPaneIds } from "../hud/tmux.js";
60
60
  rememberOmxLaunchContext();
61
61
  import { classifySpawnError, resolveTmuxBinaryForPlatform, spawnPlatformCommandSync, } from "../utils/platform-command.js";
@@ -177,6 +177,11 @@ Options:
177
177
  Explicit setup MCP mode (default: none; compat enables first-party MCP compatibility and shared registry sync)
178
178
  --no-mcp Alias for --mcp=none
179
179
  --with-mcp Alias for --mcp=compat
180
+ --disable-team
181
+ Disable Team skill/context generation for setup (default remains enabled)
182
+ --enable-team Re-enable Team skill/context generation for setup
183
+ --team-mode <enabled|disabled>
184
+ Explicit Team setup mode
180
185
  --keep-config Skip config.toml cleanup during uninstall
181
186
  --purge Remove .omx/ cache directory during uninstall
182
187
  --verbose Show detailed output
@@ -367,6 +372,45 @@ export function resolveSetupScopeArg(args) {
367
372
  }
368
373
  throw new Error(`Invalid setup scope: ${value}. Expected one of: ${SETUP_SCOPES.join(", ")}`);
369
374
  }
375
+ export function resolveSetupTeamModeArg(args) {
376
+ let value;
377
+ const setValue = (next, source) => {
378
+ if (value && value !== next) {
379
+ throw new Error(`Conflicting setup Team mode flags: ${source} selects ${next}, but another flag already selected ${value}`);
380
+ }
381
+ value = next;
382
+ };
383
+ const parseValue = (next) => {
384
+ if (!SETUP_TEAM_MODES.includes(next)) {
385
+ throw new Error(`Invalid setup Team mode: ${next}. Expected one of: enabled, disabled`);
386
+ }
387
+ return next;
388
+ };
389
+ for (let index = 0; index < args.length; index += 1) {
390
+ const arg = args[index];
391
+ if (arg === "--disable-team" || arg === "--no-team") {
392
+ setValue("disabled", arg);
393
+ continue;
394
+ }
395
+ if (arg === "--enable-team" || arg === "--team") {
396
+ setValue("enabled", arg);
397
+ continue;
398
+ }
399
+ if (arg === "--team-mode") {
400
+ const next = args[index + 1];
401
+ if (!next || next.startsWith("-")) {
402
+ throw new Error(`Missing setup Team mode value after --team-mode. Expected one of: enabled, disabled`);
403
+ }
404
+ setValue(parseValue(next), arg);
405
+ index += 1;
406
+ continue;
407
+ }
408
+ if (arg.startsWith("--team-mode=")) {
409
+ setValue(parseValue(arg.slice("--team-mode=".length)), "--team-mode");
410
+ }
411
+ }
412
+ return value;
413
+ }
370
414
  export function resolveCliInvocation(args) {
371
415
  const firstArg = args[0];
372
416
  if (firstArg === "--help" || firstArg === "-h") {
@@ -597,6 +641,75 @@ function execTmuxFileSync(args, options) {
597
641
  ...(process.platform === "win32" ? { windowsHide: true } : {}),
598
642
  });
599
643
  }
644
+ export const DETACHED_TMUX_HISTORY_LIMIT = 500;
645
+ const TMUX_HOOK_INDEX_MAX = 1_000_000;
646
+ function setDetachedTmuxSessionHistoryLimit(sessionName, leaderPaneId) {
647
+ const boundedHistoryLimit = String(DETACHED_TMUX_HISTORY_LIMIT);
648
+ try {
649
+ execTmuxFileSync(["set-option", "-q", "-t", sessionName, "history-limit", boundedHistoryLimit], { stdio: "ignore" });
650
+ }
651
+ catch (err) {
652
+ logCliOperationFailure(err);
653
+ }
654
+ if (!leaderPaneId)
655
+ return;
656
+ try {
657
+ execTmuxFileSync(["set-option", "-pq", "-t", leaderPaneId, "history-limit", boundedHistoryLimit], { stdio: "ignore" });
658
+ }
659
+ catch (err) {
660
+ logCliOperationFailure(err);
661
+ }
662
+ }
663
+ function clearDetachedTmuxSessionHistoryIfUnattached(sessionName, leaderPaneId) {
664
+ try {
665
+ const attached = execTmuxFileSync(["display-message", "-p", "-t", sessionName, "#{session_attached}"], {
666
+ stdio: ["ignore", "pipe", "ignore"],
667
+ encoding: "utf-8",
668
+ }).trim();
669
+ if (attached !== "0")
670
+ return;
671
+ execTmuxFileSync(["clear-history", "-t", leaderPaneId], {
672
+ stdio: "ignore",
673
+ });
674
+ }
675
+ catch (err) {
676
+ logCliOperationFailure(err);
677
+ }
678
+ }
679
+ function readTmuxSessionInstanceId(sessionName) {
680
+ try {
681
+ return execTmuxFileSync(["show-options", "-qv", "-t", sessionName, OMX_INSTANCE_OPTION], {
682
+ stdio: ["ignore", "pipe", "ignore"],
683
+ encoding: "utf-8",
684
+ }).trim();
685
+ }
686
+ catch {
687
+ return null;
688
+ }
689
+ }
690
+ function tmuxPaneBelongsToSession(paneId, sessionName) {
691
+ try {
692
+ const paneSessionName = execTmuxFileSync(["display-message", "-p", "-t", paneId, "#{session_name}"], {
693
+ stdio: ["ignore", "pipe", "ignore"],
694
+ encoding: "utf-8",
695
+ }).trim();
696
+ return paneSessionName === sessionName;
697
+ }
698
+ catch {
699
+ return false;
700
+ }
701
+ }
702
+ function buildDetachedHistoryPruneHookCommand(leaderPaneId) {
703
+ return `if-shell -F '#{==:#{session_attached},0}' 'clear-history -t ${leaderPaneId}'`;
704
+ }
705
+ function buildDetachedHistoryPruneHookSlot(sessionName, leaderPaneId) {
706
+ const key = `${sessionName}:${leaderPaneId}:omx-history-prune`;
707
+ let hash = 0;
708
+ for (let i = 0; i < key.length; i++) {
709
+ hash = ((hash << 5) - hash + key.charCodeAt(i)) | 0;
710
+ }
711
+ return `client-detached[${Math.abs(hash) % TMUX_HOOK_INDEX_MAX}]`;
712
+ }
600
713
  function hasErrnoCode(error, code) {
601
714
  return Boolean(error &&
602
715
  typeof error === "object" &&
@@ -825,6 +938,42 @@ export function resolveOmxRootForLaunch(cwd, env = process.env) {
825
938
  return undefined;
826
939
  return isCrossPlatformAbsolutePath(raw) ? raw : join(cwd, raw);
827
940
  }
941
+ function resolveLaunchPath(cwd, raw) {
942
+ return isCrossPlatformAbsolutePath(raw) ? raw : join(cwd, raw);
943
+ }
944
+ function resolveHudRuntimeRootSource(omxRootOverride, env = process.env) {
945
+ if (env.OMX_TEAM_STATE_ROOT?.trim())
946
+ return 'team-env';
947
+ if (env.OMX_ROOT?.trim() || omxRootOverride)
948
+ return 'omx-root-env';
949
+ if (env.OMX_STATE_ROOT?.trim())
950
+ return 'omx-state-root-env';
951
+ return 'cwd-default';
952
+ }
953
+ export function resolveHudRuntimeRootForLaunch(cwd, env = process.env) {
954
+ const omxTeamStateRoot = env.OMX_TEAM_STATE_ROOT?.trim();
955
+ if (omxTeamStateRoot) {
956
+ return {
957
+ omxTeamStateRoot: resolveLaunchPath(cwd, omxTeamStateRoot),
958
+ rootSource: 'team-env',
959
+ };
960
+ }
961
+ const omxRoot = env.OMX_ROOT?.trim();
962
+ if (omxRoot) {
963
+ return {
964
+ omxRoot: resolveLaunchPath(cwd, omxRoot),
965
+ rootSource: 'omx-root-env',
966
+ };
967
+ }
968
+ const omxStateRoot = env.OMX_STATE_ROOT?.trim();
969
+ if (omxStateRoot) {
970
+ return {
971
+ omxStateRoot: resolveLaunchPath(cwd, omxStateRoot),
972
+ rootSource: 'omx-state-root-env',
973
+ };
974
+ }
975
+ return { rootSource: 'cwd-default' };
976
+ }
828
977
  function hasExplicitOmxRootEnv(env = process.env) {
829
978
  return [env.OMX_ROOT, env.OMX_STATE_ROOT].some((value) => typeof value === "string" && value.trim() !== "");
830
979
  }
@@ -945,12 +1094,24 @@ function readMadmaxDetachedActiveRecord(recordPath) {
945
1094
  argv: [...parsed.argv],
946
1095
  run_dir: parsed.run_dir,
947
1096
  tmux_session_name: parsed.tmux_session_name,
1097
+ ...(typeof parsed.session_id === "string" ? { session_id: parsed.session_id } : {}),
1098
+ ...(typeof parsed.tmux_pane_id === "string" ? { tmux_pane_id: parsed.tmux_pane_id } : {}),
948
1099
  };
949
1100
  }
950
1101
  catch {
951
1102
  return null;
952
1103
  }
953
1104
  }
1105
+ function isReusableMadmaxDetachedActiveRecord(record) {
1106
+ if (!detachedTmuxSessionExists(record.tmux_session_name))
1107
+ return false;
1108
+ if (!record.session_id || !record.tmux_pane_id)
1109
+ return false;
1110
+ if (readTmuxSessionInstanceId(record.tmux_session_name) !== record.session_id) {
1111
+ return false;
1112
+ }
1113
+ return tmuxPaneBelongsToSession(record.tmux_pane_id, record.tmux_session_name);
1114
+ }
954
1115
  function detachedTmuxSessionExists(sessionName) {
955
1116
  try {
956
1117
  execTmuxFileSync(["has-session", "-t", sessionName], { stdio: "ignore" });
@@ -1198,6 +1359,7 @@ export async function main(args) {
1198
1359
  scope: resolveSetupScopeArg(args.slice(1)),
1199
1360
  installMode: resolveSetupInstallModeArg(args.slice(1)),
1200
1361
  mcpMode: resolveSetupMcpModeArg(args.slice(1)),
1362
+ teamMode: resolveSetupTeamModeArg(args.slice(1)),
1201
1363
  });
1202
1364
  break;
1203
1365
  case "update":
@@ -1363,7 +1525,12 @@ async function showStatus() {
1363
1525
  try {
1364
1526
  const refs = await listModeStateFilesWithScopePreference(cwd);
1365
1527
  const states = refs.map((ref) => ref.path);
1528
+ const ultragoalState = await readUltragoalState(cwd).catch(() => null);
1366
1529
  if (states.length === 0) {
1530
+ if (ultragoalState?.active) {
1531
+ console.log(`ultragoal: ACTIVE (phase: ${ultragoalState.status})`);
1532
+ return;
1533
+ }
1367
1534
  console.log("No active modes.");
1368
1535
  return;
1369
1536
  }
@@ -1379,8 +1546,13 @@ async function showStatus() {
1379
1546
  }
1380
1547
  const file = basename(path);
1381
1548
  const mode = file.replace("-state.json", "");
1549
+ if (mode === "ultragoal" && ultragoalState?.active)
1550
+ continue;
1382
1551
  console.log(`${mode}: ${state.active === true ? "ACTIVE" : "inactive"} (phase: ${String(state.current_phase || "n/a")})`);
1383
1552
  }
1553
+ if (ultragoalState?.active) {
1554
+ console.log(`ultragoal: ACTIVE (phase: ${ultragoalState.status})`);
1555
+ }
1384
1556
  }
1385
1557
  catch (err) {
1386
1558
  logCliOperationFailure(err);
@@ -2248,6 +2420,7 @@ function buildDetachedSessionLeaderCommand(cwd, sessionName, codexCmd, sessionId
2248
2420
  "};",
2249
2421
  "trap omx_detached_session_cleanup 0 INT TERM HUP;",
2250
2422
  parentEnvSource,
2423
+ "unset OMX_HERMES_MCP_BRIDGE;",
2251
2424
  "omx_codex_started_at=$(date +%s 2>/dev/null || printf 0);",
2252
2425
  `${codexCmd} <&3 &`,
2253
2426
  "omx_codex_pid=$!;",
@@ -2433,6 +2606,23 @@ export function buildDetachedSessionBootstrapSteps(sessionName, cwd, codexCmd, h
2433
2606
  const detachedLeaderCmd = nativeWindows
2434
2607
  ? "powershell.exe"
2435
2608
  : buildDetachedSessionLeaderCommand(cwd, sessionName, codexCmd, sessionId, codexHomeOverride, projectLocalCodexHomeForCleanup, runtimeCodexHomeForCleanup, parentEnvFilePath);
2609
+ const resolvedEnvStateRoot = env.OMX_STATE_ROOT?.trim()
2610
+ ? resolveLaunchPath(cwd, env.OMX_STATE_ROOT.trim())
2611
+ : undefined;
2612
+ const hasExplicitRootOverride = Boolean(env.OMX_ROOT?.trim()
2613
+ || (omxRootOverride && omxRootOverride !== resolvedEnvStateRoot));
2614
+ const hudRuntimeRoot = env.OMX_TEAM_STATE_ROOT?.trim()
2615
+ ? resolveHudRuntimeRootForLaunch(cwd, env)
2616
+ : hasExplicitRootOverride
2617
+ ? {
2618
+ omxRoot: omxRootOverride,
2619
+ rootSource: resolveHudRuntimeRootSource(omxRootOverride, env),
2620
+ }
2621
+ : resolveHudRuntimeRootForLaunch(cwd, env);
2622
+ const hudRuntimeEnv = buildHudRuntimeEnv({
2623
+ sessionId,
2624
+ ...hudRuntimeRoot,
2625
+ }).env;
2436
2626
  const newSessionArgs = [
2437
2627
  "new-session",
2438
2628
  "-d",
@@ -2446,12 +2636,9 @@ export function buildDetachedSessionBootstrapSteps(sessionName, cwd, codexCmd, h
2446
2636
  ...(workerLaunchArgs
2447
2637
  ? ["-e", `${TEAM_WORKER_LAUNCH_ARGS_ENV}=${workerLaunchArgs}`]
2448
2638
  : []),
2449
- ...(sessionId ? ["-e", `OMX_SESSION_ID=${sessionId}`] : []),
2450
- ...(sessionId ? ["-e", `${OMX_TMUX_HUD_OWNER_ENV}=1`] : []),
2639
+ ...Object.entries(hudRuntimeEnv).map(([key, value]) => ["-e", `${key}=${value}`]).flat(),
2451
2640
  ...(codexHomeOverride ? ["-e", `CODEX_HOME=${codexHomeOverride}`] : []),
2452
2641
  ...(sqliteHomeOverride ? ["-e", `${CODEX_SQLITE_HOME_ENV}=${sqliteHomeOverride}`] : []),
2453
- ...(omxRootOverride ? ["-e", `OMX_ROOT=${omxRootOverride}`] : []),
2454
- ...(env.OMX_STATE_ROOT ? ["-e", `OMX_STATE_ROOT=${env.OMX_STATE_ROOT}`] : []),
2455
2642
  ...(env.OMXBOX_ACTIVE ? ["-e", `OMXBOX_ACTIVE=${env.OMXBOX_ACTIVE}`] : []),
2456
2643
  ...(env.OMX_SOURCE_CWD ? ["-e", `OMX_SOURCE_CWD=${env.OMX_SOURCE_CWD}`] : []),
2457
2644
  ...(notifyTempContractRaw
@@ -2501,8 +2688,27 @@ async function readLaunchAppendInstructions() {
2501
2688
  const { readFile } = await import("fs/promises");
2502
2689
  return (await readFile(appendixPath, "utf-8")).trim();
2503
2690
  }
2504
- export function buildDetachedSessionFinalizeSteps(sessionName, hudPaneId, hookWindowIndex, enableMouse, nativeWindows = false) {
2691
+ export function shouldAttachDetachedTmuxSession(env = process.env) {
2692
+ return env.OMX_HERMES_MCP_BRIDGE !== "1";
2693
+ }
2694
+ function stripHermesMcpBridgeEnv(env) {
2695
+ const { OMX_HERMES_MCP_BRIDGE: _bridge, ...rest } = env;
2696
+ return rest;
2697
+ }
2698
+ export function buildDetachedSessionFinalizeSteps(sessionName, hudPaneId, hookWindowIndex, enableMouse, nativeWindows = false, attachSession = true, leaderPaneId = null) {
2505
2699
  const steps = [];
2700
+ if (!nativeWindows && leaderPaneId) {
2701
+ steps.push({
2702
+ name: "register-detached-history-prune-hook",
2703
+ args: [
2704
+ "set-hook",
2705
+ "-t",
2706
+ sessionName,
2707
+ buildDetachedHistoryPruneHookSlot(sessionName, leaderPaneId),
2708
+ buildDetachedHistoryPruneHookCommand(leaderPaneId),
2709
+ ],
2710
+ });
2711
+ }
2506
2712
  if (!nativeWindows && hudPaneId && hookWindowIndex) {
2507
2713
  const hookTarget = buildResizeHookTarget(sessionName, hookWindowIndex);
2508
2714
  const hookName = buildResizeHookName("launch", sessionName, hookWindowIndex, hudPaneId);
@@ -2534,10 +2740,12 @@ export function buildDetachedSessionFinalizeSteps(sessionName, hudPaneId, hookWi
2534
2740
  args: [],
2535
2741
  });
2536
2742
  }
2537
- steps.push({
2538
- name: "attach-session",
2539
- args: ["attach-session", "-t", sessionName],
2540
- });
2743
+ if (attachSession) {
2744
+ steps.push({
2745
+ name: "attach-session",
2746
+ args: ["attach-session", "-t", sessionName],
2747
+ });
2748
+ }
2541
2749
  return steps;
2542
2750
  }
2543
2751
  export function buildDetachedSessionRollbackSteps(sessionName, hookTarget, hookName, clientAttachedHookName) {
@@ -3027,27 +3235,26 @@ function runCodex(cwd, args, sessionId, workerDefaultModel, codexHomeOverride, s
3027
3235
  }
3028
3236
  const omxRootOverride = resolveOmxRootForLaunch(cwd, process.env);
3029
3237
  const currentPaneId = process.env.TMUX_PANE;
3030
- const hudEnvArgs = [
3031
- `OMX_SESSION_ID=${sessionId}`,
3032
- `${OMX_TMUX_HUD_OWNER_ENV}=1`,
3033
- ...(currentPaneId ? [`${OMX_TMUX_HUD_LEADER_PANE_ENV}=${currentPaneId}`] : []),
3034
- ...(omxRootOverride ? [`OMX_ROOT=${omxRootOverride}`] : []),
3035
- ];
3238
+ const hudRuntimeRoot = resolveHudRuntimeRootForLaunch(cwd, process.env);
3239
+ const hudEnvArgs = Object.entries(buildHudRuntimeEnv({
3240
+ sessionId,
3241
+ leaderPaneId: currentPaneId,
3242
+ ...hudRuntimeRoot,
3243
+ }).env).map(([key, value]) => `${key}=${value}`);
3036
3244
  const hudCmd = nativeWindows
3037
3245
  ? buildWindowsPromptCommand("node", [omxBin, "hud", "--watch"])
3038
3246
  : buildTmuxPaneCommand("env", [...hudEnvArgs, "node", omxBin, "hud", "--watch"]);
3039
3247
  const inheritLeaderFlags = process.env[TEAM_INHERIT_LEADER_FLAGS_ENV] !== "0";
3040
3248
  const workerLaunchArgs = resolveTeamWorkerLaunchArgsEnv(process.env[TEAM_WORKER_LAUNCH_ARGS_ENV], launchArgs, inheritLeaderFlags, workerDefaultModel);
3041
3249
  const codexBaseEnv = {
3042
- ...process.env,
3250
+ ...stripHermesMcpBridgeEnv(process.env),
3043
3251
  ...(codexHomeOverride ? { CODEX_HOME: codexHomeOverride } : {}),
3044
3252
  ...(sqliteHomeOverride ? { [CODEX_SQLITE_HOME_ENV]: sqliteHomeOverride } : {}),
3045
3253
  ...(omxRootOverride ? { OMX_ROOT: omxRootOverride } : {}),
3046
3254
  };
3047
3255
  const codexEnvWithSession = {
3048
3256
  ...codexBaseEnv,
3049
- OMX_SESSION_ID: sessionId,
3050
- [OMX_TMUX_HUD_OWNER_ENV]: "1",
3257
+ ...buildHudRuntimeEnv({ sessionId }).env,
3051
3258
  };
3052
3259
  const codexEnv = workerLaunchArgs
3053
3260
  ? { ...codexEnvWithSession, [TEAM_WORKER_LAUNCH_ARGS_ENV]: workerLaunchArgs }
@@ -3077,22 +3284,37 @@ function runCodex(cwd, args, sessionId, workerDefaultModel, codexHomeOverride, s
3077
3284
  const staleHudPaneIds = currentPaneId
3078
3285
  ? listHudWatchPaneIdsInCurrentWindow(currentPaneId, { sessionId, leaderPaneId: currentPaneId })
3079
3286
  : [];
3080
- for (const paneId of staleHudPaneIds) {
3287
+ let hudPaneId = null;
3288
+ const [keeperHudPaneId, ...duplicateHudPaneIds] = staleHudPaneIds;
3289
+ for (const paneId of duplicateHudPaneIds) {
3081
3290
  killTmuxPane(paneId);
3082
3291
  }
3083
- let hudPaneId = null;
3084
- try {
3085
- hudPaneId = createHudWatchPane(cwd, hudCmd, {
3086
- heightLines: HUD_TMUX_HEIGHT_LINES,
3087
- targetPaneId: currentPaneId,
3088
- });
3089
- if (hudPaneId && currentPaneId) {
3090
- registerHudResizeHook(hudPaneId, currentPaneId, HUD_TMUX_HEIGHT_LINES);
3292
+ if (keeperHudPaneId) {
3293
+ hudPaneId = keeperHudPaneId;
3294
+ try {
3295
+ resizeTmuxPane(hudPaneId, HUD_TMUX_HEIGHT_LINES);
3296
+ if (currentPaneId) {
3297
+ registerHudResizeHook(hudPaneId, currentPaneId, HUD_TMUX_HEIGHT_LINES);
3298
+ }
3299
+ }
3300
+ catch (err) {
3301
+ logCliOperationFailure(err);
3091
3302
  }
3092
3303
  }
3093
- catch (err) {
3094
- logCliOperationFailure(err);
3095
- // HUD split failed, continue without it
3304
+ else {
3305
+ try {
3306
+ hudPaneId = createHudWatchPane(cwd, hudCmd, {
3307
+ heightLines: HUD_TMUX_HEIGHT_LINES,
3308
+ targetPaneId: currentPaneId,
3309
+ });
3310
+ if (hudPaneId && currentPaneId) {
3311
+ registerHudResizeHook(hudPaneId, currentPaneId, HUD_TMUX_HEIGHT_LINES);
3312
+ }
3313
+ }
3314
+ catch (err) {
3315
+ logCliOperationFailure(err);
3316
+ // HUD split failed, continue without it
3317
+ }
3096
3318
  }
3097
3319
  // Enable mouse scrolling at session start so scroll works before team
3098
3320
  // expansion. Previously this was only called from createTeamSession().
@@ -3160,8 +3382,14 @@ function runCodex(cwd, args, sessionId, workerDefaultModel, codexHomeOverride, s
3160
3382
  : null;
3161
3383
  if (activeRecord &&
3162
3384
  activeRecord.context_key === contextKey &&
3163
- detachedTmuxSessionExists(activeRecord.tmux_session_name)) {
3385
+ isReusableMadmaxDetachedActiveRecord(activeRecord)) {
3164
3386
  cleanupCurrentMadmaxReuseRunRoot(process.env, runsRoot);
3387
+ setDetachedTmuxSessionHistoryLimit(activeRecord.tmux_session_name, activeRecord.tmux_pane_id);
3388
+ if (!shouldAttachDetachedTmuxSession(process.env)) {
3389
+ clearDetachedTmuxSessionHistoryIfUnattached(activeRecord.tmux_session_name, activeRecord.tmux_pane_id);
3390
+ process.stderr.write(`[omx] madmax detached launch already active for this context; reusing ${activeRecord.tmux_session_name} without attaching because this launch is a Hermes MCP bridge.\n`);
3391
+ return { postLaunchHandledExternally: true };
3392
+ }
3165
3393
  process.stderr.write(`[omx] madmax detached launch already active for this context; attaching ${activeRecord.tmux_session_name} instead of starting a duplicate.\n`);
3166
3394
  try {
3167
3395
  execTmuxFileSync(["attach-session", "-t", activeRecord.tmux_session_name], {
@@ -3177,15 +3405,28 @@ function runCodex(cwd, args, sessionId, workerDefaultModel, codexHomeOverride, s
3177
3405
  if (activeRecordPath && activeRecord) {
3178
3406
  rmSync(activeRecordPath, { force: true });
3179
3407
  }
3180
- void writeSessionStart(cwd, sessionId, { tmuxSessionName: sessionName }).catch((err) => {
3181
- logCliOperationFailure(err);
3182
- // Non-fatal: managed tmux recovery can still use compatibility fallback.
3183
- });
3408
+ let detachedSessionBindingWrite = Promise.resolve();
3409
+ const writeDetachedSessionBinding = (tmuxPaneId) => {
3410
+ detachedSessionBindingWrite = detachedSessionBindingWrite
3411
+ .catch((err) => {
3412
+ logCliOperationFailure(err);
3413
+ })
3414
+ .then(() => writeSessionStart(cwd, sessionId, {
3415
+ tmuxSessionName: sessionName,
3416
+ ...(tmuxPaneId ? { tmuxPaneId } : {}),
3417
+ }));
3418
+ void detachedSessionBindingWrite.catch((err) => {
3419
+ logCliOperationFailure(err);
3420
+ // Non-fatal: managed tmux recovery can still use compatibility fallback.
3421
+ });
3422
+ };
3423
+ writeDetachedSessionBinding();
3184
3424
  let createdDetachedSession = false;
3185
3425
  let registeredHookTarget = null;
3186
3426
  let registeredHookName = null;
3187
3427
  let registeredClientAttachedHookName = null;
3188
3428
  let detachedParentEnvFilePath;
3429
+ let detachedLeaderPaneId = null;
3189
3430
  try {
3190
3431
  // This path is the user-shell interactive launch: OMX creates a tmux
3191
3432
  // session and immediately attaches the user's terminal to it. If a tmux
@@ -3204,18 +3445,25 @@ function runCodex(cwd, args, sessionId, workerDefaultModel, codexHomeOverride, s
3204
3445
  });
3205
3446
  if (step.name === "new-session") {
3206
3447
  createdDetachedSession = true;
3207
- if (activeRecordPath && contextKey) {
3208
- writeMadmaxDetachedActiveRecord(activeRecordPath, {
3209
- version: 1,
3210
- context_key: contextKey,
3211
- created_at: new Date().toISOString(),
3212
- source_cwd: process.env.OMX_SOURCE_CWD || cwd,
3213
- argv: args,
3214
- run_dir: process.env.OMX_ROOT || cwd,
3215
- tmux_session_name: sessionName,
3216
- });
3448
+ const leaderPaneId = parsePaneIdFromTmuxOutput(output || "");
3449
+ if (leaderPaneId) {
3450
+ detachedLeaderPaneId = leaderPaneId;
3451
+ setDetachedTmuxSessionHistoryLimit(sessionName, leaderPaneId);
3452
+ if (activeRecordPath && contextKey) {
3453
+ writeMadmaxDetachedActiveRecord(activeRecordPath, {
3454
+ version: 1,
3455
+ context_key: contextKey,
3456
+ created_at: new Date().toISOString(),
3457
+ source_cwd: process.env.OMX_SOURCE_CWD || cwd,
3458
+ argv: args,
3459
+ run_dir: process.env.OMX_ROOT || cwd,
3460
+ tmux_session_name: sessionName,
3461
+ session_id: sessionId,
3462
+ tmux_pane_id: leaderPaneId,
3463
+ });
3464
+ }
3465
+ writeDetachedSessionBinding(leaderPaneId);
3217
3466
  }
3218
- parsePaneIdFromTmuxOutput(output || "");
3219
3467
  }
3220
3468
  if (step.name === "split-and-capture-hud-pane") {
3221
3469
  const hudPaneId = parsePaneIdFromTmuxOutput(output || "");
@@ -3231,7 +3479,7 @@ function runCodex(cwd, args, sessionId, workerDefaultModel, codexHomeOverride, s
3231
3479
  const clientAttachedHookName = hudPaneId && hookWindowIndex
3232
3480
  ? buildClientAttachedReconcileHookName("launch", sessionName, hookWindowIndex, hudPaneId)
3233
3481
  : null;
3234
- const finalizeSteps = buildDetachedSessionFinalizeSteps(sessionName, hudPaneId, hookWindowIndex, process.env.OMX_MOUSE !== "0", nativeWindows);
3482
+ const finalizeSteps = buildDetachedSessionFinalizeSteps(sessionName, hudPaneId, hookWindowIndex, process.env.OMX_MOUSE !== "0", nativeWindows, shouldAttachDetachedTmuxSession(process.env), detachedLeaderPaneId);
3235
3483
  if (nativeWindows && detachedWindowsCodexCmd) {
3236
3484
  scheduleDetachedWindowsCodexLaunch(sessionName, detachedWindowsCodexCmd);
3237
3485
  }