agent-relay 2.3.2 → 2.3.5

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 (334) hide show
  1. package/README.md +1 -1
  2. package/dist/index.cjs +1 -1
  3. package/dist/src/cli/index.js +124 -7
  4. package/dist/src/cli/index.js.map +1 -1
  5. package/package.json +20 -26
  6. package/packages/acp-bridge/package.json +2 -2
  7. package/packages/bridge/package.json +7 -7
  8. package/packages/config/dist/cloud-config.d.ts +1 -1
  9. package/packages/config/dist/cloud-config.d.ts.map +1 -1
  10. package/packages/config/dist/cloud-config.js.map +1 -1
  11. package/packages/config/dist/schemas.d.ts +5 -5
  12. package/packages/config/dist/schemas.js +1 -1
  13. package/packages/config/dist/schemas.js.map +1 -1
  14. package/packages/config/package.json +2 -2
  15. package/packages/config/src/cloud-config.ts +2 -2
  16. package/packages/config/src/schemas.test.ts +48 -0
  17. package/packages/config/src/schemas.ts +1 -1
  18. package/packages/continuity/package.json +2 -2
  19. package/packages/daemon/package.json +12 -12
  20. package/packages/hooks/package.json +4 -4
  21. package/packages/mcp/package.json +5 -5
  22. package/packages/memory/package.json +2 -2
  23. package/packages/policy/package.json +2 -2
  24. package/packages/protocol/package.json +1 -1
  25. package/packages/resiliency/package.json +1 -1
  26. package/packages/sdk/dist/index.d.ts +1 -29
  27. package/packages/sdk/dist/index.d.ts.map +1 -1
  28. package/packages/sdk/dist/index.js +1 -38
  29. package/packages/sdk/dist/index.js.map +1 -1
  30. package/packages/sdk/package.json +4 -25
  31. package/packages/sdk/src/index.ts +1 -69
  32. package/packages/sdk-py/README.md +56 -0
  33. package/packages/sdk-py/pyproject.toml +23 -0
  34. package/packages/sdk-py/src/agent_relay/__init__.py +27 -0
  35. package/packages/sdk-py/src/agent_relay/builder.py +367 -0
  36. package/packages/sdk-py/src/agent_relay/types.py +92 -0
  37. package/packages/sdk-py/tests/__init__.py +0 -0
  38. package/packages/sdk-py/tests/test_builder.py +101 -0
  39. package/packages/sdk-ts/dist/__tests__/facade.test.d.ts +2 -0
  40. package/packages/sdk-ts/dist/__tests__/facade.test.d.ts.map +1 -0
  41. package/packages/sdk-ts/dist/__tests__/facade.test.js +257 -0
  42. package/packages/sdk-ts/dist/__tests__/facade.test.js.map +1 -0
  43. package/packages/sdk-ts/dist/__tests__/unit.test.d.ts +2 -0
  44. package/packages/sdk-ts/dist/__tests__/unit.test.d.ts.map +1 -0
  45. package/packages/sdk-ts/dist/__tests__/unit.test.js +124 -0
  46. package/packages/sdk-ts/dist/__tests__/unit.test.js.map +1 -0
  47. package/packages/sdk-ts/dist/client.d.ts +2 -0
  48. package/packages/sdk-ts/dist/client.d.ts.map +1 -1
  49. package/packages/sdk-ts/dist/client.js +2 -0
  50. package/packages/sdk-ts/dist/client.js.map +1 -1
  51. package/packages/sdk-ts/dist/index.d.ts +1 -0
  52. package/packages/sdk-ts/dist/index.d.ts.map +1 -1
  53. package/packages/sdk-ts/dist/index.js +1 -0
  54. package/packages/sdk-ts/dist/index.js.map +1 -1
  55. package/packages/sdk-ts/dist/protocol.d.ts +1 -0
  56. package/packages/sdk-ts/dist/protocol.d.ts.map +1 -1
  57. package/packages/sdk-ts/dist/relay.d.ts +44 -0
  58. package/packages/sdk-ts/dist/relay.d.ts.map +1 -1
  59. package/packages/sdk-ts/dist/relay.js +89 -11
  60. package/packages/sdk-ts/dist/relay.js.map +1 -1
  61. package/packages/sdk-ts/dist/relaycast.js +2 -2
  62. package/packages/sdk-ts/dist/relaycast.js.map +1 -1
  63. package/packages/sdk-ts/dist/workflows/barrier.d.ts +72 -0
  64. package/packages/sdk-ts/dist/workflows/barrier.d.ts.map +1 -0
  65. package/packages/sdk-ts/dist/workflows/barrier.js +162 -0
  66. package/packages/sdk-ts/dist/workflows/barrier.js.map +1 -0
  67. package/packages/sdk-ts/dist/workflows/builder.d.ts +101 -0
  68. package/packages/sdk-ts/dist/workflows/builder.d.ts.map +1 -0
  69. package/packages/sdk-ts/dist/workflows/builder.js +179 -0
  70. package/packages/sdk-ts/dist/workflows/builder.js.map +1 -0
  71. package/packages/sdk-ts/dist/workflows/cli.d.ts +10 -0
  72. package/packages/sdk-ts/dist/workflows/cli.d.ts.map +1 -0
  73. package/packages/sdk-ts/dist/workflows/cli.js +82 -0
  74. package/packages/sdk-ts/dist/workflows/cli.js.map +1 -0
  75. package/packages/sdk-ts/dist/workflows/coordinator.d.ts +68 -0
  76. package/packages/sdk-ts/dist/workflows/coordinator.d.ts.map +1 -0
  77. package/packages/sdk-ts/dist/workflows/coordinator.js +353 -0
  78. package/packages/sdk-ts/dist/workflows/coordinator.js.map +1 -0
  79. package/packages/sdk-ts/dist/workflows/index.d.ts +10 -0
  80. package/packages/sdk-ts/dist/workflows/index.d.ts.map +1 -0
  81. package/packages/sdk-ts/dist/workflows/index.js +10 -0
  82. package/packages/sdk-ts/dist/workflows/index.js.map +1 -0
  83. package/packages/sdk-ts/dist/workflows/memory-db.d.ts +17 -0
  84. package/packages/sdk-ts/dist/workflows/memory-db.d.ts.map +1 -0
  85. package/packages/sdk-ts/dist/workflows/memory-db.js +33 -0
  86. package/packages/sdk-ts/dist/workflows/memory-db.js.map +1 -0
  87. package/packages/sdk-ts/dist/workflows/run.d.ts +31 -0
  88. package/packages/sdk-ts/dist/workflows/run.d.ts.map +1 -0
  89. package/packages/sdk-ts/dist/workflows/run.js +24 -0
  90. package/packages/sdk-ts/dist/workflows/run.js.map +1 -0
  91. package/packages/sdk-ts/dist/workflows/runner.d.ts +119 -0
  92. package/packages/sdk-ts/dist/workflows/runner.d.ts.map +1 -0
  93. package/packages/sdk-ts/dist/workflows/runner.js +650 -0
  94. package/packages/sdk-ts/dist/workflows/runner.js.map +1 -0
  95. package/packages/sdk-ts/dist/workflows/state.d.ts +77 -0
  96. package/packages/sdk-ts/dist/workflows/state.d.ts.map +1 -0
  97. package/packages/sdk-ts/dist/workflows/state.js +140 -0
  98. package/packages/sdk-ts/dist/workflows/state.js.map +1 -0
  99. package/packages/sdk-ts/dist/workflows/templates.d.ts +47 -0
  100. package/packages/sdk-ts/dist/workflows/templates.d.ts.map +1 -0
  101. package/packages/sdk-ts/dist/workflows/templates.js +395 -0
  102. package/packages/sdk-ts/dist/workflows/templates.js.map +1 -0
  103. package/packages/sdk-ts/dist/workflows/types.d.ts +126 -0
  104. package/packages/sdk-ts/dist/workflows/types.d.ts.map +1 -0
  105. package/packages/sdk-ts/dist/workflows/types.js +8 -0
  106. package/packages/sdk-ts/dist/workflows/types.js.map +1 -0
  107. package/packages/sdk-ts/package.json +9 -3
  108. package/packages/sdk-ts/src/__tests__/error-scenarios.test.ts +682 -0
  109. package/packages/sdk-ts/src/__tests__/facade.test.ts +296 -0
  110. package/packages/sdk-ts/src/__tests__/swarm-coordinator.test.ts +416 -0
  111. package/packages/sdk-ts/src/__tests__/unit.test.ts +152 -0
  112. package/packages/sdk-ts/src/__tests__/workflow-runner.test.ts +333 -0
  113. package/packages/sdk-ts/src/client.ts +4 -0
  114. package/packages/sdk-ts/src/index.ts +1 -0
  115. package/packages/sdk-ts/src/protocol.ts +1 -1
  116. package/packages/sdk-ts/src/relay.ts +112 -11
  117. package/packages/sdk-ts/src/relaycast.ts +2 -2
  118. package/packages/sdk-ts/src/workflows/README.md +450 -0
  119. package/packages/sdk-ts/src/workflows/barrier.ts +254 -0
  120. package/packages/sdk-ts/src/workflows/builder.ts +241 -0
  121. package/packages/sdk-ts/src/workflows/builtin-templates/bug-fix.yaml +75 -0
  122. package/packages/sdk-ts/src/workflows/builtin-templates/code-review.yaml +82 -0
  123. package/packages/sdk-ts/src/workflows/builtin-templates/documentation.yaml +70 -0
  124. package/packages/sdk-ts/src/workflows/builtin-templates/feature-dev.yaml +76 -0
  125. package/packages/sdk-ts/src/workflows/builtin-templates/refactor.yaml +82 -0
  126. package/packages/sdk-ts/src/workflows/builtin-templates/security-audit.yaml +84 -0
  127. package/packages/sdk-ts/src/workflows/cli.ts +93 -0
  128. package/packages/sdk-ts/src/workflows/coordinator.ts +520 -0
  129. package/packages/sdk-ts/src/workflows/index.ts +9 -0
  130. package/packages/sdk-ts/src/workflows/memory-db.ts +39 -0
  131. package/packages/sdk-ts/src/workflows/run.ts +47 -0
  132. package/packages/sdk-ts/src/workflows/runner.ts +873 -0
  133. package/packages/sdk-ts/src/workflows/schema.json +321 -0
  134. package/packages/sdk-ts/src/workflows/state.ts +279 -0
  135. package/packages/sdk-ts/src/workflows/templates.ts +544 -0
  136. package/packages/sdk-ts/src/workflows/types.ts +178 -0
  137. package/packages/sdk-ts/tsconfig.json +6 -1
  138. package/packages/spawner/package.json +1 -1
  139. package/packages/state/package.json +1 -1
  140. package/packages/storage/package.json +2 -2
  141. package/packages/telemetry/package.json +1 -1
  142. package/packages/trajectory/package.json +2 -2
  143. package/packages/user-directory/package.json +2 -2
  144. package/packages/utils/package.json +3 -3
  145. package/packages/wrapper/package.json +5 -6
  146. package/scripts/postinstall.js +106 -2
  147. package/packages/api-types/.trajectories/active/traj_xbsvuzogscey.json +0 -15
  148. package/packages/api-types/.trajectories/index.json +0 -12
  149. package/packages/api-types/dist/index.d.ts +0 -21
  150. package/packages/api-types/dist/index.d.ts.map +0 -1
  151. package/packages/api-types/dist/index.js +0 -22
  152. package/packages/api-types/dist/index.js.map +0 -1
  153. package/packages/api-types/dist/schemas/agent.d.ts +0 -259
  154. package/packages/api-types/dist/schemas/agent.d.ts.map +0 -1
  155. package/packages/api-types/dist/schemas/agent.js +0 -102
  156. package/packages/api-types/dist/schemas/agent.js.map +0 -1
  157. package/packages/api-types/dist/schemas/api.d.ts +0 -290
  158. package/packages/api-types/dist/schemas/api.d.ts.map +0 -1
  159. package/packages/api-types/dist/schemas/api.js +0 -162
  160. package/packages/api-types/dist/schemas/api.js.map +0 -1
  161. package/packages/api-types/dist/schemas/decision.d.ts +0 -230
  162. package/packages/api-types/dist/schemas/decision.d.ts.map +0 -1
  163. package/packages/api-types/dist/schemas/decision.js +0 -104
  164. package/packages/api-types/dist/schemas/decision.js.map +0 -1
  165. package/packages/api-types/dist/schemas/fleet.d.ts +0 -615
  166. package/packages/api-types/dist/schemas/fleet.d.ts.map +0 -1
  167. package/packages/api-types/dist/schemas/fleet.js +0 -71
  168. package/packages/api-types/dist/schemas/fleet.js.map +0 -1
  169. package/packages/api-types/dist/schemas/history.d.ts +0 -180
  170. package/packages/api-types/dist/schemas/history.d.ts.map +0 -1
  171. package/packages/api-types/dist/schemas/history.js +0 -72
  172. package/packages/api-types/dist/schemas/history.js.map +0 -1
  173. package/packages/api-types/dist/schemas/index.d.ts +0 -14
  174. package/packages/api-types/dist/schemas/index.d.ts.map +0 -1
  175. package/packages/api-types/dist/schemas/index.js +0 -22
  176. package/packages/api-types/dist/schemas/index.js.map +0 -1
  177. package/packages/api-types/dist/schemas/message.d.ts +0 -456
  178. package/packages/api-types/dist/schemas/message.d.ts.map +0 -1
  179. package/packages/api-types/dist/schemas/message.js +0 -88
  180. package/packages/api-types/dist/schemas/message.js.map +0 -1
  181. package/packages/api-types/dist/schemas/session.d.ts +0 -60
  182. package/packages/api-types/dist/schemas/session.d.ts.map +0 -1
  183. package/packages/api-types/dist/schemas/session.js +0 -36
  184. package/packages/api-types/dist/schemas/session.js.map +0 -1
  185. package/packages/api-types/dist/schemas/task.d.ts +0 -111
  186. package/packages/api-types/dist/schemas/task.d.ts.map +0 -1
  187. package/packages/api-types/dist/schemas/task.js +0 -64
  188. package/packages/api-types/dist/schemas/task.js.map +0 -1
  189. package/packages/api-types/package.json +0 -61
  190. package/packages/api-types/scripts/generate-openapi.ts +0 -106
  191. package/packages/api-types/src/index.ts +0 -22
  192. package/packages/api-types/src/schemas/agent.test.ts +0 -164
  193. package/packages/api-types/src/schemas/agent.ts +0 -110
  194. package/packages/api-types/src/schemas/api.test.ts +0 -372
  195. package/packages/api-types/src/schemas/api.ts +0 -194
  196. package/packages/api-types/src/schemas/decision.test.ts +0 -324
  197. package/packages/api-types/src/schemas/decision.ts +0 -136
  198. package/packages/api-types/src/schemas/fleet.test.ts +0 -212
  199. package/packages/api-types/src/schemas/fleet.ts +0 -83
  200. package/packages/api-types/src/schemas/history.test.ts +0 -242
  201. package/packages/api-types/src/schemas/history.ts +0 -84
  202. package/packages/api-types/src/schemas/index.ts +0 -148
  203. package/packages/api-types/src/schemas/message.test.ts +0 -192
  204. package/packages/api-types/src/schemas/message.ts +0 -98
  205. package/packages/api-types/src/schemas/session.test.ts +0 -104
  206. package/packages/api-types/src/schemas/session.ts +0 -40
  207. package/packages/api-types/src/schemas/task.test.ts +0 -192
  208. package/packages/api-types/src/schemas/task.ts +0 -78
  209. package/packages/api-types/tsconfig.json +0 -19
  210. package/packages/api-types/vitest.config.ts +0 -9
  211. package/packages/benchmark/README.md +0 -200
  212. package/packages/benchmark/datasets/coding-tasks.yaml +0 -127
  213. package/packages/benchmark/datasets/coordination-tasks.yaml +0 -122
  214. package/packages/benchmark/datasets/quick-test.yaml +0 -20
  215. package/packages/benchmark/dist/benchmark.d.ts +0 -47
  216. package/packages/benchmark/dist/benchmark.d.ts.map +0 -1
  217. package/packages/benchmark/dist/benchmark.js +0 -224
  218. package/packages/benchmark/dist/benchmark.js.map +0 -1
  219. package/packages/benchmark/dist/cli.d.ts +0 -8
  220. package/packages/benchmark/dist/cli.d.ts.map +0 -1
  221. package/packages/benchmark/dist/cli.js +0 -185
  222. package/packages/benchmark/dist/cli.js.map +0 -1
  223. package/packages/benchmark/dist/harbor.d.ts +0 -53
  224. package/packages/benchmark/dist/harbor.d.ts.map +0 -1
  225. package/packages/benchmark/dist/harbor.js +0 -127
  226. package/packages/benchmark/dist/harbor.js.map +0 -1
  227. package/packages/benchmark/dist/index.d.ts +0 -48
  228. package/packages/benchmark/dist/index.d.ts.map +0 -1
  229. package/packages/benchmark/dist/index.js +0 -50
  230. package/packages/benchmark/dist/index.js.map +0 -1
  231. package/packages/benchmark/dist/runners/base.d.ts +0 -63
  232. package/packages/benchmark/dist/runners/base.d.ts.map +0 -1
  233. package/packages/benchmark/dist/runners/base.js +0 -156
  234. package/packages/benchmark/dist/runners/base.js.map +0 -1
  235. package/packages/benchmark/dist/runners/index.d.ts +0 -10
  236. package/packages/benchmark/dist/runners/index.d.ts.map +0 -1
  237. package/packages/benchmark/dist/runners/index.js +0 -10
  238. package/packages/benchmark/dist/runners/index.js.map +0 -1
  239. package/packages/benchmark/dist/runners/single.d.ts +0 -19
  240. package/packages/benchmark/dist/runners/single.d.ts.map +0 -1
  241. package/packages/benchmark/dist/runners/single.js +0 -111
  242. package/packages/benchmark/dist/runners/single.js.map +0 -1
  243. package/packages/benchmark/dist/runners/subagent.d.ts +0 -32
  244. package/packages/benchmark/dist/runners/subagent.d.ts.map +0 -1
  245. package/packages/benchmark/dist/runners/subagent.js +0 -212
  246. package/packages/benchmark/dist/runners/subagent.js.map +0 -1
  247. package/packages/benchmark/dist/runners/swarm.d.ts +0 -36
  248. package/packages/benchmark/dist/runners/swarm.d.ts.map +0 -1
  249. package/packages/benchmark/dist/runners/swarm.js +0 -273
  250. package/packages/benchmark/dist/runners/swarm.js.map +0 -1
  251. package/packages/benchmark/dist/types.d.ts +0 -178
  252. package/packages/benchmark/dist/types.d.ts.map +0 -1
  253. package/packages/benchmark/dist/types.js +0 -16
  254. package/packages/benchmark/dist/types.js.map +0 -1
  255. package/packages/benchmark/package.json +0 -80
  256. package/packages/benchmark/src/benchmark.ts +0 -298
  257. package/packages/benchmark/src/cli.ts +0 -240
  258. package/packages/benchmark/src/harbor.ts +0 -170
  259. package/packages/benchmark/src/index.ts +0 -73
  260. package/packages/benchmark/src/runners/base.ts +0 -205
  261. package/packages/benchmark/src/runners/index.ts +0 -10
  262. package/packages/benchmark/src/runners/single.ts +0 -121
  263. package/packages/benchmark/src/runners/subagent.ts +0 -240
  264. package/packages/benchmark/src/runners/swarm.ts +0 -326
  265. package/packages/benchmark/src/types.ts +0 -205
  266. package/packages/benchmark/tsconfig.json +0 -20
  267. package/packages/cli-tester/README.md +0 -277
  268. package/packages/cli-tester/dist/index.d.ts +0 -21
  269. package/packages/cli-tester/dist/index.d.ts.map +0 -1
  270. package/packages/cli-tester/dist/index.js +0 -21
  271. package/packages/cli-tester/dist/index.js.map +0 -1
  272. package/packages/cli-tester/dist/utils/credential-check.d.ts +0 -56
  273. package/packages/cli-tester/dist/utils/credential-check.d.ts.map +0 -1
  274. package/packages/cli-tester/dist/utils/credential-check.js +0 -230
  275. package/packages/cli-tester/dist/utils/credential-check.js.map +0 -1
  276. package/packages/cli-tester/dist/utils/socket-client.d.ts +0 -76
  277. package/packages/cli-tester/dist/utils/socket-client.d.ts.map +0 -1
  278. package/packages/cli-tester/dist/utils/socket-client.js +0 -153
  279. package/packages/cli-tester/dist/utils/socket-client.js.map +0 -1
  280. package/packages/cli-tester/docker/Dockerfile +0 -61
  281. package/packages/cli-tester/docker/docker-compose.yml +0 -71
  282. package/packages/cli-tester/docker/entrypoint.sh +0 -58
  283. package/packages/cli-tester/package.json +0 -32
  284. package/packages/cli-tester/scripts/clear-auth.sh +0 -101
  285. package/packages/cli-tester/scripts/inject-message.sh +0 -42
  286. package/packages/cli-tester/scripts/start.sh +0 -71
  287. package/packages/cli-tester/scripts/test-cli.sh +0 -56
  288. package/packages/cli-tester/scripts/test-full-spawn.sh +0 -238
  289. package/packages/cli-tester/scripts/test-registration.sh +0 -182
  290. package/packages/cli-tester/scripts/test-setup-flow.sh +0 -202
  291. package/packages/cli-tester/scripts/test-spawn.sh +0 -140
  292. package/packages/cli-tester/scripts/test-with-daemon.sh +0 -247
  293. package/packages/cli-tester/scripts/verify-auth.sh +0 -112
  294. package/packages/cli-tester/src/index.ts +0 -40
  295. package/packages/cli-tester/src/utils/credential-check.ts +0 -284
  296. package/packages/cli-tester/src/utils/socket-client.ts +0 -211
  297. package/packages/cli-tester/tests/credential-check.test.ts +0 -56
  298. package/packages/cli-tester/tsconfig.json +0 -11
  299. package/packages/sdk/dist/browser-client.d.ts +0 -212
  300. package/packages/sdk/dist/browser-client.d.ts.map +0 -1
  301. package/packages/sdk/dist/browser-client.js +0 -750
  302. package/packages/sdk/dist/browser-client.js.map +0 -1
  303. package/packages/sdk/dist/browser-framing.d.ts +0 -46
  304. package/packages/sdk/dist/browser-framing.d.ts.map +0 -1
  305. package/packages/sdk/dist/browser-framing.js +0 -122
  306. package/packages/sdk/dist/browser-framing.js.map +0 -1
  307. package/packages/sdk/dist/standalone.d.ts +0 -89
  308. package/packages/sdk/dist/standalone.d.ts.map +0 -1
  309. package/packages/sdk/dist/standalone.js +0 -131
  310. package/packages/sdk/dist/standalone.js.map +0 -1
  311. package/packages/sdk/dist/transports/index.d.ts +0 -92
  312. package/packages/sdk/dist/transports/index.d.ts.map +0 -1
  313. package/packages/sdk/dist/transports/index.js +0 -129
  314. package/packages/sdk/dist/transports/index.js.map +0 -1
  315. package/packages/sdk/dist/transports/socket-transport.d.ts +0 -30
  316. package/packages/sdk/dist/transports/socket-transport.d.ts.map +0 -1
  317. package/packages/sdk/dist/transports/socket-transport.js +0 -94
  318. package/packages/sdk/dist/transports/socket-transport.js.map +0 -1
  319. package/packages/sdk/dist/transports/types.d.ts +0 -69
  320. package/packages/sdk/dist/transports/types.d.ts.map +0 -1
  321. package/packages/sdk/dist/transports/types.js +0 -10
  322. package/packages/sdk/dist/transports/types.js.map +0 -1
  323. package/packages/sdk/dist/transports/websocket-transport.d.ts +0 -55
  324. package/packages/sdk/dist/transports/websocket-transport.d.ts.map +0 -1
  325. package/packages/sdk/dist/transports/websocket-transport.js +0 -180
  326. package/packages/sdk/dist/transports/websocket-transport.js.map +0 -1
  327. package/packages/sdk/src/browser-client.ts +0 -985
  328. package/packages/sdk/src/browser-framing.test.ts +0 -115
  329. package/packages/sdk/src/browser-framing.ts +0 -150
  330. package/packages/sdk/src/standalone.ts +0 -183
  331. package/packages/sdk/src/transports/index.ts +0 -197
  332. package/packages/sdk/src/transports/socket-transport.ts +0 -115
  333. package/packages/sdk/src/transports/types.ts +0 -77
  334. package/packages/sdk/src/transports/websocket-transport.ts +0 -245
@@ -1,212 +0,0 @@
1
- /**
2
- * Sub-Agent Runner
3
- *
4
- * Runs tasks using a lead agent that spawns and coordinates workers hierarchically.
5
- */
6
- import { ConfigurationRunner } from './base.js';
7
- /**
8
- * Runner for sub-agent (hierarchical) configuration
9
- */
10
- export class SubAgentRunner extends ConfigurationRunner {
11
- workerCount = 0;
12
- get configurationType() {
13
- return 'subagent';
14
- }
15
- async run(task) {
16
- const startTime = Date.now();
17
- let firstActionTime = 0;
18
- let success = false;
19
- this.resetMetrics();
20
- this.workerCount = 0;
21
- this.log(`Starting task: ${task.id}`);
22
- try {
23
- // Set up message monitoring before spawning
24
- this.setupMessageMonitoring();
25
- // Spawn lead agent that will delegate to workers
26
- const leadResult = await this.orchestrator.spawn({
27
- name: 'Lead',
28
- cli: this.config.cli,
29
- task: this.buildLeadPrompt(task),
30
- cwd: this.config.cwd,
31
- });
32
- if (!leadResult.success) {
33
- this.metrics.errors.push(leadResult.error || 'Lead spawn failed');
34
- return this.buildFailedResult(task, startTime, this.metrics.errors);
35
- }
36
- this.metrics.spawnedAgents.push('Lead');
37
- firstActionTime = Date.now() - startTime;
38
- this.log(`Lead agent spawned in ${firstActionTime}ms`);
39
- // Wait for lead to complete (including all worker coordination)
40
- success = await this.waitForLeadCompletion(task);
41
- if (success) {
42
- this.log(`Task completed with ${this.workerCount} workers`);
43
- }
44
- else {
45
- this.log('Task failed or timed out');
46
- }
47
- }
48
- catch (err) {
49
- this.metrics.errors.push(err.message);
50
- }
51
- // Collect final metrics
52
- let totalTokens = 0;
53
- let peakMemory = 0;
54
- try {
55
- const metrics = await this.orchestrator.getMetrics();
56
- totalTokens = this.extractTokens(metrics);
57
- peakMemory = this.extractMemory(metrics);
58
- }
59
- catch {
60
- // Metrics collection failed
61
- }
62
- const completedAt = Date.now();
63
- const agentCount = 1 + this.workerCount;
64
- return {
65
- taskId: task.id,
66
- configuration: 'subagent',
67
- totalTimeMs: completedAt - startTime,
68
- timeToFirstActionMs: firstActionTime,
69
- messageCount: this.metrics.messages,
70
- avgLatencyMs: this.metrics.latencies.length > 0
71
- ? this.metrics.latencies.reduce((a, b) => a + b, 0) /
72
- this.metrics.latencies.length
73
- : 0,
74
- latencyP50Ms: this.percentile(this.metrics.latencies, 50),
75
- latencyP99Ms: this.percentile(this.metrics.latencies, 99),
76
- coordinationRounds: Math.ceil(this.metrics.messages / Math.max(1, this.workerCount)),
77
- agentCount,
78
- totalTokensUsed: totalTokens,
79
- peakMemoryMb: peakMemory,
80
- success,
81
- completionRate: success ? 1.0 : this.workerCount > 0 ? 0.5 : 0.0,
82
- errors: this.metrics.errors,
83
- startedAt: startTime,
84
- completedAt,
85
- };
86
- }
87
- /**
88
- * Set up message monitoring to track worker spawns and coordination
89
- */
90
- setupMessageMonitoring() {
91
- this.orchestrator.onMessage = (from, payload, id, meta) => {
92
- this.metrics.messages++;
93
- // Track when lead spawns workers
94
- if (from === 'Lead') {
95
- // Check for spawn patterns in messages
96
- if (payload.body.includes('->relay-file:spawn') ||
97
- typeof payload.data?.name === 'string') {
98
- this.workerCount++;
99
- const workerName = payload.data?.name || `Worker${this.workerCount}`;
100
- this.metrics.spawnedAgents.push(workerName);
101
- this.log(`Worker spawned: ${workerName}`);
102
- }
103
- }
104
- // Track latencies if we have sync metadata
105
- if (meta?.sync?.correlationId) {
106
- // This would require tracking send times, simplified here
107
- }
108
- };
109
- }
110
- /**
111
- * Wait for the lead agent to signal completion
112
- */
113
- waitForLeadCompletion(task) {
114
- const timeoutMs = task.timeoutMs || 300000;
115
- return new Promise((resolve) => {
116
- const timeout = setTimeout(() => {
117
- this.metrics.errors.push('Timeout waiting for Lead completion');
118
- resolve(false);
119
- }, timeoutMs);
120
- const originalHandler = this.orchestrator.onMessage;
121
- this.orchestrator.onMessage = (from, payload, id, meta, originalTo) => {
122
- // Call existing handler for tracking
123
- if (originalHandler) {
124
- originalHandler(from, payload, id, meta, originalTo);
125
- }
126
- // Check for completion from Lead
127
- if (from === 'Lead' && payload.body.startsWith('DONE:')) {
128
- clearTimeout(timeout);
129
- resolve(true);
130
- }
131
- // Check for fatal errors
132
- if (from === 'Lead' && payload.body.startsWith('ERROR:')) {
133
- this.metrics.errors.push(payload.body);
134
- clearTimeout(timeout);
135
- resolve(false);
136
- }
137
- };
138
- });
139
- }
140
- /**
141
- * Build the task prompt for the lead agent
142
- */
143
- buildLeadPrompt(task) {
144
- const suggestedWorkers = this.suggestWorkerCount(task);
145
- return `You are the Lead agent. Your job is to delegate subtasks to workers and coordinate their efforts.
146
-
147
- ## Task
148
- ${task.description}
149
-
150
- ## Files to Work On
151
- ${task.files.map((f) => `- ${f}`).join('\n')}
152
-
153
- ## Success Criteria
154
- ${task.expectedOutcome}
155
-
156
- ## Your Responsibilities
157
-
158
- 1. **Analyze the task** and break it into subtasks
159
- 2. **Spawn workers** for each subtask (suggested: ${suggestedWorkers} workers)
160
- 3. **Coordinate** their work and handle dependencies
161
- 4. **Aggregate results** and verify success criteria are met
162
-
163
- ## Spawning Workers
164
-
165
- Use the relay protocol to spawn workers:
166
-
167
- \`\`\`bash
168
- cat > $AGENT_RELAY_OUTBOX/spawn << 'EOF'
169
- KIND: spawn
170
- NAME: Worker1
171
- CLI: ${this.config.cli}
172
-
173
- <Task description for this worker>
174
- EOF
175
- \`\`\`
176
- Then output: ->relay-file:spawn
177
-
178
- ## Communication Protocol
179
-
180
- - Workers will send you status updates
181
- - Monitor for "DONE:" messages from workers
182
- - Handle "BLOCKED:" or "ERROR:" messages by reassigning or helping
183
-
184
- ## Completion
185
-
186
- When ALL subtasks are complete and verified:
187
- \`\`\`
188
- DONE: <summary of what was accomplished, including worker contributions>
189
- \`\`\`
190
-
191
- If you encounter an unrecoverable error:
192
- \`\`\`
193
- ERROR: <description of the problem>
194
- \`\`\``;
195
- }
196
- /**
197
- * Suggest number of workers based on task complexity
198
- */
199
- suggestWorkerCount(task) {
200
- switch (task.complexity) {
201
- case 'low':
202
- return Math.min(2, task.files.length);
203
- case 'medium':
204
- return Math.min(3, task.files.length);
205
- case 'high':
206
- return Math.min(5, task.files.length, this.config.maxSwarmSize);
207
- default:
208
- return 2;
209
- }
210
- }
211
- }
212
- //# sourceMappingURL=subagent.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"subagent.js","sourceRoot":"","sources":["../../src/runners/subagent.ts"],"names":[],"mappings":"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"}
@@ -1,36 +0,0 @@
1
- /**
2
- * Swarm Runner
3
- *
4
- * Runs tasks using peer agents that coordinate as equals via messaging.
5
- */
6
- import type { Task, RunResult, ConfigurationType } from '../types.js';
7
- import { ConfigurationRunner } from './base.js';
8
- /**
9
- * Runner for swarm (peer-to-peer) configuration
10
- */
11
- export declare class SwarmRunner extends ConfigurationRunner {
12
- private completedPeers;
13
- get configurationType(): ConfigurationType;
14
- run(task: Task): Promise<RunResult>;
15
- /**
16
- * Set up channel message monitoring
17
- */
18
- private setupChannelMonitoring;
19
- /**
20
- * Determine swarm size based on task complexity and files
21
- */
22
- private determineSwarmSize;
23
- /**
24
- * Partition task files among agents
25
- */
26
- private partitionTask;
27
- /**
28
- * Build prompt for a peer agent
29
- */
30
- private buildPeerPrompt;
31
- /**
32
- * Wait for all peers to complete
33
- */
34
- private waitForSwarmCompletion;
35
- }
36
- //# sourceMappingURL=swarm.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"swarm.d.ts","sourceRoot":"","sources":["../../src/runners/swarm.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD;;GAEG;AACH,qBAAa,WAAY,SAAQ,mBAAmB;IAClD,OAAO,CAAC,cAAc,CAAqB;IAE3C,IAAI,iBAAiB,IAAI,iBAAiB,CAEzC;IAEK,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC;IA+GzC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAqB9B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAuB1B;;OAEG;IACH,OAAO,CAAC,aAAa;IAqBrB;;OAEG;IACH,OAAO,CAAC,eAAe;IA6EvB;;OAEG;IACH,OAAO,CAAC,sBAAsB;CAsC/B"}
@@ -1,273 +0,0 @@
1
- /**
2
- * Swarm Runner
3
- *
4
- * Runs tasks using peer agents that coordinate as equals via messaging.
5
- */
6
- import { ConfigurationRunner } from './base.js';
7
- /**
8
- * Runner for swarm (peer-to-peer) configuration
9
- */
10
- export class SwarmRunner extends ConfigurationRunner {
11
- completedPeers = new Set();
12
- get configurationType() {
13
- return 'swarm';
14
- }
15
- async run(task) {
16
- const startTime = Date.now();
17
- let firstActionTime = 0;
18
- let success = false;
19
- this.resetMetrics();
20
- this.completedPeers.clear();
21
- this.log(`Starting task: ${task.id}`);
22
- // Determine swarm size based on task complexity
23
- const agentCount = this.determineSwarmSize(task);
24
- const peerNames = [];
25
- try {
26
- // Set up channel monitoring
27
- this.setupChannelMonitoring();
28
- // Partition task among peers
29
- const subtasks = this.partitionTask(task, agentCount);
30
- // Spawn peer agents simultaneously
31
- this.log(`Spawning ${agentCount} peer agents...`);
32
- const spawnPromises = subtasks.map((subtask, i) => this.orchestrator.spawn({
33
- name: `Peer${i}`,
34
- cli: this.config.cli,
35
- task: this.buildPeerPrompt(subtask, i, agentCount, task),
36
- cwd: this.config.cwd,
37
- team: 'swarm',
38
- }));
39
- const results = await Promise.all(spawnPromises);
40
- firstActionTime = Date.now() - startTime;
41
- this.log(`Peers spawned in ${firstActionTime}ms`);
42
- // Track successful spawns
43
- for (let i = 0; i < results.length; i++) {
44
- if (results[i].success) {
45
- peerNames.push(`Peer${i}`);
46
- this.metrics.spawnedAgents.push(`Peer${i}`);
47
- }
48
- else {
49
- this.metrics.errors.push(`Peer${i} spawn failed: ${results[i].error}`);
50
- }
51
- }
52
- if (peerNames.length === 0) {
53
- return this.buildFailedResult(task, startTime, this.metrics.errors);
54
- }
55
- // Have orchestrator join #swarm channel to monitor
56
- this.orchestrator.joinChannel('#swarm');
57
- // Wait for swarm consensus on completion
58
- success = await this.waitForSwarmCompletion(peerNames, task);
59
- if (success) {
60
- this.log(`Task completed by swarm of ${peerNames.length} peers`);
61
- }
62
- else {
63
- this.log(`Swarm completed ${this.completedPeers.size}/${peerNames.length} subtasks`);
64
- }
65
- }
66
- catch (err) {
67
- this.metrics.errors.push(err.message);
68
- }
69
- // Collect final metrics
70
- let totalTokens = 0;
71
- let peakMemory = 0;
72
- try {
73
- const metrics = await this.orchestrator.getMetrics();
74
- totalTokens = this.extractTokens(metrics);
75
- peakMemory = this.extractMemory(metrics);
76
- }
77
- catch {
78
- // Metrics collection failed
79
- }
80
- const completedAt = Date.now();
81
- return {
82
- taskId: task.id,
83
- configuration: 'swarm',
84
- totalTimeMs: completedAt - startTime,
85
- timeToFirstActionMs: firstActionTime,
86
- messageCount: this.metrics.messages,
87
- avgLatencyMs: this.metrics.latencies.length > 0
88
- ? this.metrics.latencies.reduce((a, b) => a + b, 0) /
89
- this.metrics.latencies.length
90
- : 0,
91
- latencyP50Ms: this.percentile(this.metrics.latencies, 50),
92
- latencyP99Ms: this.percentile(this.metrics.latencies, 99),
93
- coordinationRounds: Math.ceil(this.metrics.messages / Math.max(1, peerNames.length)),
94
- agentCount: peerNames.length,
95
- totalTokensUsed: totalTokens,
96
- peakMemoryMb: peakMemory,
97
- success,
98
- completionRate: this.completedPeers.size / Math.max(1, peerNames.length),
99
- errors: this.metrics.errors,
100
- startedAt: startTime,
101
- completedAt,
102
- };
103
- }
104
- /**
105
- * Set up channel message monitoring
106
- */
107
- setupChannelMonitoring() {
108
- this.orchestrator.onChannelMessage = (from, channel, body, envelope) => {
109
- this.metrics.messages++;
110
- // Track completion announcements
111
- if (channel === '#swarm' && body.startsWith('DONE:')) {
112
- this.completedPeers.add(from);
113
- this.log(`${from} completed: ${body.substring(5).trim()}`);
114
- }
115
- // Track errors
116
- if (body.startsWith('ERROR:') || body.startsWith('BLOCKED:')) {
117
- this.metrics.errors.push(`${from}: ${body}`);
118
- }
119
- };
120
- this.orchestrator.onMessage = (from, payload, id, meta, originalTo) => {
121
- this.metrics.messages++;
122
- };
123
- }
124
- /**
125
- * Determine swarm size based on task complexity and files
126
- */
127
- determineSwarmSize(task) {
128
- let baseSize;
129
- switch (task.complexity) {
130
- case 'low':
131
- baseSize = 2;
132
- break;
133
- case 'medium':
134
- baseSize = 3;
135
- break;
136
- case 'high':
137
- baseSize = 5;
138
- break;
139
- default:
140
- baseSize = 3;
141
- }
142
- // Don't have more agents than files
143
- const fileCount = task.files.length;
144
- const size = Math.min(baseSize, fileCount, this.config.maxSwarmSize);
145
- return Math.max(2, size); // At least 2 for swarm
146
- }
147
- /**
148
- * Partition task files among agents
149
- */
150
- partitionTask(task, count) {
151
- const filesPerAgent = Math.ceil(task.files.length / count);
152
- const subtasks = [];
153
- for (let i = 0; i < count; i++) {
154
- const start = i * filesPerAgent;
155
- const files = task.files.slice(start, start + filesPerAgent);
156
- // Handle case where we have more agents than files
157
- if (files.length === 0)
158
- continue;
159
- subtasks.push({
160
- ...task,
161
- id: `${task.id}-part${i}`,
162
- files,
163
- });
164
- }
165
- return subtasks;
166
- }
167
- /**
168
- * Build prompt for a peer agent
169
- */
170
- buildPeerPrompt(subtask, index, totalPeers, fullTask) {
171
- const otherPeers = Array.from({ length: totalPeers }, (_, i) => `Peer${i}`)
172
- .filter((_, i) => i !== index)
173
- .join(', ');
174
- return `You are Peer${index} in a swarm of ${totalPeers} peer agents working together.
175
-
176
- ## Your Subtask
177
- Work on these files: ${subtask.files.map((f) => `\`${f}\``).join(', ')}
178
-
179
- ## Full Task Context
180
- ${fullTask.description}
181
-
182
- ## Success Criteria (for full task)
183
- ${fullTask.expectedOutcome}
184
-
185
- ## Peer Coordination
186
-
187
- You are working alongside: ${otherPeers}
188
-
189
- **Communication via #swarm channel:**
190
-
191
- Share your progress:
192
- \`\`\`bash
193
- cat > $AGENT_RELAY_OUTBOX/msg << 'EOF'
194
- TO: #swarm
195
-
196
- STATUS: Working on <what you're doing>
197
- EOF
198
- \`\`\`
199
- Then: ->relay-file:msg
200
-
201
- Ask questions to the swarm:
202
- \`\`\`bash
203
- cat > $AGENT_RELAY_OUTBOX/msg << 'EOF'
204
- TO: #swarm
205
-
206
- QUESTION: <your question>
207
- EOF
208
- \`\`\`
209
- Then: ->relay-file:msg
210
-
211
- Report blockers:
212
- \`\`\`bash
213
- cat > $AGENT_RELAY_OUTBOX/msg << 'EOF'
214
- TO: #swarm
215
-
216
- BLOCKED: <what's blocking you>
217
- EOF
218
- \`\`\`
219
- Then: ->relay-file:msg
220
-
221
- ## Completion
222
-
223
- When YOUR part is complete:
224
- \`\`\`bash
225
- cat > $AGENT_RELAY_OUTBOX/msg << 'EOF'
226
- TO: #swarm
227
-
228
- DONE: Peer${index} completed <brief summary>
229
- EOF
230
- \`\`\`
231
- Then: ->relay-file:msg
232
-
233
- ## Guidelines
234
-
235
- 1. Focus on your assigned files
236
- 2. Coordinate with peers on shared interfaces/dependencies
237
- 3. Don't duplicate work - check the channel for updates
238
- 4. Help peers if they're blocked and you can assist`;
239
- }
240
- /**
241
- * Wait for all peers to complete
242
- */
243
- waitForSwarmCompletion(peers, task) {
244
- const timeoutMs = task.timeoutMs || 300000;
245
- return new Promise((resolve) => {
246
- const timeout = setTimeout(() => {
247
- this.metrics.errors.push(`Swarm timeout: ${this.completedPeers.size}/${peers.length} completed`);
248
- resolve(false);
249
- }, timeoutMs);
250
- // Check periodically if all peers are done
251
- const checkInterval = setInterval(() => {
252
- if (this.completedPeers.size >= peers.length) {
253
- clearInterval(checkInterval);
254
- clearTimeout(timeout);
255
- resolve(true);
256
- }
257
- }, 1000);
258
- // Also check on each channel message
259
- const originalHandler = this.orchestrator.onChannelMessage;
260
- this.orchestrator.onChannelMessage = (from, channel, body, envelope) => {
261
- if (originalHandler) {
262
- originalHandler(from, channel, body, envelope);
263
- }
264
- if (this.completedPeers.size >= peers.length) {
265
- clearInterval(checkInterval);
266
- clearTimeout(timeout);
267
- resolve(true);
268
- }
269
- };
270
- });
271
- }
272
- }
273
- //# sourceMappingURL=swarm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"swarm.js","sourceRoot":"","sources":["../../src/runners/swarm.ts"],"names":[],"mappings":"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"}