agent-relay 1.0.22 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (613) hide show
  1. package/README.md +1 -1
  2. package/dist/bridge/shadow-cli.d.ts +17 -0
  3. package/dist/bridge/shadow-cli.d.ts.map +1 -0
  4. package/dist/bridge/shadow-cli.js +75 -0
  5. package/dist/bridge/shadow-cli.js.map +1 -0
  6. package/dist/bridge/shadow-config.d.ts +87 -0
  7. package/dist/bridge/shadow-config.d.ts.map +1 -0
  8. package/dist/bridge/shadow-config.js +134 -0
  9. package/dist/bridge/shadow-config.js.map +1 -0
  10. package/dist/bridge/spawner.d.ts +68 -1
  11. package/dist/bridge/spawner.d.ts.map +1 -1
  12. package/dist/bridge/spawner.js +360 -16
  13. package/dist/bridge/spawner.js.map +1 -1
  14. package/dist/bridge/types.d.ts +67 -0
  15. package/dist/bridge/types.d.ts.map +1 -1
  16. package/dist/cli/index.js +1196 -15
  17. package/dist/cli/index.js.map +1 -1
  18. package/dist/cloud/api/auth.d.ts +20 -0
  19. package/dist/cloud/api/auth.d.ts.map +1 -0
  20. package/dist/cloud/api/auth.js +128 -0
  21. package/dist/cloud/api/auth.js.map +1 -0
  22. package/dist/cloud/api/billing.d.ts +17 -0
  23. package/dist/cloud/api/billing.d.ts.map +1 -0
  24. package/dist/cloud/api/billing.js +353 -0
  25. package/dist/cloud/api/billing.js.map +1 -0
  26. package/dist/cloud/api/cli-pty-runner.d.ts +54 -0
  27. package/dist/cloud/api/cli-pty-runner.d.ts.map +1 -0
  28. package/dist/cloud/api/cli-pty-runner.js +119 -0
  29. package/dist/cloud/api/cli-pty-runner.js.map +1 -0
  30. package/dist/cloud/api/coordinators.d.ts +8 -0
  31. package/dist/cloud/api/coordinators.d.ts.map +1 -0
  32. package/dist/cloud/api/coordinators.js +347 -0
  33. package/dist/cloud/api/coordinators.js.map +1 -0
  34. package/dist/cloud/api/daemons.d.ts +12 -0
  35. package/dist/cloud/api/daemons.d.ts.map +1 -0
  36. package/dist/cloud/api/daemons.js +320 -0
  37. package/dist/cloud/api/daemons.js.map +1 -0
  38. package/dist/cloud/api/generic-webhooks.d.ts +8 -0
  39. package/dist/cloud/api/generic-webhooks.d.ts.map +1 -0
  40. package/dist/cloud/api/generic-webhooks.js +129 -0
  41. package/dist/cloud/api/generic-webhooks.js.map +1 -0
  42. package/dist/cloud/api/git.d.ts +8 -0
  43. package/dist/cloud/api/git.d.ts.map +1 -0
  44. package/dist/cloud/api/git.js +131 -0
  45. package/dist/cloud/api/git.js.map +1 -0
  46. package/dist/cloud/api/github-app.d.ts +11 -0
  47. package/dist/cloud/api/github-app.d.ts.map +1 -0
  48. package/dist/cloud/api/github-app.js +189 -0
  49. package/dist/cloud/api/github-app.js.map +1 -0
  50. package/dist/cloud/api/middleware/planLimits.d.ts +43 -0
  51. package/dist/cloud/api/middleware/planLimits.d.ts.map +1 -0
  52. package/dist/cloud/api/middleware/planLimits.js +202 -0
  53. package/dist/cloud/api/middleware/planLimits.js.map +1 -0
  54. package/dist/cloud/api/monitoring.d.ts +11 -0
  55. package/dist/cloud/api/monitoring.d.ts.map +1 -0
  56. package/dist/cloud/api/monitoring.js +578 -0
  57. package/dist/cloud/api/monitoring.js.map +1 -0
  58. package/dist/cloud/api/nango-auth.d.ts +9 -0
  59. package/dist/cloud/api/nango-auth.d.ts.map +1 -0
  60. package/dist/cloud/api/nango-auth.js +377 -0
  61. package/dist/cloud/api/nango-auth.js.map +1 -0
  62. package/dist/cloud/api/onboarding.d.ts +15 -0
  63. package/dist/cloud/api/onboarding.d.ts.map +1 -0
  64. package/dist/cloud/api/onboarding.js +588 -0
  65. package/dist/cloud/api/onboarding.js.map +1 -0
  66. package/dist/cloud/api/policy.d.ts +8 -0
  67. package/dist/cloud/api/policy.d.ts.map +1 -0
  68. package/dist/cloud/api/policy.js +229 -0
  69. package/dist/cloud/api/policy.js.map +1 -0
  70. package/dist/cloud/api/providers.d.ts +7 -0
  71. package/dist/cloud/api/providers.d.ts.map +1 -0
  72. package/dist/cloud/api/providers.js +507 -0
  73. package/dist/cloud/api/providers.js.map +1 -0
  74. package/dist/cloud/api/repos.d.ts +7 -0
  75. package/dist/cloud/api/repos.d.ts.map +1 -0
  76. package/dist/cloud/api/repos.js +314 -0
  77. package/dist/cloud/api/repos.js.map +1 -0
  78. package/dist/cloud/api/teams.d.ts +7 -0
  79. package/dist/cloud/api/teams.d.ts.map +1 -0
  80. package/dist/cloud/api/teams.js +279 -0
  81. package/dist/cloud/api/teams.js.map +1 -0
  82. package/dist/cloud/api/test-helpers.d.ts +10 -0
  83. package/dist/cloud/api/test-helpers.d.ts.map +1 -0
  84. package/dist/cloud/api/test-helpers.js +575 -0
  85. package/dist/cloud/api/test-helpers.js.map +1 -0
  86. package/dist/cloud/api/usage.d.ts +7 -0
  87. package/dist/cloud/api/usage.d.ts.map +1 -0
  88. package/dist/cloud/api/usage.js +98 -0
  89. package/dist/cloud/api/usage.js.map +1 -0
  90. package/dist/cloud/api/webhooks.d.ts +7 -0
  91. package/dist/cloud/api/webhooks.d.ts.map +1 -0
  92. package/dist/cloud/api/webhooks.js +496 -0
  93. package/dist/cloud/api/webhooks.js.map +1 -0
  94. package/dist/cloud/api/workspaces.d.ts +7 -0
  95. package/dist/cloud/api/workspaces.d.ts.map +1 -0
  96. package/dist/cloud/api/workspaces.js +727 -0
  97. package/dist/cloud/api/workspaces.js.map +1 -0
  98. package/dist/cloud/billing/index.d.ts +9 -0
  99. package/dist/cloud/billing/index.d.ts.map +1 -0
  100. package/dist/cloud/billing/index.js +9 -0
  101. package/dist/cloud/billing/index.js.map +1 -0
  102. package/dist/cloud/billing/plans.d.ts +39 -0
  103. package/dist/cloud/billing/plans.d.ts.map +1 -0
  104. package/dist/cloud/billing/plans.js +245 -0
  105. package/dist/cloud/billing/plans.js.map +1 -0
  106. package/dist/cloud/billing/service.d.ts +80 -0
  107. package/dist/cloud/billing/service.d.ts.map +1 -0
  108. package/dist/cloud/billing/service.js +388 -0
  109. package/dist/cloud/billing/service.js.map +1 -0
  110. package/dist/cloud/billing/types.d.ts +141 -0
  111. package/dist/cloud/billing/types.d.ts.map +1 -0
  112. package/dist/cloud/billing/types.js +7 -0
  113. package/dist/cloud/billing/types.js.map +1 -0
  114. package/dist/cloud/config.d.ts +66 -0
  115. package/dist/cloud/config.d.ts.map +1 -0
  116. package/dist/cloud/config.js +92 -0
  117. package/dist/cloud/config.js.map +1 -0
  118. package/dist/cloud/db/drizzle.d.ts +215 -0
  119. package/dist/cloud/db/drizzle.d.ts.map +1 -0
  120. package/dist/cloud/db/drizzle.js +1083 -0
  121. package/dist/cloud/db/drizzle.js.map +1 -0
  122. package/dist/cloud/db/index.d.ts +35 -0
  123. package/dist/cloud/db/index.d.ts.map +1 -0
  124. package/dist/cloud/db/index.js +52 -0
  125. package/dist/cloud/db/index.js.map +1 -0
  126. package/dist/cloud/db/schema.d.ts +4519 -0
  127. package/dist/cloud/db/schema.d.ts.map +1 -0
  128. package/dist/cloud/db/schema.js +547 -0
  129. package/dist/cloud/db/schema.js.map +1 -0
  130. package/dist/cloud/index.d.ts +12 -0
  131. package/dist/cloud/index.d.ts.map +1 -0
  132. package/dist/cloud/index.js +39 -0
  133. package/dist/cloud/index.js.map +1 -0
  134. package/dist/cloud/provisioner/index.d.ts +75 -0
  135. package/dist/cloud/provisioner/index.d.ts.map +1 -0
  136. package/dist/cloud/provisioner/index.js +977 -0
  137. package/dist/cloud/provisioner/index.js.map +1 -0
  138. package/dist/cloud/server.d.ts +17 -0
  139. package/dist/cloud/server.d.ts.map +1 -0
  140. package/dist/cloud/server.js +534 -0
  141. package/dist/cloud/server.js.map +1 -0
  142. package/dist/cloud/services/auto-scaler.d.ts +152 -0
  143. package/dist/cloud/services/auto-scaler.d.ts.map +1 -0
  144. package/dist/cloud/services/auto-scaler.js +439 -0
  145. package/dist/cloud/services/auto-scaler.js.map +1 -0
  146. package/dist/cloud/services/capacity-manager.d.ts +148 -0
  147. package/dist/cloud/services/capacity-manager.d.ts.map +1 -0
  148. package/dist/cloud/services/capacity-manager.js +449 -0
  149. package/dist/cloud/services/capacity-manager.js.map +1 -0
  150. package/dist/cloud/services/ci-agent-spawner.d.ts +49 -0
  151. package/dist/cloud/services/ci-agent-spawner.d.ts.map +1 -0
  152. package/dist/cloud/services/ci-agent-spawner.js +373 -0
  153. package/dist/cloud/services/ci-agent-spawner.js.map +1 -0
  154. package/dist/cloud/services/coordinator.d.ts +62 -0
  155. package/dist/cloud/services/coordinator.d.ts.map +1 -0
  156. package/dist/cloud/services/coordinator.js +389 -0
  157. package/dist/cloud/services/coordinator.js.map +1 -0
  158. package/dist/cloud/services/index.d.ts +12 -0
  159. package/dist/cloud/services/index.d.ts.map +1 -0
  160. package/dist/cloud/services/index.js +15 -0
  161. package/dist/cloud/services/index.js.map +1 -0
  162. package/dist/cloud/services/mention-handler.d.ts +65 -0
  163. package/dist/cloud/services/mention-handler.d.ts.map +1 -0
  164. package/dist/cloud/services/mention-handler.js +405 -0
  165. package/dist/cloud/services/mention-handler.js.map +1 -0
  166. package/dist/cloud/services/nango.d.ts +126 -0
  167. package/dist/cloud/services/nango.d.ts.map +1 -0
  168. package/dist/cloud/services/nango.js +191 -0
  169. package/dist/cloud/services/nango.js.map +1 -0
  170. package/dist/cloud/services/persistence.d.ts +131 -0
  171. package/dist/cloud/services/persistence.d.ts.map +1 -0
  172. package/dist/cloud/services/persistence.js +200 -0
  173. package/dist/cloud/services/persistence.js.map +1 -0
  174. package/dist/cloud/services/planLimits.d.ts +125 -0
  175. package/dist/cloud/services/planLimits.d.ts.map +1 -0
  176. package/dist/cloud/services/planLimits.js +282 -0
  177. package/dist/cloud/services/planLimits.js.map +1 -0
  178. package/dist/cloud/services/scaling-orchestrator.d.ts +159 -0
  179. package/dist/cloud/services/scaling-orchestrator.d.ts.map +1 -0
  180. package/dist/cloud/services/scaling-orchestrator.js +502 -0
  181. package/dist/cloud/services/scaling-orchestrator.js.map +1 -0
  182. package/dist/cloud/services/scaling-policy.d.ts +121 -0
  183. package/dist/cloud/services/scaling-policy.d.ts.map +1 -0
  184. package/dist/cloud/services/scaling-policy.js +415 -0
  185. package/dist/cloud/services/scaling-policy.js.map +1 -0
  186. package/dist/cloud/vault/index.d.ts +76 -0
  187. package/dist/cloud/vault/index.d.ts.map +1 -0
  188. package/dist/cloud/vault/index.js +219 -0
  189. package/dist/cloud/vault/index.js.map +1 -0
  190. package/dist/cloud/webhooks/index.d.ts +24 -0
  191. package/dist/cloud/webhooks/index.d.ts.map +1 -0
  192. package/dist/cloud/webhooks/index.js +29 -0
  193. package/dist/cloud/webhooks/index.js.map +1 -0
  194. package/dist/cloud/webhooks/parsers/github.d.ts +8 -0
  195. package/dist/cloud/webhooks/parsers/github.d.ts.map +1 -0
  196. package/dist/cloud/webhooks/parsers/github.js +234 -0
  197. package/dist/cloud/webhooks/parsers/github.js.map +1 -0
  198. package/dist/cloud/webhooks/parsers/index.d.ts +23 -0
  199. package/dist/cloud/webhooks/parsers/index.d.ts.map +1 -0
  200. package/dist/cloud/webhooks/parsers/index.js +30 -0
  201. package/dist/cloud/webhooks/parsers/index.js.map +1 -0
  202. package/dist/cloud/webhooks/parsers/linear.d.ts +9 -0
  203. package/dist/cloud/webhooks/parsers/linear.d.ts.map +1 -0
  204. package/dist/cloud/webhooks/parsers/linear.js +258 -0
  205. package/dist/cloud/webhooks/parsers/linear.js.map +1 -0
  206. package/dist/cloud/webhooks/parsers/slack.d.ts +9 -0
  207. package/dist/cloud/webhooks/parsers/slack.d.ts.map +1 -0
  208. package/dist/cloud/webhooks/parsers/slack.js +214 -0
  209. package/dist/cloud/webhooks/parsers/slack.js.map +1 -0
  210. package/dist/cloud/webhooks/responders/github.d.ts +8 -0
  211. package/dist/cloud/webhooks/responders/github.d.ts.map +1 -0
  212. package/dist/cloud/webhooks/responders/github.js +73 -0
  213. package/dist/cloud/webhooks/responders/github.js.map +1 -0
  214. package/dist/cloud/webhooks/responders/index.d.ts +23 -0
  215. package/dist/cloud/webhooks/responders/index.d.ts.map +1 -0
  216. package/dist/cloud/webhooks/responders/index.js +30 -0
  217. package/dist/cloud/webhooks/responders/index.js.map +1 -0
  218. package/dist/cloud/webhooks/responders/linear.d.ts +9 -0
  219. package/dist/cloud/webhooks/responders/linear.d.ts.map +1 -0
  220. package/dist/cloud/webhooks/responders/linear.js +149 -0
  221. package/dist/cloud/webhooks/responders/linear.js.map +1 -0
  222. package/dist/cloud/webhooks/responders/slack.d.ts +20 -0
  223. package/dist/cloud/webhooks/responders/slack.d.ts.map +1 -0
  224. package/dist/cloud/webhooks/responders/slack.js +178 -0
  225. package/dist/cloud/webhooks/responders/slack.js.map +1 -0
  226. package/dist/cloud/webhooks/router.d.ts +25 -0
  227. package/dist/cloud/webhooks/router.d.ts.map +1 -0
  228. package/dist/cloud/webhooks/router.js +504 -0
  229. package/dist/cloud/webhooks/router.js.map +1 -0
  230. package/dist/cloud/webhooks/rules-engine.d.ts +24 -0
  231. package/dist/cloud/webhooks/rules-engine.d.ts.map +1 -0
  232. package/dist/cloud/webhooks/rules-engine.js +287 -0
  233. package/dist/cloud/webhooks/rules-engine.js.map +1 -0
  234. package/dist/cloud/webhooks/types.d.ts +186 -0
  235. package/dist/cloud/webhooks/types.d.ts.map +1 -0
  236. package/dist/cloud/webhooks/types.js +8 -0
  237. package/dist/cloud/webhooks/types.js.map +1 -0
  238. package/dist/continuity/formatter.d.ts +51 -0
  239. package/dist/continuity/formatter.d.ts.map +1 -0
  240. package/dist/continuity/formatter.js +313 -0
  241. package/dist/continuity/formatter.js.map +1 -0
  242. package/dist/continuity/handoff-store.d.ts +67 -0
  243. package/dist/continuity/handoff-store.d.ts.map +1 -0
  244. package/dist/continuity/handoff-store.js +472 -0
  245. package/dist/continuity/handoff-store.js.map +1 -0
  246. package/dist/continuity/index.d.ts +45 -0
  247. package/dist/continuity/index.d.ts.map +1 -0
  248. package/dist/continuity/index.js +48 -0
  249. package/dist/continuity/index.js.map +1 -0
  250. package/dist/continuity/ledger-store.d.ts +110 -0
  251. package/dist/continuity/ledger-store.d.ts.map +1 -0
  252. package/dist/continuity/ledger-store.js +500 -0
  253. package/dist/continuity/ledger-store.js.map +1 -0
  254. package/dist/continuity/manager.d.ts +178 -0
  255. package/dist/continuity/manager.d.ts.map +1 -0
  256. package/dist/continuity/manager.js +562 -0
  257. package/dist/continuity/manager.js.map +1 -0
  258. package/dist/continuity/parser.d.ts +76 -0
  259. package/dist/continuity/parser.d.ts.map +1 -0
  260. package/dist/continuity/parser.js +579 -0
  261. package/dist/continuity/parser.js.map +1 -0
  262. package/dist/continuity/types.d.ts +180 -0
  263. package/dist/continuity/types.d.ts.map +1 -0
  264. package/dist/continuity/types.js +9 -0
  265. package/dist/continuity/types.js.map +1 -0
  266. package/dist/daemon/agent-manager.d.ts +114 -0
  267. package/dist/daemon/agent-manager.d.ts.map +1 -0
  268. package/dist/daemon/agent-manager.js +513 -0
  269. package/dist/daemon/agent-manager.js.map +1 -0
  270. package/dist/daemon/agent-registry.d.ts +34 -0
  271. package/dist/daemon/agent-registry.d.ts.map +1 -1
  272. package/dist/daemon/agent-registry.js +45 -2
  273. package/dist/daemon/agent-registry.js.map +1 -1
  274. package/dist/daemon/api.d.ts +81 -0
  275. package/dist/daemon/api.d.ts.map +1 -0
  276. package/dist/daemon/api.js +554 -0
  277. package/dist/daemon/api.js.map +1 -0
  278. package/dist/daemon/cli-auth.d.ts +67 -0
  279. package/dist/daemon/cli-auth.d.ts.map +1 -0
  280. package/dist/daemon/cli-auth.js +537 -0
  281. package/dist/daemon/cli-auth.js.map +1 -0
  282. package/dist/daemon/cloud-sync.d.ts +101 -0
  283. package/dist/daemon/cloud-sync.d.ts.map +1 -0
  284. package/dist/daemon/cloud-sync.js +263 -0
  285. package/dist/daemon/cloud-sync.js.map +1 -0
  286. package/dist/daemon/index.d.ts +4 -0
  287. package/dist/daemon/index.d.ts.map +1 -1
  288. package/dist/daemon/index.js +6 -0
  289. package/dist/daemon/index.js.map +1 -1
  290. package/dist/daemon/orchestrator.d.ts +155 -0
  291. package/dist/daemon/orchestrator.d.ts.map +1 -0
  292. package/dist/daemon/orchestrator.js +766 -0
  293. package/dist/daemon/orchestrator.js.map +1 -0
  294. package/dist/daemon/router.d.ts +29 -0
  295. package/dist/daemon/router.d.ts.map +1 -1
  296. package/dist/daemon/router.js +143 -21
  297. package/dist/daemon/router.js.map +1 -1
  298. package/dist/daemon/server.d.ts +42 -0
  299. package/dist/daemon/server.d.ts.map +1 -1
  300. package/dist/daemon/server.js +199 -16
  301. package/dist/daemon/server.js.map +1 -1
  302. package/dist/daemon/services/browser-testing.d.ts +88 -0
  303. package/dist/daemon/services/browser-testing.d.ts.map +1 -0
  304. package/dist/daemon/services/browser-testing.js +244 -0
  305. package/dist/daemon/services/browser-testing.js.map +1 -0
  306. package/dist/daemon/services/container-spawner.d.ts +135 -0
  307. package/dist/daemon/services/container-spawner.d.ts.map +1 -0
  308. package/dist/daemon/services/container-spawner.js +313 -0
  309. package/dist/daemon/services/container-spawner.js.map +1 -0
  310. package/dist/daemon/types.d.ts +131 -0
  311. package/dist/daemon/types.d.ts.map +1 -0
  312. package/dist/daemon/types.js +6 -0
  313. package/dist/daemon/types.js.map +1 -0
  314. package/dist/daemon/workspace-manager.d.ts +75 -0
  315. package/dist/daemon/workspace-manager.d.ts.map +1 -0
  316. package/dist/daemon/workspace-manager.js +289 -0
  317. package/dist/daemon/workspace-manager.js.map +1 -0
  318. package/dist/dashboard/out/404.html +1 -1
  319. package/dist/dashboard/out/_next/static/chunks/116-2502180def231162.js +1 -0
  320. package/dist/dashboard/out/_next/static/chunks/282-980c2eb8fff20123.js +1 -0
  321. package/dist/dashboard/out/_next/static/chunks/480-2d4111711d4e473c.js +1 -0
  322. package/dist/dashboard/out/_next/static/chunks/724-73c1ee5f60abe860.js +9 -0
  323. package/dist/dashboard/out/_next/static/chunks/766-c3a14283c88d815b.js +1 -0
  324. package/dist/dashboard/out/_next/static/chunks/app/app/page-7120be68bea622f3.js +1 -0
  325. package/dist/dashboard/out/_next/static/chunks/app/connect-repos/page-dc2e3a1a22478efc.js +1 -0
  326. package/dist/dashboard/out/_next/static/chunks/app/history/page-56a8b4616a90dc43.js +1 -0
  327. package/dist/dashboard/out/_next/static/chunks/app/layout-2433bb48965f4333.js +1 -0
  328. package/dist/dashboard/out/_next/static/chunks/app/login/page-3eac37ea6f5dd153.js +1 -0
  329. package/dist/dashboard/out/_next/static/chunks/app/metrics/page-1081dd190a331a91.js +1 -0
  330. package/dist/dashboard/out/_next/static/chunks/app/page-daf87e86f783f980.js +1 -0
  331. package/dist/dashboard/out/_next/static/chunks/app/pricing/page-4d72d5a5d8a9b618.js +1 -0
  332. package/dist/dashboard/out/_next/static/chunks/app/providers/page-b68a681526eb145e.js +1 -0
  333. package/dist/dashboard/out/_next/static/chunks/app/signup/page-fee4ed1709070bcd.js +1 -0
  334. package/dist/dashboard/out/_next/static/chunks/e868780c-48e5f147c90a3a41.js +18 -0
  335. package/dist/dashboard/out/_next/static/chunks/{main-e0a1f53fe0617a63.js → main-97850e03d723ea8c.js} +1 -1
  336. package/dist/dashboard/out/_next/static/chunks/main-app-5d692157a8eb1fd9.js +1 -0
  337. package/dist/dashboard/out/_next/static/chunks/webpack-1cdd8ed57114d5e1.js +1 -0
  338. package/dist/dashboard/out/_next/static/css/29852f26181969a0.css +1 -0
  339. package/dist/dashboard/out/_next/static/css/411ce23ffeae9f76.css +1 -0
  340. package/dist/dashboard/out/alt-logos/agent-relay-logo-128.png +0 -0
  341. package/dist/dashboard/out/alt-logos/agent-relay-logo-256.png +0 -0
  342. package/dist/dashboard/out/alt-logos/agent-relay-logo-32.png +0 -0
  343. package/dist/dashboard/out/alt-logos/agent-relay-logo-512.png +0 -0
  344. package/dist/dashboard/out/alt-logos/agent-relay-logo-64.png +0 -0
  345. package/dist/dashboard/out/alt-logos/agent-relay-logo.svg +45 -0
  346. package/dist/dashboard/out/alt-logos/logo.svg +38 -0
  347. package/dist/dashboard/out/alt-logos/monogram-logo-128.png +0 -0
  348. package/dist/dashboard/out/alt-logos/monogram-logo-256.png +0 -0
  349. package/dist/dashboard/out/alt-logos/monogram-logo-32.png +0 -0
  350. package/dist/dashboard/out/alt-logos/monogram-logo-512.png +0 -0
  351. package/dist/dashboard/out/alt-logos/monogram-logo-64.png +0 -0
  352. package/dist/dashboard/out/alt-logos/monogram-logo.svg +38 -0
  353. package/dist/dashboard/out/app.html +1 -0
  354. package/dist/dashboard/out/app.txt +7 -0
  355. package/dist/dashboard/out/connect-repos.html +1 -0
  356. package/dist/dashboard/out/connect-repos.txt +7 -0
  357. package/dist/dashboard/out/history.html +1 -0
  358. package/dist/dashboard/out/history.txt +7 -0
  359. package/dist/dashboard/out/index.html +1 -1
  360. package/dist/dashboard/out/index.txt +2 -2
  361. package/dist/dashboard/out/login.html +6 -0
  362. package/dist/dashboard/out/login.txt +7 -0
  363. package/dist/dashboard/out/metrics.html +1 -515
  364. package/dist/dashboard/out/metrics.txt +2 -2
  365. package/dist/dashboard/out/pricing.html +13 -0
  366. package/dist/dashboard/out/pricing.txt +7 -0
  367. package/dist/dashboard/out/providers.html +1 -0
  368. package/dist/dashboard/out/providers.txt +7 -0
  369. package/dist/dashboard/out/signup.html +6 -0
  370. package/dist/dashboard/out/signup.txt +7 -0
  371. package/dist/dashboard-server/metrics.d.ts.map +1 -1
  372. package/dist/dashboard-server/metrics.js +3 -2
  373. package/dist/dashboard-server/metrics.js.map +1 -1
  374. package/dist/dashboard-server/server.d.ts.map +1 -1
  375. package/dist/dashboard-server/server.js +2653 -130
  376. package/dist/dashboard-server/server.js.map +1 -1
  377. package/dist/hooks/emitter.d.ts +40 -0
  378. package/dist/hooks/emitter.d.ts.map +1 -0
  379. package/dist/hooks/emitter.js +63 -0
  380. package/dist/hooks/emitter.js.map +1 -0
  381. package/dist/hooks/index.d.ts +3 -0
  382. package/dist/hooks/index.d.ts.map +1 -1
  383. package/dist/hooks/index.js +3 -0
  384. package/dist/hooks/index.js.map +1 -1
  385. package/dist/hooks/registry.d.ts +173 -0
  386. package/dist/hooks/registry.d.ts.map +1 -0
  387. package/dist/hooks/registry.js +476 -0
  388. package/dist/hooks/registry.js.map +1 -0
  389. package/dist/hooks/trajectory-hooks.d.ts +52 -0
  390. package/dist/hooks/trajectory-hooks.d.ts.map +1 -0
  391. package/dist/hooks/trajectory-hooks.js +183 -0
  392. package/dist/hooks/trajectory-hooks.js.map +1 -0
  393. package/dist/hooks/types.d.ts +141 -0
  394. package/dist/hooks/types.d.ts.map +1 -1
  395. package/dist/index.d.ts +2 -0
  396. package/dist/index.d.ts.map +1 -1
  397. package/dist/index.js +3 -0
  398. package/dist/index.js.map +1 -1
  399. package/dist/memory/adapters/index.d.ts +8 -0
  400. package/dist/memory/adapters/index.d.ts.map +1 -0
  401. package/dist/memory/adapters/index.js +8 -0
  402. package/dist/memory/adapters/index.js.map +1 -0
  403. package/dist/memory/adapters/inmemory.d.ts +59 -0
  404. package/dist/memory/adapters/inmemory.d.ts.map +1 -0
  405. package/dist/memory/adapters/inmemory.js +195 -0
  406. package/dist/memory/adapters/inmemory.js.map +1 -0
  407. package/dist/memory/adapters/supermemory.d.ts +71 -0
  408. package/dist/memory/adapters/supermemory.d.ts.map +1 -0
  409. package/dist/memory/adapters/supermemory.js +338 -0
  410. package/dist/memory/adapters/supermemory.js.map +1 -0
  411. package/dist/memory/factory.d.ts +48 -0
  412. package/dist/memory/factory.d.ts.map +1 -0
  413. package/dist/memory/factory.js +143 -0
  414. package/dist/memory/factory.js.map +1 -0
  415. package/dist/memory/index.d.ts +32 -0
  416. package/dist/memory/index.d.ts.map +1 -0
  417. package/dist/memory/index.js +32 -0
  418. package/dist/memory/index.js.map +1 -0
  419. package/dist/memory/memory-hooks.d.ts +60 -0
  420. package/dist/memory/memory-hooks.d.ts.map +1 -0
  421. package/dist/memory/memory-hooks.js +313 -0
  422. package/dist/memory/memory-hooks.js.map +1 -0
  423. package/dist/memory/service.d.ts +49 -0
  424. package/dist/memory/service.d.ts.map +1 -0
  425. package/dist/memory/service.js +146 -0
  426. package/dist/memory/service.js.map +1 -0
  427. package/dist/memory/types.d.ts +195 -0
  428. package/dist/memory/types.d.ts.map +1 -0
  429. package/dist/memory/types.js +8 -0
  430. package/dist/memory/types.js.map +1 -0
  431. package/dist/policy/agent-policy.d.ts +225 -0
  432. package/dist/policy/agent-policy.d.ts.map +1 -0
  433. package/dist/policy/agent-policy.js +665 -0
  434. package/dist/policy/agent-policy.js.map +1 -0
  435. package/dist/policy/cloud-policy-fetcher.d.ts +12 -0
  436. package/dist/policy/cloud-policy-fetcher.d.ts.map +1 -0
  437. package/dist/policy/cloud-policy-fetcher.js +64 -0
  438. package/dist/policy/cloud-policy-fetcher.js.map +1 -0
  439. package/dist/protocol/types.d.ts +10 -1
  440. package/dist/protocol/types.d.ts.map +1 -1
  441. package/dist/resiliency/context-persistence.d.ts +140 -0
  442. package/dist/resiliency/context-persistence.d.ts.map +1 -0
  443. package/dist/resiliency/context-persistence.js +397 -0
  444. package/dist/resiliency/context-persistence.js.map +1 -0
  445. package/dist/resiliency/crash-insights.d.ts +156 -0
  446. package/dist/resiliency/crash-insights.d.ts.map +1 -0
  447. package/dist/resiliency/crash-insights.js +492 -0
  448. package/dist/resiliency/crash-insights.js.map +1 -0
  449. package/dist/resiliency/gossip-health.d.ts +137 -0
  450. package/dist/resiliency/gossip-health.d.ts.map +1 -0
  451. package/dist/resiliency/gossip-health.js +241 -0
  452. package/dist/resiliency/gossip-health.js.map +1 -0
  453. package/dist/resiliency/health-monitor.d.ts +97 -0
  454. package/dist/resiliency/health-monitor.d.ts.map +1 -0
  455. package/dist/resiliency/health-monitor.js +291 -0
  456. package/dist/resiliency/health-monitor.js.map +1 -0
  457. package/dist/resiliency/index.d.ts +68 -0
  458. package/dist/resiliency/index.d.ts.map +1 -0
  459. package/dist/resiliency/index.js +68 -0
  460. package/dist/resiliency/index.js.map +1 -0
  461. package/dist/resiliency/leader-watchdog.d.ts +109 -0
  462. package/dist/resiliency/leader-watchdog.d.ts.map +1 -0
  463. package/dist/resiliency/leader-watchdog.js +189 -0
  464. package/dist/resiliency/leader-watchdog.js.map +1 -0
  465. package/dist/resiliency/logger.d.ts +114 -0
  466. package/dist/resiliency/logger.d.ts.map +1 -0
  467. package/dist/resiliency/logger.js +250 -0
  468. package/dist/resiliency/logger.js.map +1 -0
  469. package/dist/resiliency/memory-monitor.d.ts +172 -0
  470. package/dist/resiliency/memory-monitor.d.ts.map +1 -0
  471. package/dist/resiliency/memory-monitor.js +593 -0
  472. package/dist/resiliency/memory-monitor.js.map +1 -0
  473. package/dist/resiliency/metrics.d.ts +115 -0
  474. package/dist/resiliency/metrics.d.ts.map +1 -0
  475. package/dist/resiliency/metrics.js +239 -0
  476. package/dist/resiliency/metrics.js.map +1 -0
  477. package/dist/resiliency/provider-context.d.ts +100 -0
  478. package/dist/resiliency/provider-context.d.ts.map +1 -0
  479. package/dist/resiliency/provider-context.js +360 -0
  480. package/dist/resiliency/provider-context.js.map +1 -0
  481. package/dist/resiliency/stateless-lead.d.ts +149 -0
  482. package/dist/resiliency/stateless-lead.d.ts.map +1 -0
  483. package/dist/resiliency/stateless-lead.js +308 -0
  484. package/dist/resiliency/stateless-lead.js.map +1 -0
  485. package/dist/resiliency/supervisor.d.ts +147 -0
  486. package/dist/resiliency/supervisor.d.ts.map +1 -0
  487. package/dist/resiliency/supervisor.js +459 -0
  488. package/dist/resiliency/supervisor.js.map +1 -0
  489. package/dist/shared/cli-auth-config.d.ts +91 -0
  490. package/dist/shared/cli-auth-config.d.ts.map +1 -0
  491. package/dist/shared/cli-auth-config.js +264 -0
  492. package/dist/shared/cli-auth-config.js.map +1 -0
  493. package/dist/storage/adapter.d.ts +3 -1
  494. package/dist/storage/adapter.d.ts.map +1 -1
  495. package/dist/storage/adapter.js +12 -2
  496. package/dist/storage/adapter.js.map +1 -1
  497. package/dist/storage/sqlite-adapter.d.ts.map +1 -1
  498. package/dist/storage/sqlite-adapter.js +18 -14
  499. package/dist/storage/sqlite-adapter.js.map +1 -1
  500. package/dist/trajectory/config.d.ts +84 -0
  501. package/dist/trajectory/config.d.ts.map +1 -0
  502. package/dist/trajectory/config.js +163 -0
  503. package/dist/trajectory/config.js.map +1 -0
  504. package/dist/trajectory/index.d.ts +8 -0
  505. package/dist/trajectory/index.d.ts.map +1 -0
  506. package/dist/trajectory/index.js +8 -0
  507. package/dist/trajectory/index.js.map +1 -0
  508. package/dist/trajectory/integration.d.ts +292 -0
  509. package/dist/trajectory/integration.d.ts.map +1 -0
  510. package/dist/trajectory/integration.js +834 -0
  511. package/dist/trajectory/integration.js.map +1 -0
  512. package/dist/utils/index.d.ts +1 -0
  513. package/dist/utils/index.d.ts.map +1 -1
  514. package/dist/utils/index.js +1 -0
  515. package/dist/utils/index.js.map +1 -1
  516. package/dist/utils/logger.d.ts +40 -0
  517. package/dist/utils/logger.d.ts.map +1 -0
  518. package/dist/utils/logger.js +84 -0
  519. package/dist/utils/logger.js.map +1 -0
  520. package/dist/utils/project-namespace.d.ts +24 -0
  521. package/dist/utils/project-namespace.d.ts.map +1 -1
  522. package/dist/utils/project-namespace.js +84 -0
  523. package/dist/utils/project-namespace.js.map +1 -1
  524. package/dist/wrapper/client.d.ts +16 -1
  525. package/dist/wrapper/client.d.ts.map +1 -1
  526. package/dist/wrapper/client.js +32 -1
  527. package/dist/wrapper/client.js.map +1 -1
  528. package/dist/wrapper/parser.d.ts +13 -0
  529. package/dist/wrapper/parser.d.ts.map +1 -1
  530. package/dist/wrapper/parser.js +217 -47
  531. package/dist/wrapper/parser.js.map +1 -1
  532. package/dist/wrapper/pty-wrapper.d.ts +219 -17
  533. package/dist/wrapper/pty-wrapper.d.ts.map +1 -1
  534. package/dist/wrapper/pty-wrapper.js +1050 -104
  535. package/dist/wrapper/pty-wrapper.js.map +1 -1
  536. package/dist/wrapper/shared.d.ts +165 -0
  537. package/dist/wrapper/shared.d.ts.map +1 -0
  538. package/dist/wrapper/shared.js +270 -0
  539. package/dist/wrapper/shared.js.map +1 -0
  540. package/dist/wrapper/tmux-wrapper.d.ts +78 -11
  541. package/dist/wrapper/tmux-wrapper.d.ts.map +1 -1
  542. package/dist/wrapper/tmux-wrapper.js +567 -106
  543. package/dist/wrapper/tmux-wrapper.js.map +1 -1
  544. package/docs/CLOUD-ARCHITECTURE.md +804 -0
  545. package/docs/CLOUD-ONBOARDING-DESIGN.md +1983 -0
  546. package/docs/HOOKS_API.md +394 -0
  547. package/docs/WRAPPER_EVENTS.md +358 -0
  548. package/docs/agent-policy-snippet.md +40 -0
  549. package/docs/agent-relay-protocol.md +238 -0
  550. package/docs/agent-relay-snippet.md +115 -6
  551. package/docs/archive/EXECUTIVE_SUMMARY.md +358 -0
  552. package/docs/archive/ROADMAP.md +329 -0
  553. package/docs/archive/TESTING_PRESENCE_FEATURES.md +327 -0
  554. package/docs/competitive/GASTOWN.md +451 -0
  555. package/docs/{COMPETITIVE_ANALYSIS.md → competitive/OVERVIEW.md} +1 -0
  556. package/docs/competitive/README.md +34 -0
  557. package/docs/competitive/TMUX_ORCHESTRATOR.md +605 -0
  558. package/docs/dashboard.png +0 -0
  559. package/docs/design/ci-failure-webhooks.md +812 -0
  560. package/docs/design/comprehensive-integrations.md +238 -0
  561. package/docs/design/e2b-sandbox-integration.md +504 -0
  562. package/docs/design/github-app-permissions.md +264 -0
  563. package/docs/guides/CLOUD.md +236 -0
  564. package/docs/guides/LOCAL.md +535 -0
  565. package/docs/guides/SELF-HOSTED.md +494 -0
  566. package/docs/local-testing.md +428 -0
  567. package/docs/proposals/continuous-claude-integration.md +622 -0
  568. package/docs/proposals/custom-commands.md +368 -0
  569. package/docs/proposals/shadow-as-subagent.md +765 -0
  570. package/docs/proposals/slack-bot-integration.md +1457 -0
  571. package/docs/tasks/global-skills-system.tasks.md +230 -0
  572. package/docs/tasks/webhook-integrations.tasks.md +184 -0
  573. package/docs/tasks/workspace-capabilities.tasks.md +121 -0
  574. package/docs/testing/RESILIENCY-TEST-PLAN-2026-01-01.md +366 -0
  575. package/package.json +45 -7
  576. package/scripts/cloud-setup.sh +96 -0
  577. package/scripts/manual-qa.sh +293 -0
  578. package/scripts/postinstall.js +60 -0
  579. package/scripts/run-cloud-qa.sh +220 -0
  580. package/scripts/test-cli-auth/Dockerfile +44 -0
  581. package/scripts/test-cli-auth/Dockerfile.real +79 -0
  582. package/scripts/test-cli-auth/README.md +286 -0
  583. package/scripts/test-cli-auth/ci-test-real-clis.ts +251 -0
  584. package/scripts/test-cli-auth/ci-test-runner.ts +263 -0
  585. package/scripts/test-cli-auth/mock-cli.sh +147 -0
  586. package/scripts/test-cli-auth/package.json +14 -0
  587. package/scripts/test-cli-auth/test-oauth-flow.ts +220 -0
  588. package/scripts/test-pty-input-auto.js +222 -0
  589. package/scripts/test-pty-input.js +150 -0
  590. package/dist/dashboard/out/_next/static/chunks/app/layout-c9d8c5d95e48c6bf.js +0 -1
  591. package/dist/dashboard/out/_next/static/chunks/app/metrics/page-8aa9936bc6c771ab.js +0 -1
  592. package/dist/dashboard/out/_next/static/chunks/app/page-4498be09a5157759.js +0 -1
  593. package/dist/dashboard/out/_next/static/chunks/main-app-bae2e535de00de50.js +0 -1
  594. package/dist/dashboard/out/_next/static/chunks/webpack-c81f7fd28659d64f.js +0 -1
  595. package/dist/dashboard/out/_next/static/css/50ed6996e3df7bdd.css +0 -1
  596. /package/dist/dashboard/out/_next/static/{DXFA-jj8wb3PcY5DX2xcU → H5aWG0udPB4iOUIl_gytz}/_buildManifest.js +0 -0
  597. /package/dist/dashboard/out/_next/static/{DXFA-jj8wb3PcY5DX2xcU → H5aWG0udPB4iOUIl_gytz}/_ssgManifest.js +0 -0
  598. /package/dist/dashboard/out/_next/static/chunks/{117-3bef7b19f3e60751.js → 117-b100311aff8d5c61.js} +0 -0
  599. /package/dist/dashboard/out/_next/static/chunks/{648-6cf686106c891ad3.js → 648-a13d3c2b1be45466.js} +0 -0
  600. /package/dist/dashboard/out/_next/static/chunks/app/_not-found/{page-8ff6572bc7c9bc61.js → page-a4973f3e3c82fb67.js} +0 -0
  601. /package/dist/dashboard/out/_next/static/chunks/{fd9d1056-26bd8d656b496dba.js → fd9d1056-bf46c09eb57e019c.js} +0 -0
  602. /package/docs/{CHANGELOG.md → archive/CHANGELOG.md} +0 -0
  603. /package/docs/{CLI-SIMPLIFICATION-COMPLETE.md → archive/CLI-SIMPLIFICATION-COMPLETE.md} +0 -0
  604. /package/docs/{DESIGN_BRIDGE_STAFFING.md → archive/DESIGN_BRIDGE_STAFFING.md} +0 -0
  605. /package/docs/{DESIGN_V2.md → archive/DESIGN_V2.md} +0 -0
  606. /package/docs/{MONETIZATION.md → archive/MONETIZATION.md} +0 -0
  607. /package/docs/{PROPOSAL-trajectories.md → archive/PROPOSAL-trajectories.md} +0 -0
  608. /package/docs/{SCALING_ANALYSIS.md → archive/SCALING_ANALYSIS.md} +0 -0
  609. /package/docs/{TMUX_IMPLEMENTATION_NOTES.md → archive/TMUX_IMPLEMENTATION_NOTES.md} +0 -0
  610. /package/docs/{TMUX_IMPROVEMENTS.md → archive/TMUX_IMPROVEMENTS.md} +0 -0
  611. /package/docs/{dashboard-v2-plan.md → archive/dashboard-v2-plan.md} +0 -0
  612. /package/docs/{removable-code-analysis.md → archive/removable-code-analysis.md} +0 -0
  613. /package/docs/{competitive-analysis-mcp-agent-mail.md → competitive/MCP_AGENT_MAIL.md} +0 -0
@@ -0,0 +1,804 @@
1
+ # Agent Relay Cloud - Architecture
2
+
3
+ ## System Overview
4
+
5
+ ```
6
+ ┌─────────────────────────────────────────────────────────────────────────────────┐
7
+ │ AGENT RELAY CLOUD │
8
+ │ │
9
+ │ ┌─────────────────────────────────────────────────────────────────────────┐ │
10
+ │ │ CONTROL PLANE │ │
11
+ │ │ │ │
12
+ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │
13
+ │ │ │ API │ │ Auth │ │Credential│ │Workspace │ │ Dashboard│ │ │
14
+ │ │ │ Server │ │ Service │ │ Vault │ │Provisioner│ │ (React) │ │ │
15
+ │ │ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ │ │
16
+ │ │ │ │ │ │ │ │ │
17
+ │ │ └─────────────┴─────────────┴─────────────┴─────────────┘ │ │
18
+ │ │ │ │ │
19
+ │ │ ┌──────┴──────┐ │ │
20
+ │ │ │ PostgreSQL │ │ │
21
+ │ │ │ + Redis │ │ │
22
+ │ │ └─────────────┘ │ │
23
+ │ └─────────────────────────────────────────────────────────────────────────┘ │
24
+ │ │ │
25
+ │ │ Provision & Manage │
26
+ │ ▼ │
27
+ │ ┌─────────────────────────────────────────────────────────────────────────┐ │
28
+ │ │ COMPUTE PLANE │ │
29
+ │ │ │ │
30
+ │ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ │
31
+ │ │ │ Workspace A │ │ Workspace B │ │ Workspace C │ ... │ │
32
+ │ │ │ (user-123) │ │ (user-456) │ │ (team-789) │ │ │
33
+ │ │ │ │ │ │ │ │ │ │
34
+ │ │ │ ┌───────────┐ │ │ ┌───────────┐ │ │ ┌───────────┐ │ │ │
35
+ │ │ │ │agent-relay│ │ │ │agent-relay│ │ │ │agent-relay│ │ │ │
36
+ │ │ │ │ daemon │ │ │ │ daemon │ │ │ │ daemon │ │ │ │
37
+ │ │ │ └─────┬─────┘ │ │ └─────┬─────┘ │ │ └─────┬─────┘ │ │ │
38
+ │ │ │ │ │ │ │ │ │ │ │ │ │
39
+ │ │ │ ┌─────┴─────┐ │ │ ┌─────┴─────┐ │ │ ┌─────┴─────┐ │ │ │
40
+ │ │ │ │ Agents │ │ │ │ Agents │ │ │ │ Agents │ │ │ │
41
+ │ │ │ │(claude, │ │ │ │(codex) │ │ │ │(claude, │ │ │ │
42
+ │ │ │ │ codex) │ │ │ │ │ │ │ │ gemini) │ │ │ │
43
+ │ │ │ └───────────┘ │ │ └───────────┘ │ │ └───────────┘ │ │ │
44
+ │ │ │ │ │ │ │ │ │ │
45
+ │ │ │ /repos/ │ │ /repos/ │ │ /repos/ │ │ │
46
+ │ │ │ ├─ project-a │ │ └─ my-app │ │ ├─ backend │ │ │
47
+ │ │ │ └─ project-b │ │ │ │ └─ frontend │ │ │
48
+ │ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ │
49
+ │ │ │ │
50
+ │ │ Compute Options: Fly.io | Railway | AWS ECS | GCP Cloud Run │ │
51
+ │ └─────────────────────────────────────────────────────────────────────────┘ │
52
+ │ │
53
+ └─────────────────────────────────────────────────────────────────────────────────┘
54
+ ```
55
+
56
+ ## One-Click Provisioning Flow
57
+
58
+ ```
59
+ User signs up
60
+
61
+
62
+ ┌─────────────────────────────────────────────────────────────────┐
63
+ │ 1. AUTHENTICATE │
64
+ │ • GitHub OAuth login │
65
+ │ • Create user record │
66
+ │ • Store GitHub token │
67
+ └─────────────────────────────────────────────────────────────────┘
68
+
69
+
70
+ ┌─────────────────────────────────────────────────────────────────┐
71
+ │ 2. CONNECT PROVIDERS │
72
+ │ • Device flow for Claude/Codex │
73
+ │ • Store tokens in credential vault │
74
+ │ • (Can be done during or after onboarding) │
75
+ └─────────────────────────────────────────────────────────────────┘
76
+
77
+
78
+ ┌─────────────────────────────────────────────────────────────────┐
79
+ │ 3. SELECT REPOSITORIES │
80
+ │ • List repos from GitHub │
81
+ │ • User selects which to connect │
82
+ │ • Install GitHub App on selected repos │
83
+ └─────────────────────────────────────────────────────────────────┘
84
+
85
+
86
+ ┌─────────────────────────────────────────────────────────────────┐
87
+ │ 4. PROVISION WORKSPACE (automatic, ~30 seconds) │
88
+ │ • Allocate compute resources │
89
+ │ • Deploy agent-relay container │
90
+ │ • Clone selected repositories │
91
+ │ • Inject credentials from vault │
92
+ │ • Start daemon with supervisor │
93
+ │ • Configure webhooks │
94
+ └─────────────────────────────────────────────────────────────────┘
95
+
96
+
97
+ ┌─────────────────────────────────────────────────────────────────┐
98
+ │ 5. READY │
99
+ │ • Dashboard URL live │
100
+ │ • Agents ready to spawn │
101
+ │ • GitHub webhooks configured │
102
+ └─────────────────────────────────────────────────────────────────┘
103
+ ```
104
+
105
+ ## Components
106
+
107
+ ### 1. Control Plane Services
108
+
109
+ #### API Server (`/src/cloud/api/`)
110
+ - Express.js REST API
111
+ - Handles all cloud operations
112
+ - Routes:
113
+ - `/auth/*` - GitHub OAuth, session management
114
+ - `/providers/*` - Device flow auth for AI providers
115
+ - `/workspaces/*` - Workspace CRUD, provisioning
116
+ - `/repos/*` - Repository management
117
+ - `/teams/*` - Team management
118
+
119
+ #### Auth Service (`/src/cloud/auth/`)
120
+ - GitHub OAuth for user login
121
+ - Device flow for AI providers
122
+ - Session management (Redis)
123
+ - JWT tokens for API auth
124
+
125
+ #### Credential Vault (`/src/cloud/vault/`)
126
+ - Encrypted storage for OAuth tokens
127
+ - Per-user encryption keys
128
+ - Automatic token refresh
129
+ - Sync to workspaces
130
+
131
+ #### Workspace Provisioner (`/src/cloud/provisioner/`)
132
+ - Provisions compute resources
133
+ - Deploys agent-relay containers
134
+ - Manages workspace lifecycle
135
+ - Supports multiple backends:
136
+ - Fly.io (default)
137
+ - Railway
138
+ - AWS ECS
139
+ - Docker (local dev)
140
+
141
+ ### 2. Compute Plane
142
+
143
+ #### Workspace Container
144
+ ```dockerfile
145
+ FROM node:20-slim
146
+
147
+ # Install agent CLIs
148
+ RUN npm install -g agent-relay
149
+ RUN npm install -g @anthropic/claude-code
150
+ # Codex installed via their installer
151
+
152
+ # Workspace directory
153
+ WORKDIR /workspace
154
+
155
+ # Entry point
156
+ COPY entrypoint.sh /entrypoint.sh
157
+ CMD ["/entrypoint.sh"]
158
+ ```
159
+
160
+ #### Entrypoint Script
161
+ ```bash
162
+ #!/bin/bash
163
+
164
+ # Fetch credentials from vault
165
+ agent-relay cloud sync-credentials
166
+
167
+ # Clone repositories
168
+ for repo in $REPOS; do
169
+ git clone "https://x-access-token:${GITHUB_TOKEN}@github.com/${repo}.git"
170
+ done
171
+
172
+ # Start agent-relay daemon with supervisor
173
+ agent-relay up --watch
174
+ ```
175
+
176
+ ## Database Schema
177
+
178
+ ```sql
179
+ -- Users
180
+ CREATE TABLE users (
181
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
182
+ github_id TEXT UNIQUE NOT NULL,
183
+ github_username TEXT NOT NULL,
184
+ email TEXT,
185
+ created_at TIMESTAMP DEFAULT NOW(),
186
+ onboarding_completed_at TIMESTAMP
187
+ );
188
+
189
+ -- Provider Credentials (encrypted)
190
+ CREATE TABLE credentials (
191
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
192
+ user_id UUID REFERENCES users(id),
193
+ provider TEXT NOT NULL, -- 'anthropic', 'openai', 'google', etc.
194
+ encrypted_access_token TEXT NOT NULL,
195
+ encrypted_refresh_token TEXT,
196
+ token_expires_at TIMESTAMP,
197
+ scopes TEXT[],
198
+ provider_account_id TEXT,
199
+ provider_account_email TEXT,
200
+ created_at TIMESTAMP DEFAULT NOW(),
201
+ last_refreshed_at TIMESTAMP,
202
+ UNIQUE(user_id, provider)
203
+ );
204
+
205
+ -- Workspaces
206
+ CREATE TABLE workspaces (
207
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
208
+ user_id UUID REFERENCES users(id),
209
+ name TEXT NOT NULL,
210
+ status TEXT DEFAULT 'provisioning', -- provisioning, running, stopped, failed
211
+ compute_provider TEXT NOT NULL, -- 'fly', 'railway', 'ecs'
212
+ compute_id TEXT, -- Provider-specific instance ID
213
+ public_url TEXT, -- Dashboard URL
214
+ internal_url TEXT, -- For API calls
215
+ created_at TIMESTAMP DEFAULT NOW(),
216
+ started_at TIMESTAMP,
217
+ stopped_at TIMESTAMP
218
+ );
219
+
220
+ -- Connected Repositories
221
+ CREATE TABLE repositories (
222
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
223
+ workspace_id UUID REFERENCES workspaces(id),
224
+ github_repo_id TEXT NOT NULL,
225
+ github_full_name TEXT NOT NULL, -- 'owner/repo'
226
+ default_branch TEXT DEFAULT 'main',
227
+ webhook_id TEXT,
228
+ last_synced_at TIMESTAMP,
229
+ created_at TIMESTAMP DEFAULT NOW()
230
+ );
231
+
232
+ -- Teams (for collaboration)
233
+ CREATE TABLE teams (
234
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
235
+ name TEXT NOT NULL,
236
+ owner_id UUID REFERENCES users(id),
237
+ created_at TIMESTAMP DEFAULT NOW()
238
+ );
239
+
240
+ CREATE TABLE team_members (
241
+ team_id UUID REFERENCES teams(id),
242
+ user_id UUID REFERENCES users(id),
243
+ role TEXT DEFAULT 'member', -- 'owner', 'admin', 'member'
244
+ PRIMARY KEY (team_id, user_id)
245
+ );
246
+ ```
247
+
248
+ ## API Endpoints
249
+
250
+ ### Auth
251
+ ```
252
+ POST /api/auth/github # Start GitHub OAuth
253
+ GET /api/auth/github/callback # OAuth callback
254
+ POST /api/auth/logout # Logout
255
+ GET /api/auth/me # Get current user
256
+ ```
257
+
258
+ ### Providers
259
+ ```
260
+ GET /api/providers # List providers + connection status
261
+ POST /api/providers/:provider/connect # Start device flow
262
+ GET /api/providers/:provider/status # Check device flow status
263
+ DELETE /api/providers/:provider # Disconnect provider
264
+ ```
265
+
266
+ ### Workspaces
267
+ ```
268
+ GET /api/workspaces # List user's workspaces
269
+ POST /api/workspaces # Create (provisions automatically)
270
+ GET /api/workspaces/:id # Get workspace details
271
+ DELETE /api/workspaces/:id # Delete workspace
272
+ POST /api/workspaces/:id/start # Start stopped workspace
273
+ POST /api/workspaces/:id/stop # Stop workspace
274
+ POST /api/workspaces/:id/restart # Restart workspace
275
+ GET /api/workspaces/:id/logs # Get logs (SSE stream)
276
+ ```
277
+
278
+ ### Repositories
279
+ ```
280
+ GET /api/repos/available # List GitHub repos user can add
281
+ POST /api/workspaces/:id/repos # Add repo to workspace
282
+ DELETE /api/workspaces/:id/repos/:repoId # Remove repo
283
+ POST /api/workspaces/:id/repos/:repoId/sync # Force sync
284
+ ```
285
+
286
+ ### Agents
287
+ ```
288
+ GET /api/workspaces/:id/agents # List agents in workspace
289
+ POST /api/workspaces/:id/agents # Spawn new agent
290
+ DELETE /api/workspaces/:id/agents/:name # Kill agent
291
+ POST /api/workspaces/:id/agents/:name/message # Send message to agent
292
+ ```
293
+
294
+ ## Workspace Provisioner Implementation
295
+
296
+ ### Interface
297
+ ```typescript
298
+ interface WorkspaceProvisioner {
299
+ provision(config: ProvisionConfig): Promise<Workspace>;
300
+ start(workspaceId: string): Promise<void>;
301
+ stop(workspaceId: string): Promise<void>;
302
+ destroy(workspaceId: string): Promise<void>;
303
+ getLogs(workspaceId: string): AsyncIterable<string>;
304
+ getStatus(workspaceId: string): Promise<WorkspaceStatus>;
305
+ }
306
+
307
+ interface ProvisionConfig {
308
+ userId: string;
309
+ name: string;
310
+ repos: string[]; // ['owner/repo', ...]
311
+ providers: string[]; // ['anthropic', 'openai', ...]
312
+ resources?: {
313
+ cpu?: string; // '1' = 1 core
314
+ memory?: string; // '512Mi', '1Gi'
315
+ };
316
+ }
317
+ ```
318
+
319
+ ### Fly.io Implementation
320
+ ```typescript
321
+ class FlyProvisioner implements WorkspaceProvisioner {
322
+ async provision(config: ProvisionConfig): Promise<Workspace> {
323
+ // 1. Create Fly app
324
+ const app = await this.fly.createApp({
325
+ name: `relay-${config.userId.slice(0, 8)}`,
326
+ org: 'agent-relay-cloud'
327
+ });
328
+
329
+ // 2. Set secrets (credentials)
330
+ const credentials = await vault.getCredentials(config.userId, config.providers);
331
+ await this.fly.setSecrets(app.name, {
332
+ ANTHROPIC_AUTH_TOKEN: credentials.anthropic?.accessToken,
333
+ OPENAI_AUTH_TOKEN: credentials.openai?.accessToken,
334
+ GITHUB_TOKEN: await this.getGitHubToken(config.userId),
335
+ REPOS: config.repos.join(','),
336
+ CLOUD_API_URL: process.env.CLOUD_API_URL,
337
+ WORKSPACE_ID: app.name
338
+ });
339
+
340
+ // 3. Deploy container
341
+ await this.fly.deploy(app.name, {
342
+ image: 'ghcr.io/agent-relay/workspace:latest',
343
+ region: 'iad', // or user's preferred region
344
+ vm: {
345
+ cpus: 1,
346
+ memory: 512
347
+ }
348
+ });
349
+
350
+ // 4. Wait for healthy
351
+ await this.waitForHealthy(app.name);
352
+
353
+ return {
354
+ id: app.name,
355
+ publicUrl: `https://${app.name}.fly.dev`,
356
+ status: 'running'
357
+ };
358
+ }
359
+ }
360
+ ```
361
+
362
+ ## Directory Structure
363
+
364
+ ```
365
+ src/cloud/
366
+ ├── index.ts # Cloud service entry point
367
+ ├── server.ts # Express server setup
368
+ ├── config.ts # Configuration
369
+
370
+ ├── api/ # API routes
371
+ │ ├── index.ts
372
+ │ ├── auth.ts # Auth routes
373
+ │ ├── providers.ts # Provider connection routes
374
+ │ ├── workspaces.ts # Workspace management
375
+ │ ├── repos.ts # Repository management
376
+ │ └── agents.ts # Agent management
377
+
378
+ ├── auth/ # Auth services
379
+ │ ├── github.ts # GitHub OAuth
380
+ │ ├── device-flow.ts # Device flow for providers
381
+ │ └── session.ts # Session management
382
+
383
+ ├── vault/ # Credential vault
384
+ │ ├── index.ts
385
+ │ ├── encryption.ts # AES-256-GCM encryption
386
+ │ └── refresh.ts # Token refresh service
387
+
388
+ ├── provisioner/ # Workspace provisioning
389
+ │ ├── index.ts # Provisioner interface
390
+ │ ├── fly.ts # Fly.io implementation
391
+ │ ├── railway.ts # Railway implementation
392
+ │ ├── docker.ts # Local Docker (dev)
393
+ │ └── workspace-image/ # Container image
394
+ │ ├── Dockerfile
395
+ │ └── entrypoint.sh
396
+
397
+ ├── db/ # Database
398
+ │ ├── index.ts # Connection
399
+ │ ├── schema.sql # Schema
400
+ │ └── migrations/ # Migrations
401
+
402
+ └── services/ # Business logic
403
+ ├── users.ts
404
+ ├── workspaces.ts
405
+ ├── credentials.ts
406
+ └── github.ts
407
+ ```
408
+
409
+ ## Environment Variables
410
+
411
+ ```bash
412
+ # Database
413
+ DATABASE_URL=postgres://user:pass@host:5432/agent_relay_cloud
414
+ REDIS_URL=redis://host:6379
415
+
416
+ # GitHub OAuth
417
+ GITHUB_CLIENT_ID=xxx
418
+ GITHUB_CLIENT_SECRET=xxx
419
+ GITHUB_APP_ID=xxx
420
+ GITHUB_APP_PRIVATE_KEY=xxx
421
+
422
+ # Provider OAuth (for device flow)
423
+ ANTHROPIC_CLIENT_ID=xxx
424
+ OPENAI_CLIENT_ID=xxx
425
+ GOOGLE_CLIENT_ID=xxx
426
+
427
+ # Encryption
428
+ VAULT_MASTER_KEY=xxx # 32 bytes, base64
429
+
430
+ # Compute provider
431
+ COMPUTE_PROVIDER=fly # fly, railway, docker
432
+ FLY_API_TOKEN=xxx
433
+ FLY_ORG=agent-relay-cloud
434
+
435
+ # Server
436
+ PORT=3000
437
+ PUBLIC_URL=https://relay.cloud
438
+ SESSION_SECRET=xxx
439
+ ```
440
+
441
+ ## Security
442
+
443
+ ### Credential Vault Encryption
444
+ - AES-256-GCM for token encryption
445
+ - Per-user keys derived from master key + user ID
446
+ - Tokens never stored in plaintext
447
+ - Encryption keys never leave control plane
448
+
449
+ ### Workspace Isolation
450
+ - Each workspace runs in isolated container
451
+ - No shared filesystem between workspaces
452
+ - Network isolation (workspaces can't talk to each other)
453
+ - Credentials injected as environment variables (encrypted in transit)
454
+
455
+ ### API Security
456
+ - All API calls require authentication
457
+ - CSRF protection on mutations
458
+ - Rate limiting per user
459
+ - Audit logging for sensitive operations
460
+
461
+ ## Scaling
462
+
463
+ ### Control Plane
464
+ - Stateless API servers behind load balancer
465
+ - PostgreSQL with read replicas
466
+ - Redis cluster for sessions/caching
467
+
468
+ ### Compute Plane
469
+ - Workspaces scale independently
470
+ - Auto-sleep inactive workspaces (cost optimization)
471
+ - Wake on webhook or API call
472
+ - Regional deployment for latency
473
+
474
+ ## Auto-Scaling Infrastructure
475
+
476
+ The auto-scaling system automatically adjusts workspace resources based on agent activity and resource utilization.
477
+
478
+ ### Architecture
479
+
480
+ ```
481
+ ┌─────────────────────────────────────────────────────────────────┐
482
+ │ AUTO-SCALING SYSTEM │
483
+ │ │
484
+ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
485
+ │ │ Memory │───▶│ Scaling │───▶│ Auto │ │
486
+ │ │ Monitor │ │ Policy │ │ Scaler │ │
487
+ │ │ (per agent) │ │ Service │ │ (leader) │ │
488
+ │ └──────────────┘ └──────────────┘ └──────┬───────┘ │
489
+ │ │ │
490
+ │ Redis Pub/Sub │
491
+ │ │ │
492
+ │ ┌──────────────┐ ┌──────────────┐ ┌──────┴───────┐ │
493
+ │ │ Capacity │◀───│ Scaling │◀───│ Workspace │ │
494
+ │ │ Manager │ │ Orchestrator │ │ Provisioner │ │
495
+ │ └──────────────┘ └──────────────┘ └──────────────┘ │
496
+ │ │
497
+ └─────────────────────────────────────────────────────────────────┘
498
+ ```
499
+
500
+ ### Components
501
+
502
+ #### 1. Scaling Policy Service (`/src/cloud/services/scaling-policy.ts`)
503
+ Defines when to scale based on metrics:
504
+
505
+ | Policy | Priority | Trigger | Action |
506
+ |--------|----------|---------|--------|
507
+ | agent-limit-increase | 150 | 85% agent capacity (single workspace) | Increase max agents |
508
+ | workspace-resize-up | 140 | 75% memory for 2min (single workspace) | Resize to next tier |
509
+ | cpu-pressure-resize | 135 | 85% CPU for 3min | Resize workspace |
510
+ | memory-pressure-scale-up | 100 | 80% memory for 1min | Add workspace |
511
+ | agent-count-scale-up | 80 | 90% agent capacity | Add workspace |
512
+ | low-usage-scale-down | 50 | Under 20% for 10min | Remove workspace |
513
+ | workspace-resize-down | 45 | Under 15% memory/CPU for 15min | Reduce tier |
514
+
515
+ **Scaling Priority**: In-workspace (vertical) scaling is preferred over adding workspaces (horizontal) since it's more efficient.
516
+
517
+ #### 2. Auto-Scaler (`/src/cloud/services/auto-scaler.ts`)
518
+ Coordinates scaling decisions across multiple servers:
519
+ - Leader election via Redis (only one server evaluates)
520
+ - Distributed locking prevents concurrent scaling
521
+ - Cooldown periods prevent thrashing
522
+ - Publishes decisions via Redis pub/sub
523
+
524
+ #### 3. Capacity Manager (`/src/cloud/services/capacity-manager.ts`)
525
+ Tracks workspace utilization:
526
+ - Per-workspace memory, CPU, agent counts
527
+ - Trend analysis (15min/60min forecasts)
528
+ - Placement recommendations for new agents
529
+ - Stale workspace detection
530
+
531
+ #### 4. Scaling Orchestrator (`/src/cloud/services/scaling-orchestrator.ts`)
532
+ Executes scaling decisions:
533
+ - Handles both vertical and horizontal scaling
534
+ - Coordinates with provisioner for resizing
535
+ - Records scaling events for auditing
536
+ - Emits events for monitoring
537
+
538
+ ### Resource Tiers
539
+
540
+ Vertical scaling uses predefined resource tiers:
541
+
542
+ | Tier | CPU Cores | Memory | Max Agents |
543
+ |------|-----------|--------|------------|
544
+ | small | 1 (shared) | 512MB | 5 |
545
+ | medium | 2 (shared) | 1GB | 10 |
546
+ | large | 4 (performance) | 2GB | 20 |
547
+ | xlarge | 8 (performance) | 4GB | 50 |
548
+
549
+ ### Scaling Actions
550
+
551
+ | Action | Type | Description |
552
+ |--------|------|-------------|
553
+ | scale_up | Horizontal | Provision new workspace |
554
+ | scale_down | Horizontal | Deprovision idle workspace |
555
+ | resize_up | Vertical | Increase workspace resources |
556
+ | resize_down | Vertical | Decrease workspace resources |
557
+ | increase_agent_limit | Vertical | Raise max agents limit |
558
+ | migrate_agents | Horizontal | Move agents between workspaces |
559
+ | rebalance | Horizontal | Redistribute agents evenly |
560
+
561
+ ### Plan-Based Thresholds
562
+
563
+ Each plan has different scaling limits:
564
+
565
+ | Plan | Max Workspaces | Max Agents/Workspace | Memory Threshold |
566
+ |------|----------------|---------------------|------------------|
567
+ | free | 1 | 5 | 80% |
568
+ | pro | 3 | 15 | 85% |
569
+ | team | 10 | 25 | 85% |
570
+ | enterprise | 50 | 50 | 90% |
571
+
572
+ ### Configuration
573
+
574
+ ```typescript
575
+ // Enable auto-scaling with custom config
576
+ const orchestrator = createScalingOrchestrator({
577
+ enabled: true,
578
+ autoProvision: true, // Auto-provision new workspaces
579
+ autoDeprovision: false, // Require manual deprovision (safety)
580
+ idleTimeoutMs: 1800000, // 30 min idle timeout
581
+ minUserWorkspaces: 1, // Never scale below 1
582
+ });
583
+
584
+ await orchestrator.initialize(process.env.REDIS_URL);
585
+ ```
586
+
587
+ ### Monitoring
588
+
589
+ The orchestrator emits events for monitoring:
590
+
591
+ ```typescript
592
+ orchestrator.on('workspace_resized', ({ userId, workspaceId, previousTier, newTier }) => {
593
+ console.log(`Resized ${workspaceId} from ${previousTier} to ${newTier}`);
594
+ });
595
+
596
+ orchestrator.on('scaling_blocked', ({ reason, operation }) => {
597
+ console.log(`Scaling blocked: ${reason}`);
598
+ });
599
+
600
+ orchestrator.on('agent_limit_updated', ({ workspaceId, previousLimit, newLimit }) => {
601
+ console.log(`Agent limit: ${previousLimit} → ${newLimit}`);
602
+ });
603
+ ```
604
+
605
+ ### Cross-Server Coordination
606
+
607
+ Multiple cloud servers coordinate via Redis:
608
+ - Leader election ensures single decision maker
609
+ - Pub/sub broadcasts metrics and decisions
610
+ - Distributed locks prevent race conditions
611
+
612
+ ```
613
+ Server A (leader) Server B Server C
614
+ │ │ │
615
+ │◀── metrics ────────│ │
616
+ │◀── metrics ────────┼────────────────────│
617
+ │ │ │
618
+ ├── evaluate ────────┼────────────────────┤
619
+ │ │ │
620
+ │── scale request ──▶│ │
621
+ │ ▶│◀── execute ────────│
622
+ │ │ │
623
+ │◀── complete ───────│ │
624
+ ```
625
+
626
+ ---
627
+
628
+ ## Cloud Coordinators (Project Groups)
629
+
630
+ Coordinators are high-level AI agents that oversee multiple projects (repositories). They enable cross-workspace communication and coordination at scale.
631
+
632
+ ### Workspace vs Project Group
633
+
634
+ **Workspace** = A single compute instance (Fly.io VM) that can hold multiple repos:
635
+ ```
636
+ ┌─────────────────────────────────────────────┐
637
+ │ Workspace (1 Fly.io VM) │
638
+ │ /repos/ │
639
+ │ ├── frontend-app/ ← Repo 1 │
640
+ │ ├── backend-api/ ← Repo 2 │
641
+ │ └── shared-libs/ ← Repo 3 │
642
+ │ │
643
+ │ agent-relay daemon (1 per workspace) │
644
+ │ Agents communicate via local Unix socket │
645
+ └─────────────────────────────────────────────┘
646
+ ```
647
+
648
+ **Project Group** = A logical grouping of repos that may span multiple workspaces:
649
+ - Repos in the **same workspace** → agents talk via local daemon (fast)
650
+ - Repos in **different workspaces** → need Redis pub/sub (cross-VM messaging)
651
+ - The **Coordinator** oversees all repos regardless of which workspace they're in
652
+
653
+ ### Architecture Overview
654
+
655
+ ```
656
+ ┌─────────────────────────────────────────────────┐
657
+ │ Cloud Dashboard │
658
+ │ (User creates Project Group, selects repos) │
659
+ └──────────────────┬──────────────────────────────┘
660
+ │ Creates Project Group
661
+
662
+ ┌─────────────────────────────────────────────────┐
663
+ │ Project Group │
664
+ │ ├─ Repo 1 (connected via Cloud Worker) │
665
+ │ ├─ Repo 2 (connected via Cloud Worker) │
666
+ │ └─ Coordinator Agent (cloud-hosted) │
667
+ └──────────────────┬──────────────────────────────┘
668
+ │ Redis Pub/Sub
669
+
670
+ ┌─────────────────────────────────────────────────┐
671
+ │ Per-Workspace Workers (Fly.io Machines) │
672
+ │ Each maintains connection to local project │
673
+ │ daemon and relays messages to/from cloud │
674
+ └─────────────────────────────────────────────────┘
675
+ ```
676
+
677
+ ### Local vs Cloud Comparison
678
+
679
+ | Feature | Local Bridge (`relay bridge`) | Cloud Coordinator |
680
+ |---------|-------------------------------|-------------------|
681
+ | Spawning | tmux sessions on local machine | Cloud-hosted process (Fly.io) |
682
+ | Messaging | Direct Unix socket connections | Redis pub/sub across workspaces |
683
+ | State | `bridge-state.json` file | PostgreSQL (project_groups table) |
684
+ | Scaling | Single machine | Multi-tenant, horizontal scaling |
685
+ | Dashboard | Local dashboard server | Cloud dashboard with auth |
686
+
687
+ ### Database Schema
688
+
689
+ ```sql
690
+ -- Project Groups (collection of repos with optional coordinator)
691
+ CREATE TABLE project_groups (
692
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
693
+ user_id UUID REFERENCES users(id),
694
+ name TEXT NOT NULL,
695
+ created_at TIMESTAMP DEFAULT NOW()
696
+ );
697
+
698
+ -- Repos in a Project Group
699
+ CREATE TABLE project_group_repos (
700
+ project_group_id UUID REFERENCES project_groups(id),
701
+ repository_id UUID REFERENCES repositories(id),
702
+ PRIMARY KEY (project_group_id, repository_id)
703
+ );
704
+
705
+ -- Coordinator Agents (one per project group)
706
+ CREATE TABLE coordinators (
707
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
708
+ project_group_id UUID REFERENCES project_groups(id) UNIQUE,
709
+ name TEXT DEFAULT 'Architect',
710
+ model TEXT DEFAULT 'claude-sonnet',
711
+ status TEXT DEFAULT 'stopped', -- stopped, starting, running, error
712
+ compute_id TEXT, -- Fly.io machine ID
713
+ started_at TIMESTAMP,
714
+ stopped_at TIMESTAMP
715
+ );
716
+ ```
717
+
718
+ ### API Endpoints
719
+
720
+ ```
721
+ # Project Groups
722
+ GET /api/project-groups # List user's project groups
723
+ POST /api/project-groups # Create project group
724
+ GET /api/project-groups/:id # Get project group details
725
+ DELETE /api/project-groups/:id # Delete project group
726
+
727
+ # Coordinators
728
+ POST /api/project-groups/:id/coordinator/enable # Start coordinator
729
+ POST /api/project-groups/:id/coordinator/disable # Stop coordinator
730
+ GET /api/project-groups/:id/coordinator/status # Get coordinator status
731
+ POST /api/project-groups/:id/coordinator/message # Send message to coordinator
732
+ ```
733
+
734
+ ### Cross-Workspace Messaging
735
+
736
+ Coordinators use Redis pub/sub for cross-workspace communication:
737
+
738
+ ```typescript
739
+ // Publish to a workspace
740
+ redis.publish(`workspace:${workspaceId}:messages`, JSON.stringify({
741
+ from: 'Architect',
742
+ to: 'Lead',
743
+ content: 'Please prioritize the auth module',
744
+ timestamp: Date.now()
745
+ }));
746
+
747
+ // Subscribe to messages for a workspace
748
+ redis.subscribe(`workspace:${workspaceId}:messages`, (message) => {
749
+ // Route to local agent via daemon
750
+ });
751
+ ```
752
+
753
+ ### Message Routing
754
+
755
+ ```
756
+ Coordinator → Redis → Workspace Worker → Local Daemon → Agent
757
+ ↑ │
758
+ └────────────────────────────────────────────────────┘
759
+ (response path)
760
+ ```
761
+
762
+ ### Coordinator Prompt Template
763
+
764
+ When a coordinator is started, it receives context about its project group:
765
+
766
+ ```
767
+ You are the Architect, a cross-project coordinator overseeing multiple codebases.
768
+
769
+ ## Connected Projects
770
+ - project-1: /repos/frontend (Lead: FrontendLead)
771
+ - project-2: /repos/backend (Lead: BackendLead)
772
+
773
+ ## Your Role
774
+ - Coordinate high-level work across all projects
775
+ - Assign tasks to project leads
776
+ - Ensure consistency and resolve cross-project dependencies
777
+ - Review overall architecture decisions
778
+
779
+ ## Cross-Project Messaging
780
+
781
+ Use this syntax to message agents in specific projects:
782
+ ->relay:project-id:AgentName <<<
783
+ Your message>>>
784
+
785
+ ->relay:project-id:* <<<
786
+ Broadcast to all agents in a project>>>
787
+
788
+ ->relay:*:* <<<
789
+ Broadcast to ALL agents in ALL projects>>>
790
+ ```
791
+
792
+ ### Dashboard UI (CoordinatorPanel)
793
+
794
+ The dashboard provides a UI for managing coordinators:
795
+
796
+ 1. **Create Project Group** - Select repositories to group together
797
+ 2. **Enable Coordinator** - Start the coordinator agent
798
+ 3. **Disable Coordinator** - Stop the coordinator agent
799
+ 4. **Delete Project Group** - Remove the group and stop coordinator
800
+
801
+ For local bridge mode, the panel shows:
802
+ - "Spawn Architect" button (when in bridge mode with multiple projects)
803
+ - CLI selector (Claude, Claude Opus, Sonnet, Codex)
804
+ - Instructions for using `relay bridge --architect` flag