agent-relay 2.0.28 → 2.0.32

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 (894) hide show
  1. package/README.md +19 -0
  2. package/dist/index.cjs +85691 -0
  3. package/dist/src/bridge/index.d.ts.map +1 -0
  4. package/dist/src/bridge/index.js.map +1 -0
  5. package/dist/src/cli/commands/doctor.d.ts +2 -0
  6. package/dist/src/cli/commands/doctor.d.ts.map +1 -0
  7. package/dist/src/cli/commands/doctor.js +451 -0
  8. package/dist/src/cli/commands/doctor.js.map +1 -0
  9. package/dist/src/cli/index.d.ts.map +1 -0
  10. package/dist/src/cli/index.js +29 -1
  11. package/dist/src/cli/index.js.map +1 -0
  12. package/dist/src/config/relay-config.d.ts.map +1 -0
  13. package/dist/src/config/relay-config.js.map +1 -0
  14. package/dist/src/continuity/index.d.ts.map +1 -0
  15. package/dist/src/continuity/index.js.map +1 -0
  16. package/dist/src/daemon/index.d.ts.map +1 -0
  17. package/dist/src/daemon/index.js.map +1 -0
  18. package/dist/src/health-worker-manager.d.ts.map +1 -0
  19. package/dist/src/health-worker-manager.js.map +1 -0
  20. package/dist/src/health-worker.d.ts.map +1 -0
  21. package/dist/src/health-worker.js.map +1 -0
  22. package/dist/src/hooks/index.d.ts.map +1 -0
  23. package/dist/src/hooks/index.js.map +1 -0
  24. package/dist/src/index.d.ts.map +1 -0
  25. package/dist/src/index.js.map +1 -0
  26. package/dist/src/memory/index.d.ts.map +1 -0
  27. package/dist/src/memory/index.js.map +1 -0
  28. package/dist/src/policy/index.d.ts.map +1 -0
  29. package/dist/src/policy/index.js.map +1 -0
  30. package/dist/src/protocol/index.d.ts.map +1 -0
  31. package/dist/src/protocol/index.js.map +1 -0
  32. package/dist/src/resiliency/index.d.ts.map +1 -0
  33. package/dist/src/resiliency/index.js.map +1 -0
  34. package/dist/src/shared/cli-auth-config.d.ts.map +1 -0
  35. package/dist/src/shared/cli-auth-config.js.map +1 -0
  36. package/dist/src/state/index.d.ts.map +1 -0
  37. package/dist/src/state/index.js.map +1 -0
  38. package/dist/src/storage/index.d.ts.map +1 -0
  39. package/dist/src/storage/index.js.map +1 -0
  40. package/dist/src/trajectory/index.d.ts.map +1 -0
  41. package/dist/src/trajectory/index.js.map +1 -0
  42. package/dist/src/utils/index.d.ts.map +1 -0
  43. package/dist/src/utils/index.js.map +1 -0
  44. package/dist/src/wrapper/index.d.ts.map +1 -0
  45. package/dist/src/wrapper/index.js.map +1 -0
  46. package/package.json +83 -20
  47. package/packages/api-types/dist/index.d.ts.map +1 -0
  48. package/packages/api-types/dist/index.js.map +1 -0
  49. package/packages/api-types/dist/schemas/agent.d.ts.map +1 -0
  50. package/packages/api-types/dist/schemas/agent.js.map +1 -0
  51. package/packages/api-types/dist/schemas/api.d.ts.map +1 -0
  52. package/packages/api-types/dist/schemas/api.js.map +1 -0
  53. package/packages/api-types/dist/schemas/decision.d.ts.map +1 -0
  54. package/packages/api-types/dist/schemas/decision.js.map +1 -0
  55. package/packages/api-types/dist/schemas/fleet.d.ts.map +1 -0
  56. package/packages/api-types/dist/schemas/fleet.js.map +1 -0
  57. package/packages/api-types/dist/schemas/history.d.ts.map +1 -0
  58. package/packages/api-types/dist/schemas/history.js.map +1 -0
  59. package/packages/api-types/dist/schemas/index.d.ts.map +1 -0
  60. package/packages/api-types/dist/schemas/index.js.map +1 -0
  61. package/packages/api-types/dist/schemas/message.d.ts.map +1 -0
  62. package/packages/api-types/dist/schemas/message.js.map +1 -0
  63. package/packages/api-types/dist/schemas/session.d.ts.map +1 -0
  64. package/packages/api-types/dist/schemas/session.js.map +1 -0
  65. package/packages/api-types/dist/schemas/task.d.ts.map +1 -0
  66. package/packages/api-types/dist/schemas/task.js.map +1 -0
  67. package/packages/api-types/package.json +1 -1
  68. package/packages/api-types/src/index.ts +22 -0
  69. package/packages/api-types/src/schemas/agent.test.ts +164 -0
  70. package/packages/api-types/src/schemas/agent.ts +110 -0
  71. package/packages/api-types/src/schemas/api.test.ts +372 -0
  72. package/packages/api-types/src/schemas/api.ts +194 -0
  73. package/packages/api-types/src/schemas/decision.test.ts +324 -0
  74. package/packages/api-types/src/schemas/decision.ts +136 -0
  75. package/packages/api-types/src/schemas/fleet.test.ts +212 -0
  76. package/packages/api-types/src/schemas/fleet.ts +83 -0
  77. package/packages/api-types/src/schemas/history.test.ts +242 -0
  78. package/packages/api-types/src/schemas/history.ts +84 -0
  79. package/packages/api-types/src/schemas/index.ts +148 -0
  80. package/packages/api-types/src/schemas/message.test.ts +192 -0
  81. package/packages/api-types/src/schemas/message.ts +98 -0
  82. package/packages/api-types/src/schemas/session.test.ts +104 -0
  83. package/packages/api-types/src/schemas/session.ts +40 -0
  84. package/packages/api-types/src/schemas/task.test.ts +192 -0
  85. package/packages/api-types/src/schemas/task.ts +78 -0
  86. package/packages/api-types/tsconfig.json +19 -0
  87. package/packages/api-types/vitest.config.ts +9 -0
  88. package/packages/benchmark/README.md +200 -0
  89. package/packages/benchmark/datasets/coding-tasks.yaml +127 -0
  90. package/packages/benchmark/datasets/coordination-tasks.yaml +122 -0
  91. package/packages/benchmark/dist/benchmark.d.ts +47 -0
  92. package/packages/benchmark/dist/benchmark.d.ts.map +1 -0
  93. package/packages/benchmark/dist/benchmark.js +224 -0
  94. package/packages/benchmark/dist/benchmark.js.map +1 -0
  95. package/packages/benchmark/dist/cli.d.ts +8 -0
  96. package/packages/benchmark/dist/cli.d.ts.map +1 -0
  97. package/packages/benchmark/dist/cli.js +185 -0
  98. package/packages/benchmark/dist/cli.js.map +1 -0
  99. package/packages/benchmark/dist/harbor.d.ts +53 -0
  100. package/packages/benchmark/dist/harbor.d.ts.map +1 -0
  101. package/packages/benchmark/dist/harbor.js +127 -0
  102. package/packages/benchmark/dist/harbor.js.map +1 -0
  103. package/packages/benchmark/dist/index.d.ts +48 -0
  104. package/packages/benchmark/dist/index.d.ts.map +1 -0
  105. package/packages/benchmark/dist/index.js +50 -0
  106. package/packages/benchmark/dist/index.js.map +1 -0
  107. package/packages/benchmark/dist/runners/base.d.ts +63 -0
  108. package/packages/benchmark/dist/runners/base.d.ts.map +1 -0
  109. package/packages/benchmark/dist/runners/base.js +155 -0
  110. package/packages/benchmark/dist/runners/base.js.map +1 -0
  111. package/packages/benchmark/dist/runners/index.d.ts +10 -0
  112. package/packages/benchmark/dist/runners/index.d.ts.map +1 -0
  113. package/packages/benchmark/dist/runners/index.js +10 -0
  114. package/packages/benchmark/dist/runners/index.js.map +1 -0
  115. package/packages/benchmark/dist/runners/single.d.ts +19 -0
  116. package/packages/benchmark/dist/runners/single.d.ts.map +1 -0
  117. package/packages/benchmark/dist/runners/single.js +111 -0
  118. package/packages/benchmark/dist/runners/single.js.map +1 -0
  119. package/packages/benchmark/dist/runners/subagent.d.ts +32 -0
  120. package/packages/benchmark/dist/runners/subagent.d.ts.map +1 -0
  121. package/packages/benchmark/dist/runners/subagent.js +212 -0
  122. package/packages/benchmark/dist/runners/subagent.js.map +1 -0
  123. package/packages/benchmark/dist/runners/swarm.d.ts +36 -0
  124. package/packages/benchmark/dist/runners/swarm.d.ts.map +1 -0
  125. package/packages/benchmark/dist/runners/swarm.js +273 -0
  126. package/packages/benchmark/dist/runners/swarm.js.map +1 -0
  127. package/packages/benchmark/dist/types.d.ts +178 -0
  128. package/packages/benchmark/dist/types.d.ts.map +1 -0
  129. package/packages/benchmark/dist/types.js +16 -0
  130. package/packages/benchmark/dist/types.js.map +1 -0
  131. package/packages/benchmark/package.json +80 -0
  132. package/packages/benchmark/src/benchmark.ts +298 -0
  133. package/packages/benchmark/src/cli.ts +240 -0
  134. package/packages/benchmark/src/harbor.ts +170 -0
  135. package/packages/benchmark/src/index.ts +73 -0
  136. package/packages/benchmark/src/runners/base.ts +204 -0
  137. package/packages/benchmark/src/runners/index.ts +10 -0
  138. package/packages/benchmark/src/runners/single.ts +121 -0
  139. package/packages/benchmark/src/runners/subagent.ts +240 -0
  140. package/packages/benchmark/src/runners/swarm.ts +326 -0
  141. package/packages/benchmark/src/types.ts +205 -0
  142. package/packages/benchmark/tsconfig.json +20 -0
  143. package/packages/bridge/dist/index.d.ts.map +1 -0
  144. package/packages/bridge/dist/index.js.map +1 -0
  145. package/packages/bridge/dist/multi-project-client.d.ts.map +1 -0
  146. package/packages/bridge/dist/multi-project-client.js.map +1 -0
  147. package/packages/bridge/dist/shadow-cli.d.ts.map +1 -0
  148. package/packages/bridge/dist/shadow-cli.js.map +1 -0
  149. package/packages/bridge/dist/spawner.d.ts.map +1 -0
  150. package/packages/bridge/dist/spawner.js +15 -2
  151. package/packages/bridge/dist/spawner.js.map +1 -0
  152. package/packages/bridge/dist/types.d.ts.map +1 -0
  153. package/packages/bridge/dist/types.js.map +1 -0
  154. package/packages/bridge/dist/utils.d.ts.map +1 -0
  155. package/packages/bridge/dist/utils.js.map +1 -0
  156. package/packages/bridge/package.json +8 -8
  157. package/packages/bridge/src/index.ts +25 -0
  158. package/packages/bridge/src/multi-project-client.test.ts +340 -0
  159. package/packages/bridge/src/multi-project-client.ts +469 -0
  160. package/packages/bridge/src/shadow-cli.ts +95 -0
  161. package/packages/bridge/src/spawner-mcp.test.ts +505 -0
  162. package/packages/bridge/src/spawner.ts +1724 -0
  163. package/packages/bridge/src/types.ts +145 -0
  164. package/packages/bridge/src/utils.test.ts +98 -0
  165. package/packages/bridge/src/utils.ts +67 -0
  166. package/packages/bridge/tsconfig.json +29 -0
  167. package/packages/bridge/vitest.config.ts +9 -0
  168. package/packages/cli-tester/dist/index.d.ts.map +1 -0
  169. package/packages/cli-tester/dist/index.js.map +1 -0
  170. package/packages/cli-tester/dist/utils/credential-check.d.ts.map +1 -0
  171. package/packages/cli-tester/dist/utils/credential-check.js.map +1 -0
  172. package/packages/cli-tester/dist/utils/socket-client.d.ts.map +1 -0
  173. package/packages/cli-tester/dist/utils/socket-client.js.map +1 -0
  174. package/packages/cli-tester/docker/Dockerfile +61 -0
  175. package/packages/cli-tester/docker/docker-compose.yml +71 -0
  176. package/packages/cli-tester/package.json +1 -1
  177. package/packages/cli-tester/src/index.ts +40 -0
  178. package/packages/cli-tester/src/utils/credential-check.ts +284 -0
  179. package/packages/cli-tester/src/utils/socket-client.ts +211 -0
  180. package/packages/cli-tester/tests/credential-check.test.ts +56 -0
  181. package/packages/cli-tester/tsconfig.json +11 -0
  182. package/packages/config/dist/agent-config.d.ts.map +1 -0
  183. package/packages/config/dist/agent-config.js.map +1 -0
  184. package/packages/config/dist/bridge-config.d.ts.map +1 -0
  185. package/packages/config/dist/bridge-config.js.map +1 -0
  186. package/packages/config/dist/bridge-utils.d.ts.map +1 -0
  187. package/packages/config/dist/bridge-utils.js.map +1 -0
  188. package/packages/config/dist/cli-auth-config.d.ts.map +1 -0
  189. package/packages/config/dist/cli-auth-config.js.map +1 -0
  190. package/packages/config/dist/cloud-config.d.ts.map +1 -0
  191. package/packages/config/dist/cloud-config.js.map +1 -0
  192. package/packages/config/dist/index.d.ts.map +1 -0
  193. package/packages/config/dist/index.js.map +1 -0
  194. package/packages/config/dist/project-namespace.d.ts.map +1 -0
  195. package/packages/config/dist/project-namespace.js.map +1 -0
  196. package/packages/config/dist/relay-config.d.ts.map +1 -0
  197. package/packages/config/dist/relay-config.js.map +1 -0
  198. package/packages/config/dist/relay-file-writer.d.ts.map +1 -0
  199. package/packages/config/dist/relay-file-writer.js.map +1 -0
  200. package/packages/config/dist/schemas.d.ts.map +1 -0
  201. package/packages/config/dist/schemas.js.map +1 -0
  202. package/packages/config/dist/shadow-config.d.ts.map +1 -0
  203. package/packages/config/dist/shadow-config.js.map +1 -0
  204. package/packages/config/dist/teams-config.d.ts.map +1 -0
  205. package/packages/config/dist/teams-config.js.map +1 -0
  206. package/packages/config/dist/trajectory-config.d.ts.map +1 -0
  207. package/packages/config/dist/trajectory-config.js.map +1 -0
  208. package/packages/config/package.json +2 -2
  209. package/packages/config/src/agent-config.test.ts +245 -0
  210. package/packages/config/src/agent-config.ts +160 -0
  211. package/packages/config/src/bridge-config.test.ts +132 -0
  212. package/packages/config/src/bridge-config.ts +189 -0
  213. package/packages/config/src/bridge-utils.ts +59 -0
  214. package/packages/config/src/cli-auth-config.ts +548 -0
  215. package/packages/config/src/cloud-config.ts +208 -0
  216. package/packages/config/src/index.ts +12 -0
  217. package/packages/config/src/project-namespace.ts +344 -0
  218. package/packages/config/src/relay-config.test.ts +51 -0
  219. package/packages/config/src/relay-config.ts +36 -0
  220. package/packages/config/src/relay-file-writer.test.ts +351 -0
  221. package/packages/config/src/relay-file-writer.ts +508 -0
  222. package/packages/config/src/schemas.test.ts +59 -0
  223. package/packages/config/src/schemas.ts +201 -0
  224. package/packages/config/src/shadow-config.ts +205 -0
  225. package/packages/config/src/teams-config.ts +135 -0
  226. package/packages/config/src/trajectory-config.ts +222 -0
  227. package/packages/config/tsconfig.json +21 -0
  228. package/packages/config/vitest.config.ts +9 -0
  229. package/packages/continuity/dist/formatter.d.ts.map +1 -0
  230. package/packages/continuity/dist/formatter.js.map +1 -0
  231. package/packages/continuity/dist/handoff-store.d.ts.map +1 -0
  232. package/packages/continuity/dist/handoff-store.js.map +1 -0
  233. package/packages/continuity/dist/index.d.ts.map +1 -0
  234. package/packages/continuity/dist/index.js.map +1 -0
  235. package/packages/continuity/dist/ledger-store.d.ts.map +1 -0
  236. package/packages/continuity/dist/ledger-store.js.map +1 -0
  237. package/packages/continuity/dist/manager.d.ts.map +1 -0
  238. package/packages/continuity/dist/manager.js.map +1 -0
  239. package/packages/continuity/dist/parser.d.ts.map +1 -0
  240. package/packages/continuity/dist/parser.js.map +1 -0
  241. package/packages/continuity/dist/types.d.ts.map +1 -0
  242. package/packages/continuity/dist/types.js.map +1 -0
  243. package/packages/continuity/package.json +1 -1
  244. package/packages/continuity/src/formatter.ts +371 -0
  245. package/packages/continuity/src/handoff-store.ts +523 -0
  246. package/packages/continuity/src/index.ts +9 -0
  247. package/packages/continuity/src/ledger-store.ts +594 -0
  248. package/packages/continuity/src/manager.test.ts +291 -0
  249. package/packages/continuity/src/manager.ts +774 -0
  250. package/packages/continuity/src/parser.test.ts +292 -0
  251. package/packages/continuity/src/parser.ts +680 -0
  252. package/packages/continuity/src/types.ts +211 -0
  253. package/packages/continuity/tsconfig.json +21 -0
  254. package/packages/continuity/vitest.config.ts +9 -0
  255. package/packages/daemon/dist/agent-manager.d.ts.map +1 -0
  256. package/packages/daemon/dist/agent-manager.js.map +1 -0
  257. package/packages/daemon/dist/agent-registry.d.ts.map +1 -0
  258. package/packages/daemon/dist/agent-registry.js.map +1 -0
  259. package/packages/daemon/dist/agent-signing.d.ts.map +1 -0
  260. package/packages/daemon/dist/agent-signing.js.map +1 -0
  261. package/packages/daemon/dist/api.d.ts.map +1 -0
  262. package/packages/daemon/dist/api.js.map +1 -0
  263. package/packages/daemon/dist/auth.d.ts.map +1 -0
  264. package/packages/daemon/dist/auth.js.map +1 -0
  265. package/packages/daemon/dist/channel-membership-store.d.ts.map +1 -0
  266. package/packages/daemon/dist/channel-membership-store.js.map +1 -0
  267. package/packages/daemon/dist/cli-auth.d.ts.map +1 -0
  268. package/packages/daemon/dist/cli-auth.js.map +1 -0
  269. package/packages/daemon/dist/cloud-sync.d.ts.map +1 -0
  270. package/packages/daemon/dist/cloud-sync.js.map +1 -0
  271. package/packages/daemon/dist/connection.d.ts.map +1 -0
  272. package/packages/daemon/dist/connection.js.map +1 -0
  273. package/packages/daemon/dist/consensus-integration.d.ts.map +1 -0
  274. package/packages/daemon/dist/consensus-integration.js.map +1 -0
  275. package/packages/daemon/dist/consensus.d.ts.map +1 -0
  276. package/packages/daemon/dist/consensus.js.map +1 -0
  277. package/packages/daemon/dist/delivery-tracker.d.ts.map +1 -0
  278. package/packages/daemon/dist/delivery-tracker.js.map +1 -0
  279. package/packages/daemon/dist/enhanced-features.d.ts.map +1 -0
  280. package/packages/daemon/dist/enhanced-features.js.map +1 -0
  281. package/packages/daemon/dist/index.d.ts.map +1 -0
  282. package/packages/daemon/dist/index.js.map +1 -0
  283. package/packages/daemon/dist/migrations/index.d.ts.map +1 -0
  284. package/packages/daemon/dist/migrations/index.js.map +1 -0
  285. package/packages/daemon/dist/orchestrator.d.ts.map +1 -0
  286. package/packages/daemon/dist/orchestrator.js.map +1 -0
  287. package/packages/daemon/dist/rate-limiter.d.ts.map +1 -0
  288. package/packages/daemon/dist/rate-limiter.js.map +1 -0
  289. package/packages/daemon/dist/registry.d.ts.map +1 -0
  290. package/packages/daemon/dist/registry.js.map +1 -0
  291. package/packages/daemon/dist/relay-ledger.d.ts.map +1 -0
  292. package/packages/daemon/dist/relay-ledger.js.map +1 -0
  293. package/packages/daemon/dist/relay-watchdog.d.ts.map +1 -0
  294. package/packages/daemon/dist/relay-watchdog.js.map +1 -0
  295. package/packages/daemon/dist/repo-manager.d.ts.map +1 -0
  296. package/packages/daemon/dist/repo-manager.js.map +1 -0
  297. package/packages/daemon/dist/router.d.ts.map +1 -0
  298. package/packages/daemon/dist/router.js.map +1 -0
  299. package/packages/daemon/dist/server.d.ts +1 -0
  300. package/packages/daemon/dist/server.d.ts.map +1 -0
  301. package/packages/daemon/dist/server.js +46 -16
  302. package/packages/daemon/dist/server.js.map +1 -0
  303. package/packages/daemon/dist/spawn-manager.d.ts.map +1 -0
  304. package/packages/daemon/dist/spawn-manager.js.map +1 -0
  305. package/packages/daemon/dist/sync-queue.d.ts.map +1 -0
  306. package/packages/daemon/dist/sync-queue.js.map +1 -0
  307. package/packages/daemon/dist/types.d.ts.map +1 -0
  308. package/packages/daemon/dist/types.js.map +1 -0
  309. package/packages/daemon/dist/workspace-manager.d.ts.map +1 -0
  310. package/packages/daemon/dist/workspace-manager.js.map +1 -0
  311. package/packages/daemon/package.json +12 -12
  312. package/packages/daemon/src/agent-manager.ts +679 -0
  313. package/packages/daemon/src/agent-registry.ts +284 -0
  314. package/packages/daemon/src/agent-signing.ts +707 -0
  315. package/packages/daemon/src/api.ts +1012 -0
  316. package/packages/daemon/src/auth.ts +276 -0
  317. package/packages/daemon/src/channel-membership-store.ts +217 -0
  318. package/packages/daemon/src/cli-auth.ts +906 -0
  319. package/packages/daemon/src/cloud-sync.ts +902 -0
  320. package/packages/daemon/src/connection.ts +534 -0
  321. package/packages/daemon/src/consensus-integration.ts +510 -0
  322. package/packages/daemon/src/consensus.ts +848 -0
  323. package/packages/daemon/src/delivery-tracker.ts +145 -0
  324. package/packages/daemon/src/enhanced-features.ts +390 -0
  325. package/packages/daemon/src/index.ts +52 -0
  326. package/packages/daemon/src/migrations/0001_initial.sql +72 -0
  327. package/packages/daemon/src/migrations/index.test.ts +195 -0
  328. package/packages/daemon/src/migrations/index.ts +286 -0
  329. package/packages/daemon/src/orchestrator.test.ts +231 -0
  330. package/packages/daemon/src/orchestrator.ts +1376 -0
  331. package/packages/daemon/src/rate-limiter.ts +172 -0
  332. package/packages/daemon/src/registry.ts +8 -0
  333. package/packages/daemon/src/relay-ledger.test.ts +358 -0
  334. package/packages/daemon/src/relay-ledger.ts +713 -0
  335. package/packages/daemon/src/relay-watchdog.test.ts +881 -0
  336. package/packages/daemon/src/relay-watchdog.ts +785 -0
  337. package/packages/daemon/src/repo-manager.ts +468 -0
  338. package/packages/daemon/src/router.test.ts +149 -0
  339. package/packages/daemon/src/router.ts +1885 -0
  340. package/packages/daemon/src/server.ts +1871 -0
  341. package/packages/daemon/src/spawn-manager.ts +275 -0
  342. package/packages/daemon/src/sync-queue.ts +477 -0
  343. package/packages/daemon/src/types.ts +158 -0
  344. package/packages/daemon/src/workspace-manager.ts +371 -0
  345. package/packages/daemon/tsconfig.json +21 -0
  346. package/packages/hooks/dist/browser.d.ts.map +1 -0
  347. package/packages/hooks/dist/browser.js.map +1 -0
  348. package/packages/hooks/dist/emitter.d.ts.map +1 -0
  349. package/packages/hooks/dist/emitter.js.map +1 -0
  350. package/packages/hooks/dist/inbox-check/hook.d.ts.map +1 -0
  351. package/packages/hooks/dist/inbox-check/hook.js.map +1 -0
  352. package/packages/hooks/dist/inbox-check/index.d.ts.map +1 -0
  353. package/packages/hooks/dist/inbox-check/index.js.map +1 -0
  354. package/packages/hooks/dist/inbox-check/types.d.ts.map +1 -0
  355. package/packages/hooks/dist/inbox-check/types.js.map +1 -0
  356. package/packages/hooks/dist/inbox-check/utils.d.ts.map +1 -0
  357. package/packages/hooks/dist/inbox-check/utils.js.map +1 -0
  358. package/packages/hooks/dist/index.d.ts.map +1 -0
  359. package/packages/hooks/dist/index.js.map +1 -0
  360. package/packages/hooks/dist/registry.d.ts.map +1 -0
  361. package/packages/hooks/dist/registry.js.map +1 -0
  362. package/packages/hooks/dist/trajectory-hooks.d.ts.map +1 -0
  363. package/packages/hooks/dist/trajectory-hooks.js.map +1 -0
  364. package/packages/hooks/dist/types.d.ts.map +1 -0
  365. package/packages/hooks/dist/types.js.map +1 -0
  366. package/packages/hooks/package.json +4 -4
  367. package/packages/hooks/src/browser.ts +2 -0
  368. package/packages/hooks/src/emitter.ts +84 -0
  369. package/packages/hooks/src/inbox-check/hook.ts +114 -0
  370. package/packages/hooks/src/inbox-check/index.ts +8 -0
  371. package/packages/hooks/src/inbox-check/types.ts +39 -0
  372. package/packages/hooks/src/inbox-check/utils.test.ts +287 -0
  373. package/packages/hooks/src/inbox-check/utils.ts +125 -0
  374. package/packages/hooks/src/index.ts +11 -0
  375. package/packages/hooks/src/registry.ts +614 -0
  376. package/packages/hooks/src/shims.d.ts +3 -0
  377. package/packages/hooks/src/trajectory-hooks.ts +251 -0
  378. package/packages/hooks/src/types.ts +342 -0
  379. package/packages/hooks/tsconfig.json +21 -0
  380. package/packages/hooks/vitest.config.ts +9 -0
  381. package/packages/mcp/dist/bin.d.ts.map +1 -0
  382. package/packages/mcp/dist/bin.js.map +1 -0
  383. package/packages/mcp/dist/client.d.ts +9 -15
  384. package/packages/mcp/dist/client.d.ts.map +1 -0
  385. package/packages/mcp/dist/client.js +42 -74
  386. package/packages/mcp/dist/client.js.map +1 -0
  387. package/packages/mcp/dist/cloud.d.ts.map +1 -0
  388. package/packages/mcp/dist/cloud.js.map +1 -0
  389. package/packages/mcp/dist/errors.d.ts.map +1 -0
  390. package/packages/mcp/dist/errors.js.map +1 -0
  391. package/packages/mcp/dist/file-transport.d.ts.map +1 -0
  392. package/packages/mcp/dist/file-transport.js.map +1 -0
  393. package/packages/mcp/dist/hybrid-client.d.ts.map +1 -0
  394. package/packages/mcp/dist/hybrid-client.js.map +1 -0
  395. package/packages/mcp/dist/index.d.ts.map +1 -0
  396. package/packages/mcp/dist/index.js.map +1 -0
  397. package/packages/mcp/dist/install-cli.d.ts.map +1 -0
  398. package/packages/mcp/dist/install-cli.js.map +1 -0
  399. package/packages/mcp/dist/install.d.ts.map +1 -0
  400. package/packages/mcp/dist/install.js.map +1 -0
  401. package/packages/mcp/dist/prompts/index.d.ts.map +1 -0
  402. package/packages/mcp/dist/prompts/index.js.map +1 -0
  403. package/packages/mcp/dist/prompts/protocol.d.ts.map +1 -0
  404. package/packages/mcp/dist/prompts/protocol.js.map +1 -0
  405. package/packages/mcp/dist/resources/agents.d.ts.map +1 -0
  406. package/packages/mcp/dist/resources/agents.js.map +1 -0
  407. package/packages/mcp/dist/resources/inbox.d.ts.map +1 -0
  408. package/packages/mcp/dist/resources/inbox.js.map +1 -0
  409. package/packages/mcp/dist/resources/index.d.ts.map +1 -0
  410. package/packages/mcp/dist/resources/index.js.map +1 -0
  411. package/packages/mcp/dist/resources/project.d.ts.map +1 -0
  412. package/packages/mcp/dist/resources/project.js.map +1 -0
  413. package/packages/mcp/dist/server.d.ts.map +1 -0
  414. package/packages/mcp/dist/server.js.map +1 -0
  415. package/packages/mcp/dist/simple.d.ts +2 -5
  416. package/packages/mcp/dist/simple.d.ts.map +1 -0
  417. package/packages/mcp/dist/simple.js.map +1 -0
  418. package/packages/mcp/dist/tools/index.d.ts.map +1 -0
  419. package/packages/mcp/dist/tools/index.js.map +1 -0
  420. package/packages/mcp/dist/tools/relay-broadcast.d.ts.map +1 -0
  421. package/packages/mcp/dist/tools/relay-broadcast.js.map +1 -0
  422. package/packages/mcp/dist/tools/relay-channel.d.ts.map +1 -0
  423. package/packages/mcp/dist/tools/relay-channel.js.map +1 -0
  424. package/packages/mcp/dist/tools/relay-connected.d.ts.map +1 -0
  425. package/packages/mcp/dist/tools/relay-connected.js.map +1 -0
  426. package/packages/mcp/dist/tools/relay-consensus.d.ts.map +1 -0
  427. package/packages/mcp/dist/tools/relay-consensus.js.map +1 -0
  428. package/packages/mcp/dist/tools/relay-continuity.d.ts.map +1 -0
  429. package/packages/mcp/dist/tools/relay-continuity.js.map +1 -0
  430. package/packages/mcp/dist/tools/relay-health.d.ts.map +1 -0
  431. package/packages/mcp/dist/tools/relay-health.js.map +1 -0
  432. package/packages/mcp/dist/tools/relay-inbox.d.ts.map +1 -0
  433. package/packages/mcp/dist/tools/relay-inbox.js.map +1 -0
  434. package/packages/mcp/dist/tools/relay-logs.d.ts.map +1 -0
  435. package/packages/mcp/dist/tools/relay-logs.js.map +1 -0
  436. package/packages/mcp/dist/tools/relay-metrics.d.ts.map +1 -0
  437. package/packages/mcp/dist/tools/relay-metrics.js.map +1 -0
  438. package/packages/mcp/dist/tools/relay-release.d.ts.map +1 -0
  439. package/packages/mcp/dist/tools/relay-release.js.map +1 -0
  440. package/packages/mcp/dist/tools/relay-remove-agent.d.ts.map +1 -0
  441. package/packages/mcp/dist/tools/relay-remove-agent.js.map +1 -0
  442. package/packages/mcp/dist/tools/relay-send.d.ts.map +1 -0
  443. package/packages/mcp/dist/tools/relay-send.js +4 -2
  444. package/packages/mcp/dist/tools/relay-send.js.map +1 -0
  445. package/packages/mcp/dist/tools/relay-shadow.d.ts.map +1 -0
  446. package/packages/mcp/dist/tools/relay-shadow.js.map +1 -0
  447. package/packages/mcp/dist/tools/relay-spawn.d.ts.map +1 -0
  448. package/packages/mcp/dist/tools/relay-spawn.js.map +1 -0
  449. package/packages/mcp/dist/tools/relay-status.d.ts.map +1 -0
  450. package/packages/mcp/dist/tools/relay-status.js.map +1 -0
  451. package/packages/mcp/dist/tools/relay-subscribe.d.ts.map +1 -0
  452. package/packages/mcp/dist/tools/relay-subscribe.js.map +1 -0
  453. package/packages/mcp/dist/tools/relay-who.d.ts.map +1 -0
  454. package/packages/mcp/dist/tools/relay-who.js.map +1 -0
  455. package/packages/mcp/package.json +3 -3
  456. package/packages/mcp/src/bin.ts +149 -0
  457. package/packages/mcp/src/client.ts +400 -0
  458. package/packages/mcp/src/cloud.ts +523 -0
  459. package/packages/mcp/src/errors.ts +54 -0
  460. package/packages/mcp/src/file-transport.ts +268 -0
  461. package/packages/mcp/src/hybrid-client.ts +209 -0
  462. package/packages/mcp/src/index.ts +122 -0
  463. package/packages/mcp/src/install-cli.ts +210 -0
  464. package/packages/mcp/src/install.ts +745 -0
  465. package/packages/mcp/src/prompts/index.ts +1 -0
  466. package/packages/mcp/src/prompts/protocol.ts +164 -0
  467. package/packages/mcp/src/resources/agents.ts +21 -0
  468. package/packages/mcp/src/resources/inbox.ts +21 -0
  469. package/packages/mcp/src/resources/index.ts +3 -0
  470. package/packages/mcp/src/resources/project.ts +29 -0
  471. package/packages/mcp/src/server.ts +431 -0
  472. package/packages/mcp/src/simple.ts +214 -0
  473. package/packages/mcp/src/tools/index.ts +133 -0
  474. package/packages/mcp/src/tools/relay-broadcast.ts +32 -0
  475. package/packages/mcp/src/tools/relay-channel.ts +93 -0
  476. package/packages/mcp/src/tools/relay-connected.ts +52 -0
  477. package/packages/mcp/src/tools/relay-consensus.ts +92 -0
  478. package/packages/mcp/src/tools/relay-continuity.ts +127 -0
  479. package/packages/mcp/src/tools/relay-health.ts +148 -0
  480. package/packages/mcp/src/tools/relay-inbox.ts +70 -0
  481. package/packages/mcp/src/tools/relay-logs.ts +106 -0
  482. package/packages/mcp/src/tools/relay-metrics.ts +140 -0
  483. package/packages/mcp/src/tools/relay-release.ts +54 -0
  484. package/packages/mcp/src/tools/relay-remove-agent.ts +58 -0
  485. package/packages/mcp/src/tools/relay-send.ts +84 -0
  486. package/packages/mcp/src/tools/relay-shadow.ts +67 -0
  487. package/packages/mcp/src/tools/relay-spawn.ts +87 -0
  488. package/packages/mcp/src/tools/relay-status.ts +57 -0
  489. package/packages/mcp/src/tools/relay-subscribe.ts +61 -0
  490. package/packages/mcp/src/tools/relay-who.ts +59 -0
  491. package/packages/mcp/tests/client.test.ts +476 -0
  492. package/packages/mcp/tests/discover.test.ts +195 -0
  493. package/packages/mcp/tests/install.test.ts +123 -0
  494. package/packages/mcp/tests/prompts.test.ts +12 -0
  495. package/packages/mcp/tests/resources.test.ts +53 -0
  496. package/packages/mcp/tests/tools.test.ts +1242 -0
  497. package/packages/mcp/tsconfig.json +22 -0
  498. package/packages/mcp/vitest.config.ts +9 -0
  499. package/packages/memory/dist/adapters/index.d.ts.map +1 -0
  500. package/packages/memory/dist/adapters/index.js.map +1 -0
  501. package/packages/memory/dist/adapters/inmemory.d.ts.map +1 -0
  502. package/packages/memory/dist/adapters/inmemory.js.map +1 -0
  503. package/packages/memory/dist/adapters/supermemory.d.ts.map +1 -0
  504. package/packages/memory/dist/adapters/supermemory.js.map +1 -0
  505. package/packages/memory/dist/context-compaction.d.ts.map +1 -0
  506. package/packages/memory/dist/context-compaction.js.map +1 -0
  507. package/packages/memory/dist/factory.d.ts.map +1 -0
  508. package/packages/memory/dist/factory.js.map +1 -0
  509. package/packages/memory/dist/index.d.ts.map +1 -0
  510. package/packages/memory/dist/index.js.map +1 -0
  511. package/packages/memory/dist/memory-hooks.d.ts.map +1 -0
  512. package/packages/memory/dist/memory-hooks.js.map +1 -0
  513. package/packages/memory/dist/service.d.ts.map +1 -0
  514. package/packages/memory/dist/service.js.map +1 -0
  515. package/packages/memory/dist/types.d.ts.map +1 -0
  516. package/packages/memory/dist/types.js.map +1 -0
  517. package/packages/memory/package.json +2 -2
  518. package/packages/memory/src/adapters/index.ts +8 -0
  519. package/packages/memory/src/adapters/inmemory.ts +265 -0
  520. package/packages/memory/src/adapters/supermemory.ts +449 -0
  521. package/packages/memory/src/context-compaction.test.ts +660 -0
  522. package/packages/memory/src/context-compaction.ts +612 -0
  523. package/packages/memory/src/factory.ts +170 -0
  524. package/packages/memory/src/index.ts +33 -0
  525. package/packages/memory/src/memory-hooks.ts +410 -0
  526. package/packages/memory/src/service.ts +194 -0
  527. package/packages/memory/src/types.ts +211 -0
  528. package/packages/memory/tsconfig.json +21 -0
  529. package/packages/memory/vitest.config.ts +9 -0
  530. package/packages/policy/dist/agent-policy.d.ts.map +1 -0
  531. package/packages/policy/dist/agent-policy.js.map +1 -0
  532. package/packages/policy/dist/cloud-policy-fetcher.d.ts.map +1 -0
  533. package/packages/policy/dist/cloud-policy-fetcher.js.map +1 -0
  534. package/packages/policy/dist/index.d.ts.map +1 -0
  535. package/packages/policy/dist/index.js.map +1 -0
  536. package/packages/policy/package.json +2 -2
  537. package/packages/policy/src/agent-policy.ts +866 -0
  538. package/packages/policy/src/cloud-policy-fetcher.ts +78 -0
  539. package/packages/policy/src/index.ts +21 -0
  540. package/packages/policy/tsconfig.json +21 -0
  541. package/packages/policy/vitest.config.ts +9 -0
  542. package/packages/protocol/dist/channels.d.ts.map +1 -0
  543. package/packages/protocol/dist/channels.js.map +1 -0
  544. package/packages/protocol/dist/framing.d.ts.map +1 -0
  545. package/packages/protocol/dist/framing.js.map +1 -0
  546. package/packages/protocol/dist/id-generator.d.ts.map +1 -0
  547. package/packages/protocol/dist/id-generator.js.map +1 -0
  548. package/packages/protocol/dist/index.d.ts.map +1 -0
  549. package/packages/protocol/dist/index.js.map +1 -0
  550. package/packages/protocol/dist/relay-pty-schemas.d.ts +70 -2
  551. package/packages/protocol/dist/relay-pty-schemas.d.ts.map +1 -0
  552. package/packages/protocol/dist/relay-pty-schemas.js.map +1 -0
  553. package/packages/protocol/dist/types.d.ts +8 -0
  554. package/packages/protocol/dist/types.d.ts.map +1 -0
  555. package/packages/protocol/dist/types.js.map +1 -0
  556. package/packages/protocol/package.json +1 -1
  557. package/packages/protocol/src/channels.test.ts +330 -0
  558. package/packages/protocol/src/channels.ts +270 -0
  559. package/packages/protocol/src/framing.test.ts +164 -0
  560. package/packages/protocol/src/framing.ts +242 -0
  561. package/packages/protocol/src/id-generator.ts +69 -0
  562. package/packages/protocol/src/index.ts +4 -0
  563. package/packages/protocol/src/relay-pty-schemas.ts +400 -0
  564. package/packages/protocol/src/types.test.ts +271 -0
  565. package/packages/protocol/src/types.ts +846 -0
  566. package/packages/protocol/tsconfig.json +21 -0
  567. package/packages/protocol/vitest.config.ts +9 -0
  568. package/packages/resiliency/dist/cgroup-manager.d.ts.map +1 -0
  569. package/packages/resiliency/dist/cgroup-manager.js.map +1 -0
  570. package/packages/resiliency/dist/context-persistence.d.ts.map +1 -0
  571. package/packages/resiliency/dist/context-persistence.js.map +1 -0
  572. package/packages/resiliency/dist/crash-insights.d.ts.map +1 -0
  573. package/packages/resiliency/dist/crash-insights.js.map +1 -0
  574. package/packages/resiliency/dist/gossip-health.d.ts.map +1 -0
  575. package/packages/resiliency/dist/gossip-health.js.map +1 -0
  576. package/packages/resiliency/dist/health-monitor.d.ts.map +1 -0
  577. package/packages/resiliency/dist/health-monitor.js.map +1 -0
  578. package/packages/resiliency/dist/index.d.ts.map +1 -0
  579. package/packages/resiliency/dist/index.js.map +1 -0
  580. package/packages/resiliency/dist/leader-watchdog.d.ts.map +1 -0
  581. package/packages/resiliency/dist/leader-watchdog.js.map +1 -0
  582. package/packages/resiliency/dist/logger.d.ts.map +1 -0
  583. package/packages/resiliency/dist/logger.js.map +1 -0
  584. package/packages/resiliency/dist/memory-monitor.d.ts.map +1 -0
  585. package/packages/resiliency/dist/memory-monitor.js.map +1 -0
  586. package/packages/resiliency/dist/metrics.d.ts.map +1 -0
  587. package/packages/resiliency/dist/metrics.js.map +1 -0
  588. package/packages/resiliency/dist/provider-context.d.ts.map +1 -0
  589. package/packages/resiliency/dist/provider-context.js.map +1 -0
  590. package/packages/resiliency/dist/stateless-lead.d.ts.map +1 -0
  591. package/packages/resiliency/dist/stateless-lead.js.map +1 -0
  592. package/packages/resiliency/dist/supervisor.d.ts.map +1 -0
  593. package/packages/resiliency/dist/supervisor.js.map +1 -0
  594. package/packages/resiliency/package.json +1 -1
  595. package/packages/resiliency/src/cgroup-manager.ts +468 -0
  596. package/packages/resiliency/src/context-persistence.ts +538 -0
  597. package/packages/resiliency/src/crash-insights.test.ts +620 -0
  598. package/packages/resiliency/src/crash-insights.ts +660 -0
  599. package/packages/resiliency/src/gossip-health.ts +333 -0
  600. package/packages/resiliency/src/health-monitor.ts +371 -0
  601. package/packages/resiliency/src/index.ts +157 -0
  602. package/packages/resiliency/src/leader-watchdog.ts +260 -0
  603. package/packages/resiliency/src/logger.ts +320 -0
  604. package/packages/resiliency/src/memory-monitor.test.ts +637 -0
  605. package/packages/resiliency/src/memory-monitor.ts +740 -0
  606. package/packages/resiliency/src/metrics.ts +311 -0
  607. package/packages/resiliency/src/provider-context.ts +452 -0
  608. package/packages/resiliency/src/stateless-lead.ts +408 -0
  609. package/packages/resiliency/src/supervisor.ts +578 -0
  610. package/packages/resiliency/tsconfig.json +21 -0
  611. package/packages/resiliency/vitest.config.ts +9 -0
  612. package/packages/sdk/dist/client.d.ts.map +1 -0
  613. package/packages/sdk/dist/client.js.map +1 -0
  614. package/packages/sdk/dist/index.d.ts.map +1 -0
  615. package/packages/sdk/dist/index.js.map +1 -0
  616. package/packages/sdk/dist/logs.d.ts.map +1 -0
  617. package/packages/sdk/dist/logs.js.map +1 -0
  618. package/packages/sdk/dist/protocol/index.d.ts.map +1 -0
  619. package/packages/sdk/dist/protocol/index.js.map +1 -0
  620. package/packages/sdk/dist/standalone.d.ts.map +1 -0
  621. package/packages/sdk/dist/standalone.js.map +1 -0
  622. package/packages/sdk/examples/SWARM_CAPABILITIES.md +498 -0
  623. package/packages/sdk/examples/SWARM_PATTERNS.md +541 -0
  624. package/packages/sdk/package.json +2 -2
  625. package/packages/sdk/src/client.test.ts +568 -0
  626. package/packages/sdk/src/client.ts +1418 -0
  627. package/packages/sdk/src/index.ts +103 -0
  628. package/packages/sdk/src/logs.test.ts +98 -0
  629. package/packages/sdk/src/logs.ts +126 -0
  630. package/packages/sdk/src/protocol/framing.test.ts +164 -0
  631. package/packages/sdk/src/protocol/index.ts +8 -0
  632. package/packages/sdk/src/standalone.ts +176 -0
  633. package/packages/sdk/tsconfig.json +22 -0
  634. package/packages/sdk/vitest.config.ts +9 -0
  635. package/packages/spawner/.trajectories/index.json +5 -0
  636. package/packages/spawner/dist/index.d.ts.map +1 -0
  637. package/packages/spawner/dist/index.js.map +1 -0
  638. package/packages/spawner/dist/types.d.ts.map +1 -0
  639. package/packages/spawner/dist/types.js.map +1 -0
  640. package/packages/spawner/package.json +1 -1
  641. package/packages/spawner/src/index.ts +8 -0
  642. package/packages/spawner/src/types.test.ts +385 -0
  643. package/packages/spawner/src/types.ts +228 -0
  644. package/packages/spawner/tsconfig.json +19 -0
  645. package/packages/spawner/vitest.config.ts +9 -0
  646. package/packages/state/dist/agent-state.d.ts.map +1 -0
  647. package/packages/state/dist/agent-state.js.map +1 -0
  648. package/packages/state/dist/index.d.ts.map +1 -0
  649. package/packages/state/dist/index.js.map +1 -0
  650. package/packages/state/package.json +1 -1
  651. package/packages/state/src/agent-state.test.ts +335 -0
  652. package/packages/state/src/agent-state.ts +153 -0
  653. package/packages/state/src/index.ts +12 -0
  654. package/packages/state/tsconfig.json +21 -0
  655. package/packages/state/vitest.config.ts +9 -0
  656. package/packages/storage/dist/adapter.d.ts +28 -1
  657. package/packages/storage/dist/adapter.d.ts.map +1 -0
  658. package/packages/storage/dist/adapter.js +104 -10
  659. package/packages/storage/dist/adapter.js.map +1 -0
  660. package/packages/storage/dist/batched-sqlite-adapter.d.ts.map +1 -0
  661. package/packages/storage/dist/batched-sqlite-adapter.js.map +1 -0
  662. package/packages/storage/dist/dead-letter-queue.d.ts.map +1 -0
  663. package/packages/storage/dist/dead-letter-queue.js.map +1 -0
  664. package/packages/storage/dist/dlq-adapter.d.ts.map +1 -0
  665. package/packages/storage/dist/dlq-adapter.js.map +1 -0
  666. package/packages/storage/dist/index.d.ts +1 -0
  667. package/packages/storage/dist/index.d.ts.map +1 -0
  668. package/packages/storage/dist/index.js +1 -0
  669. package/packages/storage/dist/index.js.map +1 -0
  670. package/packages/storage/dist/jsonl-adapter.d.ts +77 -0
  671. package/packages/storage/dist/jsonl-adapter.d.ts.map +1 -0
  672. package/packages/storage/dist/jsonl-adapter.js +505 -0
  673. package/packages/storage/dist/jsonl-adapter.js.map +1 -0
  674. package/packages/storage/dist/sqlite-adapter.d.ts +6 -1
  675. package/packages/storage/dist/sqlite-adapter.d.ts.map +1 -0
  676. package/packages/storage/dist/sqlite-adapter.js +47 -0
  677. package/packages/storage/dist/sqlite-adapter.js.map +1 -0
  678. package/packages/storage/package.json +2 -2
  679. package/packages/storage/src/adapter.ts +438 -0
  680. package/packages/storage/src/batched-sqlite-adapter.test.ts +240 -0
  681. package/packages/storage/src/batched-sqlite-adapter.ts +239 -0
  682. package/packages/storage/src/dead-letter-queue.ts +643 -0
  683. package/packages/storage/src/dlq-adapter.test.ts +492 -0
  684. package/packages/storage/src/dlq-adapter.ts +954 -0
  685. package/packages/storage/src/index.ts +6 -0
  686. package/packages/storage/src/jsonl-adapter.test.ts +200 -0
  687. package/packages/storage/src/jsonl-adapter.ts +618 -0
  688. package/packages/storage/src/memory-adapter.test.ts +36 -0
  689. package/packages/storage/src/sqlite-adapter.test.ts +562 -0
  690. package/packages/storage/src/sqlite-adapter.ts +1058 -0
  691. package/packages/storage/tsconfig.json +21 -0
  692. package/packages/storage/vitest.config.ts +9 -0
  693. package/packages/telemetry/dist/client.d.ts.map +1 -0
  694. package/packages/telemetry/dist/client.js.map +1 -0
  695. package/packages/telemetry/dist/config.d.ts.map +1 -0
  696. package/packages/telemetry/dist/config.js.map +1 -0
  697. package/packages/telemetry/dist/events.d.ts.map +1 -0
  698. package/packages/telemetry/dist/events.js.map +1 -0
  699. package/packages/telemetry/dist/index.d.ts.map +1 -0
  700. package/packages/telemetry/dist/index.js.map +1 -0
  701. package/packages/telemetry/dist/machine-id.d.ts.map +1 -0
  702. package/packages/telemetry/dist/machine-id.js.map +1 -0
  703. package/packages/telemetry/dist/posthog-config.d.ts.map +1 -0
  704. package/packages/telemetry/dist/posthog-config.js.map +1 -0
  705. package/packages/telemetry/package.json +1 -1
  706. package/packages/telemetry/src/client.ts +158 -0
  707. package/packages/telemetry/src/config.ts +110 -0
  708. package/packages/telemetry/src/events.ts +137 -0
  709. package/packages/telemetry/src/index.ts +46 -0
  710. package/packages/telemetry/src/machine-id.ts +63 -0
  711. package/packages/telemetry/src/posthog-config.ts +39 -0
  712. package/packages/telemetry/tsconfig.json +21 -0
  713. package/packages/trajectory/dist/index.d.ts.map +1 -0
  714. package/packages/trajectory/dist/index.js.map +1 -0
  715. package/packages/trajectory/dist/integration.d.ts.map +1 -0
  716. package/packages/trajectory/dist/integration.js.map +1 -0
  717. package/packages/trajectory/package.json +2 -2
  718. package/packages/trajectory/src/index.ts +1 -0
  719. package/packages/trajectory/src/integration.ts +1268 -0
  720. package/packages/trajectory/tsconfig.json +21 -0
  721. package/packages/trajectory/vitest.config.ts +9 -0
  722. package/packages/user-directory/dist/index.d.ts.map +1 -0
  723. package/packages/user-directory/dist/index.js.map +1 -0
  724. package/packages/user-directory/dist/user-directory.d.ts.map +1 -0
  725. package/packages/user-directory/dist/user-directory.js.map +1 -0
  726. package/packages/user-directory/package.json +2 -2
  727. package/packages/user-directory/src/index.ts +12 -0
  728. package/packages/user-directory/src/user-directory.ts +393 -0
  729. package/packages/user-directory/tsconfig.json +21 -0
  730. package/packages/user-directory/vitest.config.ts +9 -0
  731. package/packages/utils/dist/cjs/client-helpers.js +127 -0
  732. package/packages/utils/dist/cjs/command-resolver.js +89 -0
  733. package/packages/utils/dist/cjs/error-tracking.js +106 -0
  734. package/packages/utils/dist/cjs/git-remote.js +120 -0
  735. package/packages/utils/dist/cjs/index.js +40 -0
  736. package/packages/utils/dist/cjs/logger.js +105 -0
  737. package/packages/utils/dist/cjs/model-mapping.js +54 -0
  738. package/packages/utils/dist/cjs/name-generator.js +179 -0
  739. package/packages/utils/dist/cjs/package.json +3 -0
  740. package/packages/utils/dist/cjs/precompiled-patterns.js +271 -0
  741. package/packages/utils/dist/cjs/relay-pty-path.js +143 -0
  742. package/packages/utils/dist/cjs/update-checker.js +185 -0
  743. package/packages/utils/dist/client-helpers.d.ts +73 -0
  744. package/packages/utils/dist/client-helpers.d.ts.map +1 -0
  745. package/packages/utils/dist/client-helpers.js +130 -0
  746. package/packages/utils/dist/client-helpers.js.map +1 -0
  747. package/packages/utils/dist/command-resolver.d.ts.map +1 -0
  748. package/packages/utils/dist/command-resolver.js.map +1 -0
  749. package/packages/utils/dist/error-tracking.d.ts.map +1 -0
  750. package/packages/utils/dist/error-tracking.js.map +1 -0
  751. package/packages/utils/dist/git-remote.d.ts.map +1 -0
  752. package/packages/utils/dist/git-remote.js.map +1 -0
  753. package/packages/utils/dist/index.d.ts +1 -0
  754. package/packages/utils/dist/index.d.ts.map +1 -0
  755. package/packages/utils/dist/index.js +1 -0
  756. package/packages/utils/dist/index.js.map +1 -0
  757. package/packages/utils/dist/logger.d.ts.map +1 -0
  758. package/packages/utils/dist/logger.js.map +1 -0
  759. package/packages/utils/dist/model-mapping.d.ts.map +1 -0
  760. package/packages/utils/dist/model-mapping.js.map +1 -0
  761. package/packages/utils/dist/name-generator.d.ts.map +1 -0
  762. package/packages/utils/dist/name-generator.js.map +1 -0
  763. package/packages/utils/dist/precompiled-patterns.d.ts.map +1 -0
  764. package/packages/utils/dist/precompiled-patterns.js.map +1 -0
  765. package/packages/utils/dist/relay-pty-path.d.ts +11 -5
  766. package/packages/utils/dist/relay-pty-path.d.ts.map +1 -0
  767. package/packages/utils/dist/relay-pty-path.js +60 -5
  768. package/packages/utils/dist/relay-pty-path.js.map +1 -0
  769. package/packages/utils/dist/update-checker.d.ts.map +1 -0
  770. package/packages/utils/dist/update-checker.js.map +1 -0
  771. package/packages/utils/package.json +37 -14
  772. package/packages/utils/scripts/build-cjs.mjs +24 -0
  773. package/packages/utils/src/client-helpers.ts +221 -0
  774. package/packages/utils/src/command-resolver.ts +82 -0
  775. package/packages/utils/src/error-tracking.ts +189 -0
  776. package/packages/utils/src/git-remote.ts +143 -0
  777. package/packages/utils/src/index.ts +10 -0
  778. package/packages/utils/src/logger.ts +107 -0
  779. package/packages/utils/src/model-mapping.test.ts +122 -0
  780. package/packages/utils/src/model-mapping.ts +58 -0
  781. package/packages/utils/src/name-generator.test.ts +259 -0
  782. package/packages/utils/src/name-generator.ts +56 -0
  783. package/packages/utils/src/precompiled-patterns.test.ts +452 -0
  784. package/packages/utils/src/precompiled-patterns.ts +395 -0
  785. package/packages/utils/src/relay-pty-path.ts +196 -0
  786. package/packages/utils/src/update-checker.test.ts +260 -0
  787. package/packages/utils/src/update-checker.ts +211 -0
  788. package/packages/utils/tsconfig.json +21 -0
  789. package/packages/utils/vitest.config.ts +9 -0
  790. package/packages/wrapper/dist/__fixtures__/claude-outputs.d.ts.map +1 -0
  791. package/packages/wrapper/dist/__fixtures__/claude-outputs.js.map +1 -0
  792. package/packages/wrapper/dist/__fixtures__/codex-outputs.d.ts.map +1 -0
  793. package/packages/wrapper/dist/__fixtures__/codex-outputs.js.map +1 -0
  794. package/packages/wrapper/dist/__fixtures__/gemini-outputs.d.ts.map +1 -0
  795. package/packages/wrapper/dist/__fixtures__/gemini-outputs.js.map +1 -0
  796. package/packages/wrapper/dist/__fixtures__/index.d.ts.map +1 -0
  797. package/packages/wrapper/dist/__fixtures__/index.js.map +1 -0
  798. package/packages/wrapper/dist/auth-detection.d.ts.map +1 -0
  799. package/packages/wrapper/dist/auth-detection.js.map +1 -0
  800. package/packages/wrapper/dist/base-wrapper.d.ts.map +1 -0
  801. package/packages/wrapper/dist/base-wrapper.js.map +1 -0
  802. package/packages/wrapper/dist/client.d.ts.map +1 -0
  803. package/packages/wrapper/dist/client.js.map +1 -0
  804. package/packages/wrapper/dist/id-generator.d.ts.map +1 -0
  805. package/packages/wrapper/dist/id-generator.js.map +1 -0
  806. package/packages/wrapper/dist/idle-detector.d.ts.map +1 -0
  807. package/packages/wrapper/dist/idle-detector.js.map +1 -0
  808. package/packages/wrapper/dist/inbox.d.ts.map +1 -0
  809. package/packages/wrapper/dist/inbox.js.map +1 -0
  810. package/packages/wrapper/dist/index.d.ts.map +1 -0
  811. package/packages/wrapper/dist/index.js.map +1 -0
  812. package/packages/wrapper/dist/parser.d.ts.map +1 -0
  813. package/packages/wrapper/dist/parser.js.map +1 -0
  814. package/packages/wrapper/dist/prompt-composer.d.ts.map +1 -0
  815. package/packages/wrapper/dist/prompt-composer.js.map +1 -0
  816. package/packages/wrapper/dist/relay-pty-orchestrator.d.ts +10 -0
  817. package/packages/wrapper/dist/relay-pty-orchestrator.d.ts.map +1 -0
  818. package/packages/wrapper/dist/relay-pty-orchestrator.js +69 -0
  819. package/packages/wrapper/dist/relay-pty-orchestrator.js.map +1 -0
  820. package/packages/wrapper/dist/shared.d.ts.map +1 -0
  821. package/packages/wrapper/dist/shared.js.map +1 -0
  822. package/packages/wrapper/dist/stuck-detector.d.ts.map +1 -0
  823. package/packages/wrapper/dist/stuck-detector.js.map +1 -0
  824. package/packages/wrapper/dist/tmux-resolver.d.ts.map +1 -0
  825. package/packages/wrapper/dist/tmux-resolver.js.map +1 -0
  826. package/packages/wrapper/dist/tmux-wrapper.d.ts.map +1 -0
  827. package/packages/wrapper/dist/tmux-wrapper.js.map +1 -0
  828. package/packages/wrapper/dist/trajectory-integration.d.ts.map +1 -0
  829. package/packages/wrapper/dist/trajectory-integration.js.map +1 -0
  830. package/packages/wrapper/dist/wrapper-types.d.ts.map +1 -0
  831. package/packages/wrapper/dist/wrapper-types.js.map +1 -0
  832. package/packages/wrapper/package.json +6 -9
  833. package/packages/wrapper/src/__fixtures__/claude-outputs.ts +471 -0
  834. package/packages/wrapper/src/__fixtures__/codex-outputs.ts +99 -0
  835. package/packages/wrapper/src/__fixtures__/gemini-outputs.ts +151 -0
  836. package/packages/wrapper/src/__fixtures__/index.ts +47 -0
  837. package/packages/wrapper/src/auth-detection.ts +244 -0
  838. package/packages/wrapper/src/base-wrapper.test.ts +589 -0
  839. package/packages/wrapper/src/base-wrapper.ts +810 -0
  840. package/packages/wrapper/src/client.test.ts +262 -0
  841. package/packages/wrapper/src/client.ts +984 -0
  842. package/packages/wrapper/src/id-generator.test.ts +71 -0
  843. package/packages/wrapper/src/id-generator.ts +69 -0
  844. package/packages/wrapper/src/idle-detector.test.ts +418 -0
  845. package/packages/wrapper/src/idle-detector.ts +384 -0
  846. package/packages/wrapper/src/inbox.test.ts +233 -0
  847. package/packages/wrapper/src/inbox.ts +89 -0
  848. package/packages/wrapper/src/index.ts +170 -0
  849. package/packages/wrapper/src/parser.regression.test.ts +251 -0
  850. package/packages/wrapper/src/parser.test.ts +1359 -0
  851. package/packages/wrapper/src/parser.ts +1477 -0
  852. package/packages/wrapper/src/prompt-composer.test.ts +219 -0
  853. package/packages/wrapper/src/prompt-composer.ts +231 -0
  854. package/packages/wrapper/src/relay-pty-orchestrator.test.ts +1204 -0
  855. package/packages/wrapper/src/relay-pty-orchestrator.ts +2626 -0
  856. package/packages/wrapper/src/shared.test.ts +322 -0
  857. package/packages/wrapper/src/shared.ts +495 -0
  858. package/packages/wrapper/src/stuck-detector.test.ts +303 -0
  859. package/packages/wrapper/src/stuck-detector.ts +511 -0
  860. package/packages/wrapper/src/tmux-resolver.test.ts +104 -0
  861. package/packages/wrapper/src/tmux-resolver.ts +207 -0
  862. package/packages/wrapper/src/tmux-wrapper.test.ts +316 -0
  863. package/packages/wrapper/src/tmux-wrapper.ts +2095 -0
  864. package/packages/wrapper/src/trajectory-detection.test.ts +151 -0
  865. package/packages/wrapper/src/trajectory-integration.ts +1261 -0
  866. package/packages/wrapper/src/wrapper-types.ts +45 -0
  867. package/packages/wrapper/tsconfig.json +19 -0
  868. package/packages/wrapper/vitest.config.ts +9 -0
  869. package/scripts/build-cjs.mjs +23 -0
  870. package/scripts/postinstall.js +132 -0
  871. package/.cursor/mcp.json +0 -11
  872. package/.gitattributes +0 -3
  873. package/.gitleaks.toml +0 -26
  874. package/.mcp.json +0 -11
  875. package/.nvmrc +0 -1
  876. package/ARCHITECTURE.md +0 -1245
  877. package/CHANGELOG.md +0 -231
  878. package/TESTING.md +0 -278
  879. package/TRAIL_GIT_AUTH_FIX.md +0 -113
  880. package/scripts/demos/README.md +0 -79
  881. package/scripts/demos/server-capacity.sh +0 -69
  882. package/scripts/demos/sprint-planning.sh +0 -73
  883. package/scripts/hooks/install.sh +0 -16
  884. package/scripts/hooks/pre-commit +0 -60
  885. package/scripts/post-publish-verify/README.md +0 -80
  886. package/scripts/post-publish-verify/run-verify.sh +0 -127
  887. package/scripts/post-publish-verify/verify-install.sh +0 -249
  888. package/scripts/stress-test-orchestrator-integration.mts +0 -1366
  889. package/scripts/stress-test-orchestrator.mjs +0 -584
  890. package/scripts/stress-test-relay-pty.sh +0 -452
  891. package/scripts/test-interactive-terminal.sh +0 -248
  892. package/specs/PRIMITIVES_ROADMAP.md +0 -2154
  893. package/tests/benchmarks/protocol.bench.ts +0 -310
  894. package/turbo.json +0 -37
@@ -0,0 +1,1418 @@
1
+ /**
2
+ * RelayClient - Agent Relay SDK Client
3
+ * @agent-relay/sdk
4
+ *
5
+ * Lightweight client for agent-to-agent communication via Agent Relay daemon.
6
+ */
7
+
8
+ import net from 'node:net';
9
+ import { randomUUID } from 'node:crypto';
10
+ // Import shared protocol types and framing utilities from @agent-relay/protocol
11
+ import {
12
+ type Envelope,
13
+ type HelloPayload,
14
+ type WelcomePayload,
15
+ type SendPayload,
16
+ type SendMeta,
17
+ type SendEnvelope,
18
+ type DeliverEnvelope,
19
+ type AckPayload,
20
+ type ErrorPayload,
21
+ type PayloadKind,
22
+ type LogPayload,
23
+ type SpeakOnTrigger,
24
+ type EntityType,
25
+ type ChannelMessagePayload,
26
+ type ChannelJoinEnvelope,
27
+ type ChannelLeaveEnvelope,
28
+ type ChannelMessageEnvelope,
29
+ type MessageAttachment,
30
+ type SpawnPayload,
31
+ type SpawnResultPayload,
32
+ type ReleasePayload,
33
+ type ReleaseResultPayload,
34
+ type SpawnEnvelope,
35
+ type ReleaseEnvelope,
36
+ type StatusResponsePayload,
37
+ type InboxPayload,
38
+ type InboxMessage,
39
+ type InboxResponsePayload,
40
+ type MessagesQueryPayload,
41
+ type MessagesResponsePayload,
42
+ type ListAgentsPayload,
43
+ type AgentInfo,
44
+ type ListAgentsResponsePayload,
45
+ type ListConnectedAgentsPayload,
46
+ type ListConnectedAgentsResponsePayload,
47
+ type RemoveAgentPayload,
48
+ type RemoveAgentResponsePayload,
49
+ type HealthPayload,
50
+ type HealthResponsePayload,
51
+ type MetricsPayload,
52
+ type MetricsResponsePayload,
53
+ type CreateProposalOptions,
54
+ type VoteOptions,
55
+ PROTOCOL_VERSION,
56
+ encodeFrameLegacy,
57
+ FrameParser,
58
+ } from '@agent-relay/protocol';
59
+
60
+ export type ClientState = 'DISCONNECTED' | 'CONNECTING' | 'HANDSHAKING' | 'READY' | 'BACKOFF';
61
+
62
+ export interface SyncOptions {
63
+ timeoutMs?: number;
64
+ kind?: PayloadKind;
65
+ data?: Record<string, unknown>;
66
+ thread?: string;
67
+ }
68
+
69
+ export interface ClientConfig {
70
+ /** Daemon socket path (default: /tmp/agent-relay.sock) */
71
+ socketPath: string;
72
+ /** Agent name */
73
+ agentName: string;
74
+ /** Entity type: 'agent' (default) or 'user' */
75
+ entityType?: EntityType;
76
+ /** CLI identifier (claude, codex, gemini, etc.) */
77
+ cli?: string;
78
+ /** Program identifier */
79
+ program?: string;
80
+ /** Model identifier */
81
+ model?: string;
82
+ /** Task description */
83
+ task?: string;
84
+ /** Working directory */
85
+ workingDirectory?: string;
86
+ /** Display name for human users */
87
+ displayName?: string;
88
+ /** Avatar URL for human users */
89
+ avatarUrl?: string;
90
+ /** Suppress console logging */
91
+ quiet?: boolean;
92
+ /** Auto-reconnect on disconnect */
93
+ reconnect: boolean;
94
+ /** Max reconnect attempts */
95
+ maxReconnectAttempts: number;
96
+ /** Initial reconnect delay (ms) */
97
+ reconnectDelayMs: number;
98
+ /** Max reconnect delay (ms) */
99
+ reconnectMaxDelayMs: number;
100
+ }
101
+
102
+ const DEFAULT_SOCKET_PATH = '/tmp/agent-relay.sock';
103
+
104
+ const DEFAULT_CLIENT_CONFIG: ClientConfig = {
105
+ socketPath: DEFAULT_SOCKET_PATH,
106
+ agentName: 'agent',
107
+ cli: undefined,
108
+ quiet: false,
109
+ reconnect: true,
110
+ maxReconnectAttempts: 10,
111
+ reconnectDelayMs: 1000, // Increased from 100ms to prevent reconnect storms
112
+ reconnectMaxDelayMs: 30000,
113
+ };
114
+
115
+ // Simple ID generator
116
+ let idCounter = 0;
117
+ function generateId(): string {
118
+ return `${Date.now().toString(36)}-${(++idCounter).toString(36)}`;
119
+ }
120
+
121
+ /**
122
+ * Circular buffer for O(1) deduplication with bounded memory.
123
+ */
124
+ class CircularDedupeCache {
125
+ private ids: Set<string> = new Set();
126
+ private ring: string[];
127
+ private head = 0;
128
+ private readonly capacity: number;
129
+
130
+ constructor(capacity = 2000) {
131
+ this.capacity = capacity;
132
+ this.ring = new Array(capacity);
133
+ }
134
+
135
+ check(id: string): boolean {
136
+ if (this.ids.has(id)) return true;
137
+
138
+ if (this.ids.size >= this.capacity) {
139
+ const oldest = this.ring[this.head];
140
+ if (oldest) this.ids.delete(oldest);
141
+ }
142
+
143
+ this.ring[this.head] = id;
144
+ this.ids.add(id);
145
+ this.head = (this.head + 1) % this.capacity;
146
+
147
+ return false;
148
+ }
149
+
150
+ clear(): void {
151
+ this.ids.clear();
152
+ this.ring = new Array(this.capacity);
153
+ this.head = 0;
154
+ }
155
+ }
156
+
157
+ /**
158
+ * RelayClient for agent-to-agent communication.
159
+ */
160
+ export class RelayClient {
161
+ private config: ClientConfig;
162
+ private socket?: net.Socket;
163
+ private parser: FrameParser;
164
+
165
+ private _state: ClientState = 'DISCONNECTED';
166
+ private sessionId?: string;
167
+ private resumeToken?: string;
168
+ private reconnectAttempts = 0;
169
+ private reconnectDelay: number;
170
+ private reconnectTimer?: NodeJS.Timeout;
171
+ private _destroyed = false;
172
+
173
+ private dedupeCache = new CircularDedupeCache(2000);
174
+ private writeQueue: Buffer[] = [];
175
+ private writeScheduled = false;
176
+
177
+ private pendingSyncAcks: Map<string, {
178
+ resolve: (ack: AckPayload) => void;
179
+ reject: (err: Error) => void;
180
+ timeoutHandle: NodeJS.Timeout;
181
+ }> = new Map();
182
+
183
+ private pendingSpawns: Map<string, {
184
+ resolve: (result: SpawnResultPayload) => void;
185
+ reject: (err: Error) => void;
186
+ timeoutHandle: NodeJS.Timeout;
187
+ }> = new Map();
188
+
189
+ private pendingReleases: Map<string, {
190
+ resolve: (result: ReleaseResultPayload) => void;
191
+ reject: (err: Error) => void;
192
+ timeoutHandle: NodeJS.Timeout;
193
+ }> = new Map();
194
+
195
+ private pendingQueries: Map<string, {
196
+ resolve: (payload: unknown) => void;
197
+ reject: (err: Error) => void;
198
+ timeoutHandle: NodeJS.Timeout;
199
+ }> = new Map();
200
+
201
+ // Event handlers
202
+ onMessage?: (from: string, payload: SendPayload, messageId: string, meta?: SendMeta, originalTo?: string) => void;
203
+ /**
204
+ * Callback for channel messages.
205
+ */
206
+ onChannelMessage?: (from: string, channel: string, body: string, envelope: Envelope<ChannelMessagePayload>) => void;
207
+ onStateChange?: (state: ClientState) => void;
208
+ onError?: (error: Error) => void;
209
+
210
+ constructor(config: Partial<ClientConfig> = {}) {
211
+ this.config = { ...DEFAULT_CLIENT_CONFIG, ...config };
212
+ this.parser = new FrameParser();
213
+ this.parser.setLegacyMode(true);
214
+ this.reconnectDelay = this.config.reconnectDelayMs;
215
+ }
216
+
217
+ get state(): ClientState {
218
+ return this._state;
219
+ }
220
+
221
+ get agentName(): string {
222
+ return this.config.agentName;
223
+ }
224
+
225
+ get currentSessionId(): string | undefined {
226
+ return this.sessionId;
227
+ }
228
+
229
+ /**
230
+ * Connect to the relay daemon.
231
+ */
232
+ connect(): Promise<void> {
233
+ if (this._state !== 'DISCONNECTED' && this._state !== 'BACKOFF') {
234
+ return Promise.resolve();
235
+ }
236
+
237
+ return new Promise((resolve, reject) => {
238
+ let settled = false;
239
+ const settleResolve = (): void => {
240
+ if (settled) return;
241
+ settled = true;
242
+ resolve();
243
+ };
244
+ const settleReject = (err: Error): void => {
245
+ if (settled) return;
246
+ settled = true;
247
+ reject(err);
248
+ };
249
+
250
+ this.setState('CONNECTING');
251
+
252
+ this.socket = net.createConnection(this.config.socketPath, () => {
253
+ this.setState('HANDSHAKING');
254
+ this.sendHello();
255
+ });
256
+
257
+ this.socket.on('data', (data) => this.handleData(data));
258
+
259
+ this.socket.on('close', () => {
260
+ this.handleDisconnect();
261
+ });
262
+
263
+ this.socket.on('error', (err) => {
264
+ if (this._state === 'CONNECTING') {
265
+ settleReject(err);
266
+ }
267
+ this.handleError(err);
268
+ });
269
+
270
+ const checkReady = setInterval(() => {
271
+ if (this._state === 'READY') {
272
+ clearInterval(checkReady);
273
+ clearTimeout(timeout);
274
+ settleResolve();
275
+ }
276
+ }, 10);
277
+
278
+ const timeout = setTimeout(() => {
279
+ if (this._state !== 'READY') {
280
+ clearInterval(checkReady);
281
+ this.socket?.destroy();
282
+ settleReject(new Error('Connection timeout'));
283
+ }
284
+ }, 5000);
285
+ });
286
+ }
287
+
288
+ /**
289
+ * Disconnect from the relay daemon.
290
+ */
291
+ disconnect(): void {
292
+ if (this.reconnectTimer) {
293
+ clearTimeout(this.reconnectTimer);
294
+ this.reconnectTimer = undefined;
295
+ }
296
+
297
+ if (this.socket) {
298
+ this.send({
299
+ v: PROTOCOL_VERSION,
300
+ type: 'BYE',
301
+ id: generateId(),
302
+ ts: Date.now(),
303
+ payload: {},
304
+ });
305
+ this.socket.end();
306
+ this.socket = undefined;
307
+ }
308
+
309
+ this.setState('DISCONNECTED');
310
+ }
311
+
312
+ /**
313
+ * Permanently destroy the client.
314
+ */
315
+ destroy(): void {
316
+ this._destroyed = true;
317
+ this.disconnect();
318
+ }
319
+
320
+ /**
321
+ * Send a message to another agent.
322
+ */
323
+ sendMessage(
324
+ to: string,
325
+ body: string,
326
+ kind: PayloadKind = 'message',
327
+ data?: Record<string, unknown>,
328
+ thread?: string,
329
+ meta?: SendMeta
330
+ ): boolean {
331
+ if (this._state !== 'READY') {
332
+ return false;
333
+ }
334
+
335
+ const envelope: SendEnvelope = {
336
+ v: PROTOCOL_VERSION,
337
+ type: 'SEND',
338
+ id: generateId(),
339
+ ts: Date.now(),
340
+ to,
341
+ payload: {
342
+ kind,
343
+ body,
344
+ data,
345
+ thread,
346
+ },
347
+ payload_meta: meta,
348
+ };
349
+
350
+ return this.send(envelope);
351
+ }
352
+
353
+ /**
354
+ * Send an ACK for a delivered message.
355
+ */
356
+ sendAck(payload: AckPayload): boolean {
357
+ if (this._state !== 'READY') {
358
+ return false;
359
+ }
360
+
361
+ const envelope: Envelope<AckPayload> = {
362
+ v: PROTOCOL_VERSION,
363
+ type: 'ACK',
364
+ id: generateId(),
365
+ ts: Date.now(),
366
+ payload,
367
+ };
368
+
369
+ return this.send(envelope);
370
+ }
371
+
372
+ /**
373
+ * Send a message and wait for ACK response.
374
+ */
375
+ async sendAndWait(to: string, body: string, options: SyncOptions = {}): Promise<AckPayload> {
376
+ if (this._state !== 'READY') {
377
+ throw new Error('Client not ready');
378
+ }
379
+
380
+ const correlationId = randomUUID();
381
+ const timeoutMs = options.timeoutMs ?? 30000;
382
+ const kind = options.kind ?? 'message';
383
+
384
+ return new Promise<AckPayload>((resolve, reject) => {
385
+ const timeoutHandle = setTimeout(() => {
386
+ this.pendingSyncAcks.delete(correlationId);
387
+ reject(new Error(`ACK timeout after ${timeoutMs}ms`));
388
+ }, timeoutMs);
389
+
390
+ this.pendingSyncAcks.set(correlationId, { resolve, reject, timeoutHandle });
391
+
392
+ const envelope: SendEnvelope = {
393
+ v: PROTOCOL_VERSION,
394
+ type: 'SEND',
395
+ id: generateId(),
396
+ ts: Date.now(),
397
+ to,
398
+ payload: {
399
+ kind,
400
+ body,
401
+ data: options.data,
402
+ thread: options.thread,
403
+ },
404
+ payload_meta: {
405
+ sync: {
406
+ correlationId,
407
+ timeoutMs,
408
+ blocking: true,
409
+ },
410
+ },
411
+ };
412
+
413
+ const sent = this.send(envelope);
414
+ if (!sent) {
415
+ clearTimeout(timeoutHandle);
416
+ this.pendingSyncAcks.delete(correlationId);
417
+ reject(new Error('Failed to send message'));
418
+ }
419
+ });
420
+ }
421
+
422
+ /**
423
+ * Broadcast a message to all agents.
424
+ */
425
+ broadcast(body: string, kind: PayloadKind = 'message', data?: Record<string, unknown>): boolean {
426
+ return this.sendMessage('*', body, kind, data);
427
+ }
428
+
429
+ /**
430
+ * Subscribe to a topic.
431
+ */
432
+ subscribe(topic: string): boolean {
433
+ if (this._state !== 'READY') return false;
434
+
435
+ return this.send({
436
+ v: PROTOCOL_VERSION,
437
+ type: 'SUBSCRIBE',
438
+ id: generateId(),
439
+ ts: Date.now(),
440
+ topic,
441
+ payload: {},
442
+ });
443
+ }
444
+
445
+ /**
446
+ * Unsubscribe from a topic.
447
+ */
448
+ unsubscribe(topic: string): boolean {
449
+ if (this._state !== 'READY') return false;
450
+
451
+ return this.send({
452
+ v: PROTOCOL_VERSION,
453
+ type: 'UNSUBSCRIBE',
454
+ id: generateId(),
455
+ ts: Date.now(),
456
+ topic,
457
+ payload: {},
458
+ });
459
+ }
460
+
461
+ /**
462
+ * Bind as a shadow to a primary agent.
463
+ */
464
+ bindAsShadow(
465
+ primaryAgent: string,
466
+ options: {
467
+ speakOn?: SpeakOnTrigger[];
468
+ receiveIncoming?: boolean;
469
+ receiveOutgoing?: boolean;
470
+ } = {}
471
+ ): boolean {
472
+ if (this._state !== 'READY') return false;
473
+
474
+ return this.send({
475
+ v: PROTOCOL_VERSION,
476
+ type: 'SHADOW_BIND',
477
+ id: generateId(),
478
+ ts: Date.now(),
479
+ payload: {
480
+ primaryAgent,
481
+ speakOn: options.speakOn,
482
+ receiveIncoming: options.receiveIncoming,
483
+ receiveOutgoing: options.receiveOutgoing,
484
+ },
485
+ });
486
+ }
487
+
488
+ /**
489
+ * Unbind from a primary agent.
490
+ */
491
+ unbindAsShadow(primaryAgent: string): boolean {
492
+ if (this._state !== 'READY') return false;
493
+
494
+ return this.send({
495
+ v: PROTOCOL_VERSION,
496
+ type: 'SHADOW_UNBIND',
497
+ id: generateId(),
498
+ ts: Date.now(),
499
+ payload: {
500
+ primaryAgent,
501
+ },
502
+ });
503
+ }
504
+
505
+ /**
506
+ * Send log output to the daemon for dashboard streaming.
507
+ */
508
+ sendLog(data: string): boolean {
509
+ if (this._state !== 'READY') {
510
+ return false;
511
+ }
512
+
513
+ const envelope: Envelope<LogPayload> = {
514
+ v: PROTOCOL_VERSION,
515
+ type: 'LOG',
516
+ id: generateId(),
517
+ ts: Date.now(),
518
+ payload: {
519
+ data,
520
+ timestamp: Date.now(),
521
+ },
522
+ };
523
+
524
+ return this.send(envelope);
525
+ }
526
+
527
+ // =============================================================================
528
+ // Spawn/Release Operations
529
+ // =============================================================================
530
+
531
+ /**
532
+ * Spawn a new agent via the relay daemon.
533
+ * @param options - Spawn options
534
+ * @param options.name - Name for the new agent
535
+ * @param options.cli - CLI to use (claude, codex, gemini, etc.)
536
+ * @param options.task - Task description
537
+ * @param options.cwd - Working directory
538
+ * @param options.team - Team name
539
+ * @param options.interactive - Interactive mode
540
+ * @param options.shadowOf - Spawn as shadow of this agent
541
+ * @param options.shadowSpeakOn - Shadow speak-on triggers
542
+ * @param timeoutMs - Timeout for spawn operation (default: 30000ms)
543
+ */
544
+ async spawn(
545
+ options: {
546
+ name: string;
547
+ cli: string;
548
+ task?: string;
549
+ cwd?: string;
550
+ team?: string;
551
+ interactive?: boolean;
552
+ shadowOf?: string;
553
+ shadowSpeakOn?: SpeakOnTrigger[];
554
+ },
555
+ timeoutMs = 30000
556
+ ): Promise<SpawnResultPayload> {
557
+ if (this._state !== 'READY') {
558
+ throw new Error('Client not ready');
559
+ }
560
+
561
+ const envelopeId = generateId();
562
+
563
+ return new Promise<SpawnResultPayload>((resolve, reject) => {
564
+ const timeoutHandle = setTimeout(() => {
565
+ this.pendingSpawns.delete(envelopeId);
566
+ reject(new Error(`Spawn timeout after ${timeoutMs}ms`));
567
+ }, timeoutMs);
568
+
569
+ this.pendingSpawns.set(envelopeId, { resolve, reject, timeoutHandle });
570
+
571
+ const envelope: SpawnEnvelope = {
572
+ v: PROTOCOL_VERSION,
573
+ type: 'SPAWN',
574
+ id: envelopeId,
575
+ ts: Date.now(),
576
+ payload: {
577
+ name: options.name,
578
+ cli: options.cli,
579
+ task: options.task || '',
580
+ cwd: options.cwd,
581
+ team: options.team,
582
+ interactive: options.interactive,
583
+ shadowOf: options.shadowOf,
584
+ shadowSpeakOn: options.shadowSpeakOn,
585
+ spawnerName: this.config.agentName,
586
+ },
587
+ };
588
+
589
+ const sent = this.send(envelope);
590
+ if (!sent) {
591
+ clearTimeout(timeoutHandle);
592
+ this.pendingSpawns.delete(envelopeId);
593
+ reject(new Error('Failed to send spawn message'));
594
+ }
595
+ });
596
+ }
597
+
598
+ /**
599
+ * Release (terminate) an agent via the relay daemon.
600
+ * @param name - Agent name to release
601
+ * @param timeoutMs - Timeout for release operation (default: 10000ms)
602
+ */
603
+ async release(name: string, timeoutMs = 10000): Promise<ReleaseResultPayload> {
604
+ if (this._state !== 'READY') {
605
+ throw new Error('Client not ready');
606
+ }
607
+
608
+ const envelopeId = generateId();
609
+
610
+ return new Promise<ReleaseResultPayload>((resolve, reject) => {
611
+ const timeoutHandle = setTimeout(() => {
612
+ this.pendingReleases.delete(envelopeId);
613
+ reject(new Error(`Release timeout after ${timeoutMs}ms`));
614
+ }, timeoutMs);
615
+
616
+ this.pendingReleases.set(envelopeId, { resolve, reject, timeoutHandle });
617
+
618
+ const envelope: ReleaseEnvelope = {
619
+ v: PROTOCOL_VERSION,
620
+ type: 'RELEASE',
621
+ id: envelopeId,
622
+ ts: Date.now(),
623
+ payload: {
624
+ name,
625
+ },
626
+ };
627
+
628
+ const sent = this.send(envelope);
629
+ if (!sent) {
630
+ clearTimeout(timeoutHandle);
631
+ this.pendingReleases.delete(envelopeId);
632
+ reject(new Error('Failed to send release message'));
633
+ }
634
+ });
635
+ }
636
+
637
+ // =============================================================================
638
+ // Channel Operations
639
+ // =============================================================================
640
+
641
+ /**
642
+ * Join a channel.
643
+ * @param channel - Channel name (e.g., '#general', 'dm:alice:bob')
644
+ * @param displayName - Optional display name for this member
645
+ */
646
+ joinChannel(channel: string, displayName?: string): boolean {
647
+ if (this._state !== 'READY') {
648
+ return false;
649
+ }
650
+
651
+ const envelope: ChannelJoinEnvelope = {
652
+ v: PROTOCOL_VERSION,
653
+ type: 'CHANNEL_JOIN',
654
+ id: generateId(),
655
+ ts: Date.now(),
656
+ payload: {
657
+ channel,
658
+ displayName,
659
+ },
660
+ };
661
+
662
+ return this.send(envelope);
663
+ }
664
+
665
+ /**
666
+ * Admin join: Add any member to a channel (does not require member to be connected).
667
+ * @param channel - Channel name
668
+ * @param member - Name of the member to add
669
+ */
670
+ adminJoinChannel(channel: string, member: string): boolean {
671
+ if (this._state !== 'READY') {
672
+ return false;
673
+ }
674
+
675
+ const envelope: ChannelJoinEnvelope = {
676
+ v: PROTOCOL_VERSION,
677
+ type: 'CHANNEL_JOIN',
678
+ id: generateId(),
679
+ ts: Date.now(),
680
+ payload: {
681
+ channel,
682
+ member,
683
+ },
684
+ };
685
+
686
+ return this.send(envelope);
687
+ }
688
+
689
+ /**
690
+ * Leave a channel.
691
+ * @param channel - Channel name to leave
692
+ * @param reason - Optional reason for leaving
693
+ */
694
+ leaveChannel(channel: string, reason?: string): boolean {
695
+ if (this._state !== 'READY') return false;
696
+
697
+ const envelope: ChannelLeaveEnvelope = {
698
+ v: PROTOCOL_VERSION,
699
+ type: 'CHANNEL_LEAVE',
700
+ id: generateId(),
701
+ ts: Date.now(),
702
+ payload: {
703
+ channel,
704
+ reason,
705
+ },
706
+ };
707
+
708
+ return this.send(envelope);
709
+ }
710
+
711
+ /**
712
+ * Admin remove: Remove any member from a channel.
713
+ * @param channel - Channel name
714
+ * @param member - Name of the member to remove
715
+ */
716
+ adminRemoveMember(channel: string, member: string): boolean {
717
+ if (this._state !== 'READY') {
718
+ return false;
719
+ }
720
+
721
+ const envelope: ChannelLeaveEnvelope = {
722
+ v: PROTOCOL_VERSION,
723
+ type: 'CHANNEL_LEAVE',
724
+ id: generateId(),
725
+ ts: Date.now(),
726
+ payload: {
727
+ channel,
728
+ member,
729
+ },
730
+ };
731
+
732
+ return this.send(envelope);
733
+ }
734
+
735
+ /**
736
+ * Send a message to a channel.
737
+ * @param channel - Channel name
738
+ * @param body - Message content
739
+ * @param options - Optional thread, mentions, attachments
740
+ */
741
+ sendChannelMessage(
742
+ channel: string,
743
+ body: string,
744
+ options?: {
745
+ thread?: string;
746
+ mentions?: string[];
747
+ attachments?: MessageAttachment[];
748
+ data?: Record<string, unknown>;
749
+ }
750
+ ): boolean {
751
+ if (this._state !== 'READY') {
752
+ return false;
753
+ }
754
+
755
+ const envelope: ChannelMessageEnvelope = {
756
+ v: PROTOCOL_VERSION,
757
+ type: 'CHANNEL_MESSAGE',
758
+ id: generateId(),
759
+ ts: Date.now(),
760
+ payload: {
761
+ channel,
762
+ body,
763
+ thread: options?.thread,
764
+ mentions: options?.mentions,
765
+ attachments: options?.attachments,
766
+ data: options?.data,
767
+ },
768
+ };
769
+
770
+ return this.send(envelope);
771
+ }
772
+
773
+ // =============================================================================
774
+ // Consensus Operations
775
+ // =============================================================================
776
+
777
+ /**
778
+ * Create a consensus proposal.
779
+ *
780
+ * The proposal will be broadcast to all participants. They can vote using
781
+ * the `vote()` method. Results are delivered via `onMessage` callback.
782
+ *
783
+ * @example
784
+ * ```typescript
785
+ * client.createProposal({
786
+ * title: 'Approve API design',
787
+ * description: 'Should we proceed with the REST API design?',
788
+ * participants: ['Developer', 'Reviewer', 'Lead'],
789
+ * consensusType: 'majority',
790
+ * });
791
+ * ```
792
+ *
793
+ * @param options - Proposal options
794
+ * @returns true if the message was sent
795
+ */
796
+ createProposal(options: CreateProposalOptions): boolean {
797
+ if (this._state !== 'READY') {
798
+ return false;
799
+ }
800
+
801
+ // Build the PROPOSE command message
802
+ const lines: string[] = [
803
+ `PROPOSE: ${options.title}`,
804
+ `TYPE: ${options.consensusType ?? 'majority'}`,
805
+ `PARTICIPANTS: ${options.participants.join(', ')}`,
806
+ `DESCRIPTION: ${options.description}`,
807
+ ];
808
+
809
+ if (options.timeoutMs !== undefined) {
810
+ lines.push(`TIMEOUT: ${options.timeoutMs}`);
811
+ }
812
+ if (options.quorum !== undefined) {
813
+ lines.push(`QUORUM: ${options.quorum}`);
814
+ }
815
+ if (options.threshold !== undefined) {
816
+ lines.push(`THRESHOLD: ${options.threshold}`);
817
+ }
818
+
819
+ const body = lines.join('\n');
820
+
821
+ // Send to the special _consensus recipient
822
+ return this.sendMessage('_consensus', body, 'action');
823
+ }
824
+
825
+ /**
826
+ * Vote on a consensus proposal.
827
+ *
828
+ * @example
829
+ * ```typescript
830
+ * // Approve with a reason
831
+ * client.vote({
832
+ * proposalId: 'prop_123',
833
+ * value: 'approve',
834
+ * reason: 'Looks good to me',
835
+ * });
836
+ *
837
+ * // Reject without reason
838
+ * client.vote({ proposalId: 'prop_123', value: 'reject' });
839
+ * ```
840
+ *
841
+ * @param options - Vote options
842
+ * @returns true if the message was sent
843
+ */
844
+ vote(options: VoteOptions): boolean {
845
+ if (this._state !== 'READY') {
846
+ return false;
847
+ }
848
+
849
+ // Build the VOTE command
850
+ let body = `VOTE ${options.proposalId} ${options.value}`;
851
+ if (options.reason) {
852
+ body += ` ${options.reason}`;
853
+ }
854
+
855
+ // Send to the special _consensus recipient
856
+ return this.sendMessage('_consensus', body, 'action');
857
+ }
858
+
859
+ // =============================================================================
860
+ // Query Operations
861
+ // =============================================================================
862
+
863
+ /**
864
+ * Send a query to the daemon and wait for a response.
865
+ * @internal
866
+ */
867
+ private async query<T>(type: string, payload: unknown, timeoutMs = 5000): Promise<T> {
868
+ if (this._state !== 'READY') {
869
+ throw new Error('Client not ready');
870
+ }
871
+
872
+ const envelopeId = generateId();
873
+
874
+ return new Promise<T>((resolve, reject) => {
875
+ const timeoutHandle = setTimeout(() => {
876
+ this.pendingQueries.delete(envelopeId);
877
+ reject(new Error(`Query timeout after ${timeoutMs}ms`));
878
+ }, timeoutMs);
879
+
880
+ this.pendingQueries.set(envelopeId, {
881
+ resolve: resolve as (p: unknown) => void,
882
+ reject,
883
+ timeoutHandle,
884
+ });
885
+
886
+ const envelope: Envelope = {
887
+ v: PROTOCOL_VERSION,
888
+ type: type as Envelope['type'],
889
+ id: envelopeId,
890
+ ts: Date.now(),
891
+ payload,
892
+ };
893
+
894
+ const sent = this.send(envelope);
895
+ if (!sent) {
896
+ clearTimeout(timeoutHandle);
897
+ this.pendingQueries.delete(envelopeId);
898
+ reject(new Error(`Failed to send ${type} query`));
899
+ }
900
+ });
901
+ }
902
+
903
+ /**
904
+ * Get daemon status information.
905
+ * @returns Daemon status including version, uptime, and counts
906
+ */
907
+ async getStatus(): Promise<StatusResponsePayload> {
908
+ return this.query<StatusResponsePayload>('STATUS', {});
909
+ }
910
+
911
+ /**
912
+ * Get messages from the inbox.
913
+ * @param options - Filter options
914
+ * @param options.limit - Maximum number of messages to return
915
+ * @param options.unreadOnly - Only return unread messages
916
+ * @param options.from - Filter by sender
917
+ * @param options.channel - Filter by channel
918
+ * @returns Array of inbox messages
919
+ */
920
+ async getInbox(options: {
921
+ limit?: number;
922
+ unreadOnly?: boolean;
923
+ from?: string;
924
+ channel?: string;
925
+ } = {}): Promise<InboxMessage[]> {
926
+ const payload: InboxPayload = {
927
+ agent: this.config.agentName,
928
+ limit: options.limit,
929
+ unreadOnly: options.unreadOnly,
930
+ from: options.from,
931
+ channel: options.channel,
932
+ };
933
+ const response = await this.query<InboxResponsePayload>('INBOX', payload);
934
+ return response.messages || [];
935
+ }
936
+
937
+ /**
938
+ * Query all messages (not filtered by recipient).
939
+ * Used by dashboard to get message history.
940
+ * @param options - Query options
941
+ * @param options.limit - Maximum number of messages to return (default: 100)
942
+ * @param options.sinceTs - Only return messages after this timestamp
943
+ * @param options.from - Filter by sender
944
+ * @param options.to - Filter by recipient
945
+ * @param options.thread - Filter by thread ID
946
+ * @param options.order - Sort order ('asc' or 'desc', default: 'desc')
947
+ * @returns Array of messages
948
+ */
949
+ async queryMessages(options: {
950
+ limit?: number;
951
+ sinceTs?: number;
952
+ from?: string;
953
+ to?: string;
954
+ thread?: string;
955
+ order?: 'asc' | 'desc';
956
+ } = {}): Promise<MessagesResponsePayload['messages']> {
957
+ const payload: MessagesQueryPayload = {
958
+ limit: options.limit,
959
+ sinceTs: options.sinceTs,
960
+ from: options.from,
961
+ to: options.to,
962
+ thread: options.thread,
963
+ order: options.order,
964
+ };
965
+ const response = await this.query<MessagesResponsePayload>('MESSAGES_QUERY', payload);
966
+ return response.messages || [];
967
+ }
968
+
969
+ /**
970
+ * List online agents.
971
+ * @param options - Filter options
972
+ * @param options.includeIdle - Include idle agents (default: true)
973
+ * @param options.project - Filter by project
974
+ * @returns Array of agent info
975
+ */
976
+ async listAgents(options: {
977
+ includeIdle?: boolean;
978
+ project?: string;
979
+ } = {}): Promise<AgentInfo[]> {
980
+ const payload: ListAgentsPayload = {
981
+ includeIdle: options.includeIdle ?? true,
982
+ project: options.project,
983
+ };
984
+ const response = await this.query<ListAgentsResponsePayload>('LIST_AGENTS', payload);
985
+ return response.agents || [];
986
+ }
987
+
988
+ /**
989
+ * Get system health information.
990
+ * @param options - Include options
991
+ * @param options.includeCrashes - Include crash history (default: true)
992
+ * @param options.includeAlerts - Include alerts (default: true)
993
+ * @returns Health information including score, issues, and recommendations
994
+ */
995
+ async getHealth(options: {
996
+ includeCrashes?: boolean;
997
+ includeAlerts?: boolean;
998
+ } = {}): Promise<HealthResponsePayload> {
999
+ const payload: HealthPayload = {
1000
+ includeCrashes: options.includeCrashes ?? true,
1001
+ includeAlerts: options.includeAlerts ?? true,
1002
+ };
1003
+ return this.query<HealthResponsePayload>('HEALTH', payload);
1004
+ }
1005
+
1006
+ /**
1007
+ * Get resource metrics for agents.
1008
+ * @param options - Filter options
1009
+ * @param options.agent - Filter to a specific agent
1010
+ * @returns Metrics including memory, CPU, and system info
1011
+ */
1012
+ async getMetrics(options: {
1013
+ agent?: string;
1014
+ } = {}): Promise<MetricsResponsePayload> {
1015
+ const payload: MetricsPayload = {
1016
+ agent: options.agent,
1017
+ };
1018
+ return this.query<MetricsResponsePayload>('METRICS', payload);
1019
+ }
1020
+
1021
+ /**
1022
+ * List only currently connected agents (not historical/registered agents).
1023
+ * Use this instead of listAgents() when you need accurate liveness information.
1024
+ * @param options - Filter options
1025
+ * @param options.project - Filter by project
1026
+ * @returns Array of currently connected agent info
1027
+ */
1028
+ async listConnectedAgents(options: {
1029
+ project?: string;
1030
+ } = {}): Promise<AgentInfo[]> {
1031
+ const payload: ListConnectedAgentsPayload = {
1032
+ project: options.project,
1033
+ };
1034
+ const response = await this.query<ListConnectedAgentsResponsePayload>('LIST_CONNECTED_AGENTS', payload);
1035
+ return response.agents || [];
1036
+ }
1037
+
1038
+ /**
1039
+ * Remove an agent from the registry (sessions, agents.json).
1040
+ * Use this to clean up stale agents that are no longer needed.
1041
+ * @param name - Agent name to remove
1042
+ * @param options - Removal options
1043
+ * @param options.removeMessages - Also remove all messages from/to this agent (default: false)
1044
+ * @returns Result indicating if the agent was removed
1045
+ */
1046
+ async removeAgent(name: string, options: {
1047
+ removeMessages?: boolean;
1048
+ } = {}): Promise<RemoveAgentResponsePayload> {
1049
+ const payload: RemoveAgentPayload = {
1050
+ name,
1051
+ removeMessages: options.removeMessages,
1052
+ };
1053
+ return this.query<RemoveAgentResponsePayload>('REMOVE_AGENT', payload);
1054
+ }
1055
+
1056
+ // Private methods
1057
+
1058
+ private setState(state: ClientState): void {
1059
+ this._state = state;
1060
+ if (this.onStateChange) {
1061
+ this.onStateChange(state);
1062
+ }
1063
+ }
1064
+
1065
+ private sendHello(): void {
1066
+ const hello: Envelope<HelloPayload> = {
1067
+ v: PROTOCOL_VERSION,
1068
+ type: 'HELLO',
1069
+ id: generateId(),
1070
+ ts: Date.now(),
1071
+ payload: {
1072
+ agent: this.config.agentName,
1073
+ entityType: this.config.entityType,
1074
+ cli: this.config.cli,
1075
+ program: this.config.program,
1076
+ model: this.config.model,
1077
+ task: this.config.task,
1078
+ workingDirectory: this.config.workingDirectory,
1079
+ displayName: this.config.displayName,
1080
+ avatarUrl: this.config.avatarUrl,
1081
+ capabilities: {
1082
+ ack: true,
1083
+ resume: true,
1084
+ max_inflight: 256,
1085
+ supports_topics: true,
1086
+ },
1087
+ session: this.resumeToken ? { resume_token: this.resumeToken } : undefined,
1088
+ },
1089
+ };
1090
+
1091
+ this.send(hello);
1092
+ }
1093
+
1094
+ private send(envelope: Envelope): boolean {
1095
+ if (!this.socket) return false;
1096
+
1097
+ try {
1098
+ const frame = encodeFrameLegacy(envelope);
1099
+ this.writeQueue.push(frame);
1100
+
1101
+ if (!this.writeScheduled) {
1102
+ this.writeScheduled = true;
1103
+ setImmediate(() => this.flushWrites());
1104
+ }
1105
+ return true;
1106
+ } catch (err) {
1107
+ this.handleError(err as Error);
1108
+ return false;
1109
+ }
1110
+ }
1111
+
1112
+ private flushWrites(): void {
1113
+ this.writeScheduled = false;
1114
+ if (this.writeQueue.length === 0 || !this.socket) return;
1115
+
1116
+ if (this.writeQueue.length === 1) {
1117
+ this.socket.write(this.writeQueue[0]);
1118
+ } else {
1119
+ this.socket.write(Buffer.concat(this.writeQueue));
1120
+ }
1121
+ this.writeQueue = [];
1122
+ }
1123
+
1124
+ private handleData(data: Buffer): void {
1125
+ try {
1126
+ const frames = this.parser.push(data);
1127
+ for (const frame of frames) {
1128
+ this.processFrame(frame);
1129
+ }
1130
+ } catch (err) {
1131
+ this.handleError(err as Error);
1132
+ }
1133
+ }
1134
+
1135
+ private processFrame(envelope: Envelope): void {
1136
+ switch (envelope.type) {
1137
+ case 'WELCOME':
1138
+ this.handleWelcome(envelope as Envelope<WelcomePayload>);
1139
+ break;
1140
+
1141
+ case 'DELIVER':
1142
+ this.handleDeliver(envelope as DeliverEnvelope);
1143
+ break;
1144
+
1145
+ case 'CHANNEL_MESSAGE':
1146
+ this.handleChannelMessage(envelope as Envelope<ChannelMessagePayload> & { from?: string });
1147
+ break;
1148
+
1149
+ case 'PING':
1150
+ this.handlePing(envelope);
1151
+ break;
1152
+
1153
+ case 'ACK':
1154
+ this.handleAck(envelope as Envelope<AckPayload>);
1155
+ break;
1156
+
1157
+ case 'SPAWN_RESULT':
1158
+ this.handleSpawnResult(envelope as Envelope<SpawnResultPayload>);
1159
+ break;
1160
+
1161
+ case 'RELEASE_RESULT':
1162
+ this.handleReleaseResult(envelope as Envelope<ReleaseResultPayload>);
1163
+ break;
1164
+
1165
+ case 'ERROR':
1166
+ this.handleErrorFrame(envelope as Envelope<ErrorPayload>);
1167
+ break;
1168
+
1169
+ case 'BUSY':
1170
+ if (!this.config.quiet) {
1171
+ console.warn('[sdk] Server busy, backing off');
1172
+ }
1173
+ break;
1174
+
1175
+ case 'STATUS_RESPONSE':
1176
+ case 'INBOX_RESPONSE':
1177
+ case 'MESSAGES_RESPONSE':
1178
+ case 'LIST_AGENTS_RESPONSE':
1179
+ case 'LIST_CONNECTED_AGENTS_RESPONSE':
1180
+ case 'REMOVE_AGENT_RESPONSE':
1181
+ case 'HEALTH_RESPONSE':
1182
+ case 'METRICS_RESPONSE':
1183
+ this.handleQueryResponse(envelope);
1184
+ break;
1185
+ }
1186
+ }
1187
+
1188
+ private handleWelcome(envelope: Envelope<WelcomePayload>): void {
1189
+ this.sessionId = envelope.payload.session_id;
1190
+ this.resumeToken = envelope.payload.resume_token;
1191
+ this.reconnectAttempts = 0;
1192
+ this.reconnectDelay = this.config.reconnectDelayMs;
1193
+ this.setState('READY');
1194
+ if (!this.config.quiet) {
1195
+ console.log(`[sdk] Connected as ${this.config.agentName} (session: ${this.sessionId})`);
1196
+ }
1197
+ }
1198
+
1199
+ private handleDeliver(envelope: DeliverEnvelope): void {
1200
+ // Send ACK
1201
+ this.send({
1202
+ v: PROTOCOL_VERSION,
1203
+ type: 'ACK',
1204
+ id: generateId(),
1205
+ ts: Date.now(),
1206
+ payload: {
1207
+ ack_id: envelope.id,
1208
+ seq: envelope.delivery.seq,
1209
+ },
1210
+ });
1211
+
1212
+ const duplicate = this.dedupeCache.check(envelope.id);
1213
+ if (duplicate) {
1214
+ return;
1215
+ }
1216
+
1217
+ if (this.onMessage && envelope.from) {
1218
+ this.onMessage(
1219
+ envelope.from,
1220
+ envelope.payload,
1221
+ envelope.id,
1222
+ envelope.payload_meta,
1223
+ envelope.delivery.originalTo
1224
+ );
1225
+ }
1226
+ }
1227
+
1228
+ private handleChannelMessage(envelope: Envelope<ChannelMessagePayload> & { from?: string }): void {
1229
+ const duplicate = this.dedupeCache.check(envelope.id);
1230
+ if (duplicate) {
1231
+ return;
1232
+ }
1233
+
1234
+ // Notify channel message handler
1235
+ if (this.onChannelMessage && envelope.from) {
1236
+ this.onChannelMessage(
1237
+ envelope.from,
1238
+ envelope.payload.channel,
1239
+ envelope.payload.body,
1240
+ envelope as Envelope<ChannelMessagePayload>
1241
+ );
1242
+ }
1243
+
1244
+ // Also call onMessage for backwards compatibility
1245
+ if (this.onMessage && envelope.from) {
1246
+ const sendPayload: SendPayload = {
1247
+ kind: 'message',
1248
+ body: envelope.payload.body,
1249
+ data: {
1250
+ _isChannelMessage: true,
1251
+ _channel: envelope.payload.channel,
1252
+ _mentions: envelope.payload.mentions,
1253
+ },
1254
+ thread: envelope.payload.thread,
1255
+ };
1256
+ this.onMessage(envelope.from, sendPayload, envelope.id, undefined, envelope.payload.channel);
1257
+ }
1258
+ }
1259
+
1260
+ private handleAck(envelope: Envelope<AckPayload>): void {
1261
+ const correlationId = envelope.payload.correlationId;
1262
+ if (!correlationId) return;
1263
+
1264
+ const pending = this.pendingSyncAcks.get(correlationId);
1265
+ if (!pending) return;
1266
+
1267
+ clearTimeout(pending.timeoutHandle);
1268
+ this.pendingSyncAcks.delete(correlationId);
1269
+ pending.resolve(envelope.payload);
1270
+ }
1271
+
1272
+ private handleSpawnResult(envelope: Envelope<SpawnResultPayload>): void {
1273
+ const replyTo = envelope.payload.replyTo;
1274
+ if (!replyTo) return;
1275
+
1276
+ const pending = this.pendingSpawns.get(replyTo);
1277
+ if (!pending) return;
1278
+
1279
+ clearTimeout(pending.timeoutHandle);
1280
+ this.pendingSpawns.delete(replyTo);
1281
+ pending.resolve(envelope.payload);
1282
+ }
1283
+
1284
+ private handleReleaseResult(envelope: Envelope<ReleaseResultPayload>): void {
1285
+ const replyTo = envelope.payload.replyTo;
1286
+ if (!replyTo) return;
1287
+
1288
+ const pending = this.pendingReleases.get(replyTo);
1289
+ if (!pending) return;
1290
+
1291
+ clearTimeout(pending.timeoutHandle);
1292
+ this.pendingReleases.delete(replyTo);
1293
+ pending.resolve(envelope.payload);
1294
+ }
1295
+
1296
+ private handleQueryResponse(envelope: Envelope): void {
1297
+ // Query responses use the envelope id to match requests
1298
+ const pending = this.pendingQueries.get(envelope.id);
1299
+ if (!pending) return;
1300
+
1301
+ clearTimeout(pending.timeoutHandle);
1302
+ this.pendingQueries.delete(envelope.id);
1303
+ pending.resolve(envelope.payload);
1304
+ }
1305
+
1306
+ private handlePing(envelope: Envelope): void {
1307
+ this.send({
1308
+ v: PROTOCOL_VERSION,
1309
+ type: 'PONG',
1310
+ id: generateId(),
1311
+ ts: Date.now(),
1312
+ payload: (envelope.payload as { nonce?: string }) ?? {},
1313
+ });
1314
+ }
1315
+
1316
+ private handleErrorFrame(envelope: Envelope<ErrorPayload>): void {
1317
+ if (!this.config.quiet) {
1318
+ console.error('[sdk] Server error:', envelope.payload);
1319
+ }
1320
+
1321
+ if (envelope.payload.code === 'RESUME_TOO_OLD') {
1322
+ this.resumeToken = undefined;
1323
+ this.sessionId = undefined;
1324
+ }
1325
+
1326
+ // Fatal errors (like DUPLICATE_CONNECTION) should prevent reconnection
1327
+ if (envelope.payload.fatal) {
1328
+ if (!this.config.quiet) {
1329
+ console.error('[sdk] Fatal error received, will not reconnect:', envelope.payload.message);
1330
+ }
1331
+ this._destroyed = true;
1332
+ }
1333
+ }
1334
+
1335
+ private handleDisconnect(): void {
1336
+ this.parser.reset();
1337
+ this.socket = undefined;
1338
+ this.rejectPendingSyncAcks(new Error('Disconnected while awaiting ACK'));
1339
+ this.rejectPendingSpawns(new Error('Disconnected while awaiting spawn result'));
1340
+ this.rejectPendingReleases(new Error('Disconnected while awaiting release result'));
1341
+ this.rejectPendingQueries(new Error('Disconnected while awaiting query response'));
1342
+
1343
+ if (this._destroyed) {
1344
+ this.setState('DISCONNECTED');
1345
+ return;
1346
+ }
1347
+
1348
+ if (this.config.reconnect && this.reconnectAttempts < this.config.maxReconnectAttempts) {
1349
+ this.scheduleReconnect();
1350
+ } else {
1351
+ this.setState('DISCONNECTED');
1352
+ if (this.reconnectAttempts >= this.config.maxReconnectAttempts && !this.config.quiet) {
1353
+ console.error(
1354
+ `[sdk] Max reconnect attempts reached (${this.config.maxReconnectAttempts}), giving up`
1355
+ );
1356
+ }
1357
+ }
1358
+ }
1359
+
1360
+ private handleError(error: Error): void {
1361
+ if (!this.config.quiet) {
1362
+ console.error('[sdk] Error:', error.message);
1363
+ }
1364
+ if (this.onError) {
1365
+ this.onError(error);
1366
+ }
1367
+ }
1368
+
1369
+ private rejectPendingSyncAcks(error: Error): void {
1370
+ for (const [correlationId, pending] of this.pendingSyncAcks.entries()) {
1371
+ clearTimeout(pending.timeoutHandle);
1372
+ pending.reject(error);
1373
+ this.pendingSyncAcks.delete(correlationId);
1374
+ }
1375
+ }
1376
+
1377
+ private rejectPendingSpawns(error: Error): void {
1378
+ for (const [id, pending] of this.pendingSpawns.entries()) {
1379
+ clearTimeout(pending.timeoutHandle);
1380
+ pending.reject(error);
1381
+ this.pendingSpawns.delete(id);
1382
+ }
1383
+ }
1384
+
1385
+ private rejectPendingReleases(error: Error): void {
1386
+ for (const [id, pending] of this.pendingReleases.entries()) {
1387
+ clearTimeout(pending.timeoutHandle);
1388
+ pending.reject(error);
1389
+ this.pendingReleases.delete(id);
1390
+ }
1391
+ }
1392
+
1393
+ private rejectPendingQueries(error: Error): void {
1394
+ for (const [id, pending] of this.pendingQueries.entries()) {
1395
+ clearTimeout(pending.timeoutHandle);
1396
+ pending.reject(error);
1397
+ this.pendingQueries.delete(id);
1398
+ }
1399
+ }
1400
+
1401
+ private scheduleReconnect(): void {
1402
+ this.setState('BACKOFF');
1403
+ this.reconnectAttempts++;
1404
+
1405
+ const jitter = Math.random() * 0.3 + 0.85;
1406
+ const delay = Math.min(this.reconnectDelay * jitter, this.config.reconnectMaxDelayMs);
1407
+ this.reconnectDelay *= 2;
1408
+
1409
+ if (!this.config.quiet) {
1410
+ console.log(`[sdk] Reconnecting in ${Math.round(delay)}ms (attempt ${this.reconnectAttempts})`);
1411
+ }
1412
+
1413
+ this.reconnectTimer = setTimeout(() => {
1414
+ this.connect().catch(() => {});
1415
+ }, delay);
1416
+ }
1417
+ }
1418
+