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