agent-relay 2.0.22 → 2.0.24

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 (534) hide show
  1. package/bin/relay-pty-linux-arm64 +0 -0
  2. package/dist/src/cli/index.d.ts +3 -3
  3. package/dist/src/cli/index.js +58 -74
  4. package/package.json +21 -62
  5. package/packages/api-types/package.json +1 -1
  6. package/packages/bridge/package.json +8 -8
  7. package/packages/cli-tester/package.json +1 -1
  8. package/packages/config/package.json +2 -2
  9. package/packages/continuity/package.json +1 -1
  10. package/packages/daemon/dist/orchestrator.js +19 -1
  11. package/packages/daemon/package.json +12 -12
  12. package/packages/hooks/package.json +4 -4
  13. package/packages/mcp/package.json +2 -2
  14. package/packages/memory/package.json +2 -2
  15. package/packages/policy/package.json +2 -2
  16. package/packages/protocol/package.json +1 -1
  17. package/packages/resiliency/package.json +1 -1
  18. package/packages/sdk/package.json +2 -2
  19. package/packages/spawner/package.json +1 -1
  20. package/packages/state/package.json +1 -1
  21. package/packages/storage/package.json +2 -2
  22. package/packages/telemetry/package.json +1 -1
  23. package/packages/trajectory/package.json +2 -2
  24. package/packages/user-directory/package.json +2 -2
  25. package/packages/utils/dist/update-checker.js +4 -0
  26. package/packages/utils/package.json +1 -1
  27. package/packages/wrapper/package.json +6 -6
  28. package/deploy/init-db.sql +0 -5
  29. package/deploy/scripts/setup-fly-workspaces.sh +0 -69
  30. package/deploy/scripts/setup-railway.sh +0 -75
  31. package/deploy/workspace/codex.config.toml +0 -20
  32. package/deploy/workspace/entrypoint-browser.sh +0 -118
  33. package/deploy/workspace/entrypoint.sh +0 -612
  34. package/deploy/workspace/gh-credential-relay +0 -90
  35. package/deploy/workspace/gh-relay +0 -156
  36. package/deploy/workspace/git-credential-relay +0 -330
  37. package/deploy/workspace/git-credential-relay.test.sh +0 -230
  38. package/dist/dashboard/out/404.html +0 -1
  39. package/dist/dashboard/out/_next/static/91mkGYq3qbG8WHE6VytQ8/_buildManifest.js +0 -1
  40. package/dist/dashboard/out/_next/static/91mkGYq3qbG8WHE6VytQ8/_ssgManifest.js +0 -1
  41. package/dist/dashboard/out/_next/static/chunks/116-a883fca163f3a5bc.js +0 -1
  42. package/dist/dashboard/out/_next/static/chunks/117-c8afed19e821a35d.js +0 -2
  43. package/dist/dashboard/out/_next/static/chunks/282-980c2eb8fff20123.js +0 -1
  44. package/dist/dashboard/out/_next/static/chunks/320-a6304232cd0ee2ce.js +0 -1
  45. package/dist/dashboard/out/_next/static/chunks/532-bace199897eeab37.js +0 -9
  46. package/dist/dashboard/out/_next/static/chunks/631-16b905e5920f9b59.js +0 -1
  47. package/dist/dashboard/out/_next/static/chunks/648-acb2ff9f77cbfbd3.js +0 -1
  48. package/dist/dashboard/out/_next/static/chunks/766-2aea80818f7eb0d8.js +0 -1
  49. package/dist/dashboard/out/_next/static/chunks/83-26d2bde54616ee90.js +0 -1
  50. package/dist/dashboard/out/_next/static/chunks/847-f1f467060f32afff.js +0 -1
  51. package/dist/dashboard/out/_next/static/chunks/891-5cb1513eeb97a891.js +0 -1
  52. package/dist/dashboard/out/_next/static/chunks/app/_not-found/page-60501fddbafba9dc.js +0 -1
  53. package/dist/dashboard/out/_next/static/chunks/app/app/onboarding/page-9914652442f7e4fb.js +0 -1
  54. package/dist/dashboard/out/_next/static/chunks/app/app/page-366fb7c078d4e9e0.js +0 -1
  55. package/dist/dashboard/out/_next/static/chunks/app/cloud/link/page-fa1d5842aa90e8a6.js +0 -1
  56. package/dist/dashboard/out/_next/static/chunks/app/complete-profile/page-dd64bbdf66b639cd.js +0 -1
  57. package/dist/dashboard/out/_next/static/chunks/app/connect-repos/page-113060009ef35bc2.js +0 -1
  58. package/dist/dashboard/out/_next/static/chunks/app/history/page-9965d2483011b846.js +0 -1
  59. package/dist/dashboard/out/_next/static/chunks/app/layout-6b91e33784c20610.js +0 -1
  60. package/dist/dashboard/out/_next/static/chunks/app/login/page-435eceb0073be027.js +0 -1
  61. package/dist/dashboard/out/_next/static/chunks/app/metrics/page-1e37ef8e73940b40.js +0 -1
  62. package/dist/dashboard/out/_next/static/chunks/app/page-8119d4246743574e.js +0 -1
  63. package/dist/dashboard/out/_next/static/chunks/app/pricing/page-9db3ebdfa567a7c9.js +0 -1
  64. package/dist/dashboard/out/_next/static/chunks/app/providers/page-ecb16ffd3b36262b.js +0 -1
  65. package/dist/dashboard/out/_next/static/chunks/app/providers/setup/[provider]/page-4dbe33f0f7691b7c.js +0 -1
  66. package/dist/dashboard/out/_next/static/chunks/app/signup/page-c7a0a28341365ae0.js +0 -1
  67. package/dist/dashboard/out/_next/static/chunks/e868780c-48e5f147c90a3a41.js +0 -18
  68. package/dist/dashboard/out/_next/static/chunks/fd9d1056-609918ca7b6280bb.js +0 -1
  69. package/dist/dashboard/out/_next/static/chunks/framework-f66176bb897dc684.js +0 -1
  70. package/dist/dashboard/out/_next/static/chunks/main-311c3db74dcfadb7.js +0 -1
  71. package/dist/dashboard/out/_next/static/chunks/main-app-fdbeb09028f57c9f.js +0 -1
  72. package/dist/dashboard/out/_next/static/chunks/pages/_app-72b849fbd24ac258.js +0 -1
  73. package/dist/dashboard/out/_next/static/chunks/pages/_error-7ba65e1336b92748.js +0 -1
  74. package/dist/dashboard/out/_next/static/chunks/polyfills-42372ed130431b0a.js +0 -1
  75. package/dist/dashboard/out/_next/static/chunks/webpack-1cdd8ed57114d5e1.js +0 -1
  76. package/dist/dashboard/out/_next/static/css/4034f236dd1a3178.css +0 -1
  77. package/dist/dashboard/out/_next/static/css/6892f8422896ef7a.css +0 -1
  78. package/dist/dashboard/out/alt-logos/agent-relay-logo-128.png +0 -0
  79. package/dist/dashboard/out/alt-logos/agent-relay-logo-256.png +0 -0
  80. package/dist/dashboard/out/alt-logos/agent-relay-logo-32.png +0 -0
  81. package/dist/dashboard/out/alt-logos/agent-relay-logo-512.png +0 -0
  82. package/dist/dashboard/out/alt-logos/agent-relay-logo-64.png +0 -0
  83. package/dist/dashboard/out/alt-logos/agent-relay-logo.svg +0 -45
  84. package/dist/dashboard/out/alt-logos/logo.svg +0 -38
  85. package/dist/dashboard/out/alt-logos/monogram-logo-128.png +0 -0
  86. package/dist/dashboard/out/alt-logos/monogram-logo-256.png +0 -0
  87. package/dist/dashboard/out/alt-logos/monogram-logo-32.png +0 -0
  88. package/dist/dashboard/out/alt-logos/monogram-logo-512.png +0 -0
  89. package/dist/dashboard/out/alt-logos/monogram-logo-64.png +0 -0
  90. package/dist/dashboard/out/alt-logos/monogram-logo.svg +0 -38
  91. package/dist/dashboard/out/app/onboarding.html +0 -1
  92. package/dist/dashboard/out/app/onboarding.txt +0 -7
  93. package/dist/dashboard/out/app.html +0 -1
  94. package/dist/dashboard/out/app.txt +0 -7
  95. package/dist/dashboard/out/apple-icon.png +0 -0
  96. package/dist/dashboard/out/cloud/link.html +0 -1
  97. package/dist/dashboard/out/cloud/link.txt +0 -7
  98. package/dist/dashboard/out/complete-profile.html +0 -5
  99. package/dist/dashboard/out/complete-profile.txt +0 -7
  100. package/dist/dashboard/out/connect-repos.html +0 -1
  101. package/dist/dashboard/out/connect-repos.txt +0 -7
  102. package/dist/dashboard/out/history.html +0 -1
  103. package/dist/dashboard/out/history.txt +0 -7
  104. package/dist/dashboard/out/index.html +0 -1
  105. package/dist/dashboard/out/index.txt +0 -7
  106. package/dist/dashboard/out/login.html +0 -5
  107. package/dist/dashboard/out/login.txt +0 -7
  108. package/dist/dashboard/out/metrics.html +0 -1
  109. package/dist/dashboard/out/metrics.txt +0 -7
  110. package/dist/dashboard/out/pricing.html +0 -13
  111. package/dist/dashboard/out/pricing.txt +0 -7
  112. package/dist/dashboard/out/providers/setup/claude.html +0 -1
  113. package/dist/dashboard/out/providers/setup/claude.txt +0 -8
  114. package/dist/dashboard/out/providers/setup/codex.html +0 -1
  115. package/dist/dashboard/out/providers/setup/codex.txt +0 -8
  116. package/dist/dashboard/out/providers/setup/cursor.html +0 -1
  117. package/dist/dashboard/out/providers/setup/cursor.txt +0 -8
  118. package/dist/dashboard/out/providers.html +0 -1
  119. package/dist/dashboard/out/providers.txt +0 -7
  120. package/dist/dashboard/out/signup.html +0 -6
  121. package/dist/dashboard/out/signup.txt +0 -7
  122. package/dist/src/cloud/index.d.ts +0 -8
  123. package/dist/src/cloud/index.js +0 -8
  124. package/dist/src/dashboard-server/index.d.ts +0 -8
  125. package/dist/src/dashboard-server/index.js +0 -8
  126. package/packages/cloud/dist/api/admin.d.ts +0 -8
  127. package/packages/cloud/dist/api/admin.js +0 -225
  128. package/packages/cloud/dist/api/auth.d.ts +0 -20
  129. package/packages/cloud/dist/api/auth.js +0 -138
  130. package/packages/cloud/dist/api/billing.d.ts +0 -7
  131. package/packages/cloud/dist/api/billing.js +0 -564
  132. package/packages/cloud/dist/api/cli-pty-runner.d.ts +0 -53
  133. package/packages/cloud/dist/api/cli-pty-runner.js +0 -175
  134. package/packages/cloud/dist/api/codex-auth-helper.d.ts +0 -21
  135. package/packages/cloud/dist/api/codex-auth-helper.js +0 -327
  136. package/packages/cloud/dist/api/consensus.d.ts +0 -13
  137. package/packages/cloud/dist/api/consensus.js +0 -261
  138. package/packages/cloud/dist/api/coordinators.d.ts +0 -8
  139. package/packages/cloud/dist/api/coordinators.js +0 -750
  140. package/packages/cloud/dist/api/daemons.d.ts +0 -12
  141. package/packages/cloud/dist/api/daemons.js +0 -535
  142. package/packages/cloud/dist/api/email-auth.d.ts +0 -11
  143. package/packages/cloud/dist/api/email-auth.js +0 -347
  144. package/packages/cloud/dist/api/generic-webhooks.d.ts +0 -8
  145. package/packages/cloud/dist/api/generic-webhooks.js +0 -129
  146. package/packages/cloud/dist/api/git.d.ts +0 -8
  147. package/packages/cloud/dist/api/git.js +0 -269
  148. package/packages/cloud/dist/api/github-app.d.ts +0 -11
  149. package/packages/cloud/dist/api/github-app.js +0 -223
  150. package/packages/cloud/dist/api/middleware/planLimits.d.ts +0 -43
  151. package/packages/cloud/dist/api/middleware/planLimits.js +0 -202
  152. package/packages/cloud/dist/api/monitoring.d.ts +0 -11
  153. package/packages/cloud/dist/api/monitoring.js +0 -578
  154. package/packages/cloud/dist/api/nango-auth.d.ts +0 -9
  155. package/packages/cloud/dist/api/nango-auth.js +0 -741
  156. package/packages/cloud/dist/api/onboarding.d.ts +0 -15
  157. package/packages/cloud/dist/api/onboarding.js +0 -679
  158. package/packages/cloud/dist/api/policy.d.ts +0 -8
  159. package/packages/cloud/dist/api/policy.js +0 -229
  160. package/packages/cloud/dist/api/provider-env.d.ts +0 -26
  161. package/packages/cloud/dist/api/provider-env.js +0 -141
  162. package/packages/cloud/dist/api/providers.d.ts +0 -7
  163. package/packages/cloud/dist/api/providers.js +0 -574
  164. package/packages/cloud/dist/api/repos.d.ts +0 -8
  165. package/packages/cloud/dist/api/repos.js +0 -577
  166. package/packages/cloud/dist/api/sessions.d.ts +0 -11
  167. package/packages/cloud/dist/api/sessions.js +0 -302
  168. package/packages/cloud/dist/api/teams.d.ts +0 -7
  169. package/packages/cloud/dist/api/teams.js +0 -281
  170. package/packages/cloud/dist/api/test-helpers.d.ts +0 -10
  171. package/packages/cloud/dist/api/test-helpers.js +0 -745
  172. package/packages/cloud/dist/api/usage.d.ts +0 -7
  173. package/packages/cloud/dist/api/usage.js +0 -111
  174. package/packages/cloud/dist/api/webhooks.d.ts +0 -8
  175. package/packages/cloud/dist/api/webhooks.js +0 -645
  176. package/packages/cloud/dist/api/workspaces.d.ts +0 -25
  177. package/packages/cloud/dist/api/workspaces.js +0 -1799
  178. package/packages/cloud/dist/billing/index.d.ts +0 -9
  179. package/packages/cloud/dist/billing/index.js +0 -9
  180. package/packages/cloud/dist/billing/plans.d.ts +0 -39
  181. package/packages/cloud/dist/billing/plans.js +0 -245
  182. package/packages/cloud/dist/billing/service.d.ts +0 -80
  183. package/packages/cloud/dist/billing/service.js +0 -388
  184. package/packages/cloud/dist/billing/types.d.ts +0 -141
  185. package/packages/cloud/dist/billing/types.js +0 -7
  186. package/packages/cloud/dist/config.d.ts +0 -5
  187. package/packages/cloud/dist/config.js +0 -5
  188. package/packages/cloud/dist/db/bulk-ingest.d.ts +0 -89
  189. package/packages/cloud/dist/db/bulk-ingest.js +0 -268
  190. package/packages/cloud/dist/db/drizzle.d.ts +0 -290
  191. package/packages/cloud/dist/db/drizzle.js +0 -1422
  192. package/packages/cloud/dist/db/index.d.ts +0 -56
  193. package/packages/cloud/dist/db/index.js +0 -70
  194. package/packages/cloud/dist/db/schema.d.ts +0 -5117
  195. package/packages/cloud/dist/db/schema.js +0 -656
  196. package/packages/cloud/dist/index.d.ts +0 -11
  197. package/packages/cloud/dist/index.js +0 -38
  198. package/packages/cloud/dist/provisioner/index.d.ts +0 -207
  199. package/packages/cloud/dist/provisioner/index.js +0 -2118
  200. package/packages/cloud/dist/server.d.ts +0 -17
  201. package/packages/cloud/dist/server.js +0 -2034
  202. package/packages/cloud/dist/services/auto-scaler.d.ts +0 -152
  203. package/packages/cloud/dist/services/auto-scaler.js +0 -439
  204. package/packages/cloud/dist/services/capacity-manager.d.ts +0 -148
  205. package/packages/cloud/dist/services/capacity-manager.js +0 -449
  206. package/packages/cloud/dist/services/ci-agent-spawner.d.ts +0 -49
  207. package/packages/cloud/dist/services/ci-agent-spawner.js +0 -373
  208. package/packages/cloud/dist/services/cloud-message-bus.d.ts +0 -28
  209. package/packages/cloud/dist/services/cloud-message-bus.js +0 -19
  210. package/packages/cloud/dist/services/compute-enforcement.d.ts +0 -57
  211. package/packages/cloud/dist/services/compute-enforcement.js +0 -175
  212. package/packages/cloud/dist/services/coordinator.d.ts +0 -62
  213. package/packages/cloud/dist/services/coordinator.js +0 -389
  214. package/packages/cloud/dist/services/index.d.ts +0 -17
  215. package/packages/cloud/dist/services/index.js +0 -25
  216. package/packages/cloud/dist/services/intro-expiration.d.ts +0 -60
  217. package/packages/cloud/dist/services/intro-expiration.js +0 -252
  218. package/packages/cloud/dist/services/mention-handler.d.ts +0 -65
  219. package/packages/cloud/dist/services/mention-handler.js +0 -405
  220. package/packages/cloud/dist/services/nango.d.ts +0 -219
  221. package/packages/cloud/dist/services/nango.js +0 -424
  222. package/packages/cloud/dist/services/persistence.d.ts +0 -131
  223. package/packages/cloud/dist/services/persistence.js +0 -200
  224. package/packages/cloud/dist/services/planLimits.d.ts +0 -147
  225. package/packages/cloud/dist/services/planLimits.js +0 -335
  226. package/packages/cloud/dist/services/presence-registry.d.ts +0 -56
  227. package/packages/cloud/dist/services/presence-registry.js +0 -91
  228. package/packages/cloud/dist/services/scaling-orchestrator.d.ts +0 -159
  229. package/packages/cloud/dist/services/scaling-orchestrator.js +0 -502
  230. package/packages/cloud/dist/services/scaling-policy.d.ts +0 -121
  231. package/packages/cloud/dist/services/scaling-policy.js +0 -415
  232. package/packages/cloud/dist/services/ssh-security.d.ts +0 -31
  233. package/packages/cloud/dist/services/ssh-security.js +0 -63
  234. package/packages/cloud/dist/services/workspace-keepalive.d.ts +0 -76
  235. package/packages/cloud/dist/services/workspace-keepalive.js +0 -234
  236. package/packages/cloud/dist/shims/consensus.d.ts +0 -23
  237. package/packages/cloud/dist/shims/consensus.js +0 -5
  238. package/packages/cloud/dist/webhooks/index.d.ts +0 -24
  239. package/packages/cloud/dist/webhooks/index.js +0 -29
  240. package/packages/cloud/dist/webhooks/parsers/github.d.ts +0 -8
  241. package/packages/cloud/dist/webhooks/parsers/github.js +0 -234
  242. package/packages/cloud/dist/webhooks/parsers/index.d.ts +0 -23
  243. package/packages/cloud/dist/webhooks/parsers/index.js +0 -30
  244. package/packages/cloud/dist/webhooks/parsers/linear.d.ts +0 -9
  245. package/packages/cloud/dist/webhooks/parsers/linear.js +0 -258
  246. package/packages/cloud/dist/webhooks/parsers/slack.d.ts +0 -9
  247. package/packages/cloud/dist/webhooks/parsers/slack.js +0 -214
  248. package/packages/cloud/dist/webhooks/responders/github.d.ts +0 -8
  249. package/packages/cloud/dist/webhooks/responders/github.js +0 -73
  250. package/packages/cloud/dist/webhooks/responders/index.d.ts +0 -23
  251. package/packages/cloud/dist/webhooks/responders/index.js +0 -30
  252. package/packages/cloud/dist/webhooks/responders/linear.d.ts +0 -9
  253. package/packages/cloud/dist/webhooks/responders/linear.js +0 -149
  254. package/packages/cloud/dist/webhooks/responders/slack.d.ts +0 -20
  255. package/packages/cloud/dist/webhooks/responders/slack.js +0 -178
  256. package/packages/cloud/dist/webhooks/router.d.ts +0 -25
  257. package/packages/cloud/dist/webhooks/router.js +0 -504
  258. package/packages/cloud/dist/webhooks/rules-engine.d.ts +0 -24
  259. package/packages/cloud/dist/webhooks/rules-engine.js +0 -287
  260. package/packages/cloud/dist/webhooks/types.d.ts +0 -186
  261. package/packages/cloud/dist/webhooks/types.js +0 -8
  262. package/packages/cloud/package.json +0 -60
  263. package/packages/dashboard/README.md +0 -48
  264. package/packages/dashboard/dist/health-worker-manager.d.ts +0 -62
  265. package/packages/dashboard/dist/health-worker-manager.js +0 -144
  266. package/packages/dashboard/dist/health-worker.d.ts +0 -9
  267. package/packages/dashboard/dist/health-worker.js +0 -79
  268. package/packages/dashboard/dist/index.d.ts +0 -20
  269. package/packages/dashboard/dist/index.js +0 -19
  270. package/packages/dashboard/dist/metrics.d.ts +0 -105
  271. package/packages/dashboard/dist/metrics.js +0 -193
  272. package/packages/dashboard/dist/needs-attention.d.ts +0 -24
  273. package/packages/dashboard/dist/needs-attention.js +0 -78
  274. package/packages/dashboard/dist/server.d.ts +0 -25
  275. package/packages/dashboard/dist/server.js +0 -5270
  276. package/packages/dashboard/dist/start.d.ts +0 -6
  277. package/packages/dashboard/dist/start.js +0 -13
  278. package/packages/dashboard/dist/types/threading.d.ts +0 -8
  279. package/packages/dashboard/dist/types/threading.js +0 -2
  280. package/packages/dashboard/dist/user-bridge.d.ts +0 -154
  281. package/packages/dashboard/dist/user-bridge.js +0 -372
  282. package/packages/dashboard/package.json +0 -65
  283. package/packages/dashboard/ui/app/app/onboarding/page.tsx +0 -394
  284. package/packages/dashboard/ui/app/app/page.tsx +0 -667
  285. package/packages/dashboard/ui/app/apple-icon.png +0 -0
  286. package/packages/dashboard/ui/app/cloud/link/page.tsx +0 -464
  287. package/packages/dashboard/ui/app/complete-profile/page.tsx +0 -204
  288. package/packages/dashboard/ui/app/connect-repos/page.tsx +0 -410
  289. package/packages/dashboard/ui/app/favicon.png +0 -0
  290. package/packages/dashboard/ui/app/globals.css +0 -59
  291. package/packages/dashboard/ui/app/history/page.tsx +0 -658
  292. package/packages/dashboard/ui/app/layout.tsx +0 -25
  293. package/packages/dashboard/ui/app/login/page.tsx +0 -424
  294. package/packages/dashboard/ui/app/metrics/page.tsx +0 -751
  295. package/packages/dashboard/ui/app/page.tsx +0 -59
  296. package/packages/dashboard/ui/app/pricing/page.tsx +0 -7
  297. package/packages/dashboard/ui/app/providers/page.tsx +0 -193
  298. package/packages/dashboard/ui/app/providers/setup/[provider]/ProviderSetupClient.tsx +0 -148
  299. package/packages/dashboard/ui/app/providers/setup/[provider]/constants.ts +0 -35
  300. package/packages/dashboard/ui/app/providers/setup/[provider]/page.tsx +0 -42
  301. package/packages/dashboard/ui/app/signup/page.tsx +0 -533
  302. package/packages/dashboard/ui/index.ts +0 -49
  303. package/packages/dashboard/ui/landing/LandingPage.tsx +0 -713
  304. package/packages/dashboard/ui/landing/PricingPage.tsx +0 -559
  305. package/packages/dashboard/ui/landing/index.ts +0 -6
  306. package/packages/dashboard/ui/landing/styles.css +0 -2850
  307. package/packages/dashboard/ui/lib/agent-merge.ts +0 -35
  308. package/packages/dashboard/ui/lib/api.ts +0 -1155
  309. package/packages/dashboard/ui/lib/cloudApi.ts +0 -877
  310. package/packages/dashboard/ui/lib/colors.ts +0 -218
  311. package/packages/dashboard/ui/lib/hierarchy.ts +0 -242
  312. package/packages/dashboard/ui/lib/stuckDetection.ts +0 -142
  313. package/packages/dashboard/ui/next-env.d.ts +0 -5
  314. package/packages/dashboard/ui/next.config.js +0 -41
  315. package/packages/dashboard/ui/package-lock.json +0 -2882
  316. package/packages/dashboard/ui/package.json +0 -33
  317. package/packages/dashboard/ui/postcss.config.js +0 -5
  318. package/packages/dashboard/ui/react-components/ActivityFeed.tsx +0 -216
  319. package/packages/dashboard/ui/react-components/AddWorkspaceModal.tsx +0 -170
  320. package/packages/dashboard/ui/react-components/AgentCard.tsx +0 -587
  321. package/packages/dashboard/ui/react-components/AgentList.tsx +0 -411
  322. package/packages/dashboard/ui/react-components/AgentProfilePanel.tsx +0 -564
  323. package/packages/dashboard/ui/react-components/App.tsx +0 -3033
  324. package/packages/dashboard/ui/react-components/BillingPanel.tsx +0 -922
  325. package/packages/dashboard/ui/react-components/BillingResult.tsx +0 -447
  326. package/packages/dashboard/ui/react-components/BroadcastComposer.tsx +0 -690
  327. package/packages/dashboard/ui/react-components/ChannelAdminPanel.tsx +0 -773
  328. package/packages/dashboard/ui/react-components/ChannelBrowser.tsx +0 -385
  329. package/packages/dashboard/ui/react-components/ChannelChat.tsx +0 -261
  330. package/packages/dashboard/ui/react-components/ChannelSidebar.tsx +0 -399
  331. package/packages/dashboard/ui/react-components/CloudSessionProvider.tsx +0 -130
  332. package/packages/dashboard/ui/react-components/CommandPalette.tsx +0 -815
  333. package/packages/dashboard/ui/react-components/ConfirmationDialog.tsx +0 -133
  334. package/packages/dashboard/ui/react-components/ConversationHistory.tsx +0 -518
  335. package/packages/dashboard/ui/react-components/CoordinatorPanel.tsx +0 -944
  336. package/packages/dashboard/ui/react-components/DecisionQueue.tsx +0 -717
  337. package/packages/dashboard/ui/react-components/DirectMessageView.tsx +0 -164
  338. package/packages/dashboard/ui/react-components/FileAutocomplete.tsx +0 -368
  339. package/packages/dashboard/ui/react-components/FleetOverview.tsx +0 -278
  340. package/packages/dashboard/ui/react-components/LogViewer.tsx +0 -310
  341. package/packages/dashboard/ui/react-components/LogViewerPanel.tsx +0 -482
  342. package/packages/dashboard/ui/react-components/Logo.tsx +0 -284
  343. package/packages/dashboard/ui/react-components/MentionAutocomplete.tsx +0 -384
  344. package/packages/dashboard/ui/react-components/MessageComposer.tsx +0 -457
  345. package/packages/dashboard/ui/react-components/MessageList.tsx +0 -649
  346. package/packages/dashboard/ui/react-components/MessageSenderName.tsx +0 -91
  347. package/packages/dashboard/ui/react-components/MessageStatusIndicator.tsx +0 -142
  348. package/packages/dashboard/ui/react-components/NewConversationModal.tsx +0 -400
  349. package/packages/dashboard/ui/react-components/NotificationToast.tsx +0 -488
  350. package/packages/dashboard/ui/react-components/OnlineUsersIndicator.tsx +0 -164
  351. package/packages/dashboard/ui/react-components/Pagination.tsx +0 -124
  352. package/packages/dashboard/ui/react-components/PricingPlans.tsx +0 -386
  353. package/packages/dashboard/ui/react-components/ProjectList.tsx +0 -625
  354. package/packages/dashboard/ui/react-components/ProviderAuthFlow.tsx +0 -853
  355. package/packages/dashboard/ui/react-components/ProviderConnectionList.tsx +0 -378
  356. package/packages/dashboard/ui/react-components/ProvisioningProgress.tsx +0 -730
  357. package/packages/dashboard/ui/react-components/RepoAccessPanel.tsx +0 -549
  358. package/packages/dashboard/ui/react-components/ServerCard.tsx +0 -202
  359. package/packages/dashboard/ui/react-components/SessionExpiredModal.tsx +0 -128
  360. package/packages/dashboard/ui/react-components/SpawnModal.tsx +0 -804
  361. package/packages/dashboard/ui/react-components/TaskAssignmentUI.tsx +0 -375
  362. package/packages/dashboard/ui/react-components/TerminalProviderSetup.tsx +0 -608
  363. package/packages/dashboard/ui/react-components/ThemeProvider.tsx +0 -325
  364. package/packages/dashboard/ui/react-components/ThinkingIndicator.tsx +0 -231
  365. package/packages/dashboard/ui/react-components/ThreadList.tsx +0 -198
  366. package/packages/dashboard/ui/react-components/ThreadPanel.tsx +0 -346
  367. package/packages/dashboard/ui/react-components/TrajectoryViewer.tsx +0 -698
  368. package/packages/dashboard/ui/react-components/TypingIndicator.tsx +0 -69
  369. package/packages/dashboard/ui/react-components/UsageBanner.tsx +0 -231
  370. package/packages/dashboard/ui/react-components/UserProfilePanel.tsx +0 -233
  371. package/packages/dashboard/ui/react-components/WorkspaceContext.tsx +0 -107
  372. package/packages/dashboard/ui/react-components/WorkspaceSelector.tsx +0 -234
  373. package/packages/dashboard/ui/react-components/WorkspaceStatusIndicator.tsx +0 -370
  374. package/packages/dashboard/ui/react-components/XTermInteractive.tsx +0 -510
  375. package/packages/dashboard/ui/react-components/XTermLogViewer.tsx +0 -719
  376. package/packages/dashboard/ui/react-components/channels/ChannelDialogs.tsx +0 -1411
  377. package/packages/dashboard/ui/react-components/channels/ChannelHeader.tsx +0 -317
  378. package/packages/dashboard/ui/react-components/channels/ChannelMessageList.tsx +0 -463
  379. package/packages/dashboard/ui/react-components/channels/ChannelViewV1.tsx +0 -146
  380. package/packages/dashboard/ui/react-components/channels/MessageInput.tsx +0 -288
  381. package/packages/dashboard/ui/react-components/channels/SearchInput.tsx +0 -172
  382. package/packages/dashboard/ui/react-components/channels/SearchResults.tsx +0 -336
  383. package/packages/dashboard/ui/react-components/channels/api.ts +0 -697
  384. package/packages/dashboard/ui/react-components/channels/index.ts +0 -76
  385. package/packages/dashboard/ui/react-components/channels/mockApi.ts +0 -344
  386. package/packages/dashboard/ui/react-components/channels/types.ts +0 -566
  387. package/packages/dashboard/ui/react-components/hooks/index.ts +0 -57
  388. package/packages/dashboard/ui/react-components/hooks/useAgentLogs.ts +0 -394
  389. package/packages/dashboard/ui/react-components/hooks/useAgents.ts +0 -127
  390. package/packages/dashboard/ui/react-components/hooks/useBroadcastDedup.ts +0 -86
  391. package/packages/dashboard/ui/react-components/hooks/useChannelAdmin.ts +0 -329
  392. package/packages/dashboard/ui/react-components/hooks/useChannelBrowser.ts +0 -239
  393. package/packages/dashboard/ui/react-components/hooks/useChannelCommands.ts +0 -138
  394. package/packages/dashboard/ui/react-components/hooks/useChannels.ts +0 -328
  395. package/packages/dashboard/ui/react-components/hooks/useDebounce.ts +0 -29
  396. package/packages/dashboard/ui/react-components/hooks/useDirectMessage.ts +0 -141
  397. package/packages/dashboard/ui/react-components/hooks/useMessages.ts +0 -309
  398. package/packages/dashboard/ui/react-components/hooks/useOrchestrator.ts +0 -364
  399. package/packages/dashboard/ui/react-components/hooks/usePinnedAgents.ts +0 -140
  400. package/packages/dashboard/ui/react-components/hooks/usePresence.ts +0 -340
  401. package/packages/dashboard/ui/react-components/hooks/useRecentRepos.ts +0 -130
  402. package/packages/dashboard/ui/react-components/hooks/useSession.ts +0 -209
  403. package/packages/dashboard/ui/react-components/hooks/useTrajectory.ts +0 -265
  404. package/packages/dashboard/ui/react-components/hooks/useWebSocket.ts +0 -169
  405. package/packages/dashboard/ui/react-components/hooks/useWorkspaceMembers.ts +0 -120
  406. package/packages/dashboard/ui/react-components/hooks/useWorkspaceRepos.ts +0 -73
  407. package/packages/dashboard/ui/react-components/hooks/useWorkspaceStatus.ts +0 -237
  408. package/packages/dashboard/ui/react-components/index.ts +0 -81
  409. package/packages/dashboard/ui/react-components/layout/Header.tsx +0 -355
  410. package/packages/dashboard/ui/react-components/layout/RepoContextHeader.tsx +0 -361
  411. package/packages/dashboard/ui/react-components/layout/Sidebar.archive.test.tsx +0 -126
  412. package/packages/dashboard/ui/react-components/layout/Sidebar.test.tsx +0 -691
  413. package/packages/dashboard/ui/react-components/layout/Sidebar.tsx +0 -930
  414. package/packages/dashboard/ui/react-components/layout/index.ts +0 -7
  415. package/packages/dashboard/ui/react-components/settings/BillingSettingsPanel.tsx +0 -564
  416. package/packages/dashboard/ui/react-components/settings/SettingsPage.tsx +0 -544
  417. package/packages/dashboard/ui/react-components/settings/TeamSettingsPanel.tsx +0 -560
  418. package/packages/dashboard/ui/react-components/settings/WorkspaceSettingsPanel.tsx +0 -1386
  419. package/packages/dashboard/ui/react-components/settings/index.ts +0 -11
  420. package/packages/dashboard/ui/react-components/settings/types.ts +0 -53
  421. package/packages/dashboard/ui/react-components/utils/messageFormatting.tsx +0 -370
  422. package/packages/dashboard/ui/tailwind.config.js +0 -148
  423. package/packages/dashboard/ui/types/index.ts +0 -304
  424. package/packages/dashboard/ui/types/threading.ts +0 -7
  425. package/packages/dashboard/ui-dist/404.html +0 -1
  426. package/packages/dashboard/ui-dist/_next/static/91mkGYq3qbG8WHE6VytQ8/_buildManifest.js +0 -1
  427. package/packages/dashboard/ui-dist/_next/static/91mkGYq3qbG8WHE6VytQ8/_ssgManifest.js +0 -1
  428. package/packages/dashboard/ui-dist/_next/static/T2rV14eEU5OweDeV29SvG/_buildManifest.js +0 -1
  429. package/packages/dashboard/ui-dist/_next/static/T2rV14eEU5OweDeV29SvG/_ssgManifest.js +0 -1
  430. package/packages/dashboard/ui-dist/_next/static/chunks/116-a883fca163f3a5bc.js +0 -1
  431. package/packages/dashboard/ui-dist/_next/static/chunks/117-c8afed19e821a35d.js +0 -2
  432. package/packages/dashboard/ui-dist/_next/static/chunks/282-980c2eb8fff20123.js +0 -1
  433. package/packages/dashboard/ui-dist/_next/static/chunks/320-a6304232cd0ee2ce.js +0 -1
  434. package/packages/dashboard/ui-dist/_next/static/chunks/532-bace199897eeab37.js +0 -9
  435. package/packages/dashboard/ui-dist/_next/static/chunks/631-16b905e5920f9b59.js +0 -1
  436. package/packages/dashboard/ui-dist/_next/static/chunks/648-acb2ff9f77cbfbd3.js +0 -1
  437. package/packages/dashboard/ui-dist/_next/static/chunks/766-2aea80818f7eb0d8.js +0 -1
  438. package/packages/dashboard/ui-dist/_next/static/chunks/83-26d2bde54616ee90.js +0 -1
  439. package/packages/dashboard/ui-dist/_next/static/chunks/847-f1f467060f32afff.js +0 -1
  440. package/packages/dashboard/ui-dist/_next/static/chunks/891-5cb1513eeb97a891.js +0 -1
  441. package/packages/dashboard/ui-dist/_next/static/chunks/app/_not-found/page-60501fddbafba9dc.js +0 -1
  442. package/packages/dashboard/ui-dist/_next/static/chunks/app/app/onboarding/page-9914652442f7e4fb.js +0 -1
  443. package/packages/dashboard/ui-dist/_next/static/chunks/app/app/page-366fb7c078d4e9e0.js +0 -1
  444. package/packages/dashboard/ui-dist/_next/static/chunks/app/cloud/link/page-fa1d5842aa90e8a6.js +0 -1
  445. package/packages/dashboard/ui-dist/_next/static/chunks/app/complete-profile/page-dd64bbdf66b639cd.js +0 -1
  446. package/packages/dashboard/ui-dist/_next/static/chunks/app/connect-repos/page-113060009ef35bc2.js +0 -1
  447. package/packages/dashboard/ui-dist/_next/static/chunks/app/history/page-9965d2483011b846.js +0 -1
  448. package/packages/dashboard/ui-dist/_next/static/chunks/app/layout-6b91e33784c20610.js +0 -1
  449. package/packages/dashboard/ui-dist/_next/static/chunks/app/login/page-435eceb0073be027.js +0 -1
  450. package/packages/dashboard/ui-dist/_next/static/chunks/app/metrics/page-1e37ef8e73940b40.js +0 -1
  451. package/packages/dashboard/ui-dist/_next/static/chunks/app/page-8119d4246743574e.js +0 -1
  452. package/packages/dashboard/ui-dist/_next/static/chunks/app/pricing/page-9db3ebdfa567a7c9.js +0 -1
  453. package/packages/dashboard/ui-dist/_next/static/chunks/app/providers/page-ecb16ffd3b36262b.js +0 -1
  454. package/packages/dashboard/ui-dist/_next/static/chunks/app/providers/setup/[provider]/page-4dbe33f0f7691b7c.js +0 -1
  455. package/packages/dashboard/ui-dist/_next/static/chunks/app/signup/page-c7a0a28341365ae0.js +0 -1
  456. package/packages/dashboard/ui-dist/_next/static/chunks/e868780c-48e5f147c90a3a41.js +0 -18
  457. package/packages/dashboard/ui-dist/_next/static/chunks/fd9d1056-609918ca7b6280bb.js +0 -1
  458. package/packages/dashboard/ui-dist/_next/static/chunks/framework-f66176bb897dc684.js +0 -1
  459. package/packages/dashboard/ui-dist/_next/static/chunks/main-311c3db74dcfadb7.js +0 -1
  460. package/packages/dashboard/ui-dist/_next/static/chunks/main-app-fdbeb09028f57c9f.js +0 -1
  461. package/packages/dashboard/ui-dist/_next/static/chunks/pages/_app-72b849fbd24ac258.js +0 -1
  462. package/packages/dashboard/ui-dist/_next/static/chunks/pages/_error-7ba65e1336b92748.js +0 -1
  463. package/packages/dashboard/ui-dist/_next/static/chunks/polyfills-42372ed130431b0a.js +0 -1
  464. package/packages/dashboard/ui-dist/_next/static/chunks/webpack-1cdd8ed57114d5e1.js +0 -1
  465. package/packages/dashboard/ui-dist/_next/static/css/4034f236dd1a3178.css +0 -1
  466. package/packages/dashboard/ui-dist/_next/static/css/6892f8422896ef7a.css +0 -1
  467. package/packages/dashboard/ui-dist/_next/static/l8L2OscDSR2vsMIlWcC48/_buildManifest.js +0 -1
  468. package/packages/dashboard/ui-dist/_next/static/l8L2OscDSR2vsMIlWcC48/_ssgManifest.js +0 -1
  469. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-128.png +0 -0
  470. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-256.png +0 -0
  471. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-32.png +0 -0
  472. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-512.png +0 -0
  473. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo-64.png +0 -0
  474. package/packages/dashboard/ui-dist/alt-logos/agent-relay-logo.svg +0 -45
  475. package/packages/dashboard/ui-dist/alt-logos/logo.svg +0 -38
  476. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-128.png +0 -0
  477. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-256.png +0 -0
  478. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-32.png +0 -0
  479. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-512.png +0 -0
  480. package/packages/dashboard/ui-dist/alt-logos/monogram-logo-64.png +0 -0
  481. package/packages/dashboard/ui-dist/alt-logos/monogram-logo.svg +0 -38
  482. package/packages/dashboard/ui-dist/app/onboarding.html +0 -1
  483. package/packages/dashboard/ui-dist/app/onboarding.txt +0 -7
  484. package/packages/dashboard/ui-dist/app.html +0 -1
  485. package/packages/dashboard/ui-dist/app.txt +0 -7
  486. package/packages/dashboard/ui-dist/apple-icon.png +0 -0
  487. package/packages/dashboard/ui-dist/cloud/link.html +0 -1
  488. package/packages/dashboard/ui-dist/cloud/link.txt +0 -7
  489. package/packages/dashboard/ui-dist/complete-profile.html +0 -5
  490. package/packages/dashboard/ui-dist/complete-profile.txt +0 -7
  491. package/packages/dashboard/ui-dist/connect-repos.html +0 -1
  492. package/packages/dashboard/ui-dist/connect-repos.txt +0 -7
  493. package/packages/dashboard/ui-dist/history.html +0 -1
  494. package/packages/dashboard/ui-dist/history.txt +0 -7
  495. package/packages/dashboard/ui-dist/index.html +0 -1
  496. package/packages/dashboard/ui-dist/index.txt +0 -7
  497. package/packages/dashboard/ui-dist/login.html +0 -5
  498. package/packages/dashboard/ui-dist/login.txt +0 -7
  499. package/packages/dashboard/ui-dist/metrics.html +0 -1
  500. package/packages/dashboard/ui-dist/metrics.txt +0 -7
  501. package/packages/dashboard/ui-dist/pricing.html +0 -13
  502. package/packages/dashboard/ui-dist/pricing.txt +0 -7
  503. package/packages/dashboard/ui-dist/providers/setup/claude.html +0 -1
  504. package/packages/dashboard/ui-dist/providers/setup/claude.txt +0 -8
  505. package/packages/dashboard/ui-dist/providers/setup/codex.html +0 -1
  506. package/packages/dashboard/ui-dist/providers/setup/codex.txt +0 -8
  507. package/packages/dashboard/ui-dist/providers/setup/cursor.html +0 -1
  508. package/packages/dashboard/ui-dist/providers/setup/cursor.txt +0 -8
  509. package/packages/dashboard/ui-dist/providers.html +0 -1
  510. package/packages/dashboard/ui-dist/providers.txt +0 -7
  511. package/packages/dashboard/ui-dist/signup.html +0 -6
  512. package/packages/dashboard/ui-dist/signup.txt +0 -7
  513. package/packages/dashboard-server/dist/health-worker-manager.d.ts +0 -62
  514. package/packages/dashboard-server/dist/health-worker-manager.js +0 -144
  515. package/packages/dashboard-server/dist/health-worker.d.ts +0 -9
  516. package/packages/dashboard-server/dist/health-worker.js +0 -79
  517. package/packages/dashboard-server/dist/index.d.ts +0 -18
  518. package/packages/dashboard-server/dist/index.js +0 -17
  519. package/packages/dashboard-server/dist/metrics.d.ts +0 -105
  520. package/packages/dashboard-server/dist/metrics.js +0 -193
  521. package/packages/dashboard-server/dist/needs-attention.d.ts +0 -24
  522. package/packages/dashboard-server/dist/needs-attention.js +0 -78
  523. package/packages/dashboard-server/dist/server.d.ts +0 -25
  524. package/packages/dashboard-server/dist/server.js +0 -5158
  525. package/packages/dashboard-server/dist/start.d.ts +0 -6
  526. package/packages/dashboard-server/dist/start.js +0 -13
  527. package/packages/dashboard-server/dist/types/threading.d.ts +0 -8
  528. package/packages/dashboard-server/dist/types/threading.js +0 -2
  529. package/packages/dashboard-server/dist/user-bridge.d.ts +0 -158
  530. package/packages/dashboard-server/dist/user-bridge.js +0 -390
  531. package/packages/dashboard-server/package.json +0 -55
  532. package/scripts/run-migrations.js +0 -43
  533. package/scripts/setup-stripe-products.ts +0 -312
  534. package/scripts/verify-schema.js +0 -134
@@ -1,649 +0,0 @@
1
- /**
2
- * MessageList Component - Mission Control Theme
3
- *
4
- * Displays a list of messages with threading support,
5
- * provider-colored icons, and From → To format.
6
- */
7
-
8
- import React, { useRef, useEffect, useLayoutEffect, useState, useCallback } from 'react';
9
- import { ACTIVITY_FEED_ID } from './App';
10
- import type { Message, Agent, Attachment } from '../types';
11
- import type { UserPresence } from './hooks/usePresence';
12
- import { MessageStatusIndicator } from './MessageStatusIndicator';
13
- import { ThinkingIndicator } from './ThinkingIndicator';
14
- import { deduplicateBroadcasts } from './hooks/useBroadcastDedup';
15
- import { MessageSenderName } from './MessageSenderName';
16
- import { formatMessageBody } from './utils/messageFormatting';
17
-
18
- // Provider icons and colors matching landing page
19
- const PROVIDER_CONFIG: Record<string, { icon: string; color: string }> = {
20
- claude: { icon: '◈', color: '#00d9ff' },
21
- codex: { icon: '⬡', color: '#ff6b35' },
22
- gemini: { icon: '◇', color: '#a855f7' },
23
- openai: { icon: '◆', color: '#10a37f' },
24
- default: { icon: '●', color: '#00d9ff' },
25
- };
26
-
27
- // Get provider config from agent name (heuristic-based)
28
- function getProviderConfig(agentName: string): { icon: string; color: string } {
29
- const nameLower = agentName.toLowerCase();
30
- if (nameLower.includes('claude') || nameLower.includes('anthropic')) {
31
- return PROVIDER_CONFIG.claude;
32
- }
33
- if (nameLower.includes('codex') || nameLower.includes('openai') || nameLower.includes('gpt')) {
34
- return PROVIDER_CONFIG.codex;
35
- }
36
- if (nameLower.includes('gemini') || nameLower.includes('google') || nameLower.includes('bard')) {
37
- return PROVIDER_CONFIG.gemini;
38
- }
39
- // Default: cycle through colors based on name hash
40
- const hash = agentName.split('').reduce((acc, char) => acc + char.charCodeAt(0), 0);
41
- const providers = Object.keys(PROVIDER_CONFIG).filter((k) => k !== 'default');
42
- const provider = providers[hash % providers.length];
43
- return PROVIDER_CONFIG[provider];
44
- }
45
-
46
- /** Current user info for displaying avatar/username */
47
- export interface CurrentUser {
48
- displayName: string;
49
- avatarUrl?: string;
50
- }
51
-
52
- export interface MessageListProps {
53
- messages: Message[];
54
- currentChannel: string;
55
- onThreadClick?: (messageId: string) => void;
56
- highlightedMessageId?: string;
57
- /** Currently selected thread ID - when set, shows thread-related messages */
58
- currentThread?: string | null;
59
- /** Agents list for checking processing state */
60
- agents?: Agent[];
61
- /** Current user info (for cloud mode - shows avatar/username instead of "Dashboard") */
62
- currentUser?: CurrentUser;
63
- /** Skip channel filtering - messages are already filtered (for DM views) */
64
- skipChannelFilter?: boolean;
65
- /** Default auto-scroll preference */
66
- autoScrollDefault?: boolean;
67
- /** Show timestamps in message header */
68
- showTimestamps?: boolean;
69
- /** Compact spacing for dense layouts */
70
- compactMode?: boolean;
71
- /** Callback when an agent name is clicked to open profile */
72
- onAgentClick?: (agent: Agent) => void;
73
- /** Callback when a human user name is clicked to open profile */
74
- onUserClick?: (user: UserPresence) => void;
75
- /** Online users list for profile lookup */
76
- onlineUsers?: UserPresence[];
77
- }
78
-
79
- export function MessageList({
80
- messages,
81
- currentChannel,
82
- onThreadClick,
83
- highlightedMessageId,
84
- currentThread,
85
- agents = [],
86
- currentUser,
87
- skipChannelFilter = false,
88
- autoScrollDefault = true,
89
- showTimestamps = true,
90
- compactMode = false,
91
- onAgentClick,
92
- onUserClick,
93
- onlineUsers = [],
94
- }: MessageListProps) {
95
- // Build a map of agent name -> processing state for quick lookup
96
- const processingAgents = new Map<string, { isProcessing: boolean; processingStartedAt?: number }>();
97
- for (const agent of agents) {
98
- if (agent.isProcessing) {
99
- processingAgents.set(agent.name, {
100
- isProcessing: true,
101
- processingStartedAt: agent.processingStartedAt,
102
- });
103
- }
104
- }
105
-
106
- // Build a map of recipient -> latest message ID from current user
107
- // This is used to only show the thinking indicator on the most recent message
108
- const latestMessageToAgent = new Map<string, string>();
109
- const scrollContainerRef = useRef<HTMLDivElement>(null);
110
- const [autoScroll, setAutoScroll] = useState(autoScrollDefault);
111
- const prevFilteredLengthRef = useRef<number>(0);
112
- const prevChannelRef = useRef<string>(currentChannel);
113
- // Track if we should scroll on next render (set before DOM updates)
114
- const shouldScrollRef = useRef(false);
115
- // Track if a scroll is in progress to prevent race conditions
116
- const isScrollingRef = useRef(false);
117
-
118
- useEffect(() => {
119
- setAutoScroll(autoScrollDefault);
120
- }, [autoScrollDefault]);
121
-
122
- // Filter messages for current channel or current thread
123
- const channelFilteredMessages = messages.filter((msg) => {
124
- // When a thread is selected, show messages related to that thread
125
- if (currentThread) {
126
- // Show the original message (id matches thread) or replies (thread field matches)
127
- return msg.id === currentThread || msg.thread === currentThread;
128
- }
129
-
130
- // Skip channel filtering if messages are already filtered (e.g., DM views)
131
- if (skipChannelFilter) {
132
- return true;
133
- }
134
-
135
- // Activity feed shows broadcasts
136
- if (currentChannel === ACTIVITY_FEED_ID) {
137
- return msg.to === '*' || msg.isBroadcast;
138
- }
139
- // #general channel shows only actual channel messages (not broadcasts)
140
- if (currentChannel === 'general' || currentChannel === '#general') {
141
- return msg.channel === 'general' || msg.channel === '#general' ||
142
- msg.to === '#general' || msg.to === 'general';
143
- }
144
- return msg.from === currentChannel || msg.to === currentChannel;
145
- });
146
-
147
- // Deduplicate broadcast messages in Activity feed
148
- // When a broadcast is sent to '*', the backend delivers it to each recipient separately,
149
- // causing the same message to appear multiple times. Deduplication removes duplicates
150
- // by grouping broadcasts with the same sender, content, and timestamp.
151
- const filteredMessages = currentChannel === ACTIVITY_FEED_ID
152
- ? deduplicateBroadcasts(channelFilteredMessages)
153
- : channelFilteredMessages;
154
-
155
- // Populate latestMessageToAgent with the latest message from current user to each agent
156
- // Iterate in order (oldest to newest) so the last one wins
157
- for (const msg of filteredMessages) {
158
- const isFromCurrentUser = msg.from === 'Dashboard' ||
159
- (currentUser && msg.from === currentUser.displayName);
160
- if (isFromCurrentUser && msg.to !== '*') {
161
- latestMessageToAgent.set(msg.to, msg.id);
162
- }
163
- }
164
-
165
- const autoScrollAllowed = autoScrollDefault;
166
-
167
- // Check if we need to scroll BEFORE the DOM updates
168
- // This runs during render, before useLayoutEffect
169
- const currentLength = filteredMessages.length;
170
- if (currentLength > prevFilteredLengthRef.current) {
171
- // Check if the latest message is from the current user
172
- // This includes both "Dashboard" (local mode) and GitHub username (cloud mode)
173
- // Scroll for user's own messages only when auto-scroll is enabled
174
- const latestMessage = filteredMessages[filteredMessages.length - 1];
175
- const latestIsFromUser = latestMessage?.from === 'Dashboard' ||
176
- (currentUser && latestMessage?.from === currentUser.displayName);
177
-
178
- if (autoScrollAllowed && (latestIsFromUser || autoScroll)) {
179
- shouldScrollRef.current = true;
180
- // Re-enable auto-scroll if we're scrolling for user's message
181
- // This ensures continued auto-scroll after user sends a message
182
- if (latestIsFromUser && !autoScroll) {
183
- setAutoScroll(true);
184
- }
185
- }
186
- }
187
- prevFilteredLengthRef.current = currentLength;
188
-
189
- // Handle scroll to detect manual scroll (disable/enable auto-scroll)
190
- const handleScroll = useCallback(() => {
191
- if (!scrollContainerRef.current) return;
192
- // Skip scroll events that happen during programmatic scrolling
193
- if (isScrollingRef.current) return;
194
- if (!autoScrollDefault) return;
195
-
196
- const container = scrollContainerRef.current;
197
- const distanceFromBottom = container.scrollHeight - container.scrollTop - container.clientHeight;
198
- const isAtBottom = distanceFromBottom < 50;
199
-
200
- // Re-enable auto-scroll when user scrolls to bottom
201
- if (isAtBottom && !autoScroll) {
202
- setAutoScroll(true);
203
- }
204
- // Disable auto-scroll when user scrolls significantly away from bottom
205
- // Use a larger threshold to avoid false disables from small layout shifts
206
- else if (distanceFromBottom > 150 && autoScroll) {
207
- setAutoScroll(false);
208
- }
209
- }, [autoScroll]);
210
-
211
- // Auto-scroll to bottom when new messages arrive - use useLayoutEffect for immediate execution
212
- useLayoutEffect(() => {
213
- if (shouldScrollRef.current && scrollContainerRef.current) {
214
- shouldScrollRef.current = false;
215
- isScrollingRef.current = true;
216
-
217
- const container = scrollContainerRef.current;
218
- container.scrollTop = container.scrollHeight;
219
-
220
- // Clear the scrolling flag after the scroll event has been processed
221
- requestAnimationFrame(() => {
222
- setTimeout(() => {
223
- isScrollingRef.current = false;
224
- }, 50);
225
- });
226
- }
227
- }, [filteredMessages.length]);
228
-
229
- // Reset scroll position and auto-scroll when channel changes
230
- useLayoutEffect(() => {
231
- if (currentChannel !== prevChannelRef.current) {
232
- prevChannelRef.current = currentChannel;
233
- prevFilteredLengthRef.current = filteredMessages.length;
234
- setAutoScroll(true);
235
-
236
- // Scroll to bottom on channel change
237
- if (scrollContainerRef.current) {
238
- isScrollingRef.current = true;
239
- const container = scrollContainerRef.current;
240
- container.scrollTop = container.scrollHeight;
241
-
242
- // Clear the scrolling flag after the scroll event has been processed
243
- requestAnimationFrame(() => {
244
- setTimeout(() => {
245
- isScrollingRef.current = false;
246
- }, 50);
247
- });
248
- }
249
- }
250
- }, [currentChannel, filteredMessages.length]);
251
-
252
- if (filteredMessages.length === 0) {
253
- return (
254
- <div className="flex flex-col items-center justify-center h-full text-text-muted text-center">
255
- <EmptyIcon />
256
- <h3 className="m-0 mb-2 text-base font-display text-text-secondary">No messages yet</h3>
257
- <p className="m-0 text-sm">
258
- {currentChannel === 'general'
259
- ? 'Broadcast messages will appear here'
260
- : `Messages with ${currentChannel} will appear here`}
261
- </p>
262
- </div>
263
- );
264
- }
265
-
266
- return (
267
- <div
268
- className={`flex flex-col bg-bg-secondary h-full overflow-y-auto ${
269
- compactMode ? 'gap-0.5 p-1.5 sm:p-2' : 'gap-1 p-2 sm:p-4'
270
- }`}
271
- ref={scrollContainerRef}
272
- onScroll={handleScroll}
273
- >
274
- {filteredMessages.map((message) => {
275
- // Check if message is from current user (Dashboard or GitHub username)
276
- const isFromCurrentUser = message.from === 'Dashboard' ||
277
- (currentUser && message.from === currentUser.displayName);
278
-
279
- // Check if this is the latest message from current user to this recipient
280
- // Only the latest message should show the thinking indicator
281
- const isLatestToRecipient = isFromCurrentUser && message.to !== '*' &&
282
- latestMessageToAgent.get(message.to) === message.id;
283
-
284
- // Check if the recipient is currently processing
285
- // Only show thinking indicator for the LATEST message from current user to an agent
286
- const recipientProcessing = isLatestToRecipient
287
- ? processingAgents.get(message.to)
288
- : undefined;
289
-
290
- return (
291
- <MessageItem
292
- key={message.id}
293
- message={message}
294
- isHighlighted={message.id === highlightedMessageId}
295
- onThreadClick={onThreadClick}
296
- recipientProcessing={recipientProcessing}
297
- currentUser={currentUser}
298
- showTimestamps={showTimestamps}
299
- compactMode={compactMode}
300
- agents={agents}
301
- onlineUsers={onlineUsers}
302
- onAgentClick={onAgentClick}
303
- onUserClick={onUserClick}
304
- />
305
- );
306
- })}
307
- </div>
308
- );
309
- }
310
-
311
- interface MessageItemProps {
312
- message: Message;
313
- isHighlighted?: boolean;
314
- onThreadClick?: (messageId: string) => void;
315
- /** Processing state of the recipient agent (for showing thinking indicator) */
316
- recipientProcessing?: { isProcessing: boolean; processingStartedAt?: number };
317
- /** Current user info for displaying avatar/username */
318
- currentUser?: CurrentUser;
319
- showTimestamps?: boolean;
320
- compactMode?: boolean;
321
- /** All agents for name lookup */
322
- agents?: Agent[];
323
- /** Online users for profile lookup */
324
- onlineUsers?: UserPresence[];
325
- /** Callback when an agent name is clicked */
326
- onAgentClick?: (agent: Agent) => void;
327
- /** Callback when a user name is clicked */
328
- onUserClick?: (user: UserPresence) => void;
329
- }
330
-
331
- function MessageItem({
332
- message,
333
- isHighlighted,
334
- onThreadClick,
335
- recipientProcessing,
336
- currentUser,
337
- showTimestamps = true,
338
- compactMode = false,
339
- agents = [],
340
- onlineUsers = [],
341
- onAgentClick,
342
- onUserClick,
343
- }: MessageItemProps) {
344
- const timestamp = formatTimestamp(message.timestamp);
345
-
346
- // Check if this message is from the current user (Dashboard or their GitHub username)
347
- const isFromCurrentUser = message.from === 'Dashboard' ||
348
- (currentUser && message.from === currentUser.displayName);
349
-
350
- // Get provider config for agent messages, or use user styling for current user
351
- const provider = isFromCurrentUser && currentUser
352
- ? { icon: '', color: '#a855f7' } // Purple for user messages
353
- : getProviderConfig(message.from);
354
-
355
- // Display name: use GitHub username if available, otherwise message.from
356
- const displayName = isFromCurrentUser && currentUser
357
- ? currentUser.displayName
358
- : message.from;
359
- const replyCount = message.threadSummary?.replyCount ?? message.replyCount ?? 0;
360
- const hasReplies = replyCount > 0;
361
-
362
- // Look up agent or user for sender (for clickable profile)
363
- const senderAgent = agents.find(a => a.name.toLowerCase() === message.from.toLowerCase() && !a.isHuman);
364
- const senderUser = onlineUsers.find(u => u.username.toLowerCase() === message.from.toLowerCase());
365
-
366
- // Look up agent or user for recipient (for clickable profile)
367
- const recipientAgent = message.to !== '*' ? agents.find(a => a.name.toLowerCase() === message.to.toLowerCase() && !a.isHuman) : undefined;
368
- const recipientUser = message.to !== '*' ? onlineUsers.find(u => u.username.toLowerCase() === message.to.toLowerCase()) : undefined;
369
- const recipientProviderConfig = recipientAgent ? getProviderConfig(message.to) : undefined;
370
-
371
- // Show thinking indicator when:
372
- // 1. Message is from Dashboard or current user (user sent it)
373
- // 2. Message has been delivered (acked)
374
- // 3. Recipient is currently processing
375
- const showThinking = isFromCurrentUser &&
376
- (message.status === 'acked' || message.status === 'read') &&
377
- recipientProcessing?.isProcessing;
378
-
379
- return (
380
- <div
381
- className={`
382
- group flex rounded-xl transition-all duration-150
383
- ${compactMode ? 'gap-2 py-1.5 px-2' : 'gap-2 sm:gap-3 py-2 sm:py-3 px-2 sm:px-4'}
384
- hover:bg-bg-card/50
385
- ${isHighlighted ? 'bg-warning-light/20 border-l-2 border-l-warning pl-2 sm:pl-3' : ''}
386
- `}
387
- >
388
- {/* Avatar/Icon */}
389
- {isFromCurrentUser && currentUser?.avatarUrl ? (
390
- <img
391
- src={currentUser.avatarUrl}
392
- alt={displayName}
393
- className={`shrink-0 rounded-lg sm:rounded-xl border-2 object-cover ${
394
- compactMode ? 'w-7 h-7 sm:w-8 sm:h-8' : 'w-8 h-8 sm:w-10 sm:h-10'
395
- }`}
396
- style={{
397
- borderColor: provider.color,
398
- boxShadow: `0 0 16px ${provider.color}30`,
399
- }}
400
- />
401
- ) : senderUser?.avatarUrl ? (
402
- <img
403
- src={senderUser.avatarUrl}
404
- alt={displayName}
405
- className={`shrink-0 rounded-lg sm:rounded-xl border-2 object-cover ${
406
- compactMode ? 'w-7 h-7 sm:w-8 sm:h-8' : 'w-8 h-8 sm:w-10 sm:h-10'
407
- }`}
408
- style={{
409
- borderColor: provider.color,
410
- boxShadow: `0 0 16px ${provider.color}30`,
411
- }}
412
- />
413
- ) : (
414
- <div
415
- className={`shrink-0 rounded-lg sm:rounded-xl flex items-center justify-center font-medium border-2 ${
416
- compactMode ? 'w-7 h-7 sm:w-8 sm:h-8 text-sm sm:text-base' : 'w-8 h-8 sm:w-10 sm:h-10 text-base sm:text-lg'
417
- }`}
418
- style={{
419
- backgroundColor: `${provider.color}15`,
420
- borderColor: provider.color,
421
- color: provider.color,
422
- boxShadow: `0 0 16px ${provider.color}30`,
423
- }}
424
- >
425
- {provider.icon}
426
- </div>
427
- )}
428
-
429
- <div className="flex-1 min-w-0 overflow-hidden">
430
- {/* Message Header */}
431
- <div className={`flex items-center gap-2 flex-wrap ${compactMode ? 'mb-1' : 'mb-1.5'}`}>
432
- <MessageSenderName
433
- displayName={displayName}
434
- color={provider.color}
435
- isCurrentUser={isFromCurrentUser}
436
- agent={senderAgent}
437
- userPresence={senderUser}
438
- onAgentClick={onAgentClick}
439
- onUserClick={onUserClick}
440
- />
441
-
442
- {message.to !== '*' && (
443
- <>
444
- <span className="text-text-dim text-xs">→</span>
445
- <MessageSenderName
446
- displayName={message.to}
447
- color={recipientProviderConfig?.color || '#00d9ff'}
448
- agent={recipientAgent}
449
- userPresence={recipientUser}
450
- onAgentClick={onAgentClick}
451
- onUserClick={onUserClick}
452
- />
453
- </>
454
- )}
455
-
456
- {message.thread && (
457
- <span className="text-xs py-0.5 px-2 rounded-full font-mono font-medium bg-accent-purple/20 text-accent-purple">
458
- {message.thread}
459
- </span>
460
- )}
461
-
462
- {message.to === '*' && (
463
- <span className="text-xs py-0.5 px-2 rounded-full uppercase font-medium bg-warning/20 text-warning">
464
- broadcast
465
- </span>
466
- )}
467
-
468
- {showTimestamps && (
469
- <span className="text-text-dim text-xs ml-auto font-mono">{timestamp}</span>
470
- )}
471
-
472
- {/* Message status indicator - show for messages sent by current user */}
473
- {isFromCurrentUser && (
474
- <MessageStatusIndicator status={message.status} size="small" />
475
- )}
476
-
477
- {/* Thinking indicator - show when recipient is processing */}
478
- {showThinking && (
479
- <ThinkingIndicator
480
- isProcessing={true}
481
- processingStartedAt={recipientProcessing?.processingStartedAt}
482
- size="small"
483
- showLabel={true}
484
- />
485
- )}
486
-
487
- {/* Thread/Reply button */}
488
- <button
489
- className={`
490
- inline-flex items-center gap-1.5 p-1.5 rounded-lg transition-all duration-150 cursor-pointer border-none
491
- ${hasReplies || message.thread
492
- ? 'text-accent-cyan bg-accent-cyan/10 hover:bg-accent-cyan/20'
493
- : 'text-text-muted bg-transparent opacity-0 group-hover:opacity-100 hover:text-accent-cyan hover:bg-accent-cyan/10'}
494
- `}
495
- onClick={() => onThreadClick?.(message.thread || message.id)}
496
- title={message.thread ? `View thread: ${message.thread}` : (hasReplies ? `${replyCount} ${replyCount === 1 ? 'reply' : 'replies'}` : 'Reply in thread')}
497
- >
498
- <ThreadIcon />
499
- {hasReplies && (
500
- <span className="text-xs font-medium">{replyCount}</span>
501
- )}
502
- </button>
503
- </div>
504
-
505
- {/* Message Content */}
506
- <div className="text-sm leading-relaxed text-text-primary whitespace-pre-wrap break-words">
507
- {formatMessageBody(message.content)}
508
- </div>
509
-
510
- {/* Attachments */}
511
- {message.attachments && message.attachments.length > 0 && (
512
- <MessageAttachments attachments={message.attachments} />
513
- )}
514
- </div>
515
- </div>
516
- );
517
- }
518
-
519
- /**
520
- * Message Attachments Component
521
- * Displays image attachments with lightbox functionality
522
- */
523
- interface MessageAttachmentsProps {
524
- attachments: Attachment[];
525
- }
526
-
527
- function MessageAttachments({ attachments }: MessageAttachmentsProps) {
528
- const [lightboxImage, setLightboxImage] = useState<Attachment | null>(null);
529
-
530
- const imageAttachments = attachments.filter(a =>
531
- a.mimeType.startsWith('image/')
532
- );
533
-
534
- if (imageAttachments.length === 0) return null;
535
-
536
- return (
537
- <>
538
- <div className="flex flex-wrap gap-2 mt-2">
539
- {imageAttachments.map((attachment) => (
540
- <button
541
- key={attachment.id}
542
- type="button"
543
- onClick={() => setLightboxImage(attachment)}
544
- className="relative group cursor-pointer bg-transparent border-0 p-0"
545
- title={`View ${attachment.filename}`}
546
- >
547
- <img
548
- src={attachment.data || attachment.url}
549
- alt={attachment.filename}
550
- className="max-h-48 max-w-xs rounded-lg border border-border-subtle object-cover transition-all duration-150 group-hover:border-accent-cyan/50 group-hover:shadow-[0_0_8px_rgba(0,217,255,0.2)]"
551
- loading="lazy"
552
- />
553
- <div className="absolute inset-0 bg-black/0 group-hover:bg-black/10 rounded-lg transition-colors flex items-center justify-center opacity-0 group-hover:opacity-100">
554
- <svg
555
- width="24"
556
- height="24"
557
- viewBox="0 0 24 24"
558
- fill="none"
559
- stroke="white"
560
- strokeWidth="2"
561
- className="drop-shadow-lg"
562
- >
563
- <circle cx="11" cy="11" r="8" />
564
- <line x1="21" y1="21" x2="16.65" y2="16.65" />
565
- <line x1="11" y1="8" x2="11" y2="14" />
566
- <line x1="8" y1="11" x2="14" y2="11" />
567
- </svg>
568
- </div>
569
- </button>
570
- ))}
571
- </div>
572
-
573
- {/* Lightbox Modal */}
574
- {lightboxImage && (
575
- <div
576
- className="fixed inset-0 z-[9999] flex items-center justify-center bg-black/80 backdrop-blur-sm"
577
- onClick={() => setLightboxImage(null)}
578
- >
579
- <div className="relative max-w-[90vw] max-h-[90vh]">
580
- <img
581
- src={lightboxImage.data || lightboxImage.url}
582
- alt={lightboxImage.filename}
583
- className="max-w-full max-h-[90vh] rounded-lg shadow-2xl"
584
- onClick={(e) => e.stopPropagation()}
585
- />
586
- <button
587
- type="button"
588
- onClick={() => setLightboxImage(null)}
589
- className="absolute -top-3 -right-3 w-8 h-8 bg-bg-tertiary border border-border-subtle rounded-full flex items-center justify-center text-text-muted hover:text-text-primary hover:bg-bg-card transition-colors shadow-lg"
590
- title="Close"
591
- >
592
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
593
- <line x1="18" y1="6" x2="6" y2="18" />
594
- <line x1="6" y1="6" x2="18" y2="18" />
595
- </svg>
596
- </button>
597
- <div className="absolute bottom-0 left-0 right-0 p-3 bg-gradient-to-t from-black/60 to-transparent rounded-b-lg">
598
- <p className="text-white text-sm truncate">{lightboxImage.filename}</p>
599
- </div>
600
- </div>
601
- </div>
602
- )}
603
- </>
604
- );
605
- }
606
-
607
- /**
608
- * Format timestamp for display
609
- */
610
- function formatTimestamp(timestamp: string | number): string {
611
- const date = new Date(timestamp);
612
- const now = new Date();
613
- const isToday = date.toDateString() === now.toDateString();
614
-
615
- if (isToday) {
616
- return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
617
- }
618
-
619
- const yesterday = new Date(now);
620
- yesterday.setDate(yesterday.getDate() - 1);
621
- const isYesterday = date.toDateString() === yesterday.toDateString();
622
-
623
- if (isYesterday) {
624
- return `Yesterday ${date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`;
625
- }
626
-
627
- return date.toLocaleDateString([], {
628
- month: 'short',
629
- day: 'numeric',
630
- hour: '2-digit',
631
- minute: '2-digit',
632
- });
633
- }
634
-
635
- function EmptyIcon() {
636
- return (
637
- <svg className="mb-4 opacity-50 text-text-muted" width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5">
638
- <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" />
639
- </svg>
640
- );
641
- }
642
-
643
- function ThreadIcon() {
644
- return (
645
- <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
646
- <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" />
647
- </svg>
648
- );
649
- }