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,2051 +0,0 @@
1
- /**
2
- * Agent Relay Daemon Server
3
- * Main entry point for the relay daemon.
4
- */
5
-
6
- import net from 'node:net';
7
- import fs from 'node:fs';
8
- import path from 'node:path';
9
- import os from 'node:os';
10
- import { createRequire } from 'node:module';
11
- import { Connection, type ConnectionConfig, DEFAULT_CONFIG } from './connection.js';
12
- import { Router } from './router.js';
13
- import {
14
- PROTOCOL_VERSION,
15
- type Envelope,
16
- type ShadowBindPayload,
17
- type ShadowUnbindPayload,
18
- type LogPayload,
19
- type SendEnvelope,
20
- type AckPayload,
21
- type ErrorPayload,
22
- type SpawnPayload,
23
- type ReleasePayload,
24
- type StatusResponsePayload,
25
- type InboxPayload,
26
- type InboxResponsePayload,
27
- type MessagesQueryPayload,
28
- type MessagesResponsePayload,
29
- type ListAgentsPayload,
30
- type ListAgentsResponsePayload,
31
- type ListConnectedAgentsPayload,
32
- type ListConnectedAgentsResponsePayload,
33
- type RemoveAgentPayload,
34
- type RemoveAgentResponsePayload,
35
- type HealthPayload,
36
- type HealthResponsePayload,
37
- type MetricsPayload,
38
- type MetricsResponsePayload,
39
- type AgentReadyPayload,
40
- type SendInputPayload,
41
- type SetModelPayload,
42
- type ListWorkersPayload,
43
- } from '@agent-relay/protocol/types';
44
- import type { ChannelJoinPayload, ChannelLeavePayload, ChannelMessagePayload } from '@agent-relay/protocol/channels';
45
- import { SpawnManager, type SpawnManagerConfig } from './spawn-manager.js';
46
- import { createStorageAdapter, type StorageAdapter, type StorageConfig, type StorageHealth } from '@agent-relay/storage/adapter';
47
- import { getProjectPaths, saveRuntimeConfig, clearRuntimeConfig } from '@agent-relay/config';
48
- import { AgentRegistry } from './agent-registry.js';
49
- import { daemonLog as log } from '@agent-relay/utils/logger';
50
- import { getCloudSync, type CloudSyncService, type RemoteAgent, type CrossMachineMessage, type AgentMetricsProvider } from './cloud-sync.js';
51
- import { getMemoryMonitor } from '@agent-relay/resiliency';
52
- import { generateId } from '@agent-relay/wrapper';
53
- import {
54
- ConsensusIntegration,
55
- createConsensusIntegration,
56
- type ConsensusIntegrationConfig,
57
- } from './consensus-integration.js';
58
- import type { ChannelMembershipStore } from './channel-membership-store.js';
59
- import {
60
- initTelemetry,
61
- track,
62
- shutdown as shutdownTelemetry,
63
- } from '@agent-relay/telemetry';
64
-
65
- // Get version: prefer build-time injected version (for standalone binaries), fall back to package.json
66
- const DAEMON_VERSION: string = (() => {
67
- const envVersion = process.env.AGENT_RELAY_VERSION;
68
- if (envVersion) return envVersion;
69
- try {
70
- const require = createRequire(import.meta.url);
71
- const packageJson = require('../package.json');
72
- return packageJson.version as string;
73
- } catch {
74
- return 'unknown';
75
- }
76
- })();
77
-
78
- export interface DaemonConfig extends ConnectionConfig {
79
- socketPath: string;
80
- pidFilePath: string;
81
- storagePath?: string;
82
- storageAdapter?: StorageAdapter;
83
- /** Storage configuration (type, path, url) */
84
- storageConfig?: StorageConfig;
85
- /** Directory for team data (agents.json, etc.) */
86
- teamDir?: string;
87
- /** Enable cloud sync for cross-machine agent communication */
88
- cloudSync?: boolean;
89
- /** Cloud API URL (defaults to https://agent-relay.com) */
90
- cloudUrl?: string;
91
- /** Consensus mechanism for multi-agent decisions (enabled by default, set to false to disable) */
92
- consensus?: boolean | Partial<ConsensusIntegrationConfig>;
93
- /** Enable protocol-based spawning via SPAWN/RELEASE messages */
94
- spawnManager?: boolean | Partial<SpawnManagerConfig>;
95
- }
96
-
97
- export const DEFAULT_SOCKET_PATH = '/tmp/agent-relay.sock';
98
-
99
- export const DEFAULT_DAEMON_CONFIG: DaemonConfig = {
100
- ...DEFAULT_CONFIG,
101
- socketPath: DEFAULT_SOCKET_PATH,
102
- pidFilePath: `${DEFAULT_SOCKET_PATH}.pid`,
103
- };
104
-
105
- interface PendingAck {
106
- correlationId: string;
107
- connectionId: string;
108
- connection: Connection;
109
- timeoutHandle: NodeJS.Timeout;
110
- }
111
-
112
- export class Daemon {
113
- private server: net.Server;
114
- private router!: Router;
115
- private config: DaemonConfig;
116
- private running = false;
117
- private connections: Set<Connection> = new Set();
118
- private pendingAcks: Map<string, PendingAck> = new Map();
119
- private storage?: StorageAdapter;
120
- private storageInitialized = false;
121
- private registry?: AgentRegistry;
122
- private processingStateInterval?: NodeJS.Timeout;
123
- private cloudSync?: CloudSyncService;
124
- private remoteAgents: RemoteAgent[] = [];
125
- private remoteUsers: RemoteAgent[] = [];
126
- private consensus?: ConsensusIntegration;
127
- private cloudSyncDebounceTimer?: NodeJS.Timeout;
128
- private spawnManager?: SpawnManager;
129
- private shuttingDown = false;
130
- private storageHealth?: StorageHealth;
131
-
132
- /** Telemetry tracking */
133
- private startTime?: number;
134
- private agentSpawnCount = 0;
135
-
136
- /** Callback for log output from agents (used by dashboard for streaming) */
137
- onLogOutput?: (agentName: string, data: string, timestamp: number) => void;
138
-
139
- /** Interval for writing processing state file (500ms for responsive UI) */
140
- private static readonly PROCESSING_STATE_INTERVAL_MS = 500;
141
- private static readonly DEFAULT_SYNC_TIMEOUT_MS = 30000;
142
-
143
- constructor(config: Partial<DaemonConfig> = {}) {
144
- this.config = { ...DEFAULT_DAEMON_CONFIG, ...config };
145
- if (config.socketPath && !config.pidFilePath) {
146
- this.config.pidFilePath = `${config.socketPath}.pid`;
147
- }
148
- // Default teamDir to same directory as socket, but avoid /tmp directly
149
- // because macOS can clean temp files causing atomic write failures
150
- if (!this.config.teamDir) {
151
- const socketDir = path.dirname(this.config.socketPath);
152
- // If socket is in /tmp or /private/tmp, use a subdirectory
153
- if (socketDir === '/tmp' || socketDir === '/private/tmp') {
154
- this.config.teamDir = path.join(socketDir, 'agent-relay-state');
155
- } else {
156
- this.config.teamDir = socketDir;
157
- }
158
- }
159
- if (this.config.teamDir) {
160
- this.registry = new AgentRegistry(this.config.teamDir);
161
- }
162
- // SpawnManager is initialized in start() after router is created
163
- // so we can wire up onMarkSpawning/onClearSpawning callbacks
164
- // Storage is initialized lazily in start() to support async createStorageAdapter
165
- this.server = net.createServer(this.handleConnection.bind(this));
166
- }
167
-
168
- /**
169
- * Write current agents to agents.json for dashboard consumption.
170
- */
171
- private writeAgentsFile(): void {
172
- if (!this.registry) return;
173
- // The registry persists on every update; this is a no-op helper for symmetry.
174
- const agents = this.registry.getAgents();
175
- try {
176
- const targetDir = this.config.teamDir ?? path.dirname(this.config.socketPath);
177
- const targetPath = path.join(targetDir, 'agents.json');
178
- // Ensure directory exists (defensive - may have been deleted)
179
- if (!fs.existsSync(targetDir)) {
180
- fs.mkdirSync(targetDir, { recursive: true });
181
- }
182
- const data = JSON.stringify({ agents }, null, 2);
183
- // Write atomically: write to temp file first, then rename
184
- // This prevents race conditions where readers see partial/empty data
185
- const tempPath = `${targetPath}.tmp`;
186
- fs.writeFileSync(tempPath, data, 'utf-8');
187
- fs.renameSync(tempPath, targetPath);
188
- } catch (err) {
189
- log.error('Failed to write agents.json', { error: String(err) });
190
- }
191
- }
192
-
193
- /**
194
- * Write processing state to processing-state.json for dashboard consumption.
195
- * This file contains agents currently processing/thinking after receiving a message.
196
- */
197
- private writeProcessingStateFile(): void {
198
- // Skip writes during shutdown to avoid race conditions with directory cleanup
199
- if (this.shuttingDown) return;
200
-
201
- try {
202
- const processingAgents = this.router.getProcessingAgents();
203
- const targetDir = this.config.teamDir ?? path.dirname(this.config.socketPath);
204
- const targetPath = path.join(targetDir, 'processing-state.json');
205
- // Ensure directory exists (defensive - may have been deleted)
206
- if (!fs.existsSync(targetDir)) {
207
- fs.mkdirSync(targetDir, { recursive: true });
208
- }
209
- const data = JSON.stringify({ processingAgents, updatedAt: Date.now() }, null, 2);
210
- const tempPath = `${targetPath}.tmp`;
211
- fs.writeFileSync(tempPath, data, 'utf-8');
212
- fs.renameSync(tempPath, targetPath);
213
- } catch (err) {
214
- // Suppress ENOENT errors during shutdown race conditions
215
- if (!this.shuttingDown) {
216
- log.error('Failed to write processing-state.json', { error: String(err) });
217
- }
218
- }
219
- }
220
-
221
- /**
222
- * Write currently connected agents to connected-agents.json for CLI consumption.
223
- * This file contains agents with active socket connections (vs agents.json which is historical).
224
- */
225
- private writeConnectedAgentsFile(): void {
226
- try {
227
- const connectedAgents = this.router.getAgents();
228
- const connectedUsers = this.router.getUsers();
229
- const targetDir = this.config.teamDir ?? path.dirname(this.config.socketPath);
230
- const targetPath = path.join(targetDir, 'connected-agents.json');
231
-
232
- // Debug: log what we're writing
233
- log.info('Writing connected-agents.json', {
234
- agents: connectedAgents.join(','),
235
- path: targetPath,
236
- teamDir: this.config.teamDir,
237
- });
238
-
239
- // Ensure directory exists (defensive - may have been deleted)
240
- if (!fs.existsSync(targetDir)) {
241
- fs.mkdirSync(targetDir, { recursive: true });
242
- }
243
- const data = JSON.stringify({
244
- agents: connectedAgents,
245
- users: connectedUsers,
246
- updatedAt: Date.now(),
247
- }, null, 2);
248
- const tempPath = `${targetPath}.tmp`;
249
- fs.writeFileSync(tempPath, data, 'utf-8');
250
- fs.renameSync(tempPath, targetPath);
251
- } catch (err) {
252
- log.error('Failed to write connected-agents.json', { error: String(err) });
253
- }
254
- }
255
-
256
- /**
257
- * Mark an agent as spawning (before HELLO completes).
258
- * Messages sent to this agent will be queued for delivery after registration.
259
- * Call this before starting the agent's PTY process.
260
- */
261
- markSpawning(agentName: string): void {
262
- this.router.markSpawning(agentName);
263
- }
264
-
265
- /**
266
- * Clear the spawning flag for an agent.
267
- * Called when spawn fails or is cancelled (successful registration clears automatically).
268
- */
269
- clearSpawning(agentName: string): void {
270
- this.router.clearSpawning(agentName);
271
- }
272
-
273
- /**
274
- * Remove a stale agent from the router (used when process dies without clean disconnect).
275
- * This is called by the orchestrator's health monitoring when a PID is detected as dead.
276
- */
277
- removeStaleAgent(agentName: string): boolean {
278
- const removed = this.router.forceRemoveAgent(agentName);
279
- if (removed) {
280
- // Notify cloud sync about agent removal
281
- this.notifyCloudSync();
282
- // Update connected-agents.json to reflect the removal
283
- this.writeConnectedAgentsFile();
284
- log.info('Removed stale agent from router', { agentName });
285
- }
286
- return removed;
287
- }
288
-
289
- /**
290
- * Initialize storage adapter (called during start).
291
- */
292
- private async initStorage(): Promise<void> {
293
- if (this.storageInitialized) return;
294
-
295
- if (this.config.storageAdapter) {
296
- // Use explicitly provided adapter
297
- this.storage = this.config.storageAdapter;
298
- } else {
299
- // Create adapter based on config/env
300
- const storagePath = this.config.storagePath ??
301
- path.join(path.dirname(this.config.socketPath), 'agent-relay.sqlite');
302
- this.storage = await createStorageAdapter(storagePath, this.config.storageConfig);
303
- }
304
-
305
- let channelMembershipStore: ChannelMembershipStore | undefined;
306
- const workspaceId = process.env.RELAY_WORKSPACE_ID
307
- || process.env.AGENT_RELAY_WORKSPACE_ID
308
- || process.env.WORKSPACE_ID;
309
- const databaseUrl = process.env.CLOUD_DATABASE_URL
310
- || process.env.DATABASE_URL
311
- || process.env.AGENT_RELAY_STORAGE_URL;
312
- const isPostgresUrl = databaseUrl?.startsWith('postgres://') || databaseUrl?.startsWith('postgresql://');
313
-
314
- if (workspaceId && isPostgresUrl && databaseUrl) {
315
- try {
316
- const { CloudChannelMembershipStore } = await import('./channel-membership-store.js');
317
- channelMembershipStore = new CloudChannelMembershipStore({ workspaceId, databaseUrl });
318
- log.info('Channel membership store enabled (cloud DB)', { workspaceId });
319
- } catch (err) {
320
- log.error('Failed to initialize channel membership store', { error: String(err) });
321
- }
322
- } else {
323
- log.debug('Channel membership store disabled (missing workspaceId or Postgres database URL)');
324
- }
325
-
326
- this.router = new Router({
327
- storage: this.storage,
328
- registry: this.registry,
329
- onProcessingStateChange: () => this.writeProcessingStateFile(),
330
- crossMachineHandler: {
331
- sendCrossMachineMessage: this.sendCrossMachineMessage.bind(this),
332
- isRemoteAgent: this.isRemoteAgent.bind(this),
333
- isRemoteUser: this.isRemoteUser.bind(this),
334
- },
335
- channelMembershipStore,
336
- });
337
-
338
- // Initialize SpawnManager if enabled (after router, so we can wire callbacks)
339
- if (this.config.spawnManager) {
340
- const spawnConfig = typeof this.config.spawnManager === 'object'
341
- ? this.config.spawnManager
342
- : {};
343
- // Derive projectRoot from teamDir (teamDir is typically {projectRoot}/.agent-relay/)
344
- const projectRoot = spawnConfig.projectRoot || path.dirname(this.config.teamDir || this.config.socketPath);
345
- this.spawnManager = new SpawnManager({
346
- projectRoot,
347
- socketPath: this.config.socketPath,
348
- ...spawnConfig,
349
- // Track spawn count for telemetry
350
- onAgentSpawn: () => {
351
- this.agentSpawnCount++;
352
- },
353
- // Wire spawn tracking to router so messages are queued during spawn
354
- onMarkSpawning: (name: string) => this.router.markSpawning(name),
355
- onClearSpawning: (name: string) => this.router.clearSpawning(name),
356
- // Fallback for releasing agents not spawned by this instance
357
- onReleaseFallback: async (agentName: string, _reason?: string): Promise<boolean> => {
358
- // Check if agent is connected to the router
359
- if (this.router.forceRemoveAgent(agentName)) {
360
- log.info(`Release fallback: force-disconnected agent ${agentName}`);
361
- // Also clean up from storage if available
362
- if (this.storage?.removeAgent) {
363
- try {
364
- await this.storage.removeAgent(agentName);
365
- } catch (err) {
366
- log.warn(`Failed to remove agent ${agentName} from storage:`, { error: String(err) });
367
- }
368
- }
369
- return true;
370
- }
371
- return false;
372
- },
373
- });
374
- log.info('SpawnManager initialized with spawn tracking callbacks');
375
- }
376
-
377
- // Initialize consensus (enabled by default, can be disabled with consensus: false)
378
- if (this.config.consensus !== false) {
379
- const consensusConfig = typeof this.config.consensus === 'object'
380
- ? this.config.consensus
381
- : {};
382
-
383
- this.consensus = createConsensusIntegration(this.router, consensusConfig);
384
- log.info('Consensus mechanism enabled');
385
- }
386
-
387
- this.storageInitialized = true;
388
- }
389
-
390
- /**
391
- * Start the daemon.
392
- */
393
- async start(): Promise<void> {
394
- if (this.running) return;
395
-
396
- // Initialize telemetry (don't show notice - CLI handles that)
397
- initTelemetry({ showNotice: false });
398
- this.startTime = Date.now();
399
- this.agentSpawnCount = 0;
400
-
401
- // Initialize storage
402
- await this.initStorage();
403
-
404
- // Storage health check: warn if non-persistent (e.g., in-memory fallback)
405
- try {
406
- if (this.storage?.healthCheck) {
407
- this.storageHealth = await this.storage.healthCheck();
408
- if (!this.storageHealth.persistent) {
409
- console.warn('[daemon] ⚠️ Running in non-persistent mode!');
410
- console.warn('[daemon] Messages will be lost on restart.');
411
- }
412
- }
413
- } catch (err) {
414
- log.warn('Storage health check failed', { error: String(err) });
415
- }
416
-
417
- // Save runtime config so CLI commands can use the same storage type
418
- try {
419
- saveRuntimeConfig({
420
- storageType: this.storageHealth?.driver ?? this.config.storageConfig?.type ?? 'jsonl',
421
- daemonPid: process.pid,
422
- startedAt: new Date().toISOString(),
423
- version: DAEMON_VERSION,
424
- });
425
- } catch (err) {
426
- log.warn('Failed to save runtime config', { error: String(err) });
427
- }
428
-
429
- // Restore channel memberships from persisted storage (cloud DB or SQLite)
430
- await this.router.restoreChannelMemberships();
431
-
432
- // Initialize cloud sync if configured
433
- await this.initCloudSync();
434
-
435
- // Clean up stale socket (symlinks, sockets OK — refuse regular files)
436
- // Use lstatSync directly to detect broken symlinks (existsSync follows
437
- // symlinks and returns false for dangling ones, leaving them uncleaned)
438
- let lstat: fs.Stats | null = null;
439
- try {
440
- lstat = fs.lstatSync(this.config.socketPath);
441
- } catch {
442
- // ENOENT — nothing at this path, proceed to listen
443
- }
444
- if (lstat) {
445
- if (lstat.isSymbolicLink()) {
446
- // Symlinks (e.g., /tmp/agent-relay.sock -> project/.agent-relay/relay.sock)
447
- // are safe to replace — they don't destroy the target
448
- fs.unlinkSync(this.config.socketPath);
449
- } else if (lstat.isSocket()) {
450
- // Check if socket is actively in use by another daemon
451
- const alive = await new Promise<boolean>((resolve) => {
452
- const client = net.createConnection(this.config.socketPath);
453
- client.on('connect', () => { client.destroy(); resolve(true); });
454
- client.on('error', () => resolve(false));
455
- });
456
- if (alive) {
457
- throw new Error(
458
- `Another daemon is already listening on ${this.config.socketPath}`
459
- );
460
- }
461
- fs.unlinkSync(this.config.socketPath);
462
- } else {
463
- throw new Error(
464
- `Refusing to unlink non-socket at ${this.config.socketPath}`
465
- );
466
- }
467
- }
468
-
469
- // Clean up stale mcp-identity-* files from previous runs
470
- // These are left behind when agents crash or aren't cleaned up properly
471
- const dataDir = path.dirname(this.config.socketPath);
472
- try {
473
- const files = fs.readdirSync(dataDir);
474
- for (const file of files) {
475
- if (file.startsWith('mcp-identity-')) {
476
- const match = file.match(/mcp-identity-(\d+)/);
477
- if (match) {
478
- const identityPid = parseInt(match[1], 10);
479
- // Check if process is still running
480
- let isRunning = false;
481
- try {
482
- process.kill(identityPid, 0);
483
- isRunning = true;
484
- } catch {
485
- // Process not running
486
- }
487
- if (!isRunning) {
488
- const identityPath = path.join(dataDir, file);
489
- fs.unlinkSync(identityPath);
490
- log.info('Cleaned up stale identity file', { file });
491
- }
492
- }
493
- }
494
- }
495
- } catch (err) {
496
- log.warn('Failed to clean up stale identity files', { error: String(err) });
497
- }
498
-
499
- // Ensure socket directory exists
500
- const socketDir = path.dirname(this.config.socketPath);
501
- if (!fs.existsSync(socketDir)) {
502
- fs.mkdirSync(socketDir, { recursive: true });
503
- }
504
-
505
- // Ensure team directory exists for state files (agents.json, processing-state.json, etc.)
506
- // Always check and create, even if same as socketDir, to handle edge cases
507
- const teamDir = this.config.teamDir ?? socketDir;
508
- if (!fs.existsSync(teamDir)) {
509
- fs.mkdirSync(teamDir, { recursive: true });
510
- }
511
-
512
- // Set up inbox symlink for workspace namespacing
513
- // Daemon delivers to legacy path (/tmp/relay-inbox), symlink points to workspace path
514
- // This allows agents to use simple instructions while maintaining workspace isolation
515
- const workspaceId = process.env.RELAY_WORKSPACE_ID
516
- || process.env.AGENT_RELAY_WORKSPACE_ID
517
- || process.env.WORKSPACE_ID;
518
-
519
- const legacyInboxPath = '/tmp/relay-inbox';
520
- let inboxPath = legacyInboxPath;
521
-
522
- if (workspaceId) {
523
- // Workspace-namespaced inbox directory
524
- inboxPath = `/tmp/relay/${workspaceId}/inbox`;
525
-
526
- try {
527
- // Ensure workspace inbox directory exists
528
- const inboxDir = path.dirname(inboxPath);
529
- if (!fs.existsSync(inboxDir)) {
530
- fs.mkdirSync(inboxDir, { recursive: true });
531
- }
532
- if (!fs.existsSync(inboxPath)) {
533
- fs.mkdirSync(inboxPath, { recursive: true });
534
- }
535
-
536
- // Ensure legacy inbox parent directory exists
537
- const legacyInboxParent = path.dirname(legacyInboxPath);
538
- if (!fs.existsSync(legacyInboxParent)) {
539
- fs.mkdirSync(legacyInboxParent, { recursive: true });
540
- }
541
-
542
- // Create symlink from legacy path to workspace path
543
- // If legacy path exists as a regular directory, remove it first
544
- if (fs.existsSync(legacyInboxPath)) {
545
- try {
546
- const stats = fs.lstatSync(legacyInboxPath);
547
- if (stats.isSymbolicLink()) {
548
- // Already a symlink - remove and recreate to ensure correct target
549
- fs.unlinkSync(legacyInboxPath);
550
- } else if (stats.isDirectory()) {
551
- // Regular directory - remove it (may have stale files from previous run)
552
- fs.rmSync(legacyInboxPath, { recursive: true, force: true });
553
- }
554
- } catch {
555
- // Ignore errors during cleanup
556
- }
557
- }
558
-
559
- // Create the symlink: legacy path -> workspace path
560
- fs.symlinkSync(inboxPath, legacyInboxPath);
561
- log.info('Created inbox symlink', { from: legacyInboxPath, to: inboxPath });
562
- } catch (err: any) {
563
- log.error('Failed to set up inbox symlink', { error: err.message });
564
- // Fall back to creating legacy directory directly
565
- try {
566
- if (!fs.existsSync(legacyInboxPath)) {
567
- fs.mkdirSync(legacyInboxPath, { recursive: true });
568
- }
569
- } catch {
570
- // Ignore
571
- }
572
- }
573
- } else {
574
- // No workspace ID - just ensure legacy inbox directory exists
575
- try {
576
- if (!fs.existsSync(legacyInboxPath)) {
577
- fs.mkdirSync(legacyInboxPath, { recursive: true });
578
- }
579
- } catch (err: any) {
580
- log.error('Failed to create inbox directory', { error: err.message });
581
- }
582
- }
583
-
584
- return new Promise((resolve, reject) => {
585
- this.server.on('error', reject);
586
- this.server.listen(this.config.socketPath, () => {
587
- this.running = true;
588
- // Set restrictive permissions
589
- fs.chmodSync(this.config.socketPath, 0o600);
590
- fs.writeFileSync(this.config.pidFilePath, `${process.pid}\n`, 'utf-8');
591
-
592
- // Start periodic processing state updates for dashboard
593
- this.processingStateInterval = setInterval(() => {
594
- this.writeProcessingStateFile();
595
- }, Daemon.PROCESSING_STATE_INTERVAL_MS);
596
-
597
- // Write active daemon marker for cross-cwd discovery
598
- try {
599
- const markerDir = path.join(os.homedir(), '.agent-relay');
600
- if (!fs.existsSync(markerDir)) {
601
- fs.mkdirSync(markerDir, { recursive: true });
602
- }
603
- // Derive projectRoot from socket path (e.g., /project/.agent-relay/relay.sock -> /project)
604
- // Only valid for project-namespaced sockets, not the default /tmp/agent-relay.sock
605
- const socketDir = path.dirname(this.config.socketPath);
606
- const isProjectSocket = path.basename(socketDir) === '.agent-relay';
607
- const projectRoot = isProjectSocket ? path.dirname(socketDir) : undefined;
608
- const markerData = JSON.stringify({
609
- socketPath: this.config.socketPath,
610
- ...(projectRoot && { projectRoot }),
611
- pid: process.pid,
612
- startedAt: new Date().toISOString(),
613
- }, null, 2);
614
- fs.writeFileSync(path.join(markerDir, 'active-daemon.json'), markerData, 'utf-8');
615
- } catch (err) {
616
- log.warn('Failed to write active daemon marker', { error: String(err) });
617
- }
618
-
619
- // Track daemon start
620
- track('daemon_start', {});
621
-
622
- log.info('Listening', { socketPath: this.config.socketPath });
623
- resolve();
624
- });
625
- });
626
- }
627
-
628
- /**
629
- * Initialize cloud sync service for cross-machine agent communication.
630
- */
631
- private async initCloudSync(): Promise<void> {
632
- // Check for cloud config file OR environment variables
633
- const dataDir = process.env.AGENT_RELAY_DATA_DIR ||
634
- path.join(os.homedir(), '.local', 'share', 'agent-relay');
635
- const configPath = path.join(dataDir, 'cloud-config.json');
636
-
637
- const hasConfigFile = fs.existsSync(configPath);
638
- const hasEnvApiKey = !!process.env.AGENT_RELAY_API_KEY;
639
-
640
- // Allow cloud sync if config file exists OR API key is set via env var
641
- // This enables cloud-hosted workspaces (Fly.io) to sync messages without a config file
642
- if (!hasConfigFile && !hasEnvApiKey) {
643
- log.info('Cloud sync disabled (not linked to cloud)');
644
- return;
645
- }
646
-
647
- try {
648
- let apiKey: string | undefined;
649
- let cloudUrl: string | undefined;
650
-
651
- if (hasConfigFile) {
652
- // Use config file (local daemons linked via CLI)
653
- const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
654
- apiKey = config.apiKey;
655
- cloudUrl = config.cloudUrl;
656
- } else {
657
- // Use env vars (cloud-hosted workspaces like Fly.io)
658
- apiKey = process.env.AGENT_RELAY_API_KEY;
659
- // CLOUD_API_URL is set by Fly.io provisioner, AGENT_RELAY_CLOUD_URL is the standard
660
- cloudUrl = process.env.AGENT_RELAY_CLOUD_URL || process.env.CLOUD_API_URL;
661
- log.info('Using environment variables for cloud sync', { hasApiKey: !!apiKey, hasCloudUrl: !!cloudUrl });
662
- }
663
-
664
- // Get project root for workspace detection via git remote
665
- const projectPaths = getProjectPaths();
666
-
667
- this.cloudSync = getCloudSync({
668
- apiKey,
669
- cloudUrl: cloudUrl || this.config.cloudUrl,
670
- enabled: this.config.cloudSync !== false,
671
- projectDirectory: projectPaths.projectRoot,
672
- });
673
-
674
- // Listen for remote agent updates
675
- this.cloudSync.on('remote-agents-updated', (agents: RemoteAgent[]) => {
676
- this.remoteAgents = agents;
677
- log.info('Remote agents updated', { count: agents.length });
678
- this.writeRemoteAgentsFile();
679
- });
680
-
681
- // Listen for remote user updates (humans connected via cloud dashboard)
682
- this.cloudSync.on('remote-users-updated', (users: RemoteAgent[]) => {
683
- this.remoteUsers = users;
684
- log.info('Remote users updated', { count: users.length });
685
- this.writeRemoteUsersFile();
686
- });
687
-
688
- // Listen for cross-machine messages
689
- this.cloudSync.on('cross-machine-message', (msg: CrossMachineMessage) => {
690
- this.handleCrossMachineMessage(msg);
691
- });
692
-
693
- // Listen for cloud commands (e.g., credential refresh)
694
- this.cloudSync.on('command', (cmd: { type: string; payload: unknown }) => {
695
- log.info('Cloud command received', { type: cmd.type });
696
- // Handle commands like credential updates, config changes, etc.
697
- });
698
-
699
- await this.cloudSync.start();
700
-
701
- // Set storage adapter for message sync to cloud
702
- if (this.storage) {
703
- this.cloudSync.setStorage(this.storage);
704
- }
705
-
706
- // Set metrics provider for agent metrics sync to cloud
707
- // Uses the singleton memory monitor from @agent-relay/resiliency
708
- const memoryMonitor = getMemoryMonitor();
709
- const metricsProvider: AgentMetricsProvider = {
710
- getAll: () => {
711
- return memoryMonitor.getAll().map(m => ({
712
- name: m.name,
713
- pid: m.pid,
714
- status: m.alertLevel === 'normal' ? 'running' : m.alertLevel,
715
- rssBytes: m.current.rssBytes,
716
- heapUsedBytes: m.current.heapUsedBytes,
717
- heapTotalBytes: m.current.heapTotalBytes,
718
- cpuPercent: m.current.cpuPercent,
719
- trend: m.trend,
720
- trendRatePerMinute: m.trendRatePerMinute,
721
- alertLevel: m.alertLevel,
722
- highWatermark: m.highWatermark,
723
- averageRss: m.averageRss,
724
- uptimeMs: m.uptimeMs,
725
- startedAt: m.startedAt,
726
- }));
727
- },
728
- };
729
- this.cloudSync.setMetricsProvider(metricsProvider);
730
-
731
- log.info('Cloud sync enabled');
732
- } catch (err) {
733
- log.error('Failed to initialize cloud sync', { error: String(err) });
734
- }
735
- }
736
-
737
- /**
738
- * Write remote agents to file for dashboard consumption.
739
- */
740
- private writeRemoteAgentsFile(): void {
741
- try {
742
- const targetPath = path.join(
743
- this.config.teamDir ?? path.dirname(this.config.socketPath),
744
- 'remote-agents.json'
745
- );
746
- const data = JSON.stringify({
747
- agents: this.remoteAgents,
748
- updatedAt: Date.now(),
749
- }, null, 2);
750
- const tempPath = `${targetPath}.tmp`;
751
- fs.writeFileSync(tempPath, data, 'utf-8');
752
- fs.renameSync(tempPath, targetPath);
753
- } catch (err) {
754
- log.error('Failed to write remote-agents.json', { error: String(err) });
755
- }
756
- }
757
-
758
- /**
759
- * Write remote users to file for dashboard consumption.
760
- * Remote users are humans connected via the cloud dashboard.
761
- */
762
- private writeRemoteUsersFile(): void {
763
- try {
764
- const targetPath = path.join(
765
- this.config.teamDir ?? path.dirname(this.config.socketPath),
766
- 'remote-users.json'
767
- );
768
- const data = JSON.stringify({
769
- users: this.remoteUsers,
770
- updatedAt: Date.now(),
771
- }, null, 2);
772
- const tempPath = `${targetPath}.tmp`;
773
- fs.writeFileSync(tempPath, data, 'utf-8');
774
- fs.renameSync(tempPath, targetPath);
775
- } catch (err) {
776
- log.error('Failed to write remote-users.json', { error: String(err) });
777
- }
778
- }
779
-
780
- /**
781
- * Handle incoming message from another machine via cloud.
782
- */
783
- private handleCrossMachineMessage(msg: CrossMachineMessage): void {
784
- log.info('Cross-machine message received', {
785
- from: `${msg.from.daemonName}:${msg.from.agent}`,
786
- to: msg.to,
787
- });
788
-
789
- // Handle spawn commands from cloud
790
- if (msg.to === '__spawner__' && msg.metadata?.type === 'spawn_command') {
791
- this.handleCloudSpawnCommand(msg);
792
- return;
793
- }
794
-
795
- // Find local agent
796
- const targetConnection = Array.from(this.connections).find(
797
- c => c.agentName === msg.to
798
- );
799
-
800
- if (!targetConnection) {
801
- log.warn('Target agent not found locally', { agent: msg.to });
802
- return;
803
- }
804
-
805
- // Inject message to local agent
806
- const envelope: SendEnvelope = {
807
- v: 1,
808
- type: 'SEND',
809
- id: generateId(),
810
- ts: Date.now(),
811
- from: `${msg.from.daemonName}:${msg.from.agent}`,
812
- to: msg.to,
813
- payload: {
814
- kind: 'message',
815
- body: msg.content,
816
- data: {
817
- _crossMachine: true,
818
- _fromDaemon: msg.from.daemonId,
819
- _fromDaemonName: msg.from.daemonName,
820
- ...msg.metadata,
821
- },
822
- },
823
- };
824
-
825
- this.router.route(targetConnection, envelope);
826
- }
827
-
828
- /**
829
- * Handle a spawn command received from the cloud (e.g., Slack orchestrator).
830
- * Parses the spawn_agent command and uses SpawnManager to spawn the agent locally.
831
- */
832
- private async handleCloudSpawnCommand(msg: CrossMachineMessage): Promise<void> {
833
- if (!this.spawnManager) {
834
- log.warn('Cannot handle cloud spawn command: SpawnManager not enabled');
835
- return;
836
- }
837
-
838
- try {
839
- const command = JSON.parse(msg.content) as {
840
- type: string;
841
- agentName: string;
842
- cli: string;
843
- task?: string;
844
- metadata?: Record<string, unknown>;
845
- };
846
-
847
- if (command.type !== 'spawn_agent') {
848
- log.warn('Unknown cloud spawn command type', { type: command.type });
849
- return;
850
- }
851
-
852
- log.info('Spawning agent from cloud command', {
853
- name: command.agentName,
854
- cli: command.cli,
855
- source: msg.from.agent,
856
- });
857
-
858
- const spawner = this.spawnManager.getSpawner();
859
- const result = await spawner.spawn({
860
- name: command.agentName,
861
- cli: command.cli,
862
- task: command.task || 'You were spawned by the cloud orchestrator. Check your inbox for messages.',
863
- spawnerName: msg.from.agent,
864
- });
865
-
866
- if (result.success) {
867
- log.info('Cloud-spawned agent started', {
868
- name: command.agentName,
869
- pid: result.pid,
870
- });
871
- } else {
872
- log.error('Cloud spawn failed', {
873
- name: command.agentName,
874
- error: result.error,
875
- });
876
- }
877
- } catch (err: unknown) {
878
- const error = err instanceof Error ? err.message : String(err);
879
- log.error('Failed to parse cloud spawn command', { error });
880
- }
881
- }
882
-
883
- /**
884
- * Send message to agent on another machine via cloud.
885
- */
886
- async sendCrossMachineMessage(
887
- targetDaemonId: string,
888
- targetAgent: string,
889
- fromAgent: string,
890
- content: string,
891
- metadata?: Record<string, unknown>
892
- ): Promise<boolean> {
893
- if (!this.cloudSync?.isConnected()) {
894
- log.warn('Cannot send cross-machine message: not connected to cloud');
895
- return false;
896
- }
897
-
898
- try {
899
- await this.cloudSync.sendCrossMachineMessage(
900
- targetDaemonId,
901
- targetAgent,
902
- fromAgent,
903
- content,
904
- metadata
905
- );
906
- return true;
907
- } catch (err) {
908
- log.error('Failed to send cross-machine message', { error: String(err) });
909
- return false;
910
- }
911
- }
912
-
913
- /**
914
- * Get list of remote agents (from other machines).
915
- */
916
- getRemoteAgents(): RemoteAgent[] {
917
- return this.remoteAgents;
918
- }
919
-
920
- /**
921
- * Check if an agent is on a remote machine.
922
- */
923
- isRemoteAgent(agentName: string): RemoteAgent | undefined {
924
- return this.remoteAgents.find(a => a.name === agentName);
925
- }
926
-
927
- /**
928
- * Check if a user is on a remote machine (connected via cloud dashboard).
929
- */
930
- isRemoteUser(userName: string): RemoteAgent | undefined {
931
- return this.remoteUsers.find(u => u.name === userName);
932
- }
933
-
934
- /**
935
- * Notify cloud sync about local agent changes.
936
- * Debounced to prevent flooding the cloud API with rapid connect/disconnect events.
937
- */
938
- private notifyCloudSync(): void {
939
- if (!this.cloudSync?.isConnected()) return;
940
-
941
- // Debounce: clear any pending sync and schedule a new one
942
- if (this.cloudSyncDebounceTimer) {
943
- clearTimeout(this.cloudSyncDebounceTimer);
944
- }
945
-
946
- this.cloudSyncDebounceTimer = setTimeout(() => {
947
- this.cloudSyncDebounceTimer = undefined;
948
- this.doCloudSync();
949
- }, 1000); // 1 second debounce
950
- }
951
-
952
- /**
953
- * Actually perform the cloud sync (called after debounce).
954
- */
955
- private doCloudSync(): void {
956
- if (!this.cloudSync?.isConnected()) return;
957
-
958
- // Get AI agents (exclude internal ones like Dashboard)
959
- const aiAgents = Array.from(this.connections)
960
- .filter(c => {
961
- if (!c.agentName) return false;
962
- if (c.entityType === 'user') return false;
963
- if (this.isInternalAgent(c.agentName)) return false;
964
- return true;
965
- })
966
- .map(c => ({
967
- name: c.agentName!,
968
- status: 'online',
969
- isHuman: false,
970
- }));
971
-
972
- // Get human users (entityType === 'user', exclude Dashboard)
973
- const humanUsers = Array.from(this.connections)
974
- .filter(c => {
975
- if (!c.agentName) return false;
976
- if (c.entityType !== 'user') return false;
977
- if (this.isInternalAgent(c.agentName)) return false;
978
- return true;
979
- })
980
- .map(c => ({
981
- name: c.agentName!,
982
- status: 'online',
983
- isHuman: true,
984
- avatarUrl: c.avatarUrl,
985
- }));
986
-
987
- this.cloudSync.updateAgents([...aiAgents, ...humanUsers]);
988
- }
989
-
990
- /**
991
- * Check if an agent is internal (should be hidden from cloud sync and listings).
992
- */
993
- private isInternalAgent(name: string): boolean {
994
- if (name.startsWith('__')) return true;
995
- // Dashboard and cli are internal system agents
996
- return name === 'Dashboard' || name === 'cli';
997
- }
998
-
999
- /**
1000
- * Stop the daemon.
1001
- */
1002
- async stop(): Promise<void> {
1003
- if (!this.running) return;
1004
-
1005
- // Mark as shutting down to prevent race conditions with state file writes
1006
- this.shuttingDown = true;
1007
-
1008
- // Track daemon stop
1009
- const uptimeSeconds = this.startTime
1010
- ? Math.floor((Date.now() - this.startTime) / 1000)
1011
- : 0;
1012
- track('daemon_stop', {
1013
- uptime_seconds: uptimeSeconds,
1014
- agent_spawn_count: this.agentSpawnCount,
1015
- });
1016
-
1017
- // Shutdown telemetry (flush pending events)
1018
- await shutdownTelemetry();
1019
-
1020
- // Stop cloud sync
1021
- if (this.cloudSync) {
1022
- this.cloudSync.stop();
1023
- this.cloudSync = undefined;
1024
- }
1025
-
1026
- // Clear cloud sync debounce timer
1027
- if (this.cloudSyncDebounceTimer) {
1028
- clearTimeout(this.cloudSyncDebounceTimer);
1029
- this.cloudSyncDebounceTimer = undefined;
1030
- }
1031
-
1032
- // Stop processing state updates
1033
- if (this.processingStateInterval) {
1034
- clearInterval(this.processingStateInterval);
1035
- this.processingStateInterval = undefined;
1036
- }
1037
-
1038
- // Close all active connections
1039
- for (const connection of this.connections) {
1040
- connection.close();
1041
- }
1042
- this.connections.clear();
1043
-
1044
- return new Promise((resolve) => {
1045
- this.server.close(() => {
1046
- this.running = false;
1047
- // Clean up socket file
1048
- if (fs.existsSync(this.config.socketPath)) {
1049
- fs.unlinkSync(this.config.socketPath);
1050
- }
1051
- // Clean up pid file
1052
- if (fs.existsSync(this.config.pidFilePath)) {
1053
- fs.unlinkSync(this.config.pidFilePath);
1054
- }
1055
- // Clear runtime config
1056
- try {
1057
- clearRuntimeConfig();
1058
- } catch {
1059
- // Ignore errors during shutdown
1060
- }
1061
- // Remove active daemon marker only if we own it
1062
- try {
1063
- const markerPath = path.join(os.homedir(), '.agent-relay', 'active-daemon.json');
1064
- if (fs.existsSync(markerPath)) {
1065
- const marker = JSON.parse(fs.readFileSync(markerPath, 'utf-8'));
1066
- if (marker.pid === process.pid) {
1067
- fs.unlinkSync(markerPath);
1068
- }
1069
- }
1070
- } catch {
1071
- // Ignore errors during shutdown
1072
- }
1073
- if (this.storage?.close) {
1074
- this.storage.close().catch((err) => {
1075
- log.error('Failed to close storage', { error: String(err) });
1076
- });
1077
- }
1078
- log.info('Stopped');
1079
- resolve();
1080
- });
1081
- });
1082
- }
1083
-
1084
- /**
1085
- * Handle new connection.
1086
- */
1087
- private handleConnection(socket: net.Socket): void {
1088
- log.debug('New connection');
1089
-
1090
- const resumeHandler = this.storage?.getSessionByResumeToken
1091
- ? async ({ agent, resumeToken }: { agent: string; resumeToken: string }) => {
1092
- const session = await this.storage!.getSessionByResumeToken!(resumeToken);
1093
- if (!session || session.agentName !== agent) return null;
1094
-
1095
- let seedSequences: Array<{ topic?: string; peer: string; seq: number }> | undefined;
1096
- if (this.storage?.getMaxSeqByStream) {
1097
- const streams = await this.storage.getMaxSeqByStream(agent, session.id);
1098
- seedSequences = streams.map(s => ({
1099
- topic: s.topic ?? 'default',
1100
- peer: s.peer,
1101
- seq: s.maxSeq,
1102
- }));
1103
- }
1104
-
1105
- return {
1106
- sessionId: session.id,
1107
- resumeToken: session.resumeToken ?? resumeToken,
1108
- seedSequences,
1109
- };
1110
- }
1111
- : undefined;
1112
-
1113
- // Provide processing state callback for heartbeat exemption
1114
- const isProcessing = (agentName: string) => this.router.isAgentProcessing(agentName);
1115
-
1116
- const connection = new Connection(socket, { ...this.config, resumeHandler, isProcessing });
1117
- this.connections.add(connection);
1118
-
1119
- connection.onMessage = (envelope: Envelope) => {
1120
- this.handleMessage(connection, envelope);
1121
- };
1122
-
1123
- connection.onAck = (envelope) => {
1124
- this.handleAck(connection, envelope);
1125
- };
1126
-
1127
- // Update lastSeen on successful heartbeat to keep agent status fresh
1128
- connection.onPong = () => {
1129
- if (connection.agentName) {
1130
- this.registry?.touch(connection.agentName);
1131
- }
1132
- };
1133
-
1134
- // Register agent when connection becomes active (after successful handshake)
1135
- connection.onActive = () => {
1136
- if (connection.agentName) {
1137
- this.router.register(connection);
1138
- log.info('Agent registered', { agent: connection.agentName });
1139
- // Registry handles persistence internally via save()
1140
- this.registry?.registerOrUpdate({
1141
- name: connection.agentName,
1142
- cli: connection.cli,
1143
- program: connection.program,
1144
- model: connection.model,
1145
- task: connection.task,
1146
- workingDirectory: connection.workingDirectory,
1147
- team: connection.team,
1148
- });
1149
-
1150
- // Auto-join all agents to #general channel
1151
- this.router.autoJoinChannel(connection.agentName, '#general');
1152
-
1153
- // Record session start
1154
- if (this.storage?.startSession) {
1155
- const projectPaths = getProjectPaths();
1156
- const storage = this.storage;
1157
- const persistSession = async (): Promise<void> => {
1158
- let startedAt = Date.now();
1159
- if (connection.isResumed && storage.getSessionByResumeToken) {
1160
- const existing = await storage.getSessionByResumeToken(connection.resumeToken);
1161
- if (existing?.startedAt) {
1162
- startedAt = existing.startedAt;
1163
- }
1164
- }
1165
-
1166
- await storage.startSession!({
1167
- id: connection.sessionId,
1168
- agentName: connection.agentName!,
1169
- cli: connection.cli,
1170
- projectId: projectPaths.projectId,
1171
- projectRoot: projectPaths.projectRoot,
1172
- startedAt,
1173
- resumeToken: connection.resumeToken,
1174
- });
1175
- };
1176
-
1177
- persistSession().catch(err => log.error('Failed to record session start', { error: String(err) }));
1178
- }
1179
- }
1180
-
1181
- // Replay pending deliveries for resumed sessions (unacked messages from previous session)
1182
- if (connection.isResumed) {
1183
- this.router.replayPending(connection).catch(err => {
1184
- log.error('Failed to replay pending messages', { error: String(err) });
1185
- });
1186
- }
1187
-
1188
- // Deliver any messages that were sent while this agent was offline
1189
- // This handles messages sent during spawn timing gaps or brief disconnections
1190
- this.router.deliverPendingMessages(connection).catch(err => {
1191
- log.error('Failed to deliver pending messages', { error: String(err) });
1192
- });
1193
-
1194
- // Auto-rejoin channels that the agent was a member of before daemon restart
1195
- // This restores channel memberships from persisted storage (cloud DB or SQLite)
1196
- if (connection.agentName) {
1197
- this.router.autoRejoinChannelsForAgent(connection.agentName).catch(err => {
1198
- log.error('Failed to auto-rejoin channels', { error: String(err) });
1199
- });
1200
- }
1201
-
1202
- // Notify cloud sync about agent changes
1203
- this.notifyCloudSync();
1204
-
1205
- // Update connected agents file for CLI
1206
- this.writeConnectedAgentsFile();
1207
-
1208
- // Broadcast AGENT_READY event to all connected clients
1209
- // This allows spawning clients to know when their spawned agent is ready
1210
- if (connection.agentName) {
1211
- this.broadcastAgentReady(connection);
1212
- }
1213
- };
1214
-
1215
- connection.onClose = () => {
1216
- log.debug('Connection closed', { agent: connection.agentName ?? connection.id });
1217
- this.connections.delete(connection);
1218
- this.clearPendingAcksForConnection(connection.id);
1219
- this.router.unregister(connection);
1220
- // Registry handles persistence internally via touch() -> save()
1221
- if (connection.agentName) {
1222
- this.registry?.touch(connection.agentName);
1223
- }
1224
-
1225
- // Record session end (disconnect - agent may still mark it closed explicitly)
1226
- if (this.storage?.endSession) {
1227
- this.storage.endSession(connection.sessionId, { closedBy: 'disconnect' })
1228
- .catch(err => log.error('Failed to record session end', { error: String(err) }));
1229
- }
1230
-
1231
- // Notify cloud sync about agent changes
1232
- this.notifyCloudSync();
1233
-
1234
- // Update connected agents file for CLI
1235
- this.writeConnectedAgentsFile();
1236
- };
1237
-
1238
- connection.onError = (error: Error) => {
1239
- log.error('Connection error', { error: error.message });
1240
- this.connections.delete(connection);
1241
- this.clearPendingAcksForConnection(connection.id);
1242
- this.router.unregister(connection);
1243
- // Registry handles persistence internally via touch() -> save()
1244
- if (connection.agentName) {
1245
- this.registry?.touch(connection.agentName);
1246
- }
1247
-
1248
- // Record session end on error
1249
- if (this.storage?.endSession) {
1250
- this.storage.endSession(connection.sessionId, { closedBy: 'error' })
1251
- .catch(err => log.error('Failed to record session end', { error: String(err) }));
1252
- }
1253
-
1254
- // Update connected agents file for CLI
1255
- this.writeConnectedAgentsFile();
1256
- };
1257
- }
1258
-
1259
- /**
1260
- * Handle incoming message from a connection.
1261
- */
1262
- private handleMessage(connection: Connection, envelope: Envelope): void {
1263
- switch (envelope.type) {
1264
- case 'SEND': {
1265
- const sendEnvelope = envelope as SendEnvelope;
1266
-
1267
- const membershipUpdate = (sendEnvelope.payload.data as { _channelMembershipUpdate?: { channel?: string; member?: string; action?: 'join' | 'leave' | 'invite' } })?._channelMembershipUpdate;
1268
- if (membershipUpdate && sendEnvelope.to === '_router') {
1269
- this.router.handleMembershipUpdate({
1270
- channel: membershipUpdate.channel ?? '',
1271
- member: membershipUpdate.member ?? '',
1272
- action: membershipUpdate.action ?? 'join',
1273
- });
1274
- return;
1275
- }
1276
-
1277
- // Check for consensus commands (messages to _consensus)
1278
- if (this.consensus?.enabled && sendEnvelope.to === '_consensus') {
1279
- const from = connection.agentName ?? 'unknown';
1280
- const result = this.consensus.processIncomingMessage(from, sendEnvelope.payload.body);
1281
-
1282
- if (result.isConsensusCommand) {
1283
- log.info(`Consensus ${result.type} from ${from}`, {
1284
- success: result.result?.success,
1285
- proposalId: result.result?.proposal?.id,
1286
- });
1287
- // Don't route consensus commands to the router
1288
- return;
1289
- }
1290
- }
1291
-
1292
- const syncMeta = sendEnvelope.payload_meta?.sync;
1293
- if (syncMeta?.blocking) {
1294
- if (!syncMeta.correlationId) {
1295
- this.sendErrorEnvelope(connection, 'Missing sync correlationId for blocking SEND');
1296
- return;
1297
- }
1298
- const registered = this.registerPendingAck(connection, syncMeta.correlationId, syncMeta.timeoutMs);
1299
- if (!registered) {
1300
- return;
1301
- }
1302
- }
1303
-
1304
- this.router.route(connection, sendEnvelope);
1305
- break;
1306
- }
1307
-
1308
- case 'SUBSCRIBE':
1309
- if (connection.agentName && envelope.topic) {
1310
- this.router.subscribe(connection.agentName, envelope.topic);
1311
- }
1312
- break;
1313
-
1314
- case 'UNSUBSCRIBE':
1315
- if (connection.agentName && envelope.topic) {
1316
- this.router.unsubscribe(connection.agentName, envelope.topic);
1317
- }
1318
- break;
1319
-
1320
- case 'SHADOW_BIND':
1321
- if (connection.agentName) {
1322
- const payload = envelope.payload as ShadowBindPayload;
1323
- this.router.bindShadow(connection.agentName, payload.primaryAgent, {
1324
- speakOn: payload.speakOn,
1325
- receiveIncoming: payload.receiveIncoming,
1326
- receiveOutgoing: payload.receiveOutgoing,
1327
- });
1328
- }
1329
- break;
1330
-
1331
- case 'SHADOW_UNBIND':
1332
- if (connection.agentName) {
1333
- const payload = envelope.payload as ShadowUnbindPayload;
1334
- // Verify the shadow is actually bound to the specified primary
1335
- const currentPrimary = this.router.getPrimaryForShadow(connection.agentName);
1336
- if (currentPrimary === payload.primaryAgent) {
1337
- this.router.unbindShadow(connection.agentName);
1338
- }
1339
- }
1340
- break;
1341
-
1342
- case 'LOG':
1343
- // Handle log output from daemon-connected agents
1344
- if (connection.agentName) {
1345
- const payload = envelope.payload as LogPayload;
1346
- const timestamp = payload.timestamp ?? envelope.ts;
1347
- // Forward to dashboard via callback
1348
- if (this.onLogOutput) {
1349
- this.onLogOutput(connection.agentName, payload.data, timestamp);
1350
- }
1351
- }
1352
- break;
1353
-
1354
- // Channel messaging handlers
1355
- case 'CHANNEL_JOIN': {
1356
- const channelEnvelope = envelope as Envelope<ChannelJoinPayload>;
1357
- log.info(`Channel join: ${connection.agentName} -> ${channelEnvelope.payload.channel}`);
1358
- this.router.handleChannelJoin(connection, channelEnvelope);
1359
- break;
1360
- }
1361
-
1362
- case 'CHANNEL_LEAVE': {
1363
- const channelEnvelope = envelope as Envelope<ChannelLeavePayload>;
1364
- log.info(`Channel leave: ${connection.agentName} <- ${channelEnvelope.payload.channel}`);
1365
- this.router.handleChannelLeave(connection, channelEnvelope);
1366
- break;
1367
- }
1368
-
1369
- case 'CHANNEL_MESSAGE': {
1370
- const channelEnvelope = envelope as Envelope<ChannelMessagePayload>;
1371
- log.info(`CHANNEL_MESSAGE received: from=${connection.agentName} channel=${channelEnvelope.payload.channel}`);
1372
- this.router.routeChannelMessage(connection, channelEnvelope);
1373
- break;
1374
- }
1375
-
1376
- // Spawn/release handlers (protocol-based agent spawning)
1377
- case 'SPAWN': {
1378
- if (!this.spawnManager) {
1379
- this.sendErrorEnvelope(connection, 'SpawnManager not enabled. Configure spawnManager: true in daemon config.');
1380
- break;
1381
- }
1382
- const spawnEnvelope = envelope as Envelope<SpawnPayload>;
1383
- log.info(`SPAWN request: from=${connection.agentName} agent=${spawnEnvelope.payload.name} cli=${spawnEnvelope.payload.cli}`);
1384
- this.spawnManager.handleSpawn(connection, spawnEnvelope);
1385
- break;
1386
- }
1387
-
1388
- case 'RELEASE': {
1389
- if (!this.spawnManager) {
1390
- this.sendErrorEnvelope(connection, 'SpawnManager not enabled. Configure spawnManager: true in daemon config.');
1391
- break;
1392
- }
1393
- const releaseEnvelope = envelope as Envelope<ReleasePayload>;
1394
- log.info(`RELEASE request: from=${connection.agentName} agent=${releaseEnvelope.payload.name}`);
1395
- this.spawnManager.handleRelease(connection, releaseEnvelope);
1396
- break;
1397
- }
1398
-
1399
- case 'SEND_INPUT': {
1400
- if (!this.spawnManager) {
1401
- this.sendErrorEnvelope(connection, 'SpawnManager not enabled. Configure spawnManager: true in daemon config.');
1402
- break;
1403
- }
1404
- const sendInputEnvelope = envelope as Envelope<SendInputPayload>;
1405
- log.info(`SEND_INPUT request: from=${connection.agentName} agent=${sendInputEnvelope.payload.name}`);
1406
- this.spawnManager.handleSendInput(connection, sendInputEnvelope);
1407
- break;
1408
- }
1409
-
1410
- case 'SET_MODEL': {
1411
- if (!this.spawnManager) {
1412
- this.sendErrorEnvelope(connection, 'SpawnManager not enabled. Configure spawnManager: true in daemon config.');
1413
- break;
1414
- }
1415
- const setModelEnvelope = envelope as Envelope<SetModelPayload>;
1416
- log.info(`SET_MODEL request: from=${connection.agentName} agent=${setModelEnvelope.payload.name} model=${setModelEnvelope.payload.model}`);
1417
- this.spawnManager.handleSetModel(connection, setModelEnvelope);
1418
- break;
1419
- }
1420
-
1421
- case 'LIST_WORKERS': {
1422
- if (!this.spawnManager) {
1423
- this.sendErrorEnvelope(connection, 'SpawnManager not enabled. Configure spawnManager: true in daemon config.');
1424
- break;
1425
- }
1426
- const listWorkersEnvelope = envelope as Envelope<ListWorkersPayload>;
1427
- log.info(`LIST_WORKERS request: from=${connection.agentName}`);
1428
- this.spawnManager.handleListWorkers(connection, listWorkersEnvelope);
1429
- break;
1430
- }
1431
-
1432
- // Query handlers (MCP/client requests)
1433
- case 'STATUS': {
1434
- const uptimeMs = this.startTime ? Date.now() - this.startTime : 0;
1435
- const sendStatus = async (): Promise<void> => {
1436
- let storageHealth: StorageHealth | undefined;
1437
- if (this.storage?.healthCheck) {
1438
- try {
1439
- storageHealth = await this.storage.healthCheck();
1440
- this.storageHealth = storageHealth;
1441
- } catch (err) {
1442
- log.warn('STATUS: storage health check failed', { error: String(err) });
1443
- storageHealth = this.storageHealth;
1444
- }
1445
- }
1446
-
1447
- const response: Envelope<StatusResponsePayload> = {
1448
- v: PROTOCOL_VERSION,
1449
- type: 'STATUS_RESPONSE',
1450
- id: envelope.id,
1451
- ts: Date.now(),
1452
- payload: {
1453
- version: DAEMON_VERSION,
1454
- uptime: uptimeMs,
1455
- cloudConnected: this.cloudSync?.isConnected() ?? false,
1456
- agentCount: this.router.connectionCount,
1457
- storage: storageHealth,
1458
- },
1459
- };
1460
- connection.send(response);
1461
- };
1462
-
1463
- sendStatus().catch(err => {
1464
- log.error('Failed to send STATUS response', { error: String(err) });
1465
- });
1466
- break;
1467
- }
1468
-
1469
- case 'INBOX': {
1470
- const inboxPayload = envelope.payload as InboxPayload;
1471
- const agentName = inboxPayload.agent || connection.agentName;
1472
-
1473
- // Get messages from storage
1474
- const getInboxMessages = async () => {
1475
- if (!this.storage?.getMessages) {
1476
- return [];
1477
- }
1478
- try {
1479
- // If channel is specified, get channel messages; otherwise get DMs to agent
1480
- const toFilter = inboxPayload.channel || agentName;
1481
- const messages = await this.storage.getMessages({
1482
- to: toFilter,
1483
- from: inboxPayload.from,
1484
- limit: inboxPayload.limit || 50,
1485
- unreadOnly: inboxPayload.unreadOnly,
1486
- });
1487
- return messages.map(m => ({
1488
- id: m.id,
1489
- from: m.from,
1490
- body: m.body,
1491
- channel: (m.data as { channel?: string })?.channel,
1492
- thread: m.thread,
1493
- timestamp: m.ts,
1494
- }));
1495
- } catch {
1496
- return [];
1497
- }
1498
- };
1499
-
1500
- getInboxMessages().then(messages => {
1501
- const response: Envelope<InboxResponsePayload> = {
1502
- v: PROTOCOL_VERSION,
1503
- type: 'INBOX_RESPONSE',
1504
- id: envelope.id,
1505
- ts: Date.now(),
1506
- payload: { messages },
1507
- };
1508
- connection.send(response);
1509
- }).catch(err => {
1510
- this.sendErrorEnvelope(connection, `Failed to get inbox: ${err.message}`);
1511
- });
1512
- break;
1513
- }
1514
-
1515
- case 'MESSAGES_QUERY': {
1516
- // Query all messages (used by dashboard) - not filtered by recipient
1517
- const queryPayload = envelope.payload as MessagesQueryPayload;
1518
-
1519
- const getMessages = async () => {
1520
- if (!this.storage?.getMessages) {
1521
- return [];
1522
- }
1523
- try {
1524
- const messages = await this.storage.getMessages({
1525
- limit: queryPayload.limit || 100,
1526
- sinceTs: queryPayload.sinceTs,
1527
- from: queryPayload.from,
1528
- to: queryPayload.to,
1529
- thread: queryPayload.thread,
1530
- order: queryPayload.order || 'desc',
1531
- });
1532
- return messages.map(m => ({
1533
- id: m.id,
1534
- from: m.from,
1535
- to: m.to,
1536
- body: m.body,
1537
- channel: (m.data as { channel?: string })?.channel,
1538
- thread: m.thread,
1539
- timestamp: m.ts,
1540
- status: m.status,
1541
- isBroadcast: m.is_broadcast,
1542
- replyCount: m.replyCount,
1543
- data: m.data,
1544
- }));
1545
- } catch {
1546
- return [];
1547
- }
1548
- };
1549
-
1550
- getMessages().then(messages => {
1551
- const response: Envelope<MessagesResponsePayload> = {
1552
- v: PROTOCOL_VERSION,
1553
- type: 'MESSAGES_RESPONSE',
1554
- id: envelope.id,
1555
- ts: Date.now(),
1556
- payload: { messages },
1557
- };
1558
- connection.send(response);
1559
- }).catch(err => {
1560
- this.sendErrorEnvelope(connection, `Failed to get messages: ${err.message}`);
1561
- });
1562
- break;
1563
- }
1564
-
1565
- case 'LIST_AGENTS': {
1566
- const listPayload = envelope.payload as ListAgentsPayload;
1567
-
1568
- // Get connected agents from router
1569
- const connectedAgents = this.router.getAgents();
1570
-
1571
- // Get all agents from registry for metadata lookup
1572
- const registryAgents = this.registry?.getAgents() ?? [];
1573
- const registryMap = new Map(registryAgents.map(a => [a.name, a]));
1574
-
1575
- // Get active workers from spawn manager for PID lookup
1576
- const activeWorkers = this.spawnManager?.getActiveWorkers() ?? [];
1577
- const workerMap = new Map(activeWorkers.map(w => [w.name, w]));
1578
-
1579
- // Build agent list from connected agents
1580
- const agents = connectedAgents
1581
- .filter(name => !this.isInternalAgent(name))
1582
- .map(name => {
1583
- const registryAgent = registryMap.get(name);
1584
- const conn = this.router.getConnection(name);
1585
- const worker = workerMap.get(name);
1586
- return {
1587
- name,
1588
- cli: conn?.cli ?? registryAgent?.cli,
1589
- idle: false, // Connected agents are not idle
1590
- parent: worker?.spawnerName,
1591
- team: conn?.team ?? worker?.team,
1592
- pid: worker?.pid,
1593
- };
1594
- });
1595
-
1596
- // Optionally include idle agents from registry
1597
- if (listPayload.includeIdle && this.registry) {
1598
- for (const agent of registryAgents) {
1599
- if (!connectedAgents.includes(agent.name) && !this.isInternalAgent(agent.name)) {
1600
- agents.push({
1601
- name: agent.name,
1602
- cli: agent.cli,
1603
- idle: true,
1604
- parent: undefined,
1605
- team: agent.team,
1606
- pid: undefined,
1607
- });
1608
- }
1609
- }
1610
- }
1611
-
1612
- const response: Envelope<ListAgentsResponsePayload> = {
1613
- v: PROTOCOL_VERSION,
1614
- type: 'LIST_AGENTS_RESPONSE',
1615
- id: envelope.id,
1616
- ts: Date.now(),
1617
- payload: { agents },
1618
- };
1619
- connection.send(response);
1620
- break;
1621
- }
1622
-
1623
- case 'LIST_CONNECTED_AGENTS': {
1624
- // Returns only currently connected agents (not historical/registered agents)
1625
- const connectedAgentNames = this.router.getAgents();
1626
- const registryAgents = this.registry?.getAgents() ?? [];
1627
- const registryMap = new Map(registryAgents.map(a => [a.name, a]));
1628
-
1629
- // Get active workers from spawn manager for PID lookup
1630
- const workers = this.spawnManager?.getActiveWorkers() ?? [];
1631
- const workersByName = new Map(workers.map(w => [w.name, w]));
1632
-
1633
- const agents = connectedAgentNames
1634
- .filter(name => !this.isInternalAgent(name))
1635
- .map(name => {
1636
- const registryAgent = registryMap.get(name);
1637
- const conn = this.router.getConnection(name);
1638
- const worker = workersByName.get(name);
1639
- return {
1640
- name,
1641
- cli: conn?.cli ?? registryAgent?.cli,
1642
- idle: false,
1643
- parent: worker?.spawnerName,
1644
- team: conn?.team ?? worker?.team,
1645
- pid: worker?.pid,
1646
- };
1647
- });
1648
-
1649
- const connectedResponse: Envelope<ListConnectedAgentsResponsePayload> = {
1650
- v: PROTOCOL_VERSION,
1651
- type: 'LIST_CONNECTED_AGENTS_RESPONSE',
1652
- id: envelope.id,
1653
- ts: Date.now(),
1654
- payload: { agents },
1655
- };
1656
- connection.send(connectedResponse);
1657
- break;
1658
- }
1659
-
1660
- case 'REMOVE_AGENT': {
1661
- const removePayload = envelope.payload as RemoveAgentPayload;
1662
- const agentName = removePayload.name;
1663
-
1664
- // Validate agent name
1665
- if (!agentName || typeof agentName !== 'string' || agentName.length === 0) {
1666
- const errorResponse: Envelope<RemoveAgentResponsePayload> = {
1667
- v: PROTOCOL_VERSION,
1668
- type: 'REMOVE_AGENT_RESPONSE',
1669
- id: envelope.id,
1670
- ts: Date.now(),
1671
- payload: { success: false, removed: false, message: 'Invalid agent name: name is required' },
1672
- };
1673
- connection.send(errorResponse);
1674
- break;
1675
- }
1676
-
1677
- if (agentName.length > 128) {
1678
- const errorResponse: Envelope<RemoveAgentResponsePayload> = {
1679
- v: PROTOCOL_VERSION,
1680
- type: 'REMOVE_AGENT_RESPONSE',
1681
- id: envelope.id,
1682
- ts: Date.now(),
1683
- payload: { success: false, removed: false, message: 'Invalid agent name: exceeds 128 characters' },
1684
- };
1685
- connection.send(errorResponse);
1686
- break;
1687
- }
1688
-
1689
- const doRemove = async (): Promise<{ removed: boolean; message: string }> => {
1690
- let removed = false;
1691
- let message = '';
1692
-
1693
- // Remove from registry (agents.json)
1694
- if (this.registry) {
1695
- const wasInRegistry = this.registry.getAgents().some(a => a.name === agentName);
1696
- if (wasInRegistry) {
1697
- this.registry.remove(agentName);
1698
- removed = true;
1699
- message = `Removed ${agentName} from registry`;
1700
- }
1701
- }
1702
-
1703
- // Remove from storage (sessions table) if storage is available
1704
- if (this.storage?.removeAgent) {
1705
- await this.storage.removeAgent(agentName);
1706
- if (!removed) {
1707
- removed = true;
1708
- message = `Removed ${agentName} from storage`;
1709
- } else {
1710
- message += ' and storage';
1711
- }
1712
- }
1713
-
1714
- // Optionally remove messages
1715
- if (removePayload.removeMessages && this.storage?.removeMessagesForAgent) {
1716
- await this.storage.removeMessagesForAgent(agentName);
1717
- message += ' (including messages)';
1718
- }
1719
-
1720
- // Force remove from router if still connected (shouldn't be, but just in case)
1721
- if (this.router.forceRemoveAgent(agentName)) {
1722
- message += ', disconnected from router';
1723
- // Notify cloud sync and update connected-agents.json
1724
- this.notifyCloudSync();
1725
- this.writeConnectedAgentsFile();
1726
- }
1727
-
1728
- if (!removed) {
1729
- message = `Agent ${agentName} not found in registry or storage`;
1730
- }
1731
-
1732
- return { removed, message };
1733
- };
1734
-
1735
- doRemove().then(({ removed, message }) => {
1736
- const removeResponse: Envelope<RemoveAgentResponsePayload> = {
1737
- v: PROTOCOL_VERSION,
1738
- type: 'REMOVE_AGENT_RESPONSE',
1739
- id: envelope.id,
1740
- ts: Date.now(),
1741
- payload: { success: removed, removed, message },
1742
- };
1743
- connection.send(removeResponse);
1744
- }).catch(err => {
1745
- const removeResponse: Envelope<RemoveAgentResponsePayload> = {
1746
- v: PROTOCOL_VERSION,
1747
- type: 'REMOVE_AGENT_RESPONSE',
1748
- id: envelope.id,
1749
- ts: Date.now(),
1750
- payload: { success: false, removed: false, message: `Error: ${(err as Error).message}` },
1751
- };
1752
- connection.send(removeResponse);
1753
- });
1754
- break;
1755
- }
1756
-
1757
- case 'HEALTH': {
1758
- const healthPayload = envelope.payload as HealthPayload;
1759
-
1760
- // Compute health based on available data
1761
- const connectedAgents = this.router.getAgents();
1762
- const registryAgents = this.registry?.getAgents() ?? [];
1763
- const agentCount = connectedAgents.filter(n => !this.isInternalAgent(n)).length;
1764
-
1765
- // Basic health computation
1766
- const issues: Array<{ severity: string; message: string }> = [];
1767
- const recommendations: string[] = [];
1768
- let healthScore = 100;
1769
-
1770
- // Check for memory issues via memory monitor
1771
- const memoryMonitor = getMemoryMonitor();
1772
- const memoryMetrics = memoryMonitor.getAll();
1773
- const criticalAgents = memoryMetrics.filter(m => m.alertLevel === 'critical');
1774
- const warningAgents = memoryMetrics.filter(m => m.alertLevel === 'warning');
1775
-
1776
- if (criticalAgents.length > 0) {
1777
- healthScore -= 30;
1778
- for (const agent of criticalAgents) {
1779
- issues.push({ severity: 'critical', message: `${agent.name} has critical memory usage` });
1780
- }
1781
- recommendations.push('Consider releasing some agents to free memory');
1782
- }
1783
-
1784
- if (warningAgents.length > 0) {
1785
- healthScore -= 10;
1786
- for (const agent of warningAgents) {
1787
- issues.push({ severity: 'warning', message: `${agent.name} has high memory usage` });
1788
- }
1789
- }
1790
-
1791
- // Check cloud sync status
1792
- if (!this.cloudSync?.isConnected()) {
1793
- issues.push({ severity: 'info', message: 'Cloud sync not connected' });
1794
- }
1795
-
1796
- const summary = healthScore >= 80 ? 'System is healthy' :
1797
- healthScore >= 50 ? 'System has some issues' :
1798
- 'System needs attention';
1799
-
1800
- const healthResponse: Envelope<HealthResponsePayload> = {
1801
- v: PROTOCOL_VERSION,
1802
- type: 'HEALTH_RESPONSE',
1803
- id: envelope.id,
1804
- ts: Date.now(),
1805
- payload: {
1806
- healthScore: Math.max(0, healthScore),
1807
- summary,
1808
- issues,
1809
- recommendations,
1810
- crashes: [], // Would need crash tracking implementation
1811
- alerts: [], // Would need alert tracking implementation
1812
- stats: {
1813
- totalCrashes24h: 0,
1814
- totalAlerts24h: 0,
1815
- agentCount,
1816
- },
1817
- },
1818
- };
1819
- connection.send(healthResponse);
1820
- break;
1821
- }
1822
-
1823
- case 'METRICS': {
1824
- const metricsPayload = envelope.payload as MetricsPayload;
1825
-
1826
- // Get metrics from memory monitor
1827
- const memoryMonitor = getMemoryMonitor();
1828
- let metrics = memoryMonitor.getAll();
1829
-
1830
- // Filter to specific agent if requested
1831
- if (metricsPayload.agent) {
1832
- metrics = metrics.filter(m => m.name === metricsPayload.agent);
1833
- }
1834
-
1835
- // Convert to response format
1836
- const agents = metrics.map(m => ({
1837
- name: m.name,
1838
- pid: m.pid,
1839
- status: m.alertLevel === 'normal' ? 'running' : m.alertLevel,
1840
- rssBytes: m.current.rssBytes,
1841
- cpuPercent: m.current.cpuPercent,
1842
- trend: m.trend,
1843
- alertLevel: m.alertLevel,
1844
- highWatermark: m.highWatermark,
1845
- uptimeMs: m.uptimeMs,
1846
- }));
1847
-
1848
- // System metrics
1849
- const system = {
1850
- totalMemory: os.totalmem(),
1851
- freeMemory: os.freemem(),
1852
- heapUsed: process.memoryUsage().heapUsed,
1853
- };
1854
-
1855
- const metricsResponse: Envelope<MetricsResponsePayload> = {
1856
- v: PROTOCOL_VERSION,
1857
- type: 'METRICS_RESPONSE',
1858
- id: envelope.id,
1859
- ts: Date.now(),
1860
- payload: { agents, system },
1861
- };
1862
- connection.send(metricsResponse);
1863
- break;
1864
- }
1865
- }
1866
- }
1867
-
1868
- private handleAck(connection: Connection, envelope: Envelope<AckPayload>): void {
1869
- this.router.handleAck(connection, envelope);
1870
-
1871
- const correlationId = envelope.payload.correlationId;
1872
- if (!correlationId) return;
1873
-
1874
- const pending = this.pendingAcks.get(correlationId);
1875
- if (!pending) return;
1876
-
1877
- clearTimeout(pending.timeoutHandle);
1878
- this.pendingAcks.delete(correlationId);
1879
-
1880
- const forwardAck: Envelope<AckPayload> = {
1881
- v: envelope.v,
1882
- type: 'ACK',
1883
- id: generateId(),
1884
- ts: Date.now(),
1885
- from: connection.agentName,
1886
- to: pending.connection.agentName,
1887
- payload: envelope.payload,
1888
- };
1889
-
1890
- pending.connection.send(forwardAck);
1891
- }
1892
-
1893
- private registerPendingAck(connection: Connection, correlationId: string, timeoutMs?: number): boolean {
1894
- if (this.pendingAcks.has(correlationId)) {
1895
- this.sendErrorEnvelope(connection, `Duplicate correlationId: ${correlationId}`);
1896
- return false;
1897
- }
1898
-
1899
- const timeout = timeoutMs ?? Daemon.DEFAULT_SYNC_TIMEOUT_MS;
1900
- const timeoutHandle = setTimeout(() => {
1901
- this.pendingAcks.delete(correlationId);
1902
- this.sendErrorEnvelope(connection, `ACK timeout after ${timeout}ms`);
1903
- }, timeout);
1904
-
1905
- this.pendingAcks.set(correlationId, {
1906
- correlationId,
1907
- connectionId: connection.id,
1908
- connection,
1909
- timeoutHandle,
1910
- });
1911
-
1912
- return true;
1913
- }
1914
-
1915
- private clearPendingAcksForConnection(connectionId: string): void {
1916
- for (const [correlationId, pending] of this.pendingAcks.entries()) {
1917
- if (pending.connectionId !== connectionId) continue;
1918
- clearTimeout(pending.timeoutHandle);
1919
- this.pendingAcks.delete(correlationId);
1920
- }
1921
- }
1922
-
1923
- private sendErrorEnvelope(connection: Connection, message: string): void {
1924
- const errorEnvelope: Envelope<ErrorPayload> = {
1925
- v: PROTOCOL_VERSION,
1926
- type: 'ERROR',
1927
- id: generateId(),
1928
- ts: Date.now(),
1929
- payload: {
1930
- code: 'INTERNAL',
1931
- message,
1932
- fatal: false,
1933
- },
1934
- };
1935
- connection.send(errorEnvelope);
1936
- }
1937
-
1938
- /**
1939
- * Get list of connected agents.
1940
- */
1941
- getAgents(): string[] {
1942
- return this.router.getAgents();
1943
- }
1944
-
1945
- /**
1946
- * Broadcast a system message to all connected agents.
1947
- * Used for system notifications like agent death announcements.
1948
- */
1949
- broadcastSystemMessage(message: string, data?: Record<string, unknown>): void {
1950
- this.router.broadcastSystemMessage(message, data);
1951
- }
1952
-
1953
- /**
1954
- * Broadcast AGENT_READY event when an agent completes connection.
1955
- * This allows spawning clients to know when their spawned agent is ready to receive messages.
1956
- */
1957
- private broadcastAgentReady(connection: Connection): void {
1958
- const payload: AgentReadyPayload = {
1959
- name: connection.agentName!,
1960
- cli: connection.cli,
1961
- task: connection.task,
1962
- connectedAt: Date.now(),
1963
- };
1964
-
1965
- const envelope: Envelope<AgentReadyPayload> = {
1966
- v: PROTOCOL_VERSION,
1967
- type: 'AGENT_READY',
1968
- id: generateId(),
1969
- ts: Date.now(),
1970
- payload,
1971
- };
1972
-
1973
- // Broadcast to all connections except the one that just connected
1974
- for (const conn of this.connections) {
1975
- if (conn.id !== connection.id && conn.state === 'ACTIVE') {
1976
- conn.send(envelope);
1977
- }
1978
- }
1979
-
1980
- log.info('Broadcast AGENT_READY', { agent: connection.agentName });
1981
- }
1982
-
1983
- /**
1984
- * Get connection count.
1985
- */
1986
- get connectionCount(): number {
1987
- return this.router.connectionCount;
1988
- }
1989
-
1990
- /**
1991
- * Check if daemon is running.
1992
- */
1993
- get isRunning(): boolean {
1994
- return this.running;
1995
- }
1996
-
1997
- /**
1998
- * Check if consensus is enabled.
1999
- */
2000
- get consensusEnabled(): boolean {
2001
- return this.consensus?.enabled ?? false;
2002
- }
2003
-
2004
- /**
2005
- * Get the consensus integration (for API access).
2006
- */
2007
- getConsensus(): ConsensusIntegration | undefined {
2008
- return this.consensus;
2009
- }
2010
-
2011
- /**
2012
- * Get the SpawnManager instance.
2013
- * Used by co-located services (e.g. dashboard-server) to access
2014
- * spawner read operations (logs, worker listing) without going
2015
- * through the protocol socket.
2016
- */
2017
- getSpawnManager(): SpawnManager | undefined {
2018
- return this.spawnManager;
2019
- }
2020
- }
2021
-
2022
- // Run as standalone if executed directly (not in bundled CLI)
2023
- // In bundled builds, AGENT_RELAY_VERSION is defined, so we skip auto-start
2024
- // The CLI handles daemon startup via the 'up' command
2025
- // Also verify the script path ends with server.ts/server.js to avoid triggering
2026
- // inside Bun compiled binaries (e.g., dashboard binary) that bundle this file
2027
- const scriptPath = new URL(import.meta.url).pathname;
2028
- const isServerScript = scriptPath.endsWith('/server.ts') || scriptPath.endsWith('/server.js');
2029
- const isMainModule = isServerScript &&
2030
- import.meta.url === `file://${process.argv[1]}` &&
2031
- !process.env.AGENT_RELAY_VERSION;
2032
- if (isMainModule) {
2033
- const daemon = new Daemon();
2034
-
2035
- process.on('SIGINT', async () => {
2036
- log.info('Shutting down (SIGINT)');
2037
- await daemon.stop();
2038
- process.exit(0);
2039
- });
2040
-
2041
- process.on('SIGTERM', async () => {
2042
- log.info('Shutting down (SIGTERM)');
2043
- await daemon.stop();
2044
- process.exit(0);
2045
- });
2046
-
2047
- daemon.start().catch((err) => {
2048
- log.error('Failed to start', { error: String(err) });
2049
- process.exit(1);
2050
- });
2051
- }