@jstn-sdk/rcs 0.1.0

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 (2781) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/Cargo.lock +174 -0
  3. package/Cargo.toml +23 -0
  4. package/README.md +403 -0
  5. package/crates/rcs-explore/Cargo.toml +11 -0
  6. package/crates/rcs-explore/src/main.rs +2061 -0
  7. package/crates/rcs-mux/Cargo.toml +11 -0
  8. package/crates/rcs-mux/src/lib.rs +91 -0
  9. package/crates/rcs-mux/src/tmux.rs +282 -0
  10. package/crates/rcs-mux/src/types.rs +306 -0
  11. package/crates/rcs-runtime/Cargo.toml +17 -0
  12. package/crates/rcs-runtime/src/main.rs +125 -0
  13. package/crates/rcs-runtime/tests/execution.rs +212 -0
  14. package/crates/rcs-runtime-core/Cargo.toml +13 -0
  15. package/crates/rcs-runtime-core/src/authority.rs +239 -0
  16. package/crates/rcs-runtime-core/src/dispatch.rs +330 -0
  17. package/crates/rcs-runtime-core/src/engine.rs +853 -0
  18. package/crates/rcs-runtime-core/src/lib.rs +653 -0
  19. package/crates/rcs-runtime-core/src/mailbox.rs +261 -0
  20. package/crates/rcs-runtime-core/src/replay.rs +104 -0
  21. package/crates/rcs-sparkshell/Cargo.lock +7 -0
  22. package/crates/rcs-sparkshell/Cargo.toml +14 -0
  23. package/crates/rcs-sparkshell/src/codex_bridge.rs +454 -0
  24. package/crates/rcs-sparkshell/src/error.rs +45 -0
  25. package/crates/rcs-sparkshell/src/exec.rs +115 -0
  26. package/crates/rcs-sparkshell/src/main.rs +334 -0
  27. package/crates/rcs-sparkshell/src/prompt.rs +342 -0
  28. package/crates/rcs-sparkshell/src/registry/c_cpp.rs +9 -0
  29. package/crates/rcs-sparkshell/src/registry/csharp.rs +10 -0
  30. package/crates/rcs-sparkshell/src/registry/generic_shell.rs +11 -0
  31. package/crates/rcs-sparkshell/src/registry/git.rs +10 -0
  32. package/crates/rcs-sparkshell/src/registry/go.rs +9 -0
  33. package/crates/rcs-sparkshell/src/registry/java_kotlin.rs +9 -0
  34. package/crates/rcs-sparkshell/src/registry/mod.rs +85 -0
  35. package/crates/rcs-sparkshell/src/registry/node_js.rs +9 -0
  36. package/crates/rcs-sparkshell/src/registry/python.rs +9 -0
  37. package/crates/rcs-sparkshell/src/registry/ruby.rs +9 -0
  38. package/crates/rcs-sparkshell/src/registry/rust.rs +9 -0
  39. package/crates/rcs-sparkshell/src/registry/swift.rs +10 -0
  40. package/crates/rcs-sparkshell/src/test_support.rs +10 -0
  41. package/crates/rcs-sparkshell/src/threshold.rs +75 -0
  42. package/crates/rcs-sparkshell/tests/execution.rs +521 -0
  43. package/crates/rcs-sparkshell/tests/registry.rs +99 -0
  44. package/dist/adapt/__tests__/foundation.test.d.ts +2 -0
  45. package/dist/adapt/__tests__/foundation.test.d.ts.map +1 -0
  46. package/dist/adapt/__tests__/foundation.test.js +171 -0
  47. package/dist/adapt/__tests__/foundation.test.js.map +1 -0
  48. package/dist/adapt/__tests__/hermes.test.d.ts +2 -0
  49. package/dist/adapt/__tests__/hermes.test.d.ts.map +1 -0
  50. package/dist/adapt/__tests__/hermes.test.js +137 -0
  51. package/dist/adapt/__tests__/hermes.test.js.map +1 -0
  52. package/dist/adapt/contracts.d.ts +157 -0
  53. package/dist/adapt/contracts.d.ts.map +1 -0
  54. package/dist/adapt/contracts.js +10 -0
  55. package/dist/adapt/contracts.js.map +1 -0
  56. package/dist/adapt/hermes.d.ts +83 -0
  57. package/dist/adapt/hermes.d.ts.map +1 -0
  58. package/dist/adapt/hermes.js +371 -0
  59. package/dist/adapt/hermes.js.map +1 -0
  60. package/dist/adapt/index.d.ts +14 -0
  61. package/dist/adapt/index.d.ts.map +1 -0
  62. package/dist/adapt/index.js +293 -0
  63. package/dist/adapt/index.js.map +1 -0
  64. package/dist/adapt/openclaw.d.ts +7 -0
  65. package/dist/adapt/openclaw.d.ts.map +1 -0
  66. package/dist/adapt/openclaw.js +299 -0
  67. package/dist/adapt/openclaw.js.map +1 -0
  68. package/dist/adapt/paths.d.ts +3 -0
  69. package/dist/adapt/paths.d.ts.map +1 -0
  70. package/dist/adapt/paths.js +15 -0
  71. package/dist/adapt/paths.js.map +1 -0
  72. package/dist/adapt/registry.d.ts +4 -0
  73. package/dist/adapt/registry.d.ts.map +1 -0
  74. package/dist/adapt/registry.js +48 -0
  75. package/dist/adapt/registry.js.map +1 -0
  76. package/dist/agents/__tests__/definitions.test.d.ts +2 -0
  77. package/dist/agents/__tests__/definitions.test.d.ts.map +1 -0
  78. package/dist/agents/__tests__/definitions.test.js +62 -0
  79. package/dist/agents/__tests__/definitions.test.js.map +1 -0
  80. package/dist/agents/__tests__/native-config.test.d.ts +2 -0
  81. package/dist/agents/__tests__/native-config.test.d.ts.map +1 -0
  82. package/dist/agents/__tests__/native-config.test.js +278 -0
  83. package/dist/agents/__tests__/native-config.test.js.map +1 -0
  84. package/dist/agents/definitions.d.ts +25 -0
  85. package/dist/agents/definitions.d.ts.map +1 -0
  86. package/dist/agents/definitions.js +327 -0
  87. package/dist/agents/definitions.js.map +1 -0
  88. package/dist/agents/native-config.d.ts +51 -0
  89. package/dist/agents/native-config.d.ts.map +1 -0
  90. package/dist/agents/native-config.js +265 -0
  91. package/dist/agents/native-config.js.map +1 -0
  92. package/dist/agents/policy.d.ts +10 -0
  93. package/dist/agents/policy.d.ts.map +1 -0
  94. package/dist/agents/policy.js +61 -0
  95. package/dist/agents/policy.js.map +1 -0
  96. package/dist/autoresearch/__tests__/contracts.test.d.ts +2 -0
  97. package/dist/autoresearch/__tests__/contracts.test.d.ts.map +1 -0
  98. package/dist/autoresearch/__tests__/contracts.test.js +127 -0
  99. package/dist/autoresearch/__tests__/contracts.test.js.map +1 -0
  100. package/dist/autoresearch/__tests__/runtime-parity-extra.test.d.ts +2 -0
  101. package/dist/autoresearch/__tests__/runtime-parity-extra.test.d.ts.map +1 -0
  102. package/dist/autoresearch/__tests__/runtime-parity-extra.test.js +356 -0
  103. package/dist/autoresearch/__tests__/runtime-parity-extra.test.js.map +1 -0
  104. package/dist/autoresearch/__tests__/runtime.test.d.ts +2 -0
  105. package/dist/autoresearch/__tests__/runtime.test.d.ts.map +1 -0
  106. package/dist/autoresearch/__tests__/runtime.test.js +218 -0
  107. package/dist/autoresearch/__tests__/runtime.test.js.map +1 -0
  108. package/dist/autoresearch/__tests__/skill-validation.test.d.ts +2 -0
  109. package/dist/autoresearch/__tests__/skill-validation.test.d.ts.map +1 -0
  110. package/dist/autoresearch/__tests__/skill-validation.test.js +91 -0
  111. package/dist/autoresearch/__tests__/skill-validation.test.js.map +1 -0
  112. package/dist/autoresearch/contracts.d.ts +31 -0
  113. package/dist/autoresearch/contracts.d.ts.map +1 -0
  114. package/dist/autoresearch/contracts.js +197 -0
  115. package/dist/autoresearch/contracts.js.map +1 -0
  116. package/dist/autoresearch/runtime.d.ts +132 -0
  117. package/dist/autoresearch/runtime.d.ts.map +1 -0
  118. package/dist/autoresearch/runtime.js +1075 -0
  119. package/dist/autoresearch/runtime.js.map +1 -0
  120. package/dist/autoresearch/skill-validation.d.ts +13 -0
  121. package/dist/autoresearch/skill-validation.d.ts.map +1 -0
  122. package/dist/autoresearch/skill-validation.js +165 -0
  123. package/dist/autoresearch/skill-validation.js.map +1 -0
  124. package/dist/catalog/__tests__/generator.test.d.ts +2 -0
  125. package/dist/catalog/__tests__/generator.test.d.ts.map +1 -0
  126. package/dist/catalog/__tests__/generator.test.js +49 -0
  127. package/dist/catalog/__tests__/generator.test.js.map +1 -0
  128. package/dist/catalog/__tests__/plugin-bundle-ssot.test.d.ts +2 -0
  129. package/dist/catalog/__tests__/plugin-bundle-ssot.test.d.ts.map +1 -0
  130. package/dist/catalog/__tests__/plugin-bundle-ssot.test.js +83 -0
  131. package/dist/catalog/__tests__/plugin-bundle-ssot.test.js.map +1 -0
  132. package/dist/catalog/__tests__/schema.test.d.ts +2 -0
  133. package/dist/catalog/__tests__/schema.test.d.ts.map +1 -0
  134. package/dist/catalog/__tests__/schema.test.js +91 -0
  135. package/dist/catalog/__tests__/schema.test.js.map +1 -0
  136. package/dist/catalog/installable.d.ts +5 -0
  137. package/dist/catalog/installable.d.ts.map +1 -0
  138. package/dist/catalog/installable.js +13 -0
  139. package/dist/catalog/installable.js.map +1 -0
  140. package/dist/catalog/reader.d.ts +19 -0
  141. package/dist/catalog/reader.d.ts.map +1 -0
  142. package/dist/catalog/reader.js +63 -0
  143. package/dist/catalog/reader.js.map +1 -0
  144. package/dist/catalog/schema.d.ts +32 -0
  145. package/dist/catalog/schema.d.ts.map +1 -0
  146. package/dist/catalog/schema.js +107 -0
  147. package/dist/catalog/schema.js.map +1 -0
  148. package/dist/catalog/skill-mirror.d.ts +20 -0
  149. package/dist/catalog/skill-mirror.d.ts.map +1 -0
  150. package/dist/catalog/skill-mirror.js +104 -0
  151. package/dist/catalog/skill-mirror.js.map +1 -0
  152. package/dist/cli/__tests__/adapt-help.test.d.ts +2 -0
  153. package/dist/cli/__tests__/adapt-help.test.d.ts.map +1 -0
  154. package/dist/cli/__tests__/adapt-help.test.js +37 -0
  155. package/dist/cli/__tests__/adapt-help.test.js.map +1 -0
  156. package/dist/cli/__tests__/adapt.test.d.ts +2 -0
  157. package/dist/cli/__tests__/adapt.test.d.ts.map +1 -0
  158. package/dist/cli/__tests__/adapt.test.js +62 -0
  159. package/dist/cli/__tests__/adapt.test.js.map +1 -0
  160. package/dist/cli/__tests__/agents-init.test.d.ts +2 -0
  161. package/dist/cli/__tests__/agents-init.test.d.ts.map +1 -0
  162. package/dist/cli/__tests__/agents-init.test.js +184 -0
  163. package/dist/cli/__tests__/agents-init.test.js.map +1 -0
  164. package/dist/cli/__tests__/agents.test.d.ts +2 -0
  165. package/dist/cli/__tests__/agents.test.d.ts.map +1 -0
  166. package/dist/cli/__tests__/agents.test.js +137 -0
  167. package/dist/cli/__tests__/agents.test.js.map +1 -0
  168. package/dist/cli/__tests__/ask.test.d.ts +2 -0
  169. package/dist/cli/__tests__/ask.test.d.ts.map +1 -0
  170. package/dist/cli/__tests__/ask.test.js +265 -0
  171. package/dist/cli/__tests__/ask.test.js.map +1 -0
  172. package/dist/cli/__tests__/autoresearch-guided.test.d.ts +2 -0
  173. package/dist/cli/__tests__/autoresearch-guided.test.d.ts.map +1 -0
  174. package/dist/cli/__tests__/autoresearch-guided.test.js +365 -0
  175. package/dist/cli/__tests__/autoresearch-guided.test.js.map +1 -0
  176. package/dist/cli/__tests__/autoresearch.test.d.ts +2 -0
  177. package/dist/cli/__tests__/autoresearch.test.d.ts.map +1 -0
  178. package/dist/cli/__tests__/autoresearch.test.js +203 -0
  179. package/dist/cli/__tests__/autoresearch.test.js.map +1 -0
  180. package/dist/cli/__tests__/catalog-contract.test.d.ts +2 -0
  181. package/dist/cli/__tests__/catalog-contract.test.d.ts.map +1 -0
  182. package/dist/cli/__tests__/catalog-contract.test.js +18 -0
  183. package/dist/cli/__tests__/catalog-contract.test.js.map +1 -0
  184. package/dist/cli/__tests__/cleanup.test.d.ts +2 -0
  185. package/dist/cli/__tests__/cleanup.test.d.ts.map +1 -0
  186. package/dist/cli/__tests__/cleanup.test.js +419 -0
  187. package/dist/cli/__tests__/cleanup.test.js.map +1 -0
  188. package/dist/cli/__tests__/codex-plugin-layout.test.d.ts +2 -0
  189. package/dist/cli/__tests__/codex-plugin-layout.test.d.ts.map +1 -0
  190. package/dist/cli/__tests__/codex-plugin-layout.test.js +210 -0
  191. package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -0
  192. package/dist/cli/__tests__/doctor-context-window-warning.test.d.ts +2 -0
  193. package/dist/cli/__tests__/doctor-context-window-warning.test.d.ts.map +1 -0
  194. package/dist/cli/__tests__/doctor-context-window-warning.test.js +122 -0
  195. package/dist/cli/__tests__/doctor-context-window-warning.test.js.map +1 -0
  196. package/dist/cli/__tests__/doctor-invalid-config.test.d.ts +2 -0
  197. package/dist/cli/__tests__/doctor-invalid-config.test.d.ts.map +1 -0
  198. package/dist/cli/__tests__/doctor-invalid-config.test.js +52 -0
  199. package/dist/cli/__tests__/doctor-invalid-config.test.js.map +1 -0
  200. package/dist/cli/__tests__/doctor-team.test.d.ts +2 -0
  201. package/dist/cli/__tests__/doctor-team.test.d.ts.map +1 -0
  202. package/dist/cli/__tests__/doctor-team.test.js +299 -0
  203. package/dist/cli/__tests__/doctor-team.test.js.map +1 -0
  204. package/dist/cli/__tests__/doctor-warning-copy.test.d.ts +2 -0
  205. package/dist/cli/__tests__/doctor-warning-copy.test.d.ts.map +1 -0
  206. package/dist/cli/__tests__/doctor-warning-copy.test.js +438 -0
  207. package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -0
  208. package/dist/cli/__tests__/error-handling-warnings.test.d.ts +2 -0
  209. package/dist/cli/__tests__/error-handling-warnings.test.d.ts.map +1 -0
  210. package/dist/cli/__tests__/error-handling-warnings.test.js +52 -0
  211. package/dist/cli/__tests__/error-handling-warnings.test.js.map +1 -0
  212. package/dist/cli/__tests__/exec.test.d.ts +2 -0
  213. package/dist/cli/__tests__/exec.test.d.ts.map +1 -0
  214. package/dist/cli/__tests__/exec.test.js +213 -0
  215. package/dist/cli/__tests__/exec.test.js.map +1 -0
  216. package/dist/cli/__tests__/explore-windows-diagnostics.test.d.ts +2 -0
  217. package/dist/cli/__tests__/explore-windows-diagnostics.test.d.ts.map +1 -0
  218. package/dist/cli/__tests__/explore-windows-diagnostics.test.js +17 -0
  219. package/dist/cli/__tests__/explore-windows-diagnostics.test.js.map +1 -0
  220. package/dist/cli/__tests__/explore.test.d.ts +2 -0
  221. package/dist/cli/__tests__/explore.test.d.ts.map +1 -0
  222. package/dist/cli/__tests__/explore.test.js +1090 -0
  223. package/dist/cli/__tests__/explore.test.js.map +1 -0
  224. package/dist/cli/__tests__/hooks.test.d.ts +2 -0
  225. package/dist/cli/__tests__/hooks.test.d.ts.map +1 -0
  226. package/dist/cli/__tests__/hooks.test.js +55 -0
  227. package/dist/cli/__tests__/hooks.test.js.map +1 -0
  228. package/dist/cli/__tests__/index.test.d.ts +2 -0
  229. package/dist/cli/__tests__/index.test.d.ts.map +1 -0
  230. package/dist/cli/__tests__/index.test.js +2259 -0
  231. package/dist/cli/__tests__/index.test.js.map +1 -0
  232. package/dist/cli/__tests__/launch-fallback.test.d.ts +2 -0
  233. package/dist/cli/__tests__/launch-fallback.test.d.ts.map +1 -0
  234. package/dist/cli/__tests__/launch-fallback.test.js +661 -0
  235. package/dist/cli/__tests__/launch-fallback.test.js.map +1 -0
  236. package/dist/cli/__tests__/lifecycle-notifications.test.d.ts +2 -0
  237. package/dist/cli/__tests__/lifecycle-notifications.test.d.ts.map +1 -0
  238. package/dist/cli/__tests__/lifecycle-notifications.test.js +48 -0
  239. package/dist/cli/__tests__/lifecycle-notifications.test.js.map +1 -0
  240. package/dist/cli/__tests__/list.test.d.ts +2 -0
  241. package/dist/cli/__tests__/list.test.d.ts.map +1 -0
  242. package/dist/cli/__tests__/list.test.js +38 -0
  243. package/dist/cli/__tests__/list.test.js.map +1 -0
  244. package/dist/cli/__tests__/mcp-parity.test.d.ts +2 -0
  245. package/dist/cli/__tests__/mcp-parity.test.d.ts.map +1 -0
  246. package/dist/cli/__tests__/mcp-parity.test.js +228 -0
  247. package/dist/cli/__tests__/mcp-parity.test.js.map +1 -0
  248. package/dist/cli/__tests__/mcp-serve.test.d.ts +2 -0
  249. package/dist/cli/__tests__/mcp-serve.test.d.ts.map +1 -0
  250. package/dist/cli/__tests__/mcp-serve.test.js +64 -0
  251. package/dist/cli/__tests__/mcp-serve.test.js.map +1 -0
  252. package/dist/cli/__tests__/native-assets.test.d.ts +2 -0
  253. package/dist/cli/__tests__/native-assets.test.d.ts.map +1 -0
  254. package/dist/cli/__tests__/native-assets.test.js +308 -0
  255. package/dist/cli/__tests__/native-assets.test.js.map +1 -0
  256. package/dist/cli/__tests__/native-hook-dispatch-contract.test.d.ts +2 -0
  257. package/dist/cli/__tests__/native-hook-dispatch-contract.test.d.ts.map +1 -0
  258. package/dist/cli/__tests__/native-hook-dispatch-contract.test.js +11 -0
  259. package/dist/cli/__tests__/native-hook-dispatch-contract.test.js.map +1 -0
  260. package/dist/cli/__tests__/nested-help-routing.test.d.ts +2 -0
  261. package/dist/cli/__tests__/nested-help-routing.test.d.ts.map +1 -0
  262. package/dist/cli/__tests__/nested-help-routing.test.js +96 -0
  263. package/dist/cli/__tests__/nested-help-routing.test.js.map +1 -0
  264. package/dist/cli/__tests__/package-bin-contract.test.d.ts +2 -0
  265. package/dist/cli/__tests__/package-bin-contract.test.d.ts.map +1 -0
  266. package/dist/cli/__tests__/package-bin-contract.test.js +177 -0
  267. package/dist/cli/__tests__/package-bin-contract.test.js.map +1 -0
  268. package/dist/cli/__tests__/packaged-explore-harness-lock.d.ts +3 -0
  269. package/dist/cli/__tests__/packaged-explore-harness-lock.d.ts.map +1 -0
  270. package/dist/cli/__tests__/packaged-explore-harness-lock.js +67 -0
  271. package/dist/cli/__tests__/packaged-explore-harness-lock.js.map +1 -0
  272. package/dist/cli/__tests__/packaged-script-resolution.test.d.ts +2 -0
  273. package/dist/cli/__tests__/packaged-script-resolution.test.d.ts.map +1 -0
  274. package/dist/cli/__tests__/packaged-script-resolution.test.js +19 -0
  275. package/dist/cli/__tests__/packaged-script-resolution.test.js.map +1 -0
  276. package/dist/cli/__tests__/prompt-skill-sanitization.test.d.ts +2 -0
  277. package/dist/cli/__tests__/prompt-skill-sanitization.test.d.ts.map +1 -0
  278. package/dist/cli/__tests__/prompt-skill-sanitization.test.js +48 -0
  279. package/dist/cli/__tests__/prompt-skill-sanitization.test.js.map +1 -0
  280. package/dist/cli/__tests__/question.test.d.ts +2 -0
  281. package/dist/cli/__tests__/question.test.d.ts.map +1 -0
  282. package/dist/cli/__tests__/question.test.js +633 -0
  283. package/dist/cli/__tests__/question.test.js.map +1 -0
  284. package/dist/cli/__tests__/ralph-deslop-contract.test.d.ts +2 -0
  285. package/dist/cli/__tests__/ralph-deslop-contract.test.d.ts.map +1 -0
  286. package/dist/cli/__tests__/ralph-deslop-contract.test.js +28 -0
  287. package/dist/cli/__tests__/ralph-deslop-contract.test.js.map +1 -0
  288. package/dist/cli/__tests__/ralph-prd-deep-interview.test.d.ts +2 -0
  289. package/dist/cli/__tests__/ralph-prd-deep-interview.test.d.ts.map +1 -0
  290. package/dist/cli/__tests__/ralph-prd-deep-interview.test.js +24 -0
  291. package/dist/cli/__tests__/ralph-prd-deep-interview.test.js.map +1 -0
  292. package/dist/cli/__tests__/ralph-prd-smoke.test.d.ts +2 -0
  293. package/dist/cli/__tests__/ralph-prd-smoke.test.d.ts.map +1 -0
  294. package/dist/cli/__tests__/ralph-prd-smoke.test.js +167 -0
  295. package/dist/cli/__tests__/ralph-prd-smoke.test.js.map +1 -0
  296. package/dist/cli/__tests__/ralph.test.d.ts +2 -0
  297. package/dist/cli/__tests__/ralph.test.d.ts.map +1 -0
  298. package/dist/cli/__tests__/ralph.test.js +256 -0
  299. package/dist/cli/__tests__/ralph.test.js.map +1 -0
  300. package/dist/cli/__tests__/resume.test.d.ts +2 -0
  301. package/dist/cli/__tests__/resume.test.d.ts.map +1 -0
  302. package/dist/cli/__tests__/resume.test.js +84 -0
  303. package/dist/cli/__tests__/resume.test.js.map +1 -0
  304. package/dist/cli/__tests__/session-scoped-runtime.test.d.ts +2 -0
  305. package/dist/cli/__tests__/session-scoped-runtime.test.d.ts.map +1 -0
  306. package/dist/cli/__tests__/session-scoped-runtime.test.js +146 -0
  307. package/dist/cli/__tests__/session-scoped-runtime.test.js.map +1 -0
  308. package/dist/cli/__tests__/session-search-help.test.d.ts +2 -0
  309. package/dist/cli/__tests__/session-search-help.test.d.ts.map +1 -0
  310. package/dist/cli/__tests__/session-search-help.test.js +76 -0
  311. package/dist/cli/__tests__/session-search-help.test.js.map +1 -0
  312. package/dist/cli/__tests__/session-search.test.d.ts +2 -0
  313. package/dist/cli/__tests__/session-search.test.d.ts.map +1 -0
  314. package/dist/cli/__tests__/session-search.test.js +77 -0
  315. package/dist/cli/__tests__/session-search.test.js.map +1 -0
  316. package/dist/cli/__tests__/setup-agents-overwrite.test.d.ts +2 -0
  317. package/dist/cli/__tests__/setup-agents-overwrite.test.d.ts.map +1 -0
  318. package/dist/cli/__tests__/setup-agents-overwrite.test.js +457 -0
  319. package/dist/cli/__tests__/setup-agents-overwrite.test.js.map +1 -0
  320. package/dist/cli/__tests__/setup-gh-star.test.d.ts +2 -0
  321. package/dist/cli/__tests__/setup-gh-star.test.d.ts.map +1 -0
  322. package/dist/cli/__tests__/setup-gh-star.test.js +67 -0
  323. package/dist/cli/__tests__/setup-gh-star.test.js.map +1 -0
  324. package/dist/cli/__tests__/setup-hooks-shared-ownership.test.d.ts +2 -0
  325. package/dist/cli/__tests__/setup-hooks-shared-ownership.test.d.ts.map +1 -0
  326. package/dist/cli/__tests__/setup-hooks-shared-ownership.test.js +189 -0
  327. package/dist/cli/__tests__/setup-hooks-shared-ownership.test.js.map +1 -0
  328. package/dist/cli/__tests__/setup-install-mode.test.d.ts +2 -0
  329. package/dist/cli/__tests__/setup-install-mode.test.d.ts.map +1 -0
  330. package/dist/cli/__tests__/setup-install-mode.test.js +873 -0
  331. package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -0
  332. package/dist/cli/__tests__/setup-prompts-overwrite.test.d.ts +2 -0
  333. package/dist/cli/__tests__/setup-prompts-overwrite.test.d.ts.map +1 -0
  334. package/dist/cli/__tests__/setup-prompts-overwrite.test.js +191 -0
  335. package/dist/cli/__tests__/setup-prompts-overwrite.test.js.map +1 -0
  336. package/dist/cli/__tests__/setup-refresh.test.d.ts +2 -0
  337. package/dist/cli/__tests__/setup-refresh.test.d.ts.map +1 -0
  338. package/dist/cli/__tests__/setup-refresh.test.js +591 -0
  339. package/dist/cli/__tests__/setup-refresh.test.js.map +1 -0
  340. package/dist/cli/__tests__/setup-scope.test.d.ts +2 -0
  341. package/dist/cli/__tests__/setup-scope.test.d.ts.map +1 -0
  342. package/dist/cli/__tests__/setup-scope.test.js +340 -0
  343. package/dist/cli/__tests__/setup-scope.test.js.map +1 -0
  344. package/dist/cli/__tests__/setup-skill-validation.test.d.ts +2 -0
  345. package/dist/cli/__tests__/setup-skill-validation.test.d.ts.map +1 -0
  346. package/dist/cli/__tests__/setup-skill-validation.test.js +44 -0
  347. package/dist/cli/__tests__/setup-skill-validation.test.js.map +1 -0
  348. package/dist/cli/__tests__/setup-skills-overwrite.test.d.ts +2 -0
  349. package/dist/cli/__tests__/setup-skills-overwrite.test.d.ts.map +1 -0
  350. package/dist/cli/__tests__/setup-skills-overwrite.test.js +295 -0
  351. package/dist/cli/__tests__/setup-skills-overwrite.test.js.map +1 -0
  352. package/dist/cli/__tests__/sidecar.test.d.ts +2 -0
  353. package/dist/cli/__tests__/sidecar.test.d.ts.map +1 -0
  354. package/dist/cli/__tests__/sidecar.test.js +24 -0
  355. package/dist/cli/__tests__/sidecar.test.js.map +1 -0
  356. package/dist/cli/__tests__/sparkshell-cli.test.d.ts +2 -0
  357. package/dist/cli/__tests__/sparkshell-cli.test.d.ts.map +1 -0
  358. package/dist/cli/__tests__/sparkshell-cli.test.js +400 -0
  359. package/dist/cli/__tests__/sparkshell-cli.test.js.map +1 -0
  360. package/dist/cli/__tests__/sparkshell-packaging.test.d.ts +2 -0
  361. package/dist/cli/__tests__/sparkshell-packaging.test.d.ts.map +1 -0
  362. package/dist/cli/__tests__/sparkshell-packaging.test.js +74 -0
  363. package/dist/cli/__tests__/sparkshell-packaging.test.js.map +1 -0
  364. package/dist/cli/__tests__/star-prompt.test.d.ts +2 -0
  365. package/dist/cli/__tests__/star-prompt.test.d.ts.map +1 -0
  366. package/dist/cli/__tests__/star-prompt.test.js +172 -0
  367. package/dist/cli/__tests__/star-prompt.test.js.map +1 -0
  368. package/dist/cli/__tests__/state.test.d.ts +2 -0
  369. package/dist/cli/__tests__/state.test.d.ts.map +1 -0
  370. package/dist/cli/__tests__/state.test.js +46 -0
  371. package/dist/cli/__tests__/state.test.js.map +1 -0
  372. package/dist/cli/__tests__/team-decompose.test.d.ts +2 -0
  373. package/dist/cli/__tests__/team-decompose.test.d.ts.map +1 -0
  374. package/dist/cli/__tests__/team-decompose.test.js +133 -0
  375. package/dist/cli/__tests__/team-decompose.test.js.map +1 -0
  376. package/dist/cli/__tests__/team.test.d.ts +2 -0
  377. package/dist/cli/__tests__/team.test.d.ts.map +1 -0
  378. package/dist/cli/__tests__/team.test.js +1820 -0
  379. package/dist/cli/__tests__/team.test.js.map +1 -0
  380. package/dist/cli/__tests__/uninstall.test.d.ts +2 -0
  381. package/dist/cli/__tests__/uninstall.test.d.ts.map +1 -0
  382. package/dist/cli/__tests__/uninstall.test.js +766 -0
  383. package/dist/cli/__tests__/uninstall.test.js.map +1 -0
  384. package/dist/cli/__tests__/update.test.d.ts +2 -0
  385. package/dist/cli/__tests__/update.test.d.ts.map +1 -0
  386. package/dist/cli/__tests__/update.test.js +589 -0
  387. package/dist/cli/__tests__/update.test.js.map +1 -0
  388. package/dist/cli/__tests__/version-sync-contract.test.d.ts +2 -0
  389. package/dist/cli/__tests__/version-sync-contract.test.d.ts.map +1 -0
  390. package/dist/cli/__tests__/version-sync-contract.test.js +41 -0
  391. package/dist/cli/__tests__/version-sync-contract.test.js.map +1 -0
  392. package/dist/cli/__tests__/version.test.d.ts +2 -0
  393. package/dist/cli/__tests__/version.test.d.ts.map +1 -0
  394. package/dist/cli/__tests__/version.test.js +21 -0
  395. package/dist/cli/__tests__/version.test.js.map +1 -0
  396. package/dist/cli/__tests__/windows-popup-loop-contract.test.d.ts +2 -0
  397. package/dist/cli/__tests__/windows-popup-loop-contract.test.d.ts.map +1 -0
  398. package/dist/cli/__tests__/windows-popup-loop-contract.test.js +31 -0
  399. package/dist/cli/__tests__/windows-popup-loop-contract.test.js.map +1 -0
  400. package/dist/cli/adapt.d.ts +6 -0
  401. package/dist/cli/adapt.d.ts.map +1 -0
  402. package/dist/cli/adapt.js +135 -0
  403. package/dist/cli/adapt.js.map +1 -0
  404. package/dist/cli/agents-init.d.ts +14 -0
  405. package/dist/cli/agents-init.d.ts.map +1 -0
  406. package/dist/cli/agents-init.js +274 -0
  407. package/dist/cli/agents-init.js.map +1 -0
  408. package/dist/cli/agents.d.ts +14 -0
  409. package/dist/cli/agents.d.ts.map +1 -0
  410. package/dist/cli/agents.js +267 -0
  411. package/dist/cli/agents.js.map +1 -0
  412. package/dist/cli/ask.d.ts +13 -0
  413. package/dist/cli/ask.d.ts.map +1 -0
  414. package/dist/cli/ask.js +178 -0
  415. package/dist/cli/ask.js.map +1 -0
  416. package/dist/cli/autoresearch-guided.d.ts +43 -0
  417. package/dist/cli/autoresearch-guided.d.ts.map +1 -0
  418. package/dist/cli/autoresearch-guided.js +282 -0
  419. package/dist/cli/autoresearch-guided.js.map +1 -0
  420. package/dist/cli/autoresearch-intake.d.ts +62 -0
  421. package/dist/cli/autoresearch-intake.d.ts.map +1 -0
  422. package/dist/cli/autoresearch-intake.js +336 -0
  423. package/dist/cli/autoresearch-intake.js.map +1 -0
  424. package/dist/cli/autoresearch.d.ts +16 -0
  425. package/dist/cli/autoresearch.d.ts.map +1 -0
  426. package/dist/cli/autoresearch.js +91 -0
  427. package/dist/cli/autoresearch.js.map +1 -0
  428. package/dist/cli/catalog-contract.d.ts +10 -0
  429. package/dist/cli/catalog-contract.d.ts.map +1 -0
  430. package/dist/cli/catalog-contract.js +34 -0
  431. package/dist/cli/catalog-contract.js.map +1 -0
  432. package/dist/cli/cleanup.d.ts +56 -0
  433. package/dist/cli/cleanup.d.ts.map +1 -0
  434. package/dist/cli/cleanup.js +400 -0
  435. package/dist/cli/cleanup.js.map +1 -0
  436. package/dist/cli/codex-home.d.ts +7 -0
  437. package/dist/cli/codex-home.d.ts.map +1 -0
  438. package/dist/cli/codex-home.js +26 -0
  439. package/dist/cli/codex-home.js.map +1 -0
  440. package/dist/cli/constants.d.ts +11 -0
  441. package/dist/cli/constants.d.ts.map +1 -0
  442. package/dist/cli/constants.js +11 -0
  443. package/dist/cli/constants.js.map +1 -0
  444. package/dist/cli/doctor.d.ts +18 -0
  445. package/dist/cli/doctor.d.ts.map +1 -0
  446. package/dist/cli/doctor.js +1072 -0
  447. package/dist/cli/doctor.js.map +1 -0
  448. package/dist/cli/explore.d.ts +30 -0
  449. package/dist/cli/explore.d.ts.map +1 -0
  450. package/dist/cli/explore.js +404 -0
  451. package/dist/cli/explore.js.map +1 -0
  452. package/dist/cli/hooks.d.ts +4 -0
  453. package/dist/cli/hooks.d.ts.map +1 -0
  454. package/dist/cli/hooks.js +201 -0
  455. package/dist/cli/hooks.js.map +1 -0
  456. package/dist/cli/index.d.ts +138 -0
  457. package/dist/cli/index.d.ts.map +1 -0
  458. package/dist/cli/index.js +3117 -0
  459. package/dist/cli/index.js.map +1 -0
  460. package/dist/cli/list.d.ts +2 -0
  461. package/dist/cli/list.d.ts.map +1 -0
  462. package/dist/cli/list.js +40 -0
  463. package/dist/cli/list.js.map +1 -0
  464. package/dist/cli/mcp-parity.d.ts +22 -0
  465. package/dist/cli/mcp-parity.d.ts.map +1 -0
  466. package/dist/cli/mcp-parity.js +251 -0
  467. package/dist/cli/mcp-parity.js.map +1 -0
  468. package/dist/cli/mcp-serve.d.ts +13 -0
  469. package/dist/cli/mcp-serve.d.ts.map +1 -0
  470. package/dist/cli/mcp-serve.js +71 -0
  471. package/dist/cli/mcp-serve.js.map +1 -0
  472. package/dist/cli/native-assets.d.ts +51 -0
  473. package/dist/cli/native-assets.d.ts.map +1 -0
  474. package/dist/cli/native-assets.js +379 -0
  475. package/dist/cli/native-assets.js.map +1 -0
  476. package/dist/cli/plugin-marketplace.d.ts +13 -0
  477. package/dist/cli/plugin-marketplace.d.ts.map +1 -0
  478. package/dist/cli/plugin-marketplace.js +75 -0
  479. package/dist/cli/plugin-marketplace.js.map +1 -0
  480. package/dist/cli/question.d.ts +3 -0
  481. package/dist/cli/question.d.ts.map +1 -0
  482. package/dist/cli/question.js +227 -0
  483. package/dist/cli/question.js.map +1 -0
  484. package/dist/cli/ralph.d.ts +17 -0
  485. package/dist/cli/ralph.d.ts.map +1 -0
  486. package/dist/cli/ralph.js +313 -0
  487. package/dist/cli/ralph.js.map +1 -0
  488. package/dist/cli/rcs.d.ts +3 -0
  489. package/dist/cli/rcs.d.ts.map +1 -0
  490. package/dist/cli/rcs.js +127 -0
  491. package/dist/cli/rcs.js.map +1 -0
  492. package/dist/cli/session-search.d.ts +8 -0
  493. package/dist/cli/session-search.d.ts.map +1 -0
  494. package/dist/cli/session-search.js +138 -0
  495. package/dist/cli/session-search.js.map +1 -0
  496. package/dist/cli/setup-preferences.d.ts +20 -0
  497. package/dist/cli/setup-preferences.d.ts.map +1 -0
  498. package/dist/cli/setup-preferences.js +71 -0
  499. package/dist/cli/setup-preferences.js.map +1 -0
  500. package/dist/cli/setup.d.ts +55 -0
  501. package/dist/cli/setup.d.ts.map +1 -0
  502. package/dist/cli/setup.js +2056 -0
  503. package/dist/cli/setup.js.map +1 -0
  504. package/dist/cli/sparkshell.d.ts +33 -0
  505. package/dist/cli/sparkshell.d.ts.map +1 -0
  506. package/dist/cli/sparkshell.js +272 -0
  507. package/dist/cli/sparkshell.js.map +1 -0
  508. package/dist/cli/star-prompt.d.ts +31 -0
  509. package/dist/cli/star-prompt.d.ts.map +1 -0
  510. package/dist/cli/star-prompt.js +97 -0
  511. package/dist/cli/star-prompt.js.map +1 -0
  512. package/dist/cli/state.d.ts +8 -0
  513. package/dist/cli/state.d.ts.map +1 -0
  514. package/dist/cli/state.js +71 -0
  515. package/dist/cli/state.js.map +1 -0
  516. package/dist/cli/team.d.ts +42 -0
  517. package/dist/cli/team.d.ts.map +1 -0
  518. package/dist/cli/team.js +1293 -0
  519. package/dist/cli/team.js.map +1 -0
  520. package/dist/cli/tmux-hook.d.ts +3 -0
  521. package/dist/cli/tmux-hook.d.ts.map +1 -0
  522. package/dist/cli/tmux-hook.js +386 -0
  523. package/dist/cli/tmux-hook.js.map +1 -0
  524. package/dist/cli/uninstall.d.ts +13 -0
  525. package/dist/cli/uninstall.d.ts.map +1 -0
  526. package/dist/cli/uninstall.js +402 -0
  527. package/dist/cli/uninstall.js.map +1 -0
  528. package/dist/cli/update.d.ts +56 -0
  529. package/dist/cli/update.d.ts.map +1 -0
  530. package/dist/cli/update.js +333 -0
  531. package/dist/cli/update.js.map +1 -0
  532. package/dist/cli/version.d.ts +2 -0
  533. package/dist/cli/version.d.ts.map +1 -0
  534. package/dist/cli/version.js +17 -0
  535. package/dist/cli/version.js.map +1 -0
  536. package/dist/compat/__tests__/doctor-contract.test.d.ts +2 -0
  537. package/dist/compat/__tests__/doctor-contract.test.d.ts.map +1 -0
  538. package/dist/compat/__tests__/doctor-contract.test.js +108 -0
  539. package/dist/compat/__tests__/doctor-contract.test.js.map +1 -0
  540. package/dist/compat/__tests__/rust-runtime-compat.test.d.ts +2 -0
  541. package/dist/compat/__tests__/rust-runtime-compat.test.d.ts.map +1 -0
  542. package/dist/compat/__tests__/rust-runtime-compat.test.js +218 -0
  543. package/dist/compat/__tests__/rust-runtime-compat.test.js.map +1 -0
  544. package/dist/config/__tests__/codex-hooks.test.d.ts +2 -0
  545. package/dist/config/__tests__/codex-hooks.test.d.ts.map +1 -0
  546. package/dist/config/__tests__/codex-hooks.test.js +77 -0
  547. package/dist/config/__tests__/codex-hooks.test.js.map +1 -0
  548. package/dist/config/__tests__/generator-idempotent.test.d.ts +2 -0
  549. package/dist/config/__tests__/generator-idempotent.test.d.ts.map +1 -0
  550. package/dist/config/__tests__/generator-idempotent.test.js +882 -0
  551. package/dist/config/__tests__/generator-idempotent.test.js.map +1 -0
  552. package/dist/config/__tests__/generator-notify.test.d.ts +2 -0
  553. package/dist/config/__tests__/generator-notify.test.d.ts.map +1 -0
  554. package/dist/config/__tests__/generator-notify.test.js +343 -0
  555. package/dist/config/__tests__/generator-notify.test.js.map +1 -0
  556. package/dist/config/__tests__/generator-status-line-presets.test.d.ts +2 -0
  557. package/dist/config/__tests__/generator-status-line-presets.test.d.ts.map +1 -0
  558. package/dist/config/__tests__/generator-status-line-presets.test.js +203 -0
  559. package/dist/config/__tests__/generator-status-line-presets.test.js.map +1 -0
  560. package/dist/config/__tests__/mcp-registry.test.d.ts +2 -0
  561. package/dist/config/__tests__/mcp-registry.test.d.ts.map +1 -0
  562. package/dist/config/__tests__/mcp-registry.test.js +190 -0
  563. package/dist/config/__tests__/mcp-registry.test.js.map +1 -0
  564. package/dist/config/__tests__/models.test.d.ts +2 -0
  565. package/dist/config/__tests__/models.test.d.ts.map +1 -0
  566. package/dist/config/__tests__/models.test.js +224 -0
  567. package/dist/config/__tests__/models.test.js.map +1 -0
  568. package/dist/config/__tests__/wiki-config-contract.test.d.ts +2 -0
  569. package/dist/config/__tests__/wiki-config-contract.test.d.ts.map +1 -0
  570. package/dist/config/__tests__/wiki-config-contract.test.js +19 -0
  571. package/dist/config/__tests__/wiki-config-contract.test.js.map +1 -0
  572. package/dist/config/codex-hooks.d.ts +21 -0
  573. package/dist/config/codex-hooks.d.ts.map +1 -0
  574. package/dist/config/codex-hooks.js +198 -0
  575. package/dist/config/codex-hooks.js.map +1 -0
  576. package/dist/config/generator.d.ts +87 -0
  577. package/dist/config/generator.d.ts.map +1 -0
  578. package/dist/config/generator.js +1127 -0
  579. package/dist/config/generator.js.map +1 -0
  580. package/dist/config/mcp-registry.d.ts +35 -0
  581. package/dist/config/mcp-registry.d.ts.map +1 -0
  582. package/dist/config/mcp-registry.js +159 -0
  583. package/dist/config/mcp-registry.js.map +1 -0
  584. package/dist/config/models.d.ts +74 -0
  585. package/dist/config/models.d.ts.map +1 -0
  586. package/dist/config/models.js +214 -0
  587. package/dist/config/models.js.map +1 -0
  588. package/dist/config/rcs-first-party-mcp.d.ts +18 -0
  589. package/dist/config/rcs-first-party-mcp.d.ts.map +1 -0
  590. package/dist/config/rcs-first-party-mcp.js +76 -0
  591. package/dist/config/rcs-first-party-mcp.js.map +1 -0
  592. package/dist/document-refresh/__tests__/enforcer.test.d.ts +2 -0
  593. package/dist/document-refresh/__tests__/enforcer.test.d.ts.map +1 -0
  594. package/dist/document-refresh/__tests__/enforcer.test.js +128 -0
  595. package/dist/document-refresh/__tests__/enforcer.test.js.map +1 -0
  596. package/dist/document-refresh/config.d.ts +9 -0
  597. package/dist/document-refresh/config.d.ts.map +1 -0
  598. package/dist/document-refresh/config.js +70 -0
  599. package/dist/document-refresh/config.js.map +1 -0
  600. package/dist/document-refresh/enforcer.d.ts +43 -0
  601. package/dist/document-refresh/enforcer.d.ts.map +1 -0
  602. package/dist/document-refresh/enforcer.js +329 -0
  603. package/dist/document-refresh/enforcer.js.map +1 -0
  604. package/dist/exec/followup.d.ts +44 -0
  605. package/dist/exec/followup.d.ts.map +1 -0
  606. package/dist/exec/followup.js +349 -0
  607. package/dist/exec/followup.js.map +1 -0
  608. package/dist/hooks/__tests__/agents-overlay.test.d.ts +8 -0
  609. package/dist/hooks/__tests__/agents-overlay.test.d.ts.map +1 -0
  610. package/dist/hooks/__tests__/agents-overlay.test.js +644 -0
  611. package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -0
  612. package/dist/hooks/__tests__/analyze-routing-contract.test.d.ts +2 -0
  613. package/dist/hooks/__tests__/analyze-routing-contract.test.d.ts.map +1 -0
  614. package/dist/hooks/__tests__/analyze-routing-contract.test.js +45 -0
  615. package/dist/hooks/__tests__/analyze-routing-contract.test.js.map +1 -0
  616. package/dist/hooks/__tests__/analyze-skill-contract.test.d.ts +2 -0
  617. package/dist/hooks/__tests__/analyze-skill-contract.test.d.ts.map +1 -0
  618. package/dist/hooks/__tests__/analyze-skill-contract.test.js +48 -0
  619. package/dist/hooks/__tests__/analyze-skill-contract.test.js.map +1 -0
  620. package/dist/hooks/__tests__/anti-slop-workflow.test.d.ts +2 -0
  621. package/dist/hooks/__tests__/anti-slop-workflow.test.d.ts.map +1 -0
  622. package/dist/hooks/__tests__/anti-slop-workflow.test.js +146 -0
  623. package/dist/hooks/__tests__/anti-slop-workflow.test.js.map +1 -0
  624. package/dist/hooks/__tests__/autopilot-skill-contract.test.d.ts +2 -0
  625. package/dist/hooks/__tests__/autopilot-skill-contract.test.d.ts.map +1 -0
  626. package/dist/hooks/__tests__/autopilot-skill-contract.test.js +37 -0
  627. package/dist/hooks/__tests__/autopilot-skill-contract.test.js.map +1 -0
  628. package/dist/hooks/__tests__/clawhip-event-contract.test.d.ts +2 -0
  629. package/dist/hooks/__tests__/clawhip-event-contract.test.d.ts.map +1 -0
  630. package/dist/hooks/__tests__/clawhip-event-contract.test.js +37 -0
  631. package/dist/hooks/__tests__/clawhip-event-contract.test.js.map +1 -0
  632. package/dist/hooks/__tests__/code-review-skill-contract.test.d.ts +2 -0
  633. package/dist/hooks/__tests__/code-review-skill-contract.test.d.ts.map +1 -0
  634. package/dist/hooks/__tests__/code-review-skill-contract.test.js +56 -0
  635. package/dist/hooks/__tests__/code-review-skill-contract.test.js.map +1 -0
  636. package/dist/hooks/__tests__/codebase-map.test.d.ts +8 -0
  637. package/dist/hooks/__tests__/codebase-map.test.d.ts.map +1 -0
  638. package/dist/hooks/__tests__/codebase-map.test.js +218 -0
  639. package/dist/hooks/__tests__/codebase-map.test.js.map +1 -0
  640. package/dist/hooks/__tests__/consensus-execution-handoff.test.d.ts +18 -0
  641. package/dist/hooks/__tests__/consensus-execution-handoff.test.d.ts.map +1 -0
  642. package/dist/hooks/__tests__/consensus-execution-handoff.test.js +234 -0
  643. package/dist/hooks/__tests__/consensus-execution-handoff.test.js.map +1 -0
  644. package/dist/hooks/__tests__/debugger-log-recency-contract.test.d.ts +2 -0
  645. package/dist/hooks/__tests__/debugger-log-recency-contract.test.d.ts.map +1 -0
  646. package/dist/hooks/__tests__/debugger-log-recency-contract.test.js +20 -0
  647. package/dist/hooks/__tests__/debugger-log-recency-contract.test.js.map +1 -0
  648. package/dist/hooks/__tests__/deep-interview-contract.test.d.ts +2 -0
  649. package/dist/hooks/__tests__/deep-interview-contract.test.d.ts.map +1 -0
  650. package/dist/hooks/__tests__/deep-interview-contract.test.js +213 -0
  651. package/dist/hooks/__tests__/deep-interview-contract.test.js.map +1 -0
  652. package/dist/hooks/__tests__/explicit-terminal-stop-docs-contract.test.d.ts +2 -0
  653. package/dist/hooks/__tests__/explicit-terminal-stop-docs-contract.test.d.ts.map +1 -0
  654. package/dist/hooks/__tests__/explicit-terminal-stop-docs-contract.test.js +43 -0
  655. package/dist/hooks/__tests__/explicit-terminal-stop-docs-contract.test.js.map +1 -0
  656. package/dist/hooks/__tests__/explicit-terminal-stop-model-docs-contract.test.d.ts +2 -0
  657. package/dist/hooks/__tests__/explicit-terminal-stop-model-docs-contract.test.d.ts.map +1 -0
  658. package/dist/hooks/__tests__/explicit-terminal-stop-model-docs-contract.test.js +38 -0
  659. package/dist/hooks/__tests__/explicit-terminal-stop-model-docs-contract.test.js.map +1 -0
  660. package/dist/hooks/__tests__/explore-routing.test.d.ts +2 -0
  661. package/dist/hooks/__tests__/explore-routing.test.d.ts.map +1 -0
  662. package/dist/hooks/__tests__/explore-routing.test.js +43 -0
  663. package/dist/hooks/__tests__/explore-routing.test.js.map +1 -0
  664. package/dist/hooks/__tests__/explore-sparkshell-guidance-contract.test.d.ts +2 -0
  665. package/dist/hooks/__tests__/explore-sparkshell-guidance-contract.test.d.ts.map +1 -0
  666. package/dist/hooks/__tests__/explore-sparkshell-guidance-contract.test.js +69 -0
  667. package/dist/hooks/__tests__/explore-sparkshell-guidance-contract.test.js.map +1 -0
  668. package/dist/hooks/__tests__/keyword-detector.test.d.ts +2 -0
  669. package/dist/hooks/__tests__/keyword-detector.test.d.ts.map +1 -0
  670. package/dist/hooks/__tests__/keyword-detector.test.js +1716 -0
  671. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -0
  672. package/dist/hooks/__tests__/notify-fallback-watcher.test.d.ts +2 -0
  673. package/dist/hooks/__tests__/notify-fallback-watcher.test.d.ts.map +1 -0
  674. package/dist/hooks/__tests__/notify-fallback-watcher.test.js +3898 -0
  675. package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -0
  676. package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.d.ts +2 -0
  677. package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.d.ts.map +1 -0
  678. package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js +786 -0
  679. package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js.map +1 -0
  680. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.d.ts +2 -0
  681. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.d.ts.map +1 -0
  682. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +2397 -0
  683. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js.map +1 -0
  684. package/dist/hooks/__tests__/notify-hook-cross-worktree-heartbeat.test.d.ts +2 -0
  685. package/dist/hooks/__tests__/notify-hook-cross-worktree-heartbeat.test.d.ts.map +1 -0
  686. package/dist/hooks/__tests__/notify-hook-cross-worktree-heartbeat.test.js +160 -0
  687. package/dist/hooks/__tests__/notify-hook-cross-worktree-heartbeat.test.js.map +1 -0
  688. package/dist/hooks/__tests__/notify-hook-managed-tmux.test.d.ts +2 -0
  689. package/dist/hooks/__tests__/notify-hook-managed-tmux.test.d.ts.map +1 -0
  690. package/dist/hooks/__tests__/notify-hook-managed-tmux.test.js +1178 -0
  691. package/dist/hooks/__tests__/notify-hook-managed-tmux.test.js.map +1 -0
  692. package/dist/hooks/__tests__/notify-hook-modules.test.d.ts +9 -0
  693. package/dist/hooks/__tests__/notify-hook-modules.test.d.ts.map +1 -0
  694. package/dist/hooks/__tests__/notify-hook-modules.test.js +529 -0
  695. package/dist/hooks/__tests__/notify-hook-modules.test.js.map +1 -0
  696. package/dist/hooks/__tests__/notify-hook-native-dispatch-contract.test.d.ts +2 -0
  697. package/dist/hooks/__tests__/notify-hook-native-dispatch-contract.test.d.ts.map +1 -0
  698. package/dist/hooks/__tests__/notify-hook-native-dispatch-contract.test.js +14 -0
  699. package/dist/hooks/__tests__/notify-hook-native-dispatch-contract.test.js.map +1 -0
  700. package/dist/hooks/__tests__/notify-hook-ralph-resume.test.d.ts +2 -0
  701. package/dist/hooks/__tests__/notify-hook-ralph-resume.test.d.ts.map +1 -0
  702. package/dist/hooks/__tests__/notify-hook-ralph-resume.test.js +682 -0
  703. package/dist/hooks/__tests__/notify-hook-ralph-resume.test.js.map +1 -0
  704. package/dist/hooks/__tests__/notify-hook-regression-205.test.d.ts +9 -0
  705. package/dist/hooks/__tests__/notify-hook-regression-205.test.d.ts.map +1 -0
  706. package/dist/hooks/__tests__/notify-hook-regression-205.test.js +255 -0
  707. package/dist/hooks/__tests__/notify-hook-regression-205.test.js.map +1 -0
  708. package/dist/hooks/__tests__/notify-hook-session-idle-dedupe.test.d.ts +2 -0
  709. package/dist/hooks/__tests__/notify-hook-session-idle-dedupe.test.d.ts.map +1 -0
  710. package/dist/hooks/__tests__/notify-hook-session-idle-dedupe.test.js +162 -0
  711. package/dist/hooks/__tests__/notify-hook-session-idle-dedupe.test.js.map +1 -0
  712. package/dist/hooks/__tests__/notify-hook-session-scope.test.d.ts +2 -0
  713. package/dist/hooks/__tests__/notify-hook-session-scope.test.d.ts.map +1 -0
  714. package/dist/hooks/__tests__/notify-hook-session-scope.test.js +301 -0
  715. package/dist/hooks/__tests__/notify-hook-session-scope.test.js.map +1 -0
  716. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.d.ts +2 -0
  717. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.d.ts.map +1 -0
  718. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +1510 -0
  719. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -0
  720. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.d.ts +2 -0
  721. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.d.ts.map +1 -0
  722. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +2879 -0
  723. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -0
  724. package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.d.ts +2 -0
  725. package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.d.ts.map +1 -0
  726. package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js +228 -0
  727. package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js.map +1 -0
  728. package/dist/hooks/__tests__/notify-hook-team-worker-fail-closed.test.d.ts +2 -0
  729. package/dist/hooks/__tests__/notify-hook-team-worker-fail-closed.test.d.ts.map +1 -0
  730. package/dist/hooks/__tests__/notify-hook-team-worker-fail-closed.test.js +35 -0
  731. package/dist/hooks/__tests__/notify-hook-team-worker-fail-closed.test.js.map +1 -0
  732. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.d.ts +2 -0
  733. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.d.ts.map +1 -0
  734. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js +1589 -0
  735. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js.map +1 -0
  736. package/dist/hooks/__tests__/notify-hook-tmux-scrollback.test.d.ts +10 -0
  737. package/dist/hooks/__tests__/notify-hook-tmux-scrollback.test.d.ts.map +1 -0
  738. package/dist/hooks/__tests__/notify-hook-tmux-scrollback.test.js +0 -0
  739. package/dist/hooks/__tests__/notify-hook-tmux-scrollback.test.js.map +1 -0
  740. package/dist/hooks/__tests__/notify-hook-visual-verdict.test.d.ts +11 -0
  741. package/dist/hooks/__tests__/notify-hook-visual-verdict.test.d.ts.map +1 -0
  742. package/dist/hooks/__tests__/notify-hook-visual-verdict.test.js +266 -0
  743. package/dist/hooks/__tests__/notify-hook-visual-verdict.test.js.map +1 -0
  744. package/dist/hooks/__tests__/notify-hook-worker-idle.test.d.ts +2 -0
  745. package/dist/hooks/__tests__/notify-hook-worker-idle.test.d.ts.map +1 -0
  746. package/dist/hooks/__tests__/notify-hook-worker-idle.test.js +895 -0
  747. package/dist/hooks/__tests__/notify-hook-worker-idle.test.js.map +1 -0
  748. package/dist/hooks/__tests__/openclaw-setup-contract.test.d.ts +2 -0
  749. package/dist/hooks/__tests__/openclaw-setup-contract.test.d.ts.map +1 -0
  750. package/dist/hooks/__tests__/openclaw-setup-contract.test.js +61 -0
  751. package/dist/hooks/__tests__/openclaw-setup-contract.test.js.map +1 -0
  752. package/dist/hooks/__tests__/pre-context-gate-skills.test.d.ts +2 -0
  753. package/dist/hooks/__tests__/pre-context-gate-skills.test.d.ts.map +1 -0
  754. package/dist/hooks/__tests__/pre-context-gate-skills.test.js +40 -0
  755. package/dist/hooks/__tests__/pre-context-gate-skills.test.js.map +1 -0
  756. package/dist/hooks/__tests__/prompt-guidance-catalog.test.d.ts +2 -0
  757. package/dist/hooks/__tests__/prompt-guidance-catalog.test.d.ts.map +1 -0
  758. package/dist/hooks/__tests__/prompt-guidance-catalog.test.js +11 -0
  759. package/dist/hooks/__tests__/prompt-guidance-catalog.test.js.map +1 -0
  760. package/dist/hooks/__tests__/prompt-guidance-contract.test.d.ts +2 -0
  761. package/dist/hooks/__tests__/prompt-guidance-contract.test.d.ts.map +1 -0
  762. package/dist/hooks/__tests__/prompt-guidance-contract.test.js +38 -0
  763. package/dist/hooks/__tests__/prompt-guidance-contract.test.js.map +1 -0
  764. package/dist/hooks/__tests__/prompt-guidance-fragments.test.d.ts +2 -0
  765. package/dist/hooks/__tests__/prompt-guidance-fragments.test.d.ts.map +1 -0
  766. package/dist/hooks/__tests__/prompt-guidance-fragments.test.js +48 -0
  767. package/dist/hooks/__tests__/prompt-guidance-fragments.test.js.map +1 -0
  768. package/dist/hooks/__tests__/prompt-guidance-scenarios.test.d.ts +2 -0
  769. package/dist/hooks/__tests__/prompt-guidance-scenarios.test.d.ts.map +1 -0
  770. package/dist/hooks/__tests__/prompt-guidance-scenarios.test.js +11 -0
  771. package/dist/hooks/__tests__/prompt-guidance-scenarios.test.js.map +1 -0
  772. package/dist/hooks/__tests__/prompt-guidance-test-helpers.d.ts +5 -0
  773. package/dist/hooks/__tests__/prompt-guidance-test-helpers.d.ts.map +1 -0
  774. package/dist/hooks/__tests__/prompt-guidance-test-helpers.js +34 -0
  775. package/dist/hooks/__tests__/prompt-guidance-test-helpers.js.map +1 -0
  776. package/dist/hooks/__tests__/prompt-guidance-wave-two.test.d.ts +2 -0
  777. package/dist/hooks/__tests__/prompt-guidance-wave-two.test.d.ts.map +1 -0
  778. package/dist/hooks/__tests__/prompt-guidance-wave-two.test.js +65 -0
  779. package/dist/hooks/__tests__/prompt-guidance-wave-two.test.js.map +1 -0
  780. package/dist/hooks/__tests__/prompt-orchestration-boundary.test.d.ts +2 -0
  781. package/dist/hooks/__tests__/prompt-orchestration-boundary.test.d.ts.map +1 -0
  782. package/dist/hooks/__tests__/prompt-orchestration-boundary.test.js +38 -0
  783. package/dist/hooks/__tests__/prompt-orchestration-boundary.test.js.map +1 -0
  784. package/dist/hooks/__tests__/prompt-refactor-contract.test.d.ts +2 -0
  785. package/dist/hooks/__tests__/prompt-refactor-contract.test.d.ts.map +1 -0
  786. package/dist/hooks/__tests__/prompt-refactor-contract.test.js +22 -0
  787. package/dist/hooks/__tests__/prompt-refactor-contract.test.js.map +1 -0
  788. package/dist/hooks/__tests__/prompt-team-routing.test.d.ts +2 -0
  789. package/dist/hooks/__tests__/prompt-team-routing.test.d.ts.map +1 -0
  790. package/dist/hooks/__tests__/prompt-team-routing.test.js +49 -0
  791. package/dist/hooks/__tests__/prompt-team-routing.test.js.map +1 -0
  792. package/dist/hooks/__tests__/session.test.d.ts +2 -0
  793. package/dist/hooks/__tests__/session.test.d.ts.map +1 -0
  794. package/dist/hooks/__tests__/session.test.js +322 -0
  795. package/dist/hooks/__tests__/session.test.js.map +1 -0
  796. package/dist/hooks/__tests__/skill-guidance-contract.test.d.ts +2 -0
  797. package/dist/hooks/__tests__/skill-guidance-contract.test.d.ts.map +1 -0
  798. package/dist/hooks/__tests__/skill-guidance-contract.test.js +29 -0
  799. package/dist/hooks/__tests__/skill-guidance-contract.test.js.map +1 -0
  800. package/dist/hooks/__tests__/task-size-detector.test.d.ts +2 -0
  801. package/dist/hooks/__tests__/task-size-detector.test.d.ts.map +1 -0
  802. package/dist/hooks/__tests__/task-size-detector.test.js +330 -0
  803. package/dist/hooks/__tests__/task-size-detector.test.js.map +1 -0
  804. package/dist/hooks/__tests__/team-runtime-gating-docs-contract.test.d.ts +2 -0
  805. package/dist/hooks/__tests__/team-runtime-gating-docs-contract.test.d.ts.map +1 -0
  806. package/dist/hooks/__tests__/team-runtime-gating-docs-contract.test.js +28 -0
  807. package/dist/hooks/__tests__/team-runtime-gating-docs-contract.test.js.map +1 -0
  808. package/dist/hooks/__tests__/tmux-hook-engine-types-sync.test.d.ts +2 -0
  809. package/dist/hooks/__tests__/tmux-hook-engine-types-sync.test.d.ts.map +1 -0
  810. package/dist/hooks/__tests__/tmux-hook-engine-types-sync.test.js +24 -0
  811. package/dist/hooks/__tests__/tmux-hook-engine-types-sync.test.js.map +1 -0
  812. package/dist/hooks/__tests__/tmux-hook-engine.test.d.ts +2 -0
  813. package/dist/hooks/__tests__/tmux-hook-engine.test.d.ts.map +1 -0
  814. package/dist/hooks/__tests__/tmux-hook-engine.test.js +403 -0
  815. package/dist/hooks/__tests__/tmux-hook-engine.test.js.map +1 -0
  816. package/dist/hooks/__tests__/triage-config.test.d.ts +2 -0
  817. package/dist/hooks/__tests__/triage-config.test.d.ts.map +1 -0
  818. package/dist/hooks/__tests__/triage-config.test.js +211 -0
  819. package/dist/hooks/__tests__/triage-config.test.js.map +1 -0
  820. package/dist/hooks/__tests__/triage-heuristic.test.d.ts +2 -0
  821. package/dist/hooks/__tests__/triage-heuristic.test.d.ts.map +1 -0
  822. package/dist/hooks/__tests__/triage-heuristic.test.js +285 -0
  823. package/dist/hooks/__tests__/triage-heuristic.test.js.map +1 -0
  824. package/dist/hooks/__tests__/triage-state.test.d.ts +2 -0
  825. package/dist/hooks/__tests__/triage-state.test.d.ts.map +1 -0
  826. package/dist/hooks/__tests__/triage-state.test.js +426 -0
  827. package/dist/hooks/__tests__/triage-state.test.js.map +1 -0
  828. package/dist/hooks/__tests__/visual-ralph-skill.test.d.ts +2 -0
  829. package/dist/hooks/__tests__/visual-ralph-skill.test.d.ts.map +1 -0
  830. package/dist/hooks/__tests__/visual-ralph-skill.test.js +44 -0
  831. package/dist/hooks/__tests__/visual-ralph-skill.test.js.map +1 -0
  832. package/dist/hooks/__tests__/visual-verdict-loop.test.d.ts +2 -0
  833. package/dist/hooks/__tests__/visual-verdict-loop.test.d.ts.map +1 -0
  834. package/dist/hooks/__tests__/visual-verdict-loop.test.js +35 -0
  835. package/dist/hooks/__tests__/visual-verdict-loop.test.js.map +1 -0
  836. package/dist/hooks/__tests__/wiki-docs-contract.test.d.ts +2 -0
  837. package/dist/hooks/__tests__/wiki-docs-contract.test.d.ts.map +1 -0
  838. package/dist/hooks/__tests__/wiki-docs-contract.test.js +34 -0
  839. package/dist/hooks/__tests__/wiki-docs-contract.test.js.map +1 -0
  840. package/dist/hooks/agents-overlay.d.ts +51 -0
  841. package/dist/hooks/agents-overlay.d.ts.map +1 -0
  842. package/dist/hooks/agents-overlay.js +557 -0
  843. package/dist/hooks/agents-overlay.js.map +1 -0
  844. package/dist/hooks/code-simplifier/__tests__/index.test.d.ts +2 -0
  845. package/dist/hooks/code-simplifier/__tests__/index.test.d.ts.map +1 -0
  846. package/dist/hooks/code-simplifier/__tests__/index.test.js +187 -0
  847. package/dist/hooks/code-simplifier/__tests__/index.test.js.map +1 -0
  848. package/dist/hooks/code-simplifier/index.d.ts +80 -0
  849. package/dist/hooks/code-simplifier/index.d.ts.map +1 -0
  850. package/dist/hooks/code-simplifier/index.js +172 -0
  851. package/dist/hooks/code-simplifier/index.js.map +1 -0
  852. package/dist/hooks/codebase-map.d.ts +23 -0
  853. package/dist/hooks/codebase-map.d.ts.map +1 -0
  854. package/dist/hooks/codebase-map.js +233 -0
  855. package/dist/hooks/codebase-map.js.map +1 -0
  856. package/dist/hooks/explore-routing.d.ts +5 -0
  857. package/dist/hooks/explore-routing.d.ts.map +1 -0
  858. package/dist/hooks/explore-routing.js +47 -0
  859. package/dist/hooks/explore-routing.js.map +1 -0
  860. package/dist/hooks/extensibility/__tests__/dispatcher.test.d.ts +2 -0
  861. package/dist/hooks/extensibility/__tests__/dispatcher.test.d.ts.map +1 -0
  862. package/dist/hooks/extensibility/__tests__/dispatcher.test.js +242 -0
  863. package/dist/hooks/extensibility/__tests__/dispatcher.test.js.map +1 -0
  864. package/dist/hooks/extensibility/__tests__/events.test.d.ts +2 -0
  865. package/dist/hooks/extensibility/__tests__/events.test.d.ts.map +1 -0
  866. package/dist/hooks/extensibility/__tests__/events.test.js +125 -0
  867. package/dist/hooks/extensibility/__tests__/events.test.js.map +1 -0
  868. package/dist/hooks/extensibility/__tests__/example-hook-plugins.test.d.ts +2 -0
  869. package/dist/hooks/extensibility/__tests__/example-hook-plugins.test.d.ts.map +1 -0
  870. package/dist/hooks/extensibility/__tests__/example-hook-plugins.test.js +153 -0
  871. package/dist/hooks/extensibility/__tests__/example-hook-plugins.test.js.map +1 -0
  872. package/dist/hooks/extensibility/__tests__/loader.test.d.ts +2 -0
  873. package/dist/hooks/extensibility/__tests__/loader.test.d.ts.map +1 -0
  874. package/dist/hooks/extensibility/__tests__/loader.test.js +254 -0
  875. package/dist/hooks/extensibility/__tests__/loader.test.js.map +1 -0
  876. package/dist/hooks/extensibility/__tests__/logging.test.d.ts +2 -0
  877. package/dist/hooks/extensibility/__tests__/logging.test.d.ts.map +1 -0
  878. package/dist/hooks/extensibility/__tests__/logging.test.js +74 -0
  879. package/dist/hooks/extensibility/__tests__/logging.test.js.map +1 -0
  880. package/dist/hooks/extensibility/__tests__/plugin-runner.test.d.ts +2 -0
  881. package/dist/hooks/extensibility/__tests__/plugin-runner.test.d.ts.map +1 -0
  882. package/dist/hooks/extensibility/__tests__/plugin-runner.test.js +202 -0
  883. package/dist/hooks/extensibility/__tests__/plugin-runner.test.js.map +1 -0
  884. package/dist/hooks/extensibility/__tests__/runtime.test.d.ts +2 -0
  885. package/dist/hooks/extensibility/__tests__/runtime.test.d.ts.map +1 -0
  886. package/dist/hooks/extensibility/__tests__/runtime.test.js +198 -0
  887. package/dist/hooks/extensibility/__tests__/runtime.test.js.map +1 -0
  888. package/dist/hooks/extensibility/__tests__/sdk-public-surface.test.d.ts +2 -0
  889. package/dist/hooks/extensibility/__tests__/sdk-public-surface.test.d.ts.map +1 -0
  890. package/dist/hooks/extensibility/__tests__/sdk-public-surface.test.js +32 -0
  891. package/dist/hooks/extensibility/__tests__/sdk-public-surface.test.js.map +1 -0
  892. package/dist/hooks/extensibility/__tests__/sdk.test.d.ts +2 -0
  893. package/dist/hooks/extensibility/__tests__/sdk.test.d.ts.map +1 -0
  894. package/dist/hooks/extensibility/__tests__/sdk.test.js +479 -0
  895. package/dist/hooks/extensibility/__tests__/sdk.test.js.map +1 -0
  896. package/dist/hooks/extensibility/dispatcher.d.ts +4 -0
  897. package/dist/hooks/extensibility/dispatcher.d.ts.map +1 -0
  898. package/dist/hooks/extensibility/dispatcher.js +285 -0
  899. package/dist/hooks/extensibility/dispatcher.js.map +1 -0
  900. package/dist/hooks/extensibility/events.d.ts +18 -0
  901. package/dist/hooks/extensibility/events.d.ts.map +1 -0
  902. package/dist/hooks/extensibility/events.js +53 -0
  903. package/dist/hooks/extensibility/events.js.map +1 -0
  904. package/dist/hooks/extensibility/index.d.ts +6 -0
  905. package/dist/hooks/extensibility/index.d.ts.map +1 -0
  906. package/dist/hooks/extensibility/index.js +6 -0
  907. package/dist/hooks/extensibility/index.js.map +1 -0
  908. package/dist/hooks/extensibility/loader.d.ts +14 -0
  909. package/dist/hooks/extensibility/loader.d.ts.map +1 -0
  910. package/dist/hooks/extensibility/loader.js +117 -0
  911. package/dist/hooks/extensibility/loader.js.map +1 -0
  912. package/dist/hooks/extensibility/logging.d.ts +4 -0
  913. package/dist/hooks/extensibility/logging.d.ts.map +1 -0
  914. package/dist/hooks/extensibility/logging.js +21 -0
  915. package/dist/hooks/extensibility/logging.js.map +1 -0
  916. package/dist/hooks/extensibility/plugin-runner.d.ts +2 -0
  917. package/dist/hooks/extensibility/plugin-runner.d.ts.map +1 -0
  918. package/dist/hooks/extensibility/plugin-runner.js +69 -0
  919. package/dist/hooks/extensibility/plugin-runner.js.map +1 -0
  920. package/dist/hooks/extensibility/runtime.d.ts +3 -0
  921. package/dist/hooks/extensibility/runtime.d.ts.map +1 -0
  922. package/dist/hooks/extensibility/runtime.js +42 -0
  923. package/dist/hooks/extensibility/runtime.js.map +1 -0
  924. package/dist/hooks/extensibility/sdk/logging.d.ts +6 -0
  925. package/dist/hooks/extensibility/sdk/logging.d.ts.map +1 -0
  926. package/dist/hooks/extensibility/sdk/logging.js +32 -0
  927. package/dist/hooks/extensibility/sdk/logging.js.map +1 -0
  928. package/dist/hooks/extensibility/sdk/paths.d.ts +7 -0
  929. package/dist/hooks/extensibility/sdk/paths.d.ts.map +1 -0
  930. package/dist/hooks/extensibility/sdk/paths.js +22 -0
  931. package/dist/hooks/extensibility/sdk/paths.js.map +1 -0
  932. package/dist/hooks/extensibility/sdk/plugin-state.d.ts +5 -0
  933. package/dist/hooks/extensibility/sdk/plugin-state.d.ts.map +1 -0
  934. package/dist/hooks/extensibility/sdk/plugin-state.js +66 -0
  935. package/dist/hooks/extensibility/sdk/plugin-state.js.map +1 -0
  936. package/dist/hooks/extensibility/sdk/runtime-state.d.ts +3 -0
  937. package/dist/hooks/extensibility/sdk/runtime-state.d.ts.map +1 -0
  938. package/dist/hooks/extensibility/sdk/runtime-state.js +47 -0
  939. package/dist/hooks/extensibility/sdk/runtime-state.js.map +1 -0
  940. package/dist/hooks/extensibility/sdk/tmux.d.ts +10 -0
  941. package/dist/hooks/extensibility/sdk/tmux.d.ts.map +1 -0
  942. package/dist/hooks/extensibility/sdk/tmux.js +181 -0
  943. package/dist/hooks/extensibility/sdk/tmux.js.map +1 -0
  944. package/dist/hooks/extensibility/sdk.d.ts +11 -0
  945. package/dist/hooks/extensibility/sdk.d.ts.map +1 -0
  946. package/dist/hooks/extensibility/sdk.js +21 -0
  947. package/dist/hooks/extensibility/sdk.js.map +1 -0
  948. package/dist/hooks/extensibility/types.d.ts +175 -0
  949. package/dist/hooks/extensibility/types.d.ts.map +1 -0
  950. package/dist/hooks/extensibility/types.js +2 -0
  951. package/dist/hooks/extensibility/types.js.map +1 -0
  952. package/dist/hooks/keyword-detector.d.ts +163 -0
  953. package/dist/hooks/keyword-detector.d.ts.map +1 -0
  954. package/dist/hooks/keyword-detector.js +920 -0
  955. package/dist/hooks/keyword-detector.js.map +1 -0
  956. package/dist/hooks/keyword-registry.d.ts +15 -0
  957. package/dist/hooks/keyword-registry.d.ts.map +1 -0
  958. package/dist/hooks/keyword-registry.js +78 -0
  959. package/dist/hooks/keyword-registry.js.map +1 -0
  960. package/dist/hooks/prompt-guidance-contract.d.ts +20 -0
  961. package/dist/hooks/prompt-guidance-contract.d.ts.map +1 -0
  962. package/dist/hooks/prompt-guidance-contract.js +321 -0
  963. package/dist/hooks/prompt-guidance-contract.js.map +1 -0
  964. package/dist/hooks/session.d.ts +72 -0
  965. package/dist/hooks/session.d.ts.map +1 -0
  966. package/dist/hooks/session.js +332 -0
  967. package/dist/hooks/session.js.map +1 -0
  968. package/dist/hooks/task-size-detector.d.ts +72 -0
  969. package/dist/hooks/task-size-detector.d.ts.map +1 -0
  970. package/dist/hooks/task-size-detector.js +202 -0
  971. package/dist/hooks/task-size-detector.js.map +1 -0
  972. package/dist/hooks/triage-config.d.ts +33 -0
  973. package/dist/hooks/triage-config.d.ts.map +1 -0
  974. package/dist/hooks/triage-config.js +87 -0
  975. package/dist/hooks/triage-config.js.map +1 -0
  976. package/dist/hooks/triage-heuristic.d.ts +20 -0
  977. package/dist/hooks/triage-heuristic.d.ts.map +1 -0
  978. package/dist/hooks/triage-heuristic.js +287 -0
  979. package/dist/hooks/triage-heuristic.js.map +1 -0
  980. package/dist/hooks/triage-state.d.ts +63 -0
  981. package/dist/hooks/triage-state.d.ts.map +1 -0
  982. package/dist/hooks/triage-state.js +139 -0
  983. package/dist/hooks/triage-state.js.map +1 -0
  984. package/dist/hud/__tests__/authority.test.d.ts +2 -0
  985. package/dist/hud/__tests__/authority.test.d.ts.map +1 -0
  986. package/dist/hud/__tests__/authority.test.js +56 -0
  987. package/dist/hud/__tests__/authority.test.js.map +1 -0
  988. package/dist/hud/__tests__/colors.test.d.ts +2 -0
  989. package/dist/hud/__tests__/colors.test.d.ts.map +1 -0
  990. package/dist/hud/__tests__/colors.test.js +92 -0
  991. package/dist/hud/__tests__/colors.test.js.map +1 -0
  992. package/dist/hud/__tests__/hud-tmux-injection.test.d.ts +10 -0
  993. package/dist/hud/__tests__/hud-tmux-injection.test.d.ts.map +1 -0
  994. package/dist/hud/__tests__/hud-tmux-injection.test.js +150 -0
  995. package/dist/hud/__tests__/hud-tmux-injection.test.js.map +1 -0
  996. package/dist/hud/__tests__/index.test.d.ts +2 -0
  997. package/dist/hud/__tests__/index.test.d.ts.map +1 -0
  998. package/dist/hud/__tests__/index.test.js +180 -0
  999. package/dist/hud/__tests__/index.test.js.map +1 -0
  1000. package/dist/hud/__tests__/reconcile.test.d.ts +2 -0
  1001. package/dist/hud/__tests__/reconcile.test.d.ts.map +1 -0
  1002. package/dist/hud/__tests__/reconcile.test.js +125 -0
  1003. package/dist/hud/__tests__/reconcile.test.js.map +1 -0
  1004. package/dist/hud/__tests__/render.test.d.ts +2 -0
  1005. package/dist/hud/__tests__/render.test.d.ts.map +1 -0
  1006. package/dist/hud/__tests__/render.test.js +573 -0
  1007. package/dist/hud/__tests__/render.test.js.map +1 -0
  1008. package/dist/hud/__tests__/state.test.d.ts +2 -0
  1009. package/dist/hud/__tests__/state.test.d.ts.map +1 -0
  1010. package/dist/hud/__tests__/state.test.js +618 -0
  1011. package/dist/hud/__tests__/state.test.js.map +1 -0
  1012. package/dist/hud/__tests__/types.test.d.ts +2 -0
  1013. package/dist/hud/__tests__/types.test.d.ts.map +1 -0
  1014. package/dist/hud/__tests__/types.test.js +79 -0
  1015. package/dist/hud/__tests__/types.test.js.map +1 -0
  1016. package/dist/hud/__tests__/watch.test.d.ts +2 -0
  1017. package/dist/hud/__tests__/watch.test.d.ts.map +1 -0
  1018. package/dist/hud/__tests__/watch.test.js +63 -0
  1019. package/dist/hud/__tests__/watch.test.js.map +1 -0
  1020. package/dist/hud/authority.d.ts +17 -0
  1021. package/dist/hud/authority.d.ts.map +1 -0
  1022. package/dist/hud/authority.js +55 -0
  1023. package/dist/hud/authority.js.map +1 -0
  1024. package/dist/hud/colors.d.ts +19 -0
  1025. package/dist/hud/colors.d.ts.map +1 -0
  1026. package/dist/hud/colors.js +56 -0
  1027. package/dist/hud/colors.js.map +1 -0
  1028. package/dist/hud/constants.d.ts +5 -0
  1029. package/dist/hud/constants.d.ts.map +1 -0
  1030. package/dist/hud/constants.js +5 -0
  1031. package/dist/hud/constants.js.map +1 -0
  1032. package/dist/hud/index.d.ts +54 -0
  1033. package/dist/hud/index.d.ts.map +1 -0
  1034. package/dist/hud/index.js +239 -0
  1035. package/dist/hud/index.js.map +1 -0
  1036. package/dist/hud/reconcile.d.ts +25 -0
  1037. package/dist/hud/reconcile.d.ts.map +1 -0
  1038. package/dist/hud/reconcile.js +73 -0
  1039. package/dist/hud/reconcile.js.map +1 -0
  1040. package/dist/hud/render.d.ts +14 -0
  1041. package/dist/hud/render.d.ts.map +1 -0
  1042. package/dist/hud/render.js +312 -0
  1043. package/dist/hud/render.js.map +1 -0
  1044. package/dist/hud/state.d.ts +26 -0
  1045. package/dist/hud/state.d.ts.map +1 -0
  1046. package/dist/hud/state.js +385 -0
  1047. package/dist/hud/state.js.map +1 -0
  1048. package/dist/hud/tmux.d.ts +27 -0
  1049. package/dist/hud/tmux.d.ts.map +1 -0
  1050. package/dist/hud/tmux.js +139 -0
  1051. package/dist/hud/tmux.js.map +1 -0
  1052. package/dist/hud/types.d.ts +130 -0
  1053. package/dist/hud/types.d.ts.map +1 -0
  1054. package/dist/hud/types.js +14 -0
  1055. package/dist/hud/types.js.map +1 -0
  1056. package/dist/index.d.ts +19 -0
  1057. package/dist/index.d.ts.map +1 -0
  1058. package/dist/index.js +19 -0
  1059. package/dist/index.js.map +1 -0
  1060. package/dist/mcp/__tests__/bootstrap.test.d.ts +2 -0
  1061. package/dist/mcp/__tests__/bootstrap.test.d.ts.map +1 -0
  1062. package/dist/mcp/__tests__/bootstrap.test.js +207 -0
  1063. package/dist/mcp/__tests__/bootstrap.test.js.map +1 -0
  1064. package/dist/mcp/__tests__/code-intel-server.test.d.ts +2 -0
  1065. package/dist/mcp/__tests__/code-intel-server.test.d.ts.map +1 -0
  1066. package/dist/mcp/__tests__/code-intel-server.test.js +70 -0
  1067. package/dist/mcp/__tests__/code-intel-server.test.js.map +1 -0
  1068. package/dist/mcp/__tests__/memory-server.test.d.ts +2 -0
  1069. package/dist/mcp/__tests__/memory-server.test.d.ts.map +1 -0
  1070. package/dist/mcp/__tests__/memory-server.test.js +36 -0
  1071. package/dist/mcp/__tests__/memory-server.test.js.map +1 -0
  1072. package/dist/mcp/__tests__/memory-validation.test.d.ts +2 -0
  1073. package/dist/mcp/__tests__/memory-validation.test.d.ts.map +1 -0
  1074. package/dist/mcp/__tests__/memory-validation.test.js +29 -0
  1075. package/dist/mcp/__tests__/memory-validation.test.js.map +1 -0
  1076. package/dist/mcp/__tests__/path-traversal.test.d.ts +2 -0
  1077. package/dist/mcp/__tests__/path-traversal.test.d.ts.map +1 -0
  1078. package/dist/mcp/__tests__/path-traversal.test.js +83 -0
  1079. package/dist/mcp/__tests__/path-traversal.test.js.map +1 -0
  1080. package/dist/mcp/__tests__/server-lifecycle.test.d.ts +2 -0
  1081. package/dist/mcp/__tests__/server-lifecycle.test.d.ts.map +1 -0
  1082. package/dist/mcp/__tests__/server-lifecycle.test.js +260 -0
  1083. package/dist/mcp/__tests__/server-lifecycle.test.js.map +1 -0
  1084. package/dist/mcp/__tests__/state-paths.test.d.ts +2 -0
  1085. package/dist/mcp/__tests__/state-paths.test.d.ts.map +1 -0
  1086. package/dist/mcp/__tests__/state-paths.test.js +209 -0
  1087. package/dist/mcp/__tests__/state-paths.test.js.map +1 -0
  1088. package/dist/mcp/__tests__/state-server-ralph-phase.test.d.ts +2 -0
  1089. package/dist/mcp/__tests__/state-server-ralph-phase.test.d.ts.map +1 -0
  1090. package/dist/mcp/__tests__/state-server-ralph-phase.test.js +109 -0
  1091. package/dist/mcp/__tests__/state-server-ralph-phase.test.js.map +1 -0
  1092. package/dist/mcp/__tests__/state-server-schema.test.d.ts +2 -0
  1093. package/dist/mcp/__tests__/state-server-schema.test.d.ts.map +1 -0
  1094. package/dist/mcp/__tests__/state-server-schema.test.js +29 -0
  1095. package/dist/mcp/__tests__/state-server-schema.test.js.map +1 -0
  1096. package/dist/mcp/__tests__/state-server-team-tools.test.d.ts +2 -0
  1097. package/dist/mcp/__tests__/state-server-team-tools.test.d.ts.map +1 -0
  1098. package/dist/mcp/__tests__/state-server-team-tools.test.js +35 -0
  1099. package/dist/mcp/__tests__/state-server-team-tools.test.js.map +1 -0
  1100. package/dist/mcp/__tests__/state-server.test.d.ts +2 -0
  1101. package/dist/mcp/__tests__/state-server.test.d.ts.map +1 -0
  1102. package/dist/mcp/__tests__/state-server.test.js +965 -0
  1103. package/dist/mcp/__tests__/state-server.test.js.map +1 -0
  1104. package/dist/mcp/__tests__/trace-server.test.d.ts +2 -0
  1105. package/dist/mcp/__tests__/trace-server.test.d.ts.map +1 -0
  1106. package/dist/mcp/__tests__/trace-server.test.js +119 -0
  1107. package/dist/mcp/__tests__/trace-server.test.js.map +1 -0
  1108. package/dist/mcp/__tests__/wiki-server.test.d.ts +2 -0
  1109. package/dist/mcp/__tests__/wiki-server.test.d.ts.map +1 -0
  1110. package/dist/mcp/__tests__/wiki-server.test.js +30 -0
  1111. package/dist/mcp/__tests__/wiki-server.test.js.map +1 -0
  1112. package/dist/mcp/bootstrap.d.ts +39 -0
  1113. package/dist/mcp/bootstrap.d.ts.map +1 -0
  1114. package/dist/mcp/bootstrap.js +335 -0
  1115. package/dist/mcp/bootstrap.js.map +1 -0
  1116. package/dist/mcp/code-intel-server.d.ts +333 -0
  1117. package/dist/mcp/code-intel-server.d.ts.map +1 -0
  1118. package/dist/mcp/code-intel-server.js +605 -0
  1119. package/dist/mcp/code-intel-server.js.map +1 -0
  1120. package/dist/mcp/memory-server.d.ts +201 -0
  1121. package/dist/mcp/memory-server.d.ts.map +1 -0
  1122. package/dist/mcp/memory-server.js +441 -0
  1123. package/dist/mcp/memory-server.js.map +1 -0
  1124. package/dist/mcp/memory-validation.d.ts +9 -0
  1125. package/dist/mcp/memory-validation.d.ts.map +1 -0
  1126. package/dist/mcp/memory-validation.js +11 -0
  1127. package/dist/mcp/memory-validation.js.map +1 -0
  1128. package/dist/mcp/state-paths.d.ts +42 -0
  1129. package/dist/mcp/state-paths.d.ts.map +1 -0
  1130. package/dist/mcp/state-paths.js +290 -0
  1131. package/dist/mcp/state-paths.js.map +1 -0
  1132. package/dist/mcp/state-server.d.ts +222 -0
  1133. package/dist/mcp/state-server.d.ts.map +1 -0
  1134. package/dist/mcp/state-server.js +181 -0
  1135. package/dist/mcp/state-server.js.map +1 -0
  1136. package/dist/mcp/trace-server.d.ts +81 -0
  1137. package/dist/mcp/trace-server.d.ts.map +1 -0
  1138. package/dist/mcp/trace-server.js +271 -0
  1139. package/dist/mcp/trace-server.js.map +1 -0
  1140. package/dist/mcp/wiki-server.d.ts +181 -0
  1141. package/dist/mcp/wiki-server.d.ts.map +1 -0
  1142. package/dist/mcp/wiki-server.js +235 -0
  1143. package/dist/mcp/wiki-server.js.map +1 -0
  1144. package/dist/modes/__tests__/base-autoresearch-contract.test.d.ts +2 -0
  1145. package/dist/modes/__tests__/base-autoresearch-contract.test.d.ts.map +1 -0
  1146. package/dist/modes/__tests__/base-autoresearch-contract.test.js +123 -0
  1147. package/dist/modes/__tests__/base-autoresearch-contract.test.js.map +1 -0
  1148. package/dist/modes/__tests__/base-multi-state-compat.test.d.ts +2 -0
  1149. package/dist/modes/__tests__/base-multi-state-compat.test.d.ts.map +1 -0
  1150. package/dist/modes/__tests__/base-multi-state-compat.test.js +38 -0
  1151. package/dist/modes/__tests__/base-multi-state-compat.test.js.map +1 -0
  1152. package/dist/modes/__tests__/base-ralph-contract.test.d.ts +2 -0
  1153. package/dist/modes/__tests__/base-ralph-contract.test.d.ts.map +1 -0
  1154. package/dist/modes/__tests__/base-ralph-contract.test.js +64 -0
  1155. package/dist/modes/__tests__/base-ralph-contract.test.js.map +1 -0
  1156. package/dist/modes/__tests__/base-session-scope.test.d.ts +2 -0
  1157. package/dist/modes/__tests__/base-session-scope.test.d.ts.map +1 -0
  1158. package/dist/modes/__tests__/base-session-scope.test.js +98 -0
  1159. package/dist/modes/__tests__/base-session-scope.test.js.map +1 -0
  1160. package/dist/modes/__tests__/base-tmux-pane.test.d.ts +2 -0
  1161. package/dist/modes/__tests__/base-tmux-pane.test.d.ts.map +1 -0
  1162. package/dist/modes/__tests__/base-tmux-pane.test.js +39 -0
  1163. package/dist/modes/__tests__/base-tmux-pane.test.js.map +1 -0
  1164. package/dist/modes/base.d.ts +56 -0
  1165. package/dist/modes/base.d.ts.map +1 -0
  1166. package/dist/modes/base.js +241 -0
  1167. package/dist/modes/base.js.map +1 -0
  1168. package/dist/notifications/__tests__/config.test.d.ts +2 -0
  1169. package/dist/notifications/__tests__/config.test.d.ts.map +1 -0
  1170. package/dist/notifications/__tests__/config.test.js +269 -0
  1171. package/dist/notifications/__tests__/config.test.js.map +1 -0
  1172. package/dist/notifications/__tests__/custom-alias-enablement.test.d.ts +2 -0
  1173. package/dist/notifications/__tests__/custom-alias-enablement.test.d.ts.map +1 -0
  1174. package/dist/notifications/__tests__/custom-alias-enablement.test.js +84 -0
  1175. package/dist/notifications/__tests__/custom-alias-enablement.test.js.map +1 -0
  1176. package/dist/notifications/__tests__/dispatch-cooldown.test.d.ts +5 -0
  1177. package/dist/notifications/__tests__/dispatch-cooldown.test.d.ts.map +1 -0
  1178. package/dist/notifications/__tests__/dispatch-cooldown.test.js +100 -0
  1179. package/dist/notifications/__tests__/dispatch-cooldown.test.js.map +1 -0
  1180. package/dist/notifications/__tests__/dispatcher.test.d.ts +2 -0
  1181. package/dist/notifications/__tests__/dispatcher.test.d.ts.map +1 -0
  1182. package/dist/notifications/__tests__/dispatcher.test.js +202 -0
  1183. package/dist/notifications/__tests__/dispatcher.test.js.map +1 -0
  1184. package/dist/notifications/__tests__/formatter.test.d.ts +2 -0
  1185. package/dist/notifications/__tests__/formatter.test.d.ts.map +1 -0
  1186. package/dist/notifications/__tests__/formatter.test.js +270 -0
  1187. package/dist/notifications/__tests__/formatter.test.js.map +1 -0
  1188. package/dist/notifications/__tests__/hook-config.test.d.ts +5 -0
  1189. package/dist/notifications/__tests__/hook-config.test.d.ts.map +1 -0
  1190. package/dist/notifications/__tests__/hook-config.test.js +139 -0
  1191. package/dist/notifications/__tests__/hook-config.test.js.map +1 -0
  1192. package/dist/notifications/__tests__/idle-cooldown.test.d.ts +5 -0
  1193. package/dist/notifications/__tests__/idle-cooldown.test.d.ts.map +1 -0
  1194. package/dist/notifications/__tests__/idle-cooldown.test.js +209 -0
  1195. package/dist/notifications/__tests__/idle-cooldown.test.js.map +1 -0
  1196. package/dist/notifications/__tests__/index.test.d.ts +2 -0
  1197. package/dist/notifications/__tests__/index.test.d.ts.map +1 -0
  1198. package/dist/notifications/__tests__/index.test.js +188 -0
  1199. package/dist/notifications/__tests__/index.test.js.map +1 -0
  1200. package/dist/notifications/__tests__/lifecycle-dedupe.test.d.ts +2 -0
  1201. package/dist/notifications/__tests__/lifecycle-dedupe.test.d.ts.map +1 -0
  1202. package/dist/notifications/__tests__/lifecycle-dedupe.test.js +86 -0
  1203. package/dist/notifications/__tests__/lifecycle-dedupe.test.js.map +1 -0
  1204. package/dist/notifications/__tests__/notifier.test.d.ts +2 -0
  1205. package/dist/notifications/__tests__/notifier.test.d.ts.map +1 -0
  1206. package/dist/notifications/__tests__/notifier.test.js +239 -0
  1207. package/dist/notifications/__tests__/notifier.test.js.map +1 -0
  1208. package/dist/notifications/__tests__/profiles.test.d.ts +2 -0
  1209. package/dist/notifications/__tests__/profiles.test.d.ts.map +1 -0
  1210. package/dist/notifications/__tests__/profiles.test.js +404 -0
  1211. package/dist/notifications/__tests__/profiles.test.js.map +1 -0
  1212. package/dist/notifications/__tests__/reply-config.test.d.ts +2 -0
  1213. package/dist/notifications/__tests__/reply-config.test.d.ts.map +1 -0
  1214. package/dist/notifications/__tests__/reply-config.test.js +79 -0
  1215. package/dist/notifications/__tests__/reply-config.test.js.map +1 -0
  1216. package/dist/notifications/__tests__/reply-listener.test.d.ts +2 -0
  1217. package/dist/notifications/__tests__/reply-listener.test.d.ts.map +1 -0
  1218. package/dist/notifications/__tests__/reply-listener.test.js +723 -0
  1219. package/dist/notifications/__tests__/reply-listener.test.js.map +1 -0
  1220. package/dist/notifications/__tests__/session-idle-tail-dedupe.test.d.ts +2 -0
  1221. package/dist/notifications/__tests__/session-idle-tail-dedupe.test.d.ts.map +1 -0
  1222. package/dist/notifications/__tests__/session-idle-tail-dedupe.test.js +93 -0
  1223. package/dist/notifications/__tests__/session-idle-tail-dedupe.test.js.map +1 -0
  1224. package/dist/notifications/__tests__/session-registry.test.d.ts +2 -0
  1225. package/dist/notifications/__tests__/session-registry.test.d.ts.map +1 -0
  1226. package/dist/notifications/__tests__/session-registry.test.js +234 -0
  1227. package/dist/notifications/__tests__/session-registry.test.js.map +1 -0
  1228. package/dist/notifications/__tests__/session-status.test.d.ts +2 -0
  1229. package/dist/notifications/__tests__/session-status.test.d.ts.map +1 -0
  1230. package/dist/notifications/__tests__/session-status.test.js +249 -0
  1231. package/dist/notifications/__tests__/session-status.test.js.map +1 -0
  1232. package/dist/notifications/__tests__/temp-mode.test.d.ts +2 -0
  1233. package/dist/notifications/__tests__/temp-mode.test.d.ts.map +1 -0
  1234. package/dist/notifications/__tests__/temp-mode.test.js +172 -0
  1235. package/dist/notifications/__tests__/temp-mode.test.js.map +1 -0
  1236. package/dist/notifications/__tests__/template-engine.test.d.ts +5 -0
  1237. package/dist/notifications/__tests__/template-engine.test.d.ts.map +1 -0
  1238. package/dist/notifications/__tests__/template-engine.test.js +158 -0
  1239. package/dist/notifications/__tests__/template-engine.test.js.map +1 -0
  1240. package/dist/notifications/__tests__/tmux-detector.test.d.ts +2 -0
  1241. package/dist/notifications/__tests__/tmux-detector.test.d.ts.map +1 -0
  1242. package/dist/notifications/__tests__/tmux-detector.test.js +208 -0
  1243. package/dist/notifications/__tests__/tmux-detector.test.js.map +1 -0
  1244. package/dist/notifications/__tests__/tmux.test.d.ts +2 -0
  1245. package/dist/notifications/__tests__/tmux.test.d.ts.map +1 -0
  1246. package/dist/notifications/__tests__/tmux.test.js +285 -0
  1247. package/dist/notifications/__tests__/tmux.test.js.map +1 -0
  1248. package/dist/notifications/__tests__/verbosity.test.d.ts +2 -0
  1249. package/dist/notifications/__tests__/verbosity.test.d.ts.map +1 -0
  1250. package/dist/notifications/__tests__/verbosity.test.js +237 -0
  1251. package/dist/notifications/__tests__/verbosity.test.js.map +1 -0
  1252. package/dist/notifications/config.d.ts +65 -0
  1253. package/dist/notifications/config.d.ts.map +1 -0
  1254. package/dist/notifications/config.js +612 -0
  1255. package/dist/notifications/config.js.map +1 -0
  1256. package/dist/notifications/dispatch-cooldown.d.ts +36 -0
  1257. package/dist/notifications/dispatch-cooldown.d.ts.map +1 -0
  1258. package/dist/notifications/dispatch-cooldown.js +109 -0
  1259. package/dist/notifications/dispatch-cooldown.js.map +1 -0
  1260. package/dist/notifications/dispatcher.d.ts +15 -0
  1261. package/dist/notifications/dispatcher.d.ts.map +1 -0
  1262. package/dist/notifications/dispatcher.js +410 -0
  1263. package/dist/notifications/dispatcher.js.map +1 -0
  1264. package/dist/notifications/formatter.d.ts +30 -0
  1265. package/dist/notifications/formatter.d.ts.map +1 -0
  1266. package/dist/notifications/formatter.js +234 -0
  1267. package/dist/notifications/formatter.js.map +1 -0
  1268. package/dist/notifications/hook-config-types.d.ts +43 -0
  1269. package/dist/notifications/hook-config-types.d.ts.map +1 -0
  1270. package/dist/notifications/hook-config-types.js +8 -0
  1271. package/dist/notifications/hook-config-types.js.map +1 -0
  1272. package/dist/notifications/hook-config.d.ts +40 -0
  1273. package/dist/notifications/hook-config.d.ts.map +1 -0
  1274. package/dist/notifications/hook-config.js +127 -0
  1275. package/dist/notifications/hook-config.js.map +1 -0
  1276. package/dist/notifications/idle-cooldown.d.ts +61 -0
  1277. package/dist/notifications/idle-cooldown.d.ts.map +1 -0
  1278. package/dist/notifications/idle-cooldown.js +207 -0
  1279. package/dist/notifications/idle-cooldown.js.map +1 -0
  1280. package/dist/notifications/index.d.ts +40 -0
  1281. package/dist/notifications/index.d.ts.map +1 -0
  1282. package/dist/notifications/index.js +228 -0
  1283. package/dist/notifications/index.js.map +1 -0
  1284. package/dist/notifications/lifecycle-dedupe.d.ts +8 -0
  1285. package/dist/notifications/lifecycle-dedupe.d.ts.map +1 -0
  1286. package/dist/notifications/lifecycle-dedupe.js +112 -0
  1287. package/dist/notifications/lifecycle-dedupe.js.map +1 -0
  1288. package/dist/notifications/notifier.d.ts +44 -0
  1289. package/dist/notifications/notifier.d.ts.map +1 -0
  1290. package/dist/notifications/notifier.js +151 -0
  1291. package/dist/notifications/notifier.js.map +1 -0
  1292. package/dist/notifications/reply-listener.d.ts +123 -0
  1293. package/dist/notifications/reply-listener.d.ts.map +1 -0
  1294. package/dist/notifications/reply-listener.js +846 -0
  1295. package/dist/notifications/reply-listener.js.map +1 -0
  1296. package/dist/notifications/session-registry.d.ts +26 -0
  1297. package/dist/notifications/session-registry.d.ts.map +1 -0
  1298. package/dist/notifications/session-registry.js +293 -0
  1299. package/dist/notifications/session-registry.js.map +1 -0
  1300. package/dist/notifications/session-status.d.ts +25 -0
  1301. package/dist/notifications/session-status.d.ts.map +1 -0
  1302. package/dist/notifications/session-status.js +202 -0
  1303. package/dist/notifications/session-status.js.map +1 -0
  1304. package/dist/notifications/temp-contract.d.ts +22 -0
  1305. package/dist/notifications/temp-contract.d.ts.map +1 -0
  1306. package/dist/notifications/temp-contract.js +147 -0
  1307. package/dist/notifications/temp-contract.js.map +1 -0
  1308. package/dist/notifications/template-engine.d.ts +34 -0
  1309. package/dist/notifications/template-engine.d.ts.map +1 -0
  1310. package/dist/notifications/template-engine.js +249 -0
  1311. package/dist/notifications/template-engine.js.map +1 -0
  1312. package/dist/notifications/tmux-detector.d.ts +59 -0
  1313. package/dist/notifications/tmux-detector.d.ts.map +1 -0
  1314. package/dist/notifications/tmux-detector.js +129 -0
  1315. package/dist/notifications/tmux-detector.js.map +1 -0
  1316. package/dist/notifications/tmux.d.ts +44 -0
  1317. package/dist/notifications/tmux.d.ts.map +1 -0
  1318. package/dist/notifications/tmux.js +293 -0
  1319. package/dist/notifications/tmux.js.map +1 -0
  1320. package/dist/notifications/types.d.ts +224 -0
  1321. package/dist/notifications/types.d.ts.map +1 -0
  1322. package/dist/notifications/types.js +9 -0
  1323. package/dist/notifications/types.js.map +1 -0
  1324. package/dist/openclaw/__tests__/config.test.d.ts +6 -0
  1325. package/dist/openclaw/__tests__/config.test.d.ts.map +1 -0
  1326. package/dist/openclaw/__tests__/config.test.js +344 -0
  1327. package/dist/openclaw/__tests__/config.test.js.map +1 -0
  1328. package/dist/openclaw/__tests__/dispatcher.test.d.ts +5 -0
  1329. package/dist/openclaw/__tests__/dispatcher.test.d.ts.map +1 -0
  1330. package/dist/openclaw/__tests__/dispatcher.test.js +169 -0
  1331. package/dist/openclaw/__tests__/dispatcher.test.js.map +1 -0
  1332. package/dist/openclaw/__tests__/index.test.d.ts +6 -0
  1333. package/dist/openclaw/__tests__/index.test.d.ts.map +1 -0
  1334. package/dist/openclaw/__tests__/index.test.js +382 -0
  1335. package/dist/openclaw/__tests__/index.test.js.map +1 -0
  1336. package/dist/openclaw/config.d.ts +59 -0
  1337. package/dist/openclaw/config.d.ts.map +1 -0
  1338. package/dist/openclaw/config.js +400 -0
  1339. package/dist/openclaw/config.js.map +1 -0
  1340. package/dist/openclaw/dispatcher.d.ts +72 -0
  1341. package/dist/openclaw/dispatcher.d.ts.map +1 -0
  1342. package/dist/openclaw/dispatcher.js +259 -0
  1343. package/dist/openclaw/dispatcher.js.map +1 -0
  1344. package/dist/openclaw/index.d.ts +29 -0
  1345. package/dist/openclaw/index.d.ts.map +1 -0
  1346. package/dist/openclaw/index.js +149 -0
  1347. package/dist/openclaw/index.js.map +1 -0
  1348. package/dist/openclaw/types.d.ts +123 -0
  1349. package/dist/openclaw/types.d.ts.map +1 -0
  1350. package/dist/openclaw/types.js +12 -0
  1351. package/dist/openclaw/types.js.map +1 -0
  1352. package/dist/pipeline/__tests__/orchestrator.test.d.ts +2 -0
  1353. package/dist/pipeline/__tests__/orchestrator.test.d.ts.map +1 -0
  1354. package/dist/pipeline/__tests__/orchestrator.test.js +505 -0
  1355. package/dist/pipeline/__tests__/orchestrator.test.js.map +1 -0
  1356. package/dist/pipeline/__tests__/stages.test.d.ts +2 -0
  1357. package/dist/pipeline/__tests__/stages.test.d.ts.map +1 -0
  1358. package/dist/pipeline/__tests__/stages.test.js +754 -0
  1359. package/dist/pipeline/__tests__/stages.test.js.map +1 -0
  1360. package/dist/pipeline/index.d.ts +19 -0
  1361. package/dist/pipeline/index.d.ts.map +1 -0
  1362. package/dist/pipeline/index.js +14 -0
  1363. package/dist/pipeline/index.js.map +1 -0
  1364. package/dist/pipeline/orchestrator.d.ts +51 -0
  1365. package/dist/pipeline/orchestrator.d.ts.map +1 -0
  1366. package/dist/pipeline/orchestrator.js +324 -0
  1367. package/dist/pipeline/orchestrator.js.map +1 -0
  1368. package/dist/pipeline/review-verdict.d.ts +3 -0
  1369. package/dist/pipeline/review-verdict.d.ts.map +1 -0
  1370. package/dist/pipeline/review-verdict.js +14 -0
  1371. package/dist/pipeline/review-verdict.js.map +1 -0
  1372. package/dist/pipeline/stages/code-review.d.ts +33 -0
  1373. package/dist/pipeline/stages/code-review.d.ts.map +1 -0
  1374. package/dist/pipeline/stages/code-review.js +51 -0
  1375. package/dist/pipeline/stages/code-review.js.map +1 -0
  1376. package/dist/pipeline/stages/ralph-verify.d.ts +53 -0
  1377. package/dist/pipeline/stages/ralph-verify.d.ts.map +1 -0
  1378. package/dist/pipeline/stages/ralph-verify.js +89 -0
  1379. package/dist/pipeline/stages/ralph-verify.js.map +1 -0
  1380. package/dist/pipeline/stages/ralplan.d.ts +25 -0
  1381. package/dist/pipeline/stages/ralplan.d.ts.map +1 -0
  1382. package/dist/pipeline/stages/ralplan.js +107 -0
  1383. package/dist/pipeline/stages/ralplan.js.map +1 -0
  1384. package/dist/pipeline/stages/team-exec.d.ts +50 -0
  1385. package/dist/pipeline/stages/team-exec.d.ts.map +1 -0
  1386. package/dist/pipeline/stages/team-exec.js +263 -0
  1387. package/dist/pipeline/stages/team-exec.js.map +1 -0
  1388. package/dist/pipeline/types.d.ts +122 -0
  1389. package/dist/pipeline/types.d.ts.map +1 -0
  1390. package/dist/pipeline/types.js +8 -0
  1391. package/dist/pipeline/types.js.map +1 -0
  1392. package/dist/planning/__tests__/artifacts.test.d.ts +2 -0
  1393. package/dist/planning/__tests__/artifacts.test.d.ts.map +1 -0
  1394. package/dist/planning/__tests__/artifacts.test.js +544 -0
  1395. package/dist/planning/__tests__/artifacts.test.js.map +1 -0
  1396. package/dist/planning/artifact-names.d.ts +13 -0
  1397. package/dist/planning/artifact-names.d.ts.map +1 -0
  1398. package/dist/planning/artifact-names.js +108 -0
  1399. package/dist/planning/artifact-names.js.map +1 -0
  1400. package/dist/planning/artifacts.d.ts +61 -0
  1401. package/dist/planning/artifacts.d.ts.map +1 -0
  1402. package/dist/planning/artifacts.js +308 -0
  1403. package/dist/planning/artifacts.js.map +1 -0
  1404. package/dist/question/__tests__/client.test.d.ts +2 -0
  1405. package/dist/question/__tests__/client.test.d.ts.map +1 -0
  1406. package/dist/question/__tests__/client.test.js +90 -0
  1407. package/dist/question/__tests__/client.test.js.map +1 -0
  1408. package/dist/question/__tests__/deep-interview.test.d.ts +2 -0
  1409. package/dist/question/__tests__/deep-interview.test.d.ts.map +1 -0
  1410. package/dist/question/__tests__/deep-interview.test.js +209 -0
  1411. package/dist/question/__tests__/deep-interview.test.js.map +1 -0
  1412. package/dist/question/__tests__/policy.test.d.ts +2 -0
  1413. package/dist/question/__tests__/policy.test.d.ts.map +1 -0
  1414. package/dist/question/__tests__/policy.test.js +107 -0
  1415. package/dist/question/__tests__/policy.test.js.map +1 -0
  1416. package/dist/question/__tests__/renderer.test.d.ts +2 -0
  1417. package/dist/question/__tests__/renderer.test.d.ts.map +1 -0
  1418. package/dist/question/__tests__/renderer.test.js +707 -0
  1419. package/dist/question/__tests__/renderer.test.js.map +1 -0
  1420. package/dist/question/__tests__/state.test.d.ts +2 -0
  1421. package/dist/question/__tests__/state.test.d.ts.map +1 -0
  1422. package/dist/question/__tests__/state.test.js +102 -0
  1423. package/dist/question/__tests__/state.test.js.map +1 -0
  1424. package/dist/question/__tests__/types.test.d.ts +2 -0
  1425. package/dist/question/__tests__/types.test.d.ts.map +1 -0
  1426. package/dist/question/__tests__/types.test.js +65 -0
  1427. package/dist/question/__tests__/types.test.js.map +1 -0
  1428. package/dist/question/__tests__/ui.test.d.ts +2 -0
  1429. package/dist/question/__tests__/ui.test.d.ts.map +1 -0
  1430. package/dist/question/__tests__/ui.test.js +446 -0
  1431. package/dist/question/__tests__/ui.test.js.map +1 -0
  1432. package/dist/question/client.d.ts +64 -0
  1433. package/dist/question/client.d.ts.map +1 -0
  1434. package/dist/question/client.js +77 -0
  1435. package/dist/question/client.js.map +1 -0
  1436. package/dist/question/deep-interview.d.ts +31 -0
  1437. package/dist/question/deep-interview.d.ts.map +1 -0
  1438. package/dist/question/deep-interview.js +196 -0
  1439. package/dist/question/deep-interview.js.map +1 -0
  1440. package/dist/question/policy.d.ts +18 -0
  1441. package/dist/question/policy.d.ts.map +1 -0
  1442. package/dist/question/policy.js +77 -0
  1443. package/dist/question/policy.js.map +1 -0
  1444. package/dist/question/renderer.d.ts +46 -0
  1445. package/dist/question/renderer.d.ts.map +1 -0
  1446. package/dist/question/renderer.js +498 -0
  1447. package/dist/question/renderer.js.map +1 -0
  1448. package/dist/question/state.d.ts +21 -0
  1449. package/dist/question/state.d.ts.map +1 -0
  1450. package/dist/question/state.js +121 -0
  1451. package/dist/question/state.js.map +1 -0
  1452. package/dist/question/types.d.ts +91 -0
  1453. package/dist/question/types.d.ts.map +1 -0
  1454. package/dist/question/types.js +117 -0
  1455. package/dist/question/types.js.map +1 -0
  1456. package/dist/question/ui.d.ts +53 -0
  1457. package/dist/question/ui.d.ts.map +1 -0
  1458. package/dist/question/ui.js +435 -0
  1459. package/dist/question/ui.js.map +1 -0
  1460. package/dist/ralph/__tests__/persistence.test.d.ts +2 -0
  1461. package/dist/ralph/__tests__/persistence.test.d.ts.map +1 -0
  1462. package/dist/ralph/__tests__/persistence.test.js +116 -0
  1463. package/dist/ralph/__tests__/persistence.test.js.map +1 -0
  1464. package/dist/ralph/contract.d.ts +17 -0
  1465. package/dist/ralph/contract.d.ts.map +1 -0
  1466. package/dist/ralph/contract.js +108 -0
  1467. package/dist/ralph/contract.js.map +1 -0
  1468. package/dist/ralph/persistence.d.ts +29 -0
  1469. package/dist/ralph/persistence.d.ts.map +1 -0
  1470. package/dist/ralph/persistence.js +267 -0
  1471. package/dist/ralph/persistence.js.map +1 -0
  1472. package/dist/ralplan/__tests__/runtime.test.d.ts +2 -0
  1473. package/dist/ralplan/__tests__/runtime.test.d.ts.map +1 -0
  1474. package/dist/ralplan/__tests__/runtime.test.js +165 -0
  1475. package/dist/ralplan/__tests__/runtime.test.js.map +1 -0
  1476. package/dist/ralplan/runtime.d.ts +52 -0
  1477. package/dist/ralplan/runtime.d.ts.map +1 -0
  1478. package/dist/ralplan/runtime.js +202 -0
  1479. package/dist/ralplan/runtime.js.map +1 -0
  1480. package/dist/runtime/__tests__/bridge.test.d.ts +2 -0
  1481. package/dist/runtime/__tests__/bridge.test.d.ts.map +1 -0
  1482. package/dist/runtime/__tests__/bridge.test.js +194 -0
  1483. package/dist/runtime/__tests__/bridge.test.js.map +1 -0
  1484. package/dist/runtime/__tests__/run-loop.test.d.ts +2 -0
  1485. package/dist/runtime/__tests__/run-loop.test.d.ts.map +1 -0
  1486. package/dist/runtime/__tests__/run-loop.test.js +35 -0
  1487. package/dist/runtime/__tests__/run-loop.test.js.map +1 -0
  1488. package/dist/runtime/__tests__/run-outcome.test.d.ts +2 -0
  1489. package/dist/runtime/__tests__/run-outcome.test.d.ts.map +1 -0
  1490. package/dist/runtime/__tests__/run-outcome.test.js +102 -0
  1491. package/dist/runtime/__tests__/run-outcome.test.js.map +1 -0
  1492. package/dist/runtime/__tests__/run-state.test.d.ts +2 -0
  1493. package/dist/runtime/__tests__/run-state.test.d.ts.map +1 -0
  1494. package/dist/runtime/__tests__/run-state.test.js +37 -0
  1495. package/dist/runtime/__tests__/run-state.test.js.map +1 -0
  1496. package/dist/runtime/bridge.d.ts +214 -0
  1497. package/dist/runtime/bridge.d.ts.map +1 -0
  1498. package/dist/runtime/bridge.js +223 -0
  1499. package/dist/runtime/bridge.js.map +1 -0
  1500. package/dist/runtime/run-loop.d.ts +45 -0
  1501. package/dist/runtime/run-loop.d.ts.map +1 -0
  1502. package/dist/runtime/run-loop.js +51 -0
  1503. package/dist/runtime/run-loop.js.map +1 -0
  1504. package/dist/runtime/run-outcome.d.ts +46 -0
  1505. package/dist/runtime/run-outcome.d.ts.map +1 -0
  1506. package/dist/runtime/run-outcome.js +285 -0
  1507. package/dist/runtime/run-outcome.js.map +1 -0
  1508. package/dist/runtime/run-state.d.ts +40 -0
  1509. package/dist/runtime/run-state.d.ts.map +1 -0
  1510. package/dist/runtime/run-state.js +120 -0
  1511. package/dist/runtime/run-state.js.map +1 -0
  1512. package/dist/runtime/terminal-lifecycle.d.ts +11 -0
  1513. package/dist/runtime/terminal-lifecycle.d.ts.map +1 -0
  1514. package/dist/runtime/terminal-lifecycle.js +52 -0
  1515. package/dist/runtime/terminal-lifecycle.js.map +1 -0
  1516. package/dist/scripts/__tests__/codex-native-hook.test.d.ts +2 -0
  1517. package/dist/scripts/__tests__/codex-native-hook.test.d.ts.map +1 -0
  1518. package/dist/scripts/__tests__/codex-native-hook.test.js +6788 -0
  1519. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -0
  1520. package/dist/scripts/__tests__/generate-release-body.test.d.ts +2 -0
  1521. package/dist/scripts/__tests__/generate-release-body.test.d.ts.map +1 -0
  1522. package/dist/scripts/__tests__/generate-release-body.test.js +233 -0
  1523. package/dist/scripts/__tests__/generate-release-body.test.js.map +1 -0
  1524. package/dist/scripts/__tests__/hook-derived-watcher.test.d.ts +2 -0
  1525. package/dist/scripts/__tests__/hook-derived-watcher.test.d.ts.map +1 -0
  1526. package/dist/scripts/__tests__/hook-derived-watcher.test.js +195 -0
  1527. package/dist/scripts/__tests__/hook-derived-watcher.test.js.map +1 -0
  1528. package/dist/scripts/__tests__/postinstall.test.d.ts +2 -0
  1529. package/dist/scripts/__tests__/postinstall.test.d.ts.map +1 -0
  1530. package/dist/scripts/__tests__/postinstall.test.js +92 -0
  1531. package/dist/scripts/__tests__/postinstall.test.js.map +1 -0
  1532. package/dist/scripts/__tests__/prompt-inventory.test.d.ts +2 -0
  1533. package/dist/scripts/__tests__/prompt-inventory.test.d.ts.map +1 -0
  1534. package/dist/scripts/__tests__/prompt-inventory.test.js +56 -0
  1535. package/dist/scripts/__tests__/prompt-inventory.test.js.map +1 -0
  1536. package/dist/scripts/__tests__/run-test-files.test.d.ts +2 -0
  1537. package/dist/scripts/__tests__/run-test-files.test.d.ts.map +1 -0
  1538. package/dist/scripts/__tests__/run-test-files.test.js +62 -0
  1539. package/dist/scripts/__tests__/run-test-files.test.js.map +1 -0
  1540. package/dist/scripts/__tests__/smoke-packed-install.test.d.ts +2 -0
  1541. package/dist/scripts/__tests__/smoke-packed-install.test.d.ts.map +1 -0
  1542. package/dist/scripts/__tests__/smoke-packed-install.test.js +135 -0
  1543. package/dist/scripts/__tests__/smoke-packed-install.test.js.map +1 -0
  1544. package/dist/scripts/__tests__/test-reply-listener-live.test.d.ts +2 -0
  1545. package/dist/scripts/__tests__/test-reply-listener-live.test.d.ts.map +1 -0
  1546. package/dist/scripts/__tests__/test-reply-listener-live.test.js +82 -0
  1547. package/dist/scripts/__tests__/test-reply-listener-live.test.js.map +1 -0
  1548. package/dist/scripts/__tests__/verify-native-agents.test.d.ts +2 -0
  1549. package/dist/scripts/__tests__/verify-native-agents.test.d.ts.map +1 -0
  1550. package/dist/scripts/__tests__/verify-native-agents.test.js +166 -0
  1551. package/dist/scripts/__tests__/verify-native-agents.test.js.map +1 -0
  1552. package/dist/scripts/build-explore-harness.d.ts +3 -0
  1553. package/dist/scripts/build-explore-harness.d.ts.map +1 -0
  1554. package/dist/scripts/build-explore-harness.js +50 -0
  1555. package/dist/scripts/build-explore-harness.js.map +1 -0
  1556. package/dist/scripts/build-sparkshell.d.ts +2 -0
  1557. package/dist/scripts/build-sparkshell.d.ts.map +1 -0
  1558. package/dist/scripts/build-sparkshell.js +46 -0
  1559. package/dist/scripts/build-sparkshell.js.map +1 -0
  1560. package/dist/scripts/check-runtime-syntax.d.ts +3 -0
  1561. package/dist/scripts/check-runtime-syntax.d.ts.map +1 -0
  1562. package/dist/scripts/check-runtime-syntax.js +57 -0
  1563. package/dist/scripts/check-runtime-syntax.js.map +1 -0
  1564. package/dist/scripts/check-version-sync.d.ts +3 -0
  1565. package/dist/scripts/check-version-sync.d.ts.map +1 -0
  1566. package/dist/scripts/check-version-sync.js +49 -0
  1567. package/dist/scripts/check-version-sync.js.map +1 -0
  1568. package/dist/scripts/cleanup-explore-harness.d.ts +3 -0
  1569. package/dist/scripts/cleanup-explore-harness.d.ts.map +1 -0
  1570. package/dist/scripts/cleanup-explore-harness.js +16 -0
  1571. package/dist/scripts/cleanup-explore-harness.js.map +1 -0
  1572. package/dist/scripts/codex-execution-surface.d.ts +16 -0
  1573. package/dist/scripts/codex-execution-surface.d.ts.map +1 -0
  1574. package/dist/scripts/codex-execution-surface.js +42 -0
  1575. package/dist/scripts/codex-execution-surface.js.map +1 -0
  1576. package/dist/scripts/codex-native-hook.d.ts +25 -0
  1577. package/dist/scripts/codex-native-hook.d.ts.map +1 -0
  1578. package/dist/scripts/codex-native-hook.js +1879 -0
  1579. package/dist/scripts/codex-native-hook.js.map +1 -0
  1580. package/dist/scripts/codex-native-pre-post.d.ts +39 -0
  1581. package/dist/scripts/codex-native-pre-post.d.ts.map +1 -0
  1582. package/dist/scripts/codex-native-pre-post.js +824 -0
  1583. package/dist/scripts/codex-native-pre-post.js.map +1 -0
  1584. package/dist/scripts/eval/eval-candidate-handoff.d.ts +2 -0
  1585. package/dist/scripts/eval/eval-candidate-handoff.d.ts.map +1 -0
  1586. package/dist/scripts/eval/eval-candidate-handoff.js +11 -0
  1587. package/dist/scripts/eval/eval-candidate-handoff.js.map +1 -0
  1588. package/dist/scripts/eval/eval-cli-discoverability.d.ts +3 -0
  1589. package/dist/scripts/eval/eval-cli-discoverability.d.ts.map +1 -0
  1590. package/dist/scripts/eval/eval-cli-discoverability.js +37 -0
  1591. package/dist/scripts/eval/eval-cli-discoverability.js.map +1 -0
  1592. package/dist/scripts/eval/eval-fresh-run-tagging.d.ts +2 -0
  1593. package/dist/scripts/eval/eval-fresh-run-tagging.d.ts.map +1 -0
  1594. package/dist/scripts/eval/eval-fresh-run-tagging.js +11 -0
  1595. package/dist/scripts/eval/eval-fresh-run-tagging.js.map +1 -0
  1596. package/dist/scripts/eval/eval-help-consistency.d.ts +2 -0
  1597. package/dist/scripts/eval/eval-help-consistency.d.ts.map +1 -0
  1598. package/dist/scripts/eval/eval-help-consistency.js +12 -0
  1599. package/dist/scripts/eval/eval-help-consistency.js.map +1 -0
  1600. package/dist/scripts/eval/eval-in-action-cat-shellout-demo.d.ts +2 -0
  1601. package/dist/scripts/eval/eval-in-action-cat-shellout-demo.d.ts.map +1 -0
  1602. package/dist/scripts/eval/eval-in-action-cat-shellout-demo.js +31 -0
  1603. package/dist/scripts/eval/eval-in-action-cat-shellout-demo.js.map +1 -0
  1604. package/dist/scripts/eval/eval-parity-smoke.d.ts +2 -0
  1605. package/dist/scripts/eval/eval-parity-smoke.d.ts.map +1 -0
  1606. package/dist/scripts/eval/eval-parity-smoke.js +23 -0
  1607. package/dist/scripts/eval/eval-parity-smoke.js.map +1 -0
  1608. package/dist/scripts/eval/eval-parity-sweep.d.ts +2 -0
  1609. package/dist/scripts/eval/eval-parity-sweep.d.ts.map +1 -0
  1610. package/dist/scripts/eval/eval-parity-sweep.js +29 -0
  1611. package/dist/scripts/eval/eval-parity-sweep.js.map +1 -0
  1612. package/dist/scripts/eval/eval-resume-dirty-guard.d.ts +2 -0
  1613. package/dist/scripts/eval/eval-resume-dirty-guard.d.ts.map +1 -0
  1614. package/dist/scripts/eval/eval-resume-dirty-guard.js +11 -0
  1615. package/dist/scripts/eval/eval-resume-dirty-guard.js.map +1 -0
  1616. package/dist/scripts/eval/eval-security-path-traversal.d.ts +3 -0
  1617. package/dist/scripts/eval/eval-security-path-traversal.d.ts.map +1 -0
  1618. package/dist/scripts/eval/eval-security-path-traversal.js +35 -0
  1619. package/dist/scripts/eval/eval-security-path-traversal.js.map +1 -0
  1620. package/dist/scripts/fixtures/ask-advisor-stub.d.ts +3 -0
  1621. package/dist/scripts/fixtures/ask-advisor-stub.d.ts.map +1 -0
  1622. package/dist/scripts/fixtures/ask-advisor-stub.js +13 -0
  1623. package/dist/scripts/fixtures/ask-advisor-stub.js.map +1 -0
  1624. package/dist/scripts/generate-catalog-docs.d.ts +3 -0
  1625. package/dist/scripts/generate-catalog-docs.d.ts.map +1 -0
  1626. package/dist/scripts/generate-catalog-docs.js +99 -0
  1627. package/dist/scripts/generate-catalog-docs.js.map +1 -0
  1628. package/dist/scripts/generate-native-release-manifest.d.ts +3 -0
  1629. package/dist/scripts/generate-native-release-manifest.d.ts.map +1 -0
  1630. package/dist/scripts/generate-native-release-manifest.js +107 -0
  1631. package/dist/scripts/generate-native-release-manifest.js.map +1 -0
  1632. package/dist/scripts/generate-release-body.d.ts +35 -0
  1633. package/dist/scripts/generate-release-body.d.ts.map +1 -0
  1634. package/dist/scripts/generate-release-body.js +278 -0
  1635. package/dist/scripts/generate-release-body.js.map +1 -0
  1636. package/dist/scripts/hook-derived-watcher.d.ts +3 -0
  1637. package/dist/scripts/hook-derived-watcher.d.ts.map +1 -0
  1638. package/dist/scripts/hook-derived-watcher.js +556 -0
  1639. package/dist/scripts/hook-derived-watcher.js.map +1 -0
  1640. package/dist/scripts/notify-fallback-watcher.d.ts +3 -0
  1641. package/dist/scripts/notify-fallback-watcher.d.ts.map +1 -0
  1642. package/dist/scripts/notify-fallback-watcher.js +1755 -0
  1643. package/dist/scripts/notify-fallback-watcher.js.map +1 -0
  1644. package/dist/scripts/notify-hook/__tests__/operational-events.test.d.ts +2 -0
  1645. package/dist/scripts/notify-hook/__tests__/operational-events.test.d.ts.map +1 -0
  1646. package/dist/scripts/notify-hook/__tests__/operational-events.test.js +24 -0
  1647. package/dist/scripts/notify-hook/__tests__/operational-events.test.js.map +1 -0
  1648. package/dist/scripts/notify-hook/__tests__/team-worker-posttooluse.test.d.ts +2 -0
  1649. package/dist/scripts/notify-hook/__tests__/team-worker-posttooluse.test.d.ts.map +1 -0
  1650. package/dist/scripts/notify-hook/__tests__/team-worker-posttooluse.test.js +153 -0
  1651. package/dist/scripts/notify-hook/__tests__/team-worker-posttooluse.test.js.map +1 -0
  1652. package/dist/scripts/notify-hook/active-team.d.ts +9 -0
  1653. package/dist/scripts/notify-hook/active-team.d.ts.map +1 -0
  1654. package/dist/scripts/notify-hook/active-team.js +45 -0
  1655. package/dist/scripts/notify-hook/active-team.js.map +1 -0
  1656. package/dist/scripts/notify-hook/auto-nudge.d.ts +96 -0
  1657. package/dist/scripts/notify-hook/auto-nudge.d.ts.map +1 -0
  1658. package/dist/scripts/notify-hook/auto-nudge.js +696 -0
  1659. package/dist/scripts/notify-hook/auto-nudge.js.map +1 -0
  1660. package/dist/scripts/notify-hook/log.d.ts +6 -0
  1661. package/dist/scripts/notify-hook/log.d.ts.map +1 -0
  1662. package/dist/scripts/notify-hook/log.js +22 -0
  1663. package/dist/scripts/notify-hook/log.js.map +1 -0
  1664. package/dist/scripts/notify-hook/managed-tmux.d.ts +21 -0
  1665. package/dist/scripts/notify-hook/managed-tmux.d.ts.map +1 -0
  1666. package/dist/scripts/notify-hook/managed-tmux.js +556 -0
  1667. package/dist/scripts/notify-hook/managed-tmux.js.map +1 -0
  1668. package/dist/scripts/notify-hook/operational-events.d.ts +14 -0
  1669. package/dist/scripts/notify-hook/operational-events.d.ts.map +1 -0
  1670. package/dist/scripts/notify-hook/operational-events.js +255 -0
  1671. package/dist/scripts/notify-hook/operational-events.js.map +1 -0
  1672. package/dist/scripts/notify-hook/orchestration-intent.d.ts +18 -0
  1673. package/dist/scripts/notify-hook/orchestration-intent.d.ts.map +1 -0
  1674. package/dist/scripts/notify-hook/orchestration-intent.js +72 -0
  1675. package/dist/scripts/notify-hook/orchestration-intent.js.map +1 -0
  1676. package/dist/scripts/notify-hook/payload-parser.d.ts +13 -0
  1677. package/dist/scripts/notify-hook/payload-parser.d.ts.map +1 -0
  1678. package/dist/scripts/notify-hook/payload-parser.js +134 -0
  1679. package/dist/scripts/notify-hook/payload-parser.js.map +1 -0
  1680. package/dist/scripts/notify-hook/process-runner.d.ts +9 -0
  1681. package/dist/scripts/notify-hook/process-runner.d.ts.map +1 -0
  1682. package/dist/scripts/notify-hook/process-runner.js +102 -0
  1683. package/dist/scripts/notify-hook/process-runner.js.map +1 -0
  1684. package/dist/scripts/notify-hook/ralph-session-resume.d.ts +22 -0
  1685. package/dist/scripts/notify-hook/ralph-session-resume.d.ts.map +1 -0
  1686. package/dist/scripts/notify-hook/ralph-session-resume.js +300 -0
  1687. package/dist/scripts/notify-hook/ralph-session-resume.js.map +1 -0
  1688. package/dist/scripts/notify-hook/state-io.d.ts +21 -0
  1689. package/dist/scripts/notify-hook/state-io.d.ts.map +1 -0
  1690. package/dist/scripts/notify-hook/state-io.js +144 -0
  1691. package/dist/scripts/notify-hook/state-io.js.map +1 -0
  1692. package/dist/scripts/notify-hook/team-dispatch.d.ts +36 -0
  1693. package/dist/scripts/notify-hook/team-dispatch.d.ts.map +1 -0
  1694. package/dist/scripts/notify-hook/team-dispatch.js +1065 -0
  1695. package/dist/scripts/notify-hook/team-dispatch.js.map +1 -0
  1696. package/dist/scripts/notify-hook/team-leader-nudge.d.ts +23 -0
  1697. package/dist/scripts/notify-hook/team-leader-nudge.d.ts.map +1 -0
  1698. package/dist/scripts/notify-hook/team-leader-nudge.js +1055 -0
  1699. package/dist/scripts/notify-hook/team-leader-nudge.js.map +1 -0
  1700. package/dist/scripts/notify-hook/team-tmux-guard.d.ts +14 -0
  1701. package/dist/scripts/notify-hook/team-tmux-guard.d.ts.map +1 -0
  1702. package/dist/scripts/notify-hook/team-tmux-guard.js +161 -0
  1703. package/dist/scripts/notify-hook/team-tmux-guard.js.map +1 -0
  1704. package/dist/scripts/notify-hook/team-worker-posttooluse.d.ts +34 -0
  1705. package/dist/scripts/notify-hook/team-worker-posttooluse.d.ts.map +1 -0
  1706. package/dist/scripts/notify-hook/team-worker-posttooluse.js +434 -0
  1707. package/dist/scripts/notify-hook/team-worker-posttooluse.js.map +1 -0
  1708. package/dist/scripts/notify-hook/team-worker.d.ts +33 -0
  1709. package/dist/scripts/notify-hook/team-worker.d.ts.map +1 -0
  1710. package/dist/scripts/notify-hook/team-worker.js +697 -0
  1711. package/dist/scripts/notify-hook/team-worker.js.map +1 -0
  1712. package/dist/scripts/notify-hook/tmux-injection.d.ts +8 -0
  1713. package/dist/scripts/notify-hook/tmux-injection.d.ts.map +1 -0
  1714. package/dist/scripts/notify-hook/tmux-injection.js +578 -0
  1715. package/dist/scripts/notify-hook/tmux-injection.js.map +1 -0
  1716. package/dist/scripts/notify-hook/utils.d.ts +9 -0
  1717. package/dist/scripts/notify-hook/utils.d.ts.map +1 -0
  1718. package/dist/scripts/notify-hook/utils.js +36 -0
  1719. package/dist/scripts/notify-hook/utils.js.map +1 -0
  1720. package/dist/scripts/notify-hook/visual-verdict.d.ts +29 -0
  1721. package/dist/scripts/notify-hook/visual-verdict.d.ts.map +1 -0
  1722. package/dist/scripts/notify-hook/visual-verdict.js +145 -0
  1723. package/dist/scripts/notify-hook/visual-verdict.js.map +1 -0
  1724. package/dist/scripts/notify-hook.d.ts +20 -0
  1725. package/dist/scripts/notify-hook.d.ts.map +1 -0
  1726. package/dist/scripts/notify-hook.js +716 -0
  1727. package/dist/scripts/notify-hook.js.map +1 -0
  1728. package/dist/scripts/postinstall.d.ts +18 -0
  1729. package/dist/scripts/postinstall.d.ts.map +1 -0
  1730. package/dist/scripts/postinstall.js +66 -0
  1731. package/dist/scripts/postinstall.js.map +1 -0
  1732. package/dist/scripts/prompt-inventory.d.ts +29 -0
  1733. package/dist/scripts/prompt-inventory.d.ts.map +1 -0
  1734. package/dist/scripts/prompt-inventory.js +178 -0
  1735. package/dist/scripts/prompt-inventory.js.map +1 -0
  1736. package/dist/scripts/run-provider-advisor.d.ts +3 -0
  1737. package/dist/scripts/run-provider-advisor.d.ts.map +1 -0
  1738. package/dist/scripts/run-provider-advisor.js +171 -0
  1739. package/dist/scripts/run-provider-advisor.js.map +1 -0
  1740. package/dist/scripts/run-test-files.d.ts +2 -0
  1741. package/dist/scripts/run-test-files.d.ts.map +1 -0
  1742. package/dist/scripts/run-test-files.js +71 -0
  1743. package/dist/scripts/run-test-files.js.map +1 -0
  1744. package/dist/scripts/smoke-packed-install.d.ts +18 -0
  1745. package/dist/scripts/smoke-packed-install.d.ts.map +1 -0
  1746. package/dist/scripts/smoke-packed-install.js +144 -0
  1747. package/dist/scripts/smoke-packed-install.js.map +1 -0
  1748. package/dist/scripts/sync-plugin-mirror.d.ts +14 -0
  1749. package/dist/scripts/sync-plugin-mirror.d.ts.map +1 -0
  1750. package/dist/scripts/sync-plugin-mirror.js +282 -0
  1751. package/dist/scripts/sync-plugin-mirror.js.map +1 -0
  1752. package/dist/scripts/sync-prompt-guidance-fragments.d.ts +3 -0
  1753. package/dist/scripts/sync-prompt-guidance-fragments.d.ts.map +1 -0
  1754. package/dist/scripts/sync-prompt-guidance-fragments.js +50 -0
  1755. package/dist/scripts/sync-prompt-guidance-fragments.js.map +1 -0
  1756. package/dist/scripts/team-hardening-benchmark.d.ts +3 -0
  1757. package/dist/scripts/team-hardening-benchmark.d.ts.map +1 -0
  1758. package/dist/scripts/team-hardening-benchmark.js +91 -0
  1759. package/dist/scripts/team-hardening-benchmark.js.map +1 -0
  1760. package/dist/scripts/test-reply-listener-live.d.ts +24 -0
  1761. package/dist/scripts/test-reply-listener-live.d.ts.map +1 -0
  1762. package/dist/scripts/test-reply-listener-live.js +138 -0
  1763. package/dist/scripts/test-reply-listener-live.js.map +1 -0
  1764. package/dist/scripts/test-sparkshell.d.ts +2 -0
  1765. package/dist/scripts/test-sparkshell.d.ts.map +1 -0
  1766. package/dist/scripts/test-sparkshell.js +25 -0
  1767. package/dist/scripts/test-sparkshell.js.map +1 -0
  1768. package/dist/scripts/tmux-hook-engine.d.ts +45 -0
  1769. package/dist/scripts/tmux-hook-engine.d.ts.map +1 -0
  1770. package/dist/scripts/tmux-hook-engine.js +313 -0
  1771. package/dist/scripts/tmux-hook-engine.js.map +1 -0
  1772. package/dist/scripts/verify-native-agents.d.ts +16 -0
  1773. package/dist/scripts/verify-native-agents.d.ts.map +1 -0
  1774. package/dist/scripts/verify-native-agents.js +188 -0
  1775. package/dist/scripts/verify-native-agents.js.map +1 -0
  1776. package/dist/scripts/verify-native-release-assets.d.ts +3 -0
  1777. package/dist/scripts/verify-native-release-assets.d.ts.map +1 -0
  1778. package/dist/scripts/verify-native-release-assets.js +62 -0
  1779. package/dist/scripts/verify-native-release-assets.js.map +1 -0
  1780. package/dist/session-history/__tests__/search.test.d.ts +2 -0
  1781. package/dist/session-history/__tests__/search.test.d.ts.map +1 -0
  1782. package/dist/session-history/__tests__/search.test.js +150 -0
  1783. package/dist/session-history/__tests__/search.test.js.map +1 -0
  1784. package/dist/session-history/search.d.ts +31 -0
  1785. package/dist/session-history/search.d.ts.map +1 -0
  1786. package/dist/session-history/search.js +331 -0
  1787. package/dist/session-history/search.js.map +1 -0
  1788. package/dist/sidecar/__tests__/boundary.test.d.ts +2 -0
  1789. package/dist/sidecar/__tests__/boundary.test.d.ts.map +1 -0
  1790. package/dist/sidecar/__tests__/boundary.test.js +48 -0
  1791. package/dist/sidecar/__tests__/boundary.test.js.map +1 -0
  1792. package/dist/sidecar/__tests__/collector.test.d.ts +2 -0
  1793. package/dist/sidecar/__tests__/collector.test.d.ts.map +1 -0
  1794. package/dist/sidecar/__tests__/collector.test.js +162 -0
  1795. package/dist/sidecar/__tests__/collector.test.js.map +1 -0
  1796. package/dist/sidecar/__tests__/render.test.d.ts +2 -0
  1797. package/dist/sidecar/__tests__/render.test.d.ts.map +1 -0
  1798. package/dist/sidecar/__tests__/render.test.js +67 -0
  1799. package/dist/sidecar/__tests__/render.test.js.map +1 -0
  1800. package/dist/sidecar/__tests__/tmux.test.d.ts +2 -0
  1801. package/dist/sidecar/__tests__/tmux.test.d.ts.map +1 -0
  1802. package/dist/sidecar/__tests__/tmux.test.js +30 -0
  1803. package/dist/sidecar/__tests__/tmux.test.js.map +1 -0
  1804. package/dist/sidecar/__tests__/watch.test.d.ts +2 -0
  1805. package/dist/sidecar/__tests__/watch.test.d.ts.map +1 -0
  1806. package/dist/sidecar/__tests__/watch.test.js +42 -0
  1807. package/dist/sidecar/__tests__/watch.test.js.map +1 -0
  1808. package/dist/sidecar/collector.d.ts +4 -0
  1809. package/dist/sidecar/collector.d.ts.map +1 -0
  1810. package/dist/sidecar/collector.js +377 -0
  1811. package/dist/sidecar/collector.js.map +1 -0
  1812. package/dist/sidecar/index.d.ts +25 -0
  1813. package/dist/sidecar/index.d.ts.map +1 -0
  1814. package/dist/sidecar/index.js +165 -0
  1815. package/dist/sidecar/index.js.map +1 -0
  1816. package/dist/sidecar/render.d.ts +3 -0
  1817. package/dist/sidecar/render.d.ts.map +1 -0
  1818. package/dist/sidecar/render.js +72 -0
  1819. package/dist/sidecar/render.js.map +1 -0
  1820. package/dist/sidecar/tmux.d.ts +13 -0
  1821. package/dist/sidecar/tmux.d.ts.map +1 -0
  1822. package/dist/sidecar/tmux.js +44 -0
  1823. package/dist/sidecar/tmux.js.map +1 -0
  1824. package/dist/sidecar/types.d.ts +125 -0
  1825. package/dist/sidecar/types.d.ts.map +1 -0
  1826. package/dist/sidecar/types.js +2 -0
  1827. package/dist/sidecar/types.js.map +1 -0
  1828. package/dist/state/__tests__/mode-state-context.test.d.ts +2 -0
  1829. package/dist/state/__tests__/mode-state-context.test.d.ts.map +1 -0
  1830. package/dist/state/__tests__/mode-state-context.test.js +35 -0
  1831. package/dist/state/__tests__/mode-state-context.test.js.map +1 -0
  1832. package/dist/state/__tests__/operations-ralph-phase.test.d.ts +2 -0
  1833. package/dist/state/__tests__/operations-ralph-phase.test.d.ts.map +1 -0
  1834. package/dist/state/__tests__/operations-ralph-phase.test.js +103 -0
  1835. package/dist/state/__tests__/operations-ralph-phase.test.js.map +1 -0
  1836. package/dist/state/__tests__/operations.test.d.ts +2 -0
  1837. package/dist/state/__tests__/operations.test.d.ts.map +1 -0
  1838. package/dist/state/__tests__/operations.test.js +439 -0
  1839. package/dist/state/__tests__/operations.test.js.map +1 -0
  1840. package/dist/state/__tests__/path-traversal.test.d.ts +2 -0
  1841. package/dist/state/__tests__/path-traversal.test.d.ts.map +1 -0
  1842. package/dist/state/__tests__/path-traversal.test.js +49 -0
  1843. package/dist/state/__tests__/path-traversal.test.js.map +1 -0
  1844. package/dist/state/__tests__/skill-active.test.d.ts +2 -0
  1845. package/dist/state/__tests__/skill-active.test.d.ts.map +1 -0
  1846. package/dist/state/__tests__/skill-active.test.js +160 -0
  1847. package/dist/state/__tests__/skill-active.test.js.map +1 -0
  1848. package/dist/state/__tests__/workflow-transition.test.d.ts +2 -0
  1849. package/dist/state/__tests__/workflow-transition.test.d.ts.map +1 -0
  1850. package/dist/state/__tests__/workflow-transition.test.js +77 -0
  1851. package/dist/state/__tests__/workflow-transition.test.js.map +1 -0
  1852. package/dist/state/mode-state-context.d.ts +12 -0
  1853. package/dist/state/mode-state-context.d.ts.map +1 -0
  1854. package/dist/state/mode-state-context.js +28 -0
  1855. package/dist/state/mode-state-context.js.map +1 -0
  1856. package/dist/state/operations.d.ts +11 -0
  1857. package/dist/state/operations.d.ts.map +1 -0
  1858. package/dist/state/operations.js +363 -0
  1859. package/dist/state/operations.js.map +1 -0
  1860. package/dist/state/paths.d.ts +3 -0
  1861. package/dist/state/paths.d.ts.map +1 -0
  1862. package/dist/state/paths.js +2 -0
  1863. package/dist/state/paths.js.map +1 -0
  1864. package/dist/state/skill-active.d.ts +55 -0
  1865. package/dist/state/skill-active.d.ts.map +1 -0
  1866. package/dist/state/skill-active.js +269 -0
  1867. package/dist/state/skill-active.js.map +1 -0
  1868. package/dist/state/workflow-transition-reconcile.d.ts +15 -0
  1869. package/dist/state/workflow-transition-reconcile.d.ts.map +1 -0
  1870. package/dist/state/workflow-transition-reconcile.js +113 -0
  1871. package/dist/state/workflow-transition-reconcile.js.map +1 -0
  1872. package/dist/state/workflow-transition.d.ts +22 -0
  1873. package/dist/state/workflow-transition.d.ts.map +1 -0
  1874. package/dist/state/workflow-transition.js +191 -0
  1875. package/dist/state/workflow-transition.js.map +1 -0
  1876. package/dist/subagents/__tests__/tracker.test.d.ts +2 -0
  1877. package/dist/subagents/__tests__/tracker.test.d.ts.map +1 -0
  1878. package/dist/subagents/__tests__/tracker.test.js +47 -0
  1879. package/dist/subagents/__tests__/tracker.test.js.map +1 -0
  1880. package/dist/subagents/tracker.d.ts +52 -0
  1881. package/dist/subagents/tracker.d.ts.map +1 -0
  1882. package/dist/subagents/tracker.js +175 -0
  1883. package/dist/subagents/tracker.js.map +1 -0
  1884. package/dist/team/__tests__/allocation-policy.test.d.ts +2 -0
  1885. package/dist/team/__tests__/allocation-policy.test.d.ts.map +1 -0
  1886. package/dist/team/__tests__/allocation-policy.test.js +111 -0
  1887. package/dist/team/__tests__/allocation-policy.test.js.map +1 -0
  1888. package/dist/team/__tests__/api-interop.test.d.ts +2 -0
  1889. package/dist/team/__tests__/api-interop.test.d.ts.map +1 -0
  1890. package/dist/team/__tests__/api-interop.test.js +2262 -0
  1891. package/dist/team/__tests__/api-interop.test.js.map +1 -0
  1892. package/dist/team/__tests__/commit-hygiene.test.d.ts +2 -0
  1893. package/dist/team/__tests__/commit-hygiene.test.d.ts.map +1 -0
  1894. package/dist/team/__tests__/commit-hygiene.test.js +93 -0
  1895. package/dist/team/__tests__/commit-hygiene.test.js.map +1 -0
  1896. package/dist/team/__tests__/cross-rebase-smoke.test.d.ts +2 -0
  1897. package/dist/team/__tests__/cross-rebase-smoke.test.d.ts.map +1 -0
  1898. package/dist/team/__tests__/cross-rebase-smoke.test.js +161 -0
  1899. package/dist/team/__tests__/cross-rebase-smoke.test.js.map +1 -0
  1900. package/dist/team/__tests__/current-task-baseline.test.d.ts +2 -0
  1901. package/dist/team/__tests__/current-task-baseline.test.d.ts.map +1 -0
  1902. package/dist/team/__tests__/current-task-baseline.test.js +87 -0
  1903. package/dist/team/__tests__/current-task-baseline.test.js.map +1 -0
  1904. package/dist/team/__tests__/delegation-policy.test.d.ts +2 -0
  1905. package/dist/team/__tests__/delegation-policy.test.d.ts.map +1 -0
  1906. package/dist/team/__tests__/delegation-policy.test.js +69 -0
  1907. package/dist/team/__tests__/delegation-policy.test.js.map +1 -0
  1908. package/dist/team/__tests__/delivery-e2e-smoke.test.d.ts +2 -0
  1909. package/dist/team/__tests__/delivery-e2e-smoke.test.d.ts.map +1 -0
  1910. package/dist/team/__tests__/delivery-e2e-smoke.test.js +679 -0
  1911. package/dist/team/__tests__/delivery-e2e-smoke.test.js.map +1 -0
  1912. package/dist/team/__tests__/events.test.d.ts +2 -0
  1913. package/dist/team/__tests__/events.test.d.ts.map +1 -0
  1914. package/dist/team/__tests__/events.test.js +313 -0
  1915. package/dist/team/__tests__/events.test.js.map +1 -0
  1916. package/dist/team/__tests__/followup-planner.test.d.ts +2 -0
  1917. package/dist/team/__tests__/followup-planner.test.d.ts.map +1 -0
  1918. package/dist/team/__tests__/followup-planner.test.js +84 -0
  1919. package/dist/team/__tests__/followup-planner.test.js.map +1 -0
  1920. package/dist/team/__tests__/hardening-e2e.test.d.ts +2 -0
  1921. package/dist/team/__tests__/hardening-e2e.test.d.ts.map +1 -0
  1922. package/dist/team/__tests__/hardening-e2e.test.js +98 -0
  1923. package/dist/team/__tests__/hardening-e2e.test.js.map +1 -0
  1924. package/dist/team/__tests__/hook-primary-e2e-contract.test.d.ts +2 -0
  1925. package/dist/team/__tests__/hook-primary-e2e-contract.test.d.ts.map +1 -0
  1926. package/dist/team/__tests__/hook-primary-e2e-contract.test.js +78 -0
  1927. package/dist/team/__tests__/hook-primary-e2e-contract.test.js.map +1 -0
  1928. package/dist/team/__tests__/idle-nudge.test.d.ts +2 -0
  1929. package/dist/team/__tests__/idle-nudge.test.d.ts.map +1 -0
  1930. package/dist/team/__tests__/idle-nudge.test.js +230 -0
  1931. package/dist/team/__tests__/idle-nudge.test.js.map +1 -0
  1932. package/dist/team/__tests__/leader-activity.test.d.ts +2 -0
  1933. package/dist/team/__tests__/leader-activity.test.d.ts.map +1 -0
  1934. package/dist/team/__tests__/leader-activity.test.js +261 -0
  1935. package/dist/team/__tests__/leader-activity.test.js.map +1 -0
  1936. package/dist/team/__tests__/mcp-comm.test.d.ts +2 -0
  1937. package/dist/team/__tests__/mcp-comm.test.d.ts.map +1 -0
  1938. package/dist/team/__tests__/mcp-comm.test.js +289 -0
  1939. package/dist/team/__tests__/mcp-comm.test.js.map +1 -0
  1940. package/dist/team/__tests__/model-contract.test.d.ts +2 -0
  1941. package/dist/team/__tests__/model-contract.test.d.ts.map +1 -0
  1942. package/dist/team/__tests__/model-contract.test.js +171 -0
  1943. package/dist/team/__tests__/model-contract.test.js.map +1 -0
  1944. package/dist/team/__tests__/orchestrator.test.d.ts +2 -0
  1945. package/dist/team/__tests__/orchestrator.test.d.ts.map +1 -0
  1946. package/dist/team/__tests__/orchestrator.test.js +111 -0
  1947. package/dist/team/__tests__/orchestrator.test.js.map +1 -0
  1948. package/dist/team/__tests__/phase-controller.test.d.ts +2 -0
  1949. package/dist/team/__tests__/phase-controller.test.d.ts.map +1 -0
  1950. package/dist/team/__tests__/phase-controller.test.js +50 -0
  1951. package/dist/team/__tests__/phase-controller.test.js.map +1 -0
  1952. package/dist/team/__tests__/rebalance-policy.test.d.ts +2 -0
  1953. package/dist/team/__tests__/rebalance-policy.test.d.ts.map +1 -0
  1954. package/dist/team/__tests__/rebalance-policy.test.js +168 -0
  1955. package/dist/team/__tests__/rebalance-policy.test.js.map +1 -0
  1956. package/dist/team/__tests__/repo-aware-decomposition.test.d.ts +2 -0
  1957. package/dist/team/__tests__/repo-aware-decomposition.test.d.ts.map +1 -0
  1958. package/dist/team/__tests__/repo-aware-decomposition.test.js +136 -0
  1959. package/dist/team/__tests__/repo-aware-decomposition.test.js.map +1 -0
  1960. package/dist/team/__tests__/role-router.test.d.ts +2 -0
  1961. package/dist/team/__tests__/role-router.test.d.ts.map +1 -0
  1962. package/dist/team/__tests__/role-router.test.js +263 -0
  1963. package/dist/team/__tests__/role-router.test.js.map +1 -0
  1964. package/dist/team/__tests__/runtime-cli.test.d.ts +2 -0
  1965. package/dist/team/__tests__/runtime-cli.test.d.ts.map +1 -0
  1966. package/dist/team/__tests__/runtime-cli.test.js +304 -0
  1967. package/dist/team/__tests__/runtime-cli.test.js.map +1 -0
  1968. package/dist/team/__tests__/runtime.test.d.ts +2 -0
  1969. package/dist/team/__tests__/runtime.test.d.ts.map +1 -0
  1970. package/dist/team/__tests__/runtime.test.js +5734 -0
  1971. package/dist/team/__tests__/runtime.test.js.map +1 -0
  1972. package/dist/team/__tests__/scaling.test.d.ts +2 -0
  1973. package/dist/team/__tests__/scaling.test.d.ts.map +1 -0
  1974. package/dist/team/__tests__/scaling.test.js +1005 -0
  1975. package/dist/team/__tests__/scaling.test.js.map +1 -0
  1976. package/dist/team/__tests__/shutdown-fallback.test.d.ts +2 -0
  1977. package/dist/team/__tests__/shutdown-fallback.test.d.ts.map +1 -0
  1978. package/dist/team/__tests__/shutdown-fallback.test.js +125 -0
  1979. package/dist/team/__tests__/shutdown-fallback.test.js.map +1 -0
  1980. package/dist/team/__tests__/state-root.test.d.ts +2 -0
  1981. package/dist/team/__tests__/state-root.test.d.ts.map +1 -0
  1982. package/dist/team/__tests__/state-root.test.js +195 -0
  1983. package/dist/team/__tests__/state-root.test.js.map +1 -0
  1984. package/dist/team/__tests__/state.test.d.ts +2 -0
  1985. package/dist/team/__tests__/state.test.d.ts.map +1 -0
  1986. package/dist/team/__tests__/state.test.js +1859 -0
  1987. package/dist/team/__tests__/state.test.js.map +1 -0
  1988. package/dist/team/__tests__/team-identity.test.d.ts +2 -0
  1989. package/dist/team/__tests__/team-identity.test.d.ts.map +1 -0
  1990. package/dist/team/__tests__/team-identity.test.js +166 -0
  1991. package/dist/team/__tests__/team-identity.test.js.map +1 -0
  1992. package/dist/team/__tests__/team-ops-contract.test.d.ts +2 -0
  1993. package/dist/team/__tests__/team-ops-contract.test.d.ts.map +1 -0
  1994. package/dist/team/__tests__/team-ops-contract.test.js +96 -0
  1995. package/dist/team/__tests__/team-ops-contract.test.js.map +1 -0
  1996. package/dist/team/__tests__/tmux-claude-workers-demo.test.d.ts +2 -0
  1997. package/dist/team/__tests__/tmux-claude-workers-demo.test.d.ts.map +1 -0
  1998. package/dist/team/__tests__/tmux-claude-workers-demo.test.js +191 -0
  1999. package/dist/team/__tests__/tmux-claude-workers-demo.test.js.map +1 -0
  2000. package/dist/team/__tests__/tmux-session.test.d.ts +2 -0
  2001. package/dist/team/__tests__/tmux-session.test.d.ts.map +1 -0
  2002. package/dist/team/__tests__/tmux-session.test.js +3785 -0
  2003. package/dist/team/__tests__/tmux-session.test.js.map +1 -0
  2004. package/dist/team/__tests__/tmux-test-fixture.d.ts +20 -0
  2005. package/dist/team/__tests__/tmux-test-fixture.d.ts.map +1 -0
  2006. package/dist/team/__tests__/tmux-test-fixture.js +152 -0
  2007. package/dist/team/__tests__/tmux-test-fixture.js.map +1 -0
  2008. package/dist/team/__tests__/tmux-test-fixture.test.d.ts +2 -0
  2009. package/dist/team/__tests__/tmux-test-fixture.test.d.ts.map +1 -0
  2010. package/dist/team/__tests__/tmux-test-fixture.test.js +113 -0
  2011. package/dist/team/__tests__/tmux-test-fixture.test.js.map +1 -0
  2012. package/dist/team/__tests__/worker-bootstrap.test.d.ts +2 -0
  2013. package/dist/team/__tests__/worker-bootstrap.test.d.ts.map +1 -0
  2014. package/dist/team/__tests__/worker-bootstrap.test.js +685 -0
  2015. package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -0
  2016. package/dist/team/__tests__/worker-runtime-identity.test.d.ts +2 -0
  2017. package/dist/team/__tests__/worker-runtime-identity.test.d.ts.map +1 -0
  2018. package/dist/team/__tests__/worker-runtime-identity.test.js +250 -0
  2019. package/dist/team/__tests__/worker-runtime-identity.test.js.map +1 -0
  2020. package/dist/team/__tests__/worktree.test.d.ts +2 -0
  2021. package/dist/team/__tests__/worktree.test.d.ts.map +1 -0
  2022. package/dist/team/__tests__/worktree.test.js +317 -0
  2023. package/dist/team/__tests__/worktree.test.js.map +1 -0
  2024. package/dist/team/allocation-policy.d.ts +29 -0
  2025. package/dist/team/allocation-policy.d.ts.map +1 -0
  2026. package/dist/team/allocation-policy.js +153 -0
  2027. package/dist/team/allocation-policy.js.map +1 -0
  2028. package/dist/team/api-interop.d.ts +20 -0
  2029. package/dist/team/api-interop.d.ts.map +1 -0
  2030. package/dist/team/api-interop.js +1083 -0
  2031. package/dist/team/api-interop.js.map +1 -0
  2032. package/dist/team/commit-hygiene.d.ts +79 -0
  2033. package/dist/team/commit-hygiene.d.ts.map +1 -0
  2034. package/dist/team/commit-hygiene.js +364 -0
  2035. package/dist/team/commit-hygiene.js.map +1 -0
  2036. package/dist/team/contracts.d.ts +26 -0
  2037. package/dist/team/contracts.d.ts.map +1 -0
  2038. package/dist/team/contracts.js +103 -0
  2039. package/dist/team/contracts.js.map +1 -0
  2040. package/dist/team/current-task-baseline.d.ts +32 -0
  2041. package/dist/team/current-task-baseline.d.ts.map +1 -0
  2042. package/dist/team/current-task-baseline.js +85 -0
  2043. package/dist/team/current-task-baseline.js.map +1 -0
  2044. package/dist/team/dag-schema.d.ts +38 -0
  2045. package/dist/team/dag-schema.d.ts.map +1 -0
  2046. package/dist/team/dag-schema.js +221 -0
  2047. package/dist/team/dag-schema.js.map +1 -0
  2048. package/dist/team/delegation-policy.d.ts +3 -0
  2049. package/dist/team/delegation-policy.d.ts.map +1 -0
  2050. package/dist/team/delegation-policy.js +82 -0
  2051. package/dist/team/delegation-policy.js.map +1 -0
  2052. package/dist/team/delivery-log.d.ts +14 -0
  2053. package/dist/team/delivery-log.d.ts.map +1 -0
  2054. package/dist/team/delivery-log.js +35 -0
  2055. package/dist/team/delivery-log.js.map +1 -0
  2056. package/dist/team/followup-planner.d.ts +44 -0
  2057. package/dist/team/followup-planner.d.ts.map +1 -0
  2058. package/dist/team/followup-planner.js +200 -0
  2059. package/dist/team/followup-planner.js.map +1 -0
  2060. package/dist/team/idle-nudge.d.ts +53 -0
  2061. package/dist/team/idle-nudge.d.ts.map +1 -0
  2062. package/dist/team/idle-nudge.js +141 -0
  2063. package/dist/team/idle-nudge.js.map +1 -0
  2064. package/dist/team/leader-activity.d.ts +15 -0
  2065. package/dist/team/leader-activity.d.ts.map +1 -0
  2066. package/dist/team/leader-activity.js +224 -0
  2067. package/dist/team/leader-activity.js.map +1 -0
  2068. package/dist/team/mcp-comm.d.ts +73 -0
  2069. package/dist/team/mcp-comm.d.ts.map +1 -0
  2070. package/dist/team/mcp-comm.js +314 -0
  2071. package/dist/team/mcp-comm.js.map +1 -0
  2072. package/dist/team/model-contract.d.ts +26 -0
  2073. package/dist/team/model-contract.d.ts.map +1 -0
  2074. package/dist/team/model-contract.js +204 -0
  2075. package/dist/team/model-contract.js.map +1 -0
  2076. package/dist/team/orchestrator.d.ts +47 -0
  2077. package/dist/team/orchestrator.d.ts.map +1 -0
  2078. package/dist/team/orchestrator.js +131 -0
  2079. package/dist/team/orchestrator.js.map +1 -0
  2080. package/dist/team/pane-status.d.ts +149 -0
  2081. package/dist/team/pane-status.d.ts.map +1 -0
  2082. package/dist/team/pane-status.js +558 -0
  2083. package/dist/team/pane-status.js.map +1 -0
  2084. package/dist/team/phase-controller.d.ts +12 -0
  2085. package/dist/team/phase-controller.d.ts.map +1 -0
  2086. package/dist/team/phase-controller.js +142 -0
  2087. package/dist/team/phase-controller.js.map +1 -0
  2088. package/dist/team/progress-evidence.d.ts +2 -0
  2089. package/dist/team/progress-evidence.d.ts.map +1 -0
  2090. package/dist/team/progress-evidence.js +77 -0
  2091. package/dist/team/progress-evidence.js.map +1 -0
  2092. package/dist/team/rebalance-policy.d.ts +19 -0
  2093. package/dist/team/rebalance-policy.d.ts.map +1 -0
  2094. package/dist/team/rebalance-policy.js +48 -0
  2095. package/dist/team/rebalance-policy.js.map +1 -0
  2096. package/dist/team/reminder-intents.d.ts +11 -0
  2097. package/dist/team/reminder-intents.d.ts.map +1 -0
  2098. package/dist/team/reminder-intents.js +40 -0
  2099. package/dist/team/reminder-intents.js.map +1 -0
  2100. package/dist/team/repo-aware-decomposition.d.ts +63 -0
  2101. package/dist/team/repo-aware-decomposition.d.ts.map +1 -0
  2102. package/dist/team/repo-aware-decomposition.js +231 -0
  2103. package/dist/team/repo-aware-decomposition.js.map +1 -0
  2104. package/dist/team/role-router.d.ts +32 -0
  2105. package/dist/team/role-router.d.ts.map +1 -0
  2106. package/dist/team/role-router.js +298 -0
  2107. package/dist/team/role-router.js.map +1 -0
  2108. package/dist/team/runtime-cli.d.ts +74 -0
  2109. package/dist/team/runtime-cli.d.ts.map +1 -0
  2110. package/dist/team/runtime-cli.js +363 -0
  2111. package/dist/team/runtime-cli.js.map +1 -0
  2112. package/dist/team/runtime.d.ts +154 -0
  2113. package/dist/team/runtime.d.ts.map +1 -0
  2114. package/dist/team/runtime.js +3925 -0
  2115. package/dist/team/runtime.js.map +1 -0
  2116. package/dist/team/scaling.d.ts +59 -0
  2117. package/dist/team/scaling.d.ts.map +1 -0
  2118. package/dist/team/scaling.js +598 -0
  2119. package/dist/team/scaling.js.map +1 -0
  2120. package/dist/team/state/approvals.d.ts +25 -0
  2121. package/dist/team/state/approvals.d.ts.map +1 -0
  2122. package/dist/team/state/approvals.js +31 -0
  2123. package/dist/team/state/approvals.js.map +1 -0
  2124. package/dist/team/state/config.d.ts +2 -0
  2125. package/dist/team/state/config.d.ts.map +1 -0
  2126. package/dist/team/state/config.js +2 -0
  2127. package/dist/team/state/config.js.map +1 -0
  2128. package/dist/team/state/dispatch-lock.d.ts +3 -0
  2129. package/dist/team/state/dispatch-lock.d.ts.map +1 -0
  2130. package/dist/team/state/dispatch-lock.js +81 -0
  2131. package/dist/team/state/dispatch-lock.js.map +1 -0
  2132. package/dist/team/state/dispatch.d.ts +69 -0
  2133. package/dist/team/state/dispatch.d.ts.map +1 -0
  2134. package/dist/team/state/dispatch.js +308 -0
  2135. package/dist/team/state/dispatch.js.map +1 -0
  2136. package/dist/team/state/events.d.ts +26 -0
  2137. package/dist/team/state/events.d.ts.map +1 -0
  2138. package/dist/team/state/events.js +145 -0
  2139. package/dist/team/state/events.js.map +1 -0
  2140. package/dist/team/state/index.d.ts +11 -0
  2141. package/dist/team/state/index.d.ts.map +1 -0
  2142. package/dist/team/state/index.js +11 -0
  2143. package/dist/team/state/index.js.map +1 -0
  2144. package/dist/team/state/io.d.ts +2 -0
  2145. package/dist/team/state/io.d.ts.map +1 -0
  2146. package/dist/team/state/io.js +2 -0
  2147. package/dist/team/state/io.js.map +1 -0
  2148. package/dist/team/state/locks.d.ts +16 -0
  2149. package/dist/team/state/locks.d.ts.map +1 -0
  2150. package/dist/team/state/locks.js +201 -0
  2151. package/dist/team/state/locks.js.map +1 -0
  2152. package/dist/team/state/mailbox.d.ts +42 -0
  2153. package/dist/team/state/mailbox.d.ts.map +1 -0
  2154. package/dist/team/state/mailbox.js +213 -0
  2155. package/dist/team/state/mailbox.js.map +1 -0
  2156. package/dist/team/state/monitor.d.ts +108 -0
  2157. package/dist/team/state/monitor.d.ts.map +1 -0
  2158. package/dist/team/state/monitor.js +193 -0
  2159. package/dist/team/state/monitor.js.map +1 -0
  2160. package/dist/team/state/shutdown.d.ts +2 -0
  2161. package/dist/team/state/shutdown.d.ts.map +1 -0
  2162. package/dist/team/state/shutdown.js +2 -0
  2163. package/dist/team/state/shutdown.js.map +1 -0
  2164. package/dist/team/state/summary.d.ts +2 -0
  2165. package/dist/team/state/summary.d.ts.map +1 -0
  2166. package/dist/team/state/summary.js +2 -0
  2167. package/dist/team/state/summary.js.map +1 -0
  2168. package/dist/team/state/tasks.d.ts +53 -0
  2169. package/dist/team/state/tasks.d.ts.map +1 -0
  2170. package/dist/team/state/tasks.js +260 -0
  2171. package/dist/team/state/tasks.js.map +1 -0
  2172. package/dist/team/state/types.d.ts +336 -0
  2173. package/dist/team/state/types.d.ts.map +1 -0
  2174. package/dist/team/state/types.js +3 -0
  2175. package/dist/team/state/types.js.map +1 -0
  2176. package/dist/team/state/workers.d.ts +2 -0
  2177. package/dist/team/state/workers.d.ts.map +1 -0
  2178. package/dist/team/state/workers.js +2 -0
  2179. package/dist/team/state/workers.js.map +1 -0
  2180. package/dist/team/state-root.d.ts +40 -0
  2181. package/dist/team/state-root.d.ts.map +1 -0
  2182. package/dist/team/state-root.js +293 -0
  2183. package/dist/team/state-root.js.map +1 -0
  2184. package/dist/team/state.d.ts +455 -0
  2185. package/dist/team/state.d.ts.map +1 -0
  2186. package/dist/team/state.js +1436 -0
  2187. package/dist/team/state.js.map +1 -0
  2188. package/dist/team/team-identity.d.ts +26 -0
  2189. package/dist/team/team-identity.d.ts.map +1 -0
  2190. package/dist/team/team-identity.js +169 -0
  2191. package/dist/team/team-identity.js.map +1 -0
  2192. package/dist/team/team-ops.d.ts +66 -0
  2193. package/dist/team/team-ops.d.ts.map +1 -0
  2194. package/dist/team/team-ops.js +79 -0
  2195. package/dist/team/team-ops.js.map +1 -0
  2196. package/dist/team/tmux-session.d.ts +186 -0
  2197. package/dist/team/tmux-session.d.ts.map +1 -0
  2198. package/dist/team/tmux-session.js +1770 -0
  2199. package/dist/team/tmux-session.js.map +1 -0
  2200. package/dist/team/worker-bootstrap.d.ts +85 -0
  2201. package/dist/team/worker-bootstrap.d.ts.map +1 -0
  2202. package/dist/team/worker-bootstrap.js +767 -0
  2203. package/dist/team/worker-bootstrap.js.map +1 -0
  2204. package/dist/team/worktree.d.ts +69 -0
  2205. package/dist/team/worktree.d.ts.map +1 -0
  2206. package/dist/team/worktree.js +437 -0
  2207. package/dist/team/worktree.js.map +1 -0
  2208. package/dist/utils/__tests__/agents-md.test.d.ts +2 -0
  2209. package/dist/utils/__tests__/agents-md.test.d.ts.map +1 -0
  2210. package/dist/utils/__tests__/agents-md.test.js +52 -0
  2211. package/dist/utils/__tests__/agents-md.test.js.map +1 -0
  2212. package/dist/utils/__tests__/agents-model-table.test.d.ts +2 -0
  2213. package/dist/utils/__tests__/agents-model-table.test.d.ts.map +1 -0
  2214. package/dist/utils/__tests__/agents-model-table.test.js +104 -0
  2215. package/dist/utils/__tests__/agents-model-table.test.js.map +1 -0
  2216. package/dist/utils/__tests__/dep-versions.test.d.ts +2 -0
  2217. package/dist/utils/__tests__/dep-versions.test.d.ts.map +1 -0
  2218. package/dist/utils/__tests__/dep-versions.test.js +46 -0
  2219. package/dist/utils/__tests__/dep-versions.test.js.map +1 -0
  2220. package/dist/utils/__tests__/package.test.d.ts +2 -0
  2221. package/dist/utils/__tests__/package.test.d.ts.map +1 -0
  2222. package/dist/utils/__tests__/package.test.js +21 -0
  2223. package/dist/utils/__tests__/package.test.js.map +1 -0
  2224. package/dist/utils/__tests__/paths.test.d.ts +2 -0
  2225. package/dist/utils/__tests__/paths.test.d.ts.map +1 -0
  2226. package/dist/utils/__tests__/paths.test.js +541 -0
  2227. package/dist/utils/__tests__/paths.test.js.map +1 -0
  2228. package/dist/utils/__tests__/platform-command.test.d.ts +2 -0
  2229. package/dist/utils/__tests__/platform-command.test.d.ts.map +1 -0
  2230. package/dist/utils/__tests__/platform-command.test.js +410 -0
  2231. package/dist/utils/__tests__/platform-command.test.js.map +1 -0
  2232. package/dist/utils/__tests__/repo-deps.test.d.ts +2 -0
  2233. package/dist/utils/__tests__/repo-deps.test.d.ts.map +1 -0
  2234. package/dist/utils/__tests__/repo-deps.test.js +71 -0
  2235. package/dist/utils/__tests__/repo-deps.test.js.map +1 -0
  2236. package/dist/utils/agents-md.d.ts +8 -0
  2237. package/dist/utils/agents-md.d.ts.map +1 -0
  2238. package/dist/utils/agents-md.js +57 -0
  2239. package/dist/utils/agents-md.js.map +1 -0
  2240. package/dist/utils/agents-model-table.d.ts +16 -0
  2241. package/dist/utils/agents-model-table.d.ts.map +1 -0
  2242. package/dist/utils/agents-model-table.js +88 -0
  2243. package/dist/utils/agents-model-table.js.map +1 -0
  2244. package/dist/utils/git-layout.d.ts +8 -0
  2245. package/dist/utils/git-layout.d.ts.map +1 -0
  2246. package/dist/utils/git-layout.js +58 -0
  2247. package/dist/utils/git-layout.js.map +1 -0
  2248. package/dist/utils/package.d.ts +9 -0
  2249. package/dist/utils/package.d.ts.map +1 -0
  2250. package/dist/utils/package.js +31 -0
  2251. package/dist/utils/package.js.map +1 -0
  2252. package/dist/utils/paths.d.ts +84 -0
  2253. package/dist/utils/paths.d.ts.map +1 -0
  2254. package/dist/utils/paths.js +263 -0
  2255. package/dist/utils/paths.js.map +1 -0
  2256. package/dist/utils/platform-command.d.ts +26 -0
  2257. package/dist/utils/platform-command.d.ts.map +1 -0
  2258. package/dist/utils/platform-command.js +270 -0
  2259. package/dist/utils/platform-command.js.map +1 -0
  2260. package/dist/utils/repo-deps.d.ts +20 -0
  2261. package/dist/utils/repo-deps.d.ts.map +1 -0
  2262. package/dist/utils/repo-deps.js +78 -0
  2263. package/dist/utils/repo-deps.js.map +1 -0
  2264. package/dist/utils/safe-json.d.ts +3 -0
  2265. package/dist/utils/safe-json.d.ts.map +1 -0
  2266. package/dist/utils/safe-json.js +19 -0
  2267. package/dist/utils/safe-json.js.map +1 -0
  2268. package/dist/utils/sleep.d.ts +3 -0
  2269. package/dist/utils/sleep.d.ts.map +1 -0
  2270. package/dist/utils/sleep.js +24 -0
  2271. package/dist/utils/sleep.js.map +1 -0
  2272. package/dist/verification/__tests__/ci-rust-gates.test.d.ts +2 -0
  2273. package/dist/verification/__tests__/ci-rust-gates.test.d.ts.map +1 -0
  2274. package/dist/verification/__tests__/ci-rust-gates.test.js +89 -0
  2275. package/dist/verification/__tests__/ci-rust-gates.test.js.map +1 -0
  2276. package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.d.ts +2 -0
  2277. package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.d.ts.map +1 -0
  2278. package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.js +54 -0
  2279. package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.js.map +1 -0
  2280. package/dist/verification/__tests__/explore-harness-release-workflow.test.d.ts +2 -0
  2281. package/dist/verification/__tests__/explore-harness-release-workflow.test.d.ts.map +1 -0
  2282. package/dist/verification/__tests__/explore-harness-release-workflow.test.js +73 -0
  2283. package/dist/verification/__tests__/explore-harness-release-workflow.test.js.map +1 -0
  2284. package/dist/verification/__tests__/native-release-manifest.test.d.ts +2 -0
  2285. package/dist/verification/__tests__/native-release-manifest.test.d.ts.map +1 -0
  2286. package/dist/verification/__tests__/native-release-manifest.test.js +80 -0
  2287. package/dist/verification/__tests__/native-release-manifest.test.js.map +1 -0
  2288. package/dist/verification/__tests__/pr-check-workflow.test.d.ts +2 -0
  2289. package/dist/verification/__tests__/pr-check-workflow.test.d.ts.map +1 -0
  2290. package/dist/verification/__tests__/pr-check-workflow.test.js +27 -0
  2291. package/dist/verification/__tests__/pr-check-workflow.test.js.map +1 -0
  2292. package/dist/verification/__tests__/ralph-persistence-gate.test.d.ts +2 -0
  2293. package/dist/verification/__tests__/ralph-persistence-gate.test.d.ts.map +1 -0
  2294. package/dist/verification/__tests__/ralph-persistence-gate.test.js +55 -0
  2295. package/dist/verification/__tests__/ralph-persistence-gate.test.js.map +1 -0
  2296. package/dist/verification/__tests__/rust-runtime-thin-adapter-gate.test.d.ts +2 -0
  2297. package/dist/verification/__tests__/rust-runtime-thin-adapter-gate.test.d.ts.map +1 -0
  2298. package/dist/verification/__tests__/rust-runtime-thin-adapter-gate.test.js +32 -0
  2299. package/dist/verification/__tests__/rust-runtime-thin-adapter-gate.test.js.map +1 -0
  2300. package/dist/verification/__tests__/verifier.test.d.ts +2 -0
  2301. package/dist/verification/__tests__/verifier.test.d.ts.map +1 -0
  2302. package/dist/verification/__tests__/verifier.test.js +113 -0
  2303. package/dist/verification/__tests__/verifier.test.js.map +1 -0
  2304. package/dist/verification/verifier.d.ts +37 -0
  2305. package/dist/verification/verifier.d.ts.map +1 -0
  2306. package/dist/verification/verifier.js +100 -0
  2307. package/dist/verification/verifier.js.map +1 -0
  2308. package/dist/visual/__tests__/verdict.test.d.ts +2 -0
  2309. package/dist/visual/__tests__/verdict.test.d.ts.map +1 -0
  2310. package/dist/visual/__tests__/verdict.test.js +81 -0
  2311. package/dist/visual/__tests__/verdict.test.js.map +1 -0
  2312. package/dist/visual/constants.d.ts +4 -0
  2313. package/dist/visual/constants.d.ts.map +1 -0
  2314. package/dist/visual/constants.js +3 -0
  2315. package/dist/visual/constants.js.map +1 -0
  2316. package/dist/visual/verdict.d.ts +17 -0
  2317. package/dist/visual/verdict.d.ts.map +1 -0
  2318. package/dist/visual/verdict.js +61 -0
  2319. package/dist/visual/verdict.js.map +1 -0
  2320. package/dist/wiki/__tests__/cjk-tokenize.test.d.ts +12 -0
  2321. package/dist/wiki/__tests__/cjk-tokenize.test.d.ts.map +1 -0
  2322. package/dist/wiki/__tests__/cjk-tokenize.test.js +139 -0
  2323. package/dist/wiki/__tests__/cjk-tokenize.test.js.map +1 -0
  2324. package/dist/wiki/__tests__/crlf-parse.test.d.ts +2 -0
  2325. package/dist/wiki/__tests__/crlf-parse.test.d.ts.map +1 -0
  2326. package/dist/wiki/__tests__/crlf-parse.test.js +24 -0
  2327. package/dist/wiki/__tests__/crlf-parse.test.js.map +1 -0
  2328. package/dist/wiki/__tests__/escape-newline.test.d.ts +2 -0
  2329. package/dist/wiki/__tests__/escape-newline.test.d.ts.map +1 -0
  2330. package/dist/wiki/__tests__/escape-newline.test.js +45 -0
  2331. package/dist/wiki/__tests__/escape-newline.test.js.map +1 -0
  2332. package/dist/wiki/__tests__/ingest.test.d.ts +5 -0
  2333. package/dist/wiki/__tests__/ingest.test.d.ts.map +1 -0
  2334. package/dist/wiki/__tests__/ingest.test.js +181 -0
  2335. package/dist/wiki/__tests__/ingest.test.js.map +1 -0
  2336. package/dist/wiki/__tests__/lint.test.d.ts +5 -0
  2337. package/dist/wiki/__tests__/lint.test.d.ts.map +1 -0
  2338. package/dist/wiki/__tests__/lint.test.js +163 -0
  2339. package/dist/wiki/__tests__/lint.test.js.map +1 -0
  2340. package/dist/wiki/__tests__/query.test.d.ts +5 -0
  2341. package/dist/wiki/__tests__/query.test.d.ts.map +1 -0
  2342. package/dist/wiki/__tests__/query.test.js +141 -0
  2343. package/dist/wiki/__tests__/query.test.js.map +1 -0
  2344. package/dist/wiki/__tests__/reserved-file-guard.test.d.ts +2 -0
  2345. package/dist/wiki/__tests__/reserved-file-guard.test.d.ts.map +1 -0
  2346. package/dist/wiki/__tests__/reserved-file-guard.test.js +44 -0
  2347. package/dist/wiki/__tests__/reserved-file-guard.test.js.map +1 -0
  2348. package/dist/wiki/__tests__/session-hooks.test.d.ts +5 -0
  2349. package/dist/wiki/__tests__/session-hooks.test.d.ts.map +1 -0
  2350. package/dist/wiki/__tests__/session-hooks.test.js +36 -0
  2351. package/dist/wiki/__tests__/session-hooks.test.js.map +1 -0
  2352. package/dist/wiki/__tests__/slug-nonascii.test.d.ts +2 -0
  2353. package/dist/wiki/__tests__/slug-nonascii.test.d.ts.map +1 -0
  2354. package/dist/wiki/__tests__/slug-nonascii.test.js +30 -0
  2355. package/dist/wiki/__tests__/slug-nonascii.test.js.map +1 -0
  2356. package/dist/wiki/__tests__/storage.test.d.ts +5 -0
  2357. package/dist/wiki/__tests__/storage.test.d.ts.map +1 -0
  2358. package/dist/wiki/__tests__/storage.test.js +278 -0
  2359. package/dist/wiki/__tests__/storage.test.js.map +1 -0
  2360. package/dist/wiki/__tests__/test-helpers.d.ts +31 -0
  2361. package/dist/wiki/__tests__/test-helpers.d.ts.map +1 -0
  2362. package/dist/wiki/__tests__/test-helpers.js +108 -0
  2363. package/dist/wiki/__tests__/test-helpers.js.map +1 -0
  2364. package/dist/wiki/index.d.ts +14 -0
  2365. package/dist/wiki/index.d.ts.map +1 -0
  2366. package/dist/wiki/index.js +17 -0
  2367. package/dist/wiki/index.js.map +1 -0
  2368. package/dist/wiki/ingest.d.ts +20 -0
  2369. package/dist/wiki/ingest.d.ts.map +1 -0
  2370. package/dist/wiki/ingest.js +115 -0
  2371. package/dist/wiki/ingest.js.map +1 -0
  2372. package/dist/wiki/lifecycle.d.ts +20 -0
  2373. package/dist/wiki/lifecycle.d.ts.map +1 -0
  2374. package/dist/wiki/lifecycle.js +212 -0
  2375. package/dist/wiki/lifecycle.js.map +1 -0
  2376. package/dist/wiki/lint.d.ts +25 -0
  2377. package/dist/wiki/lint.d.ts.map +1 -0
  2378. package/dist/wiki/lint.js +166 -0
  2379. package/dist/wiki/lint.js.map +1 -0
  2380. package/dist/wiki/query.d.ts +36 -0
  2381. package/dist/wiki/query.d.ts.map +1 -0
  2382. package/dist/wiki/query.js +138 -0
  2383. package/dist/wiki/query.js.map +1 -0
  2384. package/dist/wiki/storage.d.ts +33 -0
  2385. package/dist/wiki/storage.d.ts.map +1 -0
  2386. package/dist/wiki/storage.js +322 -0
  2387. package/dist/wiki/storage.js.map +1 -0
  2388. package/dist/wiki/types.d.ts +83 -0
  2389. package/dist/wiki/types.d.ts.map +1 -0
  2390. package/dist/wiki/types.js +15 -0
  2391. package/dist/wiki/types.js.map +1 -0
  2392. package/docs/STATE_MODEL.md +280 -0
  2393. package/docs/adapt.md +49 -0
  2394. package/docs/agents.html +96 -0
  2395. package/docs/benchmarks/tetris-benchmark-comparison-20260306.png +0 -0
  2396. package/docs/clawhip-event-contract.md +83 -0
  2397. package/docs/codex-native-hooks.md +153 -0
  2398. package/docs/contracts/autoresearch-command-contract.md +106 -0
  2399. package/docs/contracts/autoresearch-command-review.md +97 -0
  2400. package/docs/contracts/autoresearch-ux-deep-interview-review.md +114 -0
  2401. package/docs/contracts/explicit-terminal-stop-model.md +96 -0
  2402. package/docs/contracts/multi-state-transition-contract.md +115 -0
  2403. package/docs/contracts/multi-state-transition-review.md +134 -0
  2404. package/docs/contracts/mux-operation-space.md +49 -0
  2405. package/docs/contracts/ralph-cancel-contract.md +23 -0
  2406. package/docs/contracts/ralph-state-contract.md +95 -0
  2407. package/docs/contracts/repo-aware-team-dag-decomposition.md +98 -0
  2408. package/docs/contracts/runtime-authority-backlog-replay-readiness.md +40 -0
  2409. package/docs/contracts/runtime-command-event-snapshot-schema.md +133 -0
  2410. package/docs/contracts/rust-runtime-thin-adapter-contract.md +69 -0
  2411. package/docs/contracts/team-delivery-state-contract.md +95 -0
  2412. package/docs/contracts/team-runtime-state-contract.md +48 -0
  2413. package/docs/contracts/team-startup-dispatch-latency.md +114 -0
  2414. package/docs/getting-started.html +91 -0
  2415. package/docs/guidance-schema.md +69 -0
  2416. package/docs/hooks-extension.md +146 -0
  2417. package/docs/index.html +117 -0
  2418. package/docs/integrations.html +59 -0
  2419. package/docs/interop-team-mutation-contract.md +98 -0
  2420. package/docs/issues/team-ralph-followup-team.md +38 -0
  2421. package/docs/migration-mainline-post-v0.4.4.md +90 -0
  2422. package/docs/openclaw-integration.de.md +44 -0
  2423. package/docs/openclaw-integration.es.md +44 -0
  2424. package/docs/openclaw-integration.fr.md +44 -0
  2425. package/docs/openclaw-integration.it.md +44 -0
  2426. package/docs/openclaw-integration.ja.md +44 -0
  2427. package/docs/openclaw-integration.ko.md +82 -0
  2428. package/docs/openclaw-integration.md +378 -0
  2429. package/docs/openclaw-integration.pt.md +44 -0
  2430. package/docs/openclaw-integration.ru.md +44 -0
  2431. package/docs/openclaw-integration.tr.md +44 -0
  2432. package/docs/openclaw-integration.uk.md +44 -0
  2433. package/docs/openclaw-integration.vi.md +44 -0
  2434. package/docs/openclaw-integration.zh-TW.md +44 -0
  2435. package/docs/openclaw-integration.zh.md +44 -0
  2436. package/docs/plugin-bundle-ssot.md +52 -0
  2437. package/docs/prompt-guidance-contract.md +233 -0
  2438. package/docs/prompt-guidance-fragments/core-operating-principles.md +16 -0
  2439. package/docs/prompt-guidance-fragments/core-verification-and-sequencing.md +6 -0
  2440. package/docs/prompt-guidance-fragments/executor-constraints.md +13 -0
  2441. package/docs/prompt-guidance-fragments/executor-output.md +1 -0
  2442. package/docs/prompt-guidance-fragments/executor-shared.md +7 -0
  2443. package/docs/prompt-guidance-fragments/leader-specialist-routing.md +6 -0
  2444. package/docs/prompt-guidance-fragments/planner-constraints.md +12 -0
  2445. package/docs/prompt-guidance-fragments/planner-investigation.md +1 -0
  2446. package/docs/prompt-guidance-fragments/planner-output.md +1 -0
  2447. package/docs/prompt-guidance-fragments/planner-shared.md +7 -0
  2448. package/docs/prompt-guidance-fragments/verifier-constraints.md +10 -0
  2449. package/docs/prompt-guidance-fragments/verifier-investigation.md +1 -0
  2450. package/docs/prompt-guidance-fragments/verifier-shared.md +4 -0
  2451. package/docs/prompt-migration-changelog.md +152 -0
  2452. package/docs/prs/dev-deprecate-team-ralph.md +100 -0
  2453. package/docs/prs/dev-fix-ralph-live-pane-invariant.md +34 -0
  2454. package/docs/prs/dev-issue-715-team-brain-role-split.md +22 -0
  2455. package/docs/prs/dev-team-ralph-workflow-positioning.md +38 -0
  2456. package/docs/prs/experimental-dev-omx-sparkshell.md +56 -0
  2457. package/docs/qa/ci-speedups-after-prompt-worker-fix.md +91 -0
  2458. package/docs/qa/deep-interview-phase-1-validation.md +117 -0
  2459. package/docs/qa/explore-sparkshell-heavy-manual-stress.md +244 -0
  2460. package/docs/qa/ralph-persistence-gate.md +59 -0
  2461. package/docs/qa/recent-bug-regression-hardening-2026-04-11.md +24 -0
  2462. package/docs/qa/release-no-publish-0.15.0.md +33 -0
  2463. package/docs/qa/release-readiness-0.11.13.md +39 -0
  2464. package/docs/qa/release-readiness-0.12.0.md +80 -0
  2465. package/docs/qa/release-readiness-0.12.1.md +33 -0
  2466. package/docs/qa/release-readiness-0.12.2.md +33 -0
  2467. package/docs/qa/release-readiness-0.12.3.md +30 -0
  2468. package/docs/qa/release-readiness-0.12.5.md +69 -0
  2469. package/docs/qa/release-readiness-0.12.6.md +59 -0
  2470. package/docs/qa/release-readiness-0.13.0.md +64 -0
  2471. package/docs/qa/release-readiness-0.13.1.md +39 -0
  2472. package/docs/qa/release-readiness-0.14.0.md +55 -0
  2473. package/docs/qa/release-readiness-0.14.1.md +44 -0
  2474. package/docs/qa/release-readiness-0.14.2.md +65 -0
  2475. package/docs/qa/release-readiness-0.14.3.md +42 -0
  2476. package/docs/qa/release-readiness-0.14.4.md +40 -0
  2477. package/docs/qa/release-readiness-0.15.0.md +65 -0
  2478. package/docs/qa/release-readiness-0.15.1.md +44 -0
  2479. package/docs/qa/release-readiness-0.8.1.md +37 -0
  2480. package/docs/qa/release-readiness-0.8.2.md +39 -0
  2481. package/docs/qa/release-readiness-0.8.3.md +43 -0
  2482. package/docs/qa/release-readiness-0.8.4.md +39 -0
  2483. package/docs/qa/release-readiness-0.9.0.md +78 -0
  2484. package/docs/qa/release-readiness-0.9.1.md +43 -0
  2485. package/docs/qa/release-readiness-follow-up.md +26 -0
  2486. package/docs/qa/remaining-suite-drift-2026-03-19.md +105 -0
  2487. package/docs/qa/research-specialist-eval-surface-2026-04-18.md +42 -0
  2488. package/docs/qa/runtime-team-seam-audit-2026-04-01.md +128 -0
  2489. package/docs/qa/rust-runtime-thin-adapter-gate.md +40 -0
  2490. package/docs/qa-plan-0.4.2.md +85 -0
  2491. package/docs/qa-report-0.4.2.md +55 -0
  2492. package/docs/readme/README.de.md +27 -0
  2493. package/docs/readme/README.el.md +27 -0
  2494. package/docs/readme/README.es.md +27 -0
  2495. package/docs/readme/README.fr.md +27 -0
  2496. package/docs/readme/README.it.md +27 -0
  2497. package/docs/readme/README.ja.md +27 -0
  2498. package/docs/readme/README.ko.md +27 -0
  2499. package/docs/readme/README.md +53 -0
  2500. package/docs/readme/README.pl.md +27 -0
  2501. package/docs/readme/README.pt.md +27 -0
  2502. package/docs/readme/README.ru.md +27 -0
  2503. package/docs/readme/README.tr.md +27 -0
  2504. package/docs/readme/README.uk.md +27 -0
  2505. package/docs/readme/README.vi.md +27 -0
  2506. package/docs/readme/README.zh-TW.md +27 -0
  2507. package/docs/readme/README.zh.md +27 -0
  2508. package/docs/reference/player-psychology-command-surfaces.md +30 -0
  2509. package/docs/reference/player-psychology-framework.md +64 -0
  2510. package/docs/reference/project-wiki.md +79 -0
  2511. package/docs/reference/psychology-example-mastery-combat.md +7 -0
  2512. package/docs/reference/psychology-example-simulator-farming.md +7 -0
  2513. package/docs/reference/psychology-example-social-roleplay.md +7 -0
  2514. package/docs/reference/psychology-rubric-healthy-retention.md +13 -0
  2515. package/docs/reference/psychology-rubric-mastery-depth.md +11 -0
  2516. package/docs/reference/psychology-rubric-progression-clarity.md +12 -0
  2517. package/docs/reference/psychology-rubric-social-value-vs-spam.md +11 -0
  2518. package/docs/reference/psychology-rubric-status-visibility.md +11 -0
  2519. package/docs/reference/ralph-parity-matrix.md +25 -0
  2520. package/docs/reference/ralph-upstream-baseline.md +34 -0
  2521. package/docs/reference/rcs-config-schema-routing.md +264 -0
  2522. package/docs/reference/roblox-pre-action-protocol.md +122 -0
  2523. package/docs/reference/team-allocation-rebalance-policy.md +60 -0
  2524. package/docs/release-body-0.9.0.md +104 -0
  2525. package/docs/release-body-0.9.1.md +41 -0
  2526. package/docs/release-notes-v0.1.0.md +53 -0
  2527. package/docs/reports/macos-m1-high-cpu-usage-2026-04-16.md +78 -0
  2528. package/docs/reports/open-prs-dev-readiness-2026-04-09.md +45 -0
  2529. package/docs/runtime-model-metadata-cleanup.md +37 -0
  2530. package/docs/shared/agent-tiers.md +56 -0
  2531. package/docs/shared/omx-character-spark-initiative.jpg +0 -0
  2532. package/docs/skills.html +132 -0
  2533. package/docs/style.css +179 -0
  2534. package/docs/troubleshooting.md +120 -0
  2535. package/docs/wiki-feature.md +35 -0
  2536. package/package.json +108 -0
  2537. package/plugins/roblox-ai-os-creator-skills/.app.json +3 -0
  2538. package/plugins/roblox-ai-os-creator-skills/.codex-plugin/plugin.json +30 -0
  2539. package/plugins/roblox-ai-os-creator-skills/.mcp.json +44 -0
  2540. package/plugins/roblox-ai-os-creator-skills/docs/reference/player-psychology-command-surfaces.md +30 -0
  2541. package/plugins/roblox-ai-os-creator-skills/docs/reference/player-psychology-framework.md +64 -0
  2542. package/plugins/roblox-ai-os-creator-skills/docs/reference/psychology-example-mastery-combat.md +7 -0
  2543. package/plugins/roblox-ai-os-creator-skills/docs/reference/psychology-example-simulator-farming.md +7 -0
  2544. package/plugins/roblox-ai-os-creator-skills/docs/reference/psychology-example-social-roleplay.md +7 -0
  2545. package/plugins/roblox-ai-os-creator-skills/docs/reference/psychology-rubric-healthy-retention.md +13 -0
  2546. package/plugins/roblox-ai-os-creator-skills/docs/reference/psychology-rubric-mastery-depth.md +11 -0
  2547. package/plugins/roblox-ai-os-creator-skills/docs/reference/psychology-rubric-progression-clarity.md +12 -0
  2548. package/plugins/roblox-ai-os-creator-skills/docs/reference/psychology-rubric-social-value-vs-spam.md +11 -0
  2549. package/plugins/roblox-ai-os-creator-skills/docs/reference/psychology-rubric-status-visibility.md +11 -0
  2550. package/plugins/roblox-ai-os-creator-skills/docs/reference/roblox-pre-action-protocol.md +122 -0
  2551. package/plugins/roblox-ai-os-creator-skills/skills/ai-slop-cleaner/SKILL.md +139 -0
  2552. package/plugins/roblox-ai-os-creator-skills/skills/analyze/SKILL.md +148 -0
  2553. package/plugins/roblox-ai-os-creator-skills/skills/ask-claude/SKILL.md +61 -0
  2554. package/plugins/roblox-ai-os-creator-skills/skills/ask-gemini/SKILL.md +61 -0
  2555. package/plugins/roblox-ai-os-creator-skills/skills/autoforge/SKILL.md +18 -0
  2556. package/plugins/roblox-ai-os-creator-skills/skills/autopilot/SKILL.md +163 -0
  2557. package/plugins/roblox-ai-os-creator-skills/skills/autoresearch/SKILL.md +68 -0
  2558. package/plugins/roblox-ai-os-creator-skills/skills/blueprint/SKILL.md +22 -0
  2559. package/plugins/roblox-ai-os-creator-skills/skills/blueprint-loop/SKILL.md +19 -0
  2560. package/plugins/roblox-ai-os-creator-skills/skills/blueprint-psych/SKILL.md +21 -0
  2561. package/plugins/roblox-ai-os-creator-skills/skills/blueprint-retention/SKILL.md +15 -0
  2562. package/plugins/roblox-ai-os-creator-skills/skills/blueprint-social/SKILL.md +15 -0
  2563. package/plugins/roblox-ai-os-creator-skills/skills/brief/SKILL.md +27 -0
  2564. package/plugins/roblox-ai-os-creator-skills/skills/brief-audience/SKILL.md +19 -0
  2565. package/plugins/roblox-ai-os-creator-skills/skills/brief-motivation/SKILL.md +22 -0
  2566. package/plugins/roblox-ai-os-creator-skills/skills/cancel/SKILL.md +399 -0
  2567. package/plugins/roblox-ai-os-creator-skills/skills/code-review/SKILL.md +290 -0
  2568. package/plugins/roblox-ai-os-creator-skills/skills/configure-notifications/SKILL.md +287 -0
  2569. package/plugins/roblox-ai-os-creator-skills/skills/crew/SKILL.md +10 -0
  2570. package/plugins/roblox-ai-os-creator-skills/skills/deep-interview/SKILL.md +468 -0
  2571. package/plugins/roblox-ai-os-creator-skills/skills/doctor/SKILL.md +239 -0
  2572. package/plugins/roblox-ai-os-creator-skills/skills/forge/SKILL.md +30 -0
  2573. package/plugins/roblox-ai-os-creator-skills/skills/forge-community/SKILL.md +16 -0
  2574. package/plugins/roblox-ai-os-creator-skills/skills/forge-daily-loop/SKILL.md +15 -0
  2575. package/plugins/roblox-ai-os-creator-skills/skills/forge-event-loop/SKILL.md +15 -0
  2576. package/plugins/roblox-ai-os-creator-skills/skills/forge-fomo/SKILL.md +16 -0
  2577. package/plugins/roblox-ai-os-creator-skills/skills/forge-mastery/SKILL.md +16 -0
  2578. package/plugins/roblox-ai-os-creator-skills/skills/forge-progression/SKILL.md +16 -0
  2579. package/plugins/roblox-ai-os-creator-skills/skills/forge-reward-loop/SKILL.md +19 -0
  2580. package/plugins/roblox-ai-os-creator-skills/skills/forge-status/SKILL.md +17 -0
  2581. package/plugins/roblox-ai-os-creator-skills/skills/help/SKILL.md +75 -0
  2582. package/plugins/roblox-ai-os-creator-skills/skills/hud/SKILL.md +98 -0
  2583. package/plugins/roblox-ai-os-creator-skills/skills/note/SKILL.md +62 -0
  2584. package/plugins/roblox-ai-os-creator-skills/skills/pipeline/SKILL.md +86 -0
  2585. package/plugins/roblox-ai-os-creator-skills/skills/plan/SKILL.md +277 -0
  2586. package/plugins/roblox-ai-os-creator-skills/skills/ralph/SKILL.md +269 -0
  2587. package/plugins/roblox-ai-os-creator-skills/skills/ralplan/SKILL.md +162 -0
  2588. package/plugins/roblox-ai-os-creator-skills/skills/rcs-setup/SKILL.md +135 -0
  2589. package/plugins/roblox-ai-os-creator-skills/skills/security-review/SKILL.md +300 -0
  2590. package/plugins/roblox-ai-os-creator-skills/skills/skill/SKILL.md +835 -0
  2591. package/plugins/roblox-ai-os-creator-skills/skills/team/SKILL.md +510 -0
  2592. package/plugins/roblox-ai-os-creator-skills/skills/trace/SKILL.md +33 -0
  2593. package/plugins/roblox-ai-os-creator-skills/skills/ultraqa/SKILL.md +143 -0
  2594. package/plugins/roblox-ai-os-creator-skills/skills/ultrawork/SKILL.md +175 -0
  2595. package/plugins/roblox-ai-os-creator-skills/skills/visual-ralph/SKILL.md +153 -0
  2596. package/plugins/roblox-ai-os-creator-skills/skills/visual-verdict/SKILL.md +76 -0
  2597. package/plugins/roblox-ai-os-creator-skills/skills/wiki/SKILL.md +57 -0
  2598. package/plugins/roblox-ai-os-creator-skills/skills/worker/SKILL.md +106 -0
  2599. package/plugins/roblox-ai-os-creator-skills/templates/psychology/dopamine-loop-map.md +13 -0
  2600. package/plugins/roblox-ai-os-creator-skills/templates/psychology/event-fomo-design-sheet.md +11 -0
  2601. package/plugins/roblox-ai-os-creator-skills/templates/psychology/player-motivation-profile.md +14 -0
  2602. package/plugins/roblox-ai-os-creator-skills/templates/psychology/retention-design-sheet.md +12 -0
  2603. package/plugins/roblox-ai-os-creator-skills/templates/psychology/social-mechanic-spec.md +11 -0
  2604. package/plugins/roblox-ai-os-creator-skills/templates/roblox/pre-action-plan.md +84 -0
  2605. package/prompts/analyst.md +135 -0
  2606. package/prompts/api-reviewer.md +113 -0
  2607. package/prompts/architect.md +111 -0
  2608. package/prompts/build-fixer.md +115 -0
  2609. package/prompts/code-reviewer.md +137 -0
  2610. package/prompts/code-simplifier.md +134 -0
  2611. package/prompts/critic.md +80 -0
  2612. package/prompts/debugger.md +117 -0
  2613. package/prompts/dependency-expert.md +129 -0
  2614. package/prompts/designer.md +126 -0
  2615. package/prompts/executor.md +108 -0
  2616. package/prompts/explore-harness.md +64 -0
  2617. package/prompts/explore.md +85 -0
  2618. package/prompts/git-master.md +114 -0
  2619. package/prompts/information-architect.md +226 -0
  2620. package/prompts/performance-reviewer.md +109 -0
  2621. package/prompts/planner.md +110 -0
  2622. package/prompts/product-analyst.md +304 -0
  2623. package/prompts/product-manager.md +245 -0
  2624. package/prompts/qa-tester.md +124 -0
  2625. package/prompts/quality-reviewer.md +123 -0
  2626. package/prompts/quality-strategist.md +274 -0
  2627. package/prompts/researcher.md +98 -0
  2628. package/prompts/security-reviewer.md +143 -0
  2629. package/prompts/sisyphus-lite.md +111 -0
  2630. package/prompts/style-reviewer.md +102 -0
  2631. package/prompts/team-executor.md +57 -0
  2632. package/prompts/team-orchestrator.md +8 -0
  2633. package/prompts/test-engineer.md +130 -0
  2634. package/prompts/ux-researcher.md +327 -0
  2635. package/prompts/verifier.md +85 -0
  2636. package/prompts/vision.md +98 -0
  2637. package/prompts/writer.md +109 -0
  2638. package/skills/ai-slop-cleaner/SKILL.md +139 -0
  2639. package/skills/analyze/SKILL.md +148 -0
  2640. package/skills/ask-claude/SKILL.md +61 -0
  2641. package/skills/ask-gemini/SKILL.md +61 -0
  2642. package/skills/autoforge/SKILL.md +18 -0
  2643. package/skills/autopilot/SKILL.md +163 -0
  2644. package/skills/autoresearch/SKILL.md +68 -0
  2645. package/skills/blueprint/SKILL.md +22 -0
  2646. package/skills/blueprint-loop/SKILL.md +19 -0
  2647. package/skills/blueprint-psych/SKILL.md +21 -0
  2648. package/skills/blueprint-retention/SKILL.md +15 -0
  2649. package/skills/blueprint-social/SKILL.md +15 -0
  2650. package/skills/brief/SKILL.md +27 -0
  2651. package/skills/brief-audience/SKILL.md +19 -0
  2652. package/skills/brief-motivation/SKILL.md +22 -0
  2653. package/skills/build-fix/SKILL.md +145 -0
  2654. package/skills/cancel/SKILL.md +399 -0
  2655. package/skills/code-review/SKILL.md +290 -0
  2656. package/skills/configure-notifications/SKILL.md +287 -0
  2657. package/skills/crew/SKILL.md +10 -0
  2658. package/skills/deep-interview/SKILL.md +468 -0
  2659. package/skills/deepsearch/SKILL.md +38 -0
  2660. package/skills/doctor/SKILL.md +239 -0
  2661. package/skills/ecomode/SKILL.md +114 -0
  2662. package/skills/forge/SKILL.md +30 -0
  2663. package/skills/forge-community/SKILL.md +16 -0
  2664. package/skills/forge-daily-loop/SKILL.md +15 -0
  2665. package/skills/forge-event-loop/SKILL.md +15 -0
  2666. package/skills/forge-fomo/SKILL.md +16 -0
  2667. package/skills/forge-mastery/SKILL.md +16 -0
  2668. package/skills/forge-progression/SKILL.md +16 -0
  2669. package/skills/forge-reward-loop/SKILL.md +19 -0
  2670. package/skills/forge-status/SKILL.md +17 -0
  2671. package/skills/frontend-ui-ux/SKILL.md +34 -0
  2672. package/skills/git-master/SKILL.md +29 -0
  2673. package/skills/help/SKILL.md +75 -0
  2674. package/skills/hud/SKILL.md +98 -0
  2675. package/skills/note/SKILL.md +62 -0
  2676. package/skills/pipeline/SKILL.md +86 -0
  2677. package/skills/plan/SKILL.md +277 -0
  2678. package/skills/ralph/SKILL.md +269 -0
  2679. package/skills/ralph-init/SKILL.md +46 -0
  2680. package/skills/ralplan/SKILL.md +162 -0
  2681. package/skills/rcs-setup/SKILL.md +135 -0
  2682. package/skills/review/SKILL.md +38 -0
  2683. package/skills/security-review/SKILL.md +300 -0
  2684. package/skills/skill/SKILL.md +835 -0
  2685. package/skills/swarm/SKILL.md +25 -0
  2686. package/skills/tdd/SKILL.md +106 -0
  2687. package/skills/team/SKILL.md +510 -0
  2688. package/skills/trace/SKILL.md +33 -0
  2689. package/skills/ultraqa/SKILL.md +143 -0
  2690. package/skills/ultrawork/SKILL.md +175 -0
  2691. package/skills/visual-ralph/SKILL.md +153 -0
  2692. package/skills/visual-verdict/SKILL.md +76 -0
  2693. package/skills/web-clone/SKILL.md +24 -0
  2694. package/skills/wiki/SKILL.md +57 -0
  2695. package/skills/worker/SKILL.md +106 -0
  2696. package/src/scripts/__tests__/codex-native-hook.test.ts +8498 -0
  2697. package/src/scripts/__tests__/generate-release-body.test.ts +275 -0
  2698. package/src/scripts/__tests__/hook-derived-watcher.test.ts +241 -0
  2699. package/src/scripts/__tests__/postinstall.test.ts +113 -0
  2700. package/src/scripts/__tests__/prompt-inventory.test.ts +64 -0
  2701. package/src/scripts/__tests__/run-test-files.test.ts +72 -0
  2702. package/src/scripts/__tests__/smoke-packed-install.test.ts +155 -0
  2703. package/src/scripts/__tests__/test-reply-listener-live.test.ts +101 -0
  2704. package/src/scripts/__tests__/verify-native-agents.test.ts +204 -0
  2705. package/src/scripts/ask-claude.sh +17 -0
  2706. package/src/scripts/ask-gemini.sh +14 -0
  2707. package/src/scripts/build-explore-harness.ts +54 -0
  2708. package/src/scripts/build-sparkshell.ts +52 -0
  2709. package/src/scripts/check-runtime-syntax.ts +63 -0
  2710. package/src/scripts/check-version-sync.ts +50 -0
  2711. package/src/scripts/cleanup-explore-harness.ts +17 -0
  2712. package/src/scripts/codex-execution-surface.ts +73 -0
  2713. package/src/scripts/codex-native-hook.ts +2531 -0
  2714. package/src/scripts/codex-native-pre-post.ts +945 -0
  2715. package/src/scripts/demo-claude-workers.sh +241 -0
  2716. package/src/scripts/demo-team-e2e.sh +181 -0
  2717. package/src/scripts/eval/eval-adaptive-sort-optimization.py +24 -0
  2718. package/src/scripts/eval/eval-candidate-handoff.ts +8 -0
  2719. package/src/scripts/eval/eval-cli-discoverability.ts +40 -0
  2720. package/src/scripts/eval/eval-fresh-run-tagging.ts +8 -0
  2721. package/src/scripts/eval/eval-help-consistency.ts +11 -0
  2722. package/src/scripts/eval/eval-in-action-cat-shellout-demo.ts +31 -0
  2723. package/src/scripts/eval/eval-ml-kaggle-model-optimization.py +29 -0
  2724. package/src/scripts/eval/eval-noisy-bayesopt-highdim.py +44 -0
  2725. package/src/scripts/eval/eval-noisy-latent-subspace-discovery.py +44 -0
  2726. package/src/scripts/eval/eval-parity-smoke.ts +20 -0
  2727. package/src/scripts/eval/eval-parity-sweep.ts +26 -0
  2728. package/src/scripts/eval/eval-resume-dirty-guard.ts +8 -0
  2729. package/src/scripts/eval/eval-security-path-traversal.ts +38 -0
  2730. package/src/scripts/fixtures/ask-advisor-stub.ts +12 -0
  2731. package/src/scripts/generate-catalog-docs.ts +112 -0
  2732. package/src/scripts/generate-native-release-manifest.ts +147 -0
  2733. package/src/scripts/generate-release-body.ts +327 -0
  2734. package/src/scripts/hook-derived-watcher.ts +648 -0
  2735. package/src/scripts/notify-fallback-watcher.ts +2011 -0
  2736. package/src/scripts/notify-hook/__tests__/operational-events.test.ts +24 -0
  2737. package/src/scripts/notify-hook/__tests__/team-worker-posttooluse.test.ts +180 -0
  2738. package/src/scripts/notify-hook/active-team.ts +55 -0
  2739. package/src/scripts/notify-hook/auto-nudge.ts +756 -0
  2740. package/src/scripts/notify-hook/log.ts +30 -0
  2741. package/src/scripts/notify-hook/managed-tmux.ts +586 -0
  2742. package/src/scripts/notify-hook/operational-events.ts +282 -0
  2743. package/src/scripts/notify-hook/orchestration-intent.ts +82 -0
  2744. package/src/scripts/notify-hook/payload-parser.ts +143 -0
  2745. package/src/scripts/notify-hook/process-runner.ts +109 -0
  2746. package/src/scripts/notify-hook/ralph-session-resume.ts +362 -0
  2747. package/src/scripts/notify-hook/state-io.ts +182 -0
  2748. package/src/scripts/notify-hook/team-dispatch.ts +1142 -0
  2749. package/src/scripts/notify-hook/team-leader-nudge.ts +1100 -0
  2750. package/src/scripts/notify-hook/team-tmux-guard.ts +187 -0
  2751. package/src/scripts/notify-hook/team-worker-posttooluse.ts +536 -0
  2752. package/src/scripts/notify-hook/team-worker.ts +700 -0
  2753. package/src/scripts/notify-hook/tmux-injection.ts +617 -0
  2754. package/src/scripts/notify-hook/utils.ts +31 -0
  2755. package/src/scripts/notify-hook/visual-verdict.ts +158 -0
  2756. package/src/scripts/notify-hook.ts +778 -0
  2757. package/src/scripts/postinstall-bootstrap.js +23 -0
  2758. package/src/scripts/postinstall.ts +107 -0
  2759. package/src/scripts/prompt-inventory.ts +218 -0
  2760. package/src/scripts/run-autoresearch-showcase.sh +75 -0
  2761. package/src/scripts/run-provider-advisor.ts +205 -0
  2762. package/src/scripts/run-test-files.ts +87 -0
  2763. package/src/scripts/smoke-packed-install.ts +186 -0
  2764. package/src/scripts/sync-plugin-mirror.ts +412 -0
  2765. package/src/scripts/sync-prompt-guidance-fragments.ts +55 -0
  2766. package/src/scripts/team-hardening-benchmark.ts +90 -0
  2767. package/src/scripts/test-reply-listener-live.ts +188 -0
  2768. package/src/scripts/test-sparkshell.ts +29 -0
  2769. package/src/scripts/tmux-hook-engine.ts +349 -0
  2770. package/src/scripts/verify-native-agents.ts +245 -0
  2771. package/src/scripts/verify-native-release-assets.ts +68 -0
  2772. package/templates/AGENTS.md +347 -0
  2773. package/templates/catalog-manifest.json +614 -0
  2774. package/templates/model-instructions/explore-lightweight-AGENTS.md +11 -0
  2775. package/templates/model-instructions/sparkshell-lightweight-AGENTS.md +10 -0
  2776. package/templates/psychology/dopamine-loop-map.md +13 -0
  2777. package/templates/psychology/event-fomo-design-sheet.md +11 -0
  2778. package/templates/psychology/player-motivation-profile.md +14 -0
  2779. package/templates/psychology/retention-design-sheet.md +12 -0
  2780. package/templates/psychology/social-mechanic-spec.md +11 -0
  2781. package/templates/roblox/pre-action-plan.md +84 -0
@@ -0,0 +1,3925 @@
1
+ import { join, resolve, dirname } from 'path';
2
+ import { existsSync, appendFileSync, mkdirSync } from 'fs';
3
+ import { mkdir, readdir, readFile, writeFile } from 'fs/promises';
4
+ import { performance } from 'perf_hooks';
5
+ import { spawn, spawnSync } from 'child_process';
6
+ import { sanitizeTeamName, isTmuxAvailable, hasCurrentTmuxClientContext, createTeamSession, buildWorkerProcessLaunchSpec, resolveTeamWorkerCli, resolveTeamWorkerCliPlan, resolveTeamWorkerLaunchMode, waitForWorkerReady, waitForWorkerReadyAsync, dismissTrustPromptIfPresent, evaluateStartupDirectTriggerSafety, sendToWorker, sendToWorkerStdin, isWorkerAlive, isWorkerPaneOpen, getWorkerPanePid, killWorkerByPaneIdAsync, restoreStandaloneHudPane, teardownWorkerPanes, unregisterResizeHook, destroyTeamSession, listPaneIds, listTeamSessions, resolveSharedSessionShutdownTopology, } from './tmux-session.js';
7
+ import { teamInit as initTeamState, DEFAULT_MAX_WORKERS, teamReadConfig as readTeamConfig, teamWriteWorkerIdentity as writeWorkerIdentity, teamReadWorkerHeartbeat as readWorkerHeartbeat, teamReadWorkerStatus as readWorkerStatus, teamWriteWorkerInbox as writeWorkerInbox, teamCreateTask as createStateTask, teamReadTask as readTask, teamListTasks as listTasks, teamUpdateTask as updateTask, teamReadManifest as readTeamManifestV2, teamNormalizeGovernance as normalizeTeamGovernance, teamNormalizePolicy as normalizeTeamPolicy, teamClaimTask as claimTask, teamReleaseTaskClaim as releaseTaskClaim, teamReclaimExpiredTaskClaim as reclaimExpiredTaskClaim, teamAppendEvent as appendTeamEvent, teamReadTaskApproval as readTaskApproval, teamListMailbox as listMailboxMessages, teamMarkMessageDelivered as markMessageDelivered, teamMarkMessageNotified as markMessageNotified, teamEnqueueDispatchRequest as enqueueDispatchRequest, teamMarkDispatchRequestNotified as markDispatchRequestNotified, teamTransitionDispatchRequest as transitionDispatchRequest, teamReadDispatchRequest as readDispatchRequest, teamCleanup as cleanupTeamState, teamSaveConfig as saveTeamConfig, teamWriteShutdownRequest as writeShutdownRequest, teamReadShutdownAck as readShutdownAck, teamReadMonitorSnapshot as readMonitorSnapshot, teamWriteMonitorSnapshot as writeMonitorSnapshot, teamReadPhase as readTeamPhaseState, teamWritePhase as writeTeamPhaseState, teamWriteWorkerStatus as writeWorkerStatus, writeAtomic, } from './team-ops.js';
8
+ import { queueInboxInstruction, queueDirectMailboxMessage, queueBroadcastMailboxMessage, waitForDispatchReceipt, } from './mcp-comm.js';
9
+ import { appendTeamDeliveryLogForCwd } from './delivery-log.js';
10
+ import { remapRepoAwareDecompositionMetadataToCreatedTasks, } from './repo-aware-decomposition.js';
11
+ import { generateWorkerOverlay, writeTeamWorkerInstructionsFile, removeTeamWorkerInstructionsFile, writeWorkerWorktreeRootAgentsFile, removeWorkerWorktreeRootAgentsFile, generateInitialInbox, generateTaskAssignmentInbox, generateShutdownInbox, buildTriggerDirective, buildMailboxTriggerDirective, buildLeaderMailboxTriggerDirective, writeWorkerRoleInstructionsFile, } from './worker-bootstrap.js';
12
+ import { synthesizeDelegationPlan } from './delegation-policy.js';
13
+ import { loadRolePrompt } from './role-router.js';
14
+ import { composeRoleInstructionsForRole } from '../agents/native-config.js';
15
+ import { codexPromptsDir } from '../utils/paths.js';
16
+ import { isTerminalPhase } from './orchestrator.js';
17
+ import { resolveTeamWorkerLaunchArgs, TEAM_LOW_COMPLEXITY_DEFAULT_MODEL, parseTeamWorkerLaunchArgs, splitWorkerLaunchArgs, resolveAgentDefaultModel, resolveAgentReasoningEffort, } from './model-contract.js';
18
+ import { resolveCanonicalTeamStateRoot } from './state-root.js';
19
+ import { buildInternalTeamName, resolveTeamIdentityScope, resolveTeamNameForCurrentContext } from './team-identity.js';
20
+ import { inferPhaseTargetFromTaskCounts, reconcilePhaseStateForMonitor } from './phase-controller.js';
21
+ import { getTeamTmuxSessions } from '../notifications/tmux.js';
22
+ import { hasStructuredVerificationEvidence } from '../verification/verifier.js';
23
+ import { buildRebalanceDecisions } from './rebalance-policy.js';
24
+ import { getStatePath } from '../mcp/state-paths.js';
25
+ import { readModeState, updateModeState } from '../modes/base.js';
26
+ import { appendTeamCommitHygieneEntries, buildTeamCommitHygieneContext, resolveTeamCommitHygieneArtifactCwd, writeTeamCommitHygieneContext, } from './commit-hygiene.js';
27
+ import { assertCleanLeaderWorkspaceForWorkerWorktrees, ensureWorktree, isGitRepository, isWorktreeDirty, planWorktreeTarget, removeWorktreeForce, rollbackProvisionedWorktrees, } from './worktree.js';
28
+ import { cleanupRcsMcpProcesses, findLaunchSafeCleanupCandidates, } from '../cli/cleanup.js';
29
+ async function syncRootTeamModeStateOnTerminalPhase(teamName, phase, cwd) {
30
+ if (phase !== 'complete' && phase !== 'failed' && phase !== 'cancelled')
31
+ return;
32
+ try {
33
+ const teamState = await readModeState('team', cwd);
34
+ if (!teamState)
35
+ return;
36
+ const stateTeamName = typeof teamState.team_name === 'string' ? teamState.team_name.trim() : '';
37
+ if (stateTeamName && stateTeamName !== teamName)
38
+ return;
39
+ const alreadySynced = teamState.active === false
40
+ && teamState.current_phase === phase
41
+ && typeof teamState.completed_at === 'string'
42
+ && teamState.completed_at.length > 0;
43
+ if (alreadySynced)
44
+ return;
45
+ const updates = {
46
+ active: false,
47
+ current_phase: phase,
48
+ team_name: teamName,
49
+ };
50
+ if (typeof teamState.completed_at !== 'string' || !teamState.completed_at) {
51
+ updates.completed_at = new Date().toISOString();
52
+ }
53
+ await updateModeState('team', updates, cwd);
54
+ }
55
+ catch {
56
+ // Best-effort compatibility sync only.
57
+ }
58
+ }
59
+ function matchesTeamModeStateForShutdown(state, teamName) {
60
+ const stateTeamName = typeof state?.team_name === 'string' ? state.team_name.trim() : '';
61
+ return !stateTeamName || stateTeamName === teamName;
62
+ }
63
+ async function syncExactTeamModeStateOnShutdown(teamName, cwd, sessionId) {
64
+ const path = getStatePath('team', cwd, sessionId);
65
+ if (!existsSync(path))
66
+ return;
67
+ try {
68
+ const parsed = JSON.parse(await readFile(path, 'utf-8'));
69
+ if (!matchesTeamModeStateForShutdown(parsed, teamName))
70
+ return;
71
+ const next = {
72
+ ...parsed,
73
+ active: false,
74
+ current_phase: 'cancelled',
75
+ completed_at: typeof parsed.completed_at === 'string' && parsed.completed_at.trim().length > 0
76
+ ? parsed.completed_at
77
+ : new Date().toISOString(),
78
+ team_name: teamName,
79
+ };
80
+ await writeFile(path, JSON.stringify(next, null, 2));
81
+ }
82
+ catch {
83
+ // Best-effort compatibility sync only.
84
+ }
85
+ }
86
+ async function syncTeamModeStateOnShutdown(teamName, cwd, leaderSessionId) {
87
+ await syncExactTeamModeStateOnShutdown(teamName, cwd);
88
+ const normalizedLeaderSessionId = typeof leaderSessionId === 'string' ? leaderSessionId.trim() : '';
89
+ if (normalizedLeaderSessionId) {
90
+ await syncExactTeamModeStateOnShutdown(teamName, cwd, normalizedLeaderSessionId);
91
+ }
92
+ }
93
+ async function assertTeamStartupIsNonDestructive(teamName, cwd, leaderSessionId) {
94
+ const activeTeams = await findActiveTeams(cwd, leaderSessionId);
95
+ if (activeTeams.length > 0) {
96
+ throw new Error(`leader_session_conflict: active team exists (${activeTeams.join(', ')})`);
97
+ }
98
+ const [existingConfig, existingManifest, existingPhase] = await Promise.all([
99
+ readTeamConfig(teamName, cwd),
100
+ readTeamManifestV2(teamName, cwd),
101
+ readTeamPhaseState(teamName, cwd),
102
+ ]);
103
+ if (!existingConfig && !existingManifest)
104
+ return;
105
+ const currentPhase = existingPhase?.current_phase;
106
+ if (currentPhase && isTerminalPhase(currentPhase))
107
+ return;
108
+ const tmuxSession = existingConfig?.tmux_session ?? existingManifest?.tmux_session ?? `rcs-team-${teamName}`;
109
+ const renderedPhase = currentPhase ?? 'team-exec';
110
+ throw new Error(`team_name_conflict: active team state already exists for "${teamName}" (phase: ${renderedPhase}, tmux: ${tmuxSession}). `
111
+ + `Use "rcs team status ${teamName}", "rcs team resume ${teamName}", or "rcs team shutdown ${teamName}" instead of launching a duplicate team.`);
112
+ }
113
+ export function applyCreatedInteractiveSessionToConfig(config, createdSession, workerPaneIds) {
114
+ config.tmux_session = createdSession.name;
115
+ config.leader_pane_id = createdSession.leaderPaneId;
116
+ config.hud_pane_id = createdSession.hudPaneId;
117
+ config.resize_hook_name = createdSession.resizeHookName;
118
+ config.resize_hook_target = createdSession.resizeHookTarget;
119
+ for (let i = 0; i < createdSession.workerPaneIds.length; i++) {
120
+ const paneId = createdSession.workerPaneIds[i];
121
+ workerPaneIds[i] = paneId;
122
+ if (config.workers[i]) {
123
+ config.workers[i].pane_id = paneId;
124
+ }
125
+ }
126
+ }
127
+ function collectShutdownPaneIds(params) {
128
+ const { config, livePaneIds = [], restoredStandaloneHudPaneId = null, leaderPaneId = config.leader_pane_id, hudPaneId = config.hud_pane_id, } = params;
129
+ const excludedPaneIds = new Set([
130
+ leaderPaneId,
131
+ hudPaneId,
132
+ restoredStandaloneHudPaneId,
133
+ ].filter((paneId) => typeof paneId === 'string' && paneId.trim().startsWith('%')));
134
+ const paneIds = new Set();
135
+ for (const paneId of [
136
+ ...config.workers.map((worker) => worker.pane_id),
137
+ ...livePaneIds,
138
+ ]) {
139
+ if (typeof paneId !== 'string')
140
+ continue;
141
+ const normalized = paneId.trim();
142
+ if (!normalized.startsWith('%'))
143
+ continue;
144
+ if (excludedPaneIds.has(normalized))
145
+ continue;
146
+ paneIds.add(normalized);
147
+ }
148
+ return [...paneIds];
149
+ }
150
+ export function shouldPrekillInteractiveShutdownProcessTrees(sessionName) {
151
+ // Shared-window tmux sessions can expose overlapping ancestry around the
152
+ // invoking leader client. Rely on pane-targeted teardown there so shutdown
153
+ // does not signal the leader while tearing down worker panes.
154
+ if (sessionName.includes(':'))
155
+ return false;
156
+ // Detached session teardown still benefits from process-tree prekill,
157
+ // including native Windows prompt-worker ancestry where pane-targeted
158
+ // teardown alone is insufficient.
159
+ return true;
160
+ }
161
+ export async function cleanupTeamWorkerLaunchOrphanedMcpProcesses(dependencies = {}) {
162
+ const cleanup = dependencies.cleanup ?? (() => cleanupRcsMcpProcesses([], {
163
+ selectCandidates: findLaunchSafeCleanupCandidates,
164
+ writeLine: () => { },
165
+ }));
166
+ const writeWarning = dependencies.writeWarning ?? ((message) => process.stderr.write(`${message}\n`));
167
+ try {
168
+ const result = await cleanup();
169
+ if (result.failedPids.length > 0) {
170
+ writeWarning(`[team/runtime] Failed to reap ${result.failedPids.length} orphaned RCS MCP process(es); continuing worker launch.`);
171
+ }
172
+ }
173
+ catch (err) {
174
+ writeWarning(`[team/runtime] pre-launch MCP cleanup failed: ${err}; continuing worker launch.`);
175
+ }
176
+ }
177
+ async function logRuntimeDispatchOutcome(params) {
178
+ const { cwd, teamName, workerName, requestId, messageId, intent, outcome, source = 'team.runtime' } = params;
179
+ await appendTeamDeliveryLogForCwd(cwd, {
180
+ event: 'dispatch_result',
181
+ source,
182
+ team: teamName,
183
+ request_id: requestId,
184
+ message_id: messageId,
185
+ to_worker: workerName,
186
+ intent,
187
+ transport: outcome.transport,
188
+ result: outcome.ok ? 'confirmed' : 'failed',
189
+ reason: outcome.reason,
190
+ });
191
+ }
192
+ async function logStartupTiming(params) {
193
+ const { cwd, teamName, workerName, event, paneId, elapsedMs, reason, requestId, transport } = params;
194
+ await appendTeamDeliveryLogForCwd(cwd, {
195
+ event: 'startup_timing',
196
+ source: 'team.runtime',
197
+ team: teamName,
198
+ to_worker: workerName,
199
+ startup_event: event,
200
+ pane_id: paneId,
201
+ elapsed_ms: typeof elapsedMs === 'number' ? Math.round(elapsedMs) : undefined,
202
+ reason,
203
+ request_id: requestId,
204
+ transport,
205
+ });
206
+ }
207
+ function collectProvisionedShutdownWorktrees(config) {
208
+ const seenWorktreePaths = new Set();
209
+ const worktrees = [];
210
+ for (const worker of config.workers) {
211
+ if (worker.worktree_created !== true)
212
+ continue;
213
+ if (worker.worktree_detached !== true)
214
+ continue;
215
+ if (!worker.worktree_repo_root || !worker.worktree_path)
216
+ continue;
217
+ if (!existsSync(worker.worktree_path))
218
+ continue;
219
+ const worktreePath = resolve(worker.worktree_path);
220
+ if (seenWorktreePaths.has(worktreePath))
221
+ continue;
222
+ seenWorktreePaths.add(worktreePath);
223
+ worktrees.push({
224
+ enabled: true,
225
+ repoRoot: worker.worktree_repo_root,
226
+ worktreePath,
227
+ detached: true,
228
+ branchName: null,
229
+ created: true,
230
+ reused: false,
231
+ createdBranch: false,
232
+ });
233
+ }
234
+ return worktrees;
235
+ }
236
+ function runCommand(command, args, cwd) {
237
+ const result = spawnSync(command, args, {
238
+ cwd,
239
+ encoding: 'utf-8',
240
+ windowsHide: true,
241
+ });
242
+ return {
243
+ ok: result.status === 0,
244
+ stdout: (result.stdout || '').trim(),
245
+ stderr: (result.stderr || '').trim(),
246
+ exitCode: result.status,
247
+ };
248
+ }
249
+ function runGitCommand(repoRoot, args, cwd = repoRoot) {
250
+ return runCommand('git', args, cwd);
251
+ }
252
+ function getWorktreeDiffText(worktreePath) {
253
+ const staged = runGitCommand(worktreePath, ['diff', '--cached', '--stat', '--patch'], worktreePath);
254
+ if (staged.ok && staged.stdout)
255
+ return staged.stdout;
256
+ const unstaged = runGitCommand(worktreePath, ['diff', '--stat', '--patch'], worktreePath);
257
+ if (unstaged.ok && unstaged.stdout)
258
+ return unstaged.stdout;
259
+ const againstHead = runGitCommand(worktreePath, ['diff', 'HEAD', '--stat', '--patch'], worktreePath);
260
+ if (againstHead.ok && againstHead.stdout)
261
+ return againstHead.stdout;
262
+ return '';
263
+ }
264
+ function summarizeWorktreeDiffWithSparkShell(worktreePath) {
265
+ const shellCommand = `git diff --cached --stat --patch || git diff --stat --patch || git diff HEAD --stat --patch`;
266
+ const result = runCommand('rcs', ['sparkshell', 'sh', '-lc', shellCommand], worktreePath);
267
+ if (!result.ok || !result.stdout)
268
+ return null;
269
+ return result.stdout;
270
+ }
271
+ function resolveWorkerHead(worktreePath) {
272
+ const head = runGitCommand(worktreePath, ['rev-parse', 'HEAD'], worktreePath);
273
+ return head.ok && head.stdout ? head.stdout : null;
274
+ }
275
+ function resolveLeaderHead(repoRoot, leaderCwd) {
276
+ const head = runGitCommand(repoRoot, ['rev-parse', 'HEAD'], leaderCwd);
277
+ return head.ok && head.stdout ? head.stdout : null;
278
+ }
279
+ function listCommitRange(repoRoot, baseRef, headRef, cwd) {
280
+ if (!baseRef || !headRef || baseRef === headRef)
281
+ return [];
282
+ const range = runGitCommand(repoRoot, ['rev-list', '--reverse', `${baseRef}..${headRef}`], cwd);
283
+ if (!range.ok || !range.stdout)
284
+ return [];
285
+ return range.stdout.split('\n').map((line) => line.trim()).filter(Boolean);
286
+ }
287
+ function listConflictFiles(repoRoot, cwd) {
288
+ const result = runGitCommand(repoRoot, ['diff', '--name-only', '--diff-filter=U'], cwd);
289
+ if (!result.ok || !result.stdout)
290
+ return [];
291
+ return result.stdout.split('\n').map((line) => line.trim()).filter(Boolean);
292
+ }
293
+ async function appendIntegrationEvent(teamName, type, worker, metadata, cwd) {
294
+ await appendTeamEvent(teamName, {
295
+ type,
296
+ worker: worker.name,
297
+ task_id: worker.assigned_tasks[0],
298
+ reason: typeof metadata.summary === 'string' ? metadata.summary : undefined,
299
+ metadata,
300
+ }, cwd);
301
+ }
302
+ async function sendIntegrationMessageToLeader(teamName, worker, body, cwd) {
303
+ await sendWorkerMessage(teamName, worker.name, 'leader-fixed', body, cwd).catch(() => { });
304
+ }
305
+ function leaderHeadAdvanced(before, after) {
306
+ return typeof after === 'string' && after.length > 0 && after !== before;
307
+ }
308
+ async function recordIntegrationFailure(teamName, worker, state, details, cwd) {
309
+ const leaderHeadAfter = details.leaderHeadAfter ?? details.leaderHeadBefore;
310
+ const sourceShort = details.sourceCommit.slice(0, 12);
311
+ const leaderShort = details.leaderHeadBefore.slice(0, 12);
312
+ state.last_leader_head = leaderHeadAfter;
313
+ state.status = 'integration_failed';
314
+ state.conflict_commit = details.sourceCommit;
315
+ state.conflict_files = undefined;
316
+ state.updated_at = new Date().toISOString();
317
+ await appendIntegrationEvent(teamName, 'worker_integration_failed', worker, {
318
+ worker_name: worker.name,
319
+ operation: details.operation,
320
+ source_commit: details.sourceCommit,
321
+ leader_head_before: details.leaderHeadBefore,
322
+ leader_head_after: leaderHeadAfter,
323
+ worktree_path: details.worktreePath,
324
+ summary: `${details.operation} for ${worker.name} reported success but leader HEAD did not advance`,
325
+ }, cwd);
326
+ appendIntegrationReport(teamName, {
327
+ workerName: worker.name,
328
+ operation: details.operation,
329
+ strategy: details.strategy,
330
+ files: [],
331
+ detail: `${details.operation} reported success for ${sourceShort}, but leader HEAD did not advance from ${leaderShort}; not marking worker as integrated.`,
332
+ }, cwd);
333
+ await sendIntegrationMessageToLeader(teamName, worker, `INTEGRATION FAILED: ${details.operation} for ${worker.name} reported success, but leader HEAD stayed at ${leaderShort}. Not emitting INTEGRATED; retry or inspect leader branch state before continuing.`, cwd);
334
+ }
335
+ async function emitCanonicalWorkerEvent(cwd, eventName, context) {
336
+ try {
337
+ const { buildNativeHookEvent } = await import('../hooks/extensibility/events.js');
338
+ const { dispatchHookEvent } = await import('../hooks/extensibility/dispatcher.js');
339
+ const event = buildNativeHookEvent(eventName, {
340
+ normalized_event: eventName,
341
+ scope: 'team-runtime',
342
+ ...context,
343
+ });
344
+ await dispatchHookEvent(event, { cwd });
345
+ }
346
+ catch {
347
+ // best effort only
348
+ }
349
+ }
350
+ function autoCommitDirtyWorktree(worker) {
351
+ const worktreePath = resolve(worker.worktree_path);
352
+ const repoRoot = resolve(worker.worktree_repo_root);
353
+ const status = runGitCommand(repoRoot, ['status', '--porcelain'], worktreePath);
354
+ if (!status.ok || !status.stdout.trim())
355
+ return { committed: false, commitHash: null };
356
+ const taskId = worker.assigned_tasks[0] || 'unknown';
357
+ const addResult = runGitCommand(repoRoot, ['add', '-A'], worktreePath);
358
+ if (!addResult.ok)
359
+ return { committed: false, commitHash: null };
360
+ const msg = `rcs(team): auto-checkpoint ${worker.name} [${taskId}]`;
361
+ const commitResult = runGitCommand(repoRoot, ['commit', '--no-verify', '-m', msg], worktreePath);
362
+ if (!commitResult.ok)
363
+ return { committed: false, commitHash: null };
364
+ const head = runGitCommand(repoRoot, ['rev-parse', 'HEAD'], worktreePath);
365
+ return { committed: true, commitHash: head.ok ? head.stdout : null };
366
+ }
367
+ function appendIntegrationReport(teamName, entry, cwd) {
368
+ const teamStateRoot = resolveCanonicalTeamStateRoot(cwd);
369
+ const reportPath = join(teamStateRoot, 'team', teamName, 'integration-report.md');
370
+ const dir = dirname(reportPath);
371
+ if (!existsSync(dir))
372
+ mkdirSync(dir, { recursive: true });
373
+ const timestamp = new Date().toISOString();
374
+ const line = `- [${timestamp}] ${entry.workerName}: ${entry.operation} conflict auto-resolved (${entry.strategy}) on files: ${entry.files.join(', ') || 'unknown'}. ${entry.detail}\n`;
375
+ appendFileSync(reportPath, existsSync(reportPath) ? line : `# Integration Report\n\n${line}`);
376
+ }
377
+ function resolveWorkerMergeRef(branchResult, workerHead) {
378
+ const branchRef = branchResult.ok ? branchResult.stdout.trim() : '';
379
+ if (!branchRef || branchRef === 'HEAD')
380
+ return workerHead;
381
+ return branchRef;
382
+ }
383
+ function leaderContainsCommit(repoRoot, cwd, commit) {
384
+ return runGitCommand(repoRoot, ['merge-base', '--is-ancestor', commit, 'HEAD'], cwd).ok;
385
+ }
386
+ async function integrateWorkerCommitsIntoLeader(params) {
387
+ const { teamName, config, previous, cwd } = params;
388
+ const next = { ...(previous?.integrationByWorker ?? {}) };
389
+ const leaderHeadAtCycleStart = resolveLeaderHead(resolve(config.workers[0]?.worktree_repo_root ?? cwd), cwd);
390
+ const integratedWorkerNames = new Set();
391
+ const commitHygieneEntries = [];
392
+ const artifactCwd = resolveTeamCommitHygieneArtifactCwd(config, cwd);
393
+ // ── Phase A: Auto-commit dirty worktrees ──
394
+ for (const worker of config.workers) {
395
+ if (!worker.worktree_repo_root || !worker.worktree_path || !existsSync(worker.worktree_path))
396
+ continue;
397
+ const { committed, commitHash } = autoCommitDirtyWorktree(worker);
398
+ if (committed) {
399
+ await appendIntegrationEvent(teamName, 'worker_auto_commit', worker, {
400
+ worker_name: worker.name,
401
+ commit_hash: commitHash,
402
+ worktree_path: resolve(worker.worktree_path),
403
+ summary: `auto-committed dirty worktree for ${worker.name}`,
404
+ }, cwd);
405
+ commitHygieneEntries.push({
406
+ recorded_at: new Date().toISOString(),
407
+ operation: 'auto_checkpoint',
408
+ worker_name: worker.name,
409
+ task_id: worker.assigned_tasks[0],
410
+ status: 'applied',
411
+ operational_commit: commitHash,
412
+ worktree_path: resolve(worker.worktree_path),
413
+ detail: 'Dirty worker worktree checkpointed before runtime integration.',
414
+ });
415
+ }
416
+ }
417
+ // ── Phase B: Integrate worker commits to leader (hybrid strategy) ──
418
+ for (const worker of config.workers) {
419
+ if (!worker.worktree_repo_root || !worker.worktree_path || !existsSync(worker.worktree_path))
420
+ continue;
421
+ const repoRoot = resolve(worker.worktree_repo_root);
422
+ const worktreePath = resolve(worker.worktree_path);
423
+ const leaderHead = resolveLeaderHead(repoRoot, cwd);
424
+ const workerHead = resolveWorkerHead(worktreePath);
425
+ const previousState = next[worker.name] ?? {};
426
+ const state = { ...previousState, last_leader_head: leaderHead ?? previousState.last_leader_head };
427
+ if (!workerHead || !leaderHead) {
428
+ next[worker.name] = state;
429
+ continue;
430
+ }
431
+ state.last_seen_head = workerHead;
432
+ const alreadyMerged = runGitCommand(repoRoot, ['merge-base', '--is-ancestor', workerHead, 'HEAD'], cwd).ok;
433
+ if (alreadyMerged) {
434
+ state.last_integrated_head = workerHead;
435
+ state.status = 'idle';
436
+ state.updated_at = new Date().toISOString();
437
+ next[worker.name] = state;
438
+ continue;
439
+ }
440
+ // Determine if worker is cleanly ahead of leader (merge) or diverged (cherry-pick)
441
+ const workerIsAheadOfLeader = runGitCommand(repoRoot, ['merge-base', '--is-ancestor', leaderHead, workerHead], cwd).ok;
442
+ if (workerIsAheadOfLeader) {
443
+ // Worker is cleanly ahead → merge --no-ff -X theirs
444
+ const workerBranch = runGitCommand(repoRoot, ['rev-parse', '--abbrev-ref', 'HEAD'], worktreePath);
445
+ const branchRef = resolveWorkerMergeRef(workerBranch, workerHead);
446
+ const merge = runGitCommand(repoRoot, ['merge', '--no-ff', '-X', 'theirs', '-m', `rcs(team): merge ${worker.name}`, branchRef], cwd);
447
+ if (merge.ok) {
448
+ const newLeaderHead = resolveLeaderHead(repoRoot, cwd) ?? leaderHead;
449
+ const workerIntegrated = leaderContainsCommit(repoRoot, cwd, workerHead);
450
+ if (!leaderHeadAdvanced(leaderHead, newLeaderHead)) {
451
+ await recordIntegrationFailure(teamName, worker, state, {
452
+ operation: 'merge',
453
+ sourceCommit: workerHead,
454
+ leaderHeadBefore: leaderHead,
455
+ leaderHeadAfter: newLeaderHead,
456
+ worktreePath,
457
+ strategy: '-X theirs',
458
+ }, cwd);
459
+ }
460
+ else if (workerIntegrated) {
461
+ state.last_integrated_head = workerHead;
462
+ state.last_leader_head = newLeaderHead;
463
+ state.status = 'integrated';
464
+ state.conflict_commit = undefined;
465
+ state.conflict_files = undefined;
466
+ state.updated_at = new Date().toISOString();
467
+ integratedWorkerNames.add(worker.name);
468
+ await appendIntegrationEvent(teamName, 'worker_merge_applied', worker, {
469
+ worker_name: worker.name,
470
+ worker_head: workerHead,
471
+ leader_head_before: leaderHead,
472
+ leader_head_after: newLeaderHead,
473
+ worktree_path: worktreePath,
474
+ summary: `merged ${worker.name} into leader via --no-ff -X theirs`,
475
+ }, cwd);
476
+ await sendIntegrationMessageToLeader(teamName, worker, `INTEGRATED: merged ${worker.name} (${workerHead.slice(0, 12)}) into leader HEAD ${newLeaderHead.slice(0, 12)} via merge --no-ff.`, cwd);
477
+ commitHygieneEntries.push({
478
+ recorded_at: new Date().toISOString(),
479
+ operation: 'integration_merge',
480
+ worker_name: worker.name,
481
+ task_id: worker.assigned_tasks[0],
482
+ status: 'applied',
483
+ operational_commit: newLeaderHead,
484
+ source_commit: workerHead,
485
+ leader_head_before: leaderHead,
486
+ leader_head_after: newLeaderHead,
487
+ worktree_path: worktreePath,
488
+ detail: 'Leader created a runtime merge commit to integrate worker history.',
489
+ });
490
+ }
491
+ else {
492
+ state.last_leader_head = newLeaderHead;
493
+ state.status = 'idle';
494
+ state.updated_at = new Date().toISOString();
495
+ appendIntegrationReport(teamName, {
496
+ workerName: worker.name,
497
+ operation: 'merge',
498
+ strategy: '-X theirs',
499
+ files: [],
500
+ detail: `merge reported success but leader HEAD did not advance cleanly (leader_before=${leaderHead.slice(0, 12)}, leader_after=${newLeaderHead.slice(0, 12)}, worker_integrated=${workerIntegrated}, merge_ref=${branchRef}).`,
501
+ }, cwd);
502
+ await sendIntegrationMessageToLeader(teamName, worker, `INTEGRATION NO-OP: merge for ${worker.name} using ${branchRef.slice(0, 12)} reported success but leader HEAD stayed ${newLeaderHead.slice(0, 12)}. Inspect ${worktreePath}.`, cwd);
503
+ commitHygieneEntries.push({
504
+ recorded_at: new Date().toISOString(),
505
+ operation: 'integration_merge',
506
+ worker_name: worker.name,
507
+ task_id: worker.assigned_tasks[0],
508
+ status: 'skipped',
509
+ operational_commit: newLeaderHead,
510
+ source_commit: workerHead,
511
+ leader_head_before: leaderHead,
512
+ leader_head_after: newLeaderHead,
513
+ worktree_path: worktreePath,
514
+ detail: 'Merge command reported success but leader HEAD did not advance or contain the worker commit; runtime refused to report false integration.',
515
+ });
516
+ }
517
+ }
518
+ else {
519
+ // Merge failed even with -X theirs (e.g. binary conflict) — abort and log
520
+ const conflictFiles = listConflictFiles(repoRoot, cwd);
521
+ runGitCommand(repoRoot, ['merge', '--abort'], cwd);
522
+ state.status = 'cherry_pick_conflict';
523
+ state.conflict_commit = workerHead;
524
+ state.conflict_files = conflictFiles;
525
+ state.updated_at = new Date().toISOString();
526
+ await appendIntegrationEvent(teamName, 'worker_merge_conflict', worker, {
527
+ worker_name: worker.name,
528
+ worker_head: workerHead,
529
+ leader_head: leaderHead,
530
+ worktree_path: worktreePath,
531
+ conflict_files: conflictFiles,
532
+ stderr: merge.stderr || merge.stdout,
533
+ summary: `merge conflict for ${worker.name} (auto-resolve failed)`,
534
+ }, cwd);
535
+ appendIntegrationReport(teamName, {
536
+ workerName: worker.name,
537
+ operation: 'merge',
538
+ strategy: '-X theirs',
539
+ files: conflictFiles,
540
+ detail: `merge --no-ff -X theirs failed; aborted. stderr: ${(merge.stderr || '').slice(0, 200)}`,
541
+ }, cwd);
542
+ await sendIntegrationMessageToLeader(teamName, worker, `CONFLICT AUTO-RESOLVED FAILED: ${worker.name}'s merge resolved with -X theirs failed on files: ${conflictFiles.join(', ') || 'unknown'}. Consider steering ${worker.name} to review these areas.`, cwd);
543
+ }
544
+ }
545
+ else {
546
+ // Diverged → cherry-pick individual commits with -X theirs
547
+ const baseline = state.last_integrated_head && runGitCommand(repoRoot, ['rev-parse', '--verify', state.last_integrated_head], worktreePath).ok
548
+ ? state.last_integrated_head
549
+ : leaderHead;
550
+ const commits = listCommitRange(repoRoot, baseline, workerHead, worktreePath);
551
+ if (commits.length === 0) {
552
+ next[worker.name] = state;
553
+ continue;
554
+ }
555
+ let allPicked = true;
556
+ for (const commit of commits) {
557
+ await appendIntegrationEvent(teamName, 'worker_cherry_pick_detected', worker, {
558
+ worker_name: worker.name,
559
+ worker_head: workerHead,
560
+ commit,
561
+ leader_head: resolveLeaderHead(repoRoot, cwd),
562
+ worktree_path: worktreePath,
563
+ summary: `detected worker commit ${commit.slice(0, 12)}`,
564
+ }, cwd);
565
+ const pick = runGitCommand(repoRoot, ['cherry-pick', '--allow-empty', '-X', 'theirs', commit], cwd);
566
+ if (!pick.ok) {
567
+ // Even -X theirs failed (binary conflict etc.) — abort this commit, log, continue
568
+ const conflictFiles = listConflictFiles(repoRoot, cwd);
569
+ runGitCommand(repoRoot, ['cherry-pick', '--abort'], cwd);
570
+ state.status = 'cherry_pick_conflict';
571
+ state.conflict_commit = commit;
572
+ state.conflict_files = conflictFiles;
573
+ state.updated_at = new Date().toISOString();
574
+ await appendIntegrationEvent(teamName, 'worker_cherry_pick_conflict', worker, {
575
+ worker_name: worker.name,
576
+ commit,
577
+ leader_head: leaderHead,
578
+ worktree_path: worktreePath,
579
+ conflict_files: conflictFiles,
580
+ stderr: pick.stderr || pick.stdout,
581
+ summary: `cherry-pick conflict for ${worker.name} at ${commit.slice(0, 12)} (auto-resolve failed)`,
582
+ }, cwd);
583
+ appendIntegrationReport(teamName, {
584
+ workerName: worker.name,
585
+ operation: 'cherry-pick',
586
+ strategy: '-X theirs',
587
+ files: conflictFiles,
588
+ detail: `cherry-pick -X theirs ${commit.slice(0, 12)} failed; aborted. stderr: ${(pick.stderr || '').slice(0, 200)}`,
589
+ }, cwd);
590
+ await sendIntegrationMessageToLeader(teamName, worker, `CONFLICT AUTO-RESOLVED FAILED: ${worker.name}'s cherry-pick ${commit.slice(0, 12)} with -X theirs failed on files: ${conflictFiles.join(', ') || 'unknown'}. Consider steering ${worker.name} to review these areas.`, cwd);
591
+ allPicked = false;
592
+ break;
593
+ }
594
+ const newLeaderHead = resolveLeaderHead(repoRoot, cwd) ?? leaderHead;
595
+ if (!leaderHeadAdvanced(leaderHead, newLeaderHead)) {
596
+ await recordIntegrationFailure(teamName, worker, state, {
597
+ operation: 'cherry-pick',
598
+ sourceCommit: commit,
599
+ leaderHeadBefore: leaderHead,
600
+ leaderHeadAfter: newLeaderHead,
601
+ worktreePath,
602
+ strategy: '-X theirs',
603
+ }, cwd);
604
+ allPicked = false;
605
+ break;
606
+ }
607
+ state.last_integrated_head = commit;
608
+ state.last_leader_head = newLeaderHead;
609
+ state.status = 'integrated';
610
+ state.conflict_commit = undefined;
611
+ state.conflict_files = undefined;
612
+ state.updated_at = new Date().toISOString();
613
+ await appendIntegrationEvent(teamName, 'worker_cherry_pick_applied', worker, {
614
+ worker_name: worker.name,
615
+ commit,
616
+ leader_head_before: leaderHead,
617
+ leader_head_after: newLeaderHead,
618
+ worktree_path: worktreePath,
619
+ summary: `cherry-picked ${commit.slice(0, 12)} from ${worker.name} with -X theirs`,
620
+ }, cwd);
621
+ await sendIntegrationMessageToLeader(teamName, worker, `INTEGRATED: cherry-picked ${commit.slice(0, 12)} from ${worker.name} into leader HEAD ${newLeaderHead.slice(0, 12)} (-X theirs).`, cwd);
622
+ commitHygieneEntries.push({
623
+ recorded_at: new Date().toISOString(),
624
+ operation: 'integration_cherry_pick',
625
+ worker_name: worker.name,
626
+ task_id: worker.assigned_tasks[0],
627
+ status: 'applied',
628
+ operational_commit: newLeaderHead,
629
+ source_commit: commit,
630
+ leader_head_before: leaderHead,
631
+ leader_head_after: newLeaderHead,
632
+ worktree_path: worktreePath,
633
+ detail: 'Leader created a runtime cherry-pick commit while integrating diverged worker history.',
634
+ });
635
+ }
636
+ if (allPicked) {
637
+ integratedWorkerNames.add(worker.name);
638
+ }
639
+ }
640
+ next[worker.name] = state;
641
+ }
642
+ // ── Phase C: Cross-worker rebase (idle/done/failed workers onto new leader) ──
643
+ const newLeaderHead = resolveLeaderHead(resolve(config.workers[0]?.worktree_repo_root ?? cwd), cwd);
644
+ if (newLeaderHead && leaderHeadAtCycleStart && newLeaderHead !== leaderHeadAtCycleStart) {
645
+ for (const worker of config.workers) {
646
+ if (!worker.worktree_repo_root || !worker.worktree_path || !existsSync(worker.worktree_path))
647
+ continue;
648
+ // Note: do NOT skip integratedWorkerNames here — cherry-picked workers need
649
+ // rebase to pick up other workers' changes that landed on leader in the same cycle.
650
+ const repoRoot = resolve(worker.worktree_repo_root);
651
+ const worktreePath = resolve(worker.worktree_path);
652
+ // Only rebase idle/done/failed workers to avoid race conditions
653
+ const workerStatus = await readWorkerStatus(teamName, worker.name, cwd);
654
+ const rebaseEligibleStates = new Set(['idle', 'done', 'failed']);
655
+ if (!rebaseEligibleStates.has(workerStatus.state)) {
656
+ await appendIntegrationEvent(teamName, 'worker_cross_rebase_skipped', worker, {
657
+ worker_name: worker.name,
658
+ worker_state: workerStatus.state,
659
+ leader_head: newLeaderHead,
660
+ worktree_path: worktreePath,
661
+ summary: `skipped cross-rebase for ${worker.name} (state: ${workerStatus.state})`,
662
+ }, cwd);
663
+ continue;
664
+ }
665
+ // Skip if worktree is dirty (will auto-commit next cycle, then rebase)
666
+ const statusCheck = runGitCommand(repoRoot, ['status', '--porcelain'], worktreePath);
667
+ if (statusCheck.ok && statusCheck.stdout.trim()) {
668
+ await appendIntegrationEvent(teamName, 'worker_cross_rebase_skipped', worker, {
669
+ worker_name: worker.name,
670
+ reason: 'dirty_worktree',
671
+ leader_head: newLeaderHead,
672
+ worktree_path: worktreePath,
673
+ summary: `skipped cross-rebase for ${worker.name} (dirty worktree)`,
674
+ }, cwd);
675
+ continue;
676
+ }
677
+ // Rebase with -X ours (in rebase context, "ours" = upstream = leader wins)
678
+ const workerHeadBeforeRebase = resolveWorkerHead(worktreePath);
679
+ const rebase = runGitCommand(repoRoot, ['rebase', '-X', 'ours', newLeaderHead], worktreePath);
680
+ if (rebase.ok) {
681
+ const workerHeadAfterRebase = resolveWorkerHead(worktreePath);
682
+ const state = next[worker.name] ?? {};
683
+ state.last_rebased_leader_head = newLeaderHead;
684
+ state.status = 'idle';
685
+ state.conflict_commit = undefined;
686
+ state.conflict_files = undefined;
687
+ state.updated_at = new Date().toISOString();
688
+ next[worker.name] = state;
689
+ await appendIntegrationEvent(teamName, 'worker_cross_rebase_applied', worker, {
690
+ worker_name: worker.name,
691
+ leader_head: newLeaderHead,
692
+ worktree_path: worktreePath,
693
+ summary: `cross-rebased ${worker.name} onto ${newLeaderHead.slice(0, 12)} (-X ours)`,
694
+ }, cwd);
695
+ commitHygieneEntries.push({
696
+ recorded_at: new Date().toISOString(),
697
+ operation: 'cross_rebase',
698
+ worker_name: worker.name,
699
+ task_id: worker.assigned_tasks[0],
700
+ status: 'applied',
701
+ operational_commit: workerHeadAfterRebase,
702
+ leader_head_after: newLeaderHead,
703
+ worker_head_before: workerHeadBeforeRebase,
704
+ worker_head_after: workerHeadAfterRebase,
705
+ worktree_path: worktreePath,
706
+ detail: 'Runtime rebase rewrote worker history onto the updated leader head.',
707
+ });
708
+ }
709
+ else {
710
+ // Rebase failed — abort to restore worktree, log for retry next cycle
711
+ const conflictFiles = listConflictFiles(repoRoot, worktreePath);
712
+ runGitCommand(repoRoot, ['rebase', '--abort'], worktreePath);
713
+ await appendIntegrationEvent(teamName, 'worker_cross_rebase_conflict', worker, {
714
+ worker_name: worker.name,
715
+ leader_head: newLeaderHead,
716
+ worktree_path: worktreePath,
717
+ conflict_files: conflictFiles,
718
+ stderr: rebase.stderr || rebase.stdout,
719
+ summary: `cross-rebase conflict for ${worker.name} onto ${newLeaderHead.slice(0, 12)} (aborted, will retry)`,
720
+ }, cwd);
721
+ appendIntegrationReport(teamName, {
722
+ workerName: worker.name,
723
+ operation: 'rebase',
724
+ strategy: '-X ours',
725
+ files: conflictFiles,
726
+ detail: `rebase -X ours onto ${newLeaderHead.slice(0, 12)} failed; aborted. Will retry next cycle.`,
727
+ }, cwd);
728
+ await sendIntegrationMessageToLeader(teamName, worker, `CONFLICT AUTO-RESOLVED FAILED: ${worker.name}'s rebase onto ${newLeaderHead.slice(0, 12)} with -X ours failed on files: ${conflictFiles.join(', ') || 'unknown'}. Consider steering ${worker.name} to review these areas.`, cwd);
729
+ }
730
+ }
731
+ }
732
+ if (commitHygieneEntries.length > 0) {
733
+ await appendTeamCommitHygieneEntries(teamName, commitHygieneEntries, artifactCwd);
734
+ }
735
+ return next;
736
+ }
737
+ function renderWorktreeMergeReport(report) {
738
+ const lines = [
739
+ `# Worker ${report.workerName} shutdown report`,
740
+ '',
741
+ `- worktree: ${report.worktreePath}`,
742
+ `- report_path: ${report.reportPath}`,
743
+ `- source_ref: ${report.sourceRef ?? 'none'}`,
744
+ `- synthetic_commit: ${report.syntheticCommit ?? 'none'}`,
745
+ `- merge_outcome: ${report.mergeOutcome}`,
746
+ `- merge_detail: ${report.mergeDetail}`,
747
+ `- leader_head_before: ${report.leaderHeadBefore ?? 'none'}`,
748
+ `- leader_head_after: ${report.leaderHeadAfter ?? 'none'}`,
749
+ '',
750
+ '## Summary',
751
+ report.summaryText ?? 'sparkshell summary unavailable; using raw diff fallback.',
752
+ '',
753
+ '## Diff',
754
+ report.diffText || '(no diff output)',
755
+ '',
756
+ ];
757
+ return lines.join('\n');
758
+ }
759
+ async function prepareShutdownMergeReport(worker, leaderCwd) {
760
+ if (!worker.worktree_repo_root || !worker.worktree_path || !existsSync(worker.worktree_path)) {
761
+ return null;
762
+ }
763
+ const worktreePath = resolve(worker.worktree_path);
764
+ const repoRoot = resolve(worker.worktree_repo_root);
765
+ const statusBefore = runGitCommand(repoRoot, ['status', '--porcelain'], worktreePath);
766
+ const hadChanges = statusBefore.ok && statusBefore.stdout.length > 0;
767
+ let syntheticCommit = null;
768
+ if (hadChanges) {
769
+ const addResult = runGitCommand(repoRoot, ['add', '-A'], worktreePath);
770
+ if (!addResult.ok) {
771
+ return {
772
+ workerName: worker.name,
773
+ worktreePath,
774
+ reportPath: join(worktreePath, '.rcs', 'diff.md'),
775
+ sourceRef: null,
776
+ syntheticCommit: null,
777
+ diffText: getWorktreeDiffText(worktreePath),
778
+ summaryText: null,
779
+ mergeOutcome: 'skipped',
780
+ mergeDetail: addResult.stderr || 'git add -A failed',
781
+ leaderHeadBefore: resolveLeaderHead(repoRoot, leaderCwd),
782
+ leaderHeadAfter: resolveLeaderHead(repoRoot, leaderCwd),
783
+ };
784
+ }
785
+ const commitResult = runGitCommand(repoRoot, ['commit', '--no-verify', '-m', `rcs(team): checkpoint ${worker.name} shutdown changes`], worktreePath);
786
+ if (commitResult.ok) {
787
+ const revParse = runGitCommand(repoRoot, ['rev-parse', 'HEAD'], worktreePath);
788
+ syntheticCommit = revParse.ok && revParse.stdout ? revParse.stdout : null;
789
+ }
790
+ else if (!/nothing to commit/i.test(commitResult.stderr)) {
791
+ return {
792
+ workerName: worker.name,
793
+ worktreePath,
794
+ reportPath: join(worktreePath, '.rcs', 'diff.md'),
795
+ sourceRef: null,
796
+ syntheticCommit: null,
797
+ diffText: getWorktreeDiffText(worktreePath),
798
+ summaryText: null,
799
+ mergeOutcome: 'skipped',
800
+ mergeDetail: commitResult.stderr || 'git commit failed',
801
+ leaderHeadBefore: resolveLeaderHead(repoRoot, leaderCwd),
802
+ leaderHeadAfter: resolveLeaderHead(repoRoot, leaderCwd),
803
+ };
804
+ }
805
+ }
806
+ const sourceRefResult = runGitCommand(repoRoot, ['rev-parse', 'HEAD'], worktreePath);
807
+ const sourceRef = sourceRefResult.ok && sourceRefResult.stdout ? sourceRefResult.stdout : null;
808
+ const diffText = getWorktreeDiffText(worktreePath);
809
+ const summaryText = summarizeWorktreeDiffWithSparkShell(worktreePath);
810
+ const reportPath = join(worktreePath, '.rcs', 'diff.md');
811
+ const leaderHeadBefore = resolveLeaderHead(repoRoot, leaderCwd);
812
+ let mergeOutcome = 'skipped';
813
+ let mergeDetail = 'worktree merge skipped';
814
+ let leaderHeadAfter = leaderHeadBefore;
815
+ if (sourceRef) {
816
+ const alreadyMerged = runGitCommand(repoRoot, ['merge-base', '--is-ancestor', sourceRef, 'HEAD'], leaderCwd);
817
+ if (alreadyMerged.ok) {
818
+ mergeOutcome = 'noop';
819
+ mergeDetail = 'source already reachable from leader HEAD';
820
+ }
821
+ else {
822
+ const mergeResult = runGitCommand(repoRoot, ['merge', '--no-ff', '--no-edit', sourceRef], leaderCwd);
823
+ if (mergeResult.ok) {
824
+ mergeOutcome = 'merged';
825
+ mergeDetail = mergeResult.stdout || 'merged successfully';
826
+ leaderHeadAfter = resolveLeaderHead(repoRoot, leaderCwd) ?? leaderHeadBefore;
827
+ }
828
+ else {
829
+ mergeOutcome = 'conflict';
830
+ mergeDetail = mergeResult.stderr || mergeResult.stdout || 'merge failed';
831
+ runGitCommand(repoRoot, ['merge', '--abort'], leaderCwd);
832
+ leaderHeadAfter = resolveLeaderHead(repoRoot, leaderCwd) ?? leaderHeadBefore;
833
+ }
834
+ }
835
+ }
836
+ const report = {
837
+ workerName: worker.name,
838
+ worktreePath,
839
+ reportPath,
840
+ sourceRef,
841
+ syntheticCommit,
842
+ diffText,
843
+ summaryText,
844
+ mergeOutcome,
845
+ mergeDetail,
846
+ leaderHeadBefore,
847
+ leaderHeadAfter,
848
+ };
849
+ await mkdir(join(worktreePath, '.rcs'), { recursive: true });
850
+ await writeFile(reportPath, renderWorktreeMergeReport(report), 'utf-8');
851
+ process.stdout.write(`${renderWorktreeMergeReport(report)}\n`);
852
+ return report;
853
+ }
854
+ async function prepareWorkerWorktreeShutdownReports(config, leaderCwd) {
855
+ const reports = [];
856
+ for (const worker of config.workers) {
857
+ if (!worker.worktree_path || !worker.worktree_repo_root)
858
+ continue;
859
+ try {
860
+ const report = await prepareShutdownMergeReport(worker, leaderCwd);
861
+ if (report)
862
+ reports.push(report);
863
+ }
864
+ catch (error) {
865
+ const worktreePath = resolve(worker.worktree_path);
866
+ const reportPath = join(worktreePath, '.rcs', 'diff.md');
867
+ const fallback = [
868
+ `# Worker ${worker.name} shutdown report`,
869
+ '',
870
+ `- worktree: ${worktreePath}`,
871
+ `- report_path: ${reportPath}`,
872
+ '- merge_outcome: skipped',
873
+ `- merge_detail: ${String(error)}`,
874
+ '',
875
+ ].join('\n');
876
+ await mkdir(join(worktreePath, '.rcs'), { recursive: true }).catch(() => { });
877
+ await writeFile(reportPath, fallback, 'utf-8').catch(() => { });
878
+ process.stdout.write(`${fallback}\n`);
879
+ }
880
+ }
881
+ return reports;
882
+ }
883
+ function listDirtyShutdownWorkers(config) {
884
+ const dirtyWorkers = [];
885
+ for (const worker of config.workers) {
886
+ if (!worker.worktree_repo_root || !worker.worktree_path || !existsSync(worker.worktree_path))
887
+ continue;
888
+ const worktreePath = resolve(worker.worktree_path);
889
+ const repoRoot = resolve(worker.worktree_repo_root);
890
+ const status = runGitCommand(repoRoot, ['status', '--porcelain'], worktreePath);
891
+ if (!status.ok || status.stdout.trim().length > 0) {
892
+ dirtyWorkers.push(worker.name);
893
+ }
894
+ }
895
+ return dirtyWorkers;
896
+ }
897
+ async function classifyShutdown(params) {
898
+ const { teamName, cwd, config, governance, confirmIssues } = params;
899
+ const allTasks = await listTasks(teamName, cwd);
900
+ const gate = {
901
+ total: allTasks.length,
902
+ pending: allTasks.filter((t) => t.status === 'pending').length,
903
+ blocked: allTasks.filter((t) => t.status === 'blocked').length,
904
+ in_progress: allTasks.filter((t) => t.status === 'in_progress').length,
905
+ completed: allTasks.filter((t) => t.status === 'completed').length,
906
+ failed: allTasks.filter((t) => t.status === 'failed').length,
907
+ allowed: false,
908
+ };
909
+ const dirtyWorkers = listDirtyShutdownWorkers(config);
910
+ const hasBlockingBacklog = gate.pending > 0 || gate.blocked > 0 || gate.in_progress > 0;
911
+ const requiresIssueConfirmation = gate.failed > 0 && dirtyWorkers.length === 0 && !confirmIssues;
912
+ gate.allowed = governance.cleanup_requires_all_workers_inactive !== true
913
+ || (!hasBlockingBacklog && !requiresIssueConfirmation);
914
+ return {
915
+ gate,
916
+ dirtyWorkers,
917
+ requiresIssueConfirmation,
918
+ useCleanFastPath: dirtyWorkers.length === 0 && !hasBlockingBacklog && (gate.failed === 0 || confirmIssues),
919
+ };
920
+ }
921
+ function resolveEffectiveTeamWorktreeMode(leaderCwd, requestedMode) {
922
+ if (!isGitRepository(leaderCwd)) {
923
+ return { enabled: false };
924
+ }
925
+ if (requestedMode?.enabled)
926
+ return requestedMode;
927
+ try {
928
+ const probe = planWorktreeTarget({
929
+ cwd: leaderCwd,
930
+ scope: 'team',
931
+ mode: { enabled: true, detached: true, name: null },
932
+ teamName: 'probe',
933
+ workerName: 'worker-1',
934
+ });
935
+ if (probe.enabled) {
936
+ return { enabled: true, detached: true, name: null };
937
+ }
938
+ }
939
+ catch {
940
+ // Non-git directories should keep legacy single-workspace behavior.
941
+ }
942
+ return { enabled: false };
943
+ }
944
+ const MODEL_INSTRUCTIONS_FILE_ENV = 'RCS_MODEL_INSTRUCTIONS_FILE';
945
+ const TEAM_STATE_ROOT_ENV = 'RCS_TEAM_STATE_ROOT';
946
+ const TEAM_LEADER_CWD_ENV = 'RCS_TEAM_LEADER_CWD';
947
+ const WORKTREE_TRIGGER_STATE_ROOT = '$RCS_TEAM_STATE_ROOT';
948
+ const STARTUP_EVIDENCE_TIMEOUT_MS = 15_000;
949
+ const STARTUP_EVIDENCE_POLL_MS = 100;
950
+ const STARTUP_EVIDENCE_LAUNCH_TIMEOUT_MS = 45_000;
951
+ const STARTUP_TIMING_LOG_VERSION = 1;
952
+ function createStartupTimingRecorder(teamName, cwd) {
953
+ const startedAt = performance.now();
954
+ const events = [];
955
+ return {
956
+ mark: (phase, details = {}) => {
957
+ events.push({
958
+ phase,
959
+ at: new Date().toISOString(),
960
+ elapsed_ms: Math.round((performance.now() - startedAt) * 1000) / 1000,
961
+ ...details,
962
+ });
963
+ },
964
+ flush: async () => {
965
+ const timingPath = join(cwd, '.rcs', 'state', 'team', teamName, 'startup-timing.json');
966
+ await writeAtomic(timingPath, JSON.stringify({ schema_version: STARTUP_TIMING_LOG_VERSION, team_name: teamName, events }, null, 2)).catch(() => { });
967
+ for (const event of events) {
968
+ await appendTeamDeliveryLogForCwd(cwd, {
969
+ event: 'dispatch_result',
970
+ source: 'team.runtime.startup-timing',
971
+ team: teamName,
972
+ result: event.ok === false ? 'failed' : 'ok',
973
+ phase: event.phase,
974
+ elapsed_ms: event.elapsed_ms,
975
+ to_worker: event.worker,
976
+ pane_id: event.pane_id,
977
+ reason: event.reason,
978
+ transport: event.transport,
979
+ request_id: event.request_id,
980
+ });
981
+ }
982
+ },
983
+ };
984
+ }
985
+ const promptWorkerRegistry = new Map();
986
+ const previousModelInstructionsFileByTeam = new Map();
987
+ const PROMPT_WORKER_SIGTERM_WAIT_MS = 3_000;
988
+ const PROMPT_WORKER_SIGKILL_WAIT_MS = 2_000;
989
+ const PROMPT_WORKER_EXIT_POLL_MS = 100;
990
+ const STARTUP_DISPATCH_RETRIES = 3;
991
+ const STARTUP_DISPATCH_RETRY_DELAY_S = 3;
992
+ const PROMPT_MODE_CODEX_UNSUPPORTED_REASON = 'prompt_mode_codex_requires_tty';
993
+ // Test-only escape hatch for fake prompt workers that intentionally do not require a real TTY.
994
+ const PROMPT_MODE_CODEX_TEST_ALLOW_ENV = 'RCS_TEST_ALLOW_NONTTY_CODEX_PROMPT';
995
+ function resolveInstructionStateRoot(worktreePath) {
996
+ return worktreePath ? WORKTREE_TRIGGER_STATE_ROOT : undefined;
997
+ }
998
+ function assertPromptModeWorkerCliSupported(workerCliPlan) {
999
+ if (workerCliPlan.some((workerCli) => workerCli === 'codex')
1000
+ && process.env[PROMPT_MODE_CODEX_TEST_ALLOW_ENV] !== '1') {
1001
+ throw new Error(`${PROMPT_MODE_CODEX_UNSUPPORTED_REASON}: Codex prompt workers require a terminal; use interactive team mode or set RCS_TEAM_WORKER_CLI=claude/gemini for prompt-mode teammates.`);
1002
+ }
1003
+ }
1004
+ function resolveWorkerReadyTimeoutMs(env) {
1005
+ const raw = env.RCS_TEAM_READY_TIMEOUT_MS;
1006
+ const parsed = Number.parseInt(String(raw ?? ''), 10);
1007
+ if (Number.isFinite(parsed) && parsed >= 5_000)
1008
+ return parsed;
1009
+ return 45_000;
1010
+ }
1011
+ function resolveWorkerStartupEvidenceTimeoutMs(env, workerReadyTimeoutMs) {
1012
+ const raw = Number.parseInt(String(env.RCS_TEAM_STARTUP_EVIDENCE_TIMEOUT_MS ?? ''), 10);
1013
+ if (Number.isFinite(raw) && raw >= 500)
1014
+ return raw;
1015
+ return Math.max(STARTUP_EVIDENCE_TIMEOUT_MS, Math.min(workerReadyTimeoutMs, STARTUP_EVIDENCE_LAUNCH_TIMEOUT_MS));
1016
+ }
1017
+ function resolveStartupDispatchRetries(env) {
1018
+ const parsed = Number.parseInt(String(env.RCS_TEAM_STARTUP_DISPATCH_RETRIES ?? ''), 10);
1019
+ if (!Number.isFinite(parsed))
1020
+ return STARTUP_DISPATCH_RETRIES;
1021
+ return Math.max(1, Math.min(STARTUP_DISPATCH_RETRIES, Math.floor(parsed)));
1022
+ }
1023
+ function resolveStartupDispatchRetryDelayS(env) {
1024
+ const parsed = Number.parseInt(String(env.RCS_TEAM_STARTUP_DISPATCH_RETRY_DELAY_MS ?? ''), 10);
1025
+ if (!Number.isFinite(parsed))
1026
+ return STARTUP_DISPATCH_RETRY_DELAY_S;
1027
+ return Math.max(0, Math.min(STARTUP_DISPATCH_RETRY_DELAY_S, Math.floor(parsed) / 1000));
1028
+ }
1029
+ function parseTeamWorkerContext(raw) {
1030
+ if (typeof raw !== 'string' || raw.trim() === '')
1031
+ return null;
1032
+ const [teamName, workerName] = raw.trim().split('/');
1033
+ if (!teamName || !workerName)
1034
+ return null;
1035
+ return { teamName, workerName };
1036
+ }
1037
+ function resolveManifestLookupCwds(cwd) {
1038
+ const candidates = new Set([resolve(cwd)]);
1039
+ const leaderCwd = process.env[TEAM_LEADER_CWD_ENV];
1040
+ if (typeof leaderCwd === 'string' && leaderCwd.trim() !== '') {
1041
+ candidates.add(resolve(leaderCwd));
1042
+ }
1043
+ const teamStateRoot = process.env[TEAM_STATE_ROOT_ENV];
1044
+ if (typeof teamStateRoot === 'string' && teamStateRoot.trim() !== '') {
1045
+ candidates.add(resolve(teamStateRoot, '..', '..'));
1046
+ }
1047
+ return [...candidates];
1048
+ }
1049
+ function resolveGovernancePolicy(governance, legacyPolicy) {
1050
+ return normalizeTeamGovernance(governance, legacyPolicy);
1051
+ }
1052
+ async function assertNestedTeamAllowed(cwd) {
1053
+ const workerContext = parseTeamWorkerContext(process.env.RCS_TEAM_INTERNAL_WORKER || process.env.RCS_TEAM_WORKER);
1054
+ if (!workerContext)
1055
+ return;
1056
+ for (const candidateCwd of resolveManifestLookupCwds(cwd)) {
1057
+ const manifest = await readTeamManifestV2(workerContext.teamName, candidateCwd);
1058
+ const governance = resolveGovernancePolicy(manifest?.governance);
1059
+ if (governance.nested_teams_allowed)
1060
+ return;
1061
+ if (manifest)
1062
+ break;
1063
+ }
1064
+ throw new Error('nested_team_disallowed');
1065
+ }
1066
+ async function readWorkerStartupEvidence(teamName, workerName, cwd) {
1067
+ const status = await readWorkerStatus(teamName, workerName, cwd);
1068
+ if (typeof status.current_task_id === 'string' && status.current_task_id.trim() !== '') {
1069
+ return 'task_claim';
1070
+ }
1071
+ if (status.state === 'working' || status.state === 'blocked' || status.state === 'done' || status.state === 'failed') {
1072
+ return 'worker_progress';
1073
+ }
1074
+ const leaderMailbox = await listMailboxMessages(teamName, 'leader-fixed', cwd).catch(() => []);
1075
+ if (leaderMailbox.some((message) => message?.from_worker === workerName)) {
1076
+ return 'leader_ack';
1077
+ }
1078
+ return 'none';
1079
+ }
1080
+ function doesStartupEvidenceSettle(workerCli, evidence) {
1081
+ if (evidence === 'none')
1082
+ return false;
1083
+ if (workerCli === 'codex' && evidence === 'leader_ack')
1084
+ return false;
1085
+ return true;
1086
+ }
1087
+ export async function waitForWorkerStartupEvidence(params) {
1088
+ const timeoutMs = Math.max(0, Math.floor(params.timeoutMs ?? STARTUP_EVIDENCE_TIMEOUT_MS));
1089
+ const pollMs = Math.max(25, Math.floor(params.pollMs ?? STARTUP_EVIDENCE_POLL_MS));
1090
+ const deadline = Date.now() + timeoutMs;
1091
+ while (true) {
1092
+ const evidence = await readWorkerStartupEvidence(params.teamName, params.workerName, params.cwd);
1093
+ if (doesStartupEvidenceSettle(params.workerCli, evidence))
1094
+ return evidence;
1095
+ if (Date.now() >= deadline)
1096
+ return 'none';
1097
+ await new Promise((resolve) => setTimeout(resolve, pollMs));
1098
+ }
1099
+ }
1100
+ export async function waitForClaudeStartupEvidence(params) {
1101
+ return await waitForWorkerStartupEvidence({ ...params, workerCli: 'claude' });
1102
+ }
1103
+ function shouldSkipWorkerReadyWait(env) {
1104
+ return env.RCS_TEAM_SKIP_READY_WAIT === '1';
1105
+ }
1106
+ function isRecoverableInteractiveStartupReason(reason) {
1107
+ const normalized = reason.trim().toLowerCase();
1108
+ return normalized.includes('startup_no_evidence')
1109
+ || normalized.includes('fallback_attempted_but_unconfirmed')
1110
+ || normalized.includes('ready_prompt_timeout');
1111
+ }
1112
+ async function recordRecoverableStartupIssue(params) {
1113
+ const { teamName, workerName, taskIds, reason, cwd } = params;
1114
+ const updatedAt = new Date().toISOString();
1115
+ await writeWorkerStatus(teamName, workerName, {
1116
+ state: 'unknown',
1117
+ current_task_id: taskIds[0],
1118
+ reason,
1119
+ updated_at: updatedAt,
1120
+ }, cwd).catch(() => { });
1121
+ await appendTeamEvent(teamName, {
1122
+ type: 'worker_state_changed',
1123
+ worker: workerName,
1124
+ state: 'unknown',
1125
+ prev_state: 'unknown',
1126
+ task_id: taskIds[0],
1127
+ reason,
1128
+ }, cwd).catch(() => { });
1129
+ }
1130
+ async function recordPromptStartupWorkerStopped(params) {
1131
+ const { teamName, workerName, taskIds, reason, cwd } = params;
1132
+ const updatedAt = new Date().toISOString();
1133
+ await writeWorkerStatus(teamName, workerName, {
1134
+ state: 'failed',
1135
+ current_task_id: taskIds[0],
1136
+ reason,
1137
+ updated_at: updatedAt,
1138
+ }, cwd).catch(() => { });
1139
+ await appendTeamEvent(teamName, {
1140
+ type: 'worker_stopped',
1141
+ worker: workerName,
1142
+ task_id: taskIds[0],
1143
+ reason,
1144
+ }, cwd).catch(() => { });
1145
+ }
1146
+ function setTeamModelInstructionsFile(teamName, filePath) {
1147
+ if (!previousModelInstructionsFileByTeam.has(teamName)) {
1148
+ previousModelInstructionsFileByTeam.set(teamName, process.env[MODEL_INSTRUCTIONS_FILE_ENV]);
1149
+ }
1150
+ process.env[MODEL_INSTRUCTIONS_FILE_ENV] = filePath;
1151
+ }
1152
+ function restoreTeamModelInstructionsFile(teamName) {
1153
+ if (!previousModelInstructionsFileByTeam.has(teamName))
1154
+ return;
1155
+ const previous = previousModelInstructionsFileByTeam.get(teamName);
1156
+ previousModelInstructionsFileByTeam.delete(teamName);
1157
+ if (typeof previous === 'string') {
1158
+ process.env[MODEL_INSTRUCTIONS_FILE_ENV] = previous;
1159
+ return;
1160
+ }
1161
+ delete process.env[MODEL_INSTRUCTIONS_FILE_ENV];
1162
+ }
1163
+ function registerPromptWorkerHandle(teamName, workerName, child) {
1164
+ const { pid } = child;
1165
+ if (!Number.isFinite(pid) || (pid ?? 0) < 1) {
1166
+ throw new Error(`failed to spawn prompt worker process for ${workerName}`);
1167
+ }
1168
+ const processPid = pid;
1169
+ const existingTeamHandles = promptWorkerRegistry.get(teamName) ?? new Map();
1170
+ existingTeamHandles.set(workerName, {
1171
+ child,
1172
+ pid: processPid,
1173
+ processGroupId: process.platform !== 'win32' ? processPid : null,
1174
+ });
1175
+ promptWorkerRegistry.set(teamName, existingTeamHandles);
1176
+ child.on('exit', () => {
1177
+ const teamHandles = promptWorkerRegistry.get(teamName);
1178
+ if (!teamHandles)
1179
+ return;
1180
+ const handle = teamHandles.get(workerName);
1181
+ if (handle?.processGroupId && isProcessGroupAlive(handle.processGroupId)) {
1182
+ return;
1183
+ }
1184
+ teamHandles.delete(workerName);
1185
+ if (teamHandles.size === 0)
1186
+ promptWorkerRegistry.delete(teamName);
1187
+ });
1188
+ }
1189
+ function getPromptWorkerHandle(teamName, workerName) {
1190
+ return promptWorkerRegistry.get(teamName)?.get(workerName) ?? null;
1191
+ }
1192
+ function removePromptWorkerHandle(teamName, workerName) {
1193
+ const teamHandles = promptWorkerRegistry.get(teamName);
1194
+ if (!teamHandles)
1195
+ return;
1196
+ teamHandles.delete(workerName);
1197
+ if (teamHandles.size === 0)
1198
+ promptWorkerRegistry.delete(teamName);
1199
+ }
1200
+ function isPidAlive(pid) {
1201
+ if (!Number.isFinite(pid) || pid <= 0)
1202
+ return false;
1203
+ try {
1204
+ process.kill(pid, 0);
1205
+ return true;
1206
+ }
1207
+ catch (err) {
1208
+ if (err.code === 'ESRCH')
1209
+ return false;
1210
+ process.stderr.write(`[team/runtime] operation failed: ${err}\n`);
1211
+ return false;
1212
+ }
1213
+ }
1214
+ function isProcessGroupAlive(processGroupId) {
1215
+ if (process.platform === 'win32')
1216
+ return false;
1217
+ if (!Number.isFinite(processGroupId) || processGroupId <= 0)
1218
+ return false;
1219
+ try {
1220
+ process.kill(-processGroupId, 0);
1221
+ return true;
1222
+ }
1223
+ catch (err) {
1224
+ if (err.code === 'ESRCH')
1225
+ return false;
1226
+ process.stderr.write(`[team/runtime] operation failed: ${err}\n`);
1227
+ return false;
1228
+ }
1229
+ }
1230
+ function listProcessTreeEntries() {
1231
+ if (process.platform === 'win32')
1232
+ return [];
1233
+ const result = spawnSync('ps', ['axww', '-o', 'pid=,ppid='], {
1234
+ encoding: 'utf-8',
1235
+ windowsHide: true,
1236
+ });
1237
+ if (result.status !== 0 || typeof result.stdout !== 'string')
1238
+ return [];
1239
+ return result.stdout
1240
+ .split(/\r?\n/)
1241
+ .map((line) => line.trim())
1242
+ .filter(Boolean)
1243
+ .map((line) => {
1244
+ const match = line.match(/^(\d+)\s+(\d+)$/);
1245
+ if (!match)
1246
+ return null;
1247
+ const pid = Number.parseInt(match[1], 10);
1248
+ const ppid = Number.parseInt(match[2], 10);
1249
+ if (!Number.isFinite(pid) || pid <= 0)
1250
+ return null;
1251
+ if (!Number.isFinite(ppid) || ppid < 0)
1252
+ return null;
1253
+ return { pid, ppid };
1254
+ })
1255
+ .filter((entry) => entry !== null);
1256
+ }
1257
+ function collectProcessTreePids(rootPid) {
1258
+ if (!Number.isFinite(rootPid) || rootPid <= 0)
1259
+ return [];
1260
+ const childrenByPid = new Map();
1261
+ for (const entry of listProcessTreeEntries()) {
1262
+ const siblings = childrenByPid.get(entry.ppid) ?? [];
1263
+ siblings.push(entry.pid);
1264
+ childrenByPid.set(entry.ppid, siblings);
1265
+ }
1266
+ const ordered = [];
1267
+ const stack = [rootPid];
1268
+ const seen = new Set();
1269
+ while (stack.length > 0) {
1270
+ const pid = stack.pop();
1271
+ if (seen.has(pid))
1272
+ continue;
1273
+ seen.add(pid);
1274
+ ordered.push(pid);
1275
+ for (const childPid of childrenByPid.get(pid) ?? []) {
1276
+ if (!seen.has(childPid))
1277
+ stack.push(childPid);
1278
+ }
1279
+ }
1280
+ return ordered.reverse();
1281
+ }
1282
+ async function waitForTrackedPidsExit(pids, timeoutMs) {
1283
+ const tracked = [...new Set(pids.filter((pid) => Number.isFinite(pid) && pid > 0))];
1284
+ if (tracked.length === 0)
1285
+ return true;
1286
+ const deadline = Date.now() + Math.max(0, timeoutMs);
1287
+ while (Date.now() < deadline) {
1288
+ if (tracked.every((pid) => !isPidAlive(pid)))
1289
+ return true;
1290
+ await new Promise((resolve) => setTimeout(resolve, PROMPT_WORKER_EXIT_POLL_MS));
1291
+ }
1292
+ return tracked.every((pid) => !isPidAlive(pid));
1293
+ }
1294
+ async function terminateTrackedProcessTree(rootPid, processGroupId = null, graceMs = PROMPT_WORKER_SIGTERM_WAIT_MS, killWaitMs = PROMPT_WORKER_SIGKILL_WAIT_MS) {
1295
+ if (processGroupId && process.platform !== 'win32') {
1296
+ const trackedPids = collectProcessTreePids(rootPid);
1297
+ try {
1298
+ process.kill(-processGroupId, 'SIGTERM');
1299
+ }
1300
+ catch (err) {
1301
+ if (err.code !== 'ESRCH') {
1302
+ process.stderr.write(`[team/runtime] operation failed: ${err}\n`);
1303
+ }
1304
+ }
1305
+ for (const pid of trackedPids) {
1306
+ if (pid === rootPid)
1307
+ continue;
1308
+ try {
1309
+ process.kill(pid, 'SIGTERM');
1310
+ }
1311
+ catch (err) {
1312
+ if (err.code !== 'ESRCH') {
1313
+ process.stderr.write(`[team/runtime] operation failed: ${err}\n`);
1314
+ }
1315
+ }
1316
+ }
1317
+ const groupDeadline = Date.now() + Math.max(0, graceMs);
1318
+ while (Date.now() < groupDeadline) {
1319
+ const groupAlive = isProcessGroupAlive(processGroupId);
1320
+ const descendantsAlive = trackedPids.some((pid) => isPidAlive(pid));
1321
+ if (!groupAlive && !descendantsAlive) {
1322
+ return { terminated: true, forcedKill: false, trackedPids };
1323
+ }
1324
+ await new Promise((resolve) => setTimeout(resolve, PROMPT_WORKER_EXIT_POLL_MS));
1325
+ }
1326
+ try {
1327
+ process.kill(-processGroupId, 'SIGKILL');
1328
+ }
1329
+ catch (err) {
1330
+ if (err.code !== 'ESRCH') {
1331
+ process.stderr.write(`[team/runtime] operation failed: ${err}\n`);
1332
+ }
1333
+ }
1334
+ for (const pid of trackedPids) {
1335
+ if (!isPidAlive(pid))
1336
+ continue;
1337
+ try {
1338
+ process.kill(pid, 'SIGKILL');
1339
+ }
1340
+ catch (err) {
1341
+ if (err.code !== 'ESRCH') {
1342
+ process.stderr.write(`[team/runtime] operation failed: ${err}\n`);
1343
+ }
1344
+ }
1345
+ }
1346
+ const killDeadline = Date.now() + Math.max(0, killWaitMs);
1347
+ while (Date.now() < killDeadline) {
1348
+ const groupAlive = isProcessGroupAlive(processGroupId);
1349
+ const descendantsAlive = trackedPids.some((pid) => isPidAlive(pid));
1350
+ if (!groupAlive && !descendantsAlive) {
1351
+ return { terminated: true, forcedKill: true, trackedPids };
1352
+ }
1353
+ await new Promise((resolve) => setTimeout(resolve, PROMPT_WORKER_EXIT_POLL_MS));
1354
+ }
1355
+ return {
1356
+ terminated: !isProcessGroupAlive(processGroupId) && trackedPids.every((pid) => !isPidAlive(pid)),
1357
+ forcedKill: true,
1358
+ trackedPids,
1359
+ };
1360
+ }
1361
+ const trackedPids = collectProcessTreePids(rootPid);
1362
+ if (trackedPids.length === 0) {
1363
+ return {
1364
+ terminated: !isPidAlive(rootPid),
1365
+ forcedKill: false,
1366
+ trackedPids: [],
1367
+ };
1368
+ }
1369
+ for (const pid of trackedPids) {
1370
+ try {
1371
+ process.kill(pid, 'SIGTERM');
1372
+ }
1373
+ catch (err) {
1374
+ if (err.code !== 'ESRCH') {
1375
+ process.stderr.write(`[team/runtime] operation failed: ${err}\n`);
1376
+ }
1377
+ }
1378
+ }
1379
+ if (await waitForTrackedPidsExit(trackedPids, graceMs)) {
1380
+ return { terminated: true, forcedKill: false, trackedPids };
1381
+ }
1382
+ for (const pid of trackedPids) {
1383
+ if (!isPidAlive(pid))
1384
+ continue;
1385
+ try {
1386
+ process.kill(pid, 'SIGKILL');
1387
+ }
1388
+ catch (err) {
1389
+ if (err.code !== 'ESRCH') {
1390
+ process.stderr.write(`[team/runtime] operation failed: ${err}\n`);
1391
+ }
1392
+ }
1393
+ }
1394
+ return {
1395
+ terminated: await waitForTrackedPidsExit(trackedPids, killWaitMs),
1396
+ forcedKill: true,
1397
+ trackedPids,
1398
+ };
1399
+ }
1400
+ async function teardownPromptWorker(teamName, workerName, fallbackPid, cwd, context) {
1401
+ const handle = getPromptWorkerHandle(teamName, workerName);
1402
+ const handlePid = handle?.pid;
1403
+ const processGroupId = handle?.processGroupId ?? null;
1404
+ const pid = (typeof handlePid === 'number' && Number.isFinite(handlePid))
1405
+ ? handlePid
1406
+ : (Number.isFinite(fallbackPid) && (fallbackPid ?? 0) > 0 ? fallbackPid : null);
1407
+ if (pid === null && processGroupId === null) {
1408
+ removePromptWorkerHandle(teamName, workerName);
1409
+ return { terminated: true, forcedKill: false, pid: null };
1410
+ }
1411
+ const teardown = await terminateTrackedProcessTree(pid ?? 0, processGroupId);
1412
+ const processGone = processGroupId ? !isProcessGroupAlive(processGroupId) : !isPidAlive(pid);
1413
+ if (teardown.terminated && processGone) {
1414
+ removePromptWorkerHandle(teamName, workerName);
1415
+ return { terminated: true, forcedKill: teardown.forcedKill, pid };
1416
+ }
1417
+ await appendTeamEvent(teamName, {
1418
+ type: 'worker_stopped',
1419
+ worker: workerName,
1420
+ reason: `prompt_force_kill:${context}:pid=${pid}`,
1421
+ }, cwd).catch(() => { });
1422
+ if (!teardown.terminated) {
1423
+ await appendTeamEvent(teamName, {
1424
+ type: 'worker_stopped',
1425
+ worker: workerName,
1426
+ reason: `prompt_teardown_failed:${context}:pid=${pid}`,
1427
+ }, cwd).catch(() => { });
1428
+ return {
1429
+ terminated: false,
1430
+ forcedKill: teardown.forcedKill,
1431
+ pid,
1432
+ error: 'still_alive_after_sigkill',
1433
+ };
1434
+ }
1435
+ removePromptWorkerHandle(teamName, workerName);
1436
+ return { terminated: true, forcedKill: teardown.forcedKill, pid };
1437
+ }
1438
+ function isPromptWorkerAlive(config, worker) {
1439
+ const handle = getPromptWorkerHandle(config.name, worker.name);
1440
+ if (handle?.child.exitCode === null && !handle.child.killed)
1441
+ return true;
1442
+ if (handle?.processGroupId && isProcessGroupAlive(handle.processGroupId))
1443
+ return true;
1444
+ if (process.platform !== 'win32' && isProcessGroupAlive(worker.pid))
1445
+ return true;
1446
+ return isPidAlive(worker.pid);
1447
+ }
1448
+ export { TEAM_LOW_COMPLEXITY_DEFAULT_MODEL };
1449
+ export { resolveCanonicalTeamStateRoot };
1450
+ function spawnPromptWorker(teamName, workerName, workerIndex, workerCwd, launchArgs, workerEnv, workerCli, initialPrompt, workerRole) {
1451
+ const processSpec = buildWorkerProcessLaunchSpec(teamName, workerIndex, launchArgs, workerCwd, workerEnv, workerCli, initialPrompt, workerRole);
1452
+ const child = spawn(processSpec.command, processSpec.args, {
1453
+ cwd: workerCwd,
1454
+ detached: process.platform !== 'win32',
1455
+ env: { ...process.env, ...processSpec.env },
1456
+ stdio: ['pipe', 'ignore', 'ignore'],
1457
+ });
1458
+ registerPromptWorkerHandle(teamName, workerName, child);
1459
+ return child;
1460
+ }
1461
+ export function resolveWorkerLaunchArgsFromEnv(env, agentType, inheritedLeaderModel, preferredReasoning, workerCliOverride) {
1462
+ const inheritedArgs = (typeof inheritedLeaderModel === 'string' && inheritedLeaderModel.trim() !== '')
1463
+ ? ['--model', inheritedLeaderModel.trim()]
1464
+ : [];
1465
+ const fallbackModel = resolveAgentDefaultModel(agentType, env.CODEX_HOME);
1466
+ // Detect if an explicit reasoning override exists before resolving (for log source labelling)
1467
+ const preEnvArgs = splitWorkerLaunchArgs(env.RCS_TEAM_WORKER_LAUNCH_ARGS);
1468
+ const preAllArgs = [...preEnvArgs, ...inheritedArgs];
1469
+ const hasExplicitReasoning = parseTeamWorkerLaunchArgs(preAllArgs).reasoningOverride !== null;
1470
+ const resolved = resolveTeamWorkerLaunchArgs({
1471
+ existingRaw: env.RCS_TEAM_WORKER_LAUNCH_ARGS,
1472
+ inheritedArgs,
1473
+ fallbackModel,
1474
+ preferredReasoning,
1475
+ });
1476
+ // Extract resolved model and thinking level from result args for startup log
1477
+ const resolvedParsed = parseTeamWorkerLaunchArgs(resolved);
1478
+ const resolvedModel = resolvedParsed.modelOverride ?? fallbackModel ?? 'default';
1479
+ const reasoningMatch = resolvedParsed.reasoningOverride?.match(/model_reasoning_effort\s*=\s*"?(\w+)"?/);
1480
+ const thinkingLevel = reasoningMatch?.[1] ?? 'none';
1481
+ const source = hasExplicitReasoning
1482
+ ? 'explicit'
1483
+ : (preferredReasoning ? 'role-default' : 'none/default-none');
1484
+ const effectiveWorkerCli = workerCliOverride ?? resolveEffectiveWorkerCliForStartupLog(resolved, env);
1485
+ if (effectiveWorkerCli === 'claude') {
1486
+ console.log('[rcs:team] worker startup resolution: model=claude source=local-settings');
1487
+ }
1488
+ else if (effectiveWorkerCli === 'gemini') {
1489
+ console.log('[rcs:team] worker startup resolution: model=gemini source=local-settings');
1490
+ }
1491
+ else {
1492
+ console.log(`[rcs:team] worker startup resolution: model=${resolvedModel} thinking_level=${thinkingLevel} source=${source}`);
1493
+ }
1494
+ return resolved;
1495
+ }
1496
+ function resolveEffectiveWorkerCliForStartupLog(resolvedLaunchArgs, env) {
1497
+ const rawCliMap = String(env.RCS_TEAM_WORKER_CLI_MAP ?? '').trim();
1498
+ if (rawCliMap !== '') {
1499
+ const entries = rawCliMap
1500
+ .split(',')
1501
+ .map((entry) => entry.trim().toLowerCase())
1502
+ .filter((entry) => entry.length > 0);
1503
+ if (entries.length > 0) {
1504
+ const autoCli = resolveTeamWorkerCli(resolvedLaunchArgs, {
1505
+ ...env,
1506
+ RCS_TEAM_WORKER_CLI: 'auto',
1507
+ });
1508
+ const resolvedMap = entries.map((entry) => {
1509
+ if (entry === 'auto')
1510
+ return autoCli;
1511
+ if (entry === 'codex' || entry === 'claude' || entry === 'gemini')
1512
+ return entry;
1513
+ return null;
1514
+ });
1515
+ if (resolvedMap.every((entry) => entry === 'claude'))
1516
+ return 'claude';
1517
+ if (resolvedMap.every((entry) => entry === 'gemini'))
1518
+ return 'gemini';
1519
+ if (resolvedMap.some((entry) => entry === 'codex'))
1520
+ return 'codex';
1521
+ }
1522
+ }
1523
+ return resolveTeamWorkerCli(resolvedLaunchArgs, env);
1524
+ }
1525
+ async function writeDecompositionArtifacts(teamName, cwd, metadata) {
1526
+ const root = join(resolveCanonicalTeamStateRoot(cwd), 'team', teamName);
1527
+ await mkdir(root, { recursive: true });
1528
+ await writeFile(join(root, 'decomposition-report.json'), JSON.stringify(metadata, null, 2), 'utf8');
1529
+ const manifest = await readTeamManifestV2(teamName, cwd);
1530
+ if (manifest) {
1531
+ await writeFile(join(root, 'manifest.v2.json'), JSON.stringify({ ...manifest, team_decomposition: metadata }, null, 2), 'utf8');
1532
+ }
1533
+ }
1534
+ export async function settleStartupAttemptResults(attempts) {
1535
+ const settled = await Promise.allSettled(attempts.map((attempt) => attempt.attempt));
1536
+ return settled.map((result, index) => {
1537
+ if (result.status === 'fulfilled')
1538
+ return result.value;
1539
+ const descriptor = attempts[index];
1540
+ const workerIndex = descriptor?.workerIndex ?? index + 1;
1541
+ const workerName = descriptor?.workerName ?? `worker-${workerIndex}`;
1542
+ const error = result.reason instanceof Error ? result.reason : new Error(String(result.reason));
1543
+ return { ok: false, workerIndex, workerName, error };
1544
+ });
1545
+ }
1546
+ export async function startTeam(teamName, task, agentType, workerCount, tasks, cwd, options = {}) {
1547
+ const leaderCwd = resolve(cwd);
1548
+ await assertNestedTeamAllowed(leaderCwd);
1549
+ const effectiveWorktreeMode = resolveEffectiveTeamWorktreeMode(leaderCwd, options.worktreeMode);
1550
+ const displayName = sanitizeTeamName(teamName);
1551
+ const workerLaunchMode = resolveTeamWorkerLaunchMode(process.env);
1552
+ const displayMode = workerLaunchMode === 'interactive' ? 'split_pane' : 'auto';
1553
+ const rawIdentityScope = resolveTeamIdentityScope(process.env);
1554
+ const resolvedLeaderSessionId = await resolveLeaderSessionId(leaderCwd);
1555
+ const identityScope = rawIdentityScope.source === 'run-id'
1556
+ ? (resolvedLeaderSessionId
1557
+ ? { ...rawIdentityScope, sessionId: resolvedLeaderSessionId, runId: '' }
1558
+ : {
1559
+ ...rawIdentityScope,
1560
+ // Prompt-mode starts can run outside tmux/native session metadata. A fresh
1561
+ // random run id would give every start a new leader identity and bypass
1562
+ // one-active-team protection, so scope that fallback to the leader cwd.
1563
+ runId: `cwd:${leaderCwd}`,
1564
+ })
1565
+ : rawIdentityScope;
1566
+ const sanitized = buildInternalTeamName(displayName, identityScope);
1567
+ const leaderSessionId = identityScope.sessionId || identityScope.paneId || identityScope.tmuxTarget || identityScope.runId;
1568
+ await assertTeamStartupIsNonDestructive(sanitized, leaderCwd, leaderSessionId);
1569
+ if (displayName !== sanitized) {
1570
+ await assertTeamStartupIsNonDestructive(displayName, leaderCwd, leaderSessionId);
1571
+ }
1572
+ if (workerLaunchMode === 'interactive') {
1573
+ if (!isTmuxAvailable()) {
1574
+ throw new Error('Team mode requires tmux. Install with: apt install tmux / brew install tmux');
1575
+ }
1576
+ if (!hasCurrentTmuxClientContext()) {
1577
+ throw new Error('Team mode requires running inside tmux current leader pane');
1578
+ }
1579
+ }
1580
+ const teamStateRoot = resolveCanonicalTeamStateRoot(leaderCwd);
1581
+ const activeWorktreeMode = effectiveWorktreeMode.enabled
1582
+ ? (effectiveWorktreeMode.detached ? 'detached' : 'named')
1583
+ : null;
1584
+ const workspaceMode = activeWorktreeMode ? 'worktree' : 'single';
1585
+ const workerWorkspaceByName = new Map();
1586
+ const provisionedWorktrees = [];
1587
+ for (let i = 1; i <= workerCount; i++) {
1588
+ workerWorkspaceByName.set(`worker-${i}`, { cwd: leaderCwd });
1589
+ }
1590
+ await detectAndCleanStaleTeam(sanitized, leaderCwd, workerCount, options.confirmStaleCleanup);
1591
+ if (activeWorktreeMode) {
1592
+ assertCleanLeaderWorkspaceForWorkerWorktrees(leaderCwd);
1593
+ for (let i = 1; i <= workerCount; i++) {
1594
+ const workerName = `worker-${i}`;
1595
+ const planned = planWorktreeTarget({
1596
+ cwd: leaderCwd,
1597
+ scope: 'team',
1598
+ mode: effectiveWorktreeMode,
1599
+ teamName: sanitized,
1600
+ workerName,
1601
+ });
1602
+ const ensured = ensureWorktree(planned);
1603
+ provisionedWorktrees.push(ensured);
1604
+ if (ensured.enabled) {
1605
+ workerWorkspaceByName.set(workerName, {
1606
+ cwd: ensured.worktreePath,
1607
+ worktreeRepoRoot: ensured.repoRoot,
1608
+ worktreePath: ensured.worktreePath,
1609
+ worktreeBranch: ensured.branchName ?? undefined,
1610
+ worktreeDetached: ensured.detached,
1611
+ worktreeCreated: ensured.created,
1612
+ });
1613
+ }
1614
+ }
1615
+ }
1616
+ // 2. Team name is already sanitized above.
1617
+ let sessionName = `rcs-team-${sanitized}`;
1618
+ const overlay = generateWorkerOverlay(sanitized);
1619
+ let workerInstructionsPath = null;
1620
+ let sessionCreated = false;
1621
+ const createdWorkerPaneIds = [];
1622
+ let createdLeaderPaneId;
1623
+ let config = null;
1624
+ const sharedWorkerLaunchArgs = resolveTeamWorkerLaunchArgs({
1625
+ existingRaw: process.env.RCS_TEAM_WORKER_LAUNCH_ARGS,
1626
+ fallbackModel: resolveAgentDefaultModel(agentType, process.env.CODEX_HOME),
1627
+ });
1628
+ const workerCliPlan = resolveTeamWorkerCliPlan(workerCount, sharedWorkerLaunchArgs, process.env);
1629
+ if (workerLaunchMode === 'prompt') {
1630
+ assertPromptModeWorkerCliSupported(workerCliPlan);
1631
+ }
1632
+ const workerReadyTimeoutMs = resolveWorkerReadyTimeoutMs(process.env);
1633
+ const workerStartupEvidenceTimeoutMs = resolveWorkerStartupEvidenceTimeoutMs(process.env, workerReadyTimeoutMs);
1634
+ const startupDispatchRetries = resolveStartupDispatchRetries(process.env);
1635
+ const startupRetryDelayS = resolveStartupDispatchRetryDelayS(process.env);
1636
+ const skipWorkerReadyWait = shouldSkipWorkerReadyWait(process.env);
1637
+ try {
1638
+ // 3. Init state directory + config
1639
+ config = await initTeamState(sanitized, task, agentType, workerCount, leaderCwd, DEFAULT_MAX_WORKERS, {
1640
+ ...process.env,
1641
+ RCS_SESSION_ID: leaderSessionId,
1642
+ RCS_TEAM_DISPLAY_MODE: displayMode,
1643
+ RCS_TEAM_WORKER_LAUNCH_MODE: workerLaunchMode,
1644
+ }, {
1645
+ leader_cwd: leaderCwd,
1646
+ team_state_root: teamStateRoot,
1647
+ workspace_mode: workspaceMode,
1648
+ display_name: displayName,
1649
+ requested_name: displayName,
1650
+ identity_source: identityScope.source,
1651
+ worktree_mode: effectiveWorktreeMode,
1652
+ }, 'default');
1653
+ if (!config) {
1654
+ throw new Error('failed to initialize team config');
1655
+ }
1656
+ config.leader_cwd = leaderCwd;
1657
+ config.team_state_root = teamStateRoot;
1658
+ config.workspace_mode = workspaceMode;
1659
+ config.display_name = displayName;
1660
+ config.requested_name = displayName;
1661
+ config.identity_source = identityScope.source;
1662
+ config.worktree_mode = effectiveWorktreeMode;
1663
+ // 4. Create tasks. Repo-aware DAG dependencies are symbolic until the
1664
+ // state layer returns concrete task IDs, so create those tasks dependency
1665
+ // free and patch runtime dependency fields after ID assignment.
1666
+ const createdTasks = [];
1667
+ for (const t of tasks) {
1668
+ const hasSymbolicDagIdentity = Boolean(t.symbolic_id);
1669
+ const created = await createStateTask(sanitized, {
1670
+ subject: t.subject,
1671
+ description: t.description,
1672
+ status: 'pending',
1673
+ owner: t.owner,
1674
+ blocked_by: hasSymbolicDagIdentity ? undefined : t.blocked_by ?? t.depends_on,
1675
+ depends_on: hasSymbolicDagIdentity ? undefined : t.depends_on ?? t.blocked_by,
1676
+ role: t.role,
1677
+ delegation: t.delegation ?? synthesizeDelegationPlan(t),
1678
+ requires_code_change: t.requires_code_change,
1679
+ filePaths: t.filePaths,
1680
+ domains: t.domains,
1681
+ lane: t.lane,
1682
+ allocation_reason: t.allocation_reason,
1683
+ }, leaderCwd);
1684
+ createdTasks.push(created);
1685
+ }
1686
+ const effectiveDecompositionMetadata = options.decompositionMetadata
1687
+ ? remapRepoAwareDecompositionMetadataToCreatedTasks(options.decompositionMetadata, tasks, createdTasks)
1688
+ : undefined;
1689
+ const nodeIdToTaskId = effectiveDecompositionMetadata?.node_id_to_task_id ?? {};
1690
+ for (let index = 0; index < tasks.length; index += 1) {
1691
+ const planned = tasks[index];
1692
+ if (!planned?.symbolic_id)
1693
+ continue;
1694
+ const created = createdTasks[index];
1695
+ if (!created)
1696
+ continue;
1697
+ const symbolicDeps = planned.symbolic_depends_on
1698
+ ?? effectiveDecompositionMetadata?.node_dependencies?.[planned.symbolic_id]
1699
+ ?? [];
1700
+ const concreteDeps = symbolicDeps.map((dep) => nodeIdToTaskId[dep]).filter(Boolean);
1701
+ if (concreteDeps.length === 0)
1702
+ continue;
1703
+ await updateTask(sanitized, created.id, {
1704
+ blocked_by: concreteDeps,
1705
+ depends_on: concreteDeps,
1706
+ }, leaderCwd);
1707
+ }
1708
+ // 5. Write team-scoped worker instructions file only for single-workspace mode.
1709
+ if (workspaceMode !== 'worktree') {
1710
+ workerInstructionsPath = await writeTeamWorkerInstructionsFile(sanitized, leaderCwd, overlay);
1711
+ setTeamModelInstructionsFile(sanitized, workerInstructionsPath);
1712
+ }
1713
+ const allTasks = await listTasks(sanitized, leaderCwd);
1714
+ if (effectiveDecompositionMetadata) {
1715
+ await writeDecompositionArtifacts(sanitized, leaderCwd, effectiveDecompositionMetadata);
1716
+ }
1717
+ const workerBootstrapPlans = [];
1718
+ for (let i = 1; i <= workerCount; i++) {
1719
+ const workerName = `worker-${i}`;
1720
+ const workerWorkspace = workerWorkspaceByName.get(workerName) ?? { cwd: leaderCwd };
1721
+ const workerTasks = allTasks.filter(t => t.owner === workerName);
1722
+ const taskRoles = workerTasks.map(t => t.role).filter(Boolean);
1723
+ const uniqueTaskRoles = new Set(taskRoles);
1724
+ const workerRole = taskRoles.length > 0 && uniqueTaskRoles.size === 1
1725
+ ? taskRoles[0]
1726
+ : agentType;
1727
+ const runtimeRole = workerRole;
1728
+ const rawRolePromptContent = await loadRolePrompt(runtimeRole, join(leaderCwd, '.codex', 'prompts'))
1729
+ ?? await loadRolePrompt(runtimeRole, codexPromptsDir());
1730
+ const preferredReasoning = resolveAgentReasoningEffort(runtimeRole) ?? resolveAgentReasoningEffort(agentType);
1731
+ const workerLaunchArgs = resolveWorkerLaunchArgsFromEnv(process.env, runtimeRole, undefined, preferredReasoning, workerCliPlan[i - 1]);
1732
+ const resolvedWorkerModel = parseTeamWorkerLaunchArgs(workerLaunchArgs).modelOverride ?? undefined;
1733
+ const rolePromptContent = rawRolePromptContent
1734
+ ? composeRoleInstructionsForRole(runtimeRole, rawRolePromptContent, resolvedWorkerModel)
1735
+ : null;
1736
+ const workerWorktreePath = workerWorkspace.worktreePath ?? undefined;
1737
+ const fallbackInstructionsPath = workerInstructionsPath ?? join(leaderCwd, 'AGENTS.md');
1738
+ const instructionsFilePath = workerWorktreePath
1739
+ ? await writeWorkerWorktreeRootAgentsFile({
1740
+ teamName: sanitized,
1741
+ workerName,
1742
+ workerRole: runtimeRole,
1743
+ rolePromptContent: rolePromptContent ?? "",
1744
+ teamStateRoot,
1745
+ leaderCwd,
1746
+ worktreePath: workerWorktreePath,
1747
+ })
1748
+ : rolePromptContent
1749
+ ? await writeWorkerRoleInstructionsFile(sanitized, workerName, leaderCwd, fallbackInstructionsPath, runtimeRole, rolePromptContent)
1750
+ : fallbackInstructionsPath;
1751
+ const inbox = generateInitialInbox(workerName, sanitized, agentType, workerTasks, {
1752
+ teamStateRoot,
1753
+ leaderCwd,
1754
+ workerRole: runtimeRole,
1755
+ rolePromptContent: rawRolePromptContent ?? undefined,
1756
+ worktreeRootAgentsCanonical: Boolean(workerWorkspace.worktreePath),
1757
+ taskHints: effectiveDecompositionMetadata?.task_hints,
1758
+ approvedContextSummary: effectiveDecompositionMetadata?.approved_context_summary,
1759
+ });
1760
+ const triggerDirective = buildTriggerDirective(workerName, sanitized, resolveInstructionStateRoot(workerWorkspace.worktreePath));
1761
+ const trigger = triggerDirective.text;
1762
+ const initialPrompt = workerCliPlan[i - 1] === 'gemini' ? trigger : undefined;
1763
+ if (initialPrompt) {
1764
+ await writeWorkerInbox(sanitized, workerName, inbox, leaderCwd);
1765
+ }
1766
+ workerBootstrapPlans.push({
1767
+ workerName,
1768
+ workerWorkspace,
1769
+ workerTasks,
1770
+ workerRole,
1771
+ rolePromptContent,
1772
+ instructionsFilePath,
1773
+ inbox,
1774
+ trigger,
1775
+ triggerIntent: triggerDirective.intent,
1776
+ initialPrompt,
1777
+ workerLaunchArgs,
1778
+ workerCli: workerCliPlan[i - 1],
1779
+ });
1780
+ }
1781
+ const workerStartups = workerBootstrapPlans.map((plan) => {
1782
+ const env = {
1783
+ [TEAM_STATE_ROOT_ENV]: teamStateRoot,
1784
+ [TEAM_LEADER_CWD_ENV]: leaderCwd,
1785
+ [MODEL_INSTRUCTIONS_FILE_ENV]: plan.instructionsFilePath,
1786
+ RCS_TEAM_DISPLAY_NAME: displayName,
1787
+ };
1788
+ if (plan.workerWorkspace.worktreePath) {
1789
+ env.RCS_TEAM_WORKTREE_PATH = plan.workerWorkspace.worktreePath;
1790
+ }
1791
+ if (plan.workerWorkspace.worktreeBranch) {
1792
+ env.RCS_TEAM_WORKTREE_BRANCH = plan.workerWorkspace.worktreeBranch;
1793
+ }
1794
+ if (typeof plan.workerWorkspace.worktreeDetached === 'boolean') {
1795
+ env.RCS_TEAM_WORKTREE_DETACHED = plan.workerWorkspace.worktreeDetached ? '1' : '0';
1796
+ }
1797
+ return {
1798
+ cwd: plan.workerWorkspace.cwd,
1799
+ env,
1800
+ initialPrompt: plan.initialPrompt,
1801
+ launchArgs: plan.workerLaunchArgs,
1802
+ workerCli: plan.workerCli,
1803
+ workerRole: plan.workerRole,
1804
+ };
1805
+ });
1806
+ const workerPaneIds = Array.from({ length: workerCount }, () => undefined);
1807
+ const materializeWorkerStartupState = async (bootstrapPlan, workerIndex, paneId) => {
1808
+ const workerWorkspace = bootstrapPlan.workerWorkspace;
1809
+ const identity = {
1810
+ name: bootstrapPlan.workerName,
1811
+ index: workerIndex,
1812
+ role: bootstrapPlan.workerRole,
1813
+ worker_cli: bootstrapPlan.workerCli,
1814
+ assigned_tasks: bootstrapPlan.workerTasks.map((task) => task.id),
1815
+ working_dir: workerWorkspace.cwd,
1816
+ worktree_repo_root: workerWorkspace.worktreeRepoRoot,
1817
+ worktree_path: workerWorkspace.worktreePath,
1818
+ worktree_branch: workerWorkspace.worktreeBranch,
1819
+ worktree_detached: workerWorkspace.worktreeDetached,
1820
+ worktree_created: workerWorkspace.worktreeCreated,
1821
+ team_state_root: teamStateRoot,
1822
+ };
1823
+ if (workerLaunchMode === 'interactive') {
1824
+ const panePid = getWorkerPanePid(sessionName, workerIndex, paneId);
1825
+ if (panePid)
1826
+ identity.pid = panePid;
1827
+ }
1828
+ else if (config?.workers[workerIndex - 1]?.pid) {
1829
+ identity.pid = config.workers[workerIndex - 1].pid;
1830
+ }
1831
+ if (paneId)
1832
+ identity.pane_id = paneId;
1833
+ if (config?.workers[workerIndex - 1]) {
1834
+ config.workers[workerIndex - 1].pid = identity.pid;
1835
+ config.workers[workerIndex - 1].pane_id = paneId;
1836
+ config.workers[workerIndex - 1].role = bootstrapPlan.workerRole;
1837
+ config.workers[workerIndex - 1].worker_cli = bootstrapPlan.workerCli;
1838
+ config.workers[workerIndex - 1].assigned_tasks = bootstrapPlan.workerTasks.map((task) => task.id);
1839
+ config.workers[workerIndex - 1].working_dir = workerWorkspace.cwd;
1840
+ config.workers[workerIndex - 1].worktree_repo_root = workerWorkspace.worktreeRepoRoot;
1841
+ config.workers[workerIndex - 1].worktree_path = workerWorkspace.worktreePath;
1842
+ config.workers[workerIndex - 1].worktree_branch = workerWorkspace.worktreeBranch;
1843
+ config.workers[workerIndex - 1].worktree_detached = workerWorkspace.worktreeDetached;
1844
+ config.workers[workerIndex - 1].worktree_created = workerWorkspace.worktreeCreated;
1845
+ config.workers[workerIndex - 1].team_state_root = teamStateRoot;
1846
+ }
1847
+ await writeWorkerIdentity(sanitized, bootstrapPlan.workerName, identity, leaderCwd);
1848
+ await writeWorkerInbox(sanitized, bootstrapPlan.workerName, bootstrapPlan.inbox, leaderCwd);
1849
+ };
1850
+ // 6. Create worker runtime (interactive tmux panes or prompt-mode child processes)
1851
+ await cleanupTeamWorkerLaunchOrphanedMcpProcesses({
1852
+ cleanup: options.cleanupLaunchOrphanedMcpProcesses,
1853
+ writeWarning: options.writeCleanupWarning,
1854
+ });
1855
+ const startupTiming = createStartupTimingRecorder(sanitized, leaderCwd);
1856
+ if (workerLaunchMode === 'interactive') {
1857
+ const createdSession = createTeamSession(sanitized, workerCount, leaderCwd, sharedWorkerLaunchArgs, workerStartups);
1858
+ sessionName = createdSession.name;
1859
+ sessionCreated = true;
1860
+ createdWorkerPaneIds.push(...createdSession.workerPaneIds);
1861
+ createdLeaderPaneId = createdSession.leaderPaneId;
1862
+ applyCreatedInteractiveSessionToConfig(config, createdSession, workerPaneIds);
1863
+ for (const [index, paneId] of createdSession.workerPaneIds.entries()) {
1864
+ startupTiming.mark('split_returned', { worker: `worker-${index + 1}`, pane_id: paneId });
1865
+ }
1866
+ }
1867
+ else {
1868
+ config.tmux_session = `prompt-${sanitized}`;
1869
+ config.leader_pane_id = null;
1870
+ config.hud_pane_id = null;
1871
+ config.resize_hook_name = null;
1872
+ config.resize_hook_target = null;
1873
+ for (let i = 1; i <= workerCount; i++) {
1874
+ const startup = workerStartups[i - 1] || {};
1875
+ const workerName = `worker-${i}`;
1876
+ const child = spawnPromptWorker(sanitized, workerName, i, startup.cwd || leaderCwd, startup.launchArgs || sharedWorkerLaunchArgs, startup.env || {}, startup.workerCli || workerCliPlan[i - 1], startup.initialPrompt, startup.workerRole);
1877
+ if (config.workers[i - 1]) {
1878
+ config.workers[i - 1].pid = child.pid;
1879
+ }
1880
+ }
1881
+ }
1882
+ // Materialize durable startup state for every worker before any per-worker
1883
+ // readiness wait or startup-evidence gate can block later workers.
1884
+ for (let i = 1; i <= workerCount; i++) {
1885
+ const bootstrapPlan = workerBootstrapPlans[i - 1];
1886
+ if (!bootstrapPlan) {
1887
+ throw new Error(`missing bootstrap plan for worker-${i}`);
1888
+ }
1889
+ await materializeWorkerStartupState(bootstrapPlan, i, workerPaneIds[i - 1]);
1890
+ startupTiming.mark('identity_inbox_written', { worker: bootstrapPlan.workerName, pane_id: workerPaneIds[i - 1] });
1891
+ }
1892
+ await saveTeamConfig(config, leaderCwd);
1893
+ // 7. Start all safe per-worker readiness/dispatch attempts concurrently.
1894
+ // Pane creation and worktree provisioning above remain dependency-bound and
1895
+ // ordered; readiness polling and startup dispatch must not let worker-1
1896
+ // block later workers from receiving their own startup attempts.
1897
+ const manifest = await readTeamManifestV2(sanitized, leaderCwd);
1898
+ const dispatchPolicy = resolveDispatchPolicy(manifest?.policy, workerLaunchMode);
1899
+ const runWorkerStartupAttempt = async (workerIndex) => {
1900
+ const bootstrapPlan = workerBootstrapPlans[workerIndex - 1];
1901
+ if (!bootstrapPlan) {
1902
+ return {
1903
+ ok: false,
1904
+ workerIndex,
1905
+ workerName: `worker-${workerIndex}`,
1906
+ error: new Error(`missing bootstrap plan for worker-${workerIndex}`),
1907
+ };
1908
+ }
1909
+ const workerName = bootstrapPlan.workerName;
1910
+ const paneId = workerPaneIds[workerIndex - 1];
1911
+ const workerTasks = bootstrapPlan.workerTasks;
1912
+ const inbox = bootstrapPlan.inbox;
1913
+ const trigger = bootstrapPlan.trigger;
1914
+ const triggerIntent = bootstrapPlan.triggerIntent;
1915
+ const initialPrompt = bootstrapPlan.initialPrompt;
1916
+ const startupStartedAt = performance.now();
1917
+ const taskRoles = workerTasks
1918
+ .map((task) => task.role)
1919
+ .filter((role) => Boolean(role));
1920
+ const uniqueTaskRoles = [...new Set(taskRoles)];
1921
+ if (uniqueTaskRoles.length > 1) {
1922
+ console.log(`[rcs:team] ${workerName}: mixed task roles [${uniqueTaskRoles.join(', ')}], falling back to ${agentType}`);
1923
+ }
1924
+ const startupDirectOutcome = workerLaunchMode === 'interactive' && !initialPrompt
1925
+ ? await attemptStartupDirectTrigger({
1926
+ teamName: sanitized,
1927
+ config: config,
1928
+ workerName,
1929
+ workerIndex,
1930
+ paneId,
1931
+ workerCli: workerCliPlan[workerIndex - 1],
1932
+ inbox,
1933
+ triggerMessage: trigger,
1934
+ intent: triggerIntent,
1935
+ taskIds: workerTasks.map((task) => task.id),
1936
+ cwd: leaderCwd,
1937
+ timing: startupTiming,
1938
+ })
1939
+ : null;
1940
+ if (workerLaunchMode === 'interactive' && !skipWorkerReadyWait && !initialPrompt && !startupDirectOutcome?.ok) {
1941
+ startupTiming.mark('ready_wait_start', { worker: workerName, pane_id: paneId });
1942
+ const ready = await waitForWorkerReadyAsync(sessionName, workerIndex, workerReadyTimeoutMs, paneId);
1943
+ startupTiming.mark('ready_wait_end', { worker: workerName, pane_id: paneId, ok: ready });
1944
+ if (!ready) {
1945
+ const workerAlive = isWorkerPaneOpen(sessionName, workerIndex, paneId);
1946
+ if (workerAlive) {
1947
+ await recordRecoverableStartupIssue({
1948
+ teamName: sanitized,
1949
+ workerName,
1950
+ taskIds: workerTasks.map((task) => task.id),
1951
+ reason: 'ready_prompt_timeout',
1952
+ cwd: leaderCwd,
1953
+ });
1954
+ return { ok: true, workerIndex, workerName };
1955
+ }
1956
+ return {
1957
+ ok: false,
1958
+ workerIndex,
1959
+ workerName,
1960
+ error: new Error(`Worker ${workerName} did not become ready in tmux session ${sessionName}`),
1961
+ };
1962
+ }
1963
+ }
1964
+ const startupReadyPromptObserved = workerLaunchMode === 'interactive' && !skipWorkerReadyWait && !initialPrompt;
1965
+ let dispatchOutcome = initialPrompt
1966
+ ? { ok: true, transport: 'none', reason: 'startup_prompt_delivered_at_launch' }
1967
+ : (startupDirectOutcome ?? { ok: false, transport: 'none', reason: 'not_attempted' });
1968
+ if (!initialPrompt && !startupDirectOutcome?.ok) {
1969
+ for (let attempt = 1; attempt <= startupDispatchRetries; attempt++) {
1970
+ dispatchOutcome = await dispatchCriticalInboxInstruction({
1971
+ teamName: sanitized,
1972
+ config: config,
1973
+ workerName,
1974
+ workerIndex,
1975
+ paneId,
1976
+ workerCli: workerCliPlan[workerIndex - 1],
1977
+ inbox,
1978
+ triggerMessage: trigger,
1979
+ intent: triggerIntent,
1980
+ cwd: leaderCwd,
1981
+ dispatchPolicy,
1982
+ inboxCorrelationKey: `startup:${workerName}`,
1983
+ requireWorkerStartupEvidence: true,
1984
+ startupEvidenceTimeoutMs: workerStartupEvidenceTimeoutMs,
1985
+ startupReadyPromptObserved,
1986
+ startupTiming,
1987
+ });
1988
+ await logStartupTiming({
1989
+ cwd: leaderCwd,
1990
+ teamName: sanitized,
1991
+ workerName,
1992
+ event: dispatchOutcome.ok ? 'startup_evidence' : 'startup_attempt_failed',
1993
+ paneId,
1994
+ elapsedMs: performance.now() - startupStartedAt,
1995
+ reason: dispatchOutcome.reason,
1996
+ requestId: dispatchOutcome.request_id,
1997
+ transport: dispatchOutcome.transport,
1998
+ }).catch(() => { });
1999
+ if (dispatchOutcome.ok)
2000
+ break;
2001
+ if (attempt < startupDispatchRetries) {
2002
+ if (workerLaunchMode === 'interactive') {
2003
+ if (dismissTrustPromptIfPresent(sessionName, workerIndex, paneId)) {
2004
+ await waitForWorkerReadyAsync(sessionName, workerIndex, workerReadyTimeoutMs, paneId);
2005
+ }
2006
+ else {
2007
+ await new Promise((resolve) => setTimeout(resolve, Math.max(0, startupRetryDelayS * 1000)));
2008
+ }
2009
+ }
2010
+ else {
2011
+ await new Promise((resolve) => setTimeout(resolve, Math.max(0, startupRetryDelayS * 1000)));
2012
+ }
2013
+ }
2014
+ }
2015
+ }
2016
+ if (!dispatchOutcome.ok) {
2017
+ const workerAlive = workerLaunchMode === 'prompt'
2018
+ ? isPromptWorkerAlive(config, config.workers[workerIndex - 1])
2019
+ : isWorkerPaneOpen(sessionName, workerIndex, paneId);
2020
+ if (workerLaunchMode === 'interactive'
2021
+ && workerAlive
2022
+ && isRecoverableInteractiveStartupReason(dispatchOutcome.reason)) {
2023
+ await recordRecoverableStartupIssue({
2024
+ teamName: sanitized,
2025
+ workerName,
2026
+ taskIds: workerTasks.map((task) => task.id),
2027
+ reason: dispatchOutcome.reason,
2028
+ cwd: leaderCwd,
2029
+ });
2030
+ return { ok: true, workerIndex, workerName };
2031
+ }
2032
+ if (workerLaunchMode === 'prompt' && !workerAlive) {
2033
+ await recordPromptStartupWorkerStopped({
2034
+ teamName: sanitized,
2035
+ workerName,
2036
+ taskIds: workerTasks.map((task) => task.id),
2037
+ reason: dispatchOutcome.reason,
2038
+ cwd: leaderCwd,
2039
+ });
2040
+ return { ok: true, workerIndex, workerName };
2041
+ }
2042
+ return {
2043
+ ok: false,
2044
+ workerIndex,
2045
+ workerName,
2046
+ error: new Error(`worker_notify_failed:${workerName}:${dispatchOutcome.reason}`),
2047
+ };
2048
+ }
2049
+ return { ok: true, workerIndex, workerName };
2050
+ };
2051
+ const startupAttemptResults = await settleStartupAttemptResults(Array.from({ length: workerCount }, (_, index) => {
2052
+ const workerIndex = index + 1;
2053
+ const bootstrapPlan = workerBootstrapPlans[index];
2054
+ const workerName = bootstrapPlan?.workerName ?? `worker-${workerIndex}`;
2055
+ return {
2056
+ workerIndex,
2057
+ workerName,
2058
+ attempt: runWorkerStartupAttempt(workerIndex),
2059
+ };
2060
+ }));
2061
+ const firstStartupError = startupAttemptResults
2062
+ .filter((result) => !result.ok)
2063
+ .sort((a, b) => a.workerIndex - b.workerIndex)[0];
2064
+ if (firstStartupError) {
2065
+ throw firstStartupError.error;
2066
+ }
2067
+ await saveTeamConfig(config, leaderCwd);
2068
+ await startupTiming.flush();
2069
+ return {
2070
+ teamName: sanitized,
2071
+ sanitizedName: sanitized,
2072
+ sessionName,
2073
+ config,
2074
+ cwd: leaderCwd,
2075
+ };
2076
+ }
2077
+ catch (error) {
2078
+ const rollbackErrors = [];
2079
+ if (sessionCreated) {
2080
+ if (config?.resize_hook_name && config.resize_hook_target) {
2081
+ try {
2082
+ const unregistered = unregisterResizeHook(config.resize_hook_target, config.resize_hook_name);
2083
+ if (!unregistered) {
2084
+ rollbackErrors.push('unregisterResizeHook: returned false');
2085
+ }
2086
+ }
2087
+ catch (cleanupError) {
2088
+ rollbackErrors.push(`unregisterResizeHook: ${String(cleanupError)}`);
2089
+ }
2090
+ }
2091
+ if (config) {
2092
+ config.resize_hook_name = null;
2093
+ config.resize_hook_target = null;
2094
+ try {
2095
+ await saveTeamConfig(config, leaderCwd);
2096
+ }
2097
+ catch (cleanupError) {
2098
+ rollbackErrors.push(`saveTeamConfig(clear resize hook): ${String(cleanupError)}`);
2099
+ }
2100
+ }
2101
+ // In split-pane topology, we must not kill the entire tmux session; kill only created panes.
2102
+ if (sessionName.includes(':')) {
2103
+ for (const [index, paneId] of createdWorkerPaneIds.entries()) {
2104
+ const panePid = getWorkerPanePid(sessionName, index + 1, paneId);
2105
+ if (panePid) {
2106
+ await terminateTrackedProcessTree(panePid);
2107
+ }
2108
+ try {
2109
+ await killWorkerByPaneIdAsync(paneId, createdLeaderPaneId);
2110
+ }
2111
+ catch (err) {
2112
+ process.stderr.write(`[team/runtime] operation failed: ${err}\n`);
2113
+ }
2114
+ }
2115
+ if (config?.hud_pane_id) {
2116
+ try {
2117
+ await killWorkerByPaneIdAsync(config.hud_pane_id, createdLeaderPaneId);
2118
+ }
2119
+ catch (err) {
2120
+ process.stderr.write(`[team/runtime] operation failed: ${err}\n`);
2121
+ }
2122
+ }
2123
+ }
2124
+ else {
2125
+ try {
2126
+ destroyTeamSession(sessionName);
2127
+ }
2128
+ catch (cleanupError) {
2129
+ rollbackErrors.push(`destroyTeamSession: ${String(cleanupError)}`);
2130
+ }
2131
+ }
2132
+ }
2133
+ if (workerLaunchMode === 'prompt' && config) {
2134
+ const promptTeardownFailures = [];
2135
+ for (const worker of config.workers) {
2136
+ const teardown = await teardownPromptWorker(sanitized, worker.name, worker.pid, leaderCwd, 'startup_rollback');
2137
+ if (!teardown.terminated) {
2138
+ promptTeardownFailures.push(`${worker.name}:${teardown.error || 'unknown_error'}`);
2139
+ }
2140
+ }
2141
+ if (promptTeardownFailures.length > 0) {
2142
+ rollbackErrors.push(`promptTeardown:${promptTeardownFailures.join(',')}`);
2143
+ }
2144
+ }
2145
+ if (config) {
2146
+ for (const worker of config.workers) {
2147
+ if (!worker.worktree_path || !worker.team_state_root)
2148
+ continue;
2149
+ try {
2150
+ await removeWorkerWorktreeRootAgentsFile(sanitized, worker.name, worker.team_state_root, worker.worktree_path);
2151
+ }
2152
+ catch (cleanupError) {
2153
+ rollbackErrors.push(`removeWorkerWorktreeRootAgentsFile(${worker.name}): ${String(cleanupError)}`);
2154
+ }
2155
+ }
2156
+ }
2157
+ if (workerInstructionsPath) {
2158
+ try {
2159
+ await removeTeamWorkerInstructionsFile(sanitized, leaderCwd);
2160
+ }
2161
+ catch (cleanupError) {
2162
+ rollbackErrors.push(`removeTeamWorkerInstructionsFile: ${String(cleanupError)}`);
2163
+ }
2164
+ }
2165
+ restoreTeamModelInstructionsFile(sanitized);
2166
+ try {
2167
+ await cleanupTeamState(sanitized, leaderCwd);
2168
+ }
2169
+ catch (cleanupError) {
2170
+ rollbackErrors.push(`cleanupTeamState: ${String(cleanupError)}`);
2171
+ }
2172
+ if (provisionedWorktrees.length > 0) {
2173
+ try {
2174
+ await rollbackProvisionedWorktrees(provisionedWorktrees, {
2175
+ skipBranchDeletion: false,
2176
+ });
2177
+ }
2178
+ catch (cleanupError) {
2179
+ rollbackErrors.push(`rollbackProvisionedWorktrees: ${String(cleanupError)}`);
2180
+ }
2181
+ }
2182
+ if (rollbackErrors.length > 0) {
2183
+ const message = error instanceof Error ? error.message : String(error);
2184
+ throw new Error(`${message}; rollback encountered errors: ${rollbackErrors.join(' | ')}`);
2185
+ }
2186
+ throw error;
2187
+ }
2188
+ }
2189
+ /**
2190
+ * Monitor team state by polling files. Returns a snapshot.
2191
+ */
2192
+ export async function monitorTeam(teamName, cwd) {
2193
+ const monitorStartMs = performance.now();
2194
+ const sanitized = resolveTeamNameForCurrentContext(teamName, cwd);
2195
+ const config = await readTeamConfig(sanitized, cwd);
2196
+ if (!config)
2197
+ return null;
2198
+ const manifest = await readTeamManifestV2(sanitized, cwd);
2199
+ const dispatchPolicy = resolveDispatchPolicy(manifest?.policy, config.worker_launch_mode);
2200
+ const previousSnapshot = await readMonitorSnapshot(sanitized, cwd);
2201
+ const sessionName = config.tmux_session;
2202
+ const listTasksStartMs = performance.now();
2203
+ const allTasks = await listTasks(sanitized, cwd);
2204
+ const listTasksMs = performance.now() - listTasksStartMs;
2205
+ const reclaimedTaskIds = [];
2206
+ for (const task of allTasks) {
2207
+ if (task.status !== 'in_progress' || !task.claim?.leased_until)
2208
+ continue;
2209
+ if (new Date(task.claim.leased_until) > new Date())
2210
+ continue;
2211
+ const reclaimed = await reclaimExpiredTaskClaim(sanitized, task.id, cwd);
2212
+ if (reclaimed.ok && reclaimed.reclaimed)
2213
+ reclaimedTaskIds.push(task.id);
2214
+ }
2215
+ let taskView = reclaimedTaskIds.length > 0 ? await listTasks(sanitized, cwd) : allTasks;
2216
+ const taskById = new Map(taskView.map((task) => [task.id, task]));
2217
+ const inProgressByOwner = new Map();
2218
+ for (const task of taskView) {
2219
+ if (task.status !== 'in_progress' || !task.owner)
2220
+ continue;
2221
+ const existing = inProgressByOwner.get(task.owner) || [];
2222
+ existing.push(task);
2223
+ inProgressByOwner.set(task.owner, existing);
2224
+ }
2225
+ const workers = [];
2226
+ const deadWorkers = [];
2227
+ const nonReportingWorkers = [];
2228
+ const recommendations = [];
2229
+ const workerScanStartMs = performance.now();
2230
+ const workerSignals = await Promise.all(config.workers.map(async (worker) => {
2231
+ const alive = config.worker_launch_mode === 'prompt'
2232
+ ? isPromptWorkerAlive(config, worker)
2233
+ : isWorkerAlive(sessionName, worker.index, worker.pane_id);
2234
+ const [status, heartbeat] = await Promise.all([
2235
+ readWorkerStatus(sanitized, worker.name, cwd),
2236
+ readWorkerHeartbeat(sanitized, worker.name, cwd),
2237
+ ]);
2238
+ return { worker, alive, status, heartbeat };
2239
+ }));
2240
+ const workerScanMs = performance.now() - workerScanStartMs;
2241
+ for (const { worker: w, alive, status, heartbeat } of workerSignals) {
2242
+ const currentTask = status.current_task_id ? taskById.get(status.current_task_id) ?? null : null;
2243
+ const previousTurns = previousSnapshot ? (previousSnapshot.workerTurnCountByName[w.name] ?? 0) : null;
2244
+ const previousTaskId = previousSnapshot?.workerTaskIdByName[w.name] ?? '';
2245
+ const currentTaskId = status.current_task_id ?? '';
2246
+ const turnsWithoutProgress = heartbeat &&
2247
+ previousTurns !== null &&
2248
+ status.state === 'working' &&
2249
+ currentTask &&
2250
+ (currentTask.status === 'pending' || currentTask.status === 'in_progress') &&
2251
+ currentTaskId !== '' &&
2252
+ previousTaskId === currentTaskId
2253
+ ? Math.max(0, heartbeat.turn_count - previousTurns)
2254
+ : 0;
2255
+ workers.push({
2256
+ name: w.name,
2257
+ alive,
2258
+ status,
2259
+ heartbeat,
2260
+ assignedTasks: w.assigned_tasks,
2261
+ turnsWithoutProgress,
2262
+ });
2263
+ if (!alive) {
2264
+ deadWorkers.push(w.name);
2265
+ // Find in-progress tasks owned by this dead worker
2266
+ const deadWorkerTasks = inProgressByOwner.get(w.name) || [];
2267
+ for (const t of deadWorkerTasks) {
2268
+ recommendations.push(`Reassign task-${t.id} from dead ${w.name}`);
2269
+ }
2270
+ }
2271
+ if (alive && turnsWithoutProgress > 5) {
2272
+ nonReportingWorkers.push(w.name);
2273
+ recommendations.push(`Send reminder to non-reporting ${w.name}`);
2274
+ }
2275
+ }
2276
+ for (const taskId of reclaimedTaskIds) {
2277
+ recommendations.push(`Reclaimed expired claim for task-${taskId}`);
2278
+ }
2279
+ const rebalanceDecisions = buildRebalanceDecisions({
2280
+ tasks: taskView,
2281
+ workers: workers.map((worker) => ({
2282
+ name: worker.name,
2283
+ role: config.workers.find((entry) => entry.name === worker.name)?.role,
2284
+ alive: worker.alive,
2285
+ status: worker.status,
2286
+ })),
2287
+ reclaimedTaskIds,
2288
+ });
2289
+ let assignedDuringMonitor = false;
2290
+ for (const decision of rebalanceDecisions) {
2291
+ if (decision.type === 'assign' && decision.taskId && decision.workerName) {
2292
+ try {
2293
+ await assignTask(sanitized, decision.workerName, decision.taskId, cwd);
2294
+ recommendations.push(`Assigned task-${decision.taskId} to ${decision.workerName}: ${decision.reason}`);
2295
+ assignedDuringMonitor = true;
2296
+ }
2297
+ catch (error) {
2298
+ const message = error instanceof Error ? error.message : String(error);
2299
+ recommendations.push(`Unable to assign task-${decision.taskId} to ${decision.workerName}: ${message}`);
2300
+ }
2301
+ }
2302
+ else {
2303
+ recommendations.push(decision.reason);
2304
+ }
2305
+ }
2306
+ if (assignedDuringMonitor) {
2307
+ taskView = await listTasks(sanitized, cwd);
2308
+ }
2309
+ // Count tasks
2310
+ const taskCounts = {
2311
+ total: taskView.length,
2312
+ pending: taskView.filter(t => t.status === 'pending').length,
2313
+ blocked: taskView.filter(t => t.status === 'blocked').length,
2314
+ in_progress: taskView.filter(t => t.status === 'in_progress').length,
2315
+ completed: taskView.filter(t => t.status === 'completed').length,
2316
+ failed: taskView.filter(t => t.status === 'failed').length,
2317
+ };
2318
+ const verificationPendingTasks = taskView.filter((task) => task.status === 'completed'
2319
+ && task.requires_code_change === true
2320
+ && !hasStructuredVerificationEvidence(task.result));
2321
+ if (verificationPendingTasks.length > 0) {
2322
+ for (const task of verificationPendingTasks) {
2323
+ recommendations.push(`Verification evidence missing for task-${task.id}; require structured PASS/FAIL evidence before terminal success`);
2324
+ }
2325
+ }
2326
+ const allTasksTerminal = taskCounts.pending === 0 && taskCounts.blocked === 0 && taskCounts.in_progress === 0;
2327
+ const deadWorkerStall = config.worker_launch_mode === 'prompt'
2328
+ && config.workers.length > 0
2329
+ && deadWorkers.length >= config.workers.length
2330
+ && !allTasksTerminal;
2331
+ const persistedPhase = await readTeamPhaseState(sanitized, cwd);
2332
+ const targetPhase = deadWorkerStall
2333
+ ? 'failed'
2334
+ : inferPhaseTargetFromTaskCounts(taskCounts, {
2335
+ verificationPending: verificationPendingTasks.length > 0,
2336
+ });
2337
+ const phaseState = reconcilePhaseStateForMonitor(persistedPhase, targetPhase);
2338
+ await writeTeamPhaseState(sanitized, phaseState, cwd);
2339
+ const phase = phaseState.current_phase;
2340
+ await syncRootTeamModeStateOnTerminalPhase(sanitized, phase, cwd);
2341
+ if (deadWorkerStall) {
2342
+ recommendations.push('All workers are dead while work remains; mark the team failed or restart with fresh workers.');
2343
+ }
2344
+ await emitMonitorDerivedEvents(sanitized, taskView, workers, previousSnapshot, config.worker_launch_mode, cwd);
2345
+ const integrationByWorker = await integrateWorkerCommitsIntoLeader({
2346
+ teamName: sanitized,
2347
+ config,
2348
+ previous: previousSnapshot,
2349
+ cwd,
2350
+ });
2351
+ const mailboxDeliveryStartMs = performance.now();
2352
+ const mailboxNotifiedByMessageId = await deliverPendingMailboxMessages(sanitized, config, workers, previousSnapshot?.mailboxNotifiedByMessageId ?? {}, dispatchPolicy, cwd);
2353
+ const mailboxDeliveryMs = performance.now() - mailboxDeliveryStartMs;
2354
+ // Prune ephemeral status messages from leader mailbox (TTL: 60s)
2355
+ try {
2356
+ const leaderMailbox = await listMailboxMessages(sanitized, 'leader-fixed', cwd);
2357
+ const now = Date.now();
2358
+ for (const msg of leaderMailbox) {
2359
+ if (msg.from_worker === 'system' && msg.created_at) {
2360
+ const age = now - new Date(msg.created_at).getTime();
2361
+ if (age > 60_000) {
2362
+ await markMessageDelivered(sanitized, 'leader-fixed', msg.message_id, cwd);
2363
+ }
2364
+ }
2365
+ }
2366
+ }
2367
+ catch (err) {
2368
+ process.stderr.write(`[team/runtime] operation failed: ${err}\n`);
2369
+ }
2370
+ const updatedAt = new Date().toISOString();
2371
+ const totalMs = performance.now() - monitorStartMs;
2372
+ await writeMonitorSnapshot(sanitized, {
2373
+ taskStatusById: Object.fromEntries(taskView.map((t) => [t.id, t.status])),
2374
+ workerAliveByName: Object.fromEntries(workers.map((w) => [w.name, w.alive])),
2375
+ workerStateByName: Object.fromEntries(workers.map((w) => [w.name, w.status.state])),
2376
+ workerTurnCountByName: Object.fromEntries(workers.map((w) => [w.name, w.heartbeat?.turn_count ?? 0])),
2377
+ workerTaskIdByName: Object.fromEntries(workers.map((w) => [w.name, w.status.current_task_id ?? ''])),
2378
+ mailboxNotifiedByMessageId,
2379
+ completedEventTaskIds: previousSnapshot?.completedEventTaskIds ?? {},
2380
+ integrationByWorker,
2381
+ monitorTimings: {
2382
+ list_tasks_ms: Number(listTasksMs.toFixed(2)),
2383
+ worker_scan_ms: Number(workerScanMs.toFixed(2)),
2384
+ mailbox_delivery_ms: Number(mailboxDeliveryMs.toFixed(2)),
2385
+ total_ms: Number(totalMs.toFixed(2)),
2386
+ updated_at: updatedAt,
2387
+ },
2388
+ }, cwd);
2389
+ return {
2390
+ teamName: sanitized,
2391
+ phase,
2392
+ workers,
2393
+ tasks: {
2394
+ ...taskCounts,
2395
+ items: taskView,
2396
+ },
2397
+ allTasksTerminal,
2398
+ deadWorkers,
2399
+ nonReportingWorkers,
2400
+ recommendations,
2401
+ performance: {
2402
+ list_tasks_ms: Number(listTasksMs.toFixed(2)),
2403
+ worker_scan_ms: Number(workerScanMs.toFixed(2)),
2404
+ mailbox_delivery_ms: Number(mailboxDeliveryMs.toFixed(2)),
2405
+ total_ms: Number(totalMs.toFixed(2)),
2406
+ updated_at: updatedAt,
2407
+ },
2408
+ };
2409
+ }
2410
+ /**
2411
+ * Assign a task to a worker by writing inbox and sending trigger.
2412
+ */
2413
+ export async function assignTask(teamName, workerName, taskId, cwd) {
2414
+ const sanitized = sanitizeTeamName(teamName);
2415
+ const task = await readTask(sanitized, taskId, cwd);
2416
+ if (!task)
2417
+ throw new Error(`Task ${taskId} not found`);
2418
+ const manifest = await readTeamManifestV2(sanitized, cwd);
2419
+ const governance = resolveGovernancePolicy(manifest?.governance);
2420
+ if (governance.delegation_only && workerName === 'leader-fixed') {
2421
+ throw new Error('delegation_only_violation');
2422
+ }
2423
+ if (governance.plan_approval_required && task.requires_code_change === true) {
2424
+ const approved = await isTaskApprovedForExecution(sanitized, taskId, cwd);
2425
+ if (!approved) {
2426
+ throw new Error('plan_approval_required');
2427
+ }
2428
+ }
2429
+ const config = await readTeamConfig(sanitized, cwd);
2430
+ if (!config)
2431
+ throw new Error(`Team ${sanitized} not found`);
2432
+ const workerInfo = config.workers.find(w => w.name === workerName);
2433
+ if (!workerInfo)
2434
+ throw new Error(`Worker ${workerName} not found in team`);
2435
+ const dispatchPolicy = resolveDispatchPolicy(manifest?.policy, config.worker_launch_mode);
2436
+ const claim = await claimTask(sanitized, taskId, workerName, task.version ?? 1, cwd);
2437
+ if (!claim.ok) {
2438
+ if (claim.error === 'blocked_dependency') {
2439
+ throw new Error(`blocked_dependency:${(claim.dependencies ?? []).join(',')}`);
2440
+ }
2441
+ throw new Error(claim.error);
2442
+ }
2443
+ try {
2444
+ // Retry dispatch up to 2 times to handle trust prompts during assignment (fixes #393).
2445
+ const taskForInbox = task.delegation
2446
+ ? task
2447
+ : (await updateTask(sanitized, taskId, { delegation: synthesizeDelegationPlan(task) }, cwd)) ?? task;
2448
+ const inbox = generateTaskAssignmentInbox(workerName, sanitized, taskForInbox);
2449
+ const maxAssignRetries = 2;
2450
+ const assignRetryDelayS = 2;
2451
+ let outcome = { ok: false, transport: 'none', reason: 'not_attempted' };
2452
+ const triggerDirective = buildTriggerDirective(workerName, sanitized, resolveInstructionStateRoot(workerInfo.worktree_path));
2453
+ for (let attempt = 1; attempt <= maxAssignRetries; attempt++) {
2454
+ outcome = await dispatchCriticalInboxInstruction({
2455
+ teamName: sanitized,
2456
+ config,
2457
+ workerName,
2458
+ workerIndex: workerInfo.index,
2459
+ paneId: workerInfo.pane_id,
2460
+ inbox,
2461
+ triggerMessage: triggerDirective.text,
2462
+ intent: triggerDirective.intent,
2463
+ cwd,
2464
+ dispatchPolicy,
2465
+ inboxCorrelationKey: `assign:${taskId}:${workerName}`,
2466
+ });
2467
+ if (outcome.ok)
2468
+ break;
2469
+ if (attempt < maxAssignRetries && config.worker_launch_mode === 'interactive' && config.tmux_session) {
2470
+ if (dismissTrustPromptIfPresent(config.tmux_session, workerInfo.index, workerInfo.pane_id)) {
2471
+ waitForWorkerReady(config.tmux_session, workerInfo.index, resolveWorkerReadyTimeoutMs(process.env), workerInfo.pane_id);
2472
+ }
2473
+ else {
2474
+ await new Promise(r => setTimeout(r, assignRetryDelayS * 1000));
2475
+ }
2476
+ }
2477
+ }
2478
+ if (!outcome.ok) {
2479
+ throw new Error('worker_notify_failed');
2480
+ }
2481
+ }
2482
+ catch (error) {
2483
+ // Roll back claim to avoid stuck in_progress tasks on any post-claim dispatch failure.
2484
+ const released = await releaseTaskClaim(sanitized, taskId, claim.claimToken, workerName, cwd);
2485
+ const reason = error instanceof Error && error.message.trim() !== ''
2486
+ ? error.message
2487
+ : 'worker_assignment_failed';
2488
+ try {
2489
+ await writeWorkerInbox(sanitized, workerName, `# Assignment Cancelled\n\nTask ${taskId} was not dispatched due to ${reason}.\nDo not execute this task from prior inbox content.`, cwd);
2490
+ }
2491
+ catch (err) {
2492
+ process.stderr.write(`[team/runtime] operation failed: ${err}\n`);
2493
+ // best effort
2494
+ }
2495
+ if (!released.ok) {
2496
+ throw new Error(`${reason}:${released.error}`);
2497
+ }
2498
+ if (reason === 'worker_notify_failed')
2499
+ throw new Error('worker_notify_failed');
2500
+ throw new Error(`worker_assignment_failed:${reason}`);
2501
+ }
2502
+ }
2503
+ /**
2504
+ * Reassign a task from one worker to another.
2505
+ */
2506
+ export async function reassignTask(teamName, taskId, _fromWorker, toWorker, cwd) {
2507
+ await assignTask(teamName, toWorker, taskId, cwd);
2508
+ }
2509
+ function resolveCommitHygieneArtifactTeamNames(config, internalTeamName) {
2510
+ const names = [];
2511
+ for (const value of [config.requested_name, config.display_name, internalTeamName]) {
2512
+ if (typeof value !== 'string' || value.trim() === '')
2513
+ continue;
2514
+ try {
2515
+ const sanitized = sanitizeTeamName(value);
2516
+ if (!names.includes(sanitized))
2517
+ names.push(sanitized);
2518
+ }
2519
+ catch {
2520
+ // Persisted display/request names are best-effort aliases. If an older
2521
+ // state file contains an invalid value, fall back to the internal name.
2522
+ }
2523
+ }
2524
+ if (!names.includes(internalTeamName))
2525
+ names.push(internalTeamName);
2526
+ return names;
2527
+ }
2528
+ /**
2529
+ * Graceful shutdown: send shutdown inbox to all workers, wait, force kill, cleanup.
2530
+ */
2531
+ export async function shutdownTeam(teamName, cwd, options = {}) {
2532
+ const force = options.force === true;
2533
+ const confirmIssues = options.confirmIssues === true;
2534
+ let skipWorkerAcks = false;
2535
+ const sanitized = resolveTeamNameForCurrentContext(teamName, cwd);
2536
+ const config = await readTeamConfig(sanitized, cwd);
2537
+ if (!config) {
2538
+ // No config -- just try to kill tmux session and clean up
2539
+ try {
2540
+ destroyTeamSession(`rcs-team-${sanitized}`);
2541
+ }
2542
+ catch (err) {
2543
+ process.stderr.write(`[team/runtime] operation failed: ${err}\n`);
2544
+ }
2545
+ await cleanupTeamState(sanitized, cwd);
2546
+ await syncTeamModeStateOnShutdown(sanitized, cwd);
2547
+ restoreTeamModelInstructionsFile(sanitized);
2548
+ return { commitHygieneArtifacts: null };
2549
+ }
2550
+ const manifest = await readTeamManifestV2(sanitized, cwd);
2551
+ const leaderSessionId = typeof manifest?.leader?.session_id === 'string'
2552
+ ? manifest.leader.session_id.trim()
2553
+ : '';
2554
+ const governance = resolveGovernancePolicy(manifest?.governance, manifest?.policy);
2555
+ if (!force) {
2556
+ const classification = await classifyShutdown({
2557
+ teamName: sanitized,
2558
+ cwd,
2559
+ config,
2560
+ governance,
2561
+ confirmIssues,
2562
+ });
2563
+ const { gate, dirtyWorkers, requiresIssueConfirmation, useCleanFastPath } = classification;
2564
+ await appendTeamEvent(sanitized, {
2565
+ type: 'shutdown_gate',
2566
+ worker: 'leader-fixed',
2567
+ reason: `allowed=${gate.allowed} total=${gate.total} pending=${gate.pending} blocked=${gate.blocked} in_progress=${gate.in_progress} completed=${gate.completed} failed=${gate.failed} cleanup_requires_all_workers_inactive=${governance.cleanup_requires_all_workers_inactive} dirty_workers=${dirtyWorkers.join('|') || 'none'} confirm_issues=${confirmIssues} clean_fast_path=${useCleanFastPath}`,
2568
+ }, cwd).catch(() => { });
2569
+ if (!gate.allowed) {
2570
+ if (requiresIssueConfirmation) {
2571
+ throw new Error(`shutdown_confirm_issues_required:failed=${gate.failed}:rerun=rcs team shutdown ${sanitized} --confirm-issues`);
2572
+ }
2573
+ throw new Error(`shutdown_gate_blocked:pending=${gate.pending},blocked=${gate.blocked},in_progress=${gate.in_progress},failed=${gate.failed}`);
2574
+ }
2575
+ skipWorkerAcks = useCleanFastPath;
2576
+ }
2577
+ if (force) {
2578
+ await appendTeamEvent(sanitized, {
2579
+ type: 'shutdown_gate_forced',
2580
+ worker: 'leader-fixed',
2581
+ reason: 'force_bypass',
2582
+ }, cwd).catch(() => { });
2583
+ }
2584
+ if (force && config.worker_launch_mode === 'prompt') {
2585
+ // Prompt-mode workers are raw CLI children, not team-runtime workers that
2586
+ // participate in the shutdown-ack handshake. Waiting the full ack window
2587
+ // before force-killing them only adds deterministic suite slowness.
2588
+ skipWorkerAcks = true;
2589
+ }
2590
+ const sessionName = config.tmux_session;
2591
+ const dispatchPolicy = resolveDispatchPolicy(manifest?.policy, config.worker_launch_mode);
2592
+ const shutdownRequestTimes = new Map();
2593
+ if (!skipWorkerAcks) {
2594
+ // 1. Send shutdown inbox to each worker
2595
+ for (const w of config.workers) {
2596
+ try {
2597
+ const requestedAt = new Date().toISOString();
2598
+ await writeShutdownRequest(sanitized, w.name, 'leader-fixed', cwd);
2599
+ shutdownRequestTimes.set(w.name, requestedAt);
2600
+ const triggerDirective = buildTriggerDirective(w.name, sanitized, resolveInstructionStateRoot(w.worktree_path));
2601
+ await dispatchCriticalInboxInstruction({
2602
+ teamName: sanitized,
2603
+ config,
2604
+ workerName: w.name,
2605
+ workerIndex: w.index,
2606
+ paneId: w.pane_id,
2607
+ inbox: generateShutdownInbox(sanitized, w.name),
2608
+ triggerMessage: triggerDirective.text,
2609
+ intent: triggerDirective.intent,
2610
+ cwd,
2611
+ dispatchPolicy,
2612
+ inboxCorrelationKey: `shutdown:${w.name}`,
2613
+ });
2614
+ }
2615
+ catch (err) {
2616
+ process.stderr.write(`[team/runtime] operation failed: ${err}\n`);
2617
+ }
2618
+ }
2619
+ // 2. Wait up to 15s for workers to exit and collect acks
2620
+ const deadline = Date.now() + 15_000;
2621
+ const rejected = [];
2622
+ const ackedWorkers = new Set();
2623
+ while (Date.now() < deadline) {
2624
+ for (const w of config.workers) {
2625
+ const ack = await readShutdownAck(sanitized, w.name, cwd, shutdownRequestTimes.get(w.name));
2626
+ if (ack && !ackedWorkers.has(w.name)) {
2627
+ ackedWorkers.add(w.name);
2628
+ await appendTeamEvent(sanitized, {
2629
+ type: 'shutdown_ack',
2630
+ worker: w.name,
2631
+ reason: ack.status === 'reject' ? `reject:${ack.reason || 'no_reason'}` : 'accept',
2632
+ }, cwd);
2633
+ }
2634
+ if (ack?.status === 'reject') {
2635
+ if (!rejected.some((r) => r.worker === w.name)) {
2636
+ rejected.push({ worker: w.name, reason: ack.reason || 'no_reason' });
2637
+ }
2638
+ }
2639
+ }
2640
+ if (rejected.length > 0 && !force) {
2641
+ const detail = rejected.map(r => `${r.worker}:${r.reason}`).join(',');
2642
+ throw new Error(`shutdown_rejected:${detail}`);
2643
+ }
2644
+ const anyAlive = config.workers.some((w) => (config.worker_launch_mode === 'prompt'
2645
+ ? isPromptWorkerAlive(config, w)
2646
+ : isWorkerAlive(sessionName, w.index, w.pane_id)));
2647
+ if (!anyAlive)
2648
+ break;
2649
+ // Sleep 2s
2650
+ await new Promise(resolve => setTimeout(resolve, 2000));
2651
+ }
2652
+ const anyAliveAfterWait = config.workers.some((w) => (config.worker_launch_mode === 'prompt'
2653
+ ? isPromptWorkerAlive(config, w)
2654
+ : isWorkerAlive(sessionName, w.index, w.pane_id)));
2655
+ if (anyAliveAfterWait && !force) {
2656
+ // Workers may have accepted shutdown but not exited (Codex TUI requires explicit exit).
2657
+ // In this case, proceed to force kill panes (next step) rather than failing and leaving state around.
2658
+ }
2659
+ }
2660
+ // 3. Force kill remaining workers
2661
+ const leaderPaneId = config.leader_pane_id;
2662
+ const hudPaneId = config.hud_pane_id;
2663
+ if (config.worker_launch_mode === 'interactive') {
2664
+ const sharedSessionTopology = sessionName.includes(':')
2665
+ ? resolveSharedSessionShutdownTopology(sessionName, leaderPaneId)
2666
+ : null;
2667
+ const effectiveLeaderPaneId = sharedSessionTopology?.leaderPaneId ?? leaderPaneId;
2668
+ const effectiveHudPaneId = sharedSessionTopology?.hudPaneIds.find((paneId) => paneId === hudPaneId)
2669
+ ?? sharedSessionTopology?.hudPaneIds[0]
2670
+ ?? hudPaneId;
2671
+ const livePaneIds = sharedSessionTopology?.livePaneIds ?? listPaneIds(sessionName);
2672
+ let shutdownPaneIds = collectShutdownPaneIds({
2673
+ config,
2674
+ livePaneIds,
2675
+ leaderPaneId: effectiveLeaderPaneId,
2676
+ hudPaneId: effectiveHudPaneId,
2677
+ });
2678
+ if (shouldPrekillInteractiveShutdownProcessTrees(sessionName)) {
2679
+ const workerPanePids = shutdownPaneIds
2680
+ .map((paneId) => getWorkerPanePid(sessionName, 1, paneId))
2681
+ .filter((pid) => typeof pid === 'number' && Number.isFinite(pid) && pid > 0);
2682
+ for (const panePid of workerPanePids) {
2683
+ await terminateTrackedProcessTree(panePid);
2684
+ }
2685
+ }
2686
+ let resizeHookWarning = null;
2687
+ if (config.resize_hook_name && config.resize_hook_target) {
2688
+ const resizeHookName = config.resize_hook_name;
2689
+ const unregistered = unregisterResizeHook(config.resize_hook_target, resizeHookName);
2690
+ if (!unregistered && isTmuxAvailable()) {
2691
+ const baseSession = sessionName.split(':')[0];
2692
+ const sessionStillActive = listTeamSessions().includes(baseSession);
2693
+ if (sessionStillActive) {
2694
+ resizeHookWarning = `failed to unregister resize hook ${resizeHookName}`;
2695
+ }
2696
+ }
2697
+ }
2698
+ config.resize_hook_name = null;
2699
+ config.resize_hook_target = null;
2700
+ await saveTeamConfig(config, cwd);
2701
+ if (resizeHookWarning) {
2702
+ console.warn(`[team shutdown] ${sanitized}: ${resizeHookWarning}; continuing teardown`);
2703
+ }
2704
+ let restoredHudPaneId = null;
2705
+ if (effectiveHudPaneId) {
2706
+ await killWorkerByPaneIdAsync(effectiveHudPaneId, effectiveLeaderPaneId ?? undefined);
2707
+ if (sessionName.includes(':')) {
2708
+ restoredHudPaneId = restoreStandaloneHudPane(effectiveLeaderPaneId, cwd);
2709
+ if (!restoredHudPaneId) {
2710
+ console.warn(`[team shutdown] ${sanitized}: failed to restore standalone HUD pane`);
2711
+ }
2712
+ }
2713
+ }
2714
+ shutdownPaneIds = collectShutdownPaneIds({
2715
+ config,
2716
+ livePaneIds: listPaneIds(sessionName),
2717
+ restoredStandaloneHudPaneId: restoredHudPaneId,
2718
+ leaderPaneId: effectiveLeaderPaneId,
2719
+ hudPaneId: effectiveHudPaneId,
2720
+ });
2721
+ await teardownWorkerPanes(shutdownPaneIds, {
2722
+ leaderPaneId: effectiveLeaderPaneId,
2723
+ hudPaneId: restoredHudPaneId ?? effectiveHudPaneId,
2724
+ });
2725
+ // 4. Destroy tmux session
2726
+ if (!sessionName.includes(':')) {
2727
+ try {
2728
+ destroyTeamSession(sessionName);
2729
+ }
2730
+ catch (err) {
2731
+ process.stderr.write(`[team/runtime] operation failed: ${err}\n`);
2732
+ }
2733
+ }
2734
+ }
2735
+ else {
2736
+ const promptTeardownFailures = [];
2737
+ for (const w of config.workers) {
2738
+ const teardown = await teardownPromptWorker(sanitized, w.name, w.pid, cwd, 'shutdown');
2739
+ if (!teardown.terminated) {
2740
+ promptTeardownFailures.push(`${w.name}:${teardown.error || 'unknown_error'}`);
2741
+ }
2742
+ }
2743
+ if (promptTeardownFailures.length > 0) {
2744
+ throw new Error(`shutdown_prompt_teardown_failed:${promptTeardownFailures.join(',')}`);
2745
+ }
2746
+ }
2747
+ const shutdownReports = await prepareWorkerWorktreeShutdownReports(config, cwd);
2748
+ const commitHygieneEntries = [];
2749
+ for (const report of shutdownReports) {
2750
+ const worker = config.workers.find((entry) => entry.name === report.workerName);
2751
+ if (report.syntheticCommit) {
2752
+ commitHygieneEntries.push({
2753
+ recorded_at: new Date().toISOString(),
2754
+ operation: 'shutdown_checkpoint',
2755
+ worker_name: report.workerName,
2756
+ task_id: worker?.assigned_tasks[0],
2757
+ status: 'applied',
2758
+ operational_commit: report.syntheticCommit,
2759
+ source_commit: report.sourceRef,
2760
+ worktree_path: report.worktreePath,
2761
+ report_path: report.reportPath,
2762
+ detail: 'Runtime created a shutdown checkpoint commit to preserve worker worktree changes.',
2763
+ });
2764
+ }
2765
+ if (report.sourceRef && report.mergeOutcome !== 'skipped') {
2766
+ commitHygieneEntries.push({
2767
+ recorded_at: new Date().toISOString(),
2768
+ operation: 'shutdown_merge',
2769
+ worker_name: report.workerName,
2770
+ task_id: worker?.assigned_tasks[0],
2771
+ status: report.mergeOutcome === 'merged' ? 'applied' : report.mergeOutcome,
2772
+ operational_commit: report.mergeOutcome === 'merged' ? report.leaderHeadAfter : null,
2773
+ source_commit: report.sourceRef,
2774
+ leader_head_before: report.leaderHeadBefore,
2775
+ leader_head_after: report.leaderHeadAfter,
2776
+ worktree_path: report.worktreePath,
2777
+ report_path: report.reportPath,
2778
+ detail: report.mergeDetail,
2779
+ });
2780
+ }
2781
+ }
2782
+ const artifactCwd = resolveTeamCommitHygieneArtifactCwd(config, cwd);
2783
+ const taskView = await listTasks(sanitized, cwd).catch(() => []);
2784
+ const internalLedger = await appendTeamCommitHygieneEntries(sanitized, commitHygieneEntries, artifactCwd);
2785
+ const commitHygieneArtifactTeamNames = resolveCommitHygieneArtifactTeamNames(config, sanitized);
2786
+ let commitHygieneArtifacts = null;
2787
+ for (const artifactTeamName of commitHygieneArtifactTeamNames) {
2788
+ const ledger = artifactTeamName === sanitized
2789
+ ? internalLedger
2790
+ : await appendTeamCommitHygieneEntries(artifactTeamName, internalLedger.entries, artifactCwd);
2791
+ const commitHygieneContext = buildTeamCommitHygieneContext({
2792
+ teamName: artifactTeamName,
2793
+ tasks: taskView,
2794
+ ledger,
2795
+ });
2796
+ const writtenArtifacts = await writeTeamCommitHygieneContext(artifactTeamName, commitHygieneContext, artifactCwd);
2797
+ commitHygieneArtifacts ??= writtenArtifacts;
2798
+ }
2799
+ // 5. Remove worker worktree-root instructions and team-scoped fallback instructions.
2800
+ for (const worker of config.workers) {
2801
+ if (!worker.worktree_path || !worker.team_state_root)
2802
+ continue;
2803
+ try {
2804
+ await removeWorkerWorktreeRootAgentsFile(sanitized, worker.name, worker.team_state_root, worker.worktree_path);
2805
+ }
2806
+ catch (err) {
2807
+ process.stderr.write(`[team/runtime] operation failed: ${err}\n`);
2808
+ }
2809
+ }
2810
+ try {
2811
+ await removeTeamWorkerInstructionsFile(sanitized, cwd);
2812
+ }
2813
+ catch (err) {
2814
+ process.stderr.write(`[team/runtime] operation failed: ${err}\n`);
2815
+ }
2816
+ restoreTeamModelInstructionsFile(sanitized);
2817
+ const cleanupErrors = [];
2818
+ const provisionedWorktrees = collectProvisionedShutdownWorktrees(config);
2819
+ if (provisionedWorktrees.length > 0) {
2820
+ try {
2821
+ await rollbackProvisionedWorktrees(provisionedWorktrees, {
2822
+ skipBranchDeletion: false,
2823
+ });
2824
+ }
2825
+ catch (err) {
2826
+ cleanupErrors.push(`rollbackProvisionedWorktrees: ${String(err)}`);
2827
+ }
2828
+ }
2829
+ // 7. Cleanup state
2830
+ let teamStateCleaned = false;
2831
+ try {
2832
+ await cleanupTeamState(sanitized, cwd);
2833
+ teamStateCleaned = true;
2834
+ }
2835
+ catch (err) {
2836
+ cleanupErrors.push(`cleanupTeamState: ${String(err)}`);
2837
+ }
2838
+ if (teamStateCleaned) {
2839
+ await syncTeamModeStateOnShutdown(sanitized, cwd, leaderSessionId);
2840
+ }
2841
+ if (cleanupErrors.length > 0) {
2842
+ throw new Error(cleanupErrors.join(' | '));
2843
+ }
2844
+ return { commitHygieneArtifacts };
2845
+ }
2846
+ /**
2847
+ * Resume monitoring an existing team.
2848
+ */
2849
+ export async function resumeTeam(teamName, cwd) {
2850
+ const sanitized = resolveTeamNameForCurrentContext(teamName, cwd);
2851
+ const config = await readTeamConfig(sanitized, cwd);
2852
+ if (!config)
2853
+ return null;
2854
+ config.lifecycle_profile = 'default';
2855
+ if (config.worker_launch_mode === 'prompt') {
2856
+ const handleTeamConfig = { ...config, name: sanitized };
2857
+ const hasLivePromptWorker = config.workers.some((worker) => isPromptWorkerAlive(handleTeamConfig, worker));
2858
+ if (!hasLivePromptWorker)
2859
+ return null;
2860
+ const missingHandles = config.workers
2861
+ .filter((worker) => {
2862
+ if (!Number.isFinite(worker.pid) || (worker.pid ?? 0) <= 0)
2863
+ return false;
2864
+ return isPidAlive(worker.pid);
2865
+ })
2866
+ .filter((worker) => !getPromptWorkerHandle(sanitized, worker.name));
2867
+ if (missingHandles.length > 0) {
2868
+ const detail = missingHandles.map((worker) => `${worker.name}:${worker.pid ?? 'unknown'}`).join(',');
2869
+ await appendTeamEvent(sanitized, {
2870
+ type: 'worker_stopped',
2871
+ worker: 'leader-fixed',
2872
+ reason: `prompt_resume_unavailable:missing_handle:${detail}`,
2873
+ }, cwd).catch(() => { });
2874
+ return null;
2875
+ }
2876
+ }
2877
+ else {
2878
+ // Check if tmux session still exists
2879
+ const baseSession = config.tmux_session.split(':')[0];
2880
+ const teamSessions = getTeamTmuxSessions(sanitized);
2881
+ if (!teamSessions.includes(baseSession))
2882
+ return null;
2883
+ }
2884
+ return {
2885
+ teamName: sanitized,
2886
+ sanitizedName: sanitized,
2887
+ sessionName: config.tmux_session,
2888
+ config,
2889
+ cwd,
2890
+ };
2891
+ }
2892
+ async function findActiveTeams(cwd, leaderSessionId) {
2893
+ const root = join(cwd, '.rcs', 'state', 'team');
2894
+ if (!existsSync(root))
2895
+ return [];
2896
+ const sessions = new Set(listTeamSessions());
2897
+ const entries = await readdir(root, { withFileTypes: true });
2898
+ const active = [];
2899
+ for (const e of entries) {
2900
+ if (!e.isDirectory())
2901
+ continue;
2902
+ const teamName = e.name;
2903
+ const cfg = await readTeamConfig(teamName, cwd);
2904
+ const manifest = await readTeamManifestV2(teamName, cwd);
2905
+ const governance = resolveGovernancePolicy(manifest?.governance);
2906
+ if (governance.one_team_per_leader_session === false)
2907
+ continue;
2908
+ const workerLaunchMode = cfg?.worker_launch_mode
2909
+ ?? manifest?.policy?.worker_launch_mode
2910
+ ?? 'interactive';
2911
+ const tmuxSession = (manifest?.tmux_session || cfg?.tmux_session || `rcs-team-${teamName}`).split(':')[0];
2912
+ if (leaderSessionId) {
2913
+ const ownerSessionId = manifest?.leader?.session_id?.trim() ?? '';
2914
+ if (ownerSessionId && ownerSessionId !== leaderSessionId)
2915
+ continue;
2916
+ }
2917
+ if (workerLaunchMode === 'prompt') {
2918
+ if ((cfg?.workers ?? []).some((worker) => isPromptWorkerAlive(cfg, worker))) {
2919
+ active.push(teamName);
2920
+ }
2921
+ continue;
2922
+ }
2923
+ if (sessions.has(tmuxSession))
2924
+ active.push(teamName);
2925
+ }
2926
+ return active;
2927
+ }
2928
+ async function detectAndCleanStaleTeam(teamName, leaderCwd, workerCount, confirmFn) {
2929
+ const stateDir = join(leaderCwd, '.rcs', 'state', 'team', teamName);
2930
+ if (!existsSync(stateDir))
2931
+ return;
2932
+ const sessions = new Set(listTeamSessions());
2933
+ if (sessions.has(`rcs-team-${teamName}`))
2934
+ return;
2935
+ const repoRootResult = spawnSync('git', ['rev-parse', '--show-toplevel'], {
2936
+ cwd: leaderCwd, encoding: 'utf-8', windowsHide: true,
2937
+ });
2938
+ if (repoRootResult.status !== 0)
2939
+ return;
2940
+ const repoRoot = repoRootResult.stdout.trim();
2941
+ const worktreePaths = [];
2942
+ for (let i = 1; i <= workerCount; i++) {
2943
+ const wtPath = join(repoRoot, '.rcs', 'team', teamName, 'worktrees', `worker-${i}`);
2944
+ if (existsSync(wtPath))
2945
+ worktreePaths.push(wtPath);
2946
+ }
2947
+ if (worktreePaths.length === 0) {
2948
+ await cleanupTeamState(teamName, leaderCwd);
2949
+ return;
2950
+ }
2951
+ const hasDirtyWorktrees = worktreePaths.some((p) => {
2952
+ try {
2953
+ return isWorktreeDirty(p);
2954
+ }
2955
+ catch {
2956
+ return false;
2957
+ }
2958
+ });
2959
+ const summary = { teamName, worktreePaths, statePath: stateDir, hasDirtyWorktrees };
2960
+ if (!confirmFn) {
2961
+ throw new Error(`stale_team_artifacts:${teamName}:${worktreePaths.length}_worktrees:` +
2962
+ 'pass_confirmStaleCleanup_or_manually_remove');
2963
+ }
2964
+ const confirmed = await confirmFn(summary);
2965
+ if (!confirmed) {
2966
+ throw new Error(`stale_team_cleanup_declined:${teamName}:` +
2967
+ 'manually_remove_worktrees_and_state_before_retrying');
2968
+ }
2969
+ for (const wtPath of worktreePaths) {
2970
+ await removeWorktreeForce(repoRoot, wtPath);
2971
+ }
2972
+ await cleanupTeamState(teamName, leaderCwd);
2973
+ }
2974
+ async function resolveLeaderSessionId(cwd) {
2975
+ const fromEnv = process.env.RCS_SESSION_ID || process.env.CODEX_SESSION_ID || process.env.SESSION_ID;
2976
+ if (fromEnv && fromEnv.trim() !== '')
2977
+ return fromEnv.trim();
2978
+ const p = join(cwd, '.rcs', 'state', 'session.json');
2979
+ if (!existsSync(p))
2980
+ return '';
2981
+ try {
2982
+ const raw = await readFile(p, 'utf-8');
2983
+ const parsed = JSON.parse(raw);
2984
+ if (typeof parsed.session_id === 'string' && parsed.session_id.trim() !== '')
2985
+ return parsed.session_id.trim();
2986
+ }
2987
+ catch (err) {
2988
+ process.stderr.write(`[team/runtime] operation failed: ${err}\n`);
2989
+ return '';
2990
+ }
2991
+ return '';
2992
+ }
2993
+ async function isTaskApprovedForExecution(teamName, taskId, cwd) {
2994
+ const record = await readTaskApproval(teamName, taskId, cwd);
2995
+ return record?.status === 'approved';
2996
+ }
2997
+ async function emitMonitorDerivedEvents(teamName, tasks, workers, previous, workerLaunchMode, cwd) {
2998
+ for (const task of tasks) {
2999
+ const prevStatus = previous?.taskStatusById[task.id];
3000
+ if (prevStatus && prevStatus !== 'completed' && task.status === 'completed') {
3001
+ // Skip if a task_completed event was already emitted by transitionTaskStatus (issue #161).
3002
+ if (previous?.completedEventTaskIds?.[task.id])
3003
+ continue;
3004
+ await appendTeamEvent(teamName, {
3005
+ type: 'task_completed',
3006
+ worker: task.owner || 'unknown',
3007
+ task_id: task.id,
3008
+ message_id: null,
3009
+ reason: undefined,
3010
+ }, cwd);
3011
+ }
3012
+ }
3013
+ for (const worker of workers) {
3014
+ const prevAlive = previous?.workerAliveByName[worker.name];
3015
+ const shouldEmitInitialPromptWorkerStop = workerLaunchMode === 'prompt' && prevAlive === undefined;
3016
+ if ((prevAlive === true || shouldEmitInitialPromptWorkerStop) && worker.alive === false) {
3017
+ await appendTeamEvent(teamName, {
3018
+ type: 'worker_stopped',
3019
+ worker: worker.name,
3020
+ task_id: worker.status.current_task_id,
3021
+ message_id: null,
3022
+ reason: worker.status.reason,
3023
+ }, cwd);
3024
+ await emitCanonicalWorkerEvent(cwd, 'worker.stalled', {
3025
+ worker: worker.name,
3026
+ task_id: worker.status.current_task_id,
3027
+ reason: worker.status.reason || 'worker_stopped',
3028
+ status: 'worker.stalled',
3029
+ });
3030
+ }
3031
+ const prevState = previous?.workerStateByName[worker.name];
3032
+ if (prevState && prevState !== worker.status.state) {
3033
+ await appendTeamEvent(teamName, {
3034
+ type: 'worker_state_changed',
3035
+ worker: worker.name,
3036
+ task_id: worker.status.current_task_id,
3037
+ message_id: null,
3038
+ reason: worker.status.reason,
3039
+ state: worker.status.state,
3040
+ prev_state: prevState,
3041
+ }, cwd);
3042
+ if (worker.status.state === 'working' && (prevState === 'blocked' || prevState === 'failed' || prevState === 'unknown')) {
3043
+ await emitCanonicalWorkerEvent(cwd, 'worker.recovered', {
3044
+ worker: worker.name,
3045
+ task_id: worker.status.current_task_id,
3046
+ reason: worker.status.reason || `state_transition:${prevState}->${worker.status.state}`,
3047
+ recovery: 'state_transition',
3048
+ status: 'worker.recovered',
3049
+ });
3050
+ }
3051
+ }
3052
+ if (prevState && prevState !== 'idle' && worker.status.state === 'idle') {
3053
+ await appendTeamEvent(teamName, {
3054
+ type: 'worker_idle',
3055
+ worker: worker.name,
3056
+ task_id: worker.status.current_task_id,
3057
+ message_id: null,
3058
+ reason: undefined,
3059
+ prev_state: prevState,
3060
+ state: 'idle',
3061
+ source_type: 'worker_idle',
3062
+ }, cwd);
3063
+ }
3064
+ }
3065
+ }
3066
+ async function notifyWorkerOutcome(config, workerIndex, message, workerPaneId) {
3067
+ const worker = config.workers.find((candidate) => candidate.index === workerIndex);
3068
+ if (!worker)
3069
+ return { ok: false, transport: 'none', reason: 'worker_not_found' };
3070
+ if (config.worker_launch_mode === 'prompt') {
3071
+ const handle = getPromptWorkerHandle(config.name, worker.name);
3072
+ if (!handle)
3073
+ return { ok: false, transport: 'prompt_stdin', reason: 'prompt_worker_handle_missing' };
3074
+ try {
3075
+ sendToWorkerStdin(handle.child.stdin, message);
3076
+ return { ok: true, transport: 'prompt_stdin', reason: 'prompt_stdin_sent' };
3077
+ }
3078
+ catch (error) {
3079
+ return {
3080
+ ok: false,
3081
+ transport: 'prompt_stdin',
3082
+ reason: `prompt_stdin_failed:${error instanceof Error ? error.message : String(error)}`,
3083
+ };
3084
+ }
3085
+ }
3086
+ if (!config.tmux_session || !isTmuxAvailable()) {
3087
+ return { ok: false, transport: 'tmux_send_keys', reason: 'tmux_unavailable' };
3088
+ }
3089
+ try {
3090
+ await sendToWorker(config.tmux_session, workerIndex, message, workerPaneId, worker.worker_cli);
3091
+ return { ok: true, transport: 'tmux_send_keys', reason: 'tmux_send_keys_sent' };
3092
+ }
3093
+ catch (error) {
3094
+ return {
3095
+ ok: false,
3096
+ transport: 'tmux_send_keys',
3097
+ reason: `tmux_send_keys_failed:${error instanceof Error ? error.message : String(error)}`,
3098
+ };
3099
+ }
3100
+ }
3101
+ function resolveDispatchPolicy(manifestPolicy, workerLaunchMode) {
3102
+ return normalizeTeamPolicy(manifestPolicy, {
3103
+ display_mode: manifestPolicy?.display_mode === 'split_pane' ? 'split_pane' : 'auto',
3104
+ worker_launch_mode: workerLaunchMode,
3105
+ });
3106
+ }
3107
+ function isLeaderPaneMissingMailboxPersistedOutcome(params) {
3108
+ const { workerName, paneId, outcome } = params;
3109
+ return workerName === 'leader-fixed'
3110
+ && !paneId
3111
+ && outcome.ok
3112
+ && outcome.reason === 'leader_pane_missing_mailbox_persisted';
3113
+ }
3114
+ async function markDispatchRequestLeaderPaneMissingDeferred(params) {
3115
+ const { teamName, requestId, messageId, cwd } = params;
3116
+ const current = await readDispatchRequest(teamName, requestId, cwd);
3117
+ if (!current)
3118
+ return;
3119
+ if (current.status !== 'pending')
3120
+ return;
3121
+ await transitionDispatchRequest(teamName, requestId, current.status, current.status, {
3122
+ message_id: messageId ?? current.message_id,
3123
+ last_reason: 'leader_pane_missing_deferred',
3124
+ }, cwd).catch(() => { });
3125
+ }
3126
+ async function attemptStartupDirectTrigger(params) {
3127
+ const { teamName, config, workerName, workerIndex, paneId, workerCli, inbox, triggerMessage, intent, taskIds, cwd, timing, } = params;
3128
+ const safety = await evaluateStartupDirectTriggerSafety(config.tmux_session, workerIndex, paneId, workerCli);
3129
+ if (!safety.safe) {
3130
+ timing.mark('startup_direct_bypass', {
3131
+ worker: workerName,
3132
+ pane_id: paneId,
3133
+ ok: false,
3134
+ reason: `startup_direct_unsafe:${safety.reason}`,
3135
+ });
3136
+ return null;
3137
+ }
3138
+ const queued = await queueInboxInstruction({
3139
+ teamName,
3140
+ workerName,
3141
+ workerIndex,
3142
+ paneId,
3143
+ inbox,
3144
+ triggerMessage,
3145
+ intent,
3146
+ cwd,
3147
+ transportPreference: 'transport_direct',
3148
+ fallbackAllowed: false,
3149
+ inboxCorrelationKey: `startup-direct:${workerName}`,
3150
+ notify: (_target, message) => notifyWorkerOutcome(config, workerIndex, message, paneId),
3151
+ });
3152
+ timing.mark('dispatch_queued', {
3153
+ worker: workerName,
3154
+ pane_id: paneId,
3155
+ ok: queued.ok,
3156
+ reason: queued.reason,
3157
+ transport: queued.transport,
3158
+ request_id: queued.request_id,
3159
+ });
3160
+ timing.mark('direct_fallback', {
3161
+ worker: workerName,
3162
+ pane_id: paneId,
3163
+ ok: queued.ok,
3164
+ reason: queued.ok ? `startup_direct_trigger_sent:${safety.reason}` : queued.reason,
3165
+ transport: queued.transport,
3166
+ request_id: queued.request_id,
3167
+ });
3168
+ if (!queued.ok)
3169
+ return queued;
3170
+ const effectiveWorkerCli = workerCli ?? 'codex';
3171
+ const workerStartupEvidence = await waitForWorkerStartupEvidence({
3172
+ teamName,
3173
+ workerName,
3174
+ workerCli: effectiveWorkerCli,
3175
+ cwd,
3176
+ timeoutMs: 0,
3177
+ pollMs: STARTUP_EVIDENCE_POLL_MS,
3178
+ });
3179
+ timing.mark('startup_evidence', {
3180
+ worker: workerName,
3181
+ pane_id: paneId,
3182
+ ok: workerStartupEvidence !== 'none',
3183
+ reason: workerStartupEvidence,
3184
+ transport: queued.transport,
3185
+ request_id: queued.request_id,
3186
+ });
3187
+ const reason = workerStartupEvidence === 'none'
3188
+ ? `${effectiveWorkerCli}_startup_direct_no_evidence:${safety.reason}`
3189
+ : `startup_direct_trigger_sent:${safety.reason}`;
3190
+ if ((effectiveWorkerCli === 'codex' || effectiveWorkerCli === 'claude') && workerStartupEvidence === 'none') {
3191
+ await recordRecoverableStartupIssue({
3192
+ teamName,
3193
+ workerName,
3194
+ taskIds,
3195
+ reason,
3196
+ cwd,
3197
+ });
3198
+ }
3199
+ return {
3200
+ ...queued,
3201
+ reason,
3202
+ };
3203
+ }
3204
+ async function dispatchCriticalInboxInstruction(params) {
3205
+ const { teamName, config, workerName, workerIndex, paneId, workerCli, inbox, triggerMessage, intent, cwd, dispatchPolicy, inboxCorrelationKey, requireWorkerStartupEvidence, startupEvidenceTimeoutMs, startupReadyPromptObserved = false, startupTiming, } = params;
3206
+ const noteTiming = (phase, details) => {
3207
+ startupTiming?.mark(phase, { worker: workerName, pane_id: paneId, ...details });
3208
+ };
3209
+ if (config.worker_launch_mode === 'prompt') {
3210
+ return await queueInboxInstruction({
3211
+ teamName,
3212
+ workerName,
3213
+ workerIndex,
3214
+ paneId,
3215
+ inbox,
3216
+ triggerMessage,
3217
+ intent,
3218
+ cwd,
3219
+ transportPreference: 'prompt_stdin',
3220
+ fallbackAllowed: false,
3221
+ inboxCorrelationKey,
3222
+ notify: (_target, message) => notifyWorkerOutcome(config, workerIndex, message, paneId),
3223
+ });
3224
+ }
3225
+ if (dispatchPolicy.dispatch_mode === 'transport_direct') {
3226
+ return await queueInboxInstruction({
3227
+ teamName,
3228
+ workerName,
3229
+ workerIndex,
3230
+ paneId,
3231
+ inbox,
3232
+ triggerMessage,
3233
+ intent,
3234
+ cwd,
3235
+ transportPreference: 'transport_direct',
3236
+ fallbackAllowed: false,
3237
+ inboxCorrelationKey,
3238
+ notify: (_target, message) => notifyWorkerOutcome(config, workerIndex, message, paneId),
3239
+ });
3240
+ }
3241
+ const queued = await queueInboxInstruction({
3242
+ teamName,
3243
+ workerName,
3244
+ workerIndex,
3245
+ paneId,
3246
+ inbox,
3247
+ triggerMessage,
3248
+ intent,
3249
+ cwd,
3250
+ transportPreference: 'hook_preferred_with_fallback',
3251
+ fallbackAllowed: true,
3252
+ inboxCorrelationKey,
3253
+ notify: () => ({ ok: true, transport: 'hook', reason: 'queued_for_hook_dispatch' }),
3254
+ });
3255
+ noteTiming('dispatch_queued', {
3256
+ ok: queued.ok,
3257
+ reason: queued.reason,
3258
+ transport: queued.transport,
3259
+ request_id: queued.request_id,
3260
+ });
3261
+ if (!queued.request_id)
3262
+ return { ...queued, ok: false, reason: 'dispatch_request_missing_id' };
3263
+ const receipt = await waitForDispatchReceipt(teamName, queued.request_id, cwd, {
3264
+ timeoutMs: dispatchPolicy.dispatch_ack_timeout_ms,
3265
+ pollMs: 50,
3266
+ });
3267
+ if (receipt) {
3268
+ noteTiming('hook_receipt', {
3269
+ ok: receipt.status === 'delivered' || receipt.status === 'notified',
3270
+ reason: receipt.status,
3271
+ transport: 'hook',
3272
+ request_id: queued.request_id,
3273
+ });
3274
+ }
3275
+ if (receipt?.status === 'delivered') {
3276
+ return { ok: true, transport: 'hook', reason: 'hook_receipt_delivered', request_id: queued.request_id };
3277
+ }
3278
+ const requiresObservedStartupEvidence = requireWorkerStartupEvidence === true
3279
+ && (workerCli === 'claude' || workerCli === 'codex');
3280
+ let startupEvidence = 'none';
3281
+ if (receipt?.status === 'notified') {
3282
+ if (!requiresObservedStartupEvidence) {
3283
+ return { ok: true, transport: 'hook', reason: 'hook_receipt_notified', request_id: queued.request_id };
3284
+ }
3285
+ if (startupReadyPromptObserved) {
3286
+ return {
3287
+ ok: true,
3288
+ transport: 'hook',
3289
+ reason: 'hook_receipt_notified_with_ready_prompt',
3290
+ request_id: queued.request_id,
3291
+ };
3292
+ }
3293
+ startupEvidence = await waitForWorkerStartupEvidence({
3294
+ teamName,
3295
+ workerName,
3296
+ workerCli,
3297
+ cwd,
3298
+ timeoutMs: startupEvidenceTimeoutMs,
3299
+ });
3300
+ noteTiming('startup_evidence', {
3301
+ ok: startupEvidence !== 'none',
3302
+ reason: startupEvidence,
3303
+ transport: 'hook',
3304
+ request_id: queued.request_id,
3305
+ });
3306
+ if (startupEvidence !== 'none') {
3307
+ return {
3308
+ ok: true,
3309
+ transport: 'hook',
3310
+ reason: `hook_receipt_notified_with_${startupEvidence}`,
3311
+ request_id: queued.request_id,
3312
+ };
3313
+ }
3314
+ }
3315
+ if (receipt?.status === 'failed') {
3316
+ const fallback = await notifyWorkerOutcome(config, workerIndex, triggerMessage, paneId);
3317
+ if (fallback.ok) {
3318
+ const fallbackStartupEvidence = startupReadyPromptObserved
3319
+ ? 'ready_prompt'
3320
+ : await waitForRequiredStartupEvidenceAfterDirectFallback({
3321
+ requireWorkerStartupEvidence,
3322
+ workerCli,
3323
+ teamName,
3324
+ workerName,
3325
+ cwd,
3326
+ timeoutMs: startupEvidenceTimeoutMs,
3327
+ });
3328
+ noteTiming('startup_evidence', {
3329
+ ok: fallbackStartupEvidence !== 'none',
3330
+ reason: fallbackStartupEvidence,
3331
+ transport: fallback.transport,
3332
+ request_id: queued.request_id,
3333
+ });
3334
+ if (requiresObservedStartupEvidence && fallbackStartupEvidence === 'none') {
3335
+ await transitionDispatchRequest(teamName, queued.request_id, 'failed', 'failed', { last_reason: `${workerCli}_startup_no_evidence_after_fallback:${fallback.reason}` }, cwd).catch(() => { });
3336
+ return {
3337
+ ok: false,
3338
+ transport: fallback.transport,
3339
+ reason: `${workerCli}_startup_no_evidence_after_fallback:${fallback.reason}`,
3340
+ request_id: queued.request_id,
3341
+ };
3342
+ }
3343
+ const current = await readDispatchRequest(teamName, queued.request_id, cwd);
3344
+ if (current) {
3345
+ await transitionDispatchRequest(teamName, queued.request_id, current.status, 'failed', { last_reason: `fallback_confirmed_after_failed_receipt:${fallback.reason}` }, cwd).catch(() => { });
3346
+ }
3347
+ return {
3348
+ ok: true,
3349
+ transport: fallback.transport,
3350
+ reason: `fallback_confirmed_after_failed_receipt:${fallback.reason}`,
3351
+ request_id: queued.request_id,
3352
+ };
3353
+ }
3354
+ await transitionDispatchRequest(teamName, queued.request_id, receipt.status, 'failed', { last_reason: `fallback_attempted_but_unconfirmed:${fallback.reason}` }, cwd).catch(() => { });
3355
+ return {
3356
+ ok: false,
3357
+ transport: fallback.transport,
3358
+ reason: `fallback_attempted_but_unconfirmed:${fallback.reason}`,
3359
+ request_id: queued.request_id,
3360
+ };
3361
+ }
3362
+ const fallback = await notifyWorkerOutcome(config, workerIndex, triggerMessage, paneId);
3363
+ noteTiming('direct_fallback', {
3364
+ ok: fallback.ok,
3365
+ reason: fallback.reason,
3366
+ transport: fallback.transport,
3367
+ request_id: queued.request_id,
3368
+ });
3369
+ const startupFallbackLabel = receipt?.status === 'notified' && requiresObservedStartupEvidence
3370
+ ? `${workerCli}_startup_no_evidence`
3371
+ : null;
3372
+ const fallbackFailureReason = startupFallbackLabel
3373
+ ? `${startupFallbackLabel}_fallback_failed:${fallback.reason}`
3374
+ : `fallback_attempted_but_unconfirmed:${fallback.reason}`;
3375
+ if (fallback.ok) {
3376
+ const fallbackStartupEvidence = startupReadyPromptObserved
3377
+ ? 'ready_prompt'
3378
+ : await waitForRequiredStartupEvidenceAfterDirectFallback({
3379
+ requireWorkerStartupEvidence,
3380
+ workerCli,
3381
+ teamName,
3382
+ workerName,
3383
+ cwd,
3384
+ timeoutMs: startupEvidenceTimeoutMs,
3385
+ });
3386
+ noteTiming('startup_evidence', {
3387
+ ok: fallbackStartupEvidence !== 'none',
3388
+ reason: fallbackStartupEvidence,
3389
+ transport: fallback.transport,
3390
+ request_id: queued.request_id,
3391
+ });
3392
+ if (requiresObservedStartupEvidence && fallbackStartupEvidence === 'none') {
3393
+ const current = await readDispatchRequest(teamName, queued.request_id, cwd);
3394
+ if (current && current.status !== 'failed') {
3395
+ await transitionDispatchRequest(teamName, queued.request_id, current.status, 'failed', { last_reason: `${workerCli}_startup_no_evidence_after_fallback:${fallback.reason}` }, cwd).catch(() => { });
3396
+ }
3397
+ return {
3398
+ ok: false,
3399
+ transport: fallback.transport,
3400
+ reason: `${workerCli}_startup_no_evidence_after_fallback:${fallback.reason}`,
3401
+ request_id: queued.request_id,
3402
+ };
3403
+ }
3404
+ const marked = await markDispatchRequestNotified(teamName, queued.request_id, { last_reason: `fallback_confirmed:${fallback.reason}` }, cwd);
3405
+ if (!marked) {
3406
+ const current = await readDispatchRequest(teamName, queued.request_id, cwd);
3407
+ if (current) {
3408
+ await transitionDispatchRequest(teamName, queued.request_id, current.status, 'failed', { last_reason: `fallback_confirmed_after_failed_receipt:${fallback.reason}` }, cwd).catch(() => { });
3409
+ }
3410
+ }
3411
+ return {
3412
+ ok: true,
3413
+ transport: fallback.transport,
3414
+ reason: startupFallbackLabel
3415
+ ? `${startupFallbackLabel}_fallback_confirmed:${fallback.reason}`
3416
+ : `hook_timeout_fallback_confirmed:${fallback.reason}`,
3417
+ request_id: queued.request_id,
3418
+ };
3419
+ }
3420
+ const current = await readDispatchRequest(teamName, queued.request_id, cwd);
3421
+ if (current && current.status !== 'failed') {
3422
+ await transitionDispatchRequest(teamName, queued.request_id, current.status, 'failed', { last_reason: fallbackFailureReason }, cwd).catch(() => { });
3423
+ }
3424
+ return {
3425
+ ok: false,
3426
+ transport: fallback.transport,
3427
+ reason: fallbackFailureReason,
3428
+ request_id: queued.request_id,
3429
+ };
3430
+ }
3431
+ async function waitForRequiredStartupEvidenceAfterDirectFallback(params) {
3432
+ const { requireWorkerStartupEvidence, workerCli, teamName, workerName, cwd, timeoutMs, } = params;
3433
+ const requiresObservedStartupEvidence = requireWorkerStartupEvidence === true
3434
+ && (workerCli === 'claude' || workerCli === 'codex');
3435
+ if (!requiresObservedStartupEvidence || !workerCli) {
3436
+ return 'none';
3437
+ }
3438
+ return await waitForWorkerStartupEvidence({
3439
+ teamName,
3440
+ workerName,
3441
+ workerCli,
3442
+ cwd,
3443
+ timeoutMs,
3444
+ });
3445
+ }
3446
+ async function finalizeHookPreferredMailboxDispatch(params) {
3447
+ const { teamName, requestId, workerName, workerIndex, paneId, messageId, triggerMessage, intent, config, dispatchPolicy, cwd, fallbackNotify, } = params;
3448
+ const receipt = await waitForDispatchReceipt(teamName, requestId, cwd, {
3449
+ timeoutMs: dispatchPolicy.dispatch_ack_timeout_ms,
3450
+ pollMs: 50,
3451
+ });
3452
+ if (receipt && (receipt.status === 'notified' || receipt.status === 'delivered')) {
3453
+ await markMessageNotified(teamName, workerName, messageId, cwd).catch(() => false);
3454
+ const outcome = { ok: true, transport: 'hook', reason: `hook_receipt_${receipt.status}`, request_id: requestId, message_id: messageId };
3455
+ await logRuntimeDispatchOutcome({ cwd, teamName, workerName, requestId, messageId, intent, outcome });
3456
+ return outcome;
3457
+ }
3458
+ const fallback = fallbackNotify
3459
+ ? await fallbackNotify()
3460
+ : (typeof workerIndex === 'number'
3461
+ ? await notifyWorkerOutcome(config, workerIndex, triggerMessage, paneId)
3462
+ : { ok: false, transport: 'none', reason: 'missing_worker_index' });
3463
+ if (receipt?.status === 'failed') {
3464
+ if (fallback.ok) {
3465
+ await markMessageNotified(teamName, workerName, messageId, cwd).catch(() => false);
3466
+ const current = await readDispatchRequest(teamName, requestId, cwd);
3467
+ if (current) {
3468
+ await transitionDispatchRequest(teamName, requestId, current.status, 'failed', { message_id: messageId, last_reason: `fallback_confirmed_after_failed_receipt:${fallback.reason}` }, cwd).catch(() => null);
3469
+ }
3470
+ const outcome = {
3471
+ ok: true,
3472
+ transport: fallback.transport,
3473
+ reason: `fallback_confirmed_after_failed_receipt:${fallback.reason}`,
3474
+ request_id: requestId,
3475
+ message_id: messageId,
3476
+ };
3477
+ await logRuntimeDispatchOutcome({ cwd, teamName, workerName, requestId, messageId, intent, outcome });
3478
+ return outcome;
3479
+ }
3480
+ await transitionDispatchRequest(teamName, requestId, 'failed', 'failed', { message_id: messageId, last_reason: `fallback_attempted_but_unconfirmed:${fallback.reason}` }, cwd).catch(() => { });
3481
+ const outcome = {
3482
+ ok: false,
3483
+ transport: fallback.transport,
3484
+ reason: `fallback_attempted_but_unconfirmed:${fallback.reason}`,
3485
+ request_id: requestId,
3486
+ message_id: messageId,
3487
+ };
3488
+ await logRuntimeDispatchOutcome({ cwd, teamName, workerName, requestId, messageId, intent, outcome });
3489
+ return outcome;
3490
+ }
3491
+ if (fallback.ok) {
3492
+ if (isLeaderPaneMissingMailboxPersistedOutcome({ workerName, paneId, outcome: fallback })) {
3493
+ await markDispatchRequestLeaderPaneMissingDeferred({
3494
+ teamName,
3495
+ requestId,
3496
+ messageId,
3497
+ cwd,
3498
+ });
3499
+ const outcome = {
3500
+ ok: true,
3501
+ transport: fallback.transport,
3502
+ reason: 'leader_pane_missing_mailbox_persisted',
3503
+ request_id: requestId,
3504
+ message_id: messageId,
3505
+ };
3506
+ await logRuntimeDispatchOutcome({ cwd, teamName, workerName, requestId, messageId, intent, outcome });
3507
+ return outcome;
3508
+ }
3509
+ await markMessageNotified(teamName, workerName, messageId, cwd).catch(() => false);
3510
+ const marked = await markDispatchRequestNotified(teamName, requestId, { message_id: messageId, last_reason: `fallback_confirmed:${fallback.reason}` }, cwd);
3511
+ if (!marked) {
3512
+ const current = await readDispatchRequest(teamName, requestId, cwd);
3513
+ if (current) {
3514
+ await transitionDispatchRequest(teamName, requestId, current.status, 'failed', { message_id: messageId, last_reason: `fallback_confirmed_after_failed_receipt:${fallback.reason}` }, cwd).catch(() => { });
3515
+ }
3516
+ }
3517
+ const outcome = {
3518
+ ok: true,
3519
+ transport: fallback.transport,
3520
+ reason: `hook_timeout_fallback_confirmed:${fallback.reason}`,
3521
+ request_id: requestId,
3522
+ message_id: messageId,
3523
+ };
3524
+ await logRuntimeDispatchOutcome({ cwd, teamName, workerName, requestId, messageId, intent, outcome });
3525
+ return outcome;
3526
+ }
3527
+ const current = await readDispatchRequest(teamName, requestId, cwd);
3528
+ if (current) {
3529
+ await transitionDispatchRequest(teamName, requestId, current.status, 'failed', { message_id: messageId, last_reason: `fallback_attempted_but_unconfirmed:${fallback.reason}` }, cwd).catch(() => { });
3530
+ }
3531
+ const outcome = {
3532
+ ok: false,
3533
+ transport: fallback.transport,
3534
+ reason: `fallback_attempted_but_unconfirmed:${fallback.reason}`,
3535
+ request_id: requestId,
3536
+ message_id: messageId,
3537
+ };
3538
+ await logRuntimeDispatchOutcome({ cwd, teamName, workerName, requestId, messageId, intent, outcome });
3539
+ return outcome;
3540
+ }
3541
+ async function notifyLeaderAsync(config, message, cwd) {
3542
+ // Canonical leader delivery is durable mailbox persistence plus HUD-owned
3543
+ // authority processing. Team runtime must not directly inject into the
3544
+ // leader pane from this fallback path.
3545
+ const { notifyLeaderMailboxAsync } = await import('./tmux-session.js');
3546
+ const persisted = await notifyLeaderMailboxAsync(config.name, 'system', message, cwd);
3547
+ if (!persisted) {
3548
+ return { ok: false, transport: 'mailbox', reason: 'leader_mailbox_notify_failed' };
3549
+ }
3550
+ if (!config.leader_pane_id) {
3551
+ return { ok: true, transport: 'mailbox', reason: 'leader_pane_missing_mailbox_persisted' };
3552
+ }
3553
+ return { ok: true, transport: 'mailbox', reason: 'leader_mailbox_notified' };
3554
+ }
3555
+ async function deliverPendingMailboxMessages(teamName, config, workers, previousNotifications, dispatchPolicy, cwd) {
3556
+ const nextNotifications = {};
3557
+ const pendingIdsAcrossTeam = new Set();
3558
+ for (const worker of workers) {
3559
+ const workerInfo = config.workers.find((w) => w.name === worker.name);
3560
+ if (!workerInfo)
3561
+ continue;
3562
+ const mailbox = await listMailboxMessages(teamName, worker.name, cwd);
3563
+ const pending = mailbox.filter((m) => !m.delivered_at);
3564
+ if (pending.length === 0)
3565
+ continue;
3566
+ const pendingIds = pending.map((m) => m.message_id);
3567
+ for (const id of pendingIds)
3568
+ pendingIdsAcrossTeam.add(id);
3569
+ // Preserve already-tracked notification timestamps in the next snapshot.
3570
+ for (const msg of pending) {
3571
+ nextNotifications[msg.message_id] = msg.notified_at || previousNotifications[msg.message_id] || '';
3572
+ }
3573
+ // Only notify for messages that have never been successfully notified.
3574
+ // Using a message-ID set prevents re-notification on every monitor poll
3575
+ // (issue #116). A message is considered notified when either:
3576
+ // - notified_at is set in the mailbox file (persisted by markMessageNotified), or
3577
+ // - the message_id exists in previousNotifications from the last snapshot.
3578
+ // Both checks use Boolean() so an empty-string value is treated as unnotified.
3579
+ const unnotified = pending.filter((m) => !m.notified_at && !previousNotifications[m.message_id]);
3580
+ if (unnotified.length === 0)
3581
+ continue;
3582
+ if (!worker.alive)
3583
+ continue;
3584
+ for (const msg of unnotified) {
3585
+ const outcome = await dispatchPendingMailboxMessage({
3586
+ teamName,
3587
+ workerName: worker.name,
3588
+ workerInfo,
3589
+ messageId: msg.message_id,
3590
+ config,
3591
+ dispatchPolicy,
3592
+ cwd,
3593
+ });
3594
+ if (outcome.ok) {
3595
+ nextNotifications[msg.message_id] = new Date().toISOString();
3596
+ }
3597
+ }
3598
+ }
3599
+ const pruned = {};
3600
+ for (const [messageId, ts] of Object.entries(nextNotifications)) {
3601
+ if (pendingIdsAcrossTeam.has(messageId) && ts)
3602
+ pruned[messageId] = ts;
3603
+ }
3604
+ return pruned;
3605
+ }
3606
+ function resolveWorkerMailboxTransportPreference(config, dispatchPolicy) {
3607
+ return config.worker_launch_mode === 'prompt'
3608
+ ? 'prompt_stdin'
3609
+ : (dispatchPolicy.dispatch_mode === 'transport_direct' ? 'transport_direct' : 'hook_preferred_with_fallback');
3610
+ }
3611
+ function resolveLeaderMailboxTransportPreference(dispatchPolicy) {
3612
+ return dispatchPolicy.dispatch_mode === 'transport_direct' ? 'transport_direct' : 'hook_preferred_with_fallback';
3613
+ }
3614
+ function isExistingMailboxNotificationOutcome(outcome) {
3615
+ return outcome.ok && outcome.reason === 'existing_message_already_notified';
3616
+ }
3617
+ async function dispatchPendingMailboxMessage(params) {
3618
+ const { teamName, workerName, workerInfo, messageId, config, dispatchPolicy, cwd } = params;
3619
+ const triggerDirective = buildMailboxTriggerDirective(workerName, teamName, 1, resolveInstructionStateRoot(workerInfo.worktree_path));
3620
+ const transportPreference = resolveWorkerMailboxTransportPreference(config, dispatchPolicy);
3621
+ const queued = await enqueueDispatchRequest(teamName, {
3622
+ kind: 'mailbox',
3623
+ to_worker: workerName,
3624
+ worker_index: workerInfo.index,
3625
+ pane_id: workerInfo.pane_id,
3626
+ trigger_message: triggerDirective.text,
3627
+ intent: triggerDirective.intent,
3628
+ message_id: messageId,
3629
+ transport_preference: transportPreference,
3630
+ fallback_allowed: transportPreference === 'hook_preferred_with_fallback',
3631
+ }, cwd);
3632
+ if (transportPreference === 'hook_preferred_with_fallback') {
3633
+ return await finalizeQueuedMailboxDispatch({
3634
+ queuedOutcome: {
3635
+ ok: true,
3636
+ transport: 'hook',
3637
+ reason: 'queued_for_hook_dispatch',
3638
+ request_id: queued.request.request_id,
3639
+ message_id: messageId,
3640
+ },
3641
+ transportPreference,
3642
+ teamName,
3643
+ workerName,
3644
+ workerIndex: workerInfo.index,
3645
+ paneId: workerInfo.pane_id,
3646
+ messageId,
3647
+ triggerMessage: triggerDirective.text,
3648
+ intent: triggerDirective.intent,
3649
+ config,
3650
+ dispatchPolicy,
3651
+ cwd,
3652
+ });
3653
+ }
3654
+ const direct = await notifyWorkerOutcome(config, workerInfo.index, triggerDirective.text, workerInfo.pane_id);
3655
+ const outcome = { ...direct, request_id: queued.request.request_id, message_id: messageId };
3656
+ if (outcome.ok) {
3657
+ await markMessageNotified(teamName, workerName, messageId, cwd).catch(() => false);
3658
+ await markDispatchRequestNotified(teamName, queued.request.request_id, { message_id: messageId, last_reason: outcome.reason }, cwd).catch(() => null);
3659
+ }
3660
+ await logRuntimeDispatchOutcome({
3661
+ cwd,
3662
+ teamName,
3663
+ workerName,
3664
+ requestId: queued.request.request_id,
3665
+ messageId,
3666
+ outcome,
3667
+ });
3668
+ return outcome;
3669
+ }
3670
+ async function finalizeQueuedMailboxDispatch(params) {
3671
+ const { queuedOutcome, transportPreference, teamName, workerName, workerIndex, paneId, messageId, triggerMessage, intent, config, dispatchPolicy, cwd, fallbackNotify, } = params;
3672
+ if (transportPreference !== 'hook_preferred_with_fallback') {
3673
+ return queuedOutcome;
3674
+ }
3675
+ if (isExistingMailboxNotificationOutcome(queuedOutcome)) {
3676
+ return queuedOutcome;
3677
+ }
3678
+ if (!queuedOutcome.request_id || !messageId) {
3679
+ return { ...queuedOutcome, ok: false, reason: 'dispatch_request_missing_id' };
3680
+ }
3681
+ return await finalizeHookPreferredMailboxDispatch({
3682
+ teamName,
3683
+ requestId: queuedOutcome.request_id,
3684
+ workerName,
3685
+ workerIndex,
3686
+ paneId,
3687
+ messageId,
3688
+ triggerMessage,
3689
+ intent,
3690
+ config,
3691
+ dispatchPolicy,
3692
+ cwd,
3693
+ fallbackNotify,
3694
+ });
3695
+ }
3696
+ async function sendLeaderMailboxMessage(params) {
3697
+ const { teamName, fromWorker, body, config, dispatchPolicy, cwd } = params;
3698
+ const triggerDirective = buildLeaderMailboxTriggerDirective(teamName, fromWorker, config.team_state_root || undefined);
3699
+ const transportPreference = resolveLeaderMailboxTransportPreference(dispatchPolicy);
3700
+ const queuedOutcome = await queueDirectMailboxMessage({
3701
+ teamName,
3702
+ fromWorker,
3703
+ toWorker: 'leader-fixed',
3704
+ toPaneId: config.leader_pane_id ?? undefined,
3705
+ body,
3706
+ triggerMessage: triggerDirective.text,
3707
+ intent: triggerDirective.intent,
3708
+ cwd,
3709
+ transportPreference,
3710
+ fallbackAllowed: transportPreference === 'hook_preferred_with_fallback',
3711
+ notify: async (_target, message) => {
3712
+ if (transportPreference === 'hook_preferred_with_fallback') {
3713
+ return { ok: true, transport: 'hook', reason: 'queued_for_hook_dispatch' };
3714
+ }
3715
+ if (!config.leader_pane_id) {
3716
+ return { ok: false, transport: 'mailbox', reason: 'leader_pane_missing_transport_direct_failed' };
3717
+ }
3718
+ return await notifyLeaderAsync(config, message, cwd);
3719
+ },
3720
+ });
3721
+ if (!isExistingMailboxNotificationOutcome(queuedOutcome)
3722
+ && transportPreference === 'hook_preferred_with_fallback'
3723
+ && !config.leader_pane_id) {
3724
+ if (queuedOutcome.request_id) {
3725
+ await markDispatchRequestLeaderPaneMissingDeferred({
3726
+ teamName,
3727
+ requestId: queuedOutcome.request_id,
3728
+ messageId: queuedOutcome.message_id,
3729
+ cwd,
3730
+ });
3731
+ }
3732
+ const deferredOutcome = {
3733
+ ...queuedOutcome,
3734
+ ok: true,
3735
+ transport: 'mailbox',
3736
+ reason: 'leader_pane_missing_mailbox_persisted',
3737
+ };
3738
+ await logRuntimeDispatchOutcome({
3739
+ cwd,
3740
+ teamName,
3741
+ workerName: 'leader-fixed',
3742
+ requestId: deferredOutcome.request_id,
3743
+ messageId: deferredOutcome.message_id,
3744
+ intent: triggerDirective.intent,
3745
+ outcome: deferredOutcome,
3746
+ });
3747
+ return deferredOutcome;
3748
+ }
3749
+ if (!isExistingMailboxNotificationOutcome(queuedOutcome)
3750
+ && transportPreference === 'transport_direct'
3751
+ && !config.leader_pane_id) {
3752
+ const failedOutcome = {
3753
+ ...queuedOutcome,
3754
+ ok: false,
3755
+ transport: 'mailbox',
3756
+ reason: 'leader_pane_missing_transport_direct_failed',
3757
+ };
3758
+ await logRuntimeDispatchOutcome({
3759
+ cwd,
3760
+ teamName,
3761
+ workerName: 'leader-fixed',
3762
+ requestId: failedOutcome.request_id,
3763
+ messageId: failedOutcome.message_id,
3764
+ intent: triggerDirective.intent,
3765
+ outcome: failedOutcome,
3766
+ });
3767
+ return failedOutcome;
3768
+ }
3769
+ const canLeaderFallbackDirectly = Boolean(config.leader_pane_id) && isTmuxAvailable();
3770
+ return await finalizeQueuedMailboxDispatch({
3771
+ queuedOutcome,
3772
+ transportPreference: canLeaderFallbackDirectly ? transportPreference : 'transport_direct',
3773
+ teamName,
3774
+ workerName: 'leader-fixed',
3775
+ paneId: config.leader_pane_id ?? undefined,
3776
+ messageId: queuedOutcome.message_id,
3777
+ triggerMessage: triggerDirective.text,
3778
+ intent: triggerDirective.intent,
3779
+ config,
3780
+ dispatchPolicy,
3781
+ cwd,
3782
+ fallbackNotify: async () => await notifyLeaderAsync(config, triggerDirective.text, cwd),
3783
+ });
3784
+ }
3785
+ async function sendRecipientMailboxMessage(params) {
3786
+ const { teamName, fromWorker, toWorker, body, config, dispatchPolicy, cwd } = params;
3787
+ const recipient = config.workers.find((worker) => worker.name === toWorker);
3788
+ if (!recipient)
3789
+ throw new Error(`Worker ${toWorker} not found in team`);
3790
+ const triggerDirective = buildMailboxTriggerDirective(toWorker, teamName, 1, resolveInstructionStateRoot(recipient.worktree_path));
3791
+ const transportPreference = resolveWorkerMailboxTransportPreference(config, dispatchPolicy);
3792
+ const queuedOutcome = await queueDirectMailboxMessage({
3793
+ teamName,
3794
+ fromWorker,
3795
+ toWorker,
3796
+ toWorkerIndex: recipient.index,
3797
+ toPaneId: recipient.pane_id,
3798
+ body,
3799
+ triggerMessage: triggerDirective.text,
3800
+ intent: triggerDirective.intent,
3801
+ cwd,
3802
+ transportPreference,
3803
+ fallbackAllowed: transportPreference === 'hook_preferred_with_fallback',
3804
+ notify: async (_target, message) => (transportPreference === 'hook_preferred_with_fallback'
3805
+ ? { ok: true, transport: 'hook', reason: 'queued_for_hook_dispatch' }
3806
+ : await notifyWorkerOutcome(config, recipient.index, message, recipient.pane_id)),
3807
+ });
3808
+ return await finalizeQueuedMailboxDispatch({
3809
+ queuedOutcome,
3810
+ transportPreference,
3811
+ teamName,
3812
+ workerName: recipient.name,
3813
+ workerIndex: recipient.index,
3814
+ paneId: recipient.pane_id,
3815
+ messageId: queuedOutcome.message_id,
3816
+ triggerMessage: triggerDirective.text,
3817
+ intent: triggerDirective.intent,
3818
+ config,
3819
+ dispatchPolicy,
3820
+ cwd,
3821
+ });
3822
+ }
3823
+ async function finalizeBroadcastMailboxOutcomes(params) {
3824
+ const { teamName, outcomes, transportPreference, config, dispatchPolicy, cwd } = params;
3825
+ if (transportPreference !== 'hook_preferred_with_fallback') {
3826
+ return outcomes;
3827
+ }
3828
+ const finalizedOutcomes = [];
3829
+ for (const outcome of outcomes) {
3830
+ const target = outcome.to_worker
3831
+ ? (config.workers.find((worker) => worker.name === outcome.to_worker) ?? null)
3832
+ : null;
3833
+ if (!target) {
3834
+ finalizedOutcomes.push({ ...outcome, ok: false, reason: 'missing_worker_index' });
3835
+ continue;
3836
+ }
3837
+ const triggerDirective = buildMailboxTriggerDirective(target.name, teamName, 1, resolveInstructionStateRoot(target.worktree_path));
3838
+ finalizedOutcomes.push(await finalizeQueuedMailboxDispatch({
3839
+ queuedOutcome: outcome,
3840
+ transportPreference,
3841
+ teamName,
3842
+ workerName: target.name,
3843
+ workerIndex: target.index,
3844
+ paneId: target.pane_id,
3845
+ messageId: outcome.message_id,
3846
+ triggerMessage: triggerDirective.text,
3847
+ intent: triggerDirective.intent,
3848
+ config,
3849
+ dispatchPolicy,
3850
+ cwd,
3851
+ }));
3852
+ }
3853
+ return finalizedOutcomes;
3854
+ }
3855
+ export async function sendWorkerMessage(teamName, fromWorker, toWorker, body, cwd) {
3856
+ const sanitized = sanitizeTeamName(teamName);
3857
+ const config = await readTeamConfig(sanitized, cwd);
3858
+ if (!config)
3859
+ throw new Error(`Team ${sanitized} not found`);
3860
+ const manifest = await readTeamManifestV2(sanitized, cwd);
3861
+ const dispatchPolicy = resolveDispatchPolicy(manifest?.policy, config.worker_launch_mode);
3862
+ if (toWorker === 'leader-fixed') {
3863
+ const finalOutcome = await sendLeaderMailboxMessage({
3864
+ teamName: sanitized,
3865
+ fromWorker,
3866
+ body,
3867
+ config,
3868
+ dispatchPolicy,
3869
+ cwd,
3870
+ });
3871
+ if (!finalOutcome.ok)
3872
+ throw new Error(`mailbox_notify_failed:${finalOutcome.reason}`);
3873
+ return finalOutcome;
3874
+ }
3875
+ const finalOutcome = await sendRecipientMailboxMessage({
3876
+ teamName: sanitized,
3877
+ fromWorker,
3878
+ toWorker,
3879
+ body,
3880
+ config,
3881
+ dispatchPolicy,
3882
+ cwd,
3883
+ });
3884
+ if (!finalOutcome.ok)
3885
+ throw new Error(`mailbox_notify_failed:${finalOutcome.reason}`);
3886
+ return finalOutcome;
3887
+ }
3888
+ export async function broadcastWorkerMessage(teamName, fromWorker, body, cwd) {
3889
+ const sanitized = sanitizeTeamName(teamName);
3890
+ const config = await readTeamConfig(sanitized, cwd);
3891
+ if (!config)
3892
+ throw new Error(`Team ${sanitized} not found`);
3893
+ const manifest = await readTeamManifestV2(sanitized, cwd);
3894
+ const dispatchPolicy = resolveDispatchPolicy(manifest?.policy, config.worker_launch_mode);
3895
+ const transportPreference = resolveWorkerMailboxTransportPreference(config, dispatchPolicy);
3896
+ const outcomes = await queueBroadcastMailboxMessage({
3897
+ teamName: sanitized,
3898
+ fromWorker,
3899
+ recipients: config.workers.map((w) => ({ workerName: w.name, workerIndex: w.index, paneId: w.pane_id })),
3900
+ body,
3901
+ cwd,
3902
+ triggerFor: (workerName) => buildMailboxTriggerDirective(workerName, sanitized, 1, resolveInstructionStateRoot(config.workers.find((worker) => worker.name === workerName)?.worktree_path)).text,
3903
+ intentFor: () => 'pending-mailbox-review',
3904
+ transportPreference,
3905
+ fallbackAllowed: transportPreference === 'hook_preferred_with_fallback',
3906
+ notify: async (target, message) => transportPreference === 'hook_preferred_with_fallback'
3907
+ ? { ok: true, transport: 'hook', reason: 'queued_for_hook_dispatch' }
3908
+ : (typeof target.workerIndex === 'number'
3909
+ ? await notifyWorkerOutcome(config, target.workerIndex, message, target.paneId)
3910
+ : { ok: false, transport: 'none', reason: 'missing_worker_index' }),
3911
+ });
3912
+ const results = await finalizeBroadcastMailboxOutcomes({
3913
+ teamName: sanitized,
3914
+ outcomes,
3915
+ transportPreference,
3916
+ config,
3917
+ dispatchPolicy,
3918
+ cwd,
3919
+ });
3920
+ if (results.some((result) => !result.ok)) {
3921
+ const firstFailure = results.find((result) => !result.ok);
3922
+ throw new Error(`mailbox_notify_failed:${firstFailure?.reason ?? 'unknown'}`);
3923
+ }
3924
+ }
3925
+ //# sourceMappingURL=runtime.js.map