oh-my-codex 0.18.6 → 0.18.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (444) hide show
  1. package/Cargo.lock +6 -6
  2. package/Cargo.toml +1 -1
  3. package/README.md +59 -10
  4. package/crates/omx-sparkshell/tests/execution.rs +1 -1
  5. package/dist/agents/__tests__/definitions.test.js +11 -0
  6. package/dist/agents/__tests__/definitions.test.js.map +1 -1
  7. package/dist/agents/__tests__/native-config.test.js +56 -6
  8. package/dist/agents/__tests__/native-config.test.js.map +1 -1
  9. package/dist/agents/definitions.d.ts +10 -0
  10. package/dist/agents/definitions.d.ts.map +1 -1
  11. package/dist/agents/definitions.js +5 -1
  12. package/dist/agents/definitions.js.map +1 -1
  13. package/dist/agents/native-config.d.ts +5 -1
  14. package/dist/agents/native-config.d.ts.map +1 -1
  15. package/dist/agents/native-config.js +19 -4
  16. package/dist/agents/native-config.js.map +1 -1
  17. package/dist/autopilot/__tests__/fsm.test.d.ts +2 -0
  18. package/dist/autopilot/__tests__/fsm.test.d.ts.map +1 -0
  19. package/dist/autopilot/__tests__/fsm.test.js +75 -0
  20. package/dist/autopilot/__tests__/fsm.test.js.map +1 -0
  21. package/dist/autopilot/__tests__/ralplan-gate.test.d.ts +2 -0
  22. package/dist/autopilot/__tests__/ralplan-gate.test.d.ts.map +1 -0
  23. package/dist/autopilot/__tests__/ralplan-gate.test.js +79 -0
  24. package/dist/autopilot/__tests__/ralplan-gate.test.js.map +1 -0
  25. package/dist/autopilot/deep-interview-gate.d.ts +18 -0
  26. package/dist/autopilot/deep-interview-gate.d.ts.map +1 -0
  27. package/dist/autopilot/deep-interview-gate.js +256 -0
  28. package/dist/autopilot/deep-interview-gate.js.map +1 -0
  29. package/dist/autopilot/fsm.d.ts +13 -0
  30. package/dist/autopilot/fsm.d.ts.map +1 -0
  31. package/dist/autopilot/fsm.js +70 -0
  32. package/dist/autopilot/fsm.js.map +1 -0
  33. package/dist/autopilot/ralplan-gate.d.ts +17 -0
  34. package/dist/autopilot/ralplan-gate.d.ts.map +1 -0
  35. package/dist/autopilot/ralplan-gate.js +61 -0
  36. package/dist/autopilot/ralplan-gate.js.map +1 -0
  37. package/dist/cli/__tests__/codex-plugin-layout.test.js +512 -1
  38. package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -1
  39. package/dist/cli/__tests__/doctor-warning-copy.test.js +39 -0
  40. package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
  41. package/dist/cli/__tests__/index.test.js +83 -7
  42. package/dist/cli/__tests__/index.test.js.map +1 -1
  43. package/dist/cli/__tests__/launch-fallback.test.js +175 -6
  44. package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
  45. package/dist/cli/__tests__/package-bin-contract.test.js +8 -4
  46. package/dist/cli/__tests__/package-bin-contract.test.js.map +1 -1
  47. package/dist/cli/__tests__/question.test.js +100 -0
  48. package/dist/cli/__tests__/question.test.js.map +1 -1
  49. package/dist/cli/__tests__/ralph-goal-mode-contract.test.js +13 -0
  50. package/dist/cli/__tests__/ralph-goal-mode-contract.test.js.map +1 -1
  51. package/dist/cli/__tests__/ralph.test.js +14 -0
  52. package/dist/cli/__tests__/ralph.test.js.map +1 -1
  53. package/dist/cli/__tests__/setup-install-mode.test.js +89 -0
  54. package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
  55. package/dist/cli/__tests__/setup-refresh.test.js +83 -0
  56. package/dist/cli/__tests__/setup-refresh.test.js.map +1 -1
  57. package/dist/cli/__tests__/state.test.js +21 -0
  58. package/dist/cli/__tests__/state.test.js.map +1 -1
  59. package/dist/cli/__tests__/team.test.js +2 -2
  60. package/dist/cli/__tests__/team.test.js.map +1 -1
  61. package/dist/cli/__tests__/update.test.js +110 -2
  62. package/dist/cli/__tests__/update.test.js.map +1 -1
  63. package/dist/cli/doctor.d.ts.map +1 -1
  64. package/dist/cli/doctor.js +8 -1
  65. package/dist/cli/doctor.js.map +1 -1
  66. package/dist/cli/index.d.ts +14 -3
  67. package/dist/cli/index.d.ts.map +1 -1
  68. package/dist/cli/index.js +298 -50
  69. package/dist/cli/index.js.map +1 -1
  70. package/dist/cli/plugin-marketplace.d.ts +14 -2
  71. package/dist/cli/plugin-marketplace.d.ts.map +1 -1
  72. package/dist/cli/plugin-marketplace.js +62 -15
  73. package/dist/cli/plugin-marketplace.js.map +1 -1
  74. package/dist/cli/question.d.ts.map +1 -1
  75. package/dist/cli/question.js +36 -5
  76. package/dist/cli/question.js.map +1 -1
  77. package/dist/cli/ralph.d.ts.map +1 -1
  78. package/dist/cli/ralph.js +3 -1
  79. package/dist/cli/ralph.js.map +1 -1
  80. package/dist/cli/setup-preferences.d.ts +2 -0
  81. package/dist/cli/setup-preferences.d.ts.map +1 -1
  82. package/dist/cli/setup-preferences.js +4 -0
  83. package/dist/cli/setup-preferences.js.map +1 -1
  84. package/dist/cli/setup.d.ts +3 -0
  85. package/dist/cli/setup.d.ts.map +1 -1
  86. package/dist/cli/setup.js +166 -27
  87. package/dist/cli/setup.js.map +1 -1
  88. package/dist/cli/state.d.ts.map +1 -1
  89. package/dist/cli/state.js +8 -1
  90. package/dist/cli/state.js.map +1 -1
  91. package/dist/cli/tmux-hook.d.ts.map +1 -1
  92. package/dist/cli/tmux-hook.js +16 -0
  93. package/dist/cli/tmux-hook.js.map +1 -1
  94. package/dist/cli/update.d.ts +2 -0
  95. package/dist/cli/update.d.ts.map +1 -1
  96. package/dist/cli/update.js +47 -3
  97. package/dist/cli/update.js.map +1 -1
  98. package/dist/config/__tests__/deep-interview.test.js +7 -6
  99. package/dist/config/__tests__/deep-interview.test.js.map +1 -1
  100. package/dist/config/__tests__/generator-notify.test.js +1 -0
  101. package/dist/config/__tests__/generator-notify.test.js.map +1 -1
  102. package/dist/config/deep-interview.d.ts.map +1 -1
  103. package/dist/config/deep-interview.js +14 -4
  104. package/dist/config/deep-interview.js.map +1 -1
  105. package/dist/config/generator.d.ts +2 -2
  106. package/dist/config/generator.d.ts.map +1 -1
  107. package/dist/config/generator.js +2 -2
  108. package/dist/config/generator.js.map +1 -1
  109. package/dist/config/team-mode.d.ts +12 -0
  110. package/dist/config/team-mode.d.ts.map +1 -0
  111. package/dist/config/team-mode.js +91 -0
  112. package/dist/config/team-mode.js.map +1 -0
  113. package/dist/hooks/__tests__/agents-overlay.test.js +88 -0
  114. package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -1
  115. package/dist/hooks/__tests__/autopilot-skill-contract.test.js +8 -0
  116. package/dist/hooks/__tests__/autopilot-skill-contract.test.js.map +1 -1
  117. package/dist/hooks/__tests__/code-review-skill-contract.test.js +8 -0
  118. package/dist/hooks/__tests__/code-review-skill-contract.test.js.map +1 -1
  119. package/dist/hooks/__tests__/deep-interview-contract.test.js +10 -0
  120. package/dist/hooks/__tests__/deep-interview-contract.test.js.map +1 -1
  121. package/dist/hooks/__tests__/keyword-detector.test.js +1072 -14
  122. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  123. package/dist/hooks/__tests__/notify-fallback-watcher.test.js +64 -1
  124. package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
  125. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +189 -0
  126. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js.map +1 -1
  127. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +35 -2
  128. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -1
  129. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js +3 -3
  130. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js.map +1 -1
  131. package/dist/hooks/__tests__/session.test.js +25 -0
  132. package/dist/hooks/__tests__/session.test.js.map +1 -1
  133. package/dist/hooks/__tests__/skill-guidance-contract.test.js +21 -0
  134. package/dist/hooks/__tests__/skill-guidance-contract.test.js.map +1 -1
  135. package/dist/hooks/agents-overlay.d.ts.map +1 -1
  136. package/dist/hooks/agents-overlay.js +36 -50
  137. package/dist/hooks/agents-overlay.js.map +1 -1
  138. package/dist/hooks/deep-interview-config-instruction.js +1 -1
  139. package/dist/hooks/deep-interview-config-instruction.js.map +1 -1
  140. package/dist/hooks/extensibility/__tests__/plugin-runner.test.js +31 -0
  141. package/dist/hooks/extensibility/__tests__/plugin-runner.test.js.map +1 -1
  142. package/dist/hooks/extensibility/plugin-runner.js +17 -21
  143. package/dist/hooks/extensibility/plugin-runner.js.map +1 -1
  144. package/dist/hooks/keyword-detector.d.ts +1 -0
  145. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  146. package/dist/hooks/keyword-detector.js +428 -32
  147. package/dist/hooks/keyword-detector.js.map +1 -1
  148. package/dist/hooks/keyword-registry.d.ts.map +1 -1
  149. package/dist/hooks/keyword-registry.js +1 -0
  150. package/dist/hooks/keyword-registry.js.map +1 -1
  151. package/dist/hooks/prompt-guidance-contract.d.ts.map +1 -1
  152. package/dist/hooks/prompt-guidance-contract.js +6 -0
  153. package/dist/hooks/prompt-guidance-contract.js.map +1 -1
  154. package/dist/hooks/session.d.ts +3 -0
  155. package/dist/hooks/session.d.ts.map +1 -1
  156. package/dist/hooks/session.js +13 -5
  157. package/dist/hooks/session.js.map +1 -1
  158. package/dist/hud/__tests__/authority.test.js +469 -31
  159. package/dist/hud/__tests__/authority.test.js.map +1 -1
  160. package/dist/hud/__tests__/hud-tmux-injection.test.js +2 -1
  161. package/dist/hud/__tests__/hud-tmux-injection.test.js.map +1 -1
  162. package/dist/hud/__tests__/index.test.js +210 -2
  163. package/dist/hud/__tests__/index.test.js.map +1 -1
  164. package/dist/hud/__tests__/reconcile.test.js +588 -28
  165. package/dist/hud/__tests__/reconcile.test.js.map +1 -1
  166. package/dist/hud/__tests__/render.test.js +61 -0
  167. package/dist/hud/__tests__/render.test.js.map +1 -1
  168. package/dist/hud/__tests__/state.test.js +208 -0
  169. package/dist/hud/__tests__/state.test.js.map +1 -1
  170. package/dist/hud/__tests__/tmux.test.js +314 -22
  171. package/dist/hud/__tests__/tmux.test.js.map +1 -1
  172. package/dist/hud/authority.d.ts +5 -0
  173. package/dist/hud/authority.d.ts.map +1 -1
  174. package/dist/hud/authority.js +337 -30
  175. package/dist/hud/authority.js.map +1 -1
  176. package/dist/hud/index.d.ts +20 -2
  177. package/dist/hud/index.d.ts.map +1 -1
  178. package/dist/hud/index.js +103 -26
  179. package/dist/hud/index.js.map +1 -1
  180. package/dist/hud/reconcile.d.ts +3 -3
  181. package/dist/hud/reconcile.d.ts.map +1 -1
  182. package/dist/hud/reconcile.js +129 -20
  183. package/dist/hud/reconcile.js.map +1 -1
  184. package/dist/hud/render.d.ts.map +1 -1
  185. package/dist/hud/render.js +35 -0
  186. package/dist/hud/render.js.map +1 -1
  187. package/dist/hud/state.d.ts.map +1 -1
  188. package/dist/hud/state.js +64 -50
  189. package/dist/hud/state.js.map +1 -1
  190. package/dist/hud/tmux.d.ts +26 -6
  191. package/dist/hud/tmux.d.ts.map +1 -1
  192. package/dist/hud/tmux.js +173 -38
  193. package/dist/hud/tmux.js.map +1 -1
  194. package/dist/hud/types.d.ts +11 -0
  195. package/dist/hud/types.d.ts.map +1 -1
  196. package/dist/hud/types.js.map +1 -1
  197. package/dist/mcp/__tests__/hermes-bridge.test.js +203 -7
  198. package/dist/mcp/__tests__/hermes-bridge.test.js.map +1 -1
  199. package/dist/mcp/__tests__/state-paths.test.js +71 -1
  200. package/dist/mcp/__tests__/state-paths.test.js.map +1 -1
  201. package/dist/mcp/__tests__/state-server.test.js +13 -1
  202. package/dist/mcp/__tests__/state-server.test.js.map +1 -1
  203. package/dist/mcp/hermes-bridge.d.ts +12 -2
  204. package/dist/mcp/hermes-bridge.d.ts.map +1 -1
  205. package/dist/mcp/hermes-bridge.js +83 -9
  206. package/dist/mcp/hermes-bridge.js.map +1 -1
  207. package/dist/mcp/state-paths.d.ts +32 -0
  208. package/dist/mcp/state-paths.d.ts.map +1 -1
  209. package/dist/mcp/state-paths.js +113 -17
  210. package/dist/mcp/state-paths.js.map +1 -1
  211. package/dist/mcp/state-server.d.ts +4 -4
  212. package/dist/modes/__tests__/base-autoresearch-contract.test.js +7 -1
  213. package/dist/modes/__tests__/base-autoresearch-contract.test.js.map +1 -1
  214. package/dist/pipeline/__tests__/stages.test.js +130 -0
  215. package/dist/pipeline/__tests__/stages.test.js.map +1 -1
  216. package/dist/pipeline/orchestrator.js +1 -1
  217. package/dist/pipeline/orchestrator.js.map +1 -1
  218. package/dist/pipeline/stages/ralplan.d.ts +1 -0
  219. package/dist/pipeline/stages/ralplan.d.ts.map +1 -1
  220. package/dist/pipeline/stages/ralplan.js +14 -5
  221. package/dist/pipeline/stages/ralplan.js.map +1 -1
  222. package/dist/question/__tests__/deep-interview.test.js +160 -2
  223. package/dist/question/__tests__/deep-interview.test.js.map +1 -1
  224. package/dist/question/__tests__/policy.test.js +63 -3
  225. package/dist/question/__tests__/policy.test.js.map +1 -1
  226. package/dist/question/__tests__/renderer.test.js +191 -2
  227. package/dist/question/__tests__/renderer.test.js.map +1 -1
  228. package/dist/question/__tests__/state.test.js +94 -3
  229. package/dist/question/__tests__/state.test.js.map +1 -1
  230. package/dist/question/__tests__/ui.test.js +4 -0
  231. package/dist/question/__tests__/ui.test.js.map +1 -1
  232. package/dist/question/autopilot-wait.d.ts +12 -2
  233. package/dist/question/autopilot-wait.d.ts.map +1 -1
  234. package/dist/question/autopilot-wait.js +158 -47
  235. package/dist/question/autopilot-wait.js.map +1 -1
  236. package/dist/question/deep-interview.d.ts.map +1 -1
  237. package/dist/question/deep-interview.js +22 -6
  238. package/dist/question/deep-interview.js.map +1 -1
  239. package/dist/question/policy.d.ts.map +1 -1
  240. package/dist/question/policy.js +2 -5
  241. package/dist/question/policy.js.map +1 -1
  242. package/dist/question/renderer.d.ts +12 -0
  243. package/dist/question/renderer.d.ts.map +1 -1
  244. package/dist/question/renderer.js +87 -3
  245. package/dist/question/renderer.js.map +1 -1
  246. package/dist/question/state.d.ts +8 -1
  247. package/dist/question/state.d.ts.map +1 -1
  248. package/dist/question/state.js +54 -14
  249. package/dist/question/state.js.map +1 -1
  250. package/dist/question/types.d.ts +1 -1
  251. package/dist/question/types.d.ts.map +1 -1
  252. package/dist/question/ui.d.ts +1 -0
  253. package/dist/question/ui.d.ts.map +1 -1
  254. package/dist/question/ui.js +1 -0
  255. package/dist/question/ui.js.map +1 -1
  256. package/dist/ralplan/__tests__/runtime.test.js +191 -0
  257. package/dist/ralplan/__tests__/runtime.test.js.map +1 -1
  258. package/dist/ralplan/consensus-gate.d.ts +9 -1
  259. package/dist/ralplan/consensus-gate.d.ts.map +1 -1
  260. package/dist/ralplan/consensus-gate.js +84 -2
  261. package/dist/ralplan/consensus-gate.js.map +1 -1
  262. package/dist/ralplan/runtime.d.ts +9 -0
  263. package/dist/ralplan/runtime.d.ts.map +1 -1
  264. package/dist/ralplan/runtime.js +32 -11
  265. package/dist/ralplan/runtime.js.map +1 -1
  266. package/dist/scripts/__tests__/codex-native-hook.test.js +2315 -280
  267. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  268. package/dist/scripts/__tests__/notify-state-io.test.js +72 -1
  269. package/dist/scripts/__tests__/notify-state-io.test.js.map +1 -1
  270. package/dist/scripts/__tests__/notify-tmux-injection.test.d.ts +2 -0
  271. package/dist/scripts/__tests__/notify-tmux-injection.test.d.ts.map +1 -0
  272. package/dist/scripts/__tests__/notify-tmux-injection.test.js +57 -0
  273. package/dist/scripts/__tests__/notify-tmux-injection.test.js.map +1 -0
  274. package/dist/scripts/__tests__/run-test-files.test.js +74 -0
  275. package/dist/scripts/__tests__/run-test-files.test.js.map +1 -1
  276. package/dist/scripts/__tests__/verify-native-agents.test.js +65 -0
  277. package/dist/scripts/__tests__/verify-native-agents.test.js.map +1 -1
  278. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  279. package/dist/scripts/codex-native-hook.js +431 -56
  280. package/dist/scripts/codex-native-hook.js.map +1 -1
  281. package/dist/scripts/codex-native-pre-post.d.ts.map +1 -1
  282. package/dist/scripts/codex-native-pre-post.js +79 -1
  283. package/dist/scripts/codex-native-pre-post.js.map +1 -1
  284. package/dist/scripts/eval/eval-parity-smoke.js +1 -1
  285. package/dist/scripts/eval/eval-parity-smoke.js.map +1 -1
  286. package/dist/scripts/hook-payload-guard.d.ts +9 -0
  287. package/dist/scripts/hook-payload-guard.d.ts.map +1 -0
  288. package/dist/scripts/hook-payload-guard.js +111 -0
  289. package/dist/scripts/hook-payload-guard.js.map +1 -0
  290. package/dist/scripts/notify-fallback-watcher.js +8 -1
  291. package/dist/scripts/notify-fallback-watcher.js.map +1 -1
  292. package/dist/scripts/notify-hook/__tests__/payload-guard.test.d.ts +2 -0
  293. package/dist/scripts/notify-hook/__tests__/payload-guard.test.d.ts.map +1 -0
  294. package/dist/scripts/notify-hook/__tests__/payload-guard.test.js +39 -0
  295. package/dist/scripts/notify-hook/__tests__/payload-guard.test.js.map +1 -0
  296. package/dist/scripts/notify-hook/auto-nudge.d.ts.map +1 -1
  297. package/dist/scripts/notify-hook/auto-nudge.js +3 -1
  298. package/dist/scripts/notify-hook/auto-nudge.js.map +1 -1
  299. package/dist/scripts/notify-hook/ralph-session-resume.d.ts.map +1 -1
  300. package/dist/scripts/notify-hook/ralph-session-resume.js +3 -10
  301. package/dist/scripts/notify-hook/ralph-session-resume.js.map +1 -1
  302. package/dist/scripts/notify-hook/state-io.d.ts.map +1 -1
  303. package/dist/scripts/notify-hook/state-io.js +62 -38
  304. package/dist/scripts/notify-hook/state-io.js.map +1 -1
  305. package/dist/scripts/notify-hook/team-leader-nudge.d.ts.map +1 -1
  306. package/dist/scripts/notify-hook/team-leader-nudge.js +7 -0
  307. package/dist/scripts/notify-hook/team-leader-nudge.js.map +1 -1
  308. package/dist/scripts/notify-hook/team-worker-stop.d.ts.map +1 -1
  309. package/dist/scripts/notify-hook/team-worker-stop.js +234 -86
  310. package/dist/scripts/notify-hook/team-worker-stop.js.map +1 -1
  311. package/dist/scripts/notify-hook/tmux-injection.d.ts +7 -0
  312. package/dist/scripts/notify-hook/tmux-injection.d.ts.map +1 -1
  313. package/dist/scripts/notify-hook/tmux-injection.js +24 -18
  314. package/dist/scripts/notify-hook/tmux-injection.js.map +1 -1
  315. package/dist/scripts/notify-hook.js +86 -13
  316. package/dist/scripts/notify-hook.js.map +1 -1
  317. package/dist/scripts/run-test-files.js +193 -22
  318. package/dist/scripts/run-test-files.js.map +1 -1
  319. package/dist/scripts/sync-plugin-mirror.d.ts.map +1 -1
  320. package/dist/scripts/sync-plugin-mirror.js +61 -3
  321. package/dist/scripts/sync-plugin-mirror.js.map +1 -1
  322. package/dist/scripts/verify-native-agents.d.ts.map +1 -1
  323. package/dist/scripts/verify-native-agents.js +58 -1
  324. package/dist/scripts/verify-native-agents.js.map +1 -1
  325. package/dist/state/__tests__/operations.test.js +1125 -1
  326. package/dist/state/__tests__/operations.test.js.map +1 -1
  327. package/dist/state/__tests__/skill-active.test.js +46 -1
  328. package/dist/state/__tests__/skill-active.test.js.map +1 -1
  329. package/dist/state/__tests__/workflow-transition.test.js +98 -7
  330. package/dist/state/__tests__/workflow-transition.test.js.map +1 -1
  331. package/dist/state/operations.d.ts.map +1 -1
  332. package/dist/state/operations.js +159 -2
  333. package/dist/state/operations.js.map +1 -1
  334. package/dist/state/skill-active.js +6 -8
  335. package/dist/state/skill-active.js.map +1 -1
  336. package/dist/state/workflow-transition-reconcile.d.ts +6 -0
  337. package/dist/state/workflow-transition-reconcile.d.ts.map +1 -1
  338. package/dist/state/workflow-transition-reconcile.js +38 -15
  339. package/dist/state/workflow-transition-reconcile.js.map +1 -1
  340. package/dist/state/workflow-transition.d.ts.map +1 -1
  341. package/dist/state/workflow-transition.js +10 -3
  342. package/dist/state/workflow-transition.js.map +1 -1
  343. package/dist/subagents/__tests__/tracker.test.js +139 -0
  344. package/dist/subagents/__tests__/tracker.test.js.map +1 -1
  345. package/dist/subagents/tracker.d.ts +3 -0
  346. package/dist/subagents/tracker.d.ts.map +1 -1
  347. package/dist/subagents/tracker.js +41 -4
  348. package/dist/subagents/tracker.js.map +1 -1
  349. package/dist/team/__tests__/coordination-protocol.test.d.ts +2 -0
  350. package/dist/team/__tests__/coordination-protocol.test.d.ts.map +1 -0
  351. package/dist/team/__tests__/coordination-protocol.test.js +173 -0
  352. package/dist/team/__tests__/coordination-protocol.test.js.map +1 -0
  353. package/dist/team/__tests__/runtime.test.js +52 -3
  354. package/dist/team/__tests__/runtime.test.js.map +1 -1
  355. package/dist/team/__tests__/scaling.test.js +9 -4
  356. package/dist/team/__tests__/scaling.test.js.map +1 -1
  357. package/dist/team/__tests__/state.test.js +83 -0
  358. package/dist/team/__tests__/state.test.js.map +1 -1
  359. package/dist/team/__tests__/tmux-session.test.js +240 -2
  360. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  361. package/dist/team/__tests__/worker-bootstrap.test.js +84 -0
  362. package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -1
  363. package/dist/team/__tests__/worker-runtime-identity.test.js +4 -2
  364. package/dist/team/__tests__/worker-runtime-identity.test.js.map +1 -1
  365. package/dist/team/coordination-protocol.d.ts +14 -0
  366. package/dist/team/coordination-protocol.d.ts.map +1 -0
  367. package/dist/team/coordination-protocol.js +244 -0
  368. package/dist/team/coordination-protocol.js.map +1 -0
  369. package/dist/team/runtime.d.ts +1 -0
  370. package/dist/team/runtime.d.ts.map +1 -1
  371. package/dist/team/runtime.js +19 -3
  372. package/dist/team/runtime.js.map +1 -1
  373. package/dist/team/scaling.d.ts.map +1 -1
  374. package/dist/team/scaling.js +3 -2
  375. package/dist/team/scaling.js.map +1 -1
  376. package/dist/team/state/tasks.d.ts.map +1 -1
  377. package/dist/team/state/tasks.js +24 -0
  378. package/dist/team/state/tasks.js.map +1 -1
  379. package/dist/team/state/types.d.ts +21 -1
  380. package/dist/team/state/types.d.ts.map +1 -1
  381. package/dist/team/state/types.js.map +1 -1
  382. package/dist/team/state.d.ts +17 -1
  383. package/dist/team/state.d.ts.map +1 -1
  384. package/dist/team/state.js +12 -5
  385. package/dist/team/state.js.map +1 -1
  386. package/dist/team/team-ops.d.ts +1 -1
  387. package/dist/team/team-ops.d.ts.map +1 -1
  388. package/dist/team/team-ops.js.map +1 -1
  389. package/dist/team/tmux-session.d.ts +2 -0
  390. package/dist/team/tmux-session.d.ts.map +1 -1
  391. package/dist/team/tmux-session.js +161 -13
  392. package/dist/team/tmux-session.js.map +1 -1
  393. package/dist/team/worker-bootstrap.d.ts.map +1 -1
  394. package/dist/team/worker-bootstrap.js +63 -0
  395. package/dist/team/worker-bootstrap.js.map +1 -1
  396. package/dist/utils/__tests__/agents-model-table.test.js +4 -2
  397. package/dist/utils/__tests__/agents-model-table.test.js.map +1 -1
  398. package/dist/utils/agents-model-table.d.ts.map +1 -1
  399. package/dist/utils/agents-model-table.js +3 -0
  400. package/dist/utils/agents-model-table.js.map +1 -1
  401. package/dist/verification/__tests__/ci-rust-gates.test.js +81 -1
  402. package/dist/verification/__tests__/ci-rust-gates.test.js.map +1 -1
  403. package/package.json +8 -8
  404. package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
  405. package/plugins/oh-my-codex/hooks/codex-native-hook.mjs +334 -21
  406. package/plugins/oh-my-codex/hooks/hooks.json +1 -2
  407. package/plugins/oh-my-codex/skills/autopilot/SKILL.md +13 -6
  408. package/plugins/oh-my-codex/skills/code-review/SKILL.md +7 -7
  409. package/plugins/oh-my-codex/skills/deep-interview/SKILL.md +9 -4
  410. package/plugins/oh-my-codex/skills/ralph/SKILL.md +22 -22
  411. package/plugins/oh-my-codex/skills/ralplan/SKILL.md +12 -0
  412. package/plugins/oh-my-codex/skills/team/SKILL.md +16 -0
  413. package/plugins/oh-my-codex/skills/ultraqa/SKILL.md +9 -0
  414. package/plugins/oh-my-codex/skills/worker/SKILL.md +14 -0
  415. package/skills/autopilot/SKILL.md +13 -6
  416. package/skills/code-review/SKILL.md +7 -7
  417. package/skills/deep-interview/SKILL.md +9 -4
  418. package/skills/ralph/SKILL.md +22 -22
  419. package/skills/ralplan/SKILL.md +12 -0
  420. package/skills/team/SKILL.md +16 -0
  421. package/skills/ultraqa/SKILL.md +9 -0
  422. package/skills/worker/SKILL.md +14 -0
  423. package/src/scripts/__tests__/codex-native-hook.test.ts +4435 -2083
  424. package/src/scripts/__tests__/notify-state-io.test.ts +95 -0
  425. package/src/scripts/__tests__/notify-tmux-injection.test.ts +82 -0
  426. package/src/scripts/__tests__/run-test-files.test.ts +102 -0
  427. package/src/scripts/__tests__/verify-native-agents.test.ts +75 -0
  428. package/src/scripts/codex-native-hook.ts +536 -51
  429. package/src/scripts/codex-native-pre-post.ts +80 -0
  430. package/src/scripts/demo-team-e2e.sh +10 -7
  431. package/src/scripts/eval/eval-parity-smoke.ts +1 -1
  432. package/src/scripts/hook-payload-guard.ts +113 -0
  433. package/src/scripts/notify-fallback-watcher.ts +8 -1
  434. package/src/scripts/notify-hook/__tests__/payload-guard.test.ts +41 -0
  435. package/src/scripts/notify-hook/auto-nudge.ts +3 -1
  436. package/src/scripts/notify-hook/ralph-session-resume.ts +2 -8
  437. package/src/scripts/notify-hook/state-io.ts +75 -37
  438. package/src/scripts/notify-hook/team-leader-nudge.ts +7 -0
  439. package/src/scripts/notify-hook/team-worker-stop.ts +193 -52
  440. package/src/scripts/notify-hook/tmux-injection.ts +35 -19
  441. package/src/scripts/notify-hook.ts +105 -6
  442. package/src/scripts/run-test-files.ts +192 -22
  443. package/src/scripts/sync-plugin-mirror.ts +98 -9
  444. package/src/scripts/verify-native-agents.ts +65 -1
@@ -5,11 +5,12 @@
5
5
  * This path is intentionally tied to a resolved, allowed native Stop event.
6
6
  * It must not depend on idle/heartbeat freshness or inferred progress stalls.
7
7
  */
8
- import { appendFile, mkdir, rename, writeFile } from 'fs/promises';
9
- import { dirname, join } from 'path';
8
+ import { existsSync } from 'fs';
9
+ import { appendFile, mkdir, rename, rm, stat, writeFile } from 'fs/promises';
10
+ import { dirname, join, relative } from 'path';
10
11
  import { DEFAULT_MARKER, paneHasActiveTask } from '../tmux-hook-engine.js';
11
12
  import { appendTeamDeliveryLog } from '../../team/delivery-log.js';
12
- import { safeString, asNumber } from './utils.js';
13
+ import { safeString, asNumber, isTerminalPhase } from './utils.js';
13
14
  import { readJsonIfExists } from './state-io.js';
14
15
  import { logTmuxHookEvent } from './log.js';
15
16
  import { evaluatePaneInjectionReadiness, queuePaneInput, sendPaneInput } from './team-tmux-guard.js';
@@ -19,6 +20,120 @@ const STOP_NUDGE_COOLDOWN_MS = 30_000;
19
20
  const SOURCE_TYPE = 'worker_stop';
20
21
  const LEADER_PANE_MISSING_NO_INJECTION_REASON = 'leader_pane_missing_no_injection';
21
22
  const LEADER_PANE_SHELL_NO_INJECTION_REASON = 'leader_pane_shell_no_injection';
23
+ const TEAM_SHUTDOWN_NO_INJECTION_REASON = 'team_state_gone_or_shutdown';
24
+ const TEAM_LOCK_HELD_REASON = 'suppressed_team_lock_held';
25
+ async function teamStateAllowsWorkerStopNudge(stateDir, teamName) {
26
+ const teamDir = join(stateDir, 'team', teamName);
27
+ if (!existsSync(teamDir))
28
+ return false;
29
+ if (existsSync(join(teamDir, 'shutdown.json')))
30
+ return false;
31
+ const phase = await readJsonIfExists(join(teamDir, 'phase.json'), null);
32
+ const currentPhase = safeString(phase?.current_phase || phase?.phase || '').trim();
33
+ if (currentPhase && isTerminalPhase(currentPhase))
34
+ return false;
35
+ return true;
36
+ }
37
+ async function acquireTeamStopNudgeLock(teamDir, nowMs, cooldownMs) {
38
+ const lockDir = join(teamDir, 'worker-stop-nudge.lock');
39
+ const staleAfterMs = Math.max(cooldownMs, 30_000);
40
+ for (let attempt = 0; attempt < 2; attempt += 1) {
41
+ try {
42
+ await mkdir(lockDir);
43
+ await writeFile(join(lockDir, 'owner.json'), JSON.stringify({
44
+ pid: process.pid,
45
+ acquired_at_ms: nowMs,
46
+ acquired_at: new Date(nowMs).toISOString(),
47
+ }, null, 2)).catch(() => { });
48
+ return { acquired: true, lockDir };
49
+ }
50
+ catch (error) {
51
+ if (error?.code === 'ENOENT')
52
+ return { acquired: false, reason: TEAM_SHUTDOWN_NO_INJECTION_REASON };
53
+ if (error?.code !== 'EEXIST')
54
+ return { acquired: false, reason: TEAM_LOCK_HELD_REASON };
55
+ try {
56
+ const lockStat = await stat(lockDir);
57
+ if ((nowMs - lockStat.mtimeMs) >= staleAfterMs) {
58
+ await rm(lockDir, { recursive: true, force: true });
59
+ continue;
60
+ }
61
+ }
62
+ catch {
63
+ continue;
64
+ }
65
+ return { acquired: false, reason: TEAM_LOCK_HELD_REASON };
66
+ }
67
+ }
68
+ return { acquired: false, reason: TEAM_LOCK_HELD_REASON };
69
+ }
70
+ async function releaseTeamStopNudgeLock(lockDir) {
71
+ if (!lockDir)
72
+ return;
73
+ await rm(lockDir, { recursive: true, force: true }).catch(() => { });
74
+ }
75
+ async function ensureDirectoryUnderExistingTeam(teamDir, targetDir) {
76
+ if (!existsSync(teamDir))
77
+ return false;
78
+ const rel = relative(teamDir, targetDir);
79
+ if (!rel)
80
+ return true;
81
+ if (rel.startsWith('..'))
82
+ throw new Error('state_path_outside_team_dir');
83
+ let current = teamDir;
84
+ for (const segment of rel.split(/[\\/]+/).filter(Boolean)) {
85
+ if (!existsSync(teamDir))
86
+ return false;
87
+ current = join(current, segment);
88
+ try {
89
+ await mkdir(current);
90
+ }
91
+ catch (error) {
92
+ if (error?.code === 'ENOENT' && !existsSync(teamDir))
93
+ return false;
94
+ if (error?.code !== 'EEXIST')
95
+ throw error;
96
+ const currentStat = await stat(current);
97
+ if (!currentStat.isDirectory())
98
+ throw error;
99
+ }
100
+ }
101
+ return existsSync(teamDir);
102
+ }
103
+ async function writeStopNudgeStateIfTeamExists(teamDir, statePath, state) {
104
+ const stateDir = dirname(statePath);
105
+ const ready = await ensureDirectoryUnderExistingTeam(teamDir, stateDir);
106
+ if (!ready)
107
+ return false;
108
+ try {
109
+ const tmpPath = `${statePath}.tmp.${process.pid}`;
110
+ await writeFile(tmpPath, JSON.stringify(state, null, 2));
111
+ await rename(tmpPath, statePath);
112
+ }
113
+ catch (error) {
114
+ if (error?.code === 'ENOENT' && !existsSync(teamDir))
115
+ return false;
116
+ throw error;
117
+ }
118
+ return existsSync(teamDir);
119
+ }
120
+ async function appendWorkerStopEventIfTeamExists(stateDir, teamName, event) {
121
+ const teamDir = join(stateDir, 'team', teamName);
122
+ const eventsDir = join(teamDir, 'events');
123
+ const ready = await ensureDirectoryUnderExistingTeam(teamDir, eventsDir);
124
+ if (!ready)
125
+ return false;
126
+ const eventsPath = join(eventsDir, 'events.ndjson');
127
+ try {
128
+ await appendFile(eventsPath, JSON.stringify(event) + '\n');
129
+ }
130
+ catch (error) {
131
+ if (error?.code === 'ENOENT' && !existsSync(teamDir))
132
+ return false;
133
+ throw error;
134
+ }
135
+ return existsSync(teamDir);
136
+ }
22
137
  function resolveWorkerStopCooldownMs() {
23
138
  const raw = safeString(process.env.OMX_TEAM_WORKER_STOP_COOLDOWN_MS || '');
24
139
  const parsed = asNumber(raw);
@@ -41,37 +156,28 @@ async function resolveCanonicalLeaderPaneId(leaderPaneId) {
41
156
  }
42
157
  return normalizedLeaderPaneId;
43
158
  }
44
- async function appendWorkerStopEvent(stateDir, teamName, event) {
45
- const eventsDir = join(stateDir, 'team', teamName, 'events');
46
- const eventsPath = join(eventsDir, 'events.ndjson');
47
- await mkdir(eventsDir, { recursive: true }).catch(() => { });
48
- await appendFile(eventsPath, JSON.stringify(event) + '\n').catch(() => { });
49
- }
50
- async function writeStopNudgeState(statePath, state) {
51
- await mkdir(dirname(statePath), { recursive: true }).catch(() => { });
52
- const tmpPath = `${statePath}.tmp.${process.pid}`;
53
- await writeFile(tmpPath, JSON.stringify(state, null, 2));
54
- await rename(tmpPath, statePath);
55
- }
56
159
  async function recordDeferred({ stateDir, logsDir, teamName, workerName, statePath, nextState, reason, tmuxSession, leaderPaneId, paneCurrentCommand = '', }) {
57
160
  const nowIso = nextState.last_notified_at;
58
- await writeStopNudgeState(statePath, {
161
+ const teamDir = join(stateDir, 'team', teamName);
162
+ const wroteState = await writeStopNudgeStateIfTeamExists(teamDir, statePath, {
59
163
  ...nextState,
60
164
  delivery: 'deferred',
61
165
  reason,
62
166
  pane_current_command: paneCurrentCommand || null,
63
167
  }).catch(() => { });
64
- await appendWorkerStopEvent(stateDir, teamName, {
65
- event_id: `worker-stop-deferred-${Date.now()}-${Math.random().toString(16).slice(2, 8)}`,
66
- team: teamName,
67
- type: 'worker_stop_leader_nudge',
68
- worker: workerName,
69
- to_worker: 'leader-fixed',
70
- delivery: 'deferred',
71
- reason,
72
- created_at: nowIso,
73
- source_type: SOURCE_TYPE,
74
- });
168
+ if (wroteState) {
169
+ await appendWorkerStopEventIfTeamExists(stateDir, teamName, {
170
+ event_id: `worker-stop-deferred-${Date.now()}-${Math.random().toString(16).slice(2, 8)}`,
171
+ team: teamName,
172
+ type: 'worker_stop_leader_nudge',
173
+ worker: workerName,
174
+ to_worker: 'leader-fixed',
175
+ delivery: 'deferred',
176
+ reason,
177
+ created_at: nowIso,
178
+ source_type: SOURCE_TYPE,
179
+ }).catch(() => { });
180
+ }
75
181
  await logTmuxHookEvent(logsDir, {
76
182
  timestamp: nowIso,
77
183
  type: 'leader_notification_deferred',
@@ -100,21 +206,13 @@ export async function maybeNudgeLeaderForAllowedWorkerStop({ stateDir, logsDir,
100
206
  const { teamName, workerName } = workerContext || {};
101
207
  if (!teamName || !workerName || !stateDir)
102
208
  return { ok: false, result: 'unresolved' };
103
- const workerDir = join(stateDir, 'team', teamName, 'workers', workerName);
209
+ const teamDir = join(stateDir, 'team', teamName);
210
+ const workerDir = join(teamDir, 'workers', workerName);
104
211
  const statePath = join(workerDir, 'worker-stop-nudge.json');
212
+ const teamStatePath = join(teamDir, 'worker-stop-nudge.json');
105
213
  const nowMs = Date.now();
106
214
  const nowIso = new Date(nowMs).toISOString();
107
- const existing = (await readJsonIfExists(statePath, null)) || {};
108
- const lastNotifiedMs = asNumber(existing.last_notified_at_ms) ?? 0;
109
215
  const cooldownMs = resolveWorkerStopCooldownMs();
110
- if ((nowMs - lastNotifiedMs) < cooldownMs) {
111
- return { ok: true, result: 'suppressed_cooldown' };
112
- }
113
- const teamInfo = await readTeamWorkersForIdleCheck(stateDir, teamName);
114
- if (!teamInfo)
115
- return { ok: false, result: 'unresolved' };
116
- const { tmuxSession, leaderPaneId } = teamInfo;
117
- const tmuxTarget = await resolveCanonicalLeaderPaneId(leaderPaneId);
118
216
  const nextState = {
119
217
  last_notified_at_ms: nowMs,
120
218
  last_notified_at: nowIso,
@@ -122,45 +220,81 @@ export async function maybeNudgeLeaderForAllowedWorkerStop({ stateDir, logsDir,
122
220
  worker: workerName,
123
221
  source_type: SOURCE_TYPE,
124
222
  };
125
- if (!tmuxTarget) {
126
- await recordDeferred({
127
- stateDir,
128
- logsDir,
129
- teamName,
130
- workerName,
131
- statePath,
132
- nextState,
133
- reason: LEADER_PANE_MISSING_NO_INJECTION_REASON,
134
- tmuxSession,
135
- leaderPaneId,
136
- });
137
- return { ok: true, result: 'deferred' };
223
+ let tmuxSession = '';
224
+ let leaderPaneId = '';
225
+ if (!(await teamStateAllowsWorkerStopNudge(stateDir, teamName))) {
226
+ return { ok: true, result: TEAM_SHUTDOWN_NO_INJECTION_REASON };
138
227
  }
139
- const paneGuard = await evaluatePaneInjectionReadiness(tmuxTarget, {
140
- skipIfScrolling: true,
141
- requireRunningAgent: true,
142
- requireReady: false,
143
- requireIdle: false,
144
- });
145
- if (!paneGuard.ok) {
146
- await recordDeferred({
147
- stateDir,
148
- logsDir,
149
- teamName,
150
- workerName,
151
- statePath,
152
- nextState,
153
- reason: paneGuard.reason === 'pane_running_shell' ? LEADER_PANE_SHELL_NO_INJECTION_REASON : paneGuard.reason,
154
- tmuxSession,
155
- leaderPaneId,
156
- paneCurrentCommand: paneGuard.paneCurrentCommand,
157
- });
158
- return { ok: true, result: 'deferred' };
228
+ const lock = await acquireTeamStopNudgeLock(teamDir, nowMs, cooldownMs);
229
+ if (!lock.acquired) {
230
+ return { ok: true, result: lock.reason || TEAM_LOCK_HELD_REASON };
159
231
  }
160
- const prompt = `[OMX] ${workerName} native Stop allowed. `
161
- + `Run \`omx team status ${teamName}\`, read worker messages/results, then assign next task, reconcile completion, or shut down. `
162
- + DEFAULT_MARKER;
163
232
  try {
233
+ if (!(await teamStateAllowsWorkerStopNudge(stateDir, teamName))) {
234
+ return { ok: true, result: TEAM_SHUTDOWN_NO_INJECTION_REASON };
235
+ }
236
+ const teamExisting = (await readJsonIfExists(teamStatePath, null)) || {};
237
+ const teamLastNotifiedMs = asNumber(teamExisting.last_notified_at_ms) ?? 0;
238
+ if ((nowMs - teamLastNotifiedMs) < cooldownMs) {
239
+ return { ok: true, result: 'suppressed_team_cooldown' };
240
+ }
241
+ const existing = (await readJsonIfExists(statePath, null)) || {};
242
+ const lastNotifiedMs = asNumber(existing.last_notified_at_ms) ?? 0;
243
+ if ((nowMs - lastNotifiedMs) < cooldownMs) {
244
+ return { ok: true, result: 'suppressed_cooldown' };
245
+ }
246
+ const teamInfo = await readTeamWorkersForIdleCheck(stateDir, teamName);
247
+ if (!teamInfo)
248
+ return { ok: false, result: 'unresolved' };
249
+ ({ tmuxSession, leaderPaneId } = teamInfo);
250
+ const tmuxTarget = await resolveCanonicalLeaderPaneId(leaderPaneId);
251
+ if (!tmuxTarget) {
252
+ if (!(await teamStateAllowsWorkerStopNudge(stateDir, teamName))) {
253
+ return { ok: true, result: TEAM_SHUTDOWN_NO_INJECTION_REASON };
254
+ }
255
+ await recordDeferred({
256
+ stateDir,
257
+ logsDir,
258
+ teamName,
259
+ workerName,
260
+ statePath,
261
+ nextState,
262
+ reason: LEADER_PANE_MISSING_NO_INJECTION_REASON,
263
+ tmuxSession,
264
+ leaderPaneId,
265
+ });
266
+ return { ok: true, result: 'deferred' };
267
+ }
268
+ const paneGuard = await evaluatePaneInjectionReadiness(tmuxTarget, {
269
+ skipIfScrolling: true,
270
+ requireRunningAgent: true,
271
+ requireReady: false,
272
+ requireIdle: false,
273
+ });
274
+ if (!paneGuard.ok) {
275
+ if (!(await teamStateAllowsWorkerStopNudge(stateDir, teamName))) {
276
+ return { ok: true, result: TEAM_SHUTDOWN_NO_INJECTION_REASON };
277
+ }
278
+ await recordDeferred({
279
+ stateDir,
280
+ logsDir,
281
+ teamName,
282
+ workerName,
283
+ statePath,
284
+ nextState,
285
+ reason: paneGuard.reason === 'pane_running_shell' ? LEADER_PANE_SHELL_NO_INJECTION_REASON : paneGuard.reason,
286
+ tmuxSession,
287
+ leaderPaneId,
288
+ paneCurrentCommand: paneGuard.paneCurrentCommand,
289
+ });
290
+ return { ok: true, result: 'deferred' };
291
+ }
292
+ if (!(await teamStateAllowsWorkerStopNudge(stateDir, teamName))) {
293
+ return { ok: true, result: TEAM_SHUTDOWN_NO_INJECTION_REASON };
294
+ }
295
+ const prompt = `[OMX] ${workerName} native Stop allowed. `
296
+ + `Run \`omx team status ${teamName}\`, read worker messages/results, then assign next task, reconcile completion, or shut down. `
297
+ + DEFAULT_MARKER;
164
298
  const leaderHasActiveTask = paneHasActiveTask(paneGuard.paneCapture);
165
299
  let deliveryMode = 'sent';
166
300
  if (leaderHasActiveTask) {
@@ -182,22 +316,28 @@ export async function maybeNudgeLeaderForAllowedWorkerStop({ stateDir, logsDir,
182
316
  if (!sendResult.ok)
183
317
  throw new Error(sendResult.error || sendResult.reason || 'send_failed');
184
318
  }
185
- await writeStopNudgeState(statePath, {
319
+ const deliveryState = {
186
320
  ...nextState,
187
321
  delivery: deliveryMode,
188
322
  leader_pane_id: leaderPaneId || null,
189
323
  tmux_target: tmuxTarget,
190
- });
191
- await appendWorkerStopEvent(stateDir, teamName, {
192
- event_id: `worker-stop-nudge-${Date.now()}-${Math.random().toString(16).slice(2, 8)}`,
193
- team: teamName,
194
- type: 'worker_stop_leader_nudge',
195
- worker: workerName,
196
- to_worker: 'leader-fixed',
197
- delivery: deliveryMode,
198
- created_at: nowIso,
199
- source_type: SOURCE_TYPE,
200
- });
324
+ };
325
+ const wroteWorkerState = await writeStopNudgeStateIfTeamExists(teamDir, statePath, deliveryState);
326
+ const wroteTeamState = wroteWorkerState
327
+ ? await writeStopNudgeStateIfTeamExists(teamDir, teamStatePath, deliveryState)
328
+ : false;
329
+ if (wroteTeamState) {
330
+ await appendWorkerStopEventIfTeamExists(stateDir, teamName, {
331
+ event_id: `worker-stop-nudge-${Date.now()}-${Math.random().toString(16).slice(2, 8)}`,
332
+ team: teamName,
333
+ type: 'worker_stop_leader_nudge',
334
+ worker: workerName,
335
+ to_worker: 'leader-fixed',
336
+ delivery: deliveryMode,
337
+ created_at: nowIso,
338
+ source_type: SOURCE_TYPE,
339
+ }).catch(() => { });
340
+ }
201
341
  await logTmuxHookEvent(logsDir, {
202
342
  timestamp: nowIso,
203
343
  type: 'worker_stop_leader_nudge',
@@ -220,6 +360,11 @@ export async function maybeNudgeLeaderForAllowedWorkerStop({ stateDir, logsDir,
220
360
  return { ok: true, result: deliveryMode };
221
361
  }
222
362
  catch (err) {
363
+ if (!(await teamStateAllowsWorkerStopNudge(stateDir, teamName))) {
364
+ return { ok: true, result: TEAM_SHUTDOWN_NO_INJECTION_REASON };
365
+ }
366
+ // Worker Stop is already allowed before this helper runs; nudge failures are
367
+ // surfaced as deferred operational evidence instead of re-blocking Stop.
223
368
  await recordDeferred({
224
369
  stateDir,
225
370
  logsDir,
@@ -233,5 +378,8 @@ export async function maybeNudgeLeaderForAllowedWorkerStop({ stateDir, logsDir,
233
378
  });
234
379
  return { ok: true, result: 'deferred' };
235
380
  }
381
+ finally {
382
+ await releaseTeamStopNudgeLock(lock.lockDir);
383
+ }
236
384
  }
237
385
  //# sourceMappingURL=team-worker-stop.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"team-worker-stop.js","sourceRoot":"","sources":["../../../src/scripts/notify-hook/team-worker-stop.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"team-worker-stop.js","sourceRoot":"","sources":["../../../src/scripts/notify-hook/team-worker-stop.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,13 @@
2
2
  * Tmux prompt injection for notify-hook.
3
3
  * Handles pane resolution, injection guards, and state healing.
4
4
  */
5
+ export declare function readVisibleAllowedModes(cwd: string, stateDir: string, payload: any, allowedModes: string[]): Promise<{
6
+ canonicalPresent: boolean;
7
+ activeSkillCount: number;
8
+ allowedSet: Set<string> | null;
9
+ preferredMode: string | null;
10
+ sessionScoped: boolean;
11
+ }>;
5
12
  export declare function resolveSessionToPane(sessionName: any): Promise<string | null>;
6
13
  export declare function resolvePaneTarget(target: any, expectedCwd: any, modePane: any, cwd: string, payload: any): Promise<any>;
7
14
  export declare function handleTmuxInjection({ payload, cwd, stateDir, logsDir, }: any): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"tmux-injection.d.ts","sourceRoot":"","sources":["../../../src/scripts/notify-hook/tmux-injection.ts"],"names":[],"mappings":"AACA;;;GAGG;AA+OH,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA8BnF;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAiH7H;AAED,wBAAsB,mBAAmB,CAAC,EACxC,OAAO,EACP,GAAG,EACH,QAAQ,EACR,OAAO,GACR,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAwUrB"}
1
+ {"version":3,"file":"tmux-injection.d.ts","sourceRoot":"","sources":["../../../src/scripts/notify-hook/tmux-injection.ts"],"names":[],"mappings":"AACA;;;GAGG;AA6LH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,GAAG,EACZ,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC;IACT,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAC/B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC,CAqDD;AAED,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA8BnF;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAiH7H;AAED,wBAAsB,mBAAmB,CAAC,EACxC,OAAO,EACP,GAAG,EACH,QAAQ,EACR,OAAO,GACR,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAwUrB"}
@@ -12,7 +12,7 @@ import { runProcess } from './process-runner.js';
12
12
  import { logTmuxHookEvent } from './log.js';
13
13
  import { resolveInvocationSessionId, resolveManagedCurrentPane, resolveManagedSessionContext, verifyManagedPaneTarget } from './managed-tmux.js';
14
14
  import { evaluatePaneInjectionReadiness, mapPaneInjectionReadinessReason, sendPaneInput } from './team-tmux-guard.js';
15
- import { listActiveSkills, readVisibleSkillActiveState } from '../../state/skill-active.js';
15
+ import { listActiveSkills, readVisibleSkillActiveStateForStateDir } from '../../state/skill-active.js';
16
16
  import { normalizeTmuxHookConfig, pickActiveMode, evaluateInjectionGuards, buildSendKeysArgv, } from '../tmux-hook-engine.js';
17
17
  function isHudPaneStartCommand(startCommand) {
18
18
  return /\bomx\b.*\bhud\b.*--watch/i.test(safeString(startCommand));
@@ -86,12 +86,10 @@ async function resolveCanonicalPaneFromPaneTarget(paneTarget, expectedCwd) {
86
86
  return { paneTarget: null, reason: 'target_is_hud_pane' };
87
87
  return finalizeResolvedPane(healedPaneId, 'healed_hud_pane_target', expectedCwd);
88
88
  }
89
- async function resolvePreferredModePane(stateDir, allowedModes) {
90
- const scopedDirs = await getScopedStateDirsForCurrentSession(stateDir).catch(() => [stateDir]);
91
- const dirs = [...scopedDirs];
92
- if (!dirs.map((dir) => resolvePath(dir)).includes(resolvePath(stateDir))) {
93
- dirs.push(stateDir);
94
- }
89
+ async function resolvePreferredModePane(stateDir, allowedModes, options = {}) {
90
+ const dirs = await getScopedStateDirsForCurrentSession(stateDir, undefined, {
91
+ includeRootFallback: options.includeRootFallback !== false,
92
+ }).catch(() => [stateDir]);
95
93
  for (const dir of dirs) {
96
94
  for (const mode of allowedModes || []) {
97
95
  const path = join(dir, `${mode}-state.json`);
@@ -159,7 +157,7 @@ async function validateResolvedInjectionOwnership({ paneTarget, cwd, payload, mo
159
157
  }
160
158
  return { ok: true };
161
159
  }
162
- async function readVisibleAllowedModes(cwd, stateDir, payload, allowedModes) {
160
+ export async function readVisibleAllowedModes(cwd, stateDir, payload, allowedModes) {
163
161
  const candidateSessionIds = [
164
162
  await readCurrentSessionId(stateDir).catch(() => undefined),
165
163
  resolveInvocationSessionId(payload),
@@ -167,35 +165,43 @@ async function readVisibleAllowedModes(cwd, stateDir, payload, allowedModes) {
167
165
  .map((value) => safeString(value).trim())
168
166
  .filter(Boolean);
169
167
  for (const sessionId of candidateSessionIds) {
170
- const canonicalState = await readVisibleSkillActiveState(cwd, sessionId);
168
+ const canonicalState = await readVisibleSkillActiveStateForStateDir(stateDir, sessionId);
171
169
  if (!canonicalState)
172
170
  continue;
173
- const allowedSet = new Set(listActiveSkills(canonicalState)
171
+ const activeSkills = listActiveSkills(canonicalState);
172
+ const allowedSet = new Set(activeSkills
174
173
  .map((entry) => entry.skill)
175
174
  .filter((skill) => allowedModes.includes(skill)));
176
175
  return {
177
176
  canonicalPresent: true,
177
+ activeSkillCount: activeSkills.length,
178
178
  allowedSet,
179
179
  preferredMode: pickActiveMode([...allowedSet], allowedModes),
180
+ sessionScoped: true,
180
181
  };
181
182
  }
182
183
  if (candidateSessionIds.length === 0) {
183
- const rootCanonicalState = await readVisibleSkillActiveState(cwd).catch(() => null);
184
+ const rootCanonicalState = await readVisibleSkillActiveStateForStateDir(stateDir).catch(() => null);
184
185
  if (rootCanonicalState) {
185
- const allowedSet = new Set(listActiveSkills(rootCanonicalState)
186
+ const activeSkills = listActiveSkills(rootCanonicalState);
187
+ const allowedSet = new Set(activeSkills
186
188
  .map((entry) => entry.skill)
187
189
  .filter((skill) => allowedModes.includes(skill)));
188
190
  return {
189
191
  canonicalPresent: true,
192
+ activeSkillCount: activeSkills.length,
190
193
  allowedSet,
191
194
  preferredMode: pickActiveMode([...allowedSet], allowedModes),
195
+ sessionScoped: false,
192
196
  };
193
197
  }
194
198
  }
195
199
  return {
196
200
  canonicalPresent: false,
201
+ activeSkillCount: 0,
197
202
  allowedSet: null,
198
203
  preferredMode: null,
204
+ sessionScoped: candidateSessionIds.length > 0,
199
205
  };
200
206
  }
201
207
  export async function resolveSessionToPane(sessionName) {
@@ -368,10 +374,11 @@ export async function handleTmuxInjection({ payload, cwd, stateDir, logsDir, })
368
374
  state.recent_keys = pruneRecentKeys(state.recent_keys, now);
369
375
  const canonicalModeState = await readVisibleAllowedModes(cwd, stateDir, payload, config.allowed_modes).catch(() => ({
370
376
  canonicalPresent: false,
377
+ activeSkillCount: 0,
371
378
  allowedSet: null,
372
379
  preferredMode: null,
373
380
  }));
374
- if (canonicalModeState.canonicalPresent && !canonicalModeState.preferredMode) {
381
+ if (canonicalModeState.canonicalPresent && canonicalModeState.activeSkillCount > 0 && !canonicalModeState.preferredMode) {
375
382
  const nextState = {
376
383
  ...state,
377
384
  last_reason: 'mode_not_allowed',
@@ -422,18 +429,17 @@ export async function handleTmuxInjection({ payload, cwd, stateDir, logsDir, })
422
429
  }
423
430
  };
424
431
  try {
425
- const scopedDirs = await getScopedStateDirsForCurrentSession(stateDir);
432
+ const scopedDirs = await getScopedStateDirsForCurrentSession(stateDir, undefined, {
433
+ includeRootFallback: !canonicalModeState.canonicalPresent && !canonicalModeState.sessionScoped,
434
+ });
426
435
  await scanActiveModeStateDirs(scopedDirs);
427
- if (!pickActiveMode(activeModes, config.allowed_modes) && !scannedStateDirs.has(resolvePath(stateDir))) {
428
- await scanActiveModeStateDirs([stateDir], true);
429
- }
430
436
  }
431
437
  catch {
432
438
  // Non-fatal
433
439
  }
434
440
  const preferredModePane = await resolvePreferredModePane(stateDir, canonicalModeState.canonicalPresent
435
441
  ? (canonicalModeState.preferredMode ? [canonicalModeState.preferredMode] : [])
436
- : config.allowed_modes).catch(() => null);
442
+ : config.allowed_modes, { includeRootFallback: !canonicalModeState.sessionScoped }).catch(() => null);
437
443
  const mode = canonicalModeState.canonicalPresent
438
444
  ? canonicalModeState.preferredMode
439
445
  : (preferredModePane?.mode || pickActiveMode(activeModes, config.allowed_modes));