agent-relay 1.6.0 → 2.0.4

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 (1074) hide show
  1. package/.cursor/mcp.json +11 -0
  2. package/.gitleaks.toml +26 -0
  3. package/.mcp.json +11 -0
  4. package/.nvmrc +1 -1
  5. package/ARCHITECTURE.md +10 -10
  6. package/CHANGELOG.md +38 -0
  7. package/LICENSE +185 -17
  8. package/README.md +43 -5
  9. package/SESSION_HANDOFF.md +67 -0
  10. package/bin/relay-pty-darwin-arm64 +0 -0
  11. package/bin/relay-pty-darwin-x64 +0 -0
  12. package/bin/relay-pty-linux-x64 +0 -0
  13. package/deploy/workspace/entrypoint.sh +83 -11
  14. package/deploy/workspace/git-credential-relay +152 -27
  15. package/deploy/workspace/git-credential-relay.test.sh +230 -0
  16. package/dist/dashboard/out/404.html +1 -1
  17. package/dist/dashboard/out/_next/static/chunks/116-a883fca163f3a5bc.js +1 -0
  18. package/dist/dashboard/out/_next/static/chunks/320-900169c942e31422.js +1 -0
  19. package/dist/dashboard/out/_next/static/chunks/631-af51bad94027527a.js +1 -0
  20. package/dist/dashboard/out/_next/static/chunks/766-2aea80818f7eb0d8.js +1 -0
  21. package/dist/dashboard/out/_next/static/chunks/891-5cb1513eeb97a891.js +1 -0
  22. package/dist/dashboard/out/_next/static/chunks/app/app/page-2e525b1dcc790967.js +1 -0
  23. package/dist/dashboard/out/_next/static/chunks/app/page-4e64923d73c35bc9.js +1 -0
  24. package/dist/dashboard/out/_next/static/chunks/app/providers/page-e65a0010da6ea5be.js +1 -0
  25. package/dist/dashboard/out/_next/static/chunks/app/providers/setup/[provider]/page-84161c802b020a1f.js +1 -0
  26. package/dist/dashboard/out/_next/static/css/99c2552394077586.css +1 -0
  27. package/dist/dashboard/out/app/onboarding.html +1 -1
  28. package/dist/dashboard/out/app/onboarding.txt +1 -1
  29. package/dist/dashboard/out/app.html +1 -1
  30. package/dist/dashboard/out/app.txt +2 -2
  31. package/dist/dashboard/out/cloud/link.html +1 -1
  32. package/dist/dashboard/out/cloud/link.txt +2 -2
  33. package/dist/dashboard/out/connect-repos.html +1 -1
  34. package/dist/dashboard/out/connect-repos.txt +1 -1
  35. package/dist/dashboard/out/history.html +1 -1
  36. package/dist/dashboard/out/history.txt +2 -2
  37. package/dist/dashboard/out/index.html +1 -1
  38. package/dist/dashboard/out/index.txt +2 -2
  39. package/dist/dashboard/out/login.html +2 -2
  40. package/dist/dashboard/out/login.txt +1 -1
  41. package/dist/dashboard/out/metrics.html +1 -1
  42. package/dist/dashboard/out/metrics.txt +2 -2
  43. package/dist/dashboard/out/pricing.html +3 -3
  44. package/dist/dashboard/out/pricing.txt +2 -2
  45. package/dist/dashboard/out/providers/setup/claude.html +1 -1
  46. package/dist/dashboard/out/providers/setup/claude.txt +2 -2
  47. package/dist/dashboard/out/providers/setup/codex.html +1 -1
  48. package/dist/dashboard/out/providers/setup/codex.txt +2 -2
  49. package/dist/dashboard/out/providers/setup/cursor.html +1 -0
  50. package/dist/dashboard/out/providers/setup/cursor.txt +8 -0
  51. package/dist/dashboard/out/providers.html +1 -1
  52. package/dist/dashboard/out/providers.txt +2 -2
  53. package/dist/dashboard/out/signup.html +2 -2
  54. package/dist/dashboard/out/signup.txt +1 -1
  55. package/dist/src/bridge/index.d.ts +8 -0
  56. package/dist/src/bridge/index.js +8 -0
  57. package/dist/src/cli/index.js +3091 -0
  58. package/dist/src/cloud/index.d.ts +8 -0
  59. package/dist/src/cloud/index.js +8 -0
  60. package/dist/src/config/relay-config.d.ts +5 -0
  61. package/dist/src/config/relay-config.js +5 -0
  62. package/dist/src/continuity/index.d.ts +5 -0
  63. package/dist/src/continuity/index.js +5 -0
  64. package/dist/src/daemon/index.d.ts +8 -0
  65. package/dist/src/daemon/index.js +9 -0
  66. package/dist/src/dashboard-server/index.d.ts +8 -0
  67. package/dist/src/dashboard-server/index.js +8 -0
  68. package/dist/src/hooks/index.d.ts +10 -0
  69. package/dist/src/hooks/index.js +10 -0
  70. package/dist/src/index.d.ts +13 -0
  71. package/dist/src/index.js +16 -0
  72. package/dist/src/memory/index.d.ts +5 -0
  73. package/dist/src/memory/index.js +5 -0
  74. package/dist/src/policy/index.d.ts +5 -0
  75. package/dist/src/policy/index.js +5 -0
  76. package/dist/src/protocol/index.d.ts +8 -0
  77. package/dist/src/protocol/index.js +8 -0
  78. package/dist/src/resiliency/index.d.ts +5 -0
  79. package/dist/src/resiliency/index.js +5 -0
  80. package/dist/src/shared/cli-auth-config.d.ts +5 -0
  81. package/dist/src/shared/cli-auth-config.js +5 -0
  82. package/dist/src/state/index.d.ts +5 -0
  83. package/dist/src/state/index.js +5 -0
  84. package/dist/src/storage/index.d.ts +8 -0
  85. package/dist/src/storage/index.js +8 -0
  86. package/dist/src/trajectory/index.d.ts +5 -0
  87. package/dist/src/trajectory/index.js +5 -0
  88. package/dist/src/utils/index.d.ts +5 -0
  89. package/dist/src/utils/index.js +5 -0
  90. package/dist/src/wrapper/index.d.ts +8 -0
  91. package/dist/src/wrapper/index.js +11 -0
  92. package/package.json +64 -19
  93. package/packages/api-types/dist/index.d.ts +21 -0
  94. package/packages/api-types/dist/index.js +22 -0
  95. package/packages/api-types/dist/schemas/agent.d.ts +259 -0
  96. package/packages/api-types/dist/schemas/agent.js +102 -0
  97. package/packages/api-types/dist/schemas/api.d.ts +290 -0
  98. package/packages/api-types/dist/schemas/api.js +162 -0
  99. package/packages/api-types/dist/schemas/decision.d.ts +230 -0
  100. package/packages/api-types/dist/schemas/decision.js +104 -0
  101. package/packages/api-types/dist/schemas/fleet.d.ts +615 -0
  102. package/packages/api-types/dist/schemas/fleet.js +71 -0
  103. package/packages/api-types/dist/schemas/history.d.ts +180 -0
  104. package/packages/api-types/dist/schemas/history.js +72 -0
  105. package/packages/api-types/dist/schemas/index.d.ts +14 -0
  106. package/packages/api-types/dist/schemas/index.js +22 -0
  107. package/packages/api-types/dist/schemas/message.d.ts +456 -0
  108. package/packages/api-types/dist/schemas/message.js +88 -0
  109. package/packages/api-types/dist/schemas/session.d.ts +60 -0
  110. package/packages/api-types/dist/schemas/session.js +36 -0
  111. package/packages/api-types/dist/schemas/task.d.ts +111 -0
  112. package/packages/api-types/dist/schemas/task.js +64 -0
  113. package/packages/api-types/package.json +61 -0
  114. package/packages/api-types/scripts/generate-openapi.ts +106 -0
  115. package/packages/bridge/dist/index.d.ts +8 -0
  116. package/packages/bridge/dist/index.js +9 -0
  117. package/packages/bridge/dist/multi-project-client.d.ts +99 -0
  118. package/packages/bridge/dist/multi-project-client.js +389 -0
  119. package/packages/bridge/dist/shadow-cli.js +75 -0
  120. package/packages/bridge/dist/spawner.d.ts +210 -0
  121. package/packages/bridge/dist/spawner.js +1278 -0
  122. package/packages/bridge/dist/types.d.ts +131 -0
  123. package/packages/bridge/dist/utils.d.ts +15 -0
  124. package/packages/bridge/dist/utils.js +60 -0
  125. package/packages/bridge/package.json +45 -0
  126. package/packages/cloud/dist/api/admin.js +225 -0
  127. package/packages/cloud/dist/api/billing.js +564 -0
  128. package/packages/cloud/dist/api/cli-pty-runner.d.ts +53 -0
  129. package/packages/cloud/dist/api/cli-pty-runner.js +193 -0
  130. package/packages/cloud/dist/api/codex-auth-helper.js +327 -0
  131. package/packages/cloud/dist/api/consensus.js +261 -0
  132. package/packages/cloud/dist/api/coordinators.js +750 -0
  133. package/packages/cloud/dist/api/daemons.js +535 -0
  134. package/packages/cloud/dist/api/generic-webhooks.js +129 -0
  135. package/packages/cloud/dist/api/github-app.js +223 -0
  136. package/packages/cloud/dist/api/monitoring.js +578 -0
  137. package/packages/cloud/dist/api/nango-auth.js +674 -0
  138. package/packages/cloud/dist/api/onboarding.d.ts +15 -0
  139. package/packages/cloud/dist/api/onboarding.js +679 -0
  140. package/packages/cloud/dist/api/policy.js +229 -0
  141. package/packages/cloud/dist/api/provider-env.d.ts +14 -0
  142. package/packages/cloud/dist/api/provider-env.js +75 -0
  143. package/packages/cloud/dist/api/providers.js +564 -0
  144. package/packages/cloud/dist/api/repos.js +577 -0
  145. package/packages/cloud/dist/api/sessions.d.ts +11 -0
  146. package/packages/cloud/dist/api/sessions.js +302 -0
  147. package/packages/cloud/dist/api/teams.js +281 -0
  148. package/packages/cloud/dist/api/test-helpers.js +745 -0
  149. package/packages/cloud/dist/api/workspaces.js +1799 -0
  150. package/packages/cloud/dist/billing/plans.js +245 -0
  151. package/packages/cloud/dist/config.d.ts +5 -0
  152. package/packages/cloud/dist/config.js +5 -0
  153. package/packages/cloud/dist/db/drizzle.d.ts +256 -0
  154. package/packages/cloud/dist/db/drizzle.js +1286 -0
  155. package/packages/cloud/dist/db/schema.d.ts +4873 -0
  156. package/packages/cloud/dist/db/schema.js +620 -0
  157. package/packages/cloud/dist/index.d.ts +11 -0
  158. package/packages/cloud/dist/index.js +38 -0
  159. package/packages/cloud/dist/provisioner/index.d.ts +207 -0
  160. package/packages/cloud/dist/provisioner/index.js +2114 -0
  161. package/packages/cloud/dist/server.js +1924 -0
  162. package/packages/cloud/dist/services/index.d.ts +17 -0
  163. package/packages/cloud/dist/services/index.js +25 -0
  164. package/packages/cloud/dist/services/intro-expiration.d.ts +60 -0
  165. package/packages/cloud/dist/services/intro-expiration.js +252 -0
  166. package/packages/cloud/dist/services/nango.d.ts +201 -0
  167. package/packages/cloud/dist/services/nango.js +392 -0
  168. package/packages/cloud/dist/services/persistence.d.ts +131 -0
  169. package/packages/cloud/dist/shims/consensus.d.ts +23 -0
  170. package/packages/cloud/dist/shims/consensus.js +5 -0
  171. package/packages/cloud/package.json +60 -0
  172. package/packages/config/dist/bridge-config.d.ts +52 -0
  173. package/packages/config/dist/bridge-config.js +143 -0
  174. package/packages/config/dist/bridge-utils.d.ts +30 -0
  175. package/packages/config/dist/bridge-utils.js +54 -0
  176. package/packages/config/dist/cli-auth-config.js +391 -0
  177. package/packages/config/dist/cloud-config.d.ts +75 -0
  178. package/packages/config/dist/cloud-config.js +109 -0
  179. package/packages/config/dist/index.d.ts +13 -0
  180. package/packages/config/dist/index.js +13 -0
  181. package/packages/config/dist/project-namespace.d.ts +77 -0
  182. package/packages/config/dist/project-namespace.js +288 -0
  183. package/packages/config/dist/relay-config.d.ts +33 -0
  184. package/packages/config/dist/relay-config.js +33 -0
  185. package/packages/config/dist/relay-file-writer.d.ts +200 -0
  186. package/packages/config/dist/relay-file-writer.js +407 -0
  187. package/packages/config/dist/schemas.d.ts +672 -0
  188. package/packages/config/dist/schemas.js +180 -0
  189. package/packages/config/dist/shadow-config.d.ts +87 -0
  190. package/packages/config/dist/trajectory-config.d.ts +102 -0
  191. package/packages/config/dist/trajectory-config.js +185 -0
  192. package/packages/config/package.json +103 -0
  193. package/packages/continuity/dist/index.d.ts +9 -0
  194. package/packages/continuity/dist/index.js +9 -0
  195. package/packages/continuity/dist/types.d.ts +180 -0
  196. package/packages/continuity/dist/types.js +2 -0
  197. package/packages/continuity/package.json +37 -0
  198. package/packages/daemon/dist/agent-manager.d.ts +134 -0
  199. package/packages/daemon/dist/agent-manager.js +578 -0
  200. package/packages/daemon/dist/agent-registry.js +213 -0
  201. package/packages/daemon/dist/api.d.ts +106 -0
  202. package/packages/daemon/dist/api.js +876 -0
  203. package/packages/daemon/dist/channel-membership-store.d.ts +55 -0
  204. package/packages/daemon/dist/channel-membership-store.js +176 -0
  205. package/packages/daemon/dist/cli-auth.d.ts +89 -0
  206. package/packages/daemon/dist/cli-auth.js +792 -0
  207. package/packages/daemon/dist/cloud-sync.d.ts +150 -0
  208. package/packages/daemon/dist/cloud-sync.js +446 -0
  209. package/packages/daemon/dist/connection.d.ts +130 -0
  210. package/packages/daemon/dist/connection.js +438 -0
  211. package/packages/daemon/dist/consensus-integration.js +371 -0
  212. package/packages/daemon/dist/delivery-tracker.d.ts +34 -0
  213. package/packages/daemon/dist/delivery-tracker.js +104 -0
  214. package/packages/daemon/dist/enhanced-features.d.ts +118 -0
  215. package/packages/daemon/dist/enhanced-features.js +176 -0
  216. package/packages/daemon/dist/index.d.ts +31 -0
  217. package/packages/daemon/dist/index.js +37 -0
  218. package/packages/daemon/dist/migrations/index.d.ts +73 -0
  219. package/packages/daemon/dist/migrations/index.js +241 -0
  220. package/packages/daemon/dist/orchestrator.d.ts +217 -0
  221. package/packages/daemon/dist/orchestrator.js +1143 -0
  222. package/packages/daemon/dist/relay-ledger.d.ts +261 -0
  223. package/packages/daemon/dist/relay-ledger.js +532 -0
  224. package/packages/daemon/dist/relay-watchdog.d.ts +125 -0
  225. package/packages/daemon/dist/relay-watchdog.js +611 -0
  226. package/packages/daemon/dist/repo-manager.js +384 -0
  227. package/packages/daemon/dist/router.d.ts +370 -0
  228. package/packages/daemon/dist/router.js +1437 -0
  229. package/packages/daemon/dist/server.d.ts +174 -0
  230. package/packages/daemon/dist/server.js +1001 -0
  231. package/packages/daemon/dist/spawn-manager.d.ts +78 -0
  232. package/packages/daemon/dist/spawn-manager.js +165 -0
  233. package/packages/daemon/dist/sync-queue.d.ts +116 -0
  234. package/packages/daemon/dist/sync-queue.js +361 -0
  235. package/packages/daemon/dist/types.d.ts +133 -0
  236. package/packages/daemon/dist/workspace-manager.js +314 -0
  237. package/packages/daemon/package.json +57 -0
  238. package/packages/dashboard/README.md +48 -0
  239. package/packages/dashboard/dist/health-worker-manager.d.ts +62 -0
  240. package/packages/dashboard/dist/health-worker-manager.js +144 -0
  241. package/packages/dashboard/dist/health-worker.d.ts +9 -0
  242. package/packages/dashboard/dist/health-worker.js +79 -0
  243. package/packages/dashboard/dist/index.d.ts +20 -0
  244. package/packages/dashboard/dist/index.js +19 -0
  245. package/packages/dashboard/dist/metrics.d.ts +105 -0
  246. package/packages/dashboard/dist/metrics.js +193 -0
  247. package/packages/dashboard/dist/needs-attention.d.ts +24 -0
  248. package/packages/dashboard/dist/needs-attention.js +78 -0
  249. package/packages/dashboard/dist/server.d.ts +25 -0
  250. package/packages/dashboard/dist/server.js +5179 -0
  251. package/packages/dashboard/dist/start.d.ts +6 -0
  252. package/packages/dashboard/dist/start.js +13 -0
  253. package/packages/dashboard/dist/types/threading.d.ts +8 -0
  254. package/packages/dashboard/dist/types/threading.js +2 -0
  255. package/packages/dashboard/dist/user-bridge.d.ts +154 -0
  256. package/packages/dashboard/dist/user-bridge.js +372 -0
  257. package/packages/dashboard/package.json +64 -0
  258. package/packages/dashboard/ui/app/app/onboarding/page.tsx +394 -0
  259. package/packages/dashboard/ui/app/app/page.tsx +667 -0
  260. package/packages/dashboard/ui/app/apple-icon.png +0 -0
  261. package/packages/dashboard/ui/app/cloud/link/page.tsx +464 -0
  262. package/packages/dashboard/ui/app/connect-repos/page.tsx +410 -0
  263. package/packages/dashboard/ui/app/favicon.png +0 -0
  264. package/packages/dashboard/ui/app/globals.css +59 -0
  265. package/packages/dashboard/ui/app/history/page.tsx +658 -0
  266. package/packages/dashboard/ui/app/layout.tsx +25 -0
  267. package/packages/dashboard/ui/app/login/page.tsx +280 -0
  268. package/packages/dashboard/ui/app/metrics/page.tsx +751 -0
  269. package/packages/dashboard/ui/app/page.tsx +59 -0
  270. package/packages/dashboard/ui/app/pricing/page.tsx +7 -0
  271. package/packages/dashboard/ui/app/providers/page.tsx +193 -0
  272. package/packages/dashboard/ui/app/providers/setup/[provider]/ProviderSetupClient.tsx +148 -0
  273. package/packages/dashboard/ui/app/providers/setup/[provider]/constants.ts +35 -0
  274. package/packages/dashboard/ui/app/providers/setup/[provider]/page.tsx +42 -0
  275. package/packages/dashboard/ui/app/signup/page.tsx +343 -0
  276. package/packages/dashboard/ui/index.ts +49 -0
  277. package/packages/dashboard/ui/landing/LandingPage.tsx +713 -0
  278. package/packages/dashboard/ui/landing/PricingPage.tsx +559 -0
  279. package/packages/dashboard/ui/landing/index.ts +6 -0
  280. package/packages/dashboard/ui/landing/styles.css +2850 -0
  281. package/packages/dashboard/ui/lib/agent-merge.ts +35 -0
  282. package/packages/dashboard/ui/lib/api.ts +1155 -0
  283. package/packages/dashboard/ui/lib/cloudApi.ts +876 -0
  284. package/packages/dashboard/ui/lib/colors.ts +218 -0
  285. package/packages/dashboard/ui/lib/hierarchy.ts +242 -0
  286. package/packages/dashboard/ui/lib/stuckDetection.ts +142 -0
  287. package/packages/dashboard/ui/next-env.d.ts +5 -0
  288. package/packages/dashboard/ui/next.config.js +41 -0
  289. package/packages/dashboard/ui/package-lock.json +2882 -0
  290. package/packages/dashboard/ui/package.json +33 -0
  291. package/packages/dashboard/ui/postcss.config.js +5 -0
  292. package/packages/dashboard/ui/react-components/ActivityFeed.tsx +216 -0
  293. package/packages/dashboard/ui/react-components/AddWorkspaceModal.tsx +170 -0
  294. package/packages/dashboard/ui/react-components/AgentCard.tsx +587 -0
  295. package/packages/dashboard/ui/react-components/AgentList.tsx +411 -0
  296. package/packages/dashboard/ui/react-components/AgentProfilePanel.tsx +564 -0
  297. package/packages/dashboard/ui/react-components/App.tsx +3447 -0
  298. package/packages/dashboard/ui/react-components/BillingPanel.tsx +922 -0
  299. package/packages/dashboard/ui/react-components/BillingResult.tsx +447 -0
  300. package/packages/dashboard/ui/react-components/BroadcastComposer.tsx +690 -0
  301. package/packages/dashboard/ui/react-components/ChannelAdminPanel.tsx +773 -0
  302. package/packages/dashboard/ui/react-components/ChannelBrowser.tsx +385 -0
  303. package/packages/dashboard/ui/react-components/ChannelChat.tsx +307 -0
  304. package/packages/dashboard/ui/react-components/ChannelSidebar.tsx +399 -0
  305. package/packages/dashboard/ui/react-components/CloudSessionProvider.tsx +130 -0
  306. package/packages/dashboard/ui/react-components/CommandPalette.tsx +815 -0
  307. package/packages/dashboard/ui/react-components/ConfirmationDialog.tsx +133 -0
  308. package/packages/dashboard/ui/react-components/ConversationHistory.tsx +518 -0
  309. package/packages/dashboard/ui/react-components/CoordinatorPanel.tsx +944 -0
  310. package/packages/dashboard/ui/react-components/DecisionQueue.tsx +717 -0
  311. package/packages/dashboard/ui/react-components/DirectMessageView.tsx +164 -0
  312. package/packages/dashboard/ui/react-components/FileAutocomplete.tsx +368 -0
  313. package/packages/dashboard/ui/react-components/FleetOverview.tsx +278 -0
  314. package/packages/dashboard/ui/react-components/LogViewer.tsx +310 -0
  315. package/packages/dashboard/ui/react-components/LogViewerPanel.tsx +482 -0
  316. package/packages/dashboard/ui/react-components/Logo.tsx +284 -0
  317. package/packages/dashboard/ui/react-components/MentionAutocomplete.tsx +384 -0
  318. package/packages/dashboard/ui/react-components/MessageList.tsx +649 -0
  319. package/packages/dashboard/ui/react-components/MessageSenderName.tsx +91 -0
  320. package/packages/dashboard/ui/react-components/MessageStatusIndicator.tsx +142 -0
  321. package/packages/dashboard/ui/react-components/NewConversationModal.tsx +400 -0
  322. package/packages/dashboard/ui/react-components/NotificationToast.tsx +488 -0
  323. package/packages/dashboard/ui/react-components/OnlineUsersIndicator.tsx +164 -0
  324. package/packages/dashboard/ui/react-components/Pagination.tsx +124 -0
  325. package/packages/dashboard/ui/react-components/PricingPlans.tsx +386 -0
  326. package/packages/dashboard/ui/react-components/ProjectList.tsx +625 -0
  327. package/packages/dashboard/ui/react-components/ProviderAuthFlow.tsx +843 -0
  328. package/packages/dashboard/ui/react-components/ProviderConnectionList.tsx +363 -0
  329. package/packages/dashboard/ui/react-components/ProvisioningProgress.tsx +730 -0
  330. package/packages/dashboard/ui/react-components/RepoAccessPanel.tsx +392 -0
  331. package/packages/dashboard/ui/react-components/ServerCard.tsx +202 -0
  332. package/packages/dashboard/ui/react-components/SessionExpiredModal.tsx +128 -0
  333. package/packages/dashboard/ui/react-components/SpawnModal.tsx +794 -0
  334. package/packages/dashboard/ui/react-components/TaskAssignmentUI.tsx +375 -0
  335. package/packages/dashboard/ui/react-components/TerminalProviderSetup.tsx +608 -0
  336. package/packages/dashboard/ui/react-components/ThemeProvider.tsx +325 -0
  337. package/packages/dashboard/ui/react-components/ThinkingIndicator.tsx +231 -0
  338. package/packages/dashboard/ui/react-components/ThreadList.tsx +198 -0
  339. package/packages/dashboard/ui/react-components/ThreadPanel.tsx +346 -0
  340. package/packages/dashboard/ui/react-components/TrajectoryViewer.tsx +698 -0
  341. package/packages/dashboard/ui/react-components/TypingIndicator.tsx +69 -0
  342. package/packages/dashboard/ui/react-components/UsageBanner.tsx +231 -0
  343. package/packages/dashboard/ui/react-components/UserProfilePanel.tsx +233 -0
  344. package/packages/dashboard/ui/react-components/WorkspaceContext.tsx +107 -0
  345. package/packages/dashboard/ui/react-components/WorkspaceSelector.tsx +234 -0
  346. package/packages/dashboard/ui/react-components/WorkspaceStatusIndicator.tsx +370 -0
  347. package/packages/dashboard/ui/react-components/XTermInteractive.tsx +510 -0
  348. package/packages/dashboard/ui/react-components/XTermLogViewer.tsx +719 -0
  349. package/packages/dashboard/ui/react-components/channels/ChannelDialogs.tsx +1411 -0
  350. package/packages/dashboard/ui/react-components/channels/ChannelHeader.tsx +317 -0
  351. package/packages/dashboard/ui/react-components/channels/ChannelMessageList.tsx +463 -0
  352. package/packages/dashboard/ui/react-components/channels/ChannelViewV1.tsx +146 -0
  353. package/packages/dashboard/ui/react-components/channels/MessageInput.tsx +288 -0
  354. package/packages/dashboard/ui/react-components/channels/SearchInput.tsx +172 -0
  355. package/packages/dashboard/ui/react-components/channels/SearchResults.tsx +336 -0
  356. package/packages/dashboard/ui/react-components/channels/api.ts +697 -0
  357. package/packages/dashboard/ui/react-components/channels/index.ts +76 -0
  358. package/packages/dashboard/ui/react-components/channels/mockApi.ts +344 -0
  359. package/packages/dashboard/ui/react-components/channels/types.ts +566 -0
  360. package/packages/dashboard/ui/react-components/hooks/index.ts +57 -0
  361. package/packages/dashboard/ui/react-components/hooks/useAgentLogs.ts +394 -0
  362. package/packages/dashboard/ui/react-components/hooks/useAgents.ts +127 -0
  363. package/packages/dashboard/ui/react-components/hooks/useBroadcastDedup.ts +86 -0
  364. package/packages/dashboard/ui/react-components/hooks/useChannelAdmin.ts +329 -0
  365. package/packages/dashboard/ui/react-components/hooks/useChannelBrowser.ts +239 -0
  366. package/packages/dashboard/ui/react-components/hooks/useChannelCommands.ts +138 -0
  367. package/packages/dashboard/ui/react-components/hooks/useChannels.ts +328 -0
  368. package/packages/dashboard/ui/react-components/hooks/useDebounce.ts +29 -0
  369. package/packages/dashboard/ui/react-components/hooks/useDirectMessage.ts +141 -0
  370. package/packages/dashboard/ui/react-components/hooks/useMessages.ts +309 -0
  371. package/packages/dashboard/ui/react-components/hooks/useOrchestrator.ts +364 -0
  372. package/packages/dashboard/ui/react-components/hooks/usePinnedAgents.ts +140 -0
  373. package/packages/dashboard/ui/react-components/hooks/usePresence.ts +340 -0
  374. package/packages/dashboard/ui/react-components/hooks/useRecentRepos.ts +130 -0
  375. package/packages/dashboard/ui/react-components/hooks/useSession.ts +209 -0
  376. package/packages/dashboard/ui/react-components/hooks/useTrajectory.ts +265 -0
  377. package/packages/dashboard/ui/react-components/hooks/useWebSocket.ts +169 -0
  378. package/packages/dashboard/ui/react-components/hooks/useWorkspaceMembers.ts +120 -0
  379. package/packages/dashboard/ui/react-components/hooks/useWorkspaceRepos.ts +73 -0
  380. package/packages/dashboard/ui/react-components/hooks/useWorkspaceStatus.ts +237 -0
  381. package/packages/dashboard/ui/react-components/index.ts +81 -0
  382. package/packages/dashboard/ui/react-components/layout/Header.tsx +355 -0
  383. package/packages/dashboard/ui/react-components/layout/RepoContextHeader.tsx +361 -0
  384. package/packages/dashboard/ui/react-components/layout/Sidebar.archive.test.tsx +126 -0
  385. package/packages/dashboard/ui/react-components/layout/Sidebar.test.tsx +691 -0
  386. package/packages/dashboard/ui/react-components/layout/Sidebar.tsx +930 -0
  387. package/packages/dashboard/ui/react-components/layout/index.ts +7 -0
  388. package/packages/dashboard/ui/react-components/settings/BillingSettingsPanel.tsx +564 -0
  389. package/packages/dashboard/ui/react-components/settings/SettingsPage.tsx +544 -0
  390. package/packages/dashboard/ui/react-components/settings/TeamSettingsPanel.tsx +560 -0
  391. package/packages/dashboard/ui/react-components/settings/WorkspaceSettingsPanel.tsx +1329 -0
  392. package/packages/dashboard/ui/react-components/settings/index.ts +11 -0
  393. package/packages/dashboard/ui/react-components/settings/types.ts +53 -0
  394. package/packages/dashboard/ui/react-components/utils/messageFormatting.tsx +370 -0
  395. package/packages/dashboard/ui/tailwind.config.js +148 -0
  396. package/packages/dashboard/ui/types/index.ts +304 -0
  397. package/packages/dashboard/ui/types/threading.ts +7 -0
  398. package/packages/dashboard/ui-dist/404.html +1 -0
  399. package/packages/dashboard/ui-dist/_next/static/0AsOfRemPXJmtynCKT-rx/_buildManifest.js +1 -0
  400. package/packages/dashboard/ui-dist/_next/static/0AsOfRemPXJmtynCKT-rx/_ssgManifest.js +1 -0
  401. package/packages/dashboard/ui-dist/_next/static/72btMIJ64BCAB4UgVkpaq/_buildManifest.js +1 -0
  402. package/packages/dashboard/ui-dist/_next/static/72btMIJ64BCAB4UgVkpaq/_ssgManifest.js +1 -0
  403. package/packages/dashboard/ui-dist/_next/static/chunks/116-a883fca163f3a5bc.js +1 -0
  404. package/packages/dashboard/ui-dist/_next/static/chunks/117-c8afed19e821a35d.js +2 -0
  405. package/packages/dashboard/ui-dist/_next/static/chunks/282-980c2eb8fff20123.js +1 -0
  406. package/packages/dashboard/ui-dist/_next/static/chunks/320-900169c942e31422.js +1 -0
  407. package/packages/dashboard/ui-dist/_next/static/chunks/532-bace199897eeab37.js +9 -0
  408. package/packages/dashboard/ui-dist/_next/static/chunks/631-af51bad94027527a.js +1 -0
  409. package/packages/dashboard/ui-dist/_next/static/chunks/648-acb2ff9f77cbfbd3.js +1 -0
  410. package/packages/dashboard/ui-dist/_next/static/chunks/677-7323947c23b35979.js +1 -0
  411. package/packages/dashboard/ui-dist/_next/static/chunks/766-2aea80818f7eb0d8.js +1 -0
  412. package/packages/dashboard/ui-dist/_next/static/chunks/83-4f08122d4e7e79a6.js +1 -0
  413. package/packages/dashboard/ui-dist/_next/static/chunks/847-f1f467060f32afff.js +1 -0
  414. package/packages/dashboard/ui-dist/_next/static/chunks/891-5cb1513eeb97a891.js +1 -0
  415. package/packages/dashboard/ui-dist/_next/static/chunks/app/_not-found/page-60501fddbafba9dc.js +1 -0
  416. package/packages/dashboard/ui-dist/_next/static/chunks/app/app/onboarding/page-9914652442f7e4fb.js +1 -0
  417. package/packages/dashboard/ui-dist/_next/static/chunks/app/app/onboarding/page-f746f29e01fffc43.js +1 -0
  418. package/packages/dashboard/ui-dist/_next/static/chunks/app/app/page-2e525b1dcc790967.js +1 -0
  419. package/packages/dashboard/ui-dist/_next/static/chunks/app/app/page-44813aa26ad19681.js +1 -0
  420. package/packages/dashboard/ui-dist/_next/static/chunks/app/cloud/link/page-5011ae044b90449d.js +1 -0
  421. package/packages/dashboard/ui-dist/_next/static/chunks/app/cloud/link/page-fa1d5842aa90e8a6.js +1 -0
  422. package/packages/dashboard/ui-dist/_next/static/chunks/app/connect-repos/page-03ac6f35a6654ea6.js +1 -0
  423. package/packages/dashboard/ui-dist/_next/static/chunks/app/connect-repos/page-113060009ef35bc2.js +1 -0
  424. package/packages/dashboard/ui-dist/_next/static/chunks/app/history/page-9965d2483011b846.js +1 -0
  425. package/packages/dashboard/ui-dist/_next/static/chunks/app/history/page-b2ce7c96ed0931da.js +1 -0
  426. package/packages/dashboard/ui-dist/_next/static/chunks/app/layout-6b91e33784c20610.js +1 -0
  427. package/packages/dashboard/ui-dist/_next/static/chunks/app/layout-c0d118c0f92d969c.js +1 -0
  428. package/packages/dashboard/ui-dist/_next/static/chunks/app/login/page-6ec54eee75877971.js +1 -0
  429. package/packages/dashboard/ui-dist/_next/static/chunks/app/login/page-a0ca6f7ca6a100b8.js +1 -0
  430. package/packages/dashboard/ui-dist/_next/static/chunks/app/metrics/page-1e37ef8e73940b40.js +1 -0
  431. package/packages/dashboard/ui-dist/_next/static/chunks/app/metrics/page-bf2cb1e5915bc92d.js +1 -0
  432. package/packages/dashboard/ui-dist/_next/static/chunks/app/page-4e64923d73c35bc9.js +1 -0
  433. package/packages/dashboard/ui-dist/_next/static/chunks/app/page-7993778218818ace.js +1 -0
  434. package/packages/dashboard/ui-dist/_next/static/chunks/app/pricing/page-0efa024c28ba4597.js +1 -0
  435. package/packages/dashboard/ui-dist/_next/static/chunks/app/pricing/page-9db3ebdfa567a7c9.js +1 -0
  436. package/packages/dashboard/ui-dist/_next/static/chunks/app/providers/page-bcf46064ac4474ce.js +1 -0
  437. package/packages/dashboard/ui-dist/_next/static/chunks/app/providers/page-e65a0010da6ea5be.js +1 -0
  438. package/packages/dashboard/ui-dist/_next/static/chunks/app/providers/setup/[provider]/page-4dbe33f0f7691b7c.js +1 -0
  439. package/packages/dashboard/ui-dist/_next/static/chunks/app/providers/setup/[provider]/page-84161c802b020a1f.js +1 -0
  440. package/packages/dashboard/ui-dist/_next/static/chunks/app/signup/page-18a4665665f6be11.js +1 -0
  441. package/packages/dashboard/ui-dist/_next/static/chunks/app/signup/page-1ede2205b58649ca.js +1 -0
  442. package/packages/dashboard/ui-dist/_next/static/chunks/e868780c-48e5f147c90a3a41.js +18 -0
  443. package/packages/dashboard/ui-dist/_next/static/chunks/fd9d1056-609918ca7b6280bb.js +1 -0
  444. package/packages/dashboard/ui-dist/_next/static/chunks/framework-f66176bb897dc684.js +1 -0
  445. package/packages/dashboard/ui-dist/_next/static/chunks/main-5a40a5ae29646e1b.js +1 -0
  446. package/packages/dashboard/ui-dist/_next/static/chunks/main-app-6e8e8d3ef4e0192a.js +1 -0
  447. package/packages/dashboard/ui-dist/_next/static/chunks/main-app-fdbeb09028f57c9f.js +1 -0
  448. package/packages/dashboard/ui-dist/_next/static/chunks/pages/_app-72b849fbd24ac258.js +1 -0
  449. package/packages/dashboard/ui-dist/_next/static/chunks/pages/_error-7ba65e1336b92748.js +1 -0
  450. package/packages/dashboard/ui-dist/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  451. package/packages/dashboard/ui-dist/_next/static/chunks/webpack-1cdd8ed57114d5e1.js +1 -0
  452. package/packages/dashboard/ui-dist/_next/static/clUN2n0bz9HCjKI0qlOxU/_buildManifest.js +1 -0
  453. package/packages/dashboard/ui-dist/_next/static/clUN2n0bz9HCjKI0qlOxU/_ssgManifest.js +1 -0
  454. package/packages/dashboard/ui-dist/_next/static/css/4034f236dd1a3178.css +1 -0
  455. package/packages/dashboard/ui-dist/_next/static/css/99c2552394077586.css +1 -0
  456. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-128.png +0 -0
  457. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-256.png +0 -0
  458. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-32.png +0 -0
  459. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-512.png +0 -0
  460. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-64.png +0 -0
  461. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo.svg +45 -0
  462. package/packages/dashboard/ui-dist/alt-logos/logo.svg +38 -0
  463. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-128.png +0 -0
  464. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-256.png +0 -0
  465. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-32.png +0 -0
  466. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-512.png +0 -0
  467. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-64.png +0 -0
  468. package/packages/dashboard/ui-dist/alt-logos/monogram-logo.svg +38 -0
  469. package/packages/dashboard/ui-dist/app/onboarding.html +1 -0
  470. package/packages/dashboard/ui-dist/app/onboarding.txt +7 -0
  471. package/packages/dashboard/ui-dist/app.html +1 -0
  472. package/packages/dashboard/ui-dist/app.txt +7 -0
  473. package/packages/dashboard/ui-dist/apple-icon.png +0 -0
  474. package/packages/dashboard/ui-dist/cloud/link.html +1 -0
  475. package/packages/dashboard/ui-dist/cloud/link.txt +7 -0
  476. package/packages/dashboard/ui-dist/connect-repos.html +1 -0
  477. package/packages/dashboard/ui-dist/connect-repos.txt +7 -0
  478. package/packages/dashboard/ui-dist/history.html +1 -0
  479. package/packages/dashboard/ui-dist/history.txt +7 -0
  480. package/packages/dashboard/ui-dist/index.html +1 -0
  481. package/packages/dashboard/ui-dist/index.txt +7 -0
  482. package/packages/dashboard/ui-dist/login.html +5 -0
  483. package/packages/dashboard/ui-dist/login.txt +7 -0
  484. package/packages/dashboard/ui-dist/metrics.html +1 -0
  485. package/packages/dashboard/ui-dist/metrics.txt +7 -0
  486. package/packages/dashboard/ui-dist/pricing.html +13 -0
  487. package/packages/dashboard/ui-dist/pricing.txt +7 -0
  488. package/packages/dashboard/ui-dist/providers/setup/claude.html +1 -0
  489. package/packages/dashboard/ui-dist/providers/setup/claude.txt +8 -0
  490. package/packages/dashboard/ui-dist/providers/setup/codex.html +1 -0
  491. package/packages/dashboard/ui-dist/providers/setup/codex.txt +8 -0
  492. package/packages/dashboard/ui-dist/providers/setup/cursor.html +1 -0
  493. package/packages/dashboard/ui-dist/providers/setup/cursor.txt +8 -0
  494. package/packages/dashboard/ui-dist/providers.html +1 -0
  495. package/packages/dashboard/ui-dist/providers.txt +7 -0
  496. package/packages/dashboard/ui-dist/signup.html +6 -0
  497. package/packages/dashboard/ui-dist/signup.txt +7 -0
  498. package/packages/dashboard-server/dist/health-worker-manager.d.ts +62 -0
  499. package/packages/dashboard-server/dist/health-worker-manager.js +144 -0
  500. package/packages/dashboard-server/dist/health-worker.d.ts +9 -0
  501. package/packages/dashboard-server/dist/health-worker.js +79 -0
  502. package/packages/dashboard-server/dist/index.d.ts +18 -0
  503. package/packages/dashboard-server/dist/index.js +17 -0
  504. package/packages/dashboard-server/dist/server.js +5099 -0
  505. package/packages/dashboard-server/dist/start.js +13 -0
  506. package/packages/dashboard-server/dist/types/threading.d.ts +8 -0
  507. package/packages/dashboard-server/dist/types/threading.js +2 -0
  508. package/packages/dashboard-server/dist/user-bridge.d.ts +154 -0
  509. package/packages/dashboard-server/dist/user-bridge.js +372 -0
  510. package/packages/dashboard-server/package.json +55 -0
  511. package/packages/hooks/dist/browser.d.ts +2 -0
  512. package/packages/hooks/dist/browser.js +3 -0
  513. package/packages/hooks/dist/index.d.ts +11 -0
  514. package/packages/hooks/dist/index.js +11 -0
  515. package/packages/hooks/dist/registry.js +476 -0
  516. package/packages/hooks/dist/trajectory-hooks.js +183 -0
  517. package/packages/hooks/dist/types.d.ts +285 -0
  518. package/packages/hooks/dist/types.js +10 -0
  519. package/packages/hooks/package.json +57 -0
  520. package/packages/mcp/LICENSE +190 -0
  521. package/packages/mcp/README.md +330 -0
  522. package/packages/mcp/SPEC.md +1922 -0
  523. package/packages/mcp/STAFFING_PLAN.md +294 -0
  524. package/packages/mcp/dist/bin.d.ts +12 -0
  525. package/packages/mcp/dist/bin.js +127 -0
  526. package/packages/mcp/dist/client.d.ts +68 -0
  527. package/packages/mcp/dist/client.js +115 -0
  528. package/packages/mcp/dist/cloud.d.ts +108 -0
  529. package/packages/mcp/dist/cloud.js +328 -0
  530. package/packages/mcp/dist/errors.d.ts +27 -0
  531. package/packages/mcp/dist/errors.js +48 -0
  532. package/packages/mcp/dist/index.d.ts +10 -0
  533. package/packages/mcp/dist/index.js +16 -0
  534. package/packages/mcp/dist/install-cli.d.ts +35 -0
  535. package/packages/mcp/dist/install-cli.js +157 -0
  536. package/packages/mcp/dist/install.d.ts +101 -0
  537. package/packages/mcp/dist/install.js +398 -0
  538. package/packages/mcp/dist/prompts/index.d.ts +2 -0
  539. package/packages/mcp/dist/prompts/index.js +2 -0
  540. package/packages/mcp/dist/prompts/protocol.d.ts +11 -0
  541. package/packages/mcp/dist/prompts/protocol.js +168 -0
  542. package/packages/mcp/dist/resources/agents.d.ts +11 -0
  543. package/packages/mcp/dist/resources/agents.js +17 -0
  544. package/packages/mcp/dist/resources/inbox.d.ts +11 -0
  545. package/packages/mcp/dist/resources/inbox.js +17 -0
  546. package/packages/mcp/dist/resources/index.d.ts +4 -0
  547. package/packages/mcp/dist/resources/index.js +4 -0
  548. package/packages/mcp/dist/resources/project.d.ts +11 -0
  549. package/packages/mcp/dist/resources/project.js +21 -0
  550. package/packages/mcp/dist/server.d.ts +19 -0
  551. package/packages/mcp/dist/server.js +215 -0
  552. package/packages/mcp/dist/simple.d.ts +173 -0
  553. package/packages/mcp/dist/simple.js +120 -0
  554. package/packages/mcp/dist/tools/index.d.ts +10 -0
  555. package/packages/mcp/dist/tools/index.js +10 -0
  556. package/packages/mcp/dist/tools/relay-health.d.ts +23 -0
  557. package/packages/mcp/dist/tools/relay-health.js +138 -0
  558. package/packages/mcp/dist/tools/relay-inbox.d.ts +26 -0
  559. package/packages/mcp/dist/tools/relay-inbox.js +58 -0
  560. package/packages/mcp/dist/tools/relay-logs.d.ts +20 -0
  561. package/packages/mcp/dist/tools/relay-logs.js +88 -0
  562. package/packages/mcp/dist/tools/relay-metrics.d.ts +20 -0
  563. package/packages/mcp/dist/tools/relay-metrics.js +135 -0
  564. package/packages/mcp/dist/tools/relay-release.d.ts +20 -0
  565. package/packages/mcp/dist/tools/relay-release.js +44 -0
  566. package/packages/mcp/dist/tools/relay-send.d.ts +29 -0
  567. package/packages/mcp/dist/tools/relay-send.js +71 -0
  568. package/packages/mcp/dist/tools/relay-spawn.d.ts +36 -0
  569. package/packages/mcp/dist/tools/relay-spawn.js +73 -0
  570. package/packages/mcp/dist/tools/relay-status.d.ts +11 -0
  571. package/packages/mcp/dist/tools/relay-status.js +43 -0
  572. package/packages/mcp/dist/tools/relay-who.d.ts +20 -0
  573. package/packages/mcp/dist/tools/relay-who.js +47 -0
  574. package/packages/mcp/package.json +69 -0
  575. package/packages/memory/dist/memory-hooks.d.ts +60 -0
  576. package/packages/memory/package.json +40 -0
  577. package/packages/policy/dist/agent-policy.js +665 -0
  578. package/packages/policy/dist/index.d.ts +12 -0
  579. package/packages/policy/dist/index.js +12 -0
  580. package/packages/policy/package.json +40 -0
  581. package/packages/protocol/dist/channels.d.ts +137 -0
  582. package/packages/protocol/dist/channels.js +154 -0
  583. package/packages/protocol/dist/framing.d.ts +80 -0
  584. package/packages/protocol/dist/framing.js +206 -0
  585. package/packages/protocol/dist/index.d.ts +5 -0
  586. package/packages/protocol/dist/index.js +5 -0
  587. package/packages/protocol/dist/relay-pty-schemas.d.ts +258 -0
  588. package/packages/protocol/dist/types.d.ts +341 -0
  589. package/packages/protocol/dist/types.js +8 -0
  590. package/packages/protocol/package.json +61 -0
  591. package/packages/resiliency/dist/memory-monitor.js +599 -0
  592. package/packages/resiliency/dist/provider-context.d.ts +100 -0
  593. package/packages/resiliency/package.json +38 -0
  594. package/packages/sdk/README.md +288 -0
  595. package/packages/sdk/dist/client.d.ts +277 -0
  596. package/packages/sdk/dist/client.js +802 -0
  597. package/packages/sdk/dist/discovery.d.ts +29 -0
  598. package/packages/sdk/dist/discovery.js +126 -0
  599. package/packages/sdk/dist/index.d.ts +33 -0
  600. package/packages/sdk/dist/index.js +38 -0
  601. package/packages/sdk/dist/protocol/framing.d.ts +80 -0
  602. package/packages/sdk/dist/protocol/framing.js +206 -0
  603. package/packages/sdk/dist/protocol/index.d.ts +6 -0
  604. package/packages/sdk/dist/protocol/index.js +6 -0
  605. package/packages/sdk/dist/protocol/types.d.ts +341 -0
  606. package/packages/sdk/dist/protocol/types.js +8 -0
  607. package/packages/sdk/dist/standalone.d.ts +87 -0
  608. package/packages/sdk/dist/standalone.js +127 -0
  609. package/packages/sdk/package.json +80 -0
  610. package/packages/spawner/API.md +256 -0
  611. package/packages/spawner/dist/index.d.ts +8 -0
  612. package/packages/spawner/dist/index.js +8 -0
  613. package/packages/spawner/dist/types.d.ts +552 -0
  614. package/packages/spawner/dist/types.js +193 -0
  615. package/packages/spawner/package.json +47 -0
  616. package/packages/state/dist/agent-state.js +120 -0
  617. package/packages/state/dist/index.d.ts +8 -0
  618. package/packages/state/dist/index.js +8 -0
  619. package/packages/state/package.json +37 -0
  620. package/packages/storage/dist/adapter.d.ts +156 -0
  621. package/packages/storage/dist/batched-sqlite-adapter.d.ts +75 -0
  622. package/packages/storage/dist/batched-sqlite-adapter.js +189 -0
  623. package/packages/storage/dist/index.d.ts +5 -0
  624. package/packages/storage/dist/index.js +6 -0
  625. package/packages/storage/dist/sqlite-adapter.d.ts +113 -0
  626. package/packages/storage/dist/sqlite-adapter.js +752 -0
  627. package/packages/storage/package.json +74 -0
  628. package/packages/trajectory/dist/index.d.ts +2 -0
  629. package/packages/trajectory/dist/index.js +2 -0
  630. package/packages/trajectory/dist/integration.js +987 -0
  631. package/packages/trajectory/package.json +40 -0
  632. package/packages/user-directory/dist/index.d.ts +7 -0
  633. package/packages/user-directory/dist/index.js +7 -0
  634. package/packages/user-directory/dist/user-directory.d.ts +121 -0
  635. package/packages/user-directory/dist/user-directory.js +267 -0
  636. package/packages/user-directory/package.json +40 -0
  637. package/packages/utils/dist/command-resolver.js +80 -0
  638. package/packages/utils/dist/error-tracking.d.ts +103 -0
  639. package/packages/utils/dist/error-tracking.js +149 -0
  640. package/packages/utils/dist/index.d.ts +9 -0
  641. package/packages/utils/dist/index.js +9 -0
  642. package/packages/utils/dist/model-mapping.d.ts +28 -0
  643. package/packages/utils/dist/model-mapping.js +55 -0
  644. package/packages/utils/package.json +80 -0
  645. package/packages/wrapper/dist/__fixtures__/claude-outputs.d.ts +49 -0
  646. package/packages/wrapper/dist/__fixtures__/claude-outputs.js +443 -0
  647. package/packages/wrapper/dist/__fixtures__/codex-outputs.d.ts +9 -0
  648. package/packages/wrapper/dist/__fixtures__/codex-outputs.js +94 -0
  649. package/packages/wrapper/dist/__fixtures__/gemini-outputs.d.ts +19 -0
  650. package/packages/wrapper/dist/__fixtures__/gemini-outputs.js +144 -0
  651. package/packages/wrapper/dist/__fixtures__/index.d.ts +68 -0
  652. package/packages/wrapper/dist/__fixtures__/index.js +44 -0
  653. package/packages/wrapper/dist/base-wrapper.d.ts +249 -0
  654. package/packages/wrapper/dist/base-wrapper.js +614 -0
  655. package/packages/wrapper/dist/client.d.ts +254 -0
  656. package/packages/wrapper/dist/client.js +801 -0
  657. package/packages/wrapper/dist/id-generator.d.ts +35 -0
  658. package/packages/wrapper/dist/id-generator.js +60 -0
  659. package/packages/wrapper/dist/idle-detector.d.ts +110 -0
  660. package/packages/wrapper/dist/idle-detector.js +304 -0
  661. package/packages/wrapper/dist/index.d.ts +37 -0
  662. package/packages/wrapper/dist/index.js +47 -0
  663. package/packages/wrapper/dist/parser.d.ts +236 -0
  664. package/packages/wrapper/dist/parser.js +1238 -0
  665. package/packages/wrapper/dist/relay-pty-orchestrator.d.ts +409 -0
  666. package/packages/wrapper/dist/relay-pty-orchestrator.js +1930 -0
  667. package/packages/wrapper/dist/shared.d.ts +226 -0
  668. package/packages/wrapper/dist/shared.js +381 -0
  669. package/packages/wrapper/dist/stuck-detector.d.ts +161 -0
  670. package/packages/wrapper/dist/stuck-detector.js +402 -0
  671. package/packages/wrapper/dist/tmux-wrapper.d.ts +352 -0
  672. package/packages/wrapper/dist/tmux-wrapper.js +1800 -0
  673. package/packages/wrapper/dist/trajectory-integration.d.ts +292 -0
  674. package/packages/wrapper/dist/trajectory-integration.js +979 -0
  675. package/packages/wrapper/dist/wrapper-types.d.ts +41 -0
  676. package/packages/wrapper/dist/wrapper-types.js +7 -0
  677. package/packages/wrapper/package.json +63 -0
  678. package/scripts/setup-stripe-products.ts +312 -0
  679. package/scripts/stress-test-orchestrator-integration.mts +1366 -0
  680. package/scripts/stress-test-orchestrator.mjs +584 -0
  681. package/scripts/stress-test-relay-pty.sh +452 -0
  682. package/scripts/verify-schema.js +1 -1
  683. package/turbo.json +37 -0
  684. package/bin/relay-pty +0 -0
  685. package/dist/bridge/config.d.ts +0 -41
  686. package/dist/bridge/config.js +0 -143
  687. package/dist/bridge/index.d.ts +0 -10
  688. package/dist/bridge/index.js +0 -10
  689. package/dist/bridge/multi-project-client.d.ts +0 -99
  690. package/dist/bridge/multi-project-client.js +0 -389
  691. package/dist/bridge/shadow-cli.js +0 -75
  692. package/dist/bridge/shadow-config.d.ts +0 -87
  693. package/dist/bridge/spawner.d.ts +0 -186
  694. package/dist/bridge/spawner.js +0 -920
  695. package/dist/bridge/types.d.ts +0 -129
  696. package/dist/bridge/utils.d.ts +0 -30
  697. package/dist/bridge/utils.js +0 -54
  698. package/dist/cli/index.js +0 -2784
  699. package/dist/cloud/api/admin.js +0 -225
  700. package/dist/cloud/api/billing.js +0 -564
  701. package/dist/cloud/api/cli-pty-runner.d.ts +0 -54
  702. package/dist/cloud/api/cli-pty-runner.js +0 -119
  703. package/dist/cloud/api/codex-auth-helper.js +0 -327
  704. package/dist/cloud/api/consensus.js +0 -259
  705. package/dist/cloud/api/coordinators.js +0 -749
  706. package/dist/cloud/api/daemons.js +0 -535
  707. package/dist/cloud/api/generic-webhooks.js +0 -129
  708. package/dist/cloud/api/github-app.js +0 -223
  709. package/dist/cloud/api/monitoring.js +0 -578
  710. package/dist/cloud/api/nango-auth.js +0 -658
  711. package/dist/cloud/api/onboarding.d.ts +0 -15
  712. package/dist/cloud/api/onboarding.js +0 -666
  713. package/dist/cloud/api/policy.js +0 -229
  714. package/dist/cloud/api/provider-env.d.ts +0 -5
  715. package/dist/cloud/api/provider-env.js +0 -27
  716. package/dist/cloud/api/providers.js +0 -511
  717. package/dist/cloud/api/repos.js +0 -576
  718. package/dist/cloud/api/teams.js +0 -279
  719. package/dist/cloud/api/test-helpers.js +0 -745
  720. package/dist/cloud/api/workspaces.js +0 -1783
  721. package/dist/cloud/billing/plans.js +0 -245
  722. package/dist/cloud/config.d.ts +0 -75
  723. package/dist/cloud/config.js +0 -109
  724. package/dist/cloud/db/drizzle.d.ts +0 -246
  725. package/dist/cloud/db/drizzle.js +0 -1249
  726. package/dist/cloud/db/schema.d.ts +0 -4854
  727. package/dist/cloud/db/schema.js +0 -610
  728. package/dist/cloud/index.d.ts +0 -11
  729. package/dist/cloud/index.js +0 -38
  730. package/dist/cloud/provisioner/index.d.ts +0 -207
  731. package/dist/cloud/provisioner/index.js +0 -2069
  732. package/dist/cloud/server.js +0 -1599
  733. package/dist/cloud/services/index.d.ts +0 -17
  734. package/dist/cloud/services/index.js +0 -25
  735. package/dist/cloud/services/intro-expiration.d.ts +0 -55
  736. package/dist/cloud/services/intro-expiration.js +0 -211
  737. package/dist/cloud/services/nango.d.ts +0 -199
  738. package/dist/cloud/services/nango.js +0 -382
  739. package/dist/cloud/services/persistence.d.ts +0 -131
  740. package/dist/config/relay-config.d.ts +0 -23
  741. package/dist/config/relay-config.js +0 -23
  742. package/dist/continuity/index.d.ts +0 -45
  743. package/dist/continuity/index.js +0 -48
  744. package/dist/continuity/types.d.ts +0 -180
  745. package/dist/continuity/types.js +0 -9
  746. package/dist/daemon/agent-manager.d.ts +0 -134
  747. package/dist/daemon/agent-manager.js +0 -564
  748. package/dist/daemon/agent-registry.js +0 -213
  749. package/dist/daemon/api.d.ts +0 -83
  750. package/dist/daemon/api.js +0 -780
  751. package/dist/daemon/channel-membership-store.d.ts +0 -48
  752. package/dist/daemon/channel-membership-store.js +0 -149
  753. package/dist/daemon/cli-auth.d.ts +0 -82
  754. package/dist/daemon/cli-auth.js +0 -700
  755. package/dist/daemon/cloud-sync.d.ts +0 -150
  756. package/dist/daemon/cloud-sync.js +0 -424
  757. package/dist/daemon/connection.d.ts +0 -130
  758. package/dist/daemon/connection.js +0 -438
  759. package/dist/daemon/consensus-integration.js +0 -371
  760. package/dist/daemon/delivery-tracker.d.ts +0 -34
  761. package/dist/daemon/delivery-tracker.js +0 -104
  762. package/dist/daemon/enhanced-features.d.ts +0 -118
  763. package/dist/daemon/enhanced-features.js +0 -178
  764. package/dist/daemon/index.d.ts +0 -14
  765. package/dist/daemon/index.js +0 -17
  766. package/dist/daemon/orchestrator.d.ts +0 -157
  767. package/dist/daemon/orchestrator.js +0 -792
  768. package/dist/daemon/repo-manager.js +0 -384
  769. package/dist/daemon/router.d.ts +0 -358
  770. package/dist/daemon/router.js +0 -1333
  771. package/dist/daemon/server.d.ts +0 -159
  772. package/dist/daemon/server.js +0 -788
  773. package/dist/daemon/services/browser-testing.d.ts +0 -88
  774. package/dist/daemon/services/browser-testing.js +0 -244
  775. package/dist/daemon/services/container-spawner.d.ts +0 -135
  776. package/dist/daemon/services/container-spawner.js +0 -313
  777. package/dist/daemon/sync-queue.d.ts +0 -116
  778. package/dist/daemon/sync-queue.js +0 -361
  779. package/dist/daemon/types.d.ts +0 -131
  780. package/dist/daemon/user-directory.d.ts +0 -111
  781. package/dist/daemon/user-directory.js +0 -233
  782. package/dist/daemon/workspace-manager.js +0 -314
  783. package/dist/dashboard/out/_next/static/chunks/116-eacf84a131b80db9.js +0 -1
  784. package/dist/dashboard/out/_next/static/chunks/64-f4268c2ac6f4d7d4.js +0 -1
  785. package/dist/dashboard/out/_next/static/chunks/766-aa7c8c9900ff5f53.js +0 -1
  786. package/dist/dashboard/out/_next/static/chunks/891-a024fbe4b619cf6f.js +0 -1
  787. package/dist/dashboard/out/_next/static/chunks/app/app/page-ffad986adfcc8b31.js +0 -1
  788. package/dist/dashboard/out/_next/static/chunks/app/page-671037943b2f2e43.js +0 -1
  789. package/dist/dashboard/out/_next/static/chunks/app/providers/page-57cbd738c6a73859.js +0 -1
  790. package/dist/dashboard/out/_next/static/chunks/app/providers/setup/[provider]/page-5ab0854472b402b0.js +0 -1
  791. package/dist/dashboard/out/_next/static/css/8f9ed310f454e5a5.css +0 -1
  792. package/dist/dashboard-server/server.js +0 -4806
  793. package/dist/dashboard-server/start.js +0 -13
  794. package/dist/dashboard-server/user-bridge.d.ts +0 -138
  795. package/dist/dashboard-server/user-bridge.js +0 -348
  796. package/dist/hooks/index.d.ts +0 -10
  797. package/dist/hooks/index.js +0 -10
  798. package/dist/hooks/registry.js +0 -476
  799. package/dist/hooks/trajectory-hooks.js +0 -183
  800. package/dist/hooks/types.d.ts +0 -284
  801. package/dist/hooks/types.js +0 -8
  802. package/dist/index.d.ts +0 -13
  803. package/dist/index.js +0 -16
  804. package/dist/memory/memory-hooks.d.ts +0 -60
  805. package/dist/policy/agent-policy.js +0 -665
  806. package/dist/protocol/channels.d.ts +0 -211
  807. package/dist/protocol/channels.js +0 -154
  808. package/dist/protocol/framing.d.ts +0 -94
  809. package/dist/protocol/framing.js +0 -240
  810. package/dist/protocol/index.d.ts +0 -4
  811. package/dist/protocol/index.js +0 -4
  812. package/dist/protocol/relay-pty-schemas.d.ts +0 -209
  813. package/dist/protocol/types.d.ts +0 -168
  814. package/dist/protocol/types.js +0 -6
  815. package/dist/resiliency/memory-monitor.js +0 -593
  816. package/dist/resiliency/provider-context.d.ts +0 -100
  817. package/dist/shared/cli-auth-config.js +0 -320
  818. package/dist/state/agent-state.js +0 -120
  819. package/dist/storage/adapter.d.ts +0 -154
  820. package/dist/storage/batched-sqlite-adapter.d.ts +0 -71
  821. package/dist/storage/batched-sqlite-adapter.js +0 -183
  822. package/dist/storage/sqlite-adapter.d.ts +0 -107
  823. package/dist/storage/sqlite-adapter.js +0 -717
  824. package/dist/trajectory/config.d.ts +0 -102
  825. package/dist/trajectory/config.js +0 -185
  826. package/dist/trajectory/index.d.ts +0 -8
  827. package/dist/trajectory/index.js +0 -8
  828. package/dist/trajectory/integration.js +0 -987
  829. package/dist/utils/command-resolver.js +0 -76
  830. package/dist/utils/index.d.ts +0 -4
  831. package/dist/utils/index.js +0 -4
  832. package/dist/utils/project-namespace.d.ts +0 -70
  833. package/dist/utils/project-namespace.js +0 -216
  834. package/dist/wrapper/base-wrapper.d.ts +0 -217
  835. package/dist/wrapper/base-wrapper.js +0 -538
  836. package/dist/wrapper/client.d.ts +0 -199
  837. package/dist/wrapper/client.js +0 -677
  838. package/dist/wrapper/idle-detector.d.ts +0 -102
  839. package/dist/wrapper/idle-detector.js +0 -279
  840. package/dist/wrapper/index.d.ts +0 -4
  841. package/dist/wrapper/index.js +0 -7
  842. package/dist/wrapper/parser.d.ts +0 -230
  843. package/dist/wrapper/parser.js +0 -1178
  844. package/dist/wrapper/pty-wrapper.d.ts +0 -343
  845. package/dist/wrapper/pty-wrapper.js +0 -1593
  846. package/dist/wrapper/relay-pty-orchestrator.d.ts +0 -296
  847. package/dist/wrapper/relay-pty-orchestrator.js +0 -1088
  848. package/dist/wrapper/shared.d.ts +0 -168
  849. package/dist/wrapper/shared.js +0 -291
  850. package/dist/wrapper/stuck-detector.d.ts +0 -101
  851. package/dist/wrapper/stuck-detector.js +0 -228
  852. package/dist/wrapper/tmux-wrapper.d.ts +0 -344
  853. package/dist/wrapper/tmux-wrapper.js +0 -1711
  854. /package/dist/dashboard/out/_next/static/{BffXAqxm-_rUlj2mAnK26 → 72btMIJ64BCAB4UgVkpaq}/_buildManifest.js +0 -0
  855. /package/dist/dashboard/out/_next/static/{BffXAqxm-_rUlj2mAnK26 → 72btMIJ64BCAB4UgVkpaq}/_ssgManifest.js +0 -0
  856. /package/dist/dashboard/out/_next/static/chunks/app/cloud/link/{page-cfeb437f08a12ed9.js → page-5011ae044b90449d.js} +0 -0
  857. /package/dist/dashboard/out/_next/static/chunks/app/history/{page-240f91e8b06ba8ac.js → page-b2ce7c96ed0931da.js} +0 -0
  858. /package/dist/dashboard/out/_next/static/chunks/app/metrics/{page-82938ab8fcf44694.js → page-bf2cb1e5915bc92d.js} +0 -0
  859. /package/dist/{cli → src/cli}/index.d.ts +0 -0
  860. /package/dist/{health-worker-manager.d.ts → src/health-worker-manager.d.ts} +0 -0
  861. /package/dist/{health-worker-manager.js → src/health-worker-manager.js} +0 -0
  862. /package/dist/{health-worker.d.ts → src/health-worker.d.ts} +0 -0
  863. /package/dist/{health-worker.js → src/health-worker.js} +0 -0
  864. /package/{dist/bridge → packages/bridge/dist}/shadow-cli.d.ts +0 -0
  865. /package/{dist/bridge → packages/bridge/dist}/types.js +0 -0
  866. /package/{dist/cloud → packages/cloud/dist}/api/admin.d.ts +0 -0
  867. /package/{dist/cloud → packages/cloud/dist}/api/auth.d.ts +0 -0
  868. /package/{dist/cloud → packages/cloud/dist}/api/auth.js +0 -0
  869. /package/{dist/cloud → packages/cloud/dist}/api/billing.d.ts +0 -0
  870. /package/{dist/cloud → packages/cloud/dist}/api/codex-auth-helper.d.ts +0 -0
  871. /package/{dist/cloud → packages/cloud/dist}/api/consensus.d.ts +0 -0
  872. /package/{dist/cloud → packages/cloud/dist}/api/coordinators.d.ts +0 -0
  873. /package/{dist/cloud → packages/cloud/dist}/api/daemons.d.ts +0 -0
  874. /package/{dist/cloud → packages/cloud/dist}/api/generic-webhooks.d.ts +0 -0
  875. /package/{dist/cloud → packages/cloud/dist}/api/git.d.ts +0 -0
  876. /package/{dist/cloud → packages/cloud/dist}/api/git.js +0 -0
  877. /package/{dist/cloud → packages/cloud/dist}/api/github-app.d.ts +0 -0
  878. /package/{dist/cloud → packages/cloud/dist}/api/middleware/planLimits.d.ts +0 -0
  879. /package/{dist/cloud → packages/cloud/dist}/api/middleware/planLimits.js +0 -0
  880. /package/{dist/cloud → packages/cloud/dist}/api/monitoring.d.ts +0 -0
  881. /package/{dist/cloud → packages/cloud/dist}/api/nango-auth.d.ts +0 -0
  882. /package/{dist/cloud → packages/cloud/dist}/api/policy.d.ts +0 -0
  883. /package/{dist/cloud → packages/cloud/dist}/api/providers.d.ts +0 -0
  884. /package/{dist/cloud → packages/cloud/dist}/api/repos.d.ts +0 -0
  885. /package/{dist/cloud → packages/cloud/dist}/api/teams.d.ts +0 -0
  886. /package/{dist/cloud → packages/cloud/dist}/api/test-helpers.d.ts +0 -0
  887. /package/{dist/cloud → packages/cloud/dist}/api/usage.d.ts +0 -0
  888. /package/{dist/cloud → packages/cloud/dist}/api/usage.js +0 -0
  889. /package/{dist/cloud → packages/cloud/dist}/api/webhooks.d.ts +0 -0
  890. /package/{dist/cloud → packages/cloud/dist}/api/webhooks.js +0 -0
  891. /package/{dist/cloud → packages/cloud/dist}/api/workspaces.d.ts +0 -0
  892. /package/{dist/cloud → packages/cloud/dist}/billing/index.d.ts +0 -0
  893. /package/{dist/cloud → packages/cloud/dist}/billing/index.js +0 -0
  894. /package/{dist/cloud → packages/cloud/dist}/billing/plans.d.ts +0 -0
  895. /package/{dist/cloud → packages/cloud/dist}/billing/service.d.ts +0 -0
  896. /package/{dist/cloud → packages/cloud/dist}/billing/service.js +0 -0
  897. /package/{dist/cloud → packages/cloud/dist}/billing/types.d.ts +0 -0
  898. /package/{dist/cloud → packages/cloud/dist}/billing/types.js +0 -0
  899. /package/{dist/cloud → packages/cloud/dist}/db/bulk-ingest.d.ts +0 -0
  900. /package/{dist/cloud → packages/cloud/dist}/db/bulk-ingest.js +0 -0
  901. /package/{dist/cloud → packages/cloud/dist}/db/index.d.ts +0 -0
  902. /package/{dist/cloud → packages/cloud/dist}/db/index.js +0 -0
  903. /package/{dist/cloud → packages/cloud/dist}/server.d.ts +0 -0
  904. /package/{dist/cloud → packages/cloud/dist}/services/auto-scaler.d.ts +0 -0
  905. /package/{dist/cloud → packages/cloud/dist}/services/auto-scaler.js +0 -0
  906. /package/{dist/cloud → packages/cloud/dist}/services/capacity-manager.d.ts +0 -0
  907. /package/{dist/cloud → packages/cloud/dist}/services/capacity-manager.js +0 -0
  908. /package/{dist/cloud → packages/cloud/dist}/services/ci-agent-spawner.d.ts +0 -0
  909. /package/{dist/cloud → packages/cloud/dist}/services/ci-agent-spawner.js +0 -0
  910. /package/{dist/cloud → packages/cloud/dist}/services/cloud-message-bus.d.ts +0 -0
  911. /package/{dist/cloud → packages/cloud/dist}/services/cloud-message-bus.js +0 -0
  912. /package/{dist/cloud → packages/cloud/dist}/services/compute-enforcement.d.ts +0 -0
  913. /package/{dist/cloud → packages/cloud/dist}/services/compute-enforcement.js +0 -0
  914. /package/{dist/cloud → packages/cloud/dist}/services/coordinator.d.ts +0 -0
  915. /package/{dist/cloud → packages/cloud/dist}/services/coordinator.js +0 -0
  916. /package/{dist/cloud → packages/cloud/dist}/services/mention-handler.d.ts +0 -0
  917. /package/{dist/cloud → packages/cloud/dist}/services/mention-handler.js +0 -0
  918. /package/{dist/cloud → packages/cloud/dist}/services/persistence.js +0 -0
  919. /package/{dist/cloud → packages/cloud/dist}/services/planLimits.d.ts +0 -0
  920. /package/{dist/cloud → packages/cloud/dist}/services/planLimits.js +0 -0
  921. /package/{dist/cloud → packages/cloud/dist}/services/presence-registry.d.ts +0 -0
  922. /package/{dist/cloud → packages/cloud/dist}/services/presence-registry.js +0 -0
  923. /package/{dist/cloud → packages/cloud/dist}/services/scaling-orchestrator.d.ts +0 -0
  924. /package/{dist/cloud → packages/cloud/dist}/services/scaling-orchestrator.js +0 -0
  925. /package/{dist/cloud → packages/cloud/dist}/services/scaling-policy.d.ts +0 -0
  926. /package/{dist/cloud → packages/cloud/dist}/services/scaling-policy.js +0 -0
  927. /package/{dist/cloud → packages/cloud/dist}/services/ssh-security.d.ts +0 -0
  928. /package/{dist/cloud → packages/cloud/dist}/services/ssh-security.js +0 -0
  929. /package/{dist/cloud → packages/cloud/dist}/services/workspace-keepalive.d.ts +0 -0
  930. /package/{dist/cloud → packages/cloud/dist}/services/workspace-keepalive.js +0 -0
  931. /package/{dist/cloud → packages/cloud/dist}/webhooks/index.d.ts +0 -0
  932. /package/{dist/cloud → packages/cloud/dist}/webhooks/index.js +0 -0
  933. /package/{dist/cloud → packages/cloud/dist}/webhooks/parsers/github.d.ts +0 -0
  934. /package/{dist/cloud → packages/cloud/dist}/webhooks/parsers/github.js +0 -0
  935. /package/{dist/cloud → packages/cloud/dist}/webhooks/parsers/index.d.ts +0 -0
  936. /package/{dist/cloud → packages/cloud/dist}/webhooks/parsers/index.js +0 -0
  937. /package/{dist/cloud → packages/cloud/dist}/webhooks/parsers/linear.d.ts +0 -0
  938. /package/{dist/cloud → packages/cloud/dist}/webhooks/parsers/linear.js +0 -0
  939. /package/{dist/cloud → packages/cloud/dist}/webhooks/parsers/slack.d.ts +0 -0
  940. /package/{dist/cloud → packages/cloud/dist}/webhooks/parsers/slack.js +0 -0
  941. /package/{dist/cloud → packages/cloud/dist}/webhooks/responders/github.d.ts +0 -0
  942. /package/{dist/cloud → packages/cloud/dist}/webhooks/responders/github.js +0 -0
  943. /package/{dist/cloud → packages/cloud/dist}/webhooks/responders/index.d.ts +0 -0
  944. /package/{dist/cloud → packages/cloud/dist}/webhooks/responders/index.js +0 -0
  945. /package/{dist/cloud → packages/cloud/dist}/webhooks/responders/linear.d.ts +0 -0
  946. /package/{dist/cloud → packages/cloud/dist}/webhooks/responders/linear.js +0 -0
  947. /package/{dist/cloud → packages/cloud/dist}/webhooks/responders/slack.d.ts +0 -0
  948. /package/{dist/cloud → packages/cloud/dist}/webhooks/responders/slack.js +0 -0
  949. /package/{dist/cloud → packages/cloud/dist}/webhooks/router.d.ts +0 -0
  950. /package/{dist/cloud → packages/cloud/dist}/webhooks/router.js +0 -0
  951. /package/{dist/cloud → packages/cloud/dist}/webhooks/rules-engine.d.ts +0 -0
  952. /package/{dist/cloud → packages/cloud/dist}/webhooks/rules-engine.js +0 -0
  953. /package/{dist/cloud → packages/cloud/dist}/webhooks/types.d.ts +0 -0
  954. /package/{dist/cloud → packages/cloud/dist}/webhooks/types.js +0 -0
  955. /package/{dist/utils → packages/config/dist}/agent-config.d.ts +0 -0
  956. /package/{dist/utils → packages/config/dist}/agent-config.js +0 -0
  957. /package/{dist/shared → packages/config/dist}/cli-auth-config.d.ts +0 -0
  958. /package/{dist/bridge → packages/config/dist}/shadow-config.js +0 -0
  959. /package/{dist/bridge → packages/config/dist}/teams-config.d.ts +0 -0
  960. /package/{dist/bridge → packages/config/dist}/teams-config.js +0 -0
  961. /package/{dist/continuity → packages/continuity/dist}/formatter.d.ts +0 -0
  962. /package/{dist/continuity → packages/continuity/dist}/formatter.js +0 -0
  963. /package/{dist/continuity → packages/continuity/dist}/handoff-store.d.ts +0 -0
  964. /package/{dist/continuity → packages/continuity/dist}/handoff-store.js +0 -0
  965. /package/{dist/continuity → packages/continuity/dist}/ledger-store.d.ts +0 -0
  966. /package/{dist/continuity → packages/continuity/dist}/ledger-store.js +0 -0
  967. /package/{dist/continuity → packages/continuity/dist}/manager.d.ts +0 -0
  968. /package/{dist/continuity → packages/continuity/dist}/manager.js +0 -0
  969. /package/{dist/continuity → packages/continuity/dist}/parser.d.ts +0 -0
  970. /package/{dist/continuity → packages/continuity/dist}/parser.js +0 -0
  971. /package/{dist/daemon → packages/daemon/dist}/agent-registry.d.ts +0 -0
  972. /package/{dist/daemon → packages/daemon/dist}/agent-signing.d.ts +0 -0
  973. /package/{dist/daemon → packages/daemon/dist}/agent-signing.js +0 -0
  974. /package/{dist/daemon → packages/daemon/dist}/auth.d.ts +0 -0
  975. /package/{dist/daemon → packages/daemon/dist}/auth.js +0 -0
  976. /package/{dist/daemon → packages/daemon/dist}/consensus-integration.d.ts +0 -0
  977. /package/{dist/daemon → packages/daemon/dist}/consensus.d.ts +0 -0
  978. /package/{dist/daemon → packages/daemon/dist}/consensus.js +0 -0
  979. /package/{dist/daemon → packages/daemon/dist}/rate-limiter.d.ts +0 -0
  980. /package/{dist/daemon → packages/daemon/dist}/rate-limiter.js +0 -0
  981. /package/{dist/daemon → packages/daemon/dist}/registry.d.ts +0 -0
  982. /package/{dist/daemon → packages/daemon/dist}/registry.js +0 -0
  983. /package/{dist/daemon → packages/daemon/dist}/repo-manager.d.ts +0 -0
  984. /package/{dist/daemon → packages/daemon/dist}/types.js +0 -0
  985. /package/{dist/daemon → packages/daemon/dist}/workspace-manager.d.ts +0 -0
  986. /package/{dist/dashboard-server → packages/dashboard-server/dist}/metrics.d.ts +0 -0
  987. /package/{dist/dashboard-server → packages/dashboard-server/dist}/metrics.js +0 -0
  988. /package/{dist/dashboard-server → packages/dashboard-server/dist}/needs-attention.d.ts +0 -0
  989. /package/{dist/dashboard-server → packages/dashboard-server/dist}/needs-attention.js +0 -0
  990. /package/{dist/dashboard-server → packages/dashboard-server/dist}/server.d.ts +0 -0
  991. /package/{dist/dashboard-server → packages/dashboard-server/dist}/start.d.ts +0 -0
  992. /package/{dist/hooks → packages/hooks/dist}/emitter.d.ts +0 -0
  993. /package/{dist/hooks → packages/hooks/dist}/emitter.js +0 -0
  994. /package/{dist/hooks → packages/hooks/dist}/inbox-check/hook.d.ts +0 -0
  995. /package/{dist/hooks → packages/hooks/dist}/inbox-check/hook.js +0 -0
  996. /package/{dist/hooks → packages/hooks/dist}/inbox-check/index.d.ts +0 -0
  997. /package/{dist/hooks → packages/hooks/dist}/inbox-check/index.js +0 -0
  998. /package/{dist/hooks → packages/hooks/dist}/inbox-check/types.d.ts +0 -0
  999. /package/{dist/hooks → packages/hooks/dist}/inbox-check/types.js +0 -0
  1000. /package/{dist/hooks → packages/hooks/dist}/inbox-check/utils.d.ts +0 -0
  1001. /package/{dist/hooks → packages/hooks/dist}/inbox-check/utils.js +0 -0
  1002. /package/{dist/hooks → packages/hooks/dist}/registry.d.ts +0 -0
  1003. /package/{dist/hooks → packages/hooks/dist}/trajectory-hooks.d.ts +0 -0
  1004. /package/{dist/memory → packages/memory/dist}/adapters/index.d.ts +0 -0
  1005. /package/{dist/memory → packages/memory/dist}/adapters/index.js +0 -0
  1006. /package/{dist/memory → packages/memory/dist}/adapters/inmemory.d.ts +0 -0
  1007. /package/{dist/memory → packages/memory/dist}/adapters/inmemory.js +0 -0
  1008. /package/{dist/memory → packages/memory/dist}/adapters/supermemory.d.ts +0 -0
  1009. /package/{dist/memory → packages/memory/dist}/adapters/supermemory.js +0 -0
  1010. /package/{dist/memory → packages/memory/dist}/context-compaction.d.ts +0 -0
  1011. /package/{dist/memory → packages/memory/dist}/context-compaction.js +0 -0
  1012. /package/{dist/memory → packages/memory/dist}/factory.d.ts +0 -0
  1013. /package/{dist/memory → packages/memory/dist}/factory.js +0 -0
  1014. /package/{dist/memory → packages/memory/dist}/index.d.ts +0 -0
  1015. /package/{dist/memory → packages/memory/dist}/index.js +0 -0
  1016. /package/{dist/memory → packages/memory/dist}/memory-hooks.js +0 -0
  1017. /package/{dist/memory → packages/memory/dist}/service.d.ts +0 -0
  1018. /package/{dist/memory → packages/memory/dist}/service.js +0 -0
  1019. /package/{dist/memory → packages/memory/dist}/types.d.ts +0 -0
  1020. /package/{dist/memory → packages/memory/dist}/types.js +0 -0
  1021. /package/{dist/policy → packages/policy/dist}/agent-policy.d.ts +0 -0
  1022. /package/{dist/policy → packages/policy/dist}/cloud-policy-fetcher.d.ts +0 -0
  1023. /package/{dist/policy → packages/policy/dist}/cloud-policy-fetcher.js +0 -0
  1024. /package/{dist/utils → packages/protocol/dist}/id-generator.d.ts +0 -0
  1025. /package/{dist/utils → packages/protocol/dist}/id-generator.js +0 -0
  1026. /package/{dist/protocol → packages/protocol/dist}/relay-pty-schemas.js +0 -0
  1027. /package/{dist/resiliency → packages/resiliency/dist}/context-persistence.d.ts +0 -0
  1028. /package/{dist/resiliency → packages/resiliency/dist}/context-persistence.js +0 -0
  1029. /package/{dist/resiliency → packages/resiliency/dist}/crash-insights.d.ts +0 -0
  1030. /package/{dist/resiliency → packages/resiliency/dist}/crash-insights.js +0 -0
  1031. /package/{dist/resiliency → packages/resiliency/dist}/gossip-health.d.ts +0 -0
  1032. /package/{dist/resiliency → packages/resiliency/dist}/gossip-health.js +0 -0
  1033. /package/{dist/resiliency → packages/resiliency/dist}/health-monitor.d.ts +0 -0
  1034. /package/{dist/resiliency → packages/resiliency/dist}/health-monitor.js +0 -0
  1035. /package/{dist/resiliency → packages/resiliency/dist}/index.d.ts +0 -0
  1036. /package/{dist/resiliency → packages/resiliency/dist}/index.js +0 -0
  1037. /package/{dist/resiliency → packages/resiliency/dist}/leader-watchdog.d.ts +0 -0
  1038. /package/{dist/resiliency → packages/resiliency/dist}/leader-watchdog.js +0 -0
  1039. /package/{dist/resiliency → packages/resiliency/dist}/logger.d.ts +0 -0
  1040. /package/{dist/resiliency → packages/resiliency/dist}/logger.js +0 -0
  1041. /package/{dist/resiliency → packages/resiliency/dist}/memory-monitor.d.ts +0 -0
  1042. /package/{dist/resiliency → packages/resiliency/dist}/metrics.d.ts +0 -0
  1043. /package/{dist/resiliency → packages/resiliency/dist}/metrics.js +0 -0
  1044. /package/{dist/resiliency → packages/resiliency/dist}/provider-context.js +0 -0
  1045. /package/{dist/resiliency → packages/resiliency/dist}/stateless-lead.d.ts +0 -0
  1046. /package/{dist/resiliency → packages/resiliency/dist}/stateless-lead.js +0 -0
  1047. /package/{dist/resiliency → packages/resiliency/dist}/supervisor.d.ts +0 -0
  1048. /package/{dist/resiliency → packages/resiliency/dist}/supervisor.js +0 -0
  1049. /package/{dist/state → packages/state/dist}/agent-state.d.ts +0 -0
  1050. /package/{dist/storage → packages/storage/dist}/adapter.js +0 -0
  1051. /package/{dist/storage → packages/storage/dist}/dead-letter-queue.d.ts +0 -0
  1052. /package/{dist/storage → packages/storage/dist}/dead-letter-queue.js +0 -0
  1053. /package/{dist/storage → packages/storage/dist}/dlq-adapter.d.ts +0 -0
  1054. /package/{dist/storage → packages/storage/dist}/dlq-adapter.js +0 -0
  1055. /package/{dist/trajectory → packages/trajectory/dist}/integration.d.ts +0 -0
  1056. /package/{dist/utils → packages/utils/dist}/command-resolver.d.ts +0 -0
  1057. /package/{dist/utils → packages/utils/dist}/git-remote.d.ts +0 -0
  1058. /package/{dist/utils → packages/utils/dist}/git-remote.js +0 -0
  1059. /package/{dist/utils → packages/utils/dist}/logger.d.ts +0 -0
  1060. /package/{dist/utils → packages/utils/dist}/logger.js +0 -0
  1061. /package/{dist/utils → packages/utils/dist}/name-generator.d.ts +0 -0
  1062. /package/{dist/utils → packages/utils/dist}/name-generator.js +0 -0
  1063. /package/{dist/utils → packages/utils/dist}/precompiled-patterns.d.ts +0 -0
  1064. /package/{dist/utils → packages/utils/dist}/precompiled-patterns.js +0 -0
  1065. /package/{dist/utils → packages/utils/dist}/update-checker.d.ts +0 -0
  1066. /package/{dist/utils → packages/utils/dist}/update-checker.js +0 -0
  1067. /package/{dist/wrapper → packages/wrapper/dist}/auth-detection.d.ts +0 -0
  1068. /package/{dist/wrapper → packages/wrapper/dist}/auth-detection.js +0 -0
  1069. /package/{dist/wrapper → packages/wrapper/dist}/inbox.d.ts +0 -0
  1070. /package/{dist/wrapper → packages/wrapper/dist}/inbox.js +0 -0
  1071. /package/{dist/wrapper → packages/wrapper/dist}/prompt-composer.d.ts +0 -0
  1072. /package/{dist/wrapper → packages/wrapper/dist}/prompt-composer.js +0 -0
  1073. /package/{dist/utils → packages/wrapper/dist}/tmux-resolver.d.ts +0 -0
  1074. /package/{dist/utils → packages/wrapper/dist}/tmux-resolver.js +0 -0
@@ -0,0 +1,1329 @@
1
+ /**
2
+ * Workspace Settings Panel
3
+ *
4
+ * Manage workspace configuration including repositories,
5
+ * AI providers, custom domains, and agent policies.
6
+ *
7
+ * Design: Mission Control theme with deep space aesthetic
8
+ */
9
+
10
+ import React, { useState, useEffect, useCallback } from 'react';
11
+ import { cloudApi } from '../../lib/cloudApi';
12
+ import { ProviderAuthFlow } from '../ProviderAuthFlow';
13
+ import { TerminalProviderSetup } from '../TerminalProviderSetup';
14
+ import { RepoAccessPanel } from '../RepoAccessPanel';
15
+
16
+ export interface WorkspaceSettingsPanelProps {
17
+ workspaceId: string;
18
+ csrfToken?: string;
19
+ onClose?: () => void;
20
+ }
21
+
22
+ interface WorkspaceDetails {
23
+ id: string;
24
+ name: string;
25
+ status: string;
26
+ publicUrl?: string;
27
+ computeProvider: string;
28
+ config: {
29
+ providers: string[];
30
+ repositories: string[];
31
+ supervisorEnabled?: boolean;
32
+ maxAgents?: number;
33
+ };
34
+ customDomain?: string;
35
+ customDomainStatus?: string;
36
+ errorMessage?: string;
37
+ repositories: Array<{
38
+ id: string;
39
+ fullName: string;
40
+ syncStatus: string;
41
+ lastSyncedAt?: string;
42
+ }>;
43
+ createdAt: string;
44
+ updatedAt: string;
45
+ }
46
+
47
+ interface AvailableRepo {
48
+ id: string;
49
+ fullName: string;
50
+ isPrivate: boolean;
51
+ defaultBranch: string;
52
+ syncStatus: string;
53
+ hasNangoConnection: boolean;
54
+ lastSyncedAt?: string;
55
+ }
56
+
57
+ interface AIProvider {
58
+ id: string;
59
+ name: string;
60
+ displayName: string;
61
+ description: string;
62
+ color: string;
63
+ cliCommand: string;
64
+ apiKeyUrl?: string;
65
+ apiKeyName?: string;
66
+ supportsOAuth?: boolean;
67
+ supportsDeviceFlow?: boolean; // Provider supports device flow (easier for headless environments)
68
+ preferApiKey?: boolean; // Show API key input by default (simpler for mobile/containers)
69
+ isConnected?: boolean;
70
+ }
71
+
72
+ const AI_PROVIDERS: AIProvider[] = [
73
+ {
74
+ id: 'anthropic',
75
+ name: 'anthropic', // Must be lowercase to match backend validation
76
+ displayName: 'Claude',
77
+ description: 'Claude Code - recommended for code tasks',
78
+ color: '#D97757',
79
+ cliCommand: 'claude',
80
+ apiKeyUrl: 'https://console.anthropic.com/settings/keys',
81
+ apiKeyName: 'API key',
82
+ supportsOAuth: true,
83
+ },
84
+ {
85
+ id: 'codex',
86
+ name: 'openai', // Must be lowercase to match backend validation
87
+ displayName: 'Codex',
88
+ description: 'Codex - OpenAI coding assistant',
89
+ color: '#10A37F',
90
+ cliCommand: 'codex login',
91
+ apiKeyUrl: 'https://platform.openai.com/api-keys',
92
+ apiKeyName: 'API key',
93
+ supportsOAuth: true,
94
+ supportsDeviceFlow: true, // Codex supports --device-auth for headless environments
95
+ },
96
+ {
97
+ id: 'google',
98
+ name: 'google', // Must be lowercase to match backend validation
99
+ displayName: 'Gemini',
100
+ description: 'Gemini - Google AI coding assistant',
101
+ color: '#4285F4',
102
+ cliCommand: 'gemini',
103
+ // No apiKeyUrl - Gemini uses interactive terminal where user can choose OAuth or API key
104
+ supportsOAuth: true,
105
+ },
106
+ {
107
+ id: 'opencode',
108
+ name: 'opencode', // Must be lowercase to match backend validation
109
+ displayName: 'OpenCode',
110
+ description: 'OpenCode - AI coding assistant',
111
+ color: '#00D4AA',
112
+ cliCommand: 'opencode',
113
+ supportsOAuth: true,
114
+ },
115
+ {
116
+ id: 'droid',
117
+ name: 'factory', // Must be lowercase to match backend validation
118
+ displayName: 'Droid',
119
+ description: 'Droid - Factory AI coding agent',
120
+ color: '#6366F1',
121
+ cliCommand: 'droid',
122
+ supportsOAuth: true,
123
+ },
124
+ {
125
+ id: 'cursor',
126
+ name: 'cursor', // Must be lowercase to match backend validation
127
+ displayName: 'Cursor',
128
+ description: 'Cursor - AI-first code editor agent',
129
+ color: '#7C3AED',
130
+ cliCommand: 'agent',
131
+ supportsOAuth: true,
132
+ },
133
+ ];
134
+
135
+ export function WorkspaceSettingsPanel({
136
+ workspaceId,
137
+ csrfToken,
138
+ onClose,
139
+ }: WorkspaceSettingsPanelProps) {
140
+ const [workspace, setWorkspace] = useState<WorkspaceDetails | null>(null);
141
+ const [availableRepos, setAvailableRepos] = useState<AvailableRepo[]>([]);
142
+ const [isLoading, setIsLoading] = useState(true);
143
+ const [error, setError] = useState<string | null>(null);
144
+ const [activeSection, setActiveSection] = useState<'general' | 'providers' | 'repos' | 'github-access' | 'domain' | 'danger'>('general');
145
+
146
+ // Provider connection state
147
+ const [providerStatus, setProviderStatus] = useState<Record<string, boolean>>({});
148
+ const [connectingProvider, setConnectingProvider] = useState<string | null>(null);
149
+ const [apiKeyInput, setApiKeyInput] = useState('');
150
+ const [providerError, setProviderError] = useState<string | null>(null);
151
+ const [showApiKeyFallback, setShowApiKeyFallback] = useState<Record<string, boolean>>({});
152
+ // Device flow preference for providers that support it
153
+ const [useDeviceFlow, setUseDeviceFlow] = useState<Record<string, boolean>>({});
154
+ // Use terminal-based setup (default for Claude, Cursor, and Gemini - Codex uses CLI helper flow)
155
+ const [useTerminalSetup, setUseTerminalSetup] = useState<Record<string, boolean>>({
156
+ anthropic: true, // Default to terminal for Claude
157
+ cursor: true, // Default to terminal for Cursor
158
+ google: true, // Default to terminal for Gemini - allows choosing OAuth or API key
159
+ });
160
+
161
+ // Repo sync state
162
+ const [syncingRepoId, setSyncingRepoId] = useState<string | null>(null);
163
+
164
+ // Custom domain form
165
+ const [customDomain, setCustomDomain] = useState('');
166
+ const [domainLoading, setDomainLoading] = useState(false);
167
+ const [domainError, setDomainError] = useState<string | null>(null);
168
+ const [domainInstructions, setDomainInstructions] = useState<{
169
+ type: string;
170
+ name: string;
171
+ value: string;
172
+ ttl: number;
173
+ } | null>(null);
174
+
175
+ // Load workspace details
176
+ useEffect(() => {
177
+ async function loadWorkspace() {
178
+ setIsLoading(true);
179
+ setError(null);
180
+
181
+ const [wsResult, reposResult, providersResult] = await Promise.all([
182
+ cloudApi.getWorkspaceDetails(workspaceId),
183
+ cloudApi.getRepos(),
184
+ cloudApi.getProviders(workspaceId),
185
+ ]);
186
+
187
+ if (wsResult.success) {
188
+ setWorkspace(wsResult.data);
189
+ if (wsResult.data.customDomain) {
190
+ setCustomDomain(wsResult.data.customDomain);
191
+ }
192
+ } else {
193
+ setError(wsResult.error);
194
+ }
195
+
196
+ if (reposResult.success) {
197
+ setAvailableRepos(reposResult.data.repositories);
198
+ }
199
+
200
+ // Mark connected providers for this workspace
201
+ if (providersResult.success) {
202
+ // Map backend IDs to frontend IDs for consistency
203
+ const BACKEND_TO_FRONTEND_MAP: Record<string, string> = {
204
+ openai: 'codex', // Backend stores 'openai', frontend uses 'codex'
205
+ };
206
+ const connected: Record<string, boolean> = {};
207
+ providersResult.data.providers.forEach((p) => {
208
+ if (p.isConnected) {
209
+ connected[p.id] = true;
210
+ // Also mark the frontend ID as connected if there's a mapping
211
+ const frontendId = BACKEND_TO_FRONTEND_MAP[p.id];
212
+ if (frontendId) {
213
+ connected[frontendId] = true;
214
+ }
215
+ }
216
+ });
217
+ setProviderStatus(connected);
218
+ }
219
+
220
+ setIsLoading(false);
221
+ }
222
+
223
+ loadWorkspace();
224
+ }, [workspaceId]);
225
+
226
+ // Start CLI-based OAuth flow for a provider
227
+ // This just sets state to show the ProviderAuthFlow component, which handles the actual auth
228
+ const startOAuthFlow = (provider: AIProvider) => {
229
+ setProviderError(null);
230
+ setConnectingProvider(provider.id);
231
+ // ProviderAuthFlow will handle the rest when it mounts
232
+ };
233
+
234
+ const submitApiKey = async (provider: AIProvider) => {
235
+ if (!apiKeyInput.trim()) {
236
+ setProviderError('Please enter an API key');
237
+ return;
238
+ }
239
+
240
+ setProviderError(null);
241
+ setConnectingProvider(provider.id);
242
+
243
+ try {
244
+ const headers: Record<string, string> = { 'Content-Type': 'application/json' };
245
+ if (csrfToken) headers['X-CSRF-Token'] = csrfToken;
246
+
247
+ const res = await fetch(`/api/onboarding/token/${provider.id}`, {
248
+ method: 'POST',
249
+ credentials: 'include',
250
+ headers,
251
+ body: JSON.stringify({ token: apiKeyInput.trim(), workspaceId }),
252
+ });
253
+
254
+ if (!res.ok) {
255
+ const data = await res.json();
256
+ throw new Error(data.error || 'Failed to connect');
257
+ }
258
+
259
+ setProviderStatus(prev => ({ ...prev, [provider.id]: true }));
260
+ setApiKeyInput('');
261
+ setConnectingProvider(null);
262
+ setShowApiKeyFallback(prev => ({ ...prev, [provider.id]: false }));
263
+ } catch (err) {
264
+ setProviderError(err instanceof Error ? err.message : 'Failed to connect');
265
+ setConnectingProvider(null);
266
+ }
267
+ };
268
+
269
+ // Restart workspace
270
+ const handleRestart = useCallback(async () => {
271
+ if (!workspace) return;
272
+
273
+ const confirmed = window.confirm('Are you sure you want to restart this workspace?');
274
+ if (!confirmed) return;
275
+
276
+ const result = await cloudApi.restartWorkspace(workspace.id);
277
+ if (result.success) {
278
+ const wsResult = await cloudApi.getWorkspaceDetails(workspaceId);
279
+ if (wsResult.success) {
280
+ setWorkspace(wsResult.data);
281
+ }
282
+ } else {
283
+ setError(result.error);
284
+ }
285
+ }, [workspace, workspaceId]);
286
+
287
+ // Stop workspace
288
+ const handleStop = useCallback(async () => {
289
+ if (!workspace) return;
290
+
291
+ const confirmed = window.confirm('Are you sure you want to stop this workspace?');
292
+ if (!confirmed) return;
293
+
294
+ const result = await cloudApi.stopWorkspace(workspace.id);
295
+ if (result.success) {
296
+ const wsResult = await cloudApi.getWorkspaceDetails(workspaceId);
297
+ if (wsResult.success) {
298
+ setWorkspace(wsResult.data);
299
+ }
300
+ } else {
301
+ setError(result.error);
302
+ }
303
+ }, [workspace, workspaceId]);
304
+
305
+ // Add repository to workspace
306
+ const handleAddRepo = useCallback(async (repoId: string) => {
307
+ if (!workspace) return;
308
+
309
+ const result = await cloudApi.addReposToWorkspace(workspace.id, [repoId]);
310
+ if (result.success) {
311
+ const wsResult = await cloudApi.getWorkspaceDetails(workspaceId);
312
+ if (wsResult.success) {
313
+ setWorkspace(wsResult.data);
314
+ }
315
+ } else {
316
+ setError(result.error);
317
+ }
318
+ }, [workspace, workspaceId]);
319
+
320
+ // Sync repository to workspace (clone/pull)
321
+ const handleSyncRepo = useCallback(async (repoId: string) => {
322
+ if (!workspace) return;
323
+
324
+ setSyncingRepoId(repoId);
325
+ setError(null);
326
+
327
+ const result = await cloudApi.syncRepo(repoId);
328
+ if (result.success) {
329
+ // Refresh workspace to get updated sync status
330
+ const wsResult = await cloudApi.getWorkspaceDetails(workspaceId);
331
+ if (wsResult.success) {
332
+ setWorkspace(wsResult.data);
333
+ }
334
+ } else {
335
+ setError(result.error);
336
+ }
337
+
338
+ setSyncingRepoId(null);
339
+ }, [workspace, workspaceId]);
340
+
341
+ // Set custom domain
342
+ const handleSetDomain = useCallback(async () => {
343
+ if (!workspace || !customDomain.trim()) return;
344
+
345
+ setDomainLoading(true);
346
+ setDomainError(null);
347
+ setDomainInstructions(null);
348
+
349
+ const result = await cloudApi.setCustomDomain(workspace.id, customDomain.trim());
350
+ if (result.success) {
351
+ setDomainInstructions(result.data.instructions);
352
+ const wsResult = await cloudApi.getWorkspaceDetails(workspaceId);
353
+ if (wsResult.success) {
354
+ setWorkspace(wsResult.data);
355
+ }
356
+ } else {
357
+ setDomainError(result.error);
358
+ }
359
+
360
+ setDomainLoading(false);
361
+ }, [workspace, customDomain, workspaceId]);
362
+
363
+ // Verify custom domain
364
+ const handleVerifyDomain = useCallback(async () => {
365
+ if (!workspace) return;
366
+
367
+ setDomainLoading(true);
368
+ setDomainError(null);
369
+
370
+ const result = await cloudApi.verifyCustomDomain(workspace.id);
371
+ if (result.success) {
372
+ const wsResult = await cloudApi.getWorkspaceDetails(workspaceId);
373
+ if (wsResult.success) {
374
+ setWorkspace(wsResult.data);
375
+ }
376
+ if (result.data.status === 'active') {
377
+ setDomainInstructions(null);
378
+ }
379
+ } else {
380
+ setDomainError(result.error);
381
+ }
382
+
383
+ setDomainLoading(false);
384
+ }, [workspace, workspaceId]);
385
+
386
+ // Remove custom domain
387
+ const handleRemoveDomain = useCallback(async () => {
388
+ if (!workspace) return;
389
+
390
+ const confirmed = window.confirm('Are you sure you want to remove the custom domain?');
391
+ if (!confirmed) return;
392
+
393
+ setDomainLoading(true);
394
+ const result = await cloudApi.removeCustomDomain(workspace.id);
395
+ if (result.success) {
396
+ setCustomDomain('');
397
+ setDomainInstructions(null);
398
+ const wsResult = await cloudApi.getWorkspaceDetails(workspaceId);
399
+ if (wsResult.success) {
400
+ setWorkspace(wsResult.data);
401
+ }
402
+ } else {
403
+ setDomainError(result.error);
404
+ }
405
+ setDomainLoading(false);
406
+ }, [workspace, workspaceId]);
407
+
408
+ // Delete workspace
409
+ const handleDelete = useCallback(async () => {
410
+ if (!workspace) return;
411
+
412
+ const confirmed = window.confirm(
413
+ `Are you sure you want to delete "${workspace.name}"? This action cannot be undone.`
414
+ );
415
+ if (!confirmed) return;
416
+
417
+ const doubleConfirm = window.confirm(
418
+ 'This will permanently delete all workspace data. Are you absolutely sure?'
419
+ );
420
+ if (!doubleConfirm) return;
421
+
422
+ const result = await cloudApi.deleteWorkspace(workspace.id);
423
+ if (result.success) {
424
+ // Redirect to onboarding page with deleted reason
425
+ window.location.href = '/app/onboarding?reason=deleted';
426
+ } else {
427
+ setError(result.error);
428
+ }
429
+ }, [workspace]);
430
+
431
+ if (isLoading) {
432
+ return (
433
+ <div className="flex items-center justify-center h-64">
434
+ <div className="relative">
435
+ <div className="w-12 h-12 rounded-full border-2 border-accent-cyan/20 border-t-accent-cyan animate-spin" />
436
+ <div className="absolute inset-0 flex items-center justify-center">
437
+ <div className="w-4 h-4 rounded-full bg-accent-cyan/40 animate-pulse" />
438
+ </div>
439
+ </div>
440
+ <span className="ml-4 text-text-muted font-mono text-sm tracking-wide">
441
+ LOADING WORKSPACE CONFIG...
442
+ </span>
443
+ </div>
444
+ );
445
+ }
446
+
447
+ if (error && !workspace) {
448
+ return (
449
+ <div className="p-6">
450
+ <div className="p-4 bg-error/10 border border-error/30 rounded-lg text-error flex items-center gap-3">
451
+ <AlertIcon />
452
+ <span>{error}</span>
453
+ </div>
454
+ </div>
455
+ );
456
+ }
457
+
458
+ if (!workspace) {
459
+ return null;
460
+ }
461
+
462
+ const unassignedRepos = availableRepos.filter(
463
+ (r) => !workspace.repositories.some((wr) => wr.id === r.id)
464
+ );
465
+
466
+ const sections = [
467
+ { id: 'general', label: 'General', icon: <SettingsGearIcon /> },
468
+ { id: 'providers', label: 'AI Providers', icon: <ProviderIcon /> },
469
+ { id: 'repos', label: 'Repositories', icon: <RepoIcon /> },
470
+ { id: 'github-access', label: 'GitHub Access', icon: <GitHubIcon /> },
471
+ { id: 'domain', label: 'Domain', icon: <GlobeIcon /> },
472
+ { id: 'danger', label: 'Danger', icon: <AlertIcon /> },
473
+ ];
474
+
475
+ return (
476
+ <div className="flex flex-col h-full bg-bg-primary">
477
+ {/* Section Navigation - horizontally scrollable on mobile */}
478
+ <div
479
+ className="flex gap-1 p-2 sm:p-3 border-b border-border-subtle bg-gradient-to-b from-bg-tertiary to-bg-primary overflow-x-auto scrollbar-hide scroll-smooth snap-x snap-mandatory touch-pan-x"
480
+ style={{ WebkitOverflowScrolling: 'touch' }}
481
+ >
482
+ {sections.map((section) => (
483
+ <button
484
+ key={section.id}
485
+ onClick={() => setActiveSection(section.id as typeof activeSection)}
486
+ className={`flex items-center gap-1.5 sm:gap-2 px-3 sm:px-4 py-2 sm:py-2.5 rounded-lg text-xs sm:text-sm font-medium transition-all duration-200 whitespace-nowrap shrink-0 snap-start ${
487
+ activeSection === section.id
488
+ ? 'bg-accent-cyan/15 text-accent-cyan border border-accent-cyan/30 shadow-[0_0_12px_rgba(0,217,255,0.15)]'
489
+ : 'text-text-secondary hover:bg-bg-hover hover:text-text-primary border border-transparent'
490
+ }`}
491
+ >
492
+ <span className={activeSection === section.id ? 'text-accent-cyan' : 'text-text-muted'}>
493
+ {section.icon}
494
+ </span>
495
+ {section.label}
496
+ </button>
497
+ ))}
498
+ </div>
499
+
500
+ {/* Content */}
501
+ <div className="flex-1 overflow-y-auto p-4 sm:p-6">
502
+ {error && (
503
+ <div className="mb-6 p-4 bg-error/10 border border-error/30 rounded-lg text-error text-sm flex items-center gap-3">
504
+ <AlertIcon />
505
+ <span className="flex-1">{error}</span>
506
+ <button onClick={() => setError(null)} className="text-error/60 hover:text-error">
507
+ <CloseIcon />
508
+ </button>
509
+ </div>
510
+ )}
511
+
512
+ {/* General Section */}
513
+ {activeSection === 'general' && (
514
+ <div className="space-y-8">
515
+ <SectionHeader
516
+ title="Workspace Overview"
517
+ subtitle="Core configuration and status"
518
+ />
519
+
520
+ <div className="grid grid-cols-2 gap-4">
521
+ <InfoCard label="Name" value={workspace.name} />
522
+ <InfoCard
523
+ label="Status"
524
+ value={workspace.status.charAt(0).toUpperCase() + workspace.status.slice(1)}
525
+ valueColor={
526
+ workspace.status === 'running' ? 'text-success' :
527
+ workspace.status === 'stopped' ? 'text-amber-400' :
528
+ workspace.status === 'error' ? 'text-error' : 'text-text-muted'
529
+ }
530
+ indicator={workspace.status === 'running'}
531
+ />
532
+ <InfoCard
533
+ label="Public URL"
534
+ value={workspace.publicUrl || 'Not available'}
535
+ mono
536
+ />
537
+ <InfoCard
538
+ label="Compute Provider"
539
+ value={workspace.computeProvider.charAt(0).toUpperCase() + workspace.computeProvider.slice(1)}
540
+ />
541
+ </div>
542
+
543
+ <div>
544
+ <SectionHeader title="Actions" subtitle="Manage workspace state" />
545
+ <div className="flex gap-3 mt-4">
546
+ {workspace.status === 'running' && (
547
+ <ActionButton
548
+ onClick={handleStop}
549
+ variant="warning"
550
+ icon={<StopIcon />}
551
+ >
552
+ Stop Workspace
553
+ </ActionButton>
554
+ )}
555
+ <ActionButton
556
+ onClick={handleRestart}
557
+ variant="primary"
558
+ icon={<RestartIcon />}
559
+ >
560
+ Restart Workspace
561
+ </ActionButton>
562
+ </div>
563
+ </div>
564
+ </div>
565
+ )}
566
+
567
+ {/* AI Providers Section */}
568
+ {activeSection === 'providers' && (
569
+ <div className="space-y-8">
570
+ <SectionHeader
571
+ title="AI Providers"
572
+ subtitle="Connect AI providers to spawn agents in this workspace"
573
+ />
574
+
575
+ {providerError && (
576
+ <div className="p-4 bg-error/10 border border-error/30 rounded-lg text-error text-sm flex items-center gap-3">
577
+ <AlertIcon />
578
+ <span>{providerError}</span>
579
+ </div>
580
+ )}
581
+
582
+ <div className="space-y-4">
583
+ {AI_PROVIDERS.map((provider) => (
584
+ <div
585
+ key={provider.id}
586
+ className="p-5 bg-bg-tertiary rounded-xl border border-border-subtle hover:border-border-medium transition-all duration-200"
587
+ >
588
+ <div className="flex items-center justify-between">
589
+ <div className="flex items-center gap-4">
590
+ <div
591
+ className="w-12 h-12 rounded-xl flex items-center justify-center text-white font-bold text-lg shadow-lg"
592
+ style={{
593
+ backgroundColor: provider.color,
594
+ boxShadow: `0 4px 20px ${provider.color}40`,
595
+ }}
596
+ >
597
+ {provider.displayName[0]}
598
+ </div>
599
+ <div>
600
+ <h4 className="text-base font-semibold text-text-primary">
601
+ {provider.displayName}
602
+ </h4>
603
+ <p className="text-sm text-text-muted">{provider.description}</p>
604
+ </div>
605
+ </div>
606
+
607
+ {providerStatus[provider.id] ? (
608
+ <div className="flex items-center gap-2 px-4 py-2 bg-success/15 rounded-full border border-success/30">
609
+ <div className="w-2 h-2 rounded-full bg-success animate-pulse" />
610
+ <span className="text-sm font-medium text-success">Connected</span>
611
+ </div>
612
+ ) : null}
613
+ </div>
614
+
615
+ {!providerStatus[provider.id] && (
616
+ <div className="mt-5 pt-5 border-t border-border-subtle">
617
+ {connectingProvider === provider.id && !showApiKeyFallback[provider.id] ? (
618
+ useTerminalSetup[provider.id] ? (
619
+ <TerminalProviderSetup
620
+ provider={{
621
+ id: provider.id,
622
+ name: provider.name,
623
+ displayName: provider.displayName,
624
+ color: provider.color,
625
+ }}
626
+ workspaceId={workspaceId}
627
+ csrfToken={csrfToken}
628
+ maxHeight="350px"
629
+ onSuccess={() => {
630
+ setProviderStatus(prev => ({ ...prev, [provider.id]: true }));
631
+ setConnectingProvider(null);
632
+ }}
633
+ onCancel={() => {
634
+ setConnectingProvider(null);
635
+ }}
636
+ onError={(err) => {
637
+ setProviderError(err);
638
+ setConnectingProvider(null);
639
+ }}
640
+ onConnectAnother={() => {
641
+ // Mark current provider as connected and clear selection
642
+ // User can then click another provider to connect
643
+ setProviderStatus(prev => ({ ...prev, [provider.id]: true }));
644
+ setConnectingProvider(null);
645
+ }}
646
+ />
647
+ ) : (
648
+ <ProviderAuthFlow
649
+ provider={{
650
+ id: provider.id,
651
+ name: provider.name,
652
+ displayName: provider.displayName,
653
+ color: provider.color,
654
+ requiresUrlCopy: provider.id === 'codex',
655
+ supportsDeviceFlow: provider.supportsDeviceFlow,
656
+ }}
657
+ workspaceId={workspaceId}
658
+ csrfToken={csrfToken}
659
+ useDeviceFlow={useDeviceFlow[provider.id] || false}
660
+ onSuccess={() => {
661
+ setProviderStatus(prev => ({ ...prev, [provider.id]: true }));
662
+ setConnectingProvider(null);
663
+ }}
664
+ onCancel={() => {
665
+ setConnectingProvider(null);
666
+ }}
667
+ onError={(err) => {
668
+ setProviderError(err);
669
+ setConnectingProvider(null);
670
+ }}
671
+ />
672
+ )
673
+ ) : showApiKeyFallback[provider.id] ? (
674
+ <div className="space-y-4">
675
+ <div className="flex gap-3">
676
+ <input
677
+ type="password"
678
+ placeholder={`Enter ${provider.displayName} ${provider.apiKeyName || 'API key'}`}
679
+ value={connectingProvider === provider.id ? apiKeyInput : ''}
680
+ onChange={(e) => {
681
+ setConnectingProvider(provider.id);
682
+ setApiKeyInput(e.target.value);
683
+ }}
684
+ onFocus={() => setConnectingProvider(provider.id)}
685
+ className="flex-1 px-4 py-3 bg-bg-card border border-border-subtle rounded-lg text-sm text-text-primary placeholder:text-text-muted focus:outline-none focus:border-accent-cyan focus:ring-1 focus:ring-accent-cyan/30 transition-all"
686
+ />
687
+ <button
688
+ onClick={() => submitApiKey(provider)}
689
+ disabled={connectingProvider !== provider.id || !apiKeyInput.trim()}
690
+ className="px-5 py-3 bg-accent-cyan text-bg-deep font-semibold rounded-lg text-sm hover:bg-accent-cyan/90 disabled:opacity-50 disabled:cursor-not-allowed transition-all"
691
+ >
692
+ Connect
693
+ </button>
694
+ </div>
695
+ {provider.apiKeyUrl && (
696
+ <p className="text-xs text-text-muted">
697
+ Get your API key from{' '}
698
+ <a
699
+ href={provider.apiKeyUrl}
700
+ target="_blank"
701
+ rel="noopener noreferrer"
702
+ className="text-accent-cyan hover:underline"
703
+ >
704
+ {new URL(provider.apiKeyUrl).hostname}
705
+ </a>
706
+ </p>
707
+ )}
708
+ {provider.supportsOAuth && (
709
+ <button
710
+ onClick={() => setShowApiKeyFallback(prev => ({ ...prev, [provider.id]: false }))}
711
+ className="text-xs text-text-muted hover:text-text-secondary transition-colors"
712
+ >
713
+ ← Back to OAuth login
714
+ </button>
715
+ )}
716
+ </div>
717
+ ) : provider.supportsOAuth ? (
718
+ <div className="space-y-3">
719
+ {/* CLI info for Codex */}
720
+ {provider.id === 'codex' && (
721
+ <div className="p-3 bg-accent-cyan/10 border border-accent-cyan/30 rounded-lg">
722
+ <p className="text-sm text-accent-cyan font-medium mb-1">CLI-assisted authentication</p>
723
+ <p className="text-xs text-accent-cyan/80">
724
+ Codex auth uses a CLI command to capture the OAuth callback locally.
725
+ Click the button below and we&apos;ll show you a command with a unique session token
726
+ to run in your terminal before signing in with OpenAI.
727
+ </p>
728
+ </div>
729
+ )}
730
+ {/* Device flow toggle for providers that support it */}
731
+ {provider.supportsDeviceFlow && (
732
+ <label className="flex items-center gap-2 text-xs text-text-secondary cursor-pointer">
733
+ <input
734
+ type="checkbox"
735
+ checked={useDeviceFlow[provider.id] || false}
736
+ onChange={(e) => setUseDeviceFlow(prev => ({
737
+ ...prev,
738
+ [provider.id]: e.target.checked,
739
+ }))}
740
+ className="w-4 h-4 rounded border-border-subtle bg-bg-card text-accent-cyan focus:ring-accent-cyan/30 cursor-pointer"
741
+ />
742
+ Use device flow (easier for containers/headless)
743
+ </label>
744
+ )}
745
+ <button
746
+ onClick={() => startOAuthFlow(provider)}
747
+ disabled={connectingProvider !== null}
748
+ className="w-full py-3 px-4 bg-gradient-to-r from-accent-cyan to-[#00b8d9] text-bg-deep font-semibold rounded-lg text-sm hover:shadow-glow-cyan hover:-translate-y-0.5 disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:translate-y-0 disabled:hover:shadow-none transition-all duration-200 flex items-center justify-center gap-2"
749
+ >
750
+ <LockIcon />
751
+ Connect with {provider.displayName}
752
+ </button>
753
+ {provider.apiKeyUrl && (
754
+ <button
755
+ onClick={() => setShowApiKeyFallback(prev => ({ ...prev, [provider.id]: true }))}
756
+ className="w-full text-xs text-text-muted hover:text-text-secondary transition-colors"
757
+ >
758
+ Or enter API key manually
759
+ </button>
760
+ )}
761
+ </div>
762
+ ) : (
763
+ /* Provider doesn't support OAuth - show API key input directly */
764
+ <div className="space-y-4">
765
+ <div className="flex gap-3">
766
+ <input
767
+ type="password"
768
+ placeholder={`Enter ${provider.displayName} ${provider.apiKeyName || 'API key'}`}
769
+ value={connectingProvider === provider.id ? apiKeyInput : ''}
770
+ onChange={(e) => {
771
+ setConnectingProvider(provider.id);
772
+ setApiKeyInput(e.target.value);
773
+ }}
774
+ onFocus={() => setConnectingProvider(provider.id)}
775
+ className="flex-1 px-4 py-3 bg-bg-card border border-border-subtle rounded-lg text-sm text-text-primary placeholder:text-text-muted focus:outline-none focus:border-accent-cyan focus:ring-1 focus:ring-accent-cyan/30 transition-all"
776
+ />
777
+ <button
778
+ onClick={() => submitApiKey(provider)}
779
+ disabled={connectingProvider !== provider.id || !apiKeyInput.trim()}
780
+ className="px-5 py-3 bg-accent-cyan text-bg-deep font-semibold rounded-lg text-sm hover:bg-accent-cyan/90 disabled:opacity-50 disabled:cursor-not-allowed transition-all"
781
+ >
782
+ Connect
783
+ </button>
784
+ </div>
785
+ {provider.apiKeyUrl && (
786
+ <p className="text-xs text-text-muted">
787
+ Get your API key from{' '}
788
+ <a
789
+ href={provider.apiKeyUrl}
790
+ target="_blank"
791
+ rel="noopener noreferrer"
792
+ className="text-accent-cyan hover:underline"
793
+ >
794
+ {new URL(provider.apiKeyUrl).hostname}
795
+ </a>
796
+ </p>
797
+ )}
798
+ <p className="text-xs text-amber-400/80">
799
+ OAuth not available for {provider.displayName} in container environments
800
+ </p>
801
+ </div>
802
+ )}
803
+ </div>
804
+ )}
805
+
806
+ <div className="mt-4 pt-4 border-t border-border-subtle">
807
+ <p className="text-xs text-text-muted">
808
+ CLI: <code className="px-2 py-1 bg-bg-card rounded font-mono">{provider.cliCommand}</code>
809
+ </p>
810
+ </div>
811
+ </div>
812
+ ))}
813
+ </div>
814
+ </div>
815
+ )}
816
+
817
+ {/* Repositories Section */}
818
+ {activeSection === 'repos' && (
819
+ <div className="space-y-8">
820
+ <SectionHeader
821
+ title="Connected Repositories"
822
+ subtitle="Repositories linked to this workspace"
823
+ />
824
+
825
+ <div className="space-y-3">
826
+ {workspace.repositories.length > 0 ? (
827
+ workspace.repositories.map((repo) => (
828
+ <div
829
+ key={repo.id}
830
+ className="flex items-center justify-between p-4 bg-bg-tertiary rounded-lg border border-border-subtle"
831
+ >
832
+ <div className="flex items-center gap-3">
833
+ <div className="w-10 h-10 rounded-lg bg-bg-card flex items-center justify-center">
834
+ <RepoIcon />
835
+ </div>
836
+ <div>
837
+ <p className="text-sm font-medium text-text-primary">{repo.fullName}</p>
838
+ <p className="text-xs text-text-muted">
839
+ {repo.lastSyncedAt
840
+ ? `Synced ${new Date(repo.lastSyncedAt).toLocaleDateString()}`
841
+ : 'Not synced'}
842
+ </p>
843
+ </div>
844
+ </div>
845
+ <div className="flex items-center gap-3">
846
+ <button
847
+ onClick={() => handleSyncRepo(repo.id)}
848
+ disabled={syncingRepoId === repo.id || workspace.status !== 'running'}
849
+ className="px-3 py-1.5 bg-accent-cyan/10 border border-accent-cyan/30 text-accent-cyan rounded-lg text-xs font-semibold hover:bg-accent-cyan/20 disabled:opacity-50 disabled:cursor-not-allowed transition-colors flex items-center gap-1.5"
850
+ title={workspace.status !== 'running' ? 'Workspace must be running to sync' : 'Sync repository'}
851
+ >
852
+ {syncingRepoId === repo.id ? (
853
+ <>
854
+ <SyncIcon spinning />
855
+ Syncing...
856
+ </>
857
+ ) : (
858
+ <>
859
+ <SyncIcon />
860
+ Sync
861
+ </>
862
+ )}
863
+ </button>
864
+ <StatusBadge status={repo.syncStatus} />
865
+ </div>
866
+ </div>
867
+ ))
868
+ ) : (
869
+ <div className="p-6 bg-bg-tertiary rounded-lg border border-border-subtle border-dashed text-center">
870
+ <RepoIcon className="w-8 h-8 mx-auto mb-3 text-text-muted" />
871
+ <p className="text-sm text-text-muted">No repositories connected</p>
872
+ </div>
873
+ )}
874
+ </div>
875
+
876
+ {unassignedRepos.length > 0 && (
877
+ <>
878
+ <SectionHeader
879
+ title="Available Repositories"
880
+ subtitle="Add more repositories to this workspace"
881
+ />
882
+ <div className="space-y-3">
883
+ {unassignedRepos.map((repo) => (
884
+ <div
885
+ key={repo.id}
886
+ className="flex items-center justify-between p-4 bg-bg-tertiary rounded-lg border border-border-subtle hover:border-accent-cyan/30 transition-colors"
887
+ >
888
+ <div className="flex items-center gap-3">
889
+ <div className="w-10 h-10 rounded-lg bg-bg-card flex items-center justify-center">
890
+ <RepoIcon />
891
+ </div>
892
+ <div>
893
+ <p className="text-sm font-medium text-text-primary">{repo.fullName}</p>
894
+ <p className="text-xs text-text-muted">
895
+ {repo.isPrivate ? 'Private' : 'Public'}
896
+ </p>
897
+ </div>
898
+ </div>
899
+ <button
900
+ onClick={() => handleAddRepo(repo.id)}
901
+ className="px-4 py-2 bg-accent-cyan/10 border border-accent-cyan/30 text-accent-cyan rounded-lg text-xs font-semibold hover:bg-accent-cyan/20 transition-colors"
902
+ >
903
+ Add to Workspace
904
+ </button>
905
+ </div>
906
+ ))}
907
+ </div>
908
+ </>
909
+ )}
910
+ </div>
911
+ )}
912
+
913
+ {/* GitHub Access Section */}
914
+ {activeSection === 'github-access' && (
915
+ <div className="space-y-6">
916
+ <SectionHeader
917
+ title="GitHub Repository Access"
918
+ subtitle="Repositories you have access to via your GitHub account"
919
+ />
920
+ <RepoAccessPanel
921
+ workspaces={
922
+ workspace && workspace.repositories?.length > 0
923
+ ? [{
924
+ id: workspace.id,
925
+ name: workspace.name,
926
+ repositoryFullName: workspace.repositories[0].fullName,
927
+ status: workspace.status as 'provisioning' | 'running' | 'stopped' | 'error',
928
+ }]
929
+ : []
930
+ }
931
+ onWorkspaceCreated={(workspaceId, repoFullName) => {
932
+ // Refresh workspace data after creating
933
+ cloudApi.getWorkspaceDetails(workspaceId).then(result => {
934
+ if (result.success) {
935
+ setWorkspace(result.data);
936
+ }
937
+ });
938
+ }}
939
+ onOpenWorkspace={(workspaceId) => {
940
+ // Navigate to workspace or close settings
941
+ if (onClose) {
942
+ onClose();
943
+ }
944
+ }}
945
+ csrfToken={csrfToken}
946
+ className="bg-bg-tertiary rounded-xl border border-border-subtle overflow-hidden"
947
+ />
948
+ </div>
949
+ )}
950
+
951
+ {/* Custom Domain Section */}
952
+ {activeSection === 'domain' && (
953
+ <div className="space-y-8">
954
+ <SectionHeader
955
+ title="Custom Domain"
956
+ subtitle="Connect your own domain to this workspace"
957
+ />
958
+
959
+ <div className="p-5 bg-gradient-to-r from-accent-purple/10 to-accent-cyan/10 border border-accent-purple/20 rounded-xl">
960
+ <div className="flex items-center gap-3 mb-3">
961
+ <div className="w-10 h-10 rounded-lg bg-accent-purple/20 flex items-center justify-center">
962
+ <GlobeIcon className="text-accent-purple" />
963
+ </div>
964
+ <div>
965
+ <h4 className="text-sm font-semibold text-text-primary">Premium Feature</h4>
966
+ <p className="text-xs text-text-secondary">Requires Team or Enterprise plan</p>
967
+ </div>
968
+ </div>
969
+ </div>
970
+
971
+ {workspace.customDomain ? (
972
+ <div className="space-y-4">
973
+ <div className="p-5 bg-bg-tertiary rounded-xl border border-border-subtle">
974
+ <div className="flex items-center justify-between mb-3">
975
+ <span className="text-xs text-text-muted uppercase tracking-wide font-semibold">
976
+ Current Domain
977
+ </span>
978
+ <StatusBadge status={workspace.customDomainStatus || 'pending'} />
979
+ </div>
980
+ <p className="text-lg font-mono text-text-primary">{workspace.customDomain}</p>
981
+ </div>
982
+
983
+ {workspace.customDomainStatus === 'pending' && (
984
+ <ActionButton
985
+ onClick={handleVerifyDomain}
986
+ disabled={domainLoading}
987
+ variant="primary"
988
+ icon={<CheckIcon />}
989
+ fullWidth
990
+ >
991
+ {domainLoading ? 'Verifying...' : 'Verify DNS Configuration'}
992
+ </ActionButton>
993
+ )}
994
+
995
+ <ActionButton
996
+ onClick={handleRemoveDomain}
997
+ disabled={domainLoading}
998
+ variant="danger"
999
+ icon={<TrashIcon />}
1000
+ fullWidth
1001
+ >
1002
+ Remove Custom Domain
1003
+ </ActionButton>
1004
+ </div>
1005
+ ) : (
1006
+ <div className="space-y-4">
1007
+ <div>
1008
+ <label className="text-xs font-semibold text-text-muted uppercase tracking-wide mb-2 block">
1009
+ Domain Name
1010
+ </label>
1011
+ <input
1012
+ type="text"
1013
+ value={customDomain}
1014
+ onChange={(e) => setCustomDomain(e.target.value)}
1015
+ placeholder="workspace.yourdomain.com"
1016
+ className="w-full px-4 py-3 bg-bg-tertiary border border-border-subtle rounded-lg text-sm text-text-primary font-mono placeholder:text-text-muted focus:outline-none focus:border-accent-cyan focus:ring-1 focus:ring-accent-cyan/30 transition-all"
1017
+ />
1018
+ </div>
1019
+
1020
+ <ActionButton
1021
+ onClick={handleSetDomain}
1022
+ disabled={domainLoading || !customDomain.trim()}
1023
+ variant="primary"
1024
+ icon={<GlobeIcon />}
1025
+ fullWidth
1026
+ >
1027
+ {domainLoading ? 'Setting up...' : 'Set Custom Domain'}
1028
+ </ActionButton>
1029
+ </div>
1030
+ )}
1031
+
1032
+ {domainError && (
1033
+ <div className="p-4 bg-error/10 border border-error/30 rounded-lg text-error text-sm">
1034
+ {domainError}
1035
+ </div>
1036
+ )}
1037
+
1038
+ {domainInstructions && (
1039
+ <div className="p-5 bg-bg-tertiary rounded-xl border border-border-subtle space-y-4">
1040
+ <h4 className="text-sm font-semibold text-text-primary flex items-center gap-2">
1041
+ <InfoIcon />
1042
+ DNS Configuration Required
1043
+ </h4>
1044
+ <p className="text-xs text-text-secondary">
1045
+ Add the following DNS record to your domain provider:
1046
+ </p>
1047
+ <div className="grid grid-cols-3 gap-3">
1048
+ <DNSField label="Type" value={domainInstructions.type} />
1049
+ <DNSField label="Name" value={domainInstructions.name} />
1050
+ <DNSField label="Value" value={domainInstructions.value} />
1051
+ </div>
1052
+ </div>
1053
+ )}
1054
+ </div>
1055
+ )}
1056
+
1057
+ {/* Danger Zone Section */}
1058
+ {activeSection === 'danger' && (
1059
+ <div className="space-y-8">
1060
+ <div className="p-6 bg-error/5 border-2 border-error/20 rounded-xl">
1061
+ <div className="flex items-center gap-3 mb-4">
1062
+ <div className="w-10 h-10 rounded-lg bg-error/20 flex items-center justify-center">
1063
+ <AlertIcon className="text-error" />
1064
+ </div>
1065
+ <div>
1066
+ <h3 className="text-base font-semibold text-error">Danger Zone</h3>
1067
+ <p className="text-xs text-text-secondary">
1068
+ These actions are destructive and cannot be undone
1069
+ </p>
1070
+ </div>
1071
+ </div>
1072
+
1073
+ <div className="p-5 border border-error/30 rounded-lg bg-bg-primary">
1074
+ <div className="flex items-center justify-between">
1075
+ <div>
1076
+ <h4 className="text-sm font-semibold text-text-primary">Delete Workspace</h4>
1077
+ <p className="text-xs text-text-muted mt-1">
1078
+ Permanently delete this workspace and all its data
1079
+ </p>
1080
+ </div>
1081
+ <button
1082
+ onClick={handleDelete}
1083
+ className="px-5 py-2.5 bg-error text-white rounded-lg text-sm font-semibold hover:bg-error/90 transition-colors"
1084
+ >
1085
+ Delete Workspace
1086
+ </button>
1087
+ </div>
1088
+ </div>
1089
+ </div>
1090
+ </div>
1091
+ )}
1092
+ </div>
1093
+ </div>
1094
+ );
1095
+ }
1096
+
1097
+ // Utility Components
1098
+ function SectionHeader({ title, subtitle }: { title: string; subtitle: string }) {
1099
+ return (
1100
+ <div className="mb-4">
1101
+ <h3 className="text-sm font-semibold text-text-muted uppercase tracking-wide">{title}</h3>
1102
+ <p className="text-xs text-text-muted mt-1">{subtitle}</p>
1103
+ </div>
1104
+ );
1105
+ }
1106
+
1107
+ function InfoCard({
1108
+ label,
1109
+ value,
1110
+ valueColor = 'text-text-primary',
1111
+ mono = false,
1112
+ indicator = false,
1113
+ }: {
1114
+ label: string;
1115
+ value: string;
1116
+ valueColor?: string;
1117
+ mono?: boolean;
1118
+ indicator?: boolean;
1119
+ }) {
1120
+ return (
1121
+ <div className="p-4 bg-bg-tertiary rounded-lg border border-border-subtle">
1122
+ <label className="text-xs text-text-muted uppercase tracking-wide font-medium">{label}</label>
1123
+ <div className="flex items-center gap-2 mt-1">
1124
+ {indicator && <div className="w-2 h-2 rounded-full bg-success animate-pulse" />}
1125
+ <p className={`text-sm font-medium ${valueColor} ${mono ? 'font-mono' : ''} break-all`}>
1126
+ {value}
1127
+ </p>
1128
+ </div>
1129
+ </div>
1130
+ );
1131
+ }
1132
+
1133
+ function ActionButton({
1134
+ children,
1135
+ onClick,
1136
+ disabled,
1137
+ variant,
1138
+ icon,
1139
+ fullWidth,
1140
+ }: {
1141
+ children: React.ReactNode;
1142
+ onClick: () => void;
1143
+ disabled?: boolean;
1144
+ variant: 'primary' | 'warning' | 'danger';
1145
+ icon?: React.ReactNode;
1146
+ fullWidth?: boolean;
1147
+ }) {
1148
+ const variants = {
1149
+ primary: 'bg-accent-cyan/10 border-accent-cyan/30 text-accent-cyan hover:bg-accent-cyan/20',
1150
+ warning: 'bg-amber-400/10 border-amber-400/30 text-amber-400 hover:bg-amber-400/20',
1151
+ danger: 'bg-error/10 border-error/30 text-error hover:bg-error/20',
1152
+ };
1153
+
1154
+ return (
1155
+ <button
1156
+ onClick={onClick}
1157
+ disabled={disabled}
1158
+ className={`${fullWidth ? 'w-full' : ''} px-5 py-2.5 border rounded-lg text-sm font-semibold transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2 ${variants[variant]}`}
1159
+ >
1160
+ {icon}
1161
+ {children}
1162
+ </button>
1163
+ );
1164
+ }
1165
+
1166
+ function StatusBadge({ status }: { status: string }) {
1167
+ const styles: Record<string, string> = {
1168
+ synced: 'bg-success/15 text-success border-success/30',
1169
+ active: 'bg-success/15 text-success border-success/30',
1170
+ syncing: 'bg-accent-cyan/15 text-accent-cyan border-accent-cyan/30',
1171
+ verifying: 'bg-accent-cyan/15 text-accent-cyan border-accent-cyan/30',
1172
+ pending: 'bg-amber-400/15 text-amber-400 border-amber-400/30',
1173
+ error: 'bg-error/15 text-error border-error/30',
1174
+ };
1175
+
1176
+ return (
1177
+ <span className={`text-xs px-3 py-1 rounded-full border ${styles[status] || 'bg-bg-hover text-text-muted border-border-subtle'}`}>
1178
+ {status}
1179
+ </span>
1180
+ );
1181
+ }
1182
+
1183
+ function DNSField({ label, value }: { label: string; value: string }) {
1184
+ return (
1185
+ <div className="p-3 bg-bg-card rounded-lg">
1186
+ <label className="text-xs text-text-muted block mb-1">{label}</label>
1187
+ <p className="font-mono text-sm text-text-primary break-all">{value}</p>
1188
+ </div>
1189
+ );
1190
+ }
1191
+
1192
+ // Icons
1193
+ function SettingsGearIcon() {
1194
+ return (
1195
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
1196
+ <circle cx="12" cy="12" r="3" />
1197
+ <path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z" />
1198
+ </svg>
1199
+ );
1200
+ }
1201
+
1202
+ function ProviderIcon() {
1203
+ return (
1204
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
1205
+ <path d="M12 2L2 7l10 5 10-5-10-5z" />
1206
+ <path d="M2 17l10 5 10-5" />
1207
+ <path d="M2 12l10 5 10-5" />
1208
+ </svg>
1209
+ );
1210
+ }
1211
+
1212
+ function RepoIcon({ className = '' }: { className?: string }) {
1213
+ return (
1214
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" className={`text-text-muted ${className}`}>
1215
+ <path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z" />
1216
+ </svg>
1217
+ );
1218
+ }
1219
+
1220
+ function GlobeIcon({ className = '' }: { className?: string }) {
1221
+ return (
1222
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" className={className}>
1223
+ <circle cx="12" cy="12" r="10" />
1224
+ <line x1="2" y1="12" x2="22" y2="12" />
1225
+ <path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z" />
1226
+ </svg>
1227
+ );
1228
+ }
1229
+
1230
+ function GitHubIcon() {
1231
+ return (
1232
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor">
1233
+ <path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z" />
1234
+ </svg>
1235
+ );
1236
+ }
1237
+
1238
+ function AlertIcon({ className = '' }: { className?: string }) {
1239
+ return (
1240
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" className={className}>
1241
+ <path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z" />
1242
+ <line x1="12" y1="9" x2="12" y2="13" />
1243
+ <line x1="12" y1="17" x2="12.01" y2="17" />
1244
+ </svg>
1245
+ );
1246
+ }
1247
+
1248
+ function LockIcon() {
1249
+ return (
1250
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
1251
+ <rect x="3" y="11" width="18" height="11" rx="2" ry="2" />
1252
+ <path d="M7 11V7a5 5 0 0 1 10 0v4" />
1253
+ </svg>
1254
+ );
1255
+ }
1256
+
1257
+ function StopIcon() {
1258
+ return (
1259
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
1260
+ <rect x="6" y="6" width="12" height="12" />
1261
+ </svg>
1262
+ );
1263
+ }
1264
+
1265
+ function RestartIcon() {
1266
+ return (
1267
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
1268
+ <path d="M23 4v6h-6" />
1269
+ <path d="M20.49 15a9 9 0 1 1-2.12-9.36L23 10" />
1270
+ </svg>
1271
+ );
1272
+ }
1273
+
1274
+ function CheckIcon() {
1275
+ return (
1276
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
1277
+ <polyline points="20 6 9 17 4 12" />
1278
+ </svg>
1279
+ );
1280
+ }
1281
+
1282
+ function TrashIcon() {
1283
+ return (
1284
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
1285
+ <polyline points="3 6 5 6 21 6" />
1286
+ <path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" />
1287
+ </svg>
1288
+ );
1289
+ }
1290
+
1291
+ function CloseIcon() {
1292
+ return (
1293
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
1294
+ <line x1="18" y1="6" x2="6" y2="18" />
1295
+ <line x1="6" y1="6" x2="18" y2="18" />
1296
+ </svg>
1297
+ );
1298
+ }
1299
+
1300
+ function InfoIcon() {
1301
+ return (
1302
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
1303
+ <circle cx="12" cy="12" r="10" />
1304
+ <line x1="12" y1="16" x2="12" y2="12" />
1305
+ <line x1="12" y1="8" x2="12.01" y2="8" />
1306
+ </svg>
1307
+ );
1308
+ }
1309
+
1310
+ function SyncIcon({ spinning = false }: { spinning?: boolean } = {}) {
1311
+ return (
1312
+ <svg
1313
+ width="12"
1314
+ height="12"
1315
+ viewBox="0 0 24 24"
1316
+ fill="none"
1317
+ stroke="currentColor"
1318
+ strokeWidth="2"
1319
+ strokeLinecap="round"
1320
+ strokeLinejoin="round"
1321
+ className={spinning ? 'animate-spin' : ''}
1322
+ >
1323
+ <path d="M23 4v6h-6" />
1324
+ <path d="M1 20v-6h6" />
1325
+ <path d="M3.51 9a9 9 0 0 1 14.85-3.36L23 10" />
1326
+ <path d="M20.49 15a9 9 0 0 1-14.85 3.36L1 14" />
1327
+ </svg>
1328
+ );
1329
+ }