agent-relay 2.3.13 → 2.4.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 (1421) hide show
  1. package/README.md +42 -176
  2. package/bin/agent-relay-broker-darwin-arm64 +0 -0
  3. package/bin/agent-relay-broker-darwin-x64 +0 -0
  4. package/bin/agent-relay-broker-linux-arm64 +0 -0
  5. package/bin/agent-relay-broker-linux-x64 +0 -0
  6. package/dist/index.cjs +50288 -63371
  7. package/dist/src/cli/bootstrap.d.ts +6 -0
  8. package/dist/src/cli/bootstrap.d.ts.map +1 -0
  9. package/dist/src/cli/bootstrap.js +109 -0
  10. package/dist/src/cli/bootstrap.js.map +1 -0
  11. package/dist/src/cli/commands/agent-management.d.ts +51 -0
  12. package/dist/src/cli/commands/agent-management.d.ts.map +1 -0
  13. package/dist/src/cli/commands/agent-management.js +290 -0
  14. package/dist/src/cli/commands/agent-management.js.map +1 -0
  15. package/dist/src/cli/commands/auth.d.ts +9 -0
  16. package/dist/src/cli/commands/auth.d.ts.map +1 -0
  17. package/dist/src/cli/commands/auth.js +33 -0
  18. package/dist/src/cli/commands/auth.js.map +1 -0
  19. package/dist/src/cli/commands/cloud.d.ts +18 -0
  20. package/dist/src/cli/commands/cloud.d.ts.map +1 -0
  21. package/dist/src/cli/commands/cloud.js +392 -0
  22. package/dist/src/cli/commands/cloud.js.map +1 -0
  23. package/dist/src/cli/commands/core.d.ts +107 -0
  24. package/dist/src/cli/commands/core.d.ts.map +1 -0
  25. package/dist/src/cli/commands/core.js +299 -0
  26. package/dist/src/cli/commands/core.js.map +1 -0
  27. package/dist/src/cli/commands/doctor.d.ts +1 -1
  28. package/dist/src/cli/commands/doctor.d.ts.map +1 -1
  29. package/dist/src/cli/commands/doctor.js +1 -485
  30. package/dist/src/cli/commands/doctor.js.map +1 -1
  31. package/dist/src/cli/commands/messaging.d.ts +61 -0
  32. package/dist/src/cli/commands/messaging.d.ts.map +1 -0
  33. package/dist/src/cli/commands/messaging.js +213 -0
  34. package/dist/src/cli/commands/messaging.js.map +1 -0
  35. package/dist/src/cli/commands/monitoring.d.ts +57 -0
  36. package/dist/src/cli/commands/monitoring.d.ts.map +1 -0
  37. package/dist/src/cli/commands/monitoring.js +350 -0
  38. package/dist/src/cli/commands/monitoring.js.map +1 -0
  39. package/dist/src/cli/commands/setup.d.ts +29 -0
  40. package/dist/src/cli/commands/setup.d.ts.map +1 -0
  41. package/dist/src/cli/commands/setup.js +324 -0
  42. package/dist/src/cli/commands/setup.js.map +1 -0
  43. package/dist/src/cli/commands/swarm.d.ts +3 -0
  44. package/dist/src/cli/commands/swarm.d.ts.map +1 -0
  45. package/dist/src/cli/commands/swarm.js +108 -0
  46. package/dist/src/cli/commands/swarm.js.map +1 -0
  47. package/dist/src/cli/index.d.ts +1 -28
  48. package/dist/src/cli/index.d.ts.map +1 -1
  49. package/dist/src/cli/index.js +4 -4936
  50. package/dist/src/cli/index.js.map +1 -1
  51. package/dist/src/cli/lib/agent-management-listing.d.ts +39 -0
  52. package/dist/src/cli/lib/agent-management-listing.d.ts.map +1 -0
  53. package/dist/src/cli/lib/agent-management-listing.js +253 -0
  54. package/dist/src/cli/lib/agent-management-listing.js.map +1 -0
  55. package/dist/src/cli/lib/auth-ssh.d.ts +48 -0
  56. package/dist/src/cli/lib/auth-ssh.d.ts.map +1 -0
  57. package/dist/src/cli/lib/auth-ssh.js +572 -0
  58. package/dist/src/cli/lib/auth-ssh.js.map +1 -0
  59. package/dist/src/cli/lib/bridge.d.ts +8 -0
  60. package/dist/src/cli/lib/bridge.d.ts.map +1 -0
  61. package/dist/src/cli/lib/bridge.js +100 -0
  62. package/dist/src/cli/lib/bridge.js.map +1 -0
  63. package/dist/src/cli/lib/broker-lifecycle.d.ts +20 -0
  64. package/dist/src/cli/lib/broker-lifecycle.d.ts.map +1 -0
  65. package/dist/src/cli/lib/broker-lifecycle.js +843 -0
  66. package/dist/src/cli/lib/broker-lifecycle.js.map +1 -0
  67. package/dist/src/cli/lib/client-factory.d.ts +24 -0
  68. package/dist/src/cli/lib/client-factory.d.ts.map +1 -0
  69. package/dist/src/cli/lib/client-factory.js +20 -0
  70. package/dist/src/cli/lib/client-factory.js.map +1 -0
  71. package/dist/src/cli/lib/cloud-client.d.ts +39 -0
  72. package/dist/src/cli/lib/cloud-client.d.ts.map +1 -0
  73. package/dist/src/cli/lib/cloud-client.js +120 -0
  74. package/dist/src/cli/lib/cloud-client.js.map +1 -0
  75. package/dist/src/cli/lib/core-maintenance.d.ts +13 -0
  76. package/dist/src/cli/lib/core-maintenance.d.ts.map +1 -0
  77. package/dist/src/cli/lib/core-maintenance.js +250 -0
  78. package/dist/src/cli/lib/core-maintenance.js.map +1 -0
  79. package/dist/src/cli/lib/doctor.d.ts +2 -0
  80. package/dist/src/cli/lib/doctor.d.ts.map +1 -0
  81. package/dist/src/cli/lib/doctor.js +484 -0
  82. package/dist/src/cli/lib/doctor.js.map +1 -0
  83. package/dist/src/cli/lib/formatting.d.ts +8 -0
  84. package/dist/src/cli/lib/formatting.d.ts.map +1 -0
  85. package/dist/src/cli/lib/formatting.js +48 -0
  86. package/dist/src/cli/lib/formatting.js.map +1 -0
  87. package/dist/src/cli/lib/index.d.ts +5 -0
  88. package/dist/src/cli/lib/index.d.ts.map +1 -0
  89. package/dist/src/cli/lib/index.js +5 -0
  90. package/dist/src/cli/lib/index.js.map +1 -0
  91. package/dist/src/cli/lib/jsonc.d.ts +8 -0
  92. package/dist/src/cli/lib/jsonc.d.ts.map +1 -0
  93. package/dist/src/cli/lib/jsonc.js +88 -0
  94. package/dist/src/cli/lib/jsonc.js.map +1 -0
  95. package/dist/src/cli/lib/monitoring-health.d.ts +32 -0
  96. package/dist/src/cli/lib/monitoring-health.d.ts.map +1 -0
  97. package/dist/src/cli/lib/monitoring-health.js +2 -0
  98. package/dist/src/cli/lib/monitoring-health.js.map +1 -0
  99. package/dist/src/cli/lib/paths.d.ts +2 -0
  100. package/dist/src/cli/lib/paths.d.ts.map +1 -0
  101. package/dist/src/cli/lib/paths.js +5 -0
  102. package/dist/src/cli/lib/paths.js.map +1 -0
  103. package/dist/src/index.d.ts +1 -5
  104. package/dist/src/index.d.ts.map +1 -1
  105. package/dist/src/index.js +1 -5
  106. package/dist/src/index.js.map +1 -1
  107. package/install.sh +0 -30
  108. package/package.json +84 -98
  109. package/packages/acp-bridge/README.md +8 -8
  110. package/packages/acp-bridge/dist/acp-agent.d.ts +8 -7
  111. package/packages/acp-bridge/dist/acp-agent.d.ts.map +1 -1
  112. package/packages/acp-bridge/dist/acp-agent.js +118 -143
  113. package/packages/acp-bridge/dist/acp-agent.js.map +1 -1
  114. package/packages/acp-bridge/dist/cli.d.ts +1 -1
  115. package/packages/acp-bridge/dist/cli.js +3 -3
  116. package/packages/acp-bridge/dist/index.d.ts +2 -2
  117. package/packages/acp-bridge/dist/index.d.ts.map +1 -1
  118. package/packages/acp-bridge/dist/index.js +1 -1
  119. package/packages/acp-bridge/dist/index.js.map +1 -1
  120. package/packages/acp-bridge/dist/types.d.ts +3 -3
  121. package/packages/acp-bridge/package.json +3 -3
  122. package/packages/acp-bridge/src/acp-agent.ts +123 -160
  123. package/packages/acp-bridge/src/cli.ts +3 -3
  124. package/packages/acp-bridge/src/index.ts +2 -2
  125. package/packages/acp-bridge/src/types.ts +3 -3
  126. package/packages/config/dist/bridge-config.d.ts +5 -5
  127. package/packages/config/dist/bridge-config.d.ts.map +1 -1
  128. package/packages/config/dist/bridge-config.js +16 -9
  129. package/packages/config/dist/bridge-config.js.map +1 -1
  130. package/packages/config/dist/cli-auth-config.d.ts +1 -1
  131. package/packages/config/dist/cli-auth-config.js +1 -1
  132. package/packages/config/dist/cli-registry.generated.d.ts +340 -0
  133. package/packages/config/dist/cli-registry.generated.d.ts.map +1 -0
  134. package/packages/config/dist/cli-registry.generated.js +297 -0
  135. package/packages/config/dist/cli-registry.generated.js.map +1 -0
  136. package/packages/config/dist/index.d.ts +1 -0
  137. package/packages/config/dist/index.d.ts.map +1 -1
  138. package/packages/config/dist/index.js +1 -0
  139. package/packages/config/dist/index.js.map +1 -1
  140. package/packages/config/dist/project-namespace.d.ts +9 -9
  141. package/packages/config/dist/project-namespace.js +3 -3
  142. package/packages/config/dist/relay-config.d.ts +1 -1
  143. package/packages/config/dist/relay-config.js +1 -1
  144. package/packages/config/dist/schemas.js +1 -1
  145. package/packages/config/dist/shadow-config.d.ts +2 -1
  146. package/packages/config/dist/shadow-config.d.ts.map +1 -1
  147. package/packages/config/dist/shadow-config.js.map +1 -1
  148. package/packages/config/package.json +2 -3
  149. package/packages/config/src/bridge-config.test.ts +20 -6
  150. package/packages/config/src/bridge-config.ts +20 -10
  151. package/packages/config/src/cli-auth-config.ts +1 -1
  152. package/packages/config/src/cli-registry.generated.ts +328 -0
  153. package/packages/config/src/index.ts +1 -0
  154. package/packages/config/src/project-namespace.ts +9 -9
  155. package/packages/config/src/relay-config.ts +1 -1
  156. package/packages/config/src/schemas.ts +1 -1
  157. package/packages/config/src/shadow-config.ts +8 -1
  158. package/packages/contracts/fixtures/error-fixtures.json +42 -0
  159. package/packages/contracts/fixtures/event-fixtures.json +161 -0
  160. package/packages/contracts/fixtures/health-fixtures.json +35 -0
  161. package/packages/contracts/fixtures/identity-fixtures.json +58 -0
  162. package/packages/contracts/fixtures/replay-fixtures.json +33 -0
  163. package/packages/hooks/dist/inbox-check/types.d.ts +2 -2
  164. package/packages/hooks/dist/types.d.ts +9 -3
  165. package/packages/hooks/dist/types.d.ts.map +1 -1
  166. package/packages/hooks/dist/types.js +1 -1
  167. package/packages/hooks/dist/types.js.map +1 -1
  168. package/packages/hooks/package.json +5 -5
  169. package/packages/hooks/src/inbox-check/types.ts +2 -2
  170. package/packages/hooks/src/types.ts +11 -3
  171. package/packages/memory/package.json +2 -2
  172. package/packages/policy/package.json +2 -2
  173. package/packages/sdk/.mcp.json +14 -0
  174. package/packages/sdk/.trajectories/active/traj_1771875803391_84ca57b2.json +50 -0
  175. package/packages/sdk/.trajectories/active/traj_1771891934534_06504121.json +50 -0
  176. package/packages/sdk/.trajectories/active/traj_1771891957929_211afc4e.json +50 -0
  177. package/packages/sdk/.trajectories/active/traj_1771891982509_38c84638.json +50 -0
  178. package/packages/sdk/.trajectories/completed/traj_1771875803188_cd6d181c.json +80 -0
  179. package/packages/sdk/.trajectories/completed/traj_1771875803204_f2aeb8c8.json +80 -0
  180. package/packages/sdk/.trajectories/completed/traj_1771875803210_d65f3f1a.json +80 -0
  181. package/packages/sdk/.trajectories/completed/traj_1771875803218_e454a25d.json +80 -0
  182. package/packages/sdk/.trajectories/completed/traj_1771875803223_d7a64815.json +80 -0
  183. package/packages/sdk/.trajectories/completed/traj_1771875803227_7e56da5b.json +80 -0
  184. package/packages/sdk/.trajectories/completed/traj_1771875803235_4fbf93b4.json +80 -0
  185. package/packages/sdk/.trajectories/completed/traj_1771875803243_47931c71.json +80 -0
  186. package/packages/sdk/.trajectories/completed/traj_1771875803258_3816f3fe.json +80 -0
  187. package/packages/sdk/.trajectories/completed/traj_1771875803268_8061140e.json +80 -0
  188. package/packages/sdk/.trajectories/completed/traj_1771875803326_ae6f9c78.json +80 -0
  189. package/packages/sdk/.trajectories/completed/traj_1771875808396_cbde0a6c.json +91 -0
  190. package/packages/sdk/.trajectories/completed/traj_1771875812026_aa2442bb.json +91 -0
  191. package/packages/sdk/.trajectories/completed/traj_1771875815431_c2c656c5.json +91 -0
  192. package/packages/sdk/.trajectories/completed/traj_1771875818645_3a4dbf02.json +91 -0
  193. package/packages/sdk/.trajectories/completed/traj_1771891934403_24923c03.json +80 -0
  194. package/packages/sdk/.trajectories/completed/traj_1771891934421_dca16e24.json +80 -0
  195. package/packages/sdk/.trajectories/completed/traj_1771891934430_057706f7.json +80 -0
  196. package/packages/sdk/.trajectories/completed/traj_1771891934442_faf97382.json +80 -0
  197. package/packages/sdk/.trajectories/completed/traj_1771891934454_5542ecd5.json +80 -0
  198. package/packages/sdk/.trajectories/completed/traj_1771891934464_12202a08.json +80 -0
  199. package/packages/sdk/.trajectories/completed/traj_1771891934487_94378275.json +80 -0
  200. package/packages/sdk/.trajectories/completed/traj_1771891934503_ca728c13.json +80 -0
  201. package/packages/sdk/.trajectories/completed/traj_1771891934519_100af69a.json +80 -0
  202. package/packages/sdk/.trajectories/completed/traj_1771891934536_62ad39d9.json +80 -0
  203. package/packages/sdk/.trajectories/completed/traj_1771891934553_d6798a52.json +80 -0
  204. package/packages/sdk/.trajectories/completed/traj_1771891939537_541c8096.json +91 -0
  205. package/packages/sdk/.trajectories/completed/traj_1771891942985_36ab9a4d.json +91 -0
  206. package/packages/sdk/.trajectories/completed/traj_1771891946453_e8a6e05f.json +91 -0
  207. package/packages/sdk/.trajectories/completed/traj_1771891949838_5de0de84.json +91 -0
  208. package/packages/sdk/.trajectories/completed/traj_1771891957807_0ecfb4f4.json +80 -0
  209. package/packages/sdk/.trajectories/completed/traj_1771891957827_c4539239.json +80 -0
  210. package/packages/sdk/.trajectories/completed/traj_1771891957836_91168b48.json +80 -0
  211. package/packages/sdk/.trajectories/completed/traj_1771891957848_8c5cad0b.json +80 -0
  212. package/packages/sdk/.trajectories/completed/traj_1771891957857_0986b293.json +80 -0
  213. package/packages/sdk/.trajectories/completed/traj_1771891957872_8a3113af.json +80 -0
  214. package/packages/sdk/.trajectories/completed/traj_1771891957884_0bb85208.json +80 -0
  215. package/packages/sdk/.trajectories/completed/traj_1771891957892_86c75e2e.json +80 -0
  216. package/packages/sdk/.trajectories/completed/traj_1771891957907_98ca0e6f.json +80 -0
  217. package/packages/sdk/.trajectories/completed/traj_1771891957918_d9091231.json +80 -0
  218. package/packages/sdk/.trajectories/completed/traj_1771891957931_dcaf77ed.json +80 -0
  219. package/packages/sdk/.trajectories/completed/traj_1771891962931_eb1fdee2.json +91 -0
  220. package/packages/sdk/.trajectories/completed/traj_1771891966262_9061a93f.json +91 -0
  221. package/packages/sdk/.trajectories/completed/traj_1771891969915_1adaba19.json +91 -0
  222. package/packages/sdk/.trajectories/completed/traj_1771891973588_f08b79e9.json +91 -0
  223. package/packages/sdk/.trajectories/completed/traj_1771891982421_f1985bce.json +80 -0
  224. package/packages/sdk/.trajectories/completed/traj_1771891982432_e7a84163.json +80 -0
  225. package/packages/sdk/.trajectories/completed/traj_1771891982447_369b842a.json +80 -0
  226. package/packages/sdk/.trajectories/completed/traj_1771891982469_5fc45199.json +80 -0
  227. package/packages/sdk/.trajectories/completed/traj_1771891982495_454c7cb3.json +80 -0
  228. package/packages/sdk/.trajectories/completed/traj_1771891982514_08098e03.json +80 -0
  229. package/packages/sdk/.trajectories/completed/traj_1771891982526_b351d778.json +80 -0
  230. package/packages/sdk/.trajectories/completed/traj_1771891982533_fa542d83.json +80 -0
  231. package/packages/sdk/.trajectories/completed/traj_1771891982540_18ab24dc.json +80 -0
  232. package/packages/sdk/.trajectories/completed/traj_1771891982544_5b4fa163.json +80 -0
  233. package/packages/sdk/.trajectories/completed/traj_1771891982548_c13f089a.json +80 -0
  234. package/packages/sdk/.trajectories/completed/traj_1771891987510_23f6da1f.json +91 -0
  235. package/packages/sdk/.trajectories/completed/traj_1771891991466_912c2e04.json +91 -0
  236. package/packages/sdk/.trajectories/completed/traj_1771891994891_60604be2.json +91 -0
  237. package/packages/sdk/.trajectories/completed/traj_1771891998370_cfaf9b8b.json +91 -0
  238. package/packages/sdk/README.md +68 -838
  239. package/packages/sdk/bin/agent-relay-broker +0 -0
  240. package/packages/sdk/dist/__tests__/contract-fixtures.test.d.ts +2 -0
  241. package/packages/sdk/dist/__tests__/contract-fixtures.test.d.ts.map +1 -0
  242. package/packages/sdk/dist/__tests__/contract-fixtures.test.js +85 -0
  243. package/packages/sdk/dist/__tests__/contract-fixtures.test.js.map +1 -0
  244. package/packages/sdk/dist/__tests__/facade.test.js +305 -0
  245. package/packages/sdk/dist/__tests__/facade.test.js.map +1 -0
  246. package/packages/sdk/dist/__tests__/integration.test.js +169 -0
  247. package/packages/sdk/dist/__tests__/integration.test.js.map +1 -0
  248. package/packages/sdk/dist/__tests__/pty.test.d.ts +2 -0
  249. package/packages/sdk/dist/__tests__/pty.test.d.ts.map +1 -0
  250. package/packages/sdk/dist/__tests__/pty.test.js +20 -0
  251. package/packages/sdk/dist/__tests__/pty.test.js.map +1 -0
  252. package/packages/sdk/dist/__tests__/quickstart.test.js +176 -0
  253. package/packages/sdk/dist/__tests__/quickstart.test.js.map +1 -0
  254. package/packages/sdk/dist/__tests__/spawn-from-env.test.d.ts +2 -0
  255. package/packages/sdk/dist/__tests__/spawn-from-env.test.d.ts.map +1 -0
  256. package/packages/sdk/dist/__tests__/spawn-from-env.test.js +206 -0
  257. package/packages/sdk/dist/__tests__/spawn-from-env.test.js.map +1 -0
  258. package/packages/sdk/dist/__tests__/unit.test.js +347 -0
  259. package/packages/sdk/dist/__tests__/unit.test.js.map +1 -0
  260. package/packages/sdk/dist/client.d.ts +140 -526
  261. package/packages/sdk/dist/client.d.ts.map +1 -1
  262. package/packages/sdk/dist/client.js +416 -1509
  263. package/packages/sdk/dist/client.js.map +1 -1
  264. package/packages/sdk/dist/examples/workflow-superiority.d.ts +32 -0
  265. package/packages/sdk/dist/examples/workflow-superiority.d.ts.map +1 -0
  266. package/packages/sdk/dist/examples/workflow-superiority.js +1421 -0
  267. package/packages/sdk/dist/examples/workflow-superiority.js.map +1 -0
  268. package/packages/sdk/dist/index.d.ts +13 -20
  269. package/packages/sdk/dist/index.d.ts.map +1 -1
  270. package/packages/sdk/dist/index.js +12 -26
  271. package/packages/sdk/dist/index.js.map +1 -1
  272. package/packages/sdk/dist/logs.d.ts +70 -25
  273. package/packages/sdk/dist/logs.d.ts.map +1 -1
  274. package/packages/sdk/dist/logs.js +238 -42
  275. package/packages/sdk/dist/logs.js.map +1 -1
  276. package/packages/sdk/dist/models.d.ts +9 -0
  277. package/packages/sdk/dist/models.d.ts.map +1 -0
  278. package/packages/sdk/dist/models.js +17 -0
  279. package/packages/sdk/dist/models.js.map +1 -0
  280. package/packages/sdk/dist/protocol.d.ts +366 -0
  281. package/packages/sdk/dist/protocol.d.ts.map +1 -0
  282. package/packages/sdk/dist/pty.d.ts.map +1 -0
  283. package/packages/sdk/dist/pty.js +26 -0
  284. package/packages/sdk/dist/pty.js.map +1 -0
  285. package/packages/sdk/dist/relay-adapter.d.ts +139 -0
  286. package/packages/sdk/dist/relay-adapter.d.ts.map +1 -0
  287. package/packages/sdk/dist/relay-adapter.js +210 -0
  288. package/packages/sdk/dist/relay-adapter.js.map +1 -0
  289. package/packages/sdk/dist/relay.d.ts +304 -0
  290. package/packages/sdk/dist/relay.d.ts.map +1 -0
  291. package/packages/sdk/dist/relay.js +910 -0
  292. package/packages/sdk/dist/relay.js.map +1 -0
  293. package/packages/sdk/dist/shadow.d.ts +101 -0
  294. package/packages/sdk/dist/shadow.d.ts.map +1 -0
  295. package/packages/sdk/dist/shadow.js.map +1 -0
  296. package/packages/sdk/dist/spawn-from-env.d.ts +77 -0
  297. package/packages/sdk/dist/spawn-from-env.d.ts.map +1 -0
  298. package/packages/sdk/dist/spawn-from-env.js +172 -0
  299. package/packages/sdk/dist/spawn-from-env.js.map +1 -0
  300. package/packages/sdk/dist/workflows/builder.d.ts +114 -0
  301. package/packages/sdk/dist/workflows/builder.d.ts.map +1 -0
  302. package/packages/sdk/dist/workflows/builder.js +201 -0
  303. package/packages/sdk/dist/workflows/builder.js.map +1 -0
  304. package/packages/sdk/dist/workflows/cli.d.ts +11 -0
  305. package/packages/sdk/dist/workflows/cli.d.ts.map +1 -0
  306. package/packages/sdk/dist/workflows/cli.js +144 -0
  307. package/packages/sdk/dist/workflows/cli.js.map +1 -0
  308. package/packages/sdk/dist/workflows/coordinator.d.ts +73 -0
  309. package/packages/sdk/dist/workflows/coordinator.d.ts.map +1 -0
  310. package/packages/sdk/dist/workflows/coordinator.js +647 -0
  311. package/packages/sdk/dist/workflows/coordinator.js.map +1 -0
  312. package/packages/sdk/dist/workflows/custom-steps.d.ts +73 -0
  313. package/packages/sdk/dist/workflows/custom-steps.d.ts.map +1 -0
  314. package/packages/sdk/dist/workflows/custom-steps.js +321 -0
  315. package/packages/sdk/dist/workflows/custom-steps.js.map +1 -0
  316. package/packages/sdk/dist/workflows/dry-run-format.d.ts +6 -0
  317. package/packages/sdk/dist/workflows/dry-run-format.d.ts.map +1 -0
  318. package/packages/sdk/dist/workflows/dry-run-format.js +68 -0
  319. package/packages/sdk/dist/workflows/dry-run-format.js.map +1 -0
  320. package/packages/sdk/dist/workflows/file-db.d.ts +33 -0
  321. package/packages/sdk/dist/workflows/file-db.d.ts.map +1 -0
  322. package/packages/sdk/dist/workflows/file-db.js +108 -0
  323. package/packages/sdk/dist/workflows/file-db.js.map +1 -0
  324. package/packages/sdk/dist/workflows/index.d.ts +15 -0
  325. package/packages/sdk/dist/workflows/index.d.ts.map +1 -0
  326. package/packages/sdk/dist/workflows/index.js +15 -0
  327. package/packages/sdk/dist/workflows/index.js.map +1 -0
  328. package/packages/sdk/dist/workflows/run.d.ts +38 -0
  329. package/packages/sdk/dist/workflows/run.d.ts.map +1 -0
  330. package/packages/sdk/dist/workflows/run.js +25 -0
  331. package/packages/sdk/dist/workflows/run.js.map +1 -0
  332. package/packages/sdk/dist/workflows/runner.d.ts +320 -0
  333. package/packages/sdk/dist/workflows/runner.d.ts.map +1 -0
  334. package/packages/sdk/dist/workflows/runner.js +2821 -0
  335. package/packages/sdk/dist/workflows/runner.js.map +1 -0
  336. package/packages/sdk/dist/workflows/templates.d.ts +47 -0
  337. package/packages/sdk/dist/workflows/templates.d.ts.map +1 -0
  338. package/packages/sdk/dist/workflows/templates.js +405 -0
  339. package/packages/sdk/dist/workflows/templates.js.map +1 -0
  340. package/packages/sdk/dist/workflows/trajectory.d.ts +87 -0
  341. package/packages/sdk/dist/workflows/trajectory.d.ts.map +1 -0
  342. package/packages/sdk/dist/workflows/trajectory.js +441 -0
  343. package/packages/sdk/dist/workflows/trajectory.js.map +1 -0
  344. package/packages/sdk/dist/workflows/types.d.ts +306 -0
  345. package/packages/sdk/dist/workflows/types.d.ts.map +1 -0
  346. package/packages/sdk/dist/workflows/types.js +23 -0
  347. package/packages/sdk/dist/workflows/types.js.map +1 -0
  348. package/packages/sdk/dist/workflows/validator.d.ts +11 -0
  349. package/packages/sdk/dist/workflows/validator.d.ts.map +1 -0
  350. package/packages/sdk/dist/workflows/validator.js +128 -0
  351. package/packages/sdk/dist/workflows/validator.js.map +1 -0
  352. package/packages/sdk/package.json +59 -53
  353. package/packages/sdk/scripts/bundle-agent-relay.mjs +53 -0
  354. package/packages/sdk/src/__tests__/contract-fixtures.test.ts +122 -0
  355. package/packages/sdk/src/__tests__/error-scenarios.test.ts +682 -0
  356. package/packages/sdk/src/__tests__/facade.test.ts +364 -0
  357. package/packages/sdk/src/__tests__/idle-nudge.test.ts +438 -0
  358. package/packages/sdk/src/__tests__/integration.test.ts +204 -0
  359. package/packages/sdk/src/__tests__/orchestration-upgrades.test.ts +797 -0
  360. package/packages/sdk/src/__tests__/pty.test.ts +24 -0
  361. package/packages/sdk/src/__tests__/quickstart.test.ts +198 -0
  362. package/packages/sdk/src/__tests__/spawn-from-env.test.ts +282 -0
  363. package/packages/sdk/src/__tests__/swarm-coordinator.test.ts +909 -0
  364. package/packages/sdk/src/__tests__/unit.test.ts +435 -0
  365. package/packages/sdk/src/__tests__/workflow-runner.test.ts +489 -0
  366. package/packages/sdk/src/__tests__/yaml-validation.test.ts +890 -0
  367. package/packages/sdk/src/client.ts +514 -1912
  368. package/packages/sdk/src/examples/workflow-superiority.ts +1485 -0
  369. package/packages/sdk/src/examples/workflows/README.md +156 -0
  370. package/packages/sdk/src/examples/workflows/ralph-overnight.yaml +421 -0
  371. package/packages/sdk/src/examples/workflows/ralph-swarm.yaml +411 -0
  372. package/packages/sdk/src/examples/workflows/ralph-tdd.yaml +259 -0
  373. package/packages/sdk/src/index.ts +13 -116
  374. package/packages/sdk/src/logs.ts +282 -54
  375. package/packages/sdk/src/models.ts +36 -0
  376. package/packages/sdk/src/protocol.ts +385 -0
  377. package/packages/sdk/src/pty.ts +35 -0
  378. package/packages/sdk/src/relay-adapter.ts +316 -0
  379. package/packages/sdk/src/relay.ts +1147 -0
  380. package/packages/sdk/src/shadow.ts +228 -0
  381. package/packages/sdk/src/spawn-from-env.ts +245 -0
  382. package/packages/sdk/src/workflows/README.md +656 -0
  383. package/packages/sdk/src/workflows/builder.ts +278 -0
  384. package/packages/sdk/src/workflows/builtin-templates/bug-fix.yaml +135 -0
  385. package/packages/sdk/src/workflows/builtin-templates/code-review.yaml +133 -0
  386. package/packages/sdk/src/workflows/builtin-templates/competitive.yaml +103 -0
  387. package/packages/sdk/src/workflows/builtin-templates/documentation.yaml +120 -0
  388. package/packages/sdk/src/workflows/builtin-templates/feature-dev.yaml +142 -0
  389. package/packages/sdk/src/workflows/builtin-templates/refactor.yaml +141 -0
  390. package/packages/sdk/src/workflows/builtin-templates/review-loop.yaml +223 -0
  391. package/packages/sdk/src/workflows/builtin-templates/security-audit.yaml +129 -0
  392. package/packages/sdk/src/workflows/cli.ts +162 -0
  393. package/packages/sdk/src/workflows/coordinator.ts +842 -0
  394. package/packages/sdk/src/workflows/custom-steps.ts +450 -0
  395. package/packages/sdk/src/workflows/dry-run-format.ts +75 -0
  396. package/packages/sdk/src/workflows/file-db.ts +117 -0
  397. package/packages/sdk/src/workflows/index.ts +24 -0
  398. package/packages/sdk/src/workflows/run.ts +72 -0
  399. package/packages/sdk/src/workflows/runner.ts +3409 -0
  400. package/packages/sdk/src/workflows/schema.json +651 -0
  401. package/packages/sdk/src/workflows/templates.ts +552 -0
  402. package/packages/sdk/src/workflows/trajectory.ts +631 -0
  403. package/packages/sdk/src/workflows/types.ts +389 -0
  404. package/packages/sdk/src/workflows/validator.ts +151 -0
  405. package/packages/sdk/tsconfig.build.json +25 -0
  406. package/packages/sdk/tsconfig.json +17 -18
  407. package/packages/sdk/vitest.config.ts +1 -1
  408. package/packages/sdk-py/README.md +106 -21
  409. package/packages/sdk-py/agent_relay/__init__.py +21 -0
  410. package/packages/sdk-py/agent_relay/models.py +206 -0
  411. package/packages/sdk-py/pyproject.toml +2 -2
  412. package/packages/sdk-py/src/agent_relay/__init__.py +76 -0
  413. package/packages/sdk-py/src/agent_relay/builder.py +430 -109
  414. package/packages/sdk-py/src/agent_relay/templates.py +197 -0
  415. package/packages/sdk-py/src/agent_relay/types.py +489 -15
  416. package/packages/sdk-py/tests/test_builder.py +115 -1
  417. package/packages/sdk-py/tests/test_workflow_templates.py +450 -0
  418. package/packages/shared/cli-registry.yaml +193 -0
  419. package/packages/shared/codegen-py.mjs +215 -0
  420. package/packages/shared/codegen-ts.mjs +227 -0
  421. package/packages/telemetry/dist/events.d.ts +8 -8
  422. package/packages/telemetry/dist/index.d.ts +1 -1
  423. package/packages/telemetry/package.json +2 -2
  424. package/packages/telemetry/src/events.ts +9 -9
  425. package/packages/telemetry/src/index.ts +2 -2
  426. package/packages/trajectory/package.json +2 -2
  427. package/packages/user-directory/dist/user-directory.js +1 -1
  428. package/packages/user-directory/dist/user-directory.js.map +1 -1
  429. package/packages/user-directory/package.json +2 -2
  430. package/packages/user-directory/src/user-directory.ts +1 -1
  431. package/packages/utils/dist/cjs/client-helpers.js +4 -4
  432. package/packages/utils/dist/cjs/discovery.js +9 -6
  433. package/packages/utils/dist/cjs/errors.js +5 -5
  434. package/packages/utils/dist/cjs/legacy-protocol.js +70 -0
  435. package/packages/utils/dist/cjs/logger.js +3 -3
  436. package/packages/utils/dist/cjs/precompiled-patterns.js +33 -2
  437. package/packages/utils/dist/cjs/relay-pty-path.js +0 -6
  438. package/packages/utils/dist/client-helpers.d.ts +1 -1
  439. package/packages/utils/dist/client-helpers.d.ts.map +1 -1
  440. package/packages/utils/dist/client-helpers.js +1 -1
  441. package/packages/utils/dist/client-helpers.js.map +1 -1
  442. package/packages/utils/dist/discovery.d.ts +7 -7
  443. package/packages/utils/dist/discovery.d.ts.map +1 -1
  444. package/packages/utils/dist/discovery.js +20 -17
  445. package/packages/utils/dist/discovery.js.map +1 -1
  446. package/packages/utils/dist/errors.d.ts +1 -1
  447. package/packages/utils/dist/errors.js +3 -3
  448. package/packages/utils/dist/legacy-protocol.d.ts +46 -0
  449. package/packages/utils/dist/legacy-protocol.d.ts.map +1 -0
  450. package/packages/utils/dist/legacy-protocol.js +47 -0
  451. package/packages/utils/dist/legacy-protocol.js.map +1 -0
  452. package/packages/utils/dist/logger.d.ts +2 -2
  453. package/packages/utils/dist/logger.js +2 -2
  454. package/packages/utils/dist/precompiled-patterns.d.ts.map +1 -1
  455. package/packages/utils/dist/precompiled-patterns.js +28 -2
  456. package/packages/utils/dist/precompiled-patterns.js.map +1 -1
  457. package/packages/utils/dist/relay-pty-path.d.ts.map +1 -1
  458. package/packages/utils/dist/relay-pty-path.js +1 -10
  459. package/packages/utils/dist/relay-pty-path.js.map +1 -1
  460. package/packages/utils/package.json +2 -3
  461. package/packages/utils/src/client-helpers.ts +1 -1
  462. package/packages/utils/src/consolidation.test.ts +3 -3
  463. package/packages/utils/src/discovery.test.ts +3 -3
  464. package/packages/utils/src/discovery.ts +21 -18
  465. package/packages/utils/src/errors.test.ts +6 -11
  466. package/packages/utils/src/errors.ts +3 -3
  467. package/packages/utils/src/legacy-protocol.ts +151 -0
  468. package/packages/utils/src/logger.ts +2 -2
  469. package/packages/utils/src/precompiled-patterns.test.ts +8 -0
  470. package/packages/utils/src/precompiled-patterns.ts +40 -2
  471. package/packages/utils/src/relay-pty-path.test.ts +23 -34
  472. package/packages/utils/src/relay-pty-path.ts +1 -11
  473. package/relay-snippets/agent-relay-protocol.md +6 -43
  474. package/relay-snippets/agent-relay-snippet.md +59 -203
  475. package/scripts/postinstall.js +44 -171
  476. package/bin/relay-pty-darwin-arm64 +0 -0
  477. package/bin/relay-pty-darwin-x64 +0 -0
  478. package/bin/relay-pty-linux-arm64 +0 -0
  479. package/bin/relay-pty-linux-x64 +0 -0
  480. package/dist/src/bridge/index.d.ts +0 -8
  481. package/dist/src/bridge/index.d.ts.map +0 -1
  482. package/dist/src/bridge/index.js +0 -8
  483. package/dist/src/bridge/index.js.map +0 -1
  484. package/dist/src/continuity/index.d.ts +0 -5
  485. package/dist/src/continuity/index.d.ts.map +0 -1
  486. package/dist/src/continuity/index.js +0 -5
  487. package/dist/src/continuity/index.js.map +0 -1
  488. package/dist/src/daemon/index.d.ts +0 -8
  489. package/dist/src/daemon/index.d.ts.map +0 -1
  490. package/dist/src/daemon/index.js +0 -9
  491. package/dist/src/daemon/index.js.map +0 -1
  492. package/dist/src/protocol/index.d.ts +0 -8
  493. package/dist/src/protocol/index.d.ts.map +0 -1
  494. package/dist/src/protocol/index.js +0 -8
  495. package/dist/src/protocol/index.js.map +0 -1
  496. package/dist/src/resiliency/index.d.ts +0 -5
  497. package/dist/src/resiliency/index.d.ts.map +0 -1
  498. package/dist/src/resiliency/index.js +0 -5
  499. package/dist/src/resiliency/index.js.map +0 -1
  500. package/dist/src/state/index.d.ts +0 -5
  501. package/dist/src/state/index.d.ts.map +0 -1
  502. package/dist/src/state/index.js +0 -5
  503. package/dist/src/state/index.js.map +0 -1
  504. package/dist/src/storage/index.d.ts +0 -8
  505. package/dist/src/storage/index.d.ts.map +0 -1
  506. package/dist/src/storage/index.js +0 -8
  507. package/dist/src/storage/index.js.map +0 -1
  508. package/dist/src/wrapper/index.d.ts +0 -8
  509. package/dist/src/wrapper/index.d.ts.map +0 -1
  510. package/dist/src/wrapper/index.js +0 -11
  511. package/dist/src/wrapper/index.js.map +0 -1
  512. package/packages/bridge/dist/cli-resolution.d.ts +0 -32
  513. package/packages/bridge/dist/cli-resolution.d.ts.map +0 -1
  514. package/packages/bridge/dist/cli-resolution.js +0 -88
  515. package/packages/bridge/dist/cli-resolution.js.map +0 -1
  516. package/packages/bridge/dist/index.d.ts +0 -9
  517. package/packages/bridge/dist/index.d.ts.map +0 -1
  518. package/packages/bridge/dist/index.js +0 -11
  519. package/packages/bridge/dist/index.js.map +0 -1
  520. package/packages/bridge/dist/multi-project-client.d.ts +0 -99
  521. package/packages/bridge/dist/multi-project-client.d.ts.map +0 -1
  522. package/packages/bridge/dist/multi-project-client.js +0 -389
  523. package/packages/bridge/dist/multi-project-client.js.map +0 -1
  524. package/packages/bridge/dist/shadow-cli.d.ts +0 -17
  525. package/packages/bridge/dist/shadow-cli.d.ts.map +0 -1
  526. package/packages/bridge/dist/shadow-cli.js +0 -75
  527. package/packages/bridge/dist/shadow-cli.js.map +0 -1
  528. package/packages/bridge/dist/spawner.d.ts +0 -263
  529. package/packages/bridge/dist/spawner.d.ts.map +0 -1
  530. package/packages/bridge/dist/spawner.js +0 -1758
  531. package/packages/bridge/dist/spawner.js.map +0 -1
  532. package/packages/bridge/dist/types.d.ts +0 -141
  533. package/packages/bridge/dist/types.d.ts.map +0 -1
  534. package/packages/bridge/dist/types.js +0 -6
  535. package/packages/bridge/dist/types.js.map +0 -1
  536. package/packages/bridge/dist/utils.d.ts +0 -39
  537. package/packages/bridge/dist/utils.d.ts.map +0 -1
  538. package/packages/bridge/dist/utils.js +0 -98
  539. package/packages/bridge/dist/utils.js.map +0 -1
  540. package/packages/bridge/package.json +0 -45
  541. package/packages/bridge/src/cli-resolution.test.ts +0 -225
  542. package/packages/bridge/src/cli-resolution.ts +0 -100
  543. package/packages/bridge/src/index.ts +0 -34
  544. package/packages/bridge/src/multi-project-client.test.ts +0 -340
  545. package/packages/bridge/src/multi-project-client.ts +0 -469
  546. package/packages/bridge/src/shadow-cli.ts +0 -95
  547. package/packages/bridge/src/spawner-mcp.test.ts +0 -505
  548. package/packages/bridge/src/spawner.ts +0 -2067
  549. package/packages/bridge/src/types.ts +0 -153
  550. package/packages/bridge/src/utils.test.ts +0 -235
  551. package/packages/bridge/src/utils.ts +0 -113
  552. package/packages/bridge/tsconfig.json +0 -29
  553. package/packages/bridge/vitest.config.ts +0 -9
  554. package/packages/broker-sdk/README.md +0 -97
  555. package/packages/broker-sdk/dist/__tests__/facade.test.js +0 -257
  556. package/packages/broker-sdk/dist/__tests__/facade.test.js.map +0 -1
  557. package/packages/broker-sdk/dist/__tests__/integration.test.js +0 -139
  558. package/packages/broker-sdk/dist/__tests__/integration.test.js.map +0 -1
  559. package/packages/broker-sdk/dist/__tests__/quickstart.test.js +0 -176
  560. package/packages/broker-sdk/dist/__tests__/quickstart.test.js.map +0 -1
  561. package/packages/broker-sdk/dist/__tests__/unit.test.js +0 -192
  562. package/packages/broker-sdk/dist/__tests__/unit.test.js.map +0 -1
  563. package/packages/broker-sdk/dist/client.d.ts +0 -95
  564. package/packages/broker-sdk/dist/client.d.ts.map +0 -1
  565. package/packages/broker-sdk/dist/client.js +0 -372
  566. package/packages/broker-sdk/dist/client.js.map +0 -1
  567. package/packages/broker-sdk/dist/index.d.ts +0 -10
  568. package/packages/broker-sdk/dist/index.d.ts.map +0 -1
  569. package/packages/broker-sdk/dist/index.js +0 -10
  570. package/packages/broker-sdk/dist/index.js.map +0 -1
  571. package/packages/broker-sdk/dist/logs.d.ts +0 -47
  572. package/packages/broker-sdk/dist/logs.d.ts.map +0 -1
  573. package/packages/broker-sdk/dist/logs.js +0 -137
  574. package/packages/broker-sdk/dist/logs.js.map +0 -1
  575. package/packages/broker-sdk/dist/protocol.d.ts +0 -254
  576. package/packages/broker-sdk/dist/protocol.d.ts.map +0 -1
  577. package/packages/broker-sdk/dist/pty.d.ts.map +0 -1
  578. package/packages/broker-sdk/dist/pty.js +0 -14
  579. package/packages/broker-sdk/dist/pty.js.map +0 -1
  580. package/packages/broker-sdk/dist/relay.d.ts +0 -172
  581. package/packages/broker-sdk/dist/relay.d.ts.map +0 -1
  582. package/packages/broker-sdk/dist/relay.js +0 -486
  583. package/packages/broker-sdk/dist/relay.js.map +0 -1
  584. package/packages/broker-sdk/dist/relaycast.d.ts +0 -67
  585. package/packages/broker-sdk/dist/relaycast.d.ts.map +0 -1
  586. package/packages/broker-sdk/dist/relaycast.js +0 -150
  587. package/packages/broker-sdk/dist/relaycast.js.map +0 -1
  588. package/packages/broker-sdk/dist/shadow.d.ts +0 -100
  589. package/packages/broker-sdk/dist/shadow.d.ts.map +0 -1
  590. package/packages/broker-sdk/dist/shadow.js.map +0 -1
  591. package/packages/broker-sdk/dist/workflows/builder.d.ts +0 -101
  592. package/packages/broker-sdk/dist/workflows/builder.d.ts.map +0 -1
  593. package/packages/broker-sdk/dist/workflows/builder.js +0 -179
  594. package/packages/broker-sdk/dist/workflows/builder.js.map +0 -1
  595. package/packages/broker-sdk/dist/workflows/cli.d.ts +0 -10
  596. package/packages/broker-sdk/dist/workflows/cli.d.ts.map +0 -1
  597. package/packages/broker-sdk/dist/workflows/cli.js +0 -82
  598. package/packages/broker-sdk/dist/workflows/cli.js.map +0 -1
  599. package/packages/broker-sdk/dist/workflows/coordinator.d.ts +0 -69
  600. package/packages/broker-sdk/dist/workflows/coordinator.d.ts.map +0 -1
  601. package/packages/broker-sdk/dist/workflows/coordinator.js +0 -585
  602. package/packages/broker-sdk/dist/workflows/coordinator.js.map +0 -1
  603. package/packages/broker-sdk/dist/workflows/index.d.ts +0 -11
  604. package/packages/broker-sdk/dist/workflows/index.d.ts.map +0 -1
  605. package/packages/broker-sdk/dist/workflows/index.js +0 -11
  606. package/packages/broker-sdk/dist/workflows/index.js.map +0 -1
  607. package/packages/broker-sdk/dist/workflows/run.d.ts +0 -33
  608. package/packages/broker-sdk/dist/workflows/run.d.ts.map +0 -1
  609. package/packages/broker-sdk/dist/workflows/run.js +0 -28
  610. package/packages/broker-sdk/dist/workflows/run.js.map +0 -1
  611. package/packages/broker-sdk/dist/workflows/runner.d.ts +0 -136
  612. package/packages/broker-sdk/dist/workflows/runner.d.ts.map +0 -1
  613. package/packages/broker-sdk/dist/workflows/runner.js +0 -900
  614. package/packages/broker-sdk/dist/workflows/runner.js.map +0 -1
  615. package/packages/broker-sdk/dist/workflows/templates.d.ts +0 -47
  616. package/packages/broker-sdk/dist/workflows/templates.d.ts.map +0 -1
  617. package/packages/broker-sdk/dist/workflows/templates.js +0 -395
  618. package/packages/broker-sdk/dist/workflows/templates.js.map +0 -1
  619. package/packages/broker-sdk/dist/workflows/trajectory.d.ts +0 -80
  620. package/packages/broker-sdk/dist/workflows/trajectory.d.ts.map +0 -1
  621. package/packages/broker-sdk/dist/workflows/trajectory.js +0 -362
  622. package/packages/broker-sdk/dist/workflows/trajectory.js.map +0 -1
  623. package/packages/broker-sdk/dist/workflows/types.d.ts +0 -140
  624. package/packages/broker-sdk/dist/workflows/types.d.ts.map +0 -1
  625. package/packages/broker-sdk/dist/workflows/types.js +0 -8
  626. package/packages/broker-sdk/dist/workflows/types.js.map +0 -1
  627. package/packages/broker-sdk/package.json +0 -81
  628. package/packages/broker-sdk/scripts/bundle-agent-relay.mjs +0 -53
  629. package/packages/broker-sdk/src/__tests__/error-scenarios.test.ts +0 -682
  630. package/packages/broker-sdk/src/__tests__/facade.test.ts +0 -296
  631. package/packages/broker-sdk/src/__tests__/integration.test.ts +0 -170
  632. package/packages/broker-sdk/src/__tests__/quickstart.test.ts +0 -198
  633. package/packages/broker-sdk/src/__tests__/swarm-coordinator.test.ts +0 -772
  634. package/packages/broker-sdk/src/__tests__/unit.test.ts +0 -243
  635. package/packages/broker-sdk/src/__tests__/workflow-runner.test.ts +0 -333
  636. package/packages/broker-sdk/src/client.ts +0 -510
  637. package/packages/broker-sdk/src/index.ts +0 -9
  638. package/packages/broker-sdk/src/logs.ts +0 -163
  639. package/packages/broker-sdk/src/protocol.ts +0 -271
  640. package/packages/broker-sdk/src/pty.ts +0 -16
  641. package/packages/broker-sdk/src/relay.ts +0 -614
  642. package/packages/broker-sdk/src/relaycast.ts +0 -185
  643. package/packages/broker-sdk/src/shadow.ts +0 -230
  644. package/packages/broker-sdk/src/workflows/README.md +0 -514
  645. package/packages/broker-sdk/src/workflows/builder.ts +0 -241
  646. package/packages/broker-sdk/src/workflows/builtin-templates/bug-fix.yaml +0 -75
  647. package/packages/broker-sdk/src/workflows/builtin-templates/code-review.yaml +0 -82
  648. package/packages/broker-sdk/src/workflows/builtin-templates/documentation.yaml +0 -70
  649. package/packages/broker-sdk/src/workflows/builtin-templates/feature-dev.yaml +0 -76
  650. package/packages/broker-sdk/src/workflows/builtin-templates/refactor.yaml +0 -82
  651. package/packages/broker-sdk/src/workflows/builtin-templates/security-audit.yaml +0 -84
  652. package/packages/broker-sdk/src/workflows/cli.ts +0 -93
  653. package/packages/broker-sdk/src/workflows/coordinator.ts +0 -758
  654. package/packages/broker-sdk/src/workflows/index.ts +0 -10
  655. package/packages/broker-sdk/src/workflows/run.ts +0 -55
  656. package/packages/broker-sdk/src/workflows/runner.ts +0 -1184
  657. package/packages/broker-sdk/src/workflows/schema.json +0 -333
  658. package/packages/broker-sdk/src/workflows/templates.ts +0 -544
  659. package/packages/broker-sdk/src/workflows/trajectory.ts +0 -507
  660. package/packages/broker-sdk/src/workflows/types.ts +0 -208
  661. package/packages/broker-sdk/tsconfig.json +0 -22
  662. package/packages/broker-sdk/vitest.config.ts +0 -9
  663. package/packages/continuity/dist/formatter.d.ts +0 -57
  664. package/packages/continuity/dist/formatter.d.ts.map +0 -1
  665. package/packages/continuity/dist/formatter.js +0 -448
  666. package/packages/continuity/dist/formatter.js.map +0 -1
  667. package/packages/continuity/dist/handoff-store.d.ts +0 -67
  668. package/packages/continuity/dist/handoff-store.d.ts.map +0 -1
  669. package/packages/continuity/dist/handoff-store.js +0 -472
  670. package/packages/continuity/dist/handoff-store.js.map +0 -1
  671. package/packages/continuity/dist/index.d.ts +0 -10
  672. package/packages/continuity/dist/index.d.ts.map +0 -1
  673. package/packages/continuity/dist/index.js +0 -11
  674. package/packages/continuity/dist/index.js.map +0 -1
  675. package/packages/continuity/dist/ledger-store.d.ts +0 -110
  676. package/packages/continuity/dist/ledger-store.d.ts.map +0 -1
  677. package/packages/continuity/dist/ledger-store.js +0 -500
  678. package/packages/continuity/dist/ledger-store.js.map +0 -1
  679. package/packages/continuity/dist/manager.d.ts +0 -183
  680. package/packages/continuity/dist/manager.d.ts.map +0 -1
  681. package/packages/continuity/dist/manager.js +0 -616
  682. package/packages/continuity/dist/manager.js.map +0 -1
  683. package/packages/continuity/dist/parser.d.ts +0 -76
  684. package/packages/continuity/dist/parser.d.ts.map +0 -1
  685. package/packages/continuity/dist/parser.js +0 -579
  686. package/packages/continuity/dist/parser.js.map +0 -1
  687. package/packages/continuity/dist/types.d.ts +0 -180
  688. package/packages/continuity/dist/types.d.ts.map +0 -1
  689. package/packages/continuity/dist/types.js +0 -2
  690. package/packages/continuity/dist/types.js.map +0 -1
  691. package/packages/continuity/package.json +0 -40
  692. package/packages/continuity/src/formatter.ts +0 -536
  693. package/packages/continuity/src/handoff-store.ts +0 -523
  694. package/packages/continuity/src/index.ts +0 -12
  695. package/packages/continuity/src/ledger-store.ts +0 -594
  696. package/packages/continuity/src/manager.test.ts +0 -291
  697. package/packages/continuity/src/manager.ts +0 -774
  698. package/packages/continuity/src/parser.test.ts +0 -292
  699. package/packages/continuity/src/parser.ts +0 -680
  700. package/packages/continuity/src/types.ts +0 -211
  701. package/packages/continuity/tsconfig.json +0 -21
  702. package/packages/continuity/vitest.config.ts +0 -9
  703. package/packages/daemon/dist/agent-manager.d.ts +0 -134
  704. package/packages/daemon/dist/agent-manager.d.ts.map +0 -1
  705. package/packages/daemon/dist/agent-manager.js +0 -578
  706. package/packages/daemon/dist/agent-manager.js.map +0 -1
  707. package/packages/daemon/dist/agent-registry.d.ts +0 -99
  708. package/packages/daemon/dist/agent-registry.d.ts.map +0 -1
  709. package/packages/daemon/dist/agent-registry.js +0 -213
  710. package/packages/daemon/dist/agent-registry.js.map +0 -1
  711. package/packages/daemon/dist/agent-signing.d.ts +0 -158
  712. package/packages/daemon/dist/agent-signing.d.ts.map +0 -1
  713. package/packages/daemon/dist/agent-signing.js +0 -523
  714. package/packages/daemon/dist/agent-signing.js.map +0 -1
  715. package/packages/daemon/dist/api.d.ts +0 -106
  716. package/packages/daemon/dist/api.d.ts.map +0 -1
  717. package/packages/daemon/dist/api.js +0 -895
  718. package/packages/daemon/dist/api.js.map +0 -1
  719. package/packages/daemon/dist/auth.d.ts +0 -94
  720. package/packages/daemon/dist/auth.d.ts.map +0 -1
  721. package/packages/daemon/dist/auth.js +0 -197
  722. package/packages/daemon/dist/auth.js.map +0 -1
  723. package/packages/daemon/dist/channel-membership-store.d.ts +0 -55
  724. package/packages/daemon/dist/channel-membership-store.d.ts.map +0 -1
  725. package/packages/daemon/dist/channel-membership-store.js +0 -176
  726. package/packages/daemon/dist/channel-membership-store.js.map +0 -1
  727. package/packages/daemon/dist/cli-auth.d.ts +0 -97
  728. package/packages/daemon/dist/cli-auth.d.ts.map +0 -1
  729. package/packages/daemon/dist/cli-auth.js +0 -808
  730. package/packages/daemon/dist/cli-auth.js.map +0 -1
  731. package/packages/daemon/dist/cloud-sync.d.ts +0 -263
  732. package/packages/daemon/dist/cloud-sync.d.ts.map +0 -1
  733. package/packages/daemon/dist/cloud-sync.js +0 -820
  734. package/packages/daemon/dist/cloud-sync.js.map +0 -1
  735. package/packages/daemon/dist/connection.d.ts +0 -137
  736. package/packages/daemon/dist/connection.d.ts.map +0 -1
  737. package/packages/daemon/dist/connection.js +0 -465
  738. package/packages/daemon/dist/connection.js.map +0 -1
  739. package/packages/daemon/dist/consensus-integration.d.ts +0 -168
  740. package/packages/daemon/dist/consensus-integration.d.ts.map +0 -1
  741. package/packages/daemon/dist/consensus-integration.js +0 -371
  742. package/packages/daemon/dist/consensus-integration.js.map +0 -1
  743. package/packages/daemon/dist/consensus.d.ts +0 -269
  744. package/packages/daemon/dist/consensus.d.ts.map +0 -1
  745. package/packages/daemon/dist/consensus.js +0 -632
  746. package/packages/daemon/dist/consensus.js.map +0 -1
  747. package/packages/daemon/dist/delivery-tracker.d.ts +0 -34
  748. package/packages/daemon/dist/delivery-tracker.d.ts.map +0 -1
  749. package/packages/daemon/dist/delivery-tracker.js +0 -104
  750. package/packages/daemon/dist/delivery-tracker.js.map +0 -1
  751. package/packages/daemon/dist/enhanced-features.d.ts +0 -118
  752. package/packages/daemon/dist/enhanced-features.d.ts.map +0 -1
  753. package/packages/daemon/dist/enhanced-features.js +0 -177
  754. package/packages/daemon/dist/enhanced-features.js.map +0 -1
  755. package/packages/daemon/dist/index.d.ts +0 -29
  756. package/packages/daemon/dist/index.d.ts.map +0 -1
  757. package/packages/daemon/dist/index.js +0 -34
  758. package/packages/daemon/dist/index.js.map +0 -1
  759. package/packages/daemon/dist/orchestrator.d.ts +0 -217
  760. package/packages/daemon/dist/orchestrator.d.ts.map +0 -1
  761. package/packages/daemon/dist/orchestrator.js +0 -1172
  762. package/packages/daemon/dist/orchestrator.js.map +0 -1
  763. package/packages/daemon/dist/rate-limiter.d.ts +0 -68
  764. package/packages/daemon/dist/rate-limiter.d.ts.map +0 -1
  765. package/packages/daemon/dist/rate-limiter.js +0 -130
  766. package/packages/daemon/dist/rate-limiter.js.map +0 -1
  767. package/packages/daemon/dist/registry.d.ts +0 -9
  768. package/packages/daemon/dist/registry.d.ts.map +0 -1
  769. package/packages/daemon/dist/registry.js +0 -9
  770. package/packages/daemon/dist/registry.js.map +0 -1
  771. package/packages/daemon/dist/repo-manager.d.ts +0 -116
  772. package/packages/daemon/dist/repo-manager.d.ts.map +0 -1
  773. package/packages/daemon/dist/repo-manager.js +0 -384
  774. package/packages/daemon/dist/repo-manager.js.map +0 -1
  775. package/packages/daemon/dist/router.d.ts +0 -389
  776. package/packages/daemon/dist/router.d.ts.map +0 -1
  777. package/packages/daemon/dist/router.js +0 -1607
  778. package/packages/daemon/dist/router.js.map +0 -1
  779. package/packages/daemon/dist/server.d.ts +0 -201
  780. package/packages/daemon/dist/server.d.ts.map +0 -1
  781. package/packages/daemon/dist/server.js +0 -1791
  782. package/packages/daemon/dist/server.js.map +0 -1
  783. package/packages/daemon/dist/spawn-manager.d.ts +0 -119
  784. package/packages/daemon/dist/spawn-manager.d.ts.map +0 -1
  785. package/packages/daemon/dist/spawn-manager.js +0 -319
  786. package/packages/daemon/dist/spawn-manager.js.map +0 -1
  787. package/packages/daemon/dist/sync-queue.d.ts +0 -116
  788. package/packages/daemon/dist/sync-queue.d.ts.map +0 -1
  789. package/packages/daemon/dist/sync-queue.js +0 -361
  790. package/packages/daemon/dist/sync-queue.js.map +0 -1
  791. package/packages/daemon/dist/types.d.ts +0 -133
  792. package/packages/daemon/dist/types.d.ts.map +0 -1
  793. package/packages/daemon/dist/types.js +0 -6
  794. package/packages/daemon/dist/types.js.map +0 -1
  795. package/packages/daemon/dist/workspace-manager.d.ts +0 -80
  796. package/packages/daemon/dist/workspace-manager.d.ts.map +0 -1
  797. package/packages/daemon/dist/workspace-manager.js +0 -314
  798. package/packages/daemon/dist/workspace-manager.js.map +0 -1
  799. package/packages/daemon/package.json +0 -56
  800. package/packages/daemon/src/agent-manager.ts +0 -679
  801. package/packages/daemon/src/agent-registry.ts +0 -284
  802. package/packages/daemon/src/agent-signing.ts +0 -707
  803. package/packages/daemon/src/api.ts +0 -1034
  804. package/packages/daemon/src/auth.ts +0 -276
  805. package/packages/daemon/src/channel-membership-store.ts +0 -217
  806. package/packages/daemon/src/cli-auth.ts +0 -945
  807. package/packages/daemon/src/cloud-sync.ts +0 -1100
  808. package/packages/daemon/src/connection.ts +0 -561
  809. package/packages/daemon/src/consensus-integration.ts +0 -510
  810. package/packages/daemon/src/consensus.ts +0 -848
  811. package/packages/daemon/src/delivery-tracker.ts +0 -145
  812. package/packages/daemon/src/enhanced-features.ts +0 -390
  813. package/packages/daemon/src/index.ts +0 -48
  814. package/packages/daemon/src/orchestrator.test.ts +0 -231
  815. package/packages/daemon/src/orchestrator.ts +0 -1376
  816. package/packages/daemon/src/rate-limiter.ts +0 -172
  817. package/packages/daemon/src/registry.ts +0 -8
  818. package/packages/daemon/src/repo-manager.ts +0 -468
  819. package/packages/daemon/src/router.test.ts +0 -181
  820. package/packages/daemon/src/router.ts +0 -1925
  821. package/packages/daemon/src/server.ts +0 -2051
  822. package/packages/daemon/src/spawn-manager-set-model.test.ts +0 -144
  823. package/packages/daemon/src/spawn-manager.ts +0 -415
  824. package/packages/daemon/src/sync-queue.ts +0 -477
  825. package/packages/daemon/src/types.ts +0 -158
  826. package/packages/daemon/src/workspace-manager.ts +0 -371
  827. package/packages/daemon/tsconfig.json +0 -21
  828. package/packages/daemon/vitest.config.ts +0 -9
  829. package/packages/mcp/CHANGELOG.md +0 -28
  830. package/packages/mcp/LICENSE +0 -190
  831. package/packages/mcp/README.md +0 -266
  832. package/packages/mcp/dist/bin.d.ts +0 -12
  833. package/packages/mcp/dist/bin.d.ts.map +0 -1
  834. package/packages/mcp/dist/bin.js +0 -179
  835. package/packages/mcp/dist/bin.js.map +0 -1
  836. package/packages/mcp/dist/client-adapter.d.ts +0 -164
  837. package/packages/mcp/dist/client-adapter.d.ts.map +0 -1
  838. package/packages/mcp/dist/client-adapter.js +0 -231
  839. package/packages/mcp/dist/client-adapter.js.map +0 -1
  840. package/packages/mcp/dist/cloud.d.ts +0 -13
  841. package/packages/mcp/dist/cloud.d.ts.map +0 -1
  842. package/packages/mcp/dist/cloud.js +0 -25
  843. package/packages/mcp/dist/cloud.js.map +0 -1
  844. package/packages/mcp/dist/errors.d.ts +0 -9
  845. package/packages/mcp/dist/errors.d.ts.map +0 -1
  846. package/packages/mcp/dist/errors.js +0 -9
  847. package/packages/mcp/dist/errors.js.map +0 -1
  848. package/packages/mcp/dist/file-transport.d.ts +0 -103
  849. package/packages/mcp/dist/file-transport.d.ts.map +0 -1
  850. package/packages/mcp/dist/file-transport.js +0 -204
  851. package/packages/mcp/dist/file-transport.js.map +0 -1
  852. package/packages/mcp/dist/hybrid-client.d.ts +0 -5
  853. package/packages/mcp/dist/hybrid-client.d.ts.map +0 -1
  854. package/packages/mcp/dist/hybrid-client.js +0 -23
  855. package/packages/mcp/dist/hybrid-client.js.map +0 -1
  856. package/packages/mcp/dist/index.d.ts +0 -11
  857. package/packages/mcp/dist/index.d.ts.map +0 -1
  858. package/packages/mcp/dist/index.js +0 -25
  859. package/packages/mcp/dist/index.js.map +0 -1
  860. package/packages/mcp/dist/install-cli.d.ts +0 -35
  861. package/packages/mcp/dist/install-cli.d.ts.map +0 -1
  862. package/packages/mcp/dist/install-cli.js +0 -157
  863. package/packages/mcp/dist/install-cli.js.map +0 -1
  864. package/packages/mcp/dist/install.d.ts +0 -123
  865. package/packages/mcp/dist/install.d.ts.map +0 -1
  866. package/packages/mcp/dist/install.js +0 -661
  867. package/packages/mcp/dist/install.js.map +0 -1
  868. package/packages/mcp/dist/prompts/index.d.ts +0 -2
  869. package/packages/mcp/dist/prompts/index.d.ts.map +0 -1
  870. package/packages/mcp/dist/prompts/index.js +0 -2
  871. package/packages/mcp/dist/prompts/index.js.map +0 -1
  872. package/packages/mcp/dist/prompts/protocol.d.ts +0 -11
  873. package/packages/mcp/dist/prompts/protocol.d.ts.map +0 -1
  874. package/packages/mcp/dist/prompts/protocol.js +0 -160
  875. package/packages/mcp/dist/prompts/protocol.js.map +0 -1
  876. package/packages/mcp/dist/resources/agents.d.ts +0 -11
  877. package/packages/mcp/dist/resources/agents.d.ts.map +0 -1
  878. package/packages/mcp/dist/resources/agents.js +0 -17
  879. package/packages/mcp/dist/resources/agents.js.map +0 -1
  880. package/packages/mcp/dist/resources/inbox.d.ts +0 -11
  881. package/packages/mcp/dist/resources/inbox.d.ts.map +0 -1
  882. package/packages/mcp/dist/resources/inbox.js +0 -17
  883. package/packages/mcp/dist/resources/inbox.js.map +0 -1
  884. package/packages/mcp/dist/resources/index.d.ts +0 -4
  885. package/packages/mcp/dist/resources/index.d.ts.map +0 -1
  886. package/packages/mcp/dist/resources/index.js +0 -4
  887. package/packages/mcp/dist/resources/index.js.map +0 -1
  888. package/packages/mcp/dist/resources/project.d.ts +0 -11
  889. package/packages/mcp/dist/resources/project.d.ts.map +0 -1
  890. package/packages/mcp/dist/resources/project.js +0 -21
  891. package/packages/mcp/dist/resources/project.js.map +0 -1
  892. package/packages/mcp/dist/server.d.ts +0 -23
  893. package/packages/mcp/dist/server.d.ts.map +0 -1
  894. package/packages/mcp/dist/server.js +0 -317
  895. package/packages/mcp/dist/server.js.map +0 -1
  896. package/packages/mcp/dist/simple.d.ts +0 -170
  897. package/packages/mcp/dist/simple.d.ts.map +0 -1
  898. package/packages/mcp/dist/simple.js +0 -120
  899. package/packages/mcp/dist/simple.js.map +0 -1
  900. package/packages/mcp/dist/tools/index.d.ts +0 -20
  901. package/packages/mcp/dist/tools/index.d.ts.map +0 -1
  902. package/packages/mcp/dist/tools/index.js +0 -20
  903. package/packages/mcp/dist/tools/index.js.map +0 -1
  904. package/packages/mcp/dist/tools/relay-broadcast.d.ts +0 -20
  905. package/packages/mcp/dist/tools/relay-broadcast.d.ts.map +0 -1
  906. package/packages/mcp/dist/tools/relay-broadcast.js +0 -25
  907. package/packages/mcp/dist/tools/relay-broadcast.js.map +0 -1
  908. package/packages/mcp/dist/tools/relay-channel.d.ts +0 -75
  909. package/packages/mcp/dist/tools/relay-channel.d.ts.map +0 -1
  910. package/packages/mcp/dist/tools/relay-channel.js +0 -124
  911. package/packages/mcp/dist/tools/relay-channel.js.map +0 -1
  912. package/packages/mcp/dist/tools/relay-connected.d.ts +0 -17
  913. package/packages/mcp/dist/tools/relay-connected.d.ts.map +0 -1
  914. package/packages/mcp/dist/tools/relay-connected.js +0 -54
  915. package/packages/mcp/dist/tools/relay-connected.js.map +0 -1
  916. package/packages/mcp/dist/tools/relay-consensus.d.ts +0 -45
  917. package/packages/mcp/dist/tools/relay-consensus.d.ts.map +0 -1
  918. package/packages/mcp/dist/tools/relay-consensus.js +0 -80
  919. package/packages/mcp/dist/tools/relay-consensus.js.map +0 -1
  920. package/packages/mcp/dist/tools/relay-continuity.d.ts +0 -35
  921. package/packages/mcp/dist/tools/relay-continuity.d.ts.map +0 -1
  922. package/packages/mcp/dist/tools/relay-continuity.js +0 -101
  923. package/packages/mcp/dist/tools/relay-continuity.js.map +0 -1
  924. package/packages/mcp/dist/tools/relay-health.d.ts +0 -20
  925. package/packages/mcp/dist/tools/relay-health.d.ts.map +0 -1
  926. package/packages/mcp/dist/tools/relay-health.js +0 -130
  927. package/packages/mcp/dist/tools/relay-health.js.map +0 -1
  928. package/packages/mcp/dist/tools/relay-inbox.d.ts +0 -26
  929. package/packages/mcp/dist/tools/relay-inbox.d.ts.map +0 -1
  930. package/packages/mcp/dist/tools/relay-inbox.js +0 -58
  931. package/packages/mcp/dist/tools/relay-inbox.js.map +0 -1
  932. package/packages/mcp/dist/tools/relay-logs.d.ts +0 -20
  933. package/packages/mcp/dist/tools/relay-logs.d.ts.map +0 -1
  934. package/packages/mcp/dist/tools/relay-logs.js +0 -90
  935. package/packages/mcp/dist/tools/relay-logs.js.map +0 -1
  936. package/packages/mcp/dist/tools/relay-messages.d.ts +0 -32
  937. package/packages/mcp/dist/tools/relay-messages.d.ts.map +0 -1
  938. package/packages/mcp/dist/tools/relay-messages.js +0 -61
  939. package/packages/mcp/dist/tools/relay-messages.js.map +0 -1
  940. package/packages/mcp/dist/tools/relay-metrics.d.ts +0 -17
  941. package/packages/mcp/dist/tools/relay-metrics.d.ts.map +0 -1
  942. package/packages/mcp/dist/tools/relay-metrics.js +0 -124
  943. package/packages/mcp/dist/tools/relay-metrics.js.map +0 -1
  944. package/packages/mcp/dist/tools/relay-release.d.ts +0 -20
  945. package/packages/mcp/dist/tools/relay-release.d.ts.map +0 -1
  946. package/packages/mcp/dist/tools/relay-release.js +0 -44
  947. package/packages/mcp/dist/tools/relay-release.js.map +0 -1
  948. package/packages/mcp/dist/tools/relay-remove-agent.d.ts +0 -20
  949. package/packages/mcp/dist/tools/relay-remove-agent.d.ts.map +0 -1
  950. package/packages/mcp/dist/tools/relay-remove-agent.js +0 -50
  951. package/packages/mcp/dist/tools/relay-remove-agent.js.map +0 -1
  952. package/packages/mcp/dist/tools/relay-send.d.ts +0 -29
  953. package/packages/mcp/dist/tools/relay-send.d.ts.map +0 -1
  954. package/packages/mcp/dist/tools/relay-send.js +0 -73
  955. package/packages/mcp/dist/tools/relay-send.js.map +0 -1
  956. package/packages/mcp/dist/tools/relay-set-model.d.ts +0 -23
  957. package/packages/mcp/dist/tools/relay-set-model.d.ts.map +0 -1
  958. package/packages/mcp/dist/tools/relay-set-model.js +0 -52
  959. package/packages/mcp/dist/tools/relay-set-model.js.map +0 -1
  960. package/packages/mcp/dist/tools/relay-shadow.d.ts +0 -30
  961. package/packages/mcp/dist/tools/relay-shadow.d.ts.map +0 -1
  962. package/packages/mcp/dist/tools/relay-shadow.js +0 -55
  963. package/packages/mcp/dist/tools/relay-shadow.js.map +0 -1
  964. package/packages/mcp/dist/tools/relay-spawn.d.ts +0 -36
  965. package/packages/mcp/dist/tools/relay-spawn.d.ts.map +0 -1
  966. package/packages/mcp/dist/tools/relay-spawn.js +0 -73
  967. package/packages/mcp/dist/tools/relay-spawn.js.map +0 -1
  968. package/packages/mcp/dist/tools/relay-status.d.ts +0 -11
  969. package/packages/mcp/dist/tools/relay-status.d.ts.map +0 -1
  970. package/packages/mcp/dist/tools/relay-status.js +0 -43
  971. package/packages/mcp/dist/tools/relay-status.js.map +0 -1
  972. package/packages/mcp/dist/tools/relay-subscribe.d.ts +0 -27
  973. package/packages/mcp/dist/tools/relay-subscribe.d.ts.map +0 -1
  974. package/packages/mcp/dist/tools/relay-subscribe.js +0 -49
  975. package/packages/mcp/dist/tools/relay-subscribe.js.map +0 -1
  976. package/packages/mcp/dist/tools/relay-who.d.ts +0 -20
  977. package/packages/mcp/dist/tools/relay-who.d.ts.map +0 -1
  978. package/packages/mcp/dist/tools/relay-who.js +0 -62
  979. package/packages/mcp/dist/tools/relay-who.js.map +0 -1
  980. package/packages/mcp/package.json +0 -82
  981. package/packages/mcp/src/bin.ts +0 -200
  982. package/packages/mcp/src/client-adapter.ts +0 -358
  983. package/packages/mcp/src/cloud.ts +0 -41
  984. package/packages/mcp/src/errors.ts +0 -17
  985. package/packages/mcp/src/file-transport.ts +0 -275
  986. package/packages/mcp/src/hybrid-client.ts +0 -25
  987. package/packages/mcp/src/index.ts +0 -143
  988. package/packages/mcp/src/install-cli.ts +0 -210
  989. package/packages/mcp/src/install.ts +0 -820
  990. package/packages/mcp/src/prompts/index.ts +0 -1
  991. package/packages/mcp/src/prompts/protocol.ts +0 -164
  992. package/packages/mcp/src/resources/agents.ts +0 -21
  993. package/packages/mcp/src/resources/inbox.ts +0 -21
  994. package/packages/mcp/src/resources/index.ts +0 -3
  995. package/packages/mcp/src/resources/project.ts +0 -29
  996. package/packages/mcp/src/server.ts +0 -475
  997. package/packages/mcp/src/simple.ts +0 -214
  998. package/packages/mcp/src/tools/index.ts +0 -155
  999. package/packages/mcp/src/tools/relay-broadcast.ts +0 -32
  1000. package/packages/mcp/src/tools/relay-channel.ts +0 -151
  1001. package/packages/mcp/src/tools/relay-connected.ts +0 -67
  1002. package/packages/mcp/src/tools/relay-consensus.ts +0 -92
  1003. package/packages/mcp/src/tools/relay-continuity.ts +0 -127
  1004. package/packages/mcp/src/tools/relay-health.ts +0 -148
  1005. package/packages/mcp/src/tools/relay-inbox.ts +0 -70
  1006. package/packages/mcp/src/tools/relay-logs.ts +0 -106
  1007. package/packages/mcp/src/tools/relay-messages.ts +0 -66
  1008. package/packages/mcp/src/tools/relay-metrics.ts +0 -142
  1009. package/packages/mcp/src/tools/relay-release.ts +0 -54
  1010. package/packages/mcp/src/tools/relay-remove-agent.ts +0 -58
  1011. package/packages/mcp/src/tools/relay-send.ts +0 -84
  1012. package/packages/mcp/src/tools/relay-set-model.ts +0 -62
  1013. package/packages/mcp/src/tools/relay-shadow.ts +0 -67
  1014. package/packages/mcp/src/tools/relay-spawn.ts +0 -87
  1015. package/packages/mcp/src/tools/relay-status.ts +0 -57
  1016. package/packages/mcp/src/tools/relay-subscribe.ts +0 -61
  1017. package/packages/mcp/src/tools/relay-who.ts +0 -75
  1018. package/packages/mcp/tests/client.test.ts +0 -451
  1019. package/packages/mcp/tests/discover.test.ts +0 -256
  1020. package/packages/mcp/tests/install.test.ts +0 -123
  1021. package/packages/mcp/tests/prompts.test.ts +0 -12
  1022. package/packages/mcp/tests/resources.test.ts +0 -53
  1023. package/packages/mcp/tests/tools.test.ts +0 -1516
  1024. package/packages/mcp/tsconfig.json +0 -22
  1025. package/packages/mcp/vitest.config.ts +0 -9
  1026. package/packages/protocol/dist/channels.d.ts +0 -137
  1027. package/packages/protocol/dist/channels.d.ts.map +0 -1
  1028. package/packages/protocol/dist/channels.js +0 -154
  1029. package/packages/protocol/dist/channels.js.map +0 -1
  1030. package/packages/protocol/dist/framing.d.ts +0 -80
  1031. package/packages/protocol/dist/framing.d.ts.map +0 -1
  1032. package/packages/protocol/dist/framing.js +0 -206
  1033. package/packages/protocol/dist/framing.js.map +0 -1
  1034. package/packages/protocol/dist/id-generator.d.ts +0 -35
  1035. package/packages/protocol/dist/id-generator.d.ts.map +0 -1
  1036. package/packages/protocol/dist/id-generator.js +0 -60
  1037. package/packages/protocol/dist/id-generator.js.map +0 -1
  1038. package/packages/protocol/dist/index.d.ts +0 -5
  1039. package/packages/protocol/dist/index.d.ts.map +0 -1
  1040. package/packages/protocol/dist/index.js +0 -5
  1041. package/packages/protocol/dist/index.js.map +0 -1
  1042. package/packages/protocol/dist/relay-pty-schemas.d.ts +0 -340
  1043. package/packages/protocol/dist/relay-pty-schemas.d.ts.map +0 -1
  1044. package/packages/protocol/dist/relay-pty-schemas.js +0 -60
  1045. package/packages/protocol/dist/relay-pty-schemas.js.map +0 -1
  1046. package/packages/protocol/dist/types.d.ts +0 -793
  1047. package/packages/protocol/dist/types.d.ts.map +0 -1
  1048. package/packages/protocol/dist/types.js +0 -8
  1049. package/packages/protocol/dist/types.js.map +0 -1
  1050. package/packages/protocol/package.json +0 -61
  1051. package/packages/protocol/src/channels.test.ts +0 -330
  1052. package/packages/protocol/src/channels.ts +0 -270
  1053. package/packages/protocol/src/framing.test.ts +0 -164
  1054. package/packages/protocol/src/framing.ts +0 -242
  1055. package/packages/protocol/src/id-generator.ts +0 -69
  1056. package/packages/protocol/src/index.ts +0 -4
  1057. package/packages/protocol/src/relay-pty-schemas.ts +0 -400
  1058. package/packages/protocol/src/types.test.ts +0 -271
  1059. package/packages/protocol/src/types.ts +0 -988
  1060. package/packages/protocol/tsconfig.json +0 -21
  1061. package/packages/protocol/vitest.config.ts +0 -9
  1062. package/packages/resiliency/dist/cgroup-manager.d.ts +0 -152
  1063. package/packages/resiliency/dist/cgroup-manager.d.ts.map +0 -1
  1064. package/packages/resiliency/dist/cgroup-manager.js +0 -394
  1065. package/packages/resiliency/dist/cgroup-manager.js.map +0 -1
  1066. package/packages/resiliency/dist/context-persistence.d.ts +0 -140
  1067. package/packages/resiliency/dist/context-persistence.d.ts.map +0 -1
  1068. package/packages/resiliency/dist/context-persistence.js +0 -397
  1069. package/packages/resiliency/dist/context-persistence.js.map +0 -1
  1070. package/packages/resiliency/dist/crash-insights.d.ts +0 -156
  1071. package/packages/resiliency/dist/crash-insights.d.ts.map +0 -1
  1072. package/packages/resiliency/dist/crash-insights.js +0 -492
  1073. package/packages/resiliency/dist/crash-insights.js.map +0 -1
  1074. package/packages/resiliency/dist/gossip-health.d.ts +0 -137
  1075. package/packages/resiliency/dist/gossip-health.d.ts.map +0 -1
  1076. package/packages/resiliency/dist/gossip-health.js +0 -241
  1077. package/packages/resiliency/dist/gossip-health.js.map +0 -1
  1078. package/packages/resiliency/dist/health-monitor.d.ts +0 -97
  1079. package/packages/resiliency/dist/health-monitor.d.ts.map +0 -1
  1080. package/packages/resiliency/dist/health-monitor.js +0 -291
  1081. package/packages/resiliency/dist/health-monitor.js.map +0 -1
  1082. package/packages/resiliency/dist/index.d.ts +0 -69
  1083. package/packages/resiliency/dist/index.d.ts.map +0 -1
  1084. package/packages/resiliency/dist/index.js +0 -69
  1085. package/packages/resiliency/dist/index.js.map +0 -1
  1086. package/packages/resiliency/dist/leader-watchdog.d.ts +0 -109
  1087. package/packages/resiliency/dist/leader-watchdog.d.ts.map +0 -1
  1088. package/packages/resiliency/dist/leader-watchdog.js +0 -189
  1089. package/packages/resiliency/dist/leader-watchdog.js.map +0 -1
  1090. package/packages/resiliency/dist/logger.d.ts +0 -114
  1091. package/packages/resiliency/dist/logger.d.ts.map +0 -1
  1092. package/packages/resiliency/dist/logger.js +0 -250
  1093. package/packages/resiliency/dist/logger.js.map +0 -1
  1094. package/packages/resiliency/dist/memory-monitor.d.ts +0 -172
  1095. package/packages/resiliency/dist/memory-monitor.d.ts.map +0 -1
  1096. package/packages/resiliency/dist/memory-monitor.js +0 -599
  1097. package/packages/resiliency/dist/memory-monitor.js.map +0 -1
  1098. package/packages/resiliency/dist/metrics.d.ts +0 -115
  1099. package/packages/resiliency/dist/metrics.d.ts.map +0 -1
  1100. package/packages/resiliency/dist/metrics.js +0 -239
  1101. package/packages/resiliency/dist/metrics.js.map +0 -1
  1102. package/packages/resiliency/dist/provider-context.d.ts +0 -100
  1103. package/packages/resiliency/dist/provider-context.d.ts.map +0 -1
  1104. package/packages/resiliency/dist/provider-context.js +0 -362
  1105. package/packages/resiliency/dist/provider-context.js.map +0 -1
  1106. package/packages/resiliency/dist/stateless-lead.d.ts +0 -149
  1107. package/packages/resiliency/dist/stateless-lead.d.ts.map +0 -1
  1108. package/packages/resiliency/dist/stateless-lead.js +0 -308
  1109. package/packages/resiliency/dist/stateless-lead.js.map +0 -1
  1110. package/packages/resiliency/dist/supervisor.d.ts +0 -147
  1111. package/packages/resiliency/dist/supervisor.d.ts.map +0 -1
  1112. package/packages/resiliency/dist/supervisor.js +0 -459
  1113. package/packages/resiliency/dist/supervisor.js.map +0 -1
  1114. package/packages/resiliency/package.json +0 -38
  1115. package/packages/resiliency/src/cgroup-manager.ts +0 -468
  1116. package/packages/resiliency/src/context-persistence.ts +0 -538
  1117. package/packages/resiliency/src/crash-insights.test.ts +0 -620
  1118. package/packages/resiliency/src/crash-insights.ts +0 -660
  1119. package/packages/resiliency/src/gossip-health.ts +0 -333
  1120. package/packages/resiliency/src/health-monitor.ts +0 -371
  1121. package/packages/resiliency/src/index.ts +0 -157
  1122. package/packages/resiliency/src/leader-watchdog.ts +0 -260
  1123. package/packages/resiliency/src/logger.ts +0 -320
  1124. package/packages/resiliency/src/memory-monitor.test.ts +0 -637
  1125. package/packages/resiliency/src/memory-monitor.ts +0 -740
  1126. package/packages/resiliency/src/metrics.ts +0 -311
  1127. package/packages/resiliency/src/provider-context.ts +0 -452
  1128. package/packages/resiliency/src/stateless-lead.ts +0 -408
  1129. package/packages/resiliency/src/supervisor.ts +0 -578
  1130. package/packages/resiliency/tsconfig.json +0 -21
  1131. package/packages/resiliency/vitest.config.ts +0 -9
  1132. package/packages/sdk/dist/discovery.d.ts +0 -10
  1133. package/packages/sdk/dist/discovery.d.ts.map +0 -1
  1134. package/packages/sdk/dist/discovery.js +0 -22
  1135. package/packages/sdk/dist/discovery.js.map +0 -1
  1136. package/packages/sdk/dist/errors.d.ts +0 -9
  1137. package/packages/sdk/dist/errors.d.ts.map +0 -1
  1138. package/packages/sdk/dist/errors.js +0 -9
  1139. package/packages/sdk/dist/errors.js.map +0 -1
  1140. package/packages/sdk/dist/protocol/index.d.ts +0 -8
  1141. package/packages/sdk/dist/protocol/index.d.ts.map +0 -1
  1142. package/packages/sdk/dist/protocol/index.js +0 -8
  1143. package/packages/sdk/dist/protocol/index.js.map +0 -1
  1144. package/packages/sdk/examples/SWARM_CAPABILITIES.md +0 -498
  1145. package/packages/sdk/examples/SWARM_PATTERNS.md +0 -541
  1146. package/packages/sdk/src/client.test.ts +0 -1041
  1147. package/packages/sdk/src/discovery.ts +0 -38
  1148. package/packages/sdk/src/errors.ts +0 -17
  1149. package/packages/sdk/src/logs.test.ts +0 -98
  1150. package/packages/sdk/src/protocol/framing.test.ts +0 -164
  1151. package/packages/sdk/src/protocol/index.ts +0 -8
  1152. package/packages/spawner/.trajectories/index.json +0 -5
  1153. package/packages/spawner/API.md +0 -256
  1154. package/packages/spawner/dist/index.d.ts +0 -8
  1155. package/packages/spawner/dist/index.d.ts.map +0 -1
  1156. package/packages/spawner/dist/index.js +0 -8
  1157. package/packages/spawner/dist/index.js.map +0 -1
  1158. package/packages/spawner/dist/types.d.ts +0 -552
  1159. package/packages/spawner/dist/types.d.ts.map +0 -1
  1160. package/packages/spawner/dist/types.js +0 -193
  1161. package/packages/spawner/dist/types.js.map +0 -1
  1162. package/packages/spawner/package.json +0 -47
  1163. package/packages/spawner/src/index.ts +0 -8
  1164. package/packages/spawner/src/types.test.ts +0 -385
  1165. package/packages/spawner/src/types.ts +0 -228
  1166. package/packages/spawner/tsconfig.json +0 -19
  1167. package/packages/spawner/vitest.config.ts +0 -9
  1168. package/packages/state/dist/agent-state.d.ts +0 -40
  1169. package/packages/state/dist/agent-state.d.ts.map +0 -1
  1170. package/packages/state/dist/agent-state.js +0 -120
  1171. package/packages/state/dist/agent-state.js.map +0 -1
  1172. package/packages/state/dist/index.d.ts +0 -8
  1173. package/packages/state/dist/index.d.ts.map +0 -1
  1174. package/packages/state/dist/index.js +0 -8
  1175. package/packages/state/dist/index.js.map +0 -1
  1176. package/packages/state/package.json +0 -37
  1177. package/packages/state/src/agent-state.test.ts +0 -335
  1178. package/packages/state/src/agent-state.ts +0 -153
  1179. package/packages/state/src/index.ts +0 -12
  1180. package/packages/state/tsconfig.json +0 -21
  1181. package/packages/state/vitest.config.ts +0 -9
  1182. package/packages/storage/dist/adapter.d.ts +0 -189
  1183. package/packages/storage/dist/adapter.d.ts.map +0 -1
  1184. package/packages/storage/dist/adapter.js +0 -267
  1185. package/packages/storage/dist/adapter.js.map +0 -1
  1186. package/packages/storage/dist/batched-sqlite-adapter.d.ts +0 -75
  1187. package/packages/storage/dist/batched-sqlite-adapter.d.ts.map +0 -1
  1188. package/packages/storage/dist/batched-sqlite-adapter.js +0 -189
  1189. package/packages/storage/dist/batched-sqlite-adapter.js.map +0 -1
  1190. package/packages/storage/dist/dead-letter-queue.d.ts +0 -196
  1191. package/packages/storage/dist/dead-letter-queue.d.ts.map +0 -1
  1192. package/packages/storage/dist/dead-letter-queue.js +0 -427
  1193. package/packages/storage/dist/dead-letter-queue.js.map +0 -1
  1194. package/packages/storage/dist/dlq-adapter.d.ts +0 -195
  1195. package/packages/storage/dist/dlq-adapter.d.ts.map +0 -1
  1196. package/packages/storage/dist/dlq-adapter.js +0 -664
  1197. package/packages/storage/dist/dlq-adapter.js.map +0 -1
  1198. package/packages/storage/dist/index.d.ts +0 -6
  1199. package/packages/storage/dist/index.d.ts.map +0 -1
  1200. package/packages/storage/dist/index.js +0 -7
  1201. package/packages/storage/dist/index.js.map +0 -1
  1202. package/packages/storage/dist/jsonl-adapter.d.ts +0 -91
  1203. package/packages/storage/dist/jsonl-adapter.d.ts.map +0 -1
  1204. package/packages/storage/dist/jsonl-adapter.js +0 -580
  1205. package/packages/storage/dist/jsonl-adapter.js.map +0 -1
  1206. package/packages/storage/dist/sqlite-adapter.d.ts +0 -131
  1207. package/packages/storage/dist/sqlite-adapter.d.ts.map +0 -1
  1208. package/packages/storage/dist/sqlite-adapter.js +0 -865
  1209. package/packages/storage/dist/sqlite-adapter.js.map +0 -1
  1210. package/packages/storage/package.json +0 -74
  1211. package/packages/storage/src/adapter.ts +0 -446
  1212. package/packages/storage/src/batched-sqlite-adapter.test.ts +0 -256
  1213. package/packages/storage/src/batched-sqlite-adapter.ts +0 -239
  1214. package/packages/storage/src/dead-letter-queue.ts +0 -643
  1215. package/packages/storage/src/dlq-adapter.test.ts +0 -509
  1216. package/packages/storage/src/dlq-adapter.ts +0 -954
  1217. package/packages/storage/src/index.ts +0 -6
  1218. package/packages/storage/src/jsonl-adapter.test.ts +0 -239
  1219. package/packages/storage/src/jsonl-adapter.ts +0 -704
  1220. package/packages/storage/src/memory-adapter.test.ts +0 -36
  1221. package/packages/storage/src/sqlite-adapter.test.ts +0 -580
  1222. package/packages/storage/src/sqlite-adapter.ts +0 -1099
  1223. package/packages/storage/tsconfig.json +0 -21
  1224. package/packages/storage/vitest.config.ts +0 -9
  1225. package/packages/wrapper/dist/__fixtures__/claude-outputs.d.ts +0 -49
  1226. package/packages/wrapper/dist/__fixtures__/claude-outputs.d.ts.map +0 -1
  1227. package/packages/wrapper/dist/__fixtures__/claude-outputs.js +0 -443
  1228. package/packages/wrapper/dist/__fixtures__/claude-outputs.js.map +0 -1
  1229. package/packages/wrapper/dist/__fixtures__/codex-outputs.d.ts +0 -9
  1230. package/packages/wrapper/dist/__fixtures__/codex-outputs.d.ts.map +0 -1
  1231. package/packages/wrapper/dist/__fixtures__/codex-outputs.js +0 -94
  1232. package/packages/wrapper/dist/__fixtures__/codex-outputs.js.map +0 -1
  1233. package/packages/wrapper/dist/__fixtures__/gemini-outputs.d.ts +0 -19
  1234. package/packages/wrapper/dist/__fixtures__/gemini-outputs.d.ts.map +0 -1
  1235. package/packages/wrapper/dist/__fixtures__/gemini-outputs.js +0 -144
  1236. package/packages/wrapper/dist/__fixtures__/gemini-outputs.js.map +0 -1
  1237. package/packages/wrapper/dist/__fixtures__/index.d.ts +0 -68
  1238. package/packages/wrapper/dist/__fixtures__/index.d.ts.map +0 -1
  1239. package/packages/wrapper/dist/__fixtures__/index.js +0 -44
  1240. package/packages/wrapper/dist/__fixtures__/index.js.map +0 -1
  1241. package/packages/wrapper/dist/auth-detection.d.ts +0 -49
  1242. package/packages/wrapper/dist/auth-detection.d.ts.map +0 -1
  1243. package/packages/wrapper/dist/auth-detection.js +0 -199
  1244. package/packages/wrapper/dist/auth-detection.js.map +0 -1
  1245. package/packages/wrapper/dist/base-wrapper.d.ts +0 -254
  1246. package/packages/wrapper/dist/base-wrapper.d.ts.map +0 -1
  1247. package/packages/wrapper/dist/base-wrapper.js +0 -664
  1248. package/packages/wrapper/dist/base-wrapper.js.map +0 -1
  1249. package/packages/wrapper/dist/client.d.ts +0 -291
  1250. package/packages/wrapper/dist/client.d.ts.map +0 -1
  1251. package/packages/wrapper/dist/client.js +0 -926
  1252. package/packages/wrapper/dist/client.js.map +0 -1
  1253. package/packages/wrapper/dist/id-generator.d.ts +0 -35
  1254. package/packages/wrapper/dist/id-generator.d.ts.map +0 -1
  1255. package/packages/wrapper/dist/id-generator.js +0 -60
  1256. package/packages/wrapper/dist/id-generator.js.map +0 -1
  1257. package/packages/wrapper/dist/idle-detector.d.ts +0 -114
  1258. package/packages/wrapper/dist/idle-detector.d.ts.map +0 -1
  1259. package/packages/wrapper/dist/idle-detector.js +0 -317
  1260. package/packages/wrapper/dist/idle-detector.js.map +0 -1
  1261. package/packages/wrapper/dist/inbox.d.ts +0 -37
  1262. package/packages/wrapper/dist/inbox.d.ts.map +0 -1
  1263. package/packages/wrapper/dist/inbox.js +0 -73
  1264. package/packages/wrapper/dist/inbox.js.map +0 -1
  1265. package/packages/wrapper/dist/index.d.ts +0 -40
  1266. package/packages/wrapper/dist/index.d.ts.map +0 -1
  1267. package/packages/wrapper/dist/index.js +0 -53
  1268. package/packages/wrapper/dist/index.js.map +0 -1
  1269. package/packages/wrapper/dist/opencode-api.d.ts +0 -106
  1270. package/packages/wrapper/dist/opencode-api.d.ts.map +0 -1
  1271. package/packages/wrapper/dist/opencode-api.js +0 -219
  1272. package/packages/wrapper/dist/opencode-api.js.map +0 -1
  1273. package/packages/wrapper/dist/opencode-wrapper.d.ts +0 -161
  1274. package/packages/wrapper/dist/opencode-wrapper.d.ts.map +0 -1
  1275. package/packages/wrapper/dist/opencode-wrapper.js +0 -438
  1276. package/packages/wrapper/dist/opencode-wrapper.js.map +0 -1
  1277. package/packages/wrapper/dist/parser.d.ts +0 -236
  1278. package/packages/wrapper/dist/parser.d.ts.map +0 -1
  1279. package/packages/wrapper/dist/parser.js +0 -1238
  1280. package/packages/wrapper/dist/parser.js.map +0 -1
  1281. package/packages/wrapper/dist/prompt-composer.d.ts +0 -67
  1282. package/packages/wrapper/dist/prompt-composer.d.ts.map +0 -1
  1283. package/packages/wrapper/dist/prompt-composer.js +0 -168
  1284. package/packages/wrapper/dist/prompt-composer.js.map +0 -1
  1285. package/packages/wrapper/dist/relay-pty-orchestrator.d.ts +0 -486
  1286. package/packages/wrapper/dist/relay-pty-orchestrator.d.ts.map +0 -1
  1287. package/packages/wrapper/dist/relay-pty-orchestrator.js +0 -2550
  1288. package/packages/wrapper/dist/relay-pty-orchestrator.js.map +0 -1
  1289. package/packages/wrapper/dist/shared.d.ts +0 -262
  1290. package/packages/wrapper/dist/shared.d.ts.map +0 -1
  1291. package/packages/wrapper/dist/shared.js +0 -507
  1292. package/packages/wrapper/dist/shared.js.map +0 -1
  1293. package/packages/wrapper/dist/stuck-detector.d.ts +0 -161
  1294. package/packages/wrapper/dist/stuck-detector.d.ts.map +0 -1
  1295. package/packages/wrapper/dist/stuck-detector.js +0 -402
  1296. package/packages/wrapper/dist/stuck-detector.js.map +0 -1
  1297. package/packages/wrapper/dist/tmux-resolver.d.ts +0 -55
  1298. package/packages/wrapper/dist/tmux-resolver.d.ts.map +0 -1
  1299. package/packages/wrapper/dist/tmux-resolver.js +0 -175
  1300. package/packages/wrapper/dist/tmux-resolver.js.map +0 -1
  1301. package/packages/wrapper/dist/tmux-wrapper.d.ts +0 -352
  1302. package/packages/wrapper/dist/tmux-wrapper.d.ts.map +0 -1
  1303. package/packages/wrapper/dist/tmux-wrapper.js +0 -1816
  1304. package/packages/wrapper/dist/tmux-wrapper.js.map +0 -1
  1305. package/packages/wrapper/dist/trajectory-integration.d.ts +0 -292
  1306. package/packages/wrapper/dist/trajectory-integration.d.ts.map +0 -1
  1307. package/packages/wrapper/dist/trajectory-integration.js +0 -979
  1308. package/packages/wrapper/dist/trajectory-integration.js.map +0 -1
  1309. package/packages/wrapper/dist/wrapper-events.d.ts +0 -489
  1310. package/packages/wrapper/dist/wrapper-events.d.ts.map +0 -1
  1311. package/packages/wrapper/dist/wrapper-events.js +0 -252
  1312. package/packages/wrapper/dist/wrapper-events.js.map +0 -1
  1313. package/packages/wrapper/dist/wrapper-types.d.ts +0 -41
  1314. package/packages/wrapper/dist/wrapper-types.d.ts.map +0 -1
  1315. package/packages/wrapper/dist/wrapper-types.js +0 -7
  1316. package/packages/wrapper/dist/wrapper-types.js.map +0 -1
  1317. package/packages/wrapper/package.json +0 -60
  1318. package/packages/wrapper/src/__fixtures__/claude-outputs.ts +0 -471
  1319. package/packages/wrapper/src/__fixtures__/codex-outputs.ts +0 -99
  1320. package/packages/wrapper/src/__fixtures__/gemini-outputs.ts +0 -151
  1321. package/packages/wrapper/src/__fixtures__/index.ts +0 -47
  1322. package/packages/wrapper/src/auth-detection.ts +0 -244
  1323. package/packages/wrapper/src/base-wrapper.test.ts +0 -589
  1324. package/packages/wrapper/src/base-wrapper.ts +0 -841
  1325. package/packages/wrapper/src/client.test.ts +0 -351
  1326. package/packages/wrapper/src/client.ts +0 -1166
  1327. package/packages/wrapper/src/id-generator.test.ts +0 -71
  1328. package/packages/wrapper/src/id-generator.ts +0 -69
  1329. package/packages/wrapper/src/idle-detector.test.ts +0 -418
  1330. package/packages/wrapper/src/idle-detector.ts +0 -384
  1331. package/packages/wrapper/src/inbox.test.ts +0 -233
  1332. package/packages/wrapper/src/inbox.ts +0 -89
  1333. package/packages/wrapper/src/index.ts +0 -199
  1334. package/packages/wrapper/src/opencode-api.test.ts +0 -292
  1335. package/packages/wrapper/src/opencode-api.ts +0 -285
  1336. package/packages/wrapper/src/opencode-wrapper.ts +0 -541
  1337. package/packages/wrapper/src/parser.regression.test.ts +0 -251
  1338. package/packages/wrapper/src/parser.test.ts +0 -1359
  1339. package/packages/wrapper/src/parser.ts +0 -1477
  1340. package/packages/wrapper/src/prompt-composer.test.ts +0 -219
  1341. package/packages/wrapper/src/prompt-composer.ts +0 -231
  1342. package/packages/wrapper/src/relay-pty-orchestrator.test.ts +0 -1386
  1343. package/packages/wrapper/src/relay-pty-orchestrator.ts +0 -3041
  1344. package/packages/wrapper/src/shared.test.ts +0 -467
  1345. package/packages/wrapper/src/shared.ts +0 -652
  1346. package/packages/wrapper/src/stuck-detector.test.ts +0 -303
  1347. package/packages/wrapper/src/stuck-detector.ts +0 -511
  1348. package/packages/wrapper/src/tmux-resolver.test.ts +0 -104
  1349. package/packages/wrapper/src/tmux-resolver.ts +0 -207
  1350. package/packages/wrapper/src/tmux-wrapper.test.ts +0 -316
  1351. package/packages/wrapper/src/tmux-wrapper.ts +0 -2095
  1352. package/packages/wrapper/src/trajectory-detection.test.ts +0 -151
  1353. package/packages/wrapper/src/trajectory-integration.ts +0 -1261
  1354. package/packages/wrapper/src/wrapper-events.ts +0 -395
  1355. package/packages/wrapper/src/wrapper-types.ts +0 -45
  1356. package/packages/wrapper/tsconfig.json +0 -19
  1357. package/packages/wrapper/vitest.config.ts +0 -9
  1358. /package/packages/{broker-sdk → sdk}/dist/__tests__/facade.test.d.ts +0 -0
  1359. /package/packages/{broker-sdk → sdk}/dist/__tests__/facade.test.d.ts.map +0 -0
  1360. /package/packages/{broker-sdk → sdk}/dist/__tests__/integration.test.d.ts +0 -0
  1361. /package/packages/{broker-sdk → sdk}/dist/__tests__/integration.test.d.ts.map +0 -0
  1362. /package/packages/{broker-sdk → sdk}/dist/__tests__/quickstart.test.d.ts +0 -0
  1363. /package/packages/{broker-sdk → sdk}/dist/__tests__/quickstart.test.d.ts.map +0 -0
  1364. /package/packages/{broker-sdk → sdk}/dist/__tests__/unit.test.d.ts +0 -0
  1365. /package/packages/{broker-sdk → sdk}/dist/__tests__/unit.test.d.ts.map +0 -0
  1366. /package/packages/{broker-sdk → sdk}/dist/browser.d.ts +0 -0
  1367. /package/packages/{broker-sdk → sdk}/dist/browser.d.ts.map +0 -0
  1368. /package/packages/{broker-sdk → sdk}/dist/browser.js +0 -0
  1369. /package/packages/{broker-sdk → sdk}/dist/browser.js.map +0 -0
  1370. /package/packages/{broker-sdk → sdk}/dist/consensus-helpers.d.ts +0 -0
  1371. /package/packages/{broker-sdk → sdk}/dist/consensus-helpers.d.ts.map +0 -0
  1372. /package/packages/{broker-sdk → sdk}/dist/consensus-helpers.js +0 -0
  1373. /package/packages/{broker-sdk → sdk}/dist/consensus-helpers.js.map +0 -0
  1374. /package/packages/{broker-sdk → sdk}/dist/consensus.d.ts +0 -0
  1375. /package/packages/{broker-sdk → sdk}/dist/consensus.d.ts.map +0 -0
  1376. /package/packages/{broker-sdk → sdk}/dist/consensus.js +0 -0
  1377. /package/packages/{broker-sdk → sdk}/dist/consensus.js.map +0 -0
  1378. /package/packages/{broker-sdk → sdk}/dist/examples/demo.d.ts +0 -0
  1379. /package/packages/{broker-sdk → sdk}/dist/examples/demo.d.ts.map +0 -0
  1380. /package/packages/{broker-sdk → sdk}/dist/examples/demo.js +0 -0
  1381. /package/packages/{broker-sdk → sdk}/dist/examples/demo.js.map +0 -0
  1382. /package/packages/{broker-sdk → sdk}/dist/examples/example.d.ts +0 -0
  1383. /package/packages/{broker-sdk → sdk}/dist/examples/example.d.ts.map +0 -0
  1384. /package/packages/{broker-sdk → sdk}/dist/examples/example.js +0 -0
  1385. /package/packages/{broker-sdk → sdk}/dist/examples/example.js.map +0 -0
  1386. /package/packages/{broker-sdk → sdk}/dist/examples/quickstart.d.ts +0 -0
  1387. /package/packages/{broker-sdk → sdk}/dist/examples/quickstart.d.ts.map +0 -0
  1388. /package/packages/{broker-sdk → sdk}/dist/examples/quickstart.js +0 -0
  1389. /package/packages/{broker-sdk → sdk}/dist/examples/quickstart.js.map +0 -0
  1390. /package/packages/{broker-sdk → sdk}/dist/examples/ralph-loop.d.ts +0 -0
  1391. /package/packages/{broker-sdk → sdk}/dist/examples/ralph-loop.d.ts.map +0 -0
  1392. /package/packages/{broker-sdk → sdk}/dist/examples/ralph-loop.js +0 -0
  1393. /package/packages/{broker-sdk → sdk}/dist/examples/ralph-loop.js.map +0 -0
  1394. /package/packages/{broker-sdk → sdk}/dist/protocol.js +0 -0
  1395. /package/packages/{broker-sdk → sdk}/dist/protocol.js.map +0 -0
  1396. /package/packages/{broker-sdk → sdk}/dist/pty.d.ts +0 -0
  1397. /package/packages/{broker-sdk → sdk}/dist/shadow.js +0 -0
  1398. /package/packages/{broker-sdk → sdk}/dist/workflows/barrier.d.ts +0 -0
  1399. /package/packages/{broker-sdk → sdk}/dist/workflows/barrier.d.ts.map +0 -0
  1400. /package/packages/{broker-sdk → sdk}/dist/workflows/barrier.js +0 -0
  1401. /package/packages/{broker-sdk → sdk}/dist/workflows/barrier.js.map +0 -0
  1402. /package/packages/{broker-sdk → sdk}/dist/workflows/memory-db.d.ts +0 -0
  1403. /package/packages/{broker-sdk → sdk}/dist/workflows/memory-db.d.ts.map +0 -0
  1404. /package/packages/{broker-sdk → sdk}/dist/workflows/memory-db.js +0 -0
  1405. /package/packages/{broker-sdk → sdk}/dist/workflows/memory-db.js.map +0 -0
  1406. /package/packages/{broker-sdk → sdk}/dist/workflows/state.d.ts +0 -0
  1407. /package/packages/{broker-sdk → sdk}/dist/workflows/state.d.ts.map +0 -0
  1408. /package/packages/{broker-sdk → sdk}/dist/workflows/state.js +0 -0
  1409. /package/packages/{broker-sdk → sdk}/dist/workflows/state.js.map +0 -0
  1410. /package/packages/{broker-sdk → sdk}/src/__tests__/workflow-trajectory.test.ts +0 -0
  1411. /package/packages/{broker-sdk → sdk}/src/browser.ts +0 -0
  1412. /package/packages/{broker-sdk → sdk}/src/consensus-helpers.ts +0 -0
  1413. /package/packages/{broker-sdk → sdk}/src/consensus.ts +0 -0
  1414. /package/packages/{broker-sdk → sdk}/src/examples/demo.ts +0 -0
  1415. /package/packages/{broker-sdk → sdk}/src/examples/example.ts +0 -0
  1416. /package/packages/{broker-sdk → sdk}/src/examples/quickstart.ts +0 -0
  1417. /package/packages/{broker-sdk → sdk}/src/examples/ralph-loop.ts +0 -0
  1418. /package/packages/{broker-sdk → sdk}/src/examples/sample-prd.json +0 -0
  1419. /package/packages/{broker-sdk → sdk}/src/workflows/barrier.ts +0 -0
  1420. /package/packages/{broker-sdk → sdk}/src/workflows/memory-db.ts +0 -0
  1421. /package/packages/{broker-sdk → sdk}/src/workflows/state.ts +0 -0
@@ -1,2067 +0,0 @@
1
- /**
2
- * Agent Spawner
3
- * Handles spawning and releasing worker agents via relay-pty.
4
- * Workers run headlessly with output capture for logs.
5
- */
6
-
7
- import fs from 'node:fs';
8
- import { execFile, execSync } from 'node:child_process';
9
- import path from 'node:path';
10
- import { fileURLToPath } from 'node:url';
11
- import { sleep, resolveAgentCwd } from './utils.js';
12
- import { resolveCli } from './cli-resolution.js';
13
- import { getProjectPaths, getAgentOutboxTemplate } from '@agent-relay/config';
14
- import { resolveCommand } from '@agent-relay/utils/command-resolver';
15
- import { createTraceableError } from '@agent-relay/utils/error-tracking';
16
- import { createLogger } from '@agent-relay/utils/logger';
17
- import { mapModelToCli } from '@agent-relay/utils/model-mapping';
18
- import { isModelSwitchSupported, buildModelSwitchCommand, validateModelForCli } from '@agent-relay/utils/model-commands';
19
- import { findRelayPtyBinary as findRelayPtyBinaryUtil, getLastSearchPaths } from '@agent-relay/utils/relay-pty-path';
20
- import { RelayPtyOrchestrator, type RelayPtyOrchestratorConfig } from '@agent-relay/wrapper';
21
- import { OpenCodeWrapper, type OpenCodeWrapperConfig, OpenCodeApi } from '@agent-relay/wrapper';
22
- import type { SummaryEvent, SessionEndEvent } from '@agent-relay/wrapper';
23
- import { selectShadowCli } from './shadow-cli.js';
24
-
25
- // Get the directory where this module is located (for binary path resolution)
26
- const __filename = fileURLToPath(import.meta.url);
27
- const __dirname = path.dirname(__filename);
28
- import { AgentPolicyService, type CloudPolicyFetcher } from '@agent-relay/policy';
29
- import { buildClaudeArgs, findAgentConfig } from '@agent-relay/config/agent-config';
30
- import { composeForAgent, type AgentRole } from '@agent-relay/wrapper';
31
- import { getUserDirectoryService } from '@agent-relay/user-directory';
32
- import type {
33
- SpawnRequest,
34
- SpawnResult,
35
- WorkerInfo,
36
- SpawnWithShadowRequest,
37
- SpawnWithShadowResult,
38
- SpeakOnTrigger,
39
- } from './types.js';
40
-
41
- // Logger instance for spawner (uses daemon log system instead of console)
42
- const log = createLogger('spawner');
43
-
44
- function extractGhTokenFromHosts(content: string): string | null {
45
- const lines = content.split(/\r?\n/);
46
- let inGithubSection = false;
47
- for (const line of lines) {
48
- const trimmed = line.trim();
49
- if (!trimmed) {
50
- continue;
51
- }
52
- if (!line.startsWith(' ') && !line.startsWith('\t')) {
53
- const host = trimmed.replace(/:$/, '');
54
- inGithubSection = host === 'github.com';
55
- continue;
56
- }
57
- if (!inGithubSection) {
58
- continue;
59
- }
60
- const match = line.match(/^\s*(oauth_token|token):\s*(.+)$/);
61
- if (!match) {
62
- continue;
63
- }
64
- let token = match[2].split('#')[0].trim();
65
- token = token.replace(/^['"]|['"]$/g, '');
66
- if (token) {
67
- return token;
68
- }
69
- }
70
- return null;
71
- }
72
-
73
- /**
74
- * Cloud persistence handler interface.
75
- * Implement this to persist agent session data to cloud storage.
76
- */
77
- export interface CloudPersistenceHandler {
78
- onSummary: (agentName: string, event: SummaryEvent) => Promise<void>;
79
- onSessionEnd: (agentName: string, event: SessionEndEvent) => Promise<void>;
80
- /** Optional cleanup method for tests and graceful shutdown */
81
- destroy?: () => void;
82
- }
83
-
84
- /** Worker metadata stored in workers.json */
85
- interface WorkerMeta {
86
- name: string;
87
- cli: string;
88
- task: string;
89
- /** Optional team name this agent belongs to */
90
- team?: string;
91
- /** Optional user ID for per-user credential scoping */
92
- userId?: string;
93
- spawnedAt: number;
94
- pid?: number;
95
- logFile?: string;
96
- /** Current model if known */
97
- model?: string;
98
- /** Working directory (repo name) the agent was spawned in */
99
- cwd?: string;
100
- }
101
-
102
- /** Stored listener references for cleanup */
103
- interface ListenerBindings {
104
- output?: (data: string) => void;
105
- summary?: (event: SummaryEvent) => void;
106
- sessionEnd?: (event: SessionEndEvent) => void;
107
- }
108
-
109
- /** Type alias for the wrapper - uses RelayPtyOrchestrator (relay-pty Rust binary) */
110
- type AgentWrapper = RelayPtyOrchestrator;
111
-
112
- interface ActiveWorker extends WorkerInfo {
113
- pty: AgentWrapper;
114
- logFile?: string;
115
- listeners?: ListenerBindings;
116
- userId?: string;
117
- }
118
-
119
- /** Callback for agent death notifications */
120
- export type OnAgentDeathCallback = (info: {
121
- name: string;
122
- exitCode: number | null;
123
- agentId?: string;
124
- resumeInstructions?: string;
125
- /** Traceable error ID for support lookup */
126
- errorId?: string;
127
- }) => void;
128
-
129
- /**
130
- * Ensure MCP permissions are pre-configured for the given CLI type.
131
- * This prevents MCP approval prompts from blocking agent initialization.
132
- *
133
- * For Claude Code: Creates/updates .claude/settings.local.json with:
134
- * - enableAllProjectMcpServers: true (auto-approve project MCP servers)
135
- * - permissions.allow: ["mcp__agent-relay__*"] (pre-approve all agent-relay MCP tools)
136
- *
137
- * For Cursor: Creates/updates .cursor/settings.json with MCP permissions
138
- * For Gemini: Creates/updates .gemini/settings.json with MCP permissions
139
- * For Windsurf: Creates/updates .windsurf/settings.json with MCP permissions
140
- * Other CLIs: May use CLI flags instead of config-based permissions
141
- *
142
- * @param projectRoot - The project root directory
143
- * @param cliType - The CLI type (claude, codex, gemini, cursor, etc.)
144
- * @param debug - Whether to log debug information
145
- */
146
- export function ensureMcpPermissions(projectRoot: string, cliType: string, debug = false): void {
147
- // Determine settings path based on CLI type
148
- interface McpPermissionConfig {
149
- settingsDir: string;
150
- settingsFile: string;
151
- permissionKey?: string; // If different from 'permissions.allow'
152
- enableAllKey?: string; // If supports enableAllProjectMcpServers
153
- globalSettingsDir?: string; // For global settings that enable project MCP
154
- }
155
-
156
- const home = process.env.HOME || '';
157
- const configMap: Record<string, McpPermissionConfig> = {
158
- claude: {
159
- // Use global settings for Claude
160
- // enableAllProjectMcpServers enables project-local .mcp.json files
161
- settingsDir: path.join(home, '.claude'),
162
- settingsFile: 'settings.local.json',
163
- permissionKey: 'permissions.allow',
164
- enableAllKey: 'enableAllProjectMcpServers',
165
- },
166
- cursor: {
167
- settingsDir: path.join(projectRoot, '.cursor'),
168
- settingsFile: 'settings.json',
169
- permissionKey: 'permissions.allow',
170
- },
171
- gemini: {
172
- settingsDir: path.join(projectRoot, '.gemini'),
173
- settingsFile: 'settings.json',
174
- permissionKey: 'permissions.allow',
175
- },
176
- windsurf: {
177
- settingsDir: path.join(projectRoot, '.windsurf'),
178
- settingsFile: 'settings.json',
179
- permissionKey: 'permissions.allow',
180
- },
181
- // Codex uses TOML config and --dangerously-bypass-approvals-and-sandbox flag
182
- // OpenCode and Droid may not need config-based permissions
183
- };
184
-
185
- // Normalize CLI type
186
- const normalizedCli = cliType.toLowerCase().replace(/^(claude|codex|gemini|cursor|agent|windsurf).*/, '$1');
187
-
188
- // Map 'agent' (Cursor CLI) to 'cursor'
189
- const effectiveCli = normalizedCli === 'agent' ? 'cursor' : normalizedCli;
190
-
191
- const config = configMap[effectiveCli];
192
- if (!config) {
193
- // CLI doesn't use config-based MCP permissions (uses CLI flags instead)
194
- if (debug) log.debug(`CLI ${cliType} uses flag-based permissions, skipping config setup`);
195
- return;
196
- }
197
-
198
- const settingsPath = path.join(config.settingsDir, config.settingsFile);
199
-
200
- try {
201
- // Ensure settings directory exists
202
- if (!fs.existsSync(config.settingsDir)) {
203
- fs.mkdirSync(config.settingsDir, { recursive: true });
204
- }
205
-
206
- // Read existing settings or start fresh
207
- let settings: Record<string, unknown> = {};
208
- if (fs.existsSync(settingsPath)) {
209
- try {
210
- const content = fs.readFileSync(settingsPath, 'utf-8');
211
- settings = JSON.parse(content);
212
- } catch {
213
- // Invalid JSON, start fresh
214
- settings = {};
215
- }
216
- }
217
-
218
- // Set enableAllProjectMcpServers if supported (Claude-specific)
219
- if (config.enableAllKey && settings[config.enableAllKey] !== true) {
220
- settings[config.enableAllKey] = true;
221
- if (debug) log.debug(`Setting ${config.enableAllKey}: true`);
222
- }
223
-
224
- // Ensure permissions.allow includes agent-relay MCP
225
- if (config.permissionKey) {
226
- // Parse nested key (e.g., 'permissions.allow')
227
- const keyParts = config.permissionKey.split('.');
228
- let current: Record<string, unknown> = settings;
229
-
230
- // Navigate/create nested structure
231
- for (let i = 0; i < keyParts.length - 1; i++) {
232
- const key = keyParts[i];
233
- if (!current[key] || typeof current[key] !== 'object') {
234
- current[key] = {};
235
- }
236
- current = current[key] as Record<string, unknown>;
237
- }
238
-
239
- // Ensure allow list exists
240
- const finalKey = keyParts[keyParts.length - 1];
241
- if (!Array.isArray(current[finalKey])) {
242
- current[finalKey] = [];
243
- }
244
- const allowList = current[finalKey] as string[];
245
-
246
- // Add agent-relay MCP permission if not already present
247
- // Format: mcp__<serverName>__* approves all tools from that server
248
- const agentRelayPermission = 'mcp__agent-relay__*';
249
- if (!allowList.includes(agentRelayPermission)) {
250
- allowList.push(agentRelayPermission);
251
- if (debug) log.debug(`Added MCP permission: ${agentRelayPermission}`);
252
- }
253
- }
254
-
255
- // Write updated settings
256
- fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n');
257
- if (debug) log.debug(`MCP permissions configured at ${settingsPath}`);
258
- } catch (err) {
259
- // Log but don't fail - this is a best-effort optimization
260
- log.warn('Failed to pre-configure MCP permissions', {
261
- cli: cliType,
262
- error: err instanceof Error ? err.message : String(err),
263
- });
264
- }
265
- }
266
-
267
- /**
268
- * Get MCP tools reference for spawned agents.
269
- * Only included when MCP is configured for the project.
270
- */
271
- function getMcpToolsReference(): string {
272
- return [
273
- '## MCP Tools Available',
274
- '',
275
- 'You have access to MCP tools for agent communication (recommended over file protocol):',
276
- '- `relay_send(to, message)` - Send message to agent/channel',
277
- '- `relay_spawn(name, cli, task)` - Create worker agent',
278
- '- `relay_inbox()` - Check your messages',
279
- '- `relay_who()` - List online agents',
280
- '- `relay_release(name)` - Stop a worker agent',
281
- '- `relay_status()` - Check connection status',
282
- '',
283
- ].join('\n');
284
- }
285
-
286
- /**
287
- * Get relay protocol instructions for a spawned agent.
288
- * This provides the agent with the communication protocol it needs to work with the relay.
289
- *
290
- * Uses the legacy outbox path (/tmp/relay-outbox/) which is symlinked to workspace paths.
291
- * This keeps agent instructions simple while supporting workspace isolation.
292
- *
293
- * @param agentName - Name of the agent
294
- * @param options - Configuration options
295
- * @param options.hasMcp - Whether MCP tools are available (based on .mcp.json existence)
296
- * @param options.includeWorkflowConventions - Include ACK/DONE workflow conventions (default: false)
297
- */
298
- function getRelayInstructions(agentName: string, options: { hasMcp?: boolean; includeWorkflowConventions?: boolean } = {}): string {
299
- const { hasMcp = false, includeWorkflowConventions = false } = options;
300
- // Get the outbox path template and replace variable with actual agent name
301
- const outboxBase = getAgentOutboxTemplate(agentName);
302
-
303
- const parts: string[] = [
304
- '# Agent Relay Protocol',
305
- '',
306
- `You are agent "${agentName}" connected to Agent Relay for multi-agent coordination.`,
307
- '',
308
- ];
309
-
310
- // Add MCP tools reference if available
311
- if (hasMcp) {
312
- parts.push(getMcpToolsReference());
313
- }
314
-
315
- parts.push(
316
- '## Sending Messages',
317
- '',
318
- 'Write a file to your outbox, then output the trigger:',
319
- '',
320
- '```bash',
321
- `cat > ${outboxBase}/msg << 'EOF'`,
322
- 'TO: TargetAgent',
323
- '',
324
- 'Your message here.',
325
- 'EOF',
326
- '```',
327
- '',
328
- 'Then output: `->relay-file:msg`',
329
- );
330
-
331
- // Only include ACK/DONE workflow conventions if explicitly requested
332
- if (includeWorkflowConventions) {
333
- parts.push(
334
- '',
335
- '## Communication Rules',
336
- '',
337
- '1. **ACK immediately** - When you receive a task:',
338
- '```bash',
339
- `cat > ${outboxBase}/ack << 'EOF'`,
340
- 'TO: Sender',
341
- '',
342
- 'ACK: Brief description of task received',
343
- 'EOF',
344
- '```',
345
- 'Then: `->relay-file:ack`',
346
- '',
347
- '2. **Report completion** - When done:',
348
- '```bash',
349
- `cat > ${outboxBase}/done << 'EOF'`,
350
- 'TO: Sender',
351
- '',
352
- 'DONE: Brief summary of what was completed',
353
- 'EOF',
354
- '```',
355
- 'Then: `->relay-file:done`',
356
- );
357
- }
358
-
359
- parts.push(
360
- '',
361
- '## Message Format',
362
- '',
363
- '```',
364
- 'TO: Target',
365
- 'THREAD: optional-thread',
366
- '',
367
- 'Message body (everything after blank line)',
368
- '```',
369
- '',
370
- '| TO Value | Behavior |',
371
- '|----------|----------|',
372
- '| `AgentName` | Direct message |',
373
- '| `*` | Broadcast to all |',
374
- '| `#channel` | Channel message |',
375
- );
376
-
377
- return parts.join('\n');
378
- }
379
-
380
- /**
381
- * Check if the relay-pty binary is available.
382
- * Returns the path to the binary if found, null otherwise.
383
- * Uses shared utility from @agent-relay/utils.
384
- */
385
- function findRelayPtyBinary(): string | null {
386
- return findRelayPtyBinaryUtil(__dirname);
387
- }
388
-
389
- /** Cached result of relay-pty binary check */
390
- let relayPtyBinaryPath: string | null | undefined;
391
- let relayPtyBinaryChecked = false;
392
-
393
- /**
394
- * Check if relay-pty binary is available (cached).
395
- * Returns true if the binary exists, false otherwise.
396
- */
397
- function hasRelayPtyBinary(): boolean {
398
- if (!relayPtyBinaryChecked) {
399
- relayPtyBinaryPath = findRelayPtyBinary();
400
- relayPtyBinaryChecked = true;
401
- if (process.env.DEBUG_SPAWN === '1') {
402
- if (relayPtyBinaryPath) {
403
- log.debug(`relay-pty binary found: ${relayPtyBinaryPath}`);
404
- } else {
405
- log.debug('relay-pty binary not found, will use PtyWrapper fallback');
406
- }
407
- }
408
- }
409
- return relayPtyBinaryPath !== null;
410
- }
411
-
412
- /** Options for AgentSpawner constructor */
413
- export interface AgentSpawnerOptions {
414
- projectRoot: string;
415
- /** Explicit socket path for daemon connection (if not provided, derived from projectRoot) */
416
- socketPath?: string;
417
- /** Explicit team directory for agent registration files (if not provided, derived from projectRoot) */
418
- teamDir?: string;
419
- tmuxSession?: string;
420
- dashboardPort?: number;
421
- /**
422
- * Callback to mark an agent as spawning (before HELLO completes).
423
- * Messages sent to this agent will be queued for delivery after registration.
424
- */
425
- onMarkSpawning?: (agentName: string) => void;
426
- /**
427
- * Callback to clear the spawning flag for an agent.
428
- * Called when spawn fails or is cancelled.
429
- */
430
- onClearSpawning?: (agentName: string) => void;
431
- }
432
-
433
- export class AgentSpawner {
434
- private static readonly ONLINE_THRESHOLD_MS = 30_000;
435
- private activeWorkers: Map<string, ActiveWorker> = new Map();
436
- private agentsPath: string;
437
- private registryPath: string;
438
- private projectRoot: string;
439
- private socketPath?: string;
440
- private logsDir: string;
441
- private workersPath: string;
442
- private dashboardPort?: number;
443
- private onAgentDeath?: OnAgentDeathCallback;
444
- private cloudPersistence?: CloudPersistenceHandler;
445
- private policyService?: AgentPolicyService;
446
- private policyEnforcementEnabled = false;
447
- private onMarkSpawning?: (agentName: string) => void;
448
- private onClearSpawning?: (agentName: string) => void;
449
-
450
- /**
451
- * Set of agent names currently being spawned.
452
- * Prevents race conditions where concurrent spawn requests for the same agent
453
- * could both pass the activeWorkers.has() check before either completes.
454
- */
455
- private spawningAgents: Set<string> = new Set();
456
-
457
- constructor(projectRoot: string, _tmuxSession?: string, dashboardPort?: number);
458
- constructor(options: AgentSpawnerOptions);
459
- constructor(projectRootOrOptions: string | AgentSpawnerOptions, _tmuxSession?: string, dashboardPort?: number) {
460
- // Handle both old and new constructor signatures
461
- const options: AgentSpawnerOptions = typeof projectRootOrOptions === 'string'
462
- ? { projectRoot: projectRootOrOptions, tmuxSession: _tmuxSession, dashboardPort }
463
- : projectRootOrOptions;
464
-
465
- const paths = getProjectPaths(options.projectRoot);
466
- this.projectRoot = paths.projectRoot;
467
- // Use explicit teamDir if provided (ensures spawner checks same files as daemon)
468
- // This is critical in cloud workspaces where detectWorkspacePath may return different paths
469
- const effectiveTeamDir = options.teamDir ?? paths.teamDir;
470
- // Use connected-agents.json (live socket connections) instead of agents.json (historical registry)
471
- // This ensures spawned agents have actual daemon connections for channel message delivery
472
- this.agentsPath = path.join(effectiveTeamDir, 'connected-agents.json');
473
- this.registryPath = path.join(effectiveTeamDir, 'agents.json');
474
-
475
- // Debug: log path configuration
476
- log.info(`AgentSpawner paths: projectRoot=${this.projectRoot} teamDir=${effectiveTeamDir} (explicit=${!!options.teamDir}) agentsPath=${this.agentsPath}`);
477
- // Use explicit socketPath if provided (ensures spawned agents connect to same daemon)
478
- // Otherwise derive from project paths
479
- this.socketPath = options.socketPath ?? paths.socketPath;
480
- this.logsDir = path.join(effectiveTeamDir, 'worker-logs');
481
- this.workersPath = path.join(effectiveTeamDir, 'workers.json');
482
- this.dashboardPort = options.dashboardPort;
483
-
484
- // Store spawn tracking callbacks
485
- this.onMarkSpawning = options.onMarkSpawning;
486
- this.onClearSpawning = options.onClearSpawning;
487
-
488
- // Ensure logs directory exists
489
- fs.mkdirSync(this.logsDir, { recursive: true });
490
-
491
- // Initialize policy service if enforcement is enabled
492
- if (process.env.AGENT_POLICY_ENFORCEMENT === '1') {
493
- this.policyEnforcementEnabled = true;
494
- this.policyService = new AgentPolicyService({
495
- projectRoot: this.projectRoot,
496
- workspaceId: process.env.WORKSPACE_ID,
497
- strictMode: process.env.AGENT_POLICY_STRICT === '1',
498
- });
499
- log.info('Policy enforcement enabled');
500
- }
501
-
502
- // Clean up orphaned relay-pty processes from previous daemon run
503
- // This prevents Bug #8 (fails to restart) and Bug #9 (orphaned agents)
504
- this.cleanupOrphanedWorkers();
505
- }
506
-
507
- /**
508
- * Clean up orphaned relay-pty processes from a previous daemon run.
509
- * Reads workers.json to find PIDs from the previous session and kills any
510
- * that are still running. This ensures a clean slate after daemon restarts.
511
- */
512
- private cleanupOrphanedWorkers(): void {
513
- if (!fs.existsSync(this.workersPath)) {
514
- return;
515
- }
516
-
517
- try {
518
- const raw = JSON.parse(fs.readFileSync(this.workersPath, 'utf-8'));
519
- const workers: WorkerMeta[] = Array.isArray(raw?.workers) ? raw.workers : [];
520
-
521
- if (workers.length === 0) {
522
- return;
523
- }
524
-
525
- log.info(`Checking for orphaned workers from previous run (${workers.length} entries)`);
526
- let orphansKilled = 0;
527
-
528
- for (const worker of workers) {
529
- if (!worker.pid) {
530
- continue;
531
- }
532
-
533
- // Check if process is still running
534
- let isRunning = false;
535
- try {
536
- process.kill(worker.pid, 0); // Signal 0 checks existence without killing
537
- isRunning = true;
538
- } catch {
539
- // Process not running - that's fine
540
- }
541
-
542
- if (isRunning) {
543
- // Verify it's a relay-pty process before killing
544
- try {
545
- const psOutput = execSync(`ps -p ${worker.pid} -o comm= 2>/dev/null || true`, {
546
- encoding: 'utf-8',
547
- timeout: 1000,
548
- }).trim();
549
-
550
- // Only kill if it's a relay-pty process or the CLI we spawned
551
- if (psOutput.includes('relay-pty') || psOutput.includes(worker.cli)) {
552
- log.warn(`Killing orphaned worker "${worker.name}" (PID: ${worker.pid})`);
553
-
554
- // Try graceful termination first
555
- try {
556
- process.kill(worker.pid, 'SIGTERM');
557
- } catch {
558
- // Already dead or permission denied
559
- }
560
-
561
- // Give it a moment to exit gracefully
562
- const pid = worker.pid; // Capture for closure
563
- setTimeout(() => {
564
- try {
565
- process.kill(pid, 0);
566
- // Still running - force kill
567
- process.kill(pid, 'SIGKILL');
568
- log.warn(`Force killed orphaned worker "${worker.name}" (PID: ${pid})`);
569
- } catch {
570
- // Already dead - good
571
- }
572
- }, 500);
573
-
574
- orphansKilled++;
575
- } else {
576
- log.debug(`PID ${worker.pid} is running but not relay-pty (${psOutput}), skipping`);
577
- }
578
- } catch (err) {
579
- // ps command failed - be conservative and don't kill
580
- log.debug(`Could not verify PID ${worker.pid}, skipping: ${err}`);
581
- }
582
- }
583
- }
584
-
585
- // Clear workers.json to start fresh
586
- fs.writeFileSync(this.workersPath, JSON.stringify({ workers: [] }, null, 2));
587
-
588
- if (orphansKilled > 0) {
589
- log.info(`Cleaned up ${orphansKilled} orphaned worker(s) from previous run`);
590
- }
591
- } catch (err) {
592
- log.warn(`Failed to clean up orphaned workers: ${err}`);
593
- }
594
- }
595
-
596
- /**
597
- * Set cloud policy fetcher for workspace-level policies
598
- */
599
- setCloudPolicyFetcher(fetcher: CloudPolicyFetcher): void {
600
- if (this.policyService) {
601
- // Recreate policy service with cloud fetcher
602
- this.policyService = new AgentPolicyService({
603
- projectRoot: this.projectRoot,
604
- workspaceId: process.env.WORKSPACE_ID,
605
- cloudFetcher: fetcher,
606
- strictMode: process.env.AGENT_POLICY_STRICT === '1',
607
- });
608
- }
609
- }
610
-
611
- /**
612
- * Get the policy service (for external access to policy checks)
613
- */
614
- getPolicyService(): AgentPolicyService | undefined {
615
- return this.policyService;
616
- }
617
-
618
- private async fetchGhTokenFromCloud(): Promise<string | null> {
619
- const cloudApiUrl = process.env.CLOUD_API_URL || process.env.AGENT_RELAY_CLOUD_URL;
620
- const workspaceId = process.env.WORKSPACE_ID;
621
- const workspaceToken = process.env.WORKSPACE_TOKEN;
622
-
623
- if (!cloudApiUrl || !workspaceId || !workspaceToken) {
624
- return null;
625
- }
626
-
627
- const normalizedUrl = cloudApiUrl.replace(/\/$/, '');
628
- const url = `${normalizedUrl}/api/git/token?workspaceId=${encodeURIComponent(workspaceId)}`;
629
-
630
- try {
631
- // Use AbortController for timeout (5 seconds - don't block spawning)
632
- const controller = new AbortController();
633
- const timeoutId = setTimeout(() => controller.abort(), 5000);
634
-
635
- const response = await fetch(url, {
636
- headers: {
637
- Authorization: `Bearer ${workspaceToken}`,
638
- },
639
- signal: controller.signal,
640
- });
641
-
642
- clearTimeout(timeoutId);
643
-
644
- if (!response.ok) {
645
- log.warn(`Failed to fetch GH token from cloud: ${response.status} ${response.statusText}`);
646
- return null;
647
- }
648
-
649
- const data = await response.json() as { userToken?: string | null; token?: string | null };
650
- return data.userToken || data.token || null;
651
- } catch (err) {
652
- // Don't log timeout errors loudly - this is expected when cloud is unreachable
653
- const message = err instanceof Error ? err.message : String(err);
654
- if (message.includes('abort')) {
655
- log.info('Cloud API timeout (5s) - using local auth');
656
- } else {
657
- log.warn('Failed to fetch GH token from cloud', { error: message });
658
- }
659
- return null;
660
- }
661
- }
662
-
663
- private resolveGhTokenFromHostsFile(homeDir?: string): string | null {
664
- const resolvedHome = homeDir || process.env.HOME;
665
- const configHome = process.env.XDG_CONFIG_HOME || (resolvedHome ? path.join(resolvedHome, '.config') : undefined);
666
- const candidates = new Set<string>();
667
- if (configHome) {
668
- candidates.add(path.join(configHome, 'gh', 'hosts.yml'));
669
- }
670
- if (resolvedHome) {
671
- candidates.add(path.join(resolvedHome, '.config', 'gh', 'hosts.yml'));
672
- }
673
-
674
- for (const hostPath of candidates) {
675
- if (!hostPath || !fs.existsSync(hostPath)) {
676
- continue;
677
- }
678
- try {
679
- const content = fs.readFileSync(hostPath, 'utf8');
680
- const token = extractGhTokenFromHosts(content);
681
- if (token) {
682
- return token;
683
- }
684
- } catch {
685
- continue;
686
- }
687
- }
688
-
689
- return null;
690
- }
691
-
692
- private async resolveGhTokenFromGhCli(): Promise<string | null> {
693
- // Check common gh CLI installation paths across platforms
694
- const ghPathCandidates = [
695
- '/usr/bin/gh', // Linux package managers
696
- '/usr/local/bin/gh', // Homebrew (Intel Mac), manual install
697
- '/opt/homebrew/bin/gh', // Homebrew (Apple Silicon Mac)
698
- '/home/linuxbrew/.linuxbrew/bin/gh', // Linuxbrew
699
- ];
700
-
701
- const ghPath = ghPathCandidates.find((p) => fs.existsSync(p));
702
- if (!ghPath) {
703
- return null;
704
- }
705
-
706
- return await new Promise((resolve) => {
707
- execFile(ghPath, ['auth', 'token', '--hostname', 'github.com'], { timeout: 5000 }, (err, stdout) => {
708
- if (err) {
709
- resolve(null);
710
- return;
711
- }
712
- const token = stdout.trim();
713
- resolve(token || null);
714
- });
715
- });
716
- }
717
-
718
- /**
719
- * Resolve GitHub token using multiple fallback sources.
720
- *
721
- * Fallback order (same as git-credential-relay for consistency):
722
- * 1. Environment - GH_TOKEN or GITHUB_TOKEN (fastest, set by entrypoint)
723
- * 2. hosts.yml - gh CLI config file (~/.config/gh/hosts.yml)
724
- * 3. gh CLI - execute `gh auth token` command
725
- * 4. Cloud API - workspace-scoped token from Nango (requires network)
726
- *
727
- * Environment is checked first because:
728
- * - It's the fastest (no I/O or network)
729
- * - The entrypoint pre-fetches and caches GH_TOKEN at startup
730
- * - This avoids delays when cloud API is slow/unreachable
731
- */
732
- private async resolveGhToken(homeDir?: string): Promise<string | null> {
733
- // 1. Check environment variables first (fastest - set by entrypoint at startup)
734
- const envToken = process.env.GH_TOKEN || process.env.GITHUB_TOKEN;
735
- if (envToken) {
736
- return envToken;
737
- }
738
-
739
- // 2. Parse gh CLI hosts.yml config file
740
- const hostsToken = this.resolveGhTokenFromHostsFile(homeDir);
741
- if (hostsToken) {
742
- return hostsToken;
743
- }
744
-
745
- // 3. Execute gh CLI if available
746
- const cliToken = await this.resolveGhTokenFromGhCli();
747
- if (cliToken) {
748
- return cliToken;
749
- }
750
-
751
- // 4. Try cloud API as last resort (may be slow or unreachable)
752
- return await this.fetchGhTokenFromCloud();
753
- }
754
-
755
- /**
756
- * Set the dashboard port (for nested spawn API calls).
757
- * Called after the dashboard server starts and we know the actual port.
758
- */
759
- setDashboardPort(port: number): void {
760
- log.info(`Dashboard port set to ${port} - nested spawns now enabled`);
761
- this.dashboardPort = port;
762
- }
763
-
764
- /**
765
- * Set callback for agent death notifications.
766
- * Called when an agent exits unexpectedly (non-zero exit code).
767
- */
768
- setOnAgentDeath(callback: OnAgentDeathCallback): void {
769
- this.onAgentDeath = callback;
770
- }
771
-
772
- /**
773
- * Set cloud persistence handler for forwarding RelayPtyOrchestrator events.
774
- * When set, 'summary' and 'session-end' events from spawned agents
775
- * are forwarded to the handler for cloud persistence (PostgreSQL/Redis).
776
- *
777
- * Note: Enable via RELAY_CLOUD_ENABLED=true environment variable.
778
- */
779
- setCloudPersistence(handler: CloudPersistenceHandler): void {
780
- this.cloudPersistence = handler;
781
- log.info('Cloud persistence handler set');
782
- }
783
-
784
- /**
785
- * Bind cloud persistence event handlers to a RelayPtyOrchestrator.
786
- * Returns the listener references for cleanup.
787
- */
788
- private bindCloudPersistenceEvents(name: string, pty: AgentWrapper): Partial<ListenerBindings> {
789
- if (!this.cloudPersistence) return {};
790
-
791
- const summaryListener = async (event: SummaryEvent) => {
792
- try {
793
- await this.cloudPersistence!.onSummary(name, event);
794
- } catch (err) {
795
- log.error(`Cloud persistence summary error for ${name}`, { error: err instanceof Error ? err.message : String(err) });
796
- }
797
- };
798
-
799
- const sessionEndListener = async (event: SessionEndEvent) => {
800
- try {
801
- await this.cloudPersistence!.onSessionEnd(name, event);
802
- } catch (err) {
803
- log.error(`Cloud persistence session-end error for ${name}`, { error: err instanceof Error ? err.message : String(err) });
804
- }
805
- };
806
-
807
- pty.on('summary', summaryListener);
808
- pty.on('session-end', sessionEndListener);
809
-
810
- return { summary: summaryListener, sessionEnd: sessionEndListener };
811
- }
812
-
813
- /**
814
- * Unbind all tracked listeners from a RelayPtyOrchestrator.
815
- */
816
- private unbindListeners(pty: AgentWrapper, listeners?: ListenerBindings): void {
817
- if (!listeners) return;
818
-
819
- if (listeners.output) {
820
- pty.off('output', listeners.output);
821
- }
822
- if (listeners.summary) {
823
- pty.off('summary', listeners.summary);
824
- }
825
- if (listeners.sessionEnd) {
826
- pty.off('session-end', listeners.sessionEnd);
827
- }
828
- }
829
-
830
- /**
831
- * Spawn a new worker agent using relay-pty
832
- */
833
- async spawn(request: SpawnRequest): Promise<SpawnResult> {
834
- const { name, cli, task, team, spawnerName, userId, includeWorkflowConventions, interactive, model: modelOverride } = request;
835
- const debug = process.env.DEBUG_SPAWN === '1';
836
-
837
- // Validate agent name to prevent path traversal attacks
838
- if (name.includes('..') || name.includes('/') || name.includes('\\')) {
839
- return {
840
- success: false,
841
- name,
842
- error: `Invalid agent name: "${name}" contains path traversal characters`,
843
- };
844
- }
845
-
846
- // Check if worker already exists in this spawner
847
- if (this.activeWorkers.has(name)) {
848
- return {
849
- success: false,
850
- name,
851
- error: `Agent "${name}" is already running. Use a different name or release the existing agent first.`,
852
- };
853
- }
854
-
855
- // Check if spawn is already in progress for this agent (prevents race conditions)
856
- if (this.spawningAgents.has(name)) {
857
- return {
858
- success: false,
859
- name,
860
- error: `Agent "${name}" spawn is already in progress. Wait for it to complete or use a different name.`,
861
- };
862
- }
863
-
864
- // Check if agent is already connected to daemon (prevents duplicate connection storms)
865
- if (this.isAgentConnected(name)) {
866
- return {
867
- success: false,
868
- name,
869
- error: `Agent "${name}" is already connected to the daemon. Use a different name or wait for the existing agent to disconnect.`,
870
- };
871
- }
872
-
873
- // Enforce agent limit based on plan (MAX_AGENTS is set by provisioner based on plan)
874
- const maxAgents = parseInt(process.env.MAX_AGENTS ?? '', 10) || 10_000;
875
- const currentAgentCount = this.activeWorkers.size;
876
- if (currentAgentCount >= maxAgents) {
877
- log.warn(`Agent limit reached: ${currentAgentCount}/${maxAgents}`);
878
- return {
879
- success: false,
880
- name,
881
- error: `Agent limit reached (${currentAgentCount}/${maxAgents}). Upgrade your plan for more agents.`,
882
- };
883
- }
884
-
885
- // Policy enforcement: check if the spawner is authorized to spawn this agent
886
- if (this.policyEnforcementEnabled && this.policyService && spawnerName) {
887
- const decision = await this.policyService.canSpawn(spawnerName, name, cli);
888
- if (!decision.allowed) {
889
- log.warn(`Policy blocked spawn: ${spawnerName} -> ${name}: ${decision.reason}`);
890
- return {
891
- success: false,
892
- name,
893
- error: `Policy denied: ${decision.reason}`,
894
- policyDecision: decision,
895
- };
896
- }
897
- if (debug) {
898
- log.debug(`Policy allowed spawn: ${spawnerName} -> ${name} (source: ${decision.policySource})`);
899
- }
900
- }
901
-
902
- // Acquire spawn lock - prevents concurrent spawn attempts for same agent name
903
- this.spawningAgents.add(name);
904
- log.info(`Spawn lock acquired for ${name} (concurrent spawns: ${this.spawningAgents.size})`);
905
-
906
- try {
907
- // Parse CLI command and resolve actual command (e.g., cursor -> agent or cursor-agent)
908
- const cliParts = cli.split(' ');
909
- const rawCommandName = cliParts[0];
910
- const commandName = resolveCli(rawCommandName);
911
- const args = cliParts.slice(1);
912
-
913
- if (commandName !== rawCommandName && debug) {
914
- log.debug(`Mapped CLI '${rawCommandName}' -> '${commandName}'`);
915
- }
916
-
917
- // Resolve full path to avoid posix_spawnp failures
918
- const command = resolveCommand(commandName);
919
- if (debug) log.debug(`Resolved '${commandName}' -> '${command}'`);
920
- if (command === commandName && !commandName.startsWith('/')) {
921
- // Command wasn't resolved - it might not exist
922
- log.warn(`Could not resolve path for '${commandName}', spawn may fail`);
923
- }
924
-
925
- // Track the effective model for this spawn.
926
- // Model override from spawn request applies to ALL CLIs.
927
- // CLI-specific blocks below may refine this (e.g., Claude agent profile lookup).
928
- let spawnModel: string | undefined = modelOverride;
929
-
930
- // Pre-configure MCP permissions for all supported CLIs
931
- // This creates/updates CLI-specific settings files with agent-relay permissions
932
- ensureMcpPermissions(this.projectRoot, commandName, debug);
933
-
934
- // Add auto-accept flags for non-interactive agents (normal spawns, not setup terminals)
935
- // When interactive=true (setup flows), we SKIP these flags so users can respond to prompts
936
- const isClaudeCli = commandName.startsWith('claude');
937
- const isCursorCli = commandName === 'agent' || rawCommandName === 'cursor' || rawCommandName === 'cursor-agent';
938
-
939
- if (!interactive) {
940
- // Add --dangerously-skip-permissions for Claude agents
941
- if (isClaudeCli && !args.includes('--dangerously-skip-permissions')) {
942
- args.push('--dangerously-skip-permissions');
943
- }
944
-
945
- // Add --force for Cursor agents (auto-approve tool usage in non-interactive mode)
946
- if (isCursorCli && !args.includes('--force')) {
947
- args.push('--force');
948
- }
949
- } else {
950
- // Interactive mode: log that we're skipping auto-accept flags
951
- if (debug) log.debug(`Interactive mode: skipping auto-accept flags for ${name}`);
952
- }
953
-
954
- // Apply agent config (model, --agent flag) from .claude/agents/ if available
955
- // This ensures spawned agents respect their profile settings
956
- let effectiveModel: string | undefined;
957
-
958
- if (isClaudeCli) {
959
- // Get agent config for model tracking and CLI variant selection
960
- const agentConfig = findAgentConfig(name, this.projectRoot);
961
- const modelFromProfile = agentConfig?.model?.trim();
962
-
963
- // Map model to CLI variant (e.g., 'opus' -> 'claude:opus')
964
- // This allows agent profiles to specify model preferences
965
- const cliVariant = modelFromProfile
966
- ? mapModelToCli(modelFromProfile)
967
- : mapModelToCli(); // defaults to claude:sonnet
968
-
969
- // Extract effective model name for logging and tracking
970
- // Model override from spawn request takes precedence over agent profile
971
- effectiveModel = modelOverride || modelFromProfile || 'opus';
972
- spawnModel = effectiveModel;
973
-
974
- // If model override provided, add --model before buildClaudeArgs so it takes precedence
975
- if (modelOverride && !args.includes('--model')) {
976
- args.push('--model', modelOverride);
977
- }
978
-
979
- const configuredArgs = buildClaudeArgs(name, args, this.projectRoot);
980
- // Replace args with configured version (includes --model and --agent if found)
981
- args.length = 0;
982
- args.push(...configuredArgs);
983
-
984
- // Cost tracking: log which model is being used
985
- log.info(`Agent ${name}: model=${effectiveModel}, cli=${cli}, variant=${cliVariant}`);
986
- if (debug) log.debug(`Applied agent config for ${name}: ${args.join(' ')}`);
987
- }
988
-
989
- // Add auto-accept flags for Codex and Gemini (only in non-interactive mode)
990
- const isCodexCli = commandName.startsWith('codex');
991
- const isGeminiCli = commandName === 'gemini';
992
- const isOpenCodeCli = commandName === 'opencode' || rawCommandName === 'opencode';
993
-
994
- if (!interactive) {
995
- // Add --dangerously-bypass-approvals-and-sandbox for Codex agents
996
- if (isCodexCli && !args.includes('--dangerously-bypass-approvals-and-sandbox')) {
997
- args.push('--dangerously-bypass-approvals-and-sandbox');
998
- }
999
-
1000
- // Add --yolo for Gemini agents (auto-accept all prompts)
1001
- if (isGeminiCli && !args.includes('--yolo')) {
1002
- args.push('--yolo');
1003
- }
1004
- }
1005
-
1006
- // Pass model override to non-Claude CLIs via --model flag
1007
- // Claude handles this separately in its agent config block above
1008
- if (modelOverride && !isClaudeCli && !args.includes('--model') && !args.includes('-m')) {
1009
- args.push('--model', modelOverride);
1010
- }
1011
-
1012
- // Check if MCP tools are available
1013
- // Must verify BOTH conditions (matching inbox hook behavior from commit 18bab59):
1014
- // 1. MCP config exists (user or project scope)
1015
- // 2. Relay daemon socket is accessible (daemon must be running)
1016
- // Without both, MCP context would be shown but tools wouldn't work
1017
- // Use the actual socket path from config (project-local .agent-relay/relay.sock)
1018
- // or fall back to environment variable
1019
- const relaySocket = this.socketPath || process.env.RELAY_SOCKET || path.join(this.projectRoot, '.agent-relay', 'relay.sock');
1020
- const projectMcpConfigPath = path.join(this.projectRoot, '.mcp.json');
1021
- const hasMcpConfig = fs.existsSync(projectMcpConfigPath);
1022
- let hasMcp = false;
1023
- // Check either user-scope or project-scope MCP config
1024
- if (hasMcpConfig) {
1025
- try {
1026
- hasMcp = fs.statSync(relaySocket).isSocket();
1027
- } catch {
1028
- // Socket doesn't exist or isn't accessible - daemon not running
1029
- hasMcp = false;
1030
- }
1031
- }
1032
- if (debug && hasMcp) log.debug(`MCP tools available for ${name} (MCP config found, socket ${relaySocket})`);
1033
-
1034
- // Inject relay protocol instructions via CLI-specific system prompt
1035
- let relayInstructions = getRelayInstructions(name, { hasMcp, includeWorkflowConventions });
1036
-
1037
- // Compose role-specific prompts if agent has a role defined in .claude/agents/
1038
- const agentConfigForRole = isClaudeCli ? findAgentConfig(name, this.projectRoot) : null;
1039
- if (agentConfigForRole?.role) {
1040
- const validRoles: AgentRole[] = ['planner', 'worker', 'reviewer', 'lead', 'shadow'];
1041
- const role = agentConfigForRole.role.toLowerCase() as AgentRole;
1042
- if (validRoles.includes(role)) {
1043
- try {
1044
- const composed = await composeForAgent(
1045
- { name, role },
1046
- this.projectRoot,
1047
- { taskDescription: task }
1048
- );
1049
- if (composed.content) {
1050
- relayInstructions = `${composed.content}\n\n---\n\n${relayInstructions}`;
1051
- if (debug) log.debug(`Composed role prompt for ${name} (role: ${role})`);
1052
- }
1053
- } catch (err: any) {
1054
- log.warn(`Failed to compose role prompt for ${name}: ${err.message}`);
1055
- }
1056
- }
1057
- }
1058
-
1059
- if (isClaudeCli && !args.includes('--append-system-prompt')) {
1060
- args.push('--append-system-prompt', relayInstructions);
1061
- } else if (isCodexCli && !args.some(a => a.includes('developer_instructions'))) {
1062
- args.push('--config', `developer_instructions=${relayInstructions}`);
1063
- }
1064
-
1065
- // Codex requires an initial prompt in TTY mode (unlike Claude which waits for input)
1066
- // Pass the task as the initial prompt, or a generic "ready" message if no task
1067
- if (isCodexCli) {
1068
- const initialPrompt = task || 'You are ready. Wait for messages from the relay system.';
1069
- args.push(initialPrompt);
1070
- }
1071
-
1072
- // Cursor requires 'login' subcommand for interactive auth flows (setup terminals)
1073
- // Unlike Claude/Codex which auto-start auth, Cursor needs explicit 'agent login'
1074
- if (isCursorCli && interactive && !task) {
1075
- args.unshift('login');
1076
- }
1077
-
1078
- if (debug) log.debug(`Spawning ${name} with: ${command} ${args.join(' ')}`);
1079
-
1080
- // Create PtyWrapper config
1081
- // Use dashboardPort for nested spawns (API-based, works in non-TTY contexts)
1082
- // Fall back to callbacks only if no dashboardPort is not set
1083
- // Note: Spawned agents CAN spawn sub-workers intentionally - the parser is strict enough
1084
- // to avoid accidental spawns from documentation text (requires line start, PascalCase, known CLI)
1085
- // Resolve CWD relative to workspace root (parent of project root)
1086
- const cwdResult = resolveAgentCwd(this.projectRoot, request.cwd);
1087
- if ('error' in cwdResult) {
1088
- return { success: false, name, error: cwdResult.error };
1089
- }
1090
- const agentCwd = cwdResult.cwd;
1091
-
1092
- // Log whether nested spawning will be enabled for this agent
1093
- log.info(`Spawning ${name}: dashboardPort=${this.dashboardPort || 'none'} (${this.dashboardPort ? 'nested spawns enabled' : 'nested spawns disabled'})`);
1094
-
1095
- let userEnv: Record<string, string> | undefined;
1096
- if (userId) {
1097
- try {
1098
- const userDirService = getUserDirectoryService();
1099
- // Initialize provider directories so spawned agents can find credentials
1100
- userDirService.initializeUserEnvironment(userId);
1101
- userEnv = userDirService.getUserEnvironment(userId);
1102
- } catch (err) {
1103
- log.warn('Failed to resolve user environment, using default', {
1104
- userId,
1105
- error: err instanceof Error ? err.message : String(err),
1106
- });
1107
- }
1108
- }
1109
-
1110
- const mergedUserEnv = { ...(userEnv ?? {}) };
1111
- if (!mergedUserEnv.GH_TOKEN) {
1112
- const ghToken = await this.resolveGhToken(userEnv?.HOME);
1113
- if (ghToken) {
1114
- mergedUserEnv.GH_TOKEN = ghToken;
1115
- }
1116
- }
1117
- if (Object.keys(mergedUserEnv).length > 0) {
1118
- userEnv = mergedUserEnv;
1119
- }
1120
-
1121
- if (debug) log.debug(`Socket path for ${name}: ${this.socketPath ?? 'undefined'}`);
1122
-
1123
- // Require relay-pty binary
1124
- if (!hasRelayPtyBinary()) {
1125
- const checkedPaths = getLastSearchPaths();
1126
- const tracedError = createTraceableError('relay-pty binary not found', {
1127
- agentName: name,
1128
- cli,
1129
- callerDir: __dirname,
1130
- checkedPaths: checkedPaths.slice(0, 5), // First 5 paths for brevity
1131
- totalPathsChecked: checkedPaths.length,
1132
- hint: 'Set RELAY_PTY_BINARY env var to override, or reinstall: npm install agent-relay',
1133
- });
1134
- log.error(tracedError.logMessage);
1135
- if (debug) {
1136
- log.debug('All paths checked for relay-pty binary:');
1137
- checkedPaths.forEach((p, i) => log.debug(` ${i + 1}. ${p}`));
1138
- }
1139
- return {
1140
- success: false,
1141
- name,
1142
- error: tracedError.userMessage,
1143
- errorId: tracedError.errorId,
1144
- };
1145
- }
1146
-
1147
- // Common exit handler for both wrapper types
1148
- const onExitHandler = (code: number) => {
1149
- if (debug) log.debug(`Worker ${name} exited with code ${code}`);
1150
-
1151
- // Get the agentId and clean up listeners before removing from active workers
1152
- const worker = this.activeWorkers.get(name);
1153
- const agentId = worker?.pty?.getAgentId?.();
1154
- if (worker?.listeners) {
1155
- this.unbindListeners(worker.pty, worker.listeners);
1156
- }
1157
-
1158
- this.activeWorkers.delete(name);
1159
- try {
1160
- this.saveWorkersMetadata();
1161
- } catch (err) {
1162
- log.error('Failed to save metadata on exit', { error: err instanceof Error ? err.message : String(err) });
1163
- }
1164
-
1165
- // Notify if agent died unexpectedly (non-zero exit)
1166
- if (code !== 0 && code !== null && this.onAgentDeath) {
1167
- const crashError = createTraceableError('Agent crashed unexpectedly', {
1168
- agentName: name,
1169
- exitCode: code,
1170
- cli,
1171
- agentId,
1172
- });
1173
- log.error(crashError.logMessage);
1174
- this.onAgentDeath({
1175
- name,
1176
- exitCode: code,
1177
- agentId,
1178
- errorId: crashError.errorId,
1179
- resumeInstructions: agentId
1180
- ? `To resume this agent's work, use: --resume ${agentId}`
1181
- : undefined,
1182
- });
1183
- }
1184
- };
1185
-
1186
- // Common spawn/release handlers
1187
- const onSpawnHandler = this.dashboardPort ? undefined : async (workerName: string, workerCli: string, workerTask: string, workerCwd?: string) => {
1188
- if (debug) log.debug(`Nested spawn: ${workerName}`);
1189
- await this.spawn({
1190
- name: workerName,
1191
- cli: workerCli,
1192
- task: workerTask,
1193
- cwd: workerCwd,
1194
- userId,
1195
- });
1196
- };
1197
-
1198
- const onReleaseHandler = this.dashboardPort ? undefined : async (workerName: string) => {
1199
- if (debug) log.debug(`Release request: ${workerName}`);
1200
- await this.release(workerName);
1201
- };
1202
-
1203
- // Check if we should use OpenCodeWrapper with HTTP API mode
1204
- if (isOpenCodeCli) {
1205
- // OpenCodeApi reads OPENCODE_API_URL or OPENCODE_PORT from env, defaults to localhost:4096
1206
- const openCodeApi = new OpenCodeApi();
1207
- const serveAvailable = await openCodeApi.isAvailable() || process.env.OPENCODE_HTTP_MODE === '1';
1208
-
1209
- // In cloud workspaces, auto-start opencode serve if not already running
1210
- // This keeps the HTTP API internal to the container (localhost:4096, not exposed)
1211
- const isCloudWorkspace = !!process.env.WORKSPACE_ID;
1212
- const shouldUseHttpApi = serveAvailable || isCloudWorkspace;
1213
-
1214
- if (shouldUseHttpApi) {
1215
- if (debug) log.debug(`OpenCode: serve=${serveAvailable ? 'available' : 'will-auto-start'}, cloud=${isCloudWorkspace}, using OpenCodeWrapper for ${name}`);
1216
-
1217
- const openCodeConfig: OpenCodeWrapperConfig = {
1218
- name,
1219
- command,
1220
- args,
1221
- socketPath: this.socketPath,
1222
- cwd: agentCwd,
1223
- dashboardPort: this.dashboardPort,
1224
- env: {
1225
- ...userEnv,
1226
- ...(spawnerName ? { AGENT_RELAY_SPAWNER: spawnerName } : {}),
1227
- ...(relaySocket ? { RELAY_SOCKET: relaySocket } : {}),
1228
- RELAY_AGENT_NAME: name,
1229
- },
1230
- httpApi: {
1231
- enabled: true,
1232
- fallbackToPty: true, // Allow fallback if HTTP becomes unavailable
1233
- // Auto-start opencode serve in cloud workspaces (internal to container)
1234
- autoStartServe: isCloudWorkspace && !serveAvailable,
1235
- waitForServeMs: 10000, // Give serve time to start in cloud
1236
- },
1237
- onSpawn: onSpawnHandler,
1238
- onRelease: onReleaseHandler,
1239
- };
1240
-
1241
- const openCodeWrapper = new OpenCodeWrapper(openCodeConfig);
1242
-
1243
- // Track listener references for proper cleanup
1244
- const listeners: ListenerBindings = {};
1245
-
1246
- // Hook up output events for live log streaming
1247
- const outputListener = (data: string) => {
1248
- const broadcast = (global as any).__broadcastLogOutput;
1249
- if (broadcast) {
1250
- broadcast(name, data);
1251
- }
1252
- };
1253
- openCodeWrapper.on('output', outputListener);
1254
- listeners.output = outputListener;
1255
-
1256
- // Handle exit events
1257
- openCodeWrapper.on('exit', (code: number) => {
1258
- onExitHandler(code);
1259
- });
1260
-
1261
- // Mark agent as spawning BEFORE starting wrapper
1262
- if (this.onMarkSpawning) {
1263
- this.onMarkSpawning(name);
1264
- if (debug) log.debug(`Marked ${name} as spawning`);
1265
- }
1266
-
1267
- await openCodeWrapper.start();
1268
- if (debug) log.debug(`OpenCodeWrapper started for ${name}, HTTP mode: ${openCodeWrapper.isHttpApiMode}`);
1269
-
1270
- // Wait for the agent to register with the daemon
1271
- const registered = await this.waitForAgentRegistration(name, 30_000, 500);
1272
- if (!registered) {
1273
- const tracedError = createTraceableError('Agent registration timeout', {
1274
- agentName: name,
1275
- cli,
1276
- pid: openCodeWrapper.pid,
1277
- timeoutMs: 30_000,
1278
- });
1279
- log.error(tracedError.logMessage);
1280
- if (this.onClearSpawning) {
1281
- this.onClearSpawning(name);
1282
- }
1283
- await openCodeWrapper.kill();
1284
- return {
1285
- success: false,
1286
- name,
1287
- error: tracedError.userMessage,
1288
- errorId: tracedError.errorId,
1289
- };
1290
- }
1291
-
1292
- // Send task to the newly spawned agent if provided
1293
- if (task && task.trim()) {
1294
- const ready = await openCodeWrapper.waitUntilReadyForMessages(20000, 100);
1295
- let taskSent = false;
1296
- if (ready) {
1297
- taskSent = await openCodeWrapper.injectTask(task, spawnerName || 'spawner');
1298
- if (!taskSent) {
1299
- log.warn(`Failed to inject task for ${name} via OpenCodeWrapper`);
1300
- } else if (debug) {
1301
- log.debug(`Task injected to ${name} via OpenCodeWrapper`);
1302
- }
1303
- } else {
1304
- log.warn(`OpenCodeWrapper ${name} not ready for task injection`);
1305
- }
1306
-
1307
- // If task injection failed, kill the agent and return error
1308
- // An agent without its task is useless and will just sit idle
1309
- if (!taskSent) {
1310
- const tracedError = createTraceableError('Task injection failed', {
1311
- agentName: name,
1312
- cli,
1313
- taskLength: task.length,
1314
- ready,
1315
- });
1316
- log.error(`CRITICAL: ${tracedError.logMessage}`);
1317
- await openCodeWrapper.stop();
1318
- if (this.onClearSpawning) {
1319
- this.onClearSpawning(name);
1320
- }
1321
- return {
1322
- success: false,
1323
- name,
1324
- error: tracedError.userMessage,
1325
- errorId: tracedError.errorId,
1326
- };
1327
- }
1328
- }
1329
-
1330
- // Track the worker (cast to AgentWrapper for type compatibility)
1331
- const workerInfo: ActiveWorker = {
1332
- name,
1333
- cli,
1334
- task,
1335
- team,
1336
- spawnerName,
1337
- userId,
1338
- spawnedAt: Date.now(),
1339
- pid: openCodeWrapper.pid,
1340
- pty: openCodeWrapper as unknown as AgentWrapper,
1341
- logFile: openCodeWrapper.logPath,
1342
- listeners,
1343
- model: spawnModel,
1344
- cwd: request.cwd,
1345
- };
1346
- this.activeWorkers.set(name, workerInfo);
1347
- this.saveWorkersMetadata();
1348
-
1349
- const teamInfo = team ? ` [team: ${team}]` : '';
1350
- const shadowInfo = request.shadowOf ? ` [shadow of: ${request.shadowOf}]` : '';
1351
- log.info(`Spawned ${name} (${cli}) via OpenCodeWrapper${teamInfo}${shadowInfo} [HTTP mode: ${openCodeWrapper.isHttpApiMode}]`);
1352
-
1353
- return {
1354
- success: true,
1355
- name,
1356
- pid: openCodeWrapper.pid,
1357
- };
1358
- }
1359
-
1360
- // OpenCode serve not available and not in cloud workspace, fall through to RelayPtyOrchestrator
1361
- if (debug) log.debug(`OpenCode: serve not available, not cloud workspace, falling back to RelayPtyOrchestrator for ${name}`);
1362
- }
1363
-
1364
- // Create RelayPtyOrchestrator (relay-pty Rust binary)
1365
- const ptyConfig: RelayPtyOrchestratorConfig = {
1366
- name,
1367
- command,
1368
- args,
1369
- socketPath: this.socketPath,
1370
- cwd: agentCwd,
1371
- dashboardPort: this.dashboardPort,
1372
- env: {
1373
- ...userEnv,
1374
- ...(spawnerName ? { AGENT_RELAY_SPAWNER: spawnerName } : {}),
1375
- // Pass socket path for MCP server discovery
1376
- // This allows the MCP server (started by Claude Code) to connect to the daemon
1377
- ...(relaySocket ? { RELAY_SOCKET: relaySocket } : {}),
1378
- // Pass agent name so MCP server knows its identity
1379
- RELAY_AGENT_NAME: name,
1380
- },
1381
- streamLogs: true,
1382
- shadowOf: request.shadowOf,
1383
- shadowSpeakOn: request.shadowSpeakOn,
1384
- skipContinuity: true,
1385
- onSpawn: onSpawnHandler,
1386
- onRelease: onReleaseHandler,
1387
- onExit: onExitHandler,
1388
- headless: true, // Force headless mode for spawned agents to enable task injection via stdin
1389
- // In cloud environments (WORKSPACE_ID set), limit CPU per agent to prevent
1390
- // one agent (e.g., running npm install) from starving others
1391
- // Default: 100% of one core per agent. Set AGENT_CPU_LIMIT to override.
1392
- cpuLimitPercent: process.env.WORKSPACE_ID
1393
- ? parseInt(process.env.AGENT_CPU_LIMIT || '100', 10)
1394
- : undefined,
1395
- };
1396
- const pty = new RelayPtyOrchestrator(ptyConfig);
1397
- if (debug) log.debug(`Using RelayPtyOrchestrator for ${name}`);
1398
-
1399
- // Track listener references for proper cleanup
1400
- const listeners: ListenerBindings = {};
1401
-
1402
- // Hook up output events for live log streaming
1403
- const outputListener = (data: string) => {
1404
- // Broadcast to any connected WebSocket clients via global function
1405
- const broadcast = (global as any).__broadcastLogOutput;
1406
- if (broadcast) {
1407
- broadcast(name, data);
1408
- }
1409
- };
1410
- pty.on('output', outputListener);
1411
- listeners.output = outputListener;
1412
-
1413
- // Bind cloud persistence events (if enabled) and store references
1414
- const cloudListeners = this.bindCloudPersistenceEvents(name, pty);
1415
- if (cloudListeners.summary) listeners.summary = cloudListeners.summary;
1416
- if (cloudListeners.sessionEnd) listeners.sessionEnd = cloudListeners.sessionEnd;
1417
-
1418
- // Mark agent as spawning BEFORE starting PTY
1419
- // This allows messages sent to this agent to be queued until HELLO completes
1420
- if (this.onMarkSpawning) {
1421
- this.onMarkSpawning(name);
1422
- if (debug) log.debug(`Marked ${name} as spawning`);
1423
- }
1424
-
1425
- await pty.start();
1426
-
1427
- if (debug) log.debug(`PTY started, pid: ${pty.pid}`);
1428
-
1429
- // Cursor CLI shows "Press any key to log in..." prompt that blocks all progress
1430
- // Send a keystroke after startup to bypass this initial prompt
1431
- // Only do this for interactive/setup flows where auth is needed
1432
- // For normal spawns (already authenticated), this prompt won't appear
1433
- if (isCursorCli && interactive) {
1434
- // Wait a moment for CLI to initialize and show the prompt
1435
- await sleep(1500);
1436
- if (debug) log.debug(`Sending initial keystroke for Cursor setup to bypass "Press any key" prompt`);
1437
- try {
1438
- // Send Enter key to proceed past the initial prompt
1439
- await pty.write('\r');
1440
- } catch (err) {
1441
- log.warn(`Failed to send initial keystroke for Cursor: ${err}`);
1442
- }
1443
- }
1444
-
1445
- // Wait for the agent to register with the daemon
1446
- const registered = await this.waitForAgentRegistration(name, 30_000, 500);
1447
- if (!registered) {
1448
- const tracedError = createTraceableError('Agent registration timeout', {
1449
- agentName: name,
1450
- cli,
1451
- pid: pty.pid,
1452
- timeoutMs: 30_000,
1453
- });
1454
- log.error(tracedError.logMessage);
1455
- // Clear spawning flag since spawn failed
1456
- if (this.onClearSpawning) {
1457
- this.onClearSpawning(name);
1458
- }
1459
- await pty.kill();
1460
- return {
1461
- success: false,
1462
- name,
1463
- error: tracedError.userMessage,
1464
- errorId: tracedError.errorId,
1465
- };
1466
- }
1467
-
1468
- // Send task to the newly spawned agent if provided
1469
- // We do this AFTER registration AND after the orchestrator is FULLY ready for messages
1470
- // This includes: CLI started, CLI idle, socket connected, readyForMessages flag set
1471
- if (task && task.trim()) {
1472
- const maxRetries = 3;
1473
- const retryDelayMs = 2000;
1474
- let taskSent = false;
1475
-
1476
- for (let attempt = 1; attempt <= maxRetries; attempt++) {
1477
- try {
1478
- // Wait for full orchestrator readiness (CLI + socket + internal flags)
1479
- if ('waitUntilReadyForMessages' in pty) {
1480
- const orchestrator = pty as RelayPtyOrchestrator;
1481
- const ready = await orchestrator.waitUntilReadyForMessages(20000, 100);
1482
- if (!ready) {
1483
- // Log retry attempts at DEBUG level to avoid terminal noise
1484
- log.debug(`Attempt ${attempt}/${maxRetries}: ${name} not ready for messages within timeout`);
1485
- if (attempt < maxRetries) {
1486
- await sleep(retryDelayMs);
1487
- continue;
1488
- }
1489
- log.error(`${name} failed to become ready after ${maxRetries} attempts - task may be lost`);
1490
- break;
1491
- }
1492
- } else if ('waitUntilCliReady' in pty) {
1493
- // Fallback for older wrapper types
1494
- await (pty as RelayPtyOrchestrator).waitUntilCliReady(15000, 100);
1495
- }
1496
-
1497
- // Inject task via socket (relay-pty confirms write)
1498
- const success = await pty.injectTask(task, spawnerName || 'spawner');
1499
- if (success) {
1500
- taskSent = true;
1501
- if (debug) log.debug(`Task injected to ${name} (attempt ${attempt})`);
1502
- break;
1503
- } else {
1504
- // Delivery failed - safe to retry
1505
- throw new Error('Task injection returned false - delivery failed');
1506
- }
1507
- } catch (err: any) {
1508
- // Log retry attempts at DEBUG level to avoid terminal noise
1509
- // Only the final summary (if all attempts fail) is logged at ERROR level
1510
- log.debug(`Attempt ${attempt}/${maxRetries}: Error injecting task for ${name}: ${err.message}`);
1511
- if (attempt < maxRetries) {
1512
- await sleep(retryDelayMs);
1513
- }
1514
- }
1515
- }
1516
-
1517
- if (!taskSent) {
1518
- const tracedError = createTraceableError('Task injection failed', {
1519
- agentName: name,
1520
- cli,
1521
- attempts: maxRetries,
1522
- taskLength: task.length,
1523
- });
1524
- log.error(`CRITICAL: ${tracedError.logMessage}`);
1525
- // Kill the agent since it's useless without its task - it will just sit idle
1526
- // Return an error so the caller knows the spawn effectively failed
1527
- await pty.stop();
1528
- this.activeWorkers.delete(name);
1529
- if (this.onClearSpawning) {
1530
- this.onClearSpawning(name);
1531
- }
1532
- return {
1533
- success: false,
1534
- name,
1535
- error: tracedError.userMessage,
1536
- errorId: tracedError.errorId,
1537
- };
1538
- }
1539
- }
1540
-
1541
- // Track the worker
1542
- const workerInfo: ActiveWorker = {
1543
- name,
1544
- cli,
1545
- task,
1546
- team,
1547
- spawnerName,
1548
- userId,
1549
- spawnedAt: Date.now(),
1550
- pid: pty.pid,
1551
- pty,
1552
- logFile: pty.logPath,
1553
- listeners, // Store for cleanup
1554
- model: spawnModel,
1555
- cwd: request.cwd,
1556
- };
1557
- this.activeWorkers.set(name, workerInfo);
1558
- this.saveWorkersMetadata();
1559
-
1560
- const teamInfo = team ? ` [team: ${team}]` : '';
1561
- const shadowInfo = request.shadowOf ? ` [shadow of: ${request.shadowOf}]` : '';
1562
- log.info(`Spawned ${name} (${cli})${teamInfo}${shadowInfo} [pid: ${pty.pid}]`);
1563
-
1564
- return {
1565
- success: true,
1566
- name,
1567
- pid: pty.pid,
1568
- };
1569
- } catch (err: any) {
1570
- const tracedError = createTraceableError('Agent spawn failed', {
1571
- agentName: name,
1572
- cli,
1573
- task: task?.substring(0, 100),
1574
- }, err instanceof Error ? err : undefined);
1575
- log.error(tracedError.logMessage);
1576
- if (debug) log.debug('Full error', { error: err?.stack || String(err) });
1577
- // Clear spawning flag since spawn failed
1578
- if (this.onClearSpawning) {
1579
- this.onClearSpawning(name);
1580
- }
1581
- return {
1582
- success: false,
1583
- name,
1584
- error: tracedError.userMessage,
1585
- errorId: tracedError.errorId,
1586
- };
1587
- } finally {
1588
- // Always release spawn lock, even on success (agent is now tracked in activeWorkers)
1589
- this.spawningAgents.delete(name);
1590
- log.info(`Spawn lock released for ${name} (remaining: ${this.spawningAgents.size})`);
1591
- }
1592
- }
1593
-
1594
- /** Role presets for shadow agents */
1595
- private static readonly ROLE_PRESETS: Record<string, SpeakOnTrigger[]> = {
1596
- reviewer: ['CODE_WRITTEN', 'REVIEW_REQUEST', 'EXPLICIT_ASK'],
1597
- auditor: ['SESSION_END', 'EXPLICIT_ASK'],
1598
- active: ['ALL_MESSAGES'],
1599
- };
1600
-
1601
- /**
1602
- * Spawn a primary agent with its shadow agent
1603
- *
1604
- * Example usage:
1605
- * ```ts
1606
- * const result = await spawner.spawnWithShadow({
1607
- * primary: { name: 'Lead', command: 'claude', task: 'Implement feature X' },
1608
- * shadow: { name: 'Auditor', role: 'reviewer', speakOn: ['CODE_WRITTEN'] }
1609
- * });
1610
- * ```
1611
- */
1612
- async spawnWithShadow(request: SpawnWithShadowRequest): Promise<SpawnWithShadowResult> {
1613
- const { primary, shadow } = request;
1614
- const debug = process.env.DEBUG_SPAWN === '1';
1615
-
1616
- // Resolve shadow speakOn triggers
1617
- let speakOn: SpeakOnTrigger[] = ['EXPLICIT_ASK']; // Default
1618
-
1619
- // Check for role preset
1620
- if (shadow.role && AgentSpawner.ROLE_PRESETS[shadow.role.toLowerCase()]) {
1621
- speakOn = AgentSpawner.ROLE_PRESETS[shadow.role.toLowerCase()];
1622
- }
1623
-
1624
- // Override with explicit speakOn if provided
1625
- if (shadow.speakOn && shadow.speakOn.length > 0) {
1626
- speakOn = shadow.speakOn;
1627
- }
1628
-
1629
- // Build shadow task prompt
1630
- const defaultPrompt = `You are a shadow agent monitoring "${primary.name}". You receive copies of their messages. Your role: ${shadow.role || 'observer'}. Stay passive unless your triggers activate: ${speakOn.join(', ')}.`;
1631
- const shadowTask = shadow.prompt || defaultPrompt;
1632
-
1633
- // Decide how to run the shadow (subagent for Claude/OpenCode primaries, process fallback otherwise)
1634
- let shadowSelection: Awaited<ReturnType<typeof selectShadowCli>> | null = null;
1635
- try {
1636
- shadowSelection = await selectShadowCli(primary.command || 'claude', {
1637
- preferredShadowCli: shadow.command,
1638
- });
1639
- } catch (err: any) {
1640
- log.warn(`Shadow CLI selection failed for ${shadow.name}: ${err.message}`);
1641
- }
1642
-
1643
- if (debug) {
1644
- const mode = shadowSelection?.mode ?? 'unknown';
1645
- const cli = shadowSelection?.command ?? shadow.command ?? primary.command ?? 'claude';
1646
- log.debug(
1647
- `spawnWithShadow: primary=${primary.name}, shadow=${shadow.name}, mode=${mode}, cli=${cli}, speakOn=${speakOn.join(',')}`
1648
- );
1649
- }
1650
-
1651
- // Step 1: Spawn primary agent
1652
- const primaryResult = await this.spawn({
1653
- name: primary.name,
1654
- cli: primary.command || 'claude',
1655
- task: primary.task || '',
1656
- team: primary.team,
1657
- });
1658
-
1659
- if (!primaryResult.success) {
1660
- return {
1661
- success: false,
1662
- primary: primaryResult,
1663
- error: `Failed to spawn primary agent: ${primaryResult.error}`,
1664
- };
1665
- }
1666
-
1667
- // Step 2: Wait for primary to register before spawning shadow
1668
- // The spawn() method already waits, but we add a small delay for stability
1669
- await sleep(1000);
1670
-
1671
- // Subagent mode: no separate process needed
1672
- if (shadowSelection?.mode === 'subagent') {
1673
- log.info(
1674
- `Shadow ${shadow.name} will run as ${shadowSelection.cli} subagent inside ${primary.name} (no separate process)`
1675
- );
1676
- return {
1677
- success: true,
1678
- primary: primaryResult,
1679
- shadow: {
1680
- success: true,
1681
- name: shadow.name,
1682
- },
1683
- };
1684
- }
1685
-
1686
- // No available shadow CLI - proceed without spawning a shadow process
1687
- if (!shadowSelection) {
1688
- log.warn(`No authenticated shadow CLI available; ${primary.name} will run without a shadow`);
1689
- return {
1690
- success: true,
1691
- primary: primaryResult,
1692
- error: 'Shadow spawn skipped: no authenticated shadow CLI available',
1693
- };
1694
- }
1695
-
1696
- // Step 3: Spawn shadow agent with shadowOf and shadowSpeakOn
1697
- const shadowResult = await this.spawn({
1698
- name: shadow.name,
1699
- // Use the selected/validated CLI for process-mode shadows
1700
- cli: shadowSelection.command || shadow.command || primary.command || 'claude',
1701
- task: shadowTask,
1702
- shadowOf: primary.name,
1703
- shadowSpeakOn: speakOn,
1704
- });
1705
-
1706
- if (!shadowResult.success) {
1707
- log.warn(`Shadow agent ${shadow.name} failed to spawn, primary ${primary.name} continues without shadow`);
1708
- return {
1709
- success: true, // Primary succeeded, overall operation is partial success
1710
- primary: primaryResult,
1711
- shadow: shadowResult,
1712
- error: `Shadow spawn failed: ${shadowResult.error}`,
1713
- };
1714
- }
1715
-
1716
- log.info(`Spawned pair: ${primary.name} with shadow ${shadow.name} (speakOn: ${speakOn.join(',')})`);
1717
-
1718
- return {
1719
- success: true,
1720
- primary: primaryResult,
1721
- shadow: shadowResult,
1722
- };
1723
- }
1724
-
1725
- /**
1726
- * Release (terminate) a worker
1727
- */
1728
- async release(name: string): Promise<boolean> {
1729
- const worker = this.activeWorkers.get(name);
1730
- if (!worker) {
1731
- log.debug(`Worker ${name} not found`);
1732
- return false;
1733
- }
1734
-
1735
- try {
1736
- // Unbind all listeners first to prevent memory leaks
1737
- this.unbindListeners(worker.pty, worker.listeners);
1738
-
1739
- // Stop the pty process gracefully (handles auto-save internally)
1740
- await worker.pty.stop();
1741
-
1742
- // Force kill if still running
1743
- if (worker.pty.isRunning) {
1744
- await worker.pty.kill();
1745
- }
1746
-
1747
- this.activeWorkers.delete(name);
1748
- this.saveWorkersMetadata();
1749
- log.info(`Released ${name}`);
1750
-
1751
- return true;
1752
- } catch (err: any) {
1753
- log.error(`Failed to release ${name}: ${err.message}`);
1754
- // Still unbind and remove from tracking
1755
- this.unbindListeners(worker.pty, worker.listeners);
1756
- this.activeWorkers.delete(name);
1757
- this.saveWorkersMetadata();
1758
- return false;
1759
- }
1760
- }
1761
-
1762
- /**
1763
- * Release all workers
1764
- */
1765
- async releaseAll(): Promise<void> {
1766
- const workers = Array.from(this.activeWorkers.keys());
1767
- for (const name of workers) {
1768
- await this.release(name);
1769
- }
1770
- }
1771
-
1772
- /**
1773
- * Get all active workers (returns WorkerInfo without pty reference)
1774
- */
1775
- getActiveWorkers(): WorkerInfo[] {
1776
- return Array.from(this.activeWorkers.values()).map((w) => ({
1777
- name: w.name,
1778
- cli: w.cli,
1779
- task: w.task,
1780
- team: w.team,
1781
- spawnerName: w.spawnerName,
1782
- spawnedAt: w.spawnedAt,
1783
- pid: w.pid,
1784
- model: w.model,
1785
- cwd: w.cwd,
1786
- }));
1787
- }
1788
-
1789
- /**
1790
- * Check if a worker exists
1791
- */
1792
- hasWorker(name: string): boolean {
1793
- return this.activeWorkers.has(name);
1794
- }
1795
-
1796
- /**
1797
- * Get worker info
1798
- */
1799
- getWorker(name: string): WorkerInfo | undefined {
1800
- const worker = this.activeWorkers.get(name);
1801
- if (!worker) return undefined;
1802
- return {
1803
- name: worker.name,
1804
- cli: worker.cli,
1805
- task: worker.task,
1806
- team: worker.team,
1807
- spawnedAt: worker.spawnedAt,
1808
- pid: worker.pid,
1809
- model: worker.model,
1810
- cwd: worker.cwd,
1811
- };
1812
- }
1813
-
1814
- /**
1815
- * Get output logs from a worker
1816
- */
1817
- getWorkerOutput(name: string, limit?: number): string[] | null {
1818
- const worker = this.activeWorkers.get(name);
1819
- if (!worker) return null;
1820
- return worker.pty.getOutput(limit);
1821
- }
1822
-
1823
- /**
1824
- * Get raw output from a worker
1825
- */
1826
- getWorkerRawOutput(name: string): string | null {
1827
- const worker = this.activeWorkers.get(name);
1828
- if (!worker) return null;
1829
- return worker.pty.getRawOutput();
1830
- }
1831
-
1832
- /**
1833
- * Send input to a worker's PTY (for interactive terminal support)
1834
- * @param name - Worker name
1835
- * @param data - Input data to send (keystrokes, text, etc.)
1836
- * @returns true if input was sent, false if worker not found
1837
- */
1838
- sendWorkerInput(name: string, data: string): boolean {
1839
- const worker = this.activeWorkers.get(name);
1840
- if (!worker) return false;
1841
- worker.pty.write(data);
1842
- return true;
1843
- }
1844
-
1845
- /**
1846
- * Switch the model of a running worker agent.
1847
- * Waits for the agent to be idle, then sends the CLI-specific model switch command.
1848
- *
1849
- * @param name - Worker name
1850
- * @param model - Target model identifier (e.g., 'opus', 'sonnet', 'haiku')
1851
- * @param timeoutMs - Max time to wait for agent idle (default: 30000)
1852
- * @returns Result of the model switch attempt
1853
- */
1854
- async setWorkerModel(
1855
- name: string,
1856
- model: string,
1857
- timeoutMs = 30000,
1858
- ): Promise<{ success: boolean; previousModel?: string; normalizedModel?: string; error?: string }> {
1859
- const worker = this.activeWorkers.get(name);
1860
- if (!worker) {
1861
- return { success: false, error: `Agent "${name}" not found` };
1862
- }
1863
-
1864
- // Validate CLI supports model switching
1865
- if (!isModelSwitchSupported(worker.cli)) {
1866
- return { success: false, error: `CLI "${worker.cli}" does not support mid-session model switching` };
1867
- }
1868
-
1869
- // Validate and normalize model name
1870
- const validation = validateModelForCli(worker.cli, model);
1871
- if (!validation.valid) {
1872
- return { success: false, error: validation.error };
1873
- }
1874
- const normalizedModel = validation.normalizedModel ?? model;
1875
-
1876
- // Build the command using normalized model
1877
- const command = buildModelSwitchCommand(worker.cli, normalizedModel);
1878
- if (!command) {
1879
- return { success: false, error: `Failed to build model switch command for "${worker.cli}"` };
1880
- }
1881
-
1882
- // Wait for agent idle via readiness detection
1883
- const pty = worker.pty;
1884
- if ('waitUntilReadyForMessages' in pty && typeof pty.waitUntilReadyForMessages === 'function') {
1885
- const ready = await pty.waitUntilReadyForMessages(timeoutMs, 200);
1886
- if (!ready) {
1887
- return {
1888
- success: false,
1889
- error: `Agent "${name}" did not become idle within ${timeoutMs}ms. The agent may be processing a task. Try again later.`,
1890
- };
1891
- }
1892
- } else {
1893
- log.warn(`PTY for ${name} does not support idle detection; sending model switch without waiting`);
1894
- }
1895
-
1896
- // Send the command via write() (raw stdin)
1897
- try {
1898
- const previousModel = worker.model;
1899
- await pty.write(command);
1900
- worker.model = normalizedModel;
1901
- this.saveWorkersMetadata();
1902
-
1903
- log.info(`Model switched for ${name}: ${previousModel ?? 'unknown'} -> ${normalizedModel}`);
1904
- return { success: true, previousModel, normalizedModel };
1905
- } catch (err: unknown) {
1906
- const message = err instanceof Error ? err.message : String(err);
1907
- return { success: false, error: `Failed to send model switch command: ${message}` };
1908
- }
1909
- }
1910
-
1911
- /**
1912
- * Wait for an agent to appear in the connected list and registry (connected-agents.json + agents.json).
1913
- */
1914
- private async waitForAgentRegistration(
1915
- name: string,
1916
- timeoutMs = 30_000,
1917
- pollIntervalMs = 500
1918
- ): Promise<boolean> {
1919
- const deadline = Date.now() + timeoutMs;
1920
- let pollCount = 0;
1921
-
1922
- while (Date.now() < deadline) {
1923
- pollCount++;
1924
- const connected = this.isAgentConnected(name);
1925
- const recentlySeen = this.isAgentRecentlySeen(name);
1926
-
1927
- // Log first few polls and every 10th poll after that
1928
- if (pollCount <= 3 || pollCount % 10 === 0) {
1929
- log.info(`Registration poll #${pollCount} for ${name}: connected=${connected} recentlySeen=${recentlySeen} agentsPath=${this.agentsPath}`);
1930
- }
1931
-
1932
- if (connected && recentlySeen) {
1933
- log.info(`Agent ${name} registered after ${pollCount} polls`);
1934
- return true;
1935
- }
1936
-
1937
- await sleep(pollIntervalMs);
1938
- }
1939
-
1940
- log.info(`Registration timeout for ${name} after ${pollCount} polls`);
1941
- return false;
1942
- }
1943
-
1944
- private isAgentRegistered(name: string): boolean {
1945
- return this.isAgentConnected(name) && this.isAgentRecentlySeen(name);
1946
- }
1947
-
1948
- private isAgentConnected(name: string): boolean {
1949
- const debug = process.env.DEBUG_SPAWN === '1';
1950
- if (!this.agentsPath) {
1951
- if (debug) log.debug(`isAgentConnected(${name}): no agentsPath`);
1952
- return false;
1953
- }
1954
- if (!fs.existsSync(this.agentsPath)) {
1955
- if (debug) log.debug(`isAgentConnected(${name}): file not found: ${this.agentsPath}`);
1956
- return false;
1957
- }
1958
-
1959
- try {
1960
- const raw = JSON.parse(fs.readFileSync(this.agentsPath, 'utf-8'));
1961
- // connected-agents.json format: { agents: string[], users: string[], updatedAt: number }
1962
- // agents is a string array of connected agent names (not objects)
1963
- const agents: string[] = Array.isArray(raw?.agents) ? raw.agents : [];
1964
- const updatedAt = typeof raw?.updatedAt === 'number' ? raw.updatedAt : 0;
1965
- const isFresh = Date.now() - updatedAt <= AgentSpawner.ONLINE_THRESHOLD_MS;
1966
-
1967
- if (debug) {
1968
- log.debug(`isAgentConnected(${name}): path=${this.agentsPath} agents=${agents.join(',')} updatedAt=${updatedAt} isFresh=${isFresh}`);
1969
- }
1970
-
1971
- if (!isFresh) return false;
1972
-
1973
- // Case-insensitive check to match router behavior
1974
- const lowerName = name.toLowerCase();
1975
- return agents.some((a) => typeof a === 'string' && a.toLowerCase() === lowerName);
1976
- } catch (err: any) {
1977
- log.error('Failed to read connected-agents.json', { error: err.message, path: this.agentsPath });
1978
- return false;
1979
- }
1980
- }
1981
-
1982
- private isAgentRecentlySeen(name: string): boolean {
1983
- if (!this.registryPath) return false;
1984
- if (!fs.existsSync(this.registryPath)) return false;
1985
-
1986
- try {
1987
- const raw = JSON.parse(fs.readFileSync(this.registryPath, 'utf-8'));
1988
- const agents = Array.isArray(raw?.agents)
1989
- ? raw.agents
1990
- : typeof raw?.agents === 'object' && raw?.agents !== null
1991
- ? Object.values(raw.agents)
1992
- : [];
1993
- const lowerName = name.toLowerCase();
1994
- const agent = agents.find((entry: { name?: string; lastSeen?: string }) => typeof entry?.name === 'string' && entry.name.toLowerCase() === lowerName);
1995
- if (!agent?.lastSeen) return false;
1996
- return Date.now() - new Date(agent.lastSeen).getTime() <= AgentSpawner.ONLINE_THRESHOLD_MS;
1997
- } catch (err: any) {
1998
- log.error('Failed to read agents.json', { error: err.message });
1999
- return false;
2000
- }
2001
- }
2002
-
2003
- /**
2004
- * Save workers metadata to disk for CLI access
2005
- */
2006
- private saveWorkersMetadata(): void {
2007
- try {
2008
- const workers: WorkerMeta[] = Array.from(this.activeWorkers.values()).map((w) => ({
2009
- name: w.name,
2010
- cli: w.cli,
2011
- task: w.task,
2012
- team: w.team,
2013
- userId: w.userId,
2014
- spawnedAt: w.spawnedAt,
2015
- pid: w.pid,
2016
- logFile: w.logFile,
2017
- model: w.model,
2018
- cwd: w.cwd,
2019
- }));
2020
-
2021
- fs.writeFileSync(this.workersPath, JSON.stringify({ workers }, null, 2));
2022
- } catch (err: any) {
2023
- log.error('Failed to save workers metadata', { error: err.message });
2024
- }
2025
- }
2026
-
2027
- /**
2028
- * Get path to logs directory
2029
- */
2030
- getLogsDir(): string {
2031
- return this.logsDir;
2032
- }
2033
-
2034
- /**
2035
- * Get path to workers metadata file
2036
- */
2037
- getWorkersPath(): string {
2038
- return this.workersPath;
2039
- }
2040
- }
2041
-
2042
- /**
2043
- * Read workers metadata from disk (for CLI use)
2044
- */
2045
- export function readWorkersMetadata(projectRoot: string): WorkerMeta[] {
2046
- const paths = getProjectPaths(projectRoot);
2047
- const workersPath = path.join(paths.teamDir, 'workers.json');
2048
-
2049
- if (!fs.existsSync(workersPath)) {
2050
- return [];
2051
- }
2052
-
2053
- try {
2054
- const raw = JSON.parse(fs.readFileSync(workersPath, 'utf-8'));
2055
- return Array.isArray(raw?.workers) ? raw.workers : [];
2056
- } catch {
2057
- return [];
2058
- }
2059
- }
2060
-
2061
- /**
2062
- * Get the worker logs directory path
2063
- */
2064
- export function getWorkerLogsDir(projectRoot: string): string {
2065
- const paths = getProjectPaths(projectRoot);
2066
- return path.join(paths.teamDir, 'worker-logs');
2067
- }