agent-relay 2.3.13 → 2.3.15

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 (1420) 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 +50319 -63390
  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/dist/__tests__/contract-fixtures.test.d.ts +2 -0
  240. package/packages/sdk/dist/__tests__/contract-fixtures.test.d.ts.map +1 -0
  241. package/packages/sdk/dist/__tests__/contract-fixtures.test.js +85 -0
  242. package/packages/sdk/dist/__tests__/contract-fixtures.test.js.map +1 -0
  243. package/packages/sdk/dist/__tests__/facade.test.js +305 -0
  244. package/packages/sdk/dist/__tests__/facade.test.js.map +1 -0
  245. package/packages/sdk/dist/__tests__/integration.test.js +169 -0
  246. package/packages/sdk/dist/__tests__/integration.test.js.map +1 -0
  247. package/packages/sdk/dist/__tests__/pty.test.d.ts +2 -0
  248. package/packages/sdk/dist/__tests__/pty.test.d.ts.map +1 -0
  249. package/packages/sdk/dist/__tests__/pty.test.js +20 -0
  250. package/packages/sdk/dist/__tests__/pty.test.js.map +1 -0
  251. package/packages/sdk/dist/__tests__/quickstart.test.js +176 -0
  252. package/packages/sdk/dist/__tests__/quickstart.test.js.map +1 -0
  253. package/packages/sdk/dist/__tests__/spawn-from-env.test.d.ts +2 -0
  254. package/packages/sdk/dist/__tests__/spawn-from-env.test.d.ts.map +1 -0
  255. package/packages/sdk/dist/__tests__/spawn-from-env.test.js +206 -0
  256. package/packages/sdk/dist/__tests__/spawn-from-env.test.js.map +1 -0
  257. package/packages/sdk/dist/__tests__/unit.test.js +347 -0
  258. package/packages/sdk/dist/__tests__/unit.test.js.map +1 -0
  259. package/packages/sdk/dist/client.d.ts +140 -526
  260. package/packages/sdk/dist/client.d.ts.map +1 -1
  261. package/packages/sdk/dist/client.js +430 -1509
  262. package/packages/sdk/dist/client.js.map +1 -1
  263. package/packages/sdk/dist/examples/workflow-superiority.d.ts +32 -0
  264. package/packages/sdk/dist/examples/workflow-superiority.d.ts.map +1 -0
  265. package/packages/sdk/dist/examples/workflow-superiority.js +1421 -0
  266. package/packages/sdk/dist/examples/workflow-superiority.js.map +1 -0
  267. package/packages/sdk/dist/index.d.ts +13 -20
  268. package/packages/sdk/dist/index.d.ts.map +1 -1
  269. package/packages/sdk/dist/index.js +12 -26
  270. package/packages/sdk/dist/index.js.map +1 -1
  271. package/packages/sdk/dist/logs.d.ts +70 -25
  272. package/packages/sdk/dist/logs.d.ts.map +1 -1
  273. package/packages/sdk/dist/logs.js +238 -42
  274. package/packages/sdk/dist/logs.js.map +1 -1
  275. package/packages/sdk/dist/models.d.ts +9 -0
  276. package/packages/sdk/dist/models.d.ts.map +1 -0
  277. package/packages/sdk/dist/models.js +17 -0
  278. package/packages/sdk/dist/models.js.map +1 -0
  279. package/packages/sdk/dist/protocol.d.ts +366 -0
  280. package/packages/sdk/dist/protocol.d.ts.map +1 -0
  281. package/packages/sdk/dist/pty.d.ts.map +1 -0
  282. package/packages/sdk/dist/pty.js +26 -0
  283. package/packages/sdk/dist/pty.js.map +1 -0
  284. package/packages/sdk/dist/relay-adapter.d.ts +139 -0
  285. package/packages/sdk/dist/relay-adapter.d.ts.map +1 -0
  286. package/packages/sdk/dist/relay-adapter.js +210 -0
  287. package/packages/sdk/dist/relay-adapter.js.map +1 -0
  288. package/packages/sdk/dist/relay.d.ts +304 -0
  289. package/packages/sdk/dist/relay.d.ts.map +1 -0
  290. package/packages/sdk/dist/relay.js +910 -0
  291. package/packages/sdk/dist/relay.js.map +1 -0
  292. package/packages/sdk/dist/shadow.d.ts +101 -0
  293. package/packages/sdk/dist/shadow.d.ts.map +1 -0
  294. package/packages/sdk/dist/shadow.js.map +1 -0
  295. package/packages/sdk/dist/spawn-from-env.d.ts +77 -0
  296. package/packages/sdk/dist/spawn-from-env.d.ts.map +1 -0
  297. package/packages/sdk/dist/spawn-from-env.js +172 -0
  298. package/packages/sdk/dist/spawn-from-env.js.map +1 -0
  299. package/packages/sdk/dist/workflows/builder.d.ts +114 -0
  300. package/packages/sdk/dist/workflows/builder.d.ts.map +1 -0
  301. package/packages/sdk/dist/workflows/builder.js +201 -0
  302. package/packages/sdk/dist/workflows/builder.js.map +1 -0
  303. package/packages/sdk/dist/workflows/cli.d.ts +11 -0
  304. package/packages/sdk/dist/workflows/cli.d.ts.map +1 -0
  305. package/packages/sdk/dist/workflows/cli.js +144 -0
  306. package/packages/sdk/dist/workflows/cli.js.map +1 -0
  307. package/packages/sdk/dist/workflows/coordinator.d.ts +73 -0
  308. package/packages/sdk/dist/workflows/coordinator.d.ts.map +1 -0
  309. package/packages/sdk/dist/workflows/coordinator.js +647 -0
  310. package/packages/sdk/dist/workflows/coordinator.js.map +1 -0
  311. package/packages/sdk/dist/workflows/custom-steps.d.ts +73 -0
  312. package/packages/sdk/dist/workflows/custom-steps.d.ts.map +1 -0
  313. package/packages/sdk/dist/workflows/custom-steps.js +321 -0
  314. package/packages/sdk/dist/workflows/custom-steps.js.map +1 -0
  315. package/packages/sdk/dist/workflows/dry-run-format.d.ts +6 -0
  316. package/packages/sdk/dist/workflows/dry-run-format.d.ts.map +1 -0
  317. package/packages/sdk/dist/workflows/dry-run-format.js +68 -0
  318. package/packages/sdk/dist/workflows/dry-run-format.js.map +1 -0
  319. package/packages/sdk/dist/workflows/file-db.d.ts +33 -0
  320. package/packages/sdk/dist/workflows/file-db.d.ts.map +1 -0
  321. package/packages/sdk/dist/workflows/file-db.js +108 -0
  322. package/packages/sdk/dist/workflows/file-db.js.map +1 -0
  323. package/packages/sdk/dist/workflows/index.d.ts +15 -0
  324. package/packages/sdk/dist/workflows/index.d.ts.map +1 -0
  325. package/packages/sdk/dist/workflows/index.js +15 -0
  326. package/packages/sdk/dist/workflows/index.js.map +1 -0
  327. package/packages/sdk/dist/workflows/run.d.ts +38 -0
  328. package/packages/sdk/dist/workflows/run.d.ts.map +1 -0
  329. package/packages/sdk/dist/workflows/run.js +25 -0
  330. package/packages/sdk/dist/workflows/run.js.map +1 -0
  331. package/packages/sdk/dist/workflows/runner.d.ts +320 -0
  332. package/packages/sdk/dist/workflows/runner.d.ts.map +1 -0
  333. package/packages/sdk/dist/workflows/runner.js +2821 -0
  334. package/packages/sdk/dist/workflows/runner.js.map +1 -0
  335. package/packages/sdk/dist/workflows/templates.d.ts +47 -0
  336. package/packages/sdk/dist/workflows/templates.d.ts.map +1 -0
  337. package/packages/sdk/dist/workflows/templates.js +405 -0
  338. package/packages/sdk/dist/workflows/templates.js.map +1 -0
  339. package/packages/sdk/dist/workflows/trajectory.d.ts +87 -0
  340. package/packages/sdk/dist/workflows/trajectory.d.ts.map +1 -0
  341. package/packages/sdk/dist/workflows/trajectory.js +441 -0
  342. package/packages/sdk/dist/workflows/trajectory.js.map +1 -0
  343. package/packages/sdk/dist/workflows/types.d.ts +306 -0
  344. package/packages/sdk/dist/workflows/types.d.ts.map +1 -0
  345. package/packages/sdk/dist/workflows/types.js +23 -0
  346. package/packages/sdk/dist/workflows/types.js.map +1 -0
  347. package/packages/sdk/dist/workflows/validator.d.ts +11 -0
  348. package/packages/sdk/dist/workflows/validator.d.ts.map +1 -0
  349. package/packages/sdk/dist/workflows/validator.js +128 -0
  350. package/packages/sdk/dist/workflows/validator.js.map +1 -0
  351. package/packages/sdk/package.json +59 -53
  352. package/packages/sdk/scripts/bundle-agent-relay.mjs +53 -0
  353. package/packages/sdk/src/__tests__/contract-fixtures.test.ts +122 -0
  354. package/packages/sdk/src/__tests__/error-scenarios.test.ts +682 -0
  355. package/packages/sdk/src/__tests__/facade.test.ts +364 -0
  356. package/packages/sdk/src/__tests__/idle-nudge.test.ts +438 -0
  357. package/packages/sdk/src/__tests__/integration.test.ts +204 -0
  358. package/packages/sdk/src/__tests__/orchestration-upgrades.test.ts +797 -0
  359. package/packages/sdk/src/__tests__/pty.test.ts +24 -0
  360. package/packages/sdk/src/__tests__/quickstart.test.ts +198 -0
  361. package/packages/sdk/src/__tests__/spawn-from-env.test.ts +282 -0
  362. package/packages/sdk/src/__tests__/swarm-coordinator.test.ts +909 -0
  363. package/packages/sdk/src/__tests__/unit.test.ts +435 -0
  364. package/packages/sdk/src/__tests__/workflow-runner.test.ts +489 -0
  365. package/packages/sdk/src/__tests__/yaml-validation.test.ts +890 -0
  366. package/packages/sdk/src/client.ts +527 -1911
  367. package/packages/sdk/src/examples/workflow-superiority.ts +1485 -0
  368. package/packages/sdk/src/examples/workflows/README.md +156 -0
  369. package/packages/sdk/src/examples/workflows/ralph-overnight.yaml +421 -0
  370. package/packages/sdk/src/examples/workflows/ralph-swarm.yaml +411 -0
  371. package/packages/sdk/src/examples/workflows/ralph-tdd.yaml +259 -0
  372. package/packages/sdk/src/index.ts +13 -116
  373. package/packages/sdk/src/logs.ts +282 -54
  374. package/packages/sdk/src/models.ts +36 -0
  375. package/packages/sdk/src/protocol.ts +385 -0
  376. package/packages/sdk/src/pty.ts +35 -0
  377. package/packages/sdk/src/relay-adapter.ts +316 -0
  378. package/packages/sdk/src/relay.ts +1147 -0
  379. package/packages/sdk/src/shadow.ts +228 -0
  380. package/packages/sdk/src/spawn-from-env.ts +245 -0
  381. package/packages/sdk/src/workflows/README.md +656 -0
  382. package/packages/sdk/src/workflows/builder.ts +278 -0
  383. package/packages/sdk/src/workflows/builtin-templates/bug-fix.yaml +135 -0
  384. package/packages/sdk/src/workflows/builtin-templates/code-review.yaml +133 -0
  385. package/packages/sdk/src/workflows/builtin-templates/competitive.yaml +103 -0
  386. package/packages/sdk/src/workflows/builtin-templates/documentation.yaml +120 -0
  387. package/packages/sdk/src/workflows/builtin-templates/feature-dev.yaml +142 -0
  388. package/packages/sdk/src/workflows/builtin-templates/refactor.yaml +141 -0
  389. package/packages/sdk/src/workflows/builtin-templates/review-loop.yaml +223 -0
  390. package/packages/sdk/src/workflows/builtin-templates/security-audit.yaml +129 -0
  391. package/packages/sdk/src/workflows/cli.ts +162 -0
  392. package/packages/sdk/src/workflows/coordinator.ts +842 -0
  393. package/packages/sdk/src/workflows/custom-steps.ts +450 -0
  394. package/packages/sdk/src/workflows/dry-run-format.ts +75 -0
  395. package/packages/sdk/src/workflows/file-db.ts +117 -0
  396. package/packages/sdk/src/workflows/index.ts +24 -0
  397. package/packages/sdk/src/workflows/run.ts +72 -0
  398. package/packages/sdk/src/workflows/runner.ts +3409 -0
  399. package/packages/sdk/src/workflows/schema.json +651 -0
  400. package/packages/sdk/src/workflows/templates.ts +552 -0
  401. package/packages/sdk/src/workflows/trajectory.ts +631 -0
  402. package/packages/sdk/src/workflows/types.ts +389 -0
  403. package/packages/sdk/src/workflows/validator.ts +151 -0
  404. package/packages/sdk/tsconfig.build.json +25 -0
  405. package/packages/sdk/tsconfig.json +17 -18
  406. package/packages/sdk/vitest.config.ts +1 -1
  407. package/packages/sdk-py/README.md +106 -21
  408. package/packages/sdk-py/agent_relay/__init__.py +21 -0
  409. package/packages/sdk-py/agent_relay/models.py +206 -0
  410. package/packages/sdk-py/pyproject.toml +2 -2
  411. package/packages/sdk-py/src/agent_relay/__init__.py +76 -0
  412. package/packages/sdk-py/src/agent_relay/builder.py +430 -109
  413. package/packages/sdk-py/src/agent_relay/templates.py +197 -0
  414. package/packages/sdk-py/src/agent_relay/types.py +489 -15
  415. package/packages/sdk-py/tests/test_builder.py +115 -1
  416. package/packages/sdk-py/tests/test_workflow_templates.py +450 -0
  417. package/packages/shared/cli-registry.yaml +193 -0
  418. package/packages/shared/codegen-py.mjs +215 -0
  419. package/packages/shared/codegen-ts.mjs +227 -0
  420. package/packages/telemetry/dist/events.d.ts +8 -8
  421. package/packages/telemetry/dist/index.d.ts +1 -1
  422. package/packages/telemetry/package.json +2 -2
  423. package/packages/telemetry/src/events.ts +9 -9
  424. package/packages/telemetry/src/index.ts +2 -2
  425. package/packages/trajectory/package.json +2 -2
  426. package/packages/user-directory/dist/user-directory.js +1 -1
  427. package/packages/user-directory/dist/user-directory.js.map +1 -1
  428. package/packages/user-directory/package.json +2 -2
  429. package/packages/user-directory/src/user-directory.ts +1 -1
  430. package/packages/utils/dist/cjs/client-helpers.js +4 -4
  431. package/packages/utils/dist/cjs/discovery.js +9 -6
  432. package/packages/utils/dist/cjs/errors.js +5 -5
  433. package/packages/utils/dist/cjs/legacy-protocol.js +70 -0
  434. package/packages/utils/dist/cjs/logger.js +3 -3
  435. package/packages/utils/dist/cjs/precompiled-patterns.js +33 -2
  436. package/packages/utils/dist/cjs/relay-pty-path.js +0 -6
  437. package/packages/utils/dist/client-helpers.d.ts +1 -1
  438. package/packages/utils/dist/client-helpers.d.ts.map +1 -1
  439. package/packages/utils/dist/client-helpers.js +1 -1
  440. package/packages/utils/dist/client-helpers.js.map +1 -1
  441. package/packages/utils/dist/discovery.d.ts +7 -7
  442. package/packages/utils/dist/discovery.d.ts.map +1 -1
  443. package/packages/utils/dist/discovery.js +20 -17
  444. package/packages/utils/dist/discovery.js.map +1 -1
  445. package/packages/utils/dist/errors.d.ts +1 -1
  446. package/packages/utils/dist/errors.js +3 -3
  447. package/packages/utils/dist/legacy-protocol.d.ts +46 -0
  448. package/packages/utils/dist/legacy-protocol.d.ts.map +1 -0
  449. package/packages/utils/dist/legacy-protocol.js +47 -0
  450. package/packages/utils/dist/legacy-protocol.js.map +1 -0
  451. package/packages/utils/dist/logger.d.ts +2 -2
  452. package/packages/utils/dist/logger.js +2 -2
  453. package/packages/utils/dist/precompiled-patterns.d.ts.map +1 -1
  454. package/packages/utils/dist/precompiled-patterns.js +28 -2
  455. package/packages/utils/dist/precompiled-patterns.js.map +1 -1
  456. package/packages/utils/dist/relay-pty-path.d.ts.map +1 -1
  457. package/packages/utils/dist/relay-pty-path.js +1 -10
  458. package/packages/utils/dist/relay-pty-path.js.map +1 -1
  459. package/packages/utils/package.json +2 -3
  460. package/packages/utils/src/client-helpers.ts +1 -1
  461. package/packages/utils/src/consolidation.test.ts +3 -3
  462. package/packages/utils/src/discovery.test.ts +3 -3
  463. package/packages/utils/src/discovery.ts +21 -18
  464. package/packages/utils/src/errors.test.ts +6 -11
  465. package/packages/utils/src/errors.ts +3 -3
  466. package/packages/utils/src/legacy-protocol.ts +151 -0
  467. package/packages/utils/src/logger.ts +2 -2
  468. package/packages/utils/src/precompiled-patterns.test.ts +8 -0
  469. package/packages/utils/src/precompiled-patterns.ts +40 -2
  470. package/packages/utils/src/relay-pty-path.test.ts +23 -34
  471. package/packages/utils/src/relay-pty-path.ts +1 -11
  472. package/relay-snippets/agent-relay-protocol.md +6 -43
  473. package/relay-snippets/agent-relay-snippet.md +59 -203
  474. package/scripts/postinstall.js +44 -171
  475. package/bin/relay-pty-darwin-arm64 +0 -0
  476. package/bin/relay-pty-darwin-x64 +0 -0
  477. package/bin/relay-pty-linux-arm64 +0 -0
  478. package/bin/relay-pty-linux-x64 +0 -0
  479. package/dist/src/bridge/index.d.ts +0 -8
  480. package/dist/src/bridge/index.d.ts.map +0 -1
  481. package/dist/src/bridge/index.js +0 -8
  482. package/dist/src/bridge/index.js.map +0 -1
  483. package/dist/src/continuity/index.d.ts +0 -5
  484. package/dist/src/continuity/index.d.ts.map +0 -1
  485. package/dist/src/continuity/index.js +0 -5
  486. package/dist/src/continuity/index.js.map +0 -1
  487. package/dist/src/daemon/index.d.ts +0 -8
  488. package/dist/src/daemon/index.d.ts.map +0 -1
  489. package/dist/src/daemon/index.js +0 -9
  490. package/dist/src/daemon/index.js.map +0 -1
  491. package/dist/src/protocol/index.d.ts +0 -8
  492. package/dist/src/protocol/index.d.ts.map +0 -1
  493. package/dist/src/protocol/index.js +0 -8
  494. package/dist/src/protocol/index.js.map +0 -1
  495. package/dist/src/resiliency/index.d.ts +0 -5
  496. package/dist/src/resiliency/index.d.ts.map +0 -1
  497. package/dist/src/resiliency/index.js +0 -5
  498. package/dist/src/resiliency/index.js.map +0 -1
  499. package/dist/src/state/index.d.ts +0 -5
  500. package/dist/src/state/index.d.ts.map +0 -1
  501. package/dist/src/state/index.js +0 -5
  502. package/dist/src/state/index.js.map +0 -1
  503. package/dist/src/storage/index.d.ts +0 -8
  504. package/dist/src/storage/index.d.ts.map +0 -1
  505. package/dist/src/storage/index.js +0 -8
  506. package/dist/src/storage/index.js.map +0 -1
  507. package/dist/src/wrapper/index.d.ts +0 -8
  508. package/dist/src/wrapper/index.d.ts.map +0 -1
  509. package/dist/src/wrapper/index.js +0 -11
  510. package/dist/src/wrapper/index.js.map +0 -1
  511. package/packages/bridge/dist/cli-resolution.d.ts +0 -32
  512. package/packages/bridge/dist/cli-resolution.d.ts.map +0 -1
  513. package/packages/bridge/dist/cli-resolution.js +0 -88
  514. package/packages/bridge/dist/cli-resolution.js.map +0 -1
  515. package/packages/bridge/dist/index.d.ts +0 -9
  516. package/packages/bridge/dist/index.d.ts.map +0 -1
  517. package/packages/bridge/dist/index.js +0 -11
  518. package/packages/bridge/dist/index.js.map +0 -1
  519. package/packages/bridge/dist/multi-project-client.d.ts +0 -99
  520. package/packages/bridge/dist/multi-project-client.d.ts.map +0 -1
  521. package/packages/bridge/dist/multi-project-client.js +0 -389
  522. package/packages/bridge/dist/multi-project-client.js.map +0 -1
  523. package/packages/bridge/dist/shadow-cli.d.ts +0 -17
  524. package/packages/bridge/dist/shadow-cli.d.ts.map +0 -1
  525. package/packages/bridge/dist/shadow-cli.js +0 -75
  526. package/packages/bridge/dist/shadow-cli.js.map +0 -1
  527. package/packages/bridge/dist/spawner.d.ts +0 -263
  528. package/packages/bridge/dist/spawner.d.ts.map +0 -1
  529. package/packages/bridge/dist/spawner.js +0 -1758
  530. package/packages/bridge/dist/spawner.js.map +0 -1
  531. package/packages/bridge/dist/types.d.ts +0 -141
  532. package/packages/bridge/dist/types.d.ts.map +0 -1
  533. package/packages/bridge/dist/types.js +0 -6
  534. package/packages/bridge/dist/types.js.map +0 -1
  535. package/packages/bridge/dist/utils.d.ts +0 -39
  536. package/packages/bridge/dist/utils.d.ts.map +0 -1
  537. package/packages/bridge/dist/utils.js +0 -98
  538. package/packages/bridge/dist/utils.js.map +0 -1
  539. package/packages/bridge/package.json +0 -45
  540. package/packages/bridge/src/cli-resolution.test.ts +0 -225
  541. package/packages/bridge/src/cli-resolution.ts +0 -100
  542. package/packages/bridge/src/index.ts +0 -34
  543. package/packages/bridge/src/multi-project-client.test.ts +0 -340
  544. package/packages/bridge/src/multi-project-client.ts +0 -469
  545. package/packages/bridge/src/shadow-cli.ts +0 -95
  546. package/packages/bridge/src/spawner-mcp.test.ts +0 -505
  547. package/packages/bridge/src/spawner.ts +0 -2067
  548. package/packages/bridge/src/types.ts +0 -153
  549. package/packages/bridge/src/utils.test.ts +0 -235
  550. package/packages/bridge/src/utils.ts +0 -113
  551. package/packages/bridge/tsconfig.json +0 -29
  552. package/packages/bridge/vitest.config.ts +0 -9
  553. package/packages/broker-sdk/README.md +0 -97
  554. package/packages/broker-sdk/dist/__tests__/facade.test.js +0 -257
  555. package/packages/broker-sdk/dist/__tests__/facade.test.js.map +0 -1
  556. package/packages/broker-sdk/dist/__tests__/integration.test.js +0 -139
  557. package/packages/broker-sdk/dist/__tests__/integration.test.js.map +0 -1
  558. package/packages/broker-sdk/dist/__tests__/quickstart.test.js +0 -176
  559. package/packages/broker-sdk/dist/__tests__/quickstart.test.js.map +0 -1
  560. package/packages/broker-sdk/dist/__tests__/unit.test.js +0 -192
  561. package/packages/broker-sdk/dist/__tests__/unit.test.js.map +0 -1
  562. package/packages/broker-sdk/dist/client.d.ts +0 -95
  563. package/packages/broker-sdk/dist/client.d.ts.map +0 -1
  564. package/packages/broker-sdk/dist/client.js +0 -372
  565. package/packages/broker-sdk/dist/client.js.map +0 -1
  566. package/packages/broker-sdk/dist/index.d.ts +0 -10
  567. package/packages/broker-sdk/dist/index.d.ts.map +0 -1
  568. package/packages/broker-sdk/dist/index.js +0 -10
  569. package/packages/broker-sdk/dist/index.js.map +0 -1
  570. package/packages/broker-sdk/dist/logs.d.ts +0 -47
  571. package/packages/broker-sdk/dist/logs.d.ts.map +0 -1
  572. package/packages/broker-sdk/dist/logs.js +0 -137
  573. package/packages/broker-sdk/dist/logs.js.map +0 -1
  574. package/packages/broker-sdk/dist/protocol.d.ts +0 -254
  575. package/packages/broker-sdk/dist/protocol.d.ts.map +0 -1
  576. package/packages/broker-sdk/dist/pty.d.ts.map +0 -1
  577. package/packages/broker-sdk/dist/pty.js +0 -14
  578. package/packages/broker-sdk/dist/pty.js.map +0 -1
  579. package/packages/broker-sdk/dist/relay.d.ts +0 -172
  580. package/packages/broker-sdk/dist/relay.d.ts.map +0 -1
  581. package/packages/broker-sdk/dist/relay.js +0 -486
  582. package/packages/broker-sdk/dist/relay.js.map +0 -1
  583. package/packages/broker-sdk/dist/relaycast.d.ts +0 -67
  584. package/packages/broker-sdk/dist/relaycast.d.ts.map +0 -1
  585. package/packages/broker-sdk/dist/relaycast.js +0 -150
  586. package/packages/broker-sdk/dist/relaycast.js.map +0 -1
  587. package/packages/broker-sdk/dist/shadow.d.ts +0 -100
  588. package/packages/broker-sdk/dist/shadow.d.ts.map +0 -1
  589. package/packages/broker-sdk/dist/shadow.js.map +0 -1
  590. package/packages/broker-sdk/dist/workflows/builder.d.ts +0 -101
  591. package/packages/broker-sdk/dist/workflows/builder.d.ts.map +0 -1
  592. package/packages/broker-sdk/dist/workflows/builder.js +0 -179
  593. package/packages/broker-sdk/dist/workflows/builder.js.map +0 -1
  594. package/packages/broker-sdk/dist/workflows/cli.d.ts +0 -10
  595. package/packages/broker-sdk/dist/workflows/cli.d.ts.map +0 -1
  596. package/packages/broker-sdk/dist/workflows/cli.js +0 -82
  597. package/packages/broker-sdk/dist/workflows/cli.js.map +0 -1
  598. package/packages/broker-sdk/dist/workflows/coordinator.d.ts +0 -69
  599. package/packages/broker-sdk/dist/workflows/coordinator.d.ts.map +0 -1
  600. package/packages/broker-sdk/dist/workflows/coordinator.js +0 -585
  601. package/packages/broker-sdk/dist/workflows/coordinator.js.map +0 -1
  602. package/packages/broker-sdk/dist/workflows/index.d.ts +0 -11
  603. package/packages/broker-sdk/dist/workflows/index.d.ts.map +0 -1
  604. package/packages/broker-sdk/dist/workflows/index.js +0 -11
  605. package/packages/broker-sdk/dist/workflows/index.js.map +0 -1
  606. package/packages/broker-sdk/dist/workflows/run.d.ts +0 -33
  607. package/packages/broker-sdk/dist/workflows/run.d.ts.map +0 -1
  608. package/packages/broker-sdk/dist/workflows/run.js +0 -28
  609. package/packages/broker-sdk/dist/workflows/run.js.map +0 -1
  610. package/packages/broker-sdk/dist/workflows/runner.d.ts +0 -136
  611. package/packages/broker-sdk/dist/workflows/runner.d.ts.map +0 -1
  612. package/packages/broker-sdk/dist/workflows/runner.js +0 -900
  613. package/packages/broker-sdk/dist/workflows/runner.js.map +0 -1
  614. package/packages/broker-sdk/dist/workflows/templates.d.ts +0 -47
  615. package/packages/broker-sdk/dist/workflows/templates.d.ts.map +0 -1
  616. package/packages/broker-sdk/dist/workflows/templates.js +0 -395
  617. package/packages/broker-sdk/dist/workflows/templates.js.map +0 -1
  618. package/packages/broker-sdk/dist/workflows/trajectory.d.ts +0 -80
  619. package/packages/broker-sdk/dist/workflows/trajectory.d.ts.map +0 -1
  620. package/packages/broker-sdk/dist/workflows/trajectory.js +0 -362
  621. package/packages/broker-sdk/dist/workflows/trajectory.js.map +0 -1
  622. package/packages/broker-sdk/dist/workflows/types.d.ts +0 -140
  623. package/packages/broker-sdk/dist/workflows/types.d.ts.map +0 -1
  624. package/packages/broker-sdk/dist/workflows/types.js +0 -8
  625. package/packages/broker-sdk/dist/workflows/types.js.map +0 -1
  626. package/packages/broker-sdk/package.json +0 -81
  627. package/packages/broker-sdk/scripts/bundle-agent-relay.mjs +0 -53
  628. package/packages/broker-sdk/src/__tests__/error-scenarios.test.ts +0 -682
  629. package/packages/broker-sdk/src/__tests__/facade.test.ts +0 -296
  630. package/packages/broker-sdk/src/__tests__/integration.test.ts +0 -170
  631. package/packages/broker-sdk/src/__tests__/quickstart.test.ts +0 -198
  632. package/packages/broker-sdk/src/__tests__/swarm-coordinator.test.ts +0 -772
  633. package/packages/broker-sdk/src/__tests__/unit.test.ts +0 -243
  634. package/packages/broker-sdk/src/__tests__/workflow-runner.test.ts +0 -333
  635. package/packages/broker-sdk/src/client.ts +0 -510
  636. package/packages/broker-sdk/src/index.ts +0 -9
  637. package/packages/broker-sdk/src/logs.ts +0 -163
  638. package/packages/broker-sdk/src/protocol.ts +0 -271
  639. package/packages/broker-sdk/src/pty.ts +0 -16
  640. package/packages/broker-sdk/src/relay.ts +0 -614
  641. package/packages/broker-sdk/src/relaycast.ts +0 -185
  642. package/packages/broker-sdk/src/shadow.ts +0 -230
  643. package/packages/broker-sdk/src/workflows/README.md +0 -514
  644. package/packages/broker-sdk/src/workflows/builder.ts +0 -241
  645. package/packages/broker-sdk/src/workflows/builtin-templates/bug-fix.yaml +0 -75
  646. package/packages/broker-sdk/src/workflows/builtin-templates/code-review.yaml +0 -82
  647. package/packages/broker-sdk/src/workflows/builtin-templates/documentation.yaml +0 -70
  648. package/packages/broker-sdk/src/workflows/builtin-templates/feature-dev.yaml +0 -76
  649. package/packages/broker-sdk/src/workflows/builtin-templates/refactor.yaml +0 -82
  650. package/packages/broker-sdk/src/workflows/builtin-templates/security-audit.yaml +0 -84
  651. package/packages/broker-sdk/src/workflows/cli.ts +0 -93
  652. package/packages/broker-sdk/src/workflows/coordinator.ts +0 -758
  653. package/packages/broker-sdk/src/workflows/index.ts +0 -10
  654. package/packages/broker-sdk/src/workflows/run.ts +0 -55
  655. package/packages/broker-sdk/src/workflows/runner.ts +0 -1184
  656. package/packages/broker-sdk/src/workflows/schema.json +0 -333
  657. package/packages/broker-sdk/src/workflows/templates.ts +0 -544
  658. package/packages/broker-sdk/src/workflows/trajectory.ts +0 -507
  659. package/packages/broker-sdk/src/workflows/types.ts +0 -208
  660. package/packages/broker-sdk/tsconfig.json +0 -22
  661. package/packages/broker-sdk/vitest.config.ts +0 -9
  662. package/packages/continuity/dist/formatter.d.ts +0 -57
  663. package/packages/continuity/dist/formatter.d.ts.map +0 -1
  664. package/packages/continuity/dist/formatter.js +0 -448
  665. package/packages/continuity/dist/formatter.js.map +0 -1
  666. package/packages/continuity/dist/handoff-store.d.ts +0 -67
  667. package/packages/continuity/dist/handoff-store.d.ts.map +0 -1
  668. package/packages/continuity/dist/handoff-store.js +0 -472
  669. package/packages/continuity/dist/handoff-store.js.map +0 -1
  670. package/packages/continuity/dist/index.d.ts +0 -10
  671. package/packages/continuity/dist/index.d.ts.map +0 -1
  672. package/packages/continuity/dist/index.js +0 -11
  673. package/packages/continuity/dist/index.js.map +0 -1
  674. package/packages/continuity/dist/ledger-store.d.ts +0 -110
  675. package/packages/continuity/dist/ledger-store.d.ts.map +0 -1
  676. package/packages/continuity/dist/ledger-store.js +0 -500
  677. package/packages/continuity/dist/ledger-store.js.map +0 -1
  678. package/packages/continuity/dist/manager.d.ts +0 -183
  679. package/packages/continuity/dist/manager.d.ts.map +0 -1
  680. package/packages/continuity/dist/manager.js +0 -616
  681. package/packages/continuity/dist/manager.js.map +0 -1
  682. package/packages/continuity/dist/parser.d.ts +0 -76
  683. package/packages/continuity/dist/parser.d.ts.map +0 -1
  684. package/packages/continuity/dist/parser.js +0 -579
  685. package/packages/continuity/dist/parser.js.map +0 -1
  686. package/packages/continuity/dist/types.d.ts +0 -180
  687. package/packages/continuity/dist/types.d.ts.map +0 -1
  688. package/packages/continuity/dist/types.js +0 -2
  689. package/packages/continuity/dist/types.js.map +0 -1
  690. package/packages/continuity/package.json +0 -40
  691. package/packages/continuity/src/formatter.ts +0 -536
  692. package/packages/continuity/src/handoff-store.ts +0 -523
  693. package/packages/continuity/src/index.ts +0 -12
  694. package/packages/continuity/src/ledger-store.ts +0 -594
  695. package/packages/continuity/src/manager.test.ts +0 -291
  696. package/packages/continuity/src/manager.ts +0 -774
  697. package/packages/continuity/src/parser.test.ts +0 -292
  698. package/packages/continuity/src/parser.ts +0 -680
  699. package/packages/continuity/src/types.ts +0 -211
  700. package/packages/continuity/tsconfig.json +0 -21
  701. package/packages/continuity/vitest.config.ts +0 -9
  702. package/packages/daemon/dist/agent-manager.d.ts +0 -134
  703. package/packages/daemon/dist/agent-manager.d.ts.map +0 -1
  704. package/packages/daemon/dist/agent-manager.js +0 -578
  705. package/packages/daemon/dist/agent-manager.js.map +0 -1
  706. package/packages/daemon/dist/agent-registry.d.ts +0 -99
  707. package/packages/daemon/dist/agent-registry.d.ts.map +0 -1
  708. package/packages/daemon/dist/agent-registry.js +0 -213
  709. package/packages/daemon/dist/agent-registry.js.map +0 -1
  710. package/packages/daemon/dist/agent-signing.d.ts +0 -158
  711. package/packages/daemon/dist/agent-signing.d.ts.map +0 -1
  712. package/packages/daemon/dist/agent-signing.js +0 -523
  713. package/packages/daemon/dist/agent-signing.js.map +0 -1
  714. package/packages/daemon/dist/api.d.ts +0 -106
  715. package/packages/daemon/dist/api.d.ts.map +0 -1
  716. package/packages/daemon/dist/api.js +0 -895
  717. package/packages/daemon/dist/api.js.map +0 -1
  718. package/packages/daemon/dist/auth.d.ts +0 -94
  719. package/packages/daemon/dist/auth.d.ts.map +0 -1
  720. package/packages/daemon/dist/auth.js +0 -197
  721. package/packages/daemon/dist/auth.js.map +0 -1
  722. package/packages/daemon/dist/channel-membership-store.d.ts +0 -55
  723. package/packages/daemon/dist/channel-membership-store.d.ts.map +0 -1
  724. package/packages/daemon/dist/channel-membership-store.js +0 -176
  725. package/packages/daemon/dist/channel-membership-store.js.map +0 -1
  726. package/packages/daemon/dist/cli-auth.d.ts +0 -97
  727. package/packages/daemon/dist/cli-auth.d.ts.map +0 -1
  728. package/packages/daemon/dist/cli-auth.js +0 -808
  729. package/packages/daemon/dist/cli-auth.js.map +0 -1
  730. package/packages/daemon/dist/cloud-sync.d.ts +0 -263
  731. package/packages/daemon/dist/cloud-sync.d.ts.map +0 -1
  732. package/packages/daemon/dist/cloud-sync.js +0 -820
  733. package/packages/daemon/dist/cloud-sync.js.map +0 -1
  734. package/packages/daemon/dist/connection.d.ts +0 -137
  735. package/packages/daemon/dist/connection.d.ts.map +0 -1
  736. package/packages/daemon/dist/connection.js +0 -465
  737. package/packages/daemon/dist/connection.js.map +0 -1
  738. package/packages/daemon/dist/consensus-integration.d.ts +0 -168
  739. package/packages/daemon/dist/consensus-integration.d.ts.map +0 -1
  740. package/packages/daemon/dist/consensus-integration.js +0 -371
  741. package/packages/daemon/dist/consensus-integration.js.map +0 -1
  742. package/packages/daemon/dist/consensus.d.ts +0 -269
  743. package/packages/daemon/dist/consensus.d.ts.map +0 -1
  744. package/packages/daemon/dist/consensus.js +0 -632
  745. package/packages/daemon/dist/consensus.js.map +0 -1
  746. package/packages/daemon/dist/delivery-tracker.d.ts +0 -34
  747. package/packages/daemon/dist/delivery-tracker.d.ts.map +0 -1
  748. package/packages/daemon/dist/delivery-tracker.js +0 -104
  749. package/packages/daemon/dist/delivery-tracker.js.map +0 -1
  750. package/packages/daemon/dist/enhanced-features.d.ts +0 -118
  751. package/packages/daemon/dist/enhanced-features.d.ts.map +0 -1
  752. package/packages/daemon/dist/enhanced-features.js +0 -177
  753. package/packages/daemon/dist/enhanced-features.js.map +0 -1
  754. package/packages/daemon/dist/index.d.ts +0 -29
  755. package/packages/daemon/dist/index.d.ts.map +0 -1
  756. package/packages/daemon/dist/index.js +0 -34
  757. package/packages/daemon/dist/index.js.map +0 -1
  758. package/packages/daemon/dist/orchestrator.d.ts +0 -217
  759. package/packages/daemon/dist/orchestrator.d.ts.map +0 -1
  760. package/packages/daemon/dist/orchestrator.js +0 -1172
  761. package/packages/daemon/dist/orchestrator.js.map +0 -1
  762. package/packages/daemon/dist/rate-limiter.d.ts +0 -68
  763. package/packages/daemon/dist/rate-limiter.d.ts.map +0 -1
  764. package/packages/daemon/dist/rate-limiter.js +0 -130
  765. package/packages/daemon/dist/rate-limiter.js.map +0 -1
  766. package/packages/daemon/dist/registry.d.ts +0 -9
  767. package/packages/daemon/dist/registry.d.ts.map +0 -1
  768. package/packages/daemon/dist/registry.js +0 -9
  769. package/packages/daemon/dist/registry.js.map +0 -1
  770. package/packages/daemon/dist/repo-manager.d.ts +0 -116
  771. package/packages/daemon/dist/repo-manager.d.ts.map +0 -1
  772. package/packages/daemon/dist/repo-manager.js +0 -384
  773. package/packages/daemon/dist/repo-manager.js.map +0 -1
  774. package/packages/daemon/dist/router.d.ts +0 -389
  775. package/packages/daemon/dist/router.d.ts.map +0 -1
  776. package/packages/daemon/dist/router.js +0 -1607
  777. package/packages/daemon/dist/router.js.map +0 -1
  778. package/packages/daemon/dist/server.d.ts +0 -201
  779. package/packages/daemon/dist/server.d.ts.map +0 -1
  780. package/packages/daemon/dist/server.js +0 -1791
  781. package/packages/daemon/dist/server.js.map +0 -1
  782. package/packages/daemon/dist/spawn-manager.d.ts +0 -119
  783. package/packages/daemon/dist/spawn-manager.d.ts.map +0 -1
  784. package/packages/daemon/dist/spawn-manager.js +0 -319
  785. package/packages/daemon/dist/spawn-manager.js.map +0 -1
  786. package/packages/daemon/dist/sync-queue.d.ts +0 -116
  787. package/packages/daemon/dist/sync-queue.d.ts.map +0 -1
  788. package/packages/daemon/dist/sync-queue.js +0 -361
  789. package/packages/daemon/dist/sync-queue.js.map +0 -1
  790. package/packages/daemon/dist/types.d.ts +0 -133
  791. package/packages/daemon/dist/types.d.ts.map +0 -1
  792. package/packages/daemon/dist/types.js +0 -6
  793. package/packages/daemon/dist/types.js.map +0 -1
  794. package/packages/daemon/dist/workspace-manager.d.ts +0 -80
  795. package/packages/daemon/dist/workspace-manager.d.ts.map +0 -1
  796. package/packages/daemon/dist/workspace-manager.js +0 -314
  797. package/packages/daemon/dist/workspace-manager.js.map +0 -1
  798. package/packages/daemon/package.json +0 -56
  799. package/packages/daemon/src/agent-manager.ts +0 -679
  800. package/packages/daemon/src/agent-registry.ts +0 -284
  801. package/packages/daemon/src/agent-signing.ts +0 -707
  802. package/packages/daemon/src/api.ts +0 -1034
  803. package/packages/daemon/src/auth.ts +0 -276
  804. package/packages/daemon/src/channel-membership-store.ts +0 -217
  805. package/packages/daemon/src/cli-auth.ts +0 -945
  806. package/packages/daemon/src/cloud-sync.ts +0 -1100
  807. package/packages/daemon/src/connection.ts +0 -561
  808. package/packages/daemon/src/consensus-integration.ts +0 -510
  809. package/packages/daemon/src/consensus.ts +0 -848
  810. package/packages/daemon/src/delivery-tracker.ts +0 -145
  811. package/packages/daemon/src/enhanced-features.ts +0 -390
  812. package/packages/daemon/src/index.ts +0 -48
  813. package/packages/daemon/src/orchestrator.test.ts +0 -231
  814. package/packages/daemon/src/orchestrator.ts +0 -1376
  815. package/packages/daemon/src/rate-limiter.ts +0 -172
  816. package/packages/daemon/src/registry.ts +0 -8
  817. package/packages/daemon/src/repo-manager.ts +0 -468
  818. package/packages/daemon/src/router.test.ts +0 -181
  819. package/packages/daemon/src/router.ts +0 -1925
  820. package/packages/daemon/src/server.ts +0 -2051
  821. package/packages/daemon/src/spawn-manager-set-model.test.ts +0 -144
  822. package/packages/daemon/src/spawn-manager.ts +0 -415
  823. package/packages/daemon/src/sync-queue.ts +0 -477
  824. package/packages/daemon/src/types.ts +0 -158
  825. package/packages/daemon/src/workspace-manager.ts +0 -371
  826. package/packages/daemon/tsconfig.json +0 -21
  827. package/packages/daemon/vitest.config.ts +0 -9
  828. package/packages/mcp/CHANGELOG.md +0 -28
  829. package/packages/mcp/LICENSE +0 -190
  830. package/packages/mcp/README.md +0 -266
  831. package/packages/mcp/dist/bin.d.ts +0 -12
  832. package/packages/mcp/dist/bin.d.ts.map +0 -1
  833. package/packages/mcp/dist/bin.js +0 -179
  834. package/packages/mcp/dist/bin.js.map +0 -1
  835. package/packages/mcp/dist/client-adapter.d.ts +0 -164
  836. package/packages/mcp/dist/client-adapter.d.ts.map +0 -1
  837. package/packages/mcp/dist/client-adapter.js +0 -231
  838. package/packages/mcp/dist/client-adapter.js.map +0 -1
  839. package/packages/mcp/dist/cloud.d.ts +0 -13
  840. package/packages/mcp/dist/cloud.d.ts.map +0 -1
  841. package/packages/mcp/dist/cloud.js +0 -25
  842. package/packages/mcp/dist/cloud.js.map +0 -1
  843. package/packages/mcp/dist/errors.d.ts +0 -9
  844. package/packages/mcp/dist/errors.d.ts.map +0 -1
  845. package/packages/mcp/dist/errors.js +0 -9
  846. package/packages/mcp/dist/errors.js.map +0 -1
  847. package/packages/mcp/dist/file-transport.d.ts +0 -103
  848. package/packages/mcp/dist/file-transport.d.ts.map +0 -1
  849. package/packages/mcp/dist/file-transport.js +0 -204
  850. package/packages/mcp/dist/file-transport.js.map +0 -1
  851. package/packages/mcp/dist/hybrid-client.d.ts +0 -5
  852. package/packages/mcp/dist/hybrid-client.d.ts.map +0 -1
  853. package/packages/mcp/dist/hybrid-client.js +0 -23
  854. package/packages/mcp/dist/hybrid-client.js.map +0 -1
  855. package/packages/mcp/dist/index.d.ts +0 -11
  856. package/packages/mcp/dist/index.d.ts.map +0 -1
  857. package/packages/mcp/dist/index.js +0 -25
  858. package/packages/mcp/dist/index.js.map +0 -1
  859. package/packages/mcp/dist/install-cli.d.ts +0 -35
  860. package/packages/mcp/dist/install-cli.d.ts.map +0 -1
  861. package/packages/mcp/dist/install-cli.js +0 -157
  862. package/packages/mcp/dist/install-cli.js.map +0 -1
  863. package/packages/mcp/dist/install.d.ts +0 -123
  864. package/packages/mcp/dist/install.d.ts.map +0 -1
  865. package/packages/mcp/dist/install.js +0 -661
  866. package/packages/mcp/dist/install.js.map +0 -1
  867. package/packages/mcp/dist/prompts/index.d.ts +0 -2
  868. package/packages/mcp/dist/prompts/index.d.ts.map +0 -1
  869. package/packages/mcp/dist/prompts/index.js +0 -2
  870. package/packages/mcp/dist/prompts/index.js.map +0 -1
  871. package/packages/mcp/dist/prompts/protocol.d.ts +0 -11
  872. package/packages/mcp/dist/prompts/protocol.d.ts.map +0 -1
  873. package/packages/mcp/dist/prompts/protocol.js +0 -160
  874. package/packages/mcp/dist/prompts/protocol.js.map +0 -1
  875. package/packages/mcp/dist/resources/agents.d.ts +0 -11
  876. package/packages/mcp/dist/resources/agents.d.ts.map +0 -1
  877. package/packages/mcp/dist/resources/agents.js +0 -17
  878. package/packages/mcp/dist/resources/agents.js.map +0 -1
  879. package/packages/mcp/dist/resources/inbox.d.ts +0 -11
  880. package/packages/mcp/dist/resources/inbox.d.ts.map +0 -1
  881. package/packages/mcp/dist/resources/inbox.js +0 -17
  882. package/packages/mcp/dist/resources/inbox.js.map +0 -1
  883. package/packages/mcp/dist/resources/index.d.ts +0 -4
  884. package/packages/mcp/dist/resources/index.d.ts.map +0 -1
  885. package/packages/mcp/dist/resources/index.js +0 -4
  886. package/packages/mcp/dist/resources/index.js.map +0 -1
  887. package/packages/mcp/dist/resources/project.d.ts +0 -11
  888. package/packages/mcp/dist/resources/project.d.ts.map +0 -1
  889. package/packages/mcp/dist/resources/project.js +0 -21
  890. package/packages/mcp/dist/resources/project.js.map +0 -1
  891. package/packages/mcp/dist/server.d.ts +0 -23
  892. package/packages/mcp/dist/server.d.ts.map +0 -1
  893. package/packages/mcp/dist/server.js +0 -317
  894. package/packages/mcp/dist/server.js.map +0 -1
  895. package/packages/mcp/dist/simple.d.ts +0 -170
  896. package/packages/mcp/dist/simple.d.ts.map +0 -1
  897. package/packages/mcp/dist/simple.js +0 -120
  898. package/packages/mcp/dist/simple.js.map +0 -1
  899. package/packages/mcp/dist/tools/index.d.ts +0 -20
  900. package/packages/mcp/dist/tools/index.d.ts.map +0 -1
  901. package/packages/mcp/dist/tools/index.js +0 -20
  902. package/packages/mcp/dist/tools/index.js.map +0 -1
  903. package/packages/mcp/dist/tools/relay-broadcast.d.ts +0 -20
  904. package/packages/mcp/dist/tools/relay-broadcast.d.ts.map +0 -1
  905. package/packages/mcp/dist/tools/relay-broadcast.js +0 -25
  906. package/packages/mcp/dist/tools/relay-broadcast.js.map +0 -1
  907. package/packages/mcp/dist/tools/relay-channel.d.ts +0 -75
  908. package/packages/mcp/dist/tools/relay-channel.d.ts.map +0 -1
  909. package/packages/mcp/dist/tools/relay-channel.js +0 -124
  910. package/packages/mcp/dist/tools/relay-channel.js.map +0 -1
  911. package/packages/mcp/dist/tools/relay-connected.d.ts +0 -17
  912. package/packages/mcp/dist/tools/relay-connected.d.ts.map +0 -1
  913. package/packages/mcp/dist/tools/relay-connected.js +0 -54
  914. package/packages/mcp/dist/tools/relay-connected.js.map +0 -1
  915. package/packages/mcp/dist/tools/relay-consensus.d.ts +0 -45
  916. package/packages/mcp/dist/tools/relay-consensus.d.ts.map +0 -1
  917. package/packages/mcp/dist/tools/relay-consensus.js +0 -80
  918. package/packages/mcp/dist/tools/relay-consensus.js.map +0 -1
  919. package/packages/mcp/dist/tools/relay-continuity.d.ts +0 -35
  920. package/packages/mcp/dist/tools/relay-continuity.d.ts.map +0 -1
  921. package/packages/mcp/dist/tools/relay-continuity.js +0 -101
  922. package/packages/mcp/dist/tools/relay-continuity.js.map +0 -1
  923. package/packages/mcp/dist/tools/relay-health.d.ts +0 -20
  924. package/packages/mcp/dist/tools/relay-health.d.ts.map +0 -1
  925. package/packages/mcp/dist/tools/relay-health.js +0 -130
  926. package/packages/mcp/dist/tools/relay-health.js.map +0 -1
  927. package/packages/mcp/dist/tools/relay-inbox.d.ts +0 -26
  928. package/packages/mcp/dist/tools/relay-inbox.d.ts.map +0 -1
  929. package/packages/mcp/dist/tools/relay-inbox.js +0 -58
  930. package/packages/mcp/dist/tools/relay-inbox.js.map +0 -1
  931. package/packages/mcp/dist/tools/relay-logs.d.ts +0 -20
  932. package/packages/mcp/dist/tools/relay-logs.d.ts.map +0 -1
  933. package/packages/mcp/dist/tools/relay-logs.js +0 -90
  934. package/packages/mcp/dist/tools/relay-logs.js.map +0 -1
  935. package/packages/mcp/dist/tools/relay-messages.d.ts +0 -32
  936. package/packages/mcp/dist/tools/relay-messages.d.ts.map +0 -1
  937. package/packages/mcp/dist/tools/relay-messages.js +0 -61
  938. package/packages/mcp/dist/tools/relay-messages.js.map +0 -1
  939. package/packages/mcp/dist/tools/relay-metrics.d.ts +0 -17
  940. package/packages/mcp/dist/tools/relay-metrics.d.ts.map +0 -1
  941. package/packages/mcp/dist/tools/relay-metrics.js +0 -124
  942. package/packages/mcp/dist/tools/relay-metrics.js.map +0 -1
  943. package/packages/mcp/dist/tools/relay-release.d.ts +0 -20
  944. package/packages/mcp/dist/tools/relay-release.d.ts.map +0 -1
  945. package/packages/mcp/dist/tools/relay-release.js +0 -44
  946. package/packages/mcp/dist/tools/relay-release.js.map +0 -1
  947. package/packages/mcp/dist/tools/relay-remove-agent.d.ts +0 -20
  948. package/packages/mcp/dist/tools/relay-remove-agent.d.ts.map +0 -1
  949. package/packages/mcp/dist/tools/relay-remove-agent.js +0 -50
  950. package/packages/mcp/dist/tools/relay-remove-agent.js.map +0 -1
  951. package/packages/mcp/dist/tools/relay-send.d.ts +0 -29
  952. package/packages/mcp/dist/tools/relay-send.d.ts.map +0 -1
  953. package/packages/mcp/dist/tools/relay-send.js +0 -73
  954. package/packages/mcp/dist/tools/relay-send.js.map +0 -1
  955. package/packages/mcp/dist/tools/relay-set-model.d.ts +0 -23
  956. package/packages/mcp/dist/tools/relay-set-model.d.ts.map +0 -1
  957. package/packages/mcp/dist/tools/relay-set-model.js +0 -52
  958. package/packages/mcp/dist/tools/relay-set-model.js.map +0 -1
  959. package/packages/mcp/dist/tools/relay-shadow.d.ts +0 -30
  960. package/packages/mcp/dist/tools/relay-shadow.d.ts.map +0 -1
  961. package/packages/mcp/dist/tools/relay-shadow.js +0 -55
  962. package/packages/mcp/dist/tools/relay-shadow.js.map +0 -1
  963. package/packages/mcp/dist/tools/relay-spawn.d.ts +0 -36
  964. package/packages/mcp/dist/tools/relay-spawn.d.ts.map +0 -1
  965. package/packages/mcp/dist/tools/relay-spawn.js +0 -73
  966. package/packages/mcp/dist/tools/relay-spawn.js.map +0 -1
  967. package/packages/mcp/dist/tools/relay-status.d.ts +0 -11
  968. package/packages/mcp/dist/tools/relay-status.d.ts.map +0 -1
  969. package/packages/mcp/dist/tools/relay-status.js +0 -43
  970. package/packages/mcp/dist/tools/relay-status.js.map +0 -1
  971. package/packages/mcp/dist/tools/relay-subscribe.d.ts +0 -27
  972. package/packages/mcp/dist/tools/relay-subscribe.d.ts.map +0 -1
  973. package/packages/mcp/dist/tools/relay-subscribe.js +0 -49
  974. package/packages/mcp/dist/tools/relay-subscribe.js.map +0 -1
  975. package/packages/mcp/dist/tools/relay-who.d.ts +0 -20
  976. package/packages/mcp/dist/tools/relay-who.d.ts.map +0 -1
  977. package/packages/mcp/dist/tools/relay-who.js +0 -62
  978. package/packages/mcp/dist/tools/relay-who.js.map +0 -1
  979. package/packages/mcp/package.json +0 -82
  980. package/packages/mcp/src/bin.ts +0 -200
  981. package/packages/mcp/src/client-adapter.ts +0 -358
  982. package/packages/mcp/src/cloud.ts +0 -41
  983. package/packages/mcp/src/errors.ts +0 -17
  984. package/packages/mcp/src/file-transport.ts +0 -275
  985. package/packages/mcp/src/hybrid-client.ts +0 -25
  986. package/packages/mcp/src/index.ts +0 -143
  987. package/packages/mcp/src/install-cli.ts +0 -210
  988. package/packages/mcp/src/install.ts +0 -820
  989. package/packages/mcp/src/prompts/index.ts +0 -1
  990. package/packages/mcp/src/prompts/protocol.ts +0 -164
  991. package/packages/mcp/src/resources/agents.ts +0 -21
  992. package/packages/mcp/src/resources/inbox.ts +0 -21
  993. package/packages/mcp/src/resources/index.ts +0 -3
  994. package/packages/mcp/src/resources/project.ts +0 -29
  995. package/packages/mcp/src/server.ts +0 -475
  996. package/packages/mcp/src/simple.ts +0 -214
  997. package/packages/mcp/src/tools/index.ts +0 -155
  998. package/packages/mcp/src/tools/relay-broadcast.ts +0 -32
  999. package/packages/mcp/src/tools/relay-channel.ts +0 -151
  1000. package/packages/mcp/src/tools/relay-connected.ts +0 -67
  1001. package/packages/mcp/src/tools/relay-consensus.ts +0 -92
  1002. package/packages/mcp/src/tools/relay-continuity.ts +0 -127
  1003. package/packages/mcp/src/tools/relay-health.ts +0 -148
  1004. package/packages/mcp/src/tools/relay-inbox.ts +0 -70
  1005. package/packages/mcp/src/tools/relay-logs.ts +0 -106
  1006. package/packages/mcp/src/tools/relay-messages.ts +0 -66
  1007. package/packages/mcp/src/tools/relay-metrics.ts +0 -142
  1008. package/packages/mcp/src/tools/relay-release.ts +0 -54
  1009. package/packages/mcp/src/tools/relay-remove-agent.ts +0 -58
  1010. package/packages/mcp/src/tools/relay-send.ts +0 -84
  1011. package/packages/mcp/src/tools/relay-set-model.ts +0 -62
  1012. package/packages/mcp/src/tools/relay-shadow.ts +0 -67
  1013. package/packages/mcp/src/tools/relay-spawn.ts +0 -87
  1014. package/packages/mcp/src/tools/relay-status.ts +0 -57
  1015. package/packages/mcp/src/tools/relay-subscribe.ts +0 -61
  1016. package/packages/mcp/src/tools/relay-who.ts +0 -75
  1017. package/packages/mcp/tests/client.test.ts +0 -451
  1018. package/packages/mcp/tests/discover.test.ts +0 -256
  1019. package/packages/mcp/tests/install.test.ts +0 -123
  1020. package/packages/mcp/tests/prompts.test.ts +0 -12
  1021. package/packages/mcp/tests/resources.test.ts +0 -53
  1022. package/packages/mcp/tests/tools.test.ts +0 -1516
  1023. package/packages/mcp/tsconfig.json +0 -22
  1024. package/packages/mcp/vitest.config.ts +0 -9
  1025. package/packages/protocol/dist/channels.d.ts +0 -137
  1026. package/packages/protocol/dist/channels.d.ts.map +0 -1
  1027. package/packages/protocol/dist/channels.js +0 -154
  1028. package/packages/protocol/dist/channels.js.map +0 -1
  1029. package/packages/protocol/dist/framing.d.ts +0 -80
  1030. package/packages/protocol/dist/framing.d.ts.map +0 -1
  1031. package/packages/protocol/dist/framing.js +0 -206
  1032. package/packages/protocol/dist/framing.js.map +0 -1
  1033. package/packages/protocol/dist/id-generator.d.ts +0 -35
  1034. package/packages/protocol/dist/id-generator.d.ts.map +0 -1
  1035. package/packages/protocol/dist/id-generator.js +0 -60
  1036. package/packages/protocol/dist/id-generator.js.map +0 -1
  1037. package/packages/protocol/dist/index.d.ts +0 -5
  1038. package/packages/protocol/dist/index.d.ts.map +0 -1
  1039. package/packages/protocol/dist/index.js +0 -5
  1040. package/packages/protocol/dist/index.js.map +0 -1
  1041. package/packages/protocol/dist/relay-pty-schemas.d.ts +0 -340
  1042. package/packages/protocol/dist/relay-pty-schemas.d.ts.map +0 -1
  1043. package/packages/protocol/dist/relay-pty-schemas.js +0 -60
  1044. package/packages/protocol/dist/relay-pty-schemas.js.map +0 -1
  1045. package/packages/protocol/dist/types.d.ts +0 -793
  1046. package/packages/protocol/dist/types.d.ts.map +0 -1
  1047. package/packages/protocol/dist/types.js +0 -8
  1048. package/packages/protocol/dist/types.js.map +0 -1
  1049. package/packages/protocol/package.json +0 -61
  1050. package/packages/protocol/src/channels.test.ts +0 -330
  1051. package/packages/protocol/src/channels.ts +0 -270
  1052. package/packages/protocol/src/framing.test.ts +0 -164
  1053. package/packages/protocol/src/framing.ts +0 -242
  1054. package/packages/protocol/src/id-generator.ts +0 -69
  1055. package/packages/protocol/src/index.ts +0 -4
  1056. package/packages/protocol/src/relay-pty-schemas.ts +0 -400
  1057. package/packages/protocol/src/types.test.ts +0 -271
  1058. package/packages/protocol/src/types.ts +0 -988
  1059. package/packages/protocol/tsconfig.json +0 -21
  1060. package/packages/protocol/vitest.config.ts +0 -9
  1061. package/packages/resiliency/dist/cgroup-manager.d.ts +0 -152
  1062. package/packages/resiliency/dist/cgroup-manager.d.ts.map +0 -1
  1063. package/packages/resiliency/dist/cgroup-manager.js +0 -394
  1064. package/packages/resiliency/dist/cgroup-manager.js.map +0 -1
  1065. package/packages/resiliency/dist/context-persistence.d.ts +0 -140
  1066. package/packages/resiliency/dist/context-persistence.d.ts.map +0 -1
  1067. package/packages/resiliency/dist/context-persistence.js +0 -397
  1068. package/packages/resiliency/dist/context-persistence.js.map +0 -1
  1069. package/packages/resiliency/dist/crash-insights.d.ts +0 -156
  1070. package/packages/resiliency/dist/crash-insights.d.ts.map +0 -1
  1071. package/packages/resiliency/dist/crash-insights.js +0 -492
  1072. package/packages/resiliency/dist/crash-insights.js.map +0 -1
  1073. package/packages/resiliency/dist/gossip-health.d.ts +0 -137
  1074. package/packages/resiliency/dist/gossip-health.d.ts.map +0 -1
  1075. package/packages/resiliency/dist/gossip-health.js +0 -241
  1076. package/packages/resiliency/dist/gossip-health.js.map +0 -1
  1077. package/packages/resiliency/dist/health-monitor.d.ts +0 -97
  1078. package/packages/resiliency/dist/health-monitor.d.ts.map +0 -1
  1079. package/packages/resiliency/dist/health-monitor.js +0 -291
  1080. package/packages/resiliency/dist/health-monitor.js.map +0 -1
  1081. package/packages/resiliency/dist/index.d.ts +0 -69
  1082. package/packages/resiliency/dist/index.d.ts.map +0 -1
  1083. package/packages/resiliency/dist/index.js +0 -69
  1084. package/packages/resiliency/dist/index.js.map +0 -1
  1085. package/packages/resiliency/dist/leader-watchdog.d.ts +0 -109
  1086. package/packages/resiliency/dist/leader-watchdog.d.ts.map +0 -1
  1087. package/packages/resiliency/dist/leader-watchdog.js +0 -189
  1088. package/packages/resiliency/dist/leader-watchdog.js.map +0 -1
  1089. package/packages/resiliency/dist/logger.d.ts +0 -114
  1090. package/packages/resiliency/dist/logger.d.ts.map +0 -1
  1091. package/packages/resiliency/dist/logger.js +0 -250
  1092. package/packages/resiliency/dist/logger.js.map +0 -1
  1093. package/packages/resiliency/dist/memory-monitor.d.ts +0 -172
  1094. package/packages/resiliency/dist/memory-monitor.d.ts.map +0 -1
  1095. package/packages/resiliency/dist/memory-monitor.js +0 -599
  1096. package/packages/resiliency/dist/memory-monitor.js.map +0 -1
  1097. package/packages/resiliency/dist/metrics.d.ts +0 -115
  1098. package/packages/resiliency/dist/metrics.d.ts.map +0 -1
  1099. package/packages/resiliency/dist/metrics.js +0 -239
  1100. package/packages/resiliency/dist/metrics.js.map +0 -1
  1101. package/packages/resiliency/dist/provider-context.d.ts +0 -100
  1102. package/packages/resiliency/dist/provider-context.d.ts.map +0 -1
  1103. package/packages/resiliency/dist/provider-context.js +0 -362
  1104. package/packages/resiliency/dist/provider-context.js.map +0 -1
  1105. package/packages/resiliency/dist/stateless-lead.d.ts +0 -149
  1106. package/packages/resiliency/dist/stateless-lead.d.ts.map +0 -1
  1107. package/packages/resiliency/dist/stateless-lead.js +0 -308
  1108. package/packages/resiliency/dist/stateless-lead.js.map +0 -1
  1109. package/packages/resiliency/dist/supervisor.d.ts +0 -147
  1110. package/packages/resiliency/dist/supervisor.d.ts.map +0 -1
  1111. package/packages/resiliency/dist/supervisor.js +0 -459
  1112. package/packages/resiliency/dist/supervisor.js.map +0 -1
  1113. package/packages/resiliency/package.json +0 -38
  1114. package/packages/resiliency/src/cgroup-manager.ts +0 -468
  1115. package/packages/resiliency/src/context-persistence.ts +0 -538
  1116. package/packages/resiliency/src/crash-insights.test.ts +0 -620
  1117. package/packages/resiliency/src/crash-insights.ts +0 -660
  1118. package/packages/resiliency/src/gossip-health.ts +0 -333
  1119. package/packages/resiliency/src/health-monitor.ts +0 -371
  1120. package/packages/resiliency/src/index.ts +0 -157
  1121. package/packages/resiliency/src/leader-watchdog.ts +0 -260
  1122. package/packages/resiliency/src/logger.ts +0 -320
  1123. package/packages/resiliency/src/memory-monitor.test.ts +0 -637
  1124. package/packages/resiliency/src/memory-monitor.ts +0 -740
  1125. package/packages/resiliency/src/metrics.ts +0 -311
  1126. package/packages/resiliency/src/provider-context.ts +0 -452
  1127. package/packages/resiliency/src/stateless-lead.ts +0 -408
  1128. package/packages/resiliency/src/supervisor.ts +0 -578
  1129. package/packages/resiliency/tsconfig.json +0 -21
  1130. package/packages/resiliency/vitest.config.ts +0 -9
  1131. package/packages/sdk/dist/discovery.d.ts +0 -10
  1132. package/packages/sdk/dist/discovery.d.ts.map +0 -1
  1133. package/packages/sdk/dist/discovery.js +0 -22
  1134. package/packages/sdk/dist/discovery.js.map +0 -1
  1135. package/packages/sdk/dist/errors.d.ts +0 -9
  1136. package/packages/sdk/dist/errors.d.ts.map +0 -1
  1137. package/packages/sdk/dist/errors.js +0 -9
  1138. package/packages/sdk/dist/errors.js.map +0 -1
  1139. package/packages/sdk/dist/protocol/index.d.ts +0 -8
  1140. package/packages/sdk/dist/protocol/index.d.ts.map +0 -1
  1141. package/packages/sdk/dist/protocol/index.js +0 -8
  1142. package/packages/sdk/dist/protocol/index.js.map +0 -1
  1143. package/packages/sdk/examples/SWARM_CAPABILITIES.md +0 -498
  1144. package/packages/sdk/examples/SWARM_PATTERNS.md +0 -541
  1145. package/packages/sdk/src/client.test.ts +0 -1041
  1146. package/packages/sdk/src/discovery.ts +0 -38
  1147. package/packages/sdk/src/errors.ts +0 -17
  1148. package/packages/sdk/src/logs.test.ts +0 -98
  1149. package/packages/sdk/src/protocol/framing.test.ts +0 -164
  1150. package/packages/sdk/src/protocol/index.ts +0 -8
  1151. package/packages/spawner/.trajectories/index.json +0 -5
  1152. package/packages/spawner/API.md +0 -256
  1153. package/packages/spawner/dist/index.d.ts +0 -8
  1154. package/packages/spawner/dist/index.d.ts.map +0 -1
  1155. package/packages/spawner/dist/index.js +0 -8
  1156. package/packages/spawner/dist/index.js.map +0 -1
  1157. package/packages/spawner/dist/types.d.ts +0 -552
  1158. package/packages/spawner/dist/types.d.ts.map +0 -1
  1159. package/packages/spawner/dist/types.js +0 -193
  1160. package/packages/spawner/dist/types.js.map +0 -1
  1161. package/packages/spawner/package.json +0 -47
  1162. package/packages/spawner/src/index.ts +0 -8
  1163. package/packages/spawner/src/types.test.ts +0 -385
  1164. package/packages/spawner/src/types.ts +0 -228
  1165. package/packages/spawner/tsconfig.json +0 -19
  1166. package/packages/spawner/vitest.config.ts +0 -9
  1167. package/packages/state/dist/agent-state.d.ts +0 -40
  1168. package/packages/state/dist/agent-state.d.ts.map +0 -1
  1169. package/packages/state/dist/agent-state.js +0 -120
  1170. package/packages/state/dist/agent-state.js.map +0 -1
  1171. package/packages/state/dist/index.d.ts +0 -8
  1172. package/packages/state/dist/index.d.ts.map +0 -1
  1173. package/packages/state/dist/index.js +0 -8
  1174. package/packages/state/dist/index.js.map +0 -1
  1175. package/packages/state/package.json +0 -37
  1176. package/packages/state/src/agent-state.test.ts +0 -335
  1177. package/packages/state/src/agent-state.ts +0 -153
  1178. package/packages/state/src/index.ts +0 -12
  1179. package/packages/state/tsconfig.json +0 -21
  1180. package/packages/state/vitest.config.ts +0 -9
  1181. package/packages/storage/dist/adapter.d.ts +0 -189
  1182. package/packages/storage/dist/adapter.d.ts.map +0 -1
  1183. package/packages/storage/dist/adapter.js +0 -267
  1184. package/packages/storage/dist/adapter.js.map +0 -1
  1185. package/packages/storage/dist/batched-sqlite-adapter.d.ts +0 -75
  1186. package/packages/storage/dist/batched-sqlite-adapter.d.ts.map +0 -1
  1187. package/packages/storage/dist/batched-sqlite-adapter.js +0 -189
  1188. package/packages/storage/dist/batched-sqlite-adapter.js.map +0 -1
  1189. package/packages/storage/dist/dead-letter-queue.d.ts +0 -196
  1190. package/packages/storage/dist/dead-letter-queue.d.ts.map +0 -1
  1191. package/packages/storage/dist/dead-letter-queue.js +0 -427
  1192. package/packages/storage/dist/dead-letter-queue.js.map +0 -1
  1193. package/packages/storage/dist/dlq-adapter.d.ts +0 -195
  1194. package/packages/storage/dist/dlq-adapter.d.ts.map +0 -1
  1195. package/packages/storage/dist/dlq-adapter.js +0 -664
  1196. package/packages/storage/dist/dlq-adapter.js.map +0 -1
  1197. package/packages/storage/dist/index.d.ts +0 -6
  1198. package/packages/storage/dist/index.d.ts.map +0 -1
  1199. package/packages/storage/dist/index.js +0 -7
  1200. package/packages/storage/dist/index.js.map +0 -1
  1201. package/packages/storage/dist/jsonl-adapter.d.ts +0 -91
  1202. package/packages/storage/dist/jsonl-adapter.d.ts.map +0 -1
  1203. package/packages/storage/dist/jsonl-adapter.js +0 -580
  1204. package/packages/storage/dist/jsonl-adapter.js.map +0 -1
  1205. package/packages/storage/dist/sqlite-adapter.d.ts +0 -131
  1206. package/packages/storage/dist/sqlite-adapter.d.ts.map +0 -1
  1207. package/packages/storage/dist/sqlite-adapter.js +0 -865
  1208. package/packages/storage/dist/sqlite-adapter.js.map +0 -1
  1209. package/packages/storage/package.json +0 -74
  1210. package/packages/storage/src/adapter.ts +0 -446
  1211. package/packages/storage/src/batched-sqlite-adapter.test.ts +0 -256
  1212. package/packages/storage/src/batched-sqlite-adapter.ts +0 -239
  1213. package/packages/storage/src/dead-letter-queue.ts +0 -643
  1214. package/packages/storage/src/dlq-adapter.test.ts +0 -509
  1215. package/packages/storage/src/dlq-adapter.ts +0 -954
  1216. package/packages/storage/src/index.ts +0 -6
  1217. package/packages/storage/src/jsonl-adapter.test.ts +0 -239
  1218. package/packages/storage/src/jsonl-adapter.ts +0 -704
  1219. package/packages/storage/src/memory-adapter.test.ts +0 -36
  1220. package/packages/storage/src/sqlite-adapter.test.ts +0 -580
  1221. package/packages/storage/src/sqlite-adapter.ts +0 -1099
  1222. package/packages/storage/tsconfig.json +0 -21
  1223. package/packages/storage/vitest.config.ts +0 -9
  1224. package/packages/wrapper/dist/__fixtures__/claude-outputs.d.ts +0 -49
  1225. package/packages/wrapper/dist/__fixtures__/claude-outputs.d.ts.map +0 -1
  1226. package/packages/wrapper/dist/__fixtures__/claude-outputs.js +0 -443
  1227. package/packages/wrapper/dist/__fixtures__/claude-outputs.js.map +0 -1
  1228. package/packages/wrapper/dist/__fixtures__/codex-outputs.d.ts +0 -9
  1229. package/packages/wrapper/dist/__fixtures__/codex-outputs.d.ts.map +0 -1
  1230. package/packages/wrapper/dist/__fixtures__/codex-outputs.js +0 -94
  1231. package/packages/wrapper/dist/__fixtures__/codex-outputs.js.map +0 -1
  1232. package/packages/wrapper/dist/__fixtures__/gemini-outputs.d.ts +0 -19
  1233. package/packages/wrapper/dist/__fixtures__/gemini-outputs.d.ts.map +0 -1
  1234. package/packages/wrapper/dist/__fixtures__/gemini-outputs.js +0 -144
  1235. package/packages/wrapper/dist/__fixtures__/gemini-outputs.js.map +0 -1
  1236. package/packages/wrapper/dist/__fixtures__/index.d.ts +0 -68
  1237. package/packages/wrapper/dist/__fixtures__/index.d.ts.map +0 -1
  1238. package/packages/wrapper/dist/__fixtures__/index.js +0 -44
  1239. package/packages/wrapper/dist/__fixtures__/index.js.map +0 -1
  1240. package/packages/wrapper/dist/auth-detection.d.ts +0 -49
  1241. package/packages/wrapper/dist/auth-detection.d.ts.map +0 -1
  1242. package/packages/wrapper/dist/auth-detection.js +0 -199
  1243. package/packages/wrapper/dist/auth-detection.js.map +0 -1
  1244. package/packages/wrapper/dist/base-wrapper.d.ts +0 -254
  1245. package/packages/wrapper/dist/base-wrapper.d.ts.map +0 -1
  1246. package/packages/wrapper/dist/base-wrapper.js +0 -664
  1247. package/packages/wrapper/dist/base-wrapper.js.map +0 -1
  1248. package/packages/wrapper/dist/client.d.ts +0 -291
  1249. package/packages/wrapper/dist/client.d.ts.map +0 -1
  1250. package/packages/wrapper/dist/client.js +0 -926
  1251. package/packages/wrapper/dist/client.js.map +0 -1
  1252. package/packages/wrapper/dist/id-generator.d.ts +0 -35
  1253. package/packages/wrapper/dist/id-generator.d.ts.map +0 -1
  1254. package/packages/wrapper/dist/id-generator.js +0 -60
  1255. package/packages/wrapper/dist/id-generator.js.map +0 -1
  1256. package/packages/wrapper/dist/idle-detector.d.ts +0 -114
  1257. package/packages/wrapper/dist/idle-detector.d.ts.map +0 -1
  1258. package/packages/wrapper/dist/idle-detector.js +0 -317
  1259. package/packages/wrapper/dist/idle-detector.js.map +0 -1
  1260. package/packages/wrapper/dist/inbox.d.ts +0 -37
  1261. package/packages/wrapper/dist/inbox.d.ts.map +0 -1
  1262. package/packages/wrapper/dist/inbox.js +0 -73
  1263. package/packages/wrapper/dist/inbox.js.map +0 -1
  1264. package/packages/wrapper/dist/index.d.ts +0 -40
  1265. package/packages/wrapper/dist/index.d.ts.map +0 -1
  1266. package/packages/wrapper/dist/index.js +0 -53
  1267. package/packages/wrapper/dist/index.js.map +0 -1
  1268. package/packages/wrapper/dist/opencode-api.d.ts +0 -106
  1269. package/packages/wrapper/dist/opencode-api.d.ts.map +0 -1
  1270. package/packages/wrapper/dist/opencode-api.js +0 -219
  1271. package/packages/wrapper/dist/opencode-api.js.map +0 -1
  1272. package/packages/wrapper/dist/opencode-wrapper.d.ts +0 -161
  1273. package/packages/wrapper/dist/opencode-wrapper.d.ts.map +0 -1
  1274. package/packages/wrapper/dist/opencode-wrapper.js +0 -438
  1275. package/packages/wrapper/dist/opencode-wrapper.js.map +0 -1
  1276. package/packages/wrapper/dist/parser.d.ts +0 -236
  1277. package/packages/wrapper/dist/parser.d.ts.map +0 -1
  1278. package/packages/wrapper/dist/parser.js +0 -1238
  1279. package/packages/wrapper/dist/parser.js.map +0 -1
  1280. package/packages/wrapper/dist/prompt-composer.d.ts +0 -67
  1281. package/packages/wrapper/dist/prompt-composer.d.ts.map +0 -1
  1282. package/packages/wrapper/dist/prompt-composer.js +0 -168
  1283. package/packages/wrapper/dist/prompt-composer.js.map +0 -1
  1284. package/packages/wrapper/dist/relay-pty-orchestrator.d.ts +0 -486
  1285. package/packages/wrapper/dist/relay-pty-orchestrator.d.ts.map +0 -1
  1286. package/packages/wrapper/dist/relay-pty-orchestrator.js +0 -2550
  1287. package/packages/wrapper/dist/relay-pty-orchestrator.js.map +0 -1
  1288. package/packages/wrapper/dist/shared.d.ts +0 -262
  1289. package/packages/wrapper/dist/shared.d.ts.map +0 -1
  1290. package/packages/wrapper/dist/shared.js +0 -507
  1291. package/packages/wrapper/dist/shared.js.map +0 -1
  1292. package/packages/wrapper/dist/stuck-detector.d.ts +0 -161
  1293. package/packages/wrapper/dist/stuck-detector.d.ts.map +0 -1
  1294. package/packages/wrapper/dist/stuck-detector.js +0 -402
  1295. package/packages/wrapper/dist/stuck-detector.js.map +0 -1
  1296. package/packages/wrapper/dist/tmux-resolver.d.ts +0 -55
  1297. package/packages/wrapper/dist/tmux-resolver.d.ts.map +0 -1
  1298. package/packages/wrapper/dist/tmux-resolver.js +0 -175
  1299. package/packages/wrapper/dist/tmux-resolver.js.map +0 -1
  1300. package/packages/wrapper/dist/tmux-wrapper.d.ts +0 -352
  1301. package/packages/wrapper/dist/tmux-wrapper.d.ts.map +0 -1
  1302. package/packages/wrapper/dist/tmux-wrapper.js +0 -1816
  1303. package/packages/wrapper/dist/tmux-wrapper.js.map +0 -1
  1304. package/packages/wrapper/dist/trajectory-integration.d.ts +0 -292
  1305. package/packages/wrapper/dist/trajectory-integration.d.ts.map +0 -1
  1306. package/packages/wrapper/dist/trajectory-integration.js +0 -979
  1307. package/packages/wrapper/dist/trajectory-integration.js.map +0 -1
  1308. package/packages/wrapper/dist/wrapper-events.d.ts +0 -489
  1309. package/packages/wrapper/dist/wrapper-events.d.ts.map +0 -1
  1310. package/packages/wrapper/dist/wrapper-events.js +0 -252
  1311. package/packages/wrapper/dist/wrapper-events.js.map +0 -1
  1312. package/packages/wrapper/dist/wrapper-types.d.ts +0 -41
  1313. package/packages/wrapper/dist/wrapper-types.d.ts.map +0 -1
  1314. package/packages/wrapper/dist/wrapper-types.js +0 -7
  1315. package/packages/wrapper/dist/wrapper-types.js.map +0 -1
  1316. package/packages/wrapper/package.json +0 -60
  1317. package/packages/wrapper/src/__fixtures__/claude-outputs.ts +0 -471
  1318. package/packages/wrapper/src/__fixtures__/codex-outputs.ts +0 -99
  1319. package/packages/wrapper/src/__fixtures__/gemini-outputs.ts +0 -151
  1320. package/packages/wrapper/src/__fixtures__/index.ts +0 -47
  1321. package/packages/wrapper/src/auth-detection.ts +0 -244
  1322. package/packages/wrapper/src/base-wrapper.test.ts +0 -589
  1323. package/packages/wrapper/src/base-wrapper.ts +0 -841
  1324. package/packages/wrapper/src/client.test.ts +0 -351
  1325. package/packages/wrapper/src/client.ts +0 -1166
  1326. package/packages/wrapper/src/id-generator.test.ts +0 -71
  1327. package/packages/wrapper/src/id-generator.ts +0 -69
  1328. package/packages/wrapper/src/idle-detector.test.ts +0 -418
  1329. package/packages/wrapper/src/idle-detector.ts +0 -384
  1330. package/packages/wrapper/src/inbox.test.ts +0 -233
  1331. package/packages/wrapper/src/inbox.ts +0 -89
  1332. package/packages/wrapper/src/index.ts +0 -199
  1333. package/packages/wrapper/src/opencode-api.test.ts +0 -292
  1334. package/packages/wrapper/src/opencode-api.ts +0 -285
  1335. package/packages/wrapper/src/opencode-wrapper.ts +0 -541
  1336. package/packages/wrapper/src/parser.regression.test.ts +0 -251
  1337. package/packages/wrapper/src/parser.test.ts +0 -1359
  1338. package/packages/wrapper/src/parser.ts +0 -1477
  1339. package/packages/wrapper/src/prompt-composer.test.ts +0 -219
  1340. package/packages/wrapper/src/prompt-composer.ts +0 -231
  1341. package/packages/wrapper/src/relay-pty-orchestrator.test.ts +0 -1386
  1342. package/packages/wrapper/src/relay-pty-orchestrator.ts +0 -3041
  1343. package/packages/wrapper/src/shared.test.ts +0 -467
  1344. package/packages/wrapper/src/shared.ts +0 -652
  1345. package/packages/wrapper/src/stuck-detector.test.ts +0 -303
  1346. package/packages/wrapper/src/stuck-detector.ts +0 -511
  1347. package/packages/wrapper/src/tmux-resolver.test.ts +0 -104
  1348. package/packages/wrapper/src/tmux-resolver.ts +0 -207
  1349. package/packages/wrapper/src/tmux-wrapper.test.ts +0 -316
  1350. package/packages/wrapper/src/tmux-wrapper.ts +0 -2095
  1351. package/packages/wrapper/src/trajectory-detection.test.ts +0 -151
  1352. package/packages/wrapper/src/trajectory-integration.ts +0 -1261
  1353. package/packages/wrapper/src/wrapper-events.ts +0 -395
  1354. package/packages/wrapper/src/wrapper-types.ts +0 -45
  1355. package/packages/wrapper/tsconfig.json +0 -19
  1356. package/packages/wrapper/vitest.config.ts +0 -9
  1357. /package/packages/{broker-sdk → sdk}/dist/__tests__/facade.test.d.ts +0 -0
  1358. /package/packages/{broker-sdk → sdk}/dist/__tests__/facade.test.d.ts.map +0 -0
  1359. /package/packages/{broker-sdk → sdk}/dist/__tests__/integration.test.d.ts +0 -0
  1360. /package/packages/{broker-sdk → sdk}/dist/__tests__/integration.test.d.ts.map +0 -0
  1361. /package/packages/{broker-sdk → sdk}/dist/__tests__/quickstart.test.d.ts +0 -0
  1362. /package/packages/{broker-sdk → sdk}/dist/__tests__/quickstart.test.d.ts.map +0 -0
  1363. /package/packages/{broker-sdk → sdk}/dist/__tests__/unit.test.d.ts +0 -0
  1364. /package/packages/{broker-sdk → sdk}/dist/__tests__/unit.test.d.ts.map +0 -0
  1365. /package/packages/{broker-sdk → sdk}/dist/browser.d.ts +0 -0
  1366. /package/packages/{broker-sdk → sdk}/dist/browser.d.ts.map +0 -0
  1367. /package/packages/{broker-sdk → sdk}/dist/browser.js +0 -0
  1368. /package/packages/{broker-sdk → sdk}/dist/browser.js.map +0 -0
  1369. /package/packages/{broker-sdk → sdk}/dist/consensus-helpers.d.ts +0 -0
  1370. /package/packages/{broker-sdk → sdk}/dist/consensus-helpers.d.ts.map +0 -0
  1371. /package/packages/{broker-sdk → sdk}/dist/consensus-helpers.js +0 -0
  1372. /package/packages/{broker-sdk → sdk}/dist/consensus-helpers.js.map +0 -0
  1373. /package/packages/{broker-sdk → sdk}/dist/consensus.d.ts +0 -0
  1374. /package/packages/{broker-sdk → sdk}/dist/consensus.d.ts.map +0 -0
  1375. /package/packages/{broker-sdk → sdk}/dist/consensus.js +0 -0
  1376. /package/packages/{broker-sdk → sdk}/dist/consensus.js.map +0 -0
  1377. /package/packages/{broker-sdk → sdk}/dist/examples/demo.d.ts +0 -0
  1378. /package/packages/{broker-sdk → sdk}/dist/examples/demo.d.ts.map +0 -0
  1379. /package/packages/{broker-sdk → sdk}/dist/examples/demo.js +0 -0
  1380. /package/packages/{broker-sdk → sdk}/dist/examples/demo.js.map +0 -0
  1381. /package/packages/{broker-sdk → sdk}/dist/examples/example.d.ts +0 -0
  1382. /package/packages/{broker-sdk → sdk}/dist/examples/example.d.ts.map +0 -0
  1383. /package/packages/{broker-sdk → sdk}/dist/examples/example.js +0 -0
  1384. /package/packages/{broker-sdk → sdk}/dist/examples/example.js.map +0 -0
  1385. /package/packages/{broker-sdk → sdk}/dist/examples/quickstart.d.ts +0 -0
  1386. /package/packages/{broker-sdk → sdk}/dist/examples/quickstart.d.ts.map +0 -0
  1387. /package/packages/{broker-sdk → sdk}/dist/examples/quickstart.js +0 -0
  1388. /package/packages/{broker-sdk → sdk}/dist/examples/quickstart.js.map +0 -0
  1389. /package/packages/{broker-sdk → sdk}/dist/examples/ralph-loop.d.ts +0 -0
  1390. /package/packages/{broker-sdk → sdk}/dist/examples/ralph-loop.d.ts.map +0 -0
  1391. /package/packages/{broker-sdk → sdk}/dist/examples/ralph-loop.js +0 -0
  1392. /package/packages/{broker-sdk → sdk}/dist/examples/ralph-loop.js.map +0 -0
  1393. /package/packages/{broker-sdk → sdk}/dist/protocol.js +0 -0
  1394. /package/packages/{broker-sdk → sdk}/dist/protocol.js.map +0 -0
  1395. /package/packages/{broker-sdk → sdk}/dist/pty.d.ts +0 -0
  1396. /package/packages/{broker-sdk → sdk}/dist/shadow.js +0 -0
  1397. /package/packages/{broker-sdk → sdk}/dist/workflows/barrier.d.ts +0 -0
  1398. /package/packages/{broker-sdk → sdk}/dist/workflows/barrier.d.ts.map +0 -0
  1399. /package/packages/{broker-sdk → sdk}/dist/workflows/barrier.js +0 -0
  1400. /package/packages/{broker-sdk → sdk}/dist/workflows/barrier.js.map +0 -0
  1401. /package/packages/{broker-sdk → sdk}/dist/workflows/memory-db.d.ts +0 -0
  1402. /package/packages/{broker-sdk → sdk}/dist/workflows/memory-db.d.ts.map +0 -0
  1403. /package/packages/{broker-sdk → sdk}/dist/workflows/memory-db.js +0 -0
  1404. /package/packages/{broker-sdk → sdk}/dist/workflows/memory-db.js.map +0 -0
  1405. /package/packages/{broker-sdk → sdk}/dist/workflows/state.d.ts +0 -0
  1406. /package/packages/{broker-sdk → sdk}/dist/workflows/state.d.ts.map +0 -0
  1407. /package/packages/{broker-sdk → sdk}/dist/workflows/state.js +0 -0
  1408. /package/packages/{broker-sdk → sdk}/dist/workflows/state.js.map +0 -0
  1409. /package/packages/{broker-sdk → sdk}/src/__tests__/workflow-trajectory.test.ts +0 -0
  1410. /package/packages/{broker-sdk → sdk}/src/browser.ts +0 -0
  1411. /package/packages/{broker-sdk → sdk}/src/consensus-helpers.ts +0 -0
  1412. /package/packages/{broker-sdk → sdk}/src/consensus.ts +0 -0
  1413. /package/packages/{broker-sdk → sdk}/src/examples/demo.ts +0 -0
  1414. /package/packages/{broker-sdk → sdk}/src/examples/example.ts +0 -0
  1415. /package/packages/{broker-sdk → sdk}/src/examples/quickstart.ts +0 -0
  1416. /package/packages/{broker-sdk → sdk}/src/examples/ralph-loop.ts +0 -0
  1417. /package/packages/{broker-sdk → sdk}/src/examples/sample-prd.json +0 -0
  1418. /package/packages/{broker-sdk → sdk}/src/workflows/barrier.ts +0 -0
  1419. /package/packages/{broker-sdk → sdk}/src/workflows/memory-db.ts +0 -0
  1420. /package/packages/{broker-sdk → sdk}/src/workflows/state.ts +0 -0
@@ -1,1925 +0,0 @@
1
- /**
2
- * Message router for the agent relay daemon.
3
- * Handles routing messages between agents, topic subscriptions, and broadcast.
4
- */
5
-
6
- import { generateId } from '@agent-relay/wrapper';
7
- import {
8
- type Envelope,
9
- type SendEnvelope,
10
- type DeliverEnvelope,
11
- type AckPayload,
12
- type ErrorPayload,
13
- type ShadowConfig,
14
- type SpeakOnTrigger,
15
- type EntityType,
16
- PROTOCOL_VERSION,
17
- } from '@agent-relay/protocol/types';
18
- import type {
19
- ChannelJoinPayload,
20
- ChannelLeavePayload,
21
- ChannelMessagePayload,
22
- } from '@agent-relay/protocol/channels';
23
- import type { StorageAdapter } from '@agent-relay/storage/adapter';
24
- import type { AgentRegistry } from './agent-registry.js';
25
- import { routerLog } from '@agent-relay/utils/logger';
26
- import { RateLimiter, NoOpRateLimiter, type RateLimitConfig } from './rate-limiter.js';
27
- import * as crypto from 'node:crypto';
28
- import {
29
- DeliveryTracker,
30
- type DeliveryReliabilityOptions,
31
- } from './delivery-tracker.js';
32
- import type { ChannelMembershipStore } from './channel-membership-store.js';
33
-
34
- export interface RoutableConnection {
35
- id: string;
36
- agentName?: string;
37
- /** Entity type: 'agent' (default) or 'user' for human users */
38
- entityType?: EntityType;
39
- cli?: string;
40
- program?: string;
41
- model?: string;
42
- task?: string;
43
- workingDirectory?: string;
44
- team?: string;
45
- sessionId: string;
46
- close(): void;
47
- send(envelope: Envelope): boolean;
48
- getNextSeq(topic: string, peer: string): number;
49
- }
50
-
51
- export interface RemoteAgentInfo {
52
- name: string;
53
- status: string;
54
- daemonId: string;
55
- daemonName: string;
56
- machineId: string;
57
- }
58
-
59
- export interface CrossMachineHandler {
60
- sendCrossMachineMessage(
61
- targetDaemonId: string,
62
- targetAgent: string,
63
- fromAgent: string,
64
- content: string,
65
- metadata?: Record<string, unknown>
66
- ): Promise<boolean>;
67
- isRemoteAgent(agentName: string): RemoteAgentInfo | undefined;
68
- /** Check if a user is on a remote machine (connected via cloud dashboard) */
69
- isRemoteUser?(userName: string): RemoteAgentInfo | undefined;
70
- }
71
-
72
- interface ProcessingState {
73
- startedAt: number;
74
- messageId: string;
75
- timer?: NodeJS.Timeout;
76
- }
77
-
78
- /** Internal shadow relationship with resolved defaults */
79
- interface ShadowRelationship extends ShadowConfig {
80
- shadowAgent: string;
81
- }
82
-
83
- export class Router {
84
- private storage?: StorageAdapter;
85
- private channelMembershipStore?: ChannelMembershipStore;
86
- private connections: Map<string, RoutableConnection> = new Map(); // connectionId -> Connection
87
- private agents: Map<string, RoutableConnection> = new Map(); // agentName -> Connection
88
- private subscriptions: Map<string, Set<string>> = new Map(); // topic -> Set<agentName>
89
- private processingAgents: Map<string, ProcessingState> = new Map(); // agentName -> processing state
90
- private registry?: AgentRegistry;
91
- private crossMachineHandler?: CrossMachineHandler;
92
- private deliveryTracker: DeliveryTracker;
93
-
94
- /** Shadow relationships: primaryAgent -> list of shadow configs */
95
- private shadowsByPrimary: Map<string, ShadowRelationship[]> = new Map();
96
- /** Reverse lookup: shadowAgent -> primaryAgent (for cleanup) */
97
- private primaryByShadow: Map<string, string> = new Map();
98
-
99
- /** Channel membership: channel -> Set of member names */
100
- private channels: Map<string, Set<string>> = new Map();
101
- /** User entities (human users, not agents) - supports multiple connections per user (multi-tab) */
102
- private users: Map<string, Set<RoutableConnection>> = new Map();
103
- /** Reverse lookup: member name -> Set of channels they're in */
104
- private memberChannels: Map<string, Set<string>> = new Map();
105
-
106
- /**
107
- * Agents that are currently being spawned but haven't completed HELLO yet.
108
- * Maps agent name to timestamp when spawn started.
109
- * Messages sent to these agents will be queued for delivery after HELLO completes.
110
- */
111
- private spawningAgents: Map<string, number> = new Map();
112
-
113
- /**
114
- * Recently disconnected user-type connections (e.g., __cli_sender__).
115
- * Maps agent name to disconnect timestamp.
116
- * Messages to these users are persisted so they appear in the dashboard.
117
- */
118
- private recentlyDisconnectedUsers: Map<string, number> = new Map();
119
- private static readonly RECENT_USER_TTL_MS = 5 * 60 * 1000; // 5 minutes
120
-
121
- /** Default timeout for processing indicator (30 seconds) */
122
- private static readonly PROCESSING_TIMEOUT_MS = 30_000;
123
-
124
- /** Timeout for spawning agent entries (60 seconds) */
125
- private static readonly SPAWNING_TIMEOUT_MS = 60_000;
126
-
127
- /** Callback when processing state changes (for real-time dashboard updates) */
128
- private onProcessingStateChange?: () => void;
129
-
130
- /** Rate limiter for per-agent throttling */
131
- private rateLimiter: RateLimiter;
132
-
133
- constructor(options: {
134
- storage?: StorageAdapter;
135
- delivery?: Partial<DeliveryReliabilityOptions>;
136
- registry?: AgentRegistry;
137
- onProcessingStateChange?: () => void;
138
- crossMachineHandler?: CrossMachineHandler;
139
- /** Rate limit configuration. Set to null to disable rate limiting. */
140
- rateLimit?: Partial<RateLimitConfig> | null;
141
- channelMembershipStore?: ChannelMembershipStore;
142
- } = {}) {
143
- this.storage = options.storage;
144
- this.channelMembershipStore = options.channelMembershipStore;
145
- this.registry = options.registry;
146
- this.onProcessingStateChange = options.onProcessingStateChange;
147
- this.crossMachineHandler = options.crossMachineHandler;
148
- this.deliveryTracker = new DeliveryTracker({
149
- storage: this.storage,
150
- delivery: options.delivery,
151
- getConnection: (id) => this.connections.get(id),
152
- });
153
- // Initialize rate limiter (null = disabled)
154
- this.rateLimiter = options.rateLimit === null
155
- ? new NoOpRateLimiter()
156
- : new RateLimiter(options.rateLimit);
157
- }
158
-
159
- /**
160
- * Restore channel memberships from persisted storage.
161
- */
162
- async restoreChannelMemberships(): Promise<void> {
163
- if (!this.storage && !this.channelMembershipStore) return;
164
-
165
- try {
166
- if (this.channelMembershipStore) {
167
- const memberships = await this.channelMembershipStore.loadMemberships();
168
- for (const membership of memberships) {
169
- this.handleMembershipUpdate({
170
- channel: membership.channel,
171
- member: membership.member,
172
- action: 'join',
173
- });
174
- }
175
- }
176
-
177
- if (this.storage) {
178
- const messages = await this.storage.getMessages({ order: 'asc' });
179
- for (const msg of messages) {
180
- const channel = msg.to;
181
- const data = msg.data as Record<string, unknown> | undefined;
182
- const membership = data?._channelMembership as { member?: string; action?: 'join' | 'leave' | 'invite' } | undefined;
183
- if (!channel || !membership?.member) {
184
- continue;
185
- }
186
- const action = membership.action ?? 'join';
187
- this.handleMembershipUpdate({
188
- channel,
189
- member: membership.member,
190
- action,
191
- });
192
- }
193
- }
194
- } catch (err) {
195
- routerLog.error('Failed to restore channel memberships', { error: String(err) });
196
- }
197
- }
198
-
199
- /**
200
- * Set or update the cross-machine handler.
201
- */
202
- setCrossMachineHandler(handler: CrossMachineHandler): void {
203
- this.crossMachineHandler = handler;
204
- }
205
-
206
- /**
207
- * Mark an agent as spawning (before HELLO completes).
208
- * Messages sent to this agent will be queued for delivery after registration.
209
- */
210
- markSpawning(agentName: string): void {
211
- this.spawningAgents.set(agentName, Date.now());
212
- routerLog.info(`Agent marked as spawning: ${agentName}`, {
213
- currentSpawning: Array.from(this.spawningAgents.keys()),
214
- });
215
- // Clean up stale spawning entries
216
- this.cleanupStaleSpawning();
217
- }
218
-
219
- /**
220
- * Clear the spawning flag for an agent.
221
- * Called when agent completes registration or spawn fails.
222
- */
223
- clearSpawning(agentName: string): void {
224
- if (this.spawningAgents.delete(agentName)) {
225
- routerLog.debug(`Agent spawning flag cleared: ${agentName}`);
226
- }
227
- }
228
-
229
- /**
230
- * Check if an agent is currently spawning.
231
- */
232
- isSpawning(agentName: string): boolean {
233
- const timestamp = this.spawningAgents.get(agentName);
234
- if (!timestamp) return false;
235
- // Check if spawn has timed out
236
- if (Date.now() - timestamp > Router.SPAWNING_TIMEOUT_MS) {
237
- this.spawningAgents.delete(agentName);
238
- return false;
239
- }
240
- return true;
241
- }
242
-
243
- /**
244
- * Clean up spawning entries older than SPAWNING_TIMEOUT_MS.
245
- */
246
- private cleanupStaleSpawning(): void {
247
- const now = Date.now();
248
- for (const [name, timestamp] of this.spawningAgents) {
249
- if (now - timestamp > Router.SPAWNING_TIMEOUT_MS) {
250
- this.spawningAgents.delete(name);
251
- routerLog.debug(`Cleaned up stale spawning entry: ${name}`);
252
- }
253
- }
254
- this.cleanupStaleRecentUsers();
255
- }
256
-
257
- /**
258
- * Clean up recently-disconnected user entries older than RECENT_USER_TTL_MS.
259
- * Called from both cleanupStaleSpawning() and unregister() to prevent unbounded growth.
260
- */
261
- private cleanupStaleRecentUsers(): void {
262
- const now = Date.now();
263
- for (const [name, timestamp] of this.recentlyDisconnectedUsers) {
264
- if (now - timestamp > Router.RECENT_USER_TTL_MS) {
265
- this.recentlyDisconnectedUsers.delete(name);
266
- routerLog.debug(`Cleaned up stale recently-disconnected user: ${name}`);
267
- }
268
- }
269
- }
270
-
271
- /**
272
- * Register a connection after successful handshake.
273
- */
274
- register(connection: RoutableConnection): void {
275
- this.connections.set(connection.id, connection);
276
-
277
- if (connection.agentName) {
278
- const isUser = connection.entityType === 'user';
279
-
280
- if (isUser) {
281
- // Users can have multiple connections (e.g., multiple browser tabs)
282
- // Track ALL connections per user so messages reach all tabs
283
- if (!this.users.has(connection.agentName)) {
284
- this.users.set(connection.agentName, new Set());
285
- }
286
- this.users.get(connection.agentName)!.add(connection);
287
- // Clear recently-disconnected tracking since user is back online
288
- this.recentlyDisconnectedUsers.delete(connection.agentName);
289
- routerLog.info(`User registered: ${connection.agentName} (${this.users.get(connection.agentName)!.size} connections)`);
290
- } else {
291
- // Handle existing agent connection with same name (disconnect old)
292
- const existing = this.agents.get(connection.agentName);
293
- if (existing && existing.id !== connection.id) {
294
- routerLog.warn('Duplicate agent connection detected, closing old connection', {
295
- agent: connection.agentName,
296
- oldConnectionId: existing.id,
297
- newConnectionId: connection.id,
298
- });
299
- // Send fatal error before closing to prevent reconnection loop
300
- const errorEnvelope: Envelope<ErrorPayload> = {
301
- v: PROTOCOL_VERSION,
302
- type: 'ERROR',
303
- id: generateId(),
304
- ts: Date.now(),
305
- payload: {
306
- code: 'DUPLICATE_CONNECTION',
307
- message: `Another agent with name "${connection.agentName}" connected. This connection will be closed.`,
308
- fatal: true,
309
- },
310
- };
311
- existing.send(errorEnvelope);
312
- existing.close();
313
- this.connections.delete(existing.id);
314
- }
315
- this.agents.set(connection.agentName, connection);
316
- // Clear spawning flag now that agent has completed registration
317
- this.clearSpawning(connection.agentName);
318
- this.registry?.registerOrUpdate({
319
- name: connection.agentName,
320
- cli: connection.cli,
321
- program: connection.program,
322
- model: connection.model,
323
- task: connection.task,
324
- workingDirectory: connection.workingDirectory,
325
- });
326
- }
327
- }
328
- }
329
-
330
- /**
331
- * Unregister a connection.
332
- */
333
- unregister(connection: RoutableConnection): void {
334
- this.connections.delete(connection.id);
335
- if (connection.agentName) {
336
- const isUser = connection.entityType === 'user';
337
- let wasCurrentConnection = false;
338
-
339
- if (isUser) {
340
- const userConnections = this.users.get(connection.agentName);
341
- if (userConnections) {
342
- userConnections.delete(connection);
343
- if (userConnections.size === 0) {
344
- this.users.delete(connection.agentName);
345
- wasCurrentConnection = true;
346
- // Track recently disconnected users so messages to them are persisted
347
- // (e.g., agent replies to __cli_sender__ show up in dashboard)
348
- this.recentlyDisconnectedUsers.set(connection.agentName, Date.now());
349
- routerLog.info(`User fully unregistered: ${connection.agentName} (all connections closed, tracked for ${Router.RECENT_USER_TTL_MS / 1000}s)`);
350
- // Clean up stale entries on each disconnect so the map doesn't grow unbounded
351
- this.cleanupStaleRecentUsers();
352
- } else {
353
- routerLog.debug(`User connection closed: ${connection.agentName} (${userConnections.size} connections remaining)`);
354
- }
355
- }
356
- } else {
357
- const current = this.agents.get(connection.agentName);
358
- if (current?.id === connection.id) {
359
- this.agents.delete(connection.agentName);
360
- wasCurrentConnection = true;
361
- }
362
- }
363
-
364
- // Only clean up channel/subscription state if this was the current connection.
365
- // If a new connection replaced this one, we don't want to remove channel memberships
366
- // that the new connection should inherit.
367
- if (wasCurrentConnection) {
368
- // Remove from all subscriptions
369
- for (const subscribers of this.subscriptions.values()) {
370
- subscribers.delete(connection.agentName);
371
- }
372
-
373
- // Remove from all channels and notify remaining members
374
- this.removeFromAllChannels(connection.agentName);
375
-
376
- // Clean up shadow relationships
377
- this.unbindShadow(connection.agentName);
378
-
379
- // Clear processing state
380
- this.clearProcessing(connection.agentName);
381
- }
382
- }
383
-
384
- this.clearPendingForConnection(connection.id);
385
- }
386
-
387
- /**
388
- * Remove a member from all channels they're in.
389
- */
390
- private removeFromAllChannels(memberName: string): void {
391
- const memberChannelSet = this.memberChannels.get(memberName);
392
- if (!memberChannelSet) return;
393
-
394
- for (const channelName of memberChannelSet) {
395
- const members = this.channels.get(channelName);
396
- if (members) {
397
- members.delete(memberName);
398
- // Clean up empty channels
399
- if (members.size === 0) {
400
- this.channels.delete(channelName);
401
- }
402
- }
403
- }
404
- this.memberChannels.delete(memberName);
405
- }
406
-
407
- /**
408
- * Subscribe an agent to a topic.
409
- */
410
- subscribe(agentName: string, topic: string): void {
411
- let subscribers = this.subscriptions.get(topic);
412
- if (!subscribers) {
413
- subscribers = new Set();
414
- this.subscriptions.set(topic, subscribers);
415
- }
416
- subscribers.add(agentName);
417
- }
418
-
419
- /**
420
- * Unsubscribe an agent from a topic.
421
- */
422
- unsubscribe(agentName: string, topic: string): void {
423
- const subscribers = this.subscriptions.get(topic);
424
- if (subscribers) {
425
- subscribers.delete(agentName);
426
- if (subscribers.size === 0) {
427
- this.subscriptions.delete(topic);
428
- }
429
- }
430
- }
431
-
432
- /**
433
- * Bind a shadow agent to a primary agent.
434
- * The shadow will receive copies of messages to/from the primary.
435
- */
436
- bindShadow(
437
- shadowAgent: string,
438
- primaryAgent: string,
439
- options: {
440
- speakOn?: SpeakOnTrigger[];
441
- receiveIncoming?: boolean;
442
- receiveOutgoing?: boolean;
443
- } = {}
444
- ): void {
445
- // Clean up any existing shadow binding for this shadow
446
- this.unbindShadow(shadowAgent);
447
-
448
- const relationship: ShadowRelationship = {
449
- shadowAgent,
450
- primaryAgent,
451
- speakOn: options.speakOn ?? ['EXPLICIT_ASK'],
452
- receiveIncoming: options.receiveIncoming ?? true,
453
- receiveOutgoing: options.receiveOutgoing ?? true,
454
- };
455
-
456
- // Add to primary's shadow list
457
- let shadows = this.shadowsByPrimary.get(primaryAgent);
458
- if (!shadows) {
459
- shadows = [];
460
- this.shadowsByPrimary.set(primaryAgent, shadows);
461
- }
462
- shadows.push(relationship);
463
-
464
- // Set reverse lookup
465
- this.primaryByShadow.set(shadowAgent, primaryAgent);
466
-
467
- routerLog.info(`Shadow bound: ${shadowAgent} -> ${primaryAgent}`, { speakOn: relationship.speakOn });
468
- }
469
-
470
- /**
471
- * Unbind a shadow agent from its primary.
472
- */
473
- unbindShadow(shadowAgent: string): void {
474
- const primaryAgent = this.primaryByShadow.get(shadowAgent);
475
- if (!primaryAgent) return;
476
-
477
- // Remove from primary's shadow list
478
- const shadows = this.shadowsByPrimary.get(primaryAgent);
479
- if (shadows) {
480
- const updatedShadows = shadows.filter(s => s.shadowAgent !== shadowAgent);
481
- if (updatedShadows.length === 0) {
482
- this.shadowsByPrimary.delete(primaryAgent);
483
- } else {
484
- this.shadowsByPrimary.set(primaryAgent, updatedShadows);
485
- }
486
- }
487
-
488
- // Remove reverse lookup
489
- this.primaryByShadow.delete(shadowAgent);
490
-
491
- routerLog.info(`Shadow unbound: ${shadowAgent} from ${primaryAgent}`);
492
- }
493
-
494
- /**
495
- * Get all shadows for a primary agent.
496
- */
497
- getShadowsForPrimary(primaryAgent: string): ShadowRelationship[] {
498
- return this.shadowsByPrimary.get(primaryAgent) ?? [];
499
- }
500
-
501
- /**
502
- * Get the primary agent for a shadow, if any.
503
- */
504
- getPrimaryForShadow(shadowAgent: string): string | undefined {
505
- return this.primaryByShadow.get(shadowAgent);
506
- }
507
-
508
- /**
509
- * Emit a trigger event for an agent's shadows.
510
- * Shadows configured to speakOn this trigger will receive a notification.
511
- * @param primaryAgent The agent whose shadows should be notified
512
- * @param trigger The trigger event that occurred
513
- * @param context Optional context data about the trigger
514
- */
515
- emitShadowTrigger(
516
- primaryAgent: string,
517
- trigger: SpeakOnTrigger,
518
- context?: Record<string, unknown>
519
- ): void {
520
- const shadows = this.shadowsByPrimary.get(primaryAgent);
521
- if (!shadows || shadows.length === 0) return;
522
-
523
- for (const shadow of shadows) {
524
- // Check if this shadow is configured to speak on this trigger
525
- if (!shadow.speakOn.includes(trigger) && !shadow.speakOn.includes('ALL_MESSAGES')) {
526
- continue;
527
- }
528
-
529
- const target = this.agents.get(shadow.shadowAgent);
530
- if (!target) continue;
531
-
532
- // Create a trigger notification envelope
533
- const triggerEnvelope: SendEnvelope = {
534
- v: PROTOCOL_VERSION,
535
- type: 'SEND',
536
- id: generateId(),
537
- ts: Date.now(),
538
- from: primaryAgent,
539
- to: shadow.shadowAgent,
540
- payload: {
541
- kind: 'action',
542
- body: `SHADOW_TRIGGER:${trigger}`,
543
- data: {
544
- _shadowTrigger: trigger,
545
- _shadowOf: primaryAgent,
546
- _triggerContext: context,
547
- },
548
- },
549
- };
550
-
551
- const deliver = this.createDeliverEnvelope(
552
- primaryAgent,
553
- shadow.shadowAgent,
554
- triggerEnvelope,
555
- target
556
- );
557
- const sent = target.send(deliver);
558
- if (sent) {
559
- this.trackDelivery(target, deliver);
560
- routerLog.debug(`Shadow trigger ${trigger} sent to ${shadow.shadowAgent}`, { primary: primaryAgent });
561
- // Set processing state for triggered shadows - they're expected to respond
562
- this.setProcessing(shadow.shadowAgent, deliver.id);
563
- }
564
- }
565
- }
566
-
567
- /**
568
- * Check if a shadow should speak based on a specific trigger.
569
- */
570
- shouldShadowSpeak(shadowAgent: string, trigger: SpeakOnTrigger): boolean {
571
- const primaryAgent = this.primaryByShadow.get(shadowAgent);
572
- if (!primaryAgent) return true; // Not a shadow, can always speak
573
-
574
- const shadows = this.shadowsByPrimary.get(primaryAgent);
575
- if (!shadows) return true;
576
-
577
- const relationship = shadows.find(s => s.shadowAgent === shadowAgent);
578
- if (!relationship) return true;
579
-
580
- return relationship.speakOn.includes(trigger) || relationship.speakOn.includes('ALL_MESSAGES');
581
- }
582
-
583
- /**
584
- * Route a SEND message to its destination(s).
585
- */
586
- route(from: RoutableConnection, envelope: SendEnvelope): void {
587
- // Check if this is a cross-machine message (injected from cloud)
588
- const isCrossMachine = envelope.payload?.data?._crossMachine === true;
589
-
590
- // Use envelope.from for cross-machine messages where the connection is the recipient,
591
- // otherwise use the connection's agent name (normal local messages)
592
- const senderName = isCrossMachine ? envelope.from : (envelope.from || from.agentName);
593
- if (!senderName) {
594
- routerLog.warn('Dropping message - sender has no name');
595
- return;
596
- }
597
-
598
- // Skip rate limiting, processing state, and send recording for cross-machine messages
599
- // These only apply to local agents sending messages
600
- if (!isCrossMachine) {
601
- // Check rate limit
602
- if (!this.rateLimiter.tryAcquire(senderName)) {
603
- routerLog.warn(`Rate limited: ${senderName}`);
604
- return;
605
- }
606
-
607
- // Agent is responding - clear their processing state
608
- this.clearProcessing(senderName);
609
-
610
- this.registry?.recordSend(senderName);
611
- }
612
-
613
- const to = envelope.to;
614
- const topic = envelope.topic;
615
-
616
- routerLog.debug(`Route ${senderName} -> ${to}`, { preview: typeof envelope.payload.body === 'string' ? envelope.payload.body.substring(0, 50) : JSON.stringify(envelope.payload.body)?.substring(0, 50) });
617
-
618
- if (to === '*') {
619
- // Broadcast to all (except sender)
620
- this.broadcast(senderName, envelope, topic);
621
- } else if (to === '@users') {
622
- // Broadcast to all human users only (not agents)
623
- this.broadcastToUsers(senderName, envelope);
624
- } else if (to) {
625
- // Direct message
626
- this.sendDirect(senderName, to, envelope);
627
- }
628
-
629
- // Route copies to shadows of the sender (outgoing messages)
630
- this.routeToShadows(senderName, envelope, 'outgoing');
631
-
632
- // Route copies to shadows of the recipient (incoming messages)
633
- if (to && to !== '*') {
634
- this.routeToShadows(to, envelope, 'incoming', senderName);
635
- }
636
- }
637
-
638
- /**
639
- * Route a copy of a message to shadows of an agent.
640
- * @param primaryAgent The primary agent whose shadows should receive the message
641
- * @param envelope The original message envelope
642
- * @param direction Whether this is an 'incoming' or 'outgoing' message for the primary
643
- * @param actualFrom Override the 'from' field (for incoming messages, use original sender)
644
- */
645
- private routeToShadows(
646
- primaryAgent: string,
647
- envelope: SendEnvelope,
648
- direction: 'incoming' | 'outgoing',
649
- actualFrom?: string
650
- ): void {
651
- const shadows = this.shadowsByPrimary.get(primaryAgent);
652
- if (!shadows || shadows.length === 0) return;
653
-
654
- for (const shadow of shadows) {
655
- // Check if shadow wants this direction
656
- if (direction === 'incoming' && shadow.receiveIncoming === false) continue;
657
- if (direction === 'outgoing' && shadow.receiveOutgoing === false) continue;
658
-
659
- // Don't send to self
660
- if (shadow.shadowAgent === (actualFrom ?? primaryAgent)) continue;
661
-
662
- const target = this.agents.get(shadow.shadowAgent);
663
- if (!target) continue;
664
-
665
- // Create a shadow copy envelope with metadata indicating it's a shadow copy
666
- const shadowEnvelope: SendEnvelope = {
667
- ...envelope,
668
- payload: {
669
- ...envelope.payload,
670
- data: {
671
- ...envelope.payload.data,
672
- _shadowCopy: true,
673
- _shadowOf: primaryAgent,
674
- _shadowDirection: direction,
675
- },
676
- },
677
- };
678
-
679
- const deliver = this.createDeliverEnvelope(
680
- actualFrom ?? primaryAgent,
681
- shadow.shadowAgent,
682
- shadowEnvelope,
683
- target
684
- );
685
- const sent = target.send(deliver);
686
- if (sent) {
687
- this.trackDelivery(target, deliver);
688
- routerLog.debug(`Shadow copy to ${shadow.shadowAgent}`, { direction, primary: primaryAgent });
689
- // Note: Don't set processing state for shadow copies - shadow stays passive
690
- }
691
- }
692
- }
693
-
694
- /**
695
- * Send a direct message to a specific agent.
696
- *
697
- * If the target agent is offline but known (has connected before),
698
- * the message is persisted for delivery when the agent reconnects.
699
- * This prevents silent message drops during brief disconnections or spawn timing issues.
700
- */
701
- private sendDirect(
702
- from: string,
703
- to: string,
704
- envelope: SendEnvelope
705
- ): boolean {
706
- // Check for agent first, then user connections
707
- const agentTarget = this.agents.get(to);
708
- const userConnections = this.users.get(to);
709
- const hasTarget = agentTarget || (userConnections && userConnections.size > 0);
710
-
711
- // If target not found locally, check remote
712
- if (!hasTarget) {
713
- const remoteAgent = this.crossMachineHandler?.isRemoteAgent(to);
714
- if (remoteAgent) {
715
- routerLog.info(`Routing to remote agent: ${to}`, { daemonName: remoteAgent.daemonName });
716
- return this.sendToRemoteAgent(from, to, envelope, remoteAgent);
717
- }
718
- // Also check if it's a remote user (human connected via cloud dashboard)
719
- const remoteUser = this.crossMachineHandler?.isRemoteUser?.(to);
720
- if (remoteUser) {
721
- routerLog.info(`Routing to remote user: ${to}`, { daemonName: remoteUser.daemonName });
722
- return this.sendToRemoteAgent(from, to, envelope, remoteUser);
723
- }
724
-
725
- // Check if this is a known agent (has connected before) - queue for later delivery
726
- // This prevents message drops during brief disconnections or spawn timing issues
727
- if (this.registry?.has(to)) {
728
- routerLog.info(`Target "${to}" offline but known, queueing message for delivery on reconnect`);
729
- this.persistMessageForOfflineAgent(from, to, envelope);
730
- return true; // Message accepted (queued), not dropped
731
- }
732
-
733
- // Check if target is a recently disconnected user (e.g., __cli_sender__)
734
- // Persist the message so it appears in dashboard history even though the user disconnected
735
- const recentUserTs = this.recentlyDisconnectedUsers.get(to);
736
- if (recentUserTs && Date.now() - recentUserTs < Router.RECENT_USER_TTL_MS) {
737
- routerLog.info(`Target "${to}" is a recently disconnected user, persisting message for dashboard visibility`);
738
- this.persistMessageForOfflineAgent(from, to, envelope);
739
- return true; // Message accepted (persisted), not dropped
740
- }
741
-
742
- // Check if agent is currently spawning (pre-HELLO) - queue for delivery after registration
743
- // This handles the race condition between spawn completion and HELLO handshake
744
- const spawning = this.isSpawning(to);
745
- routerLog.debug(`Spawning check for "${to}": ${spawning}`, {
746
- spawningAgents: Array.from(this.spawningAgents.keys()),
747
- hasStorage: !!this.storage,
748
- });
749
- if (spawning) {
750
- routerLog.info(`Target "${to}" is spawning, queueing message for delivery after registration`);
751
- this.persistMessageForOfflineAgent(from, to, envelope);
752
- return true; // Message accepted (queued), not dropped
753
- }
754
-
755
- routerLog.warn(`Target "${to}" not found and unknown`, { availableAgents: Array.from(this.agents.keys()), spawningAgents: Array.from(this.spawningAgents.keys()) });
756
- return false;
757
- }
758
-
759
- // For user targets, send to ALL connections (multi-tab support)
760
- if (userConnections && userConnections.size > 0) {
761
- let anySent = false;
762
- for (const userConn of userConnections) {
763
- const deliver = this.createDeliverEnvelope(from, to, envelope, userConn);
764
- const sent = userConn.send(deliver);
765
- if (sent) anySent = true;
766
- routerLog.debug(`Delivered ${from} -> ${to} (user connection ${userConn.id})`, {
767
- success: sent,
768
- preview: typeof envelope.payload.body === 'string' ? envelope.payload.body.substring(0, 40) : JSON.stringify(envelope.payload.body)?.substring(0, 40),
769
- });
770
- // Persist only once (for the first connection)
771
- if (userConn === [...userConnections][0]) {
772
- this.persistDeliverEnvelope(deliver);
773
- }
774
- if (sent) {
775
- this.trackDelivery(userConn, deliver);
776
- }
777
- }
778
- if (anySent) {
779
- this.registry?.recordReceive(to);
780
- }
781
- return anySent;
782
- }
783
-
784
- // For agent targets, send to single connection
785
- const target = agentTarget!;
786
- const deliver = this.createDeliverEnvelope(from, to, envelope, target);
787
- const sent = target.send(deliver);
788
- routerLog.debug(`Delivered ${from} -> ${to}`, { success: sent, preview: typeof envelope.payload.body === 'string' ? envelope.payload.body.substring(0, 40) : JSON.stringify(envelope.payload.body)?.substring(0, 40) });
789
- this.persistDeliverEnvelope(deliver);
790
- if (sent) {
791
- this.trackDelivery(target, deliver);
792
- this.registry?.recordReceive(to);
793
- this.setProcessing(to, deliver.id);
794
- }
795
- return sent;
796
- }
797
-
798
- /**
799
- * Send a message to an agent on a remote machine via cloud.
800
- */
801
- private sendToRemoteAgent(
802
- from: string,
803
- to: string,
804
- envelope: SendEnvelope,
805
- remoteAgent: RemoteAgentInfo
806
- ): boolean {
807
- if (!this.crossMachineHandler) {
808
- routerLog.warn('Cross-machine handler not available');
809
- return false;
810
- }
811
-
812
- // Send asynchronously via cloud
813
- this.crossMachineHandler.sendCrossMachineMessage(
814
- remoteAgent.daemonId,
815
- to,
816
- from,
817
- envelope.payload.body,
818
- {
819
- topic: envelope.topic,
820
- thread: envelope.payload.thread,
821
- kind: envelope.payload.kind,
822
- data: envelope.payload.data,
823
- originalId: envelope.id,
824
- }
825
- ).then((sent) => {
826
- if (sent) {
827
- routerLog.info(`Cross-machine message sent to ${to}`, { daemonName: remoteAgent.daemonName });
828
- // Persist as cross-machine message
829
- this.storage?.saveMessage({
830
- id: envelope.id || `cross-${Date.now()}`,
831
- ts: Date.now(),
832
- from,
833
- to,
834
- topic: envelope.topic,
835
- kind: envelope.payload.kind,
836
- body: envelope.payload.body,
837
- data: {
838
- ...envelope.payload.data,
839
- _crossMachine: true,
840
- _targetDaemon: remoteAgent.daemonId,
841
- _targetDaemonName: remoteAgent.daemonName,
842
- },
843
- thread: envelope.payload.thread,
844
- status: 'unread',
845
- is_urgent: false,
846
- is_broadcast: false,
847
- }).catch(err => routerLog.error('Failed to persist cross-machine message', { error: String(err) }));
848
- } else {
849
- routerLog.error(`Failed to send cross-machine message to ${to}`);
850
- }
851
- }).catch(err => {
852
- routerLog.error('Cross-machine send error', { error: String(err) });
853
- });
854
-
855
- // Return true immediately - message is queued
856
- return true;
857
- }
858
-
859
- /**
860
- * Broadcast to all agents (optionally filtered by topic subscription).
861
- */
862
- private broadcast(
863
- from: string,
864
- envelope: SendEnvelope,
865
- topic?: string
866
- ): void {
867
- // Build recipients list from both agents and users
868
- const recipients = topic
869
- ? this.subscriptions.get(topic) ?? new Set()
870
- : new Set([...this.agents.keys(), ...this.users.keys()]);
871
-
872
- for (const recipientName of recipients) {
873
- if (recipientName === from) continue; // Don't send to self
874
-
875
- // Check agents first
876
- const agentTarget = this.agents.get(recipientName);
877
- if (agentTarget) {
878
- const deliver = this.createDeliverEnvelope(from, recipientName, envelope, agentTarget);
879
- const sent = agentTarget.send(deliver);
880
- this.persistDeliverEnvelope(deliver, true); // Mark as broadcast
881
- if (sent) {
882
- this.trackDelivery(agentTarget, deliver);
883
- this.registry?.recordReceive(recipientName);
884
- this.setProcessing(recipientName, deliver.id);
885
- }
886
- continue;
887
- }
888
-
889
- // Check user connections (send to all connections for multi-tab)
890
- const userConnections = this.users.get(recipientName);
891
- if (userConnections && userConnections.size > 0) {
892
- let persisted = false;
893
- for (const userConn of userConnections) {
894
- const deliver = this.createDeliverEnvelope(from, recipientName, envelope, userConn);
895
- const sent = userConn.send(deliver);
896
- if (!persisted) {
897
- this.persistDeliverEnvelope(deliver, true); // Mark as broadcast, persist once
898
- persisted = true;
899
- }
900
- if (sent) {
901
- this.trackDelivery(userConn, deliver);
902
- this.registry?.recordReceive(recipientName);
903
- }
904
- }
905
- }
906
- }
907
- }
908
-
909
- /**
910
- * Broadcast a message to all human users (not agents).
911
- * Used for system notifications that only humans should see.
912
- */
913
- private broadcastToUsers(
914
- from: string,
915
- envelope: SendEnvelope
916
- ): void {
917
- for (const [userName, userConnections] of this.users) {
918
- if (userName === from) continue; // Don't send to self
919
- if (userConnections.size === 0) continue;
920
-
921
- let persisted = false;
922
- for (const userConn of userConnections) {
923
- const deliver = this.createDeliverEnvelope(from, userName, envelope, userConn);
924
- const sent = userConn.send(deliver);
925
- if (!persisted) {
926
- this.persistDeliverEnvelope(deliver, true); // Mark as broadcast, persist once
927
- persisted = true;
928
- }
929
- if (sent) {
930
- this.trackDelivery(userConn, deliver);
931
- this.registry?.recordReceive(userName);
932
- routerLog.debug(`Broadcast to user ${userName} (connection ${userConn.id})`);
933
- }
934
- }
935
- }
936
- }
937
-
938
- /**
939
- * Create a DELIVER envelope from a SEND.
940
- */
941
- private createDeliverEnvelope(
942
- from: string,
943
- to: string,
944
- original: SendEnvelope,
945
- target: RoutableConnection
946
- ): DeliverEnvelope {
947
- // Preserve the original 'to' field for broadcasts so agents know to reply to '*'
948
- const originalTo = original.to;
949
-
950
- return {
951
- v: PROTOCOL_VERSION,
952
- type: 'DELIVER',
953
- id: generateId(),
954
- ts: Date.now(),
955
- from,
956
- to,
957
- topic: original.topic,
958
- payload: original.payload,
959
- payload_meta: original.payload_meta,
960
- delivery: {
961
- seq: target.getNextSeq(original.topic ?? 'default', from),
962
- session_id: target.sessionId,
963
- originalTo: originalTo !== to ? originalTo : undefined, // Only include if different
964
- },
965
- };
966
- }
967
-
968
- /**
969
- * Persist a delivered message if storage is configured.
970
- */
971
- private persistDeliverEnvelope(envelope: DeliverEnvelope, isBroadcast: boolean = false): void {
972
- if (!this.storage) return;
973
-
974
- this.storage.saveMessage({
975
- id: envelope.id,
976
- ts: envelope.ts,
977
- from: envelope.from ?? 'unknown',
978
- to: envelope.to ?? 'unknown',
979
- topic: envelope.topic,
980
- kind: envelope.payload.kind,
981
- body: envelope.payload.body,
982
- data: envelope.payload.data,
983
- payloadMeta: envelope.payload_meta,
984
- thread: envelope.payload.thread,
985
- deliverySeq: envelope.delivery.seq,
986
- deliverySessionId: envelope.delivery.session_id,
987
- sessionId: envelope.delivery.session_id,
988
- status: 'unread',
989
- is_urgent: false,
990
- is_broadcast: isBroadcast || envelope.to === '*',
991
- }).catch((err) => {
992
- routerLog.error('Failed to persist message', { error: String(err) });
993
- });
994
- }
995
-
996
- /**
997
- * Persist a message for an offline agent.
998
- * Called when a message is sent to a known agent that is not currently connected.
999
- * The message is marked with _offlineQueued and will be delivered when the agent reconnects.
1000
- */
1001
- private persistMessageForOfflineAgent(from: string, to: string, envelope: SendEnvelope): void {
1002
- if (!this.storage) {
1003
- routerLog.warn('Cannot queue offline message: no storage configured');
1004
- return;
1005
- }
1006
-
1007
- routerLog.info(`Persisting offline message for "${to}"`, {
1008
- from,
1009
- messageId: envelope.id,
1010
- bodyPreview: typeof envelope.payload.body === 'string' ? envelope.payload.body.substring(0, 50) : JSON.stringify(envelope.payload.body)?.substring(0, 50),
1011
- });
1012
-
1013
- this.storage.saveMessage({
1014
- id: envelope.id || generateId(),
1015
- ts: Date.now(),
1016
- from,
1017
- to,
1018
- topic: envelope.topic,
1019
- kind: envelope.payload.kind,
1020
- body: envelope.payload.body,
1021
- data: {
1022
- ...envelope.payload.data,
1023
- _offlineQueued: true, // Mark as queued for offline delivery
1024
- _queuedAt: Date.now(),
1025
- },
1026
- payloadMeta: envelope.payload_meta,
1027
- thread: envelope.payload.thread,
1028
- status: 'unread', // Unread = pending delivery
1029
- is_urgent: false,
1030
- is_broadcast: false,
1031
- }).catch((err) => {
1032
- routerLog.error('Failed to persist offline message', { error: String(err), to });
1033
- });
1034
- }
1035
-
1036
- /**
1037
- * Deliver pending messages to an agent that just connected.
1038
- * Queries for unread messages addressed to this agent that were queued while offline.
1039
- * This handles messages that were sent while the agent was offline.
1040
- */
1041
- async deliverPendingMessages(connection: RoutableConnection): Promise<void> {
1042
- const agentName = connection.agentName;
1043
- if (!agentName) return;
1044
- if (!this.storage?.getMessages) return;
1045
-
1046
- try {
1047
- // Query for unread messages addressed to this agent
1048
- const pendingMessages = await this.storage.getMessages({
1049
- to: agentName,
1050
- unreadOnly: true,
1051
- order: 'asc', // Deliver oldest first
1052
- });
1053
-
1054
- // Filter to only include offline-queued messages (not already-delivered unacked messages)
1055
- const offlineMessages = pendingMessages.filter(
1056
- msg => msg.data?._offlineQueued === true
1057
- ).sort((a, b) => a.ts - b.ts);
1058
-
1059
- if (offlineMessages.length === 0) return;
1060
-
1061
- routerLog.info(`Delivering ${offlineMessages.length} pending messages to ${agentName}`);
1062
-
1063
- for (const msg of offlineMessages) {
1064
- // Create deliver envelope
1065
- const deliverEnvelope: DeliverEnvelope = {
1066
- v: PROTOCOL_VERSION,
1067
- type: 'DELIVER',
1068
- id: generateId(),
1069
- ts: Date.now(),
1070
- from: msg.from,
1071
- to: agentName,
1072
- topic: msg.topic,
1073
- payload: {
1074
- body: msg.body,
1075
- kind: msg.kind,
1076
- data: msg.data,
1077
- thread: msg.thread,
1078
- },
1079
- payload_meta: msg.payloadMeta,
1080
- delivery: {
1081
- seq: connection.getNextSeq(msg.topic ?? 'default', msg.from),
1082
- session_id: connection.sessionId,
1083
- },
1084
- };
1085
-
1086
- const sent = connection.send(deliverEnvelope);
1087
- if (sent) {
1088
- this.trackDelivery(connection, deliverEnvelope);
1089
- this.registry?.recordReceive(agentName);
1090
- this.setProcessing(agentName, deliverEnvelope.id);
1091
-
1092
- // Mark original message as delivered (update status)
1093
- if (this.storage.updateMessageStatus) {
1094
- await this.storage.updateMessageStatus(msg.id, 'read');
1095
- }
1096
-
1097
- routerLog.info(`Delivered pending message to ${agentName}`, {
1098
- from: msg.from,
1099
- preview: msg.body.substring(0, 40),
1100
- });
1101
- } else {
1102
- routerLog.warn(`Failed to deliver pending message to ${agentName}`);
1103
- }
1104
- }
1105
- } catch (err) {
1106
- routerLog.error('Failed to deliver pending messages', { error: String(err), agentName });
1107
- }
1108
- }
1109
-
1110
- /**
1111
- * Get list of connected agent names.
1112
- */
1113
- getAgents(): string[] {
1114
- return Array.from(this.agents.keys());
1115
- }
1116
-
1117
- /**
1118
- * Get connection by agent name.
1119
- */
1120
- getConnection(agentName: string): RoutableConnection | undefined {
1121
- return this.agents.get(agentName);
1122
- }
1123
-
1124
- /**
1125
- * Force remove an agent from the router (used when process dies without clean disconnect).
1126
- * This cleans up the agent's connection and subscriptions without needing the connection object.
1127
- */
1128
- forceRemoveAgent(agentName: string): boolean {
1129
- const connection = this.agents.get(agentName);
1130
- if (!connection) {
1131
- routerLog.debug(`forceRemoveAgent: agent ${agentName} not found in router`);
1132
- return false;
1133
- }
1134
-
1135
- routerLog.info(`Force removing stale agent: ${agentName}`);
1136
-
1137
- // Remove from agents map
1138
- this.agents.delete(agentName);
1139
-
1140
- // Remove from all channel subscriptions
1141
- for (const [channel, subscribers] of this.subscriptions) {
1142
- if (subscribers.delete(agentName)) {
1143
- routerLog.debug(`Removed ${agentName} from channel ${channel}`);
1144
- }
1145
- }
1146
-
1147
- // Remove from connections map
1148
- this.connections.delete(connection.id);
1149
-
1150
- // Clear any pending deliveries
1151
- this.deliveryTracker.clearPendingForConnection(connection.id);
1152
-
1153
- // Clean up channel memberships (same as unregister)
1154
- this.removeFromAllChannels(agentName);
1155
-
1156
- // Clean up shadow relationships
1157
- this.unbindShadow(agentName);
1158
-
1159
- // Clear processing state
1160
- this.clearProcessing(agentName);
1161
-
1162
- return true;
1163
- }
1164
-
1165
- /**
1166
- * Get number of active connections.
1167
- */
1168
- get connectionCount(): number {
1169
- return this.connections.size;
1170
- }
1171
-
1172
- get pendingDeliveryCount(): number {
1173
- return this.deliveryTracker.pendingCount;
1174
- }
1175
-
1176
- /**
1177
- * Get rate limiter statistics.
1178
- */
1179
- getRateLimiterStats(): { agentCount: number; config: RateLimitConfig } {
1180
- return this.rateLimiter.getStats();
1181
- }
1182
-
1183
- /**
1184
- * Reset rate limit for a specific agent (admin operation).
1185
- */
1186
- resetRateLimit(agentName: string): void {
1187
- this.rateLimiter.reset(agentName);
1188
- }
1189
-
1190
- /**
1191
- * Get list of agents currently processing (thinking).
1192
- * Returns an object with agent names as keys and processing info as values.
1193
- */
1194
- getProcessingAgents(): Record<string, { startedAt: number; messageId: string }> {
1195
- const result: Record<string, { startedAt: number; messageId: string }> = {};
1196
- for (const [name, state] of this.processingAgents.entries()) {
1197
- result[name] = { startedAt: state.startedAt, messageId: state.messageId };
1198
- }
1199
- return result;
1200
- }
1201
-
1202
- /**
1203
- * Check if a specific agent is processing.
1204
- */
1205
- isAgentProcessing(agentName: string): boolean {
1206
- return this.processingAgents.has(agentName);
1207
- }
1208
-
1209
- /**
1210
- * Mark an agent as processing (called when they receive a message).
1211
- */
1212
- private setProcessing(agentName: string, messageId: string): void {
1213
- // Clear any existing processing state
1214
- this.clearProcessing(agentName);
1215
-
1216
- const timer = setTimeout(() => {
1217
- this.clearProcessing(agentName);
1218
- routerLog.warn(`Processing timeout for ${agentName}`);
1219
- }, Router.PROCESSING_TIMEOUT_MS);
1220
-
1221
- this.processingAgents.set(agentName, {
1222
- startedAt: Date.now(),
1223
- messageId,
1224
- timer,
1225
- });
1226
- routerLog.debug(`${agentName} started processing`, { messageId });
1227
- this.onProcessingStateChange?.();
1228
- }
1229
-
1230
- /**
1231
- * Clear processing state for an agent (called when they send a message).
1232
- */
1233
- private clearProcessing(agentName: string): void {
1234
- const state = this.processingAgents.get(agentName);
1235
- if (state) {
1236
- if (state.timer) {
1237
- clearTimeout(state.timer);
1238
- }
1239
- this.processingAgents.delete(agentName);
1240
- routerLog.debug(`${agentName} finished processing`);
1241
- this.onProcessingStateChange?.();
1242
- }
1243
- }
1244
-
1245
- /**
1246
- * Handle ACK for previously delivered messages.
1247
- */
1248
- handleAck(connection: RoutableConnection, envelope: Envelope<AckPayload>): void {
1249
- const ackId = envelope.payload.ack_id;
1250
- this.deliveryTracker.handleAck(connection.id, ackId);
1251
- }
1252
-
1253
- /**
1254
- * Clear pending deliveries for a connection (e.g., on disconnect).
1255
- */
1256
- clearPendingForConnection(connectionId: string): void {
1257
- this.deliveryTracker.clearPendingForConnection(connectionId);
1258
- }
1259
-
1260
- /**
1261
- * Track a delivery and schedule retries until ACKed or TTL/attempts exhausted.
1262
- */
1263
- private trackDelivery(target: RoutableConnection, deliver: DeliverEnvelope): void {
1264
- this.deliveryTracker.track(target, deliver);
1265
- }
1266
-
1267
- /**
1268
- * Broadcast a system message to all connected agents.
1269
- * Used for system notifications like agent death announcements.
1270
- */
1271
- broadcastSystemMessage(message: string, data?: Record<string, unknown>): void {
1272
- const envelope: SendEnvelope = {
1273
- v: PROTOCOL_VERSION,
1274
- type: 'SEND',
1275
- id: generateId(),
1276
- ts: Date.now(),
1277
- from: '_system',
1278
- to: '*',
1279
- payload: {
1280
- kind: 'message',
1281
- body: message,
1282
- data: {
1283
- ...data,
1284
- _isSystemMessage: true,
1285
- },
1286
- },
1287
- };
1288
-
1289
- // Broadcast to all agents
1290
- for (const [agentName, connection] of this.agents.entries()) {
1291
- const deliver = this.createDeliverEnvelope('_system', agentName, envelope, connection);
1292
- const sent = connection.send(deliver);
1293
- if (sent) {
1294
- routerLog.debug(`System broadcast sent to ${agentName}`);
1295
- }
1296
- }
1297
- }
1298
-
1299
- /**
1300
- * Replay any pending (unacked) messages for a resumed session.
1301
- */
1302
- async replayPending(connection: RoutableConnection): Promise<void> {
1303
- if (!this.storage?.getPendingMessagesForSession || !connection.agentName) {
1304
- return;
1305
- }
1306
-
1307
- const pending = await this.storage.getPendingMessagesForSession(connection.agentName, connection.sessionId);
1308
- if (!pending.length) return;
1309
-
1310
- routerLog.info(`Replaying ${pending.length} messages to ${connection.agentName}`);
1311
-
1312
- for (const msg of pending) {
1313
- const deliver: DeliverEnvelope = {
1314
- v: PROTOCOL_VERSION,
1315
- type: 'DELIVER',
1316
- id: msg.id,
1317
- ts: msg.ts,
1318
- from: msg.from,
1319
- to: msg.to,
1320
- topic: msg.topic,
1321
- payload: {
1322
- kind: msg.kind,
1323
- body: msg.body,
1324
- data: msg.data,
1325
- thread: msg.thread,
1326
- },
1327
- payload_meta: msg.payloadMeta,
1328
- delivery: {
1329
- seq: msg.deliverySeq ?? connection.getNextSeq(msg.topic ?? 'default', msg.from),
1330
- session_id: msg.deliverySessionId ?? connection.sessionId,
1331
- },
1332
- };
1333
-
1334
- const sent = connection.send(deliver);
1335
- if (sent) {
1336
- this.trackDelivery(connection, deliver);
1337
- }
1338
- }
1339
- }
1340
-
1341
- // ==================== Channel Methods ====================
1342
-
1343
- /**
1344
- * Handle a CHANNEL_JOIN message.
1345
- * Adds the member to the channel and notifies existing members.
1346
- * If payload.member is set, adds that member (admin mode).
1347
- * Otherwise, adds the connection's agent name.
1348
- */
1349
- handleChannelJoin(
1350
- connection: RoutableConnection,
1351
- envelope: Envelope<ChannelJoinPayload>
1352
- ): void {
1353
- // Use payload.member if provided (admin mode), otherwise use connection's name
1354
- const memberName = envelope.payload.member ?? connection.agentName;
1355
- if (!memberName) {
1356
- routerLog.warn('CHANNEL_JOIN from connection without name and no member specified');
1357
- return;
1358
- }
1359
-
1360
- const channel = envelope.payload.channel;
1361
- const isAdminJoin = Boolean(envelope.payload.member);
1362
-
1363
- // Get or create channel
1364
- let members = this.channels.get(channel);
1365
- if (!members) {
1366
- members = new Set();
1367
- this.channels.set(channel, members);
1368
- }
1369
-
1370
- // Check if already a member
1371
- if (members.has(memberName)) {
1372
- routerLog.debug(`${memberName} already in ${channel}`);
1373
- return;
1374
- }
1375
-
1376
- // Only notify existing members for non-admin joins (agents joining themselves)
1377
- // Admin joins are silent to avoid spamming notifications when syncing
1378
- if (!isAdminJoin) {
1379
- const existingMembers = members ? Array.from(members) : [];
1380
- for (const existingMember of existingMembers) {
1381
- const memberConn = this.getConnectionByName(existingMember);
1382
- if (memberConn) {
1383
- const joinNotification: Envelope<ChannelJoinPayload> = {
1384
- v: PROTOCOL_VERSION,
1385
- type: 'CHANNEL_JOIN',
1386
- id: generateId(),
1387
- ts: Date.now(),
1388
- from: memberName,
1389
- payload: envelope.payload,
1390
- };
1391
- memberConn.send(joinNotification);
1392
- }
1393
- }
1394
- }
1395
-
1396
- const added = this.addChannelMember(channel, memberName, { persist: true });
1397
- if (!added) {
1398
- routerLog.debug(`${memberName} already in ${channel}`);
1399
- return;
1400
- }
1401
-
1402
- routerLog.info(`${memberName} joined ${channel} (${this.channels.get(channel)?.size ?? 0} members)${isAdminJoin ? ' [admin]' : ''}`);
1403
- }
1404
-
1405
- /**
1406
- * Handle a CHANNEL_LEAVE message.
1407
- * Removes the member from the channel and notifies remaining members.
1408
- * If payload.member is provided, removes that member instead (admin mode).
1409
- */
1410
- handleChannelLeave(
1411
- connection: RoutableConnection,
1412
- envelope: Envelope<ChannelLeavePayload>
1413
- ): void {
1414
- // Use payload.member if provided (admin mode), otherwise use connection's name
1415
- const memberName = envelope.payload.member ?? connection.agentName;
1416
- if (!memberName) {
1417
- routerLog.warn('CHANNEL_LEAVE from connection without name and no member specified');
1418
- return;
1419
- }
1420
-
1421
- const channel = envelope.payload.channel;
1422
- const isAdminRemove = Boolean(envelope.payload.member);
1423
- const members = this.channels.get(channel);
1424
-
1425
- if (!members || !members.has(memberName)) {
1426
- routerLog.debug(`${memberName} not in ${channel}, ignoring leave`);
1427
- return;
1428
- }
1429
-
1430
- const removed = this.removeChannelMember(channel, memberName, { persist: true });
1431
- if (!removed) {
1432
- routerLog.debug(`${memberName} not in ${channel}, ignoring leave`);
1433
- return;
1434
- }
1435
-
1436
- // Only notify remaining members for non-admin removes
1437
- // Admin removes are silent to avoid spamming notifications
1438
- if (!isAdminRemove) {
1439
- const remainingMembers = this.channels.get(channel);
1440
- if (remainingMembers) {
1441
- for (const remainingMember of remainingMembers) {
1442
- const memberConn = this.getConnectionByName(remainingMember);
1443
- if (memberConn) {
1444
- const leaveNotification: Envelope<ChannelLeavePayload> = {
1445
- v: PROTOCOL_VERSION,
1446
- type: 'CHANNEL_LEAVE',
1447
- id: generateId(),
1448
- ts: Date.now(),
1449
- from: memberName,
1450
- payload: envelope.payload,
1451
- };
1452
- memberConn.send(leaveNotification);
1453
- }
1454
- }
1455
- }
1456
- }
1457
-
1458
- routerLog.info(`${memberName} left ${channel}${isAdminRemove ? ' [admin]' : ''}`);
1459
- }
1460
-
1461
- /**
1462
- * Route a channel message to all members except the sender.
1463
- */
1464
- routeChannelMessage(
1465
- connection: RoutableConnection,
1466
- envelope: Envelope<ChannelMessagePayload>
1467
- ): void {
1468
- const senderName = connection.agentName;
1469
- if (!senderName) {
1470
- routerLog.warn('CHANNEL_MESSAGE from connection without name');
1471
- return;
1472
- }
1473
-
1474
- const channel = envelope.payload.channel;
1475
- const members = this.channels.get(channel);
1476
-
1477
- routerLog.info(`routeChannelMessage: channel=${channel} sender=${senderName} members=${members ? Array.from(members).join(',') : 'NONE'}`);
1478
-
1479
- if (!members) {
1480
- routerLog.warn(`Message to non-existent channel ${channel} (available channels: ${Array.from(this.channels.keys()).join(', ')})`);
1481
- return;
1482
- }
1483
-
1484
- // Case-insensitive membership check
1485
- const senderMemberName = this.findMemberInSet(members, senderName);
1486
- if (!senderMemberName) {
1487
- routerLog.warn(`${senderName} not a member of ${channel} (members: ${Array.from(members).join(', ')})`);
1488
- return;
1489
- }
1490
-
1491
- // Route to all members except the sender (no echo)
1492
- const allMembers = Array.from(members);
1493
- routerLog.info(`Routing channel message from ${senderName} to ${channel}`, {
1494
- totalMembers: allMembers.length,
1495
- members: allMembers,
1496
- });
1497
-
1498
- let deliveredCount = 0;
1499
- const undeliveredMembers: string[] = [];
1500
- const connectedAgents = Array.from(this.agents.keys());
1501
- const connectedUsers = Array.from(this.users.keys());
1502
- routerLog.info(`Connected entities: agents=[${connectedAgents.join(',')}] users=[${connectedUsers.join(',')}]`);
1503
-
1504
- for (const memberName of members) {
1505
- // Case-insensitive comparison to skip sender
1506
- if (this.namesMatch(memberName, senderName)) {
1507
- continue;
1508
- }
1509
-
1510
- // Check for agent connection first
1511
- const agentConn = this.agents.get(memberName);
1512
- if (agentConn) {
1513
- const deliverEnvelope: Envelope<ChannelMessagePayload> = {
1514
- v: PROTOCOL_VERSION,
1515
- type: 'CHANNEL_MESSAGE',
1516
- id: generateId(),
1517
- ts: Date.now(),
1518
- from: senderName,
1519
- payload: envelope.payload,
1520
- };
1521
- const sent = agentConn.send(deliverEnvelope);
1522
- if (sent) {
1523
- deliveredCount++;
1524
- routerLog.info(`Delivered to ${memberName} (agent)`);
1525
- } else {
1526
- routerLog.warn(`Failed to send to ${memberName}`);
1527
- undeliveredMembers.push(memberName);
1528
- }
1529
- continue;
1530
- }
1531
-
1532
- // Check for user connections (send to ALL for multi-tab support)
1533
- const userConnections = this.users.get(memberName);
1534
- if (userConnections && userConnections.size > 0) {
1535
- let anyDelivered = false;
1536
- for (const userConn of userConnections) {
1537
- const deliverEnvelope: Envelope<ChannelMessagePayload> = {
1538
- v: PROTOCOL_VERSION,
1539
- type: 'CHANNEL_MESSAGE',
1540
- id: generateId(),
1541
- ts: Date.now(),
1542
- from: senderName,
1543
- payload: envelope.payload,
1544
- };
1545
- const sent = userConn.send(deliverEnvelope);
1546
- if (sent) {
1547
- anyDelivered = true;
1548
- routerLog.info(`Delivered to ${memberName} (user connection ${userConn.id})`);
1549
- }
1550
- }
1551
- if (anyDelivered) {
1552
- deliveredCount++;
1553
- } else {
1554
- routerLog.warn(`Failed to send to any connection for user ${memberName}`);
1555
- undeliveredMembers.push(memberName);
1556
- }
1557
- continue;
1558
- }
1559
-
1560
- // Member not connected
1561
- routerLog.warn(`Member ${memberName} is registered in channel but NOT connected to daemon - message not delivered`);
1562
- undeliveredMembers.push(memberName);
1563
- }
1564
-
1565
- // Persist channel message
1566
- this.persistChannelMessage(envelope, senderName);
1567
-
1568
- const recipientCount = allMembers.length - 1; // Exclude sender
1569
- routerLog.info(`${senderName} -> ${channel}: delivered to ${deliveredCount}/${recipientCount} members`);
1570
-
1571
- // Log warning if some members didn't receive the message
1572
- if (undeliveredMembers.length > 0) {
1573
- routerLog.warn(`Channel message undelivered to: [${undeliveredMembers.join(', ')}] - these agents may need to reconnect to the relay daemon`);
1574
- }
1575
- }
1576
-
1577
- /**
1578
- * Persist a channel message to storage.
1579
- */
1580
- private persistChannelMessage(
1581
- envelope: Envelope<ChannelMessagePayload>,
1582
- from: string
1583
- ): void {
1584
- if (!this.storage) return;
1585
-
1586
- const payloadData = {
1587
- ...envelope.payload.data,
1588
- _isChannelMessage: true,
1589
- _channel: envelope.payload.channel,
1590
- _mentions: envelope.payload.mentions,
1591
- };
1592
-
1593
- this.storage.saveMessage({
1594
- id: envelope.id,
1595
- ts: envelope.ts,
1596
- from,
1597
- to: envelope.payload.channel, // Channel name as "to"
1598
- topic: undefined,
1599
- kind: 'message',
1600
- body: envelope.payload.body,
1601
- data: payloadData,
1602
- thread: envelope.payload.thread,
1603
- status: 'unread',
1604
- is_urgent: false,
1605
- is_broadcast: true, // Channel messages are effectively broadcasts
1606
- }).catch((err) => {
1607
- routerLog.error('Failed to persist channel message', { error: String(err) });
1608
- });
1609
- }
1610
-
1611
- private persistChannelMembership(
1612
- channel: string,
1613
- member: string,
1614
- action: 'join' | 'leave',
1615
- opts?: { invitedBy?: string }
1616
- ): void {
1617
- if (this.storage) {
1618
- this.storage.saveMessage({
1619
- id: crypto.randomUUID(),
1620
- ts: Date.now(),
1621
- from: '__system__',
1622
- to: channel,
1623
- topic: undefined,
1624
- kind: 'state', // membership events stored as state
1625
- body: `${action}:${member}`,
1626
- data: {
1627
- _channelMembership: {
1628
- member,
1629
- action,
1630
- invitedBy: opts?.invitedBy,
1631
- },
1632
- },
1633
- status: 'read',
1634
- is_urgent: false,
1635
- is_broadcast: true,
1636
- }).catch((err) => {
1637
- routerLog.error('Failed to persist channel membership', { error: String(err) });
1638
- });
1639
- }
1640
-
1641
- if (this.channelMembershipStore) {
1642
- const persistPromise = action === 'leave'
1643
- ? this.channelMembershipStore.removeMember(channel, member)
1644
- : this.channelMembershipStore.addMember(channel, member);
1645
-
1646
- persistPromise.catch((err) => {
1647
- routerLog.error('Failed to sync channel membership to cloud store', {
1648
- channel,
1649
- member,
1650
- action,
1651
- error: err instanceof Error ? err.message : String(err),
1652
- });
1653
- });
1654
- }
1655
- }
1656
-
1657
- /**
1658
- * Get all members of a channel.
1659
- */
1660
- getChannelMembers(channel: string): string[] {
1661
- const members = this.channels.get(channel);
1662
- return members ? Array.from(members) : [];
1663
- }
1664
-
1665
- /**
1666
- * Get all channels.
1667
- */
1668
- getChannels(): string[] {
1669
- return Array.from(this.channels.keys());
1670
- }
1671
-
1672
- /**
1673
- * Get all channels a member is in.
1674
- */
1675
- getChannelsForMember(memberName: string): string[] {
1676
- const channels = this.memberChannels.get(memberName);
1677
- return channels ? Array.from(channels) : [];
1678
- }
1679
-
1680
- /**
1681
- * Check if a name belongs to a user (not an agent).
1682
- */
1683
- isUser(name: string): boolean {
1684
- return this.users.has(name);
1685
- }
1686
-
1687
- /**
1688
- * Check if a name belongs to an agent (not a user).
1689
- */
1690
- isAgent(name: string): boolean {
1691
- return this.agents.has(name);
1692
- }
1693
-
1694
- /**
1695
- * Get list of connected user names (human users only).
1696
- */
1697
- getUsers(): string[] {
1698
- return Array.from(this.users.keys());
1699
- }
1700
-
1701
- /**
1702
- * Get a connection by name (checks both agents and users).
1703
- * Uses case-insensitive lookup to handle mismatched casing.
1704
- * For users with multiple connections, returns the first connection.
1705
- */
1706
- private getConnectionByName(name: string): RoutableConnection | undefined {
1707
- // Try exact match for agent first
1708
- const agentExact = this.agents.get(name);
1709
- if (agentExact) return agentExact;
1710
-
1711
- // Try exact match for user (get first connection from set)
1712
- const userConnections = this.users.get(name);
1713
- if (userConnections && userConnections.size > 0) {
1714
- return [...userConnections][0];
1715
- }
1716
-
1717
- // Fall back to case-insensitive search
1718
- const lowerName = name.toLowerCase();
1719
- for (const [key, conn] of this.agents) {
1720
- if (key.toLowerCase() === lowerName) return conn;
1721
- }
1722
- for (const [key, conns] of this.users) {
1723
- if (key.toLowerCase() === lowerName && conns.size > 0) {
1724
- return [...conns][0];
1725
- }
1726
- }
1727
- return undefined;
1728
- }
1729
-
1730
- /**
1731
- * Check if a member is in a Set (case-insensitive).
1732
- * Returns the actual stored name if found, undefined otherwise.
1733
- */
1734
- private findMemberInSet(members: Set<string>, name: string): string | undefined {
1735
- // Try exact match first
1736
- if (members.has(name)) return name;
1737
-
1738
- // Fall back to case-insensitive search
1739
- const lowerName = name.toLowerCase();
1740
- for (const member of members) {
1741
- if (member.toLowerCase() === lowerName) return member;
1742
- }
1743
- return undefined;
1744
- }
1745
-
1746
- /**
1747
- * Check if two names match (case-insensitive).
1748
- */
1749
- private namesMatch(a: string, b: string): boolean {
1750
- return a.toLowerCase() === b.toLowerCase();
1751
- }
1752
-
1753
- /**
1754
- * Auto-join a member to a channel without notifications.
1755
- * Used for default channel membership (e.g., #general).
1756
- * @param memberName - The agent or user name to add
1757
- * @param channel - The channel to join (e.g., '#general')
1758
- */
1759
- autoJoinChannel(memberName: string, channel: string, options?: { persist?: boolean }): void {
1760
- // Get or create channel
1761
- let members = this.channels.get(channel);
1762
- if (!members) {
1763
- members = new Set();
1764
- this.channels.set(channel, members);
1765
- }
1766
-
1767
- // Check if already a member
1768
- const added = this.addChannelMember(channel, memberName, { persist: options?.persist });
1769
- if (added) {
1770
- routerLog.debug(`Auto-joined ${memberName} to ${channel}`);
1771
- }
1772
- }
1773
-
1774
- private addChannelMember(
1775
- channel: string,
1776
- memberName: string,
1777
- options?: { persist?: boolean }
1778
- ): boolean {
1779
- let members = this.channels.get(channel);
1780
- if (!members) {
1781
- members = new Set();
1782
- this.channels.set(channel, members);
1783
- }
1784
- // Case-insensitive check for existing membership
1785
- const existingMember = this.findMemberInSet(members, memberName);
1786
- if (existingMember) {
1787
- return false;
1788
- }
1789
- members.add(memberName);
1790
-
1791
- const memberChannelSet = this.memberChannels.get(memberName) ?? new Set();
1792
- memberChannelSet.add(channel);
1793
- this.memberChannels.set(memberName, memberChannelSet);
1794
-
1795
- if (options?.persist ?? true) {
1796
- this.persistChannelMembership(channel, memberName, 'join');
1797
- }
1798
-
1799
- return true;
1800
- }
1801
-
1802
- private removeChannelMember(
1803
- channel: string,
1804
- memberName: string,
1805
- options?: { persist?: boolean }
1806
- ): boolean {
1807
- const members = this.channels.get(channel);
1808
- if (!members) {
1809
- return false;
1810
- }
1811
-
1812
- // Case-insensitive lookup to find actual stored name
1813
- const actualMemberName = this.findMemberInSet(members, memberName);
1814
- if (!actualMemberName) {
1815
- return false;
1816
- }
1817
-
1818
- members.delete(actualMemberName);
1819
- if (members.size === 0) {
1820
- this.channels.delete(channel);
1821
- }
1822
-
1823
- // Also try case-insensitive for memberChannels cleanup
1824
- const memberChannelSet = this.memberChannels.get(actualMemberName) ?? this.memberChannels.get(memberName);
1825
- if (memberChannelSet) {
1826
- memberChannelSet.delete(channel);
1827
- if (memberChannelSet.size === 0) {
1828
- this.memberChannels.delete(actualMemberName);
1829
- this.memberChannels.delete(memberName); // Clean up both potential keys
1830
- }
1831
- }
1832
-
1833
- if (options?.persist ?? true) {
1834
- this.persistChannelMembership(channel, actualMemberName, 'leave');
1835
- }
1836
-
1837
- return true;
1838
- }
1839
-
1840
- handleMembershipUpdate(update: { channel: string; member: string; action: 'join' | 'leave' | 'invite' }) {
1841
- if (!update.channel || !update.member) {
1842
- return;
1843
- }
1844
-
1845
- if (update.action === 'leave') {
1846
- this.removeChannelMember(update.channel, update.member, { persist: false });
1847
- } else {
1848
- this.addChannelMember(update.channel, update.member, { persist: false });
1849
- }
1850
- }
1851
-
1852
- /**
1853
- * Auto-rejoin an agent to their persisted channels on reconnect.
1854
- * This handles daemon restarts where in-memory channel state is lost.
1855
- * Queries both cloud DB (if available) and SQLite storage for memberships.
1856
- * Uses silent/admin mode to avoid spamming join notifications.
1857
- */
1858
- async autoRejoinChannelsForAgent(agentName: string): Promise<void> {
1859
- const channelsToJoin = new Set<string>();
1860
-
1861
- // Query cloud DB if available
1862
- if (this.channelMembershipStore?.loadMembershipsForAgent) {
1863
- try {
1864
- const cloudMemberships = await this.channelMembershipStore.loadMembershipsForAgent(agentName);
1865
- for (const membership of cloudMemberships) {
1866
- channelsToJoin.add(membership.channel);
1867
- }
1868
- if (cloudMemberships.length > 0) {
1869
- routerLog.debug(`Found ${cloudMemberships.length} channel memberships for ${agentName} in cloud DB`);
1870
- }
1871
- } catch (err) {
1872
- routerLog.error('Failed to query cloud DB for channel memberships', {
1873
- agentName,
1874
- error: String(err),
1875
- });
1876
- }
1877
- }
1878
-
1879
- // Query SQLite storage if available
1880
- if (this.storage?.getChannelMembershipsForAgent) {
1881
- try {
1882
- const sqliteMemberships = await this.storage.getChannelMembershipsForAgent(agentName);
1883
- for (const channel of sqliteMemberships) {
1884
- channelsToJoin.add(channel);
1885
- }
1886
- if (sqliteMemberships.length > 0) {
1887
- routerLog.debug(`Found ${sqliteMemberships.length} channel memberships for ${agentName} in SQLite`);
1888
- }
1889
- } catch (err) {
1890
- routerLog.error('Failed to query SQLite for channel memberships', {
1891
- agentName,
1892
- error: String(err),
1893
- });
1894
- }
1895
- }
1896
-
1897
- if (channelsToJoin.size === 0) {
1898
- routerLog.debug(`No persisted channel memberships found for ${agentName}`);
1899
- return;
1900
- }
1901
-
1902
- // Rejoin channels silently (don't notify other members)
1903
- let rejoinedCount = 0;
1904
- for (const channel of channelsToJoin) {
1905
- // Skip if already in channel (handles deduplication)
1906
- const members = this.channels.get(channel);
1907
- if (members && this.findMemberInSet(members, agentName)) {
1908
- routerLog.debug(`${agentName} already in ${channel}, skipping auto-rejoin`);
1909
- continue;
1910
- }
1911
-
1912
- // Add to channel without persisting (already persisted) or notifying
1913
- const added = this.addChannelMember(channel, agentName, { persist: false });
1914
- if (added) {
1915
- rejoinedCount++;
1916
- }
1917
- }
1918
-
1919
- if (rejoinedCount > 0) {
1920
- routerLog.info(`Auto-rejoined ${agentName} to ${rejoinedCount} channels`, {
1921
- channels: Array.from(channelsToJoin),
1922
- });
1923
- }
1924
- }
1925
- }