agent-relay 1.1.0 → 1.2.3

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 (567) hide show
  1. package/.gitattributes +3 -0
  2. package/.nvmrc +1 -0
  3. package/.trajectories/completed/2026-01/traj_1dviorhnkcb5.json +65 -0
  4. package/.trajectories/completed/2026-01/traj_1dviorhnkcb5.md +37 -0
  5. package/.trajectories/completed/2026-01/traj_1k5if5snst2e.json +65 -0
  6. package/.trajectories/completed/2026-01/traj_1k5if5snst2e.md +37 -0
  7. package/.trajectories/completed/2026-01/traj_1rp3rges5811.json +49 -0
  8. package/.trajectories/completed/2026-01/traj_1rp3rges5811.md +31 -0
  9. package/.trajectories/completed/2026-01/traj_22bhyulruouw.json +113 -0
  10. package/.trajectories/completed/2026-01/traj_22bhyulruouw.md +57 -0
  11. package/.trajectories/completed/2026-01/traj_2dao7ddgnta0.json +53 -0
  12. package/.trajectories/completed/2026-01/traj_2dao7ddgnta0.md +32 -0
  13. package/.trajectories/completed/2026-01/traj_3t0440mjeunc.json +26 -0
  14. package/.trajectories/completed/2026-01/traj_3t0440mjeunc.md +6 -0
  15. package/.trajectories/completed/2026-01/traj_45x9494d9xnr.json +47 -0
  16. package/.trajectories/completed/2026-01/traj_45x9494d9xnr.md +32 -0
  17. package/.trajectories/completed/2026-01/traj_4aa0bb77s4nh.json +53 -0
  18. package/.trajectories/completed/2026-01/traj_4aa0bb77s4nh.md +32 -0
  19. package/.trajectories/completed/2026-01/traj_5lhmzq8rxpqv.json +59 -0
  20. package/.trajectories/completed/2026-01/traj_5lhmzq8rxpqv.md +33 -0
  21. package/.trajectories/completed/2026-01/traj_5vr4e9erb1fs.json +53 -0
  22. package/.trajectories/completed/2026-01/traj_5vr4e9erb1fs.md +32 -0
  23. package/.trajectories/completed/2026-01/traj_6fgiwdoklvym.json +48 -0
  24. package/.trajectories/completed/2026-01/traj_6fgiwdoklvym.md +24 -0
  25. package/.trajectories/completed/2026-01/traj_7ludwvz45veh.json +209 -0
  26. package/.trajectories/completed/2026-01/traj_7ludwvz45veh.md +97 -0
  27. package/.trajectories/completed/2026-01/traj_9921cuhel0pj.json +48 -0
  28. package/.trajectories/completed/2026-01/traj_9921cuhel0pj.md +24 -0
  29. package/.trajectories/completed/2026-01/traj_ajs7zqfux4wc.json +49 -0
  30. package/.trajectories/completed/2026-01/traj_ajs7zqfux4wc.md +23 -0
  31. package/.trajectories/completed/2026-01/traj_cvtqhlwcq9s0.json +53 -0
  32. package/.trajectories/completed/2026-01/traj_cvtqhlwcq9s0.md +32 -0
  33. package/.trajectories/completed/2026-01/traj_cxofprm2m2en.json +49 -0
  34. package/.trajectories/completed/2026-01/traj_cxofprm2m2en.md +31 -0
  35. package/.trajectories/completed/2026-01/traj_d2hhz3k0vrhn.json +26 -0
  36. package/.trajectories/completed/2026-01/traj_d2hhz3k0vrhn.md +6 -0
  37. package/.trajectories/completed/2026-01/traj_dfuvww9pege5.json +59 -0
  38. package/.trajectories/completed/2026-01/traj_dfuvww9pege5.md +37 -0
  39. package/.trajectories/completed/2026-01/traj_g0fisy9h51mf.json +77 -0
  40. package/.trajectories/completed/2026-01/traj_g0fisy9h51mf.md +42 -0
  41. package/.trajectories/completed/2026-01/traj_gjdre5voouod.json +53 -0
  42. package/.trajectories/completed/2026-01/traj_gjdre5voouod.md +32 -0
  43. package/.trajectories/completed/2026-01/traj_gtlyqtta3x8l.json +25 -0
  44. package/.trajectories/completed/2026-01/traj_gtlyqtta3x8l.md +15 -0
  45. package/.trajectories/completed/2026-01/traj_h4xijiuip3w4.json +101 -0
  46. package/.trajectories/completed/2026-01/traj_h4xijiuip3w4.md +44 -0
  47. package/.trajectories/completed/2026-01/traj_hhxte7w4gjjx.json +22 -0
  48. package/.trajectories/completed/2026-01/traj_hhxte7w4gjjx.md +5 -0
  49. package/.trajectories/completed/2026-01/traj_hpungyhoj6v5.json +53 -0
  50. package/.trajectories/completed/2026-01/traj_hpungyhoj6v5.md +32 -0
  51. package/.trajectories/completed/2026-01/traj_m2xkjv0w2sq7.json +25 -0
  52. package/.trajectories/completed/2026-01/traj_m2xkjv0w2sq7.md +15 -0
  53. package/.trajectories/completed/2026-01/traj_noq5zbvnrdvz.json +53 -0
  54. package/.trajectories/completed/2026-01/traj_noq5zbvnrdvz.md +32 -0
  55. package/.trajectories/completed/2026-01/traj_ntbs6ppopf46.json +53 -0
  56. package/.trajectories/completed/2026-01/traj_ntbs6ppopf46.md +32 -0
  57. package/.trajectories/completed/2026-01/traj_ozd98si6a7ns.json +48 -0
  58. package/.trajectories/completed/2026-01/traj_ozd98si6a7ns.md +24 -0
  59. package/.trajectories/completed/2026-01/traj_prdza7a5cxp5.json +53 -0
  60. package/.trajectories/completed/2026-01/traj_prdza7a5cxp5.md +32 -0
  61. package/.trajectories/completed/2026-01/traj_qb3twvvywfwi.json +77 -0
  62. package/.trajectories/completed/2026-01/traj_qb3twvvywfwi.md +42 -0
  63. package/.trajectories/completed/2026-01/traj_qft54mi7nfor.json +53 -0
  64. package/.trajectories/completed/2026-01/traj_qft54mi7nfor.md +32 -0
  65. package/.trajectories/completed/2026-01/traj_qx9uhf8whhxo.json +83 -0
  66. package/.trajectories/completed/2026-01/traj_qx9uhf8whhxo.md +47 -0
  67. package/.trajectories/completed/2026-01/traj_rd9toccj18a0.json +59 -0
  68. package/.trajectories/completed/2026-01/traj_rd9toccj18a0.md +37 -0
  69. package/.trajectories/completed/2026-01/traj_rt4fiw3ecp50.json +48 -0
  70. package/.trajectories/completed/2026-01/traj_rt4fiw3ecp50.md +16 -0
  71. package/.trajectories/completed/2026-01/traj_st8j35b0hrlc.json +59 -0
  72. package/.trajectories/completed/2026-01/traj_st8j35b0hrlc.md +37 -0
  73. package/.trajectories/completed/2026-01/traj_t1yy8m7hbuxp.json +53 -0
  74. package/.trajectories/completed/2026-01/traj_t1yy8m7hbuxp.md +32 -0
  75. package/.trajectories/completed/2026-01/traj_tmux_orchestrator_analysis.json +84 -0
  76. package/.trajectories/completed/2026-01/traj_tmux_orchestrator_analysis.md +109 -0
  77. package/.trajectories/completed/2026-01/traj_u9n9eqasw16k.json +53 -0
  78. package/.trajectories/completed/2026-01/traj_u9n9eqasw16k.md +32 -0
  79. package/.trajectories/completed/2026-01/traj_v87hypnongqx.json +71 -0
  80. package/.trajectories/completed/2026-01/traj_v87hypnongqx.md +42 -0
  81. package/.trajectories/completed/2026-01/traj_wkp2fgzdyinb.json +53 -0
  82. package/.trajectories/completed/2026-01/traj_wkp2fgzdyinb.md +32 -0
  83. package/.trajectories/completed/2026-01/traj_x14t8w8rn7xg.json +20 -0
  84. package/.trajectories/completed/2026-01/traj_x14t8w8rn7xg.md +6 -0
  85. package/.trajectories/completed/2026-01/traj_xnwbznkvv8ua.json +175 -0
  86. package/.trajectories/completed/2026-01/traj_xnwbznkvv8ua.md +82 -0
  87. package/.trajectories/completed/2026-01/traj_ysjc8zaeqtd3.json +47 -0
  88. package/.trajectories/completed/2026-01/traj_ysjc8zaeqtd3.md +32 -0
  89. package/.trajectories/completed/2026-01/traj_yvdadtvdgnz3.json +59 -0
  90. package/.trajectories/completed/2026-01/traj_yvdadtvdgnz3.md +37 -0
  91. package/.trajectories/completed/2026-01/traj_z0vcw1wrzide.json +53 -0
  92. package/.trajectories/completed/2026-01/traj_z0vcw1wrzide.md +32 -0
  93. package/.trajectories/index.json +314 -0
  94. package/ARCHITECTURE.md +1245 -0
  95. package/README.md +1 -1
  96. package/TESTING.md +278 -0
  97. package/deploy/init-db.sql +5 -0
  98. package/deploy/scripts/setup-fly-workspaces.sh +69 -0
  99. package/deploy/scripts/setup-railway.sh +75 -0
  100. package/deploy/workspace/entrypoint-browser.sh +118 -0
  101. package/deploy/workspace/entrypoint.sh +348 -0
  102. package/deploy/workspace/git-credential-relay +111 -0
  103. package/dist/bridge/spawner.d.ts +53 -0
  104. package/dist/bridge/spawner.js +203 -19
  105. package/dist/bridge/types.d.ts +12 -0
  106. package/dist/cli/index.js +618 -5
  107. package/dist/cloud/api/auth.d.ts +3 -2
  108. package/dist/cloud/api/auth.js +10 -98
  109. package/dist/cloud/api/billing.js +30 -9
  110. package/dist/cloud/api/cli-pty-runner.d.ts +54 -0
  111. package/dist/cloud/api/cli-pty-runner.js +119 -0
  112. package/dist/cloud/api/codex-auth-helper.d.ts +15 -0
  113. package/dist/cloud/api/codex-auth-helper.js +100 -0
  114. package/dist/cloud/api/generic-webhooks.d.ts +8 -0
  115. package/dist/cloud/api/generic-webhooks.js +129 -0
  116. package/dist/cloud/api/git.d.ts +8 -0
  117. package/dist/cloud/api/git.js +152 -0
  118. package/dist/cloud/api/github-app.d.ts +11 -0
  119. package/dist/cloud/api/github-app.js +189 -0
  120. package/dist/cloud/api/middleware/planLimits.d.ts +7 -0
  121. package/dist/cloud/api/middleware/planLimits.js +39 -1
  122. package/dist/cloud/api/monitoring.d.ts +11 -0
  123. package/dist/cloud/api/monitoring.js +578 -0
  124. package/dist/cloud/api/nango-auth.d.ts +9 -0
  125. package/dist/cloud/api/nango-auth.js +377 -0
  126. package/dist/cloud/api/onboarding.d.ts +8 -1
  127. package/dist/cloud/api/onboarding.js +313 -119
  128. package/dist/cloud/api/policy.d.ts +8 -0
  129. package/dist/cloud/api/policy.js +229 -0
  130. package/dist/cloud/api/providers.js +114 -42
  131. package/dist/cloud/api/repos.d.ts +1 -0
  132. package/dist/cloud/api/repos.js +186 -0
  133. package/dist/cloud/api/test-helpers.d.ts +10 -0
  134. package/dist/cloud/api/test-helpers.js +575 -0
  135. package/dist/cloud/api/webhooks.d.ts +8 -0
  136. package/dist/cloud/api/webhooks.js +645 -0
  137. package/dist/cloud/api/workspaces.js +320 -12
  138. package/dist/cloud/billing/plans.js +32 -19
  139. package/dist/cloud/billing/types.d.ts +9 -3
  140. package/dist/cloud/config.d.ts +9 -2
  141. package/dist/cloud/config.js +13 -4
  142. package/dist/cloud/db/drizzle.d.ts +84 -1
  143. package/dist/cloud/db/drizzle.js +470 -0
  144. package/dist/cloud/db/index.d.ts +9 -4
  145. package/dist/cloud/db/index.js +11 -3
  146. package/dist/cloud/db/schema.d.ts +3283 -556
  147. package/dist/cloud/db/schema.js +314 -1
  148. package/dist/cloud/index.d.ts +1 -0
  149. package/dist/cloud/index.js +2 -0
  150. package/dist/cloud/provisioner/index.d.ts +56 -0
  151. package/dist/cloud/provisioner/index.js +676 -34
  152. package/dist/cloud/server.d.ts +1 -0
  153. package/dist/cloud/server.js +362 -13
  154. package/dist/cloud/services/auto-scaler.d.ts +152 -0
  155. package/dist/cloud/services/auto-scaler.js +439 -0
  156. package/dist/cloud/services/capacity-manager.d.ts +148 -0
  157. package/dist/cloud/services/capacity-manager.js +449 -0
  158. package/dist/cloud/services/ci-agent-spawner.d.ts +49 -0
  159. package/dist/cloud/services/ci-agent-spawner.js +373 -0
  160. package/dist/cloud/services/index.d.ts +12 -0
  161. package/dist/cloud/services/index.js +15 -0
  162. package/dist/cloud/services/mention-handler.d.ts +65 -0
  163. package/dist/cloud/services/mention-handler.js +405 -0
  164. package/dist/cloud/services/nango.d.ts +186 -0
  165. package/dist/cloud/services/nango.js +344 -0
  166. package/dist/cloud/services/persistence.d.ts +131 -0
  167. package/dist/cloud/services/persistence.js +200 -0
  168. package/dist/cloud/services/planLimits.d.ts +37 -0
  169. package/dist/cloud/services/planLimits.js +86 -5
  170. package/dist/cloud/services/scaling-orchestrator.d.ts +159 -0
  171. package/dist/cloud/services/scaling-orchestrator.js +502 -0
  172. package/dist/cloud/services/scaling-policy.d.ts +121 -0
  173. package/dist/cloud/services/scaling-policy.js +415 -0
  174. package/dist/cloud/vault/index.js +1 -1
  175. package/dist/cloud/webhooks/index.d.ts +24 -0
  176. package/dist/cloud/webhooks/index.js +29 -0
  177. package/dist/cloud/webhooks/parsers/github.d.ts +8 -0
  178. package/dist/cloud/webhooks/parsers/github.js +234 -0
  179. package/dist/cloud/webhooks/parsers/index.d.ts +23 -0
  180. package/dist/cloud/webhooks/parsers/index.js +30 -0
  181. package/dist/cloud/webhooks/parsers/linear.d.ts +9 -0
  182. package/dist/cloud/webhooks/parsers/linear.js +258 -0
  183. package/dist/cloud/webhooks/parsers/slack.d.ts +9 -0
  184. package/dist/cloud/webhooks/parsers/slack.js +214 -0
  185. package/dist/cloud/webhooks/responders/github.d.ts +8 -0
  186. package/dist/cloud/webhooks/responders/github.js +73 -0
  187. package/dist/cloud/webhooks/responders/index.d.ts +23 -0
  188. package/dist/cloud/webhooks/responders/index.js +30 -0
  189. package/dist/cloud/webhooks/responders/linear.d.ts +9 -0
  190. package/dist/cloud/webhooks/responders/linear.js +149 -0
  191. package/dist/cloud/webhooks/responders/slack.d.ts +20 -0
  192. package/dist/cloud/webhooks/responders/slack.js +178 -0
  193. package/dist/cloud/webhooks/router.d.ts +25 -0
  194. package/dist/cloud/webhooks/router.js +504 -0
  195. package/dist/cloud/webhooks/rules-engine.d.ts +24 -0
  196. package/dist/cloud/webhooks/rules-engine.js +287 -0
  197. package/dist/cloud/webhooks/types.d.ts +186 -0
  198. package/dist/cloud/webhooks/types.js +8 -0
  199. package/dist/continuity/formatter.d.ts +51 -0
  200. package/dist/continuity/formatter.js +313 -0
  201. package/dist/continuity/handoff-store.d.ts +67 -0
  202. package/dist/continuity/handoff-store.js +472 -0
  203. package/dist/continuity/index.d.ts +45 -0
  204. package/dist/continuity/index.js +48 -0
  205. package/dist/continuity/ledger-store.d.ts +110 -0
  206. package/dist/continuity/ledger-store.js +500 -0
  207. package/dist/continuity/manager.d.ts +178 -0
  208. package/dist/continuity/manager.js +562 -0
  209. package/dist/continuity/parser.d.ts +76 -0
  210. package/dist/continuity/parser.js +579 -0
  211. package/dist/continuity/types.d.ts +180 -0
  212. package/dist/continuity/types.js +9 -0
  213. package/dist/daemon/agent-manager.d.ts +27 -0
  214. package/dist/daemon/agent-manager.js +107 -6
  215. package/dist/daemon/agent-registry.d.ts +32 -0
  216. package/dist/daemon/agent-registry.js +42 -2
  217. package/dist/daemon/api.d.ts +12 -0
  218. package/dist/daemon/api.js +131 -2
  219. package/dist/daemon/cli-auth.d.ts +67 -0
  220. package/dist/daemon/cli-auth.js +537 -0
  221. package/dist/daemon/cloud-sync.js +9 -7
  222. package/dist/daemon/orchestrator.js +30 -0
  223. package/dist/daemon/router.d.ts +5 -0
  224. package/dist/daemon/router.js +78 -26
  225. package/dist/daemon/server.d.ts +5 -0
  226. package/dist/daemon/server.js +9 -1
  227. package/dist/daemon/services/browser-testing.d.ts +88 -0
  228. package/dist/daemon/services/browser-testing.js +244 -0
  229. package/dist/daemon/services/container-spawner.d.ts +135 -0
  230. package/dist/daemon/services/container-spawner.js +313 -0
  231. package/dist/daemon/types.d.ts +5 -1
  232. package/dist/dashboard/out/404.html +1 -1
  233. package/dist/dashboard/out/_next/static/chunks/116-2502180def231162.js +1 -0
  234. package/dist/dashboard/out/_next/static/chunks/282-980c2eb8fff20123.js +1 -0
  235. package/dist/dashboard/out/_next/static/chunks/699-3b1cd6618a45d259.js +1 -0
  236. package/dist/dashboard/out/_next/static/chunks/724-2dae7627550ab88f.js +9 -0
  237. package/dist/dashboard/out/_next/static/chunks/766-1f2dd8cb7f766b0b.js +1 -0
  238. package/dist/dashboard/out/_next/static/chunks/app/app/onboarding/page-3fdfa60e53f2810d.js +1 -0
  239. package/dist/dashboard/out/_next/static/chunks/app/app/page-e6381e5a6e1fbcfd.js +1 -0
  240. package/dist/dashboard/out/_next/static/chunks/app/connect-repos/page-3538dfe0ffe984b8.js +1 -0
  241. package/dist/dashboard/out/_next/static/chunks/app/history/{page-b6edd4dde8d08194.js → page-abb9ab2d329f56e9.js} +1 -1
  242. package/dist/dashboard/out/_next/static/chunks/app/layout-c0d118c0f92d969c.js +1 -0
  243. package/dist/dashboard/out/_next/static/chunks/app/login/page-c22d080201cbd9fb.js +1 -0
  244. package/dist/dashboard/out/_next/static/chunks/app/metrics/page-67a3e98d9a43a6ed.js +1 -0
  245. package/dist/dashboard/out/_next/static/chunks/app/page-77e9c65420a06cfb.js +1 -0
  246. package/dist/dashboard/out/_next/static/chunks/app/pricing/page-b08ed1c34d14434a.js +1 -0
  247. package/dist/dashboard/out/_next/static/chunks/app/providers/page-e88bc117ef7671c3.js +1 -0
  248. package/dist/dashboard/out/_next/static/chunks/app/signup/page-68d34f50baa8ab6b.js +1 -0
  249. package/dist/dashboard/out/_next/static/chunks/e868780c-48e5f147c90a3a41.js +18 -0
  250. package/dist/dashboard/out/_next/static/chunks/{main-app-5d692157a8eb1fd9.js → main-app-6e8e8d3ef4e0192a.js} +1 -1
  251. package/dist/dashboard/out/_next/static/chunks/{main-c2f423b9c9f4591b.js → main-ed4e1fb6f29c34cf.js} +1 -1
  252. package/dist/dashboard/out/_next/static/chunks/webpack-1cdd8ed57114d5e1.js +1 -0
  253. package/dist/dashboard/out/_next/static/css/29852f26181969a0.css +1 -0
  254. package/dist/dashboard/out/_next/static/css/7c3ae9e8617d42a5.css +1 -0
  255. package/dist/dashboard/out/app/onboarding.html +1 -0
  256. package/dist/dashboard/out/app/onboarding.txt +7 -0
  257. package/dist/dashboard/out/app.html +1 -14
  258. package/dist/dashboard/out/app.txt +2 -2
  259. package/dist/dashboard/out/connect-repos.html +1 -0
  260. package/dist/dashboard/out/connect-repos.txt +7 -0
  261. package/dist/dashboard/out/history.html +1 -1
  262. package/dist/dashboard/out/history.txt +2 -2
  263. package/dist/dashboard/out/index.html +1 -1
  264. package/dist/dashboard/out/index.txt +2 -2
  265. package/dist/dashboard/out/login.html +6 -0
  266. package/dist/dashboard/out/login.txt +7 -0
  267. package/dist/dashboard/out/metrics.html +1 -1
  268. package/dist/dashboard/out/metrics.txt +2 -2
  269. package/dist/dashboard/out/pricing.html +3 -3
  270. package/dist/dashboard/out/pricing.txt +2 -2
  271. package/dist/dashboard/out/providers.html +1 -0
  272. package/dist/dashboard/out/providers.txt +7 -0
  273. package/dist/dashboard/out/signup.html +6 -0
  274. package/dist/dashboard/out/signup.txt +7 -0
  275. package/dist/dashboard-server/server.js +1308 -8
  276. package/dist/hooks/emitter.d.ts +40 -0
  277. package/dist/hooks/emitter.js +63 -0
  278. package/dist/hooks/index.d.ts +3 -0
  279. package/dist/hooks/index.js +3 -0
  280. package/dist/hooks/registry.d.ts +173 -0
  281. package/dist/hooks/registry.js +476 -0
  282. package/dist/hooks/trajectory-hooks.d.ts +52 -0
  283. package/dist/hooks/trajectory-hooks.js +183 -0
  284. package/dist/hooks/types.d.ts +141 -0
  285. package/dist/index.d.ts +2 -0
  286. package/dist/index.js +3 -0
  287. package/dist/memory/adapters/index.d.ts +8 -0
  288. package/dist/memory/adapters/index.js +8 -0
  289. package/dist/memory/adapters/inmemory.d.ts +59 -0
  290. package/dist/memory/adapters/inmemory.js +195 -0
  291. package/dist/memory/adapters/supermemory.d.ts +71 -0
  292. package/dist/memory/adapters/supermemory.js +338 -0
  293. package/dist/memory/factory.d.ts +48 -0
  294. package/dist/memory/factory.js +143 -0
  295. package/dist/memory/index.d.ts +32 -0
  296. package/dist/memory/index.js +32 -0
  297. package/dist/memory/memory-hooks.d.ts +60 -0
  298. package/dist/memory/memory-hooks.js +313 -0
  299. package/dist/memory/service.d.ts +49 -0
  300. package/dist/memory/service.js +146 -0
  301. package/dist/memory/types.d.ts +195 -0
  302. package/dist/memory/types.js +8 -0
  303. package/dist/policy/agent-policy.d.ts +225 -0
  304. package/dist/policy/agent-policy.js +665 -0
  305. package/dist/policy/cloud-policy-fetcher.d.ts +12 -0
  306. package/dist/policy/cloud-policy-fetcher.js +64 -0
  307. package/dist/resiliency/crash-insights.d.ts +156 -0
  308. package/dist/resiliency/crash-insights.js +492 -0
  309. package/dist/resiliency/gossip-health.d.ts +137 -0
  310. package/dist/resiliency/gossip-health.js +241 -0
  311. package/dist/resiliency/index.d.ts +5 -0
  312. package/dist/resiliency/index.js +5 -0
  313. package/dist/resiliency/leader-watchdog.d.ts +109 -0
  314. package/dist/resiliency/leader-watchdog.js +189 -0
  315. package/dist/resiliency/memory-monitor.d.ts +172 -0
  316. package/dist/resiliency/memory-monitor.js +593 -0
  317. package/dist/resiliency/stateless-lead.d.ts +149 -0
  318. package/dist/resiliency/stateless-lead.js +308 -0
  319. package/dist/resiliency/supervisor.d.ts +38 -0
  320. package/dist/resiliency/supervisor.js +122 -0
  321. package/dist/shared/cli-auth-config.d.ts +91 -0
  322. package/dist/shared/cli-auth-config.js +264 -0
  323. package/dist/storage/adapter.d.ts +1 -1
  324. package/dist/trajectory/config.d.ts +84 -0
  325. package/dist/trajectory/config.js +163 -0
  326. package/dist/trajectory/index.d.ts +8 -0
  327. package/dist/trajectory/index.js +8 -0
  328. package/dist/trajectory/integration.d.ts +292 -0
  329. package/dist/trajectory/integration.js +834 -0
  330. package/dist/utils/logger.js +1 -1
  331. package/dist/utils/project-namespace.d.ts +24 -0
  332. package/dist/utils/project-namespace.js +84 -0
  333. package/dist/wrapper/parser.d.ts +10 -0
  334. package/dist/wrapper/parser.js +100 -33
  335. package/dist/wrapper/pty-wrapper.d.ts +197 -16
  336. package/dist/wrapper/pty-wrapper.js +943 -106
  337. package/dist/wrapper/shared.d.ts +165 -0
  338. package/dist/wrapper/shared.js +270 -0
  339. package/dist/wrapper/tmux-wrapper.d.ts +73 -11
  340. package/dist/wrapper/tmux-wrapper.js +541 -120
  341. package/package.json +16 -16
  342. package/scripts/postinstall.js +60 -0
  343. package/test-push.txt +1 -0
  344. package/bin/tmux +0 -0
  345. package/dist/bridge/config.d.ts.map +0 -1
  346. package/dist/bridge/config.js.map +0 -1
  347. package/dist/bridge/index.d.ts.map +0 -1
  348. package/dist/bridge/index.js.map +0 -1
  349. package/dist/bridge/multi-project-client.d.ts.map +0 -1
  350. package/dist/bridge/multi-project-client.js.map +0 -1
  351. package/dist/bridge/shadow-cli.d.ts.map +0 -1
  352. package/dist/bridge/shadow-cli.js.map +0 -1
  353. package/dist/bridge/shadow-config.d.ts.map +0 -1
  354. package/dist/bridge/shadow-config.js.map +0 -1
  355. package/dist/bridge/spawner.d.ts.map +0 -1
  356. package/dist/bridge/spawner.js.map +0 -1
  357. package/dist/bridge/teams-config.d.ts.map +0 -1
  358. package/dist/bridge/teams-config.js.map +0 -1
  359. package/dist/bridge/types.d.ts.map +0 -1
  360. package/dist/bridge/types.js.map +0 -1
  361. package/dist/bridge/utils.d.ts.map +0 -1
  362. package/dist/bridge/utils.js.map +0 -1
  363. package/dist/cli/index.d.ts.map +0 -1
  364. package/dist/cli/index.js.map +0 -1
  365. package/dist/cloud/api/auth.d.ts.map +0 -1
  366. package/dist/cloud/api/auth.js.map +0 -1
  367. package/dist/cloud/api/billing.d.ts.map +0 -1
  368. package/dist/cloud/api/billing.js.map +0 -1
  369. package/dist/cloud/api/coordinators.d.ts.map +0 -1
  370. package/dist/cloud/api/coordinators.js.map +0 -1
  371. package/dist/cloud/api/daemons.d.ts.map +0 -1
  372. package/dist/cloud/api/daemons.js.map +0 -1
  373. package/dist/cloud/api/middleware/planLimits.d.ts.map +0 -1
  374. package/dist/cloud/api/middleware/planLimits.js.map +0 -1
  375. package/dist/cloud/api/onboarding.d.ts.map +0 -1
  376. package/dist/cloud/api/onboarding.js.map +0 -1
  377. package/dist/cloud/api/providers.d.ts.map +0 -1
  378. package/dist/cloud/api/providers.js.map +0 -1
  379. package/dist/cloud/api/repos.d.ts.map +0 -1
  380. package/dist/cloud/api/repos.js.map +0 -1
  381. package/dist/cloud/api/teams.d.ts.map +0 -1
  382. package/dist/cloud/api/teams.js.map +0 -1
  383. package/dist/cloud/api/usage.d.ts.map +0 -1
  384. package/dist/cloud/api/usage.js.map +0 -1
  385. package/dist/cloud/api/workspaces.d.ts.map +0 -1
  386. package/dist/cloud/api/workspaces.js.map +0 -1
  387. package/dist/cloud/billing/index.d.ts.map +0 -1
  388. package/dist/cloud/billing/index.js.map +0 -1
  389. package/dist/cloud/billing/plans.d.ts.map +0 -1
  390. package/dist/cloud/billing/plans.js.map +0 -1
  391. package/dist/cloud/billing/service.d.ts.map +0 -1
  392. package/dist/cloud/billing/service.js.map +0 -1
  393. package/dist/cloud/billing/types.d.ts.map +0 -1
  394. package/dist/cloud/billing/types.js.map +0 -1
  395. package/dist/cloud/config.d.ts.map +0 -1
  396. package/dist/cloud/config.js.map +0 -1
  397. package/dist/cloud/db/drizzle.d.ts.map +0 -1
  398. package/dist/cloud/db/drizzle.js.map +0 -1
  399. package/dist/cloud/db/index.d.ts.map +0 -1
  400. package/dist/cloud/db/index.js.map +0 -1
  401. package/dist/cloud/db/schema.d.ts.map +0 -1
  402. package/dist/cloud/db/schema.js.map +0 -1
  403. package/dist/cloud/index.d.ts.map +0 -1
  404. package/dist/cloud/index.js.map +0 -1
  405. package/dist/cloud/provisioner/index.d.ts.map +0 -1
  406. package/dist/cloud/provisioner/index.js.map +0 -1
  407. package/dist/cloud/server.d.ts.map +0 -1
  408. package/dist/cloud/server.js.map +0 -1
  409. package/dist/cloud/services/coordinator.d.ts.map +0 -1
  410. package/dist/cloud/services/coordinator.js.map +0 -1
  411. package/dist/cloud/services/planLimits.d.ts.map +0 -1
  412. package/dist/cloud/services/planLimits.js.map +0 -1
  413. package/dist/cloud/vault/index.d.ts.map +0 -1
  414. package/dist/cloud/vault/index.js.map +0 -1
  415. package/dist/daemon/agent-manager.d.ts.map +0 -1
  416. package/dist/daemon/agent-manager.js.map +0 -1
  417. package/dist/daemon/agent-registry.d.ts.map +0 -1
  418. package/dist/daemon/agent-registry.js.map +0 -1
  419. package/dist/daemon/api.d.ts.map +0 -1
  420. package/dist/daemon/api.js.map +0 -1
  421. package/dist/daemon/auth.d.ts.map +0 -1
  422. package/dist/daemon/auth.js.map +0 -1
  423. package/dist/daemon/cloud-sync.d.ts.map +0 -1
  424. package/dist/daemon/cloud-sync.js.map +0 -1
  425. package/dist/daemon/connection.d.ts.map +0 -1
  426. package/dist/daemon/connection.js.map +0 -1
  427. package/dist/daemon/index.d.ts.map +0 -1
  428. package/dist/daemon/index.js.map +0 -1
  429. package/dist/daemon/orchestrator.d.ts.map +0 -1
  430. package/dist/daemon/orchestrator.js.map +0 -1
  431. package/dist/daemon/registry.d.ts.map +0 -1
  432. package/dist/daemon/registry.js.map +0 -1
  433. package/dist/daemon/router.d.ts.map +0 -1
  434. package/dist/daemon/router.js.map +0 -1
  435. package/dist/daemon/server.d.ts.map +0 -1
  436. package/dist/daemon/server.js.map +0 -1
  437. package/dist/daemon/types.d.ts.map +0 -1
  438. package/dist/daemon/types.js.map +0 -1
  439. package/dist/daemon/workspace-manager.d.ts.map +0 -1
  440. package/dist/daemon/workspace-manager.js.map +0 -1
  441. package/dist/dashboard/out/_next/static/chunks/693-7b3301d8f6bc5014.js +0 -1
  442. package/dist/dashboard/out/_next/static/chunks/713-f78477eb185f1f4d.js +0 -1
  443. package/dist/dashboard/out/_next/static/chunks/766-e53e1cfe39b0b5b5.js +0 -1
  444. package/dist/dashboard/out/_next/static/chunks/900-037c64bfd797fb2a.js +0 -1
  445. package/dist/dashboard/out/_next/static/chunks/app/app/page-e3d9e1f4466b9bae.js +0 -1
  446. package/dist/dashboard/out/_next/static/chunks/app/layout-2433bb48965f4333.js +0 -1
  447. package/dist/dashboard/out/_next/static/chunks/app/metrics/page-e68825a81db67ba1.js +0 -1
  448. package/dist/dashboard/out/_next/static/chunks/app/page-cc108bf68c8a657f.js +0 -1
  449. package/dist/dashboard/out/_next/static/chunks/app/pricing/page-d80e03a5297f95b6.js +0 -1
  450. package/dist/dashboard/out/_next/static/chunks/webpack-a5acc2831d094776.js +0 -1
  451. package/dist/dashboard/out/_next/static/css/79b80143647a07d7.css +0 -1
  452. package/dist/dashboard/out/_next/static/css/8cf277370ad48cfe.css +0 -1
  453. package/dist/dashboard-server/metrics.d.ts.map +0 -1
  454. package/dist/dashboard-server/metrics.js.map +0 -1
  455. package/dist/dashboard-server/needs-attention.d.ts.map +0 -1
  456. package/dist/dashboard-server/needs-attention.js.map +0 -1
  457. package/dist/dashboard-server/server.d.ts.map +0 -1
  458. package/dist/dashboard-server/server.js.map +0 -1
  459. package/dist/dashboard-server/start.d.ts.map +0 -1
  460. package/dist/dashboard-server/start.js.map +0 -1
  461. package/dist/hooks/inbox-check/hook.d.ts.map +0 -1
  462. package/dist/hooks/inbox-check/hook.js.map +0 -1
  463. package/dist/hooks/inbox-check/index.d.ts.map +0 -1
  464. package/dist/hooks/inbox-check/index.js.map +0 -1
  465. package/dist/hooks/inbox-check/types.d.ts.map +0 -1
  466. package/dist/hooks/inbox-check/types.js.map +0 -1
  467. package/dist/hooks/inbox-check/utils.d.ts.map +0 -1
  468. package/dist/hooks/inbox-check/utils.js.map +0 -1
  469. package/dist/hooks/index.d.ts.map +0 -1
  470. package/dist/hooks/index.js.map +0 -1
  471. package/dist/hooks/types.d.ts.map +0 -1
  472. package/dist/hooks/types.js.map +0 -1
  473. package/dist/index.d.ts.map +0 -1
  474. package/dist/index.js.map +0 -1
  475. package/dist/protocol/framing.d.ts.map +0 -1
  476. package/dist/protocol/framing.js.map +0 -1
  477. package/dist/protocol/index.d.ts.map +0 -1
  478. package/dist/protocol/index.js.map +0 -1
  479. package/dist/protocol/types.d.ts.map +0 -1
  480. package/dist/protocol/types.js.map +0 -1
  481. package/dist/resiliency/context-persistence.d.ts.map +0 -1
  482. package/dist/resiliency/context-persistence.js.map +0 -1
  483. package/dist/resiliency/health-monitor.d.ts.map +0 -1
  484. package/dist/resiliency/health-monitor.js.map +0 -1
  485. package/dist/resiliency/index.d.ts.map +0 -1
  486. package/dist/resiliency/index.js.map +0 -1
  487. package/dist/resiliency/logger.d.ts.map +0 -1
  488. package/dist/resiliency/logger.js.map +0 -1
  489. package/dist/resiliency/metrics.d.ts.map +0 -1
  490. package/dist/resiliency/metrics.js.map +0 -1
  491. package/dist/resiliency/provider-context.d.ts.map +0 -1
  492. package/dist/resiliency/provider-context.js.map +0 -1
  493. package/dist/resiliency/supervisor.d.ts.map +0 -1
  494. package/dist/resiliency/supervisor.js.map +0 -1
  495. package/dist/state/agent-state.d.ts.map +0 -1
  496. package/dist/state/agent-state.js.map +0 -1
  497. package/dist/storage/adapter.d.ts.map +0 -1
  498. package/dist/storage/adapter.js.map +0 -1
  499. package/dist/storage/sqlite-adapter.d.ts.map +0 -1
  500. package/dist/storage/sqlite-adapter.js.map +0 -1
  501. package/dist/utils/agent-config.d.ts.map +0 -1
  502. package/dist/utils/agent-config.js.map +0 -1
  503. package/dist/utils/command-resolver.d.ts.map +0 -1
  504. package/dist/utils/command-resolver.js.map +0 -1
  505. package/dist/utils/index.d.ts.map +0 -1
  506. package/dist/utils/index.js.map +0 -1
  507. package/dist/utils/logger.d.ts.map +0 -1
  508. package/dist/utils/logger.js.map +0 -1
  509. package/dist/utils/name-generator.d.ts.map +0 -1
  510. package/dist/utils/name-generator.js.map +0 -1
  511. package/dist/utils/project-namespace.d.ts.map +0 -1
  512. package/dist/utils/project-namespace.js.map +0 -1
  513. package/dist/utils/tmux-resolver.d.ts.map +0 -1
  514. package/dist/utils/tmux-resolver.js.map +0 -1
  515. package/dist/utils/update-checker.d.ts.map +0 -1
  516. package/dist/utils/update-checker.js.map +0 -1
  517. package/dist/wrapper/client.d.ts.map +0 -1
  518. package/dist/wrapper/client.js.map +0 -1
  519. package/dist/wrapper/inbox.d.ts.map +0 -1
  520. package/dist/wrapper/inbox.js.map +0 -1
  521. package/dist/wrapper/index.d.ts.map +0 -1
  522. package/dist/wrapper/index.js.map +0 -1
  523. package/dist/wrapper/parser.d.ts.map +0 -1
  524. package/dist/wrapper/parser.js.map +0 -1
  525. package/dist/wrapper/pty-wrapper.d.ts.map +0 -1
  526. package/dist/wrapper/pty-wrapper.js.map +0 -1
  527. package/dist/wrapper/tmux-wrapper.d.ts.map +0 -1
  528. package/dist/wrapper/tmux-wrapper.js.map +0 -1
  529. package/docs/AGENTS.md +0 -513
  530. package/docs/ARCHITECTURE_DECISIONS.md +0 -175
  531. package/docs/CHANGELOG.md +0 -11
  532. package/docs/CLI-SIMPLIFICATION-COMPLETE.md +0 -48
  533. package/docs/CLOUD-ARCHITECTURE.md +0 -652
  534. package/docs/CLOUD-ONBOARDING-DESIGN.md +0 -1983
  535. package/docs/COMPETITIVE_ANALYSIS.md +0 -897
  536. package/docs/CONTRIBUTING.md +0 -151
  537. package/docs/DESIGN_BRIDGE_STAFFING.md +0 -878
  538. package/docs/DESIGN_V2.md +0 -1079
  539. package/docs/INTEGRATION-GUIDE.md +0 -926
  540. package/docs/MONETIZATION.md +0 -1679
  541. package/docs/PROPOSAL-trajectories.md +0 -1582
  542. package/docs/PROTOCOL.md +0 -325
  543. package/docs/SCALING_ANALYSIS.md +0 -280
  544. package/docs/TESTING_PRESENCE_FEATURES.md +0 -327
  545. package/docs/TMUX_IMPLEMENTATION_NOTES.md +0 -364
  546. package/docs/TMUX_IMPROVEMENTS.md +0 -968
  547. package/docs/agent-relay-snippet.md +0 -168
  548. package/docs/competitive-analysis-mcp-agent-mail.md +0 -389
  549. package/docs/dashboard-v2-plan.md +0 -179
  550. package/docs/guides/CLOUD.md +0 -236
  551. package/docs/guides/LOCAL.md +0 -535
  552. package/docs/guides/SELF-HOSTED.md +0 -494
  553. package/docs/proposals/shadow-as-subagent.md +0 -765
  554. package/docs/proposals/slack-bot-integration.md +0 -1457
  555. package/docs/removable-code-analysis.md +0 -24
  556. package/scripts/dev/PUBLIC_RELEASE_PLAN.md +0 -88
  557. package/scripts/dev/dev-team-setup.sh +0 -431
  558. package/scripts/e2e-test.sh +0 -119
  559. package/scripts/games/game-protocol.md +0 -79
  560. package/scripts/games/hearts-setup.sh +0 -264
  561. package/scripts/tictactoe-setup.sh +0 -181
  562. /package/dist/dashboard/out/_next/static/chunks/{117-b2cd8d6485aacf2b.js → 117-f7b8ab0809342e77.js} +0 -0
  563. /package/dist/dashboard/out/_next/static/chunks/{648-8f3f26864ce515e5.js → 648-5cc6e1921389a58a.js} +0 -0
  564. /package/dist/dashboard/out/_next/static/chunks/app/_not-found/{page-0b990dbb71d72a98.js → page-53b8a69f76db17d0.js} +0 -0
  565. /package/dist/dashboard/out/_next/static/chunks/{fd9d1056-bf46c09eb57e019c.js → fd9d1056-609918ca7b6280bb.js} +0 -0
  566. /package/dist/dashboard/out/_next/static/{6HHWb2ZmnJ4OSm0zUP7h4 → wPgKJtcOmTFLpUncDg16A}/_buildManifest.js +0 -0
  567. /package/dist/dashboard/out/_next/static/{6HHWb2ZmnJ4OSm0zUP7h4 → wPgKJtcOmTFLpUncDg16A}/_ssgManifest.js +0 -0
@@ -0,0 +1,348 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -euo pipefail
4
+
5
+ log() {
6
+ echo "[workspace] $*"
7
+ }
8
+
9
+ # Drop to workspace user if running as root
10
+ if [[ "$(id -u)" == "0" ]]; then
11
+ log "Dropping privileges to workspace user..."
12
+ exec gosu workspace "$0" "$@"
13
+ fi
14
+
15
+ PORT="${AGENT_RELAY_DASHBOARD_PORT:-${PORT:-3888}}"
16
+ export AGENT_RELAY_DASHBOARD_PORT="${PORT}"
17
+ export PORT="${PORT}"
18
+
19
+ WORKSPACE_DIR="${WORKSPACE_DIR:-/workspace}"
20
+ REPO_LIST="${REPOSITORIES:-}"
21
+
22
+ mkdir -p "${WORKSPACE_DIR}"
23
+ cd "${WORKSPACE_DIR}"
24
+
25
+ # Configure Git credentials via the gateway (tokens auto-refresh via Nango)
26
+ # The credential helper fetches fresh tokens from the cloud API on each git operation
27
+ if [[ -n "${CLOUD_API_URL:-}" && -n "${WORKSPACE_ID:-}" && -n "${WORKSPACE_TOKEN:-}" ]]; then
28
+ log "Configuring git credential helper (gateway mode)"
29
+ git config --global credential.helper "/usr/local/bin/git-credential-relay"
30
+ git config --global credential.useHttpPath true
31
+ export GIT_TERMINAL_PROMPT=0
32
+
33
+ # Configure git identity for commits
34
+ # Use env vars if set, otherwise default to "Agent Relay" / "agent@agent-relay.com"
35
+ DEFAULT_GIT_EMAIL="${AGENT_NAME:-agent}@agent-relay.com"
36
+ git config --global user.name "${GIT_USER_NAME:-Agent Relay}"
37
+ git config --global user.email "${GIT_USER_EMAIL:-${DEFAULT_GIT_EMAIL}}"
38
+ log "Git identity configured: ${GIT_USER_NAME:-Agent Relay} <${GIT_USER_EMAIL:-${DEFAULT_GIT_EMAIL}}>"
39
+
40
+ # Configure gh CLI to use the same token mechanism
41
+ # gh auth login expects a token via stdin or GH_TOKEN env var
42
+ # We'll set up a wrapper that fetches fresh tokens
43
+ mkdir -p "${HOME}/.config/gh"
44
+ cat > "${HOME}/.config/gh/hosts.yml" <<EOF
45
+ github.com:
46
+ oauth_token: placeholder
47
+ git_protocol: https
48
+ EOF
49
+
50
+ # Create gh token wrapper script
51
+ # Uses userToken (OAuth) for gh CLI, not installation token
52
+ cat > "/tmp/gh-token-helper.sh" <<'GHEOF'
53
+ #!/usr/bin/env bash
54
+ # Fetch fresh user OAuth token for gh CLI
55
+ response=$(curl -sf \
56
+ -H "Authorization: Bearer ${WORKSPACE_TOKEN}" \
57
+ "${CLOUD_API_URL}/api/git/token?workspaceId=${WORKSPACE_ID}" 2>/dev/null)
58
+ if [[ -n "$response" ]]; then
59
+ # Prefer userToken (OAuth) for gh CLI, fall back to installation token
60
+ user_token=$(echo "$response" | jq -r '.userToken // empty')
61
+ if [[ -n "$user_token" && "$user_token" != "null" ]]; then
62
+ echo "$user_token"
63
+ else
64
+ echo "$response" | jq -r '.token // empty'
65
+ fi
66
+ fi
67
+ GHEOF
68
+ chmod +x "/tmp/gh-token-helper.sh"
69
+
70
+ # gh CLI will use GH_TOKEN if set; we export a function to refresh it
71
+ # For now, set it once at startup (will be refreshed by the credential helper for git operations)
72
+ # Retry a few times in case the cloud API isn't ready yet
73
+ export GH_TOKEN=""
74
+ for attempt in 1 2 3; do
75
+ GH_TOKEN=$(/tmp/gh-token-helper.sh 2>/dev/null || echo "")
76
+ if [[ -n "${GH_TOKEN}" ]]; then
77
+ break
78
+ fi
79
+ sleep 1
80
+ done
81
+ if [[ -n "${GH_TOKEN}" ]]; then
82
+ log "GitHub CLI configured with fresh token"
83
+ else
84
+ log "WARN: Could not fetch GitHub token for gh CLI"
85
+ fi
86
+
87
+ # Fallback: Use static GITHUB_TOKEN if provided (legacy mode)
88
+ elif [[ -n "${GITHUB_TOKEN:-}" ]]; then
89
+ log "Configuring git credentials (legacy static token mode)"
90
+ GIT_ASKPASS_SCRIPT="/tmp/git-askpass.sh"
91
+ cat > "${GIT_ASKPASS_SCRIPT}" <<'EOF'
92
+ #!/usr/bin/env bash
93
+ prompt="${1:-}"
94
+ if [[ "${prompt}" == *"Username"* ]]; then
95
+ echo "x-access-token"
96
+ else
97
+ echo "${GITHUB_TOKEN}"
98
+ fi
99
+ EOF
100
+ chmod +x "${GIT_ASKPASS_SCRIPT}"
101
+ export GIT_ASKPASS="${GIT_ASKPASS_SCRIPT}"
102
+ export GIT_TERMINAL_PROMPT=0
103
+ export GH_TOKEN="${GITHUB_TOKEN}"
104
+
105
+ # Configure git identity for commits
106
+ DEFAULT_GIT_EMAIL="${AGENT_NAME:-agent}@agent-relay.com"
107
+ git config --global user.name "${GIT_USER_NAME:-Agent Relay}"
108
+ git config --global user.email "${GIT_USER_EMAIL:-${DEFAULT_GIT_EMAIL}}"
109
+ log "Git identity configured: ${GIT_USER_NAME:-Agent Relay} <${GIT_USER_EMAIL:-${DEFAULT_GIT_EMAIL}}>"
110
+ fi
111
+
112
+ clone_or_update_repo() {
113
+ local repo="$1"
114
+ repo="${repo// /}"
115
+ if [[ -z "${repo}" ]]; then
116
+ return
117
+ fi
118
+
119
+ local repo_name
120
+ repo_name="$(basename "${repo}")"
121
+ local target="${WORKSPACE_DIR}/${repo_name}"
122
+ local url="https://github.com/${repo}.git"
123
+
124
+ if [[ -d "${target}/.git" ]]; then
125
+ log "Updating ${repo}..."
126
+ git -C "${target}" remote set-url origin "${url}" >/dev/null 2>&1 || true
127
+ git -C "${target}" fetch --all --prune >/dev/null 2>&1 || true
128
+ git -C "${target}" pull --ff-only >/dev/null 2>&1 || true
129
+ else
130
+ log "Cloning ${repo}..."
131
+ git clone "${url}" "${target}" >/dev/null 2>&1 || {
132
+ log "WARN: Failed to clone ${repo}"
133
+ }
134
+ fi
135
+
136
+ # Mark directory as safe to prevent "dubious ownership" errors
137
+ # This is needed when git runs as a different user (e.g., root via SSH)
138
+ if [[ -d "${target}/.git" ]]; then
139
+ git config --global --add safe.directory "${target}" 2>/dev/null || true
140
+ fi
141
+ }
142
+
143
+ if [[ -n "${REPO_LIST}" ]]; then
144
+ # Check if we have credentials configured (gateway mode or static token)
145
+ if [[ -z "${GITHUB_TOKEN:-}" && -z "${CLOUD_API_URL:-}" ]]; then
146
+ log "WARN: REPOSITORIES set but no credentials configured; clones may fail."
147
+ fi
148
+
149
+ IFS=',' read -ra repos <<< "${REPO_LIST}"
150
+ for repo in "${repos[@]}"; do
151
+ clone_or_update_repo "${repo}"
152
+ done
153
+ fi
154
+
155
+ # ============================================================================
156
+ # Configure agent policy enforcement for cloud workspaces
157
+ # Policy is fetched from cloud API and enforced at runtime
158
+ # ============================================================================
159
+
160
+ if [[ -n "${CLOUD_API_URL:-}" && -n "${WORKSPACE_ID:-}" ]]; then
161
+ log "Enabling agent policy enforcement"
162
+ export AGENT_POLICY_ENFORCEMENT=1
163
+ # Policy is fetched from ${CLOUD_API_URL}/api/policy/${WORKSPACE_ID}/internal
164
+ fi
165
+
166
+ # ============================================================================
167
+ # Configure AI provider credentials
168
+ # Create credential files that CLIs expect from ENV vars passed by provisioner
169
+ # ============================================================================
170
+
171
+ # Claude CLI expects ~/.claude/.credentials.json (note the dot prefix on filename)
172
+ # Format: { claudeAiOauth: { accessToken: "...", refreshToken: "...", expiresAt: ... } }
173
+ if [[ -n "${ANTHROPIC_TOKEN:-}" ]]; then
174
+ log "Configuring Claude credentials..."
175
+ mkdir -p "${HOME}/.claude"
176
+ cat > "${HOME}/.claude/.credentials.json" <<EOF
177
+ {
178
+ "claudeAiOauth": {
179
+ "accessToken": "${ANTHROPIC_TOKEN}",
180
+ "refreshToken": "${ANTHROPIC_REFRESH_TOKEN:-}",
181
+ "expiresAt": ${ANTHROPIC_TOKEN_EXPIRES_AT:-null}
182
+ }
183
+ }
184
+ EOF
185
+ chmod 600 "${HOME}/.claude/.credentials.json"
186
+ fi
187
+
188
+ # Configure Claude Code for cloud workspaces
189
+ # Create both settings and instructions files
190
+ log "Configuring Claude Code for cloud workspace..."
191
+ mkdir -p "${HOME}/.claude"
192
+
193
+ # Create settings.json to auto-accept permissions (required for cloud workspaces)
194
+ # This tells Claude Code to skip the "Ready to code here?" permission prompt
195
+ # Reference: Claude Code uses this for headless/automated environments
196
+ cat > "${HOME}/.claude/settings.json" <<'SETTINGSEOF'
197
+ {
198
+ "permissions": {
199
+ "allow": [
200
+ "Read",
201
+ "Edit",
202
+ "Write",
203
+ "Bash",
204
+ "Glob",
205
+ "Grep",
206
+ "Task",
207
+ "WebFetch",
208
+ "WebSearch",
209
+ "NotebookEdit",
210
+ "TodoWrite"
211
+ ],
212
+ "deny": []
213
+ },
214
+ "autoApproveApiRequest": true
215
+ }
216
+ SETTINGSEOF
217
+ chmod 600 "${HOME}/.claude/settings.json"
218
+ log "Created Claude Code settings (auto-approve enabled)"
219
+
220
+ # Create CLAUDE.md with agent relay protocol instructions
221
+ # This is loaded automatically by Claude Code and provides the relay protocol
222
+ if [[ -f "/app/docs/agent-relay-snippet.md" ]]; then
223
+ cp "/app/docs/agent-relay-snippet.md" "${HOME}/.claude/CLAUDE.md"
224
+ log "Copied relay protocol from /app/docs/agent-relay-snippet.md"
225
+ else
226
+ # Fallback: create minimal instructions
227
+ log "WARN: /app/docs/agent-relay-snippet.md not found, creating minimal instructions"
228
+ cat > "${HOME}/.claude/CLAUDE.md" <<'RELAYEOF'
229
+ # Agent Relay
230
+
231
+ Real-time agent-to-agent messaging. Output `->relay:` patterns to communicate.
232
+
233
+ ## Sending Messages
234
+
235
+ Use fenced format for reliable delivery:
236
+ ```
237
+ ->relay:AgentName <<<
238
+ Your message here.>>>
239
+ ```
240
+
241
+ Broadcast to all: `->relay:* <<<message>>>`
242
+
243
+ ## Protocol
244
+
245
+ 1. ACK immediately when you receive a task
246
+ 2. Do the work
247
+ 3. Send DONE: summary when complete
248
+
249
+ ## Session Persistence
250
+
251
+ Output periodically to checkpoint progress:
252
+ ```
253
+ [[SUMMARY]]{"currentTask":"...","completedTasks":[...],"context":"..."}[[/SUMMARY]]
254
+ ```
255
+
256
+ When session is complete:
257
+ ```
258
+ [[SESSION_END]]{"summary":"...","completedTasks":[...]}[[/SESSION_END]]
259
+ ```
260
+ RELAYEOF
261
+ fi
262
+ log "Claude Code configuration complete"
263
+
264
+ # Codex CLI expects ~/.codex/auth.json
265
+ # Format: { tokens: { access_token: "...", refresh_token: "...", ... } }
266
+ if [[ -n "${OPENAI_TOKEN:-}" ]]; then
267
+ log "Configuring Codex credentials..."
268
+ mkdir -p "${HOME}/.codex"
269
+ cat > "${HOME}/.codex/auth.json" <<EOF
270
+ {
271
+ "tokens": {
272
+ "access_token": "${OPENAI_TOKEN}",
273
+ "refresh_token": "${OPENAI_REFRESH_TOKEN:-}"
274
+ }
275
+ }
276
+ EOF
277
+ chmod 600 "${HOME}/.codex/auth.json"
278
+ fi
279
+
280
+ # Google/Gemini - uses application default credentials
281
+ if [[ -n "${GOOGLE_TOKEN:-}" ]]; then
282
+ log "Configuring Google credentials..."
283
+ mkdir -p "${HOME}/.config/gcloud"
284
+ cat > "${HOME}/.config/gcloud/application_default_credentials.json" <<EOF
285
+ {
286
+ "type": "authorized_user",
287
+ "access_token": "${GOOGLE_TOKEN}"
288
+ }
289
+ EOF
290
+ chmod 600 "${HOME}/.config/gcloud/application_default_credentials.json"
291
+ fi
292
+
293
+ # ============================================================================
294
+ # Detect workspace path and start daemon
295
+ # The daemon must start from the same directory that spawned agents will use
296
+ # to ensure consistent socket paths
297
+ # ============================================================================
298
+
299
+ # Function to detect the actual workspace path (same logic as project-namespace.ts)
300
+ detect_workspace_path() {
301
+ local base_dir="${1}"
302
+
303
+ # 1. Explicit override via env var
304
+ if [[ -n "${WORKSPACE_CWD:-}" ]]; then
305
+ echo "${WORKSPACE_CWD}"
306
+ return
307
+ fi
308
+
309
+ # 2. Check if base_dir itself is a git repo
310
+ if [[ -d "${base_dir}/.git" ]]; then
311
+ echo "${base_dir}"
312
+ return
313
+ fi
314
+
315
+ # 3. Scan for cloned repos (directories with .git)
316
+ local first_repo=""
317
+ for dir in "${base_dir}"/*/; do
318
+ if [[ -d "${dir}.git" ]]; then
319
+ # Use first repo found (alphabetically sorted by bash glob)
320
+ first_repo="${dir%/}"
321
+ break
322
+ fi
323
+ done
324
+
325
+ if [[ -n "${first_repo}" ]]; then
326
+ echo "${first_repo}"
327
+ return
328
+ fi
329
+
330
+ # 4. Fall back to base_dir
331
+ echo "${base_dir}"
332
+ }
333
+
334
+ # Detect the actual workspace path
335
+ ACTUAL_WORKSPACE=$(detect_workspace_path "${WORKSPACE_DIR}")
336
+ log "Detected workspace path: ${ACTUAL_WORKSPACE}"
337
+
338
+ # Change to the detected workspace before starting daemon
339
+ cd "${ACTUAL_WORKSPACE}"
340
+
341
+ log "Starting agent-relay daemon on port ${PORT} from ${ACTUAL_WORKSPACE}"
342
+ args=(/app/dist/cli/index.js up --port "${PORT}")
343
+
344
+ if [[ "${SUPERVISOR_ENABLED:-true}" == "true" ]]; then
345
+ args+=("--watch")
346
+ fi
347
+
348
+ exec node "${args[@]}"
@@ -0,0 +1,111 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # Git Credential Helper for Agent Relay Workspaces
4
+ #
5
+ # This script fetches fresh GitHub tokens from the cloud API gateway.
6
+ # Nango handles token refresh, so tokens are always valid.
7
+ #
8
+ # Usage: git config --global credential.helper /usr/local/bin/git-credential-relay
9
+ #
10
+ # Environment variables:
11
+ # WORKSPACE_ID - Required: The workspace ID for token lookup
12
+ # CLOUD_API_URL - Required: The cloud API base URL
13
+ # WORKSPACE_TOKEN - Required: Bearer token for API auth
14
+ #
15
+
16
+ set -euo pipefail
17
+
18
+ # Debug logging (enable with GIT_CREDENTIAL_DEBUG=1)
19
+ debug() {
20
+ if [[ "${GIT_CREDENTIAL_DEBUG:-}" == "1" ]]; then
21
+ echo "git-credential-relay: $*" >&2
22
+ fi
23
+ }
24
+
25
+ debug "Called with args: $*"
26
+
27
+ # Only handle 'get' operation
28
+ if [[ "${1:-}" != "get" ]]; then
29
+ debug "Ignoring non-get operation"
30
+ exit 0
31
+ fi
32
+
33
+ # Read input from git (protocol=https, host=github.com, etc.)
34
+ declare -A input
35
+ while IFS='=' read -r key value; do
36
+ [[ -z "$key" ]] && break
37
+ input["$key"]="$value"
38
+ done
39
+
40
+ # Only provide credentials for github.com
41
+ host="${input[host]:-}"
42
+ debug "Host: $host"
43
+ if [[ "$host" != "github.com" ]]; then
44
+ debug "Not github.com, skipping"
45
+ exit 0
46
+ fi
47
+
48
+ # Check required environment variables
49
+ if [[ -z "${WORKSPACE_ID:-}" ]]; then
50
+ echo "git-credential-relay: WORKSPACE_ID not set" >&2
51
+ echo "git-credential-relay: Hint - check if env vars are passed to agent process" >&2
52
+ exit 1
53
+ fi
54
+
55
+ if [[ -z "${CLOUD_API_URL:-}" ]]; then
56
+ echo "git-credential-relay: CLOUD_API_URL not set" >&2
57
+ exit 1
58
+ fi
59
+
60
+ if [[ -z "${WORKSPACE_TOKEN:-}" ]]; then
61
+ echo "git-credential-relay: WORKSPACE_TOKEN not set" >&2
62
+ exit 1
63
+ fi
64
+
65
+ debug "Fetching token from ${CLOUD_API_URL}/api/git/token?workspaceId=${WORKSPACE_ID}"
66
+
67
+ # Fetch fresh token from gateway (capture stderr for debugging)
68
+ http_code=""
69
+ response=""
70
+ if [[ "${GIT_CREDENTIAL_DEBUG:-}" == "1" ]]; then
71
+ # With debug, show full curl output
72
+ response=$(curl -sf -w "\n%{http_code}" \
73
+ -H "Authorization: Bearer ${WORKSPACE_TOKEN}" \
74
+ "${CLOUD_API_URL}/api/git/token?workspaceId=${WORKSPACE_ID}" \
75
+ 2>&1) || true
76
+ http_code="${response##*$'\n'}"
77
+ response="${response%$'\n'*}"
78
+ debug "HTTP response code: $http_code"
79
+ debug "Response: ${response:0:200}"
80
+ else
81
+ response=$(curl -sf \
82
+ -H "Authorization: Bearer ${WORKSPACE_TOKEN}" \
83
+ "${CLOUD_API_URL}/api/git/token?workspaceId=${WORKSPACE_ID}" \
84
+ 2>/dev/null) || true
85
+ fi
86
+
87
+ if [[ -z "$response" ]]; then
88
+ echo "git-credential-relay: Failed to fetch token from gateway" >&2
89
+ exit 1
90
+ fi
91
+
92
+ # Parse JSON response using jq (more robust than grep)
93
+ token=$(echo "$response" | jq -r '.token // empty')
94
+ username=$(echo "$response" | jq -r '.username // "x-access-token"')
95
+
96
+ if [[ -z "$token" ]]; then
97
+ # Check if there's an error message
98
+ error=$(echo "$response" | jq -r '.error // empty')
99
+ if [[ -n "$error" ]]; then
100
+ echo "git-credential-relay: $error" >&2
101
+ else
102
+ echo "git-credential-relay: No token in response" >&2
103
+ fi
104
+ exit 1
105
+ fi
106
+
107
+ # Output credentials in git credential format
108
+ echo "protocol=https"
109
+ echo "host=github.com"
110
+ echo "username=${username:-x-access-token}"
111
+ echo "password=${token}"
@@ -3,7 +3,19 @@
3
3
  * Handles spawning and releasing worker agents via node-pty.
4
4
  * Workers run headlessly with output capture for logs.
5
5
  */
6
+ import { type SummaryEvent, type SessionEndEvent } from '../wrapper/pty-wrapper.js';
7
+ import { AgentPolicyService, type CloudPolicyFetcher } from '../policy/agent-policy.js';
6
8
  import type { SpawnRequest, SpawnResult, WorkerInfo, SpawnWithShadowRequest, SpawnWithShadowResult } from './types.js';
9
+ /**
10
+ * Cloud persistence handler interface.
11
+ * Implement this to persist agent session data to cloud storage.
12
+ */
13
+ export interface CloudPersistenceHandler {
14
+ onSummary: (agentName: string, event: SummaryEvent) => Promise<void>;
15
+ onSessionEnd: (agentName: string, event: SessionEndEvent) => Promise<void>;
16
+ /** Optional cleanup method for tests and graceful shutdown */
17
+ destroy?: () => void;
18
+ }
7
19
  /** Worker metadata stored in workers.json */
8
20
  interface WorkerMeta {
9
21
  name: string;
@@ -15,6 +27,13 @@ interface WorkerMeta {
15
27
  pid?: number;
16
28
  logFile?: string;
17
29
  }
30
+ /** Callback for agent death notifications */
31
+ export type OnAgentDeathCallback = (info: {
32
+ name: string;
33
+ exitCode: number | null;
34
+ agentId?: string;
35
+ resumeInstructions?: string;
36
+ }) => void;
18
37
  export declare class AgentSpawner {
19
38
  private activeWorkers;
20
39
  private agentsPath;
@@ -23,12 +42,46 @@ export declare class AgentSpawner {
23
42
  private logsDir;
24
43
  private workersPath;
25
44
  private dashboardPort?;
45
+ private onAgentDeath?;
46
+ private cloudPersistence?;
47
+ private policyService?;
48
+ private policyEnforcementEnabled;
26
49
  constructor(projectRoot: string, _tmuxSession?: string, dashboardPort?: number);
50
+ /**
51
+ * Set cloud policy fetcher for workspace-level policies
52
+ */
53
+ setCloudPolicyFetcher(fetcher: CloudPolicyFetcher): void;
54
+ /**
55
+ * Get the policy service (for external access to policy checks)
56
+ */
57
+ getPolicyService(): AgentPolicyService | undefined;
27
58
  /**
28
59
  * Set the dashboard port (for nested spawn API calls).
29
60
  * Called after the dashboard server starts and we know the actual port.
30
61
  */
31
62
  setDashboardPort(port: number): void;
63
+ /**
64
+ * Set callback for agent death notifications.
65
+ * Called when an agent exits unexpectedly (non-zero exit code).
66
+ */
67
+ setOnAgentDeath(callback: OnAgentDeathCallback): void;
68
+ /**
69
+ * Set cloud persistence handler for forwarding PtyWrapper events.
70
+ * When set, 'summary' and 'session-end' events from spawned agents
71
+ * are forwarded to the handler for cloud persistence (PostgreSQL/Redis).
72
+ *
73
+ * Note: Enable via RELAY_CLOUD_ENABLED=true environment variable.
74
+ */
75
+ setCloudPersistence(handler: CloudPersistenceHandler): void;
76
+ /**
77
+ * Bind cloud persistence event handlers to a PtyWrapper.
78
+ * Returns the listener references for cleanup.
79
+ */
80
+ private bindCloudPersistenceEvents;
81
+ /**
82
+ * Unbind all tracked listeners from a PtyWrapper.
83
+ */
84
+ private unbindListeners;
32
85
  /**
33
86
  * Spawn a new worker agent using node-pty
34
87
  */