agent-relay 2.0.21 → 2.0.23

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 (412) hide show
  1. package/bin/relay-pty-linux-arm64 +0 -0
  2. package/dist/src/cli/index.d.ts +3 -3
  3. package/dist/src/cli/index.js +31 -100
  4. package/package.json +22 -29
  5. package/packages/api-types/package.json +1 -1
  6. package/packages/bridge/package.json +8 -8
  7. package/packages/cli-tester/package.json +1 -1
  8. package/packages/cloud/dist/server.js +25 -4
  9. package/packages/cloud/package.json +6 -6
  10. package/packages/config/package.json +2 -2
  11. package/packages/continuity/package.json +1 -1
  12. package/packages/daemon/dist/orchestrator.js +21 -1
  13. package/packages/daemon/dist/router.d.ts +5 -0
  14. package/packages/daemon/dist/router.js +31 -0
  15. package/packages/daemon/dist/server.d.ts +5 -0
  16. package/packages/daemon/dist/server.js +131 -1
  17. package/packages/daemon/package.json +12 -12
  18. package/packages/hooks/package.json +4 -4
  19. package/packages/mcp/dist/client.d.ts +15 -0
  20. package/packages/mcp/dist/client.js +9 -0
  21. package/packages/mcp/dist/server.js +13 -1
  22. package/packages/mcp/dist/tools/index.d.ts +2 -0
  23. package/packages/mcp/dist/tools/index.js +2 -0
  24. package/packages/mcp/dist/tools/relay-connected.d.ts +17 -0
  25. package/packages/mcp/dist/tools/relay-connected.js +40 -0
  26. package/packages/mcp/dist/tools/relay-remove-agent.d.ts +20 -0
  27. package/packages/mcp/dist/tools/relay-remove-agent.js +50 -0
  28. package/packages/mcp/package.json +2 -2
  29. package/packages/memory/package.json +2 -2
  30. package/packages/policy/package.json +2 -2
  31. package/packages/protocol/dist/types.d.ts +46 -1
  32. package/packages/protocol/package.json +1 -1
  33. package/packages/resiliency/package.json +1 -1
  34. package/packages/sdk/dist/client.d.ts +22 -1
  35. package/packages/sdk/dist/client.js +31 -0
  36. package/packages/sdk/dist/protocol/index.d.ts +1 -1
  37. package/packages/sdk/dist/protocol/types.d.ts +35 -1
  38. package/packages/sdk/package.json +2 -2
  39. package/packages/spawner/package.json +1 -1
  40. package/packages/state/package.json +1 -1
  41. package/packages/storage/dist/adapter.d.ts +4 -0
  42. package/packages/storage/dist/sqlite-adapter.d.ts +10 -0
  43. package/packages/storage/dist/sqlite-adapter.js +26 -0
  44. package/packages/storage/package.json +2 -2
  45. package/packages/telemetry/package.json +1 -1
  46. package/packages/trajectory/package.json +2 -2
  47. package/packages/user-directory/package.json +2 -2
  48. package/packages/utils/dist/update-checker.js +4 -0
  49. package/packages/utils/package.json +1 -1
  50. package/packages/wrapper/package.json +6 -6
  51. package/deploy/workspace/codex.config.toml +0 -20
  52. package/deploy/workspace/entrypoint-browser.sh +0 -118
  53. package/deploy/workspace/entrypoint.sh +0 -612
  54. package/deploy/workspace/gh-credential-relay +0 -90
  55. package/deploy/workspace/gh-relay +0 -156
  56. package/deploy/workspace/git-credential-relay +0 -330
  57. package/deploy/workspace/git-credential-relay.test.sh +0 -230
  58. package/dist/dashboard/out/404.html +0 -1
  59. package/dist/dashboard/out/_next/static/7MZPqYkVGw3EGzVBkVmY9/_buildManifest.js +0 -1
  60. package/dist/dashboard/out/_next/static/7MZPqYkVGw3EGzVBkVmY9/_ssgManifest.js +0 -1
  61. package/dist/dashboard/out/_next/static/chunks/116-a883fca163f3a5bc.js +0 -1
  62. package/dist/dashboard/out/_next/static/chunks/117-c8afed19e821a35d.js +0 -2
  63. package/dist/dashboard/out/_next/static/chunks/282-980c2eb8fff20123.js +0 -1
  64. package/dist/dashboard/out/_next/static/chunks/320-a6304232cd0ee2ce.js +0 -1
  65. package/dist/dashboard/out/_next/static/chunks/532-bace199897eeab37.js +0 -9
  66. package/dist/dashboard/out/_next/static/chunks/631-16b905e5920f9b59.js +0 -1
  67. package/dist/dashboard/out/_next/static/chunks/648-acb2ff9f77cbfbd3.js +0 -1
  68. package/dist/dashboard/out/_next/static/chunks/766-2aea80818f7eb0d8.js +0 -1
  69. package/dist/dashboard/out/_next/static/chunks/83-26d2bde54616ee90.js +0 -1
  70. package/dist/dashboard/out/_next/static/chunks/847-f1f467060f32afff.js +0 -1
  71. package/dist/dashboard/out/_next/static/chunks/891-5cb1513eeb97a891.js +0 -1
  72. package/dist/dashboard/out/_next/static/chunks/app/_not-found/page-60501fddbafba9dc.js +0 -1
  73. package/dist/dashboard/out/_next/static/chunks/app/app/onboarding/page-9914652442f7e4fb.js +0 -1
  74. package/dist/dashboard/out/_next/static/chunks/app/app/page-366fb7c078d4e9e0.js +0 -1
  75. package/dist/dashboard/out/_next/static/chunks/app/cloud/link/page-fa1d5842aa90e8a6.js +0 -1
  76. package/dist/dashboard/out/_next/static/chunks/app/complete-profile/page-dd64bbdf66b639cd.js +0 -1
  77. package/dist/dashboard/out/_next/static/chunks/app/connect-repos/page-113060009ef35bc2.js +0 -1
  78. package/dist/dashboard/out/_next/static/chunks/app/history/page-9965d2483011b846.js +0 -1
  79. package/dist/dashboard/out/_next/static/chunks/app/layout-6b91e33784c20610.js +0 -1
  80. package/dist/dashboard/out/_next/static/chunks/app/login/page-435eceb0073be027.js +0 -1
  81. package/dist/dashboard/out/_next/static/chunks/app/metrics/page-1e37ef8e73940b40.js +0 -1
  82. package/dist/dashboard/out/_next/static/chunks/app/page-8119d4246743574e.js +0 -1
  83. package/dist/dashboard/out/_next/static/chunks/app/pricing/page-9db3ebdfa567a7c9.js +0 -1
  84. package/dist/dashboard/out/_next/static/chunks/app/providers/page-ecb16ffd3b36262b.js +0 -1
  85. package/dist/dashboard/out/_next/static/chunks/app/providers/setup/[provider]/page-4dbe33f0f7691b7c.js +0 -1
  86. package/dist/dashboard/out/_next/static/chunks/app/signup/page-c7a0a28341365ae0.js +0 -1
  87. package/dist/dashboard/out/_next/static/chunks/e868780c-48e5f147c90a3a41.js +0 -18
  88. package/dist/dashboard/out/_next/static/chunks/fd9d1056-609918ca7b6280bb.js +0 -1
  89. package/dist/dashboard/out/_next/static/chunks/framework-f66176bb897dc684.js +0 -1
  90. package/dist/dashboard/out/_next/static/chunks/main-311c3db74dcfadb7.js +0 -1
  91. package/dist/dashboard/out/_next/static/chunks/main-app-fdbeb09028f57c9f.js +0 -1
  92. package/dist/dashboard/out/_next/static/chunks/pages/_app-72b849fbd24ac258.js +0 -1
  93. package/dist/dashboard/out/_next/static/chunks/pages/_error-7ba65e1336b92748.js +0 -1
  94. package/dist/dashboard/out/_next/static/chunks/polyfills-42372ed130431b0a.js +0 -1
  95. package/dist/dashboard/out/_next/static/chunks/webpack-1cdd8ed57114d5e1.js +0 -1
  96. package/dist/dashboard/out/_next/static/css/4034f236dd1a3178.css +0 -1
  97. package/dist/dashboard/out/_next/static/css/6892f8422896ef7a.css +0 -1
  98. package/dist/dashboard/out/alt-logos/agent-relay-logo-128.png +0 -0
  99. package/dist/dashboard/out/alt-logos/agent-relay-logo-256.png +0 -0
  100. package/dist/dashboard/out/alt-logos/agent-relay-logo-32.png +0 -0
  101. package/dist/dashboard/out/alt-logos/agent-relay-logo-512.png +0 -0
  102. package/dist/dashboard/out/alt-logos/agent-relay-logo-64.png +0 -0
  103. package/dist/dashboard/out/alt-logos/agent-relay-logo.svg +0 -45
  104. package/dist/dashboard/out/alt-logos/logo.svg +0 -38
  105. package/dist/dashboard/out/alt-logos/monogram-logo-128.png +0 -0
  106. package/dist/dashboard/out/alt-logos/monogram-logo-256.png +0 -0
  107. package/dist/dashboard/out/alt-logos/monogram-logo-32.png +0 -0
  108. package/dist/dashboard/out/alt-logos/monogram-logo-512.png +0 -0
  109. package/dist/dashboard/out/alt-logos/monogram-logo-64.png +0 -0
  110. package/dist/dashboard/out/alt-logos/monogram-logo.svg +0 -38
  111. package/dist/dashboard/out/app/onboarding.html +0 -1
  112. package/dist/dashboard/out/app/onboarding.txt +0 -7
  113. package/dist/dashboard/out/app.html +0 -1
  114. package/dist/dashboard/out/app.txt +0 -7
  115. package/dist/dashboard/out/apple-icon.png +0 -0
  116. package/dist/dashboard/out/cloud/link.html +0 -1
  117. package/dist/dashboard/out/cloud/link.txt +0 -7
  118. package/dist/dashboard/out/complete-profile.html +0 -5
  119. package/dist/dashboard/out/complete-profile.txt +0 -7
  120. package/dist/dashboard/out/connect-repos.html +0 -1
  121. package/dist/dashboard/out/connect-repos.txt +0 -7
  122. package/dist/dashboard/out/history.html +0 -1
  123. package/dist/dashboard/out/history.txt +0 -7
  124. package/dist/dashboard/out/index.html +0 -1
  125. package/dist/dashboard/out/index.txt +0 -7
  126. package/dist/dashboard/out/login.html +0 -5
  127. package/dist/dashboard/out/login.txt +0 -7
  128. package/dist/dashboard/out/metrics.html +0 -1
  129. package/dist/dashboard/out/metrics.txt +0 -7
  130. package/dist/dashboard/out/pricing.html +0 -13
  131. package/dist/dashboard/out/pricing.txt +0 -7
  132. package/dist/dashboard/out/providers/setup/claude.html +0 -1
  133. package/dist/dashboard/out/providers/setup/claude.txt +0 -8
  134. package/dist/dashboard/out/providers/setup/codex.html +0 -1
  135. package/dist/dashboard/out/providers/setup/codex.txt +0 -8
  136. package/dist/dashboard/out/providers/setup/cursor.html +0 -1
  137. package/dist/dashboard/out/providers/setup/cursor.txt +0 -8
  138. package/dist/dashboard/out/providers.html +0 -1
  139. package/dist/dashboard/out/providers.txt +0 -7
  140. package/dist/dashboard/out/signup.html +0 -6
  141. package/dist/dashboard/out/signup.txt +0 -7
  142. package/dist/src/dashboard-server/index.d.ts +0 -8
  143. package/dist/src/dashboard-server/index.js +0 -8
  144. package/packages/dashboard/README.md +0 -48
  145. package/packages/dashboard/dist/health-worker-manager.d.ts +0 -62
  146. package/packages/dashboard/dist/health-worker-manager.js +0 -144
  147. package/packages/dashboard/dist/health-worker.d.ts +0 -9
  148. package/packages/dashboard/dist/health-worker.js +0 -79
  149. package/packages/dashboard/dist/index.d.ts +0 -20
  150. package/packages/dashboard/dist/index.js +0 -19
  151. package/packages/dashboard/dist/metrics.d.ts +0 -105
  152. package/packages/dashboard/dist/metrics.js +0 -193
  153. package/packages/dashboard/dist/needs-attention.d.ts +0 -24
  154. package/packages/dashboard/dist/needs-attention.js +0 -78
  155. package/packages/dashboard/dist/server.d.ts +0 -25
  156. package/packages/dashboard/dist/server.js +0 -5270
  157. package/packages/dashboard/dist/start.d.ts +0 -6
  158. package/packages/dashboard/dist/start.js +0 -13
  159. package/packages/dashboard/dist/types/threading.d.ts +0 -8
  160. package/packages/dashboard/dist/types/threading.js +0 -2
  161. package/packages/dashboard/dist/user-bridge.d.ts +0 -154
  162. package/packages/dashboard/dist/user-bridge.js +0 -372
  163. package/packages/dashboard/package.json +0 -65
  164. package/packages/dashboard/ui/app/app/onboarding/page.tsx +0 -394
  165. package/packages/dashboard/ui/app/app/page.tsx +0 -667
  166. package/packages/dashboard/ui/app/apple-icon.png +0 -0
  167. package/packages/dashboard/ui/app/cloud/link/page.tsx +0 -464
  168. package/packages/dashboard/ui/app/complete-profile/page.tsx +0 -204
  169. package/packages/dashboard/ui/app/connect-repos/page.tsx +0 -410
  170. package/packages/dashboard/ui/app/favicon.png +0 -0
  171. package/packages/dashboard/ui/app/globals.css +0 -59
  172. package/packages/dashboard/ui/app/history/page.tsx +0 -658
  173. package/packages/dashboard/ui/app/layout.tsx +0 -25
  174. package/packages/dashboard/ui/app/login/page.tsx +0 -424
  175. package/packages/dashboard/ui/app/metrics/page.tsx +0 -751
  176. package/packages/dashboard/ui/app/page.tsx +0 -59
  177. package/packages/dashboard/ui/app/pricing/page.tsx +0 -7
  178. package/packages/dashboard/ui/app/providers/page.tsx +0 -193
  179. package/packages/dashboard/ui/app/providers/setup/[provider]/ProviderSetupClient.tsx +0 -148
  180. package/packages/dashboard/ui/app/providers/setup/[provider]/constants.ts +0 -35
  181. package/packages/dashboard/ui/app/providers/setup/[provider]/page.tsx +0 -42
  182. package/packages/dashboard/ui/app/signup/page.tsx +0 -533
  183. package/packages/dashboard/ui/index.ts +0 -49
  184. package/packages/dashboard/ui/landing/LandingPage.tsx +0 -713
  185. package/packages/dashboard/ui/landing/PricingPage.tsx +0 -559
  186. package/packages/dashboard/ui/landing/index.ts +0 -6
  187. package/packages/dashboard/ui/landing/styles.css +0 -2850
  188. package/packages/dashboard/ui/lib/agent-merge.ts +0 -35
  189. package/packages/dashboard/ui/lib/api.ts +0 -1155
  190. package/packages/dashboard/ui/lib/cloudApi.ts +0 -877
  191. package/packages/dashboard/ui/lib/colors.ts +0 -218
  192. package/packages/dashboard/ui/lib/hierarchy.ts +0 -242
  193. package/packages/dashboard/ui/lib/stuckDetection.ts +0 -142
  194. package/packages/dashboard/ui/next-env.d.ts +0 -5
  195. package/packages/dashboard/ui/next.config.js +0 -41
  196. package/packages/dashboard/ui/package-lock.json +0 -2882
  197. package/packages/dashboard/ui/package.json +0 -33
  198. package/packages/dashboard/ui/postcss.config.js +0 -5
  199. package/packages/dashboard/ui/react-components/ActivityFeed.tsx +0 -216
  200. package/packages/dashboard/ui/react-components/AddWorkspaceModal.tsx +0 -170
  201. package/packages/dashboard/ui/react-components/AgentCard.tsx +0 -587
  202. package/packages/dashboard/ui/react-components/AgentList.tsx +0 -411
  203. package/packages/dashboard/ui/react-components/AgentProfilePanel.tsx +0 -564
  204. package/packages/dashboard/ui/react-components/App.tsx +0 -3033
  205. package/packages/dashboard/ui/react-components/BillingPanel.tsx +0 -922
  206. package/packages/dashboard/ui/react-components/BillingResult.tsx +0 -447
  207. package/packages/dashboard/ui/react-components/BroadcastComposer.tsx +0 -690
  208. package/packages/dashboard/ui/react-components/ChannelAdminPanel.tsx +0 -773
  209. package/packages/dashboard/ui/react-components/ChannelBrowser.tsx +0 -385
  210. package/packages/dashboard/ui/react-components/ChannelChat.tsx +0 -261
  211. package/packages/dashboard/ui/react-components/ChannelSidebar.tsx +0 -399
  212. package/packages/dashboard/ui/react-components/CloudSessionProvider.tsx +0 -130
  213. package/packages/dashboard/ui/react-components/CommandPalette.tsx +0 -815
  214. package/packages/dashboard/ui/react-components/ConfirmationDialog.tsx +0 -133
  215. package/packages/dashboard/ui/react-components/ConversationHistory.tsx +0 -518
  216. package/packages/dashboard/ui/react-components/CoordinatorPanel.tsx +0 -944
  217. package/packages/dashboard/ui/react-components/DecisionQueue.tsx +0 -717
  218. package/packages/dashboard/ui/react-components/DirectMessageView.tsx +0 -164
  219. package/packages/dashboard/ui/react-components/FileAutocomplete.tsx +0 -368
  220. package/packages/dashboard/ui/react-components/FleetOverview.tsx +0 -278
  221. package/packages/dashboard/ui/react-components/LogViewer.tsx +0 -310
  222. package/packages/dashboard/ui/react-components/LogViewerPanel.tsx +0 -482
  223. package/packages/dashboard/ui/react-components/Logo.tsx +0 -284
  224. package/packages/dashboard/ui/react-components/MentionAutocomplete.tsx +0 -384
  225. package/packages/dashboard/ui/react-components/MessageComposer.tsx +0 -457
  226. package/packages/dashboard/ui/react-components/MessageList.tsx +0 -649
  227. package/packages/dashboard/ui/react-components/MessageSenderName.tsx +0 -91
  228. package/packages/dashboard/ui/react-components/MessageStatusIndicator.tsx +0 -142
  229. package/packages/dashboard/ui/react-components/NewConversationModal.tsx +0 -400
  230. package/packages/dashboard/ui/react-components/NotificationToast.tsx +0 -488
  231. package/packages/dashboard/ui/react-components/OnlineUsersIndicator.tsx +0 -164
  232. package/packages/dashboard/ui/react-components/Pagination.tsx +0 -124
  233. package/packages/dashboard/ui/react-components/PricingPlans.tsx +0 -386
  234. package/packages/dashboard/ui/react-components/ProjectList.tsx +0 -625
  235. package/packages/dashboard/ui/react-components/ProviderAuthFlow.tsx +0 -853
  236. package/packages/dashboard/ui/react-components/ProviderConnectionList.tsx +0 -378
  237. package/packages/dashboard/ui/react-components/ProvisioningProgress.tsx +0 -730
  238. package/packages/dashboard/ui/react-components/RepoAccessPanel.tsx +0 -549
  239. package/packages/dashboard/ui/react-components/ServerCard.tsx +0 -202
  240. package/packages/dashboard/ui/react-components/SessionExpiredModal.tsx +0 -128
  241. package/packages/dashboard/ui/react-components/SpawnModal.tsx +0 -804
  242. package/packages/dashboard/ui/react-components/TaskAssignmentUI.tsx +0 -375
  243. package/packages/dashboard/ui/react-components/TerminalProviderSetup.tsx +0 -608
  244. package/packages/dashboard/ui/react-components/ThemeProvider.tsx +0 -325
  245. package/packages/dashboard/ui/react-components/ThinkingIndicator.tsx +0 -231
  246. package/packages/dashboard/ui/react-components/ThreadList.tsx +0 -198
  247. package/packages/dashboard/ui/react-components/ThreadPanel.tsx +0 -346
  248. package/packages/dashboard/ui/react-components/TrajectoryViewer.tsx +0 -698
  249. package/packages/dashboard/ui/react-components/TypingIndicator.tsx +0 -69
  250. package/packages/dashboard/ui/react-components/UsageBanner.tsx +0 -231
  251. package/packages/dashboard/ui/react-components/UserProfilePanel.tsx +0 -233
  252. package/packages/dashboard/ui/react-components/WorkspaceContext.tsx +0 -107
  253. package/packages/dashboard/ui/react-components/WorkspaceSelector.tsx +0 -234
  254. package/packages/dashboard/ui/react-components/WorkspaceStatusIndicator.tsx +0 -370
  255. package/packages/dashboard/ui/react-components/XTermInteractive.tsx +0 -510
  256. package/packages/dashboard/ui/react-components/XTermLogViewer.tsx +0 -719
  257. package/packages/dashboard/ui/react-components/channels/ChannelDialogs.tsx +0 -1411
  258. package/packages/dashboard/ui/react-components/channels/ChannelHeader.tsx +0 -317
  259. package/packages/dashboard/ui/react-components/channels/ChannelMessageList.tsx +0 -463
  260. package/packages/dashboard/ui/react-components/channels/ChannelViewV1.tsx +0 -146
  261. package/packages/dashboard/ui/react-components/channels/MessageInput.tsx +0 -288
  262. package/packages/dashboard/ui/react-components/channels/SearchInput.tsx +0 -172
  263. package/packages/dashboard/ui/react-components/channels/SearchResults.tsx +0 -336
  264. package/packages/dashboard/ui/react-components/channels/api.ts +0 -697
  265. package/packages/dashboard/ui/react-components/channels/index.ts +0 -76
  266. package/packages/dashboard/ui/react-components/channels/mockApi.ts +0 -344
  267. package/packages/dashboard/ui/react-components/channels/types.ts +0 -566
  268. package/packages/dashboard/ui/react-components/hooks/index.ts +0 -57
  269. package/packages/dashboard/ui/react-components/hooks/useAgentLogs.ts +0 -394
  270. package/packages/dashboard/ui/react-components/hooks/useAgents.ts +0 -127
  271. package/packages/dashboard/ui/react-components/hooks/useBroadcastDedup.ts +0 -86
  272. package/packages/dashboard/ui/react-components/hooks/useChannelAdmin.ts +0 -329
  273. package/packages/dashboard/ui/react-components/hooks/useChannelBrowser.ts +0 -239
  274. package/packages/dashboard/ui/react-components/hooks/useChannelCommands.ts +0 -138
  275. package/packages/dashboard/ui/react-components/hooks/useChannels.ts +0 -328
  276. package/packages/dashboard/ui/react-components/hooks/useDebounce.ts +0 -29
  277. package/packages/dashboard/ui/react-components/hooks/useDirectMessage.ts +0 -141
  278. package/packages/dashboard/ui/react-components/hooks/useMessages.ts +0 -309
  279. package/packages/dashboard/ui/react-components/hooks/useOrchestrator.ts +0 -364
  280. package/packages/dashboard/ui/react-components/hooks/usePinnedAgents.ts +0 -140
  281. package/packages/dashboard/ui/react-components/hooks/usePresence.ts +0 -340
  282. package/packages/dashboard/ui/react-components/hooks/useRecentRepos.ts +0 -130
  283. package/packages/dashboard/ui/react-components/hooks/useSession.ts +0 -209
  284. package/packages/dashboard/ui/react-components/hooks/useTrajectory.ts +0 -265
  285. package/packages/dashboard/ui/react-components/hooks/useWebSocket.ts +0 -169
  286. package/packages/dashboard/ui/react-components/hooks/useWorkspaceMembers.ts +0 -120
  287. package/packages/dashboard/ui/react-components/hooks/useWorkspaceRepos.ts +0 -73
  288. package/packages/dashboard/ui/react-components/hooks/useWorkspaceStatus.ts +0 -237
  289. package/packages/dashboard/ui/react-components/index.ts +0 -81
  290. package/packages/dashboard/ui/react-components/layout/Header.tsx +0 -355
  291. package/packages/dashboard/ui/react-components/layout/RepoContextHeader.tsx +0 -361
  292. package/packages/dashboard/ui/react-components/layout/Sidebar.archive.test.tsx +0 -126
  293. package/packages/dashboard/ui/react-components/layout/Sidebar.test.tsx +0 -691
  294. package/packages/dashboard/ui/react-components/layout/Sidebar.tsx +0 -930
  295. package/packages/dashboard/ui/react-components/layout/index.ts +0 -7
  296. package/packages/dashboard/ui/react-components/settings/BillingSettingsPanel.tsx +0 -564
  297. package/packages/dashboard/ui/react-components/settings/SettingsPage.tsx +0 -544
  298. package/packages/dashboard/ui/react-components/settings/TeamSettingsPanel.tsx +0 -560
  299. package/packages/dashboard/ui/react-components/settings/WorkspaceSettingsPanel.tsx +0 -1386
  300. package/packages/dashboard/ui/react-components/settings/index.ts +0 -11
  301. package/packages/dashboard/ui/react-components/settings/types.ts +0 -53
  302. package/packages/dashboard/ui/react-components/utils/messageFormatting.tsx +0 -370
  303. package/packages/dashboard/ui/tailwind.config.js +0 -148
  304. package/packages/dashboard/ui/types/index.ts +0 -304
  305. package/packages/dashboard/ui/types/threading.ts +0 -7
  306. package/packages/dashboard/ui-dist/404.html +0 -1
  307. package/packages/dashboard/ui-dist/_next/static/7MZPqYkVGw3EGzVBkVmY9/_buildManifest.js +0 -1
  308. package/packages/dashboard/ui-dist/_next/static/7MZPqYkVGw3EGzVBkVmY9/_ssgManifest.js +0 -1
  309. package/packages/dashboard/ui-dist/_next/static/chunks/116-a883fca163f3a5bc.js +0 -1
  310. package/packages/dashboard/ui-dist/_next/static/chunks/117-c8afed19e821a35d.js +0 -2
  311. package/packages/dashboard/ui-dist/_next/static/chunks/282-980c2eb8fff20123.js +0 -1
  312. package/packages/dashboard/ui-dist/_next/static/chunks/320-a6304232cd0ee2ce.js +0 -1
  313. package/packages/dashboard/ui-dist/_next/static/chunks/532-bace199897eeab37.js +0 -9
  314. package/packages/dashboard/ui-dist/_next/static/chunks/631-16b905e5920f9b59.js +0 -1
  315. package/packages/dashboard/ui-dist/_next/static/chunks/648-acb2ff9f77cbfbd3.js +0 -1
  316. package/packages/dashboard/ui-dist/_next/static/chunks/766-2aea80818f7eb0d8.js +0 -1
  317. package/packages/dashboard/ui-dist/_next/static/chunks/83-26d2bde54616ee90.js +0 -1
  318. package/packages/dashboard/ui-dist/_next/static/chunks/847-f1f467060f32afff.js +0 -1
  319. package/packages/dashboard/ui-dist/_next/static/chunks/891-5cb1513eeb97a891.js +0 -1
  320. package/packages/dashboard/ui-dist/_next/static/chunks/app/_not-found/page-60501fddbafba9dc.js +0 -1
  321. package/packages/dashboard/ui-dist/_next/static/chunks/app/app/onboarding/page-9914652442f7e4fb.js +0 -1
  322. package/packages/dashboard/ui-dist/_next/static/chunks/app/app/page-366fb7c078d4e9e0.js +0 -1
  323. package/packages/dashboard/ui-dist/_next/static/chunks/app/cloud/link/page-fa1d5842aa90e8a6.js +0 -1
  324. package/packages/dashboard/ui-dist/_next/static/chunks/app/complete-profile/page-dd64bbdf66b639cd.js +0 -1
  325. package/packages/dashboard/ui-dist/_next/static/chunks/app/connect-repos/page-113060009ef35bc2.js +0 -1
  326. package/packages/dashboard/ui-dist/_next/static/chunks/app/history/page-9965d2483011b846.js +0 -1
  327. package/packages/dashboard/ui-dist/_next/static/chunks/app/layout-6b91e33784c20610.js +0 -1
  328. package/packages/dashboard/ui-dist/_next/static/chunks/app/login/page-435eceb0073be027.js +0 -1
  329. package/packages/dashboard/ui-dist/_next/static/chunks/app/metrics/page-1e37ef8e73940b40.js +0 -1
  330. package/packages/dashboard/ui-dist/_next/static/chunks/app/page-8119d4246743574e.js +0 -1
  331. package/packages/dashboard/ui-dist/_next/static/chunks/app/pricing/page-9db3ebdfa567a7c9.js +0 -1
  332. package/packages/dashboard/ui-dist/_next/static/chunks/app/providers/page-ecb16ffd3b36262b.js +0 -1
  333. package/packages/dashboard/ui-dist/_next/static/chunks/app/providers/setup/[provider]/page-4dbe33f0f7691b7c.js +0 -1
  334. package/packages/dashboard/ui-dist/_next/static/chunks/app/signup/page-c7a0a28341365ae0.js +0 -1
  335. package/packages/dashboard/ui-dist/_next/static/chunks/e868780c-48e5f147c90a3a41.js +0 -18
  336. package/packages/dashboard/ui-dist/_next/static/chunks/fd9d1056-609918ca7b6280bb.js +0 -1
  337. package/packages/dashboard/ui-dist/_next/static/chunks/framework-f66176bb897dc684.js +0 -1
  338. package/packages/dashboard/ui-dist/_next/static/chunks/main-311c3db74dcfadb7.js +0 -1
  339. package/packages/dashboard/ui-dist/_next/static/chunks/main-app-fdbeb09028f57c9f.js +0 -1
  340. package/packages/dashboard/ui-dist/_next/static/chunks/pages/_app-72b849fbd24ac258.js +0 -1
  341. package/packages/dashboard/ui-dist/_next/static/chunks/pages/_error-7ba65e1336b92748.js +0 -1
  342. package/packages/dashboard/ui-dist/_next/static/chunks/polyfills-42372ed130431b0a.js +0 -1
  343. package/packages/dashboard/ui-dist/_next/static/chunks/webpack-1cdd8ed57114d5e1.js +0 -1
  344. package/packages/dashboard/ui-dist/_next/static/css/4034f236dd1a3178.css +0 -1
  345. package/packages/dashboard/ui-dist/_next/static/css/6892f8422896ef7a.css +0 -1
  346. package/packages/dashboard/ui-dist/_next/static/iJ3Uiz3IrqUJL7IxKZHiV/_buildManifest.js +0 -1
  347. package/packages/dashboard/ui-dist/_next/static/iJ3Uiz3IrqUJL7IxKZHiV/_ssgManifest.js +0 -1
  348. package/packages/dashboard/ui-dist/_next/static/l-jd878zUJ_IlraqEWMZc/_buildManifest.js +0 -1
  349. package/packages/dashboard/ui-dist/_next/static/l-jd878zUJ_IlraqEWMZc/_ssgManifest.js +0 -1
  350. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-128.png +0 -0
  351. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-256.png +0 -0
  352. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-32.png +0 -0
  353. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-512.png +0 -0
  354. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-64.png +0 -0
  355. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo.svg +0 -45
  356. package/packages/dashboard/ui-dist/alt-logos/logo.svg +0 -38
  357. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-128.png +0 -0
  358. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-256.png +0 -0
  359. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-32.png +0 -0
  360. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-512.png +0 -0
  361. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-64.png +0 -0
  362. package/packages/dashboard/ui-dist/alt-logos/monogram-logo.svg +0 -38
  363. package/packages/dashboard/ui-dist/app/onboarding.html +0 -1
  364. package/packages/dashboard/ui-dist/app/onboarding.txt +0 -7
  365. package/packages/dashboard/ui-dist/app.html +0 -1
  366. package/packages/dashboard/ui-dist/app.txt +0 -7
  367. package/packages/dashboard/ui-dist/apple-icon.png +0 -0
  368. package/packages/dashboard/ui-dist/cloud/link.html +0 -1
  369. package/packages/dashboard/ui-dist/cloud/link.txt +0 -7
  370. package/packages/dashboard/ui-dist/complete-profile.html +0 -5
  371. package/packages/dashboard/ui-dist/complete-profile.txt +0 -7
  372. package/packages/dashboard/ui-dist/connect-repos.html +0 -1
  373. package/packages/dashboard/ui-dist/connect-repos.txt +0 -7
  374. package/packages/dashboard/ui-dist/history.html +0 -1
  375. package/packages/dashboard/ui-dist/history.txt +0 -7
  376. package/packages/dashboard/ui-dist/index.html +0 -1
  377. package/packages/dashboard/ui-dist/index.txt +0 -7
  378. package/packages/dashboard/ui-dist/login.html +0 -5
  379. package/packages/dashboard/ui-dist/login.txt +0 -7
  380. package/packages/dashboard/ui-dist/metrics.html +0 -1
  381. package/packages/dashboard/ui-dist/metrics.txt +0 -7
  382. package/packages/dashboard/ui-dist/pricing.html +0 -13
  383. package/packages/dashboard/ui-dist/pricing.txt +0 -7
  384. package/packages/dashboard/ui-dist/providers/setup/claude.html +0 -1
  385. package/packages/dashboard/ui-dist/providers/setup/claude.txt +0 -8
  386. package/packages/dashboard/ui-dist/providers/setup/codex.html +0 -1
  387. package/packages/dashboard/ui-dist/providers/setup/codex.txt +0 -8
  388. package/packages/dashboard/ui-dist/providers/setup/cursor.html +0 -1
  389. package/packages/dashboard/ui-dist/providers/setup/cursor.txt +0 -8
  390. package/packages/dashboard/ui-dist/providers.html +0 -1
  391. package/packages/dashboard/ui-dist/providers.txt +0 -7
  392. package/packages/dashboard/ui-dist/signup.html +0 -6
  393. package/packages/dashboard/ui-dist/signup.txt +0 -7
  394. package/packages/dashboard-server/dist/health-worker-manager.d.ts +0 -62
  395. package/packages/dashboard-server/dist/health-worker-manager.js +0 -144
  396. package/packages/dashboard-server/dist/health-worker.d.ts +0 -9
  397. package/packages/dashboard-server/dist/health-worker.js +0 -79
  398. package/packages/dashboard-server/dist/index.d.ts +0 -18
  399. package/packages/dashboard-server/dist/index.js +0 -17
  400. package/packages/dashboard-server/dist/metrics.d.ts +0 -105
  401. package/packages/dashboard-server/dist/metrics.js +0 -193
  402. package/packages/dashboard-server/dist/needs-attention.d.ts +0 -24
  403. package/packages/dashboard-server/dist/needs-attention.js +0 -78
  404. package/packages/dashboard-server/dist/server.d.ts +0 -25
  405. package/packages/dashboard-server/dist/server.js +0 -5158
  406. package/packages/dashboard-server/dist/start.d.ts +0 -6
  407. package/packages/dashboard-server/dist/start.js +0 -13
  408. package/packages/dashboard-server/dist/types/threading.d.ts +0 -8
  409. package/packages/dashboard-server/dist/types/threading.js +0 -2
  410. package/packages/dashboard-server/dist/user-bridge.d.ts +0 -158
  411. package/packages/dashboard-server/dist/user-bridge.js +0 -390
  412. package/packages/dashboard-server/package.json +0 -55
@@ -1,612 +0,0 @@
1
- #!/usr/bin/env bash
2
-
3
- set -euo pipefail
4
-
5
- log() {
6
- echo "[workspace] $*"
7
- }
8
-
9
- # Debug logging function
10
- debug() {
11
- if [[ "${GH_CREDENTIAL_DEBUG:-}" == "1" ]]; then
12
- echo "[workspace:debug] $*" >&2
13
- fi
14
- }
15
-
16
- # Fix volume permissions and drop to workspace user if running as root
17
- if [[ "$(id -u)" == "0" ]]; then
18
- # Fix /data and /workspace permissions before dropping privileges
19
- # Fresh Fly.io volumes are root-owned, need to chown for workspace user
20
- log "Fixing volume permissions..."
21
- chown -R workspace:workspace /data /workspace 2>/dev/null || true
22
-
23
- # ============================================================================
24
- # SSH Server Setup (for CLI tunneling - Codex OAuth callback forwarding)
25
- # When ENABLE_SSH=true, start SSH server on port 3022 for secure tunneling
26
- # ============================================================================
27
- if [[ "${ENABLE_SSH:-false}" == "true" ]]; then
28
- SSH_PORT="${SSH_PORT:-3022}"
29
- log "Starting SSH server on port ${SSH_PORT}..."
30
-
31
- # Set SSH password for workspace user
32
- SSH_PASS="${SSH_PASSWORD:-devpassword}"
33
- echo "workspace:${SSH_PASS}" | chpasswd
34
-
35
- # Configure SSH server for tunneling
36
- # - Allow password auth (for CLI simplicity)
37
- # - Listen on port 3022 (non-privileged)
38
- # - Allow TCP forwarding (for port tunneling)
39
- mkdir -p /etc/ssh/sshd_config.d
40
- cat > /etc/ssh/sshd_config.d/workspace.conf <<SSHEOF
41
- Port ${SSH_PORT}
42
- PasswordAuthentication yes
43
- PermitRootLogin no
44
- AllowUsers workspace
45
- AllowTcpForwarding yes
46
- GatewayPorts no
47
- X11Forwarding no
48
- SSHEOF
49
-
50
- # Start SSH server in background
51
- /usr/sbin/sshd -e -p "${SSH_PORT}"
52
- log "SSH server started (port ${SSH_PORT}, user: workspace)"
53
- fi
54
-
55
- # ============================================================================
56
- # Persist workspace environment for SSH sessions (must be done as root)
57
- # SSH sessions don't inherit the container's runtime environment, so we write
58
- # critical variables to /etc/profile.d/ which gets sourced by login shells
59
- # ============================================================================
60
- if [[ -n "${CLOUD_API_URL:-}" || -n "${WORKSPACE_ID:-}" ]]; then
61
- log "Persisting workspace environment for SSH sessions"
62
- # Compute HOME path for the env file
63
- _DATA_DIR="${AGENT_RELAY_DATA_DIR:-/data}"
64
- if [[ -n "${WORKSPACE_OWNER_USER_ID:-}" ]]; then
65
- _USER_HOME="${_DATA_DIR}/users/${WORKSPACE_OWNER_USER_ID}"
66
- else
67
- _USER_HOME="/home/workspace"
68
- fi
69
- cat > /etc/profile.d/workspace-env.sh <<ENVEOF
70
- # Workspace environment variables (auto-generated by entrypoint.sh)
71
- export WORKSPACE_ID="${WORKSPACE_ID:-}"
72
- export WORKSPACE_OWNER_USER_ID="${WORKSPACE_OWNER_USER_ID:-}"
73
- export CLOUD_API_URL="${CLOUD_API_URL:-}"
74
- export WORKSPACE_TOKEN="${WORKSPACE_TOKEN:-}"
75
- export WORKSPACE_DIR="${WORKSPACE_DIR:-/workspace}"
76
- export HOME="${_USER_HOME}"
77
- export AGENT_RELAY_USER_ID="${WORKSPACE_OWNER_USER_ID:-}"
78
- export AGENT_RELAY_DATA_DIR="${_DATA_DIR}"
79
- export AGENT_RELAY_API_KEY="${AGENT_RELAY_API_KEY:-}"
80
-
81
- # Source GH_TOKEN from user-writable file if available (written after startup)
82
- # This enables SSH sessions to use the token fetched during container init
83
- if [[ -f "${_USER_HOME}/.gh_token" ]]; then
84
- source "${_USER_HOME}/.gh_token"
85
- fi
86
- ENVEOF
87
- chmod 644 /etc/profile.d/workspace-env.sh
88
- fi
89
-
90
- log "Dropping privileges to workspace user..."
91
- exec gosu workspace "$0" "$@"
92
- fi
93
-
94
- PORT="${AGENT_RELAY_DASHBOARD_PORT:-${PORT:-3888}}"
95
- export AGENT_RELAY_DASHBOARD_PORT="${PORT}"
96
- export PORT="${PORT}"
97
-
98
- # Disable auto-updates for AI CLIs in container environments
99
- # Prevents permission errors when CLIs try to self-update with npm/pip
100
- export DISABLE_AUTOUPDATER=1
101
- # Belt-and-suspenders flags to block Codex/OpenAI update checks
102
- export CODEX_CHECK_FOR_UPDATES=false
103
- export CODEX_DISABLE_AUTOUPDATE=1
104
- export OPENAI_CLI_NO_UPDATE=1
105
- export NO_UPDATE_NOTIFIER=1
106
- export NPM_CONFIG_UPDATE_NOTIFIER=false
107
- log "Auto-updates disabled for AI CLIs (container environment)"
108
-
109
- # ============================================================================
110
- # Git credential helper configuration
111
- # Clean up conflicting credential helpers that gh CLI or other tools may set
112
- # git-credential-relay requires no host-specific overrides to work properly
113
- # ============================================================================
114
- git config --global --unset-all 'credential.https://github.com.helper' 2>/dev/null || true
115
- git config --global --unset-all 'credential.https://gist.github.com.helper' 2>/dev/null || true
116
- log "Git credential helper configured (removed conflicting gh auth overrides)"
117
-
118
- # ============================================================================
119
- # Per-user credential storage setup
120
- # Create user-specific HOME on persistent volume (/data)
121
- # This enables multi-user workspaces where each user has their own credentials
122
- # ============================================================================
123
- DATA_DIR="${AGENT_RELAY_DATA_DIR:-/data}"
124
- if [[ -n "${WORKSPACE_OWNER_USER_ID:-}" ]]; then
125
- USER_HOME="${DATA_DIR}/users/${WORKSPACE_OWNER_USER_ID}"
126
- log "Setting up per-user HOME at ${USER_HOME}"
127
- mkdir -p "${USER_HOME}"
128
- mkdir -p "${USER_HOME}/.claude"
129
- mkdir -p "${USER_HOME}/.codex"
130
- mkdir -p "${USER_HOME}/.config/gcloud"
131
- mkdir -p "${USER_HOME}/.config/gh"
132
- export HOME="${USER_HOME}"
133
- # Ensure user-local bin is on PATH for per-user shims/wrappers
134
- export PATH="${HOME}/.local/bin:${PATH}"
135
- export XDG_CONFIG_HOME="${USER_HOME}/.config"
136
- export AGENT_RELAY_USER_ID="${WORKSPACE_OWNER_USER_ID}"
137
- log "HOME set to ${HOME} (user: ${WORKSPACE_OWNER_USER_ID})"
138
- else
139
- log "No WORKSPACE_OWNER_USER_ID set, using default HOME: ${HOME}"
140
- fi
141
-
142
- WORKSPACE_DIR="${WORKSPACE_DIR:-/workspace}"
143
- REPO_LIST="${REPOSITORIES:-}"
144
-
145
- mkdir -p "${WORKSPACE_DIR}"
146
- cd "${WORKSPACE_DIR}"
147
-
148
- # Configure Git credentials via the gateway (tokens auto-refresh via Nango)
149
- # The credential helper fetches fresh tokens from the cloud API on each git operation
150
- if [[ -n "${CLOUD_API_URL:-}" && -n "${WORKSPACE_ID:-}" && -n "${WORKSPACE_TOKEN:-}" ]]; then
151
- log "Configuring git credential helper (gateway mode)"
152
- git config --global credential.helper "/usr/local/bin/git-credential-relay"
153
- git config --global credential.useHttpPath true
154
- export GIT_TERMINAL_PROMPT=0
155
-
156
- # ============================================================================
157
- # PRE-FETCH GitHub token at startup and export to environment
158
- # This ensures GH_TOKEN is available for git operations and spawned agents
159
- # even if cloud API becomes unreachable later. The credential helper's
160
- # fallback chain will use this token (env > hosts.yml > gh CLI > cloud API).
161
- # ============================================================================
162
- if [[ -z "${GH_TOKEN:-}" ]]; then
163
- log "Fetching GitHub token from cloud API (with retry)..."
164
-
165
- GH_TOKEN_MAX_RETRIES=3
166
- GH_TOKEN_RETRY_DELAY=2
167
- GH_TOKEN_FETCHED=""
168
-
169
- for attempt in $(seq 1 $GH_TOKEN_MAX_RETRIES); do
170
- log "Attempt $attempt/$GH_TOKEN_MAX_RETRIES to fetch token..."
171
-
172
- # Remove -f flag to capture error responses, use -w to get HTTP status
173
- GH_TOKEN_HTTP_CODE=0
174
- GH_TOKEN_RESPONSE=$(curl -s -w "\n%{http_code}" --max-time 10 \
175
- -H "Authorization: Bearer ${WORKSPACE_TOKEN}" \
176
- "${CLOUD_API_URL}/api/git/token?workspaceId=${WORKSPACE_ID}" 2>&1) || true
177
-
178
- # Split response and status code
179
- GH_TOKEN_HTTP_CODE=$(echo "$GH_TOKEN_RESPONSE" | tail -1)
180
- GH_TOKEN_RESPONSE=$(echo "$GH_TOKEN_RESPONSE" | head -n -1)
181
-
182
- debug "HTTP Status: $GH_TOKEN_HTTP_CODE"
183
- debug "Response: ${GH_TOKEN_RESPONSE:0:200}"
184
-
185
- # Handle different failure modes
186
- case "$GH_TOKEN_HTTP_CODE" in
187
- 200)
188
- # Success - parse token
189
- FETCHED_TOKEN=$(echo "$GH_TOKEN_RESPONSE" | jq -r '.userToken // .token // empty' 2>/dev/null)
190
- if [[ -n "${FETCHED_TOKEN}" && "${FETCHED_TOKEN}" != "null" ]]; then
191
- export GH_TOKEN="${FETCHED_TOKEN}"
192
- export GITHUB_TOKEN="${FETCHED_TOKEN}"
193
- echo "export GH_TOKEN=\"${FETCHED_TOKEN}\"" > "${HOME}/.gh_token"
194
- echo "export GITHUB_TOKEN=\"${FETCHED_TOKEN}\"" >> "${HOME}/.gh_token"
195
- chmod 600 "${HOME}/.gh_token"
196
- log "✓ GH_TOKEN fetched successfully (attempt $attempt)"
197
- GH_TOKEN_FETCHED="yes"
198
- break
199
- else
200
- log "WARN: Response 200 but no token in JSON response"
201
- GH_TOKEN_FETCHED="empty-response"
202
- fi
203
- ;;
204
- 401|403)
205
- # Auth error - don't retry
206
- log "ERROR: Authentication failed (HTTP $GH_TOKEN_HTTP_CODE)"
207
- log " Check WORKSPACE_TOKEN and CLOUD_API_URL credentials"
208
- GH_TOKEN_FETCHED="auth-error"
209
- break
210
- ;;
211
- 000|28)
212
- # Network timeout (000=curl error, 28=timeout)
213
- log "WARN: Network timeout on attempt $attempt"
214
- [[ $attempt -lt $GH_TOKEN_MAX_RETRIES ]] && sleep $((GH_TOKEN_RETRY_DELAY * (2 ** (attempt - 1))))
215
- ;;
216
- *)
217
- # Other HTTP errors - could be transient, retry
218
- log "WARN: HTTP $GH_TOKEN_HTTP_CODE on attempt $attempt"
219
- [[ $attempt -lt $GH_TOKEN_MAX_RETRIES ]] && sleep $((GH_TOKEN_RETRY_DELAY * (2 ** (attempt - 1))))
220
- ;;
221
- esac
222
- done
223
-
224
- # Final status
225
- if [[ -z "$GH_TOKEN_FETCHED" ]]; then
226
- log "WARN: Could not fetch GitHub token after $GH_TOKEN_MAX_RETRIES attempts"
227
- log " Git operations will use credential helper fallback chain"
228
- fi
229
- else
230
- log "GH_TOKEN already set in environment"
231
- fi
232
-
233
- # Configure git identity for commits
234
- # Use env vars if set, otherwise default to "Agent Relay" / "agent@agent-relay.com"
235
- DEFAULT_GIT_EMAIL="${AGENT_NAME:-agent}@agent-relay.com"
236
- git config --global user.name "${GIT_USER_NAME:-Agent Relay}"
237
- git config --global user.email "${GIT_USER_EMAIL:-${DEFAULT_GIT_EMAIL}}"
238
- log "Git identity configured: ${GIT_USER_NAME:-Agent Relay} <${GIT_USER_EMAIL:-${DEFAULT_GIT_EMAIL}}>"
239
-
240
- # Configure gh CLI
241
- # NOTE: Do NOT create hosts.yml with placeholder - it causes migration errors
242
- # when combined with GH_TOKEN. The gh-relay wrapper in /usr/local/bin/gh
243
- # handles token refresh automatically with caching.
244
- # Install and configure gh-credential-relay credential helper
245
- # This allows gh CLI to fetch fresh tokens from cloud API on-demand
246
- if [[ -f "/app/deploy/workspace/gh-credential-relay" ]]; then
247
- sudo install -m 755 /app/deploy/workspace/gh-credential-relay /usr/local/bin/gh-credential-relay
248
- gh config set -h github.com credential-helper gh-credential-relay 2>/dev/null || true
249
- log "Configured gh CLI to use cloud API credential helper"
250
- fi
251
-
252
- mkdir -p "${HOME}/.config/gh"
253
- # Remove any stale hosts.yml that might cause migration errors
254
- rm -f "${HOME}/.config/gh/hosts.yml"
255
-
256
- # The gh-relay wrapper is installed at /usr/local/bin/gh during Docker build.
257
- # It fetches fresh tokens from /api/git/token and caches them for 55 minutes.
258
- # This handles the case where GH_TOKEN expires after ~1 hour.
259
- if [[ -x "/usr/local/bin/gh" ]]; then
260
- log "GitHub CLI wrapper installed at /usr/local/bin/gh (auto-refreshing tokens)"
261
- fi
262
-
263
- # Fallback: Use static GITHUB_TOKEN if provided (legacy mode)
264
- elif [[ -n "${GITHUB_TOKEN:-}" ]]; then
265
- log "Configuring git credentials (legacy static token mode)"
266
- GIT_ASKPASS_SCRIPT="/tmp/git-askpass.sh"
267
- cat > "${GIT_ASKPASS_SCRIPT}" <<'EOF'
268
- #!/usr/bin/env bash
269
- prompt="${1:-}"
270
- if [[ "${prompt}" == *"Username"* ]]; then
271
- echo "x-access-token"
272
- else
273
- echo "${GITHUB_TOKEN}"
274
- fi
275
- EOF
276
- chmod +x "${GIT_ASKPASS_SCRIPT}"
277
- export GIT_ASKPASS="${GIT_ASKPASS_SCRIPT}"
278
- export GIT_TERMINAL_PROMPT=0
279
- export GH_TOKEN="${GITHUB_TOKEN}"
280
-
281
- # Configure git identity for commits
282
- DEFAULT_GIT_EMAIL="${AGENT_NAME:-agent}@agent-relay.com"
283
- git config --global user.name "${GIT_USER_NAME:-Agent Relay}"
284
- git config --global user.email "${GIT_USER_EMAIL:-${DEFAULT_GIT_EMAIL}}"
285
- log "Git identity configured: ${GIT_USER_NAME:-Agent Relay} <${GIT_USER_EMAIL:-${DEFAULT_GIT_EMAIL}}>"
286
- fi
287
-
288
- clone_or_update_repo() {
289
- local repo="$1"
290
- repo="${repo// /}"
291
- if [[ -z "${repo}" ]]; then
292
- return
293
- fi
294
-
295
- local repo_name
296
- repo_name="$(basename "${repo}")"
297
- local target="${WORKSPACE_DIR}/${repo_name}"
298
- local url="https://github.com/${repo}.git"
299
-
300
- if [[ -d "${target}/.git" ]]; then
301
- log "Updating ${repo}..."
302
- git -C "${target}" remote set-url origin "${url}" >/dev/null 2>&1 || true
303
- git -C "${target}" fetch --all --prune >/dev/null 2>&1 || true
304
- git -C "${target}" pull --ff-only >/dev/null 2>&1 || true
305
- else
306
- log "Cloning ${repo}..."
307
- # Use shallow clone for faster initial setup (full history not needed for most agent work)
308
- # SHALLOW_CLONE env var can be set to "false" to disable this optimization
309
- if [[ "${SHALLOW_CLONE:-true}" == "true" ]]; then
310
- git clone --depth=1 "${url}" "${target}" >/dev/null 2>&1 || {
311
- log "WARN: Failed to clone ${repo}"
312
- }
313
- else
314
- git clone "${url}" "${target}" >/dev/null 2>&1 || {
315
- log "WARN: Failed to clone ${repo}"
316
- }
317
- fi
318
- fi
319
- # Note: safe.directory config is done after all clones complete (batched)
320
- }
321
-
322
- if [[ -n "${REPO_LIST}" ]]; then
323
- # Check if we have credentials configured (gateway mode or static token)
324
- if [[ -z "${GITHUB_TOKEN:-}" && -z "${CLOUD_API_URL:-}" ]]; then
325
- log "WARN: REPOSITORIES set but no credentials configured; clones may fail."
326
- fi
327
-
328
- IFS=',' read -ra repos <<< "${REPO_LIST}"
329
-
330
- # Clone repositories in PARALLEL for faster startup
331
- # Each clone runs in background, then we wait for all to complete
332
- log "Cloning ${#repos[@]} repositories in parallel..."
333
- for repo in "${repos[@]}"; do
334
- clone_or_update_repo "${repo}" &
335
- done
336
-
337
- # Wait for all background clone jobs to complete
338
- wait
339
- log "All repository clones complete"
340
-
341
- # Batch configure safe.directory for all cloned repos (runs once, not per-repo)
342
- # This prevents "dubious ownership" errors when git runs as different user
343
- for repo in "${repos[@]}"; do
344
- repo="${repo// /}"
345
- if [[ -n "${repo}" ]]; then
346
- repo_name="$(basename "${repo}")"
347
- target="${WORKSPACE_DIR}/${repo_name}"
348
- if [[ -d "${target}/.git" ]]; then
349
- git config --global --add safe.directory "${target}" 2>/dev/null || true
350
- fi
351
- fi
352
- done
353
- fi
354
-
355
- # ============================================================================
356
- # Configure agent policy enforcement for cloud workspaces
357
- # Policy is fetched from cloud API and enforced at runtime
358
- # ============================================================================
359
-
360
- if [[ -n "${CLOUD_API_URL:-}" && -n "${WORKSPACE_ID:-}" ]]; then
361
- log "Enabling agent policy enforcement"
362
- export AGENT_POLICY_ENFORCEMENT=1
363
- # Policy is fetched from ${CLOUD_API_URL}/api/policy/${WORKSPACE_ID}/internal
364
- fi
365
-
366
- # ============================================================================
367
- # Configure AI provider credentials
368
- # Create credential files that CLIs expect from ENV vars passed by provisioner
369
- # ============================================================================
370
-
371
- # Claude CLI expects ~/.claude/.credentials.json (note the dot prefix on filename)
372
- # Format: { claudeAiOauth: { accessToken: "...", refreshToken: "...", expiresAt: ... } }
373
- if [[ -n "${ANTHROPIC_TOKEN:-}" ]]; then
374
- log "Configuring Claude credentials..."
375
- mkdir -p "${HOME}/.claude"
376
- cat > "${HOME}/.claude/.credentials.json" <<EOF
377
- {
378
- "claudeAiOauth": {
379
- "accessToken": "${ANTHROPIC_TOKEN}",
380
- "refreshToken": "${ANTHROPIC_REFRESH_TOKEN:-}",
381
- "expiresAt": ${ANTHROPIC_TOKEN_EXPIRES_AT:-null}
382
- }
383
- }
384
- EOF
385
- chmod 600 "${HOME}/.claude/.credentials.json"
386
- fi
387
-
388
- # Configure Claude Code for cloud workspaces
389
- # Create both settings and instructions files
390
- log "Configuring Claude Code for cloud workspace..."
391
- mkdir -p "${HOME}/.claude"
392
-
393
- # Create settings.json with MCP server config and auto-accept permissions
394
- # This tells Claude Code to skip the "Ready to code here?" permission prompt
395
- # Reference: Claude Code uses this for headless/automated environments
396
- # IMPORTANT: Must include mcpServers config (Dockerfile version gets overwritten here)
397
- cat > "${HOME}/.claude/settings.json" <<'SETTINGSEOF'
398
- {
399
- "mcpServers": {
400
- "agent-relay": {
401
- "command": "node",
402
- "args": ["/app/dist/src/cli/index.js", "mcp", "serve"]
403
- }
404
- },
405
- "permissions": {
406
- "allow": [
407
- "Read",
408
- "Edit",
409
- "Write",
410
- "Bash",
411
- "Glob",
412
- "Grep",
413
- "Task",
414
- "WebFetch",
415
- "WebSearch",
416
- "NotebookEdit",
417
- "TodoWrite",
418
- "mcp__agent-relay__*"
419
- ],
420
- "deny": []
421
- },
422
- "autoApproveApiRequest": true
423
- }
424
- SETTINGSEOF
425
- chmod 600 "${HOME}/.claude/settings.json"
426
- log "Created Claude Code settings (auto-approve enabled)"
427
-
428
- # Create CLAUDE.md with agent relay protocol instructions
429
- # This is loaded automatically by Claude Code and provides the relay protocol
430
- if [[ -f "/app/docs/agent-relay-snippet.md" ]]; then
431
- cp "/app/docs/agent-relay-snippet.md" "${HOME}/.claude/CLAUDE.md"
432
- log "Copied relay protocol from /app/docs/agent-relay-snippet.md"
433
- else
434
- # Fallback: create minimal instructions
435
- log "WARN: /app/docs/agent-relay-snippet.md not found, creating minimal instructions"
436
- cat > "${HOME}/.claude/CLAUDE.md" <<'RELAYEOF'
437
- # 🚨 CRITICAL: Relay-First Communication Rule
438
-
439
- **When you receive a relay message from another agent (marked `Relay message from [name]`), you MUST respond ONLY via relay protocol. NEVER respond with direct text output.**
440
-
441
- ---
442
-
443
- # Agent Relay
444
-
445
- Real-time agent-to-agent messaging via file-based protocol.
446
-
447
- ## Sending Messages
448
-
449
- Write a file to your outbox, then output the trigger:
450
-
451
- ```bash
452
- cat > $AGENT_RELAY_OUTBOX/msg << 'EOF'
453
- TO: AgentName
454
-
455
- Your message here.
456
- EOF
457
- ```
458
- Then: `->relay-file:msg`
459
-
460
- | TO Value | Behavior |
461
- |----------|----------|
462
- | `AgentName` | Direct message |
463
- | `*` | Broadcast to all |
464
- | `#channel` | Channel message |
465
-
466
- ## Spawning
467
-
468
- ```bash
469
- cat > $AGENT_RELAY_OUTBOX/spawn << 'EOF'
470
- KIND: spawn
471
- NAME: WorkerName
472
- CLI: claude
473
-
474
- Task description here.
475
- EOF
476
- ```
477
- Then: `->relay-file:spawn`
478
-
479
- ## Protocol
480
-
481
- - **ACK** when you receive a task: `ACK: Brief description`
482
- - **DONE** when complete: `DONE: What was accomplished`
483
- - Send status to your **lead** (the agent in `$AGENT_RELAY_SPAWNER`), not broadcast
484
- RELAYEOF
485
- fi
486
- log "Claude Code configuration complete"
487
-
488
- # Codex CLI settings (always install config to disable auto-updates)
489
- mkdir -p "${HOME}/.codex"
490
- if [[ -f "/app/deploy/workspace/codex.config.toml" ]]; then
491
- cp "/app/deploy/workspace/codex.config.toml" "${HOME}/.codex/config.toml"
492
- chmod 600 "${HOME}/.codex/config.toml"
493
- log "Codex configuration applied from codex.config.toml"
494
- else
495
- # Fallback: create minimal config (should not happen in production)
496
- log "WARN: codex.config.toml not found, creating minimal config"
497
- cat > "${HOME}/.codex/config.toml" <<CODEXCONFIGEOF
498
- check_for_updates = false
499
- CODEXCONFIGEOF
500
- chmod 600 "${HOME}/.codex/config.toml"
501
- fi
502
- # Also create JSON config for Codex (some versions read config.json instead of config.toml)
503
- cat > "${HOME}/.codex/config.json" <<'CODEXJSON'
504
- {
505
- "check_for_updates": false
506
- }
507
- CODEXJSON
508
- chmod 600 "${HOME}/.codex/config.json"
509
-
510
- # NPM wrapper to block Codex self-updates (no-op when Codex tries npm install -g @openai/codex)
511
- mkdir -p "${HOME}/.local/bin"
512
- cat > "${HOME}/.local/bin/npm" <<'NPMWRAPPER'
513
- #!/usr/bin/env bash
514
- if [[ "$1" == "install" && "$2" == "-g" && "$3" == @openai/codex* ]]; then
515
- echo "npm wrapper: skipping Codex self-update (auto-update disabled)" >&2
516
- exit 0
517
- fi
518
- exec /usr/local/bin/npm "$@"
519
- NPMWRAPPER
520
- chmod +x "${HOME}/.local/bin/npm"
521
-
522
- # Codex CLI expects ~/.codex/auth.json for credentials
523
- # Format: { tokens: { access_token: "...", refresh_token: "...", ... } }
524
- if [[ -n "${OPENAI_TOKEN:-}" ]]; then
525
- log "Configuring Codex credentials..."
526
- cat > "${HOME}/.codex/auth.json" <<EOF
527
- {
528
- "tokens": {
529
- "access_token": "${OPENAI_TOKEN}",
530
- "refresh_token": "${OPENAI_REFRESH_TOKEN:-}"
531
- }
532
- }
533
- EOF
534
- chmod 600 "${HOME}/.codex/auth.json"
535
- fi
536
-
537
- # Google/Gemini - uses application default credentials
538
- if [[ -n "${GOOGLE_TOKEN:-}" ]]; then
539
- log "Configuring Google credentials..."
540
- mkdir -p "${HOME}/.config/gcloud"
541
- cat > "${HOME}/.config/gcloud/application_default_credentials.json" <<EOF
542
- {
543
- "type": "authorized_user",
544
- "access_token": "${GOOGLE_TOKEN}"
545
- }
546
- EOF
547
- chmod 600 "${HOME}/.config/gcloud/application_default_credentials.json"
548
- fi
549
-
550
- # ============================================================================
551
- # Detect workspace path and start daemon
552
- # The daemon must start from the same directory that spawned agents will use
553
- # to ensure consistent socket paths
554
- # ============================================================================
555
-
556
- # Function to detect the actual workspace path (same logic as project-namespace.ts)
557
- detect_workspace_path() {
558
- local base_dir="${1}"
559
-
560
- # 1. Explicit override via env var
561
- if [[ -n "${WORKSPACE_CWD:-}" ]]; then
562
- echo "${WORKSPACE_CWD}"
563
- return
564
- fi
565
-
566
- # 2. Check if base_dir itself is a git repo
567
- if [[ -d "${base_dir}/.git" ]]; then
568
- echo "${base_dir}"
569
- return
570
- fi
571
-
572
- # 3. Scan for cloned repos (directories with .git)
573
- local first_repo=""
574
- for dir in "${base_dir}"/*/; do
575
- if [[ -d "${dir}.git" ]]; then
576
- # Use first repo found (alphabetically sorted by bash glob)
577
- first_repo="${dir%/}"
578
- break
579
- fi
580
- done
581
-
582
- if [[ -n "${first_repo}" ]]; then
583
- echo "${first_repo}"
584
- return
585
- fi
586
-
587
- # 4. Fall back to base_dir
588
- echo "${base_dir}"
589
- }
590
-
591
- # Detect the actual workspace path
592
- ACTUAL_WORKSPACE=$(detect_workspace_path "${WORKSPACE_DIR}")
593
- log "Detected workspace path: ${ACTUAL_WORKSPACE}"
594
-
595
- # Change to the detected workspace before starting daemon
596
- cd "${ACTUAL_WORKSPACE}"
597
-
598
- # Set RELAY_PROJECT from WORKSPACE_ID at runtime (MCP socket discovery uses this)
599
- export RELAY_PROJECT="${WORKSPACE_ID:-${RELAY_PROJECT:-default}}"
600
-
601
- # Ensure node can resolve modules from /app when running from workspace directory
602
- # Without this, @agent-relay/dashboard won't be found since it's in /app/node_modules
603
- export NODE_PATH="/app/node_modules"
604
-
605
- log "Starting agent-relay daemon on port ${PORT} from ${ACTUAL_WORKSPACE}"
606
- args=(/app/dist/src/cli/index.js up --dashboard --port "${PORT}")
607
-
608
- if [[ "${SUPERVISOR_ENABLED:-true}" == "true" ]]; then
609
- args+=("--watch")
610
- fi
611
-
612
- exec node "${args[@]}"
@@ -1,90 +0,0 @@
1
- #!/usr/bin/env bash
2
- #
3
- # GitHub CLI Credential Helper for Agent Relay Workspaces
4
- #
5
- # This credential helper provides GitHub authentication tokens to the gh CLI
6
- # by fetching from the cloud API. It works in non-interactive container
7
- # environments without requiring manual gh auth login.
8
- #
9
- # Installation:
10
- # gh config set -h github.com credential-helper gh-credential-relay
11
- #
12
- # Environment variables (auto-set by workspace entrypoint):
13
- # CLOUD_API_URL - Cloud API base URL
14
- # WORKSPACE_ID - Workspace identifier
15
- # WORKSPACE_TOKEN - Bearer token for cloud API auth
16
-
17
- set -euo pipefail
18
-
19
- # Debug logging (enable with GH_CREDENTIAL_DEBUG=1)
20
- debug() {
21
- if [[ "${GH_CREDENTIAL_DEBUG:-}" == "1" ]]; then
22
- echo "gh-credential-relay: $*" >&2
23
- fi
24
- }
25
-
26
- debug "Called with args: $*"
27
-
28
- # Only handle 'get' operation for storing credentials
29
- if [[ "${1:-}" != "get" ]]; then
30
- debug "Ignoring non-get operation: ${1:-}"
31
- exit 0
32
- fi
33
-
34
- # Read input from gh CLI (host, protocol, etc)
35
- declare -A input
36
- while IFS='=' read -r key value; do
37
- [[ -z "$key" ]] && break
38
- input["$key"]="$value"
39
- done
40
-
41
- host="${input[host]:-}"
42
- debug "Host: $host"
43
-
44
- # Only provide credentials for github.com
45
- if [[ "$host" != "github.com" ]]; then
46
- debug "Not github.com, skipping"
47
- exit 0
48
- fi
49
-
50
- # Check required environment variables
51
- if [[ -z "${CLOUD_API_URL:-}" ]]; then
52
- echo "gh-credential-relay: CLOUD_API_URL not set" >&2
53
- exit 1
54
- fi
55
-
56
- if [[ -z "${WORKSPACE_ID:-}" ]]; then
57
- echo "gh-credential-relay: WORKSPACE_ID not set" >&2
58
- exit 1
59
- fi
60
-
61
- if [[ -z "${WORKSPACE_TOKEN:-}" ]]; then
62
- echo "gh-credential-relay: WORKSPACE_TOKEN not set" >&2
63
- exit 1
64
- fi
65
-
66
- debug "Fetching token from ${CLOUD_API_URL}/api/git/token?workspaceId=${WORKSPACE_ID}"
67
-
68
- # Fetch fresh token from cloud API (5 second timeout)
69
- response=$(curl -s --max-time 5 \
70
- -H "Authorization: Bearer ${WORKSPACE_TOKEN}" \
71
- "${CLOUD_API_URL}/api/git/token?workspaceId=${WORKSPACE_ID}" 2>/dev/null) || true
72
-
73
- if [[ -z "$response" ]]; then
74
- debug "No response from cloud API"
75
- exit 1
76
- fi
77
-
78
- # Parse JSON response
79
- token=$(echo "$response" | jq -r '.userToken // .token // empty' 2>/dev/null)
80
-
81
- if [[ -z "$token" ]]; then
82
- debug "No token in response"
83
- exit 1
84
- fi
85
-
86
- # Output in git credential format (same as git-credential-relay)
87
- echo "protocol=https"
88
- echo "host=github.com"
89
- echo "username=x-access-token"
90
- echo "password=${token}"