oh-my-codex-pennix 0.18.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3061) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/Cargo.lock +185 -0
  3. package/Cargo.toml +24 -0
  4. package/README.md +445 -0
  5. package/crates/omx-api/Cargo.toml +19 -0
  6. package/crates/omx-api/src/lib.rs +2997 -0
  7. package/crates/omx-api/src/main.rs +10 -0
  8. package/crates/omx-api/tests/cli.rs +558 -0
  9. package/crates/omx-explore/Cargo.toml +14 -0
  10. package/crates/omx-explore/src/main.rs +2972 -0
  11. package/crates/omx-mux/Cargo.toml +11 -0
  12. package/crates/omx-mux/src/lib.rs +91 -0
  13. package/crates/omx-mux/src/tmux.rs +282 -0
  14. package/crates/omx-mux/src/types.rs +306 -0
  15. package/crates/omx-runtime/Cargo.toml +13 -0
  16. package/crates/omx-runtime/src/main.rs +125 -0
  17. package/crates/omx-runtime/tests/execution.rs +212 -0
  18. package/crates/omx-runtime-core/Cargo.toml +13 -0
  19. package/crates/omx-runtime-core/src/authority.rs +239 -0
  20. package/crates/omx-runtime-core/src/dispatch.rs +330 -0
  21. package/crates/omx-runtime-core/src/engine.rs +853 -0
  22. package/crates/omx-runtime-core/src/lib.rs +653 -0
  23. package/crates/omx-runtime-core/src/mailbox.rs +261 -0
  24. package/crates/omx-runtime-core/src/replay.rs +104 -0
  25. package/crates/omx-sparkshell/Cargo.lock +7 -0
  26. package/crates/omx-sparkshell/Cargo.toml +14 -0
  27. package/crates/omx-sparkshell/src/codex_bridge.rs +768 -0
  28. package/crates/omx-sparkshell/src/error.rs +45 -0
  29. package/crates/omx-sparkshell/src/exec.rs +241 -0
  30. package/crates/omx-sparkshell/src/main.rs +1133 -0
  31. package/crates/omx-sparkshell/src/prompt.rs +364 -0
  32. package/crates/omx-sparkshell/src/redaction.rs +241 -0
  33. package/crates/omx-sparkshell/src/registry/c_cpp.rs +9 -0
  34. package/crates/omx-sparkshell/src/registry/csharp.rs +10 -0
  35. package/crates/omx-sparkshell/src/registry/generic_shell.rs +11 -0
  36. package/crates/omx-sparkshell/src/registry/git.rs +10 -0
  37. package/crates/omx-sparkshell/src/registry/go.rs +9 -0
  38. package/crates/omx-sparkshell/src/registry/java_kotlin.rs +9 -0
  39. package/crates/omx-sparkshell/src/registry/mod.rs +85 -0
  40. package/crates/omx-sparkshell/src/registry/node_js.rs +9 -0
  41. package/crates/omx-sparkshell/src/registry/python.rs +9 -0
  42. package/crates/omx-sparkshell/src/registry/ruby.rs +9 -0
  43. package/crates/omx-sparkshell/src/registry/rust.rs +9 -0
  44. package/crates/omx-sparkshell/src/registry/swift.rs +10 -0
  45. package/crates/omx-sparkshell/src/test_support.rs +10 -0
  46. package/crates/omx-sparkshell/src/threshold.rs +75 -0
  47. package/crates/omx-sparkshell/tests/execution.rs +986 -0
  48. package/crates/omx-sparkshell/tests/registry.rs +99 -0
  49. package/dist/adapt/__tests__/foundation.test.d.ts +2 -0
  50. package/dist/adapt/__tests__/foundation.test.d.ts.map +1 -0
  51. package/dist/adapt/__tests__/foundation.test.js +171 -0
  52. package/dist/adapt/__tests__/foundation.test.js.map +1 -0
  53. package/dist/adapt/__tests__/hermes.test.d.ts +2 -0
  54. package/dist/adapt/__tests__/hermes.test.d.ts.map +1 -0
  55. package/dist/adapt/__tests__/hermes.test.js +137 -0
  56. package/dist/adapt/__tests__/hermes.test.js.map +1 -0
  57. package/dist/adapt/contracts.d.ts +157 -0
  58. package/dist/adapt/contracts.d.ts.map +1 -0
  59. package/dist/adapt/contracts.js +10 -0
  60. package/dist/adapt/contracts.js.map +1 -0
  61. package/dist/adapt/hermes.d.ts +83 -0
  62. package/dist/adapt/hermes.d.ts.map +1 -0
  63. package/dist/adapt/hermes.js +371 -0
  64. package/dist/adapt/hermes.js.map +1 -0
  65. package/dist/adapt/index.d.ts +14 -0
  66. package/dist/adapt/index.d.ts.map +1 -0
  67. package/dist/adapt/index.js +293 -0
  68. package/dist/adapt/index.js.map +1 -0
  69. package/dist/adapt/openclaw.d.ts +7 -0
  70. package/dist/adapt/openclaw.d.ts.map +1 -0
  71. package/dist/adapt/openclaw.js +299 -0
  72. package/dist/adapt/openclaw.js.map +1 -0
  73. package/dist/adapt/paths.d.ts +3 -0
  74. package/dist/adapt/paths.d.ts.map +1 -0
  75. package/dist/adapt/paths.js +15 -0
  76. package/dist/adapt/paths.js.map +1 -0
  77. package/dist/adapt/registry.d.ts +4 -0
  78. package/dist/adapt/registry.d.ts.map +1 -0
  79. package/dist/adapt/registry.js +48 -0
  80. package/dist/adapt/registry.js.map +1 -0
  81. package/dist/agents/__tests__/definitions.test.d.ts +2 -0
  82. package/dist/agents/__tests__/definitions.test.d.ts.map +1 -0
  83. package/dist/agents/__tests__/definitions.test.js +96 -0
  84. package/dist/agents/__tests__/definitions.test.js.map +1 -0
  85. package/dist/agents/__tests__/native-config.test.d.ts +2 -0
  86. package/dist/agents/__tests__/native-config.test.d.ts.map +1 -0
  87. package/dist/agents/__tests__/native-config.test.js +398 -0
  88. package/dist/agents/__tests__/native-config.test.js.map +1 -0
  89. package/dist/agents/definitions.d.ts +35 -0
  90. package/dist/agents/definitions.d.ts.map +1 -0
  91. package/dist/agents/definitions.js +371 -0
  92. package/dist/agents/definitions.js.map +1 -0
  93. package/dist/agents/native-config.d.ts +56 -0
  94. package/dist/agents/native-config.d.ts.map +1 -0
  95. package/dist/agents/native-config.js +285 -0
  96. package/dist/agents/native-config.js.map +1 -0
  97. package/dist/agents/policy.d.ts +10 -0
  98. package/dist/agents/policy.d.ts.map +1 -0
  99. package/dist/agents/policy.js +61 -0
  100. package/dist/agents/policy.js.map +1 -0
  101. package/dist/auth/__tests__/config-sessions.test.d.ts +2 -0
  102. package/dist/auth/__tests__/config-sessions.test.d.ts.map +1 -0
  103. package/dist/auth/__tests__/config-sessions.test.js +48 -0
  104. package/dist/auth/__tests__/config-sessions.test.js.map +1 -0
  105. package/dist/auth/__tests__/quota-rotation.test.d.ts +2 -0
  106. package/dist/auth/__tests__/quota-rotation.test.d.ts.map +1 -0
  107. package/dist/auth/__tests__/quota-rotation.test.js +33 -0
  108. package/dist/auth/__tests__/quota-rotation.test.js.map +1 -0
  109. package/dist/auth/__tests__/redact.test.d.ts +2 -0
  110. package/dist/auth/__tests__/redact.test.d.ts.map +1 -0
  111. package/dist/auth/__tests__/redact.test.js +20 -0
  112. package/dist/auth/__tests__/redact.test.js.map +1 -0
  113. package/dist/auth/__tests__/storage.test.d.ts +2 -0
  114. package/dist/auth/__tests__/storage.test.d.ts.map +1 -0
  115. package/dist/auth/__tests__/storage.test.js +108 -0
  116. package/dist/auth/__tests__/storage.test.js.map +1 -0
  117. package/dist/auth/config.d.ts +9 -0
  118. package/dist/auth/config.d.ts.map +1 -0
  119. package/dist/auth/config.js +77 -0
  120. package/dist/auth/config.js.map +1 -0
  121. package/dist/auth/hotswap.d.ts +36 -0
  122. package/dist/auth/hotswap.d.ts.map +1 -0
  123. package/dist/auth/hotswap.js +159 -0
  124. package/dist/auth/hotswap.js.map +1 -0
  125. package/dist/auth/index.d.ts +8 -0
  126. package/dist/auth/index.d.ts.map +1 -0
  127. package/dist/auth/index.js +8 -0
  128. package/dist/auth/index.js.map +1 -0
  129. package/dist/auth/paths.d.ts +12 -0
  130. package/dist/auth/paths.d.ts.map +1 -0
  131. package/dist/auth/paths.js +78 -0
  132. package/dist/auth/paths.js.map +1 -0
  133. package/dist/auth/quota-detector.d.ts +10 -0
  134. package/dist/auth/quota-detector.d.ts.map +1 -0
  135. package/dist/auth/quota-detector.js +40 -0
  136. package/dist/auth/quota-detector.js.map +1 -0
  137. package/dist/auth/redact.d.ts +2 -0
  138. package/dist/auth/redact.d.ts.map +1 -0
  139. package/dist/auth/redact.js +26 -0
  140. package/dist/auth/redact.js.map +1 -0
  141. package/dist/auth/rotation.d.ts +9 -0
  142. package/dist/auth/rotation.d.ts.map +1 -0
  143. package/dist/auth/rotation.js +26 -0
  144. package/dist/auth/rotation.js.map +1 -0
  145. package/dist/auth/sessions.d.ts +15 -0
  146. package/dist/auth/sessions.d.ts.map +1 -0
  147. package/dist/auth/sessions.js +62 -0
  148. package/dist/auth/sessions.js.map +1 -0
  149. package/dist/auth/storage.d.ts +27 -0
  150. package/dist/auth/storage.d.ts.map +1 -0
  151. package/dist/auth/storage.js +111 -0
  152. package/dist/auth/storage.js.map +1 -0
  153. package/dist/autopilot/__tests__/deep-interview-gate.test.d.ts +2 -0
  154. package/dist/autopilot/__tests__/deep-interview-gate.test.d.ts.map +1 -0
  155. package/dist/autopilot/__tests__/deep-interview-gate.test.js +215 -0
  156. package/dist/autopilot/__tests__/deep-interview-gate.test.js.map +1 -0
  157. package/dist/autopilot/__tests__/fsm.test.d.ts +2 -0
  158. package/dist/autopilot/__tests__/fsm.test.d.ts.map +1 -0
  159. package/dist/autopilot/__tests__/fsm.test.js +78 -0
  160. package/dist/autopilot/__tests__/fsm.test.js.map +1 -0
  161. package/dist/autopilot/__tests__/ralplan-gate.test.d.ts +2 -0
  162. package/dist/autopilot/__tests__/ralplan-gate.test.d.ts.map +1 -0
  163. package/dist/autopilot/__tests__/ralplan-gate.test.js +274 -0
  164. package/dist/autopilot/__tests__/ralplan-gate.test.js.map +1 -0
  165. package/dist/autopilot/completion-gate.d.ts +10 -0
  166. package/dist/autopilot/completion-gate.d.ts.map +1 -0
  167. package/dist/autopilot/completion-gate.js +154 -0
  168. package/dist/autopilot/completion-gate.js.map +1 -0
  169. package/dist/autopilot/deep-interview-gate.d.ts +18 -0
  170. package/dist/autopilot/deep-interview-gate.d.ts.map +1 -0
  171. package/dist/autopilot/deep-interview-gate.js +396 -0
  172. package/dist/autopilot/deep-interview-gate.js.map +1 -0
  173. package/dist/autopilot/fsm.d.ts +13 -0
  174. package/dist/autopilot/fsm.d.ts.map +1 -0
  175. package/dist/autopilot/fsm.js +70 -0
  176. package/dist/autopilot/fsm.js.map +1 -0
  177. package/dist/autopilot/ralplan-gate.d.ts +17 -0
  178. package/dist/autopilot/ralplan-gate.d.ts.map +1 -0
  179. package/dist/autopilot/ralplan-gate.js +68 -0
  180. package/dist/autopilot/ralplan-gate.js.map +1 -0
  181. package/dist/autoresearch/__tests__/contracts.test.d.ts +2 -0
  182. package/dist/autoresearch/__tests__/contracts.test.d.ts.map +1 -0
  183. package/dist/autoresearch/__tests__/contracts.test.js +127 -0
  184. package/dist/autoresearch/__tests__/contracts.test.js.map +1 -0
  185. package/dist/autoresearch/__tests__/runtime-parity-extra.test.d.ts +2 -0
  186. package/dist/autoresearch/__tests__/runtime-parity-extra.test.d.ts.map +1 -0
  187. package/dist/autoresearch/__tests__/runtime-parity-extra.test.js +349 -0
  188. package/dist/autoresearch/__tests__/runtime-parity-extra.test.js.map +1 -0
  189. package/dist/autoresearch/__tests__/runtime.test.d.ts +2 -0
  190. package/dist/autoresearch/__tests__/runtime.test.d.ts.map +1 -0
  191. package/dist/autoresearch/__tests__/runtime.test.js +211 -0
  192. package/dist/autoresearch/__tests__/runtime.test.js.map +1 -0
  193. package/dist/autoresearch/__tests__/skill-validation.test.d.ts +2 -0
  194. package/dist/autoresearch/__tests__/skill-validation.test.d.ts.map +1 -0
  195. package/dist/autoresearch/__tests__/skill-validation.test.js +91 -0
  196. package/dist/autoresearch/__tests__/skill-validation.test.js.map +1 -0
  197. package/dist/autoresearch/contracts.d.ts +31 -0
  198. package/dist/autoresearch/contracts.d.ts.map +1 -0
  199. package/dist/autoresearch/contracts.js +197 -0
  200. package/dist/autoresearch/contracts.js.map +1 -0
  201. package/dist/autoresearch/goal.d.ts +90 -0
  202. package/dist/autoresearch/goal.d.ts.map +1 -0
  203. package/dist/autoresearch/goal.js +237 -0
  204. package/dist/autoresearch/goal.js.map +1 -0
  205. package/dist/autoresearch/runtime.d.ts +132 -0
  206. package/dist/autoresearch/runtime.d.ts.map +1 -0
  207. package/dist/autoresearch/runtime.js +1022 -0
  208. package/dist/autoresearch/runtime.js.map +1 -0
  209. package/dist/autoresearch/skill-validation.d.ts +14 -0
  210. package/dist/autoresearch/skill-validation.d.ts.map +1 -0
  211. package/dist/autoresearch/skill-validation.js +172 -0
  212. package/dist/autoresearch/skill-validation.js.map +1 -0
  213. package/dist/catalog/__tests__/generator.test.d.ts +2 -0
  214. package/dist/catalog/__tests__/generator.test.d.ts.map +1 -0
  215. package/dist/catalog/__tests__/generator.test.js +60 -0
  216. package/dist/catalog/__tests__/generator.test.js.map +1 -0
  217. package/dist/catalog/__tests__/plugin-bundle-ssot.test.d.ts +2 -0
  218. package/dist/catalog/__tests__/plugin-bundle-ssot.test.d.ts.map +1 -0
  219. package/dist/catalog/__tests__/plugin-bundle-ssot.test.js +108 -0
  220. package/dist/catalog/__tests__/plugin-bundle-ssot.test.js.map +1 -0
  221. package/dist/catalog/__tests__/schema.test.d.ts +2 -0
  222. package/dist/catalog/__tests__/schema.test.d.ts.map +1 -0
  223. package/dist/catalog/__tests__/schema.test.js +84 -0
  224. package/dist/catalog/__tests__/schema.test.js.map +1 -0
  225. package/dist/catalog/installable.d.ts +5 -0
  226. package/dist/catalog/installable.d.ts.map +1 -0
  227. package/dist/catalog/installable.js +13 -0
  228. package/dist/catalog/installable.js.map +1 -0
  229. package/dist/catalog/reader.d.ts +19 -0
  230. package/dist/catalog/reader.d.ts.map +1 -0
  231. package/dist/catalog/reader.js +63 -0
  232. package/dist/catalog/reader.js.map +1 -0
  233. package/dist/catalog/schema.d.ts +32 -0
  234. package/dist/catalog/schema.d.ts.map +1 -0
  235. package/dist/catalog/schema.js +107 -0
  236. package/dist/catalog/schema.js.map +1 -0
  237. package/dist/catalog/skill-mirror.d.ts +20 -0
  238. package/dist/catalog/skill-mirror.d.ts.map +1 -0
  239. package/dist/catalog/skill-mirror.js +104 -0
  240. package/dist/catalog/skill-mirror.js.map +1 -0
  241. package/dist/cli/__tests__/adapt-help.test.d.ts +2 -0
  242. package/dist/cli/__tests__/adapt-help.test.d.ts.map +1 -0
  243. package/dist/cli/__tests__/adapt-help.test.js +39 -0
  244. package/dist/cli/__tests__/adapt-help.test.js.map +1 -0
  245. package/dist/cli/__tests__/adapt.test.d.ts +2 -0
  246. package/dist/cli/__tests__/adapt.test.d.ts.map +1 -0
  247. package/dist/cli/__tests__/adapt.test.js +62 -0
  248. package/dist/cli/__tests__/adapt.test.js.map +1 -0
  249. package/dist/cli/__tests__/agents-init.test.d.ts +2 -0
  250. package/dist/cli/__tests__/agents-init.test.d.ts.map +1 -0
  251. package/dist/cli/__tests__/agents-init.test.js +184 -0
  252. package/dist/cli/__tests__/agents-init.test.js.map +1 -0
  253. package/dist/cli/__tests__/agents.test.d.ts +2 -0
  254. package/dist/cli/__tests__/agents.test.d.ts.map +1 -0
  255. package/dist/cli/__tests__/agents.test.js +137 -0
  256. package/dist/cli/__tests__/agents.test.js.map +1 -0
  257. package/dist/cli/__tests__/api.test.d.ts +2 -0
  258. package/dist/cli/__tests__/api.test.d.ts.map +1 -0
  259. package/dist/cli/__tests__/api.test.js +175 -0
  260. package/dist/cli/__tests__/api.test.js.map +1 -0
  261. package/dist/cli/__tests__/ask.test.d.ts +2 -0
  262. package/dist/cli/__tests__/ask.test.d.ts.map +1 -0
  263. package/dist/cli/__tests__/ask.test.js +332 -0
  264. package/dist/cli/__tests__/ask.test.js.map +1 -0
  265. package/dist/cli/__tests__/auth.test.d.ts +2 -0
  266. package/dist/cli/__tests__/auth.test.d.ts.map +1 -0
  267. package/dist/cli/__tests__/auth.test.js +203 -0
  268. package/dist/cli/__tests__/auth.test.js.map +1 -0
  269. package/dist/cli/__tests__/autoresearch-goal.test.d.ts +2 -0
  270. package/dist/cli/__tests__/autoresearch-goal.test.d.ts.map +1 -0
  271. package/dist/cli/__tests__/autoresearch-goal.test.js +207 -0
  272. package/dist/cli/__tests__/autoresearch-goal.test.js.map +1 -0
  273. package/dist/cli/__tests__/autoresearch-guided.test.d.ts +2 -0
  274. package/dist/cli/__tests__/autoresearch-guided.test.d.ts.map +1 -0
  275. package/dist/cli/__tests__/autoresearch-guided.test.js +365 -0
  276. package/dist/cli/__tests__/autoresearch-guided.test.js.map +1 -0
  277. package/dist/cli/__tests__/autoresearch.test.d.ts +2 -0
  278. package/dist/cli/__tests__/autoresearch.test.d.ts.map +1 -0
  279. package/dist/cli/__tests__/autoresearch.test.js +155 -0
  280. package/dist/cli/__tests__/autoresearch.test.js.map +1 -0
  281. package/dist/cli/__tests__/catalog-contract.test.d.ts +2 -0
  282. package/dist/cli/__tests__/catalog-contract.test.d.ts.map +1 -0
  283. package/dist/cli/__tests__/catalog-contract.test.js +18 -0
  284. package/dist/cli/__tests__/catalog-contract.test.js.map +1 -0
  285. package/dist/cli/__tests__/cleanup.test.d.ts +2 -0
  286. package/dist/cli/__tests__/cleanup.test.d.ts.map +1 -0
  287. package/dist/cli/__tests__/cleanup.test.js +527 -0
  288. package/dist/cli/__tests__/cleanup.test.js.map +1 -0
  289. package/dist/cli/__tests__/codex-feature-probe.test.d.ts +2 -0
  290. package/dist/cli/__tests__/codex-feature-probe.test.d.ts.map +1 -0
  291. package/dist/cli/__tests__/codex-feature-probe.test.js +46 -0
  292. package/dist/cli/__tests__/codex-feature-probe.test.js.map +1 -0
  293. package/dist/cli/__tests__/codex-plugin-layout.test.d.ts +2 -0
  294. package/dist/cli/__tests__/codex-plugin-layout.test.d.ts.map +1 -0
  295. package/dist/cli/__tests__/codex-plugin-layout.test.js +778 -0
  296. package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -0
  297. package/dist/cli/__tests__/doctor-context-window-warning.test.d.ts +2 -0
  298. package/dist/cli/__tests__/doctor-context-window-warning.test.d.ts.map +1 -0
  299. package/dist/cli/__tests__/doctor-context-window-warning.test.js +122 -0
  300. package/dist/cli/__tests__/doctor-context-window-warning.test.js.map +1 -0
  301. package/dist/cli/__tests__/doctor-invalid-config.test.d.ts +2 -0
  302. package/dist/cli/__tests__/doctor-invalid-config.test.d.ts.map +1 -0
  303. package/dist/cli/__tests__/doctor-invalid-config.test.js +52 -0
  304. package/dist/cli/__tests__/doctor-invalid-config.test.js.map +1 -0
  305. package/dist/cli/__tests__/doctor-spark-routing.test.d.ts +2 -0
  306. package/dist/cli/__tests__/doctor-spark-routing.test.d.ts.map +1 -0
  307. package/dist/cli/__tests__/doctor-spark-routing.test.js +79 -0
  308. package/dist/cli/__tests__/doctor-spark-routing.test.js.map +1 -0
  309. package/dist/cli/__tests__/doctor-team.test.d.ts +2 -0
  310. package/dist/cli/__tests__/doctor-team.test.d.ts.map +1 -0
  311. package/dist/cli/__tests__/doctor-team.test.js +299 -0
  312. package/dist/cli/__tests__/doctor-team.test.js.map +1 -0
  313. package/dist/cli/__tests__/doctor-warning-copy.test.d.ts +2 -0
  314. package/dist/cli/__tests__/doctor-warning-copy.test.d.ts.map +1 -0
  315. package/dist/cli/__tests__/doctor-warning-copy.test.js +1312 -0
  316. package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -0
  317. package/dist/cli/__tests__/error-handling-warnings.test.d.ts +2 -0
  318. package/dist/cli/__tests__/error-handling-warnings.test.d.ts.map +1 -0
  319. package/dist/cli/__tests__/error-handling-warnings.test.js +52 -0
  320. package/dist/cli/__tests__/error-handling-warnings.test.js.map +1 -0
  321. package/dist/cli/__tests__/exec.test.d.ts +2 -0
  322. package/dist/cli/__tests__/exec.test.d.ts.map +1 -0
  323. package/dist/cli/__tests__/exec.test.js +213 -0
  324. package/dist/cli/__tests__/exec.test.js.map +1 -0
  325. package/dist/cli/__tests__/explore-windows-diagnostics.test.d.ts +2 -0
  326. package/dist/cli/__tests__/explore-windows-diagnostics.test.d.ts.map +1 -0
  327. package/dist/cli/__tests__/explore-windows-diagnostics.test.js +17 -0
  328. package/dist/cli/__tests__/explore-windows-diagnostics.test.js.map +1 -0
  329. package/dist/cli/__tests__/explore.test.d.ts +2 -0
  330. package/dist/cli/__tests__/explore.test.d.ts.map +1 -0
  331. package/dist/cli/__tests__/explore.test.js +104 -0
  332. package/dist/cli/__tests__/explore.test.js.map +1 -0
  333. package/dist/cli/__tests__/hooks.test.d.ts +2 -0
  334. package/dist/cli/__tests__/hooks.test.d.ts.map +1 -0
  335. package/dist/cli/__tests__/hooks.test.js +55 -0
  336. package/dist/cli/__tests__/hooks.test.js.map +1 -0
  337. package/dist/cli/__tests__/imagegen-continuation.test.d.ts +2 -0
  338. package/dist/cli/__tests__/imagegen-continuation.test.d.ts.map +1 -0
  339. package/dist/cli/__tests__/imagegen-continuation.test.js +135 -0
  340. package/dist/cli/__tests__/imagegen-continuation.test.js.map +1 -0
  341. package/dist/cli/__tests__/index.test.d.ts +2 -0
  342. package/dist/cli/__tests__/index.test.d.ts.map +1 -0
  343. package/dist/cli/__tests__/index.test.js +3619 -0
  344. package/dist/cli/__tests__/index.test.js.map +1 -0
  345. package/dist/cli/__tests__/install-docs-contract.test.d.ts +2 -0
  346. package/dist/cli/__tests__/install-docs-contract.test.d.ts.map +1 -0
  347. package/dist/cli/__tests__/install-docs-contract.test.js +55 -0
  348. package/dist/cli/__tests__/install-docs-contract.test.js.map +1 -0
  349. package/dist/cli/__tests__/launch-fallback.test.d.ts +2 -0
  350. package/dist/cli/__tests__/launch-fallback.test.d.ts.map +1 -0
  351. package/dist/cli/__tests__/launch-fallback.test.js +1285 -0
  352. package/dist/cli/__tests__/launch-fallback.test.js.map +1 -0
  353. package/dist/cli/__tests__/lifecycle-notifications.test.d.ts +2 -0
  354. package/dist/cli/__tests__/lifecycle-notifications.test.d.ts.map +1 -0
  355. package/dist/cli/__tests__/lifecycle-notifications.test.js +48 -0
  356. package/dist/cli/__tests__/lifecycle-notifications.test.js.map +1 -0
  357. package/dist/cli/__tests__/list.test.d.ts +2 -0
  358. package/dist/cli/__tests__/list.test.d.ts.map +1 -0
  359. package/dist/cli/__tests__/list.test.js +38 -0
  360. package/dist/cli/__tests__/list.test.js.map +1 -0
  361. package/dist/cli/__tests__/mcp-parity.test.d.ts +2 -0
  362. package/dist/cli/__tests__/mcp-parity.test.d.ts.map +1 -0
  363. package/dist/cli/__tests__/mcp-parity.test.js +228 -0
  364. package/dist/cli/__tests__/mcp-parity.test.js.map +1 -0
  365. package/dist/cli/__tests__/mcp-serve.test.d.ts +2 -0
  366. package/dist/cli/__tests__/mcp-serve.test.d.ts.map +1 -0
  367. package/dist/cli/__tests__/mcp-serve.test.js +68 -0
  368. package/dist/cli/__tests__/mcp-serve.test.js.map +1 -0
  369. package/dist/cli/__tests__/native-assets.test.d.ts +2 -0
  370. package/dist/cli/__tests__/native-assets.test.d.ts.map +1 -0
  371. package/dist/cli/__tests__/native-assets.test.js +296 -0
  372. package/dist/cli/__tests__/native-assets.test.js.map +1 -0
  373. package/dist/cli/__tests__/native-hook-dispatch-contract.test.d.ts +2 -0
  374. package/dist/cli/__tests__/native-hook-dispatch-contract.test.d.ts.map +1 -0
  375. package/dist/cli/__tests__/native-hook-dispatch-contract.test.js +11 -0
  376. package/dist/cli/__tests__/native-hook-dispatch-contract.test.js.map +1 -0
  377. package/dist/cli/__tests__/nested-help-routing.test.d.ts +2 -0
  378. package/dist/cli/__tests__/nested-help-routing.test.d.ts.map +1 -0
  379. package/dist/cli/__tests__/nested-help-routing.test.js +63 -0
  380. package/dist/cli/__tests__/nested-help-routing.test.js.map +1 -0
  381. package/dist/cli/__tests__/package-bin-contract.test.d.ts +2 -0
  382. package/dist/cli/__tests__/package-bin-contract.test.d.ts.map +1 -0
  383. package/dist/cli/__tests__/package-bin-contract.test.js +190 -0
  384. package/dist/cli/__tests__/package-bin-contract.test.js.map +1 -0
  385. package/dist/cli/__tests__/packaged-explore-harness-lock.d.ts +3 -0
  386. package/dist/cli/__tests__/packaged-explore-harness-lock.d.ts.map +1 -0
  387. package/dist/cli/__tests__/packaged-explore-harness-lock.js +67 -0
  388. package/dist/cli/__tests__/packaged-explore-harness-lock.js.map +1 -0
  389. package/dist/cli/__tests__/packaged-script-resolution.test.d.ts +2 -0
  390. package/dist/cli/__tests__/packaged-script-resolution.test.d.ts.map +1 -0
  391. package/dist/cli/__tests__/packaged-script-resolution.test.js +19 -0
  392. package/dist/cli/__tests__/packaged-script-resolution.test.js.map +1 -0
  393. package/dist/cli/__tests__/performance-goal.test.d.ts +2 -0
  394. package/dist/cli/__tests__/performance-goal.test.d.ts.map +1 -0
  395. package/dist/cli/__tests__/performance-goal.test.js +144 -0
  396. package/dist/cli/__tests__/performance-goal.test.js.map +1 -0
  397. package/dist/cli/__tests__/prompt-skill-sanitization.test.d.ts +2 -0
  398. package/dist/cli/__tests__/prompt-skill-sanitization.test.d.ts.map +1 -0
  399. package/dist/cli/__tests__/prompt-skill-sanitization.test.js +48 -0
  400. package/dist/cli/__tests__/prompt-skill-sanitization.test.js.map +1 -0
  401. package/dist/cli/__tests__/question.test.d.ts +2 -0
  402. package/dist/cli/__tests__/question.test.d.ts.map +1 -0
  403. package/dist/cli/__tests__/question.test.js +850 -0
  404. package/dist/cli/__tests__/question.test.js.map +1 -0
  405. package/dist/cli/__tests__/ralph-deslop-contract.test.d.ts +2 -0
  406. package/dist/cli/__tests__/ralph-deslop-contract.test.d.ts.map +1 -0
  407. package/dist/cli/__tests__/ralph-deslop-contract.test.js +28 -0
  408. package/dist/cli/__tests__/ralph-deslop-contract.test.js.map +1 -0
  409. package/dist/cli/__tests__/ralph-goal-mode-contract.test.d.ts +2 -0
  410. package/dist/cli/__tests__/ralph-goal-mode-contract.test.d.ts.map +1 -0
  411. package/dist/cli/__tests__/ralph-goal-mode-contract.test.js +49 -0
  412. package/dist/cli/__tests__/ralph-goal-mode-contract.test.js.map +1 -0
  413. package/dist/cli/__tests__/ralph-prd-deep-interview.test.d.ts +2 -0
  414. package/dist/cli/__tests__/ralph-prd-deep-interview.test.d.ts.map +1 -0
  415. package/dist/cli/__tests__/ralph-prd-deep-interview.test.js +25 -0
  416. package/dist/cli/__tests__/ralph-prd-deep-interview.test.js.map +1 -0
  417. package/dist/cli/__tests__/ralph-prd-smoke.test.d.ts +2 -0
  418. package/dist/cli/__tests__/ralph-prd-smoke.test.d.ts.map +1 -0
  419. package/dist/cli/__tests__/ralph-prd-smoke.test.js +174 -0
  420. package/dist/cli/__tests__/ralph-prd-smoke.test.js.map +1 -0
  421. package/dist/cli/__tests__/ralph.test.d.ts +2 -0
  422. package/dist/cli/__tests__/ralph.test.d.ts.map +1 -0
  423. package/dist/cli/__tests__/ralph.test.js +256 -0
  424. package/dist/cli/__tests__/ralph.test.js.map +1 -0
  425. package/dist/cli/__tests__/resume.test.d.ts +2 -0
  426. package/dist/cli/__tests__/resume.test.d.ts.map +1 -0
  427. package/dist/cli/__tests__/resume.test.js +133 -0
  428. package/dist/cli/__tests__/resume.test.js.map +1 -0
  429. package/dist/cli/__tests__/session-scoped-runtime.test.d.ts +2 -0
  430. package/dist/cli/__tests__/session-scoped-runtime.test.d.ts.map +1 -0
  431. package/dist/cli/__tests__/session-scoped-runtime.test.js +247 -0
  432. package/dist/cli/__tests__/session-scoped-runtime.test.js.map +1 -0
  433. package/dist/cli/__tests__/session-search-help.test.d.ts +2 -0
  434. package/dist/cli/__tests__/session-search-help.test.d.ts.map +1 -0
  435. package/dist/cli/__tests__/session-search-help.test.js +37 -0
  436. package/dist/cli/__tests__/session-search-help.test.js.map +1 -0
  437. package/dist/cli/__tests__/session-search.test.d.ts +2 -0
  438. package/dist/cli/__tests__/session-search.test.d.ts.map +1 -0
  439. package/dist/cli/__tests__/session-search.test.js +77 -0
  440. package/dist/cli/__tests__/session-search.test.js.map +1 -0
  441. package/dist/cli/__tests__/setup-agents-overwrite.test.d.ts +2 -0
  442. package/dist/cli/__tests__/setup-agents-overwrite.test.d.ts.map +1 -0
  443. package/dist/cli/__tests__/setup-agents-overwrite.test.js +776 -0
  444. package/dist/cli/__tests__/setup-agents-overwrite.test.js.map +1 -0
  445. package/dist/cli/__tests__/setup-gh-star.test.d.ts +2 -0
  446. package/dist/cli/__tests__/setup-gh-star.test.d.ts.map +1 -0
  447. package/dist/cli/__tests__/setup-gh-star.test.js +67 -0
  448. package/dist/cli/__tests__/setup-gh-star.test.js.map +1 -0
  449. package/dist/cli/__tests__/setup-hooks-shared-ownership.test.d.ts +2 -0
  450. package/dist/cli/__tests__/setup-hooks-shared-ownership.test.d.ts.map +1 -0
  451. package/dist/cli/__tests__/setup-hooks-shared-ownership.test.js +202 -0
  452. package/dist/cli/__tests__/setup-hooks-shared-ownership.test.js.map +1 -0
  453. package/dist/cli/__tests__/setup-install-mode.test.d.ts +2 -0
  454. package/dist/cli/__tests__/setup-install-mode.test.d.ts.map +1 -0
  455. package/dist/cli/__tests__/setup-install-mode.test.js +2103 -0
  456. package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -0
  457. package/dist/cli/__tests__/setup-prompts-overwrite.test.d.ts +2 -0
  458. package/dist/cli/__tests__/setup-prompts-overwrite.test.d.ts.map +1 -0
  459. package/dist/cli/__tests__/setup-prompts-overwrite.test.js +191 -0
  460. package/dist/cli/__tests__/setup-prompts-overwrite.test.js.map +1 -0
  461. package/dist/cli/__tests__/setup-refresh.test.d.ts +2 -0
  462. package/dist/cli/__tests__/setup-refresh.test.d.ts.map +1 -0
  463. package/dist/cli/__tests__/setup-refresh.test.js +779 -0
  464. package/dist/cli/__tests__/setup-refresh.test.js.map +1 -0
  465. package/dist/cli/__tests__/setup-scope.test.d.ts +2 -0
  466. package/dist/cli/__tests__/setup-scope.test.d.ts.map +1 -0
  467. package/dist/cli/__tests__/setup-scope.test.js +367 -0
  468. package/dist/cli/__tests__/setup-scope.test.js.map +1 -0
  469. package/dist/cli/__tests__/setup-skill-validation.test.d.ts +2 -0
  470. package/dist/cli/__tests__/setup-skill-validation.test.d.ts.map +1 -0
  471. package/dist/cli/__tests__/setup-skill-validation.test.js +44 -0
  472. package/dist/cli/__tests__/setup-skill-validation.test.js.map +1 -0
  473. package/dist/cli/__tests__/setup-skills-overwrite.test.d.ts +2 -0
  474. package/dist/cli/__tests__/setup-skills-overwrite.test.d.ts.map +1 -0
  475. package/dist/cli/__tests__/setup-skills-overwrite.test.js +292 -0
  476. package/dist/cli/__tests__/setup-skills-overwrite.test.js.map +1 -0
  477. package/dist/cli/__tests__/sidecar.test.d.ts +2 -0
  478. package/dist/cli/__tests__/sidecar.test.d.ts.map +1 -0
  479. package/dist/cli/__tests__/sidecar.test.js +24 -0
  480. package/dist/cli/__tests__/sidecar.test.js.map +1 -0
  481. package/dist/cli/__tests__/sparkshell-cli.test.d.ts +2 -0
  482. package/dist/cli/__tests__/sparkshell-cli.test.d.ts.map +1 -0
  483. package/dist/cli/__tests__/sparkshell-cli.test.js +471 -0
  484. package/dist/cli/__tests__/sparkshell-cli.test.js.map +1 -0
  485. package/dist/cli/__tests__/sparkshell-packaging.test.d.ts +2 -0
  486. package/dist/cli/__tests__/sparkshell-packaging.test.d.ts.map +1 -0
  487. package/dist/cli/__tests__/sparkshell-packaging.test.js +105 -0
  488. package/dist/cli/__tests__/sparkshell-packaging.test.js.map +1 -0
  489. package/dist/cli/__tests__/star-prompt.test.d.ts +2 -0
  490. package/dist/cli/__tests__/star-prompt.test.d.ts.map +1 -0
  491. package/dist/cli/__tests__/star-prompt.test.js +172 -0
  492. package/dist/cli/__tests__/star-prompt.test.js.map +1 -0
  493. package/dist/cli/__tests__/state.test.d.ts +2 -0
  494. package/dist/cli/__tests__/state.test.d.ts.map +1 -0
  495. package/dist/cli/__tests__/state.test.js +160 -0
  496. package/dist/cli/__tests__/state.test.js.map +1 -0
  497. package/dist/cli/__tests__/team-decompose.test.d.ts +2 -0
  498. package/dist/cli/__tests__/team-decompose.test.d.ts.map +1 -0
  499. package/dist/cli/__tests__/team-decompose.test.js +138 -0
  500. package/dist/cli/__tests__/team-decompose.test.js.map +1 -0
  501. package/dist/cli/__tests__/team.test.d.ts +2 -0
  502. package/dist/cli/__tests__/team.test.d.ts.map +1 -0
  503. package/dist/cli/__tests__/team.test.js +2897 -0
  504. package/dist/cli/__tests__/team.test.js.map +1 -0
  505. package/dist/cli/__tests__/ultragoal.test.d.ts +2 -0
  506. package/dist/cli/__tests__/ultragoal.test.d.ts.map +1 -0
  507. package/dist/cli/__tests__/ultragoal.test.js +599 -0
  508. package/dist/cli/__tests__/ultragoal.test.js.map +1 -0
  509. package/dist/cli/__tests__/uninstall.test.d.ts +2 -0
  510. package/dist/cli/__tests__/uninstall.test.d.ts.map +1 -0
  511. package/dist/cli/__tests__/uninstall.test.js +865 -0
  512. package/dist/cli/__tests__/uninstall.test.js.map +1 -0
  513. package/dist/cli/__tests__/update.test.d.ts +2 -0
  514. package/dist/cli/__tests__/update.test.d.ts.map +1 -0
  515. package/dist/cli/__tests__/update.test.js +1182 -0
  516. package/dist/cli/__tests__/update.test.js.map +1 -0
  517. package/dist/cli/__tests__/version-sync-contract.test.d.ts +2 -0
  518. package/dist/cli/__tests__/version-sync-contract.test.d.ts.map +1 -0
  519. package/dist/cli/__tests__/version-sync-contract.test.js +47 -0
  520. package/dist/cli/__tests__/version-sync-contract.test.js.map +1 -0
  521. package/dist/cli/__tests__/version.test.d.ts +2 -0
  522. package/dist/cli/__tests__/version.test.d.ts.map +1 -0
  523. package/dist/cli/__tests__/version.test.js +21 -0
  524. package/dist/cli/__tests__/version.test.js.map +1 -0
  525. package/dist/cli/__tests__/windows-popup-loop-contract.test.d.ts +2 -0
  526. package/dist/cli/__tests__/windows-popup-loop-contract.test.d.ts.map +1 -0
  527. package/dist/cli/__tests__/windows-popup-loop-contract.test.js +31 -0
  528. package/dist/cli/__tests__/windows-popup-loop-contract.test.js.map +1 -0
  529. package/dist/cli/adapt.d.ts +6 -0
  530. package/dist/cli/adapt.d.ts.map +1 -0
  531. package/dist/cli/adapt.js +135 -0
  532. package/dist/cli/adapt.js.map +1 -0
  533. package/dist/cli/agents-init.d.ts +14 -0
  534. package/dist/cli/agents-init.d.ts.map +1 -0
  535. package/dist/cli/agents-init.js +274 -0
  536. package/dist/cli/agents-init.js.map +1 -0
  537. package/dist/cli/agents.d.ts +14 -0
  538. package/dist/cli/agents.d.ts.map +1 -0
  539. package/dist/cli/agents.js +267 -0
  540. package/dist/cli/agents.js.map +1 -0
  541. package/dist/cli/api.d.ts +26 -0
  542. package/dist/cli/api.d.ts.map +1 -0
  543. package/dist/cli/api.js +153 -0
  544. package/dist/cli/api.js.map +1 -0
  545. package/dist/cli/ask.d.ts +13 -0
  546. package/dist/cli/ask.d.ts.map +1 -0
  547. package/dist/cli/ask.js +178 -0
  548. package/dist/cli/ask.js.map +1 -0
  549. package/dist/cli/auth.d.ts +4 -0
  550. package/dist/cli/auth.d.ts.map +1 -0
  551. package/dist/cli/auth.js +113 -0
  552. package/dist/cli/auth.js.map +1 -0
  553. package/dist/cli/autoresearch-goal.d.ts +3 -0
  554. package/dist/cli/autoresearch-goal.d.ts.map +1 -0
  555. package/dist/cli/autoresearch-goal.js +175 -0
  556. package/dist/cli/autoresearch-goal.js.map +1 -0
  557. package/dist/cli/autoresearch-guided.d.ts +43 -0
  558. package/dist/cli/autoresearch-guided.d.ts.map +1 -0
  559. package/dist/cli/autoresearch-guided.js +282 -0
  560. package/dist/cli/autoresearch-guided.js.map +1 -0
  561. package/dist/cli/autoresearch-intake.d.ts +62 -0
  562. package/dist/cli/autoresearch-intake.d.ts.map +1 -0
  563. package/dist/cli/autoresearch-intake.js +336 -0
  564. package/dist/cli/autoresearch-intake.js.map +1 -0
  565. package/dist/cli/autoresearch.d.ts +16 -0
  566. package/dist/cli/autoresearch.d.ts.map +1 -0
  567. package/dist/cli/autoresearch.js +91 -0
  568. package/dist/cli/autoresearch.js.map +1 -0
  569. package/dist/cli/catalog-contract.d.ts +10 -0
  570. package/dist/cli/catalog-contract.d.ts.map +1 -0
  571. package/dist/cli/catalog-contract.js +34 -0
  572. package/dist/cli/catalog-contract.js.map +1 -0
  573. package/dist/cli/cleanup.d.ts +58 -0
  574. package/dist/cli/cleanup.d.ts.map +1 -0
  575. package/dist/cli/cleanup.js +444 -0
  576. package/dist/cli/cleanup.js.map +1 -0
  577. package/dist/cli/codex-feature-probe.d.ts +17 -0
  578. package/dist/cli/codex-feature-probe.d.ts.map +1 -0
  579. package/dist/cli/codex-feature-probe.js +50 -0
  580. package/dist/cli/codex-feature-probe.js.map +1 -0
  581. package/dist/cli/codex-home.d.ts +7 -0
  582. package/dist/cli/codex-home.d.ts.map +1 -0
  583. package/dist/cli/codex-home.js +26 -0
  584. package/dist/cli/codex-home.js.map +1 -0
  585. package/dist/cli/constants.d.ts +11 -0
  586. package/dist/cli/constants.d.ts.map +1 -0
  587. package/dist/cli/constants.js +11 -0
  588. package/dist/cli/constants.js.map +1 -0
  589. package/dist/cli/doctor.d.ts +43 -0
  590. package/dist/cli/doctor.d.ts.map +1 -0
  591. package/dist/cli/doctor.js +1956 -0
  592. package/dist/cli/doctor.js.map +1 -0
  593. package/dist/cli/explore.d.ts +14 -0
  594. package/dist/cli/explore.d.ts.map +1 -0
  595. package/dist/cli/explore.js +72 -0
  596. package/dist/cli/explore.js.map +1 -0
  597. package/dist/cli/hooks.d.ts +4 -0
  598. package/dist/cli/hooks.d.ts.map +1 -0
  599. package/dist/cli/hooks.js +201 -0
  600. package/dist/cli/hooks.js.map +1 -0
  601. package/dist/cli/index.d.ts +247 -0
  602. package/dist/cli/index.d.ts.map +1 -0
  603. package/dist/cli/index.js +4590 -0
  604. package/dist/cli/index.js.map +1 -0
  605. package/dist/cli/list.d.ts +2 -0
  606. package/dist/cli/list.d.ts.map +1 -0
  607. package/dist/cli/list.js +40 -0
  608. package/dist/cli/list.js.map +1 -0
  609. package/dist/cli/mcp-parity.d.ts +22 -0
  610. package/dist/cli/mcp-parity.d.ts.map +1 -0
  611. package/dist/cli/mcp-parity.js +251 -0
  612. package/dist/cli/mcp-parity.js.map +1 -0
  613. package/dist/cli/mcp-serve.d.ts +13 -0
  614. package/dist/cli/mcp-serve.d.ts.map +1 -0
  615. package/dist/cli/mcp-serve.js +75 -0
  616. package/dist/cli/mcp-serve.js.map +1 -0
  617. package/dist/cli/native-assets.d.ts +52 -0
  618. package/dist/cli/native-assets.d.ts.map +1 -0
  619. package/dist/cli/native-assets.js +302 -0
  620. package/dist/cli/native-assets.js.map +1 -0
  621. package/dist/cli/omx.d.ts +3 -0
  622. package/dist/cli/omx.d.ts.map +1 -0
  623. package/dist/cli/omx.js +25 -0
  624. package/dist/cli/omx.js.map +1 -0
  625. package/dist/cli/performance-goal.d.ts +3 -0
  626. package/dist/cli/performance-goal.d.ts.map +1 -0
  627. package/dist/cli/performance-goal.js +186 -0
  628. package/dist/cli/performance-goal.js.map +1 -0
  629. package/dist/cli/plugin-marketplace.d.ts +54 -0
  630. package/dist/cli/plugin-marketplace.d.ts.map +1 -0
  631. package/dist/cli/plugin-marketplace.js +369 -0
  632. package/dist/cli/plugin-marketplace.js.map +1 -0
  633. package/dist/cli/question.d.ts +3 -0
  634. package/dist/cli/question.d.ts.map +1 -0
  635. package/dist/cli/question.js +376 -0
  636. package/dist/cli/question.js.map +1 -0
  637. package/dist/cli/ralph.d.ts +17 -0
  638. package/dist/cli/ralph.d.ts.map +1 -0
  639. package/dist/cli/ralph.js +330 -0
  640. package/dist/cli/ralph.js.map +1 -0
  641. package/dist/cli/session-search.d.ts +8 -0
  642. package/dist/cli/session-search.d.ts.map +1 -0
  643. package/dist/cli/session-search.js +133 -0
  644. package/dist/cli/session-search.js.map +1 -0
  645. package/dist/cli/setup-preferences.d.ts +26 -0
  646. package/dist/cli/setup-preferences.d.ts.map +1 -0
  647. package/dist/cli/setup-preferences.js +82 -0
  648. package/dist/cli/setup-preferences.js.map +1 -0
  649. package/dist/cli/setup.d.ts +60 -0
  650. package/dist/cli/setup.d.ts.map +1 -0
  651. package/dist/cli/setup.js +2748 -0
  652. package/dist/cli/setup.js.map +1 -0
  653. package/dist/cli/sparkshell.d.ts +39 -0
  654. package/dist/cli/sparkshell.d.ts.map +1 -0
  655. package/dist/cli/sparkshell.js +299 -0
  656. package/dist/cli/sparkshell.js.map +1 -0
  657. package/dist/cli/star-prompt.d.ts +31 -0
  658. package/dist/cli/star-prompt.d.ts.map +1 -0
  659. package/dist/cli/star-prompt.js +97 -0
  660. package/dist/cli/star-prompt.js.map +1 -0
  661. package/dist/cli/state.d.ts +8 -0
  662. package/dist/cli/state.d.ts.map +1 -0
  663. package/dist/cli/state.js +149 -0
  664. package/dist/cli/state.js.map +1 -0
  665. package/dist/cli/team.d.ts +49 -0
  666. package/dist/cli/team.d.ts.map +1 -0
  667. package/dist/cli/team.js +1453 -0
  668. package/dist/cli/team.js.map +1 -0
  669. package/dist/cli/tmux-hook.d.ts +3 -0
  670. package/dist/cli/tmux-hook.d.ts.map +1 -0
  671. package/dist/cli/tmux-hook.js +403 -0
  672. package/dist/cli/tmux-hook.js.map +1 -0
  673. package/dist/cli/ultragoal.d.ts +3 -0
  674. package/dist/cli/ultragoal.d.ts.map +1 -0
  675. package/dist/cli/ultragoal.js +494 -0
  676. package/dist/cli/ultragoal.js.map +1 -0
  677. package/dist/cli/uninstall.d.ts +15 -0
  678. package/dist/cli/uninstall.d.ts.map +1 -0
  679. package/dist/cli/uninstall.js +476 -0
  680. package/dist/cli/uninstall.js.map +1 -0
  681. package/dist/cli/update.d.ts +86 -0
  682. package/dist/cli/update.d.ts.map +1 -0
  683. package/dist/cli/update.js +754 -0
  684. package/dist/cli/update.js.map +1 -0
  685. package/dist/cli/version.d.ts +2 -0
  686. package/dist/cli/version.d.ts.map +1 -0
  687. package/dist/cli/version.js +13 -0
  688. package/dist/cli/version.js.map +1 -0
  689. package/dist/compat/__tests__/doctor-contract.test.d.ts +2 -0
  690. package/dist/compat/__tests__/doctor-contract.test.d.ts.map +1 -0
  691. package/dist/compat/__tests__/doctor-contract.test.js +122 -0
  692. package/dist/compat/__tests__/doctor-contract.test.js.map +1 -0
  693. package/dist/compat/__tests__/rust-runtime-compat.test.d.ts +2 -0
  694. package/dist/compat/__tests__/rust-runtime-compat.test.d.ts.map +1 -0
  695. package/dist/compat/__tests__/rust-runtime-compat.test.js +218 -0
  696. package/dist/compat/__tests__/rust-runtime-compat.test.js.map +1 -0
  697. package/dist/config/__tests__/codex-feature-flags.test.d.ts +2 -0
  698. package/dist/config/__tests__/codex-feature-flags.test.d.ts.map +1 -0
  699. package/dist/config/__tests__/codex-feature-flags.test.js +45 -0
  700. package/dist/config/__tests__/codex-feature-flags.test.js.map +1 -0
  701. package/dist/config/__tests__/codex-hooks.test.d.ts +2 -0
  702. package/dist/config/__tests__/codex-hooks.test.d.ts.map +1 -0
  703. package/dist/config/__tests__/codex-hooks.test.js +524 -0
  704. package/dist/config/__tests__/codex-hooks.test.js.map +1 -0
  705. package/dist/config/__tests__/commit-lore-guard.test.d.ts +2 -0
  706. package/dist/config/__tests__/commit-lore-guard.test.d.ts.map +1 -0
  707. package/dist/config/__tests__/commit-lore-guard.test.js +20 -0
  708. package/dist/config/__tests__/commit-lore-guard.test.js.map +1 -0
  709. package/dist/config/__tests__/deep-interview.test.d.ts +2 -0
  710. package/dist/config/__tests__/deep-interview.test.d.ts.map +1 -0
  711. package/dist/config/__tests__/deep-interview.test.js +240 -0
  712. package/dist/config/__tests__/deep-interview.test.js.map +1 -0
  713. package/dist/config/__tests__/generator-idempotent.test.d.ts +2 -0
  714. package/dist/config/__tests__/generator-idempotent.test.d.ts.map +1 -0
  715. package/dist/config/__tests__/generator-idempotent.test.js +1150 -0
  716. package/dist/config/__tests__/generator-idempotent.test.js.map +1 -0
  717. package/dist/config/__tests__/generator-notify.test.d.ts +2 -0
  718. package/dist/config/__tests__/generator-notify.test.d.ts.map +1 -0
  719. package/dist/config/__tests__/generator-notify.test.js +512 -0
  720. package/dist/config/__tests__/generator-notify.test.js.map +1 -0
  721. package/dist/config/__tests__/generator-status-line-presets.test.d.ts +2 -0
  722. package/dist/config/__tests__/generator-status-line-presets.test.d.ts.map +1 -0
  723. package/dist/config/__tests__/generator-status-line-presets.test.js +203 -0
  724. package/dist/config/__tests__/generator-status-line-presets.test.js.map +1 -0
  725. package/dist/config/__tests__/mcp-registry.test.d.ts +2 -0
  726. package/dist/config/__tests__/mcp-registry.test.d.ts.map +1 -0
  727. package/dist/config/__tests__/mcp-registry.test.js +190 -0
  728. package/dist/config/__tests__/mcp-registry.test.js.map +1 -0
  729. package/dist/config/__tests__/models.test.d.ts +2 -0
  730. package/dist/config/__tests__/models.test.d.ts.map +1 -0
  731. package/dist/config/__tests__/models.test.js +241 -0
  732. package/dist/config/__tests__/models.test.js.map +1 -0
  733. package/dist/config/__tests__/wiki-config-contract.test.d.ts +2 -0
  734. package/dist/config/__tests__/wiki-config-contract.test.d.ts.map +1 -0
  735. package/dist/config/__tests__/wiki-config-contract.test.js +23 -0
  736. package/dist/config/__tests__/wiki-config-contract.test.js.map +1 -0
  737. package/dist/config/codex-feature-flags.d.ts +25 -0
  738. package/dist/config/codex-feature-flags.d.ts.map +1 -0
  739. package/dist/config/codex-feature-flags.js +60 -0
  740. package/dist/config/codex-feature-flags.js.map +1 -0
  741. package/dist/config/codex-hooks.d.ts +79 -0
  742. package/dist/config/codex-hooks.d.ts.map +1 -0
  743. package/dist/config/codex-hooks.js +578 -0
  744. package/dist/config/codex-hooks.js.map +1 -0
  745. package/dist/config/commit-lore-guard.d.ts +4 -0
  746. package/dist/config/commit-lore-guard.d.ts.map +1 -0
  747. package/dist/config/commit-lore-guard.js +35 -0
  748. package/dist/config/commit-lore-guard.js.map +1 -0
  749. package/dist/config/deep-interview.d.ts +22 -0
  750. package/dist/config/deep-interview.d.ts.map +1 -0
  751. package/dist/config/deep-interview.js +161 -0
  752. package/dist/config/deep-interview.js.map +1 -0
  753. package/dist/config/generator.d.ts +141 -0
  754. package/dist/config/generator.d.ts.map +1 -0
  755. package/dist/config/generator.js +1845 -0
  756. package/dist/config/generator.js.map +1 -0
  757. package/dist/config/mcp-registry.d.ts +35 -0
  758. package/dist/config/mcp-registry.d.ts.map +1 -0
  759. package/dist/config/mcp-registry.js +159 -0
  760. package/dist/config/mcp-registry.js.map +1 -0
  761. package/dist/config/models.d.ts +80 -0
  762. package/dist/config/models.d.ts.map +1 -0
  763. package/dist/config/models.js +251 -0
  764. package/dist/config/models.js.map +1 -0
  765. package/dist/config/omx-first-party-mcp.d.ts +21 -0
  766. package/dist/config/omx-first-party-mcp.d.ts.map +1 -0
  767. package/dist/config/omx-first-party-mcp.js +86 -0
  768. package/dist/config/omx-first-party-mcp.js.map +1 -0
  769. package/dist/config/team-mode.d.ts +12 -0
  770. package/dist/config/team-mode.d.ts.map +1 -0
  771. package/dist/config/team-mode.js +91 -0
  772. package/dist/config/team-mode.js.map +1 -0
  773. package/dist/document-refresh/__tests__/enforcer.test.d.ts +2 -0
  774. package/dist/document-refresh/__tests__/enforcer.test.d.ts.map +1 -0
  775. package/dist/document-refresh/__tests__/enforcer.test.js +128 -0
  776. package/dist/document-refresh/__tests__/enforcer.test.js.map +1 -0
  777. package/dist/document-refresh/config.d.ts +9 -0
  778. package/dist/document-refresh/config.d.ts.map +1 -0
  779. package/dist/document-refresh/config.js +70 -0
  780. package/dist/document-refresh/config.js.map +1 -0
  781. package/dist/document-refresh/enforcer.d.ts +43 -0
  782. package/dist/document-refresh/enforcer.d.ts.map +1 -0
  783. package/dist/document-refresh/enforcer.js +329 -0
  784. package/dist/document-refresh/enforcer.js.map +1 -0
  785. package/dist/exec/followup.d.ts +45 -0
  786. package/dist/exec/followup.d.ts.map +1 -0
  787. package/dist/exec/followup.js +355 -0
  788. package/dist/exec/followup.js.map +1 -0
  789. package/dist/goal-workflows/__tests__/artifacts.test.d.ts +2 -0
  790. package/dist/goal-workflows/__tests__/artifacts.test.d.ts.map +1 -0
  791. package/dist/goal-workflows/__tests__/artifacts.test.js +96 -0
  792. package/dist/goal-workflows/__tests__/artifacts.test.js.map +1 -0
  793. package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.d.ts +2 -0
  794. package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.d.ts.map +1 -0
  795. package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.js +75 -0
  796. package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.js.map +1 -0
  797. package/dist/goal-workflows/artifacts.d.ts +62 -0
  798. package/dist/goal-workflows/artifacts.d.ts.map +1 -0
  799. package/dist/goal-workflows/artifacts.js +132 -0
  800. package/dist/goal-workflows/artifacts.js.map +1 -0
  801. package/dist/goal-workflows/codex-goal-snapshot.d.ts +32 -0
  802. package/dist/goal-workflows/codex-goal-snapshot.d.ts.map +1 -0
  803. package/dist/goal-workflows/codex-goal-snapshot.js +157 -0
  804. package/dist/goal-workflows/codex-goal-snapshot.js.map +1 -0
  805. package/dist/goal-workflows/handoff.d.ts +10 -0
  806. package/dist/goal-workflows/handoff.d.ts.map +1 -0
  807. package/dist/goal-workflows/handoff.js +31 -0
  808. package/dist/goal-workflows/handoff.js.map +1 -0
  809. package/dist/goal-workflows/validation.d.ts +13 -0
  810. package/dist/goal-workflows/validation.d.ts.map +1 -0
  811. package/dist/goal-workflows/validation.js +36 -0
  812. package/dist/goal-workflows/validation.js.map +1 -0
  813. package/dist/hooks/__tests__/agents-overlay.test.d.ts +8 -0
  814. package/dist/hooks/__tests__/agents-overlay.test.d.ts.map +1 -0
  815. package/dist/hooks/__tests__/agents-overlay.test.js +761 -0
  816. package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -0
  817. package/dist/hooks/__tests__/analyze-routing-contract.test.d.ts +2 -0
  818. package/dist/hooks/__tests__/analyze-routing-contract.test.d.ts.map +1 -0
  819. package/dist/hooks/__tests__/analyze-routing-contract.test.js +45 -0
  820. package/dist/hooks/__tests__/analyze-routing-contract.test.js.map +1 -0
  821. package/dist/hooks/__tests__/analyze-skill-contract.test.d.ts +2 -0
  822. package/dist/hooks/__tests__/analyze-skill-contract.test.d.ts.map +1 -0
  823. package/dist/hooks/__tests__/analyze-skill-contract.test.js +48 -0
  824. package/dist/hooks/__tests__/analyze-skill-contract.test.js.map +1 -0
  825. package/dist/hooks/__tests__/anti-slop-workflow.test.d.ts +2 -0
  826. package/dist/hooks/__tests__/anti-slop-workflow.test.d.ts.map +1 -0
  827. package/dist/hooks/__tests__/anti-slop-workflow.test.js +165 -0
  828. package/dist/hooks/__tests__/anti-slop-workflow.test.js.map +1 -0
  829. package/dist/hooks/__tests__/autopilot-skill-contract.test.d.ts +2 -0
  830. package/dist/hooks/__tests__/autopilot-skill-contract.test.d.ts.map +1 -0
  831. package/dist/hooks/__tests__/autopilot-skill-contract.test.js +90 -0
  832. package/dist/hooks/__tests__/autopilot-skill-contract.test.js.map +1 -0
  833. package/dist/hooks/__tests__/best-practice-research-skill.test.d.ts +2 -0
  834. package/dist/hooks/__tests__/best-practice-research-skill.test.d.ts.map +1 -0
  835. package/dist/hooks/__tests__/best-practice-research-skill.test.js +39 -0
  836. package/dist/hooks/__tests__/best-practice-research-skill.test.js.map +1 -0
  837. package/dist/hooks/__tests__/clawhip-event-contract.test.d.ts +2 -0
  838. package/dist/hooks/__tests__/clawhip-event-contract.test.d.ts.map +1 -0
  839. package/dist/hooks/__tests__/clawhip-event-contract.test.js +37 -0
  840. package/dist/hooks/__tests__/clawhip-event-contract.test.js.map +1 -0
  841. package/dist/hooks/__tests__/code-review-skill-contract.test.d.ts +2 -0
  842. package/dist/hooks/__tests__/code-review-skill-contract.test.d.ts.map +1 -0
  843. package/dist/hooks/__tests__/code-review-skill-contract.test.js +77 -0
  844. package/dist/hooks/__tests__/code-review-skill-contract.test.js.map +1 -0
  845. package/dist/hooks/__tests__/codebase-map.test.d.ts +8 -0
  846. package/dist/hooks/__tests__/codebase-map.test.d.ts.map +1 -0
  847. package/dist/hooks/__tests__/codebase-map.test.js +218 -0
  848. package/dist/hooks/__tests__/codebase-map.test.js.map +1 -0
  849. package/dist/hooks/__tests__/consensus-execution-handoff.test.d.ts +18 -0
  850. package/dist/hooks/__tests__/consensus-execution-handoff.test.d.ts.map +1 -0
  851. package/dist/hooks/__tests__/consensus-execution-handoff.test.js +266 -0
  852. package/dist/hooks/__tests__/consensus-execution-handoff.test.js.map +1 -0
  853. package/dist/hooks/__tests__/debugger-log-recency-contract.test.d.ts +2 -0
  854. package/dist/hooks/__tests__/debugger-log-recency-contract.test.d.ts.map +1 -0
  855. package/dist/hooks/__tests__/debugger-log-recency-contract.test.js +20 -0
  856. package/dist/hooks/__tests__/debugger-log-recency-contract.test.js.map +1 -0
  857. package/dist/hooks/__tests__/deep-interview-contract.test.d.ts +2 -0
  858. package/dist/hooks/__tests__/deep-interview-contract.test.d.ts.map +1 -0
  859. package/dist/hooks/__tests__/deep-interview-contract.test.js +309 -0
  860. package/dist/hooks/__tests__/deep-interview-contract.test.js.map +1 -0
  861. package/dist/hooks/__tests__/design-skill.test.d.ts +2 -0
  862. package/dist/hooks/__tests__/design-skill.test.d.ts.map +1 -0
  863. package/dist/hooks/__tests__/design-skill.test.js +55 -0
  864. package/dist/hooks/__tests__/design-skill.test.js.map +1 -0
  865. package/dist/hooks/__tests__/explicit-terminal-stop-docs-contract.test.d.ts +2 -0
  866. package/dist/hooks/__tests__/explicit-terminal-stop-docs-contract.test.d.ts.map +1 -0
  867. package/dist/hooks/__tests__/explicit-terminal-stop-docs-contract.test.js +43 -0
  868. package/dist/hooks/__tests__/explicit-terminal-stop-docs-contract.test.js.map +1 -0
  869. package/dist/hooks/__tests__/explicit-terminal-stop-model-docs-contract.test.d.ts +2 -0
  870. package/dist/hooks/__tests__/explicit-terminal-stop-model-docs-contract.test.d.ts.map +1 -0
  871. package/dist/hooks/__tests__/explicit-terminal-stop-model-docs-contract.test.js +38 -0
  872. package/dist/hooks/__tests__/explicit-terminal-stop-model-docs-contract.test.js.map +1 -0
  873. package/dist/hooks/__tests__/explore-routing.test.d.ts +2 -0
  874. package/dist/hooks/__tests__/explore-routing.test.d.ts.map +1 -0
  875. package/dist/hooks/__tests__/explore-routing.test.js +38 -0
  876. package/dist/hooks/__tests__/explore-routing.test.js.map +1 -0
  877. package/dist/hooks/__tests__/explore-sparkshell-guidance-contract.test.d.ts +2 -0
  878. package/dist/hooks/__tests__/explore-sparkshell-guidance-contract.test.d.ts.map +1 -0
  879. package/dist/hooks/__tests__/explore-sparkshell-guidance-contract.test.js +67 -0
  880. package/dist/hooks/__tests__/explore-sparkshell-guidance-contract.test.js.map +1 -0
  881. package/dist/hooks/__tests__/foreground-isolation-contract.test.d.ts +2 -0
  882. package/dist/hooks/__tests__/foreground-isolation-contract.test.d.ts.map +1 -0
  883. package/dist/hooks/__tests__/foreground-isolation-contract.test.js +28 -0
  884. package/dist/hooks/__tests__/foreground-isolation-contract.test.js.map +1 -0
  885. package/dist/hooks/__tests__/keyword-detector.test.d.ts +2 -0
  886. package/dist/hooks/__tests__/keyword-detector.test.d.ts.map +1 -0
  887. package/dist/hooks/__tests__/keyword-detector.test.js +3323 -0
  888. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -0
  889. package/dist/hooks/__tests__/notify-fallback-watcher.test.d.ts +2 -0
  890. package/dist/hooks/__tests__/notify-fallback-watcher.test.d.ts.map +1 -0
  891. package/dist/hooks/__tests__/notify-fallback-watcher.test.js +3956 -0
  892. package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -0
  893. package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.d.ts +2 -0
  894. package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.d.ts.map +1 -0
  895. package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js +786 -0
  896. package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js.map +1 -0
  897. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.d.ts +2 -0
  898. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.d.ts.map +1 -0
  899. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +2602 -0
  900. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js.map +1 -0
  901. package/dist/hooks/__tests__/notify-hook-cross-worktree-heartbeat.test.d.ts +2 -0
  902. package/dist/hooks/__tests__/notify-hook-cross-worktree-heartbeat.test.d.ts.map +1 -0
  903. package/dist/hooks/__tests__/notify-hook-cross-worktree-heartbeat.test.js +161 -0
  904. package/dist/hooks/__tests__/notify-hook-cross-worktree-heartbeat.test.js.map +1 -0
  905. package/dist/hooks/__tests__/notify-hook-managed-tmux.test.d.ts +2 -0
  906. package/dist/hooks/__tests__/notify-hook-managed-tmux.test.d.ts.map +1 -0
  907. package/dist/hooks/__tests__/notify-hook-managed-tmux.test.js +1178 -0
  908. package/dist/hooks/__tests__/notify-hook-managed-tmux.test.js.map +1 -0
  909. package/dist/hooks/__tests__/notify-hook-modules.test.d.ts +9 -0
  910. package/dist/hooks/__tests__/notify-hook-modules.test.d.ts.map +1 -0
  911. package/dist/hooks/__tests__/notify-hook-modules.test.js +529 -0
  912. package/dist/hooks/__tests__/notify-hook-modules.test.js.map +1 -0
  913. package/dist/hooks/__tests__/notify-hook-native-dispatch-contract.test.d.ts +2 -0
  914. package/dist/hooks/__tests__/notify-hook-native-dispatch-contract.test.d.ts.map +1 -0
  915. package/dist/hooks/__tests__/notify-hook-native-dispatch-contract.test.js +14 -0
  916. package/dist/hooks/__tests__/notify-hook-native-dispatch-contract.test.js.map +1 -0
  917. package/dist/hooks/__tests__/notify-hook-non-omx-guard.test.d.ts +2 -0
  918. package/dist/hooks/__tests__/notify-hook-non-omx-guard.test.d.ts.map +1 -0
  919. package/dist/hooks/__tests__/notify-hook-non-omx-guard.test.js +176 -0
  920. package/dist/hooks/__tests__/notify-hook-non-omx-guard.test.js.map +1 -0
  921. package/dist/hooks/__tests__/notify-hook-ralph-resume.test.d.ts +2 -0
  922. package/dist/hooks/__tests__/notify-hook-ralph-resume.test.d.ts.map +1 -0
  923. package/dist/hooks/__tests__/notify-hook-ralph-resume.test.js +890 -0
  924. package/dist/hooks/__tests__/notify-hook-ralph-resume.test.js.map +1 -0
  925. package/dist/hooks/__tests__/notify-hook-regression-205.test.d.ts +9 -0
  926. package/dist/hooks/__tests__/notify-hook-regression-205.test.d.ts.map +1 -0
  927. package/dist/hooks/__tests__/notify-hook-regression-205.test.js +255 -0
  928. package/dist/hooks/__tests__/notify-hook-regression-205.test.js.map +1 -0
  929. package/dist/hooks/__tests__/notify-hook-session-idle-dedupe.test.d.ts +2 -0
  930. package/dist/hooks/__tests__/notify-hook-session-idle-dedupe.test.d.ts.map +1 -0
  931. package/dist/hooks/__tests__/notify-hook-session-idle-dedupe.test.js +162 -0
  932. package/dist/hooks/__tests__/notify-hook-session-idle-dedupe.test.js.map +1 -0
  933. package/dist/hooks/__tests__/notify-hook-session-scope.test.d.ts +2 -0
  934. package/dist/hooks/__tests__/notify-hook-session-scope.test.d.ts.map +1 -0
  935. package/dist/hooks/__tests__/notify-hook-session-scope.test.js +304 -0
  936. package/dist/hooks/__tests__/notify-hook-session-scope.test.js.map +1 -0
  937. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.d.ts +2 -0
  938. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.d.ts.map +1 -0
  939. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +1511 -0
  940. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -0
  941. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.d.ts +2 -0
  942. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.d.ts.map +1 -0
  943. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +2911 -0
  944. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -0
  945. package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.d.ts +2 -0
  946. package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.d.ts.map +1 -0
  947. package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js +261 -0
  948. package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js.map +1 -0
  949. package/dist/hooks/__tests__/notify-hook-team-worker-fail-closed.test.d.ts +2 -0
  950. package/dist/hooks/__tests__/notify-hook-team-worker-fail-closed.test.d.ts.map +1 -0
  951. package/dist/hooks/__tests__/notify-hook-team-worker-fail-closed.test.js +35 -0
  952. package/dist/hooks/__tests__/notify-hook-team-worker-fail-closed.test.js.map +1 -0
  953. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.d.ts +2 -0
  954. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.d.ts.map +1 -0
  955. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js +1854 -0
  956. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js.map +1 -0
  957. package/dist/hooks/__tests__/notify-hook-tmux-scrollback.test.d.ts +10 -0
  958. package/dist/hooks/__tests__/notify-hook-tmux-scrollback.test.d.ts.map +1 -0
  959. package/dist/hooks/__tests__/notify-hook-tmux-scrollback.test.js +0 -0
  960. package/dist/hooks/__tests__/notify-hook-tmux-scrollback.test.js.map +1 -0
  961. package/dist/hooks/__tests__/notify-hook-visual-verdict.test.d.ts +11 -0
  962. package/dist/hooks/__tests__/notify-hook-visual-verdict.test.d.ts.map +1 -0
  963. package/dist/hooks/__tests__/notify-hook-visual-verdict.test.js +266 -0
  964. package/dist/hooks/__tests__/notify-hook-visual-verdict.test.js.map +1 -0
  965. package/dist/hooks/__tests__/notify-hook-worker-idle.test.d.ts +2 -0
  966. package/dist/hooks/__tests__/notify-hook-worker-idle.test.d.ts.map +1 -0
  967. package/dist/hooks/__tests__/notify-hook-worker-idle.test.js +895 -0
  968. package/dist/hooks/__tests__/notify-hook-worker-idle.test.js.map +1 -0
  969. package/dist/hooks/__tests__/openclaw-setup-contract.test.d.ts +2 -0
  970. package/dist/hooks/__tests__/openclaw-setup-contract.test.d.ts.map +1 -0
  971. package/dist/hooks/__tests__/openclaw-setup-contract.test.js +61 -0
  972. package/dist/hooks/__tests__/openclaw-setup-contract.test.js.map +1 -0
  973. package/dist/hooks/__tests__/pre-context-gate-skills.test.d.ts +2 -0
  974. package/dist/hooks/__tests__/pre-context-gate-skills.test.d.ts.map +1 -0
  975. package/dist/hooks/__tests__/pre-context-gate-skills.test.js +40 -0
  976. package/dist/hooks/__tests__/pre-context-gate-skills.test.js.map +1 -0
  977. package/dist/hooks/__tests__/prometheus-strict-contract.test.d.ts +2 -0
  978. package/dist/hooks/__tests__/prometheus-strict-contract.test.d.ts.map +1 -0
  979. package/dist/hooks/__tests__/prometheus-strict-contract.test.js +320 -0
  980. package/dist/hooks/__tests__/prometheus-strict-contract.test.js.map +1 -0
  981. package/dist/hooks/__tests__/prompt-guidance-catalog.test.d.ts +2 -0
  982. package/dist/hooks/__tests__/prompt-guidance-catalog.test.d.ts.map +1 -0
  983. package/dist/hooks/__tests__/prompt-guidance-catalog.test.js +11 -0
  984. package/dist/hooks/__tests__/prompt-guidance-catalog.test.js.map +1 -0
  985. package/dist/hooks/__tests__/prompt-guidance-contract.test.d.ts +2 -0
  986. package/dist/hooks/__tests__/prompt-guidance-contract.test.d.ts.map +1 -0
  987. package/dist/hooks/__tests__/prompt-guidance-contract.test.js +38 -0
  988. package/dist/hooks/__tests__/prompt-guidance-contract.test.js.map +1 -0
  989. package/dist/hooks/__tests__/prompt-guidance-fragments.test.d.ts +2 -0
  990. package/dist/hooks/__tests__/prompt-guidance-fragments.test.d.ts.map +1 -0
  991. package/dist/hooks/__tests__/prompt-guidance-fragments.test.js +48 -0
  992. package/dist/hooks/__tests__/prompt-guidance-fragments.test.js.map +1 -0
  993. package/dist/hooks/__tests__/prompt-guidance-scenarios.test.d.ts +2 -0
  994. package/dist/hooks/__tests__/prompt-guidance-scenarios.test.d.ts.map +1 -0
  995. package/dist/hooks/__tests__/prompt-guidance-scenarios.test.js +11 -0
  996. package/dist/hooks/__tests__/prompt-guidance-scenarios.test.js.map +1 -0
  997. package/dist/hooks/__tests__/prompt-guidance-test-helpers.d.ts +5 -0
  998. package/dist/hooks/__tests__/prompt-guidance-test-helpers.d.ts.map +1 -0
  999. package/dist/hooks/__tests__/prompt-guidance-test-helpers.js +34 -0
  1000. package/dist/hooks/__tests__/prompt-guidance-test-helpers.js.map +1 -0
  1001. package/dist/hooks/__tests__/prompt-guidance-wave-two.test.d.ts +2 -0
  1002. package/dist/hooks/__tests__/prompt-guidance-wave-two.test.d.ts.map +1 -0
  1003. package/dist/hooks/__tests__/prompt-guidance-wave-two.test.js +81 -0
  1004. package/dist/hooks/__tests__/prompt-guidance-wave-two.test.js.map +1 -0
  1005. package/dist/hooks/__tests__/prompt-orchestration-boundary.test.d.ts +2 -0
  1006. package/dist/hooks/__tests__/prompt-orchestration-boundary.test.d.ts.map +1 -0
  1007. package/dist/hooks/__tests__/prompt-orchestration-boundary.test.js +38 -0
  1008. package/dist/hooks/__tests__/prompt-orchestration-boundary.test.js.map +1 -0
  1009. package/dist/hooks/__tests__/prompt-refactor-contract.test.d.ts +2 -0
  1010. package/dist/hooks/__tests__/prompt-refactor-contract.test.d.ts.map +1 -0
  1011. package/dist/hooks/__tests__/prompt-refactor-contract.test.js +22 -0
  1012. package/dist/hooks/__tests__/prompt-refactor-contract.test.js.map +1 -0
  1013. package/dist/hooks/__tests__/prompt-team-routing.test.d.ts +2 -0
  1014. package/dist/hooks/__tests__/prompt-team-routing.test.d.ts.map +1 -0
  1015. package/dist/hooks/__tests__/prompt-team-routing.test.js +49 -0
  1016. package/dist/hooks/__tests__/prompt-team-routing.test.js.map +1 -0
  1017. package/dist/hooks/__tests__/research-workflow-boundaries.test.d.ts +2 -0
  1018. package/dist/hooks/__tests__/research-workflow-boundaries.test.d.ts.map +1 -0
  1019. package/dist/hooks/__tests__/research-workflow-boundaries.test.js +35 -0
  1020. package/dist/hooks/__tests__/research-workflow-boundaries.test.js.map +1 -0
  1021. package/dist/hooks/__tests__/session.test.d.ts +2 -0
  1022. package/dist/hooks/__tests__/session.test.d.ts.map +1 -0
  1023. package/dist/hooks/__tests__/session.test.js +504 -0
  1024. package/dist/hooks/__tests__/session.test.js.map +1 -0
  1025. package/dist/hooks/__tests__/skill-catalog-hygiene.test.d.ts +2 -0
  1026. package/dist/hooks/__tests__/skill-catalog-hygiene.test.d.ts.map +1 -0
  1027. package/dist/hooks/__tests__/skill-catalog-hygiene.test.js +84 -0
  1028. package/dist/hooks/__tests__/skill-catalog-hygiene.test.js.map +1 -0
  1029. package/dist/hooks/__tests__/skill-guidance-contract.test.d.ts +2 -0
  1030. package/dist/hooks/__tests__/skill-guidance-contract.test.d.ts.map +1 -0
  1031. package/dist/hooks/__tests__/skill-guidance-contract.test.js +89 -0
  1032. package/dist/hooks/__tests__/skill-guidance-contract.test.js.map +1 -0
  1033. package/dist/hooks/__tests__/task-size-detector.test.d.ts +2 -0
  1034. package/dist/hooks/__tests__/task-size-detector.test.d.ts.map +1 -0
  1035. package/dist/hooks/__tests__/task-size-detector.test.js +330 -0
  1036. package/dist/hooks/__tests__/task-size-detector.test.js.map +1 -0
  1037. package/dist/hooks/__tests__/team-runtime-gating-docs-contract.test.d.ts +2 -0
  1038. package/dist/hooks/__tests__/team-runtime-gating-docs-contract.test.d.ts.map +1 -0
  1039. package/dist/hooks/__tests__/team-runtime-gating-docs-contract.test.js +28 -0
  1040. package/dist/hooks/__tests__/team-runtime-gating-docs-contract.test.js.map +1 -0
  1041. package/dist/hooks/__tests__/tmux-hook-engine-types-sync.test.d.ts +2 -0
  1042. package/dist/hooks/__tests__/tmux-hook-engine-types-sync.test.d.ts.map +1 -0
  1043. package/dist/hooks/__tests__/tmux-hook-engine-types-sync.test.js +24 -0
  1044. package/dist/hooks/__tests__/tmux-hook-engine-types-sync.test.js.map +1 -0
  1045. package/dist/hooks/__tests__/tmux-hook-engine.test.d.ts +2 -0
  1046. package/dist/hooks/__tests__/tmux-hook-engine.test.d.ts.map +1 -0
  1047. package/dist/hooks/__tests__/tmux-hook-engine.test.js +403 -0
  1048. package/dist/hooks/__tests__/tmux-hook-engine.test.js.map +1 -0
  1049. package/dist/hooks/__tests__/triage-config.test.d.ts +2 -0
  1050. package/dist/hooks/__tests__/triage-config.test.d.ts.map +1 -0
  1051. package/dist/hooks/__tests__/triage-config.test.js +211 -0
  1052. package/dist/hooks/__tests__/triage-config.test.js.map +1 -0
  1053. package/dist/hooks/__tests__/triage-heuristic.test.d.ts +2 -0
  1054. package/dist/hooks/__tests__/triage-heuristic.test.d.ts.map +1 -0
  1055. package/dist/hooks/__tests__/triage-heuristic.test.js +285 -0
  1056. package/dist/hooks/__tests__/triage-heuristic.test.js.map +1 -0
  1057. package/dist/hooks/__tests__/triage-state.test.d.ts +2 -0
  1058. package/dist/hooks/__tests__/triage-state.test.d.ts.map +1 -0
  1059. package/dist/hooks/__tests__/triage-state.test.js +426 -0
  1060. package/dist/hooks/__tests__/triage-state.test.js.map +1 -0
  1061. package/dist/hooks/__tests__/visual-ralph-skill.test.d.ts +2 -0
  1062. package/dist/hooks/__tests__/visual-ralph-skill.test.d.ts.map +1 -0
  1063. package/dist/hooks/__tests__/visual-ralph-skill.test.js +44 -0
  1064. package/dist/hooks/__tests__/visual-ralph-skill.test.js.map +1 -0
  1065. package/dist/hooks/__tests__/visual-verdict-loop.test.d.ts +2 -0
  1066. package/dist/hooks/__tests__/visual-verdict-loop.test.d.ts.map +1 -0
  1067. package/dist/hooks/__tests__/visual-verdict-loop.test.js +31 -0
  1068. package/dist/hooks/__tests__/visual-verdict-loop.test.js.map +1 -0
  1069. package/dist/hooks/__tests__/wiki-docs-contract.test.d.ts +2 -0
  1070. package/dist/hooks/__tests__/wiki-docs-contract.test.d.ts.map +1 -0
  1071. package/dist/hooks/__tests__/wiki-docs-contract.test.js +35 -0
  1072. package/dist/hooks/__tests__/wiki-docs-contract.test.js.map +1 -0
  1073. package/dist/hooks/agents-overlay.d.ts +51 -0
  1074. package/dist/hooks/agents-overlay.d.ts.map +1 -0
  1075. package/dist/hooks/agents-overlay.js +547 -0
  1076. package/dist/hooks/agents-overlay.js.map +1 -0
  1077. package/dist/hooks/code-simplifier/__tests__/index.test.d.ts +2 -0
  1078. package/dist/hooks/code-simplifier/__tests__/index.test.d.ts.map +1 -0
  1079. package/dist/hooks/code-simplifier/__tests__/index.test.js +187 -0
  1080. package/dist/hooks/code-simplifier/__tests__/index.test.js.map +1 -0
  1081. package/dist/hooks/code-simplifier/index.d.ts +80 -0
  1082. package/dist/hooks/code-simplifier/index.d.ts.map +1 -0
  1083. package/dist/hooks/code-simplifier/index.js +172 -0
  1084. package/dist/hooks/code-simplifier/index.js.map +1 -0
  1085. package/dist/hooks/codebase-map.d.ts +23 -0
  1086. package/dist/hooks/codebase-map.d.ts.map +1 -0
  1087. package/dist/hooks/codebase-map.js +234 -0
  1088. package/dist/hooks/codebase-map.js.map +1 -0
  1089. package/dist/hooks/deep-interview-config-instruction.d.ts +3 -0
  1090. package/dist/hooks/deep-interview-config-instruction.d.ts.map +1 -0
  1091. package/dist/hooks/deep-interview-config-instruction.js +47 -0
  1092. package/dist/hooks/deep-interview-config-instruction.js.map +1 -0
  1093. package/dist/hooks/explore-routing.d.ts +5 -0
  1094. package/dist/hooks/explore-routing.d.ts.map +1 -0
  1095. package/dist/hooks/explore-routing.js +37 -0
  1096. package/dist/hooks/explore-routing.js.map +1 -0
  1097. package/dist/hooks/extensibility/__tests__/dispatcher.test.d.ts +2 -0
  1098. package/dist/hooks/extensibility/__tests__/dispatcher.test.d.ts.map +1 -0
  1099. package/dist/hooks/extensibility/__tests__/dispatcher.test.js +265 -0
  1100. package/dist/hooks/extensibility/__tests__/dispatcher.test.js.map +1 -0
  1101. package/dist/hooks/extensibility/__tests__/events.test.d.ts +2 -0
  1102. package/dist/hooks/extensibility/__tests__/events.test.d.ts.map +1 -0
  1103. package/dist/hooks/extensibility/__tests__/events.test.js +125 -0
  1104. package/dist/hooks/extensibility/__tests__/events.test.js.map +1 -0
  1105. package/dist/hooks/extensibility/__tests__/example-hook-plugins.test.d.ts +2 -0
  1106. package/dist/hooks/extensibility/__tests__/example-hook-plugins.test.d.ts.map +1 -0
  1107. package/dist/hooks/extensibility/__tests__/example-hook-plugins.test.js +153 -0
  1108. package/dist/hooks/extensibility/__tests__/example-hook-plugins.test.js.map +1 -0
  1109. package/dist/hooks/extensibility/__tests__/loader.test.d.ts +2 -0
  1110. package/dist/hooks/extensibility/__tests__/loader.test.d.ts.map +1 -0
  1111. package/dist/hooks/extensibility/__tests__/loader.test.js +254 -0
  1112. package/dist/hooks/extensibility/__tests__/loader.test.js.map +1 -0
  1113. package/dist/hooks/extensibility/__tests__/logging.test.d.ts +2 -0
  1114. package/dist/hooks/extensibility/__tests__/logging.test.d.ts.map +1 -0
  1115. package/dist/hooks/extensibility/__tests__/logging.test.js +74 -0
  1116. package/dist/hooks/extensibility/__tests__/logging.test.js.map +1 -0
  1117. package/dist/hooks/extensibility/__tests__/plugin-runner.test.d.ts +2 -0
  1118. package/dist/hooks/extensibility/__tests__/plugin-runner.test.d.ts.map +1 -0
  1119. package/dist/hooks/extensibility/__tests__/plugin-runner.test.js +344 -0
  1120. package/dist/hooks/extensibility/__tests__/plugin-runner.test.js.map +1 -0
  1121. package/dist/hooks/extensibility/__tests__/runtime.test.d.ts +2 -0
  1122. package/dist/hooks/extensibility/__tests__/runtime.test.d.ts.map +1 -0
  1123. package/dist/hooks/extensibility/__tests__/runtime.test.js +198 -0
  1124. package/dist/hooks/extensibility/__tests__/runtime.test.js.map +1 -0
  1125. package/dist/hooks/extensibility/__tests__/sdk-public-surface.test.d.ts +2 -0
  1126. package/dist/hooks/extensibility/__tests__/sdk-public-surface.test.d.ts.map +1 -0
  1127. package/dist/hooks/extensibility/__tests__/sdk-public-surface.test.js +32 -0
  1128. package/dist/hooks/extensibility/__tests__/sdk-public-surface.test.js.map +1 -0
  1129. package/dist/hooks/extensibility/__tests__/sdk.test.d.ts +2 -0
  1130. package/dist/hooks/extensibility/__tests__/sdk.test.d.ts.map +1 -0
  1131. package/dist/hooks/extensibility/__tests__/sdk.test.js +479 -0
  1132. package/dist/hooks/extensibility/__tests__/sdk.test.js.map +1 -0
  1133. package/dist/hooks/extensibility/dispatcher.d.ts +4 -0
  1134. package/dist/hooks/extensibility/dispatcher.d.ts.map +1 -0
  1135. package/dist/hooks/extensibility/dispatcher.js +302 -0
  1136. package/dist/hooks/extensibility/dispatcher.js.map +1 -0
  1137. package/dist/hooks/extensibility/events.d.ts +18 -0
  1138. package/dist/hooks/extensibility/events.d.ts.map +1 -0
  1139. package/dist/hooks/extensibility/events.js +53 -0
  1140. package/dist/hooks/extensibility/events.js.map +1 -0
  1141. package/dist/hooks/extensibility/index.d.ts +6 -0
  1142. package/dist/hooks/extensibility/index.d.ts.map +1 -0
  1143. package/dist/hooks/extensibility/index.js +6 -0
  1144. package/dist/hooks/extensibility/index.js.map +1 -0
  1145. package/dist/hooks/extensibility/loader.d.ts +14 -0
  1146. package/dist/hooks/extensibility/loader.d.ts.map +1 -0
  1147. package/dist/hooks/extensibility/loader.js +117 -0
  1148. package/dist/hooks/extensibility/loader.js.map +1 -0
  1149. package/dist/hooks/extensibility/logging.d.ts +4 -0
  1150. package/dist/hooks/extensibility/logging.d.ts.map +1 -0
  1151. package/dist/hooks/extensibility/logging.js +22 -0
  1152. package/dist/hooks/extensibility/logging.js.map +1 -0
  1153. package/dist/hooks/extensibility/plugin-runner-stdin.d.ts +2 -0
  1154. package/dist/hooks/extensibility/plugin-runner-stdin.d.ts.map +1 -0
  1155. package/dist/hooks/extensibility/plugin-runner-stdin.js +16 -0
  1156. package/dist/hooks/extensibility/plugin-runner-stdin.js.map +1 -0
  1157. package/dist/hooks/extensibility/plugin-runner.d.ts +2 -0
  1158. package/dist/hooks/extensibility/plugin-runner.d.ts.map +1 -0
  1159. package/dist/hooks/extensibility/plugin-runner.js +63 -0
  1160. package/dist/hooks/extensibility/plugin-runner.js.map +1 -0
  1161. package/dist/hooks/extensibility/runtime.d.ts +3 -0
  1162. package/dist/hooks/extensibility/runtime.d.ts.map +1 -0
  1163. package/dist/hooks/extensibility/runtime.js +42 -0
  1164. package/dist/hooks/extensibility/runtime.js.map +1 -0
  1165. package/dist/hooks/extensibility/sdk/logging.d.ts +6 -0
  1166. package/dist/hooks/extensibility/sdk/logging.d.ts.map +1 -0
  1167. package/dist/hooks/extensibility/sdk/logging.js +32 -0
  1168. package/dist/hooks/extensibility/sdk/logging.js.map +1 -0
  1169. package/dist/hooks/extensibility/sdk/paths.d.ts +7 -0
  1170. package/dist/hooks/extensibility/sdk/paths.d.ts.map +1 -0
  1171. package/dist/hooks/extensibility/sdk/paths.js +23 -0
  1172. package/dist/hooks/extensibility/sdk/paths.js.map +1 -0
  1173. package/dist/hooks/extensibility/sdk/plugin-state.d.ts +5 -0
  1174. package/dist/hooks/extensibility/sdk/plugin-state.d.ts.map +1 -0
  1175. package/dist/hooks/extensibility/sdk/plugin-state.js +66 -0
  1176. package/dist/hooks/extensibility/sdk/plugin-state.js.map +1 -0
  1177. package/dist/hooks/extensibility/sdk/runtime-state.d.ts +3 -0
  1178. package/dist/hooks/extensibility/sdk/runtime-state.d.ts.map +1 -0
  1179. package/dist/hooks/extensibility/sdk/runtime-state.js +47 -0
  1180. package/dist/hooks/extensibility/sdk/runtime-state.js.map +1 -0
  1181. package/dist/hooks/extensibility/sdk/tmux.d.ts +10 -0
  1182. package/dist/hooks/extensibility/sdk/tmux.d.ts.map +1 -0
  1183. package/dist/hooks/extensibility/sdk/tmux.js +181 -0
  1184. package/dist/hooks/extensibility/sdk/tmux.js.map +1 -0
  1185. package/dist/hooks/extensibility/sdk.d.ts +11 -0
  1186. package/dist/hooks/extensibility/sdk.d.ts.map +1 -0
  1187. package/dist/hooks/extensibility/sdk.js +21 -0
  1188. package/dist/hooks/extensibility/sdk.js.map +1 -0
  1189. package/dist/hooks/extensibility/types.d.ts +175 -0
  1190. package/dist/hooks/extensibility/types.d.ts.map +1 -0
  1191. package/dist/hooks/extensibility/types.js +2 -0
  1192. package/dist/hooks/extensibility/types.js.map +1 -0
  1193. package/dist/hooks/keyword-detector.d.ts +170 -0
  1194. package/dist/hooks/keyword-detector.d.ts.map +1 -0
  1195. package/dist/hooks/keyword-detector.js +1363 -0
  1196. package/dist/hooks/keyword-detector.js.map +1 -0
  1197. package/dist/hooks/keyword-registry.d.ts +15 -0
  1198. package/dist/hooks/keyword-registry.d.ts.map +1 -0
  1199. package/dist/hooks/keyword-registry.js +56 -0
  1200. package/dist/hooks/keyword-registry.js.map +1 -0
  1201. package/dist/hooks/prompt-guidance-contract.d.ts +20 -0
  1202. package/dist/hooks/prompt-guidance-contract.d.ts.map +1 -0
  1203. package/dist/hooks/prompt-guidance-contract.js +380 -0
  1204. package/dist/hooks/prompt-guidance-contract.js.map +1 -0
  1205. package/dist/hooks/session.d.ts +83 -0
  1206. package/dist/hooks/session.d.ts.map +1 -0
  1207. package/dist/hooks/session.js +412 -0
  1208. package/dist/hooks/session.js.map +1 -0
  1209. package/dist/hooks/task-size-detector.d.ts +72 -0
  1210. package/dist/hooks/task-size-detector.d.ts.map +1 -0
  1211. package/dist/hooks/task-size-detector.js +203 -0
  1212. package/dist/hooks/task-size-detector.js.map +1 -0
  1213. package/dist/hooks/triage-config.d.ts +33 -0
  1214. package/dist/hooks/triage-config.d.ts.map +1 -0
  1215. package/dist/hooks/triage-config.js +87 -0
  1216. package/dist/hooks/triage-config.js.map +1 -0
  1217. package/dist/hooks/triage-heuristic.d.ts +20 -0
  1218. package/dist/hooks/triage-heuristic.d.ts.map +1 -0
  1219. package/dist/hooks/triage-heuristic.js +287 -0
  1220. package/dist/hooks/triage-heuristic.js.map +1 -0
  1221. package/dist/hooks/triage-state.d.ts +63 -0
  1222. package/dist/hooks/triage-state.d.ts.map +1 -0
  1223. package/dist/hooks/triage-state.js +139 -0
  1224. package/dist/hooks/triage-state.js.map +1 -0
  1225. package/dist/hud/__tests__/authority.test.d.ts +2 -0
  1226. package/dist/hud/__tests__/authority.test.d.ts.map +1 -0
  1227. package/dist/hud/__tests__/authority.test.js +527 -0
  1228. package/dist/hud/__tests__/authority.test.js.map +1 -0
  1229. package/dist/hud/__tests__/colors.test.d.ts +2 -0
  1230. package/dist/hud/__tests__/colors.test.d.ts.map +1 -0
  1231. package/dist/hud/__tests__/colors.test.js +92 -0
  1232. package/dist/hud/__tests__/colors.test.js.map +1 -0
  1233. package/dist/hud/__tests__/hud-tmux-injection.test.d.ts +10 -0
  1234. package/dist/hud/__tests__/hud-tmux-injection.test.d.ts.map +1 -0
  1235. package/dist/hud/__tests__/hud-tmux-injection.test.js +185 -0
  1236. package/dist/hud/__tests__/hud-tmux-injection.test.js.map +1 -0
  1237. package/dist/hud/__tests__/index.test.d.ts +2 -0
  1238. package/dist/hud/__tests__/index.test.d.ts.map +1 -0
  1239. package/dist/hud/__tests__/index.test.js +684 -0
  1240. package/dist/hud/__tests__/index.test.js.map +1 -0
  1241. package/dist/hud/__tests__/reconcile.test.d.ts +2 -0
  1242. package/dist/hud/__tests__/reconcile.test.d.ts.map +1 -0
  1243. package/dist/hud/__tests__/reconcile.test.js +1621 -0
  1244. package/dist/hud/__tests__/reconcile.test.js.map +1 -0
  1245. package/dist/hud/__tests__/render.test.d.ts +2 -0
  1246. package/dist/hud/__tests__/render.test.d.ts.map +1 -0
  1247. package/dist/hud/__tests__/render.test.js +983 -0
  1248. package/dist/hud/__tests__/render.test.js.map +1 -0
  1249. package/dist/hud/__tests__/resource-leak-watch.test.d.ts +2 -0
  1250. package/dist/hud/__tests__/resource-leak-watch.test.d.ts.map +1 -0
  1251. package/dist/hud/__tests__/resource-leak-watch.test.js +28 -0
  1252. package/dist/hud/__tests__/resource-leak-watch.test.js.map +1 -0
  1253. package/dist/hud/__tests__/state.test.d.ts +2 -0
  1254. package/dist/hud/__tests__/state.test.d.ts.map +1 -0
  1255. package/dist/hud/__tests__/state.test.js +1212 -0
  1256. package/dist/hud/__tests__/state.test.js.map +1 -0
  1257. package/dist/hud/__tests__/tmux.test.d.ts +2 -0
  1258. package/dist/hud/__tests__/tmux.test.d.ts.map +1 -0
  1259. package/dist/hud/__tests__/tmux.test.js +679 -0
  1260. package/dist/hud/__tests__/tmux.test.js.map +1 -0
  1261. package/dist/hud/__tests__/types.test.d.ts +2 -0
  1262. package/dist/hud/__tests__/types.test.d.ts.map +1 -0
  1263. package/dist/hud/__tests__/types.test.js +79 -0
  1264. package/dist/hud/__tests__/types.test.js.map +1 -0
  1265. package/dist/hud/__tests__/watch.test.d.ts +2 -0
  1266. package/dist/hud/__tests__/watch.test.d.ts.map +1 -0
  1267. package/dist/hud/__tests__/watch.test.js +63 -0
  1268. package/dist/hud/__tests__/watch.test.js.map +1 -0
  1269. package/dist/hud/authority.d.ts +22 -0
  1270. package/dist/hud/authority.d.ts.map +1 -0
  1271. package/dist/hud/authority.js +377 -0
  1272. package/dist/hud/authority.js.map +1 -0
  1273. package/dist/hud/colors.d.ts +20 -0
  1274. package/dist/hud/colors.d.ts.map +1 -0
  1275. package/dist/hud/colors.js +60 -0
  1276. package/dist/hud/colors.js.map +1 -0
  1277. package/dist/hud/constants.d.ts +16 -0
  1278. package/dist/hud/constants.d.ts.map +1 -0
  1279. package/dist/hud/constants.js +25 -0
  1280. package/dist/hud/constants.js.map +1 -0
  1281. package/dist/hud/index.d.ts +79 -0
  1282. package/dist/hud/index.d.ts.map +1 -0
  1283. package/dist/hud/index.js +384 -0
  1284. package/dist/hud/index.js.map +1 -0
  1285. package/dist/hud/reconcile.d.ts +37 -0
  1286. package/dist/hud/reconcile.d.ts.map +1 -0
  1287. package/dist/hud/reconcile.js +326 -0
  1288. package/dist/hud/reconcile.js.map +1 -0
  1289. package/dist/hud/render.d.ts +15 -0
  1290. package/dist/hud/render.d.ts.map +1 -0
  1291. package/dist/hud/render.js +453 -0
  1292. package/dist/hud/render.js.map +1 -0
  1293. package/dist/hud/state.d.ts +27 -0
  1294. package/dist/hud/state.d.ts.map +1 -0
  1295. package/dist/hud/state.js +477 -0
  1296. package/dist/hud/state.js.map +1 -0
  1297. package/dist/hud/tmux.d.ts +87 -0
  1298. package/dist/hud/tmux.d.ts.map +1 -0
  1299. package/dist/hud/tmux.js +572 -0
  1300. package/dist/hud/tmux.js.map +1 -0
  1301. package/dist/hud/types.d.ts +165 -0
  1302. package/dist/hud/types.d.ts.map +1 -0
  1303. package/dist/hud/types.js +14 -0
  1304. package/dist/hud/types.js.map +1 -0
  1305. package/dist/imagegen/continuation.d.ts +44 -0
  1306. package/dist/imagegen/continuation.d.ts.map +1 -0
  1307. package/dist/imagegen/continuation.js +220 -0
  1308. package/dist/imagegen/continuation.js.map +1 -0
  1309. package/dist/index.d.ts +19 -0
  1310. package/dist/index.d.ts.map +1 -0
  1311. package/dist/index.js +19 -0
  1312. package/dist/index.js.map +1 -0
  1313. package/dist/mcp/__tests__/bootstrap.test.d.ts +2 -0
  1314. package/dist/mcp/__tests__/bootstrap.test.d.ts.map +1 -0
  1315. package/dist/mcp/__tests__/bootstrap.test.js +372 -0
  1316. package/dist/mcp/__tests__/bootstrap.test.js.map +1 -0
  1317. package/dist/mcp/__tests__/code-intel-server.test.d.ts +2 -0
  1318. package/dist/mcp/__tests__/code-intel-server.test.d.ts.map +1 -0
  1319. package/dist/mcp/__tests__/code-intel-server.test.js +70 -0
  1320. package/dist/mcp/__tests__/code-intel-server.test.js.map +1 -0
  1321. package/dist/mcp/__tests__/hermes-bridge.test.d.ts +2 -0
  1322. package/dist/mcp/__tests__/hermes-bridge.test.d.ts.map +1 -0
  1323. package/dist/mcp/__tests__/hermes-bridge.test.js +651 -0
  1324. package/dist/mcp/__tests__/hermes-bridge.test.js.map +1 -0
  1325. package/dist/mcp/__tests__/memory-server.test.d.ts +2 -0
  1326. package/dist/mcp/__tests__/memory-server.test.d.ts.map +1 -0
  1327. package/dist/mcp/__tests__/memory-server.test.js +36 -0
  1328. package/dist/mcp/__tests__/memory-server.test.js.map +1 -0
  1329. package/dist/mcp/__tests__/memory-validation.test.d.ts +2 -0
  1330. package/dist/mcp/__tests__/memory-validation.test.d.ts.map +1 -0
  1331. package/dist/mcp/__tests__/memory-validation.test.js +29 -0
  1332. package/dist/mcp/__tests__/memory-validation.test.js.map +1 -0
  1333. package/dist/mcp/__tests__/path-traversal.test.d.ts +2 -0
  1334. package/dist/mcp/__tests__/path-traversal.test.d.ts.map +1 -0
  1335. package/dist/mcp/__tests__/path-traversal.test.js +83 -0
  1336. package/dist/mcp/__tests__/path-traversal.test.js.map +1 -0
  1337. package/dist/mcp/__tests__/server-lifecycle.test.d.ts +2 -0
  1338. package/dist/mcp/__tests__/server-lifecycle.test.d.ts.map +1 -0
  1339. package/dist/mcp/__tests__/server-lifecycle.test.js +308 -0
  1340. package/dist/mcp/__tests__/server-lifecycle.test.js.map +1 -0
  1341. package/dist/mcp/__tests__/state-paths.test.d.ts +2 -0
  1342. package/dist/mcp/__tests__/state-paths.test.d.ts.map +1 -0
  1343. package/dist/mcp/__tests__/state-paths.test.js +477 -0
  1344. package/dist/mcp/__tests__/state-paths.test.js.map +1 -0
  1345. package/dist/mcp/__tests__/state-server-ralph-phase.test.d.ts +2 -0
  1346. package/dist/mcp/__tests__/state-server-ralph-phase.test.d.ts.map +1 -0
  1347. package/dist/mcp/__tests__/state-server-ralph-phase.test.js +109 -0
  1348. package/dist/mcp/__tests__/state-server-ralph-phase.test.js.map +1 -0
  1349. package/dist/mcp/__tests__/state-server-schema.test.d.ts +2 -0
  1350. package/dist/mcp/__tests__/state-server-schema.test.d.ts.map +1 -0
  1351. package/dist/mcp/__tests__/state-server-schema.test.js +29 -0
  1352. package/dist/mcp/__tests__/state-server-schema.test.js.map +1 -0
  1353. package/dist/mcp/__tests__/state-server-team-tools.test.d.ts +2 -0
  1354. package/dist/mcp/__tests__/state-server-team-tools.test.d.ts.map +1 -0
  1355. package/dist/mcp/__tests__/state-server-team-tools.test.js +35 -0
  1356. package/dist/mcp/__tests__/state-server-team-tools.test.js.map +1 -0
  1357. package/dist/mcp/__tests__/state-server.test.d.ts +2 -0
  1358. package/dist/mcp/__tests__/state-server.test.d.ts.map +1 -0
  1359. package/dist/mcp/__tests__/state-server.test.js +1318 -0
  1360. package/dist/mcp/__tests__/state-server.test.js.map +1 -0
  1361. package/dist/mcp/__tests__/trace-server.test.d.ts +2 -0
  1362. package/dist/mcp/__tests__/trace-server.test.d.ts.map +1 -0
  1363. package/dist/mcp/__tests__/trace-server.test.js +119 -0
  1364. package/dist/mcp/__tests__/trace-server.test.js.map +1 -0
  1365. package/dist/mcp/__tests__/wiki-server.test.d.ts +2 -0
  1366. package/dist/mcp/__tests__/wiki-server.test.d.ts.map +1 -0
  1367. package/dist/mcp/__tests__/wiki-server.test.js +126 -0
  1368. package/dist/mcp/__tests__/wiki-server.test.js.map +1 -0
  1369. package/dist/mcp/bootstrap.d.ts +44 -0
  1370. package/dist/mcp/bootstrap.d.ts.map +1 -0
  1371. package/dist/mcp/bootstrap.js +520 -0
  1372. package/dist/mcp/bootstrap.js.map +1 -0
  1373. package/dist/mcp/code-intel-server.d.ts +333 -0
  1374. package/dist/mcp/code-intel-server.d.ts.map +1 -0
  1375. package/dist/mcp/code-intel-server.js +605 -0
  1376. package/dist/mcp/code-intel-server.js.map +1 -0
  1377. package/dist/mcp/hermes-bridge.d.ts +124 -0
  1378. package/dist/mcp/hermes-bridge.d.ts.map +1 -0
  1379. package/dist/mcp/hermes-bridge.js +549 -0
  1380. package/dist/mcp/hermes-bridge.js.map +1 -0
  1381. package/dist/mcp/hermes-server.d.ts +374 -0
  1382. package/dist/mcp/hermes-server.d.ts.map +1 -0
  1383. package/dist/mcp/hermes-server.js +158 -0
  1384. package/dist/mcp/hermes-server.js.map +1 -0
  1385. package/dist/mcp/lifecycle-telemetry.d.ts +16 -0
  1386. package/dist/mcp/lifecycle-telemetry.d.ts.map +1 -0
  1387. package/dist/mcp/lifecycle-telemetry.js +95 -0
  1388. package/dist/mcp/lifecycle-telemetry.js.map +1 -0
  1389. package/dist/mcp/memory-server.d.ts +201 -0
  1390. package/dist/mcp/memory-server.d.ts.map +1 -0
  1391. package/dist/mcp/memory-server.js +441 -0
  1392. package/dist/mcp/memory-server.js.map +1 -0
  1393. package/dist/mcp/memory-validation.d.ts +9 -0
  1394. package/dist/mcp/memory-validation.d.ts.map +1 -0
  1395. package/dist/mcp/memory-validation.js +11 -0
  1396. package/dist/mcp/memory-validation.js.map +1 -0
  1397. package/dist/mcp/state-paths.d.ts +91 -0
  1398. package/dist/mcp/state-paths.d.ts.map +1 -0
  1399. package/dist/mcp/state-paths.js +473 -0
  1400. package/dist/mcp/state-paths.js.map +1 -0
  1401. package/dist/mcp/state-server.d.ts +222 -0
  1402. package/dist/mcp/state-server.d.ts.map +1 -0
  1403. package/dist/mcp/state-server.js +181 -0
  1404. package/dist/mcp/state-server.js.map +1 -0
  1405. package/dist/mcp/trace-server.d.ts +81 -0
  1406. package/dist/mcp/trace-server.d.ts.map +1 -0
  1407. package/dist/mcp/trace-server.js +271 -0
  1408. package/dist/mcp/trace-server.js.map +1 -0
  1409. package/dist/mcp/wiki-server.d.ts +181 -0
  1410. package/dist/mcp/wiki-server.d.ts.map +1 -0
  1411. package/dist/mcp/wiki-server.js +244 -0
  1412. package/dist/mcp/wiki-server.js.map +1 -0
  1413. package/dist/modes/__tests__/base-autopilot-gates.test.d.ts +2 -0
  1414. package/dist/modes/__tests__/base-autopilot-gates.test.d.ts.map +1 -0
  1415. package/dist/modes/__tests__/base-autopilot-gates.test.js +154 -0
  1416. package/dist/modes/__tests__/base-autopilot-gates.test.js.map +1 -0
  1417. package/dist/modes/__tests__/base-autoresearch-contract.test.d.ts +2 -0
  1418. package/dist/modes/__tests__/base-autoresearch-contract.test.d.ts.map +1 -0
  1419. package/dist/modes/__tests__/base-autoresearch-contract.test.js +129 -0
  1420. package/dist/modes/__tests__/base-autoresearch-contract.test.js.map +1 -0
  1421. package/dist/modes/__tests__/base-multi-state-compat.test.d.ts +2 -0
  1422. package/dist/modes/__tests__/base-multi-state-compat.test.d.ts.map +1 -0
  1423. package/dist/modes/__tests__/base-multi-state-compat.test.js +38 -0
  1424. package/dist/modes/__tests__/base-multi-state-compat.test.js.map +1 -0
  1425. package/dist/modes/__tests__/base-ralph-contract.test.d.ts +2 -0
  1426. package/dist/modes/__tests__/base-ralph-contract.test.d.ts.map +1 -0
  1427. package/dist/modes/__tests__/base-ralph-contract.test.js +64 -0
  1428. package/dist/modes/__tests__/base-ralph-contract.test.js.map +1 -0
  1429. package/dist/modes/__tests__/base-session-scope.test.d.ts +2 -0
  1430. package/dist/modes/__tests__/base-session-scope.test.d.ts.map +1 -0
  1431. package/dist/modes/__tests__/base-session-scope.test.js +146 -0
  1432. package/dist/modes/__tests__/base-session-scope.test.js.map +1 -0
  1433. package/dist/modes/__tests__/base-tmux-pane.test.d.ts +2 -0
  1434. package/dist/modes/__tests__/base-tmux-pane.test.d.ts.map +1 -0
  1435. package/dist/modes/__tests__/base-tmux-pane.test.js +100 -0
  1436. package/dist/modes/__tests__/base-tmux-pane.test.js.map +1 -0
  1437. package/dist/modes/base.d.ts +60 -0
  1438. package/dist/modes/base.d.ts.map +1 -0
  1439. package/dist/modes/base.js +346 -0
  1440. package/dist/modes/base.js.map +1 -0
  1441. package/dist/notifications/__tests__/config.test.d.ts +2 -0
  1442. package/dist/notifications/__tests__/config.test.d.ts.map +1 -0
  1443. package/dist/notifications/__tests__/config.test.js +269 -0
  1444. package/dist/notifications/__tests__/config.test.js.map +1 -0
  1445. package/dist/notifications/__tests__/custom-alias-enablement.test.d.ts +2 -0
  1446. package/dist/notifications/__tests__/custom-alias-enablement.test.d.ts.map +1 -0
  1447. package/dist/notifications/__tests__/custom-alias-enablement.test.js +84 -0
  1448. package/dist/notifications/__tests__/custom-alias-enablement.test.js.map +1 -0
  1449. package/dist/notifications/__tests__/dispatch-cooldown.test.d.ts +5 -0
  1450. package/dist/notifications/__tests__/dispatch-cooldown.test.d.ts.map +1 -0
  1451. package/dist/notifications/__tests__/dispatch-cooldown.test.js +100 -0
  1452. package/dist/notifications/__tests__/dispatch-cooldown.test.js.map +1 -0
  1453. package/dist/notifications/__tests__/dispatcher.test.d.ts +2 -0
  1454. package/dist/notifications/__tests__/dispatcher.test.d.ts.map +1 -0
  1455. package/dist/notifications/__tests__/dispatcher.test.js +202 -0
  1456. package/dist/notifications/__tests__/dispatcher.test.js.map +1 -0
  1457. package/dist/notifications/__tests__/formatter.test.d.ts +2 -0
  1458. package/dist/notifications/__tests__/formatter.test.d.ts.map +1 -0
  1459. package/dist/notifications/__tests__/formatter.test.js +270 -0
  1460. package/dist/notifications/__tests__/formatter.test.js.map +1 -0
  1461. package/dist/notifications/__tests__/hook-config.test.d.ts +5 -0
  1462. package/dist/notifications/__tests__/hook-config.test.d.ts.map +1 -0
  1463. package/dist/notifications/__tests__/hook-config.test.js +139 -0
  1464. package/dist/notifications/__tests__/hook-config.test.js.map +1 -0
  1465. package/dist/notifications/__tests__/http-client-resource.test.d.ts +2 -0
  1466. package/dist/notifications/__tests__/http-client-resource.test.d.ts.map +1 -0
  1467. package/dist/notifications/__tests__/http-client-resource.test.js +41 -0
  1468. package/dist/notifications/__tests__/http-client-resource.test.js.map +1 -0
  1469. package/dist/notifications/__tests__/http-client.test.d.ts +2 -0
  1470. package/dist/notifications/__tests__/http-client.test.d.ts.map +1 -0
  1471. package/dist/notifications/__tests__/http-client.test.js +90 -0
  1472. package/dist/notifications/__tests__/http-client.test.js.map +1 -0
  1473. package/dist/notifications/__tests__/idle-cooldown.test.d.ts +5 -0
  1474. package/dist/notifications/__tests__/idle-cooldown.test.d.ts.map +1 -0
  1475. package/dist/notifications/__tests__/idle-cooldown.test.js +209 -0
  1476. package/dist/notifications/__tests__/idle-cooldown.test.js.map +1 -0
  1477. package/dist/notifications/__tests__/index.test.d.ts +2 -0
  1478. package/dist/notifications/__tests__/index.test.d.ts.map +1 -0
  1479. package/dist/notifications/__tests__/index.test.js +188 -0
  1480. package/dist/notifications/__tests__/index.test.js.map +1 -0
  1481. package/dist/notifications/__tests__/lifecycle-dedupe.test.d.ts +2 -0
  1482. package/dist/notifications/__tests__/lifecycle-dedupe.test.d.ts.map +1 -0
  1483. package/dist/notifications/__tests__/lifecycle-dedupe.test.js +86 -0
  1484. package/dist/notifications/__tests__/lifecycle-dedupe.test.js.map +1 -0
  1485. package/dist/notifications/__tests__/notifier.test.d.ts +2 -0
  1486. package/dist/notifications/__tests__/notifier.test.d.ts.map +1 -0
  1487. package/dist/notifications/__tests__/notifier.test.js +201 -0
  1488. package/dist/notifications/__tests__/notifier.test.js.map +1 -0
  1489. package/dist/notifications/__tests__/profiles.test.d.ts +2 -0
  1490. package/dist/notifications/__tests__/profiles.test.d.ts.map +1 -0
  1491. package/dist/notifications/__tests__/profiles.test.js +404 -0
  1492. package/dist/notifications/__tests__/profiles.test.js.map +1 -0
  1493. package/dist/notifications/__tests__/reply-config.test.d.ts +2 -0
  1494. package/dist/notifications/__tests__/reply-config.test.d.ts.map +1 -0
  1495. package/dist/notifications/__tests__/reply-config.test.js +79 -0
  1496. package/dist/notifications/__tests__/reply-config.test.js.map +1 -0
  1497. package/dist/notifications/__tests__/reply-listener.test.d.ts +2 -0
  1498. package/dist/notifications/__tests__/reply-listener.test.d.ts.map +1 -0
  1499. package/dist/notifications/__tests__/reply-listener.test.js +723 -0
  1500. package/dist/notifications/__tests__/reply-listener.test.js.map +1 -0
  1501. package/dist/notifications/__tests__/session-idle-tail-dedupe.test.d.ts +2 -0
  1502. package/dist/notifications/__tests__/session-idle-tail-dedupe.test.d.ts.map +1 -0
  1503. package/dist/notifications/__tests__/session-idle-tail-dedupe.test.js +93 -0
  1504. package/dist/notifications/__tests__/session-idle-tail-dedupe.test.js.map +1 -0
  1505. package/dist/notifications/__tests__/session-registry.test.d.ts +2 -0
  1506. package/dist/notifications/__tests__/session-registry.test.d.ts.map +1 -0
  1507. package/dist/notifications/__tests__/session-registry.test.js +234 -0
  1508. package/dist/notifications/__tests__/session-registry.test.js.map +1 -0
  1509. package/dist/notifications/__tests__/session-status.test.d.ts +2 -0
  1510. package/dist/notifications/__tests__/session-status.test.d.ts.map +1 -0
  1511. package/dist/notifications/__tests__/session-status.test.js +249 -0
  1512. package/dist/notifications/__tests__/session-status.test.js.map +1 -0
  1513. package/dist/notifications/__tests__/temp-mode.test.d.ts +2 -0
  1514. package/dist/notifications/__tests__/temp-mode.test.d.ts.map +1 -0
  1515. package/dist/notifications/__tests__/temp-mode.test.js +172 -0
  1516. package/dist/notifications/__tests__/temp-mode.test.js.map +1 -0
  1517. package/dist/notifications/__tests__/template-engine.test.d.ts +5 -0
  1518. package/dist/notifications/__tests__/template-engine.test.d.ts.map +1 -0
  1519. package/dist/notifications/__tests__/template-engine.test.js +158 -0
  1520. package/dist/notifications/__tests__/template-engine.test.js.map +1 -0
  1521. package/dist/notifications/__tests__/tmux-detector.test.d.ts +2 -0
  1522. package/dist/notifications/__tests__/tmux-detector.test.d.ts.map +1 -0
  1523. package/dist/notifications/__tests__/tmux-detector.test.js +204 -0
  1524. package/dist/notifications/__tests__/tmux-detector.test.js.map +1 -0
  1525. package/dist/notifications/__tests__/tmux.test.d.ts +2 -0
  1526. package/dist/notifications/__tests__/tmux.test.d.ts.map +1 -0
  1527. package/dist/notifications/__tests__/tmux.test.js +285 -0
  1528. package/dist/notifications/__tests__/tmux.test.js.map +1 -0
  1529. package/dist/notifications/__tests__/verbosity.test.d.ts +2 -0
  1530. package/dist/notifications/__tests__/verbosity.test.d.ts.map +1 -0
  1531. package/dist/notifications/__tests__/verbosity.test.js +257 -0
  1532. package/dist/notifications/__tests__/verbosity.test.js.map +1 -0
  1533. package/dist/notifications/config.d.ts +65 -0
  1534. package/dist/notifications/config.d.ts.map +1 -0
  1535. package/dist/notifications/config.js +615 -0
  1536. package/dist/notifications/config.js.map +1 -0
  1537. package/dist/notifications/dispatch-cooldown.d.ts +36 -0
  1538. package/dist/notifications/dispatch-cooldown.d.ts.map +1 -0
  1539. package/dist/notifications/dispatch-cooldown.js +109 -0
  1540. package/dist/notifications/dispatch-cooldown.js.map +1 -0
  1541. package/dist/notifications/dispatcher.d.ts +15 -0
  1542. package/dist/notifications/dispatcher.d.ts.map +1 -0
  1543. package/dist/notifications/dispatcher.js +385 -0
  1544. package/dist/notifications/dispatcher.js.map +1 -0
  1545. package/dist/notifications/formatter.d.ts +30 -0
  1546. package/dist/notifications/formatter.d.ts.map +1 -0
  1547. package/dist/notifications/formatter.js +234 -0
  1548. package/dist/notifications/formatter.js.map +1 -0
  1549. package/dist/notifications/hook-config-types.d.ts +43 -0
  1550. package/dist/notifications/hook-config-types.d.ts.map +1 -0
  1551. package/dist/notifications/hook-config-types.js +8 -0
  1552. package/dist/notifications/hook-config-types.js.map +1 -0
  1553. package/dist/notifications/hook-config.d.ts +40 -0
  1554. package/dist/notifications/hook-config.d.ts.map +1 -0
  1555. package/dist/notifications/hook-config.js +127 -0
  1556. package/dist/notifications/hook-config.js.map +1 -0
  1557. package/dist/notifications/http-client.d.ts +22 -0
  1558. package/dist/notifications/http-client.d.ts.map +1 -0
  1559. package/dist/notifications/http-client.js +349 -0
  1560. package/dist/notifications/http-client.js.map +1 -0
  1561. package/dist/notifications/idle-cooldown.d.ts +61 -0
  1562. package/dist/notifications/idle-cooldown.d.ts.map +1 -0
  1563. package/dist/notifications/idle-cooldown.js +207 -0
  1564. package/dist/notifications/idle-cooldown.js.map +1 -0
  1565. package/dist/notifications/index.d.ts +40 -0
  1566. package/dist/notifications/index.d.ts.map +1 -0
  1567. package/dist/notifications/index.js +228 -0
  1568. package/dist/notifications/index.js.map +1 -0
  1569. package/dist/notifications/lifecycle-dedupe.d.ts +8 -0
  1570. package/dist/notifications/lifecycle-dedupe.d.ts.map +1 -0
  1571. package/dist/notifications/lifecycle-dedupe.js +112 -0
  1572. package/dist/notifications/lifecycle-dedupe.js.map +1 -0
  1573. package/dist/notifications/notifier.d.ts +45 -0
  1574. package/dist/notifications/notifier.d.ts.map +1 -0
  1575. package/dist/notifications/notifier.js +146 -0
  1576. package/dist/notifications/notifier.js.map +1 -0
  1577. package/dist/notifications/reply-listener.d.ts +123 -0
  1578. package/dist/notifications/reply-listener.d.ts.map +1 -0
  1579. package/dist/notifications/reply-listener.js +846 -0
  1580. package/dist/notifications/reply-listener.js.map +1 -0
  1581. package/dist/notifications/session-registry.d.ts +26 -0
  1582. package/dist/notifications/session-registry.d.ts.map +1 -0
  1583. package/dist/notifications/session-registry.js +293 -0
  1584. package/dist/notifications/session-registry.js.map +1 -0
  1585. package/dist/notifications/session-status.d.ts +25 -0
  1586. package/dist/notifications/session-status.d.ts.map +1 -0
  1587. package/dist/notifications/session-status.js +202 -0
  1588. package/dist/notifications/session-status.js.map +1 -0
  1589. package/dist/notifications/temp-contract.d.ts +22 -0
  1590. package/dist/notifications/temp-contract.d.ts.map +1 -0
  1591. package/dist/notifications/temp-contract.js +147 -0
  1592. package/dist/notifications/temp-contract.js.map +1 -0
  1593. package/dist/notifications/template-engine.d.ts +34 -0
  1594. package/dist/notifications/template-engine.d.ts.map +1 -0
  1595. package/dist/notifications/template-engine.js +249 -0
  1596. package/dist/notifications/template-engine.js.map +1 -0
  1597. package/dist/notifications/tmux-detector.d.ts +59 -0
  1598. package/dist/notifications/tmux-detector.d.ts.map +1 -0
  1599. package/dist/notifications/tmux-detector.js +126 -0
  1600. package/dist/notifications/tmux-detector.js.map +1 -0
  1601. package/dist/notifications/tmux.d.ts +44 -0
  1602. package/dist/notifications/tmux.d.ts.map +1 -0
  1603. package/dist/notifications/tmux.js +293 -0
  1604. package/dist/notifications/tmux.js.map +1 -0
  1605. package/dist/notifications/types.d.ts +226 -0
  1606. package/dist/notifications/types.d.ts.map +1 -0
  1607. package/dist/notifications/types.js +9 -0
  1608. package/dist/notifications/types.js.map +1 -0
  1609. package/dist/openclaw/__tests__/config.test.d.ts +6 -0
  1610. package/dist/openclaw/__tests__/config.test.d.ts.map +1 -0
  1611. package/dist/openclaw/__tests__/config.test.js +344 -0
  1612. package/dist/openclaw/__tests__/config.test.js.map +1 -0
  1613. package/dist/openclaw/__tests__/dispatcher.test.d.ts +5 -0
  1614. package/dist/openclaw/__tests__/dispatcher.test.d.ts.map +1 -0
  1615. package/dist/openclaw/__tests__/dispatcher.test.js +278 -0
  1616. package/dist/openclaw/__tests__/dispatcher.test.js.map +1 -0
  1617. package/dist/openclaw/__tests__/index.test.d.ts +6 -0
  1618. package/dist/openclaw/__tests__/index.test.d.ts.map +1 -0
  1619. package/dist/openclaw/__tests__/index.test.js +382 -0
  1620. package/dist/openclaw/__tests__/index.test.js.map +1 -0
  1621. package/dist/openclaw/config.d.ts +59 -0
  1622. package/dist/openclaw/config.d.ts.map +1 -0
  1623. package/dist/openclaw/config.js +400 -0
  1624. package/dist/openclaw/config.js.map +1 -0
  1625. package/dist/openclaw/dispatcher.d.ts +75 -0
  1626. package/dist/openclaw/dispatcher.d.ts.map +1 -0
  1627. package/dist/openclaw/dispatcher.js +223 -0
  1628. package/dist/openclaw/dispatcher.js.map +1 -0
  1629. package/dist/openclaw/index.d.ts +29 -0
  1630. package/dist/openclaw/index.d.ts.map +1 -0
  1631. package/dist/openclaw/index.js +149 -0
  1632. package/dist/openclaw/index.js.map +1 -0
  1633. package/dist/openclaw/types.d.ts +123 -0
  1634. package/dist/openclaw/types.d.ts.map +1 -0
  1635. package/dist/openclaw/types.js +12 -0
  1636. package/dist/openclaw/types.js.map +1 -0
  1637. package/dist/performance-goal/artifacts.d.ts +76 -0
  1638. package/dist/performance-goal/artifacts.d.ts.map +1 -0
  1639. package/dist/performance-goal/artifacts.js +221 -0
  1640. package/dist/performance-goal/artifacts.js.map +1 -0
  1641. package/dist/pipeline/__tests__/orchestrator.test.d.ts +2 -0
  1642. package/dist/pipeline/__tests__/orchestrator.test.d.ts.map +1 -0
  1643. package/dist/pipeline/__tests__/orchestrator.test.js +645 -0
  1644. package/dist/pipeline/__tests__/orchestrator.test.js.map +1 -0
  1645. package/dist/pipeline/__tests__/stages.test.d.ts +2 -0
  1646. package/dist/pipeline/__tests__/stages.test.d.ts.map +1 -0
  1647. package/dist/pipeline/__tests__/stages.test.js +1638 -0
  1648. package/dist/pipeline/__tests__/stages.test.js.map +1 -0
  1649. package/dist/pipeline/index.d.ts +25 -0
  1650. package/dist/pipeline/index.d.ts.map +1 -0
  1651. package/dist/pipeline/index.js +17 -0
  1652. package/dist/pipeline/index.js.map +1 -0
  1653. package/dist/pipeline/orchestrator.d.ts +52 -0
  1654. package/dist/pipeline/orchestrator.d.ts.map +1 -0
  1655. package/dist/pipeline/orchestrator.js +392 -0
  1656. package/dist/pipeline/orchestrator.js.map +1 -0
  1657. package/dist/pipeline/review-verdict.d.ts +3 -0
  1658. package/dist/pipeline/review-verdict.d.ts.map +1 -0
  1659. package/dist/pipeline/review-verdict.js +14 -0
  1660. package/dist/pipeline/review-verdict.js.map +1 -0
  1661. package/dist/pipeline/stages/code-review.d.ts +35 -0
  1662. package/dist/pipeline/stages/code-review.d.ts.map +1 -0
  1663. package/dist/pipeline/stages/code-review.js +55 -0
  1664. package/dist/pipeline/stages/code-review.js.map +1 -0
  1665. package/dist/pipeline/stages/deep-interview.d.ts +15 -0
  1666. package/dist/pipeline/stages/deep-interview.d.ts.map +1 -0
  1667. package/dist/pipeline/stages/deep-interview.js +32 -0
  1668. package/dist/pipeline/stages/deep-interview.js.map +1 -0
  1669. package/dist/pipeline/stages/ralph-verify.d.ts +53 -0
  1670. package/dist/pipeline/stages/ralph-verify.d.ts.map +1 -0
  1671. package/dist/pipeline/stages/ralph-verify.js +89 -0
  1672. package/dist/pipeline/stages/ralph-verify.js.map +1 -0
  1673. package/dist/pipeline/stages/ralplan.d.ts +26 -0
  1674. package/dist/pipeline/stages/ralplan.d.ts.map +1 -0
  1675. package/dist/pipeline/stages/ralplan.js +151 -0
  1676. package/dist/pipeline/stages/ralplan.js.map +1 -0
  1677. package/dist/pipeline/stages/team-exec.d.ts +52 -0
  1678. package/dist/pipeline/stages/team-exec.d.ts.map +1 -0
  1679. package/dist/pipeline/stages/team-exec.js +266 -0
  1680. package/dist/pipeline/stages/team-exec.js.map +1 -0
  1681. package/dist/pipeline/stages/ultragoal.d.ts +19 -0
  1682. package/dist/pipeline/stages/ultragoal.d.ts.map +1 -0
  1683. package/dist/pipeline/stages/ultragoal.js +38 -0
  1684. package/dist/pipeline/stages/ultragoal.js.map +1 -0
  1685. package/dist/pipeline/stages/ultraqa.d.ts +33 -0
  1686. package/dist/pipeline/stages/ultraqa.d.ts.map +1 -0
  1687. package/dist/pipeline/stages/ultraqa.js +49 -0
  1688. package/dist/pipeline/stages/ultraqa.js.map +1 -0
  1689. package/dist/pipeline/types.d.ts +124 -0
  1690. package/dist/pipeline/types.d.ts.map +1 -0
  1691. package/dist/pipeline/types.js +8 -0
  1692. package/dist/pipeline/types.js.map +1 -0
  1693. package/dist/planning/__tests__/approved-execution-lifecycle-matrix.test.d.ts +2 -0
  1694. package/dist/planning/__tests__/approved-execution-lifecycle-matrix.test.d.ts.map +1 -0
  1695. package/dist/planning/__tests__/approved-execution-lifecycle-matrix.test.js +158 -0
  1696. package/dist/planning/__tests__/approved-execution-lifecycle-matrix.test.js.map +1 -0
  1697. package/dist/planning/__tests__/approved-launch-hint-lineage-matrix.test.d.ts +2 -0
  1698. package/dist/planning/__tests__/approved-launch-hint-lineage-matrix.test.d.ts.map +1 -0
  1699. package/dist/planning/__tests__/approved-launch-hint-lineage-matrix.test.js +440 -0
  1700. package/dist/planning/__tests__/approved-launch-hint-lineage-matrix.test.js.map +1 -0
  1701. package/dist/planning/__tests__/artifacts.test.d.ts +2 -0
  1702. package/dist/planning/__tests__/artifacts.test.d.ts.map +1 -0
  1703. package/dist/planning/__tests__/artifacts.test.js +942 -0
  1704. package/dist/planning/__tests__/artifacts.test.js.map +1 -0
  1705. package/dist/planning/__tests__/markdown-structure.test.d.ts +2 -0
  1706. package/dist/planning/__tests__/markdown-structure.test.d.ts.map +1 -0
  1707. package/dist/planning/__tests__/markdown-structure.test.js +459 -0
  1708. package/dist/planning/__tests__/markdown-structure.test.js.map +1 -0
  1709. package/dist/planning/artifact-names.d.ts +13 -0
  1710. package/dist/planning/artifact-names.d.ts.map +1 -0
  1711. package/dist/planning/artifact-names.js +108 -0
  1712. package/dist/planning/artifact-names.js.map +1 -0
  1713. package/dist/planning/artifacts.d.ts +65 -0
  1714. package/dist/planning/artifacts.d.ts.map +1 -0
  1715. package/dist/planning/artifacts.js +561 -0
  1716. package/dist/planning/artifacts.js.map +1 -0
  1717. package/dist/planning/markdown-structure.d.ts +20 -0
  1718. package/dist/planning/markdown-structure.d.ts.map +1 -0
  1719. package/dist/planning/markdown-structure.js +137 -0
  1720. package/dist/planning/markdown-structure.js.map +1 -0
  1721. package/dist/question/__tests__/client.test.d.ts +2 -0
  1722. package/dist/question/__tests__/client.test.d.ts.map +1 -0
  1723. package/dist/question/__tests__/client.test.js +90 -0
  1724. package/dist/question/__tests__/client.test.js.map +1 -0
  1725. package/dist/question/__tests__/deep-interview.test.d.ts +2 -0
  1726. package/dist/question/__tests__/deep-interview.test.d.ts.map +1 -0
  1727. package/dist/question/__tests__/deep-interview.test.js +440 -0
  1728. package/dist/question/__tests__/deep-interview.test.js.map +1 -0
  1729. package/dist/question/__tests__/policy.test.d.ts +2 -0
  1730. package/dist/question/__tests__/policy.test.d.ts.map +1 -0
  1731. package/dist/question/__tests__/policy.test.js +273 -0
  1732. package/dist/question/__tests__/policy.test.js.map +1 -0
  1733. package/dist/question/__tests__/renderer.test.d.ts +2 -0
  1734. package/dist/question/__tests__/renderer.test.d.ts.map +1 -0
  1735. package/dist/question/__tests__/renderer.test.js +1461 -0
  1736. package/dist/question/__tests__/renderer.test.js.map +1 -0
  1737. package/dist/question/__tests__/state.test.d.ts +2 -0
  1738. package/dist/question/__tests__/state.test.d.ts.map +1 -0
  1739. package/dist/question/__tests__/state.test.js +541 -0
  1740. package/dist/question/__tests__/state.test.js.map +1 -0
  1741. package/dist/question/__tests__/types.test.d.ts +2 -0
  1742. package/dist/question/__tests__/types.test.d.ts.map +1 -0
  1743. package/dist/question/__tests__/types.test.js +65 -0
  1744. package/dist/question/__tests__/types.test.js.map +1 -0
  1745. package/dist/question/__tests__/ui.test.d.ts +2 -0
  1746. package/dist/question/__tests__/ui.test.d.ts.map +1 -0
  1747. package/dist/question/__tests__/ui.test.js +483 -0
  1748. package/dist/question/__tests__/ui.test.js.map +1 -0
  1749. package/dist/question/autopilot-wait.d.ts +21 -0
  1750. package/dist/question/autopilot-wait.d.ts.map +1 -0
  1751. package/dist/question/autopilot-wait.js +251 -0
  1752. package/dist/question/autopilot-wait.js.map +1 -0
  1753. package/dist/question/client.d.ts +64 -0
  1754. package/dist/question/client.d.ts.map +1 -0
  1755. package/dist/question/client.js +77 -0
  1756. package/dist/question/client.js.map +1 -0
  1757. package/dist/question/deep-interview.d.ts +33 -0
  1758. package/dist/question/deep-interview.d.ts.map +1 -0
  1759. package/dist/question/deep-interview.js +216 -0
  1760. package/dist/question/deep-interview.js.map +1 -0
  1761. package/dist/question/events.d.ts +53 -0
  1762. package/dist/question/events.d.ts.map +1 -0
  1763. package/dist/question/events.js +201 -0
  1764. package/dist/question/events.js.map +1 -0
  1765. package/dist/question/policy.d.ts +19 -0
  1766. package/dist/question/policy.d.ts.map +1 -0
  1767. package/dist/question/policy.js +95 -0
  1768. package/dist/question/policy.js.map +1 -0
  1769. package/dist/question/renderer.d.ts +66 -0
  1770. package/dist/question/renderer.d.ts.map +1 -0
  1771. package/dist/question/renderer.js +748 -0
  1772. package/dist/question/renderer.js.map +1 -0
  1773. package/dist/question/state.d.ts +56 -0
  1774. package/dist/question/state.d.ts.map +1 -0
  1775. package/dist/question/state.js +432 -0
  1776. package/dist/question/state.js.map +1 -0
  1777. package/dist/question/types.d.ts +92 -0
  1778. package/dist/question/types.d.ts.map +1 -0
  1779. package/dist/question/types.js +117 -0
  1780. package/dist/question/types.js.map +1 -0
  1781. package/dist/question/ui.d.ts +66 -0
  1782. package/dist/question/ui.d.ts.map +1 -0
  1783. package/dist/question/ui.js +458 -0
  1784. package/dist/question/ui.js.map +1 -0
  1785. package/dist/ralph/__tests__/completion-audit.test.d.ts +2 -0
  1786. package/dist/ralph/__tests__/completion-audit.test.d.ts.map +1 -0
  1787. package/dist/ralph/__tests__/completion-audit.test.js +160 -0
  1788. package/dist/ralph/__tests__/completion-audit.test.js.map +1 -0
  1789. package/dist/ralph/__tests__/persistence.test.d.ts +2 -0
  1790. package/dist/ralph/__tests__/persistence.test.d.ts.map +1 -0
  1791. package/dist/ralph/__tests__/persistence.test.js +116 -0
  1792. package/dist/ralph/__tests__/persistence.test.js.map +1 -0
  1793. package/dist/ralph/completion-audit.d.ts +8 -0
  1794. package/dist/ralph/completion-audit.d.ts.map +1 -0
  1795. package/dist/ralph/completion-audit.js +99 -0
  1796. package/dist/ralph/completion-audit.js.map +1 -0
  1797. package/dist/ralph/contract.d.ts +17 -0
  1798. package/dist/ralph/contract.d.ts.map +1 -0
  1799. package/dist/ralph/contract.js +108 -0
  1800. package/dist/ralph/contract.js.map +1 -0
  1801. package/dist/ralph/persistence.d.ts +29 -0
  1802. package/dist/ralph/persistence.d.ts.map +1 -0
  1803. package/dist/ralph/persistence.js +273 -0
  1804. package/dist/ralph/persistence.js.map +1 -0
  1805. package/dist/ralplan/__tests__/consensus-gate.test.d.ts +2 -0
  1806. package/dist/ralplan/__tests__/consensus-gate.test.d.ts.map +1 -0
  1807. package/dist/ralplan/__tests__/consensus-gate.test.js +192 -0
  1808. package/dist/ralplan/__tests__/consensus-gate.test.js.map +1 -0
  1809. package/dist/ralplan/__tests__/runtime.test.d.ts +2 -0
  1810. package/dist/ralplan/__tests__/runtime.test.d.ts.map +1 -0
  1811. package/dist/ralplan/__tests__/runtime.test.js +548 -0
  1812. package/dist/ralplan/__tests__/runtime.test.js.map +1 -0
  1813. package/dist/ralplan/consensus-gate.d.ts +37 -0
  1814. package/dist/ralplan/consensus-gate.d.ts.map +1 -0
  1815. package/dist/ralplan/consensus-gate.js +422 -0
  1816. package/dist/ralplan/consensus-gate.js.map +1 -0
  1817. package/dist/ralplan/runtime.d.ts +86 -0
  1818. package/dist/ralplan/runtime.d.ts.map +1 -0
  1819. package/dist/ralplan/runtime.js +365 -0
  1820. package/dist/ralplan/runtime.js.map +1 -0
  1821. package/dist/runtime/__tests__/bridge.test.d.ts +2 -0
  1822. package/dist/runtime/__tests__/bridge.test.d.ts.map +1 -0
  1823. package/dist/runtime/__tests__/bridge.test.js +194 -0
  1824. package/dist/runtime/__tests__/bridge.test.js.map +1 -0
  1825. package/dist/runtime/__tests__/process-tree.test.d.ts +2 -0
  1826. package/dist/runtime/__tests__/process-tree.test.d.ts.map +1 -0
  1827. package/dist/runtime/__tests__/process-tree.test.js +107 -0
  1828. package/dist/runtime/__tests__/process-tree.test.js.map +1 -0
  1829. package/dist/runtime/__tests__/run-loop.test.d.ts +2 -0
  1830. package/dist/runtime/__tests__/run-loop.test.d.ts.map +1 -0
  1831. package/dist/runtime/__tests__/run-loop.test.js +35 -0
  1832. package/dist/runtime/__tests__/run-loop.test.js.map +1 -0
  1833. package/dist/runtime/__tests__/run-outcome.test.d.ts +2 -0
  1834. package/dist/runtime/__tests__/run-outcome.test.d.ts.map +1 -0
  1835. package/dist/runtime/__tests__/run-outcome.test.js +102 -0
  1836. package/dist/runtime/__tests__/run-outcome.test.js.map +1 -0
  1837. package/dist/runtime/__tests__/run-state.test.d.ts +2 -0
  1838. package/dist/runtime/__tests__/run-state.test.d.ts.map +1 -0
  1839. package/dist/runtime/__tests__/run-state.test.js +37 -0
  1840. package/dist/runtime/__tests__/run-state.test.js.map +1 -0
  1841. package/dist/runtime/bridge.d.ts +214 -0
  1842. package/dist/runtime/bridge.d.ts.map +1 -0
  1843. package/dist/runtime/bridge.js +223 -0
  1844. package/dist/runtime/bridge.js.map +1 -0
  1845. package/dist/runtime/process-tree.d.ts +28 -0
  1846. package/dist/runtime/process-tree.d.ts.map +1 -0
  1847. package/dist/runtime/process-tree.js +230 -0
  1848. package/dist/runtime/process-tree.js.map +1 -0
  1849. package/dist/runtime/run-loop.d.ts +45 -0
  1850. package/dist/runtime/run-loop.d.ts.map +1 -0
  1851. package/dist/runtime/run-loop.js +51 -0
  1852. package/dist/runtime/run-loop.js.map +1 -0
  1853. package/dist/runtime/run-outcome.d.ts +46 -0
  1854. package/dist/runtime/run-outcome.d.ts.map +1 -0
  1855. package/dist/runtime/run-outcome.js +285 -0
  1856. package/dist/runtime/run-outcome.js.map +1 -0
  1857. package/dist/runtime/run-state.d.ts +40 -0
  1858. package/dist/runtime/run-state.d.ts.map +1 -0
  1859. package/dist/runtime/run-state.js +120 -0
  1860. package/dist/runtime/run-state.js.map +1 -0
  1861. package/dist/runtime/terminal-lifecycle.d.ts +11 -0
  1862. package/dist/runtime/terminal-lifecycle.d.ts.map +1 -0
  1863. package/dist/runtime/terminal-lifecycle.js +52 -0
  1864. package/dist/runtime/terminal-lifecycle.js.map +1 -0
  1865. package/dist/scripts/__tests__/codex-native-hook.test.d.ts +2 -0
  1866. package/dist/scripts/__tests__/codex-native-hook.test.d.ts.map +1 -0
  1867. package/dist/scripts/__tests__/codex-native-hook.test.js +14253 -0
  1868. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -0
  1869. package/dist/scripts/__tests__/docs-site-contract.test.d.ts +2 -0
  1870. package/dist/scripts/__tests__/docs-site-contract.test.d.ts.map +1 -0
  1871. package/dist/scripts/__tests__/docs-site-contract.test.js +42 -0
  1872. package/dist/scripts/__tests__/docs-site-contract.test.js.map +1 -0
  1873. package/dist/scripts/__tests__/generate-release-body.test.d.ts +2 -0
  1874. package/dist/scripts/__tests__/generate-release-body.test.d.ts.map +1 -0
  1875. package/dist/scripts/__tests__/generate-release-body.test.js +233 -0
  1876. package/dist/scripts/__tests__/generate-release-body.test.js.map +1 -0
  1877. package/dist/scripts/__tests__/hook-derived-watcher.test.d.ts +2 -0
  1878. package/dist/scripts/__tests__/hook-derived-watcher.test.d.ts.map +1 -0
  1879. package/dist/scripts/__tests__/hook-derived-watcher.test.js +227 -0
  1880. package/dist/scripts/__tests__/hook-derived-watcher.test.js.map +1 -0
  1881. package/dist/scripts/__tests__/notify-dispatcher.test.d.ts +2 -0
  1882. package/dist/scripts/__tests__/notify-dispatcher.test.d.ts.map +1 -0
  1883. package/dist/scripts/__tests__/notify-dispatcher.test.js +421 -0
  1884. package/dist/scripts/__tests__/notify-dispatcher.test.js.map +1 -0
  1885. package/dist/scripts/__tests__/notify-state-io.test.d.ts +2 -0
  1886. package/dist/scripts/__tests__/notify-state-io.test.d.ts.map +1 -0
  1887. package/dist/scripts/__tests__/notify-state-io.test.js +111 -0
  1888. package/dist/scripts/__tests__/notify-state-io.test.js.map +1 -0
  1889. package/dist/scripts/__tests__/notify-tmux-injection.test.d.ts +2 -0
  1890. package/dist/scripts/__tests__/notify-tmux-injection.test.d.ts.map +1 -0
  1891. package/dist/scripts/__tests__/notify-tmux-injection.test.js +57 -0
  1892. package/dist/scripts/__tests__/notify-tmux-injection.test.js.map +1 -0
  1893. package/dist/scripts/__tests__/postinstall.test.d.ts +2 -0
  1894. package/dist/scripts/__tests__/postinstall.test.d.ts.map +1 -0
  1895. package/dist/scripts/__tests__/postinstall.test.js +92 -0
  1896. package/dist/scripts/__tests__/postinstall.test.js.map +1 -0
  1897. package/dist/scripts/__tests__/prompt-inventory.test.d.ts +2 -0
  1898. package/dist/scripts/__tests__/prompt-inventory.test.d.ts.map +1 -0
  1899. package/dist/scripts/__tests__/prompt-inventory.test.js +56 -0
  1900. package/dist/scripts/__tests__/prompt-inventory.test.js.map +1 -0
  1901. package/dist/scripts/__tests__/run-test-files.test.d.ts +2 -0
  1902. package/dist/scripts/__tests__/run-test-files.test.d.ts.map +1 -0
  1903. package/dist/scripts/__tests__/run-test-files.test.js +365 -0
  1904. package/dist/scripts/__tests__/run-test-files.test.js.map +1 -0
  1905. package/dist/scripts/__tests__/smoke-packed-install.test.d.ts +2 -0
  1906. package/dist/scripts/__tests__/smoke-packed-install.test.d.ts.map +1 -0
  1907. package/dist/scripts/__tests__/smoke-packed-install.test.js +160 -0
  1908. package/dist/scripts/__tests__/smoke-packed-install.test.js.map +1 -0
  1909. package/dist/scripts/__tests__/test-reply-listener-live.test.d.ts +2 -0
  1910. package/dist/scripts/__tests__/test-reply-listener-live.test.d.ts.map +1 -0
  1911. package/dist/scripts/__tests__/test-reply-listener-live.test.js +82 -0
  1912. package/dist/scripts/__tests__/test-reply-listener-live.test.js.map +1 -0
  1913. package/dist/scripts/__tests__/verify-native-agents.test.d.ts +2 -0
  1914. package/dist/scripts/__tests__/verify-native-agents.test.d.ts.map +1 -0
  1915. package/dist/scripts/__tests__/verify-native-agents.test.js +246 -0
  1916. package/dist/scripts/__tests__/verify-native-agents.test.js.map +1 -0
  1917. package/dist/scripts/build-api.d.ts +2 -0
  1918. package/dist/scripts/build-api.d.ts.map +1 -0
  1919. package/dist/scripts/build-api.js +44 -0
  1920. package/dist/scripts/build-api.js.map +1 -0
  1921. package/dist/scripts/build-explore-harness.d.ts +3 -0
  1922. package/dist/scripts/build-explore-harness.d.ts.map +1 -0
  1923. package/dist/scripts/build-explore-harness.js +50 -0
  1924. package/dist/scripts/build-explore-harness.js.map +1 -0
  1925. package/dist/scripts/build-sparkshell.d.ts +2 -0
  1926. package/dist/scripts/build-sparkshell.d.ts.map +1 -0
  1927. package/dist/scripts/build-sparkshell.js +46 -0
  1928. package/dist/scripts/build-sparkshell.js.map +1 -0
  1929. package/dist/scripts/check-runtime-syntax.d.ts +3 -0
  1930. package/dist/scripts/check-runtime-syntax.d.ts.map +1 -0
  1931. package/dist/scripts/check-runtime-syntax.js +57 -0
  1932. package/dist/scripts/check-runtime-syntax.js.map +1 -0
  1933. package/dist/scripts/check-version-sync.d.ts +3 -0
  1934. package/dist/scripts/check-version-sync.d.ts.map +1 -0
  1935. package/dist/scripts/check-version-sync.js +53 -0
  1936. package/dist/scripts/check-version-sync.js.map +1 -0
  1937. package/dist/scripts/cleanup-explore-harness.d.ts +3 -0
  1938. package/dist/scripts/cleanup-explore-harness.d.ts.map +1 -0
  1939. package/dist/scripts/cleanup-explore-harness.js +17 -0
  1940. package/dist/scripts/cleanup-explore-harness.js.map +1 -0
  1941. package/dist/scripts/codex-execution-surface.d.ts +16 -0
  1942. package/dist/scripts/codex-execution-surface.d.ts.map +1 -0
  1943. package/dist/scripts/codex-execution-surface.js +42 -0
  1944. package/dist/scripts/codex-execution-surface.js.map +1 -0
  1945. package/dist/scripts/codex-native-hook.d.ts +26 -0
  1946. package/dist/scripts/codex-native-hook.d.ts.map +1 -0
  1947. package/dist/scripts/codex-native-hook.js +3842 -0
  1948. package/dist/scripts/codex-native-hook.js.map +1 -0
  1949. package/dist/scripts/codex-native-pre-post.d.ts +46 -0
  1950. package/dist/scripts/codex-native-pre-post.d.ts.map +1 -0
  1951. package/dist/scripts/codex-native-pre-post.js +1186 -0
  1952. package/dist/scripts/codex-native-pre-post.js.map +1 -0
  1953. package/dist/scripts/eval/eval-candidate-handoff.d.ts +2 -0
  1954. package/dist/scripts/eval/eval-candidate-handoff.d.ts.map +1 -0
  1955. package/dist/scripts/eval/eval-candidate-handoff.js +11 -0
  1956. package/dist/scripts/eval/eval-candidate-handoff.js.map +1 -0
  1957. package/dist/scripts/eval/eval-cli-discoverability.d.ts +3 -0
  1958. package/dist/scripts/eval/eval-cli-discoverability.d.ts.map +1 -0
  1959. package/dist/scripts/eval/eval-cli-discoverability.js +37 -0
  1960. package/dist/scripts/eval/eval-cli-discoverability.js.map +1 -0
  1961. package/dist/scripts/eval/eval-fresh-run-tagging.d.ts +2 -0
  1962. package/dist/scripts/eval/eval-fresh-run-tagging.d.ts.map +1 -0
  1963. package/dist/scripts/eval/eval-fresh-run-tagging.js +11 -0
  1964. package/dist/scripts/eval/eval-fresh-run-tagging.js.map +1 -0
  1965. package/dist/scripts/eval/eval-help-consistency.d.ts +2 -0
  1966. package/dist/scripts/eval/eval-help-consistency.d.ts.map +1 -0
  1967. package/dist/scripts/eval/eval-help-consistency.js +12 -0
  1968. package/dist/scripts/eval/eval-help-consistency.js.map +1 -0
  1969. package/dist/scripts/eval/eval-in-action-cat-shellout-demo.d.ts +2 -0
  1970. package/dist/scripts/eval/eval-in-action-cat-shellout-demo.d.ts.map +1 -0
  1971. package/dist/scripts/eval/eval-in-action-cat-shellout-demo.js +31 -0
  1972. package/dist/scripts/eval/eval-in-action-cat-shellout-demo.js.map +1 -0
  1973. package/dist/scripts/eval/eval-parity-smoke.d.ts +2 -0
  1974. package/dist/scripts/eval/eval-parity-smoke.d.ts.map +1 -0
  1975. package/dist/scripts/eval/eval-parity-smoke.js +23 -0
  1976. package/dist/scripts/eval/eval-parity-smoke.js.map +1 -0
  1977. package/dist/scripts/eval/eval-parity-sweep.d.ts +2 -0
  1978. package/dist/scripts/eval/eval-parity-sweep.d.ts.map +1 -0
  1979. package/dist/scripts/eval/eval-parity-sweep.js +29 -0
  1980. package/dist/scripts/eval/eval-parity-sweep.js.map +1 -0
  1981. package/dist/scripts/eval/eval-resume-dirty-guard.d.ts +2 -0
  1982. package/dist/scripts/eval/eval-resume-dirty-guard.d.ts.map +1 -0
  1983. package/dist/scripts/eval/eval-resume-dirty-guard.js +11 -0
  1984. package/dist/scripts/eval/eval-resume-dirty-guard.js.map +1 -0
  1985. package/dist/scripts/eval/eval-security-path-traversal.d.ts +3 -0
  1986. package/dist/scripts/eval/eval-security-path-traversal.d.ts.map +1 -0
  1987. package/dist/scripts/eval/eval-security-path-traversal.js +35 -0
  1988. package/dist/scripts/eval/eval-security-path-traversal.js.map +1 -0
  1989. package/dist/scripts/fixtures/ask-advisor-stub.d.ts +3 -0
  1990. package/dist/scripts/fixtures/ask-advisor-stub.d.ts.map +1 -0
  1991. package/dist/scripts/fixtures/ask-advisor-stub.js +13 -0
  1992. package/dist/scripts/fixtures/ask-advisor-stub.js.map +1 -0
  1993. package/dist/scripts/generate-catalog-docs.d.ts +3 -0
  1994. package/dist/scripts/generate-catalog-docs.d.ts.map +1 -0
  1995. package/dist/scripts/generate-catalog-docs.js +99 -0
  1996. package/dist/scripts/generate-catalog-docs.js.map +1 -0
  1997. package/dist/scripts/generate-native-release-manifest.d.ts +3 -0
  1998. package/dist/scripts/generate-native-release-manifest.d.ts.map +1 -0
  1999. package/dist/scripts/generate-native-release-manifest.js +107 -0
  2000. package/dist/scripts/generate-native-release-manifest.js.map +1 -0
  2001. package/dist/scripts/generate-release-body.d.ts +35 -0
  2002. package/dist/scripts/generate-release-body.d.ts.map +1 -0
  2003. package/dist/scripts/generate-release-body.js +278 -0
  2004. package/dist/scripts/generate-release-body.js.map +1 -0
  2005. package/dist/scripts/hook-derived-watcher.d.ts +3 -0
  2006. package/dist/scripts/hook-derived-watcher.d.ts.map +1 -0
  2007. package/dist/scripts/hook-derived-watcher.js +557 -0
  2008. package/dist/scripts/hook-derived-watcher.js.map +1 -0
  2009. package/dist/scripts/hook-payload-guard.d.ts +9 -0
  2010. package/dist/scripts/hook-payload-guard.d.ts.map +1 -0
  2011. package/dist/scripts/hook-payload-guard.js +111 -0
  2012. package/dist/scripts/hook-payload-guard.js.map +1 -0
  2013. package/dist/scripts/notify-dispatcher.d.ts +7 -0
  2014. package/dist/scripts/notify-dispatcher.d.ts.map +1 -0
  2015. package/dist/scripts/notify-dispatcher.js +359 -0
  2016. package/dist/scripts/notify-dispatcher.js.map +1 -0
  2017. package/dist/scripts/notify-fallback-watcher.d.ts +3 -0
  2018. package/dist/scripts/notify-fallback-watcher.d.ts.map +1 -0
  2019. package/dist/scripts/notify-fallback-watcher.js +1771 -0
  2020. package/dist/scripts/notify-fallback-watcher.js.map +1 -0
  2021. package/dist/scripts/notify-hook/__tests__/operational-events.test.d.ts +2 -0
  2022. package/dist/scripts/notify-hook/__tests__/operational-events.test.d.ts.map +1 -0
  2023. package/dist/scripts/notify-hook/__tests__/operational-events.test.js +24 -0
  2024. package/dist/scripts/notify-hook/__tests__/operational-events.test.js.map +1 -0
  2025. package/dist/scripts/notify-hook/__tests__/payload-guard.test.d.ts +2 -0
  2026. package/dist/scripts/notify-hook/__tests__/payload-guard.test.d.ts.map +1 -0
  2027. package/dist/scripts/notify-hook/__tests__/payload-guard.test.js +39 -0
  2028. package/dist/scripts/notify-hook/__tests__/payload-guard.test.js.map +1 -0
  2029. package/dist/scripts/notify-hook/__tests__/team-worker-posttooluse.test.d.ts +2 -0
  2030. package/dist/scripts/notify-hook/__tests__/team-worker-posttooluse.test.d.ts.map +1 -0
  2031. package/dist/scripts/notify-hook/__tests__/team-worker-posttooluse.test.js +153 -0
  2032. package/dist/scripts/notify-hook/__tests__/team-worker-posttooluse.test.js.map +1 -0
  2033. package/dist/scripts/notify-hook/active-team.d.ts +9 -0
  2034. package/dist/scripts/notify-hook/active-team.d.ts.map +1 -0
  2035. package/dist/scripts/notify-hook/active-team.js +45 -0
  2036. package/dist/scripts/notify-hook/active-team.js.map +1 -0
  2037. package/dist/scripts/notify-hook/auto-nudge.d.ts +96 -0
  2038. package/dist/scripts/notify-hook/auto-nudge.d.ts.map +1 -0
  2039. package/dist/scripts/notify-hook/auto-nudge.js +698 -0
  2040. package/dist/scripts/notify-hook/auto-nudge.js.map +1 -0
  2041. package/dist/scripts/notify-hook/log.d.ts +6 -0
  2042. package/dist/scripts/notify-hook/log.d.ts.map +1 -0
  2043. package/dist/scripts/notify-hook/log.js +22 -0
  2044. package/dist/scripts/notify-hook/log.js.map +1 -0
  2045. package/dist/scripts/notify-hook/managed-tmux.d.ts +21 -0
  2046. package/dist/scripts/notify-hook/managed-tmux.d.ts.map +1 -0
  2047. package/dist/scripts/notify-hook/managed-tmux.js +541 -0
  2048. package/dist/scripts/notify-hook/managed-tmux.js.map +1 -0
  2049. package/dist/scripts/notify-hook/operational-events.d.ts +14 -0
  2050. package/dist/scripts/notify-hook/operational-events.d.ts.map +1 -0
  2051. package/dist/scripts/notify-hook/operational-events.js +255 -0
  2052. package/dist/scripts/notify-hook/operational-events.js.map +1 -0
  2053. package/dist/scripts/notify-hook/orchestration-intent.d.ts +17 -0
  2054. package/dist/scripts/notify-hook/orchestration-intent.d.ts.map +1 -0
  2055. package/dist/scripts/notify-hook/orchestration-intent.js +71 -0
  2056. package/dist/scripts/notify-hook/orchestration-intent.js.map +1 -0
  2057. package/dist/scripts/notify-hook/payload-parser.d.ts +13 -0
  2058. package/dist/scripts/notify-hook/payload-parser.d.ts.map +1 -0
  2059. package/dist/scripts/notify-hook/payload-parser.js +134 -0
  2060. package/dist/scripts/notify-hook/payload-parser.js.map +1 -0
  2061. package/dist/scripts/notify-hook/process-runner.d.ts +9 -0
  2062. package/dist/scripts/notify-hook/process-runner.d.ts.map +1 -0
  2063. package/dist/scripts/notify-hook/process-runner.js +74 -0
  2064. package/dist/scripts/notify-hook/process-runner.js.map +1 -0
  2065. package/dist/scripts/notify-hook/ralph-session-resume.d.ts +22 -0
  2066. package/dist/scripts/notify-hook/ralph-session-resume.d.ts.map +1 -0
  2067. package/dist/scripts/notify-hook/ralph-session-resume.js +381 -0
  2068. package/dist/scripts/notify-hook/ralph-session-resume.js.map +1 -0
  2069. package/dist/scripts/notify-hook/state-io.d.ts +21 -0
  2070. package/dist/scripts/notify-hook/state-io.d.ts.map +1 -0
  2071. package/dist/scripts/notify-hook/state-io.js +169 -0
  2072. package/dist/scripts/notify-hook/state-io.js.map +1 -0
  2073. package/dist/scripts/notify-hook/team-dispatch.d.ts +36 -0
  2074. package/dist/scripts/notify-hook/team-dispatch.d.ts.map +1 -0
  2075. package/dist/scripts/notify-hook/team-dispatch.js +1084 -0
  2076. package/dist/scripts/notify-hook/team-dispatch.js.map +1 -0
  2077. package/dist/scripts/notify-hook/team-leader-nudge.d.ts +21 -0
  2078. package/dist/scripts/notify-hook/team-leader-nudge.d.ts.map +1 -0
  2079. package/dist/scripts/notify-hook/team-leader-nudge.js +1029 -0
  2080. package/dist/scripts/notify-hook/team-leader-nudge.js.map +1 -0
  2081. package/dist/scripts/notify-hook/team-tmux-guard.d.ts +15 -0
  2082. package/dist/scripts/notify-hook/team-tmux-guard.d.ts.map +1 -0
  2083. package/dist/scripts/notify-hook/team-tmux-guard.js +205 -0
  2084. package/dist/scripts/notify-hook/team-tmux-guard.js.map +1 -0
  2085. package/dist/scripts/notify-hook/team-worker-posttooluse.d.ts +34 -0
  2086. package/dist/scripts/notify-hook/team-worker-posttooluse.d.ts.map +1 -0
  2087. package/dist/scripts/notify-hook/team-worker-posttooluse.js +434 -0
  2088. package/dist/scripts/notify-hook/team-worker-posttooluse.js.map +1 -0
  2089. package/dist/scripts/notify-hook/team-worker-stop.d.ts +15 -0
  2090. package/dist/scripts/notify-hook/team-worker-stop.d.ts.map +1 -0
  2091. package/dist/scripts/notify-hook/team-worker-stop.js +418 -0
  2092. package/dist/scripts/notify-hook/team-worker-stop.js.map +1 -0
  2093. package/dist/scripts/notify-hook/team-worker.d.ts +33 -0
  2094. package/dist/scripts/notify-hook/team-worker.d.ts.map +1 -0
  2095. package/dist/scripts/notify-hook/team-worker.js +705 -0
  2096. package/dist/scripts/notify-hook/team-worker.js.map +1 -0
  2097. package/dist/scripts/notify-hook/tmux-injection.d.ts +15 -0
  2098. package/dist/scripts/notify-hook/tmux-injection.d.ts.map +1 -0
  2099. package/dist/scripts/notify-hook/tmux-injection.js +673 -0
  2100. package/dist/scripts/notify-hook/tmux-injection.js.map +1 -0
  2101. package/dist/scripts/notify-hook/utils.d.ts +9 -0
  2102. package/dist/scripts/notify-hook/utils.d.ts.map +1 -0
  2103. package/dist/scripts/notify-hook/utils.js +36 -0
  2104. package/dist/scripts/notify-hook/utils.js.map +1 -0
  2105. package/dist/scripts/notify-hook/visual-verdict.d.ts +29 -0
  2106. package/dist/scripts/notify-hook/visual-verdict.d.ts.map +1 -0
  2107. package/dist/scripts/notify-hook/visual-verdict.js +145 -0
  2108. package/dist/scripts/notify-hook/visual-verdict.js.map +1 -0
  2109. package/dist/scripts/notify-hook.d.ts +20 -0
  2110. package/dist/scripts/notify-hook.d.ts.map +1 -0
  2111. package/dist/scripts/notify-hook.js +950 -0
  2112. package/dist/scripts/notify-hook.js.map +1 -0
  2113. package/dist/scripts/postinstall.d.ts +18 -0
  2114. package/dist/scripts/postinstall.d.ts.map +1 -0
  2115. package/dist/scripts/postinstall.js +66 -0
  2116. package/dist/scripts/postinstall.js.map +1 -0
  2117. package/dist/scripts/prompt-inventory.d.ts +29 -0
  2118. package/dist/scripts/prompt-inventory.d.ts.map +1 -0
  2119. package/dist/scripts/prompt-inventory.js +178 -0
  2120. package/dist/scripts/prompt-inventory.js.map +1 -0
  2121. package/dist/scripts/run-provider-advisor.d.ts +3 -0
  2122. package/dist/scripts/run-provider-advisor.d.ts.map +1 -0
  2123. package/dist/scripts/run-provider-advisor.js +177 -0
  2124. package/dist/scripts/run-provider-advisor.js.map +1 -0
  2125. package/dist/scripts/run-test-files.d.ts +2 -0
  2126. package/dist/scripts/run-test-files.d.ts.map +1 -0
  2127. package/dist/scripts/run-test-files.js +340 -0
  2128. package/dist/scripts/run-test-files.js.map +1 -0
  2129. package/dist/scripts/smoke-packed-install.d.ts +21 -0
  2130. package/dist/scripts/smoke-packed-install.d.ts.map +1 -0
  2131. package/dist/scripts/smoke-packed-install.js +221 -0
  2132. package/dist/scripts/smoke-packed-install.js.map +1 -0
  2133. package/dist/scripts/sync-plugin-mirror.d.ts +14 -0
  2134. package/dist/scripts/sync-plugin-mirror.d.ts.map +1 -0
  2135. package/dist/scripts/sync-plugin-mirror.js +306 -0
  2136. package/dist/scripts/sync-plugin-mirror.js.map +1 -0
  2137. package/dist/scripts/sync-prompt-guidance-fragments.d.ts +3 -0
  2138. package/dist/scripts/sync-prompt-guidance-fragments.d.ts.map +1 -0
  2139. package/dist/scripts/sync-prompt-guidance-fragments.js +50 -0
  2140. package/dist/scripts/sync-prompt-guidance-fragments.js.map +1 -0
  2141. package/dist/scripts/team-hardening-benchmark.d.ts +3 -0
  2142. package/dist/scripts/team-hardening-benchmark.d.ts.map +1 -0
  2143. package/dist/scripts/team-hardening-benchmark.js +91 -0
  2144. package/dist/scripts/team-hardening-benchmark.js.map +1 -0
  2145. package/dist/scripts/test-reply-listener-live.d.ts +24 -0
  2146. package/dist/scripts/test-reply-listener-live.d.ts.map +1 -0
  2147. package/dist/scripts/test-reply-listener-live.js +138 -0
  2148. package/dist/scripts/test-reply-listener-live.js.map +1 -0
  2149. package/dist/scripts/test-sparkshell.d.ts +2 -0
  2150. package/dist/scripts/test-sparkshell.d.ts.map +1 -0
  2151. package/dist/scripts/test-sparkshell.js +25 -0
  2152. package/dist/scripts/test-sparkshell.js.map +1 -0
  2153. package/dist/scripts/tmux-hook-engine.d.ts +45 -0
  2154. package/dist/scripts/tmux-hook-engine.d.ts.map +1 -0
  2155. package/dist/scripts/tmux-hook-engine.js +313 -0
  2156. package/dist/scripts/tmux-hook-engine.js.map +1 -0
  2157. package/dist/scripts/verify-native-agents.d.ts +16 -0
  2158. package/dist/scripts/verify-native-agents.d.ts.map +1 -0
  2159. package/dist/scripts/verify-native-agents.js +247 -0
  2160. package/dist/scripts/verify-native-agents.js.map +1 -0
  2161. package/dist/scripts/verify-native-release-assets.d.ts +3 -0
  2162. package/dist/scripts/verify-native-release-assets.d.ts.map +1 -0
  2163. package/dist/scripts/verify-native-release-assets.js +62 -0
  2164. package/dist/scripts/verify-native-release-assets.js.map +1 -0
  2165. package/dist/session-history/__tests__/search.test.d.ts +2 -0
  2166. package/dist/session-history/__tests__/search.test.d.ts.map +1 -0
  2167. package/dist/session-history/__tests__/search.test.js +150 -0
  2168. package/dist/session-history/__tests__/search.test.js.map +1 -0
  2169. package/dist/session-history/search.d.ts +31 -0
  2170. package/dist/session-history/search.d.ts.map +1 -0
  2171. package/dist/session-history/search.js +331 -0
  2172. package/dist/session-history/search.js.map +1 -0
  2173. package/dist/sidecar/__tests__/boundary.test.d.ts +2 -0
  2174. package/dist/sidecar/__tests__/boundary.test.d.ts.map +1 -0
  2175. package/dist/sidecar/__tests__/boundary.test.js +48 -0
  2176. package/dist/sidecar/__tests__/boundary.test.js.map +1 -0
  2177. package/dist/sidecar/__tests__/collector.test.d.ts +2 -0
  2178. package/dist/sidecar/__tests__/collector.test.d.ts.map +1 -0
  2179. package/dist/sidecar/__tests__/collector.test.js +162 -0
  2180. package/dist/sidecar/__tests__/collector.test.js.map +1 -0
  2181. package/dist/sidecar/__tests__/render.test.d.ts +2 -0
  2182. package/dist/sidecar/__tests__/render.test.d.ts.map +1 -0
  2183. package/dist/sidecar/__tests__/render.test.js +67 -0
  2184. package/dist/sidecar/__tests__/render.test.js.map +1 -0
  2185. package/dist/sidecar/__tests__/resource-leak-watch.test.d.ts +2 -0
  2186. package/dist/sidecar/__tests__/resource-leak-watch.test.d.ts.map +1 -0
  2187. package/dist/sidecar/__tests__/resource-leak-watch.test.js +38 -0
  2188. package/dist/sidecar/__tests__/resource-leak-watch.test.js.map +1 -0
  2189. package/dist/sidecar/__tests__/tmux.test.d.ts +2 -0
  2190. package/dist/sidecar/__tests__/tmux.test.d.ts.map +1 -0
  2191. package/dist/sidecar/__tests__/tmux.test.js +30 -0
  2192. package/dist/sidecar/__tests__/tmux.test.js.map +1 -0
  2193. package/dist/sidecar/__tests__/watch.test.d.ts +2 -0
  2194. package/dist/sidecar/__tests__/watch.test.d.ts.map +1 -0
  2195. package/dist/sidecar/__tests__/watch.test.js +42 -0
  2196. package/dist/sidecar/__tests__/watch.test.js.map +1 -0
  2197. package/dist/sidecar/collector.d.ts +4 -0
  2198. package/dist/sidecar/collector.d.ts.map +1 -0
  2199. package/dist/sidecar/collector.js +377 -0
  2200. package/dist/sidecar/collector.js.map +1 -0
  2201. package/dist/sidecar/index.d.ts +25 -0
  2202. package/dist/sidecar/index.d.ts.map +1 -0
  2203. package/dist/sidecar/index.js +182 -0
  2204. package/dist/sidecar/index.js.map +1 -0
  2205. package/dist/sidecar/render.d.ts +3 -0
  2206. package/dist/sidecar/render.d.ts.map +1 -0
  2207. package/dist/sidecar/render.js +72 -0
  2208. package/dist/sidecar/render.js.map +1 -0
  2209. package/dist/sidecar/tmux.d.ts +13 -0
  2210. package/dist/sidecar/tmux.d.ts.map +1 -0
  2211. package/dist/sidecar/tmux.js +44 -0
  2212. package/dist/sidecar/tmux.js.map +1 -0
  2213. package/dist/sidecar/types.d.ts +125 -0
  2214. package/dist/sidecar/types.d.ts.map +1 -0
  2215. package/dist/sidecar/types.js +2 -0
  2216. package/dist/sidecar/types.js.map +1 -0
  2217. package/dist/state/__tests__/mode-state-context.test.d.ts +2 -0
  2218. package/dist/state/__tests__/mode-state-context.test.d.ts.map +1 -0
  2219. package/dist/state/__tests__/mode-state-context.test.js +35 -0
  2220. package/dist/state/__tests__/mode-state-context.test.js.map +1 -0
  2221. package/dist/state/__tests__/operations-ralph-phase.test.d.ts +2 -0
  2222. package/dist/state/__tests__/operations-ralph-phase.test.d.ts.map +1 -0
  2223. package/dist/state/__tests__/operations-ralph-phase.test.js +190 -0
  2224. package/dist/state/__tests__/operations-ralph-phase.test.js.map +1 -0
  2225. package/dist/state/__tests__/operations.test.d.ts +2 -0
  2226. package/dist/state/__tests__/operations.test.d.ts.map +1 -0
  2227. package/dist/state/__tests__/operations.test.js +2753 -0
  2228. package/dist/state/__tests__/operations.test.js.map +1 -0
  2229. package/dist/state/__tests__/path-traversal.test.d.ts +2 -0
  2230. package/dist/state/__tests__/path-traversal.test.d.ts.map +1 -0
  2231. package/dist/state/__tests__/path-traversal.test.js +49 -0
  2232. package/dist/state/__tests__/path-traversal.test.js.map +1 -0
  2233. package/dist/state/__tests__/planning-gate.test.d.ts +2 -0
  2234. package/dist/state/__tests__/planning-gate.test.d.ts.map +1 -0
  2235. package/dist/state/__tests__/planning-gate.test.js +219 -0
  2236. package/dist/state/__tests__/planning-gate.test.js.map +1 -0
  2237. package/dist/state/__tests__/skill-active.test.d.ts +2 -0
  2238. package/dist/state/__tests__/skill-active.test.d.ts.map +1 -0
  2239. package/dist/state/__tests__/skill-active.test.js +314 -0
  2240. package/dist/state/__tests__/skill-active.test.js.map +1 -0
  2241. package/dist/state/__tests__/workflow-transition.test.d.ts +2 -0
  2242. package/dist/state/__tests__/workflow-transition.test.d.ts.map +1 -0
  2243. package/dist/state/__tests__/workflow-transition.test.js +293 -0
  2244. package/dist/state/__tests__/workflow-transition.test.js.map +1 -0
  2245. package/dist/state/mode-state-context.d.ts +14 -0
  2246. package/dist/state/mode-state-context.d.ts.map +1 -0
  2247. package/dist/state/mode-state-context.js +49 -0
  2248. package/dist/state/mode-state-context.js.map +1 -0
  2249. package/dist/state/operations.d.ts +13 -0
  2250. package/dist/state/operations.d.ts.map +1 -0
  2251. package/dist/state/operations.js +544 -0
  2252. package/dist/state/operations.js.map +1 -0
  2253. package/dist/state/paths.d.ts +3 -0
  2254. package/dist/state/paths.d.ts.map +1 -0
  2255. package/dist/state/paths.js +2 -0
  2256. package/dist/state/paths.js.map +1 -0
  2257. package/dist/state/skill-active.d.ts +64 -0
  2258. package/dist/state/skill-active.d.ts.map +1 -0
  2259. package/dist/state/skill-active.js +375 -0
  2260. package/dist/state/skill-active.js.map +1 -0
  2261. package/dist/state/workflow-transition-reconcile.d.ts +22 -0
  2262. package/dist/state/workflow-transition-reconcile.d.ts.map +1 -0
  2263. package/dist/state/workflow-transition-reconcile.js +144 -0
  2264. package/dist/state/workflow-transition-reconcile.js.map +1 -0
  2265. package/dist/state/workflow-transition.d.ts +45 -0
  2266. package/dist/state/workflow-transition.d.ts.map +1 -0
  2267. package/dist/state/workflow-transition.js +268 -0
  2268. package/dist/state/workflow-transition.js.map +1 -0
  2269. package/dist/subagents/__tests__/tracker.test.d.ts +2 -0
  2270. package/dist/subagents/__tests__/tracker.test.d.ts.map +1 -0
  2271. package/dist/subagents/__tests__/tracker.test.js +255 -0
  2272. package/dist/subagents/__tests__/tracker.test.js.map +1 -0
  2273. package/dist/subagents/tracker.d.ts +60 -0
  2274. package/dist/subagents/tracker.d.ts.map +1 -0
  2275. package/dist/subagents/tracker.js +229 -0
  2276. package/dist/subagents/tracker.js.map +1 -0
  2277. package/dist/team/__tests__/allocation-policy.test.d.ts +2 -0
  2278. package/dist/team/__tests__/allocation-policy.test.d.ts.map +1 -0
  2279. package/dist/team/__tests__/allocation-policy.test.js +111 -0
  2280. package/dist/team/__tests__/allocation-policy.test.js.map +1 -0
  2281. package/dist/team/__tests__/api-interop.test.d.ts +2 -0
  2282. package/dist/team/__tests__/api-interop.test.d.ts.map +1 -0
  2283. package/dist/team/__tests__/api-interop.test.js +2321 -0
  2284. package/dist/team/__tests__/api-interop.test.js.map +1 -0
  2285. package/dist/team/__tests__/approved-execution.test.d.ts +2 -0
  2286. package/dist/team/__tests__/approved-execution.test.d.ts.map +1 -0
  2287. package/dist/team/__tests__/approved-execution.test.js +304 -0
  2288. package/dist/team/__tests__/approved-execution.test.js.map +1 -0
  2289. package/dist/team/__tests__/commit-hygiene.test.d.ts +2 -0
  2290. package/dist/team/__tests__/commit-hygiene.test.d.ts.map +1 -0
  2291. package/dist/team/__tests__/commit-hygiene.test.js +93 -0
  2292. package/dist/team/__tests__/commit-hygiene.test.js.map +1 -0
  2293. package/dist/team/__tests__/coordination-protocol.test.d.ts +2 -0
  2294. package/dist/team/__tests__/coordination-protocol.test.d.ts.map +1 -0
  2295. package/dist/team/__tests__/coordination-protocol.test.js +173 -0
  2296. package/dist/team/__tests__/coordination-protocol.test.js.map +1 -0
  2297. package/dist/team/__tests__/cross-rebase-smoke.test.d.ts +2 -0
  2298. package/dist/team/__tests__/cross-rebase-smoke.test.d.ts.map +1 -0
  2299. package/dist/team/__tests__/cross-rebase-smoke.test.js +161 -0
  2300. package/dist/team/__tests__/cross-rebase-smoke.test.js.map +1 -0
  2301. package/dist/team/__tests__/current-task-baseline.test.d.ts +2 -0
  2302. package/dist/team/__tests__/current-task-baseline.test.d.ts.map +1 -0
  2303. package/dist/team/__tests__/current-task-baseline.test.js +87 -0
  2304. package/dist/team/__tests__/current-task-baseline.test.js.map +1 -0
  2305. package/dist/team/__tests__/delegation-policy.test.d.ts +2 -0
  2306. package/dist/team/__tests__/delegation-policy.test.d.ts.map +1 -0
  2307. package/dist/team/__tests__/delegation-policy.test.js +69 -0
  2308. package/dist/team/__tests__/delegation-policy.test.js.map +1 -0
  2309. package/dist/team/__tests__/delivery-e2e-smoke.test.d.ts +2 -0
  2310. package/dist/team/__tests__/delivery-e2e-smoke.test.d.ts.map +1 -0
  2311. package/dist/team/__tests__/delivery-e2e-smoke.test.js +677 -0
  2312. package/dist/team/__tests__/delivery-e2e-smoke.test.js.map +1 -0
  2313. package/dist/team/__tests__/delivery-log.test.d.ts +2 -0
  2314. package/dist/team/__tests__/delivery-log.test.d.ts.map +1 -0
  2315. package/dist/team/__tests__/delivery-log.test.js +62 -0
  2316. package/dist/team/__tests__/delivery-log.test.js.map +1 -0
  2317. package/dist/team/__tests__/events.test.d.ts +2 -0
  2318. package/dist/team/__tests__/events.test.d.ts.map +1 -0
  2319. package/dist/team/__tests__/events.test.js +313 -0
  2320. package/dist/team/__tests__/events.test.js.map +1 -0
  2321. package/dist/team/__tests__/followup-planner.test.d.ts +2 -0
  2322. package/dist/team/__tests__/followup-planner.test.d.ts.map +1 -0
  2323. package/dist/team/__tests__/followup-planner.test.js +100 -0
  2324. package/dist/team/__tests__/followup-planner.test.js.map +1 -0
  2325. package/dist/team/__tests__/hardening-e2e.test.d.ts +2 -0
  2326. package/dist/team/__tests__/hardening-e2e.test.d.ts.map +1 -0
  2327. package/dist/team/__tests__/hardening-e2e.test.js +98 -0
  2328. package/dist/team/__tests__/hardening-e2e.test.js.map +1 -0
  2329. package/dist/team/__tests__/hook-primary-e2e-contract.test.d.ts +2 -0
  2330. package/dist/team/__tests__/hook-primary-e2e-contract.test.d.ts.map +1 -0
  2331. package/dist/team/__tests__/hook-primary-e2e-contract.test.js +78 -0
  2332. package/dist/team/__tests__/hook-primary-e2e-contract.test.js.map +1 -0
  2333. package/dist/team/__tests__/idle-nudge.test.d.ts +2 -0
  2334. package/dist/team/__tests__/idle-nudge.test.d.ts.map +1 -0
  2335. package/dist/team/__tests__/idle-nudge.test.js +230 -0
  2336. package/dist/team/__tests__/idle-nudge.test.js.map +1 -0
  2337. package/dist/team/__tests__/leader-activity.test.d.ts +2 -0
  2338. package/dist/team/__tests__/leader-activity.test.d.ts.map +1 -0
  2339. package/dist/team/__tests__/leader-activity.test.js +261 -0
  2340. package/dist/team/__tests__/leader-activity.test.js.map +1 -0
  2341. package/dist/team/__tests__/mcp-comm.test.d.ts +2 -0
  2342. package/dist/team/__tests__/mcp-comm.test.d.ts.map +1 -0
  2343. package/dist/team/__tests__/mcp-comm.test.js +289 -0
  2344. package/dist/team/__tests__/mcp-comm.test.js.map +1 -0
  2345. package/dist/team/__tests__/model-contract.test.d.ts +2 -0
  2346. package/dist/team/__tests__/model-contract.test.d.ts.map +1 -0
  2347. package/dist/team/__tests__/model-contract.test.js +187 -0
  2348. package/dist/team/__tests__/model-contract.test.js.map +1 -0
  2349. package/dist/team/__tests__/orchestrator.test.d.ts +2 -0
  2350. package/dist/team/__tests__/orchestrator.test.d.ts.map +1 -0
  2351. package/dist/team/__tests__/orchestrator.test.js +111 -0
  2352. package/dist/team/__tests__/orchestrator.test.js.map +1 -0
  2353. package/dist/team/__tests__/phase-controller.test.d.ts +2 -0
  2354. package/dist/team/__tests__/phase-controller.test.d.ts.map +1 -0
  2355. package/dist/team/__tests__/phase-controller.test.js +50 -0
  2356. package/dist/team/__tests__/phase-controller.test.js.map +1 -0
  2357. package/dist/team/__tests__/rebalance-policy.test.d.ts +2 -0
  2358. package/dist/team/__tests__/rebalance-policy.test.d.ts.map +1 -0
  2359. package/dist/team/__tests__/rebalance-policy.test.js +168 -0
  2360. package/dist/team/__tests__/rebalance-policy.test.js.map +1 -0
  2361. package/dist/team/__tests__/repo-aware-decomposition.test.d.ts +2 -0
  2362. package/dist/team/__tests__/repo-aware-decomposition.test.d.ts.map +1 -0
  2363. package/dist/team/__tests__/repo-aware-decomposition.test.js +156 -0
  2364. package/dist/team/__tests__/repo-aware-decomposition.test.js.map +1 -0
  2365. package/dist/team/__tests__/role-router.test.d.ts +2 -0
  2366. package/dist/team/__tests__/role-router.test.d.ts.map +1 -0
  2367. package/dist/team/__tests__/role-router.test.js +263 -0
  2368. package/dist/team/__tests__/role-router.test.js.map +1 -0
  2369. package/dist/team/__tests__/runtime-boxed-state.test.d.ts +2 -0
  2370. package/dist/team/__tests__/runtime-boxed-state.test.d.ts.map +1 -0
  2371. package/dist/team/__tests__/runtime-boxed-state.test.js +39 -0
  2372. package/dist/team/__tests__/runtime-boxed-state.test.js.map +1 -0
  2373. package/dist/team/__tests__/runtime-cli.test.d.ts +2 -0
  2374. package/dist/team/__tests__/runtime-cli.test.d.ts.map +1 -0
  2375. package/dist/team/__tests__/runtime-cli.test.js +320 -0
  2376. package/dist/team/__tests__/runtime-cli.test.js.map +1 -0
  2377. package/dist/team/__tests__/runtime.test.d.ts +2 -0
  2378. package/dist/team/__tests__/runtime.test.d.ts.map +1 -0
  2379. package/dist/team/__tests__/runtime.test.js +6464 -0
  2380. package/dist/team/__tests__/runtime.test.js.map +1 -0
  2381. package/dist/team/__tests__/scaling.test.d.ts +2 -0
  2382. package/dist/team/__tests__/scaling.test.d.ts.map +1 -0
  2383. package/dist/team/__tests__/scaling.test.js +1664 -0
  2384. package/dist/team/__tests__/scaling.test.js.map +1 -0
  2385. package/dist/team/__tests__/shutdown-fallback.test.d.ts +2 -0
  2386. package/dist/team/__tests__/shutdown-fallback.test.d.ts.map +1 -0
  2387. package/dist/team/__tests__/shutdown-fallback.test.js +125 -0
  2388. package/dist/team/__tests__/shutdown-fallback.test.js.map +1 -0
  2389. package/dist/team/__tests__/state-root.test.d.ts +2 -0
  2390. package/dist/team/__tests__/state-root.test.d.ts.map +1 -0
  2391. package/dist/team/__tests__/state-root.test.js +208 -0
  2392. package/dist/team/__tests__/state-root.test.js.map +1 -0
  2393. package/dist/team/__tests__/state.test.d.ts +2 -0
  2394. package/dist/team/__tests__/state.test.d.ts.map +1 -0
  2395. package/dist/team/__tests__/state.test.js +1942 -0
  2396. package/dist/team/__tests__/state.test.js.map +1 -0
  2397. package/dist/team/__tests__/team-identity.test.d.ts +2 -0
  2398. package/dist/team/__tests__/team-identity.test.d.ts.map +1 -0
  2399. package/dist/team/__tests__/team-identity.test.js +166 -0
  2400. package/dist/team/__tests__/team-identity.test.js.map +1 -0
  2401. package/dist/team/__tests__/team-ops-contract.test.d.ts +2 -0
  2402. package/dist/team/__tests__/team-ops-contract.test.d.ts.map +1 -0
  2403. package/dist/team/__tests__/team-ops-contract.test.js +96 -0
  2404. package/dist/team/__tests__/team-ops-contract.test.js.map +1 -0
  2405. package/dist/team/__tests__/tmux-claude-workers-demo.test.d.ts +2 -0
  2406. package/dist/team/__tests__/tmux-claude-workers-demo.test.d.ts.map +1 -0
  2407. package/dist/team/__tests__/tmux-claude-workers-demo.test.js +191 -0
  2408. package/dist/team/__tests__/tmux-claude-workers-demo.test.js.map +1 -0
  2409. package/dist/team/__tests__/tmux-session.test.d.ts +2 -0
  2410. package/dist/team/__tests__/tmux-session.test.d.ts.map +1 -0
  2411. package/dist/team/__tests__/tmux-session.test.js +4546 -0
  2412. package/dist/team/__tests__/tmux-session.test.js.map +1 -0
  2413. package/dist/team/__tests__/tmux-test-fixture.d.ts +20 -0
  2414. package/dist/team/__tests__/tmux-test-fixture.d.ts.map +1 -0
  2415. package/dist/team/__tests__/tmux-test-fixture.js +148 -0
  2416. package/dist/team/__tests__/tmux-test-fixture.js.map +1 -0
  2417. package/dist/team/__tests__/tmux-test-fixture.test.d.ts +2 -0
  2418. package/dist/team/__tests__/tmux-test-fixture.test.d.ts.map +1 -0
  2419. package/dist/team/__tests__/tmux-test-fixture.test.js +114 -0
  2420. package/dist/team/__tests__/tmux-test-fixture.test.js.map +1 -0
  2421. package/dist/team/__tests__/worker-bootstrap.test.d.ts +2 -0
  2422. package/dist/team/__tests__/worker-bootstrap.test.d.ts.map +1 -0
  2423. package/dist/team/__tests__/worker-bootstrap.test.js +1122 -0
  2424. package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -0
  2425. package/dist/team/__tests__/worker-runtime-identity.test.d.ts +2 -0
  2426. package/dist/team/__tests__/worker-runtime-identity.test.d.ts.map +1 -0
  2427. package/dist/team/__tests__/worker-runtime-identity.test.js +258 -0
  2428. package/dist/team/__tests__/worker-runtime-identity.test.js.map +1 -0
  2429. package/dist/team/__tests__/worktree.test.d.ts +2 -0
  2430. package/dist/team/__tests__/worktree.test.d.ts.map +1 -0
  2431. package/dist/team/__tests__/worktree.test.js +317 -0
  2432. package/dist/team/__tests__/worktree.test.js.map +1 -0
  2433. package/dist/team/allocation-policy.d.ts +29 -0
  2434. package/dist/team/allocation-policy.d.ts.map +1 -0
  2435. package/dist/team/allocation-policy.js +153 -0
  2436. package/dist/team/allocation-policy.js.map +1 -0
  2437. package/dist/team/api-interop.d.ts +20 -0
  2438. package/dist/team/api-interop.d.ts.map +1 -0
  2439. package/dist/team/api-interop.js +1084 -0
  2440. package/dist/team/api-interop.js.map +1 -0
  2441. package/dist/team/approved-execution.d.ts +64 -0
  2442. package/dist/team/approved-execution.d.ts.map +1 -0
  2443. package/dist/team/approved-execution.js +242 -0
  2444. package/dist/team/approved-execution.js.map +1 -0
  2445. package/dist/team/commit-hygiene.d.ts +79 -0
  2446. package/dist/team/commit-hygiene.d.ts.map +1 -0
  2447. package/dist/team/commit-hygiene.js +364 -0
  2448. package/dist/team/commit-hygiene.js.map +1 -0
  2449. package/dist/team/contracts.d.ts +26 -0
  2450. package/dist/team/contracts.d.ts.map +1 -0
  2451. package/dist/team/contracts.js +103 -0
  2452. package/dist/team/contracts.js.map +1 -0
  2453. package/dist/team/coordination-protocol.d.ts +14 -0
  2454. package/dist/team/coordination-protocol.d.ts.map +1 -0
  2455. package/dist/team/coordination-protocol.js +244 -0
  2456. package/dist/team/coordination-protocol.js.map +1 -0
  2457. package/dist/team/current-task-baseline.d.ts +32 -0
  2458. package/dist/team/current-task-baseline.d.ts.map +1 -0
  2459. package/dist/team/current-task-baseline.js +85 -0
  2460. package/dist/team/current-task-baseline.js.map +1 -0
  2461. package/dist/team/dag-schema.d.ts +38 -0
  2462. package/dist/team/dag-schema.d.ts.map +1 -0
  2463. package/dist/team/dag-schema.js +221 -0
  2464. package/dist/team/dag-schema.js.map +1 -0
  2465. package/dist/team/delegation-policy.d.ts +3 -0
  2466. package/dist/team/delegation-policy.d.ts.map +1 -0
  2467. package/dist/team/delegation-policy.js +82 -0
  2468. package/dist/team/delegation-policy.js.map +1 -0
  2469. package/dist/team/delivery-log.d.ts +14 -0
  2470. package/dist/team/delivery-log.d.ts.map +1 -0
  2471. package/dist/team/delivery-log.js +43 -0
  2472. package/dist/team/delivery-log.js.map +1 -0
  2473. package/dist/team/followup-planner.d.ts +45 -0
  2474. package/dist/team/followup-planner.d.ts.map +1 -0
  2475. package/dist/team/followup-planner.js +200 -0
  2476. package/dist/team/followup-planner.js.map +1 -0
  2477. package/dist/team/goal-workflow.d.ts +20 -0
  2478. package/dist/team/goal-workflow.d.ts.map +1 -0
  2479. package/dist/team/goal-workflow.js +57 -0
  2480. package/dist/team/goal-workflow.js.map +1 -0
  2481. package/dist/team/idle-nudge.d.ts +53 -0
  2482. package/dist/team/idle-nudge.d.ts.map +1 -0
  2483. package/dist/team/idle-nudge.js +141 -0
  2484. package/dist/team/idle-nudge.js.map +1 -0
  2485. package/dist/team/leader-activity.d.ts +15 -0
  2486. package/dist/team/leader-activity.d.ts.map +1 -0
  2487. package/dist/team/leader-activity.js +224 -0
  2488. package/dist/team/leader-activity.js.map +1 -0
  2489. package/dist/team/mcp-comm.d.ts +73 -0
  2490. package/dist/team/mcp-comm.d.ts.map +1 -0
  2491. package/dist/team/mcp-comm.js +314 -0
  2492. package/dist/team/mcp-comm.js.map +1 -0
  2493. package/dist/team/model-contract.d.ts +26 -0
  2494. package/dist/team/model-contract.d.ts.map +1 -0
  2495. package/dist/team/model-contract.js +205 -0
  2496. package/dist/team/model-contract.js.map +1 -0
  2497. package/dist/team/orchestrator.d.ts +47 -0
  2498. package/dist/team/orchestrator.d.ts.map +1 -0
  2499. package/dist/team/orchestrator.js +131 -0
  2500. package/dist/team/orchestrator.js.map +1 -0
  2501. package/dist/team/pane-status.d.ts +149 -0
  2502. package/dist/team/pane-status.d.ts.map +1 -0
  2503. package/dist/team/pane-status.js +558 -0
  2504. package/dist/team/pane-status.js.map +1 -0
  2505. package/dist/team/phase-controller.d.ts +12 -0
  2506. package/dist/team/phase-controller.d.ts.map +1 -0
  2507. package/dist/team/phase-controller.js +142 -0
  2508. package/dist/team/phase-controller.js.map +1 -0
  2509. package/dist/team/progress-evidence.d.ts +2 -0
  2510. package/dist/team/progress-evidence.d.ts.map +1 -0
  2511. package/dist/team/progress-evidence.js +77 -0
  2512. package/dist/team/progress-evidence.js.map +1 -0
  2513. package/dist/team/rebalance-policy.d.ts +19 -0
  2514. package/dist/team/rebalance-policy.d.ts.map +1 -0
  2515. package/dist/team/rebalance-policy.js +48 -0
  2516. package/dist/team/rebalance-policy.js.map +1 -0
  2517. package/dist/team/reminder-intents.d.ts +11 -0
  2518. package/dist/team/reminder-intents.d.ts.map +1 -0
  2519. package/dist/team/reminder-intents.js +40 -0
  2520. package/dist/team/reminder-intents.js.map +1 -0
  2521. package/dist/team/repo-aware-decomposition.d.ts +68 -0
  2522. package/dist/team/repo-aware-decomposition.d.ts.map +1 -0
  2523. package/dist/team/repo-aware-decomposition.js +235 -0
  2524. package/dist/team/repo-aware-decomposition.js.map +1 -0
  2525. package/dist/team/role-router.d.ts +32 -0
  2526. package/dist/team/role-router.d.ts.map +1 -0
  2527. package/dist/team/role-router.js +298 -0
  2528. package/dist/team/role-router.js.map +1 -0
  2529. package/dist/team/runtime-cli.d.ts +78 -0
  2530. package/dist/team/runtime-cli.d.ts.map +1 -0
  2531. package/dist/team/runtime-cli.js +376 -0
  2532. package/dist/team/runtime-cli.js.map +1 -0
  2533. package/dist/team/runtime.d.ts +162 -0
  2534. package/dist/team/runtime.d.ts.map +1 -0
  2535. package/dist/team/runtime.js +4160 -0
  2536. package/dist/team/runtime.js.map +1 -0
  2537. package/dist/team/scaling.d.ts +59 -0
  2538. package/dist/team/scaling.d.ts.map +1 -0
  2539. package/dist/team/scaling.js +650 -0
  2540. package/dist/team/scaling.js.map +1 -0
  2541. package/dist/team/state/approvals.d.ts +25 -0
  2542. package/dist/team/state/approvals.d.ts.map +1 -0
  2543. package/dist/team/state/approvals.js +31 -0
  2544. package/dist/team/state/approvals.js.map +1 -0
  2545. package/dist/team/state/config.d.ts +2 -0
  2546. package/dist/team/state/config.d.ts.map +1 -0
  2547. package/dist/team/state/config.js +2 -0
  2548. package/dist/team/state/config.js.map +1 -0
  2549. package/dist/team/state/dispatch-lock.d.ts +3 -0
  2550. package/dist/team/state/dispatch-lock.d.ts.map +1 -0
  2551. package/dist/team/state/dispatch-lock.js +81 -0
  2552. package/dist/team/state/dispatch-lock.js.map +1 -0
  2553. package/dist/team/state/dispatch.d.ts +67 -0
  2554. package/dist/team/state/dispatch.d.ts.map +1 -0
  2555. package/dist/team/state/dispatch.js +302 -0
  2556. package/dist/team/state/dispatch.js.map +1 -0
  2557. package/dist/team/state/events.d.ts +26 -0
  2558. package/dist/team/state/events.d.ts.map +1 -0
  2559. package/dist/team/state/events.js +145 -0
  2560. package/dist/team/state/events.js.map +1 -0
  2561. package/dist/team/state/index.d.ts +11 -0
  2562. package/dist/team/state/index.d.ts.map +1 -0
  2563. package/dist/team/state/index.js +11 -0
  2564. package/dist/team/state/index.js.map +1 -0
  2565. package/dist/team/state/io.d.ts +2 -0
  2566. package/dist/team/state/io.d.ts.map +1 -0
  2567. package/dist/team/state/io.js +2 -0
  2568. package/dist/team/state/io.js.map +1 -0
  2569. package/dist/team/state/locks.d.ts +16 -0
  2570. package/dist/team/state/locks.d.ts.map +1 -0
  2571. package/dist/team/state/locks.js +201 -0
  2572. package/dist/team/state/locks.js.map +1 -0
  2573. package/dist/team/state/mailbox.d.ts +43 -0
  2574. package/dist/team/state/mailbox.d.ts.map +1 -0
  2575. package/dist/team/state/mailbox.js +222 -0
  2576. package/dist/team/state/mailbox.js.map +1 -0
  2577. package/dist/team/state/monitor.d.ts +108 -0
  2578. package/dist/team/state/monitor.d.ts.map +1 -0
  2579. package/dist/team/state/monitor.js +193 -0
  2580. package/dist/team/state/monitor.js.map +1 -0
  2581. package/dist/team/state/shutdown.d.ts +2 -0
  2582. package/dist/team/state/shutdown.d.ts.map +1 -0
  2583. package/dist/team/state/shutdown.js +2 -0
  2584. package/dist/team/state/shutdown.js.map +1 -0
  2585. package/dist/team/state/summary.d.ts +2 -0
  2586. package/dist/team/state/summary.d.ts.map +1 -0
  2587. package/dist/team/state/summary.js +2 -0
  2588. package/dist/team/state/summary.js.map +1 -0
  2589. package/dist/team/state/tasks.d.ts +53 -0
  2590. package/dist/team/state/tasks.d.ts.map +1 -0
  2591. package/dist/team/state/tasks.js +284 -0
  2592. package/dist/team/state/tasks.js.map +1 -0
  2593. package/dist/team/state/types.d.ts +356 -0
  2594. package/dist/team/state/types.d.ts.map +1 -0
  2595. package/dist/team/state/types.js +3 -0
  2596. package/dist/team/state/types.js.map +1 -0
  2597. package/dist/team/state/workers.d.ts +2 -0
  2598. package/dist/team/state/workers.d.ts.map +1 -0
  2599. package/dist/team/state/workers.js +2 -0
  2600. package/dist/team/state/workers.js.map +1 -0
  2601. package/dist/team/state-root.d.ts +40 -0
  2602. package/dist/team/state-root.d.ts.map +1 -0
  2603. package/dist/team/state-root.js +297 -0
  2604. package/dist/team/state-root.js.map +1 -0
  2605. package/dist/team/state.d.ts +471 -0
  2606. package/dist/team/state.d.ts.map +1 -0
  2607. package/dist/team/state.js +1418 -0
  2608. package/dist/team/state.js.map +1 -0
  2609. package/dist/team/team-identity.d.ts +26 -0
  2610. package/dist/team/team-identity.d.ts.map +1 -0
  2611. package/dist/team/team-identity.js +169 -0
  2612. package/dist/team/team-identity.js.map +1 -0
  2613. package/dist/team/team-ops.d.ts +66 -0
  2614. package/dist/team/team-ops.d.ts.map +1 -0
  2615. package/dist/team/team-ops.js +79 -0
  2616. package/dist/team/team-ops.js.map +1 -0
  2617. package/dist/team/tmux-session.d.ts +190 -0
  2618. package/dist/team/tmux-session.d.ts.map +1 -0
  2619. package/dist/team/tmux-session.js +2071 -0
  2620. package/dist/team/tmux-session.js.map +1 -0
  2621. package/dist/team/ultragoal-context.d.ts +47 -0
  2622. package/dist/team/ultragoal-context.d.ts.map +1 -0
  2623. package/dist/team/ultragoal-context.js +215 -0
  2624. package/dist/team/ultragoal-context.js.map +1 -0
  2625. package/dist/team/worker-bootstrap.d.ts +92 -0
  2626. package/dist/team/worker-bootstrap.d.ts.map +1 -0
  2627. package/dist/team/worker-bootstrap.js +860 -0
  2628. package/dist/team/worker-bootstrap.js.map +1 -0
  2629. package/dist/team/worktree.d.ts +69 -0
  2630. package/dist/team/worktree.d.ts.map +1 -0
  2631. package/dist/team/worktree.js +437 -0
  2632. package/dist/team/worktree.js.map +1 -0
  2633. package/dist/ultragoal/__tests__/artifacts.test.d.ts +2 -0
  2634. package/dist/ultragoal/__tests__/artifacts.test.d.ts.map +1 -0
  2635. package/dist/ultragoal/__tests__/artifacts.test.js +1423 -0
  2636. package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -0
  2637. package/dist/ultragoal/__tests__/docs-contract.test.d.ts +2 -0
  2638. package/dist/ultragoal/__tests__/docs-contract.test.d.ts.map +1 -0
  2639. package/dist/ultragoal/__tests__/docs-contract.test.js +132 -0
  2640. package/dist/ultragoal/__tests__/docs-contract.test.js.map +1 -0
  2641. package/dist/ultragoal/__tests__/steering-fixtures.d.ts +68 -0
  2642. package/dist/ultragoal/__tests__/steering-fixtures.d.ts.map +1 -0
  2643. package/dist/ultragoal/__tests__/steering-fixtures.js +259 -0
  2644. package/dist/ultragoal/__tests__/steering-fixtures.js.map +1 -0
  2645. package/dist/ultragoal/__tests__/steering-fixtures.test.d.ts +2 -0
  2646. package/dist/ultragoal/__tests__/steering-fixtures.test.d.ts.map +1 -0
  2647. package/dist/ultragoal/__tests__/steering-fixtures.test.js +65 -0
  2648. package/dist/ultragoal/__tests__/steering-fixtures.test.js.map +1 -0
  2649. package/dist/ultragoal/artifacts.d.ts +249 -0
  2650. package/dist/ultragoal/artifacts.d.ts.map +1 -0
  2651. package/dist/ultragoal/artifacts.js +1349 -0
  2652. package/dist/ultragoal/artifacts.js.map +1 -0
  2653. package/dist/utils/__tests__/agents-md.test.d.ts +2 -0
  2654. package/dist/utils/__tests__/agents-md.test.d.ts.map +1 -0
  2655. package/dist/utils/__tests__/agents-md.test.js +96 -0
  2656. package/dist/utils/__tests__/agents-md.test.js.map +1 -0
  2657. package/dist/utils/__tests__/agents-model-table.test.d.ts +2 -0
  2658. package/dist/utils/__tests__/agents-model-table.test.d.ts.map +1 -0
  2659. package/dist/utils/__tests__/agents-model-table.test.js +108 -0
  2660. package/dist/utils/__tests__/agents-model-table.test.js.map +1 -0
  2661. package/dist/utils/__tests__/dep-versions.test.d.ts +2 -0
  2662. package/dist/utils/__tests__/dep-versions.test.d.ts.map +1 -0
  2663. package/dist/utils/__tests__/dep-versions.test.js +46 -0
  2664. package/dist/utils/__tests__/dep-versions.test.js.map +1 -0
  2665. package/dist/utils/__tests__/package.test.d.ts +2 -0
  2666. package/dist/utils/__tests__/package.test.d.ts.map +1 -0
  2667. package/dist/utils/__tests__/package.test.js +21 -0
  2668. package/dist/utils/__tests__/package.test.js.map +1 -0
  2669. package/dist/utils/__tests__/paths.test.d.ts +2 -0
  2670. package/dist/utils/__tests__/paths.test.d.ts.map +1 -0
  2671. package/dist/utils/__tests__/paths.test.js +647 -0
  2672. package/dist/utils/__tests__/paths.test.js.map +1 -0
  2673. package/dist/utils/__tests__/platform-command.test.d.ts +2 -0
  2674. package/dist/utils/__tests__/platform-command.test.d.ts.map +1 -0
  2675. package/dist/utils/__tests__/platform-command.test.js +399 -0
  2676. package/dist/utils/__tests__/platform-command.test.js.map +1 -0
  2677. package/dist/utils/__tests__/repo-deps.test.d.ts +2 -0
  2678. package/dist/utils/__tests__/repo-deps.test.d.ts.map +1 -0
  2679. package/dist/utils/__tests__/repo-deps.test.js +71 -0
  2680. package/dist/utils/__tests__/repo-deps.test.js.map +1 -0
  2681. package/dist/utils/__tests__/sleep-resource.test.d.ts +2 -0
  2682. package/dist/utils/__tests__/sleep-resource.test.d.ts.map +1 -0
  2683. package/dist/utils/__tests__/sleep-resource.test.js +39 -0
  2684. package/dist/utils/__tests__/sleep-resource.test.js.map +1 -0
  2685. package/dist/utils/__tests__/version.test.d.ts +2 -0
  2686. package/dist/utils/__tests__/version.test.d.ts.map +1 -0
  2687. package/dist/utils/__tests__/version.test.js +78 -0
  2688. package/dist/utils/__tests__/version.test.js.map +1 -0
  2689. package/dist/utils/agents-md.d.ts +10 -0
  2690. package/dist/utils/agents-md.d.ts.map +1 -0
  2691. package/dist/utils/agents-md.js +76 -0
  2692. package/dist/utils/agents-md.js.map +1 -0
  2693. package/dist/utils/agents-model-table.d.ts +16 -0
  2694. package/dist/utils/agents-model-table.d.ts.map +1 -0
  2695. package/dist/utils/agents-model-table.js +102 -0
  2696. package/dist/utils/agents-model-table.js.map +1 -0
  2697. package/dist/utils/git-layout.d.ts +8 -0
  2698. package/dist/utils/git-layout.d.ts.map +1 -0
  2699. package/dist/utils/git-layout.js +58 -0
  2700. package/dist/utils/git-layout.js.map +1 -0
  2701. package/dist/utils/package.d.ts +9 -0
  2702. package/dist/utils/package.d.ts.map +1 -0
  2703. package/dist/utils/package.js +31 -0
  2704. package/dist/utils/package.js.map +1 -0
  2705. package/dist/utils/paths.d.ts +101 -0
  2706. package/dist/utils/paths.d.ts.map +1 -0
  2707. package/dist/utils/paths.js +314 -0
  2708. package/dist/utils/paths.js.map +1 -0
  2709. package/dist/utils/platform-command.d.ts +29 -0
  2710. package/dist/utils/platform-command.d.ts.map +1 -0
  2711. package/dist/utils/platform-command.js +239 -0
  2712. package/dist/utils/platform-command.js.map +1 -0
  2713. package/dist/utils/repo-deps.d.ts +20 -0
  2714. package/dist/utils/repo-deps.d.ts.map +1 -0
  2715. package/dist/utils/repo-deps.js +78 -0
  2716. package/dist/utils/repo-deps.js.map +1 -0
  2717. package/dist/utils/safe-json.d.ts +3 -0
  2718. package/dist/utils/safe-json.d.ts.map +1 -0
  2719. package/dist/utils/safe-json.js +19 -0
  2720. package/dist/utils/safe-json.js.map +1 -0
  2721. package/dist/utils/sleep.d.ts +3 -0
  2722. package/dist/utils/sleep.d.ts.map +1 -0
  2723. package/dist/utils/sleep.js +35 -0
  2724. package/dist/utils/sleep.js.map +1 -0
  2725. package/dist/utils/toml.d.ts +4 -0
  2726. package/dist/utils/toml.d.ts.map +1 -0
  2727. package/dist/utils/toml.js +75 -0
  2728. package/dist/utils/toml.js.map +1 -0
  2729. package/dist/utils/version.d.ts +7 -0
  2730. package/dist/utils/version.d.ts.map +1 -0
  2731. package/dist/utils/version.js +72 -0
  2732. package/dist/utils/version.js.map +1 -0
  2733. package/dist/verification/__tests__/ci-rust-gates.test.d.ts +2 -0
  2734. package/dist/verification/__tests__/ci-rust-gates.test.d.ts.map +1 -0
  2735. package/dist/verification/__tests__/ci-rust-gates.test.js +293 -0
  2736. package/dist/verification/__tests__/ci-rust-gates.test.js.map +1 -0
  2737. package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.d.ts +2 -0
  2738. package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.d.ts.map +1 -0
  2739. package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.js +68 -0
  2740. package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.js.map +1 -0
  2741. package/dist/verification/__tests__/explore-harness-release-workflow.test.d.ts +2 -0
  2742. package/dist/verification/__tests__/explore-harness-release-workflow.test.d.ts.map +1 -0
  2743. package/dist/verification/__tests__/explore-harness-release-workflow.test.js +74 -0
  2744. package/dist/verification/__tests__/explore-harness-release-workflow.test.js.map +1 -0
  2745. package/dist/verification/__tests__/native-release-manifest.test.d.ts +2 -0
  2746. package/dist/verification/__tests__/native-release-manifest.test.d.ts.map +1 -0
  2747. package/dist/verification/__tests__/native-release-manifest.test.js +80 -0
  2748. package/dist/verification/__tests__/native-release-manifest.test.js.map +1 -0
  2749. package/dist/verification/__tests__/pr-check-workflow.test.d.ts +2 -0
  2750. package/dist/verification/__tests__/pr-check-workflow.test.d.ts.map +1 -0
  2751. package/dist/verification/__tests__/pr-check-workflow.test.js +27 -0
  2752. package/dist/verification/__tests__/pr-check-workflow.test.js.map +1 -0
  2753. package/dist/verification/__tests__/ralph-persistence-gate.test.d.ts +2 -0
  2754. package/dist/verification/__tests__/ralph-persistence-gate.test.d.ts.map +1 -0
  2755. package/dist/verification/__tests__/ralph-persistence-gate.test.js +55 -0
  2756. package/dist/verification/__tests__/ralph-persistence-gate.test.js.map +1 -0
  2757. package/dist/verification/__tests__/rust-runtime-thin-adapter-gate.test.d.ts +2 -0
  2758. package/dist/verification/__tests__/rust-runtime-thin-adapter-gate.test.d.ts.map +1 -0
  2759. package/dist/verification/__tests__/rust-runtime-thin-adapter-gate.test.js +32 -0
  2760. package/dist/verification/__tests__/rust-runtime-thin-adapter-gate.test.js.map +1 -0
  2761. package/dist/verification/__tests__/verifier.test.d.ts +2 -0
  2762. package/dist/verification/__tests__/verifier.test.d.ts.map +1 -0
  2763. package/dist/verification/__tests__/verifier.test.js +113 -0
  2764. package/dist/verification/__tests__/verifier.test.js.map +1 -0
  2765. package/dist/verification/verifier.d.ts +37 -0
  2766. package/dist/verification/verifier.d.ts.map +1 -0
  2767. package/dist/verification/verifier.js +100 -0
  2768. package/dist/verification/verifier.js.map +1 -0
  2769. package/dist/visual/__tests__/verdict.test.d.ts +2 -0
  2770. package/dist/visual/__tests__/verdict.test.d.ts.map +1 -0
  2771. package/dist/visual/__tests__/verdict.test.js +81 -0
  2772. package/dist/visual/__tests__/verdict.test.js.map +1 -0
  2773. package/dist/visual/constants.d.ts +4 -0
  2774. package/dist/visual/constants.d.ts.map +1 -0
  2775. package/dist/visual/constants.js +3 -0
  2776. package/dist/visual/constants.js.map +1 -0
  2777. package/dist/visual/verdict.d.ts +17 -0
  2778. package/dist/visual/verdict.d.ts.map +1 -0
  2779. package/dist/visual/verdict.js +61 -0
  2780. package/dist/visual/verdict.js.map +1 -0
  2781. package/dist/wiki/__tests__/cjk-tokenize.test.d.ts +12 -0
  2782. package/dist/wiki/__tests__/cjk-tokenize.test.d.ts.map +1 -0
  2783. package/dist/wiki/__tests__/cjk-tokenize.test.js +139 -0
  2784. package/dist/wiki/__tests__/cjk-tokenize.test.js.map +1 -0
  2785. package/dist/wiki/__tests__/crlf-parse.test.d.ts +2 -0
  2786. package/dist/wiki/__tests__/crlf-parse.test.d.ts.map +1 -0
  2787. package/dist/wiki/__tests__/crlf-parse.test.js +24 -0
  2788. package/dist/wiki/__tests__/crlf-parse.test.js.map +1 -0
  2789. package/dist/wiki/__tests__/escape-newline.test.d.ts +2 -0
  2790. package/dist/wiki/__tests__/escape-newline.test.d.ts.map +1 -0
  2791. package/dist/wiki/__tests__/escape-newline.test.js +45 -0
  2792. package/dist/wiki/__tests__/escape-newline.test.js.map +1 -0
  2793. package/dist/wiki/__tests__/ingest.test.d.ts +5 -0
  2794. package/dist/wiki/__tests__/ingest.test.d.ts.map +1 -0
  2795. package/dist/wiki/__tests__/ingest.test.js +215 -0
  2796. package/dist/wiki/__tests__/ingest.test.js.map +1 -0
  2797. package/dist/wiki/__tests__/lint.test.d.ts +5 -0
  2798. package/dist/wiki/__tests__/lint.test.d.ts.map +1 -0
  2799. package/dist/wiki/__tests__/lint.test.js +176 -0
  2800. package/dist/wiki/__tests__/lint.test.js.map +1 -0
  2801. package/dist/wiki/__tests__/query.test.d.ts +5 -0
  2802. package/dist/wiki/__tests__/query.test.d.ts.map +1 -0
  2803. package/dist/wiki/__tests__/query.test.js +166 -0
  2804. package/dist/wiki/__tests__/query.test.js.map +1 -0
  2805. package/dist/wiki/__tests__/reserved-file-guard.test.d.ts +2 -0
  2806. package/dist/wiki/__tests__/reserved-file-guard.test.d.ts.map +1 -0
  2807. package/dist/wiki/__tests__/reserved-file-guard.test.js +44 -0
  2808. package/dist/wiki/__tests__/reserved-file-guard.test.js.map +1 -0
  2809. package/dist/wiki/__tests__/session-hooks.test.d.ts +5 -0
  2810. package/dist/wiki/__tests__/session-hooks.test.d.ts.map +1 -0
  2811. package/dist/wiki/__tests__/session-hooks.test.js +64 -0
  2812. package/dist/wiki/__tests__/session-hooks.test.js.map +1 -0
  2813. package/dist/wiki/__tests__/slug-nonascii.test.d.ts +2 -0
  2814. package/dist/wiki/__tests__/slug-nonascii.test.d.ts.map +1 -0
  2815. package/dist/wiki/__tests__/slug-nonascii.test.js +30 -0
  2816. package/dist/wiki/__tests__/slug-nonascii.test.js.map +1 -0
  2817. package/dist/wiki/__tests__/storage.test.d.ts +5 -0
  2818. package/dist/wiki/__tests__/storage.test.d.ts.map +1 -0
  2819. package/dist/wiki/__tests__/storage.test.js +318 -0
  2820. package/dist/wiki/__tests__/storage.test.js.map +1 -0
  2821. package/dist/wiki/__tests__/test-helpers.d.ts +31 -0
  2822. package/dist/wiki/__tests__/test-helpers.d.ts.map +1 -0
  2823. package/dist/wiki/__tests__/test-helpers.js +108 -0
  2824. package/dist/wiki/__tests__/test-helpers.js.map +1 -0
  2825. package/dist/wiki/index.d.ts +14 -0
  2826. package/dist/wiki/index.d.ts.map +1 -0
  2827. package/dist/wiki/index.js +17 -0
  2828. package/dist/wiki/index.js.map +1 -0
  2829. package/dist/wiki/ingest.d.ts +20 -0
  2830. package/dist/wiki/ingest.d.ts.map +1 -0
  2831. package/dist/wiki/ingest.js +115 -0
  2832. package/dist/wiki/ingest.js.map +1 -0
  2833. package/dist/wiki/lifecycle.d.ts +25 -0
  2834. package/dist/wiki/lifecycle.d.ts.map +1 -0
  2835. package/dist/wiki/lifecycle.js +239 -0
  2836. package/dist/wiki/lifecycle.js.map +1 -0
  2837. package/dist/wiki/lint.d.ts +25 -0
  2838. package/dist/wiki/lint.d.ts.map +1 -0
  2839. package/dist/wiki/lint.js +170 -0
  2840. package/dist/wiki/lint.js.map +1 -0
  2841. package/dist/wiki/query.d.ts +36 -0
  2842. package/dist/wiki/query.d.ts.map +1 -0
  2843. package/dist/wiki/query.js +139 -0
  2844. package/dist/wiki/query.js.map +1 -0
  2845. package/dist/wiki/storage.d.ts +37 -0
  2846. package/dist/wiki/storage.d.ts.map +1 -0
  2847. package/dist/wiki/storage.js +358 -0
  2848. package/dist/wiki/storage.js.map +1 -0
  2849. package/dist/wiki/types.d.ts +83 -0
  2850. package/dist/wiki/types.d.ts.map +1 -0
  2851. package/dist/wiki/types.js +15 -0
  2852. package/dist/wiki/types.js.map +1 -0
  2853. package/package.json +110 -0
  2854. package/plugins/oh-my-codex/.app.json +3 -0
  2855. package/plugins/oh-my-codex/.codex-plugin/plugin.json +31 -0
  2856. package/plugins/oh-my-codex/.mcp.json +52 -0
  2857. package/plugins/oh-my-codex/hooks/codex-native-hook.mjs +420 -0
  2858. package/plugins/oh-my-codex/hooks/hooks.json +76 -0
  2859. package/plugins/oh-my-codex/skills/ai-slop-cleaner/SKILL.md +148 -0
  2860. package/plugins/oh-my-codex/skills/analyze/SKILL.md +146 -0
  2861. package/plugins/oh-my-codex/skills/ask/SKILL.md +58 -0
  2862. package/plugins/oh-my-codex/skills/autopilot/SKILL.md +215 -0
  2863. package/plugins/oh-my-codex/skills/autoresearch/SKILL.md +72 -0
  2864. package/plugins/oh-my-codex/skills/autoresearch-goal/SKILL.md +36 -0
  2865. package/plugins/oh-my-codex/skills/best-practice-research/SKILL.md +88 -0
  2866. package/plugins/oh-my-codex/skills/cancel/SKILL.md +399 -0
  2867. package/plugins/oh-my-codex/skills/code-review/SKILL.md +292 -0
  2868. package/plugins/oh-my-codex/skills/configure-notifications/SKILL.md +287 -0
  2869. package/plugins/oh-my-codex/skills/deep-interview/SKILL.md +579 -0
  2870. package/plugins/oh-my-codex/skills/design/SKILL.md +180 -0
  2871. package/plugins/oh-my-codex/skills/doctor/SKILL.md +239 -0
  2872. package/plugins/oh-my-codex/skills/hud/SKILL.md +98 -0
  2873. package/plugins/oh-my-codex/skills/omx-setup/SKILL.md +135 -0
  2874. package/plugins/oh-my-codex/skills/performance-goal/SKILL.md +65 -0
  2875. package/plugins/oh-my-codex/skills/pipeline/SKILL.md +97 -0
  2876. package/plugins/oh-my-codex/skills/plan/SKILL.md +277 -0
  2877. package/plugins/oh-my-codex/skills/prometheus-strict/README.md +35 -0
  2878. package/plugins/oh-my-codex/skills/prometheus-strict/SKILL.md +219 -0
  2879. package/plugins/oh-my-codex/skills/ralph/SKILL.md +294 -0
  2880. package/plugins/oh-my-codex/skills/ralplan/SKILL.md +203 -0
  2881. package/plugins/oh-my-codex/skills/skill/SKILL.md +836 -0
  2882. package/plugins/oh-my-codex/skills/team/SKILL.md +536 -0
  2883. package/plugins/oh-my-codex/skills/ultragoal/SKILL.md +139 -0
  2884. package/plugins/oh-my-codex/skills/ultraqa/SKILL.md +263 -0
  2885. package/plugins/oh-my-codex/skills/ultrawork/SKILL.md +190 -0
  2886. package/plugins/oh-my-codex/skills/visual-ralph/SKILL.md +161 -0
  2887. package/plugins/oh-my-codex/skills/wiki/SKILL.md +57 -0
  2888. package/plugins/oh-my-codex/skills/worker/SKILL.md +120 -0
  2889. package/prompts/analyst.md +135 -0
  2890. package/prompts/api-reviewer.md +113 -0
  2891. package/prompts/architect.md +111 -0
  2892. package/prompts/build-fixer.md +115 -0
  2893. package/prompts/code-reviewer.md +139 -0
  2894. package/prompts/code-simplifier.md +134 -0
  2895. package/prompts/critic.md +80 -0
  2896. package/prompts/debugger.md +117 -0
  2897. package/prompts/dependency-expert.md +129 -0
  2898. package/prompts/designer.md +126 -0
  2899. package/prompts/executor.md +108 -0
  2900. package/prompts/explore-harness.md +64 -0
  2901. package/prompts/explore.md +85 -0
  2902. package/prompts/git-master.md +114 -0
  2903. package/prompts/information-architect.md +226 -0
  2904. package/prompts/performance-reviewer.md +109 -0
  2905. package/prompts/planner.md +110 -0
  2906. package/prompts/product-analyst.md +304 -0
  2907. package/prompts/product-manager.md +245 -0
  2908. package/prompts/prometheus-strict-metis.md +274 -0
  2909. package/prompts/prometheus-strict-momus.md +82 -0
  2910. package/prompts/prometheus-strict-oracle.md +107 -0
  2911. package/prompts/qa-tester.md +124 -0
  2912. package/prompts/quality-reviewer.md +123 -0
  2913. package/prompts/quality-strategist.md +274 -0
  2914. package/prompts/researcher.md +122 -0
  2915. package/prompts/scholastic.md +11 -0
  2916. package/prompts/security-reviewer.md +143 -0
  2917. package/prompts/sisyphus-lite.md +111 -0
  2918. package/prompts/style-reviewer.md +102 -0
  2919. package/prompts/team-executor.md +57 -0
  2920. package/prompts/team-orchestrator.md +8 -0
  2921. package/prompts/test-engineer.md +130 -0
  2922. package/prompts/ux-researcher.md +327 -0
  2923. package/prompts/verifier.md +85 -0
  2924. package/prompts/vision.md +98 -0
  2925. package/prompts/writer.md +109 -0
  2926. package/skills/ai-slop-cleaner/SKILL.md +148 -0
  2927. package/skills/analyze/SKILL.md +146 -0
  2928. package/skills/ask/SKILL.md +58 -0
  2929. package/skills/ask-claude/SKILL.md +12 -0
  2930. package/skills/ask-gemini/SKILL.md +12 -0
  2931. package/skills/autopilot/SKILL.md +215 -0
  2932. package/skills/autoresearch/SKILL.md +72 -0
  2933. package/skills/autoresearch-goal/SKILL.md +36 -0
  2934. package/skills/best-practice-research/SKILL.md +88 -0
  2935. package/skills/build-fix/SKILL.md +10 -0
  2936. package/skills/cancel/SKILL.md +399 -0
  2937. package/skills/code-review/SKILL.md +292 -0
  2938. package/skills/configure-notifications/SKILL.md +287 -0
  2939. package/skills/deep-interview/SKILL.md +579 -0
  2940. package/skills/deepsearch/SKILL.md +10 -0
  2941. package/skills/design/SKILL.md +180 -0
  2942. package/skills/doctor/SKILL.md +239 -0
  2943. package/skills/ecomode/SKILL.md +114 -0
  2944. package/skills/frontend-ui-ux/SKILL.md +16 -0
  2945. package/skills/git-master/SKILL.md +27 -0
  2946. package/skills/help/SKILL.md +10 -0
  2947. package/skills/hud/SKILL.md +98 -0
  2948. package/skills/note/SKILL.md +10 -0
  2949. package/skills/omx-setup/SKILL.md +135 -0
  2950. package/skills/performance-goal/SKILL.md +65 -0
  2951. package/skills/pipeline/SKILL.md +97 -0
  2952. package/skills/plan/SKILL.md +277 -0
  2953. package/skills/prometheus-strict/README.md +35 -0
  2954. package/skills/prometheus-strict/SKILL.md +219 -0
  2955. package/skills/ralph/SKILL.md +294 -0
  2956. package/skills/ralph-init/SKILL.md +10 -0
  2957. package/skills/ralplan/SKILL.md +203 -0
  2958. package/skills/review/SKILL.md +10 -0
  2959. package/skills/security-review/SKILL.md +10 -0
  2960. package/skills/skill/SKILL.md +836 -0
  2961. package/skills/swarm/SKILL.md +12 -0
  2962. package/skills/tdd/SKILL.md +104 -0
  2963. package/skills/team/SKILL.md +536 -0
  2964. package/skills/trace/SKILL.md +10 -0
  2965. package/skills/ultragoal/SKILL.md +139 -0
  2966. package/skills/ultraqa/SKILL.md +263 -0
  2967. package/skills/ultrawork/SKILL.md +190 -0
  2968. package/skills/visual-ralph/SKILL.md +161 -0
  2969. package/skills/visual-verdict/SKILL.md +10 -0
  2970. package/skills/web-clone/SKILL.md +357 -0
  2971. package/skills/wiki/SKILL.md +57 -0
  2972. package/skills/worker/SKILL.md +120 -0
  2973. package/src/scripts/__tests__/codex-native-hook.test.ts +17173 -0
  2974. package/src/scripts/__tests__/docs-site-contract.test.ts +47 -0
  2975. package/src/scripts/__tests__/generate-release-body.test.ts +275 -0
  2976. package/src/scripts/__tests__/hook-derived-watcher.test.ts +285 -0
  2977. package/src/scripts/__tests__/notify-dispatcher.test.ts +504 -0
  2978. package/src/scripts/__tests__/notify-state-io.test.ts +168 -0
  2979. package/src/scripts/__tests__/notify-tmux-injection.test.ts +82 -0
  2980. package/src/scripts/__tests__/postinstall.test.ts +113 -0
  2981. package/src/scripts/__tests__/prompt-inventory.test.ts +64 -0
  2982. package/src/scripts/__tests__/run-test-files.test.ts +455 -0
  2983. package/src/scripts/__tests__/smoke-packed-install.test.ts +192 -0
  2984. package/src/scripts/__tests__/test-reply-listener-live.test.ts +101 -0
  2985. package/src/scripts/__tests__/verify-native-agents.test.ts +299 -0
  2986. package/src/scripts/ask-claude.sh +17 -0
  2987. package/src/scripts/ask-gemini.sh +14 -0
  2988. package/src/scripts/build-api.ts +48 -0
  2989. package/src/scripts/build-explore-harness.ts +54 -0
  2990. package/src/scripts/build-sparkshell.ts +52 -0
  2991. package/src/scripts/check-runtime-syntax.ts +63 -0
  2992. package/src/scripts/check-version-sync.ts +54 -0
  2993. package/src/scripts/cleanup-explore-harness.ts +18 -0
  2994. package/src/scripts/codex-execution-surface.ts +75 -0
  2995. package/src/scripts/codex-native-hook.ts +4877 -0
  2996. package/src/scripts/codex-native-pre-post.ts +1360 -0
  2997. package/src/scripts/demo-claude-workers.sh +241 -0
  2998. package/src/scripts/demo-team-e2e.sh +184 -0
  2999. package/src/scripts/eval/eval-adaptive-sort-optimization.py +24 -0
  3000. package/src/scripts/eval/eval-candidate-handoff.ts +8 -0
  3001. package/src/scripts/eval/eval-cli-discoverability.ts +40 -0
  3002. package/src/scripts/eval/eval-fresh-run-tagging.ts +8 -0
  3003. package/src/scripts/eval/eval-help-consistency.ts +11 -0
  3004. package/src/scripts/eval/eval-in-action-cat-shellout-demo.ts +31 -0
  3005. package/src/scripts/eval/eval-ml-kaggle-model-optimization.py +29 -0
  3006. package/src/scripts/eval/eval-noisy-bayesopt-highdim.py +44 -0
  3007. package/src/scripts/eval/eval-noisy-latent-subspace-discovery.py +44 -0
  3008. package/src/scripts/eval/eval-parity-smoke.ts +20 -0
  3009. package/src/scripts/eval/eval-parity-sweep.ts +26 -0
  3010. package/src/scripts/eval/eval-resume-dirty-guard.ts +8 -0
  3011. package/src/scripts/eval/eval-security-path-traversal.ts +38 -0
  3012. package/src/scripts/fixtures/ask-advisor-stub.ts +12 -0
  3013. package/src/scripts/generate-catalog-docs.ts +112 -0
  3014. package/src/scripts/generate-native-release-manifest.ts +147 -0
  3015. package/src/scripts/generate-release-body.ts +327 -0
  3016. package/src/scripts/hook-derived-watcher.ts +649 -0
  3017. package/src/scripts/hook-payload-guard.ts +113 -0
  3018. package/src/scripts/notify-dispatcher.ts +408 -0
  3019. package/src/scripts/notify-fallback-watcher.ts +2022 -0
  3020. package/src/scripts/notify-hook/__tests__/operational-events.test.ts +24 -0
  3021. package/src/scripts/notify-hook/__tests__/payload-guard.test.ts +41 -0
  3022. package/src/scripts/notify-hook/__tests__/team-worker-posttooluse.test.ts +180 -0
  3023. package/src/scripts/notify-hook/active-team.ts +55 -0
  3024. package/src/scripts/notify-hook/auto-nudge.ts +758 -0
  3025. package/src/scripts/notify-hook/log.ts +30 -0
  3026. package/src/scripts/notify-hook/managed-tmux.ts +568 -0
  3027. package/src/scripts/notify-hook/operational-events.ts +282 -0
  3028. package/src/scripts/notify-hook/orchestration-intent.ts +80 -0
  3029. package/src/scripts/notify-hook/payload-parser.ts +143 -0
  3030. package/src/scripts/notify-hook/process-runner.ts +75 -0
  3031. package/src/scripts/notify-hook/ralph-session-resume.ts +465 -0
  3032. package/src/scripts/notify-hook/state-io.ts +220 -0
  3033. package/src/scripts/notify-hook/team-dispatch.ts +1162 -0
  3034. package/src/scripts/notify-hook/team-leader-nudge.ts +1068 -0
  3035. package/src/scripts/notify-hook/team-tmux-guard.ts +236 -0
  3036. package/src/scripts/notify-hook/team-worker-posttooluse.ts +536 -0
  3037. package/src/scripts/notify-hook/team-worker-stop.ts +438 -0
  3038. package/src/scripts/notify-hook/team-worker.ts +709 -0
  3039. package/src/scripts/notify-hook/tmux-injection.ts +740 -0
  3040. package/src/scripts/notify-hook/utils.ts +31 -0
  3041. package/src/scripts/notify-hook/visual-verdict.ts +158 -0
  3042. package/src/scripts/notify-hook.ts +1033 -0
  3043. package/src/scripts/postinstall.ts +107 -0
  3044. package/src/scripts/prepare-build.js +83 -0
  3045. package/src/scripts/prompt-inventory.ts +218 -0
  3046. package/src/scripts/run-autoresearch-showcase.sh +75 -0
  3047. package/src/scripts/run-provider-advisor.ts +213 -0
  3048. package/src/scripts/run-test-files.ts +379 -0
  3049. package/src/scripts/smoke-packed-install.ts +268 -0
  3050. package/src/scripts/sync-plugin-mirror.ts +458 -0
  3051. package/src/scripts/sync-prompt-guidance-fragments.ts +55 -0
  3052. package/src/scripts/team-hardening-benchmark.ts +90 -0
  3053. package/src/scripts/test-reply-listener-live.ts +188 -0
  3054. package/src/scripts/test-sparkshell.ts +29 -0
  3055. package/src/scripts/tmux-hook-engine.ts +349 -0
  3056. package/src/scripts/verify-native-agents.ts +311 -0
  3057. package/src/scripts/verify-native-release-assets.ts +68 -0
  3058. package/templates/AGENTS.md +187 -0
  3059. package/templates/catalog-manifest.json +547 -0
  3060. package/templates/model-instructions/explore-lightweight-AGENTS.md +11 -0
  3061. package/templates/model-instructions/sparkshell-lightweight-AGENTS.md +10 -0
@@ -0,0 +1,4546 @@
1
+ import { describe, it } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import fs from 'node:fs';
4
+ import { syncBuiltinESMExports } from 'node:module';
5
+ import { PassThrough } from 'node:stream';
6
+ import { chmod, mkdir, mkdtemp, readFile, rm, writeFile } from 'fs/promises';
7
+ import { join } from 'path';
8
+ import { tmpdir } from 'os';
9
+ import { buildClientAttachedReconcileHookName, assertTeamWorkerCliBinaryAvailable, buildWorkerProcessLaunchSpec, buildReconcileHudResizeArgs, buildRegisterClientAttachedReconcileArgs, buildRegisterResizeHookArgs, buildResizeHookName, buildResizeHookTarget, buildScheduleDelayedHudResizeArgs, buildUnregisterClientAttachedReconcileArgs, buildUnregisterResizeHookArgs, buildWorkerStartupCommand, trustWorkerMiseConfigIfAvailable, writeWorkerStartupScriptCommand, shouldSourceTeamWorkerShellRc, buildHudPaneTarget, chooseTeamLeaderPaneId, createTeamSession, enableMouseScrolling, isMsysOrGitBash, isNativeWindows, isTmuxAvailable, isWorkerPaneOpen, restoreStandaloneHudPane, translatePathForMsys, isWsl2, isWorkerAlive, killWorker, killWorkerByPaneId, teardownWorkerPanes, listTeamSessions, resolveTeamWorkerCli, resolveTeamWorkerLaunchMode, resolveWorkerCliForSend, resolveTeamWorkerCliPlan, buildWorkerSubmitPlan, sanitizeTeamName, shouldAttemptAdaptiveRetry, sendToWorker, sendToWorkerStdin, sleepFractionalSeconds, translateWorkerLaunchArgsForCli, waitForWorkerReady, waitForWorkerReadyAsync, paneIsBootstrapping, classifyWorkerStartupInjectSafety, checkWorkerStartupInjectSafety, dismissTrustPromptIfPresent, evaluateStartupDirectTriggerSafetyCapture, mitigateCopyModeUnderlineArtifacts, } from '../tmux-session.js';
10
+ import { HUD_RESIZE_RECONCILE_DELAY_SECONDS, HUD_TMUX_TEAM_HEIGHT_LINES } from '../../hud/constants.js';
11
+ import * as tmuxSessionModule from '../tmux-session.js';
12
+ import { OMX_ENTRY_PATH_ENV, OMX_STARTUP_CWD_ENV } from '../../utils/paths.js';
13
+ function withEmptyPath(fn) {
14
+ const prev = process.env.PATH;
15
+ process.env.PATH = '';
16
+ try {
17
+ return fn();
18
+ }
19
+ finally {
20
+ if (typeof prev === 'string')
21
+ process.env.PATH = prev;
22
+ else
23
+ delete process.env.PATH;
24
+ }
25
+ }
26
+ function withMockedExistsSync(mock, fn) {
27
+ const original = fs.existsSync;
28
+ fs.existsSync = mock;
29
+ syncBuiltinESMExports();
30
+ try {
31
+ return fn();
32
+ }
33
+ finally {
34
+ fs.existsSync = original;
35
+ syncBuiltinESMExports();
36
+ }
37
+ }
38
+ function escapeRegExp(value) {
39
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
40
+ }
41
+ const CLAUDE_BYPASS_PROMPT_CAPTURE = `Bypass Permissions mode
42
+
43
+ 1. No, exit
44
+ 2. Yes, I accept
45
+
46
+ Press Enter to confirm`;
47
+ const READY_HELPER_CAPTURE = `╭────────────────────────────────────────────╮
48
+ │ >_ OpenAI Codex (v0.114.0) │
49
+ │ │
50
+ │ model: gpt-5.5 high /model to change │
51
+ │ directory: ~/Workspace/demo │
52
+ ╰────────────────────────────────────────────╯
53
+
54
+ How can I help you today?`;
55
+ const VIEWPORT_WITHOUT_VISIBLE_PROMPT_CAPTURE = `╭────────────────────────────────────────────╮
56
+ │ >_ OpenAI Codex (v0.118.0) │
57
+ │ │
58
+ │ model: gpt-5.5 high /model to change │
59
+ │ directory: ~/Workspace/demo │
60
+ ╰────────────────────────────────────────────╯
61
+
62
+ ⚠ MCP startup incomplete (failed: hf request)`;
63
+ const VIEWPORT_SCROLLBACK_READY_CAPTURE = `${VIEWPORT_WITHOUT_VISIBLE_PROMPT_CAPTURE}
64
+
65
+ › support lane on multi-image attach`;
66
+ const QUEUED_AFTER_TOOL_CALL_CAPTURE = `• Messages to be submitted after next tool call (press esc to interrupt and send immediately)
67
+ ↳ Read $OMX_TEAM_STATE_ROOT/team/demo/workers/worker-1/inbox.md, work now, report progress
68
+
69
+ › Write tests for @filename`;
70
+ async function withMockTmuxFixture(dirPrefix, tmuxScript, run) {
71
+ const fakeBinDir = await mkdtemp(join(tmpdir(), dirPrefix));
72
+ const logPath = join(fakeBinDir, 'tmux.log');
73
+ const tmuxStubPath = join(fakeBinDir, 'tmux');
74
+ const previousPath = process.env.PATH;
75
+ try {
76
+ await writeFile(tmuxStubPath, tmuxScript(logPath));
77
+ await chmod(tmuxStubPath, 0o755);
78
+ process.env.PATH = `${fakeBinDir}:${previousPath ?? ''}`;
79
+ return await run({ logPath });
80
+ }
81
+ finally {
82
+ if (typeof previousPath === 'string')
83
+ process.env.PATH = previousPath;
84
+ else
85
+ delete process.env.PATH;
86
+ await rm(fakeBinDir, { recursive: true, force: true });
87
+ }
88
+ }
89
+ describe('sanitizeTeamName', () => {
90
+ it('lowercases and strips invalid chars', () => {
91
+ assert.equal(sanitizeTeamName('My Team!'), 'my-team');
92
+ });
93
+ it('truncates to 30 chars', () => {
94
+ const long = 'a'.repeat(50);
95
+ assert.equal(sanitizeTeamName(long).length, 30);
96
+ });
97
+ it('rejects empty after sanitization', () => {
98
+ assert.throws(() => sanitizeTeamName('!!!'), /empty/i);
99
+ });
100
+ });
101
+ describe('chooseTeamLeaderPaneId', () => {
102
+ it('keeps preferred pane when it is not HUD', () => {
103
+ const panes = [
104
+ { paneId: '%1', currentCommand: 'node', startCommand: "'codex'" },
105
+ { paneId: '%2', currentCommand: 'node', startCommand: "node omx hud --watch" },
106
+ ];
107
+ assert.equal(chooseTeamLeaderPaneId(panes, '%1'), '%1');
108
+ });
109
+ it('switches away from HUD preferred pane to first non-HUD pane', () => {
110
+ const panes = [
111
+ { paneId: '%2', currentCommand: 'node', startCommand: "node omx hud --watch" },
112
+ { paneId: '%1', currentCommand: 'node', startCommand: "'codex'" },
113
+ ];
114
+ assert.equal(chooseTeamLeaderPaneId(panes, '%2'), '%1');
115
+ });
116
+ it('falls back to preferred pane when all panes are HUD panes', () => {
117
+ const panes = [
118
+ { paneId: '%2', currentCommand: 'node', startCommand: "node omx hud --watch" },
119
+ { paneId: '%3', currentCommand: 'node', startCommand: "node omx hud --watch" },
120
+ ];
121
+ assert.equal(chooseTeamLeaderPaneId(panes, '%2'), '%2');
122
+ });
123
+ });
124
+ describe('HUD resize hook command builders', () => {
125
+ it('buildResizeHookName normalizes all segments into collision-safe tokens', () => {
126
+ const name = buildResizeHookName('Team A', 'Session:Main', '0', '%12');
127
+ assert.equal(name, 'omx_resize_Team_A_Session_Main_0_12');
128
+ });
129
+ it('buildResizeHookTarget uses session:window format', () => {
130
+ assert.equal(buildResizeHookTarget('my-session', '3'), 'my-session:3');
131
+ });
132
+ it('buildHudPaneTarget always returns %<pane_id>', () => {
133
+ assert.equal(buildHudPaneTarget('%41'), '%41');
134
+ assert.equal(buildHudPaneTarget('41'), '%41');
135
+ });
136
+ it('buildRegisterResizeHookArgs uses target and numeric client-resized hook slot', () => {
137
+ const args = buildRegisterResizeHookArgs('my-session:0', 'omx_resize_team_session_0_1', '%1');
138
+ assert.equal(args[0], 'set-hook');
139
+ assert.equal(args[1], '-t');
140
+ assert.equal(args[2], 'my-session:0');
141
+ assert.match(args[3] ?? '', /^client-resized\[\d+\]$/);
142
+ assert.equal(args[4], `run-shell -b 'tmux resize-pane -t %1 -y ${HUD_TMUX_TEAM_HEIGHT_LINES} >/dev/null 2>&1 || true; sleep ${HUD_RESIZE_RECONCILE_DELAY_SECONDS}; tmux resize-pane -t %1 -y ${HUD_TMUX_TEAM_HEIGHT_LINES} >/dev/null 2>&1 || true'`);
143
+ });
144
+ it('buildUnregisterResizeHookArgs removes the exact numeric hook slot', () => {
145
+ const registered = buildRegisterResizeHookArgs('my-session:0', 'omx_resize_team_session_0_1', '%1');
146
+ const unregistered = buildUnregisterResizeHookArgs('my-session:0', 'omx_resize_team_session_0_1');
147
+ assert.deepEqual(unregistered, ['set-hook', '-u', '-t', 'my-session:0', registered[3]]);
148
+ });
149
+ it('buildClientAttachedReconcileHookName normalizes all segments into collision-safe tokens', () => {
150
+ const name = buildClientAttachedReconcileHookName('Team A', 'Session:Main', '0', '%12');
151
+ assert.equal(name, 'omx_attached_Team_A_Session_Main_0_12');
152
+ });
153
+ it('buildRegisterClientAttachedReconcileArgs installs one-shot client-attached reconcile hook', () => {
154
+ const args = buildRegisterClientAttachedReconcileArgs('my-session:0', 'omx_attached_team_session_0_1', '%1');
155
+ assert.equal(args[0], 'set-hook');
156
+ assert.equal(args[1], '-t');
157
+ assert.equal(args[2], 'my-session:0');
158
+ assert.match(args[3] ?? '', /^client-attached\[\d+\]$/);
159
+ assert.match(args[4] ?? '', /^run-shell -b 'tmux resize-pane -t %1 -y \d+ >\/dev\/null 2>&1 \|\| true; tmux set-hook -u -t my-session:0 client-attached\[\d+\]'$/);
160
+ });
161
+ it('buildUnregisterClientAttachedReconcileArgs removes the exact numeric client-attached slot', () => {
162
+ const registered = buildRegisterClientAttachedReconcileArgs('my-session:0', 'omx_attached_team_session_0_1', '%1');
163
+ const unregistered = buildUnregisterClientAttachedReconcileArgs('my-session:0', 'omx_attached_team_session_0_1');
164
+ assert.deepEqual(unregistered, ['set-hook', '-u', '-t', 'my-session:0', registered[3]]);
165
+ });
166
+ it('hook indices stay within signed 32-bit range (issue #240)', () => {
167
+ // buildResizeHookSlot and buildClientAttachedHookSlot must produce indices
168
+ // in [0, 2147483647) so tmux (signed 32-bit) does not overflow.
169
+ const longName = 'omx_resize_' + 'a'.repeat(200);
170
+ const resizeArgs = buildRegisterResizeHookArgs('sess:0', longName, '%1');
171
+ const attachedArgs = buildRegisterClientAttachedReconcileArgs('sess:0', longName, '%1');
172
+ const resizeSlot = resizeArgs[3] ?? '';
173
+ const attachedSlot = attachedArgs[3] ?? '';
174
+ const resizeIndex = Number((resizeSlot.match(/\[(\d+)\]/) ?? [])[1]);
175
+ const attachedIndex = Number((attachedSlot.match(/\[(\d+)\]/) ?? [])[1]);
176
+ assert.ok(resizeIndex >= 0, `resize index must be non-negative, got ${resizeIndex}`);
177
+ assert.ok(resizeIndex < 2147483647, `resize index must be < 2^31-1, got ${resizeIndex}`);
178
+ assert.ok(attachedIndex >= 0, `attached index must be non-negative, got ${attachedIndex}`);
179
+ assert.ok(attachedIndex < 2147483647, `attached index must be < 2^31-1, got ${attachedIndex}`);
180
+ });
181
+ it('hook indices are deterministic across calls', () => {
182
+ const name = 'omx_resize_team_session_0_1';
183
+ const a = buildRegisterResizeHookArgs('s:0', name, '%1');
184
+ const b = buildRegisterResizeHookArgs('s:0', name, '%1');
185
+ assert.equal(a[3], b[3]);
186
+ const c = buildRegisterClientAttachedReconcileArgs('s:0', name, '%1');
187
+ const d = buildRegisterClientAttachedReconcileArgs('s:0', name, '%1');
188
+ assert.equal(c[3], d[3]);
189
+ });
190
+ it('buildScheduleDelayedHudResizeArgs schedules tmux-side delayed reconcile', () => {
191
+ assert.deepEqual(buildScheduleDelayedHudResizeArgs('%1'), ['run-shell', '-b', `sleep ${HUD_RESIZE_RECONCILE_DELAY_SECONDS}; tmux resize-pane -t %1 -y ${HUD_TMUX_TEAM_HEIGHT_LINES} >/dev/null 2>&1 || true`]);
192
+ });
193
+ it('buildReconcileHudResizeArgs executes a best-effort quiet resize command', () => {
194
+ const args = buildReconcileHudResizeArgs('%7');
195
+ assert.equal(args.join(' ').includes('split-window'), false);
196
+ assert.deepEqual(args, ['run-shell', `tmux resize-pane -t %7 -y ${HUD_TMUX_TEAM_HEIGHT_LINES} >/dev/null 2>&1 || true`]);
197
+ });
198
+ it('resolves the tmux executable for win32 hook shell snippets', async () => {
199
+ const fakeBin = await mkdtemp(join(tmpdir(), 'omx-win32-hook-tmux-'));
200
+ const prevPath = process.env.PATH;
201
+ const prevPathext = process.env.PATHEXT;
202
+ const origPlatform = Object.getOwnPropertyDescriptor(process, 'platform');
203
+ try {
204
+ const tmuxPath = join(fakeBin, 'tmux.exe');
205
+ await writeFile(tmuxPath, '');
206
+ process.env.PATH = fakeBin;
207
+ process.env.PATHEXT = '.EXE';
208
+ Object.defineProperty(process, 'platform', { value: 'win32', configurable: true });
209
+ const resizeArgs = buildRegisterResizeHookArgs('my-session:0', 'omx_resize_team_session_0_1', '%1');
210
+ const delayedArgs = buildScheduleDelayedHudResizeArgs('%1');
211
+ const reconcileArgs = buildReconcileHudResizeArgs('%1');
212
+ assert.match(resizeArgs[4] ?? '', new RegExp(escapeRegExp(tmuxPath)));
213
+ assert.doesNotMatch(resizeArgs[4] ?? '', /^run-shell -b 'tmux resize-pane/);
214
+ assert.match(delayedArgs[2] ?? '', new RegExp(escapeRegExp(tmuxPath)));
215
+ assert.doesNotMatch(delayedArgs[2] ?? '', /sleep \d+; tmux resize-pane/);
216
+ assert.match(reconcileArgs[1] ?? '', new RegExp(escapeRegExp(tmuxPath)));
217
+ assert.doesNotMatch(reconcileArgs[1] ?? '', /^tmux resize-pane/);
218
+ }
219
+ finally {
220
+ if (origPlatform)
221
+ Object.defineProperty(process, 'platform', origPlatform);
222
+ if (typeof prevPath === 'string')
223
+ process.env.PATH = prevPath;
224
+ else
225
+ delete process.env.PATH;
226
+ if (typeof prevPathext === 'string')
227
+ process.env.PATHEXT = prevPathext;
228
+ else
229
+ delete process.env.PATHEXT;
230
+ await rm(fakeBin, { recursive: true, force: true });
231
+ }
232
+ });
233
+ it('resolves the tmux executable twice for win32 client-attached one-shot hooks', async () => {
234
+ const fakeBin = await mkdtemp(join(tmpdir(), 'omx-win32-attached-hook-'));
235
+ const prevPath = process.env.PATH;
236
+ const prevPathext = process.env.PATHEXT;
237
+ const origPlatform = Object.getOwnPropertyDescriptor(process, 'platform');
238
+ try {
239
+ const tmuxPath = join(fakeBin, 'tmux.exe');
240
+ await writeFile(tmuxPath, '');
241
+ process.env.PATH = fakeBin;
242
+ process.env.PATHEXT = '.EXE';
243
+ Object.defineProperty(process, 'platform', { value: 'win32', configurable: true });
244
+ const args = buildRegisterClientAttachedReconcileArgs('my-session:0', 'omx_attached_team_session_0_1', '%1');
245
+ const matches = (args[4] ?? '').match(new RegExp(escapeRegExp(tmuxPath), 'g')) || [];
246
+ assert.equal(matches.length, 2, 'client-attached hook should resolve tmux for both resize and unregister commands');
247
+ assert.doesNotMatch(args[4] ?? '', /; tmux set-hook -u -t my-session:0 client-attached/);
248
+ }
249
+ finally {
250
+ if (origPlatform)
251
+ Object.defineProperty(process, 'platform', origPlatform);
252
+ if (typeof prevPath === 'string')
253
+ process.env.PATH = prevPath;
254
+ else
255
+ delete process.env.PATH;
256
+ if (typeof prevPathext === 'string')
257
+ process.env.PATHEXT = prevPathext;
258
+ else
259
+ delete process.env.PATHEXT;
260
+ await rm(fakeBin, { recursive: true, force: true });
261
+ }
262
+ });
263
+ });
264
+ describe('evaluateStartupDirectTriggerSafetyCapture', () => {
265
+ it('allows startup direct triggers on a ready prompt or Codex viewport', () => {
266
+ assert.deepEqual(evaluateStartupDirectTriggerSafetyCapture(READY_HELPER_CAPTURE, 'codex'), {
267
+ safe: true,
268
+ reason: 'ready_prompt',
269
+ });
270
+ assert.deepEqual(evaluateStartupDirectTriggerSafetyCapture(VIEWPORT_WITHOUT_VISIBLE_PROMPT_CAPTURE, 'codex'), {
271
+ safe: true,
272
+ reason: 'codex_viewport',
273
+ });
274
+ });
275
+ it('blocks startup direct triggers through trust and Claude bypass prompts', () => {
276
+ assert.deepEqual(evaluateStartupDirectTriggerSafetyCapture(`Do you trust the contents of this directory?
277
+ Press enter to continue`, 'codex'), {
278
+ safe: false,
279
+ reason: 'trust_prompt',
280
+ });
281
+ assert.deepEqual(evaluateStartupDirectTriggerSafetyCapture(CLAUDE_BYPASS_PROMPT_CAPTURE, 'claude'), {
282
+ safe: false,
283
+ reason: 'claude_bypass_prompt',
284
+ });
285
+ });
286
+ });
287
+ describe('sendToWorker validation', () => {
288
+ it('rejects text over 200 chars', async () => {
289
+ await assert.rejects(sendToWorker('omx-team-x', 1, 'a'.repeat(200)), /< 200/i);
290
+ });
291
+ it('rejects empty/whitespace text', async () => {
292
+ await assert.rejects(sendToWorker('omx-team-x', 1, ' '), /non-empty/i);
293
+ });
294
+ it('rejects injection marker', async () => {
295
+ await assert.rejects(sendToWorker('omx-team-x', 1, `hello [OMX_TMUX_INJECT]`), /marker/i);
296
+ });
297
+ it('auto-accepts the Claude bypass prompt before sending worker text', async () => {
298
+ await withMockTmuxFixture('omx-tmux-claude-bypass-send-', (logPath) => `#!/bin/sh
299
+ set -eu
300
+ state_dir="$(dirname "${logPath}")"
301
+ accepted_file="$state_dir/accepted"
302
+ printf '%s\n' "$*" >> "${logPath}"
303
+ case "$1" in
304
+ capture-pane)
305
+ if [ -f "$accepted_file" ]; then
306
+ cat <<'EOF'
307
+ How can I help you today?
308
+ EOF
309
+ else
310
+ cat <<'EOF'
311
+ ${CLAUDE_BYPASS_PROMPT_CAPTURE}
312
+ EOF
313
+ fi
314
+ exit 0
315
+ ;;
316
+ send-keys)
317
+ if [ "\${4:-}" = "-l" ] && [ "\${6:-}" = "2" ]; then
318
+ : > "$accepted_file"
319
+ fi
320
+ exit 0
321
+ ;;
322
+ *)
323
+ exit 0
324
+ ;;
325
+ esac
326
+ `, async ({ logPath }) => {
327
+ await sendToWorker('omx-team-x', 1, 'check inbox');
328
+ const log = await readFile(logPath, 'utf-8');
329
+ const acceptIndex = log.indexOf('send-keys -t omx-team-x:1 -l -- 2');
330
+ const submitIndex = log.indexOf('send-keys -t omx-team-x:1 -l -- check inbox');
331
+ assert.notEqual(acceptIndex, -1, `expected bypass acceptance in log:\n${log}`);
332
+ assert.notEqual(submitIndex, -1, `expected worker text submission in log:\n${log}`);
333
+ assert.ok(acceptIndex < submitIndex, `expected bypass acceptance before worker text:\n${log}`);
334
+ });
335
+ });
336
+ it('ignores stale queued-next-tool-call banner text that only survives in scrollback history', async () => {
337
+ await withMockTmuxFixture('omx-tmux-codex-stale-queued-scrollback-', (logPath) => `#!/bin/sh
338
+ set -eu
339
+ state_dir="$(dirname "${logPath}")"
340
+ text_sent_file="$state_dir/text-sent"
341
+ printf '%s\n' "$*" >> "${logPath}"
342
+ case "$1" in
343
+ capture-pane)
344
+ if printf '%s\n' "$*" | grep -q -- ' -S -80'; then
345
+ if [ -f "$text_sent_file" ]; then
346
+ cat <<'EOF'
347
+ ${QUEUED_AFTER_TOOL_CALL_CAPTURE}
348
+ EOF
349
+ else
350
+ cat <<'EOF'
351
+ ${READY_HELPER_CAPTURE}
352
+ EOF
353
+ fi
354
+ else
355
+ cat <<'EOF'
356
+ ${READY_HELPER_CAPTURE}
357
+ EOF
358
+ fi
359
+ exit 0
360
+ ;;
361
+ send-keys)
362
+ if [ "\${4:-}" = "-l" ] && [ "\${6:-}" = "check inbox" ]; then
363
+ : > "$text_sent_file"
364
+ fi
365
+ exit 0
366
+ ;;
367
+ *)
368
+ exit 0
369
+ ;;
370
+ esac
371
+ `, async ({ logPath }) => {
372
+ await sendToWorker('omx-team-x', 1, 'check inbox');
373
+ const log = await readFile(logPath, 'utf-8');
374
+ const enterCount = (log.match(/send-keys -t omx-team-x:1 C-m/g) || []).length;
375
+ assert.equal(enterCount, 2, `expected only the baseline submit presses when the queued banner is stale scrollback:\n${log}`);
376
+ assert.match(log, /capture-pane -t omx-team-x:1 -p/);
377
+ assert.match(log, /capture-pane -t omx-team-x:1 -p -S -80/);
378
+ });
379
+ });
380
+ it('keeps nudging Codex when the visible pane still shows a live queued-next-tool-call banner', async () => {
381
+ await withMockTmuxFixture('omx-tmux-codex-visible-queued-submit-', (logPath) => `#!/bin/sh
382
+ set -eu
383
+ state_dir="$(dirname "${logPath}")"
384
+ text_sent_file="$state_dir/text-sent"
385
+ enter_count_file="$state_dir/enter-count"
386
+ printf '%s\n' "$*" >> "${logPath}"
387
+ case "$1" in
388
+ capture-pane)
389
+ enter_count=0
390
+ if [ -f "$enter_count_file" ]; then
391
+ enter_count=$(cat "$enter_count_file")
392
+ fi
393
+ if printf '%s\n' "$*" | grep -q -- ' -S -80'; then
394
+ cat <<'EOF'
395
+ ${READY_HELPER_CAPTURE}
396
+ EOF
397
+ else
398
+ if [ "$enter_count" -ge 4 ]; then
399
+ cat <<'EOF'
400
+ initialized in .
401
+
402
+ ◦ Waiting for background terminal (59s…)
403
+ EOF
404
+ elif [ -f "$text_sent_file" ]; then
405
+ cat <<'EOF'
406
+ ${QUEUED_AFTER_TOOL_CALL_CAPTURE}
407
+ EOF
408
+ else
409
+ cat <<'EOF'
410
+ ${READY_HELPER_CAPTURE}
411
+ EOF
412
+ fi
413
+ fi
414
+ exit 0
415
+ ;;
416
+ send-keys)
417
+ if [ "\${4:-}" = "-l" ] && [ "\${6:-}" = "check inbox" ]; then
418
+ : > "$text_sent_file"
419
+ fi
420
+ if [ "\${4:-}" = "C-m" ]; then
421
+ enter_count=0
422
+ if [ -f "$enter_count_file" ]; then
423
+ enter_count=$(cat "$enter_count_file")
424
+ fi
425
+ enter_count=$((enter_count + 1))
426
+ printf '%s' "$enter_count" > "$enter_count_file"
427
+ fi
428
+ exit 0
429
+ ;;
430
+ *)
431
+ exit 0
432
+ ;;
433
+ esac
434
+ `, async ({ logPath }) => {
435
+ await sendToWorker('omx-team-x', 1, 'check inbox');
436
+ const log = await readFile(logPath, 'utf-8');
437
+ const enterCount = (log.match(/send-keys -t omx-team-x:1 C-m/g) || []).length;
438
+ assert.ok(enterCount >= 4, `expected extra submit nudges when Codex queues the trigger:\n${log}`);
439
+ });
440
+ });
441
+ it('fails closed when the visible queued-next-tool-call banner never clears after the final submit round', async () => {
442
+ await withMockTmuxFixture('omx-tmux-codex-stuck-queued-submit-', (logPath) => `#!/bin/sh
443
+ set -eu
444
+ state_dir="$(dirname "${logPath}")"
445
+ text_sent_file="$state_dir/text-sent"
446
+ printf '%s\n' "$*" >> "${logPath}"
447
+ case "$1" in
448
+ capture-pane)
449
+ if printf '%s\n' "$*" | grep -q -- ' -S -80'; then
450
+ cat <<'EOF'
451
+ ${READY_HELPER_CAPTURE}
452
+ EOF
453
+ else
454
+ if [ -f "$text_sent_file" ]; then
455
+ cat <<'EOF'
456
+ ${QUEUED_AFTER_TOOL_CALL_CAPTURE}
457
+ EOF
458
+ else
459
+ cat <<'EOF'
460
+ ${READY_HELPER_CAPTURE}
461
+ EOF
462
+ fi
463
+ fi
464
+ exit 0
465
+ ;;
466
+ send-keys)
467
+ if [ "\${4:-}" = "-l" ] && [ "\${6:-}" = "check inbox" ]; then
468
+ : > "$text_sent_file"
469
+ fi
470
+ exit 0
471
+ ;;
472
+ *)
473
+ exit 0
474
+ ;;
475
+ esac
476
+ `, async ({ logPath }) => {
477
+ await assert.rejects(() => sendToWorker('omx-team-x', 1, 'check inbox'), /submit_queued_after_tool_call/);
478
+ const log = await readFile(logPath, 'utf-8');
479
+ const enterCount = (log.match(/send-keys -t omx-team-x:1 C-m/g) || []).length;
480
+ assert.ok(enterCount >= 4, `expected repeated submit nudges before failing closed on stuck queued banner:\n${log}`);
481
+ });
482
+ });
483
+ it('does not confirm delivery while a wrapped hyphenated trigger remains as an unsent draft', async () => {
484
+ const trigger = 'Read .omx/state/team/team-x/workers/worker-1/inbox.md';
485
+ await withMockTmuxFixture('omx-tmux-codex-wrapped-trigger-draft-', (logPath) => `#!/bin/sh
486
+ set -eu
487
+ state_dir="$(dirname "${logPath}")"
488
+ text_sent_file="$state_dir/text-sent"
489
+ printf '%s\n' "$*" >> "${logPath}"
490
+ case "$1" in
491
+ capture-pane)
492
+ if [ -f "$text_sent_file" ]; then
493
+ cat <<'EOF'
494
+ ${READY_HELPER_CAPTURE}
495
+
496
+ › Read .omx/state/team/team-x/workers/worker-
497
+ 1/inbox.md
498
+ EOF
499
+ else
500
+ cat <<'EOF'
501
+ ${READY_HELPER_CAPTURE}
502
+ EOF
503
+ fi
504
+ exit 0
505
+ ;;
506
+ send-keys)
507
+ if [ "\${4:-}" = "-l" ] && [ "\${6:-}" = "${trigger}" ]; then
508
+ : > "$text_sent_file"
509
+ fi
510
+ exit 0
511
+ ;;
512
+ *)
513
+ exit 0
514
+ ;;
515
+ esac
516
+ `, async ({ logPath }) => {
517
+ await assert.rejects(() => sendToWorker('omx-team-x', 1, trigger), /submit_failed/);
518
+ const log = await readFile(logPath, 'utf-8');
519
+ const enterCount = (log.match(/send-keys -t omx-team-x:1 C-m/g) || []).length;
520
+ assert.ok(enterCount >= 4, `expected repeated submit nudges before failing on the still-visible wrapped draft:\n${log}`);
521
+ });
522
+ });
523
+ });
524
+ describe('sendToWorker adaptive retry matching', () => {
525
+ it('recognizes hyphen-wrapped trigger drafts as still visible', () => {
526
+ assert.equal(shouldAttemptAdaptiveRetry('auto', true, true, `${READY_HELPER_CAPTURE}\n\n› Read .omx/state/team/team-x/workers/worker-\n 1/inbox.md`, 'Read .omx/state/team/team-x/workers/worker-1/inbox.md'), true);
527
+ });
528
+ });
529
+ describe('startup direct trigger safety', () => {
530
+ it('classifies ready panes as safe and blocks trust, bypass, bootstrapping, and active-task captures', () => {
531
+ assert.equal(classifyWorkerStartupInjectSafety(READY_HELPER_CAPTURE), 'safe');
532
+ assert.equal(classifyWorkerStartupInjectSafety('Do you trust the contents of this directory?\nPress enter to continue'), 'trust_prompt');
533
+ assert.equal(classifyWorkerStartupInjectSafety(CLAUDE_BYPASS_PROMPT_CAPTURE), 'claude_bypass_prompt');
534
+ assert.equal(classifyWorkerStartupInjectSafety('OpenAI Codex\nmodel: loading'), 'bootstrapping');
535
+ assert.equal(classifyWorkerStartupInjectSafety('OpenAI Codex\nmodel: test\n• Running tests (esc to interrupt)'), 'active_task');
536
+ });
537
+ it('checks visible pane first and refuses direct injection through a trust prompt', async () => {
538
+ await withMockTmuxFixture('omx-tmux-startup-direct-trust-', (logPath) => `#!/bin/sh
539
+ set -eu
540
+ printf '%s\n' "$*" >> "${logPath}"
541
+ case "$1" in
542
+ capture-pane)
543
+ cat <<'EOF'
544
+ Do you trust the contents of this directory?
545
+ Press enter to continue
546
+ EOF
547
+ exit 0
548
+ ;;
549
+ *)
550
+ exit 0
551
+ ;;
552
+ esac
553
+ `, async ({ logPath }) => {
554
+ assert.deepEqual(await checkWorkerStartupInjectSafety('omx-team-x', 1), { safe: false, reason: 'trust_prompt' });
555
+ const log = await readFile(logPath, 'utf-8');
556
+ assert.doesNotMatch(log, /send-keys/);
557
+ });
558
+ });
559
+ });
560
+ describe('shouldAttemptAdaptiveRetry', () => {
561
+ it('returns false when adaptive retry is disabled', () => {
562
+ assert.equal(shouldAttemptAdaptiveRetry('auto', true, false, '❯ hello', 'hello'), false);
563
+ });
564
+ it('returns false when strategy is not auto', () => {
565
+ assert.equal(shouldAttemptAdaptiveRetry('queue', true, true, '❯ hello', 'hello'), false);
566
+ });
567
+ it('returns false when pane was not initially busy', () => {
568
+ assert.equal(shouldAttemptAdaptiveRetry('auto', false, true, '❯ hello', 'hello'), false);
569
+ });
570
+ it('returns false when trigger text is missing from latest capture', () => {
571
+ assert.equal(shouldAttemptAdaptiveRetry('auto', true, true, '❯ ready prompt', 'hello'), false);
572
+ });
573
+ it('returns false when latest capture still shows active task markers', () => {
574
+ const activeCapture = '• Doing work (2m 10s • esc to interrupt)\n❯ hello';
575
+ assert.equal(shouldAttemptAdaptiveRetry('auto', true, true, activeCapture, 'hello'), false);
576
+ });
577
+ it('returns false when latest capture shows Claude active generation line', () => {
578
+ const activeCapture = '· Caramelizing…\n❯ hello';
579
+ assert.equal(shouldAttemptAdaptiveRetry('auto', true, true, activeCapture, 'hello'), false);
580
+ });
581
+ it('returns false when latest capture shows Claude apostrophe generation line', () => {
582
+ const activeCapture = "· Beboppin'...\n❯ hello";
583
+ assert.equal(shouldAttemptAdaptiveRetry('auto', true, true, activeCapture, 'hello'), false);
584
+ });
585
+ it('returns false when latest capture shows Claude sparkle generation line', () => {
586
+ const activeCapture = '✻ Pollinating…\n❯ hello';
587
+ assert.equal(shouldAttemptAdaptiveRetry('auto', true, true, activeCapture, 'hello'), false);
588
+ });
589
+ it('returns false when latest capture shows background terminal running status', () => {
590
+ const activeCapture = '2 background terminal running\n❯ hello';
591
+ assert.equal(shouldAttemptAdaptiveRetry('auto', true, true, activeCapture, 'hello'), false);
592
+ });
593
+ it('does not treat non-ellipsis Claude bullet text as active generation', () => {
594
+ const readyCapture = '· Caramelizing\n❯ hello';
595
+ assert.equal(shouldAttemptAdaptiveRetry('auto', true, true, readyCapture, 'hello'), true);
596
+ });
597
+ it('returns true only when auto+busy and latest capture is ready with visible text', () => {
598
+ const readyCapture = '❯ hello';
599
+ assert.equal(shouldAttemptAdaptiveRetry('auto', true, true, readyCapture, 'hello'), true);
600
+ });
601
+ });
602
+ describe('paneIsBootstrapping (#391)', () => {
603
+ it('detects "loading" keyword', () => {
604
+ assert.equal(paneIsBootstrapping(['loading model weights…']), true);
605
+ });
606
+ it('detects "model: loading" pattern', () => {
607
+ assert.equal(paneIsBootstrapping(['gpt-4o', 'model: loading']), true);
608
+ });
609
+ it('detects "initializing" keyword', () => {
610
+ assert.equal(paneIsBootstrapping(['Initializing workspace']), true);
611
+ });
612
+ it('detects "connecting to" keyword', () => {
613
+ assert.equal(paneIsBootstrapping(['connecting to server']), true);
614
+ });
615
+ it('returns false for normal ready prompt', () => {
616
+ assert.equal(paneIsBootstrapping(['› ']), false);
617
+ });
618
+ it('returns false for status bar without loading', () => {
619
+ assert.equal(paneIsBootstrapping(['gpt-4o', '50% left', '› ']), false);
620
+ });
621
+ });
622
+ describe('paneLooksReady gate: status-only is not ready (#391)', () => {
623
+ // These verify the fix for #391: status bar markers alone (gpt-*, % left,
624
+ // Claude Code v*) must NOT count as ready without a prompt character.
625
+ // We test indirectly via shouldAttemptAdaptiveRetry since paneLooksReady is
626
+ // not exported, but the adaptive retry guard calls paneLooksReady internally.
627
+ it('shouldAttemptAdaptiveRetry returns false for status-only capture (no prompt)', () => {
628
+ // Capture has Codex status bar but no prompt character — paneLooksReady
629
+ // should return false, so adaptive retry should also return false.
630
+ const statusOnlyCapture = 'gpt-4o 50% left';
631
+ assert.equal(shouldAttemptAdaptiveRetry('auto', true, true, statusOnlyCapture, 'gpt-4o'), false);
632
+ });
633
+ it('shouldAttemptAdaptiveRetry returns false for Claude status-only capture', () => {
634
+ const statusOnlyCapture = 'Claude Code v1.2.3 claude-sonnet-4-20250514';
635
+ assert.equal(shouldAttemptAdaptiveRetry('auto', true, true, statusOnlyCapture, 'Claude Code'), false);
636
+ });
637
+ it('shouldAttemptAdaptiveRetry returns false when pane is bootstrapping', () => {
638
+ const loadingCapture = 'gpt-4o\nmodel: loading\n› hello';
639
+ assert.equal(shouldAttemptAdaptiveRetry('auto', true, true, loadingCapture, 'hello'), false);
640
+ });
641
+ it('shouldAttemptAdaptiveRetry treats issue-only prompt as ready even without glyph', () => {
642
+ const issuePromptCapture = 'IND-123 only...';
643
+ assert.equal(shouldAttemptAdaptiveRetry('auto', true, true, issuePromptCapture, 'IND-123 only...'), true);
644
+ });
645
+ });
646
+ describe('buildWorkerStartupCommand', () => {
647
+ it('auto-selects gemini worker CLI from gemini model', () => {
648
+ const prevShell = process.env.SHELL;
649
+ const prevCli = process.env.OMX_TEAM_WORKER_CLI;
650
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
651
+ process.env.SHELL = '/bin/bash';
652
+ delete process.env.OMX_TEAM_WORKER_CLI; // auto
653
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
654
+ try {
655
+ const cmd = buildWorkerStartupCommand('alpha', 1, ['--model', 'gemini-2.0-pro'], process.cwd(), {}, undefined, 'Read worker inbox');
656
+ assert.match(cmd, /exec .*gemini/);
657
+ assert.match(cmd, /--approval-mode/);
658
+ assert.match(cmd, /yolo/);
659
+ assert.match(cmd, /--model/);
660
+ assert.match(cmd, /gemini-2.0-pro/);
661
+ assert.match(cmd, /(?:^|\s|')-i(?:'|\s|$)/);
662
+ assert.match(cmd, /Read worker inbox/);
663
+ assert.match(cmd, /Read worker inbox/);
664
+ }
665
+ finally {
666
+ if (typeof prevShell === 'string')
667
+ process.env.SHELL = prevShell;
668
+ else
669
+ delete process.env.SHELL;
670
+ if (typeof prevCli === 'string')
671
+ process.env.OMX_TEAM_WORKER_CLI = prevCli;
672
+ else
673
+ delete process.env.OMX_TEAM_WORKER_CLI;
674
+ if (typeof prevBypass === 'string')
675
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
676
+ else
677
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
678
+ }
679
+ });
680
+ it('scrubs HUD ownership env from interactive worker startup commands', () => {
681
+ const prevShell = process.env.SHELL;
682
+ const prevCli = process.env.OMX_TEAM_WORKER_CLI;
683
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
684
+ const prevHudOwner = process.env.OMX_TMUX_HUD_OWNER;
685
+ const prevHudLeaderPane = process.env.OMX_TMUX_HUD_LEADER_PANE;
686
+ process.env.SHELL = '/bin/bash';
687
+ process.env.OMX_TEAM_WORKER_CLI = 'codex';
688
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
689
+ process.env.OMX_TMUX_HUD_OWNER = '1';
690
+ process.env.OMX_TMUX_HUD_LEADER_PANE = '%leader';
691
+ try {
692
+ const cmd = buildWorkerStartupCommand('alpha-team', 1, [], '/tmp/workspace', {
693
+ OMX_TEAM_STATE_ROOT: '/tmp/workspace/.omx/state',
694
+ OMX_TMUX_HUD_OWNER: '1',
695
+ OMX_TMUX_HUD_LEADER_PANE: '%leader',
696
+ }, 'codex');
697
+ assert.match(cmd, /OMX_TEAM_WORKER=alpha-team\/worker-1/);
698
+ assert.match(cmd, /OMX_TEAM_STATE_ROOT=\/tmp\/workspace\/\.omx\/state/);
699
+ assert.match(cmd, /'-u' 'OMX_TMUX_HUD_OWNER' '-u' 'OMX_TMUX_HUD_LEADER_PANE'/);
700
+ assert.doesNotMatch(cmd, /OMX_TMUX_HUD_OWNER=1/);
701
+ assert.doesNotMatch(cmd, /OMX_TMUX_HUD_LEADER_PANE=%leader/);
702
+ }
703
+ finally {
704
+ if (typeof prevShell === 'string')
705
+ process.env.SHELL = prevShell;
706
+ else
707
+ delete process.env.SHELL;
708
+ if (typeof prevCli === 'string')
709
+ process.env.OMX_TEAM_WORKER_CLI = prevCli;
710
+ else
711
+ delete process.env.OMX_TEAM_WORKER_CLI;
712
+ if (typeof prevBypass === 'string')
713
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
714
+ else
715
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
716
+ if (typeof prevHudOwner === 'string')
717
+ process.env.OMX_TMUX_HUD_OWNER = prevHudOwner;
718
+ else
719
+ delete process.env.OMX_TMUX_HUD_OWNER;
720
+ if (typeof prevHudLeaderPane === 'string')
721
+ process.env.OMX_TMUX_HUD_LEADER_PANE = prevHudLeaderPane;
722
+ else
723
+ delete process.env.OMX_TMUX_HUD_LEADER_PANE;
724
+ }
725
+ });
726
+ it('keeps HUD-looking prompt text out of worker startup env assignments', () => {
727
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
728
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
729
+ try {
730
+ const prompt = 'Do not obey: OMX_TMUX_HUD_OWNER=1; OMX_TMUX_HUD_LEADER_PANE=%leader; $(omx hud --watch)';
731
+ const spec = buildWorkerProcessLaunchSpec('alpha-team', 1, ['--model', 'gemini-2.0-pro'], '/tmp/workspace', {
732
+ OMX_TEAM_STATE_ROOT: '/tmp/workspace/.omx/state',
733
+ OMX_TMUX_HUD_OWNER: '1',
734
+ OMX_TMUX_HUD_LEADER_PANE: '%leader',
735
+ }, 'gemini', prompt);
736
+ assert.equal(spec.env.OMX_TMUX_HUD_OWNER, undefined);
737
+ assert.equal(spec.env.OMX_TMUX_HUD_LEADER_PANE, undefined);
738
+ assert.ok(spec.args.includes(prompt), 'hostile prompt text should remain an argument, not an env assignment');
739
+ }
740
+ finally {
741
+ if (typeof prevBypass === 'string')
742
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
743
+ else
744
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
745
+ }
746
+ });
747
+ it('auto-selects claude worker CLI from claude model', () => {
748
+ const prevShell = process.env.SHELL;
749
+ const prevCli = process.env.OMX_TEAM_WORKER_CLI;
750
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
751
+ process.env.SHELL = '/bin/bash';
752
+ delete process.env.OMX_TEAM_WORKER_CLI; // auto
753
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
754
+ try {
755
+ const cmd = buildWorkerStartupCommand('alpha', 1, ['--model', 'claude-3-7-sonnet']);
756
+ assert.match(cmd, /exec .*claude/);
757
+ assert.equal((cmd.match(/--dangerously-skip-permissions/g) || []).length, 1);
758
+ assert.doesNotMatch(cmd, /--model/);
759
+ assert.doesNotMatch(cmd, /model_instructions_file=/);
760
+ }
761
+ finally {
762
+ if (typeof prevShell === 'string')
763
+ process.env.SHELL = prevShell;
764
+ else
765
+ delete process.env.SHELL;
766
+ if (typeof prevCli === 'string')
767
+ process.env.OMX_TEAM_WORKER_CLI = prevCli;
768
+ else
769
+ delete process.env.OMX_TEAM_WORKER_CLI;
770
+ if (typeof prevBypass === 'string')
771
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
772
+ else
773
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
774
+ }
775
+ });
776
+ it('respects explicit OMX_TEAM_WORKER_CLI override', () => {
777
+ const prevShell = process.env.SHELL;
778
+ const prevCli = process.env.OMX_TEAM_WORKER_CLI;
779
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
780
+ process.env.SHELL = '/bin/bash';
781
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
782
+ try {
783
+ process.env.OMX_TEAM_WORKER_CLI = 'codex';
784
+ const codexCmd = buildWorkerStartupCommand('alpha', 1, ['--model', 'claude-3-7-sonnet']);
785
+ assert.match(codexCmd, /exec .*codex/);
786
+ process.env.OMX_TEAM_WORKER_CLI = 'claude';
787
+ const claudeCmd = buildWorkerStartupCommand('alpha', 1, ['--model', 'gpt-5']);
788
+ assert.match(claudeCmd, /exec .*claude/);
789
+ assert.equal((claudeCmd.match(/--dangerously-skip-permissions/g) || []).length, 1);
790
+ assert.doesNotMatch(claudeCmd, /--model/);
791
+ }
792
+ finally {
793
+ if (typeof prevShell === 'string')
794
+ process.env.SHELL = prevShell;
795
+ else
796
+ delete process.env.SHELL;
797
+ if (typeof prevCli === 'string')
798
+ process.env.OMX_TEAM_WORKER_CLI = prevCli;
799
+ else
800
+ delete process.env.OMX_TEAM_WORKER_CLI;
801
+ if (typeof prevBypass === 'string')
802
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
803
+ else
804
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
805
+ }
806
+ });
807
+ it('applies claude skip-permissions when worker CLI is provided by plan override', () => {
808
+ const prevShell = process.env.SHELL;
809
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
810
+ process.env.SHELL = '/bin/bash';
811
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
812
+ try {
813
+ const cmd = buildWorkerStartupCommand('alpha', 1, ['--model', 'gpt-5', '--dangerously-bypass-approvals-and-sandbox'], process.cwd(), {}, 'claude');
814
+ assert.match(cmd, /exec .*claude/);
815
+ assert.equal((cmd.match(/--dangerously-skip-permissions/g) || []).length, 1);
816
+ assert.doesNotMatch(cmd, /dangerously-bypass-approvals-and-sandbox/);
817
+ assert.doesNotMatch(cmd, /--model/);
818
+ }
819
+ finally {
820
+ if (typeof prevShell === 'string')
821
+ process.env.SHELL = prevShell;
822
+ else
823
+ delete process.env.SHELL;
824
+ if (typeof prevBypass === 'string')
825
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
826
+ else
827
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
828
+ }
829
+ });
830
+ it('drops all explicit launch args for claude workers', () => {
831
+ const prevShell = process.env.SHELL;
832
+ const prevCli = process.env.OMX_TEAM_WORKER_CLI;
833
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
834
+ process.env.SHELL = '/bin/bash';
835
+ process.env.OMX_TEAM_WORKER_CLI = 'claude';
836
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
837
+ try {
838
+ const cmd = buildWorkerStartupCommand('alpha', 1, [
839
+ '--dangerously-bypass-approvals-and-sandbox',
840
+ '-c', 'model_instructions_file="/tmp/custom.md"',
841
+ '--model', 'claude-3-7-sonnet',
842
+ ]);
843
+ assert.match(cmd, /exec .*claude/);
844
+ assert.equal((cmd.match(/--dangerously-skip-permissions/g) || []).length, 1);
845
+ assert.doesNotMatch(cmd, /dangerously-bypass-approvals-and-sandbox/);
846
+ assert.doesNotMatch(cmd, /model_instructions_file=/);
847
+ assert.doesNotMatch(cmd, /--model/);
848
+ assert.doesNotMatch(cmd, /claude-3-7-sonnet/);
849
+ }
850
+ finally {
851
+ if (typeof prevShell === 'string')
852
+ process.env.SHELL = prevShell;
853
+ else
854
+ delete process.env.SHELL;
855
+ if (typeof prevCli === 'string')
856
+ process.env.OMX_TEAM_WORKER_CLI = prevCli;
857
+ else
858
+ delete process.env.OMX_TEAM_WORKER_CLI;
859
+ if (typeof prevBypass === 'string')
860
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
861
+ else
862
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
863
+ }
864
+ });
865
+ it('does not pass bypass flags in claude mode', () => {
866
+ const prevArgv = process.argv;
867
+ const prevShell = process.env.SHELL;
868
+ const prevCli = process.env.OMX_TEAM_WORKER_CLI;
869
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
870
+ process.env.SHELL = '/bin/bash';
871
+ process.env.OMX_TEAM_WORKER_CLI = 'claude';
872
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
873
+ process.argv = [...prevArgv, '--madmax'];
874
+ try {
875
+ const cmd = buildWorkerStartupCommand('alpha', 1);
876
+ assert.match(cmd, /exec .*claude/);
877
+ assert.equal((cmd.match(/--dangerously-skip-permissions/g) || []).length, 1);
878
+ assert.doesNotMatch(cmd, /dangerously-bypass-approvals-and-sandbox/);
879
+ }
880
+ finally {
881
+ process.argv = prevArgv;
882
+ if (typeof prevShell === 'string')
883
+ process.env.SHELL = prevShell;
884
+ else
885
+ delete process.env.SHELL;
886
+ if (typeof prevCli === 'string')
887
+ process.env.OMX_TEAM_WORKER_CLI = prevCli;
888
+ else
889
+ delete process.env.OMX_TEAM_WORKER_CLI;
890
+ if (typeof prevBypass === 'string')
891
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
892
+ else
893
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
894
+ }
895
+ });
896
+ it('uses zsh without sourcing ~/.zshrc by default and keeps non-login exec semantics', () => {
897
+ const prevShell = process.env.SHELL;
898
+ process.env.SHELL = '/bin/zsh';
899
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
900
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
901
+ try {
902
+ const cmd = withMockedExistsSync((candidate) => candidate === '/bin/zsh', () => buildWorkerStartupCommand('alpha', 2));
903
+ assert.match(cmd, /OMX_TEAM_WORKER=alpha\/worker-2/);
904
+ assert.match(cmd, /'\/bin\/zsh' -c/);
905
+ assert.doesNotMatch(cmd, /'\/bin\/zsh' -lc\b/);
906
+ assert.doesNotMatch(cmd, /source ~\/\.zshrc/);
907
+ assert.match(cmd, /exec .*codex/);
908
+ }
909
+ finally {
910
+ if (typeof prevShell === 'string')
911
+ process.env.SHELL = prevShell;
912
+ else
913
+ delete process.env.SHELL;
914
+ if (typeof prevBypass === 'string')
915
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
916
+ else
917
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
918
+ }
919
+ });
920
+ it('accepts Homebrew zsh as a supported worker shell without falling back', () => {
921
+ const prevShell = process.env.SHELL;
922
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
923
+ process.env.SHELL = '/opt/homebrew/bin/zsh';
924
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
925
+ try {
926
+ const cmd = withMockedExistsSync((candidate) => candidate === '/opt/homebrew/bin/zsh', () => buildWorkerStartupCommand('alpha', 2));
927
+ assert.match(cmd, /'\/opt\/homebrew\/bin\/zsh' -c/);
928
+ assert.doesNotMatch(cmd, /'\/bin\/sh' -c/);
929
+ assert.doesNotMatch(cmd, /source ~\/\.zshrc/);
930
+ }
931
+ finally {
932
+ if (typeof prevShell === 'string')
933
+ process.env.SHELL = prevShell;
934
+ else
935
+ delete process.env.SHELL;
936
+ if (typeof prevBypass === 'string')
937
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
938
+ else
939
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
940
+ }
941
+ });
942
+ it('accepts MacPorts zsh as a supported worker shell without falling back', () => {
943
+ const prevShell = process.env.SHELL;
944
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
945
+ process.env.SHELL = '/opt/local/bin/zsh';
946
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
947
+ try {
948
+ const cmd = withMockedExistsSync((candidate) => candidate === '/opt/local/bin/zsh', () => buildWorkerStartupCommand('alpha', 2));
949
+ assert.match(cmd, /'\/opt\/local\/bin\/zsh' -c/);
950
+ assert.doesNotMatch(cmd, /'\/bin\/sh' -c/);
951
+ assert.doesNotMatch(cmd, /source ~\/\.zshrc/);
952
+ }
953
+ finally {
954
+ if (typeof prevShell === 'string')
955
+ process.env.SHELL = prevShell;
956
+ else
957
+ delete process.env.SHELL;
958
+ if (typeof prevBypass === 'string')
959
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
960
+ else
961
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
962
+ }
963
+ });
964
+ it('prevents issue #2358 bash rc fan-out by default and preserves launch args', () => {
965
+ const prevShell = process.env.SHELL;
966
+ process.env.SHELL = '/bin/bash';
967
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
968
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
969
+ try {
970
+ const cmd = buildWorkerStartupCommand('alpha', 1, ['--model', 'gpt-5']);
971
+ assert.doesNotMatch(cmd, /source ~\/\.bashrc/);
972
+ assert.match(cmd, /exec .*codex/);
973
+ assert.match(cmd, /--model/);
974
+ assert.match(cmd, /gpt-5/);
975
+ }
976
+ finally {
977
+ if (typeof prevShell === 'string')
978
+ process.env.SHELL = prevShell;
979
+ else
980
+ delete process.env.SHELL;
981
+ if (typeof prevBypass === 'string')
982
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
983
+ else
984
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
985
+ }
986
+ });
987
+ it('sources worker shell rc files only when explicitly opted in', () => {
988
+ const prevShell = process.env.SHELL;
989
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
990
+ const prevSourceRc = process.env.OMX_TMUX_SOURCE_SHELL_RC;
991
+ process.env.SHELL = '/bin/bash';
992
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
993
+ try {
994
+ delete process.env.OMX_TMUX_SOURCE_SHELL_RC;
995
+ assert.equal(shouldSourceTeamWorkerShellRc(process.env), false);
996
+ assert.doesNotMatch(buildWorkerStartupCommand('alpha', 1, ['--model', 'gpt-5']), /source ~\/\.bashrc/);
997
+ process.env.OMX_TMUX_SOURCE_SHELL_RC = '1';
998
+ assert.equal(shouldSourceTeamWorkerShellRc(process.env), true);
999
+ assert.match(buildWorkerStartupCommand('alpha', 1, ['--model', 'gpt-5']), /source ~\/\.bashrc/);
1000
+ delete process.env.OMX_TMUX_SOURCE_SHELL_RC;
1001
+ assert.match(buildWorkerStartupCommand('alpha', 1, ['--model', 'gpt-5'], process.cwd(), { OMX_TMUX_SOURCE_SHELL_RC: '1' }), /source ~\/\.bashrc/, 'per-worker explicit opt-in should be honored');
1002
+ }
1003
+ finally {
1004
+ if (typeof prevShell === 'string')
1005
+ process.env.SHELL = prevShell;
1006
+ else
1007
+ delete process.env.SHELL;
1008
+ if (typeof prevBypass === 'string')
1009
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
1010
+ else
1011
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1012
+ if (typeof prevSourceRc === 'string')
1013
+ process.env.OMX_TMUX_SOURCE_SHELL_RC = prevSourceRc;
1014
+ else
1015
+ delete process.env.OMX_TMUX_SOURCE_SHELL_RC;
1016
+ }
1017
+ });
1018
+ it('injects canonical team state env vars when provided', () => {
1019
+ const prevShell = process.env.SHELL;
1020
+ process.env.SHELL = '/bin/bash';
1021
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1022
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
1023
+ try {
1024
+ const cmd = buildWorkerStartupCommand('alpha', 1, [], '/tmp/worker-cwd', {
1025
+ OMX_TEAM_STATE_ROOT: '/tmp/leader/.omx/state',
1026
+ OMX_TEAM_LEADER_CWD: '/tmp/leader',
1027
+ });
1028
+ assert.match(cmd, /OMX_TEAM_STATE_ROOT=\/tmp\/leader\/\.omx\/state/);
1029
+ assert.match(cmd, /OMX_TEAM_LEADER_CWD=\/tmp\/leader/);
1030
+ }
1031
+ finally {
1032
+ if (typeof prevShell === 'string')
1033
+ process.env.SHELL = prevShell;
1034
+ else
1035
+ delete process.env.SHELL;
1036
+ if (typeof prevBypass === 'string')
1037
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
1038
+ else
1039
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1040
+ }
1041
+ });
1042
+ it('does not use startup scripts on win32/MSYS so existing tmux path translation remains in force', () => {
1043
+ const originalPlatform = Object.getOwnPropertyDescriptor(process, 'platform');
1044
+ const prevMsystem = process.env.MSYSTEM;
1045
+ try {
1046
+ Object.defineProperty(process, 'platform', { value: 'win32', configurable: true });
1047
+ process.env.MSYSTEM = 'MINGW64';
1048
+ assert.equal(writeWorkerStartupScriptCommand('alpha', 1, ['--model', 'gpt-5'], 'C:\\repo', { OMX_TEAM_STATE_ROOT: 'C:\\repo\\.omx\\state' }), null);
1049
+ }
1050
+ finally {
1051
+ if (originalPlatform)
1052
+ Object.defineProperty(process, 'platform', originalPlatform);
1053
+ if (typeof prevMsystem === 'string')
1054
+ process.env.MSYSTEM = prevMsystem;
1055
+ else
1056
+ delete process.env.MSYSTEM;
1057
+ }
1058
+ });
1059
+ it('writes a short worker startup script under team runtime state when available', async () => {
1060
+ const wd = await mkdtemp(join(tmpdir(), 'omx-worker-startup-script-'));
1061
+ const stateRoot = join(wd, '.omx', 'state');
1062
+ const prevShell = process.env.SHELL;
1063
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1064
+ const prevHudOwner = process.env.OMX_TMUX_HUD_OWNER;
1065
+ const prevHudLeaderPane = process.env.OMX_TMUX_HUD_LEADER_PANE;
1066
+ process.env.SHELL = '/bin/bash';
1067
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
1068
+ process.env.OMX_TMUX_HUD_OWNER = '1';
1069
+ process.env.OMX_TMUX_HUD_LEADER_PANE = '%leader';
1070
+ try {
1071
+ const cmd = writeWorkerStartupScriptCommand('alpha', 1, ['--model', 'gpt-5'], wd, {
1072
+ OMX_TEAM_STATE_ROOT: stateRoot,
1073
+ OMX_TEAM_LEADER_CWD: wd,
1074
+ OMX_TMUX_HUD_OWNER: '1',
1075
+ OMX_TMUX_HUD_LEADER_PANE: '%leader',
1076
+ }, 'gemini');
1077
+ assert.equal(cmd, `exec /bin/sh '${stateRoot}/team/alpha/runtime/worker-1-startup.sh'`);
1078
+ const script = await readFile(join(stateRoot, 'team', 'alpha', 'runtime', 'worker-1-startup.sh'), 'utf-8');
1079
+ assert.match(script, /^#!\/bin\/sh/m);
1080
+ assert.match(script, new RegExp(`cd '${wd.replace(/'/g, `'\\\\''`)}'`));
1081
+ assert.match(script, /^unset OMX_TMUX_HUD_OWNER OMX_TMUX_HUD_LEADER_PANE$/m);
1082
+ assert.match(script, /export OMX_TEAM_STATE_ROOT=/);
1083
+ assert.doesNotMatch(script, /^export OMX_TMUX_HUD_OWNER=/m);
1084
+ assert.doesNotMatch(script, /^export OMX_TMUX_HUD_LEADER_PANE=/m);
1085
+ assert.match(script, /exec '\/bin\/bash' -c /);
1086
+ assert.doesNotMatch(cmd ?? '', /OMX_TEAM_STATE_ROOT=/, 'tmux command should point at script instead of inlining env');
1087
+ }
1088
+ finally {
1089
+ if (typeof prevShell === 'string')
1090
+ process.env.SHELL = prevShell;
1091
+ else
1092
+ delete process.env.SHELL;
1093
+ if (typeof prevBypass === 'string')
1094
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
1095
+ else
1096
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1097
+ if (typeof prevHudOwner === 'string')
1098
+ process.env.OMX_TMUX_HUD_OWNER = prevHudOwner;
1099
+ else
1100
+ delete process.env.OMX_TMUX_HUD_OWNER;
1101
+ if (typeof prevHudLeaderPane === 'string')
1102
+ process.env.OMX_TMUX_HUD_LEADER_PANE = prevHudLeaderPane;
1103
+ else
1104
+ delete process.env.OMX_TMUX_HUD_LEADER_PANE;
1105
+ await rm(wd, { recursive: true, force: true });
1106
+ }
1107
+ });
1108
+ it('trusts worktree .mise.toml before worker launch when mise is available', async () => {
1109
+ const wd = await mkdtemp(join(tmpdir(), 'omx-worker-mise-trust-'));
1110
+ const fakeBin = join(wd, 'bin');
1111
+ const logPath = join(wd, 'mise.log');
1112
+ const previousPath = process.env.PATH;
1113
+ try {
1114
+ await mkdir(fakeBin, { recursive: true });
1115
+ await writeFile(join(wd, '.mise.toml'), '[tools]\nnode = "latest"\n');
1116
+ await writeFile(join(fakeBin, 'mise'), `#!/bin/sh\nprintf '%s\\n' "$*" >> '${logPath}'\nexit 0\n`);
1117
+ await chmod(join(fakeBin, 'mise'), 0o755);
1118
+ process.env.PATH = `${fakeBin}:${previousPath ?? ''}`;
1119
+ assert.equal(trustWorkerMiseConfigIfAvailable(wd), true);
1120
+ assert.match(await readFile(logPath, 'utf-8'), new RegExp(`trust --yes ${wd.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\/\\.mise\\.toml`));
1121
+ }
1122
+ finally {
1123
+ if (typeof previousPath === 'string')
1124
+ process.env.PATH = previousPath;
1125
+ else
1126
+ delete process.env.PATH;
1127
+ await rm(wd, { recursive: true, force: true });
1128
+ }
1129
+ });
1130
+ it('fails soft when .mise.toml exists but mise is unavailable', async () => {
1131
+ const wd = await mkdtemp(join(tmpdir(), 'omx-worker-mise-missing-'));
1132
+ try {
1133
+ await writeFile(join(wd, '.mise.toml'), '[tools]\nnode = "latest"\n');
1134
+ withEmptyPath(() => {
1135
+ assert.equal(trustWorkerMiseConfigIfAvailable(wd), false);
1136
+ });
1137
+ }
1138
+ finally {
1139
+ await rm(wd, { recursive: true, force: true });
1140
+ }
1141
+ });
1142
+ it('inherits only allowlisted ambient proxy env vars for tmux startup commands', () => {
1143
+ const prevShell = process.env.SHELL;
1144
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1145
+ const prevHttpsProxy = process.env.HTTPS_PROXY;
1146
+ const prevHttpProxy = process.env.HTTP_PROXY;
1147
+ const prevNoProxy = process.env.NO_PROXY;
1148
+ const prevLowerHttpsProxy = process.env.https_proxy;
1149
+ const prevCustom = process.env.AWS_SECRET_ACCESS_KEY;
1150
+ process.env.SHELL = '/bin/bash';
1151
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
1152
+ process.env.HTTPS_PROXY = 'https://upper-proxy.example:443';
1153
+ process.env.HTTP_PROXY = 'http://upper-proxy.example:80';
1154
+ process.env.NO_PROXY = 'localhost,127.0.0.1';
1155
+ process.env.https_proxy = 'https://lower-proxy.example:443';
1156
+ process.env.AWS_SECRET_ACCESS_KEY = 'should-not-inherit';
1157
+ try {
1158
+ const cmd = buildWorkerStartupCommand('alpha', 1, [], '/tmp/project');
1159
+ assert.match(cmd, /HTTPS_PROXY=https:\/\/upper-proxy\.example:443/);
1160
+ assert.match(cmd, /HTTP_PROXY=http:\/\/upper-proxy\.example:80/);
1161
+ assert.match(cmd, /NO_PROXY=localhost,127\.0\.0\.1/);
1162
+ assert.match(cmd, /https_proxy=https:\/\/lower-proxy\.example:443/);
1163
+ assert.doesNotMatch(cmd, /AWS_SECRET_ACCESS_KEY=should-not-inherit/);
1164
+ }
1165
+ finally {
1166
+ if (typeof prevShell === 'string')
1167
+ process.env.SHELL = prevShell;
1168
+ else
1169
+ delete process.env.SHELL;
1170
+ if (typeof prevBypass === 'string')
1171
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
1172
+ else
1173
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1174
+ if (typeof prevHttpsProxy === 'string')
1175
+ process.env.HTTPS_PROXY = prevHttpsProxy;
1176
+ else
1177
+ delete process.env.HTTPS_PROXY;
1178
+ if (typeof prevHttpProxy === 'string')
1179
+ process.env.HTTP_PROXY = prevHttpProxy;
1180
+ else
1181
+ delete process.env.HTTP_PROXY;
1182
+ if (typeof prevNoProxy === 'string')
1183
+ process.env.NO_PROXY = prevNoProxy;
1184
+ else
1185
+ delete process.env.NO_PROXY;
1186
+ if (typeof prevLowerHttpsProxy === 'string')
1187
+ process.env.https_proxy = prevLowerHttpsProxy;
1188
+ else
1189
+ delete process.env.https_proxy;
1190
+ if (typeof prevCustom === 'string')
1191
+ process.env.AWS_SECRET_ACCESS_KEY = prevCustom;
1192
+ else
1193
+ delete process.env.AWS_SECRET_ACCESS_KEY;
1194
+ }
1195
+ });
1196
+ it('preserves explicit worker env precedence over inherited ambient proxy vars', () => {
1197
+ const prevShell = process.env.SHELL;
1198
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1199
+ const prevHttpsProxy = process.env.HTTPS_PROXY;
1200
+ process.env.SHELL = '/bin/bash';
1201
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
1202
+ process.env.HTTPS_PROXY = 'https://ambient-proxy.example:443';
1203
+ try {
1204
+ const cmd = buildWorkerStartupCommand('alpha', 1, [], '/tmp/project', { HTTPS_PROXY: 'https://explicit-proxy.example:8443' });
1205
+ assert.match(cmd, /HTTPS_PROXY=https:\/\/explicit-proxy\.example:8443/);
1206
+ assert.doesNotMatch(cmd, /HTTPS_PROXY=https:\/\/ambient-proxy\.example:443/);
1207
+ }
1208
+ finally {
1209
+ if (typeof prevShell === 'string')
1210
+ process.env.SHELL = prevShell;
1211
+ else
1212
+ delete process.env.SHELL;
1213
+ if (typeof prevBypass === 'string')
1214
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
1215
+ else
1216
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1217
+ if (typeof prevHttpsProxy === 'string')
1218
+ process.env.HTTPS_PROXY = prevHttpsProxy;
1219
+ else
1220
+ delete process.env.HTTPS_PROXY;
1221
+ }
1222
+ });
1223
+ it('resolves POSIX leader paths before building fish worker startup commands', async () => {
1224
+ const fakeBin = await mkdtemp(join(tmpdir(), 'omx-worker-startup-posix-'));
1225
+ const prevPath = process.env.PATH;
1226
+ const prevShell = process.env.SHELL;
1227
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1228
+ process.env.PATH = fakeBin;
1229
+ process.env.SHELL = '/bin/fish';
1230
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
1231
+ try {
1232
+ const nodePath = join(fakeBin, 'node');
1233
+ const codexPath = join(fakeBin, 'codex');
1234
+ await writeFile(nodePath, '#!/bin/sh\n');
1235
+ await writeFile(codexPath, '#!/bin/sh\n');
1236
+ await chmod(nodePath, 0o755);
1237
+ await chmod(codexPath, 0o755);
1238
+ const { buildWorkerStartupCommand: buildFreshWorkerStartupCommand } = await import(`../tmux-session.js?posix-path=${Date.now()}`);
1239
+ const cmd = buildFreshWorkerStartupCommand('alpha', 1, ['-c', 'model_reasoning_effort="low"'], process.cwd(), {}, 'codex');
1240
+ assert.match(cmd, new RegExp(escapeRegExp(`OMX_LEADER_NODE_PATH=${nodePath}`)));
1241
+ assert.match(cmd, new RegExp(escapeRegExp(`OMX_LEADER_CLI_PATH=${codexPath}`)));
1242
+ assert.match(cmd, new RegExp(escapeRegExp(`export PATH='\\''${fakeBin}'\\'':$PATH; exec '\\''${codexPath}'\\''`)));
1243
+ assert.doesNotMatch(cmd, /export PATH='\\''node'\\'':\$PATH/);
1244
+ assert.doesNotMatch(cmd, / exec codex(?:\s|')/);
1245
+ }
1246
+ finally {
1247
+ if (typeof prevPath === 'string')
1248
+ process.env.PATH = prevPath;
1249
+ else
1250
+ delete process.env.PATH;
1251
+ if (typeof prevShell === 'string')
1252
+ process.env.SHELL = prevShell;
1253
+ else
1254
+ delete process.env.SHELL;
1255
+ if (typeof prevBypass === 'string')
1256
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
1257
+ else
1258
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1259
+ await rm(fakeBin, { recursive: true, force: true });
1260
+ }
1261
+ });
1262
+ it('inherits bypass flag from process argv once', () => {
1263
+ const prevArgv = process.argv;
1264
+ const prevShell = process.env.SHELL;
1265
+ process.env.SHELL = '/bin/bash';
1266
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1267
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
1268
+ process.argv = [...prevArgv, '--dangerously-bypass-approvals-and-sandbox'];
1269
+ try {
1270
+ const cmd = buildWorkerStartupCommand('alpha', 1, ['--dangerously-bypass-approvals-and-sandbox']);
1271
+ const matches = cmd.match(/--dangerously-bypass-approvals-and-sandbox/g) || [];
1272
+ assert.equal(matches.length, 1);
1273
+ }
1274
+ finally {
1275
+ process.argv = prevArgv;
1276
+ if (typeof prevShell === 'string')
1277
+ process.env.SHELL = prevShell;
1278
+ else
1279
+ delete process.env.SHELL;
1280
+ if (typeof prevBypass === 'string')
1281
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
1282
+ else
1283
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1284
+ }
1285
+ });
1286
+ it('maps --madmax to bypass flag in worker command', () => {
1287
+ const prevArgv = process.argv;
1288
+ const prevShell = process.env.SHELL;
1289
+ process.env.SHELL = '/bin/bash';
1290
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1291
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
1292
+ process.argv = [...prevArgv, '--madmax'];
1293
+ try {
1294
+ const cmd = buildWorkerStartupCommand('alpha', 1);
1295
+ const matches = cmd.match(/--dangerously-bypass-approvals-and-sandbox/g) || [];
1296
+ assert.equal(matches.length, 1);
1297
+ }
1298
+ finally {
1299
+ process.argv = prevArgv;
1300
+ if (typeof prevShell === 'string')
1301
+ process.env.SHELL = prevShell;
1302
+ else
1303
+ delete process.env.SHELL;
1304
+ if (typeof prevBypass === 'string')
1305
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
1306
+ else
1307
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1308
+ }
1309
+ });
1310
+ it('preserves reasoning override args in worker command', () => {
1311
+ const prevShell = process.env.SHELL;
1312
+ process.env.SHELL = '/bin/bash';
1313
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1314
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
1315
+ try {
1316
+ const cmd = buildWorkerStartupCommand('alpha', 1, ['-c', 'model_reasoning_effort="xhigh"']);
1317
+ assert.match(cmd, /exec .*codex/);
1318
+ assert.match(cmd, /'-c'/);
1319
+ assert.match(cmd, /'model_reasoning_effort=\"xhigh\"'/);
1320
+ }
1321
+ finally {
1322
+ if (typeof prevShell === 'string')
1323
+ process.env.SHELL = prevShell;
1324
+ else
1325
+ delete process.env.SHELL;
1326
+ if (typeof prevBypass === 'string')
1327
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
1328
+ else
1329
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1330
+ }
1331
+ });
1332
+ it('forces codex bypass under explicit launch-arg profiles', () => {
1333
+ const prevShell = process.env.SHELL;
1334
+ process.env.SHELL = '/bin/bash';
1335
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1336
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
1337
+ try {
1338
+ const profiles = [
1339
+ ['--model', 'gpt-5', '-c', 'model_reasoning_effort="high"'],
1340
+ ['--model', 'gpt-5.3-codex-spark', '-c', 'model_reasoning_effort="low"'],
1341
+ ];
1342
+ for (const launchArgs of profiles) {
1343
+ const cmd = buildWorkerStartupCommand('alpha', 1, launchArgs, process.cwd(), {}, 'codex');
1344
+ assert.match(cmd, /exec .*codex/);
1345
+ assert.equal((cmd.match(/--dangerously-bypass-approvals-and-sandbox/g) || []).length, 1);
1346
+ assert.match(cmd, /--model/);
1347
+ assert.match(cmd, new RegExp(launchArgs[1].replace(/[.*+?^${}()|[\]\\]/g, '\\$&')));
1348
+ assert.match(cmd, new RegExp(launchArgs[3].replace(/[.*+?^${}()|[\]\\]/g, '\\$&')));
1349
+ }
1350
+ }
1351
+ finally {
1352
+ if (typeof prevShell === 'string')
1353
+ process.env.SHELL = prevShell;
1354
+ else
1355
+ delete process.env.SHELL;
1356
+ if (typeof prevBypass === 'string')
1357
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
1358
+ else
1359
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1360
+ }
1361
+ });
1362
+ it('supports worker-specific reasoning overrides for codex and strips them for claude workers', () => {
1363
+ const prevShell = process.env.SHELL;
1364
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1365
+ process.env.SHELL = '/bin/bash';
1366
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
1367
+ try {
1368
+ const codexCmd = buildWorkerStartupCommand('alpha', 1, ['-c', 'model_reasoning_effort="low"'], process.cwd(), {}, 'codex');
1369
+ const claudeCmd = buildWorkerStartupCommand('alpha', 2, ['-c', 'model_reasoning_effort="high"'], process.cwd(), {}, 'claude');
1370
+ assert.match(codexCmd, /exec .*codex/);
1371
+ assert.match(codexCmd, /'model_reasoning_effort="low"'/);
1372
+ assert.match(claudeCmd, /exec .*claude/);
1373
+ assert.equal((claudeCmd.match(/--dangerously-skip-permissions/g) || []).length, 1);
1374
+ assert.doesNotMatch(claudeCmd, /model_reasoning_effort/);
1375
+ }
1376
+ finally {
1377
+ if (typeof prevShell === 'string')
1378
+ process.env.SHELL = prevShell;
1379
+ else
1380
+ delete process.env.SHELL;
1381
+ if (typeof prevBypass === 'string')
1382
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
1383
+ else
1384
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1385
+ }
1386
+ });
1387
+ it('injects model_instructions_file override by default', () => {
1388
+ const prevShell = process.env.SHELL;
1389
+ process.env.SHELL = '/bin/bash';
1390
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1391
+ const prevInstr = process.env.OMX_MODEL_INSTRUCTIONS_FILE;
1392
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT; // default enabled
1393
+ delete process.env.OMX_MODEL_INSTRUCTIONS_FILE;
1394
+ try {
1395
+ const cmd = buildWorkerStartupCommand('alpha', 1, [], '/tmp/project');
1396
+ assert.match(cmd, /'-c'/);
1397
+ assert.match(cmd, /model_instructions_file=/);
1398
+ assert.match(cmd, /AGENTS\.md/);
1399
+ }
1400
+ finally {
1401
+ if (typeof prevShell === 'string')
1402
+ process.env.SHELL = prevShell;
1403
+ else
1404
+ delete process.env.SHELL;
1405
+ if (typeof prevBypass === 'string')
1406
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
1407
+ else
1408
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1409
+ if (typeof prevInstr === 'string')
1410
+ process.env.OMX_MODEL_INSTRUCTIONS_FILE = prevInstr;
1411
+ else
1412
+ delete process.env.OMX_MODEL_INSTRUCTIONS_FILE;
1413
+ }
1414
+ });
1415
+ it('uses per-worker OMX_MODEL_INSTRUCTIONS_FILE from extraEnv when building process launch spec', () => {
1416
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1417
+ const prevInstr = process.env.OMX_MODEL_INSTRUCTIONS_FILE;
1418
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1419
+ delete process.env.OMX_MODEL_INSTRUCTIONS_FILE;
1420
+ try {
1421
+ const spec = buildWorkerProcessLaunchSpec('alpha', 1, ['-c', 'model_reasoning_effort="low"'], '/tmp/project', { OMX_MODEL_INSTRUCTIONS_FILE: '/tmp/project/.omx/state/team/alpha/workers/worker-1/AGENTS.md' }, 'codex');
1422
+ const joined = spec.args.join(' ');
1423
+ assert.match(joined, /model_reasoning_effort="low"/);
1424
+ assert.match(joined, /model_instructions_file="\/tmp\/project\/.omx\/state\/team\/alpha\/workers\/worker-1\/AGENTS\.md"/);
1425
+ }
1426
+ finally {
1427
+ if (typeof prevBypass === 'string')
1428
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
1429
+ else
1430
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1431
+ if (typeof prevInstr === 'string')
1432
+ process.env.OMX_MODEL_INSTRUCTIONS_FILE = prevInstr;
1433
+ else
1434
+ delete process.env.OMX_MODEL_INSTRUCTIONS_FILE;
1435
+ }
1436
+ });
1437
+ it('does not synthesize absent first-party OMX MCP server tables for Codex team workers', async () => {
1438
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1439
+ const prevCompat = process.env.OMX_TEAM_WORKER_MCP_COMPAT;
1440
+ const prevCodexHome = process.env.CODEX_HOME;
1441
+ const codexHome = await mkdtemp(join(tmpdir(), 'omx-team-no-mcp-config-'));
1442
+ try {
1443
+ await writeFile(join(codexHome, 'config.toml'), '[mcp_servers.gitnexus]\ncommand = "gitnexus"\n');
1444
+ process.env.CODEX_HOME = codexHome;
1445
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
1446
+ delete process.env.OMX_TEAM_WORKER_MCP_COMPAT;
1447
+ const cmd = buildWorkerStartupCommand('alpha', 1, [], '/tmp/project', {}, 'codex');
1448
+ for (const server of ['omx_state', 'omx_memory', 'omx_code_intel', 'omx_trace', 'omx_wiki', 'omx_hermes']) {
1449
+ assert.doesNotMatch(cmd, new RegExp(`mcp_servers\\.${server}\\.enabled=false`));
1450
+ }
1451
+ }
1452
+ finally {
1453
+ await rm(codexHome, { recursive: true, force: true });
1454
+ if (typeof prevBypass === 'string')
1455
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
1456
+ else
1457
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1458
+ if (typeof prevCompat === 'string')
1459
+ process.env.OMX_TEAM_WORKER_MCP_COMPAT = prevCompat;
1460
+ else
1461
+ delete process.env.OMX_TEAM_WORKER_MCP_COMPAT;
1462
+ if (typeof prevCodexHome === 'string')
1463
+ process.env.CODEX_HOME = prevCodexHome;
1464
+ else
1465
+ delete process.env.CODEX_HOME;
1466
+ }
1467
+ });
1468
+ it('disables configured first-party OMX MCP compatibility servers for Codex team workers by default', async () => {
1469
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1470
+ const prevCompat = process.env.OMX_TEAM_WORKER_MCP_COMPAT;
1471
+ const prevCodexHome = process.env.CODEX_HOME;
1472
+ const codexHome = await mkdtemp(join(tmpdir(), 'omx-team-mcp-config-'));
1473
+ try {
1474
+ await writeFile(join(codexHome, 'config.toml'), ['omx_state', 'omx_memory', 'omx_code_intel', 'omx_trace', 'omx_wiki', 'omx_hermes']
1475
+ .map((server) => `[mcp_servers.${server}]\ncommand = "omx"\nargs = ["mcp-serve", "${server}"]\n`)
1476
+ .join('\n'));
1477
+ process.env.CODEX_HOME = codexHome;
1478
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
1479
+ delete process.env.OMX_TEAM_WORKER_MCP_COMPAT;
1480
+ const cmd = buildWorkerStartupCommand('alpha', 1, [], '/tmp/project', {}, 'codex');
1481
+ for (const server of ['omx_state', 'omx_memory', 'omx_code_intel', 'omx_trace', 'omx_wiki', 'omx_hermes']) {
1482
+ assert.match(cmd, new RegExp(`mcp_servers\\.${server}\\.enabled=false`));
1483
+ }
1484
+ }
1485
+ finally {
1486
+ await rm(codexHome, { recursive: true, force: true });
1487
+ if (typeof prevBypass === 'string')
1488
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
1489
+ else
1490
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1491
+ if (typeof prevCompat === 'string')
1492
+ process.env.OMX_TEAM_WORKER_MCP_COMPAT = prevCompat;
1493
+ else
1494
+ delete process.env.OMX_TEAM_WORKER_MCP_COMPAT;
1495
+ if (typeof prevCodexHome === 'string')
1496
+ process.env.CODEX_HOME = prevCodexHome;
1497
+ else
1498
+ delete process.env.CODEX_HOME;
1499
+ }
1500
+ });
1501
+ it('preserves explicit team-worker MCP compatibility opt-in', async () => {
1502
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1503
+ const prevCompat = process.env.OMX_TEAM_WORKER_MCP_COMPAT;
1504
+ const prevCodexHome = process.env.CODEX_HOME;
1505
+ const codexHome = await mkdtemp(join(tmpdir(), 'omx-team-mcp-compat-'));
1506
+ try {
1507
+ await writeFile(join(codexHome, 'config.toml'), '[mcp_servers.omx_state]\ncommand = "omx"\n');
1508
+ process.env.CODEX_HOME = codexHome;
1509
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
1510
+ process.env.OMX_TEAM_WORKER_MCP_COMPAT = '1';
1511
+ const cmd = buildWorkerStartupCommand('alpha', 1, [], '/tmp/project', {}, 'codex');
1512
+ assert.doesNotMatch(cmd, /mcp_servers\.omx_state\.enabled=false/);
1513
+ }
1514
+ finally {
1515
+ await rm(codexHome, { recursive: true, force: true });
1516
+ if (typeof prevBypass === 'string')
1517
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
1518
+ else
1519
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1520
+ if (typeof prevCompat === 'string')
1521
+ process.env.OMX_TEAM_WORKER_MCP_COMPAT = prevCompat;
1522
+ else
1523
+ delete process.env.OMX_TEAM_WORKER_MCP_COMPAT;
1524
+ if (typeof prevCodexHome === 'string')
1525
+ process.env.CODEX_HOME = prevCodexHome;
1526
+ else
1527
+ delete process.env.CODEX_HOME;
1528
+ }
1529
+ });
1530
+ it('does not inject model_instructions_file override when disabled', () => {
1531
+ const prevShell = process.env.SHELL;
1532
+ process.env.SHELL = '/bin/bash';
1533
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1534
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
1535
+ try {
1536
+ const cmd = buildWorkerStartupCommand('alpha', 1, [], '/tmp/project');
1537
+ assert.doesNotMatch(cmd, /model_instructions_file=/);
1538
+ }
1539
+ finally {
1540
+ if (typeof prevShell === 'string')
1541
+ process.env.SHELL = prevShell;
1542
+ else
1543
+ delete process.env.SHELL;
1544
+ if (typeof prevBypass === 'string')
1545
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
1546
+ else
1547
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1548
+ }
1549
+ });
1550
+ it('does not inject model_instructions_file when already provided in launch args', () => {
1551
+ const prevShell = process.env.SHELL;
1552
+ process.env.SHELL = '/bin/bash';
1553
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1554
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT; // default enabled
1555
+ try {
1556
+ const cmd = buildWorkerStartupCommand('alpha', 1, ['-c', 'model_instructions_file="/tmp/custom.md"'], '/tmp/project');
1557
+ const matches = cmd.match(/model_instructions_file=/g) || [];
1558
+ assert.equal(matches.length, 1);
1559
+ assert.match(cmd, /custom\.md/);
1560
+ }
1561
+ finally {
1562
+ if (typeof prevShell === 'string')
1563
+ process.env.SHELL = prevShell;
1564
+ else
1565
+ delete process.env.SHELL;
1566
+ if (typeof prevBypass === 'string')
1567
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
1568
+ else
1569
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1570
+ }
1571
+ });
1572
+ it('translates model_instructions_file path for MSYS2/Git Bash environments', () => {
1573
+ const prevShell = process.env.SHELL;
1574
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1575
+ const prevInstructions = process.env.OMX_MODEL_INSTRUCTIONS_FILE;
1576
+ const prevMsystem = process.env.MSYSTEM;
1577
+ const origPlatform = Object.getOwnPropertyDescriptor(process, 'platform');
1578
+ process.env.SHELL = '/bin/bash';
1579
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT; // default enabled
1580
+ process.env.OMX_MODEL_INSTRUCTIONS_FILE = 'C:\\repo\\AGENTS.md';
1581
+ process.env.MSYSTEM = 'MINGW64';
1582
+ Object.defineProperty(process, 'platform', { value: 'win32', configurable: true });
1583
+ try {
1584
+ const cmd = buildWorkerStartupCommand('alpha', 1, [], 'C:\\repo');
1585
+ assert.match(cmd, /model_instructions_file=\"\/c\/repo\/AGENTS\.md\"/);
1586
+ }
1587
+ finally {
1588
+ if (origPlatform)
1589
+ Object.defineProperty(process, 'platform', origPlatform);
1590
+ if (typeof prevShell === 'string')
1591
+ process.env.SHELL = prevShell;
1592
+ else
1593
+ delete process.env.SHELL;
1594
+ if (typeof prevBypass === 'string')
1595
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
1596
+ else
1597
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1598
+ if (typeof prevInstructions === 'string')
1599
+ process.env.OMX_MODEL_INSTRUCTIONS_FILE = prevInstructions;
1600
+ else
1601
+ delete process.env.OMX_MODEL_INSTRUCTIONS_FILE;
1602
+ if (typeof prevMsystem === 'string')
1603
+ process.env.MSYSTEM = prevMsystem;
1604
+ else
1605
+ delete process.env.MSYSTEM;
1606
+ }
1607
+ });
1608
+ it('ignores unsupported SHELL values and resolves a supported worker shell', () => {
1609
+ const prevShell = process.env.SHELL;
1610
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1611
+ process.env.SHELL = '/usr/bin/fish';
1612
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
1613
+ try {
1614
+ const cmd = buildWorkerStartupCommand('alpha', 1, [], process.cwd());
1615
+ assert.doesNotMatch(cmd, /fish/, 'worker shell must not inherit unsupported fish SHELL');
1616
+ assert.match(cmd, /\/(?:bin|usr\/bin|usr\/local\/bin|opt\/homebrew\/bin)\/(?:zsh|bash)\b|\/bin\/sh\b/);
1617
+ }
1618
+ finally {
1619
+ if (typeof prevShell === 'string')
1620
+ process.env.SHELL = prevShell;
1621
+ else
1622
+ delete process.env.SHELL;
1623
+ if (typeof prevBypass === 'string')
1624
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
1625
+ else
1626
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1627
+ }
1628
+ });
1629
+ it('never emits fish-style PATH manipulation for unsupported SHELL values', () => {
1630
+ const prevShell = process.env.SHELL;
1631
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1632
+ process.env.SHELL = '/usr/bin/fish';
1633
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
1634
+ try {
1635
+ const cmd = buildWorkerStartupCommand('alpha', 1, [], process.cwd());
1636
+ assert.doesNotMatch(cmd, /set -x PATH/, 'must not emit fish PATH syntax');
1637
+ }
1638
+ finally {
1639
+ if (typeof prevShell === 'string')
1640
+ process.env.SHELL = prevShell;
1641
+ else
1642
+ delete process.env.SHELL;
1643
+ if (typeof prevBypass === 'string')
1644
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
1645
+ else
1646
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1647
+ }
1648
+ });
1649
+ it('uses /bin/sh on MSYS2/Windows regardless of zsh availability', () => {
1650
+ const prevShell = process.env.SHELL;
1651
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1652
+ const prevMsystem = process.env.MSYSTEM;
1653
+ const origPlatform = Object.getOwnPropertyDescriptor(process, 'platform');
1654
+ process.env.SHELL = '/bin/zsh';
1655
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
1656
+ process.env.MSYSTEM = 'MINGW64';
1657
+ Object.defineProperty(process, 'platform', { value: 'win32', configurable: true });
1658
+ try {
1659
+ const cmd = buildWorkerStartupCommand('alpha', 1, [], 'C:\\repo');
1660
+ assert.match(cmd, /\/bin\/sh/, 'must use /bin/sh on MSYS2/Windows');
1661
+ assert.doesNotMatch(cmd, /\/zsh/, 'must not attempt zsh on Windows');
1662
+ assert.doesNotMatch(cmd, /\.zshrc/, 'must not source zshrc on Windows');
1663
+ }
1664
+ finally {
1665
+ if (origPlatform)
1666
+ Object.defineProperty(process, 'platform', origPlatform);
1667
+ if (typeof prevShell === 'string')
1668
+ process.env.SHELL = prevShell;
1669
+ else
1670
+ delete process.env.SHELL;
1671
+ if (typeof prevBypass === 'string')
1672
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
1673
+ else
1674
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1675
+ if (typeof prevMsystem === 'string')
1676
+ process.env.MSYSTEM = prevMsystem;
1677
+ else
1678
+ delete process.env.MSYSTEM;
1679
+ }
1680
+ });
1681
+ it('uses a native PowerShell startup command on native Windows instead of /bin/sh -lc', async () => {
1682
+ const fakeBin = await mkdtemp(join(tmpdir(), 'omx-worker-startup-win32-'));
1683
+ const prevPath = process.env.PATH;
1684
+ const prevPathext = process.env.PATHEXT;
1685
+ const prevShell = process.env.SHELL;
1686
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1687
+ const prevLeaderNodePath = process.env.OMX_LEADER_NODE_PATH;
1688
+ const prevMsystem = process.env.MSYSTEM;
1689
+ const prevOstype = process.env.OSTYPE;
1690
+ const prevWsl = process.env.WSL_DISTRO_NAME;
1691
+ const prevWslInterop = process.env.WSL_INTEROP;
1692
+ const origPlatform = Object.getOwnPropertyDescriptor(process, 'platform');
1693
+ process.env.PATH = fakeBin;
1694
+ process.env.PATHEXT = '.PS1';
1695
+ process.env.SHELL = '/bin/zsh';
1696
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
1697
+ process.env.OMX_LEADER_NODE_PATH = 'C:\\Program Files\\nodejs\\node.exe';
1698
+ delete process.env.MSYSTEM;
1699
+ delete process.env.OSTYPE;
1700
+ delete process.env.WSL_DISTRO_NAME;
1701
+ delete process.env.WSL_INTEROP;
1702
+ Object.defineProperty(process, 'platform', { value: 'win32', configurable: true });
1703
+ try {
1704
+ const codexPs1Path = join(fakeBin, 'codex.ps1');
1705
+ await writeFile(codexPs1Path, '');
1706
+ const cmd = buildWorkerStartupCommand('alpha', 1, ['--model', 'gpt-5'], 'C:\\repo');
1707
+ assert.doesNotMatch(cmd, /\/bin\/sh -lc/, 'native Windows workers must not launch through POSIX sh');
1708
+ assert.match(cmd, /^powershell\.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -EncodedCommand /);
1709
+ const encoded = cmd.replace(/^powershell\.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -EncodedCommand /, '');
1710
+ const decoded = Buffer.from(encoded, 'base64').toString('utf16le');
1711
+ assert.match(decoded, /\$env:PATH = 'C:\\Program Files\\nodejs;' \+ \$env:PATH/);
1712
+ assert.match(decoded, /\$env:OMX_TEAM_WORKER = 'alpha\/worker-1'/);
1713
+ assert.match(decoded, new RegExp(escapeRegExp(`'-File' '${codexPs1Path}'`)));
1714
+ assert.match(decoded, /'--model' 'gpt-5'/);
1715
+ assert.match(decoded, /'--dangerously-bypass-approvals-and-sandbox'/);
1716
+ }
1717
+ finally {
1718
+ if (origPlatform)
1719
+ Object.defineProperty(process, 'platform', origPlatform);
1720
+ if (typeof prevPath === 'string')
1721
+ process.env.PATH = prevPath;
1722
+ else
1723
+ delete process.env.PATH;
1724
+ if (typeof prevPathext === 'string')
1725
+ process.env.PATHEXT = prevPathext;
1726
+ else
1727
+ delete process.env.PATHEXT;
1728
+ if (typeof prevShell === 'string')
1729
+ process.env.SHELL = prevShell;
1730
+ else
1731
+ delete process.env.SHELL;
1732
+ if (typeof prevBypass === 'string')
1733
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
1734
+ else
1735
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1736
+ if (typeof prevLeaderNodePath === 'string')
1737
+ process.env.OMX_LEADER_NODE_PATH = prevLeaderNodePath;
1738
+ else
1739
+ delete process.env.OMX_LEADER_NODE_PATH;
1740
+ if (typeof prevMsystem === 'string')
1741
+ process.env.MSYSTEM = prevMsystem;
1742
+ else
1743
+ delete process.env.MSYSTEM;
1744
+ if (typeof prevOstype === 'string')
1745
+ process.env.OSTYPE = prevOstype;
1746
+ else
1747
+ delete process.env.OSTYPE;
1748
+ if (typeof prevWsl === 'string')
1749
+ process.env.WSL_DISTRO_NAME = prevWsl;
1750
+ else
1751
+ delete process.env.WSL_DISTRO_NAME;
1752
+ if (typeof prevWslInterop === 'string')
1753
+ process.env.WSL_INTEROP = prevWslInterop;
1754
+ else
1755
+ delete process.env.WSL_INTEROP;
1756
+ await rm(fakeBin, { recursive: true, force: true });
1757
+ }
1758
+ });
1759
+ it('uses the resolved PowerShell executable path in native Windows startup commands', async () => {
1760
+ const fakeBin = await mkdtemp(join(tmpdir(), 'omx-worker-startup-win32-powershell-'));
1761
+ const prevPath = process.env.PATH;
1762
+ const prevPathext = process.env.PATHEXT;
1763
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1764
+ const prevLeaderNodePath = process.env.OMX_LEADER_NODE_PATH;
1765
+ const prevMsystem = process.env.MSYSTEM;
1766
+ const prevOstype = process.env.OSTYPE;
1767
+ const prevWsl = process.env.WSL_DISTRO_NAME;
1768
+ const prevWslInterop = process.env.WSL_INTEROP;
1769
+ const origPlatform = Object.getOwnPropertyDescriptor(process, 'platform');
1770
+ process.env.PATH = fakeBin;
1771
+ process.env.PATHEXT = '.EXE;.PS1';
1772
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
1773
+ process.env.OMX_LEADER_NODE_PATH = 'C:\\Program Files\\nodejs\\node.exe';
1774
+ delete process.env.MSYSTEM;
1775
+ delete process.env.OSTYPE;
1776
+ delete process.env.WSL_DISTRO_NAME;
1777
+ delete process.env.WSL_INTEROP;
1778
+ Object.defineProperty(process, 'platform', { value: 'win32', configurable: true });
1779
+ try {
1780
+ const codexPs1Path = join(fakeBin, 'codex.ps1');
1781
+ const powershellExePath = join(fakeBin, 'powershell.exe');
1782
+ await writeFile(codexPs1Path, '');
1783
+ await writeFile(powershellExePath, '');
1784
+ const cmd = buildWorkerStartupCommand('alpha', 1, ['--model', 'gpt-5'], 'C:\\repo');
1785
+ const prefix = `${powershellExePath} -NoLogo -NoProfile -ExecutionPolicy Bypass -EncodedCommand `;
1786
+ assert.ok(cmd.startsWith(prefix), cmd);
1787
+ }
1788
+ finally {
1789
+ if (origPlatform)
1790
+ Object.defineProperty(process, 'platform', origPlatform);
1791
+ if (typeof prevPath === 'string')
1792
+ process.env.PATH = prevPath;
1793
+ else
1794
+ delete process.env.PATH;
1795
+ if (typeof prevPathext === 'string')
1796
+ process.env.PATHEXT = prevPathext;
1797
+ else
1798
+ delete process.env.PATHEXT;
1799
+ if (typeof prevBypass === 'string')
1800
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
1801
+ else
1802
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1803
+ if (typeof prevLeaderNodePath === 'string')
1804
+ process.env.OMX_LEADER_NODE_PATH = prevLeaderNodePath;
1805
+ else
1806
+ delete process.env.OMX_LEADER_NODE_PATH;
1807
+ if (typeof prevMsystem === 'string')
1808
+ process.env.MSYSTEM = prevMsystem;
1809
+ else
1810
+ delete process.env.MSYSTEM;
1811
+ if (typeof prevOstype === 'string')
1812
+ process.env.OSTYPE = prevOstype;
1813
+ else
1814
+ delete process.env.OSTYPE;
1815
+ if (typeof prevWsl === 'string')
1816
+ process.env.WSL_DISTRO_NAME = prevWsl;
1817
+ else
1818
+ delete process.env.WSL_DISTRO_NAME;
1819
+ if (typeof prevWslInterop === 'string')
1820
+ process.env.WSL_INTEROP = prevWslInterop;
1821
+ else
1822
+ delete process.env.WSL_INTEROP;
1823
+ await rm(fakeBin, { recursive: true, force: true });
1824
+ }
1825
+ });
1826
+ it('prefers a no-space native Windows PowerShell path when one is available', async () => {
1827
+ const fakeBin = await mkdtemp(join(tmpdir(), 'omx-worker-startup-win32-nospace-powershell-'));
1828
+ const prevPath = process.env.PATH;
1829
+ const prevPathext = process.env.PATHEXT;
1830
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1831
+ const prevLeaderNodePath = process.env.OMX_LEADER_NODE_PATH;
1832
+ const prevSystemRoot = process.env.SystemRoot;
1833
+ const prevSYSTEMROOT = process.env.SYSTEMROOT;
1834
+ const prevWindir = process.env.windir;
1835
+ const prevWINDIR = process.env.WINDIR;
1836
+ const prevMsystem = process.env.MSYSTEM;
1837
+ const prevOstype = process.env.OSTYPE;
1838
+ const prevWsl = process.env.WSL_DISTRO_NAME;
1839
+ const prevWslInterop = process.env.WSL_INTEROP;
1840
+ const origPlatform = Object.getOwnPropertyDescriptor(process, 'platform');
1841
+ process.env.PATH = fakeBin;
1842
+ process.env.PATHEXT = '.EXE;.PS1';
1843
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
1844
+ process.env.OMX_LEADER_NODE_PATH = 'C:\\Program Files\\nodejs\\node.exe';
1845
+ process.env.SystemRoot = 'C:\\Windows';
1846
+ delete process.env.SYSTEMROOT;
1847
+ delete process.env.windir;
1848
+ delete process.env.WINDIR;
1849
+ delete process.env.MSYSTEM;
1850
+ delete process.env.OSTYPE;
1851
+ delete process.env.WSL_DISTRO_NAME;
1852
+ delete process.env.WSL_INTEROP;
1853
+ Object.defineProperty(process, 'platform', { value: 'win32', configurable: true });
1854
+ try {
1855
+ const codexPs1Path = join(fakeBin, 'codex.ps1');
1856
+ const pathPowerShellExe = join(fakeBin, 'powershell.exe');
1857
+ const windowsPowerShellExe = 'C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe';
1858
+ await writeFile(codexPs1Path, '');
1859
+ await writeFile(pathPowerShellExe, '');
1860
+ const cmd = withMockedExistsSync((candidate) => candidate === windowsPowerShellExe
1861
+ || candidate === pathPowerShellExe
1862
+ || candidate === codexPs1Path, () => buildWorkerStartupCommand('alpha', 1, ['--model', 'gpt-5'], 'C:\\repo'));
1863
+ const prefix = `${windowsPowerShellExe} -NoLogo -NoProfile -ExecutionPolicy Bypass -EncodedCommand `;
1864
+ assert.ok(cmd.startsWith(prefix), cmd);
1865
+ assert.ok(!cmd.startsWith(`${pathPowerShellExe} `), cmd);
1866
+ }
1867
+ finally {
1868
+ if (origPlatform)
1869
+ Object.defineProperty(process, 'platform', origPlatform);
1870
+ if (typeof prevPath === 'string')
1871
+ process.env.PATH = prevPath;
1872
+ else
1873
+ delete process.env.PATH;
1874
+ if (typeof prevPathext === 'string')
1875
+ process.env.PATHEXT = prevPathext;
1876
+ else
1877
+ delete process.env.PATHEXT;
1878
+ if (typeof prevBypass === 'string')
1879
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
1880
+ else
1881
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1882
+ if (typeof prevLeaderNodePath === 'string')
1883
+ process.env.OMX_LEADER_NODE_PATH = prevLeaderNodePath;
1884
+ else
1885
+ delete process.env.OMX_LEADER_NODE_PATH;
1886
+ if (typeof prevSystemRoot === 'string')
1887
+ process.env.SystemRoot = prevSystemRoot;
1888
+ else
1889
+ delete process.env.SystemRoot;
1890
+ if (typeof prevSYSTEMROOT === 'string')
1891
+ process.env.SYSTEMROOT = prevSYSTEMROOT;
1892
+ else
1893
+ delete process.env.SYSTEMROOT;
1894
+ if (typeof prevWindir === 'string')
1895
+ process.env.windir = prevWindir;
1896
+ else
1897
+ delete process.env.windir;
1898
+ if (typeof prevWINDIR === 'string')
1899
+ process.env.WINDIR = prevWINDIR;
1900
+ else
1901
+ delete process.env.WINDIR;
1902
+ if (typeof prevMsystem === 'string')
1903
+ process.env.MSYSTEM = prevMsystem;
1904
+ else
1905
+ delete process.env.MSYSTEM;
1906
+ if (typeof prevOstype === 'string')
1907
+ process.env.OSTYPE = prevOstype;
1908
+ else
1909
+ delete process.env.OSTYPE;
1910
+ if (typeof prevWsl === 'string')
1911
+ process.env.WSL_DISTRO_NAME = prevWsl;
1912
+ else
1913
+ delete process.env.WSL_DISTRO_NAME;
1914
+ if (typeof prevWslInterop === 'string')
1915
+ process.env.WSL_INTEROP = prevWslInterop;
1916
+ else
1917
+ delete process.env.WSL_INTEROP;
1918
+ await rm(fakeBin, { recursive: true, force: true });
1919
+ }
1920
+ });
1921
+ it('uses the resolved node-hosted Codex launcher in native Windows startup commands', async () => {
1922
+ const fakeRoot = await mkdtemp(join(tmpdir(), 'omx-worker-startup-win32-node-hosted-'));
1923
+ const fakeBin = join(fakeRoot, 'node_modules', '.bin');
1924
+ const prevPath = process.env.PATH;
1925
+ const prevPathext = process.env.PATHEXT;
1926
+ const prevShell = process.env.SHELL;
1927
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1928
+ const prevLeaderNodePath = process.env.OMX_LEADER_NODE_PATH;
1929
+ const prevMsystem = process.env.MSYSTEM;
1930
+ const prevOstype = process.env.OSTYPE;
1931
+ const prevWsl = process.env.WSL_DISTRO_NAME;
1932
+ const prevWslInterop = process.env.WSL_INTEROP;
1933
+ const origPlatform = Object.getOwnPropertyDescriptor(process, 'platform');
1934
+ process.env.PATH = fakeBin;
1935
+ process.env.PATHEXT = '.CMD;.PS1';
1936
+ process.env.SHELL = '/bin/zsh';
1937
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
1938
+ process.env.OMX_LEADER_NODE_PATH = 'C:\\Program Files\\nodejs\\node.exe';
1939
+ delete process.env.MSYSTEM;
1940
+ delete process.env.OSTYPE;
1941
+ delete process.env.WSL_DISTRO_NAME;
1942
+ delete process.env.WSL_INTEROP;
1943
+ Object.defineProperty(process, 'platform', { value: 'win32', configurable: true });
1944
+ try {
1945
+ const codexCmdPath = join(fakeBin, 'codex.cmd');
1946
+ const codexJsPath = join(fakeRoot, 'node_modules', '@openai', 'codex', 'bin', 'codex.js');
1947
+ await mkdir(fakeBin, { recursive: true });
1948
+ await mkdir(join(fakeRoot, 'node_modules', '@openai', 'codex', 'bin'), { recursive: true });
1949
+ await writeFile(codexCmdPath, '@echo off\r\n');
1950
+ await writeFile(codexJsPath, '');
1951
+ const cmd = buildWorkerStartupCommand('alpha', 1, ['--model', 'gpt-5'], 'C:\\repo');
1952
+ const prefix = 'powershell.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -EncodedCommand ';
1953
+ assert.ok(cmd.startsWith(prefix));
1954
+ const decoded = Buffer.from(cmd.slice(prefix.length), 'base64').toString('utf16le');
1955
+ assert.match(decoded, new RegExp(escapeRegExp(`$env:OMX_LEADER_CLI_PATH = '${codexJsPath}'`)));
1956
+ assert.match(decoded, new RegExp(escapeRegExp(`& '${process.execPath}' '${codexJsPath}' '--model' 'gpt-5' '--dangerously-bypass-approvals-and-sandbox'`)));
1957
+ assert.doesNotMatch(decoded, new RegExp(escapeRegExp(codexCmdPath)));
1958
+ }
1959
+ finally {
1960
+ if (origPlatform)
1961
+ Object.defineProperty(process, 'platform', origPlatform);
1962
+ if (typeof prevPath === 'string')
1963
+ process.env.PATH = prevPath;
1964
+ else
1965
+ delete process.env.PATH;
1966
+ if (typeof prevPathext === 'string')
1967
+ process.env.PATHEXT = prevPathext;
1968
+ else
1969
+ delete process.env.PATHEXT;
1970
+ if (typeof prevShell === 'string')
1971
+ process.env.SHELL = prevShell;
1972
+ else
1973
+ delete process.env.SHELL;
1974
+ if (typeof prevBypass === 'string')
1975
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
1976
+ else
1977
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
1978
+ if (typeof prevLeaderNodePath === 'string')
1979
+ process.env.OMX_LEADER_NODE_PATH = prevLeaderNodePath;
1980
+ else
1981
+ delete process.env.OMX_LEADER_NODE_PATH;
1982
+ if (typeof prevMsystem === 'string')
1983
+ process.env.MSYSTEM = prevMsystem;
1984
+ else
1985
+ delete process.env.MSYSTEM;
1986
+ if (typeof prevOstype === 'string')
1987
+ process.env.OSTYPE = prevOstype;
1988
+ else
1989
+ delete process.env.OSTYPE;
1990
+ if (typeof prevWsl === 'string')
1991
+ process.env.WSL_DISTRO_NAME = prevWsl;
1992
+ else
1993
+ delete process.env.WSL_DISTRO_NAME;
1994
+ if (typeof prevWslInterop === 'string')
1995
+ process.env.WSL_INTEROP = prevWslInterop;
1996
+ else
1997
+ delete process.env.WSL_INTEROP;
1998
+ await rm(fakeRoot, { recursive: true, force: true });
1999
+ }
2000
+ });
2001
+ it('falls back to bash when SHELL is unsupported and zsh candidates are unavailable', () => {
2002
+ const prevShell = process.env.SHELL;
2003
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
2004
+ process.env.SHELL = '/opt/custom/fish';
2005
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
2006
+ try {
2007
+ const cmd = withMockedExistsSync((candidate) => candidate === '/opt/custom/fish' || candidate === '/bin/bash', () => buildWorkerStartupCommand('alpha', 1, [], process.cwd()));
2008
+ assert.match(cmd, /\/bin\/bash\b/, 'must fall back to bash when zsh is unavailable');
2009
+ assert.doesNotMatch(cmd, /\.bashrc/, 'must not source bash rc file for bash fallback by default');
2010
+ assert.doesNotMatch(cmd, /fish/, 'must not launch unsupported fish shell');
2011
+ }
2012
+ finally {
2013
+ if (typeof prevShell === 'string')
2014
+ process.env.SHELL = prevShell;
2015
+ else
2016
+ delete process.env.SHELL;
2017
+ if (typeof prevBypass === 'string')
2018
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
2019
+ else
2020
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
2021
+ }
2022
+ });
2023
+ it('falls back to /bin/sh when no supported shell candidates exist', () => {
2024
+ const prevShell = process.env.SHELL;
2025
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
2026
+ process.env.SHELL = '/opt/custom/fish';
2027
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
2028
+ try {
2029
+ const cmd = withMockedExistsSync((candidate) => candidate === '/opt/custom/fish', () => buildWorkerStartupCommand('alpha', 1, [], process.cwd()));
2030
+ assert.match(cmd, /'\/bin\/sh' -c\b/, 'must launch workers through /bin/sh when no supported shells exist');
2031
+ assert.doesNotMatch(cmd, /'\/bin\/sh' -lc\b/);
2032
+ assert.doesNotMatch(cmd, /\.zshrc|\.bashrc/, 'must not source zsh/bash rc files for /bin/sh fallback');
2033
+ }
2034
+ finally {
2035
+ if (typeof prevShell === 'string')
2036
+ process.env.SHELL = prevShell;
2037
+ else
2038
+ delete process.env.SHELL;
2039
+ if (typeof prevBypass === 'string')
2040
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
2041
+ else
2042
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
2043
+ }
2044
+ });
2045
+ });
2046
+ describe('team worker CLI helpers', () => {
2047
+ it('resolveTeamWorkerCli auto-detects claude models', () => {
2048
+ assert.equal(resolveTeamWorkerCli(['--model', 'claude-3-7-sonnet'], {}), 'claude');
2049
+ assert.equal(resolveTeamWorkerCli(['--model=claude-sonnet-4-6'], {}), 'claude');
2050
+ assert.equal(resolveTeamWorkerCli(['--model', 'gemini-2.0-pro'], {}), 'gemini');
2051
+ assert.equal(resolveTeamWorkerCli(['--model', 'gpt-5'], {}), 'codex');
2052
+ assert.equal(resolveTeamWorkerCli([], {}), 'codex');
2053
+ });
2054
+ it('resolveTeamWorkerCli accepts explicit gemini override', () => {
2055
+ assert.equal(resolveTeamWorkerCli([], { OMX_TEAM_WORKER_CLI: 'gemini' }), 'gemini');
2056
+ });
2057
+ it('resolveTeamWorkerCliPlan accepts gemini in CLI map', () => {
2058
+ const plan = resolveTeamWorkerCliPlan(3, [], { OMX_TEAM_WORKER_CLI_MAP: 'codex,gemini,claude' });
2059
+ assert.deepEqual(plan, ['codex', 'gemini', 'claude']);
2060
+ });
2061
+ it('translateWorkerLaunchArgsForCli preserves args for codex', () => {
2062
+ const args = ['--model', 'gpt-5', '-c', 'model_reasoning_effort="xhigh"'];
2063
+ assert.deepEqual(translateWorkerLaunchArgsForCli('codex', args), args);
2064
+ });
2065
+ it('translateWorkerLaunchArgsForCli returns only skip-permissions for claude', () => {
2066
+ assert.deepEqual(translateWorkerLaunchArgsForCli('claude', ['-c', 'model_reasoning_effort="xhigh"', '--model', 'claude-3-7-sonnet']), ['--dangerously-skip-permissions']);
2067
+ });
2068
+ it('translateWorkerLaunchArgsForCli keeps read-only claude roles out of skip-permissions mode', () => {
2069
+ assert.deepEqual(translateWorkerLaunchArgsForCli('claude', ['--model', 'claude-3-7-sonnet'], undefined, 'architect'), []);
2070
+ });
2071
+ it('translateWorkerLaunchArgsForCli emits gemini approval-mode by default and adds -i when initial prompt is provided', () => {
2072
+ assert.deepEqual(translateWorkerLaunchArgsForCli('gemini', ['--model', 'gemini-2.0-pro', '--json']), ['--approval-mode', 'yolo', '--model', 'gemini-2.0-pro']);
2073
+ assert.deepEqual(translateWorkerLaunchArgsForCli('gemini', ['--model', 'gemini-2.0-pro', '--json'], 'Read worker inbox'), ['--approval-mode', 'yolo', '-i', 'Read worker inbox', '--model', 'gemini-2.0-pro']);
2074
+ assert.deepEqual(translateWorkerLaunchArgsForCli('gemini', ['--json']), ['--approval-mode', 'yolo']);
2075
+ assert.deepEqual(translateWorkerLaunchArgsForCli('gemini', ['--json'], 'Read worker inbox'), ['--approval-mode', 'yolo', '-i', 'Read worker inbox']);
2076
+ });
2077
+ it('translateWorkerLaunchArgsForCli omits non-gemini default models for gemini workers', () => {
2078
+ assert.deepEqual(translateWorkerLaunchArgsForCli('gemini', ['--model', 'gpt-5.3-codex-spark'], 'Read worker inbox'), ['--approval-mode', 'yolo', '-i', 'Read worker inbox']);
2079
+ });
2080
+ it('translateWorkerLaunchArgsForCli keeps planning/read-only gemini roles out of yolo mode', () => {
2081
+ assert.deepEqual(translateWorkerLaunchArgsForCli('gemini', ['--model', 'gemini-2.0-pro'], 'Read worker inbox', 'planner'), ['-i', 'Read worker inbox', '--model', 'gemini-2.0-pro']);
2082
+ });
2083
+ it('assertTeamWorkerCliBinaryAvailable throws clear error when binary missing', () => {
2084
+ assert.throws(() => assertTeamWorkerCliBinaryAvailable('claude', () => false), /not available on PATH/i);
2085
+ });
2086
+ it('resolveTeamWorkerCliPlan supports mixed per-worker CLI map', () => {
2087
+ const plan = resolveTeamWorkerCliPlan(4, [], { OMX_TEAM_WORKER_CLI_MAP: 'codex,codex,gemini,claude' });
2088
+ assert.deepEqual(plan, ['codex', 'codex', 'gemini', 'claude']);
2089
+ });
2090
+ it('resolveTeamWorkerCliPlan accepts single-value map and expands to all workers', () => {
2091
+ const plan = resolveTeamWorkerCliPlan(3, [], { OMX_TEAM_WORKER_CLI_MAP: 'claude' });
2092
+ assert.deepEqual(plan, ['claude', 'claude', 'claude']);
2093
+ });
2094
+ it('resolveTeamWorkerCliPlan supports auto entries in CLI map', () => {
2095
+ const plan = resolveTeamWorkerCliPlan(2, ['--model', 'claude-3-7-sonnet'], { OMX_TEAM_WORKER_CLI_MAP: 'auto,codex' });
2096
+ assert.deepEqual(plan, ['claude', 'codex']);
2097
+ });
2098
+ it('resolveTeamWorkerCliPlan auto entries ignore OMX_TEAM_WORKER_CLI override', () => {
2099
+ const plan = resolveTeamWorkerCliPlan(1, ['--model', 'claude-3-7-sonnet'], {
2100
+ OMX_TEAM_WORKER_CLI: 'codex',
2101
+ OMX_TEAM_WORKER_CLI_MAP: 'auto',
2102
+ });
2103
+ assert.deepEqual(plan, ['claude']);
2104
+ });
2105
+ it('resolveTeamWorkerCliPlan rejects map lengths that do not match workerCount', () => {
2106
+ assert.throws(() => resolveTeamWorkerCliPlan(4, [], { OMX_TEAM_WORKER_CLI_MAP: 'codex,claude' }), /expected 1 or 4/i);
2107
+ });
2108
+ it('resolveTeamWorkerCliPlan rejects empty entries in CLI map', () => {
2109
+ assert.throws(() => resolveTeamWorkerCliPlan(2, [], { OMX_TEAM_WORKER_CLI_MAP: 'codex,' }), /empty entries are not allowed/i);
2110
+ });
2111
+ it('resolveTeamWorkerCliPlan reports invalid entry errors with OMX_TEAM_WORKER_CLI_MAP', () => {
2112
+ assert.throws(() => resolveTeamWorkerCliPlan(1, [], { OMX_TEAM_WORKER_CLI_MAP: 'claudee' }), /OMX_TEAM_WORKER_CLI_MAP/i);
2113
+ });
2114
+ it('resolveWorkerCliForSend prioritizes explicit worker CLI over map/global', () => {
2115
+ assert.equal(resolveWorkerCliForSend(2, 'claude', [], { OMX_TEAM_WORKER_CLI_MAP: 'codex,codex' }), 'claude');
2116
+ });
2117
+ it('resolveWorkerCliForSend resolves per-worker map entry by index', () => {
2118
+ assert.equal(resolveWorkerCliForSend(2, undefined, [], { OMX_TEAM_WORKER_CLI_MAP: 'codex,claude' }), 'claude');
2119
+ });
2120
+ it('buildWorkerSubmitPlan disables queue-first for claude workers', () => {
2121
+ const plan = buildWorkerSubmitPlan('auto', 'claude', true, true);
2122
+ assert.equal(plan.queueFirstRound, false);
2123
+ assert.equal(plan.submitKeyPressesPerRound, 1);
2124
+ assert.equal(plan.allowAdaptiveRetry, false);
2125
+ });
2126
+ it('buildWorkerSubmitPlan preserves queue-first behavior for busy codex workers', () => {
2127
+ const plan = buildWorkerSubmitPlan('auto', 'codex', true, true);
2128
+ assert.equal(plan.queueFirstRound, true);
2129
+ assert.equal(plan.submitKeyPressesPerRound, 2);
2130
+ assert.equal(plan.allowAdaptiveRetry, true);
2131
+ });
2132
+ });
2133
+ describe('team worker launch mode helpers', () => {
2134
+ it('resolveTeamWorkerLaunchMode defaults to interactive and accepts prompt', () => {
2135
+ assert.equal(resolveTeamWorkerLaunchMode({}), 'interactive');
2136
+ assert.equal(resolveTeamWorkerLaunchMode({ OMX_TEAM_WORKER_LAUNCH_MODE: 'interactive' }), 'interactive');
2137
+ assert.equal(resolveTeamWorkerLaunchMode({ OMX_TEAM_WORKER_LAUNCH_MODE: 'prompt' }), 'prompt');
2138
+ assert.equal(resolveTeamWorkerLaunchMode({ OMX_TEAM_WORKER_LAUNCH_MODE: ' PROMPT ' }), 'prompt');
2139
+ });
2140
+ it('resolveTeamWorkerLaunchMode rejects unsupported values', () => {
2141
+ assert.throws(() => resolveTeamWorkerLaunchMode({ OMX_TEAM_WORKER_LAUNCH_MODE: 'tmux' }), /Invalid OMX_TEAM_WORKER_LAUNCH_MODE value/i);
2142
+ });
2143
+ it('buildWorkerProcessLaunchSpec returns command/args/env for prompt process spawn', () => {
2144
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
2145
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
2146
+ try {
2147
+ const spec = buildWorkerProcessLaunchSpec('alpha-team', 2, ['--model', 'gpt-5.3-codex'], '/tmp/workspace', { OMX_TEAM_STATE_ROOT: '/tmp/workspace/.omx/state' }, 'codex');
2148
+ // command is now the resolved absolute path (or bare binary if which fails)
2149
+ assert.equal(spec.workerCli, 'codex');
2150
+ assert.ok(typeof spec.command === 'string' && spec.command.length > 0, 'command must be a non-empty string');
2151
+ assert.deepEqual(spec.args, ['--model', 'gpt-5.3-codex', '--dangerously-bypass-approvals-and-sandbox']);
2152
+ assert.equal(spec.env.OMX_TEAM_WORKER, 'alpha-team/worker-2');
2153
+ assert.equal(spec.env.OMX_TEAM_STATE_ROOT, '/tmp/workspace/.omx/state');
2154
+ assert.equal(spec.env.OMX_TMUX_HUD_OWNER, undefined);
2155
+ assert.equal(spec.env.OMX_TMUX_HUD_LEADER_PANE, undefined);
2156
+ }
2157
+ finally {
2158
+ if (typeof prevBypass === 'string')
2159
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
2160
+ else
2161
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
2162
+ }
2163
+ });
2164
+ it('buildWorkerProcessLaunchSpec scrubs HUD ownership env from worker launches', () => {
2165
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
2166
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
2167
+ try {
2168
+ const spec = buildWorkerProcessLaunchSpec('alpha-team', 1, [], '/tmp/workspace', {
2169
+ OMX_TEAM_STATE_ROOT: '/tmp/workspace/.omx/state',
2170
+ OMX_TMUX_HUD_OWNER: '1',
2171
+ OMX_TMUX_HUD_LEADER_PANE: '%leader',
2172
+ }, 'codex');
2173
+ assert.equal(spec.env.OMX_TEAM_WORKER, 'alpha-team/worker-1');
2174
+ assert.equal(spec.env.OMX_TEAM_STATE_ROOT, '/tmp/workspace/.omx/state');
2175
+ assert.equal(spec.env.OMX_TMUX_HUD_OWNER, undefined);
2176
+ assert.equal(spec.env.OMX_TMUX_HUD_LEADER_PANE, undefined);
2177
+ }
2178
+ finally {
2179
+ if (typeof prevBypass === 'string')
2180
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
2181
+ else
2182
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
2183
+ }
2184
+ });
2185
+ it('buildWorkerProcessLaunchSpec does not force codex bypass for read-only roles', () => {
2186
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
2187
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
2188
+ try {
2189
+ const spec = buildWorkerProcessLaunchSpec('alpha-team', 2, ['--model', 'gpt-5.3-codex-spark'], '/tmp/workspace', { OMX_TEAM_STATE_ROOT: '/tmp/workspace/.omx/state' }, 'codex', undefined, 'explore');
2190
+ assert.deepEqual(spec.args, ['--model', 'gpt-5.3-codex-spark']);
2191
+ }
2192
+ finally {
2193
+ if (typeof prevBypass === 'string')
2194
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
2195
+ else
2196
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
2197
+ }
2198
+ });
2199
+ it('buildWorkerProcessLaunchSpec includes leader node and CLI path env vars', () => {
2200
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
2201
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
2202
+ try {
2203
+ const spec = buildWorkerProcessLaunchSpec('beta-team', 1, [], '/tmp/workspace', {}, 'codex');
2204
+ assert.ok(typeof spec.env.OMX_LEADER_NODE_PATH === 'string' && spec.env.OMX_LEADER_NODE_PATH.length > 0, 'OMX_LEADER_NODE_PATH must be set');
2205
+ assert.ok(typeof spec.env.OMX_LEADER_CLI_PATH === 'string' && spec.env.OMX_LEADER_CLI_PATH.length > 0, 'OMX_LEADER_CLI_PATH must be set');
2206
+ // command matches the resolved CLI path stored in env
2207
+ assert.equal(spec.command, spec.env.OMX_LEADER_CLI_PATH);
2208
+ }
2209
+ finally {
2210
+ if (typeof prevBypass === 'string')
2211
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
2212
+ else
2213
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
2214
+ }
2215
+ });
2216
+ it('buildWorkerProcessLaunchSpec wraps Windows PowerShell shims for prompt workers', async () => {
2217
+ const fakeBin = await mkdtemp(join(tmpdir(), 'omx-worker-spec-win32-'));
2218
+ const prevPath = process.env.PATH;
2219
+ const prevPathext = process.env.PATHEXT;
2220
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
2221
+ const prevMsystem = process.env.MSYSTEM;
2222
+ const prevOstype = process.env.OSTYPE;
2223
+ const prevWsl = process.env.WSL_DISTRO_NAME;
2224
+ const prevWslInterop = process.env.WSL_INTEROP;
2225
+ const origPlatform = Object.getOwnPropertyDescriptor(process, 'platform');
2226
+ process.env.PATH = fakeBin;
2227
+ process.env.PATHEXT = '.PS1';
2228
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
2229
+ delete process.env.MSYSTEM;
2230
+ delete process.env.OSTYPE;
2231
+ delete process.env.WSL_DISTRO_NAME;
2232
+ delete process.env.WSL_INTEROP;
2233
+ Object.defineProperty(process, 'platform', { value: 'win32', configurable: true });
2234
+ try {
2235
+ const codexPs1Path = join(fakeBin, 'codex.ps1');
2236
+ await writeFile(codexPs1Path, '');
2237
+ const spec = buildWorkerProcessLaunchSpec('beta-team', 1, ['--model', 'gpt-5'], 'C:\\workspace', {}, 'codex');
2238
+ assert.match(spec.command, /powershell(?:\.exe)?$/i);
2239
+ assert.deepEqual(spec.args.slice(0, 5), ['-NoLogo', '-NoProfile', '-ExecutionPolicy', 'Bypass', '-File']);
2240
+ assert.equal(spec.args[5], codexPs1Path);
2241
+ assert.deepEqual(spec.args.slice(6), ['--model', 'gpt-5', '--dangerously-bypass-approvals-and-sandbox']);
2242
+ assert.equal(spec.env.OMX_LEADER_CLI_PATH, codexPs1Path);
2243
+ assert.notEqual(spec.command, codexPs1Path);
2244
+ }
2245
+ finally {
2246
+ if (origPlatform)
2247
+ Object.defineProperty(process, 'platform', origPlatform);
2248
+ if (typeof prevPath === 'string')
2249
+ process.env.PATH = prevPath;
2250
+ else
2251
+ delete process.env.PATH;
2252
+ if (typeof prevPathext === 'string')
2253
+ process.env.PATHEXT = prevPathext;
2254
+ else
2255
+ delete process.env.PATHEXT;
2256
+ if (typeof prevBypass === 'string')
2257
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
2258
+ else
2259
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
2260
+ if (typeof prevMsystem === 'string')
2261
+ process.env.MSYSTEM = prevMsystem;
2262
+ else
2263
+ delete process.env.MSYSTEM;
2264
+ if (typeof prevOstype === 'string')
2265
+ process.env.OSTYPE = prevOstype;
2266
+ else
2267
+ delete process.env.OSTYPE;
2268
+ if (typeof prevWsl === 'string')
2269
+ process.env.WSL_DISTRO_NAME = prevWsl;
2270
+ else
2271
+ delete process.env.WSL_DISTRO_NAME;
2272
+ if (typeof prevWslInterop === 'string')
2273
+ process.env.WSL_INTEROP = prevWslInterop;
2274
+ else
2275
+ delete process.env.WSL_INTEROP;
2276
+ await rm(fakeBin, { recursive: true, force: true });
2277
+ }
2278
+ });
2279
+ it('buildWorkerProcessLaunchSpec records the resolved node-hosted Codex launcher on native Windows', async () => {
2280
+ const fakeRoot = await mkdtemp(join(tmpdir(), 'omx-worker-spec-win32-node-hosted-'));
2281
+ const fakeBin = join(fakeRoot, 'node_modules', '.bin');
2282
+ const prevPath = process.env.PATH;
2283
+ const prevPathext = process.env.PATHEXT;
2284
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
2285
+ const prevMsystem = process.env.MSYSTEM;
2286
+ const prevOstype = process.env.OSTYPE;
2287
+ const prevWsl = process.env.WSL_DISTRO_NAME;
2288
+ const prevWslInterop = process.env.WSL_INTEROP;
2289
+ const origPlatform = Object.getOwnPropertyDescriptor(process, 'platform');
2290
+ process.env.PATH = fakeBin;
2291
+ process.env.PATHEXT = '.CMD;.PS1';
2292
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
2293
+ delete process.env.MSYSTEM;
2294
+ delete process.env.OSTYPE;
2295
+ delete process.env.WSL_DISTRO_NAME;
2296
+ delete process.env.WSL_INTEROP;
2297
+ Object.defineProperty(process, 'platform', { value: 'win32', configurable: true });
2298
+ try {
2299
+ const codexCmdPath = join(fakeBin, 'codex.cmd');
2300
+ const codexJsPath = join(fakeRoot, 'node_modules', '@openai', 'codex', 'bin', 'codex.js');
2301
+ await mkdir(fakeBin, { recursive: true });
2302
+ await mkdir(join(fakeRoot, 'node_modules', '@openai', 'codex', 'bin'), { recursive: true });
2303
+ await writeFile(codexCmdPath, '@echo off\r\n');
2304
+ await writeFile(codexJsPath, '');
2305
+ const spec = buildWorkerProcessLaunchSpec('beta-team', 1, ['--model', 'gpt-5'], 'C:\\workspace', {}, 'codex');
2306
+ assert.equal(spec.command, process.execPath);
2307
+ assert.deepEqual(spec.args, [codexJsPath, '--model', 'gpt-5', '--dangerously-bypass-approvals-and-sandbox']);
2308
+ assert.equal(spec.env.OMX_LEADER_CLI_PATH, codexJsPath);
2309
+ assert.notEqual(spec.env.OMX_LEADER_CLI_PATH, codexCmdPath);
2310
+ }
2311
+ finally {
2312
+ if (origPlatform)
2313
+ Object.defineProperty(process, 'platform', origPlatform);
2314
+ if (typeof prevPath === 'string')
2315
+ process.env.PATH = prevPath;
2316
+ else
2317
+ delete process.env.PATH;
2318
+ if (typeof prevPathext === 'string')
2319
+ process.env.PATHEXT = prevPathext;
2320
+ else
2321
+ delete process.env.PATHEXT;
2322
+ if (typeof prevBypass === 'string')
2323
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
2324
+ else
2325
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
2326
+ if (typeof prevMsystem === 'string')
2327
+ process.env.MSYSTEM = prevMsystem;
2328
+ else
2329
+ delete process.env.MSYSTEM;
2330
+ if (typeof prevOstype === 'string')
2331
+ process.env.OSTYPE = prevOstype;
2332
+ else
2333
+ delete process.env.OSTYPE;
2334
+ if (typeof prevWsl === 'string')
2335
+ process.env.WSL_DISTRO_NAME = prevWsl;
2336
+ else
2337
+ delete process.env.WSL_DISTRO_NAME;
2338
+ if (typeof prevWslInterop === 'string')
2339
+ process.env.WSL_INTEROP = prevWslInterop;
2340
+ else
2341
+ delete process.env.WSL_INTEROP;
2342
+ await rm(fakeRoot, { recursive: true, force: true });
2343
+ }
2344
+ });
2345
+ it('buildWorkerProcessLaunchSpec preserves ambient CODEX_HOME so Codex workers keep provider websocket metadata', async () => {
2346
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
2347
+ const prevCodexHome = process.env.CODEX_HOME;
2348
+ const prevSqliteHome = process.env.CODEX_SQLITE_HOME;
2349
+ const prevProviderEnv = process.env.CUSTOM_PROVIDER_API_KEY;
2350
+ const codexHome = await mkdtemp(join(tmpdir(), 'omx-team-provider-websocket-'));
2351
+ const sqliteHome = await mkdtemp(join(tmpdir(), 'omx-team-provider-sqlite-'));
2352
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
2353
+ process.env.CODEX_HOME = codexHome;
2354
+ process.env.CODEX_SQLITE_HOME = sqliteHome;
2355
+ process.env.CUSTOM_PROVIDER_API_KEY = 'test-secret';
2356
+ try {
2357
+ await writeFile(join(codexHome, 'config.toml'), [
2358
+ 'model = "gpt-5.5"',
2359
+ 'model_provider = "custom_provider"',
2360
+ '',
2361
+ '[model_providers.custom_provider]',
2362
+ 'name = "custom_provider"',
2363
+ 'base_url = "http://localhost:3000/v1"',
2364
+ 'wire_api = "responses"',
2365
+ 'supports_websockets = true',
2366
+ 'requires_openai_auth = true',
2367
+ 'env_key = "CUSTOM_PROVIDER_API_KEY"',
2368
+ '',
2369
+ ].join('\n'));
2370
+ const spec = buildWorkerProcessLaunchSpec('websocket-team', 1, [], '/tmp/workspace', {}, 'codex');
2371
+ assert.equal(spec.env.CODEX_HOME, codexHome);
2372
+ assert.equal(spec.env.CODEX_SQLITE_HOME, sqliteHome);
2373
+ assert.equal(spec.env.CUSTOM_PROVIDER_API_KEY, 'test-secret');
2374
+ }
2375
+ finally {
2376
+ if (typeof prevBypass === 'string')
2377
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
2378
+ else
2379
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
2380
+ if (typeof prevCodexHome === 'string')
2381
+ process.env.CODEX_HOME = prevCodexHome;
2382
+ else
2383
+ delete process.env.CODEX_HOME;
2384
+ if (typeof prevSqliteHome === 'string')
2385
+ process.env.CODEX_SQLITE_HOME = prevSqliteHome;
2386
+ else
2387
+ delete process.env.CODEX_SQLITE_HOME;
2388
+ if (typeof prevProviderEnv === 'string')
2389
+ process.env.CUSTOM_PROVIDER_API_KEY = prevProviderEnv;
2390
+ else
2391
+ delete process.env.CUSTOM_PROVIDER_API_KEY;
2392
+ await rm(codexHome, { recursive: true, force: true });
2393
+ await rm(sqliteHome, { recursive: true, force: true });
2394
+ }
2395
+ });
2396
+ it('buildWorkerProcessLaunchSpec injects the active provider env_key from CODEX_HOME config.toml', async () => {
2397
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
2398
+ const prevCodexHome = process.env.CODEX_HOME;
2399
+ const prevProviderEnv = process.env.CUSTOM_PROVIDER_API_KEY;
2400
+ const codexHome = await mkdtemp(join(tmpdir(), 'omx-team-provider-env-'));
2401
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
2402
+ process.env.CODEX_HOME = codexHome;
2403
+ process.env.CUSTOM_PROVIDER_API_KEY = 'test-secret';
2404
+ try {
2405
+ await writeFile(join(codexHome, 'config.toml'), [
2406
+ 'model_provider = "custom_provider"',
2407
+ '',
2408
+ '[model_providers.custom_provider]',
2409
+ 'name = "custom_provider"',
2410
+ 'base_url = "http://localhost:3000/v1"',
2411
+ 'wire_api = "responses"',
2412
+ 'requires_openai_auth = true',
2413
+ 'env_key = "CUSTOM_PROVIDER_API_KEY"',
2414
+ '',
2415
+ ].join('\n'));
2416
+ const spec = buildWorkerProcessLaunchSpec('gamma-team', 1, [], '/tmp/workspace', {}, 'codex');
2417
+ assert.equal(spec.env.CUSTOM_PROVIDER_API_KEY, 'test-secret');
2418
+ }
2419
+ finally {
2420
+ if (typeof prevBypass === 'string')
2421
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
2422
+ else
2423
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
2424
+ if (typeof prevCodexHome === 'string')
2425
+ process.env.CODEX_HOME = prevCodexHome;
2426
+ else
2427
+ delete process.env.CODEX_HOME;
2428
+ if (typeof prevProviderEnv === 'string')
2429
+ process.env.CUSTOM_PROVIDER_API_KEY = prevProviderEnv;
2430
+ else
2431
+ delete process.env.CUSTOM_PROVIDER_API_KEY;
2432
+ await rm(codexHome, { recursive: true, force: true });
2433
+ }
2434
+ });
2435
+ it('buildWorkerProcessLaunchSpec uses CLI model_provider override for Codex provider env injection', async () => {
2436
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
2437
+ const prevCodexHome = process.env.CODEX_HOME;
2438
+ const prevDefaultProviderEnv = process.env.DEFAULT_PROVIDER_API_KEY;
2439
+ const prevCheapProviderEnv = process.env.CHEAP_PROVIDER_API_KEY;
2440
+ const codexHome = await mkdtemp(join(tmpdir(), 'omx-team-provider-cli-override-'));
2441
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
2442
+ process.env.CODEX_HOME = codexHome;
2443
+ process.env.DEFAULT_PROVIDER_API_KEY = 'default-secret';
2444
+ process.env.CHEAP_PROVIDER_API_KEY = 'cheap-secret';
2445
+ try {
2446
+ await writeFile(join(codexHome, 'config.toml'), [
2447
+ 'model_provider = "default_provider"',
2448
+ '',
2449
+ '[model_providers.default_provider]',
2450
+ 'name = "default_provider"',
2451
+ 'base_url = "http://localhost:3000/v1"',
2452
+ 'wire_api = "responses"',
2453
+ 'requires_openai_auth = true',
2454
+ 'env_key = "DEFAULT_PROVIDER_API_KEY"',
2455
+ '',
2456
+ '[model_providers.cheapRouter]',
2457
+ 'name = "cheapRouter"',
2458
+ 'base_url = "http://localhost:4000/v1"',
2459
+ 'wire_api = "responses"',
2460
+ 'requires_openai_auth = true',
2461
+ 'env_key = "CHEAP_PROVIDER_API_KEY"',
2462
+ '',
2463
+ ].join('\n'));
2464
+ const spec = buildWorkerProcessLaunchSpec('provider-override-team', 1, ['-c', 'model_provider="cheapRouter"', '--model', 'gpt-5.5'], '/tmp/workspace', {}, 'codex');
2465
+ assert.equal(spec.env.CHEAP_PROVIDER_API_KEY, 'cheap-secret');
2466
+ assert.equal(spec.env.DEFAULT_PROVIDER_API_KEY, undefined);
2467
+ assert.deepEqual(spec.args.slice(0, 4), ['-c', 'model_provider="cheapRouter"', '--model', 'gpt-5.5']);
2468
+ }
2469
+ finally {
2470
+ if (typeof prevBypass === 'string')
2471
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
2472
+ else
2473
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
2474
+ if (typeof prevCodexHome === 'string')
2475
+ process.env.CODEX_HOME = prevCodexHome;
2476
+ else
2477
+ delete process.env.CODEX_HOME;
2478
+ if (typeof prevDefaultProviderEnv === 'string')
2479
+ process.env.DEFAULT_PROVIDER_API_KEY = prevDefaultProviderEnv;
2480
+ else
2481
+ delete process.env.DEFAULT_PROVIDER_API_KEY;
2482
+ if (typeof prevCheapProviderEnv === 'string')
2483
+ process.env.CHEAP_PROVIDER_API_KEY = prevCheapProviderEnv;
2484
+ else
2485
+ delete process.env.CHEAP_PROVIDER_API_KEY;
2486
+ await rm(codexHome, { recursive: true, force: true });
2487
+ }
2488
+ });
2489
+ it('buildWorkerProcessLaunchSpec does not inject the active provider env_key for non-codex workers', async () => {
2490
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
2491
+ const prevCodexHome = process.env.CODEX_HOME;
2492
+ const prevProviderEnv = process.env.CUSTOM_PROVIDER_API_KEY;
2493
+ const codexHome = await mkdtemp(join(tmpdir(), 'omx-team-provider-env-'));
2494
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
2495
+ process.env.CODEX_HOME = codexHome;
2496
+ process.env.CUSTOM_PROVIDER_API_KEY = 'test-secret';
2497
+ try {
2498
+ await writeFile(join(codexHome, 'config.toml'), [
2499
+ 'model_provider = "custom_provider"',
2500
+ '',
2501
+ '[model_providers.custom_provider]',
2502
+ 'name = "custom_provider"',
2503
+ 'base_url = "http://localhost:3000/v1"',
2504
+ 'wire_api = "responses"',
2505
+ 'requires_openai_auth = true',
2506
+ 'env_key = "CUSTOM_PROVIDER_API_KEY"',
2507
+ '',
2508
+ ].join('\n'));
2509
+ const spec = buildWorkerProcessLaunchSpec('delta-team', 1, [], '/tmp/workspace', {}, 'claude');
2510
+ assert.equal(spec.workerCli, 'claude');
2511
+ assert.equal(spec.env.CODEX_HOME, undefined);
2512
+ assert.equal(spec.env.CUSTOM_PROVIDER_API_KEY, undefined);
2513
+ }
2514
+ finally {
2515
+ if (typeof prevBypass === 'string')
2516
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
2517
+ else
2518
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
2519
+ if (typeof prevCodexHome === 'string')
2520
+ process.env.CODEX_HOME = prevCodexHome;
2521
+ else
2522
+ delete process.env.CODEX_HOME;
2523
+ if (typeof prevProviderEnv === 'string')
2524
+ process.env.CUSTOM_PROVIDER_API_KEY = prevProviderEnv;
2525
+ else
2526
+ delete process.env.CUSTOM_PROVIDER_API_KEY;
2527
+ await rm(codexHome, { recursive: true, force: true });
2528
+ }
2529
+ });
2530
+ it('buildWorkerProcessLaunchSpec reads provider env from worker CODEX_HOME override', async () => {
2531
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
2532
+ const prevCodexHome = process.env.CODEX_HOME;
2533
+ const prevPrimaryProviderEnv = process.env.PRIMARY_PROVIDER_API_KEY;
2534
+ const prevWorkerProviderEnv = process.env.WORKER_PROVIDER_API_KEY;
2535
+ const leaderCodexHome = await mkdtemp(join(tmpdir(), 'omx-team-provider-env-leader-'));
2536
+ const workerCodexHome = await mkdtemp(join(tmpdir(), 'omx-team-provider-env-worker-'));
2537
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
2538
+ process.env.CODEX_HOME = leaderCodexHome;
2539
+ process.env.PRIMARY_PROVIDER_API_KEY = 'leader-secret';
2540
+ process.env.WORKER_PROVIDER_API_KEY = 'worker-secret';
2541
+ try {
2542
+ await writeFile(join(leaderCodexHome, 'config.toml'), [
2543
+ 'model_provider = "primary_provider"',
2544
+ '',
2545
+ '[model_providers.primary_provider]',
2546
+ 'name = "primary_provider"',
2547
+ 'base_url = "http://localhost:3000/v1"',
2548
+ 'wire_api = "responses"',
2549
+ 'requires_openai_auth = true',
2550
+ 'env_key = "PRIMARY_PROVIDER_API_KEY"',
2551
+ '',
2552
+ ].join('\n'));
2553
+ await writeFile(join(workerCodexHome, 'config.toml'), [
2554
+ 'model_provider = "worker_provider"',
2555
+ '',
2556
+ '[model_providers.worker_provider]',
2557
+ 'name = "worker_provider"',
2558
+ 'base_url = "http://localhost:4000/v1"',
2559
+ 'wire_api = "responses"',
2560
+ 'requires_openai_auth = true',
2561
+ 'env_key = "WORKER_PROVIDER_API_KEY"',
2562
+ '',
2563
+ ].join('\n'));
2564
+ const spec = buildWorkerProcessLaunchSpec('epsilon-team', 1, [], '/tmp/workspace', { CODEX_HOME: workerCodexHome }, 'codex');
2565
+ assert.equal(spec.env.CODEX_HOME, workerCodexHome);
2566
+ assert.equal(spec.env.WORKER_PROVIDER_API_KEY, 'worker-secret');
2567
+ assert.equal(spec.env.PRIMARY_PROVIDER_API_KEY, undefined);
2568
+ }
2569
+ finally {
2570
+ if (typeof prevBypass === 'string')
2571
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
2572
+ else
2573
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
2574
+ if (typeof prevCodexHome === 'string')
2575
+ process.env.CODEX_HOME = prevCodexHome;
2576
+ else
2577
+ delete process.env.CODEX_HOME;
2578
+ if (typeof prevPrimaryProviderEnv === 'string')
2579
+ process.env.PRIMARY_PROVIDER_API_KEY = prevPrimaryProviderEnv;
2580
+ else
2581
+ delete process.env.PRIMARY_PROVIDER_API_KEY;
2582
+ if (typeof prevWorkerProviderEnv === 'string')
2583
+ process.env.WORKER_PROVIDER_API_KEY = prevWorkerProviderEnv;
2584
+ else
2585
+ delete process.env.WORKER_PROVIDER_API_KEY;
2586
+ await rm(leaderCodexHome, { recursive: true, force: true });
2587
+ await rm(workerCodexHome, { recursive: true, force: true });
2588
+ }
2589
+ });
2590
+ it('buildWorkerProcessLaunchSpec keeps the worker env contract unchanged for ambient proxy vars', () => {
2591
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
2592
+ const prevHttpsProxy = process.env.HTTPS_PROXY;
2593
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
2594
+ process.env.HTTPS_PROXY = 'https://ambient-proxy.example:443';
2595
+ try {
2596
+ const spec = buildWorkerProcessLaunchSpec('eta-team', 1, [], '/tmp/workspace', {}, 'codex');
2597
+ assert.equal(spec.env.HTTPS_PROXY, undefined);
2598
+ }
2599
+ finally {
2600
+ if (typeof prevBypass === 'string')
2601
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
2602
+ else
2603
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
2604
+ if (typeof prevHttpsProxy === 'string')
2605
+ process.env.HTTPS_PROXY = prevHttpsProxy;
2606
+ else
2607
+ delete process.env.HTTPS_PROXY;
2608
+ }
2609
+ });
2610
+ it('buildWorkerProcessLaunchSpec resolves relative worker CODEX_HOME against the worker cwd', async () => {
2611
+ const prevBypass = process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
2612
+ const prevCodexHome = process.env.CODEX_HOME;
2613
+ const prevLeaderProviderEnv = process.env.LEADER_PROVIDER_API_KEY;
2614
+ const prevWorkerProviderEnv = process.env.WORKER_PROVIDER_API_KEY;
2615
+ const originalCwd = process.cwd();
2616
+ const leaderCwd = await mkdtemp(join(tmpdir(), 'omx-team-provider-relative-leader-'));
2617
+ const workerCwd = await mkdtemp(join(tmpdir(), 'omx-team-provider-relative-worker-'));
2618
+ const leaderCodexHome = join(leaderCwd, '.codex');
2619
+ const workerCodexHome = join(workerCwd, '.codex');
2620
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = '0';
2621
+ process.env.CODEX_HOME = leaderCodexHome;
2622
+ process.env.LEADER_PROVIDER_API_KEY = 'leader-secret';
2623
+ process.env.WORKER_PROVIDER_API_KEY = 'worker-secret';
2624
+ try {
2625
+ await mkdir(leaderCodexHome, { recursive: true });
2626
+ await mkdir(workerCodexHome, { recursive: true });
2627
+ await writeFile(join(leaderCodexHome, 'config.toml'), [
2628
+ 'model_provider = "leader_provider"',
2629
+ '',
2630
+ '[model_providers.leader_provider]',
2631
+ 'name = "leader_provider"',
2632
+ 'base_url = "http://localhost:3000/v1"',
2633
+ 'wire_api = "responses"',
2634
+ 'requires_openai_auth = true',
2635
+ 'env_key = "LEADER_PROVIDER_API_KEY"',
2636
+ '',
2637
+ ].join('\n'));
2638
+ await writeFile(join(workerCodexHome, 'config.toml'), [
2639
+ 'model_provider = "worker_provider"',
2640
+ '',
2641
+ '[model_providers.worker_provider]',
2642
+ 'name = "worker_provider"',
2643
+ 'base_url = "http://localhost:4000/v1"',
2644
+ 'wire_api = "responses"',
2645
+ 'requires_openai_auth = true',
2646
+ 'env_key = "WORKER_PROVIDER_API_KEY"',
2647
+ '',
2648
+ ].join('\n'));
2649
+ process.chdir(leaderCwd);
2650
+ const spec = buildWorkerProcessLaunchSpec('zeta-team', 1, [], workerCwd, { CODEX_HOME: '.codex' }, 'codex');
2651
+ assert.equal(spec.env.CODEX_HOME, '.codex');
2652
+ assert.equal(spec.env.WORKER_PROVIDER_API_KEY, 'worker-secret');
2653
+ assert.equal(spec.env.LEADER_PROVIDER_API_KEY, undefined);
2654
+ }
2655
+ finally {
2656
+ process.chdir(originalCwd);
2657
+ if (typeof prevBypass === 'string')
2658
+ process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT = prevBypass;
2659
+ else
2660
+ delete process.env.OMX_BYPASS_DEFAULT_SYSTEM_PROMPT;
2661
+ if (typeof prevCodexHome === 'string')
2662
+ process.env.CODEX_HOME = prevCodexHome;
2663
+ else
2664
+ delete process.env.CODEX_HOME;
2665
+ if (typeof prevLeaderProviderEnv === 'string')
2666
+ process.env.LEADER_PROVIDER_API_KEY = prevLeaderProviderEnv;
2667
+ else
2668
+ delete process.env.LEADER_PROVIDER_API_KEY;
2669
+ if (typeof prevWorkerProviderEnv === 'string')
2670
+ process.env.WORKER_PROVIDER_API_KEY = prevWorkerProviderEnv;
2671
+ else
2672
+ delete process.env.WORKER_PROVIDER_API_KEY;
2673
+ await rm(leaderCwd, { recursive: true, force: true });
2674
+ await rm(workerCwd, { recursive: true, force: true });
2675
+ }
2676
+ });
2677
+ });
2678
+ describe('sendToWorkerStdin', () => {
2679
+ it('writes a newline-terminated trigger message to worker stdin', () => {
2680
+ const stdin = new PassThrough();
2681
+ let captured = '';
2682
+ stdin.on('data', (chunk) => {
2683
+ captured += chunk.toString();
2684
+ });
2685
+ sendToWorkerStdin(stdin, 'check inbox now');
2686
+ assert.equal(captured, 'check inbox now\n');
2687
+ });
2688
+ it('validates trigger text before writing to stdin', () => {
2689
+ const stdin = new PassThrough();
2690
+ assert.throws(() => sendToWorkerStdin(stdin, ''), /non-empty/i);
2691
+ assert.throws(() => sendToWorkerStdin(stdin, 'a'.repeat(200)), /< 200 characters/i);
2692
+ });
2693
+ });
2694
+ describe('tmux-dependent functions when tmux is unavailable', () => {
2695
+ it('isTmuxAvailable returns false', () => {
2696
+ withEmptyPath(() => {
2697
+ assert.equal(isTmuxAvailable(), false);
2698
+ });
2699
+ });
2700
+ it('createTeamSession throws', () => {
2701
+ withEmptyPath(() => {
2702
+ assert.throws(() => createTeamSession('My Team', 1, process.cwd()), /tmux is not available/i);
2703
+ });
2704
+ });
2705
+ it('listTeamSessions returns empty', () => {
2706
+ withEmptyPath(() => {
2707
+ assert.deepEqual(listTeamSessions(), []);
2708
+ });
2709
+ });
2710
+ it('waitForWorkerReady uses visible capture-pane argv without tail flags', async () => {
2711
+ await withMockTmuxFixture('omx-tmux-worker-ready-visible-capture-', (logPath) => `#!/bin/sh
2712
+ set -eu
2713
+ printf '%s\n' "$*" >> "${logPath}"
2714
+ case "$1" in
2715
+ capture-pane)
2716
+ cat <<'EOF'
2717
+ ${READY_HELPER_CAPTURE}
2718
+ EOF
2719
+ exit 0
2720
+ ;;
2721
+ *)
2722
+ exit 0
2723
+ ;;
2724
+ esac
2725
+ `, async ({ logPath }) => {
2726
+ assert.equal(waitForWorkerReady('omx-team-x', 1, 1_000), true);
2727
+ const log = await readFile(logPath, 'utf-8');
2728
+ assert.match(log, /capture-pane -t omx-team-x:1 -p/);
2729
+ assert.doesNotMatch(log, /capture-pane -t omx-team-x:1 -p -S/);
2730
+ });
2731
+ });
2732
+ it('waitForWorkerReady accepts Codex 0.114.0-style welcome helper text', async () => {
2733
+ await withMockTmuxFixture('omx-tmux-worker-ready-hello-', (logPath) => `#!/bin/sh
2734
+ set -eu
2735
+ printf '%s\n' "$*" >> "${logPath}"
2736
+ case "$1" in
2737
+ capture-pane)
2738
+ cat <<'EOF'
2739
+ ╭────────────────────────────────────────────╮
2740
+ │ >_ OpenAI Codex (v0.114.0) │
2741
+ │ │
2742
+ │ model: gpt-5.5 high /model to change │
2743
+ │ directory: ~/Workspace/demo │
2744
+ ╰────────────────────────────────────────────╯
2745
+
2746
+ How can I help you today?
2747
+ EOF
2748
+ exit 0
2749
+ ;;
2750
+ *)
2751
+ exit 0
2752
+ ;;
2753
+ esac
2754
+ `, async () => {
2755
+ assert.equal(waitForWorkerReady('omx-team-x', 1, 1_000), true);
2756
+ });
2757
+ });
2758
+ it('waitForWorkerReady falls back to recent scrollback when a live Codex viewport pushes the prompt below the visible slice', async () => {
2759
+ await withMockTmuxFixture('omx-tmux-worker-ready-scrollback-fallback-', (logPath) => `#!/bin/sh
2760
+ set -eu
2761
+ printf '%s\n' "$*" >> "${logPath}"
2762
+ case "$1" in
2763
+ capture-pane)
2764
+ if printf '%s\n' "$*" | grep -q -- ' -S -80'; then
2765
+ cat <<'EOF'
2766
+ ${VIEWPORT_SCROLLBACK_READY_CAPTURE}
2767
+ EOF
2768
+ else
2769
+ cat <<'EOF'
2770
+ ${VIEWPORT_WITHOUT_VISIBLE_PROMPT_CAPTURE}
2771
+ EOF
2772
+ fi
2773
+ exit 0
2774
+ ;;
2775
+ *)
2776
+ exit 0
2777
+ ;;
2778
+ esac
2779
+ `, async ({ logPath }) => {
2780
+ assert.equal(waitForWorkerReady('omx-team-x', 1, 1_000), true);
2781
+ const log = await readFile(logPath, 'utf-8');
2782
+ assert.match(log, /capture-pane -t omx-team-x:1 -p/);
2783
+ assert.match(log, /capture-pane -t omx-team-x:1 -p -S -80/);
2784
+ });
2785
+ });
2786
+ it('waitForWorkerReady does not consult scrollback when the visible slice is only status text', async () => {
2787
+ await withMockTmuxFixture('omx-tmux-worker-ready-no-scrollback-status-', (logPath) => `#!/bin/sh
2788
+ set -eu
2789
+ printf '%s\n' "$*" >> "${logPath}"
2790
+ case "$1" in
2791
+ capture-pane)
2792
+ cat <<'EOF'
2793
+ gpt-5 50% left
2794
+ EOF
2795
+ exit 0
2796
+ ;;
2797
+ *)
2798
+ exit 0
2799
+ ;;
2800
+ esac
2801
+ `, async ({ logPath }) => {
2802
+ assert.equal(waitForWorkerReady('omx-team-x', 1, 250), false);
2803
+ const log = await readFile(logPath, 'utf-8');
2804
+ assert.match(log, /capture-pane -t omx-team-x:1 -p/);
2805
+ assert.doesNotMatch(log, /capture-pane -t omx-team-x:1 -p -S -80/);
2806
+ });
2807
+ });
2808
+ it('waitForWorkerReady auto-accepts the Claude bypass prompt', async () => {
2809
+ await withMockTmuxFixture('omx-tmux-claude-bypass-ready-', (logPath) => `#!/bin/sh
2810
+ set -eu
2811
+ state_dir="$(dirname "${logPath}")"
2812
+ accepted_file="$state_dir/accepted"
2813
+ printf '%s\n' "$*" >> "${logPath}"
2814
+ case "$1" in
2815
+ capture-pane)
2816
+ if [ -f "$accepted_file" ]; then
2817
+ cat <<'EOF'
2818
+ ${READY_HELPER_CAPTURE}
2819
+ EOF
2820
+ else
2821
+ cat <<'EOF'
2822
+ ${CLAUDE_BYPASS_PROMPT_CAPTURE}
2823
+ EOF
2824
+ fi
2825
+ exit 0
2826
+ ;;
2827
+ send-keys)
2828
+ if [ "\${4:-}" = "-l" ] && [ "\${6:-}" = "2" ]; then
2829
+ : > "$accepted_file"
2830
+ fi
2831
+ exit 0
2832
+ ;;
2833
+ *)
2834
+ exit 0
2835
+ ;;
2836
+ esac
2837
+ `, async ({ logPath }) => {
2838
+ assert.equal(waitForWorkerReady('omx-team-x', 1, 5_000), true);
2839
+ const log = await readFile(logPath, 'utf-8');
2840
+ assert.match(log, /send-keys -t omx-team-x:1 -l -- 2/);
2841
+ assert.match(log, /send-keys -t omx-team-x:1 C-m/);
2842
+ });
2843
+ });
2844
+ it('waitForWorkerReady leaves the Claude bypass prompt untouched when auto-accept is disabled', async () => {
2845
+ const previousAutoAccept = process.env.OMX_TEAM_AUTO_ACCEPT_BYPASS;
2846
+ process.env.OMX_TEAM_AUTO_ACCEPT_BYPASS = '0';
2847
+ try {
2848
+ await withMockTmuxFixture('omx-tmux-claude-bypass-blocked-', (logPath) => `#!/bin/sh
2849
+ set -eu
2850
+ printf '%s\n' "$*" >> "${logPath}"
2851
+ case "$1" in
2852
+ capture-pane)
2853
+ cat <<'EOF'
2854
+ ${CLAUDE_BYPASS_PROMPT_CAPTURE}
2855
+ EOF
2856
+ exit 0
2857
+ ;;
2858
+ *)
2859
+ exit 0
2860
+ ;;
2861
+ esac
2862
+ `, async ({ logPath }) => {
2863
+ assert.equal(waitForWorkerReady('omx-team-x', 1, 250), false);
2864
+ const log = await readFile(logPath, 'utf-8');
2865
+ assert.doesNotMatch(log, /send-keys/);
2866
+ });
2867
+ }
2868
+ finally {
2869
+ if (typeof previousAutoAccept === 'string')
2870
+ process.env.OMX_TEAM_AUTO_ACCEPT_BYPASS = previousAutoAccept;
2871
+ else
2872
+ delete process.env.OMX_TEAM_AUTO_ACCEPT_BYPASS;
2873
+ }
2874
+ });
2875
+ it('waitForWorkerReady returns false on timeout', () => {
2876
+ withEmptyPath(() => {
2877
+ assert.equal(waitForWorkerReady('omx-team-x', 1, 1), false);
2878
+ });
2879
+ });
2880
+ });
2881
+ describe('waitForWorkerReadyAsync parity', () => {
2882
+ it('uses visible capture-pane argv without tail flags', async () => {
2883
+ await withMockTmuxFixture('omx-tmux-worker-ready-async-visible-capture-', (logPath) => `#!/bin/sh
2884
+ set -eu
2885
+ printf '%s\n' "$*" >> "${logPath}"
2886
+ case "$1" in
2887
+ capture-pane)
2888
+ cat <<'EOF'
2889
+ ${READY_HELPER_CAPTURE}
2890
+ EOF
2891
+ exit 0
2892
+ ;;
2893
+ *)
2894
+ exit 0
2895
+ ;;
2896
+ esac
2897
+ `, async ({ logPath }) => {
2898
+ assert.equal(await waitForWorkerReadyAsync('omx-team-x', 1, 1_000), true);
2899
+ const log = await readFile(logPath, 'utf-8');
2900
+ assert.match(log, /capture-pane -t omx-team-x:1 -p/);
2901
+ assert.doesNotMatch(log, /capture-pane -t omx-team-x:1 -p -S/);
2902
+ });
2903
+ });
2904
+ it('falls back to recent scrollback only when visible slice shows a live Codex viewport', async () => {
2905
+ await withMockTmuxFixture('omx-tmux-worker-ready-async-scrollback-fallback-', (logPath) => `#!/bin/sh
2906
+ set -eu
2907
+ printf '%s\n' "$*" >> "${logPath}"
2908
+ case "$1" in
2909
+ capture-pane)
2910
+ if printf '%s\n' "$*" | grep -q -- ' -S -80'; then
2911
+ cat <<'EOF'
2912
+ ${VIEWPORT_SCROLLBACK_READY_CAPTURE}
2913
+ EOF
2914
+ else
2915
+ cat <<'EOF'
2916
+ ${VIEWPORT_WITHOUT_VISIBLE_PROMPT_CAPTURE}
2917
+ EOF
2918
+ fi
2919
+ exit 0
2920
+ ;;
2921
+ *)
2922
+ exit 0
2923
+ ;;
2924
+ esac
2925
+ `, async ({ logPath }) => {
2926
+ assert.equal(await waitForWorkerReadyAsync('omx-team-x', 1, 1_000), true);
2927
+ const log = await readFile(logPath, 'utf-8');
2928
+ assert.match(log, /capture-pane -t omx-team-x:1 -p/);
2929
+ assert.match(log, /capture-pane -t omx-team-x:1 -p -S -80/);
2930
+ });
2931
+ await withMockTmuxFixture('omx-tmux-worker-ready-async-no-scrollback-status-', (logPath) => `#!/bin/sh
2932
+ set -eu
2933
+ printf '%s\n' "$*" >> "${logPath}"
2934
+ case "$1" in
2935
+ capture-pane)
2936
+ printf 'gpt-5 50%% left\n'
2937
+ exit 0
2938
+ ;;
2939
+ *)
2940
+ exit 0
2941
+ ;;
2942
+ esac
2943
+ `, async ({ logPath }) => {
2944
+ assert.equal(await waitForWorkerReadyAsync('omx-team-x', 1, 250), false);
2945
+ const log = await readFile(logPath, 'utf-8');
2946
+ assert.match(log, /capture-pane -t omx-team-x:1 -p/);
2947
+ assert.doesNotMatch(log, /capture-pane -t omx-team-x:1 -p -S -80/);
2948
+ });
2949
+ });
2950
+ it('auto-accepts trust prompts and then observes readiness', async () => {
2951
+ const previousAutoTrust = process.env.OMX_TEAM_AUTO_TRUST;
2952
+ delete process.env.OMX_TEAM_AUTO_TRUST;
2953
+ try {
2954
+ await withMockTmuxFixture('omx-tmux-worker-ready-async-trust-', (logPath) => `#!/bin/sh
2955
+ set -eu
2956
+ state_dir="$(dirname "${logPath}")"
2957
+ accepted_file="$state_dir/accepted"
2958
+ printf '%s\n' "$*" >> "${logPath}"
2959
+ case "$1" in
2960
+ capture-pane)
2961
+ if [ -f "$accepted_file" ]; then
2962
+ cat <<'EOF'
2963
+ ${READY_HELPER_CAPTURE}
2964
+ EOF
2965
+ else
2966
+ cat <<'EOF'
2967
+ Do you trust the contents of this directory?
2968
+ Press enter to continue
2969
+ EOF
2970
+ fi
2971
+ exit 0
2972
+ ;;
2973
+ send-keys)
2974
+ if [ "\${4:-}" = "C-m" ]; then
2975
+ : > "$accepted_file"
2976
+ fi
2977
+ exit 0
2978
+ ;;
2979
+ *)
2980
+ exit 0
2981
+ ;;
2982
+ esac
2983
+ `, async ({ logPath }) => {
2984
+ assert.equal(await waitForWorkerReadyAsync('omx-team-x', 1, 5_000), true);
2985
+ const log = await readFile(logPath, 'utf-8');
2986
+ assert.match(log, /send-keys -t omx-team-x:1 C-m/);
2987
+ });
2988
+ }
2989
+ finally {
2990
+ if (typeof previousAutoTrust === 'string')
2991
+ process.env.OMX_TEAM_AUTO_TRUST = previousAutoTrust;
2992
+ else
2993
+ delete process.env.OMX_TEAM_AUTO_TRUST;
2994
+ }
2995
+ });
2996
+ it('auto-accepts the Claude bypass prompt and then observes readiness', async () => {
2997
+ const previousAutoAccept = process.env.OMX_TEAM_AUTO_ACCEPT_BYPASS;
2998
+ delete process.env.OMX_TEAM_AUTO_ACCEPT_BYPASS;
2999
+ try {
3000
+ await withMockTmuxFixture('omx-tmux-worker-ready-async-claude-bypass-', (logPath) => `#!/bin/sh
3001
+ set -eu
3002
+ state_dir="$(dirname "${logPath}")"
3003
+ accepted_file="$state_dir/accepted"
3004
+ printf '%s\n' "$*" >> "${logPath}"
3005
+ case "$1" in
3006
+ capture-pane)
3007
+ if [ -f "$accepted_file" ]; then
3008
+ cat <<'EOF'
3009
+ ${READY_HELPER_CAPTURE}
3010
+ EOF
3011
+ else
3012
+ cat <<'EOF'
3013
+ ${CLAUDE_BYPASS_PROMPT_CAPTURE}
3014
+ EOF
3015
+ fi
3016
+ exit 0
3017
+ ;;
3018
+ send-keys)
3019
+ if [ "\${4:-}" = "-l" ] && [ "\${6:-}" = "2" ]; then
3020
+ : > "$accepted_file"
3021
+ fi
3022
+ exit 0
3023
+ ;;
3024
+ *)
3025
+ exit 0
3026
+ ;;
3027
+ esac
3028
+ `, async ({ logPath }) => {
3029
+ assert.equal(await waitForWorkerReadyAsync('omx-team-x', 1, 5_000), true);
3030
+ const log = await readFile(logPath, 'utf-8');
3031
+ assert.match(log, /send-keys -t omx-team-x:1 -l -- 2/);
3032
+ });
3033
+ }
3034
+ finally {
3035
+ if (typeof previousAutoAccept === 'string')
3036
+ process.env.OMX_TEAM_AUTO_ACCEPT_BYPASS = previousAutoAccept;
3037
+ else
3038
+ delete process.env.OMX_TEAM_AUTO_ACCEPT_BYPASS;
3039
+ }
3040
+ });
3041
+ it('returns false on timeout or tmux command failure', async () => {
3042
+ await withMockTmuxFixture('omx-tmux-worker-ready-async-capture-failure-', (logPath) => `#!/bin/sh
3043
+ set -eu
3044
+ printf '%s\n' "$*" >> "${logPath}"
3045
+ case "$1" in
3046
+ capture-pane)
3047
+ exit 1
3048
+ ;;
3049
+ *)
3050
+ exit 0
3051
+ ;;
3052
+ esac
3053
+ `, async () => {
3054
+ assert.equal(await waitForWorkerReadyAsync('omx-team-x', 1, 1), false);
3055
+ });
3056
+ await withEmptyPath(async () => {
3057
+ assert.equal(await waitForWorkerReadyAsync('omx-team-x', 1, 1), false);
3058
+ });
3059
+ });
3060
+ });
3061
+ describe('createTeamSession tmux instance tagging', () => {
3062
+ it('redraws the leader pane after team layout changes so wrapped diff hunks repaint with gutters', async () => {
3063
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-team-redraw-leader-'));
3064
+ const prevTmux = process.env.TMUX;
3065
+ const prevTmuxPane = process.env.TMUX_PANE;
3066
+ const prevWorkerCli = process.env.OMX_TEAM_WORKER_CLI;
3067
+ try {
3068
+ await withMockTmuxFixture('omx-tmux-redraw-leader-', (logPath) => `#!/bin/sh
3069
+ set -eu
3070
+ printf '%s\n' "$*" >> "${logPath}"
3071
+ case "\${1:-}" in
3072
+ -V)
3073
+ echo "tmux 3.4"
3074
+ exit 0
3075
+ ;;
3076
+ display-message)
3077
+ case "$*" in
3078
+ *"#{window_width}"*)
3079
+ echo "120"
3080
+ ;;
3081
+ *)
3082
+ echo "leader:0 %1"
3083
+ ;;
3084
+ esac
3085
+ exit 0
3086
+ ;;
3087
+ list-panes)
3088
+ case "$*" in
3089
+ *"pane_current_command"*)
3090
+ printf "%%1\\tnode\\t'codex'\\n"
3091
+ ;;
3092
+ *)
3093
+ printf "%%1\\n"
3094
+ ;;
3095
+ esac
3096
+ exit 0
3097
+ ;;
3098
+ split-window)
3099
+ case "$*" in
3100
+ *" -h "*)
3101
+ echo "%2"
3102
+ ;;
3103
+ *)
3104
+ echo "%3"
3105
+ ;;
3106
+ esac
3107
+ exit 0
3108
+ ;;
3109
+ set-option|resize-pane|select-layout|set-window-option|select-pane|set-hook|run-shell|send-keys)
3110
+ exit 0
3111
+ ;;
3112
+ *)
3113
+ exit 0
3114
+ ;;
3115
+ esac
3116
+ `, async ({ logPath }) => {
3117
+ const fakeBinDir = join(logPath, '..');
3118
+ const geminiPath = join(fakeBinDir, 'gemini');
3119
+ await writeFile(geminiPath, '#!/bin/sh\nexit 0\n');
3120
+ await chmod(geminiPath, 0o755);
3121
+ process.env.TMUX = 'leader-session,stub,0';
3122
+ process.env.TMUX_PANE = '%1';
3123
+ process.env.OMX_TEAM_WORKER_CLI = 'gemini';
3124
+ createTeamSession('Diff Gutter Redraw', 1, cwd);
3125
+ const tmuxLog = await readFile(logPath, 'utf-8');
3126
+ assert.match(tmuxLog, /select-layout -t leader:0 main-vertical/);
3127
+ assert.match(tmuxLog, /set-window-option -t leader:0 main-pane-width 60/);
3128
+ assert.match(tmuxLog, /split-window -v -f -l 3 -t leader:0 -d -P -F #\{pane_id\}/);
3129
+ assert.match(tmuxLog, /send-keys -t %1 C-l/, 'leader Codex pane must repaint after team splits/resizes so tmux does not auto-wrap diff continuation rows without the line-number gutter');
3130
+ });
3131
+ }
3132
+ finally {
3133
+ if (typeof prevTmux === 'string')
3134
+ process.env.TMUX = prevTmux;
3135
+ else
3136
+ delete process.env.TMUX;
3137
+ if (typeof prevTmuxPane === 'string')
3138
+ process.env.TMUX_PANE = prevTmuxPane;
3139
+ else
3140
+ delete process.env.TMUX_PANE;
3141
+ if (typeof prevWorkerCli === 'string')
3142
+ process.env.OMX_TEAM_WORKER_CLI = prevWorkerCli;
3143
+ else
3144
+ delete process.env.OMX_TEAM_WORKER_CLI;
3145
+ await rm(cwd, { recursive: true, force: true });
3146
+ }
3147
+ });
3148
+ it('tags leader, worker, and HUD panes with pane-scoped instance ownership', async () => {
3149
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-team-pane-tags-'));
3150
+ const prevTmux = process.env.TMUX;
3151
+ const prevTmuxPane = process.env.TMUX_PANE;
3152
+ const prevSessionId = process.env.OMX_SESSION_ID;
3153
+ const prevWorkerCli = process.env.OMX_TEAM_WORKER_CLI;
3154
+ try {
3155
+ await withMockTmuxFixture('omx-tmux-pane-tags-', (logPath) => `#!/bin/sh
3156
+ set -eu
3157
+ printf '%s\n' "$*" >> "${logPath}"
3158
+ case "\${1:-}" in
3159
+ -V)
3160
+ echo "tmux 3.4"
3161
+ exit 0
3162
+ ;;
3163
+ display-message)
3164
+ case "$*" in
3165
+ *"#{window_width}"*)
3166
+ echo "120"
3167
+ ;;
3168
+ *)
3169
+ echo "shared:0 %1"
3170
+ ;;
3171
+ esac
3172
+ exit 0
3173
+ ;;
3174
+ list-panes)
3175
+ case "$*" in
3176
+ *"pane_current_command"*)
3177
+ printf "%%1\\tnode\\t'codex'\\n"
3178
+ ;;
3179
+ *)
3180
+ printf "%%1\\n"
3181
+ ;;
3182
+ esac
3183
+ exit 0
3184
+ ;;
3185
+ split-window)
3186
+ case "$*" in
3187
+ *" -h "*)
3188
+ echo "%2"
3189
+ ;;
3190
+ *)
3191
+ echo "%3"
3192
+ ;;
3193
+ esac
3194
+ exit 0
3195
+ ;;
3196
+ set-option|resize-pane|select-layout|set-window-option|select-pane|set-hook|run-shell)
3197
+ exit 0
3198
+ ;;
3199
+ *)
3200
+ exit 0
3201
+ ;;
3202
+ esac
3203
+ `, async ({ logPath }) => {
3204
+ const fakeBinDir = join(logPath, '..');
3205
+ const geminiPath = join(fakeBinDir, 'gemini');
3206
+ await writeFile(geminiPath, '#!/bin/sh\nexit 0\n');
3207
+ await chmod(geminiPath, 0o755);
3208
+ process.env.TMUX = '1';
3209
+ process.env.TMUX_PANE = '%1';
3210
+ process.env.OMX_SESSION_ID = 'omx-pane-scope';
3211
+ process.env.OMX_TEAM_WORKER_CLI = 'gemini';
3212
+ const session = createTeamSession('Pane Tags', 1, cwd);
3213
+ assert.equal(session.name, 'shared:0');
3214
+ assert.equal(session.leaderPaneId, '%1');
3215
+ assert.deepEqual(session.workerPaneIds, ['%2']);
3216
+ assert.equal(session.hudPaneId, '%3');
3217
+ const tmuxLog = await readFile(logPath, 'utf-8');
3218
+ assert.match(tmuxLog, /set-option -t shared @omx_instance_id omx-pane-scope/);
3219
+ assert.match(tmuxLog, /set-option -p -t %1 @omx_pane_instance_id omx-pane-scope/);
3220
+ assert.match(tmuxLog, /set-option -p -t %2 @omx_pane_instance_id omx-pane-scope/);
3221
+ assert.match(tmuxLog, /set-option -p -t %3 @omx_pane_instance_id omx-pane-scope/);
3222
+ assert.match(tmuxLog, /exec env OMX_SESSION_ID='omx-pane-scope' OMX_TMUX_HUD_OWNER=1 OMX_TMUX_HUD_LEADER_PANE='%1' .*hud --watch/);
3223
+ });
3224
+ }
3225
+ finally {
3226
+ if (typeof prevTmux === 'string')
3227
+ process.env.TMUX = prevTmux;
3228
+ else
3229
+ delete process.env.TMUX;
3230
+ if (typeof prevTmuxPane === 'string')
3231
+ process.env.TMUX_PANE = prevTmuxPane;
3232
+ else
3233
+ delete process.env.TMUX_PANE;
3234
+ if (typeof prevSessionId === 'string')
3235
+ process.env.OMX_SESSION_ID = prevSessionId;
3236
+ else
3237
+ delete process.env.OMX_SESSION_ID;
3238
+ if (typeof prevWorkerCli === 'string')
3239
+ process.env.OMX_TEAM_WORKER_CLI = prevWorkerCli;
3240
+ else
3241
+ delete process.env.OMX_TEAM_WORKER_CLI;
3242
+ await rm(cwd, { recursive: true, force: true });
3243
+ }
3244
+ });
3245
+ it('uses tmux 3.2a-compatible client-resized hook registration for team HUD resize', async () => {
3246
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-team-resize-hook-fallback-'));
3247
+ const prevTmux = process.env.TMUX;
3248
+ const prevTmuxPane = process.env.TMUX_PANE;
3249
+ const prevWorkerCli = process.env.OMX_TEAM_WORKER_CLI;
3250
+ const prevWarn = console.warn;
3251
+ const warnings = [];
3252
+ try {
3253
+ await withMockTmuxFixture('omx-tmux-resize-hook-fallback-', (logPath) => `#!/bin/sh
3254
+ set -eu
3255
+ printf '%s\n' "$*" >> "${logPath}"
3256
+ case "\${1:-}" in
3257
+ -V)
3258
+ echo "tmux 3.2a"
3259
+ exit 0
3260
+ ;;
3261
+ display-message)
3262
+ case "$*" in
3263
+ *"#{window_width}"*)
3264
+ echo "120"
3265
+ ;;
3266
+ *)
3267
+ echo "leader:0 %1"
3268
+ ;;
3269
+ esac
3270
+ exit 0
3271
+ ;;
3272
+ list-panes)
3273
+ case "$*" in
3274
+ *"pane_current_command"*)
3275
+ printf "%%1\tnode\t'codex'\n"
3276
+ ;;
3277
+ *)
3278
+ printf "%%1\n"
3279
+ ;;
3280
+ esac
3281
+ exit 0
3282
+ ;;
3283
+ split-window)
3284
+ case "$*" in
3285
+ *" -h "*)
3286
+ echo "%2"
3287
+ ;;
3288
+ *)
3289
+ echo "%3"
3290
+ ;;
3291
+ esac
3292
+ exit 0
3293
+ ;;
3294
+ set-hook)
3295
+ case "$*" in
3296
+ *"window-resized["*)
3297
+ echo "invalid option: window-resized[]" >&2
3298
+ exit 1
3299
+ ;;
3300
+ *" -w "*)
3301
+ echo "invalid option: -w" >&2
3302
+ exit 1
3303
+ ;;
3304
+ *)
3305
+ exit 0
3306
+ ;;
3307
+ esac
3308
+ ;;
3309
+ set-option|resize-pane|select-layout|set-window-option|select-pane|run-shell)
3310
+ exit 0
3311
+ ;;
3312
+ *)
3313
+ exit 0
3314
+ ;;
3315
+ esac
3316
+ `, async ({ logPath }) => {
3317
+ const fakeBinDir = join(logPath, '..');
3318
+ const geminiPath = join(fakeBinDir, 'gemini');
3319
+ await writeFile(geminiPath, '#!/bin/sh\nexit 0\n');
3320
+ await chmod(geminiPath, 0o755);
3321
+ process.env.TMUX = 'leader-session,stub,0';
3322
+ process.env.TMUX_PANE = '%1';
3323
+ process.env.OMX_TEAM_WORKER_CLI = 'gemini';
3324
+ console.warn = (...args) => { warnings.push(args.map(String).join(' ')); };
3325
+ const session = createTeamSession('Resize Hook Fallback', 1, cwd);
3326
+ assert.equal(session.hudPaneId, '%3');
3327
+ assert.ok(session.resizeHookName);
3328
+ assert.equal(session.resizeHookTarget, 'leader:0');
3329
+ assert.equal(warnings.join('\n'), '');
3330
+ const tmuxLog = await readFile(logPath, 'utf-8');
3331
+ assert.match(tmuxLog, /set-hook -t leader:0 client-resized\[\d+\]/);
3332
+ assert.doesNotMatch(tmuxLog, /window-resized\[/);
3333
+ assert.doesNotMatch(tmuxLog, /set-hook -w /);
3334
+ assert.match(tmuxLog, /set-hook -t leader:0 client-attached\[\d+\]/);
3335
+ assert.match(tmuxLog, new RegExp(`run-shell -b sleep ${HUD_RESIZE_RECONCILE_DELAY_SECONDS}; .*resize-pane -t %3 -y ${HUD_TMUX_TEAM_HEIGHT_LINES}`));
3336
+ assert.match(tmuxLog, new RegExp(`run-shell .*resize-pane -t %3 -y ${HUD_TMUX_TEAM_HEIGHT_LINES}`));
3337
+ assert.doesNotMatch(tmuxLog, /kill-pane -t %2/);
3338
+ assert.doesNotMatch(tmuxLog, /kill-pane -t %3/);
3339
+ });
3340
+ }
3341
+ finally {
3342
+ console.warn = prevWarn;
3343
+ if (typeof prevTmux === 'string')
3344
+ process.env.TMUX = prevTmux;
3345
+ else
3346
+ delete process.env.TMUX;
3347
+ if (typeof prevTmuxPane === 'string')
3348
+ process.env.TMUX_PANE = prevTmuxPane;
3349
+ else
3350
+ delete process.env.TMUX_PANE;
3351
+ if (typeof prevWorkerCli === 'string')
3352
+ process.env.OMX_TEAM_WORKER_CLI = prevWorkerCli;
3353
+ else
3354
+ delete process.env.OMX_TEAM_WORKER_CLI;
3355
+ await rm(cwd, { recursive: true, force: true });
3356
+ }
3357
+ });
3358
+ it('degrades HUD run-shell resize failures to warnings during team startup', async () => {
3359
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-team-runshell-fallback-'));
3360
+ const prevTmux = process.env.TMUX;
3361
+ const prevTmuxPane = process.env.TMUX_PANE;
3362
+ const prevWorkerCli = process.env.OMX_TEAM_WORKER_CLI;
3363
+ const prevWarn = console.warn;
3364
+ const warnings = [];
3365
+ try {
3366
+ await withMockTmuxFixture('omx-tmux-runshell-fallback-', (logPath) => `#!/bin/sh
3367
+ set -eu
3368
+ printf '%s\n' "$*" >> "${logPath}"
3369
+ case "\${1:-}" in
3370
+ -V)
3371
+ echo "tmux 3.4"
3372
+ exit 0
3373
+ ;;
3374
+ display-message)
3375
+ case "$*" in
3376
+ *"#{window_width}"*) echo "120" ;;
3377
+ *) echo "leader:0 %1" ;;
3378
+ esac
3379
+ exit 0
3380
+ ;;
3381
+ list-panes)
3382
+ case "$*" in
3383
+ *"pane_current_command"*) printf "%%1\\tnode\\t'codex'\\n" ;;
3384
+ *) printf "%%1\\n" ;;
3385
+ esac
3386
+ exit 0
3387
+ ;;
3388
+ split-window)
3389
+ case "$*" in
3390
+ *" -h "*) echo "%2" ;;
3391
+ *) echo "%3" ;;
3392
+ esac
3393
+ exit 0
3394
+ ;;
3395
+ run-shell)
3396
+ echo "Unsupported tmux compatibility command: run-shell" >&2
3397
+ exit 1
3398
+ ;;
3399
+ set-option|resize-pane|select-layout|set-window-option|select-pane|set-hook|send-keys)
3400
+ exit 0
3401
+ ;;
3402
+ *)
3403
+ exit 0
3404
+ ;;
3405
+ esac
3406
+ `, async ({ logPath }) => {
3407
+ const fakeBinDir = join(logPath, '..');
3408
+ const geminiPath = join(fakeBinDir, 'gemini');
3409
+ await writeFile(geminiPath, '#!/bin/sh\nexit 0\n');
3410
+ await chmod(geminiPath, 0o755);
3411
+ process.env.TMUX = 'leader-session,stub,0';
3412
+ process.env.TMUX_PANE = '%1';
3413
+ process.env.OMX_TEAM_WORKER_CLI = 'gemini';
3414
+ console.warn = (...args) => { warnings.push(args.map(String).join(' ')); };
3415
+ const session = createTeamSession('Run Shell Fallback', 1, cwd);
3416
+ assert.equal(session.hudPaneId, '%3');
3417
+ assert.match(warnings.join('\n'), /HUD resize/);
3418
+ assert.match(warnings.join('\n'), /Unsupported tmux compatibility command: run-shell/);
3419
+ const tmuxLog = await readFile(logPath, 'utf-8');
3420
+ assert.match(tmuxLog, /run-shell -b sleep/);
3421
+ assert.doesNotMatch(tmuxLog, /kill-pane -t %2/);
3422
+ assert.doesNotMatch(tmuxLog, /kill-pane -t %3/);
3423
+ });
3424
+ }
3425
+ finally {
3426
+ console.warn = prevWarn;
3427
+ if (typeof prevTmux === 'string')
3428
+ process.env.TMUX = prevTmux;
3429
+ else
3430
+ delete process.env.TMUX;
3431
+ if (typeof prevTmuxPane === 'string')
3432
+ process.env.TMUX_PANE = prevTmuxPane;
3433
+ else
3434
+ delete process.env.TMUX_PANE;
3435
+ if (typeof prevWorkerCli === 'string')
3436
+ process.env.OMX_TEAM_WORKER_CLI = prevWorkerCli;
3437
+ else
3438
+ delete process.env.OMX_TEAM_WORKER_CLI;
3439
+ await rm(cwd, { recursive: true, force: true });
3440
+ }
3441
+ });
3442
+ });
3443
+ describe('native Windows HUD reconciliation', () => {
3444
+ it('allows team startup on native Windows when current tmux client is reachable without TMUX env vars', async () => {
3445
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-team-win32-no-env-'));
3446
+ const prevTmux = process.env.TMUX;
3447
+ const prevTmuxPane = process.env.TMUX_PANE;
3448
+ const prevWorkerCli = process.env.OMX_TEAM_WORKER_CLI;
3449
+ const prevMsystem = process.env.MSYSTEM;
3450
+ const prevOstype = process.env.OSTYPE;
3451
+ const prevWsl = process.env.WSL_DISTRO_NAME;
3452
+ const prevWslInterop = process.env.WSL_INTEROP;
3453
+ const origPlatform = Object.getOwnPropertyDescriptor(process, 'platform');
3454
+ try {
3455
+ await withMockTmuxFixture('omx-tmux-win32-no-env-', (logPath) => `#!/bin/sh
3456
+ set -eu
3457
+ printf '%s\\n' "$*" >> "${logPath}"
3458
+ case "\${1:-}" in
3459
+ -V)
3460
+ echo "tmux 3.4"
3461
+ exit 0
3462
+ ;;
3463
+ display-message)
3464
+ case "$*" in
3465
+ *"#{window_width}"*)
3466
+ echo "120"
3467
+ ;;
3468
+ *)
3469
+ echo "leader:0 %1"
3470
+ ;;
3471
+ esac
3472
+ exit 0
3473
+ ;;
3474
+ list-panes)
3475
+ case "$*" in
3476
+ *"pane_current_command"*)
3477
+ printf "%%1\\tnode\\t'codex'\\n%%2\\tgemini\\t'gemini'\\n%%3\\tnode\\t'node omx hud --watch'\\n"
3478
+ ;;
3479
+ *)
3480
+ printf "%%1\\n%%2\\n%%3\\n"
3481
+ ;;
3482
+ esac
3483
+ exit 0
3484
+ ;;
3485
+ split-window)
3486
+ case "$*" in
3487
+ *" -h "*)
3488
+ echo "%2"
3489
+ ;;
3490
+ *)
3491
+ echo "%3"
3492
+ ;;
3493
+ esac
3494
+ exit 0
3495
+ ;;
3496
+ resize-pane|select-layout|set-window-option|select-pane|kill-pane|set-hook|run-shell)
3497
+ exit 0
3498
+ ;;
3499
+ *)
3500
+ exit 0
3501
+ ;;
3502
+ esac
3503
+ `, async ({ logPath }) => {
3504
+ const fakeBinDir = join(logPath, '..');
3505
+ const geminiPath = join(fakeBinDir, 'gemini');
3506
+ await writeFile(geminiPath, '#!/bin/sh\nexit 0\n');
3507
+ await chmod(geminiPath, 0o755);
3508
+ delete process.env.TMUX;
3509
+ delete process.env.TMUX_PANE;
3510
+ process.env.OMX_TEAM_WORKER_CLI = 'gemini';
3511
+ delete process.env.MSYSTEM;
3512
+ delete process.env.OSTYPE;
3513
+ delete process.env.WSL_DISTRO_NAME;
3514
+ delete process.env.WSL_INTEROP;
3515
+ Object.defineProperty(process, 'platform', { value: 'win32', configurable: true });
3516
+ const session = createTeamSession('Windows Team', 1, cwd);
3517
+ assert.equal(session.name, 'leader:0');
3518
+ assert.equal(session.leaderPaneId, '%1');
3519
+ assert.equal(session.hudPaneId, '%3');
3520
+ const tmuxLog = await readFile(logPath, 'utf-8');
3521
+ assert.match(tmuxLog, /display-message -p #\{session_name\}:#\{window_index\} #\{pane_id\}/);
3522
+ assert.match(tmuxLog, /powershell\.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -EncodedCommand/);
3523
+ assert.doesNotMatch(tmuxLog, /\/bin\/sh -lc/);
3524
+ assert.match(tmuxLog, new RegExp(`resize-pane -t %3 -y ${HUD_TMUX_TEAM_HEIGHT_LINES}`));
3525
+ });
3526
+ }
3527
+ finally {
3528
+ if (origPlatform)
3529
+ Object.defineProperty(process, 'platform', origPlatform);
3530
+ if (typeof prevTmux === 'string')
3531
+ process.env.TMUX = prevTmux;
3532
+ else
3533
+ delete process.env.TMUX;
3534
+ if (typeof prevTmuxPane === 'string')
3535
+ process.env.TMUX_PANE = prevTmuxPane;
3536
+ else
3537
+ delete process.env.TMUX_PANE;
3538
+ if (typeof prevWorkerCli === 'string')
3539
+ process.env.OMX_TEAM_WORKER_CLI = prevWorkerCli;
3540
+ else
3541
+ delete process.env.OMX_TEAM_WORKER_CLI;
3542
+ if (typeof prevMsystem === 'string')
3543
+ process.env.MSYSTEM = prevMsystem;
3544
+ else
3545
+ delete process.env.MSYSTEM;
3546
+ if (typeof prevOstype === 'string')
3547
+ process.env.OSTYPE = prevOstype;
3548
+ else
3549
+ delete process.env.OSTYPE;
3550
+ if (typeof prevWsl === 'string')
3551
+ process.env.WSL_DISTRO_NAME = prevWsl;
3552
+ else
3553
+ delete process.env.WSL_DISTRO_NAME;
3554
+ if (typeof prevWslInterop === 'string')
3555
+ process.env.WSL_INTEROP = prevWslInterop;
3556
+ else
3557
+ delete process.env.WSL_INTEROP;
3558
+ await rm(cwd, { recursive: true, force: true });
3559
+ }
3560
+ });
3561
+ it('avoids nested tmux run-shell hooks during team HUD startup on native Windows', async () => {
3562
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-team-win32-hud-'));
3563
+ const prevTmux = process.env.TMUX;
3564
+ const prevTmuxPane = process.env.TMUX_PANE;
3565
+ const prevWorkerCli = process.env.OMX_TEAM_WORKER_CLI;
3566
+ const prevMsystem = process.env.MSYSTEM;
3567
+ const prevOstype = process.env.OSTYPE;
3568
+ const prevWsl = process.env.WSL_DISTRO_NAME;
3569
+ const prevWslInterop = process.env.WSL_INTEROP;
3570
+ const origPlatform = Object.getOwnPropertyDescriptor(process, 'platform');
3571
+ try {
3572
+ await withMockTmuxFixture('omx-tmux-win32-hud-reconcile-', (logPath) => `#!/bin/sh
3573
+ set -eu
3574
+ printf '%s\\n' "$*" >> "${logPath}"
3575
+ case "\${1:-}" in
3576
+ -V)
3577
+ echo "tmux 3.4"
3578
+ exit 0
3579
+ ;;
3580
+ display-message)
3581
+ case "$*" in
3582
+ *"#{window_width}"*)
3583
+ echo "120"
3584
+ ;;
3585
+ *)
3586
+ echo "leader:0 %1"
3587
+ ;;
3588
+ esac
3589
+ exit 0
3590
+ ;;
3591
+ list-panes)
3592
+ case "$*" in
3593
+ *"pane_current_command"*)
3594
+ printf "%%1\\tnode\\t'codex'\\n%%2\\tgemini\\t'gemini'\\n%%3\\tnode\\t'node omx hud --watch'\\n"
3595
+ ;;
3596
+ *)
3597
+ printf "%%1\\n%%2\\n%%3\\n"
3598
+ ;;
3599
+ esac
3600
+ exit 0
3601
+ ;;
3602
+ split-window)
3603
+ case "$*" in
3604
+ *" -h "*)
3605
+ echo "%2"
3606
+ ;;
3607
+ *)
3608
+ echo "%3"
3609
+ ;;
3610
+ esac
3611
+ exit 0
3612
+ ;;
3613
+ resize-pane|select-layout|set-window-option|select-pane|kill-pane)
3614
+ exit 0
3615
+ ;;
3616
+ set-hook|run-shell)
3617
+ exit 0
3618
+ ;;
3619
+ *)
3620
+ exit 0
3621
+ ;;
3622
+ esac
3623
+ `, async ({ logPath }) => {
3624
+ const fakeBinDir = join(logPath, '..');
3625
+ const geminiPath = join(fakeBinDir, 'gemini');
3626
+ await writeFile(geminiPath, '#!/bin/sh\nexit 0\n');
3627
+ await chmod(geminiPath, 0o755);
3628
+ process.env.TMUX = 'leader-session,stub,0';
3629
+ process.env.TMUX_PANE = '%1';
3630
+ process.env.OMX_TEAM_WORKER_CLI = 'gemini';
3631
+ delete process.env.MSYSTEM;
3632
+ delete process.env.OSTYPE;
3633
+ delete process.env.WSL_DISTRO_NAME;
3634
+ delete process.env.WSL_INTEROP;
3635
+ Object.defineProperty(process, 'platform', { value: 'win32', configurable: true });
3636
+ const session = createTeamSession('Windows Team', 1, cwd);
3637
+ assert.equal(session.hudPaneId, '%3');
3638
+ assert.equal(session.resizeHookName, null);
3639
+ assert.equal(session.resizeHookTarget, null);
3640
+ const tmuxLog = await readFile(logPath, 'utf-8');
3641
+ assert.match(tmuxLog, new RegExp(`resize-pane -t %3 -y ${HUD_TMUX_TEAM_HEIGHT_LINES}`));
3642
+ assert.doesNotMatch(tmuxLog, /set-hook -w /);
3643
+ assert.doesNotMatch(tmuxLog, /window-resized\[/);
3644
+ assert.doesNotMatch(tmuxLog, /set-hook -t leader:0 client-attached\[\d+\]/);
3645
+ assert.doesNotMatch(tmuxLog, /run-shell -b sleep \d+; tmux resize-pane -t %3 -y \d+ >/);
3646
+ assert.doesNotMatch(tmuxLog, /run-shell tmux resize-pane -t %3 -y \d+ >/);
3647
+ });
3648
+ }
3649
+ finally {
3650
+ if (origPlatform)
3651
+ Object.defineProperty(process, 'platform', origPlatform);
3652
+ if (typeof prevTmux === 'string')
3653
+ process.env.TMUX = prevTmux;
3654
+ else
3655
+ delete process.env.TMUX;
3656
+ if (typeof prevTmuxPane === 'string')
3657
+ process.env.TMUX_PANE = prevTmuxPane;
3658
+ else
3659
+ delete process.env.TMUX_PANE;
3660
+ if (typeof prevWorkerCli === 'string')
3661
+ process.env.OMX_TEAM_WORKER_CLI = prevWorkerCli;
3662
+ else
3663
+ delete process.env.OMX_TEAM_WORKER_CLI;
3664
+ if (typeof prevMsystem === 'string')
3665
+ process.env.MSYSTEM = prevMsystem;
3666
+ else
3667
+ delete process.env.MSYSTEM;
3668
+ if (typeof prevOstype === 'string')
3669
+ process.env.OSTYPE = prevOstype;
3670
+ else
3671
+ delete process.env.OSTYPE;
3672
+ if (typeof prevWsl === 'string')
3673
+ process.env.WSL_DISTRO_NAME = prevWsl;
3674
+ else
3675
+ delete process.env.WSL_DISTRO_NAME;
3676
+ if (typeof prevWslInterop === 'string')
3677
+ process.env.WSL_INTEROP = prevWslInterop;
3678
+ else
3679
+ delete process.env.WSL_INTEROP;
3680
+ await rm(cwd, { recursive: true, force: true });
3681
+ }
3682
+ });
3683
+ it('rejects synthetic worker and HUD pane ids that never materialize on native Windows', async () => {
3684
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-team-win32-synthetic-pane-'));
3685
+ const prevTmux = process.env.TMUX;
3686
+ const prevTmuxPane = process.env.TMUX_PANE;
3687
+ const prevWorkerCli = process.env.OMX_TEAM_WORKER_CLI;
3688
+ const prevMsystem = process.env.MSYSTEM;
3689
+ const prevOstype = process.env.OSTYPE;
3690
+ const prevWsl = process.env.WSL_DISTRO_NAME;
3691
+ const prevWslInterop = process.env.WSL_INTEROP;
3692
+ const origPlatform = Object.getOwnPropertyDescriptor(process, 'platform');
3693
+ try {
3694
+ await withMockTmuxFixture('omx-tmux-win32-synthetic-pane-', (logPath) => `#!/bin/sh
3695
+ set -eu
3696
+ printf '%s\\n' "$*" >> "${logPath}"
3697
+ case "\${1:-}" in
3698
+ -V)
3699
+ echo "tmux 3.3.2"
3700
+ exit 0
3701
+ ;;
3702
+ display-message)
3703
+ case "$*" in
3704
+ *"#{window_width}"*)
3705
+ echo "120"
3706
+ ;;
3707
+ *)
3708
+ echo "leader:0 %1"
3709
+ ;;
3710
+ esac
3711
+ exit 0
3712
+ ;;
3713
+ list-panes)
3714
+ case "$*" in
3715
+ *"pane_current_command"*)
3716
+ printf "%%1\\tnode\\t'codex'\\n"
3717
+ ;;
3718
+ *)
3719
+ printf "%%1\\n"
3720
+ ;;
3721
+ esac
3722
+ exit 0
3723
+ ;;
3724
+ split-window)
3725
+ case "$*" in
3726
+ *" -h "*)
3727
+ echo "%2"
3728
+ ;;
3729
+ *)
3730
+ echo "%3"
3731
+ ;;
3732
+ esac
3733
+ exit 0
3734
+ ;;
3735
+ kill-pane|select-layout|set-window-option|select-pane|resize-pane|set-hook|run-shell)
3736
+ exit 0
3737
+ ;;
3738
+ *)
3739
+ exit 0
3740
+ ;;
3741
+ esac
3742
+ `, async ({ logPath }) => {
3743
+ const fakeBinDir = join(logPath, '..');
3744
+ const geminiPath = join(fakeBinDir, 'gemini');
3745
+ const powershellExePath = join(fakeBinDir, 'powershell.exe');
3746
+ await writeFile(geminiPath, '#!/bin/sh\nexit 0\n');
3747
+ await chmod(geminiPath, 0o755);
3748
+ await writeFile(powershellExePath, '');
3749
+ process.env.TMUX = 'leader-session,stub,0';
3750
+ process.env.TMUX_PANE = '%1';
3751
+ process.env.OMX_TEAM_WORKER_CLI = 'gemini';
3752
+ delete process.env.MSYSTEM;
3753
+ delete process.env.OSTYPE;
3754
+ delete process.env.WSL_DISTRO_NAME;
3755
+ delete process.env.WSL_INTEROP;
3756
+ Object.defineProperty(process, 'platform', { value: 'win32', configurable: true });
3757
+ assert.throws(() => createTeamSession('Windows Team', 1, cwd), /worker pane 1 did not remain present/);
3758
+ const tmuxLog = await readFile(logPath, 'utf-8');
3759
+ const listPaneCalls = tmuxLog.match(/list-panes -t leader:0 -F #\{pane_id\}\t#\{pane_current_command\}\t#\{pane_start_command\}/g) || [];
3760
+ assert.ok(listPaneCalls.length >= 2, tmuxLog);
3761
+ assert.match(tmuxLog, /kill-pane -t %2/);
3762
+ });
3763
+ }
3764
+ finally {
3765
+ if (origPlatform)
3766
+ Object.defineProperty(process, 'platform', origPlatform);
3767
+ if (typeof prevTmux === 'string')
3768
+ process.env.TMUX = prevTmux;
3769
+ else
3770
+ delete process.env.TMUX;
3771
+ if (typeof prevTmuxPane === 'string')
3772
+ process.env.TMUX_PANE = prevTmuxPane;
3773
+ else
3774
+ delete process.env.TMUX_PANE;
3775
+ if (typeof prevWorkerCli === 'string')
3776
+ process.env.OMX_TEAM_WORKER_CLI = prevWorkerCli;
3777
+ else
3778
+ delete process.env.OMX_TEAM_WORKER_CLI;
3779
+ if (typeof prevMsystem === 'string')
3780
+ process.env.MSYSTEM = prevMsystem;
3781
+ else
3782
+ delete process.env.MSYSTEM;
3783
+ if (typeof prevOstype === 'string')
3784
+ process.env.OSTYPE = prevOstype;
3785
+ else
3786
+ delete process.env.OSTYPE;
3787
+ if (typeof prevWsl === 'string')
3788
+ process.env.WSL_DISTRO_NAME = prevWsl;
3789
+ else
3790
+ delete process.env.WSL_DISTRO_NAME;
3791
+ if (typeof prevWslInterop === 'string')
3792
+ process.env.WSL_INTEROP = prevWslInterop;
3793
+ else
3794
+ delete process.env.WSL_INTEROP;
3795
+ await rm(cwd, { recursive: true, force: true });
3796
+ }
3797
+ });
3798
+ it('restores standalone HUD panes with direct resize on native Windows', async () => {
3799
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-standalone-win32-hud-'));
3800
+ const prevLeaderNodePath = process.env.OMX_LEADER_NODE_PATH;
3801
+ const prevMsystem = process.env.MSYSTEM;
3802
+ const prevOstype = process.env.OSTYPE;
3803
+ const prevWsl = process.env.WSL_DISTRO_NAME;
3804
+ const prevWslInterop = process.env.WSL_INTEROP;
3805
+ const origPlatform = Object.getOwnPropertyDescriptor(process, 'platform');
3806
+ try {
3807
+ await withMockTmuxFixture('omx-tmux-win32-standalone-hud-', (logPath) => `#!/bin/sh
3808
+ set -eu
3809
+ printf '%s\\n' "$*" >> "${logPath}"
3810
+ case "\${1:-}" in
3811
+ split-window)
3812
+ echo "%44"
3813
+ exit 0
3814
+ ;;
3815
+ resize-pane|select-pane)
3816
+ exit 0
3817
+ ;;
3818
+ set-hook|run-shell)
3819
+ exit 0
3820
+ ;;
3821
+ *)
3822
+ exit 0
3823
+ ;;
3824
+ esac
3825
+ `, async ({ logPath }) => {
3826
+ delete process.env.MSYSTEM;
3827
+ delete process.env.OSTYPE;
3828
+ delete process.env.WSL_DISTRO_NAME;
3829
+ delete process.env.WSL_INTEROP;
3830
+ process.env.OMX_LEADER_NODE_PATH = 'C:\\Program Files\\nodejs\\node.exe';
3831
+ Object.defineProperty(process, 'platform', { value: 'win32', configurable: true });
3832
+ const paneId = restoreStandaloneHudPane('%11', cwd);
3833
+ assert.equal(paneId, '%44');
3834
+ const tmuxLog = await readFile(logPath, 'utf-8');
3835
+ assert.match(tmuxLog, /'C:\\Program Files\\nodejs\\node\.exe'/);
3836
+ assert.match(tmuxLog, new RegExp(`resize-pane -t %44 -y ${HUD_TMUX_TEAM_HEIGHT_LINES}`));
3837
+ assert.match(tmuxLog, /select-pane -t %11/);
3838
+ assert.doesNotMatch(tmuxLog, /run-shell -b sleep \d+; tmux resize-pane -t %44 -y \d+ >/);
3839
+ assert.doesNotMatch(tmuxLog, /run-shell tmux resize-pane -t %44 -y \d+ >/);
3840
+ assert.doesNotMatch(tmuxLog, /set-hook -t /);
3841
+ });
3842
+ }
3843
+ finally {
3844
+ if (origPlatform)
3845
+ Object.defineProperty(process, 'platform', origPlatform);
3846
+ if (typeof prevLeaderNodePath === 'string')
3847
+ process.env.OMX_LEADER_NODE_PATH = prevLeaderNodePath;
3848
+ else
3849
+ delete process.env.OMX_LEADER_NODE_PATH;
3850
+ if (typeof prevMsystem === 'string')
3851
+ process.env.MSYSTEM = prevMsystem;
3852
+ else
3853
+ delete process.env.MSYSTEM;
3854
+ if (typeof prevOstype === 'string')
3855
+ process.env.OSTYPE = prevOstype;
3856
+ else
3857
+ delete process.env.OSTYPE;
3858
+ if (typeof prevWsl === 'string')
3859
+ process.env.WSL_DISTRO_NAME = prevWsl;
3860
+ else
3861
+ delete process.env.WSL_DISTRO_NAME;
3862
+ if (typeof prevWslInterop === 'string')
3863
+ process.env.WSL_INTEROP = prevWslInterop;
3864
+ else
3865
+ delete process.env.WSL_INTEROP;
3866
+ await rm(cwd, { recursive: true, force: true });
3867
+ }
3868
+ });
3869
+ it('reuses an existing standalone HUD pane across repeated restore calls', async () => {
3870
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-standalone-reuse-hud-'));
3871
+ try {
3872
+ await withMockTmuxFixture('omx-tmux-reuse-standalone-hud-', (logPath) => {
3873
+ const statePath = `${logPath}.state`;
3874
+ return `#!/bin/sh
3875
+ set -eu
3876
+ printf '%s\\n' "$*" >> "${logPath}"
3877
+ case "\${1:-}" in
3878
+ list-panes)
3879
+ printf '%%11\\tzsh\\tzsh\\n'
3880
+ if [ -f "${statePath}" ]; then
3881
+ printf "%%44\\tnode\\texec env OMX_TMUX_HUD_OWNER=1 OMX_TMUX_HUD_LEADER_PANE='%%11' /node /omx.js hud --watch\\n"
3882
+ fi
3883
+ exit 0
3884
+ ;;
3885
+ split-window)
3886
+ : > "${statePath}"
3887
+ echo "%44"
3888
+ exit 0
3889
+ ;;
3890
+ run-shell|select-pane|resize-pane|set-hook|kill-pane)
3891
+ exit 0
3892
+ ;;
3893
+ *)
3894
+ exit 0
3895
+ ;;
3896
+ esac
3897
+ `;
3898
+ }, async ({ logPath }) => {
3899
+ const firstPaneId = restoreStandaloneHudPane('%11', cwd);
3900
+ const secondPaneId = restoreStandaloneHudPane('%11', cwd);
3901
+ assert.equal(firstPaneId, '%44');
3902
+ assert.equal(secondPaneId, '%44');
3903
+ const tmuxLog = await readFile(logPath, 'utf-8');
3904
+ const splitCount = (tmuxLog.match(/(^|\n)split-window /g) ?? []).length;
3905
+ assert.equal(splitCount, 1);
3906
+ assert.doesNotMatch(tmuxLog, /kill-pane -t %44/);
3907
+ assert.match(tmuxLog, /list-panes -t %11 -F #\{pane_id\}\t#\{pane_current_command\}\t#\{pane_start_command\}/);
3908
+ });
3909
+ }
3910
+ finally {
3911
+ await rm(cwd, { recursive: true, force: true });
3912
+ }
3913
+ });
3914
+ it('restores standalone HUD panes with an absolute OMX entry path after cwd drift', async () => {
3915
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-standalone-relative-hud-'));
3916
+ const startupCwd = await mkdtemp(join(tmpdir(), 'omx-standalone-relative-start-'));
3917
+ const previousEntryPath = process.env[OMX_ENTRY_PATH_ENV];
3918
+ const previousStartupCwd = process.env[OMX_STARTUP_CWD_ENV];
3919
+ const previousArgv = process.argv;
3920
+ try {
3921
+ const launcherDir = join(startupCwd, 'dist', 'cli');
3922
+ const launcherPath = join(launcherDir, 'omx.js');
3923
+ await mkdir(launcherDir, { recursive: true });
3924
+ await writeFile(launcherPath, '#!/usr/bin/env node\n');
3925
+ await withMockTmuxFixture('omx-tmux-relative-standalone-hud-', (logPath) => `#!/bin/sh
3926
+ set -eu
3927
+ printf '%s\\n' "$*" >> "${logPath}"
3928
+ case "\${1:-}" in
3929
+ split-window)
3930
+ echo "%44"
3931
+ exit 0
3932
+ ;;
3933
+ run-shell|select-pane|resize-pane|set-hook)
3934
+ exit 0
3935
+ ;;
3936
+ *)
3937
+ exit 0
3938
+ ;;
3939
+ esac
3940
+ `, async ({ logPath }) => {
3941
+ delete process.env[OMX_ENTRY_PATH_ENV];
3942
+ process.env[OMX_STARTUP_CWD_ENV] = startupCwd;
3943
+ process.argv = [previousArgv[0] || 'node', 'dist/cli/omx.js'];
3944
+ const paneId = restoreStandaloneHudPane('%11', cwd);
3945
+ assert.equal(paneId, '%44');
3946
+ const tmuxLog = await readFile(logPath, 'utf-8');
3947
+ assert.match(tmuxLog, new RegExp(escapeRegExp(launcherPath)));
3948
+ assert.doesNotMatch(tmuxLog, /'dist\/cli\/omx\.js' hud --watch/);
3949
+ assert.match(tmuxLog, /exec env OMX_TMUX_HUD_OWNER=1 OMX_TMUX_HUD_LEADER_PANE='%11' .*hud --watch/);
3950
+ });
3951
+ }
3952
+ finally {
3953
+ process.argv = previousArgv;
3954
+ if (typeof previousEntryPath === 'string')
3955
+ process.env[OMX_ENTRY_PATH_ENV] = previousEntryPath;
3956
+ else
3957
+ delete process.env[OMX_ENTRY_PATH_ENV];
3958
+ if (typeof previousStartupCwd === 'string')
3959
+ process.env[OMX_STARTUP_CWD_ENV] = previousStartupCwd;
3960
+ else
3961
+ delete process.env[OMX_STARTUP_CWD_ENV];
3962
+ await rm(cwd, { recursive: true, force: true });
3963
+ await rm(startupCwd, { recursive: true, force: true });
3964
+ }
3965
+ });
3966
+ it('restores standalone HUD panes with the packaged CLI entry when argv1 is not the OMX CLI', async () => {
3967
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-standalone-noncli-hud-'));
3968
+ const previousArgv = process.argv;
3969
+ try {
3970
+ await withMockTmuxFixture('omx-tmux-noncli-standalone-hud-', (logPath) => `#!/bin/sh
3971
+ set -eu
3972
+ printf '%s\\n' "$*" >> "${logPath}"
3973
+ case "\${1:-}" in
3974
+ split-window)
3975
+ echo "%44"
3976
+ exit 0
3977
+ ;;
3978
+ run-shell|select-pane|resize-pane|set-hook)
3979
+ exit 0
3980
+ ;;
3981
+ *)
3982
+ exit 0
3983
+ ;;
3984
+ esac
3985
+ `, async ({ logPath }) => {
3986
+ process.argv = [previousArgv[0] || 'node', '/tmp/codex-host-binary'];
3987
+ const paneId = restoreStandaloneHudPane('%11', cwd);
3988
+ assert.equal(paneId, '%44');
3989
+ const tmuxLog = await readFile(logPath, 'utf-8');
3990
+ assert.match(tmuxLog, /dist\/cli\/omx\.js' hud --watch/);
3991
+ assert.doesNotMatch(tmuxLog, /\/tmp\/codex-host-binary' hud --watch/);
3992
+ assert.match(tmuxLog, /exec env OMX_TMUX_HUD_OWNER=1 .*hud --watch/);
3993
+ });
3994
+ }
3995
+ finally {
3996
+ process.argv = previousArgv;
3997
+ await rm(cwd, { recursive: true, force: true });
3998
+ }
3999
+ });
4000
+ it('restores standalone HUD panes with OMX_ROOT forwarded and shell-escaped', async () => {
4001
+ const cwd = await mkdtemp(join(tmpdir(), 'omx-standalone-root-hud-'));
4002
+ const previousOmxRoot = process.env.OMX_ROOT;
4003
+ try {
4004
+ await withMockTmuxFixture('omx-tmux-root-standalone-hud-', (logPath) => `#!/bin/sh
4005
+ set -eu
4006
+ printf '%s\\n' "$*" >> "${logPath}"
4007
+ case "\${1:-}" in
4008
+ split-window)
4009
+ echo "%44"
4010
+ exit 0
4011
+ ;;
4012
+ run-shell|select-pane|resize-pane|set-hook)
4013
+ exit 0
4014
+ ;;
4015
+ *)
4016
+ exit 0
4017
+ ;;
4018
+ esac
4019
+ `, async ({ logPath }) => {
4020
+ process.env.OMX_ROOT = "/tmp/boxed root/it's/$(literal)";
4021
+ const paneId = restoreStandaloneHudPane('%11', cwd);
4022
+ assert.equal(paneId, '%44');
4023
+ const tmuxLog = await readFile(logPath, 'utf-8');
4024
+ assert.match(tmuxLog, /exec env OMX_TMUX_HUD_OWNER=1 OMX_TMUX_HUD_LEADER_PANE='%11' OMX_ROOT='\/tmp\/boxed root\/it'\\''s\/\$\(literal\)' .*hud --watch/);
4025
+ });
4026
+ }
4027
+ finally {
4028
+ if (typeof previousOmxRoot === 'string')
4029
+ process.env.OMX_ROOT = previousOmxRoot;
4030
+ else
4031
+ delete process.env.OMX_ROOT;
4032
+ await rm(cwd, { recursive: true, force: true });
4033
+ }
4034
+ });
4035
+ });
4036
+ describe('dismissTrustPromptIfPresent capture shape', () => {
4037
+ it('uses visible capture-pane argv without tail flags', async () => {
4038
+ const previousAutoTrust = process.env.OMX_TEAM_AUTO_TRUST;
4039
+ delete process.env.OMX_TEAM_AUTO_TRUST;
4040
+ try {
4041
+ await withMockTmuxFixture('omx-tmux-dismiss-trust-visible-capture-', (logPath) => `#!/bin/sh
4042
+ set -eu
4043
+ printf '%s\n' "$*" >> "${logPath}"
4044
+ case "$1" in
4045
+ capture-pane)
4046
+ cat <<'EOF'
4047
+ Do you trust the contents of this directory?
4048
+ Press enter to continue
4049
+ EOF
4050
+ exit 0
4051
+ ;;
4052
+ send-keys)
4053
+ exit 0
4054
+ ;;
4055
+ *)
4056
+ exit 0
4057
+ ;;
4058
+ esac
4059
+ `, async ({ logPath }) => {
4060
+ assert.equal(dismissTrustPromptIfPresent('omx-team-x', 1), true);
4061
+ const log = await readFile(logPath, 'utf-8');
4062
+ assert.match(log, /capture-pane -t omx-team-x:1 -p/);
4063
+ assert.doesNotMatch(log, /capture-pane -t omx-team-x:1 -p -S/);
4064
+ });
4065
+ }
4066
+ finally {
4067
+ if (typeof previousAutoTrust === 'string')
4068
+ process.env.OMX_TEAM_AUTO_TRUST = previousAutoTrust;
4069
+ else
4070
+ delete process.env.OMX_TEAM_AUTO_TRUST;
4071
+ }
4072
+ });
4073
+ });
4074
+ describe('dismissTrustPromptIfPresent', () => {
4075
+ it('returns false when tmux is unavailable', () => {
4076
+ withEmptyPath(() => {
4077
+ assert.equal(dismissTrustPromptIfPresent('omx-team-x', 1), false);
4078
+ });
4079
+ });
4080
+ it('returns false when OMX_TEAM_AUTO_TRUST is disabled', () => {
4081
+ const prev = process.env.OMX_TEAM_AUTO_TRUST;
4082
+ process.env.OMX_TEAM_AUTO_TRUST = '0';
4083
+ try {
4084
+ assert.equal(dismissTrustPromptIfPresent('omx-team-x', 1), false);
4085
+ }
4086
+ finally {
4087
+ if (typeof prev === 'string')
4088
+ process.env.OMX_TEAM_AUTO_TRUST = prev;
4089
+ else
4090
+ delete process.env.OMX_TEAM_AUTO_TRUST;
4091
+ }
4092
+ });
4093
+ it('returns false when OMX_TEAM_AUTO_TRUST is unset (auto-trust enabled) but tmux unavailable', () => {
4094
+ const prev = process.env.OMX_TEAM_AUTO_TRUST;
4095
+ delete process.env.OMX_TEAM_AUTO_TRUST;
4096
+ try {
4097
+ withEmptyPath(() => {
4098
+ assert.equal(dismissTrustPromptIfPresent('omx-team-x', 1), false);
4099
+ });
4100
+ }
4101
+ finally {
4102
+ if (typeof prev === 'string')
4103
+ process.env.OMX_TEAM_AUTO_TRUST = prev;
4104
+ }
4105
+ });
4106
+ });
4107
+ describe('isWorkerAlive', () => {
4108
+ it('does not require pane_current_command to match "codex"', () => {
4109
+ // This was a real failure mode: tmux reports pane_current_command=node for the Codex TUI,
4110
+ // which caused workers to be treated as dead and the leader to clean up state too early.
4111
+ withEmptyPath(() => {
4112
+ assert.equal(isWorkerAlive('omx-team-x', 1), false);
4113
+ });
4114
+ });
4115
+ it('treats an existing non-dead pane id as live even when pane_pid is unavailable', async () => {
4116
+ await withMockTmuxFixture('omx-pane-id-liveness-', (logPath) => `#!/bin/sh
4117
+ set -eu
4118
+ printf '%s\n' "$*" >> "${logPath}"
4119
+ case "\${1:-}" in
4120
+ -V)
4121
+ echo "tmux 3.4"
4122
+ exit 0
4123
+ ;;
4124
+ list-panes)
4125
+ if [ "$2" = "-a" ]; then
4126
+ printf "%%77 0 \\n%%88 1 \\n"
4127
+ exit 0
4128
+ fi
4129
+ exit 1
4130
+ ;;
4131
+ *)
4132
+ exit 1
4133
+ ;;
4134
+ esac
4135
+ `, async () => {
4136
+ assert.equal(isWorkerAlive('ignored-session', 1, '%77'), true);
4137
+ assert.equal(isWorkerPaneOpen('ignored-session', 1, '%77'), true);
4138
+ assert.equal(isWorkerAlive('ignored-session', 2, '%88'), false);
4139
+ });
4140
+ });
4141
+ });
4142
+ describe('isWsl2', () => {
4143
+ it('returns true when WSL_DISTRO_NAME is set', () => {
4144
+ const prev = process.env.WSL_DISTRO_NAME;
4145
+ process.env.WSL_DISTRO_NAME = 'Ubuntu-22.04';
4146
+ try {
4147
+ assert.equal(isWsl2(), true);
4148
+ }
4149
+ finally {
4150
+ if (typeof prev === 'string')
4151
+ process.env.WSL_DISTRO_NAME = prev;
4152
+ else
4153
+ delete process.env.WSL_DISTRO_NAME;
4154
+ }
4155
+ });
4156
+ it('returns true when WSL_INTEROP is set and WSL_DISTRO_NAME is absent', () => {
4157
+ const prevDistro = process.env.WSL_DISTRO_NAME;
4158
+ const prevInterop = process.env.WSL_INTEROP;
4159
+ delete process.env.WSL_DISTRO_NAME;
4160
+ process.env.WSL_INTEROP = '/run/WSL/8_interop';
4161
+ try {
4162
+ assert.equal(isWsl2(), true);
4163
+ }
4164
+ finally {
4165
+ if (typeof prevDistro === 'string')
4166
+ process.env.WSL_DISTRO_NAME = prevDistro;
4167
+ else
4168
+ delete process.env.WSL_DISTRO_NAME;
4169
+ if (typeof prevInterop === 'string')
4170
+ process.env.WSL_INTEROP = prevInterop;
4171
+ else
4172
+ delete process.env.WSL_INTEROP;
4173
+ }
4174
+ });
4175
+ it('returns a boolean without throwing when no WSL env vars are present', () => {
4176
+ const prevDistro = process.env.WSL_DISTRO_NAME;
4177
+ const prevInterop = process.env.WSL_INTEROP;
4178
+ delete process.env.WSL_DISTRO_NAME;
4179
+ delete process.env.WSL_INTEROP;
4180
+ try {
4181
+ assert.equal(typeof isWsl2(), 'boolean');
4182
+ }
4183
+ finally {
4184
+ if (typeof prevDistro === 'string')
4185
+ process.env.WSL_DISTRO_NAME = prevDistro;
4186
+ else
4187
+ delete process.env.WSL_DISTRO_NAME;
4188
+ if (typeof prevInterop === 'string')
4189
+ process.env.WSL_INTEROP = prevInterop;
4190
+ else
4191
+ delete process.env.WSL_INTEROP;
4192
+ }
4193
+ });
4194
+ });
4195
+ describe('isMsysOrGitBash', () => {
4196
+ it('returns true on win32 when MSYSTEM is set', () => {
4197
+ assert.equal(isMsysOrGitBash({ MSYSTEM: 'MINGW64' }, 'win32'), true);
4198
+ });
4199
+ it('returns true on win32 when OSTYPE indicates msys/mingw', () => {
4200
+ assert.equal(isMsysOrGitBash({ OSTYPE: 'msys' }, 'win32'), true);
4201
+ assert.equal(isMsysOrGitBash({ OSTYPE: 'mingw64' }, 'win32'), true);
4202
+ });
4203
+ it('returns false outside win32', () => {
4204
+ assert.equal(isMsysOrGitBash({ MSYSTEM: 'MINGW64' }, 'linux'), false);
4205
+ });
4206
+ });
4207
+ describe('translatePathForMsys', () => {
4208
+ it('returns original path outside MSYS2/Git Bash', () => {
4209
+ assert.equal(translatePathForMsys('C:\\repo\\AGENTS.md', {}, 'linux'), 'C:\\repo\\AGENTS.md');
4210
+ });
4211
+ it('uses cygpath translation when available', () => {
4212
+ const translated = translatePathForMsys('C:\\repo\\AGENTS.md', { MSYSTEM: 'MINGW64' }, 'win32', () => ({ status: 0, stdout: '/c/repo/AGENTS.md\n', stderr: '', error: undefined, output: [] }));
4213
+ assert.equal(translated, '/c/repo/AGENTS.md');
4214
+ });
4215
+ it('falls back gracefully when cygpath is unavailable', () => {
4216
+ const translated = translatePathForMsys('C:\\repo\\AGENTS.md', { MSYSTEM: 'MINGW64' }, 'win32', () => ({ status: 1, stdout: '', stderr: 'not found', error: Object.assign(new Error('ENOENT'), { code: 'ENOENT' }), output: [] }));
4217
+ assert.equal(translated, '/c/repo/AGENTS.md');
4218
+ });
4219
+ });
4220
+ describe('isNativeWindows', () => {
4221
+ it('returns true when process.platform is win32 and not WSL2', () => {
4222
+ const origPlatform = Object.getOwnPropertyDescriptor(process, 'platform');
4223
+ const prevDistro = process.env.WSL_DISTRO_NAME;
4224
+ const prevInterop = process.env.WSL_INTEROP;
4225
+ delete process.env.WSL_DISTRO_NAME;
4226
+ delete process.env.WSL_INTEROP;
4227
+ Object.defineProperty(process, 'platform', { value: 'win32', configurable: true });
4228
+ try {
4229
+ assert.equal(isNativeWindows(), true);
4230
+ }
4231
+ finally {
4232
+ if (origPlatform)
4233
+ Object.defineProperty(process, 'platform', origPlatform);
4234
+ if (typeof prevDistro === 'string')
4235
+ process.env.WSL_DISTRO_NAME = prevDistro;
4236
+ else
4237
+ delete process.env.WSL_DISTRO_NAME;
4238
+ if (typeof prevInterop === 'string')
4239
+ process.env.WSL_INTEROP = prevInterop;
4240
+ else
4241
+ delete process.env.WSL_INTEROP;
4242
+ }
4243
+ });
4244
+ it('returns false when process.platform is win32 but WSL2 is detected', () => {
4245
+ const origPlatform = Object.getOwnPropertyDescriptor(process, 'platform');
4246
+ const prevDistro = process.env.WSL_DISTRO_NAME;
4247
+ Object.defineProperty(process, 'platform', { value: 'win32', configurable: true });
4248
+ process.env.WSL_DISTRO_NAME = 'Ubuntu-22.04';
4249
+ try {
4250
+ assert.equal(isNativeWindows(), false);
4251
+ }
4252
+ finally {
4253
+ if (origPlatform)
4254
+ Object.defineProperty(process, 'platform', origPlatform);
4255
+ if (typeof prevDistro === 'string')
4256
+ process.env.WSL_DISTRO_NAME = prevDistro;
4257
+ else
4258
+ delete process.env.WSL_DISTRO_NAME;
4259
+ }
4260
+ });
4261
+ it('returns false on win32 when MSYS2/Git Bash is detected', () => {
4262
+ const origPlatform = Object.getOwnPropertyDescriptor(process, 'platform');
4263
+ const prevMsystem = process.env.MSYSTEM;
4264
+ Object.defineProperty(process, 'platform', { value: 'win32', configurable: true });
4265
+ process.env.MSYSTEM = 'MINGW64';
4266
+ try {
4267
+ assert.equal(isNativeWindows(), false);
4268
+ }
4269
+ finally {
4270
+ if (origPlatform)
4271
+ Object.defineProperty(process, 'platform', origPlatform);
4272
+ if (typeof prevMsystem === 'string')
4273
+ process.env.MSYSTEM = prevMsystem;
4274
+ else
4275
+ delete process.env.MSYSTEM;
4276
+ }
4277
+ });
4278
+ it('returns false on Linux', () => {
4279
+ const origPlatform = Object.getOwnPropertyDescriptor(process, 'platform');
4280
+ Object.defineProperty(process, 'platform', { value: 'linux', configurable: true });
4281
+ try {
4282
+ assert.equal(isNativeWindows(), false);
4283
+ }
4284
+ finally {
4285
+ if (origPlatform)
4286
+ Object.defineProperty(process, 'platform', origPlatform);
4287
+ }
4288
+ });
4289
+ it('returns false on macOS', () => {
4290
+ const origPlatform = Object.getOwnPropertyDescriptor(process, 'platform');
4291
+ Object.defineProperty(process, 'platform', { value: 'darwin', configurable: true });
4292
+ try {
4293
+ assert.equal(isNativeWindows(), false);
4294
+ }
4295
+ finally {
4296
+ if (origPlatform)
4297
+ Object.defineProperty(process, 'platform', origPlatform);
4298
+ }
4299
+ });
4300
+ });
4301
+ describe('enableMouseScrolling', () => {
4302
+ it('returns false when tmux is unavailable', () => {
4303
+ // When tmux is not on PATH, enableMouseScrolling should gracefully return false
4304
+ // rather than throwing, so callers do not need to guard against errors.
4305
+ withEmptyPath(() => {
4306
+ assert.equal(enableMouseScrolling('omx-team-x'), false);
4307
+ });
4308
+ });
4309
+ it('returns false for empty session target when tmux unavailable', () => {
4310
+ withEmptyPath(() => {
4311
+ assert.equal(enableMouseScrolling(''), false);
4312
+ });
4313
+ });
4314
+ it('returns false in WSL2 environment when tmux is unavailable', () => {
4315
+ // WSL2 path: even with the XT override branch active, the function must
4316
+ // return false (not throw) when tmux is not on PATH.
4317
+ const prev = process.env.WSL_DISTRO_NAME;
4318
+ process.env.WSL_DISTRO_NAME = 'Ubuntu-22.04';
4319
+ try {
4320
+ withEmptyPath(() => {
4321
+ assert.equal(enableMouseScrolling('omx-team-x'), false);
4322
+ });
4323
+ }
4324
+ finally {
4325
+ if (typeof prev === 'string')
4326
+ process.env.WSL_DISTRO_NAME = prev;
4327
+ else
4328
+ delete process.env.WSL_DISTRO_NAME;
4329
+ }
4330
+ });
4331
+ });
4332
+ describe('killWorkerByPaneId leader pane guard', () => {
4333
+ it('skips kill when workerPaneId matches leaderPaneId (guard fires before tmux is called)', () => {
4334
+ // With empty PATH tmux is unavailable, so any actual kill-pane call would fail.
4335
+ // When the guard fires (paneId === leaderPaneId) the function returns early
4336
+ // without invoking tmux, so no error is thrown regardless of PATH.
4337
+ withEmptyPath(() => {
4338
+ assert.doesNotThrow(() => killWorkerByPaneId('%5', '%5'));
4339
+ });
4340
+ });
4341
+ it('does not skip kill when pane ids differ (falls through to tmux attempt)', () => {
4342
+ // Different IDs: guard does not fire. tmux is unavailable but kill errors are swallowed internally.
4343
+ withEmptyPath(() => {
4344
+ assert.doesNotThrow(() => killWorkerByPaneId('%5', '%6'));
4345
+ });
4346
+ });
4347
+ it('skips kill for non-percent pane id without reaching tmux', () => {
4348
+ withEmptyPath(() => {
4349
+ assert.doesNotThrow(() => killWorkerByPaneId('invalid', '%5'));
4350
+ });
4351
+ });
4352
+ it('skips kill when no leaderPaneId provided and pane id is valid percent id', () => {
4353
+ // Without leaderPaneId the guard is not active; tmux call fails gracefully.
4354
+ withEmptyPath(() => {
4355
+ assert.doesNotThrow(() => killWorkerByPaneId('%5'));
4356
+ });
4357
+ });
4358
+ });
4359
+ describe('sleepFractionalSeconds', () => {
4360
+ it('uses ceil(ms) so sub-millisecond positive values still sleep', () => {
4361
+ const calls = [];
4362
+ const captureSleep = (ms) => {
4363
+ calls.push(ms);
4364
+ };
4365
+ sleepFractionalSeconds(0.1, captureSleep);
4366
+ sleepFractionalSeconds(0.0001, captureSleep);
4367
+ assert.deepEqual(calls, [100, 1]);
4368
+ });
4369
+ it('ignores invalid values and clamps extreme sleeps to 60s max', () => {
4370
+ const calls = [];
4371
+ const captureSleep = (ms) => {
4372
+ calls.push(ms);
4373
+ };
4374
+ sleepFractionalSeconds(0, captureSleep);
4375
+ sleepFractionalSeconds(-1, captureSleep);
4376
+ sleepFractionalSeconds(NaN, captureSleep);
4377
+ sleepFractionalSeconds(Number.POSITIVE_INFINITY, captureSleep);
4378
+ sleepFractionalSeconds(999_999, captureSleep);
4379
+ assert.deepEqual(calls, [60_000]);
4380
+ });
4381
+ });
4382
+ describe('enableMouseScrolling scroll and copy setup (issue #206)', () => {
4383
+ it('returns false gracefully when scroll-copy setup fails because tmux is unavailable', () => {
4384
+ // With empty PATH the initial "mouse on" call fails, so the function returns
4385
+ // false before any binding calls are made. No throw must occur.
4386
+ withEmptyPath(() => {
4387
+ assert.equal(enableMouseScrolling('omx-team-x'), false);
4388
+ });
4389
+ });
4390
+ it('does not throw when WSL2 env is set and tmux is unavailable (regression + #206)', () => {
4391
+ const prev = process.env.WSL_DISTRO_NAME;
4392
+ process.env.WSL_DISTRO_NAME = 'Ubuntu-22.04';
4393
+ try {
4394
+ withEmptyPath(() => {
4395
+ assert.doesNotThrow(() => enableMouseScrolling('omx-team-x'));
4396
+ });
4397
+ }
4398
+ finally {
4399
+ if (typeof prev === 'string')
4400
+ process.env.WSL_DISTRO_NAME = prev;
4401
+ else
4402
+ delete process.env.WSL_DISTRO_NAME;
4403
+ }
4404
+ });
4405
+ });
4406
+ describe('enableMouseScrolling session scoping (issue #817)', () => {
4407
+ it('only applies session-scoped tmux options and does not mutate global bindings or terminal-overrides', async () => {
4408
+ await withMockTmuxFixture('omx-tmux-enable-mouse-scope-', (tmuxLogPath) => `#!/bin/sh
4409
+ printf '%s\n' "$*" >> "${tmuxLogPath}"
4410
+ case "$1" in
4411
+ show-options)
4412
+ if [ "$2" = "-gv" ] && [ "$3" = "-t" ] && [ "$4" = "omx-team-x" ] && [ "$5" = "mode-style" ]; then
4413
+ printf '%s\n' 'bg=yellow,fg=black,underscore'
4414
+ exit 0
4415
+ fi
4416
+ exit 1
4417
+ ;;
4418
+ set-option)
4419
+ if [ "$2" = "-t" ]; then
4420
+ exit 0
4421
+ fi
4422
+ exit 1
4423
+ ;;
4424
+ *)
4425
+ exit 0
4426
+ ;;
4427
+ esac
4428
+ `, async ({ logPath }) => {
4429
+ assert.equal(enableMouseScrolling('omx-team-x'), true);
4430
+ const tmuxLog = await readFile(logPath, 'utf-8');
4431
+ assert.match(tmuxLog, /set-option -t omx-team-x mouse on/);
4432
+ assert.match(tmuxLog, /set-option -t omx-team-x set-clipboard on/);
4433
+ assert.match(tmuxLog, /set-option -t omx-team-x mode-style bg=yellow,fg=black,underscore,nounderscore,nodouble-underscore,nocurly-underscore,nodotted-underscore,nodashed-underscore/);
4434
+ assert.doesNotMatch(tmuxLog, /bind-key/);
4435
+ assert.doesNotMatch(tmuxLog, /terminal-overrides/);
4436
+ });
4437
+ });
4438
+ });
4439
+ describe('mitigateCopyModeUnderlineArtifacts', () => {
4440
+ it('best-effort sanitizes copy-mode style options without requiring global tmux changes', async () => {
4441
+ await withMockTmuxFixture('omx-tmux-sanitize-copy-style-', (tmuxLogPath) => `#!/bin/sh
4442
+ printf '%s\n' "$*" >> "${tmuxLogPath}"
4443
+ case "$1" in
4444
+ show-options)
4445
+ if [ "$2" = "-gv" ] && [ "$3" = "-t" ] && [ "$4" = "omx-team-x" ] && [ "$5" = "mode-style" ]; then
4446
+ printf '%s\n' 'bg=yellow,fg=black,underscore'
4447
+ exit 0
4448
+ fi
4449
+ if [ "$2" = "-gv" ] && [ "$3" = "-t" ] && [ "$4" = "omx-team-x" ] && [ "$5" = "copy-mode-selection-style" ]; then
4450
+ printf '%s\n' 'fg=white,bg=blue,curly-underscore'
4451
+ exit 0
4452
+ fi
4453
+ exit 1
4454
+ ;;
4455
+ set-option)
4456
+ if [ "$2" = "-t" ]; then
4457
+ exit 0
4458
+ fi
4459
+ exit 1
4460
+ ;;
4461
+ *)
4462
+ exit 0
4463
+ ;;
4464
+ esac
4465
+ `, async ({ logPath }) => {
4466
+ assert.equal(mitigateCopyModeUnderlineArtifacts('omx-team-x'), true);
4467
+ const tmuxLog = await readFile(logPath, 'utf-8');
4468
+ assert.match(tmuxLog, /set-option -t omx-team-x mode-style bg=yellow,fg=black,underscore,nounderscore,nodouble-underscore,nocurly-underscore,nodotted-underscore,nodashed-underscore/);
4469
+ assert.match(tmuxLog, /set-option -t omx-team-x copy-mode-selection-style fg=white,bg=blue,curly-underscore,nounderscore,nodouble-underscore,nocurly-underscore,nodotted-underscore,nodashed-underscore/);
4470
+ assert.doesNotMatch(tmuxLog, /set-option -g/);
4471
+ });
4472
+ });
4473
+ });
4474
+ describe('killWorker leader pane guard', () => {
4475
+ it('returns immediately when workerPaneId matches leaderPaneId', () => {
4476
+ // Guard fires before any tmux send-keys call, so no error even with empty PATH.
4477
+ withEmptyPath(() => {
4478
+ assert.doesNotThrow(() => killWorker('omx-team-x:0', 1, '%5', '%5'));
4479
+ });
4480
+ });
4481
+ it('proceeds (gracefully) when pane ids differ', () => {
4482
+ // Guard does not fire; tmux calls fail gracefully with empty PATH.
4483
+ withEmptyPath(() => {
4484
+ assert.doesNotThrow(() => killWorker('omx-team-x:0', 1, '%5', '%6'));
4485
+ });
4486
+ });
4487
+ it('proceeds when leaderPaneId is not provided', () => {
4488
+ withEmptyPath(() => {
4489
+ assert.doesNotThrow(() => killWorker('omx-team-x:0', 1, '%5'));
4490
+ });
4491
+ });
4492
+ });
4493
+ describe('teardownWorkerPanes shared primitive', () => {
4494
+ it('excludes leader and hud panes in shared pane-kill primitive', async () => {
4495
+ await withMockTmuxFixture('omx-tmux-teardown-', (logPath) => `#!/bin/sh
4496
+ set -eu
4497
+ printf '%s\\n' "$*" >> "${logPath}"
4498
+ exit 0
4499
+ `, async ({ logPath }) => {
4500
+ const summary = await teardownWorkerPanes(['%1', '%2', '%3'], {
4501
+ leaderPaneId: '%1',
4502
+ hudPaneId: '%2',
4503
+ graceMs: 1,
4504
+ });
4505
+ assert.equal(summary.excluded.leader, 1);
4506
+ assert.equal(summary.excluded.hud, 1);
4507
+ assert.equal(summary.kill.attempted, 1);
4508
+ assert.equal(summary.kill.succeeded, 1);
4509
+ const log = await readFile(logPath, 'utf-8');
4510
+ assert.match(log, /kill-pane -t %3/);
4511
+ assert.doesNotMatch(log, /kill-pane -t %1/);
4512
+ assert.doesNotMatch(log, /kill-pane -t %2/);
4513
+ });
4514
+ });
4515
+ it('uses pane-id-direct kill semantics without liveness-gated helper calls', async () => {
4516
+ const source = await readFile(new URL('../tmux-session.js', import.meta.url), 'utf-8');
4517
+ const primitiveBlock = source.split('export async function teardownWorkerPanes')[1] ?? '';
4518
+ assert.equal(primitiveBlock.includes('isWorkerAlive'), false);
4519
+ assert.equal(primitiveBlock.includes('killWorker('), false);
4520
+ });
4521
+ it('continues best-effort when a pane target is missing', async () => {
4522
+ await withMockTmuxFixture('omx-tmux-teardown-missing-', (logPath) => `#!/bin/sh
4523
+ set -eu
4524
+ printf '%s\\n' "$*" >> "${logPath}"
4525
+ if [ "$1" = "kill-pane" ] && [ "\${3:-}" = "%404" ]; then
4526
+ echo "missing pane" >&2
4527
+ exit 1
4528
+ fi
4529
+ exit 0
4530
+ `, async ({ logPath }) => {
4531
+ const summary = await teardownWorkerPanes(['%404', '%405'], { graceMs: 1 });
4532
+ assert.equal(summary.kill.attempted, 2);
4533
+ assert.equal(summary.kill.succeeded, 1);
4534
+ assert.equal(summary.kill.failed, 1);
4535
+ const log = await readFile(logPath, 'utf-8');
4536
+ assert.match(log, /kill-pane -t %404/);
4537
+ assert.match(log, /kill-pane -t %405/);
4538
+ });
4539
+ });
4540
+ });
4541
+ describe('leader mailbox-only boundary', () => {
4542
+ it('does not export direct leader pane injection helper', () => {
4543
+ assert.equal('sendToLeaderPane' in tmuxSessionModule, false);
4544
+ });
4545
+ });
4546
+ //# sourceMappingURL=tmux-session.test.js.map