oh-my-codex 0.11.11 → 0.11.13

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 (342) hide show
  1. package/Cargo.lock +5 -5
  2. package/Cargo.toml +1 -1
  3. package/README.de.md +12 -6
  4. package/README.el.md +223 -0
  5. package/README.es.md +12 -6
  6. package/README.fr.md +11 -5
  7. package/README.it.md +12 -6
  8. package/README.ja.md +12 -6
  9. package/README.ko.md +12 -6
  10. package/README.md +56 -28
  11. package/README.pl.md +216 -0
  12. package/README.pt.md +12 -6
  13. package/README.ru.md +12 -6
  14. package/README.tr.md +12 -6
  15. package/README.vi.md +148 -183
  16. package/README.zh-TW.md +14 -17
  17. package/README.zh.md +12 -6
  18. package/crates/omx-runtime-core/src/engine.rs +122 -4
  19. package/crates/omx-runtime-core/src/lib.rs +17 -0
  20. package/dist/autoresearch/contracts.d.ts.map +1 -1
  21. package/dist/autoresearch/contracts.js +1 -0
  22. package/dist/autoresearch/contracts.js.map +1 -1
  23. package/dist/autoresearch/runtime.d.ts.map +1 -1
  24. package/dist/autoresearch/runtime.js +7 -1
  25. package/dist/autoresearch/runtime.js.map +1 -1
  26. package/dist/cli/__tests__/agents.test.js +24 -1
  27. package/dist/cli/__tests__/agents.test.js.map +1 -1
  28. package/dist/cli/__tests__/autoresearch.test.js +11 -0
  29. package/dist/cli/__tests__/autoresearch.test.js.map +1 -1
  30. package/dist/cli/__tests__/cleanup.test.js +117 -4
  31. package/dist/cli/__tests__/cleanup.test.js.map +1 -1
  32. package/dist/cli/__tests__/doctor-warning-copy.test.js +33 -3
  33. package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
  34. package/dist/cli/__tests__/error-handling-warnings.test.js +13 -0
  35. package/dist/cli/__tests__/error-handling-warnings.test.js.map +1 -1
  36. package/dist/cli/__tests__/exec.test.js +6 -0
  37. package/dist/cli/__tests__/exec.test.js.map +1 -1
  38. package/dist/cli/__tests__/index.test.js +101 -1
  39. package/dist/cli/__tests__/index.test.js.map +1 -1
  40. package/dist/cli/__tests__/launch-fallback.test.js +3 -0
  41. package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
  42. package/dist/cli/__tests__/package-bin-contract.test.js +10 -0
  43. package/dist/cli/__tests__/package-bin-contract.test.js.map +1 -1
  44. package/dist/cli/__tests__/packaged-script-resolution.test.js +4 -3
  45. package/dist/cli/__tests__/packaged-script-resolution.test.js.map +1 -1
  46. package/dist/cli/__tests__/resume.test.js +6 -0
  47. package/dist/cli/__tests__/resume.test.js.map +1 -1
  48. package/dist/cli/__tests__/setup-refresh.test.js +29 -12
  49. package/dist/cli/__tests__/setup-refresh.test.js.map +1 -1
  50. package/dist/cli/__tests__/setup-scope.test.js +1 -1
  51. package/dist/cli/__tests__/setup-scope.test.js.map +1 -1
  52. package/dist/cli/__tests__/star-prompt.test.js +16 -0
  53. package/dist/cli/__tests__/star-prompt.test.js.map +1 -1
  54. package/dist/cli/__tests__/uninstall.test.js +112 -1
  55. package/dist/cli/__tests__/uninstall.test.js.map +1 -1
  56. package/dist/cli/__tests__/windows-popup-loop-contract.test.d.ts +2 -0
  57. package/dist/cli/__tests__/windows-popup-loop-contract.test.d.ts.map +1 -0
  58. package/dist/cli/__tests__/windows-popup-loop-contract.test.js +30 -0
  59. package/dist/cli/__tests__/windows-popup-loop-contract.test.js.map +1 -0
  60. package/dist/cli/agents.d.ts.map +1 -1
  61. package/dist/cli/agents.js +9 -3
  62. package/dist/cli/agents.js.map +1 -1
  63. package/dist/cli/autoresearch-guided.d.ts.map +1 -1
  64. package/dist/cli/autoresearch-guided.js +9 -3
  65. package/dist/cli/autoresearch-guided.js.map +1 -1
  66. package/dist/cli/autoresearch.d.ts.map +1 -1
  67. package/dist/cli/autoresearch.js +8 -2
  68. package/dist/cli/autoresearch.js.map +1 -1
  69. package/dist/cli/cleanup.d.ts +2 -0
  70. package/dist/cli/cleanup.d.ts.map +1 -1
  71. package/dist/cli/cleanup.js +27 -1
  72. package/dist/cli/cleanup.js.map +1 -1
  73. package/dist/cli/doctor.js +7 -0
  74. package/dist/cli/doctor.js.map +1 -1
  75. package/dist/cli/index.d.ts +9 -1
  76. package/dist/cli/index.d.ts.map +1 -1
  77. package/dist/cli/index.js +171 -55
  78. package/dist/cli/index.js.map +1 -1
  79. package/dist/cli/setup.d.ts.map +1 -1
  80. package/dist/cli/setup.js +18 -15
  81. package/dist/cli/setup.js.map +1 -1
  82. package/dist/cli/star-prompt.d.ts.map +1 -1
  83. package/dist/cli/star-prompt.js +2 -0
  84. package/dist/cli/star-prompt.js.map +1 -1
  85. package/dist/cli/team.d.ts.map +1 -1
  86. package/dist/cli/team.js +5 -1
  87. package/dist/cli/team.js.map +1 -1
  88. package/dist/cli/tmux-hook.d.ts.map +1 -1
  89. package/dist/cli/tmux-hook.js +4 -1
  90. package/dist/cli/tmux-hook.js.map +1 -1
  91. package/dist/cli/uninstall.d.ts.map +1 -1
  92. package/dist/cli/uninstall.js +26 -0
  93. package/dist/cli/uninstall.js.map +1 -1
  94. package/dist/cli/update.d.ts.map +1 -1
  95. package/dist/cli/update.js +1 -0
  96. package/dist/cli/update.js.map +1 -1
  97. package/dist/compat/__tests__/rust-runtime-compat.test.js +84 -1
  98. package/dist/compat/__tests__/rust-runtime-compat.test.js.map +1 -1
  99. package/dist/config/__tests__/generator-idempotent.test.js +4 -4
  100. package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
  101. package/dist/config/__tests__/mcp-registry.test.js +13 -16
  102. package/dist/config/__tests__/mcp-registry.test.js.map +1 -1
  103. package/dist/config/mcp-registry.d.ts +1 -0
  104. package/dist/config/mcp-registry.d.ts.map +1 -1
  105. package/dist/config/mcp-registry.js +4 -4
  106. package/dist/config/mcp-registry.js.map +1 -1
  107. package/dist/config/models.d.ts +1 -0
  108. package/dist/config/models.d.ts.map +1 -1
  109. package/dist/config/models.js +39 -1
  110. package/dist/config/models.js.map +1 -1
  111. package/dist/hooks/__tests__/keyword-detector.test.js +12 -1
  112. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  113. package/dist/hooks/__tests__/notify-fallback-watcher.test.js +554 -18
  114. package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
  115. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +347 -16
  116. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js.map +1 -1
  117. package/dist/hooks/__tests__/notify-hook-modules.test.js +5 -0
  118. package/dist/hooks/__tests__/notify-hook-modules.test.js.map +1 -1
  119. package/dist/hooks/__tests__/notify-hook-ralph-resume.test.d.ts +2 -0
  120. package/dist/hooks/__tests__/notify-hook-ralph-resume.test.d.ts.map +1 -0
  121. package/dist/hooks/__tests__/notify-hook-ralph-resume.test.js +597 -0
  122. package/dist/hooks/__tests__/notify-hook-ralph-resume.test.js.map +1 -0
  123. package/dist/hooks/__tests__/notify-hook-regression-205.test.js +19 -1
  124. package/dist/hooks/__tests__/notify-hook-regression-205.test.js.map +1 -1
  125. package/dist/hooks/__tests__/notify-hook-session-scope.test.js +73 -53
  126. package/dist/hooks/__tests__/notify-hook-session-scope.test.js.map +1 -1
  127. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +193 -2
  128. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -1
  129. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +183 -0
  130. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -1
  131. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js +255 -97
  132. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js.map +1 -1
  133. package/dist/hooks/__tests__/notify-hook-tmux-scrollback.test.js +0 -0
  134. package/dist/hooks/__tests__/notify-hook-tmux-scrollback.test.js.map +1 -1
  135. package/dist/hooks/__tests__/notify-hook-worker-idle.test.js +46 -0
  136. package/dist/hooks/__tests__/notify-hook-worker-idle.test.js.map +1 -1
  137. package/dist/hooks/__tests__/prompt-team-routing.test.js +34 -0
  138. package/dist/hooks/__tests__/prompt-team-routing.test.js.map +1 -1
  139. package/dist/hooks/__tests__/tmux-hook-engine.test.js +32 -1
  140. package/dist/hooks/__tests__/tmux-hook-engine.test.js.map +1 -1
  141. package/dist/hooks/code-simplifier/index.d.ts.map +1 -1
  142. package/dist/hooks/code-simplifier/index.js +1 -0
  143. package/dist/hooks/code-simplifier/index.js.map +1 -1
  144. package/dist/hooks/codebase-map.d.ts.map +1 -1
  145. package/dist/hooks/codebase-map.js +1 -0
  146. package/dist/hooks/codebase-map.js.map +1 -1
  147. package/dist/hooks/extensibility/sdk/tmux.d.ts.map +1 -1
  148. package/dist/hooks/extensibility/sdk/tmux.js +3 -1
  149. package/dist/hooks/extensibility/sdk/tmux.js.map +1 -1
  150. package/dist/hooks/keyword-detector.d.ts +1 -0
  151. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  152. package/dist/hooks/keyword-detector.js +48 -0
  153. package/dist/hooks/keyword-detector.js.map +1 -1
  154. package/dist/hooks/prompt-guidance-contract.d.ts.map +1 -1
  155. package/dist/hooks/prompt-guidance-contract.js +6 -0
  156. package/dist/hooks/prompt-guidance-contract.js.map +1 -1
  157. package/dist/hooks/session.d.ts.map +1 -1
  158. package/dist/hooks/session.js +1 -0
  159. package/dist/hooks/session.js.map +1 -1
  160. package/dist/hud/__tests__/state.test.js +70 -1
  161. package/dist/hud/__tests__/state.test.js.map +1 -1
  162. package/dist/hud/authority.d.ts.map +1 -1
  163. package/dist/hud/authority.js +1 -0
  164. package/dist/hud/authority.js.map +1 -1
  165. package/dist/hud/state.d.ts.map +1 -1
  166. package/dist/hud/state.js +52 -0
  167. package/dist/hud/state.js.map +1 -1
  168. package/dist/mcp/state-server.d.ts.map +1 -1
  169. package/dist/mcp/state-server.js +5 -0
  170. package/dist/mcp/state-server.js.map +1 -1
  171. package/dist/modes/__tests__/base-session-scope.test.js +46 -0
  172. package/dist/modes/__tests__/base-session-scope.test.js.map +1 -1
  173. package/dist/modes/base.d.ts.map +1 -1
  174. package/dist/modes/base.js +4 -0
  175. package/dist/modes/base.js.map +1 -1
  176. package/dist/notifications/__tests__/custom-alias-enablement.test.d.ts +2 -0
  177. package/dist/notifications/__tests__/custom-alias-enablement.test.d.ts.map +1 -0
  178. package/dist/notifications/__tests__/custom-alias-enablement.test.js +84 -0
  179. package/dist/notifications/__tests__/custom-alias-enablement.test.js.map +1 -0
  180. package/dist/notifications/__tests__/idle-cooldown.test.js +55 -0
  181. package/dist/notifications/__tests__/idle-cooldown.test.js.map +1 -1
  182. package/dist/notifications/idle-cooldown.d.ts +8 -6
  183. package/dist/notifications/idle-cooldown.d.ts.map +1 -1
  184. package/dist/notifications/idle-cooldown.js +53 -22
  185. package/dist/notifications/idle-cooldown.js.map +1 -1
  186. package/dist/notifications/notifier.js +1 -1
  187. package/dist/notifications/notifier.js.map +1 -1
  188. package/dist/notifications/reply-listener.d.ts.map +1 -1
  189. package/dist/notifications/reply-listener.js +1 -0
  190. package/dist/notifications/reply-listener.js.map +1 -1
  191. package/dist/notifications/tmux.d.ts.map +1 -1
  192. package/dist/notifications/tmux.js +4 -0
  193. package/dist/notifications/tmux.js.map +1 -1
  194. package/dist/openclaw/config.js +2 -2
  195. package/dist/openclaw/config.js.map +1 -1
  196. package/dist/runtime/bridge.d.ts +2 -0
  197. package/dist/runtime/bridge.d.ts.map +1 -1
  198. package/dist/runtime/bridge.js +8 -0
  199. package/dist/runtime/bridge.js.map +1 -1
  200. package/dist/scripts/notify-fallback-watcher.js +103 -53
  201. package/dist/scripts/notify-fallback-watcher.js.map +1 -1
  202. package/dist/scripts/notify-hook/auto-nudge.d.ts +2 -1
  203. package/dist/scripts/notify-hook/auto-nudge.d.ts.map +1 -1
  204. package/dist/scripts/notify-hook/auto-nudge.js +90 -104
  205. package/dist/scripts/notify-hook/auto-nudge.js.map +1 -1
  206. package/dist/scripts/notify-hook/managed-tmux.d.ts +19 -0
  207. package/dist/scripts/notify-hook/managed-tmux.d.ts.map +1 -0
  208. package/dist/scripts/notify-hook/managed-tmux.js +320 -0
  209. package/dist/scripts/notify-hook/managed-tmux.js.map +1 -0
  210. package/dist/scripts/notify-hook/operational-events.d.ts.map +1 -1
  211. package/dist/scripts/notify-hook/operational-events.js +2 -0
  212. package/dist/scripts/notify-hook/operational-events.js.map +1 -1
  213. package/dist/scripts/notify-hook/ralph-session-resume.d.ts +22 -0
  214. package/dist/scripts/notify-hook/ralph-session-resume.d.ts.map +1 -0
  215. package/dist/scripts/notify-hook/ralph-session-resume.js +277 -0
  216. package/dist/scripts/notify-hook/ralph-session-resume.js.map +1 -0
  217. package/dist/scripts/notify-hook/state-io.d.ts +1 -1
  218. package/dist/scripts/notify-hook/state-io.d.ts.map +1 -1
  219. package/dist/scripts/notify-hook/state-io.js +2 -10
  220. package/dist/scripts/notify-hook/state-io.js.map +1 -1
  221. package/dist/scripts/notify-hook/team-dispatch.d.ts +1 -1
  222. package/dist/scripts/notify-hook/team-dispatch.d.ts.map +1 -1
  223. package/dist/scripts/notify-hook/team-dispatch.js +123 -72
  224. package/dist/scripts/notify-hook/team-dispatch.js.map +1 -1
  225. package/dist/scripts/notify-hook/team-leader-nudge.d.ts +2 -1
  226. package/dist/scripts/notify-hook/team-leader-nudge.d.ts.map +1 -1
  227. package/dist/scripts/notify-hook/team-leader-nudge.js +13 -5
  228. package/dist/scripts/notify-hook/team-leader-nudge.js.map +1 -1
  229. package/dist/scripts/notify-hook/team-tmux-guard.d.ts.map +1 -1
  230. package/dist/scripts/notify-hook/team-tmux-guard.js +1 -19
  231. package/dist/scripts/notify-hook/team-tmux-guard.js.map +1 -1
  232. package/dist/scripts/notify-hook/team-worker.js +4 -4
  233. package/dist/scripts/notify-hook/team-worker.js.map +1 -1
  234. package/dist/scripts/notify-hook/tmux-injection.d.ts +1 -1
  235. package/dist/scripts/notify-hook/tmux-injection.d.ts.map +1 -1
  236. package/dist/scripts/notify-hook/tmux-injection.js +102 -35
  237. package/dist/scripts/notify-hook/tmux-injection.js.map +1 -1
  238. package/dist/scripts/notify-hook.js +144 -20
  239. package/dist/scripts/notify-hook.js.map +1 -1
  240. package/dist/scripts/run-provider-advisor.js +2 -0
  241. package/dist/scripts/run-provider-advisor.js.map +1 -1
  242. package/dist/scripts/run-test-files.d.ts +2 -0
  243. package/dist/scripts/run-test-files.d.ts.map +1 -0
  244. package/dist/scripts/run-test-files.js +41 -0
  245. package/dist/scripts/run-test-files.js.map +1 -0
  246. package/dist/scripts/tmux-hook-engine.d.ts +2 -0
  247. package/dist/scripts/tmux-hook-engine.d.ts.map +1 -1
  248. package/dist/scripts/tmux-hook-engine.js +15 -0
  249. package/dist/scripts/tmux-hook-engine.js.map +1 -1
  250. package/dist/team/__tests__/api-interop.test.js +136 -4
  251. package/dist/team/__tests__/api-interop.test.js.map +1 -1
  252. package/dist/team/__tests__/leader-activity.test.js +107 -2
  253. package/dist/team/__tests__/leader-activity.test.js.map +1 -1
  254. package/dist/team/__tests__/runtime-cli.test.js +32 -0
  255. package/dist/team/__tests__/runtime-cli.test.js.map +1 -1
  256. package/dist/team/__tests__/runtime.test.js +148 -0
  257. package/dist/team/__tests__/runtime.test.js.map +1 -1
  258. package/dist/team/__tests__/shutdown-fallback.test.js +13 -0
  259. package/dist/team/__tests__/shutdown-fallback.test.js.map +1 -1
  260. package/dist/team/__tests__/state-root.test.js +11 -1
  261. package/dist/team/__tests__/state-root.test.js.map +1 -1
  262. package/dist/team/__tests__/state.test.js +237 -0
  263. package/dist/team/__tests__/state.test.js.map +1 -1
  264. package/dist/team/__tests__/tmux-session.test.js +521 -2
  265. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  266. package/dist/team/api-interop.d.ts.map +1 -1
  267. package/dist/team/api-interop.js +41 -31
  268. package/dist/team/api-interop.js.map +1 -1
  269. package/dist/team/commit-hygiene.d.ts +60 -0
  270. package/dist/team/commit-hygiene.d.ts.map +1 -0
  271. package/dist/team/commit-hygiene.js +232 -0
  272. package/dist/team/commit-hygiene.js.map +1 -0
  273. package/dist/team/leader-activity.d.ts.map +1 -1
  274. package/dist/team/leader-activity.js +56 -4
  275. package/dist/team/leader-activity.js.map +1 -1
  276. package/dist/team/runtime-cli.d.ts +9 -1
  277. package/dist/team/runtime-cli.d.ts.map +1 -1
  278. package/dist/team/runtime-cli.js +15 -6
  279. package/dist/team/runtime-cli.js.map +1 -1
  280. package/dist/team/runtime.d.ts +7 -2
  281. package/dist/team/runtime.d.ts.map +1 -1
  282. package/dist/team/runtime.js +392 -171
  283. package/dist/team/runtime.js.map +1 -1
  284. package/dist/team/scaling.d.ts.map +1 -1
  285. package/dist/team/scaling.js +6 -2
  286. package/dist/team/scaling.js.map +1 -1
  287. package/dist/team/state/dispatch.d.ts +2 -0
  288. package/dist/team/state/dispatch.d.ts.map +1 -1
  289. package/dist/team/state/dispatch.js +86 -40
  290. package/dist/team/state/dispatch.js.map +1 -1
  291. package/dist/team/state/mailbox.d.ts +3 -0
  292. package/dist/team/state/mailbox.d.ts.map +1 -1
  293. package/dist/team/state/mailbox.js +93 -19
  294. package/dist/team/state/mailbox.js.map +1 -1
  295. package/dist/team/state-root.d.ts +1 -1
  296. package/dist/team/state-root.d.ts.map +1 -1
  297. package/dist/team/state-root.js +8 -3
  298. package/dist/team/state-root.js.map +1 -1
  299. package/dist/team/state.d.ts.map +1 -1
  300. package/dist/team/state.js +96 -2
  301. package/dist/team/state.js.map +1 -1
  302. package/dist/team/tmux-session.d.ts.map +1 -1
  303. package/dist/team/tmux-session.js +81 -29
  304. package/dist/team/tmux-session.js.map +1 -1
  305. package/dist/team/worker-bootstrap.d.ts.map +1 -1
  306. package/dist/team/worker-bootstrap.js +4 -0
  307. package/dist/team/worker-bootstrap.js.map +1 -1
  308. package/dist/team/worktree.d.ts.map +1 -1
  309. package/dist/team/worktree.js +9 -0
  310. package/dist/team/worktree.js.map +1 -1
  311. package/dist/utils/__tests__/paths.test.js +98 -11
  312. package/dist/utils/__tests__/paths.test.js.map +1 -1
  313. package/dist/utils/__tests__/platform-command.test.js +101 -2
  314. package/dist/utils/__tests__/platform-command.test.js.map +1 -1
  315. package/dist/utils/git-layout.d.ts +8 -0
  316. package/dist/utils/git-layout.d.ts.map +1 -0
  317. package/dist/utils/git-layout.js +58 -0
  318. package/dist/utils/git-layout.js.map +1 -0
  319. package/dist/utils/paths.d.ts +3 -0
  320. package/dist/utils/paths.d.ts.map +1 -1
  321. package/dist/utils/paths.js +14 -4
  322. package/dist/utils/paths.js.map +1 -1
  323. package/dist/utils/platform-command.d.ts.map +1 -1
  324. package/dist/utils/platform-command.js +35 -3
  325. package/dist/utils/platform-command.js.map +1 -1
  326. package/package.json +9 -5
  327. package/src/scripts/notify-fallback-watcher.ts +103 -53
  328. package/src/scripts/notify-hook/auto-nudge.ts +97 -103
  329. package/src/scripts/notify-hook/managed-tmux.ts +324 -0
  330. package/src/scripts/notify-hook/operational-events.ts +2 -0
  331. package/src/scripts/notify-hook/ralph-session-resume.ts +337 -0
  332. package/src/scripts/notify-hook/state-io.ts +2 -10
  333. package/src/scripts/notify-hook/team-dispatch.ts +131 -66
  334. package/src/scripts/notify-hook/team-leader-nudge.ts +19 -5
  335. package/src/scripts/notify-hook/team-tmux-guard.ts +0 -20
  336. package/src/scripts/notify-hook/team-worker.ts +4 -4
  337. package/src/scripts/notify-hook/tmux-injection.ts +103 -33
  338. package/src/scripts/notify-hook.ts +150 -21
  339. package/src/scripts/run-provider-advisor.ts +4 -2
  340. package/src/scripts/run-test-files.ts +48 -0
  341. package/src/scripts/tmux-hook-engine.ts +16 -0
  342. package/templates/AGENTS.md +51 -43
package/dist/cli/index.js CHANGED
@@ -15,7 +15,7 @@ import { hudCommand } from "../hud/index.js";
15
15
  import { teamCommand } from "./team.js";
16
16
  import { ralphCommand } from "./ralph.js";
17
17
  import { askCommand } from "./ask.js";
18
- import { cleanupCommand } from "./cleanup.js";
18
+ import { cleanupCommand, cleanupOmxMcpProcesses, findLaunchSafeCleanupCandidates, } from "./cleanup.js";
19
19
  import { exploreCommand } from "./explore.js";
20
20
  import { sparkshellCommand } from "./sparkshell.js";
21
21
  import { agentsInitCommand } from "./agents-init.js";
@@ -28,7 +28,7 @@ import { maybeCheckAndPromptUpdate } from "./update.js";
28
28
  import { maybePromptGithubStar } from "./star-prompt.js";
29
29
  import { generateOverlay, removeSessionModelInstructionsFile, resolveSessionOrchestrationMode, sessionModelInstructionsPath, writeSessionModelInstructionsFile, } from "../hooks/agents-overlay.js";
30
30
  import { readSessionState, writeSessionStart, writeSessionEnd, resetSessionMetrics, } from "../hooks/session.js";
31
- import { buildClientAttachedReconcileHookName, buildReconcileHudResizeArgs, buildRegisterClientAttachedReconcileArgs, buildRegisterResizeHookArgs, buildResizeHookName, buildResizeHookTarget, buildScheduleDelayedHudResizeArgs, buildUnregisterClientAttachedReconcileArgs, buildUnregisterResizeHookArgs, enableMouseScrolling, isNativeWindows, isTmuxAvailable, } from "../team/tmux-session.js";
31
+ import { buildClientAttachedReconcileHookName, buildReconcileHudResizeArgs, buildRegisterClientAttachedReconcileArgs, buildRegisterResizeHookArgs, buildResizeHookName, buildResizeHookTarget, buildScheduleDelayedHudResizeArgs, buildUnregisterClientAttachedReconcileArgs, buildUnregisterResizeHookArgs, enableMouseScrolling, isMsysOrGitBash, isNativeWindows, isTmuxAvailable, } from "../team/tmux-session.js";
32
32
  import { getPackageRoot } from "../utils/package.js";
33
33
  import { codexConfigPath } from "../utils/paths.js";
34
34
  import { repairConfigIfNeeded } from "../config/generator.js";
@@ -40,13 +40,16 @@ import { collectInheritableTeamWorkerArgs as collectInheritableTeamWorkerArgsSha
40
40
  import { parseWorktreeMode, planWorktreeTarget, ensureWorktree, } from "../team/worktree.js";
41
41
  import { OMX_NOTIFY_TEMP_CONTRACT_ENV, parseNotifyTempContractFromArgs, serializeNotifyTempContract, } from "../notifications/temp-contract.js";
42
42
  export function resolveNotifyFallbackWatcherScript(pkgRoot = getPackageRoot()) {
43
- return join(pkgRoot, "dist", "scripts", "notify-fallback-watcher.js");
43
+ return resolveDistScript(pkgRoot, "notify-fallback-watcher.js");
44
44
  }
45
45
  export function resolveHookDerivedWatcherScript(pkgRoot = getPackageRoot()) {
46
- return join(pkgRoot, "dist", "scripts", "hook-derived-watcher.js");
46
+ return resolveDistScript(pkgRoot, "hook-derived-watcher.js");
47
47
  }
48
48
  export function resolveNotifyHookScript(pkgRoot = getPackageRoot()) {
49
- return join(pkgRoot, "dist", "scripts", "notify-hook.js");
49
+ return resolveDistScript(pkgRoot, "notify-hook.js");
50
+ }
51
+ function resolveDistScript(pkgRoot, scriptName) {
52
+ return join(pkgRoot, "dist", "scripts", scriptName);
50
53
  }
51
54
  const HELP = `
52
55
  oh-my-codex (omx) - Multi-agent orchestration for Codex CLI
@@ -1023,6 +1026,9 @@ export function buildTmuxSessionName(cwd, sessionId) {
1023
1026
  const name = `omx-${dirToken}-${branchToken}-${sessionToken}`;
1024
1027
  return name.length > 120 ? name.slice(0, 120) : name;
1025
1028
  }
1029
+ export function buildDetachedTmuxSessionName(cwd, sessionId) {
1030
+ return buildTmuxSessionName(cwd, sessionId);
1031
+ }
1026
1032
  function parsePaneIdFromTmuxOutput(rawOutput) {
1027
1033
  const paneId = rawOutput.split("\n")[0]?.trim() || "";
1028
1034
  return paneId.startsWith("%") ? paneId : null;
@@ -1054,7 +1060,7 @@ function buildDetachedSessionLeaderCommand(sessionName, codexCmd) {
1054
1060
  const wrapped = [`trap '${cleanupTrap}' 0 INT TERM HUP;`, codexCmd].join(" ");
1055
1061
  return `/bin/sh -lc ${quoteShellArg(wrapped)}`;
1056
1062
  }
1057
- export function buildDetachedSessionBootstrapSteps(sessionName, cwd, codexCmd, hudCmd, workerLaunchArgs, codexHomeOverride, notifyTempContractRaw, nativeWindows = false) {
1063
+ export function buildDetachedSessionBootstrapSteps(sessionName, cwd, codexCmd, hudCmd, workerLaunchArgs, codexHomeOverride, notifyTempContractRaw, nativeWindows = false, sessionId) {
1058
1064
  const detachedLeaderCmd = nativeWindows
1059
1065
  ? "powershell.exe"
1060
1066
  : buildDetachedSessionLeaderCommand(sessionName, codexCmd);
@@ -1071,6 +1077,7 @@ export function buildDetachedSessionBootstrapSteps(sessionName, cwd, codexCmd, h
1071
1077
  ...(workerLaunchArgs
1072
1078
  ? ["-e", `${TEAM_WORKER_LAUNCH_ARGS_ENV}=${workerLaunchArgs}`]
1073
1079
  : []),
1080
+ ...(sessionId ? ["-e", `OMX_SESSION_ID=${sessionId}`] : []),
1074
1081
  ...(codexHomeOverride ? ["-e", `CODEX_HOME=${codexHomeOverride}`] : []),
1075
1082
  ...(notifyTempContractRaw
1076
1083
  ? ["-e", `${OMX_NOTIFY_TEMP_CONTRACT_ENV}=${notifyTempContractRaw}`]
@@ -1186,20 +1193,43 @@ export function buildNotifyFallbackWatcherEnv(env = process.env, options = {}) {
1186
1193
  return {
1187
1194
  ...nextEnv,
1188
1195
  ...(options.codexHomeOverride ? { CODEX_HOME: options.codexHomeOverride } : {}),
1196
+ ...(options.sessionId ? { OMX_SESSION_ID: options.sessionId } : {}),
1189
1197
  OMX_HUD_AUTHORITY: options.enableAuthority ? "1" : "0",
1190
1198
  };
1191
1199
  }
1200
+ export async function cleanupLaunchOrphanedMcpProcesses(dependencies = {}) {
1201
+ return cleanupOmxMcpProcesses([], {
1202
+ ...dependencies,
1203
+ selectCandidates: dependencies.selectCandidates ?? findLaunchSafeCleanupCandidates,
1204
+ writeLine: dependencies.writeLine ?? (() => { }),
1205
+ });
1206
+ }
1192
1207
  /**
1193
1208
  * preLaunch: Prepare environment before Codex starts.
1194
- * 1. Generate runtime overlay + write session-scoped model instructions file
1195
- * 2. Write session.json
1209
+ * 1. Best-effort launch-safe orphan cleanup for detached OMX MCP processes
1210
+ * 2. Generate runtime overlay + write session-scoped model instructions file
1211
+ * 3. Write session.json
1196
1212
  *
1197
- * Automatic stale-session cleanup is intentionally disabled here. Destructive
1198
- * cleanup must be explicit via `omx cleanup` so normal launches never reap
1199
- * files or processes from other OMX sessions.
1213
+ * Automatic broad stale-session cleanup remains disabled here. Only detached
1214
+ * OMX MCP processes without a live Codex ancestor are reaped so new launches
1215
+ * do not accumulate stale processes from prior crashed/closed sessions.
1200
1216
  */
1201
1217
  async function preLaunch(cwd, sessionId, notifyTempContract, codexHomeOverride, enableNotifyFallbackAuthority = false) {
1202
- // 1. Generate runtime overlay + write session-scoped model instructions file
1218
+ // 1. Best-effort launch-safe orphan cleanup
1219
+ try {
1220
+ const cleanup = await cleanupLaunchOrphanedMcpProcesses();
1221
+ if (cleanup.terminatedCount > 0) {
1222
+ console.log(`[omx] Reaped ${cleanup.terminatedCount} orphaned OMX MCP process(es) before launch.`);
1223
+ }
1224
+ if (cleanup.failedPids.length > 0) {
1225
+ console.warn(`[omx] Failed to reap ${cleanup.failedPids.length} orphaned OMX MCP process(es); continuing launch.`);
1226
+ }
1227
+ }
1228
+ catch (err) {
1229
+ process.stderr.write(`[cli/index] operation failed: ${err}\n`);
1230
+ // Non-fatal
1231
+ }
1232
+ // 2. Generate runtime overlay + write session-scoped model instructions file
1203
1233
  const orchestrationMode = await resolveSessionOrchestrationMode(cwd, sessionId);
1204
1234
  const overlay = await generateOverlay(cwd, sessionId, { orchestrationMode });
1205
1235
  const launchAppendix = await readLaunchAppendInstructions();
@@ -1209,18 +1239,18 @@ async function preLaunch(cwd, sessionId, notifyTempContract, codexHomeOverride,
1209
1239
  ${launchAppendix}`
1210
1240
  : overlay;
1211
1241
  await writeSessionModelInstructionsFile(cwd, sessionId, sessionInstructions);
1212
- // 2. Write session state
1242
+ // 3. Write session state
1213
1243
  await resetSessionMetrics(cwd);
1214
1244
  await writeSessionStart(cwd, sessionId);
1215
- // 3. Start notify fallback watcher (best effort)
1245
+ // 4. Start notify fallback watcher (best effort)
1216
1246
  try {
1217
- await startNotifyFallbackWatcher(cwd, { codexHomeOverride, enableAuthority: enableNotifyFallbackAuthority });
1247
+ await startNotifyFallbackWatcher(cwd, { codexHomeOverride, enableAuthority: enableNotifyFallbackAuthority, sessionId });
1218
1248
  }
1219
1249
  catch (err) {
1220
1250
  process.stderr.write(`[cli/index] operation failed: ${err}\n`);
1221
1251
  // Non-fatal
1222
1252
  }
1223
- // 4. Start derived watcher (best effort, opt-in)
1253
+ // 5. Start derived watcher (best effort, opt-in)
1224
1254
  try {
1225
1255
  await startHookDerivedWatcher(cwd);
1226
1256
  }
@@ -1228,7 +1258,7 @@ ${launchAppendix}`
1228
1258
  process.stderr.write(`[cli/index] operation failed: ${err}\n`);
1229
1259
  // Non-fatal
1230
1260
  }
1231
- // 5. Emit temp notification startup summary + warnings, then send session-start lifecycle notification (best effort)
1261
+ // 6. Emit temp notification startup summary + warnings, then send session-start lifecycle notification (best effort)
1232
1262
  try {
1233
1263
  if (notifyTempContract?.active) {
1234
1264
  process.env[OMX_NOTIFY_TEMP_CONTRACT_ENV] =
@@ -1257,7 +1287,7 @@ ${launchAppendix}`
1257
1287
  process.stderr.write(`[cli/index] operation failed: ${err}\n`);
1258
1288
  // Non-fatal: notification failures must never block launch
1259
1289
  }
1260
- // 6. Dispatch native hook event (best effort)
1290
+ // 7. Dispatch native hook event (best effort)
1261
1291
  try {
1262
1292
  await emitNativeHookEvent(cwd, "session-start", {
1263
1293
  session_id: sessionId,
@@ -1289,9 +1319,10 @@ function runCodex(cwd, args, sessionId, workerDefaultModel, codexHomeOverride, n
1289
1319
  const codexBaseEnv = codexHomeOverride
1290
1320
  ? { ...process.env, CODEX_HOME: codexHomeOverride }
1291
1321
  : process.env;
1322
+ const codexEnvWithSession = { ...codexBaseEnv, OMX_SESSION_ID: sessionId };
1292
1323
  const codexEnv = workerLaunchArgs
1293
- ? { ...codexBaseEnv, [TEAM_WORKER_LAUNCH_ARGS_ENV]: workerLaunchArgs }
1294
- : codexBaseEnv;
1324
+ ? { ...codexEnvWithSession, [TEAM_WORKER_LAUNCH_ARGS_ENV]: workerLaunchArgs }
1325
+ : codexEnvWithSession;
1295
1326
  const codexEnvWithNotify = notifyTempContractRaw
1296
1327
  ? { ...codexEnv, [OMX_NOTIFY_TEMP_CONTRACT_ENV]: notifyTempContractRaw }
1297
1328
  : codexEnv;
@@ -1365,14 +1396,13 @@ function runCodex(cwd, args, sessionId, workerDefaultModel, codexHomeOverride, n
1365
1396
  const detachedWindowsCodexCmd = nativeWindows
1366
1397
  ? buildWindowsPromptCommand("codex", launchArgs)
1367
1398
  : null;
1368
- const tmuxSessionId = `omx-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
1369
- const sessionName = buildTmuxSessionName(cwd, tmuxSessionId);
1399
+ const sessionName = buildDetachedTmuxSessionName(cwd, sessionId);
1370
1400
  let createdDetachedSession = false;
1371
1401
  let registeredHookTarget = null;
1372
1402
  let registeredHookName = null;
1373
1403
  let registeredClientAttachedHookName = null;
1374
1404
  try {
1375
- const bootstrapSteps = buildDetachedSessionBootstrapSteps(sessionName, cwd, codexCmd, hudCmd, workerLaunchArgs, codexHomeOverride, notifyTempContractRaw, nativeWindows);
1405
+ const bootstrapSteps = buildDetachedSessionBootstrapSteps(sessionName, cwd, codexCmd, hudCmd, workerLaunchArgs, codexHomeOverride, notifyTempContractRaw, nativeWindows, sessionId);
1376
1406
  for (const step of bootstrapSteps) {
1377
1407
  const output = execFileSync("tmux", step.args, {
1378
1408
  stdio: "pipe",
@@ -1570,7 +1600,7 @@ async function postLaunch(cwd, sessionId, codexHomeOverride, enableNotifyFallbac
1570
1600
  }
1571
1601
  // 0. Flush fallback watcher once to reduce race with fast codex exit.
1572
1602
  try {
1573
- await flushNotifyFallbackOnce(cwd, { codexHomeOverride, enableAuthority: enableNotifyFallbackAuthority });
1603
+ await flushNotifyFallbackOnce(cwd, { codexHomeOverride, enableAuthority: enableNotifyFallbackAuthority, sessionId });
1574
1604
  }
1575
1605
  catch (err) {
1576
1606
  process.stderr.write(`[cli/index] operation failed: ${err}\n`);
@@ -1704,6 +1734,66 @@ function notifyFallbackPidPath(cwd) {
1704
1734
  function hookDerivedWatcherPidPath(cwd) {
1705
1735
  return join(cwd, ".omx", "state", "hook-derived-watcher.pid");
1706
1736
  }
1737
+ export function shouldDetachBackgroundHelper(env = process.env, platform = process.platform) {
1738
+ // The long-running watcher/helper itself must stay detached so it can
1739
+ // survive parent loss. Windows Git Bash/MSYS uses a short hidden bootstrap
1740
+ // process so the detached helper is created without stealing focus.
1741
+ void env;
1742
+ void platform;
1743
+ return true;
1744
+ }
1745
+ export function resolveBackgroundHelperLaunchMode(env = process.env, platform = process.platform) {
1746
+ return platform === "win32" && isMsysOrGitBash(env, platform)
1747
+ ? "windows-msys-bootstrap"
1748
+ : "direct-detached";
1749
+ }
1750
+ export function buildWindowsMsysBackgroundHelperBootstrapScript(helperArgs, cwd) {
1751
+ const helperArgsLiteral = JSON.stringify(helperArgs);
1752
+ const cwdLiteral = JSON.stringify(cwd);
1753
+ return [
1754
+ "const { spawn } = require('child_process');",
1755
+ `const child = spawn(process.execPath, ${helperArgsLiteral}, { cwd: ${cwdLiteral}, detached: true, stdio: 'ignore', windowsHide: true, env: process.env });`,
1756
+ "if (!child.pid) process.exit(1);",
1757
+ "process.stdout.write(String(child.pid));",
1758
+ "child.unref();",
1759
+ ].join("");
1760
+ }
1761
+ async function launchBackgroundHelper(helperArgs, options) {
1762
+ const launchMode = resolveBackgroundHelperLaunchMode(options.env, process.platform);
1763
+ if (launchMode === "windows-msys-bootstrap") {
1764
+ const { spawnSync } = await import("child_process");
1765
+ const bootstrap = spawnSync(process.execPath, [
1766
+ "-e",
1767
+ buildWindowsMsysBackgroundHelperBootstrapScript(helperArgs, options.cwd),
1768
+ ], {
1769
+ cwd: options.cwd,
1770
+ encoding: "utf-8",
1771
+ stdio: ["ignore", "pipe", "pipe"],
1772
+ windowsHide: true,
1773
+ env: options.env,
1774
+ });
1775
+ if (bootstrap.error) {
1776
+ throw bootstrap.error;
1777
+ }
1778
+ if (bootstrap.status !== 0) {
1779
+ const detail = (bootstrap.stderr || bootstrap.stdout || "").trim();
1780
+ throw new Error(detail || `background helper bootstrap exited ${bootstrap.status}`);
1781
+ }
1782
+ const helperPid = Number.parseInt((bootstrap.stdout || "").trim(), 10);
1783
+ return Number.isFinite(helperPid) && helperPid > 0
1784
+ ? helperPid
1785
+ : undefined;
1786
+ }
1787
+ const child = spawn(process.execPath, helperArgs, {
1788
+ cwd: options.cwd,
1789
+ detached: shouldDetachBackgroundHelper(options.env, process.platform),
1790
+ stdio: "ignore",
1791
+ windowsHide: true,
1792
+ env: options.env,
1793
+ });
1794
+ child.unref();
1795
+ return child.pid;
1796
+ }
1707
1797
  function parseWatcherPidFile(content) {
1708
1798
  const trimmed = content.trim();
1709
1799
  if (!trimmed)
@@ -1766,30 +1856,44 @@ async function startNotifyFallbackWatcher(cwd, options = {}) {
1766
1856
  error: error instanceof Error ? error.message : String(error),
1767
1857
  });
1768
1858
  });
1769
- const child = spawn(process.execPath, [
1770
- watcherScript,
1771
- "--cwd",
1772
- cwd,
1773
- "--notify-script",
1774
- notifyScript,
1775
- "--pid-file",
1776
- pidPath,
1777
- "--parent-pid",
1778
- String(process.pid),
1779
- ...(process.env.OMX_NOTIFY_FALLBACK_MAX_LIFETIME_MS
1780
- ? ["--max-lifetime-ms", process.env.OMX_NOTIFY_FALLBACK_MAX_LIFETIME_MS]
1781
- : []),
1782
- ], {
1783
- cwd,
1784
- detached: true,
1785
- stdio: "ignore",
1786
- env: buildNotifyFallbackWatcherEnv(process.env, {
1787
- codexHomeOverride: options.codexHomeOverride,
1788
- enableAuthority: options.enableAuthority === true,
1789
- }),
1859
+ const watcherEnv = buildNotifyFallbackWatcherEnv(process.env, {
1860
+ codexHomeOverride: options.codexHomeOverride,
1861
+ enableAuthority: options.enableAuthority === true,
1862
+ sessionId: options.sessionId,
1790
1863
  });
1791
- child.unref();
1792
- await writeFile(pidPath, JSON.stringify({ pid: child.pid, started_at: new Date().toISOString() }, null, 2)).catch((error) => {
1864
+ let watcherPid;
1865
+ try {
1866
+ watcherPid = await launchBackgroundHelper([
1867
+ watcherScript,
1868
+ "--cwd",
1869
+ cwd,
1870
+ "--notify-script",
1871
+ notifyScript,
1872
+ "--pid-file",
1873
+ pidPath,
1874
+ "--parent-pid",
1875
+ String(process.pid),
1876
+ ...(process.env.OMX_NOTIFY_FALLBACK_MAX_LIFETIME_MS
1877
+ ? [
1878
+ "--max-lifetime-ms",
1879
+ process.env.OMX_NOTIFY_FALLBACK_MAX_LIFETIME_MS,
1880
+ ]
1881
+ : []),
1882
+ ], {
1883
+ cwd,
1884
+ env: watcherEnv,
1885
+ });
1886
+ }
1887
+ catch (error) {
1888
+ console.warn("[omx] warning: failed to launch notify fallback watcher", {
1889
+ cwd,
1890
+ error: error instanceof Error ? error.message : String(error),
1891
+ });
1892
+ return;
1893
+ }
1894
+ if (!watcherPid)
1895
+ return;
1896
+ await writeFile(pidPath, JSON.stringify({ pid: watcherPid, started_at: new Date().toISOString() }, null, 2)).catch((error) => {
1793
1897
  console.warn("[omx] warning: failed to write notify fallback watcher pid file", {
1794
1898
  path: pidPath,
1795
1899
  error: error instanceof Error ? error.message : String(error),
@@ -1825,14 +1929,23 @@ async function startHookDerivedWatcher(cwd) {
1825
1929
  error: error instanceof Error ? error.message : String(error),
1826
1930
  });
1827
1931
  });
1828
- const child = spawn(process.execPath, [watcherScript, "--cwd", cwd], {
1829
- cwd,
1830
- detached: true,
1831
- stdio: "ignore",
1832
- env: process.env,
1833
- });
1834
- child.unref();
1835
- await writeFile(pidPath, JSON.stringify({ pid: child.pid, started_at: new Date().toISOString() }, null, 2)).catch((error) => {
1932
+ let watcherPid;
1933
+ try {
1934
+ watcherPid = await launchBackgroundHelper([watcherScript, "--cwd", cwd], {
1935
+ cwd,
1936
+ env: process.env,
1937
+ });
1938
+ }
1939
+ catch (error) {
1940
+ console.warn("[omx] warning: failed to launch hook-derived watcher", {
1941
+ cwd,
1942
+ error: error instanceof Error ? error.message : String(error),
1943
+ });
1944
+ return;
1945
+ }
1946
+ if (!watcherPid)
1947
+ return;
1948
+ await writeFile(pidPath, JSON.stringify({ pid: watcherPid, started_at: new Date().toISOString() }, null, 2)).catch((error) => {
1836
1949
  console.warn("[omx] warning: failed to write hook-derived watcher pid file", {
1837
1950
  path: pidPath,
1838
1951
  error: error instanceof Error ? error.message : String(error),
@@ -1900,9 +2013,11 @@ async function flushNotifyFallbackOnce(cwd, options = {}) {
1900
2013
  cwd,
1901
2014
  stdio: "ignore",
1902
2015
  timeout: 3000,
2016
+ windowsHide: true,
1903
2017
  env: buildNotifyFallbackWatcherEnv(process.env, {
1904
2018
  codexHomeOverride: options.codexHomeOverride,
1905
2019
  enableAuthority: options.enableAuthority === true,
2020
+ sessionId: options.sessionId,
1906
2021
  }),
1907
2022
  });
1908
2023
  }
@@ -1918,6 +2033,7 @@ async function flushHookDerivedWatcherOnce(cwd) {
1918
2033
  cwd,
1919
2034
  stdio: "ignore",
1920
2035
  timeout: 3000,
2036
+ windowsHide: true,
1921
2037
  env: {
1922
2038
  ...process.env,
1923
2039
  OMX_HOOK_DERIVED_SIGNALS: "1",