oh-my-codex 0.11.13 → 0.12.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 (377) hide show
  1. package/Cargo.lock +5 -5
  2. package/Cargo.toml +1 -1
  3. package/README.md +34 -17
  4. package/crates/omx-runtime/src/main.rs +6 -2
  5. package/dist/agents/native-config.js +1 -1
  6. package/dist/agents/native-config.js.map +1 -1
  7. package/dist/cli/__tests__/autoresearch-guided.test.js +74 -2
  8. package/dist/cli/__tests__/autoresearch-guided.test.js.map +1 -1
  9. package/dist/cli/__tests__/cleanup.test.js +37 -30
  10. package/dist/cli/__tests__/cleanup.test.js.map +1 -1
  11. package/dist/cli/__tests__/error-handling-warnings.test.js +3 -1
  12. package/dist/cli/__tests__/error-handling-warnings.test.js.map +1 -1
  13. package/dist/cli/__tests__/index.test.js +276 -5
  14. package/dist/cli/__tests__/index.test.js.map +1 -1
  15. package/dist/cli/__tests__/launch-fallback.test.js +95 -1
  16. package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
  17. package/dist/cli/__tests__/setup-refresh.test.js +49 -9
  18. package/dist/cli/__tests__/setup-refresh.test.js.map +1 -1
  19. package/dist/cli/__tests__/setup-scope.test.js +9 -0
  20. package/dist/cli/__tests__/setup-scope.test.js.map +1 -1
  21. package/dist/cli/__tests__/team.test.js +136 -11
  22. package/dist/cli/__tests__/team.test.js.map +1 -1
  23. package/dist/cli/__tests__/uninstall.test.js +10 -0
  24. package/dist/cli/__tests__/uninstall.test.js.map +1 -1
  25. package/dist/cli/__tests__/windows-popup-loop-contract.test.js +1 -0
  26. package/dist/cli/__tests__/windows-popup-loop-contract.test.js.map +1 -1
  27. package/dist/cli/autoresearch-guided.d.ts.map +1 -1
  28. package/dist/cli/autoresearch-guided.js +2 -1
  29. package/dist/cli/autoresearch-guided.js.map +1 -1
  30. package/dist/cli/autoresearch.d.ts.map +1 -1
  31. package/dist/cli/autoresearch.js +2 -1
  32. package/dist/cli/autoresearch.js.map +1 -1
  33. package/dist/cli/cleanup.d.ts.map +1 -1
  34. package/dist/cli/cleanup.js +10 -5
  35. package/dist/cli/cleanup.js.map +1 -1
  36. package/dist/cli/index.d.ts +21 -1
  37. package/dist/cli/index.d.ts.map +1 -1
  38. package/dist/cli/index.js +298 -36
  39. package/dist/cli/index.js.map +1 -1
  40. package/dist/cli/omx.js +2 -0
  41. package/dist/cli/omx.js.map +1 -1
  42. package/dist/cli/setup.d.ts +1 -0
  43. package/dist/cli/setup.d.ts.map +1 -1
  44. package/dist/cli/setup.js +41 -7
  45. package/dist/cli/setup.js.map +1 -1
  46. package/dist/cli/team.d.ts.map +1 -1
  47. package/dist/cli/team.js +16 -557
  48. package/dist/cli/team.js.map +1 -1
  49. package/dist/cli/uninstall.d.ts.map +1 -1
  50. package/dist/cli/uninstall.js +34 -9
  51. package/dist/cli/uninstall.js.map +1 -1
  52. package/dist/config/__tests__/generator-idempotent.test.js +79 -2
  53. package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
  54. package/dist/config/__tests__/generator-notify.test.js +2 -0
  55. package/dist/config/__tests__/generator-notify.test.js.map +1 -1
  56. package/dist/config/codex-hooks.d.ts +11 -0
  57. package/dist/config/codex-hooks.d.ts.map +1 -0
  58. package/dist/config/codex-hooks.js +50 -0
  59. package/dist/config/codex-hooks.js.map +1 -0
  60. package/dist/config/generator.d.ts +5 -3
  61. package/dist/config/generator.d.ts.map +1 -1
  62. package/dist/config/generator.js +24 -14
  63. package/dist/config/generator.js.map +1 -1
  64. package/dist/hooks/__tests__/debugger-log-recency-contract.test.d.ts +2 -0
  65. package/dist/hooks/__tests__/debugger-log-recency-contract.test.d.ts.map +1 -0
  66. package/dist/hooks/__tests__/debugger-log-recency-contract.test.js +20 -0
  67. package/dist/hooks/__tests__/debugger-log-recency-contract.test.js.map +1 -0
  68. package/dist/hooks/__tests__/keyword-detector.test.js +132 -0
  69. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  70. package/dist/hooks/__tests__/notify-fallback-watcher.test.js +292 -4
  71. package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
  72. package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js +86 -0
  73. package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js.map +1 -1
  74. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +40 -0
  75. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js.map +1 -1
  76. package/dist/hooks/__tests__/notify-hook-managed-tmux.test.d.ts +2 -0
  77. package/dist/hooks/__tests__/notify-hook-managed-tmux.test.d.ts.map +1 -0
  78. package/dist/hooks/__tests__/notify-hook-managed-tmux.test.js +54 -0
  79. package/dist/hooks/__tests__/notify-hook-managed-tmux.test.js.map +1 -0
  80. package/dist/hooks/__tests__/notify-hook-modules.test.js +31 -0
  81. package/dist/hooks/__tests__/notify-hook-modules.test.js.map +1 -1
  82. package/dist/hooks/__tests__/notify-hook-ralph-resume.test.js +51 -0
  83. package/dist/hooks/__tests__/notify-hook-ralph-resume.test.js.map +1 -1
  84. package/dist/hooks/__tests__/notify-hook-session-idle-dedupe.test.d.ts +2 -0
  85. package/dist/hooks/__tests__/notify-hook-session-idle-dedupe.test.d.ts.map +1 -0
  86. package/dist/hooks/__tests__/notify-hook-session-idle-dedupe.test.js +136 -0
  87. package/dist/hooks/__tests__/notify-hook-session-idle-dedupe.test.js.map +1 -0
  88. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +120 -0
  89. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -1
  90. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +145 -20
  91. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -1
  92. package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js +116 -0
  93. package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js.map +1 -1
  94. package/dist/hooks/__tests__/notify-hook-worker-idle.test.js +86 -0
  95. package/dist/hooks/__tests__/notify-hook-worker-idle.test.js.map +1 -1
  96. package/dist/hooks/__tests__/pre-context-gate-skills.test.js +1 -0
  97. package/dist/hooks/__tests__/pre-context-gate-skills.test.js.map +1 -1
  98. package/dist/hooks/extensibility/__tests__/runtime.test.js +49 -0
  99. package/dist/hooks/extensibility/__tests__/runtime.test.js.map +1 -1
  100. package/dist/hooks/extensibility/runtime.d.ts.map +1 -1
  101. package/dist/hooks/extensibility/runtime.js +10 -0
  102. package/dist/hooks/extensibility/runtime.js.map +1 -1
  103. package/dist/hooks/extensibility/types.d.ts +1 -1
  104. package/dist/hooks/extensibility/types.d.ts.map +1 -1
  105. package/dist/hooks/keyword-detector.d.ts +2 -0
  106. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  107. package/dist/hooks/keyword-detector.js +76 -4
  108. package/dist/hooks/keyword-detector.js.map +1 -1
  109. package/dist/hooks/prompt-guidance-contract.d.ts.map +1 -1
  110. package/dist/hooks/prompt-guidance-contract.js +12 -8
  111. package/dist/hooks/prompt-guidance-contract.js.map +1 -1
  112. package/dist/hooks/session.d.ts +5 -1
  113. package/dist/hooks/session.d.ts.map +1 -1
  114. package/dist/hooks/session.js +10 -6
  115. package/dist/hooks/session.js.map +1 -1
  116. package/dist/hud/index.d.ts.map +1 -1
  117. package/dist/hud/index.js +6 -1
  118. package/dist/hud/index.js.map +1 -1
  119. package/dist/mcp/__tests__/bootstrap.test.js +0 -3
  120. package/dist/mcp/__tests__/bootstrap.test.js.map +1 -1
  121. package/dist/mcp/__tests__/code-intel-server.test.js +27 -1
  122. package/dist/mcp/__tests__/code-intel-server.test.js.map +1 -1
  123. package/dist/mcp/__tests__/server-lifecycle.test.js +0 -5
  124. package/dist/mcp/__tests__/server-lifecycle.test.js.map +1 -1
  125. package/dist/mcp/bootstrap.d.ts +1 -1
  126. package/dist/mcp/bootstrap.d.ts.map +1 -1
  127. package/dist/mcp/bootstrap.js +0 -1
  128. package/dist/mcp/bootstrap.js.map +1 -1
  129. package/dist/mcp/code-intel-server.d.ts +20 -0
  130. package/dist/mcp/code-intel-server.d.ts.map +1 -1
  131. package/dist/mcp/code-intel-server.js +6 -5
  132. package/dist/mcp/code-intel-server.js.map +1 -1
  133. package/dist/notifications/__tests__/idle-cooldown.test.js +24 -1
  134. package/dist/notifications/__tests__/idle-cooldown.test.js.map +1 -1
  135. package/dist/notifications/__tests__/reply-listener.test.js +20 -1
  136. package/dist/notifications/__tests__/reply-listener.test.js.map +1 -1
  137. package/dist/notifications/__tests__/tmux.test.js +41 -0
  138. package/dist/notifications/__tests__/tmux.test.js.map +1 -1
  139. package/dist/notifications/idle-cooldown.d.ts +13 -0
  140. package/dist/notifications/idle-cooldown.d.ts.map +1 -1
  141. package/dist/notifications/idle-cooldown.js +50 -16
  142. package/dist/notifications/idle-cooldown.js.map +1 -1
  143. package/dist/notifications/reply-listener.d.ts.map +1 -1
  144. package/dist/notifications/reply-listener.js +2 -0
  145. package/dist/notifications/reply-listener.js.map +1 -1
  146. package/dist/notifications/tmux.d.ts.map +1 -1
  147. package/dist/notifications/tmux.js +4 -0
  148. package/dist/notifications/tmux.js.map +1 -1
  149. package/dist/scripts/__tests__/codex-native-hook.test.d.ts +2 -0
  150. package/dist/scripts/__tests__/codex-native-hook.test.d.ts.map +1 -0
  151. package/dist/scripts/__tests__/codex-native-hook.test.js +1050 -0
  152. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -0
  153. package/dist/scripts/codex-native-hook.d.ts +22 -0
  154. package/dist/scripts/codex-native-hook.d.ts.map +1 -0
  155. package/dist/scripts/codex-native-hook.js +792 -0
  156. package/dist/scripts/codex-native-hook.js.map +1 -0
  157. package/dist/scripts/codex-native-pre-post.d.ts +26 -0
  158. package/dist/scripts/codex-native-pre-post.d.ts.map +1 -0
  159. package/dist/scripts/codex-native-pre-post.js +118 -0
  160. package/dist/scripts/codex-native-pre-post.js.map +1 -0
  161. package/dist/scripts/notify-fallback-watcher.js +322 -21
  162. package/dist/scripts/notify-fallback-watcher.js.map +1 -1
  163. package/dist/scripts/notify-hook/auto-nudge.d.ts.map +1 -1
  164. package/dist/scripts/notify-hook/auto-nudge.js +5 -6
  165. package/dist/scripts/notify-hook/auto-nudge.js.map +1 -1
  166. package/dist/scripts/notify-hook/log.d.ts +2 -2
  167. package/dist/scripts/notify-hook/log.d.ts.map +1 -1
  168. package/dist/scripts/notify-hook/log.js +10 -2
  169. package/dist/scripts/notify-hook/log.js.map +1 -1
  170. package/dist/scripts/notify-hook/managed-tmux.d.ts.map +1 -1
  171. package/dist/scripts/notify-hook/managed-tmux.js +2 -0
  172. package/dist/scripts/notify-hook/managed-tmux.js.map +1 -1
  173. package/dist/scripts/notify-hook/orchestration-intent.d.ts +18 -0
  174. package/dist/scripts/notify-hook/orchestration-intent.d.ts.map +1 -0
  175. package/dist/scripts/notify-hook/orchestration-intent.js +72 -0
  176. package/dist/scripts/notify-hook/orchestration-intent.js.map +1 -0
  177. package/dist/scripts/notify-hook/process-runner.js.map +1 -1
  178. package/dist/scripts/notify-hook/ralph-session-resume.d.ts.map +1 -1
  179. package/dist/scripts/notify-hook/ralph-session-resume.js +7 -0
  180. package/dist/scripts/notify-hook/ralph-session-resume.js.map +1 -1
  181. package/dist/scripts/notify-hook/team-dispatch.d.ts +15 -6
  182. package/dist/scripts/notify-hook/team-dispatch.d.ts.map +1 -1
  183. package/dist/scripts/notify-hook/team-dispatch.js +125 -6
  184. package/dist/scripts/notify-hook/team-dispatch.js.map +1 -1
  185. package/dist/scripts/notify-hook/team-leader-nudge.d.ts +3 -2
  186. package/dist/scripts/notify-hook/team-leader-nudge.d.ts.map +1 -1
  187. package/dist/scripts/notify-hook/team-leader-nudge.js +165 -37
  188. package/dist/scripts/notify-hook/team-leader-nudge.js.map +1 -1
  189. package/dist/scripts/notify-hook/team-tmux-guard.d.ts +4 -1
  190. package/dist/scripts/notify-hook/team-tmux-guard.d.ts.map +1 -1
  191. package/dist/scripts/notify-hook/team-tmux-guard.js +33 -44
  192. package/dist/scripts/notify-hook/team-tmux-guard.js.map +1 -1
  193. package/dist/scripts/notify-hook/team-worker.d.ts.map +1 -1
  194. package/dist/scripts/notify-hook/team-worker.js +68 -5
  195. package/dist/scripts/notify-hook/team-worker.js.map +1 -1
  196. package/dist/scripts/notify-hook/utils.d.ts +1 -1
  197. package/dist/scripts/notify-hook/utils.d.ts.map +1 -1
  198. package/dist/scripts/notify-hook/utils.js.map +1 -1
  199. package/dist/scripts/notify-hook.js +55 -32
  200. package/dist/scripts/notify-hook.js.map +1 -1
  201. package/dist/team/__tests__/api-interop.test.js +344 -18
  202. package/dist/team/__tests__/api-interop.test.js.map +1 -1
  203. package/dist/team/__tests__/delivery-e2e-smoke.test.d.ts +2 -0
  204. package/dist/team/__tests__/delivery-e2e-smoke.test.d.ts.map +1 -0
  205. package/dist/team/__tests__/delivery-e2e-smoke.test.js +671 -0
  206. package/dist/team/__tests__/delivery-e2e-smoke.test.js.map +1 -0
  207. package/dist/team/__tests__/mcp-comm.test.js +5 -0
  208. package/dist/team/__tests__/mcp-comm.test.js.map +1 -1
  209. package/dist/team/__tests__/runtime.test.js +543 -15
  210. package/dist/team/__tests__/runtime.test.js.map +1 -1
  211. package/dist/team/__tests__/state.test.js +133 -8
  212. package/dist/team/__tests__/state.test.js.map +1 -1
  213. package/dist/team/__tests__/team-ops-contract.test.js +4 -0
  214. package/dist/team/__tests__/team-ops-contract.test.js.map +1 -1
  215. package/dist/team/__tests__/tmux-session.test.js +160 -0
  216. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  217. package/dist/team/__tests__/worker-bootstrap.test.js +19 -1
  218. package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -1
  219. package/dist/team/api-interop.d.ts.map +1 -1
  220. package/dist/team/api-interop.js +95 -23
  221. package/dist/team/api-interop.js.map +1 -1
  222. package/dist/team/contracts.d.ts +11 -1
  223. package/dist/team/contracts.d.ts.map +1 -1
  224. package/dist/team/contracts.js +29 -0
  225. package/dist/team/contracts.js.map +1 -1
  226. package/dist/team/delivery-log.d.ts +14 -0
  227. package/dist/team/delivery-log.d.ts.map +1 -0
  228. package/dist/team/delivery-log.js +35 -0
  229. package/dist/team/delivery-log.js.map +1 -0
  230. package/dist/team/idle-nudge.d.ts +2 -2
  231. package/dist/team/idle-nudge.js +2 -2
  232. package/dist/team/mcp-comm.d.ts +4 -0
  233. package/dist/team/mcp-comm.d.ts.map +1 -1
  234. package/dist/team/mcp-comm.js +84 -1
  235. package/dist/team/mcp-comm.js.map +1 -1
  236. package/dist/team/pane-status.d.ts +149 -0
  237. package/dist/team/pane-status.d.ts.map +1 -0
  238. package/dist/team/pane-status.js +558 -0
  239. package/dist/team/pane-status.js.map +1 -0
  240. package/dist/team/reminder-intents.d.ts +11 -0
  241. package/dist/team/reminder-intents.d.ts.map +1 -0
  242. package/dist/team/reminder-intents.js +40 -0
  243. package/dist/team/reminder-intents.js.map +1 -0
  244. package/dist/team/runtime-cli.d.ts +1 -1
  245. package/dist/team/runtime-cli.js +2 -2
  246. package/dist/team/runtime-cli.js.map +1 -1
  247. package/dist/team/runtime.d.ts +2 -1
  248. package/dist/team/runtime.d.ts.map +1 -1
  249. package/dist/team/runtime.js +409 -191
  250. package/dist/team/runtime.js.map +1 -1
  251. package/dist/team/scaling.d.ts.map +1 -1
  252. package/dist/team/scaling.js +6 -5
  253. package/dist/team/scaling.js.map +1 -1
  254. package/dist/team/state/dispatch.d.ts +4 -1
  255. package/dist/team/state/dispatch.d.ts.map +1 -1
  256. package/dist/team/state/dispatch.js +59 -18
  257. package/dist/team/state/dispatch.js.map +1 -1
  258. package/dist/team/state/mailbox.d.ts.map +1 -1
  259. package/dist/team/state/mailbox.js +45 -2
  260. package/dist/team/state/mailbox.js.map +1 -1
  261. package/dist/team/state/monitor.d.ts +2 -1
  262. package/dist/team/state/monitor.d.ts.map +1 -1
  263. package/dist/team/state/monitor.js +30 -1
  264. package/dist/team/state/monitor.js.map +1 -1
  265. package/dist/team/state/types.d.ts +5 -2
  266. package/dist/team/state/types.d.ts.map +1 -1
  267. package/dist/team/state/types.js.map +1 -1
  268. package/dist/team/state.d.ts +30 -3
  269. package/dist/team/state.d.ts.map +1 -1
  270. package/dist/team/state.js +170 -2
  271. package/dist/team/state.js.map +1 -1
  272. package/dist/team/team-ops.d.ts +5 -1
  273. package/dist/team/team-ops.d.ts.map +1 -1
  274. package/dist/team/team-ops.js +4 -0
  275. package/dist/team/team-ops.js.map +1 -1
  276. package/dist/team/tmux-session.d.ts +2 -0
  277. package/dist/team/tmux-session.d.ts.map +1 -1
  278. package/dist/team/tmux-session.js +19 -3
  279. package/dist/team/tmux-session.js.map +1 -1
  280. package/dist/team/worker-bootstrap.d.ts +4 -0
  281. package/dist/team/worker-bootstrap.d.ts.map +1 -1
  282. package/dist/team/worker-bootstrap.js +33 -6
  283. package/dist/team/worker-bootstrap.js.map +1 -1
  284. package/dist/utils/__tests__/paths.test.js +63 -1
  285. package/dist/utils/__tests__/paths.test.js.map +1 -1
  286. package/dist/utils/__tests__/platform-command.test.js +50 -4
  287. package/dist/utils/__tests__/platform-command.test.js.map +1 -1
  288. package/dist/utils/paths.d.ts +12 -0
  289. package/dist/utils/paths.d.ts.map +1 -1
  290. package/dist/utils/paths.js +44 -2
  291. package/dist/utils/paths.js.map +1 -1
  292. package/dist/utils/platform-command.d.ts.map +1 -1
  293. package/dist/utils/platform-command.js +13 -5
  294. package/dist/utils/platform-command.js.map +1 -1
  295. package/dist/utils/sleep.d.ts.map +1 -1
  296. package/dist/utils/sleep.js +10 -1
  297. package/dist/utils/sleep.js.map +1 -1
  298. package/package.json +1 -1
  299. package/prompts/analyst.md +2 -2
  300. package/prompts/api-reviewer.md +2 -2
  301. package/prompts/architect.md +2 -2
  302. package/prompts/build-fixer.md +2 -2
  303. package/prompts/code-reviewer.md +2 -2
  304. package/prompts/code-simplifier.md +1 -1
  305. package/prompts/critic.md +2 -2
  306. package/prompts/debugger.md +3 -2
  307. package/prompts/dependency-expert.md +2 -2
  308. package/prompts/designer.md +2 -2
  309. package/prompts/executor.md +3 -2
  310. package/prompts/explore.md +2 -2
  311. package/prompts/git-master.md +2 -2
  312. package/prompts/information-architect.md +15 -102
  313. package/prompts/performance-reviewer.md +2 -2
  314. package/prompts/planner.md +3 -2
  315. package/prompts/product-analyst.md +2 -2
  316. package/prompts/product-manager.md +2 -2
  317. package/prompts/qa-tester.md +2 -2
  318. package/prompts/quality-reviewer.md +2 -2
  319. package/prompts/quality-strategist.md +2 -2
  320. package/prompts/researcher.md +2 -2
  321. package/prompts/security-reviewer.md +2 -2
  322. package/prompts/sisyphus-lite.md +2 -2
  323. package/prompts/style-reviewer.md +2 -2
  324. package/prompts/team-executor.md +2 -2
  325. package/prompts/test-engineer.md +2 -2
  326. package/prompts/ux-researcher.md +2 -2
  327. package/prompts/verifier.md +3 -2
  328. package/prompts/vision.md +2 -2
  329. package/prompts/writer.md +2 -2
  330. package/skills/team/SKILL.md +18 -33
  331. package/src/scripts/__tests__/codex-native-hook.test.ts +1346 -0
  332. package/src/scripts/codex-native-hook.ts +983 -0
  333. package/src/scripts/codex-native-pre-post.ts +161 -0
  334. package/src/scripts/notify-fallback-watcher.ts +378 -29
  335. package/src/scripts/notify-hook/auto-nudge.ts +5 -10
  336. package/src/scripts/notify-hook/log.ts +18 -4
  337. package/src/scripts/notify-hook/managed-tmux.ts +1 -0
  338. package/src/scripts/notify-hook/orchestration-intent.ts +82 -0
  339. package/src/scripts/notify-hook/process-runner.ts +4 -4
  340. package/src/scripts/notify-hook/ralph-session-resume.ts +9 -0
  341. package/src/scripts/notify-hook/team-dispatch.ts +134 -6
  342. package/src/scripts/notify-hook/team-leader-nudge.ts +183 -37
  343. package/src/scripts/notify-hook/team-tmux-guard.ts +35 -43
  344. package/src/scripts/notify-hook/team-worker.ts +73 -4
  345. package/src/scripts/notify-hook/utils.ts +1 -1
  346. package/src/scripts/notify-hook.ts +64 -32
  347. package/templates/AGENTS.md +21 -11
  348. package/README.de.md +0 -263
  349. package/README.el.md +0 -223
  350. package/README.es.md +0 -263
  351. package/README.fr.md +0 -263
  352. package/README.it.md +0 -263
  353. package/README.ja.md +0 -264
  354. package/README.ko.md +0 -264
  355. package/README.pl.md +0 -216
  356. package/README.pt.md +0 -263
  357. package/README.ru.md +0 -263
  358. package/README.tr.md +0 -263
  359. package/README.vi.md +0 -223
  360. package/README.zh-TW.md +0 -293
  361. package/README.zh.md +0 -264
  362. package/dist/mcp/__tests__/team-server-cleanup.test.d.ts +0 -2
  363. package/dist/mcp/__tests__/team-server-cleanup.test.d.ts.map +0 -1
  364. package/dist/mcp/__tests__/team-server-cleanup.test.js +0 -219
  365. package/dist/mcp/__tests__/team-server-cleanup.test.js.map +0 -1
  366. package/dist/mcp/__tests__/team-server-runtime-deps.test.d.ts +0 -2
  367. package/dist/mcp/__tests__/team-server-runtime-deps.test.d.ts.map +0 -1
  368. package/dist/mcp/__tests__/team-server-runtime-deps.test.js +0 -13
  369. package/dist/mcp/__tests__/team-server-runtime-deps.test.js.map +0 -1
  370. package/dist/mcp/__tests__/team-server-wait.test.d.ts +0 -2
  371. package/dist/mcp/__tests__/team-server-wait.test.d.ts.map +0 -1
  372. package/dist/mcp/__tests__/team-server-wait.test.js +0 -155
  373. package/dist/mcp/__tests__/team-server-wait.test.js.map +0 -1
  374. package/dist/mcp/team-server.d.ts +0 -24
  375. package/dist/mcp/team-server.d.ts.map +0 -1
  376. package/dist/mcp/team-server.js +0 -482
  377. package/dist/mcp/team-server.js.map +0 -1
package/dist/cli/team.js CHANGED
@@ -12,8 +12,9 @@ import { routeTaskToRole } from '../team/role-router.js';
12
12
  import { allocateTasksToWorkers } from '../team/allocation-policy.js';
13
13
  import { buildFollowupStaffingPlan, resolveAvailableAgentTypes, } from '../team/followup-planner.js';
14
14
  import { TEAM_API_OPERATIONS, resolveTeamApiOperation, executeTeamApiOperation, } from '../team/api-interop.js';
15
- import { teamReadConfig as readTeamConfig, teamReadTaskApproval as readTaskApproval } from '../team/team-ops.js';
15
+ import { teamReadConfig as readTeamConfig, teamReadPhase as readTeamPhase } from '../team/team-ops.js';
16
16
  import { recordLeaderRuntimeActivity } from '../team/leader-activity.js';
17
+ import { readTeamPaneStatus } from '../team/pane-status.js';
17
18
  function readPersistedTeamFollowupState(cwd) {
18
19
  const path = join(cwd, '.omx', 'state', 'team-state.json');
19
20
  if (!existsSync(path))
@@ -67,6 +68,9 @@ const MIN_WORKER_COUNT = 1;
67
68
  const DEFAULT_SPARKSHELL_TAIL_LINES = 400;
68
69
  const MIN_SPARKSHELL_TAIL_LINES = 100;
69
70
  const MAX_SPARKSHELL_TAIL_LINES = 1000;
71
+ function isTerminalModePhase(phase) {
72
+ return ['complete', 'failed', 'cancelled'].includes(phase);
73
+ }
70
74
  const TEAM_HELP = `
71
75
  Usage: omx team [N:agent-type] "<task description>"
72
76
  omx team status <team-name> [--json] [--tail-lines <100-1000>]
@@ -349,560 +353,6 @@ function buildDeadWorkerAwaitEvent(teamName, snapshot) {
349
353
  source_type: 'await_snapshot',
350
354
  };
351
355
  }
352
- async function readTeamPaneStatus(config, cwd = process.cwd(), snapshot, tailLines = DEFAULT_SPARKSHELL_TAIL_LINES) {
353
- if (!config) {
354
- return {
355
- leader_pane_id: null,
356
- hud_pane_id: null,
357
- worker_panes: {},
358
- sparkshell_hint: null,
359
- sparkshell_commands: {},
360
- recommended_inspect_targets: [],
361
- recommended_inspect_reasons: {},
362
- recommended_inspect_clis: {},
363
- recommended_inspect_roles: {},
364
- recommended_inspect_indexes: {},
365
- recommended_inspect_alive: {},
366
- recommended_inspect_turn_counts: {},
367
- recommended_inspect_turns_without_progress: {},
368
- recommended_inspect_last_turn_at: {},
369
- recommended_inspect_status_updated_at: {},
370
- recommended_inspect_pids: {},
371
- recommended_inspect_worktree_paths: {},
372
- recommended_inspect_worktree_repo_roots: {},
373
- recommended_inspect_worktree_branches: {},
374
- recommended_inspect_worktree_detached: {},
375
- recommended_inspect_worktree_created: {},
376
- recommended_inspect_team_state_roots: {},
377
- recommended_inspect_workdirs: {},
378
- recommended_inspect_assigned_tasks: {},
379
- recommended_inspect_task_statuses: {},
380
- recommended_inspect_task_results: {},
381
- recommended_inspect_task_errors: {},
382
- recommended_inspect_task_versions: {},
383
- recommended_inspect_task_created_at: {},
384
- recommended_inspect_task_completed_at: {},
385
- recommended_inspect_task_depends_on: {},
386
- recommended_inspect_task_claim_present: {},
387
- recommended_inspect_task_claim_owners: {},
388
- recommended_inspect_task_claim_tokens: {},
389
- recommended_inspect_task_claim_leases: {},
390
- recommended_inspect_task_claim_lock_paths: {},
391
- recommended_inspect_approval_required: {},
392
- recommended_inspect_requires_code_change: {},
393
- recommended_inspect_descriptions: {},
394
- recommended_inspect_blocked_by: {},
395
- recommended_inspect_task_roles: {},
396
- recommended_inspect_task_owners: {},
397
- recommended_inspect_approval_statuses: {},
398
- recommended_inspect_approval_reviewers: {},
399
- recommended_inspect_approval_reasons: {},
400
- recommended_inspect_approval_decided_at: {},
401
- recommended_inspect_approval_record_present: {},
402
- recommended_inspect_states: {},
403
- recommended_inspect_state_reasons: {},
404
- recommended_inspect_tasks: {},
405
- recommended_inspect_subjects: {},
406
- recommended_inspect_task_paths: {},
407
- recommended_inspect_approval_paths: {},
408
- recommended_inspect_worker_state_dirs: {},
409
- recommended_inspect_worker_status_paths: {},
410
- recommended_inspect_worker_heartbeat_paths: {},
411
- recommended_inspect_worker_identity_paths: {},
412
- recommended_inspect_worker_inbox_paths: {},
413
- recommended_inspect_worker_mailbox_paths: {},
414
- recommended_inspect_worker_shutdown_request_paths: {},
415
- recommended_inspect_worker_shutdown_ack_paths: {},
416
- recommended_inspect_team_dir_paths: {},
417
- recommended_inspect_team_config_paths: {},
418
- recommended_inspect_team_manifest_paths: {},
419
- recommended_inspect_team_events_paths: {},
420
- recommended_inspect_team_dispatch_paths: {},
421
- recommended_inspect_team_phase_paths: {},
422
- recommended_inspect_team_monitor_snapshot_paths: {},
423
- recommended_inspect_team_summary_snapshot_paths: {},
424
- recommended_inspect_panes: {},
425
- recommended_inspect_command: null,
426
- recommended_inspect_commands: [],
427
- recommended_inspect_summary: null,
428
- recommended_inspect_items: [],
429
- };
430
- }
431
- const leaderPaneId = config.leader_pane_id?.trim() || null;
432
- const hudPaneId = config.hud_pane_id?.trim() || null;
433
- const workerPanes = Object.fromEntries(config.workers
434
- .map((worker) => {
435
- const paneId = worker.pane_id?.trim();
436
- return paneId ? [worker.name, paneId] : null;
437
- })
438
- .filter((entry) => entry !== null));
439
- const sparkshellCommands = Object.fromEntries([
440
- leaderPaneId ? ['leader', `omx sparkshell --tmux-pane ${leaderPaneId} --tail-lines ${tailLines}`] : null,
441
- hudPaneId ? ['hud', `omx sparkshell --tmux-pane ${hudPaneId} --tail-lines ${tailLines}`] : null,
442
- ...Object.entries(workerPanes).map(([workerName, paneId]) => [
443
- workerName,
444
- `omx sparkshell --tmux-pane ${paneId} --tail-lines ${tailLines}`,
445
- ]),
446
- ].filter((entry) => entry !== null));
447
- const recommendedInspectTargets = [
448
- ...(snapshot?.deadWorkers ?? []),
449
- ...(snapshot?.nonReportingWorkers ?? []),
450
- ].filter((workerName, index, values) => (Object.hasOwn(workerPanes, workerName) && values.indexOf(workerName) === index));
451
- const recommendedInspectReasons = Object.fromEntries(recommendedInspectTargets.map((target) => [
452
- target,
453
- (snapshot?.deadWorkers ?? []).includes(target) ? 'dead_worker' : 'non_reporting_worker',
454
- ]));
455
- const recommendedInspectClis = Object.fromEntries(recommendedInspectTargets.map((target) => {
456
- const worker = config.workers.find((candidate) => candidate.name === target);
457
- return [target, worker?.worker_cli ?? null];
458
- }));
459
- const recommendedInspectRoles = Object.fromEntries(recommendedInspectTargets.map((target) => {
460
- const worker = config.workers.find((candidate) => candidate.name === target);
461
- return [target, worker?.role ?? null];
462
- }));
463
- const recommendedInspectIndexes = Object.fromEntries(recommendedInspectTargets.map((target) => {
464
- const worker = config.workers.find((candidate) => candidate.name === target);
465
- return [target, worker?.index ?? null];
466
- }));
467
- const recommendedInspectAlive = Object.fromEntries(recommendedInspectTargets.map((target) => {
468
- const worker = snapshot?.workers.find((candidate) => candidate.name === target);
469
- return [target, worker?.alive ?? null];
470
- }));
471
- const recommendedInspectTurnCounts = Object.fromEntries(recommendedInspectTargets.map((target) => {
472
- const worker = snapshot?.workers.find((candidate) => candidate.name === target);
473
- return [target, worker?.heartbeat?.turn_count ?? null];
474
- }));
475
- const recommendedInspectTurnsWithoutProgress = Object.fromEntries(recommendedInspectTargets.map((target) => {
476
- const worker = snapshot?.workers.find((candidate) => candidate.name === target);
477
- return [target, worker?.turnsWithoutProgress ?? null];
478
- }));
479
- const recommendedInspectLastTurnAt = Object.fromEntries(recommendedInspectTargets.map((target) => {
480
- const worker = snapshot?.workers.find((candidate) => candidate.name === target);
481
- return [target, worker?.heartbeat?.last_turn_at ?? null];
482
- }));
483
- const recommendedInspectStatusUpdatedAt = Object.fromEntries(recommendedInspectTargets.map((target) => {
484
- const worker = snapshot?.workers.find((candidate) => candidate.name === target);
485
- return [target, worker?.status.updated_at ?? null];
486
- }));
487
- const recommendedInspectPids = Object.fromEntries(recommendedInspectTargets.map((target) => {
488
- const worker = config.workers.find((candidate) => candidate.name === target);
489
- return [target, worker?.pid ?? null];
490
- }));
491
- const recommendedInspectWorktreePaths = Object.fromEntries(recommendedInspectTargets.map((target) => {
492
- const worker = config.workers.find((candidate) => candidate.name === target);
493
- return [target, worker?.worktree_path ?? null];
494
- }));
495
- const recommendedInspectWorktreeRepoRoots = Object.fromEntries(recommendedInspectTargets.map((target) => {
496
- const worker = config.workers.find((candidate) => candidate.name === target);
497
- return [target, worker?.worktree_repo_root ?? null];
498
- }));
499
- const recommendedInspectWorktreeBranches = Object.fromEntries(recommendedInspectTargets.map((target) => {
500
- const worker = config.workers.find((candidate) => candidate.name === target);
501
- return [target, worker?.worktree_branch ?? null];
502
- }));
503
- const recommendedInspectWorktreeDetached = Object.fromEntries(recommendedInspectTargets.map((target) => {
504
- const worker = config.workers.find((candidate) => candidate.name === target);
505
- return [target, worker?.worktree_detached ?? null];
506
- }));
507
- const recommendedInspectWorktreeCreated = Object.fromEntries(recommendedInspectTargets.map((target) => {
508
- const worker = config.workers.find((candidate) => candidate.name === target);
509
- return [target, worker?.worktree_created ?? null];
510
- }));
511
- const recommendedInspectTeamStateRoots = Object.fromEntries(recommendedInspectTargets.map((target) => {
512
- const worker = config.workers.find((candidate) => candidate.name === target);
513
- return [target, worker?.team_state_root ?? null];
514
- }));
515
- const recommendedInspectWorkdirs = Object.fromEntries(recommendedInspectTargets.map((target) => {
516
- const worker = config.workers.find((candidate) => candidate.name === target);
517
- return [target, worker?.working_dir ?? worker?.worktree_path ?? null];
518
- }));
519
- const recommendedInspectAssignedTasks = Object.fromEntries(recommendedInspectTargets.map((target) => {
520
- const worker = config.workers.find((candidate) => candidate.name === target);
521
- return [target, worker?.assigned_tasks ?? []];
522
- }));
523
- const recommendedInspectTasks = Object.fromEntries(recommendedInspectTargets.map((target) => {
524
- const worker = snapshot?.workers.find((candidate) => candidate.name === target);
525
- return [target, worker?.status.current_task_id ?? null];
526
- }));
527
- const taskStatusById = new Map((snapshot?.tasks.items ?? []).map((task) => [task.id, task.status]));
528
- const taskResultById = new Map((snapshot?.tasks.items ?? []).map((task) => [task.id, task.result ?? null]));
529
- const taskErrorById = new Map((snapshot?.tasks.items ?? []).map((task) => [task.id, task.error ?? null]));
530
- const taskVersionById = new Map((snapshot?.tasks.items ?? []).map((task) => [task.id, task.version ?? null]));
531
- const taskCreatedAtById = new Map((snapshot?.tasks.items ?? []).map((task) => [task.id, task.created_at ?? null]));
532
- const taskCompletedAtById = new Map((snapshot?.tasks.items ?? []).map((task) => [task.id, task.completed_at ?? null]));
533
- const taskDependsOnById = new Map((snapshot?.tasks.items ?? []).map((task) => [task.id, task.depends_on ?? task.blocked_by ?? []]));
534
- const taskClaimPresentById = new Map((snapshot?.tasks.items ?? []).map((task) => [task.id, task.claim != null]));
535
- const taskClaimOwnerById = new Map((snapshot?.tasks.items ?? []).map((task) => [task.id, task.claim?.owner ?? null]));
536
- const taskClaimTokenById = new Map((snapshot?.tasks.items ?? []).map((task) => [task.id, task.claim?.token ?? null]));
537
- const taskClaimLeaseById = new Map((snapshot?.tasks.items ?? []).map((task) => [task.id, task.claim?.leased_until ?? null]));
538
- const taskRequiresCodeChangeById = new Map((snapshot?.tasks.items ?? []).map((task) => [task.id, task.requires_code_change ?? null]));
539
- const recommendedInspectTaskStatuses = Object.fromEntries(recommendedInspectTargets.map((target) => {
540
- const taskId = recommendedInspectTasks[target];
541
- return [target, taskId ? (taskStatusById.get(taskId) ?? null) : null];
542
- }));
543
- const recommendedInspectTaskResults = Object.fromEntries(recommendedInspectTargets.map((target) => {
544
- const taskId = recommendedInspectTasks[target];
545
- return [target, taskId ? (taskResultById.get(taskId) ?? null) : null];
546
- }));
547
- const recommendedInspectTaskErrors = Object.fromEntries(recommendedInspectTargets.map((target) => {
548
- const taskId = recommendedInspectTasks[target];
549
- return [target, taskId ? (taskErrorById.get(taskId) ?? null) : null];
550
- }));
551
- const recommendedInspectTaskVersions = Object.fromEntries(recommendedInspectTargets.map((target) => {
552
- const taskId = recommendedInspectTasks[target];
553
- return [target, taskId ? (taskVersionById.get(taskId) ?? null) : null];
554
- }));
555
- const recommendedInspectTaskCreatedAt = Object.fromEntries(recommendedInspectTargets.map((target) => {
556
- const taskId = recommendedInspectTasks[target];
557
- return [target, taskId ? (taskCreatedAtById.get(taskId) ?? null) : null];
558
- }));
559
- const recommendedInspectTaskCompletedAt = Object.fromEntries(recommendedInspectTargets.map((target) => {
560
- const taskId = recommendedInspectTasks[target];
561
- return [target, taskId ? (taskCompletedAtById.get(taskId) ?? null) : null];
562
- }));
563
- const recommendedInspectTaskDependsOn = Object.fromEntries(recommendedInspectTargets.map((target) => {
564
- const taskId = recommendedInspectTasks[target];
565
- return [target, taskId ? (taskDependsOnById.get(taskId) ?? []) : []];
566
- }));
567
- const recommendedInspectTaskClaimPresent = Object.fromEntries(recommendedInspectTargets.map((target) => {
568
- const taskId = recommendedInspectTasks[target];
569
- return [target, taskId ? (taskClaimPresentById.get(taskId) ?? null) : null];
570
- }));
571
- const recommendedInspectTaskClaimOwners = Object.fromEntries(recommendedInspectTargets.map((target) => {
572
- const taskId = recommendedInspectTasks[target];
573
- return [target, taskId ? (taskClaimOwnerById.get(taskId) ?? null) : null];
574
- }));
575
- const recommendedInspectTaskClaimTokens = Object.fromEntries(recommendedInspectTargets.map((target) => {
576
- const taskId = recommendedInspectTasks[target];
577
- return [target, taskId ? (taskClaimTokenById.get(taskId) ?? null) : null];
578
- }));
579
- const recommendedInspectTaskClaimLeases = Object.fromEntries(recommendedInspectTargets.map((target) => {
580
- const taskId = recommendedInspectTasks[target];
581
- return [target, taskId ? (taskClaimLeaseById.get(taskId) ?? null) : null];
582
- }));
583
- const recommendedInspectTaskClaimLockPaths = Object.fromEntries(recommendedInspectTargets.map((target) => {
584
- const taskId = recommendedInspectTasks[target];
585
- return [target, taskId && snapshot?.teamName ? join(cwd, '.omx', 'state', 'team', snapshot.teamName, 'claims', `task-${taskId}.lock`) : null];
586
- }));
587
- const recommendedInspectRequiresCodeChange = Object.fromEntries(recommendedInspectTargets.map((target) => {
588
- const taskId = recommendedInspectTasks[target];
589
- return [target, taskId ? (taskRequiresCodeChangeById.get(taskId) ?? null) : null];
590
- }));
591
- const taskDescriptionById = new Map((snapshot?.tasks.items ?? []).map((task) => [task.id, task.description]));
592
- const recommendedInspectDescriptions = Object.fromEntries(recommendedInspectTargets.map((target) => {
593
- const taskId = recommendedInspectTasks[target];
594
- return [target, taskId ? (taskDescriptionById.get(taskId) ?? null) : null];
595
- }));
596
- const taskBlockedById = new Map((snapshot?.tasks.items ?? []).map((task) => [task.id, task.blocked_by ?? []]));
597
- const recommendedInspectBlockedBy = Object.fromEntries(recommendedInspectTargets.map((target) => {
598
- const taskId = recommendedInspectTasks[target];
599
- return [target, taskId ? (taskBlockedById.get(taskId) ?? []) : []];
600
- }));
601
- const taskRoleById = new Map((snapshot?.tasks.items ?? []).map((task) => [task.id, task.role ?? null]));
602
- const recommendedInspectTaskRoles = Object.fromEntries(recommendedInspectTargets.map((target) => {
603
- const taskId = recommendedInspectTasks[target];
604
- return [target, taskId ? (taskRoleById.get(taskId) ?? null) : null];
605
- }));
606
- const taskOwnerById = new Map((snapshot?.tasks.items ?? []).map((task) => [task.id, task.owner ?? null]));
607
- const recommendedInspectTaskOwners = Object.fromEntries(recommendedInspectTargets.map((target) => {
608
- const taskId = recommendedInspectTasks[target];
609
- return [target, taskId ? (taskOwnerById.get(taskId) ?? null) : null];
610
- }));
611
- const approvalRecordByTaskId = new Map();
612
- for (const taskId of new Set(Object.values(recommendedInspectTasks).filter((value) => typeof value === 'string' && value.length > 0))) {
613
- approvalRecordByTaskId.set(taskId, snapshot?.teamName ? await readTaskApproval(snapshot.teamName, taskId, cwd) : null);
614
- }
615
- const recommendedInspectApprovalStatuses = Object.fromEntries(recommendedInspectTargets.map((target) => {
616
- const taskId = recommendedInspectTasks[target];
617
- return [target, taskId ? (approvalRecordByTaskId.get(taskId)?.status ?? null) : null];
618
- }));
619
- const recommendedInspectApprovalRequired = Object.fromEntries(recommendedInspectTargets.map((target) => {
620
- const taskId = recommendedInspectTasks[target];
621
- return [target, taskId ? (approvalRecordByTaskId.get(taskId)?.required ?? null) : null];
622
- }));
623
- const recommendedInspectApprovalReviewers = Object.fromEntries(recommendedInspectTargets.map((target) => {
624
- const taskId = recommendedInspectTasks[target];
625
- return [target, taskId ? (approvalRecordByTaskId.get(taskId)?.reviewer ?? null) : null];
626
- }));
627
- const recommendedInspectApprovalReasons = Object.fromEntries(recommendedInspectTargets.map((target) => {
628
- const taskId = recommendedInspectTasks[target];
629
- return [target, taskId ? (approvalRecordByTaskId.get(taskId)?.decision_reason ?? null) : null];
630
- }));
631
- const recommendedInspectApprovalDecidedAt = Object.fromEntries(recommendedInspectTargets.map((target) => {
632
- const taskId = recommendedInspectTasks[target];
633
- return [target, taskId ? (approvalRecordByTaskId.get(taskId)?.decided_at ?? null) : null];
634
- }));
635
- const recommendedInspectApprovalRecordPresent = Object.fromEntries(recommendedInspectTargets.map((target) => {
636
- const taskId = recommendedInspectTasks[target];
637
- return [target, taskId ? approvalRecordByTaskId.get(taskId) !== null : null];
638
- }));
639
- const recommendedInspectPanes = Object.fromEntries(recommendedInspectTargets.map((target) => [target, workerPanes[target] ?? null]));
640
- const taskSubjectById = new Map((snapshot?.tasks.items ?? []).map((task) => [task.id, task.subject]));
641
- const recommendedInspectSubjects = Object.fromEntries(recommendedInspectTargets.map((target) => {
642
- const taskId = recommendedInspectTasks[target];
643
- return [target, taskId ? (taskSubjectById.get(taskId) ?? null) : null];
644
- }));
645
- const recommendedInspectTaskPaths = Object.fromEntries(recommendedInspectTargets.map((target) => {
646
- const taskId = recommendedInspectTasks[target];
647
- return [target, taskId && snapshot?.teamName ? join(cwd, '.omx', 'state', 'team', snapshot.teamName, 'tasks', `task-${taskId}.json`) : null];
648
- }));
649
- const recommendedInspectApprovalPaths = Object.fromEntries(recommendedInspectTargets.map((target) => {
650
- const taskId = recommendedInspectTasks[target];
651
- return [target, taskId && snapshot?.teamName ? join(cwd, '.omx', 'state', 'team', snapshot.teamName, 'approvals', `task-${taskId}.json`) : null];
652
- }));
653
- const recommendedInspectWorkerStateDirs = Object.fromEntries(recommendedInspectTargets.map((target) => [
654
- target,
655
- snapshot?.teamName ? join(cwd, '.omx', 'state', 'team', snapshot.teamName, 'workers', target) : null,
656
- ]));
657
- const recommendedInspectWorkerStatusPaths = Object.fromEntries(recommendedInspectTargets.map((target) => [
658
- target,
659
- snapshot?.teamName ? join(cwd, '.omx', 'state', 'team', snapshot.teamName, 'workers', target, 'status.json') : null,
660
- ]));
661
- const recommendedInspectWorkerHeartbeatPaths = Object.fromEntries(recommendedInspectTargets.map((target) => [
662
- target,
663
- snapshot?.teamName ? join(cwd, '.omx', 'state', 'team', snapshot.teamName, 'workers', target, 'heartbeat.json') : null,
664
- ]));
665
- const recommendedInspectWorkerIdentityPaths = Object.fromEntries(recommendedInspectTargets.map((target) => [
666
- target,
667
- snapshot?.teamName ? join(cwd, '.omx', 'state', 'team', snapshot.teamName, 'workers', target, 'identity.json') : null,
668
- ]));
669
- const recommendedInspectWorkerInboxPaths = Object.fromEntries(recommendedInspectTargets.map((target) => [
670
- target,
671
- snapshot?.teamName ? join(cwd, '.omx', 'state', 'team', snapshot.teamName, 'workers', target, 'inbox.md') : null,
672
- ]));
673
- const recommendedInspectWorkerMailboxPaths = Object.fromEntries(recommendedInspectTargets.map((target) => [
674
- target,
675
- snapshot?.teamName ? join(cwd, '.omx', 'state', 'team', snapshot.teamName, 'mailbox', `${target}.json`) : null,
676
- ]));
677
- const recommendedInspectWorkerShutdownRequestPaths = Object.fromEntries(recommendedInspectTargets.map((target) => [
678
- target,
679
- snapshot?.teamName ? join(cwd, '.omx', 'state', 'team', snapshot.teamName, 'workers', target, 'shutdown-request.json') : null,
680
- ]));
681
- const recommendedInspectWorkerShutdownAckPaths = Object.fromEntries(recommendedInspectTargets.map((target) => [
682
- target,
683
- snapshot?.teamName ? join(cwd, '.omx', 'state', 'team', snapshot.teamName, 'workers', target, 'shutdown-ack.json') : null,
684
- ]));
685
- const recommendedInspectTeamConfigPaths = Object.fromEntries(recommendedInspectTargets.map((target) => [
686
- target,
687
- snapshot?.teamName ? join(cwd, '.omx', 'state', 'team', snapshot.teamName, 'config.json') : null,
688
- ]));
689
- const recommendedInspectTeamManifestPaths = Object.fromEntries(recommendedInspectTargets.map((target) => [
690
- target,
691
- snapshot?.teamName ? join(cwd, '.omx', 'state', 'team', snapshot.teamName, 'manifest.v2.json') : null,
692
- ]));
693
- const recommendedInspectTeamEventsPaths = Object.fromEntries(recommendedInspectTargets.map((target) => [
694
- target,
695
- snapshot?.teamName ? join(cwd, '.omx', 'state', 'team', snapshot.teamName, 'events', 'events.ndjson') : null,
696
- ]));
697
- const recommendedInspectTeamDispatchPaths = Object.fromEntries(recommendedInspectTargets.map((target) => [
698
- target,
699
- snapshot?.teamName ? join(cwd, '.omx', 'state', 'team', snapshot.teamName, 'dispatch', 'requests.json') : null,
700
- ]));
701
- const recommendedInspectTeamDirPaths = Object.fromEntries(recommendedInspectTargets.map((target) => [
702
- target,
703
- snapshot?.teamName ? join(cwd, '.omx', 'state', 'team', snapshot.teamName) : null,
704
- ]));
705
- const recommendedInspectTeamPhasePaths = Object.fromEntries(recommendedInspectTargets.map((target) => [
706
- target,
707
- snapshot?.teamName ? join(cwd, '.omx', 'state', 'team', snapshot.teamName, 'phase.json') : null,
708
- ]));
709
- const recommendedInspectTeamMonitorSnapshotPaths = Object.fromEntries(recommendedInspectTargets.map((target) => [
710
- target,
711
- snapshot?.teamName ? join(cwd, '.omx', 'state', 'team', snapshot.teamName, 'monitor-snapshot.json') : null,
712
- ]));
713
- const recommendedInspectTeamSummarySnapshotPaths = Object.fromEntries(recommendedInspectTargets.map((target) => [
714
- target,
715
- snapshot?.teamName ? join(cwd, '.omx', 'state', 'team', snapshot.teamName, 'summary-snapshot.json') : null,
716
- ]));
717
- const recommendedInspectStates = Object.fromEntries(recommendedInspectTargets.map((target) => {
718
- const worker = snapshot?.workers.find((candidate) => candidate.name === target);
719
- return [target, worker?.status.state ?? null];
720
- }));
721
- const recommendedInspectStateReasons = Object.fromEntries(recommendedInspectTargets.map((target) => {
722
- const worker = snapshot?.workers.find((candidate) => candidate.name === target);
723
- return [target, worker?.status.reason ?? null];
724
- }));
725
- const recommendedInspectCommand = recommendedInspectTargets.length > 0
726
- ? sparkshellCommands[recommendedInspectTargets[0]] ?? null
727
- : null;
728
- const recommendedInspectCommands = recommendedInspectTargets
729
- .map((target) => sparkshellCommands[target])
730
- .filter((command) => typeof command === 'string' && command.length > 0);
731
- const recommendedInspectSummary = recommendedInspectTargets.length > 0
732
- ? [
733
- `target=${recommendedInspectTargets[0]}`,
734
- recommendedInspectPanes[recommendedInspectTargets[0]] ? `pane=${recommendedInspectPanes[recommendedInspectTargets[0]]}` : '',
735
- recommendedInspectClis[recommendedInspectTargets[0]] ? `cli=${recommendedInspectClis[recommendedInspectTargets[0]]}` : '',
736
- recommendedInspectRoles[recommendedInspectTargets[0]] ? `role=${recommendedInspectRoles[recommendedInspectTargets[0]]}` : '',
737
- typeof recommendedInspectAlive[recommendedInspectTargets[0]] === 'boolean' ? `alive=${recommendedInspectAlive[recommendedInspectTargets[0]]}` : '',
738
- typeof recommendedInspectTurnCounts[recommendedInspectTargets[0]] === 'number' ? `turn_count=${recommendedInspectTurnCounts[recommendedInspectTargets[0]]}` : '',
739
- typeof recommendedInspectTurnsWithoutProgress[recommendedInspectTargets[0]] === 'number'
740
- ? `turns_without_progress=${recommendedInspectTurnsWithoutProgress[recommendedInspectTargets[0]]}` : '',
741
- recommendedInspectReasons[recommendedInspectTargets[0]] ? `reason=${recommendedInspectReasons[recommendedInspectTargets[0]]}` : '',
742
- recommendedInspectStates[recommendedInspectTargets[0]] ? `state=${recommendedInspectStates[recommendedInspectTargets[0]]}` : '',
743
- recommendedInspectTasks[recommendedInspectTargets[0]] ? `task=${recommendedInspectTasks[recommendedInspectTargets[0]]}` : '',
744
- recommendedInspectSubjects[recommendedInspectTargets[0]] ? `subject=${recommendedInspectSubjects[recommendedInspectTargets[0]]}` : '',
745
- recommendedInspectCommand ? `command=${recommendedInspectCommand}` : '',
746
- ]
747
- .filter(Boolean)
748
- .join(' ')
749
- .trim()
750
- : null;
751
- const recommendedInspectItems = recommendedInspectTargets
752
- .map((target) => {
753
- const command = sparkshellCommands[target];
754
- const paneId = recommendedInspectPanes[target];
755
- if (!command || !paneId)
756
- return null;
757
- return {
758
- target,
759
- pane_id: paneId,
760
- worker_cli: recommendedInspectClis[target] ?? null,
761
- role: recommendedInspectRoles[target] ?? null,
762
- index: recommendedInspectIndexes[target] ?? null,
763
- alive: recommendedInspectAlive[target] ?? null,
764
- turn_count: recommendedInspectTurnCounts[target] ?? null,
765
- turns_without_progress: recommendedInspectTurnsWithoutProgress[target] ?? null,
766
- last_turn_at: recommendedInspectLastTurnAt[target] ?? null,
767
- status_updated_at: recommendedInspectStatusUpdatedAt[target] ?? null,
768
- pid: recommendedInspectPids[target] ?? null,
769
- worktree_repo_root: recommendedInspectWorktreeRepoRoots[target] ?? null,
770
- worktree_path: recommendedInspectWorktreePaths[target] ?? null,
771
- worktree_branch: recommendedInspectWorktreeBranches[target] ?? null,
772
- worktree_detached: recommendedInspectWorktreeDetached[target] ?? null,
773
- worktree_created: recommendedInspectWorktreeCreated[target] ?? null,
774
- team_state_root: recommendedInspectTeamStateRoots[target] ?? null,
775
- working_dir: recommendedInspectWorkdirs[target] ?? null,
776
- assigned_tasks: recommendedInspectAssignedTasks[target] ?? [],
777
- task_status: recommendedInspectTaskStatuses[target] ?? null,
778
- task_result: recommendedInspectTaskResults[target] ?? null,
779
- task_error: recommendedInspectTaskErrors[target] ?? null,
780
- task_version: recommendedInspectTaskVersions[target] ?? null,
781
- task_created_at: recommendedInspectTaskCreatedAt[target] ?? null,
782
- task_completed_at: recommendedInspectTaskCompletedAt[target] ?? null,
783
- task_depends_on: recommendedInspectTaskDependsOn[target] ?? [],
784
- task_claim_present: recommendedInspectTaskClaimPresent[target] ?? null,
785
- task_claim_owner: recommendedInspectTaskClaimOwners[target] ?? null,
786
- task_claim_token: recommendedInspectTaskClaimTokens[target] ?? null,
787
- task_claim_leased_until: recommendedInspectTaskClaimLeases[target] ?? null,
788
- task_claim_lock_path: recommendedInspectTaskClaimLockPaths[target] ?? null,
789
- approval_required: recommendedInspectApprovalRequired[target] ?? null,
790
- requires_code_change: recommendedInspectRequiresCodeChange[target] ?? null,
791
- task_description: recommendedInspectDescriptions[target] ?? null,
792
- blocked_by: recommendedInspectBlockedBy[target] ?? [],
793
- task_role: recommendedInspectTaskRoles[target] ?? null,
794
- task_owner: recommendedInspectTaskOwners[target] ?? null,
795
- approval_status: recommendedInspectApprovalStatuses[target] ?? null,
796
- approval_reviewer: recommendedInspectApprovalReviewers[target] ?? null,
797
- approval_reason: recommendedInspectApprovalReasons[target] ?? null,
798
- approval_decided_at: recommendedInspectApprovalDecidedAt[target] ?? null,
799
- approval_record_present: recommendedInspectApprovalRecordPresent[target] ?? null,
800
- reason: recommendedInspectReasons[target] ?? 'unknown',
801
- state: recommendedInspectStates[target] ?? null,
802
- state_reason: recommendedInspectStateReasons[target] ?? null,
803
- task_id: recommendedInspectTasks[target] ?? null,
804
- task_subject: recommendedInspectSubjects[target] ?? null,
805
- task_path: recommendedInspectTaskPaths[target] ?? null,
806
- approval_path: recommendedInspectApprovalPaths[target] ?? null,
807
- worker_state_dir: recommendedInspectWorkerStateDirs[target] ?? null,
808
- worker_status_path: recommendedInspectWorkerStatusPaths[target] ?? null,
809
- worker_heartbeat_path: recommendedInspectWorkerHeartbeatPaths[target] ?? null,
810
- worker_identity_path: recommendedInspectWorkerIdentityPaths[target] ?? null,
811
- worker_inbox_path: recommendedInspectWorkerInboxPaths[target] ?? null,
812
- worker_mailbox_path: recommendedInspectWorkerMailboxPaths[target] ?? null,
813
- worker_shutdown_request_path: recommendedInspectWorkerShutdownRequestPaths[target] ?? null,
814
- worker_shutdown_ack_path: recommendedInspectWorkerShutdownAckPaths[target] ?? null,
815
- team_dir_path: recommendedInspectTeamDirPaths[target] ?? null,
816
- team_config_path: recommendedInspectTeamConfigPaths[target] ?? null,
817
- team_manifest_path: recommendedInspectTeamManifestPaths[target] ?? null,
818
- team_events_path: recommendedInspectTeamEventsPaths[target] ?? null,
819
- team_dispatch_path: recommendedInspectTeamDispatchPaths[target] ?? null,
820
- team_phase_path: recommendedInspectTeamPhasePaths[target] ?? null,
821
- team_monitor_snapshot_path: recommendedInspectTeamMonitorSnapshotPaths[target] ?? null,
822
- team_summary_snapshot_path: recommendedInspectTeamSummarySnapshotPaths[target] ?? null,
823
- command,
824
- };
825
- })
826
- .filter((item) => item !== null);
827
- return {
828
- leader_pane_id: leaderPaneId,
829
- hud_pane_id: hudPaneId,
830
- worker_panes: workerPanes,
831
- sparkshell_hint: Object.keys(workerPanes).length > 0
832
- ? 'omx sparkshell --tmux-pane <pane-id> --tail-lines 400'
833
- : null,
834
- sparkshell_commands: sparkshellCommands,
835
- recommended_inspect_targets: recommendedInspectTargets,
836
- recommended_inspect_reasons: recommendedInspectReasons,
837
- recommended_inspect_clis: recommendedInspectClis,
838
- recommended_inspect_roles: recommendedInspectRoles,
839
- recommended_inspect_indexes: recommendedInspectIndexes,
840
- recommended_inspect_alive: recommendedInspectAlive,
841
- recommended_inspect_turn_counts: recommendedInspectTurnCounts,
842
- recommended_inspect_turns_without_progress: recommendedInspectTurnsWithoutProgress,
843
- recommended_inspect_last_turn_at: recommendedInspectLastTurnAt,
844
- recommended_inspect_status_updated_at: recommendedInspectStatusUpdatedAt,
845
- recommended_inspect_pids: recommendedInspectPids,
846
- recommended_inspect_worktree_paths: recommendedInspectWorktreePaths,
847
- recommended_inspect_worktree_repo_roots: recommendedInspectWorktreeRepoRoots,
848
- recommended_inspect_worktree_branches: recommendedInspectWorktreeBranches,
849
- recommended_inspect_worktree_detached: recommendedInspectWorktreeDetached,
850
- recommended_inspect_worktree_created: recommendedInspectWorktreeCreated,
851
- recommended_inspect_team_state_roots: recommendedInspectTeamStateRoots,
852
- recommended_inspect_workdirs: recommendedInspectWorkdirs,
853
- recommended_inspect_assigned_tasks: recommendedInspectAssignedTasks,
854
- recommended_inspect_task_statuses: recommendedInspectTaskStatuses,
855
- recommended_inspect_task_results: recommendedInspectTaskResults,
856
- recommended_inspect_task_errors: recommendedInspectTaskErrors,
857
- recommended_inspect_task_versions: recommendedInspectTaskVersions,
858
- recommended_inspect_task_created_at: recommendedInspectTaskCreatedAt,
859
- recommended_inspect_task_completed_at: recommendedInspectTaskCompletedAt,
860
- recommended_inspect_task_depends_on: recommendedInspectTaskDependsOn,
861
- recommended_inspect_task_claim_present: recommendedInspectTaskClaimPresent,
862
- recommended_inspect_task_claim_owners: recommendedInspectTaskClaimOwners,
863
- recommended_inspect_task_claim_tokens: recommendedInspectTaskClaimTokens,
864
- recommended_inspect_task_claim_leases: recommendedInspectTaskClaimLeases,
865
- recommended_inspect_task_claim_lock_paths: recommendedInspectTaskClaimLockPaths,
866
- recommended_inspect_approval_required: recommendedInspectApprovalRequired,
867
- recommended_inspect_requires_code_change: recommendedInspectRequiresCodeChange,
868
- recommended_inspect_descriptions: recommendedInspectDescriptions,
869
- recommended_inspect_blocked_by: recommendedInspectBlockedBy,
870
- recommended_inspect_task_roles: recommendedInspectTaskRoles,
871
- recommended_inspect_task_owners: recommendedInspectTaskOwners,
872
- recommended_inspect_approval_statuses: recommendedInspectApprovalStatuses,
873
- recommended_inspect_approval_reviewers: recommendedInspectApprovalReviewers,
874
- recommended_inspect_approval_reasons: recommendedInspectApprovalReasons,
875
- recommended_inspect_approval_decided_at: recommendedInspectApprovalDecidedAt,
876
- recommended_inspect_approval_record_present: recommendedInspectApprovalRecordPresent,
877
- recommended_inspect_states: recommendedInspectStates,
878
- recommended_inspect_state_reasons: recommendedInspectStateReasons,
879
- recommended_inspect_tasks: recommendedInspectTasks,
880
- recommended_inspect_subjects: recommendedInspectSubjects,
881
- recommended_inspect_task_paths: recommendedInspectTaskPaths,
882
- recommended_inspect_approval_paths: recommendedInspectApprovalPaths,
883
- recommended_inspect_worker_state_dirs: recommendedInspectWorkerStateDirs,
884
- recommended_inspect_worker_status_paths: recommendedInspectWorkerStatusPaths,
885
- recommended_inspect_worker_heartbeat_paths: recommendedInspectWorkerHeartbeatPaths,
886
- recommended_inspect_worker_identity_paths: recommendedInspectWorkerIdentityPaths,
887
- recommended_inspect_worker_inbox_paths: recommendedInspectWorkerInboxPaths,
888
- recommended_inspect_worker_mailbox_paths: recommendedInspectWorkerMailboxPaths,
889
- recommended_inspect_worker_shutdown_request_paths: recommendedInspectWorkerShutdownRequestPaths,
890
- recommended_inspect_worker_shutdown_ack_paths: recommendedInspectWorkerShutdownAckPaths,
891
- recommended_inspect_team_dir_paths: recommendedInspectTeamDirPaths,
892
- recommended_inspect_team_config_paths: recommendedInspectTeamConfigPaths,
893
- recommended_inspect_team_manifest_paths: recommendedInspectTeamManifestPaths,
894
- recommended_inspect_team_events_paths: recommendedInspectTeamEventsPaths,
895
- recommended_inspect_team_dispatch_paths: recommendedInspectTeamDispatchPaths,
896
- recommended_inspect_team_phase_paths: recommendedInspectTeamPhasePaths,
897
- recommended_inspect_team_monitor_snapshot_paths: recommendedInspectTeamMonitorSnapshotPaths,
898
- recommended_inspect_team_summary_snapshot_paths: recommendedInspectTeamSummarySnapshotPaths,
899
- recommended_inspect_panes: recommendedInspectPanes,
900
- recommended_inspect_command: recommendedInspectCommand,
901
- recommended_inspect_commands: recommendedInspectCommands,
902
- recommended_inspect_summary: recommendedInspectSummary,
903
- recommended_inspect_items: recommendedInspectItems,
904
- };
905
- }
906
356
  function renderTeamPaneStatus(paneStatus) {
907
357
  if (paneStatus.leader_pane_id || paneStatus.hud_pane_id) {
908
358
  console.log(`panes: leader=${paneStatus.leader_pane_id || '-'} hud=${paneStatus.hud_pane_id || '-'}`);
@@ -1571,29 +1021,38 @@ async function ensureTeamModeState(parsed, tasks) {
1571
1021
  workerCount: parsed.workerCount,
1572
1022
  fallbackRole,
1573
1023
  });
1024
+ const currentPhase = parsed.teamName
1025
+ ? (await readTeamPhase(parsed.teamName, process.cwd()))?.current_phase ?? 'team-exec'
1026
+ : 'team-exec';
1027
+ const active = !isTerminalModePhase(currentPhase);
1028
+ const completionStamp = active ? undefined : new Date().toISOString();
1574
1029
  const existing = await readModeState('team');
1575
1030
  if (existing?.active) {
1576
1031
  await updateModeState('team', {
1032
+ active,
1577
1033
  task_description: parsed.task,
1578
- current_phase: 'team-exec',
1034
+ current_phase: currentPhase,
1579
1035
  team_name: parsed.teamName,
1580
1036
  agent_count: parsed.workerCount,
1581
1037
  agent_types: roleDistribution,
1582
1038
  available_agent_types: availableAgentTypes,
1583
1039
  staffing_summary: staffingPlan.staffingSummary,
1584
1040
  staffing_allocations: staffingPlan.allocations,
1041
+ completed_at: completionStamp,
1585
1042
  });
1586
1043
  return;
1587
1044
  }
1588
1045
  await startMode('team', parsed.task, 50);
1589
1046
  await updateModeState('team', {
1590
- current_phase: 'team-exec',
1047
+ active,
1048
+ current_phase: currentPhase,
1591
1049
  team_name: parsed.teamName,
1592
1050
  agent_count: parsed.workerCount,
1593
1051
  agent_types: roleDistribution,
1594
1052
  available_agent_types: availableAgentTypes,
1595
1053
  staffing_summary: staffingPlan.staffingSummary,
1596
1054
  staffing_allocations: staffingPlan.allocations,
1055
+ completed_at: completionStamp,
1597
1056
  });
1598
1057
  }
1599
1058
  async function renderStartSummary(runtime, staffingPlan) {