agent-relay 1.0.21 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/dist/bridge/shadow-cli.d.ts +17 -0
  2. package/dist/bridge/shadow-cli.d.ts.map +1 -0
  3. package/dist/bridge/shadow-cli.js +75 -0
  4. package/dist/bridge/shadow-cli.js.map +1 -0
  5. package/dist/bridge/shadow-config.d.ts +87 -0
  6. package/dist/bridge/shadow-config.d.ts.map +1 -0
  7. package/dist/bridge/shadow-config.js +134 -0
  8. package/dist/bridge/shadow-config.js.map +1 -0
  9. package/dist/bridge/spawner.d.ts +15 -1
  10. package/dist/bridge/spawner.d.ts.map +1 -1
  11. package/dist/bridge/spawner.js +164 -4
  12. package/dist/bridge/spawner.js.map +1 -1
  13. package/dist/bridge/types.d.ts +55 -0
  14. package/dist/bridge/types.d.ts.map +1 -1
  15. package/dist/cli/index.js +796 -11
  16. package/dist/cli/index.js.map +1 -1
  17. package/dist/cloud/api/auth.d.ts +19 -0
  18. package/dist/cloud/api/auth.d.ts.map +1 -0
  19. package/dist/cloud/api/auth.js +216 -0
  20. package/dist/cloud/api/auth.js.map +1 -0
  21. package/dist/cloud/api/billing.d.ts +17 -0
  22. package/dist/cloud/api/billing.d.ts.map +1 -0
  23. package/dist/cloud/api/billing.js +353 -0
  24. package/dist/cloud/api/billing.js.map +1 -0
  25. package/dist/cloud/api/coordinators.d.ts +8 -0
  26. package/dist/cloud/api/coordinators.d.ts.map +1 -0
  27. package/dist/cloud/api/coordinators.js +347 -0
  28. package/dist/cloud/api/coordinators.js.map +1 -0
  29. package/dist/cloud/api/daemons.d.ts +12 -0
  30. package/dist/cloud/api/daemons.d.ts.map +1 -0
  31. package/dist/cloud/api/daemons.js +320 -0
  32. package/dist/cloud/api/daemons.js.map +1 -0
  33. package/dist/cloud/api/middleware/planLimits.d.ts +36 -0
  34. package/dist/cloud/api/middleware/planLimits.d.ts.map +1 -0
  35. package/dist/cloud/api/middleware/planLimits.js +164 -0
  36. package/dist/cloud/api/middleware/planLimits.js.map +1 -0
  37. package/dist/cloud/api/onboarding.d.ts +8 -0
  38. package/dist/cloud/api/onboarding.d.ts.map +1 -0
  39. package/dist/cloud/api/onboarding.js +407 -0
  40. package/dist/cloud/api/onboarding.js.map +1 -0
  41. package/dist/cloud/api/providers.d.ts +7 -0
  42. package/dist/cloud/api/providers.d.ts.map +1 -0
  43. package/dist/cloud/api/providers.js +435 -0
  44. package/dist/cloud/api/providers.js.map +1 -0
  45. package/dist/cloud/api/repos.d.ts +7 -0
  46. package/dist/cloud/api/repos.d.ts.map +1 -0
  47. package/dist/cloud/api/repos.js +314 -0
  48. package/dist/cloud/api/repos.js.map +1 -0
  49. package/dist/cloud/api/teams.d.ts +7 -0
  50. package/dist/cloud/api/teams.d.ts.map +1 -0
  51. package/dist/cloud/api/teams.js +279 -0
  52. package/dist/cloud/api/teams.js.map +1 -0
  53. package/dist/cloud/api/usage.d.ts +7 -0
  54. package/dist/cloud/api/usage.d.ts.map +1 -0
  55. package/dist/cloud/api/usage.js +98 -0
  56. package/dist/cloud/api/usage.js.map +1 -0
  57. package/dist/cloud/api/workspaces.d.ts +7 -0
  58. package/dist/cloud/api/workspaces.d.ts.map +1 -0
  59. package/dist/cloud/api/workspaces.js +510 -0
  60. package/dist/cloud/api/workspaces.js.map +1 -0
  61. package/dist/cloud/billing/index.d.ts +9 -0
  62. package/dist/cloud/billing/index.d.ts.map +1 -0
  63. package/dist/cloud/billing/index.js +9 -0
  64. package/dist/cloud/billing/index.js.map +1 -0
  65. package/dist/cloud/billing/plans.d.ts +39 -0
  66. package/dist/cloud/billing/plans.d.ts.map +1 -0
  67. package/dist/cloud/billing/plans.js +232 -0
  68. package/dist/cloud/billing/plans.js.map +1 -0
  69. package/dist/cloud/billing/service.d.ts +80 -0
  70. package/dist/cloud/billing/service.d.ts.map +1 -0
  71. package/dist/cloud/billing/service.js +388 -0
  72. package/dist/cloud/billing/service.js.map +1 -0
  73. package/dist/cloud/billing/types.d.ts +135 -0
  74. package/dist/cloud/billing/types.d.ts.map +1 -0
  75. package/dist/cloud/billing/types.js +7 -0
  76. package/dist/cloud/billing/types.js.map +1 -0
  77. package/dist/cloud/config.d.ts +59 -0
  78. package/dist/cloud/config.d.ts.map +1 -0
  79. package/dist/cloud/config.js +83 -0
  80. package/dist/cloud/config.js.map +1 -0
  81. package/dist/cloud/db/drizzle.d.ts +132 -0
  82. package/dist/cloud/db/drizzle.d.ts.map +1 -0
  83. package/dist/cloud/db/drizzle.js +613 -0
  84. package/dist/cloud/db/drizzle.js.map +1 -0
  85. package/dist/cloud/db/index.d.ts +30 -0
  86. package/dist/cloud/db/index.d.ts.map +1 -0
  87. package/dist/cloud/db/index.js +44 -0
  88. package/dist/cloud/db/index.js.map +1 -0
  89. package/dist/cloud/db/schema.d.ts +1792 -0
  90. package/dist/cloud/db/schema.d.ts.map +1 -0
  91. package/dist/cloud/db/schema.js +234 -0
  92. package/dist/cloud/db/schema.js.map +1 -0
  93. package/dist/cloud/index.d.ts +11 -0
  94. package/dist/cloud/index.d.ts.map +1 -0
  95. package/dist/cloud/index.js +37 -0
  96. package/dist/cloud/index.js.map +1 -0
  97. package/dist/cloud/provisioner/index.d.ts +51 -0
  98. package/dist/cloud/provisioner/index.d.ts.map +1 -0
  99. package/dist/cloud/provisioner/index.js +676 -0
  100. package/dist/cloud/provisioner/index.js.map +1 -0
  101. package/dist/cloud/server.d.ts +16 -0
  102. package/dist/cloud/server.d.ts.map +1 -0
  103. package/dist/cloud/server.js +190 -0
  104. package/dist/cloud/server.js.map +1 -0
  105. package/dist/cloud/services/coordinator.d.ts +62 -0
  106. package/dist/cloud/services/coordinator.d.ts.map +1 -0
  107. package/dist/cloud/services/coordinator.js +389 -0
  108. package/dist/cloud/services/coordinator.js.map +1 -0
  109. package/dist/cloud/services/planLimits.d.ts +110 -0
  110. package/dist/cloud/services/planLimits.d.ts.map +1 -0
  111. package/dist/cloud/services/planLimits.js +254 -0
  112. package/dist/cloud/services/planLimits.js.map +1 -0
  113. package/dist/cloud/vault/index.d.ts +76 -0
  114. package/dist/cloud/vault/index.d.ts.map +1 -0
  115. package/dist/cloud/vault/index.js +219 -0
  116. package/dist/cloud/vault/index.js.map +1 -0
  117. package/dist/daemon/agent-manager.d.ts +87 -0
  118. package/dist/daemon/agent-manager.d.ts.map +1 -0
  119. package/dist/daemon/agent-manager.js +412 -0
  120. package/dist/daemon/agent-manager.js.map +1 -0
  121. package/dist/daemon/agent-registry.d.ts +2 -0
  122. package/dist/daemon/agent-registry.d.ts.map +1 -1
  123. package/dist/daemon/agent-registry.js +3 -0
  124. package/dist/daemon/agent-registry.js.map +1 -1
  125. package/dist/daemon/api.d.ts +69 -0
  126. package/dist/daemon/api.d.ts.map +1 -0
  127. package/dist/daemon/api.js +425 -0
  128. package/dist/daemon/api.js.map +1 -0
  129. package/dist/daemon/cloud-sync.d.ts +101 -0
  130. package/dist/daemon/cloud-sync.d.ts.map +1 -0
  131. package/dist/daemon/cloud-sync.js +261 -0
  132. package/dist/daemon/cloud-sync.js.map +1 -0
  133. package/dist/daemon/index.d.ts +4 -0
  134. package/dist/daemon/index.d.ts.map +1 -1
  135. package/dist/daemon/index.js +6 -0
  136. package/dist/daemon/index.js.map +1 -1
  137. package/dist/daemon/orchestrator.d.ts +155 -0
  138. package/dist/daemon/orchestrator.d.ts.map +1 -0
  139. package/dist/daemon/orchestrator.js +736 -0
  140. package/dist/daemon/orchestrator.js.map +1 -0
  141. package/dist/daemon/router.d.ts +24 -0
  142. package/dist/daemon/router.d.ts.map +1 -1
  143. package/dist/daemon/router.js +71 -1
  144. package/dist/daemon/router.js.map +1 -1
  145. package/dist/daemon/server.d.ts +37 -0
  146. package/dist/daemon/server.d.ts.map +1 -1
  147. package/dist/daemon/server.js +191 -16
  148. package/dist/daemon/server.js.map +1 -1
  149. package/dist/daemon/types.d.ts +127 -0
  150. package/dist/daemon/types.d.ts.map +1 -0
  151. package/dist/daemon/types.js +6 -0
  152. package/dist/daemon/types.js.map +1 -0
  153. package/dist/daemon/workspace-manager.d.ts +75 -0
  154. package/dist/daemon/workspace-manager.d.ts.map +1 -0
  155. package/dist/daemon/workspace-manager.js +289 -0
  156. package/dist/daemon/workspace-manager.js.map +1 -0
  157. package/dist/dashboard/out/404.html +1 -1
  158. package/dist/dashboard/out/_next/static/chunks/693-7b3301d8f6bc5014.js +1 -0
  159. package/dist/dashboard/out/_next/static/chunks/713-f78477eb185f1f4d.js +1 -0
  160. package/dist/dashboard/out/_next/static/chunks/766-e53e1cfe39b0b5b5.js +1 -0
  161. package/dist/dashboard/out/_next/static/chunks/900-037c64bfd797fb2a.js +1 -0
  162. package/dist/dashboard/out/_next/static/chunks/app/app/page-e3d9e1f4466b9bae.js +1 -0
  163. package/dist/dashboard/out/_next/static/chunks/app/history/page-b6edd4dde8d08194.js +1 -0
  164. package/dist/dashboard/out/_next/static/chunks/app/layout-2433bb48965f4333.js +1 -0
  165. package/dist/dashboard/out/_next/static/chunks/app/metrics/page-e68825a81db67ba1.js +1 -0
  166. package/dist/dashboard/out/_next/static/chunks/app/page-cc108bf68c8a657f.js +1 -0
  167. package/dist/dashboard/out/_next/static/chunks/app/pricing/page-d80e03a5297f95b6.js +1 -0
  168. package/dist/dashboard/out/_next/static/chunks/main-app-5d692157a8eb1fd9.js +1 -0
  169. package/dist/dashboard/out/_next/static/chunks/{main-e0a1f53fe0617a63.js → main-c2f423b9c9f4591b.js} +1 -1
  170. package/dist/dashboard/out/_next/static/chunks/{webpack-c81f7fd28659d64f.js → webpack-a5acc2831d094776.js} +1 -1
  171. package/dist/dashboard/out/_next/static/css/79b80143647a07d7.css +1 -0
  172. package/dist/dashboard/out/_next/static/css/8cf277370ad48cfe.css +1 -0
  173. package/dist/dashboard/out/alt-logos/agent-relay-logo-128.png +0 -0
  174. package/dist/dashboard/out/alt-logos/agent-relay-logo-256.png +0 -0
  175. package/dist/dashboard/out/alt-logos/agent-relay-logo-32.png +0 -0
  176. package/dist/dashboard/out/alt-logos/agent-relay-logo-512.png +0 -0
  177. package/dist/dashboard/out/alt-logos/agent-relay-logo-64.png +0 -0
  178. package/dist/dashboard/out/alt-logos/agent-relay-logo.svg +45 -0
  179. package/dist/dashboard/out/alt-logos/logo.svg +38 -0
  180. package/dist/dashboard/out/alt-logos/monogram-logo-128.png +0 -0
  181. package/dist/dashboard/out/alt-logos/monogram-logo-256.png +0 -0
  182. package/dist/dashboard/out/alt-logos/monogram-logo-32.png +0 -0
  183. package/dist/dashboard/out/alt-logos/monogram-logo-512.png +0 -0
  184. package/dist/dashboard/out/alt-logos/monogram-logo-64.png +0 -0
  185. package/dist/dashboard/out/alt-logos/monogram-logo.svg +38 -0
  186. package/dist/dashboard/out/app.html +14 -0
  187. package/dist/dashboard/out/app.txt +7 -0
  188. package/dist/dashboard/out/history.html +1 -0
  189. package/dist/dashboard/out/history.txt +7 -0
  190. package/dist/dashboard/out/index.html +1 -1
  191. package/dist/dashboard/out/index.txt +2 -2
  192. package/dist/dashboard/out/metrics.html +1 -515
  193. package/dist/dashboard/out/metrics.txt +2 -2
  194. package/dist/dashboard/out/pricing.html +13 -0
  195. package/dist/dashboard/out/pricing.txt +7 -0
  196. package/dist/dashboard-server/metrics.d.ts.map +1 -1
  197. package/dist/dashboard-server/metrics.js +3 -2
  198. package/dist/dashboard-server/metrics.js.map +1 -1
  199. package/dist/dashboard-server/server.d.ts.map +1 -1
  200. package/dist/dashboard-server/server.js +1279 -56
  201. package/dist/dashboard-server/server.js.map +1 -1
  202. package/dist/protocol/types.d.ts +10 -1
  203. package/dist/protocol/types.d.ts.map +1 -1
  204. package/dist/resiliency/context-persistence.d.ts +140 -0
  205. package/dist/resiliency/context-persistence.d.ts.map +1 -0
  206. package/dist/resiliency/context-persistence.js +397 -0
  207. package/dist/resiliency/context-persistence.js.map +1 -0
  208. package/dist/resiliency/health-monitor.d.ts +97 -0
  209. package/dist/resiliency/health-monitor.d.ts.map +1 -0
  210. package/dist/resiliency/health-monitor.js +291 -0
  211. package/dist/resiliency/health-monitor.js.map +1 -0
  212. package/dist/resiliency/index.d.ts +63 -0
  213. package/dist/resiliency/index.d.ts.map +1 -0
  214. package/dist/resiliency/index.js +63 -0
  215. package/dist/resiliency/index.js.map +1 -0
  216. package/dist/resiliency/logger.d.ts +114 -0
  217. package/dist/resiliency/logger.d.ts.map +1 -0
  218. package/dist/resiliency/logger.js +250 -0
  219. package/dist/resiliency/logger.js.map +1 -0
  220. package/dist/resiliency/metrics.d.ts +115 -0
  221. package/dist/resiliency/metrics.d.ts.map +1 -0
  222. package/dist/resiliency/metrics.js +239 -0
  223. package/dist/resiliency/metrics.js.map +1 -0
  224. package/dist/resiliency/provider-context.d.ts +100 -0
  225. package/dist/resiliency/provider-context.d.ts.map +1 -0
  226. package/dist/resiliency/provider-context.js +360 -0
  227. package/dist/resiliency/provider-context.js.map +1 -0
  228. package/dist/resiliency/supervisor.d.ts +109 -0
  229. package/dist/resiliency/supervisor.d.ts.map +1 -0
  230. package/dist/resiliency/supervisor.js +337 -0
  231. package/dist/resiliency/supervisor.js.map +1 -0
  232. package/dist/storage/adapter.d.ts +2 -0
  233. package/dist/storage/adapter.d.ts.map +1 -1
  234. package/dist/storage/adapter.js +12 -2
  235. package/dist/storage/adapter.js.map +1 -1
  236. package/dist/storage/sqlite-adapter.d.ts.map +1 -1
  237. package/dist/storage/sqlite-adapter.js +18 -14
  238. package/dist/storage/sqlite-adapter.js.map +1 -1
  239. package/dist/utils/index.d.ts +1 -0
  240. package/dist/utils/index.d.ts.map +1 -1
  241. package/dist/utils/index.js +1 -0
  242. package/dist/utils/index.js.map +1 -1
  243. package/dist/utils/logger.d.ts +40 -0
  244. package/dist/utils/logger.d.ts.map +1 -0
  245. package/dist/utils/logger.js +84 -0
  246. package/dist/utils/logger.js.map +1 -0
  247. package/dist/wrapper/client.d.ts +16 -1
  248. package/dist/wrapper/client.d.ts.map +1 -1
  249. package/dist/wrapper/client.js +32 -1
  250. package/dist/wrapper/client.js.map +1 -1
  251. package/dist/wrapper/parser.d.ts +3 -0
  252. package/dist/wrapper/parser.d.ts.map +1 -1
  253. package/dist/wrapper/parser.js +121 -18
  254. package/dist/wrapper/parser.js.map +1 -1
  255. package/dist/wrapper/pty-wrapper.d.ts +28 -1
  256. package/dist/wrapper/pty-wrapper.d.ts.map +1 -1
  257. package/dist/wrapper/pty-wrapper.js +166 -30
  258. package/dist/wrapper/pty-wrapper.js.map +1 -1
  259. package/dist/wrapper/tmux-wrapper.d.ts +5 -0
  260. package/dist/wrapper/tmux-wrapper.d.ts.map +1 -1
  261. package/dist/wrapper/tmux-wrapper.js +58 -18
  262. package/dist/wrapper/tmux-wrapper.js.map +1 -1
  263. package/docs/CLOUD-ARCHITECTURE.md +652 -0
  264. package/docs/CLOUD-ONBOARDING-DESIGN.md +1983 -0
  265. package/docs/TESTING_PRESENCE_FEATURES.md +327 -0
  266. package/docs/agent-relay-snippet.md +107 -4
  267. package/docs/guides/CLOUD.md +236 -0
  268. package/docs/guides/LOCAL.md +535 -0
  269. package/docs/guides/SELF-HOSTED.md +494 -0
  270. package/docs/proposals/shadow-as-subagent.md +765 -0
  271. package/docs/proposals/slack-bot-integration.md +1457 -0
  272. package/package.json +33 -4
  273. package/dist/dashboard/out/_next/static/chunks/app/layout-c9d8c5d95e48c6bf.js +0 -1
  274. package/dist/dashboard/out/_next/static/chunks/app/metrics/page-8aa9936bc6c771ab.js +0 -1
  275. package/dist/dashboard/out/_next/static/chunks/app/page-49055e5d2b5e34ec.js +0 -1
  276. package/dist/dashboard/out/_next/static/chunks/main-app-bae2e535de00de50.js +0 -1
  277. package/dist/dashboard/out/_next/static/css/50ed6996e3df7bdd.css +0 -1
  278. /package/dist/dashboard/out/_next/static/{gZXwjIKGDKJ0hiTH-HMeJ → 6HHWb2ZmnJ4OSm0zUP7h4}/_buildManifest.js +0 -0
  279. /package/dist/dashboard/out/_next/static/{gZXwjIKGDKJ0hiTH-HMeJ → 6HHWb2ZmnJ4OSm0zUP7h4}/_ssgManifest.js +0 -0
  280. /package/dist/dashboard/out/_next/static/chunks/{117-3bef7b19f3e60751.js → 117-b2cd8d6485aacf2b.js} +0 -0
  281. /package/dist/dashboard/out/_next/static/chunks/{648-6cf686106c891ad3.js → 648-8f3f26864ce515e5.js} +0 -0
  282. /package/dist/dashboard/out/_next/static/chunks/app/_not-found/{page-8ff6572bc7c9bc61.js → page-0b990dbb71d72a98.js} +0 -0
  283. /package/dist/dashboard/out/_next/static/chunks/{fd9d1056-26bd8d656b496dba.js → fd9d1056-bf46c09eb57e019c.js} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-relay",
3
- "version": "1.0.21",
3
+ "version": "1.1.0",
4
4
  "description": "Real-time agent-to-agent communication system",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -25,7 +25,12 @@
25
25
  "build": "npm run clean && tsc && npm run build:dashboard",
26
26
  "build:dashboard": "cd src/dashboard && npm run build",
27
27
  "postbuild": "chmod +x dist/cli/index.js && mkdir -p dist/dashboard && cp -r src/dashboard/out dist/dashboard/",
28
- "dev": "tsc -w",
28
+ "dev:watch": "tsc -w",
29
+ "predev": "npm run clean && tsc && chmod +x dist/cli/index.js",
30
+ "dev": "concurrently -n daemon,next -c blue,magenta \"npm run dev:daemon\" \"npm run dev:next\"",
31
+ "dev:daemon": "node dist/cli/index.js up --port 3889",
32
+ "dev:next": "cd src/dashboard && npm run dev",
33
+ "dev:simple": "node dist/cli/index.js up --port 3888",
29
34
  "dev:local": "npm run build && npm link && echo '✓ agent-relay linked globally'",
30
35
  "dev:unlink": "npm unlink -g agent-relay && echo '✓ agent-relay unlinked'",
31
36
  "dev:rebuild": "npm run build && echo '✓ Rebuilt (linked version updated)'",
@@ -38,7 +43,17 @@
38
43
  "test:coverage": "vitest run --coverage",
39
44
  "test:watch": "vitest",
40
45
  "lint": "eslint src --ext .ts",
41
- "clean": "rm -rf dist"
46
+ "clean": "rm -rf dist",
47
+ "db:generate": "drizzle-kit generate",
48
+ "db:migrate": "drizzle-kit migrate",
49
+ "db:push": "drizzle-kit push",
50
+ "db:studio": "drizzle-kit studio",
51
+ "services:up": "docker compose -f docker-compose.dev.yml up -d postgres redis && echo '✓ Postgres and Redis running'",
52
+ "services:down": "docker compose -f docker-compose.dev.yml down",
53
+ "services:logs": "docker compose -f docker-compose.dev.yml logs -f postgres redis",
54
+ "cloud:api": "node dist/cloud/index.js",
55
+ "precloud": "npm run clean && tsc && chmod +x dist/cli/index.js && npm run services:up",
56
+ "cloud": "concurrently -n api,daemon,dashboard -c cyan,blue,magenta \"npm run cloud:api\" \"npm run dev:daemon\" \"npm run dev:dashboard\""
42
57
  },
43
58
  "keywords": [
44
59
  "agent",
@@ -65,22 +80,36 @@
65
80
  "chokidar": "^5.0.0",
66
81
  "commander": "^12.1.0",
67
82
  "compare-versions": "^6.1.1",
83
+ "connect-redis": "^9.0.0",
84
+ "cors": "^2.8.5",
68
85
  "dotenv": "^17.2.3",
86
+ "drizzle-orm": "^0.45.1",
69
87
  "express": "^5.2.1",
88
+ "express-session": "^1.18.2",
89
+ "helmet": "^8.1.0",
70
90
  "http-proxy-middleware": "^3.0.5",
71
91
  "node-pty": "1.0.0",
92
+ "pg": "^8.16.3",
93
+ "redis": "^5.10.0",
94
+ "stripe": "^20.1.0",
72
95
  "uuid": "^10.0.0",
73
96
  "ws": "^8.18.3"
74
97
  },
75
98
  "devDependencies": {
76
99
  "@types/better-sqlite3": "^7.6.13",
100
+ "@types/cors": "^2.8.19",
77
101
  "@types/express": "^5.0.6",
78
- "@types/node": "^22.10.2",
102
+ "@types/express-session": "^1.18.2",
103
+ "@types/helmet": "^0.0.48",
104
+ "@types/node": "^22.19.3",
105
+ "@types/pg": "^8.16.0",
79
106
  "@types/uuid": "^10.0.0",
80
107
  "@types/ws": "^8.18.1",
81
108
  "@typescript-eslint/eslint-plugin": "^8.18.2",
82
109
  "@typescript-eslint/parser": "^8.18.2",
83
110
  "@vitest/coverage-v8": "^2.1.8",
111
+ "concurrently": "^9.2.1",
112
+ "drizzle-kit": "^0.31.8",
84
113
  "esbuild": "^0.24.0",
85
114
  "eslint": "^8.57.1",
86
115
  "jsdom": "^25.0.1",
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[185],{7121:function(n,e,u){Promise.resolve().then(u.t.bind(u,7960,23))},7960:function(){}},function(n){n.O(0,[587,971,117,744],function(){return n(n.s=7121)}),_N_E=n.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[860],{1766:function(n,e,t){Promise.resolve().then(t.bind(t,5804))},5804:function(n,e,t){"use strict";t.r(e),t.d(e,{default:function(){return x}});var s=t(7437),a=t(2265),i=t(7648);let l=["#4a9eff","#b388ff","#ff9e40","#00e676","#ff5c5c","#00ffc8"];function r(n){let e=0;for(let t=0;t<n.length;t++)e=n.charCodeAt(t)+((e<<5)-e);return l[Math.abs(e)%l.length]}function c(n){return n.slice(0,2).toUpperCase()}function o(n){return n<60?"".concat(n,"s"):n<3600?"".concat(Math.floor(n/60),"m"):n<86400?"".concat(Math.floor(n/3600),"h ").concat(Math.floor(n%3600/60),"m"):"".concat(Math.floor(n/86400),"d ").concat(Math.floor(n%86400/3600),"h")}function d(n){return new Date(n).toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}function x(){var n,e,t,l;let[x,g]=(0,a.useState)(null),[m,u]=(0,a.useState)(null),[f,b]=(0,a.useState)(!0);if((0,a.useEffect)(()=>{let n=async()=>{try{let n=await fetch("/api/metrics");if(!n.ok)throw Error("Failed to fetch metrics");let e=await n.json();g(e),u(null)}catch(n){u(n instanceof Error?n.message:"Failed to load metrics")}finally{b(!1)}};n();let e=setInterval(n,5e3);return()=>clearInterval(e)},[]),f)return(0,s.jsxs)("div",{className:"metrics-page",children:[(0,s.jsx)("style",{children:p}),(0,s.jsxs)("div",{className:"loading",children:[(0,s.jsx)("div",{className:"spinner"}),(0,s.jsx)("p",{children:"Loading metrics..."})]})]});if(m||!x)return(0,s.jsxs)("div",{className:"metrics-page",children:[(0,s.jsx)("style",{children:p}),(0,s.jsxs)("div",{className:"error-state",children:[(0,s.jsx)("p",{children:m||"No metrics available"}),(0,s.jsx)("button",{onClick:()=>window.location.reload(),children:"Retry"})]})]});let j=(null!==(t=null===(n=x.sessions)||void 0===n?void 0:n.errorRate)&&void 0!==t?t:0)<=1?"healthy":(null!==(l=null===(e=x.sessions)||void 0===e?void 0:e.errorRate)&&void 0!==l?l:0)<=5?"warning":"critical";return(0,s.jsxs)("div",{className:"metrics-page",children:[(0,s.jsx)("style",{children:p}),(0,s.jsx)("header",{className:"header",children:(0,s.jsxs)("div",{className:"header-content",children:[(0,s.jsxs)("div",{className:"header-left",children:[(0,s.jsxs)(i.default,{href:"/",className:"back-link",children:[(0,s.jsx)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:(0,s.jsx)("path",{d:"M19 12H5M12 19l-7-7 7-7"})}),"Dashboard"]}),(0,s.jsxs)("div",{className:"logo",children:[(0,s.jsx)("div",{className:"logo-icon",children:(0,s.jsxs)("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"white",strokeWidth:"2",children:[(0,s.jsx)("path",{d:"M3 3v18h18"}),(0,s.jsx)("path",{d:"M18 17V9"}),(0,s.jsx)("path",{d:"M13 17V5"}),(0,s.jsx)("path",{d:"M8 17v-3"})]})}),(0,s.jsxs)("div",{className:"logo-text",children:["Agent ",(0,s.jsx)("span",{children:"Metrics"})]})]})]}),(0,s.jsxs)("div",{className:"live-indicator",children:[(0,s.jsx)("span",{className:"live-dot"}),"LIVE"]})]})}),(0,s.jsxs)("main",{className:"main",children:[(0,s.jsxs)("div",{className:"stats-grid",children:[(0,s.jsxs)("div",{className:"stat-card",children:[(0,s.jsx)("div",{className:"stat-label",children:"Total Agents"}),(0,s.jsx)("div",{className:"stat-value accent-cyan",children:x.totalAgents}),(0,s.jsxs)("div",{className:"stat-subtext",children:[x.onlineAgents," online / ",x.offlineAgents," offline"]})]}),(0,s.jsxs)("div",{className:"stat-card",children:[(0,s.jsx)("div",{className:"stat-label",children:"Online Now"}),(0,s.jsx)("div",{className:"stat-value accent-green",children:x.onlineAgents}),(0,s.jsxs)("div",{className:"stat-subtext",children:[x.totalAgents>0?Math.round(x.onlineAgents/x.totalAgents*100):0,"% availability"]})]}),(0,s.jsxs)("div",{className:"stat-card",children:[(0,s.jsx)("div",{className:"stat-label",children:"Total Messages"}),(0,s.jsx)("div",{className:"stat-value accent-blue",children:x.totalMessages.toLocaleString()}),(0,s.jsx)("div",{className:"stat-subtext",children:"all time"})]}),(0,s.jsxs)("div",{className:"stat-card",children:[(0,s.jsx)("div",{className:"stat-label",children:"Avg. Throughput"}),(0,s.jsx)("div",{className:"stat-value accent-orange",children:x.throughput.avgMessagesPerMinute}),(0,s.jsx)("div",{className:"stat-subtext",children:"messages / minute"})]})]}),(0,s.jsxs)("section",{className:"section",children:[(0,s.jsx)("div",{className:"section-header",children:(0,s.jsx)("h2",{className:"section-title",children:"Message Throughput"})}),(0,s.jsx)("div",{className:"throughput-panel",children:(0,s.jsxs)("div",{className:"throughput-grid",children:[(0,s.jsx)(h,{value:x.throughput.messagesLastMinute,label:"Last Minute",max:10}),(0,s.jsx)(h,{value:x.throughput.messagesLastHour,label:"Last Hour",max:100}),(0,s.jsx)(h,{value:x.throughput.messagesLast24Hours,label:"Last 24 Hours",max:1e3}),(0,s.jsx)(h,{value:x.throughput.avgMessagesPerMinute,label:"Avg / Min",max:5})]})})]}),x.sessions&&(0,s.jsxs)("section",{className:"section",children:[(0,s.jsxs)("div",{className:"section-header",children:[(0,s.jsx)("h2",{className:"section-title",children:"Session Lifecycle"}),(0,s.jsxs)("span",{className:"error-rate-indicator ".concat(j),children:[(x.sessions.errorRate||0).toFixed(1),"% error rate"]})]}),(0,s.jsxs)("div",{className:"lifecycle-panel",children:[(0,s.jsxs)("div",{className:"lifecycle-grid",children:[(0,s.jsxs)("div",{className:"lifecycle-item",children:[(0,s.jsx)("div",{className:"lifecycle-value accent-purple",children:x.sessions.totalSessions}),(0,s.jsx)("div",{className:"lifecycle-label",children:"Total Sessions"})]}),(0,s.jsxs)("div",{className:"lifecycle-item",children:[(0,s.jsx)("div",{className:"lifecycle-value accent-blue",children:x.sessions.activeSessions}),(0,s.jsx)("div",{className:"lifecycle-label",children:"Active"})]}),(0,s.jsxs)("div",{className:"lifecycle-item",children:[(0,s.jsx)("div",{className:"lifecycle-value accent-green",children:x.sessions.closedByAgent}),(0,s.jsx)("div",{className:"lifecycle-label",children:"Clean Close"})]}),(0,s.jsxs)("div",{className:"lifecycle-item",children:[(0,s.jsx)("div",{className:"lifecycle-value accent-orange",children:x.sessions.closedByDisconnect}),(0,s.jsx)("div",{className:"lifecycle-label",children:"Disconnect"})]}),(0,s.jsxs)("div",{className:"lifecycle-item",children:[(0,s.jsx)("div",{className:"lifecycle-value accent-red",children:x.sessions.closedByError}),(0,s.jsx)("div",{className:"lifecycle-label",children:"Error"})]})]}),x.sessions.recentSessions&&x.sessions.recentSessions.length>0&&(0,s.jsxs)("table",{className:"sessions-table",children:[(0,s.jsx)("thead",{children:(0,s.jsxs)("tr",{children:[(0,s.jsx)("th",{children:"Agent"}),(0,s.jsx)("th",{children:"Status"}),(0,s.jsx)("th",{children:"Messages"}),(0,s.jsx)("th",{children:"Started"}),(0,s.jsx)("th",{children:"Duration"})]})}),(0,s.jsx)("tbody",{children:x.sessions.recentSessions.slice(0,5).map((n,e)=>{let t=new Date(n.startedAt),a=Math.floor(((n.endedAt?new Date(n.endedAt):new Date).getTime()-t.getTime())/1e3),i=n.closedBy||"active",l=n.closedBy?"agent"===n.closedBy?"Clean":"disconnect"===n.closedBy?"Disconnect":"Error":"Active";return(0,s.jsxs)("tr",{children:[(0,s.jsx)("td",{children:(0,s.jsxs)("div",{className:"agent-name",children:[(0,s.jsx)("div",{className:"agent-avatar",style:{background:r(n.agentName)},children:c(n.agentName)}),(0,s.jsx)("span",{className:"agent-name-text",children:n.agentName})]})}),(0,s.jsx)("td",{children:(0,s.jsx)("span",{className:"closed-badge ".concat(i),children:l})}),(0,s.jsx)("td",{className:"metric-cell",children:n.messageCount}),(0,s.jsx)("td",{className:"uptime-cell",children:d(n.startedAt)}),(0,s.jsx)("td",{className:"uptime-cell",children:o(a)})]},e)})})]})]})]}),(0,s.jsxs)("section",{className:"section",children:[(0,s.jsx)("div",{className:"section-header",children:(0,s.jsx)("h2",{className:"section-title",children:"Agent Health"})}),(0,s.jsx)("div",{className:"agents-table-container",children:0===x.agents.length?(0,s.jsxs)("div",{className:"empty-state",children:[(0,s.jsxs)("svg",{className:"empty-state-icon",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",children:[(0,s.jsx)("path",{d:"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"}),(0,s.jsx)("circle",{cx:"12",cy:"7",r:"4"})]}),(0,s.jsx)("p",{className:"empty-state-text",children:"No agents registered yet"})]}):(0,s.jsxs)("table",{className:"agents-table",children:[(0,s.jsx)("thead",{children:(0,s.jsxs)("tr",{children:[(0,s.jsx)("th",{children:"Agent"}),(0,s.jsx)("th",{children:"Status"}),(0,s.jsx)("th",{children:"Messages Sent"}),(0,s.jsx)("th",{children:"Messages Received"}),(0,s.jsx)("th",{children:"Uptime"}),(0,s.jsx)("th",{children:"Last Seen"})]})}),(0,s.jsx)("tbody",{children:x.agents.map(n=>(0,s.jsxs)("tr",{children:[(0,s.jsx)("td",{children:(0,s.jsxs)("div",{className:"agent-name",children:[(0,s.jsx)("div",{className:"agent-avatar",style:{background:r(n.name)},children:c(n.name)}),(0,s.jsx)("span",{className:"agent-name-text",children:n.name})]})}),(0,s.jsx)("td",{children:(0,s.jsx)("span",{className:"status-badge ".concat(n.isOnline?"online":"offline"),children:n.isOnline?"Online":"Offline"})}),(0,s.jsx)("td",{className:"metric-cell sent",children:n.messagesSent.toLocaleString()}),(0,s.jsx)("td",{className:"metric-cell received",children:n.messagesReceived.toLocaleString()}),(0,s.jsx)("td",{className:"uptime-cell",children:o(n.uptimeSeconds)}),(0,s.jsx)("td",{className:"uptime-cell",children:d(n.lastSeen)})]},n.name))})]})})]}),(0,s.jsxs)("div",{className:"last-updated",children:["Last updated: ",d(x.timestamp)]})]})]})}function h(n){let{value:e,label:t,max:a}=n,i=Math.min(e/a*100,100);return(0,s.jsxs)("div",{className:"throughput-item",children:[(0,s.jsx)("div",{className:"throughput-value",children:e}),(0,s.jsx)("div",{className:"throughput-label",children:t}),(0,s.jsx)("div",{className:"throughput-bar",children:(0,s.jsx)("div",{className:"throughput-bar-fill",style:{width:"".concat(i,"%")}})})]})}let p="\n .metrics-page {\n min-height: 100vh;\n background: #1a1d21;\n color: #e8e8e8;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n }\n\n .header {\n position: sticky;\n top: 0;\n z-index: 100;\n background: #1a1a2e;\n border-bottom: 1px solid #2a2a3e;\n padding: 16px 32px;\n }\n\n .header-content {\n max-width: 1400px;\n margin: 0 auto;\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n\n .header-left {\n display: flex;\n align-items: center;\n gap: 16px;\n }\n\n .back-link {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #888;\n text-decoration: none;\n font-size: 14px;\n font-weight: 500;\n padding: 8px 12px;\n border-radius: 6px;\n transition: all 0.2s;\n }\n\n .back-link:hover {\n color: #4a9eff;\n background: rgba(74, 158, 255, 0.1);\n }\n\n .logo {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .logo-icon {\n width: 32px;\n height: 32px;\n background: linear-gradient(135deg, #1e3a5f 0%, #2a4a6e 100%);\n border: 1px solid #3a5a7e;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .logo-text {\n font-size: 18px;\n font-weight: 600;\n letter-spacing: -0.3px;\n }\n\n .logo-text span {\n color: #4a9eff;\n }\n\n .live-indicator {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n background: rgba(34, 197, 94, 0.1);\n border: 1px solid rgba(34, 197, 94, 0.3);\n border-radius: 20px;\n font-family: 'IBM Plex Mono', monospace;\n font-size: 12px;\n font-weight: 500;\n color: #22c55e;\n }\n\n .live-dot {\n width: 8px;\n height: 8px;\n background: #22c55e;\n border-radius: 50%;\n animation: pulse 2s ease-in-out infinite;\n box-shadow: 0 0 10px rgba(34, 197, 94, 0.4);\n }\n\n @keyframes pulse {\n 0%, 100% { opacity: 1; transform: scale(1); }\n 50% { opacity: 0.5; transform: scale(0.9); }\n }\n\n .main {\n position: relative;\n z-index: 1;\n max-width: 1400px;\n margin: 0 auto;\n padding: 24px 32px 48px;\n }\n\n .loading, .error-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100vh;\n gap: 16px;\n }\n\n .spinner {\n width: 32px;\n height: 32px;\n border: 2px solid rgba(255, 255, 255, 0.1);\n border-top-color: #4a9eff;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin {\n to { transform: rotate(360deg); }\n }\n\n .error-state button {\n padding: 10px 20px;\n background: #1264a3;\n color: white;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n }\n\n .stats-grid {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 16px;\n margin-bottom: 24px;\n }\n\n .stat-card {\n background: #222529;\n border: 1px solid #2a2a3e;\n border-radius: 8px;\n padding: 20px;\n transition: all 0.2s ease;\n }\n\n .stat-card:hover {\n border-color: #3a3a4e;\n background: #282c30;\n }\n\n .stat-label {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: #888;\n margin-bottom: 8px;\n }\n\n .stat-value {\n font-family: 'IBM Plex Mono', monospace;\n font-size: 32px;\n font-weight: 700;\n line-height: 1;\n }\n\n .stat-value.accent-cyan { color: #4a9eff; }\n .stat-value.accent-green { color: #22c55e; }\n .stat-value.accent-orange { color: #f59e0b; }\n .stat-value.accent-blue { color: #6366f1; }\n\n .stat-subtext {\n font-size: 12px;\n color: #666;\n margin-top: 8px;\n font-family: 'IBM Plex Mono', monospace;\n }\n\n .section {\n margin-bottom: 24px;\n }\n\n .section-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 12px;\n }\n\n .section-title {\n font-size: 13px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 1px;\n color: #888;\n display: flex;\n align-items: center;\n gap: 10px;\n }\n\n .section-title::before {\n content: '';\n width: 3px;\n height: 14px;\n background: #4a9eff;\n border-radius: 2px;\n }\n\n .throughput-panel, .lifecycle-panel {\n background: #222529;\n border: 1px solid #2a2a3e;\n border-radius: 8px;\n padding: 24px;\n }\n\n .throughput-grid {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 24px;\n }\n\n .throughput-item {\n text-align: center;\n }\n\n .throughput-value {\n font-family: 'IBM Plex Mono', monospace;\n font-size: 40px;\n font-weight: 700;\n color: #4a9eff;\n line-height: 1;\n }\n\n .throughput-label {\n font-size: 12px;\n color: #888;\n margin-top: 8px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .throughput-bar {\n height: 4px;\n background: #2a2a3e;\n border-radius: 2px;\n margin-top: 12px;\n overflow: hidden;\n }\n\n .throughput-bar-fill {\n height: 100%;\n background: linear-gradient(90deg, #4a9eff, #6366f1);\n border-radius: 2px;\n transition: width 0.5s ease;\n }\n\n .lifecycle-grid {\n display: grid;\n grid-template-columns: repeat(5, 1fr);\n gap: 20px;\n }\n\n .lifecycle-item {\n text-align: center;\n }\n\n .lifecycle-value {\n font-family: 'IBM Plex Mono', monospace;\n font-size: 32px;\n font-weight: 700;\n line-height: 1;\n }\n\n .lifecycle-value.accent-purple { color: #a78bfa; }\n .lifecycle-value.accent-red { color: #ef4444; }\n\n .lifecycle-label {\n font-size: 11px;\n color: #888;\n margin-top: 8px;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .error-rate-indicator {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n font-family: 'IBM Plex Mono', monospace;\n }\n\n .error-rate-indicator.healthy {\n background: rgba(34, 197, 94, 0.15);\n color: #22c55e;\n }\n\n .error-rate-indicator.warning {\n background: rgba(245, 158, 11, 0.15);\n color: #f59e0b;\n }\n\n .error-rate-indicator.critical {\n background: rgba(239, 68, 68, 0.15);\n color: #ef4444;\n }\n\n .sessions-table, .agents-table {\n width: 100%;\n border-collapse: collapse;\n margin-top: 16px;\n }\n\n .sessions-table th, .sessions-table td,\n .agents-table th, .agents-table td {\n padding: 12px 16px;\n text-align: left;\n }\n\n .sessions-table th, .agents-table th {\n background: #1a1a2e;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n color: #888;\n border-bottom: 1px solid #2a2a3e;\n }\n\n .sessions-table tr, .agents-table tr {\n border-bottom: 1px solid #2a2a3e;\n }\n\n .sessions-table tr:last-child, .agents-table tr:last-child {\n border-bottom: none;\n }\n\n .agents-table tr:hover {\n background: rgba(74, 158, 255, 0.03);\n }\n\n .agents-table-container {\n background: #222529;\n border: 1px solid #2a2a3e;\n border-radius: 8px;\n overflow: hidden;\n }\n\n .agent-name {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .agent-avatar {\n width: 32px;\n height: 32px;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-weight: 600;\n font-size: 12px;\n color: white;\n }\n\n .agent-name-text {\n font-weight: 600;\n font-family: 'IBM Plex Mono', monospace;\n }\n\n .status-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n }\n\n .status-badge.online {\n background: rgba(34, 197, 94, 0.15);\n color: #22c55e;\n }\n\n .status-badge.offline {\n background: rgba(107, 114, 128, 0.15);\n color: #6b7280;\n }\n\n .status-badge::before {\n content: '';\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: currentColor;\n }\n\n .closed-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 500;\n }\n\n .closed-badge.agent {\n background: rgba(34, 197, 94, 0.15);\n color: #22c55e;\n }\n\n .closed-badge.disconnect {\n background: rgba(245, 158, 11, 0.15);\n color: #f59e0b;\n }\n\n .closed-badge.error {\n background: rgba(239, 68, 68, 0.15);\n color: #ef4444;\n }\n\n .closed-badge.active {\n background: rgba(74, 158, 255, 0.15);\n color: #4a9eff;\n }\n\n .metric-cell {\n font-family: 'IBM Plex Mono', monospace;\n font-size: 14px;\n }\n\n .metric-cell.sent { color: #4a9eff; }\n .metric-cell.received { color: #a78bfa; }\n\n .uptime-cell {\n font-family: 'IBM Plex Mono', monospace;\n font-size: 13px;\n color: #888;\n }\n\n .empty-state {\n padding: 48px 32px;\n text-align: center;\n }\n\n .empty-state-icon {\n width: 48px;\n height: 48px;\n margin: 0 auto 16px;\n color: #666;\n opacity: 0.5;\n }\n\n .empty-state-text {\n color: #666;\n font-size: 14px;\n }\n\n .last-updated {\n text-align: center;\n padding: 20px;\n font-size: 12px;\n color: #666;\n font-family: 'IBM Plex Mono', monospace;\n }\n\n @media (max-width: 1200px) {\n .stats-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n .throughput-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n .lifecycle-grid {\n grid-template-columns: repeat(3, 1fr);\n }\n }\n\n @media (max-width: 768px) {\n .header {\n padding: 12px 16px;\n }\n .main {\n padding: 16px;\n }\n .stats-grid {\n grid-template-columns: 1fr;\n }\n .throughput-grid {\n grid-template-columns: 1fr;\n }\n .lifecycle-grid {\n grid-template-columns: repeat(2, 1fr);\n }\n }\n"}},function(n){n.O(0,[648,971,117,744],function(){return n(n.s=1766)}),_N_E=n.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[931],{8440:function(e,t,n){Promise.resolve().then(n.bind(n,7666))},7666:function(e,t,n){"use strict";n.r(t),n.d(t,{default:function(){return eD}});var s=n(7437),a=n(2265);let l={backend:{primary:"#1264a3",light:"#e8f4fd",dark:"#0d4f82",text:"#ffffff"},frontend:{primary:"#7c3aed",light:"#f3e8ff",dark:"#5b21b6",text:"#ffffff"},infra:{primary:"#ea580c",light:"#fff7ed",dark:"#c2410c",text:"#ffffff"},lead:{primary:"#2bac76",light:"#ecfdf5",dark:"#059669",text:"#ffffff"},test:{primary:"#0d9488",light:"#f0fdfa",dark:"#0f766e",text:"#ffffff"},data:{primary:"#dc2626",light:"#fef2f2",dark:"#b91c1c",text:"#ffffff"},api:{primary:"#2563eb",light:"#eff6ff",dark:"#1d4ed8",text:"#ffffff"},worker:{primary:"#9333ea",light:"#faf5ff",dark:"#7e22ce",text:"#ffffff"},monitor:{primary:"#0891b2",light:"#ecfeff",dark:"#0e7490",text:"#ffffff"},security:{primary:"#be123c",light:"#fff1f2",dark:"#9f1239",text:"#ffffff"}},r=[{primary:"#6366f1",light:"#eef2ff",dark:"#4f46e5",text:"#ffffff"},{primary:"#ec4899",light:"#fdf2f8",dark:"#db2777",text:"#ffffff"},{primary:"#14b8a6",light:"#f0fdfa",dark:"#0d9488",text:"#ffffff"},{primary:"#f59e0b",light:"#fffbeb",dark:"#d97706",text:"#000000"},{primary:"#8b5cf6",light:"#f5f3ff",dark:"#7c3aed",text:"#ffffff"},{primary:"#06b6d4",light:"#ecfeff",dark:"#0891b2",text:"#ffffff"},{primary:"#f43f5e",light:"#fff1f2",dark:"#e11d48",text:"#ffffff"},{primary:"#84cc16",light:"#f7fee7",dark:"#65a30d",text:"#000000"}],i={online:"#22c55e",offline:"#6b7280",busy:"#eab308",processing:"#6366f1",error:"#ef4444",attention:"#ef4444"};function c(e){return e.toLowerCase().split("-").filter(Boolean)}function o(e){return c(e)[0]||e.toLowerCase()}function d(e){let t=o(e);return t in l?l[t]:r[function(e){let t=0;for(let n=0;n<e.length;n++)t=(t<<5)-t+e.charCodeAt(n),t&=t;return Math.abs(t)}(t)%r.length]}function u(e){let t=c(e);return 0===t.length?e.substring(0,2).toUpperCase():t.length>=2?(t[0][0]+t[1][0]).toUpperCase():t[0].substring(0,2).toUpperCase()}function h(e){let t=new Map;for(let n of e){let e=n.team||o(n.name),s=d(n.name),a=t.get(e);a||(a={prefix:e,displayName:g(e),color:s,agents:[],isExpanded:!0},t.set(e,a)),a.agents.push(n)}let n=Array.from(t.values()).sort((e,t)=>e.prefix.localeCompare(t.prefix));for(let e of n)e.agents.sort((e,t)=>e.name.localeCompare(t.name));return n}function m(e){let t=e.split("-").filter(Boolean);return 0===t.length?e:g(t[t.length-1])}function x(e){return e.split("-").filter(Boolean).map(g).join(" > ")}function p(e,t){return t?e.filter(e=>(function(e,t){if(!t)return!0;let n=t.toLowerCase(),s=e.toLowerCase();return!!s.includes(n)||s.split("-").some(e=>e.includes(n))})(e.name,t)):e}function g(e){return e?e.charAt(0).toUpperCase()+e.slice(1):e}function f(e){let t=0,n=0,s=0;for(let a of e)"online"===a.status?t++:"offline"===a.status&&n++,a.needsAttention&&s++;return{total:e.length,online:t,offline:n,needsAttention:s}}function j(e){let{isProcessing:t,processingStartedAt:n,size:l="medium",showElapsed:r=!1}=e,[i,c]=(0,a.useState)(0);return((0,a.useEffect)(()=>{if(!t||!n){c(0);return}let e=()=>{c(Date.now()-n)};e();let s=setInterval(e,1e3);return()=>clearInterval(s)},[t,n]),t)?(0,s.jsxs)("div",{className:"thinking-indicator ".concat({small:"thinking-indicator-small",medium:"thinking-indicator-medium",large:"thinking-indicator-large"}[l]),children:[(0,s.jsxs)("div",{className:"thinking-dots",children:[(0,s.jsx)("span",{className:"thinking-dot"}),(0,s.jsx)("span",{className:"thinking-dot"}),(0,s.jsx)("span",{className:"thinking-dot"})]}),r&&i>0&&(0,s.jsx)("span",{className:"thinking-elapsed",children:(e=>{let t=Math.floor(e/1e3);return t<60?"".concat(t,"s"):"".concat(Math.floor(t/60),"m ").concat(t%60,"s")})(i)})]}):null}function v(e){let{isProcessing:t}=e;return t?(0,s.jsx)("span",{className:"thinking-dot-inline",title:"Processing...",children:(0,s.jsx)("span",{className:"thinking-dot-pulse"})}):null}function y(e){let{agent:t,isSelected:n=!1,showBreadcrumb:a=!1,compact:l=!1,displayNameOverride:r,onClick:c,onMessageClick:o,onReleaseClick:h}=e,p=d(t.name),g=u(t.name),f=r||m(t.name),y=i[t.status]||i.offline,N=()=>{null==c||c(t)},b=e=>{e.stopPropagation(),null==h||h(t)};return l?(0,s.jsxs)("div",{className:"agent-card-compact ".concat(n?"selected":""),onClick:N,style:{"--agent-primary":p.primary,"--agent-light":p.light},children:[(0,s.jsx)("div",{className:"agent-avatar-small",style:{backgroundColor:p.primary},children:(0,s.jsx)("span",{style:{color:p.text},children:g})}),(0,s.jsxs)("div",{className:"agent-compact-info",children:[(0,s.jsx)("span",{className:"agent-name",children:f}),!r&&(0,s.jsx)("span",{className:"agent-breadcrumb-compact",children:x(t.name)})]}),(0,s.jsxs)("div",{className:"agent-compact-actions",children:[t.isSpawned&&h&&(0,s.jsx)("button",{className:"release-btn-compact",onClick:b,title:"Kill agent",children:(0,s.jsx)(w,{})}),t.isProcessing?(0,s.jsx)(v,{isProcessing:!0}):(0,s.jsx)("div",{className:"agent-status-dot",style:{backgroundColor:y}}),t.needsAttention&&(0,s.jsx)("div",{className:"attention-badge"})]})]}):(0,s.jsxs)("div",{className:"agent-card ".concat(n?"selected":""),onClick:N,style:{"--agent-primary":p.primary,"--agent-light":p.light,"--agent-dark":p.dark},children:[(0,s.jsxs)("div",{className:"agent-card-header",children:[(0,s.jsxs)("div",{className:"agent-avatar",style:{backgroundColor:p.primary},children:[(0,s.jsx)("span",{style:{color:p.text},children:g}),(0,s.jsx)("div",{className:"status-indicator",style:{backgroundColor:y}})]}),(0,s.jsxs)("div",{className:"agent-info",children:[(0,s.jsxs)("div",{className:"agent-name-row",children:[(0,s.jsx)("span",{className:"agent-display-name",children:f}),t.needsAttention&&(0,s.jsx)("span",{className:"attention-badge",title:"Needs attention",children:"!"})]}),a?(0,s.jsx)("span",{className:"agent-breadcrumb",children:x(t.name)}):(0,s.jsx)("span",{className:"agent-full-name",children:t.name})]})]}),t.isProcessing&&(0,s.jsxs)("div",{className:"agent-thinking",children:[(0,s.jsx)(j,{isProcessing:!0,processingStartedAt:t.processingStartedAt,size:"medium",showElapsed:!0}),(0,s.jsx)("span",{className:"thinking-label",children:"Thinking..."})]}),t.currentTask&&!t.isProcessing&&(0,s.jsxs)("div",{className:"agent-task",children:[(0,s.jsx)("span",{className:"task-label",children:"Working on:"}),(0,s.jsx)("span",{className:"task-text",children:t.currentTask})]}),(0,s.jsxs)("div",{className:"agent-card-footer",children:[(0,s.jsxs)("div",{className:"agent-meta",children:[t.cli&&(0,s.jsx)("span",{className:"agent-cli",children:t.cli}),void 0!==t.messageCount&&t.messageCount>0&&(0,s.jsxs)("span",{className:"message-count",children:[t.messageCount," msgs"]}),t.isSpawned&&(0,s.jsx)("span",{className:"agent-spawned-badge",children:"spawned"})]}),(0,s.jsxs)("div",{className:"agent-actions",children:[t.isSpawned&&h&&(0,s.jsx)("button",{className:"release-btn",onClick:b,title:"Release agent",children:(0,s.jsx)(w,{})}),o&&(0,s.jsx)("button",{className:"message-btn",onClick:e=>{e.stopPropagation(),null==o||o(t)},title:"Send message",children:(0,s.jsx)(k,{})})]})]})]})}function k(){return(0,s.jsx)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:(0,s.jsx)("path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"})})}function w(){return(0,s.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",className:"release-icon",children:[(0,s.jsx)("path",{d:"M12 22c5.523 0 10-4.477 10-10a9.96 9.96 0 0 0-3-7.141",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"}),(0,s.jsx)("path",{d:"M12 22C6.477 22 2 17.523 2 12a9.96 9.96 0 0 1 3-7.141",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"}),(0,s.jsx)("line",{x1:"12",y1:"2",x2:"12",y2:"12",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round"})]})}function N(e){let{agents:t,selectedAgent:n,searchQuery:l="",onAgentSelect:r,onAgentMessage:i,onReleaseClick:c,compact:o=!1,showGroupStats:d=!0}=e,[u,m]=(0,a.useState)(new Set),[x,g]=(0,a.useState)(!0),f=(0,a.useMemo)(()=>p(t,l),[t,l]),j=(0,a.useMemo)(()=>h(f),[f]);(0,a.useMemo)(()=>{0===u.size&&j.length>0&&m(new Set(j.map(e=>e.prefix)))},[j]);let v=e=>{m(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})};return 0===t.length?(0,s.jsxs)("div",{className:"agent-list-empty",children:[(0,s.jsx)(S,{}),(0,s.jsx)("p",{children:"No agents connected"})]}):0===f.length?(0,s.jsxs)("div",{className:"agent-list-empty",children:[(0,s.jsx)(A,{}),(0,s.jsxs)("p",{children:['No agents match "',l,'"']})]}):(0,s.jsxs)("div",{className:"agent-list",children:[j.length>1&&(0,s.jsxs)("div",{className:"agent-list-header",children:[(0,s.jsxs)("span",{className:"agent-count",children:[f.length," agents"]}),(0,s.jsx)("button",{className:"toggle-all-btn",onClick:()=>{x?m(new Set):m(new Set(j.map(e=>e.prefix))),g(!x)},children:x?"Collapse all":"Expand all"})]}),j.map(e=>(0,s.jsx)(b,{group:e,isExpanded:u.has(e.prefix),selectedAgent:n,compact:o,showStats:d,onToggle:()=>v(e.prefix),onAgentSelect:r,onAgentMessage:i,onReleaseClick:c},e.prefix))]})}function b(e){let{group:t,isExpanded:n,selectedAgent:a,compact:l,showStats:r,onToggle:c,onAgentSelect:o,onAgentMessage:d,onReleaseClick:u}=e,h=r?f(t.agents):null;return(0,s.jsxs)("div",{className:"agent-group",children:[(0,s.jsxs)("button",{className:"agent-group-header",onClick:c,style:{"--group-color":t.color.primary,"--group-light":t.color.light},children:[(0,s.jsx)("div",{className:"group-color-bar"}),(0,s.jsx)(C,{expanded:n}),(0,s.jsx)("span",{className:"group-name",children:t.displayName}),(0,s.jsxs)("span",{className:"group-count",children:["(",t.agents.length,")"]}),r&&h&&(0,s.jsxs)("div",{className:"group-stats",children:[h.online>0&&(0,s.jsxs)("span",{className:"stat online",children:[(0,s.jsx)("span",{className:"stat-dot",style:{backgroundColor:i.online}}),h.online]}),h.needsAttention>0&&(0,s.jsxs)("span",{className:"stat attention",children:[(0,s.jsx)("span",{className:"stat-dot",style:{backgroundColor:i.attention}}),h.needsAttention]})]})]}),n&&(0,s.jsx)("div",{className:"agent-group-content",children:t.agents.map(e=>(0,s.jsx)(y,{agent:e,isSelected:e.name===a,compact:l,displayNameOverride:m(e.name),onClick:o,onMessageClick:d,onReleaseClick:u},e.name))})]})}function C(e){let{expanded:t}=e;return(0,s.jsx)("svg",{className:"chevron-icon ".concat(t?"expanded":""),width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:(0,s.jsx)("polyline",{points:"9 18 15 12 9 6"})})}function S(){return(0,s.jsxs)("svg",{width:"48",height:"48",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1",children:[(0,s.jsx)("circle",{cx:"12",cy:"8",r:"5"}),(0,s.jsx)("path",{d:"M20 21a8 8 0 1 0-16 0"})]})}function A(){return(0,s.jsxs)("svg",{width:"48",height:"48",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1",children:[(0,s.jsx)("circle",{cx:"11",cy:"11",r:"8"}),(0,s.jsx)("line",{x1:"21",y1:"21",x2:"16.65",y2:"16.65"})]})}function M(e){return e.split(/[-_]/).map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(" ")}function E(e){let{projects:t,localAgents:n=[],currentProject:l,selectedAgent:r,searchQuery:i="",onProjectSelect:c,onAgentSelect:o,onReleaseClick:d,compact:u=!1}=e,[h,m]=(0,a.useState)(()=>new Set(t.map(e=>e.id))),x=(0,a.useMemo)(()=>{let e=i.toLowerCase().trim();if(!e)return{projects:t,localAgents:n};let s=n.filter(t=>{var n;return t.name.toLowerCase().includes(e)||(null===(n=t.currentTask)||void 0===n?void 0:n.toLowerCase().includes(e))});return{projects:t.map(t=>{var n;let s=(null===(n=t.name)||void 0===n?void 0:n.toLowerCase().includes(e))||t.path.toLowerCase().includes(e),a=t.agents.filter(t=>{var n;return t.name.toLowerCase().includes(e)||(null===(n=t.currentTask)||void 0===n?void 0:n.toLowerCase().includes(e))});return s||a.length>0?{...t,agents:s?t.agents:a}:null}).filter(Boolean),localAgents:s}},[t,n,i]),p=e=>{m(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},g=x.localAgents.length+x.projects.reduce((e,t)=>e+t.agents.length,0);return 0===g&&0===t.length&&0===n.length?(0,s.jsxs)("div",{className:"project-list-empty",children:[(0,s.jsx)(R,{}),(0,s.jsx)("p",{children:"No projects or agents"})]}):0===g&&i?(0,s.jsxs)("div",{className:"project-list-empty",children:[(0,s.jsx)(T,{}),(0,s.jsxs)("p",{children:['No results for "',i,'"']})]}):(0,s.jsxs)("div",{className:"project-list",children:[x.localAgents.length>0&&(0,s.jsx)(D,{project:{id:"__local__",path:"",name:"Local",agents:x.localAgents},isExpanded:h.has("__local__"),isCurrentProject:!0,selectedAgent:r,compact:u,onToggle:()=>p("__local__"),onAgentSelect:e=>null==o?void 0:o(e),onReleaseClick:d}),x.projects.map(e=>(0,s.jsx)(D,{project:e,isExpanded:h.has(e.id),isCurrentProject:e.id===l,selectedAgent:r,compact:u,onToggle:()=>p(e.id),onProjectSelect:()=>null==c?void 0:c(e),onAgentSelect:t=>null==o?void 0:o(t,e),onReleaseClick:d},e.id))]})}function D(e){var t;let{project:n,isExpanded:l,isCurrentProject:r,selectedAgent:c,compact:o,onToggle:u,onProjectSelect:h,onAgentSelect:m,onReleaseClick:x}=e,[p,g]=(0,a.useState)(new Set),f=(0,a.useMemo)(()=>{let e=0,t=0;for(let s of n.agents)"online"===s.status&&e++,s.needsAttention&&t++;return{online:e,needsAttention:t,total:n.agents.length}},[n.agents]),{teams:j,ungroupedAgents:v}=(0,a.useMemo)(()=>{let e=new Map,t=[];for(let s of n.agents)if(s.team){let t=e.get(s.team)||[];t.push(s),e.set(s.team,t)}else t.push(s);return{teams:Array.from(e.entries()).map(e=>{let[t,n]=e;return{name:t,agents:n}}).sort((e,t)=>e.name.localeCompare(t.name)),ungroupedAgents:t}},[n.agents]),k=e=>{g(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})};(0,a.useEffect)(()=>{l&&0===p.size&&j.length>0&&g(new Set(j.map(e=>e.name)))},[l,j,p]);let w=d(n.name||n.id),N=n.name||n.path.split("/").pop()||n.id;return(0,s.jsxs)("div",{className:"project-section ".concat(r?"current":""),children:[(0,s.jsxs)("button",{className:"project-header",onClick:u,onDoubleClick:h,style:{"--project-color":w.primary,"--project-light":w.light},children:[(0,s.jsx)("div",{className:"project-color-bar"}),(0,s.jsx)(B,{expanded:l}),(0,s.jsx)(W,{}),(0,s.jsx)("span",{className:"project-name",children:N}),(0,s.jsxs)("span",{className:"project-count",children:["(",f.total,")"]}),(0,s.jsxs)("div",{className:"project-stats",children:[f.online>0&&(0,s.jsxs)("span",{className:"stat online",children:[(0,s.jsx)("span",{className:"stat-dot",style:{backgroundColor:i.online}}),f.online]}),f.needsAttention>0&&(0,s.jsxs)("span",{className:"stat attention",children:[(0,s.jsx)("span",{className:"stat-dot",style:{backgroundColor:i.attention}}),f.needsAttention]})]}),(null===(t=n.lead)||void 0===t?void 0:t.connected)&&(0,s.jsx)("span",{className:"lead-indicator",title:"Lead: ".concat(n.lead.name),children:"★"})]}),l&&(0,s.jsxs)("div",{className:"project-agents",children:[j.map(e=>(0,s.jsxs)("div",{className:"team-group",children:[(0,s.jsxs)("button",{className:"team-header",onClick:()=>k(e.name),children:[(0,s.jsx)(B,{expanded:p.has(e.name)}),(0,s.jsx)(L,{}),(0,s.jsx)("span",{className:"team-name",children:e.name}),(0,s.jsxs)("span",{className:"team-count",children:["(",e.agents.length,")"]})]}),p.has(e.name)&&(0,s.jsx)("div",{className:"team-agents",children:e.agents.map(t=>(0,s.jsx)(y,{agent:t,isSelected:t.name===c,compact:o,displayNameOverride:function(e,t){let n=e.toLowerCase(),s=t.toLowerCase().replace(/-?team$/i,"");if(s&&n.startsWith(s+"-")||s&&n.startsWith(s+"_"))return M(e.substring(s.length+1));let a=e.split("-");return a.length>1?M(a[a.length-1]):M(e)}(t.name,e.name),onClick:m,onReleaseClick:x},t.name))})]},e.name)),v.map(e=>(0,s.jsx)(y,{agent:e,isSelected:e.name===c,compact:o,onClick:m,onReleaseClick:x},e.name))]})]})}function B(e){let{expanded:t}=e;return(0,s.jsx)("svg",{className:"chevron-icon ".concat(t?"expanded":""),width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:(0,s.jsx)("polyline",{points:"9 18 15 12 9 6"})})}function W(){return(0,s.jsx)("svg",{className:"folder-icon",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:(0,s.jsx)("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"})})}function L(){return(0,s.jsxs)("svg",{className:"team-icon",width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[(0,s.jsx)("path",{d:"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"}),(0,s.jsx)("circle",{cx:"9",cy:"7",r:"4"}),(0,s.jsx)("path",{d:"M23 21v-2a4 4 0 0 0-3-3.87"}),(0,s.jsx)("path",{d:"M16 3.13a4 4 0 0 1 0 7.75"})]})}function R(){return(0,s.jsx)("svg",{width:"48",height:"48",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1",children:(0,s.jsx)("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"})})}function T(){return(0,s.jsxs)("svg",{width:"48",height:"48",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1",children:[(0,s.jsx)("circle",{cx:"11",cy:"11",r:"8"}),(0,s.jsx)("line",{x1:"21",y1:"21",x2:"16.65",y2:"16.65"})]})}function P(e){let{agents:t,projects:n=[],currentProject:l,selectedAgent:r,viewMode:i,isFleetAvailable:c,isConnected:o,isOpen:d=!1,onAgentSelect:u,onProjectSelect:h,onViewModeChange:m,onSpawnClick:x,onReleaseClick:p,onClose:g}=e,[f,j]=(0,a.useState)(""),v=n.length>0;return(0,s.jsxs)("aside",{className:"sidebar ".concat(d?"open":""),children:[(0,s.jsxs)("div",{className:"sidebar-header",children:[(0,s.jsxs)("div",{className:"sidebar-title",children:[(0,s.jsx)("h1",{children:"Agent Relay"}),(0,s.jsx)(O,{isConnected:o})]}),c&&(0,s.jsxs)("div",{className:"view-mode-toggle",children:[(0,s.jsx)("button",{className:"toggle-btn ".concat("local"===i?"active":""),onClick:()=>null==m?void 0:m("local"),children:"Local"}),(0,s.jsx)("button",{className:"toggle-btn ".concat("fleet"===i?"active":""),onClick:()=>null==m?void 0:m("fleet"),children:"Fleet"})]})]}),(0,s.jsxs)("div",{className:"sidebar-search",children:[(0,s.jsx)(F,{}),(0,s.jsx)("input",{type:"text",placeholder:"Search agents...",value:f,onChange:e=>j(e.target.value)}),f&&(0,s.jsx)("button",{className:"clear-btn",onClick:()=>j(""),children:(0,s.jsx)(V,{})})]}),(0,s.jsx)("div",{className:"sidebar-content",children:v?(0,s.jsx)(E,{projects:n,localAgents:t,currentProject:l,selectedAgent:r,searchQuery:f,onProjectSelect:h,onAgentSelect:u,onReleaseClick:p,compact:!0}):(0,s.jsx)(N,{agents:t,selectedAgent:r,searchQuery:f,onAgentSelect:e=>null==u?void 0:u(e),onReleaseClick:p,compact:!0,showGroupStats:!0})}),(0,s.jsx)("div",{className:"sidebar-footer",children:(0,s.jsxs)("button",{className:"spawn-btn",onClick:x,children:[(0,s.jsx)(_,{}),"Spawn Agent"]})})]})}function O(e){let{isConnected:t}=e;return(0,s.jsx)("div",{className:"connection-indicator ".concat(t?"connected":"disconnected"),title:t?"Connected":"Disconnected"})}function F(){return(0,s.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[(0,s.jsx)("circle",{cx:"11",cy:"11",r:"8"}),(0,s.jsx)("line",{x1:"21",y1:"21",x2:"16.65",y2:"16.65"})]})}function V(){return(0,s.jsxs)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[(0,s.jsx)("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),(0,s.jsx)("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})}function _(){return(0,s.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[(0,s.jsx)("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),(0,s.jsx)("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]})}function z(e){let{currentChannel:t,selectedAgent:n,onCommandPaletteOpen:a,onSettingsClick:l,onMenuClick:r}=e,i="general"===t,c=n?d(n.name):null;return(0,s.jsxs)("header",{className:"header",children:[(0,s.jsx)("button",{className:"mobile-menu-btn",onClick:r,"aria-label":"Open menu",children:(0,s.jsx)(U,{})}),(0,s.jsx)("div",{className:"header-left",children:i?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("span",{className:"channel-prefix",children:"#"}),(0,s.jsx)("span",{className:"channel-name",children:"general"}),(0,s.jsx)("span",{className:"channel-topic",children:"All agent communications"})]}):n?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("div",{className:"agent-avatar-small",style:{backgroundColor:null==c?void 0:c.primary},children:(0,s.jsx)("span",{style:{color:null==c?void 0:c.text},children:u(n.name)})}),(0,s.jsxs)("div",{className:"channel-info",children:[(0,s.jsx)("span",{className:"channel-name",children:n.name}),(0,s.jsx)("span",{className:"channel-breadcrumb",children:x(n.name)})]}),n.status&&(0,s.jsx)("span",{className:"agent-status-badge",children:n.status})]}):(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("span",{className:"channel-prefix",children:"@"}),(0,s.jsx)("span",{className:"channel-name",children:t})]})}),(0,s.jsxs)("div",{className:"header-right",children:[(0,s.jsxs)("button",{className:"header-btn command-palette-btn",onClick:a,title:"Command Palette (⌘K)",children:[(0,s.jsx)(I,{}),(0,s.jsx)("span",{children:"Search"}),(0,s.jsx)("kbd",{children:"⌘K"})]}),(0,s.jsx)("a",{href:"/metrics",className:"header-btn icon-btn",title:"Metrics",children:(0,s.jsx)(H,{})}),(0,s.jsx)("button",{className:"header-btn icon-btn",onClick:l,title:"Settings",children:(0,s.jsx)(K,{})})]})]})}function I(){return(0,s.jsxs)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[(0,s.jsx)("circle",{cx:"11",cy:"11",r:"8"}),(0,s.jsx)("line",{x1:"21",y1:"21",x2:"16.65",y2:"16.65"})]})}function H(){return(0,s.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,s.jsx)("path",{d:"M3 3v18h18"}),(0,s.jsx)("path",{d:"M18 17V9"}),(0,s.jsx)("path",{d:"M13 17V5"}),(0,s.jsx)("path",{d:"M8 17v-3"})]})}function K(){return(0,s.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[(0,s.jsx)("circle",{cx:"12",cy:"12",r:"3"}),(0,s.jsx)("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"})]})}function U(){return(0,s.jsxs)("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,s.jsx)("line",{x1:"3",y1:"12",x2:"21",y2:"12"}),(0,s.jsx)("line",{x1:"3",y1:"6",x2:"21",y2:"6"}),(0,s.jsx)("line",{x1:"3",y1:"18",x2:"21",y2:"18"})]})}function q(e){let{messages:t,currentChannel:n,onThreadClick:l,highlightedMessageId:r}=e,i=(0,a.useRef)(null),c=(0,a.useRef)(null);(0,a.useEffect)(()=>{var e;null===(e=c.current)||void 0===e||e.scrollIntoView({behavior:"smooth"})},[t.length]);let o=t.filter(e=>"general"===n?"*"===e.to||e.isBroadcast:e.from===n||e.to===n);return 0===o.length?(0,s.jsxs)("div",{className:"message-list-empty",children:[(0,s.jsx)(G,{}),(0,s.jsx)("h3",{children:"No messages yet"}),(0,s.jsx)("p",{children:"general"===n?"Broadcast messages will appear here":"Messages with ".concat(n," will appear here")})]}):(0,s.jsxs)("div",{className:"message-list",ref:i,children:[o.map(e=>(0,s.jsx)(J,{message:e,isHighlighted:e.id===r,onThreadClick:l},e.id)),(0,s.jsx)("div",{ref:c})]})}function J(e){let{message:t,isHighlighted:n,onThreadClick:l}=e,r=d(t.from),i=function(e){let t=new Date(e),n=new Date;if(t.toDateString()===n.toDateString())return t.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"});let s=new Date(n);return(s.setDate(s.getDate()-1),t.toDateString()===s.toDateString())?"Yesterday ".concat(t.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})):t.toLocaleDateString([],{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}(t.timestamp);return(0,s.jsxs)("div",{className:"message-item ".concat(n?"highlighted":""),children:[(0,s.jsx)("div",{className:"message-avatar",style:{backgroundColor:r.primary},children:(0,s.jsx)("span",{style:{color:r.text},children:u(t.from)})}),(0,s.jsxs)("div",{className:"message-content",children:[(0,s.jsxs)("div",{className:"message-header",children:[(0,s.jsx)("span",{className:"message-sender",children:t.from}),"*"!==t.to&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("span",{className:"message-arrow",children:"→"}),(0,s.jsx)("span",{className:"message-recipient",children:t.to})]}),(0,s.jsx)("span",{className:"message-time",children:i}),"*"===t.to&&(0,s.jsx)("span",{className:"message-badge broadcast",children:"broadcast"})]}),(0,s.jsx)("div",{className:"message-body",children:t.content.replace(/\\n/g,"\n").replace(/\r\n/g,"\n").replace(/\r/g,"\n").split("\n").map((e,t)=>(0,s.jsxs)(a.Fragment,{children:[t>0&&(0,s.jsx)("br",{}),function(e){let t=/(https?:\/\/[^\s]+)/g;return e.split(t).map((e,n)=>t.test(e)?(0,s.jsx)("a",{href:e,target:"_blank",rel:"noopener noreferrer",className:"message-link",children:e},n):e)}(e)]},t))}),t.replyCount&&t.replyCount>0&&(0,s.jsxs)("button",{className:"message-thread-btn",onClick:()=>null==l?void 0:l(t.id),children:[(0,s.jsx)(Q,{}),(0,s.jsxs)("span",{children:[t.replyCount," ",1===t.replyCount?"reply":"replies"]})]})]})]})}function G(){return(0,s.jsx)("svg",{width:"48",height:"48",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",children:(0,s.jsx)("path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"})})}function Q(){return(0,s.jsx)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:(0,s.jsx)("path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"})})}function Z(e){let{isOpen:t,onClose:n,agents:l,projects:r=[],currentProject:i,onAgentSelect:c,onProjectSelect:o,onSpawnClick:d,onSettingsClick:u,onGeneralClick:h,customCommands:m=[]}=e,[x,p]=(0,a.useState)(""),[g,f]=(0,a.useState)(0),j=(0,a.useRef)(null),v=(0,a.useRef)(null),y=(0,a.useMemo)(()=>[...r.map(e=>{let t=e.name||e.path.split("/").pop()||e.id,a=e.id===i;return{id:"project-".concat(e.id),label:t,description:a?"Current project • ".concat(e.agents.length," agents"):"".concat(e.agents.length," agents"),category:"projects",icon:(0,s.jsx)(es,{}),action:()=>{null==o||o(e),n()}}}),...l.map(e=>({id:"agent-".concat(e.name),label:e.name,description:e.currentTask||e.status,category:"agents",icon:(0,s.jsx)($,{name:e.name}),action:()=>{c(e),n()}})),{id:"spawn-agent",label:"Spawn Agent",description:"Launch a new agent instance",category:"actions",icon:(0,s.jsx)(X,{}),shortcut:"⌘⇧S",action:()=>{d(),n()}},{id:"broadcast",label:"Broadcast Message",description:"Send message to all agents",category:"actions",icon:(0,s.jsx)(ee,{}),action:()=>{n()}},{id:"nav-general",label:"Go to #general",description:"View all broadcast messages",category:"navigation",icon:(0,s.jsx)(et,{}),action:()=>{null==h||h(),n()}},...u?[{id:"settings",label:"Settings",description:"Configure dashboard preferences",category:"settings",icon:(0,s.jsx)(en,{}),shortcut:"⌘,",action:()=>{u(),n()}}]:[],...m],[l,r,i,c,o,d,u,h,n,m]),k=(0,a.useMemo)(()=>{if(!x.trim())return y;let e=x.toLowerCase();return y.filter(t=>{var n;return t.label.toLowerCase().includes(e)||(null===(n=t.description)||void 0===n?void 0:n.toLowerCase().includes(e))||t.category.toLowerCase().includes(e)})},[y,x]),w=(0,a.useMemo)(()=>{let e={};for(let t of k)e[t.category]||(e[t.category]=[]),e[t.category].push(t);return e},[k]),N=(0,a.useMemo)(()=>["projects","agents","actions","navigation","settings"].flatMap(e=>w[e]||[]),[w]);(0,a.useEffect)(()=>{f(0)},[x]),(0,a.useEffect)(()=>{t&&(p(""),f(0),setTimeout(()=>{var e;return null===(e=j.current)||void 0===e?void 0:e.focus()},0))},[t]),(0,a.useEffect)(()=>{if(v.current&&N.length>0){let e=v.current.querySelector('[data-index="'.concat(g,'"]'));null==e||e.scrollIntoView({block:"nearest"})}},[g,N.length]);let b=(0,a.useCallback)(e=>{switch(e.key){case"ArrowDown":e.preventDefault(),f(e=>Math.min(e+1,N.length-1));break;case"ArrowUp":e.preventDefault(),f(e=>Math.max(e-1,0));break;case"Enter":e.preventDefault(),N[g]&&N[g].action();break;case"Escape":e.preventDefault(),n()}},[N,g,n]);if(!t)return null;let C={projects:"Projects",agents:"Agents",actions:"Actions",navigation:"Navigation",settings:"Settings"},S=0;return(0,s.jsx)("div",{className:"command-palette-overlay",onClick:n,children:(0,s.jsxs)("div",{className:"command-palette",onClick:e=>e.stopPropagation(),children:[(0,s.jsxs)("div",{className:"command-palette-input-wrapper",children:[(0,s.jsx)(Y,{}),(0,s.jsx)("input",{ref:j,type:"text",className:"command-palette-input",placeholder:"Search commands, agents...",value:x,onChange:e=>p(e.target.value),onKeyDown:b}),(0,s.jsx)("kbd",{className:"command-palette-kbd",children:"ESC"})]}),(0,s.jsx)("div",{className:"command-palette-list",ref:v,children:0===N.length?(0,s.jsxs)("div",{className:"command-palette-empty",children:['No results for "',x,'"']}):Object.entries(w).map(e=>{let[t,n]=e;return n.length?(0,s.jsxs)("div",{className:"command-palette-group",children:[(0,s.jsx)("div",{className:"command-palette-group-label",children:C[t]||t}),n.map(e=>{let t=S++;return(0,s.jsxs)("button",{"data-index":t,className:"command-palette-item ".concat(t===g?"selected":""),onClick:e.action,onMouseEnter:()=>f(t),children:[(0,s.jsx)("span",{className:"command-palette-item-icon",children:e.icon}),(0,s.jsxs)("span",{className:"command-palette-item-content",children:[(0,s.jsx)("span",{className:"command-palette-item-label",children:e.label}),e.description&&(0,s.jsx)("span",{className:"command-palette-item-desc",children:e.description})]}),e.shortcut&&(0,s.jsx)("kbd",{className:"command-palette-item-shortcut",children:e.shortcut})]},e.id)})]},t):null})})]})})}function $(e){let{name:t}=e,n=d(t);return(0,s.jsx)("div",{className:"command-palette-agent-icon",style:{backgroundColor:n.primary,color:n.text},children:u(t)})}function Y(){return(0,s.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[(0,s.jsx)("circle",{cx:"11",cy:"11",r:"8"}),(0,s.jsx)("line",{x1:"21",y1:"21",x2:"16.65",y2:"16.65"})]})}function X(){return(0,s.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[(0,s.jsx)("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),(0,s.jsx)("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]})}function ee(){return(0,s.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[(0,s.jsx)("circle",{cx:"12",cy:"12",r:"2"}),(0,s.jsx)("path",{d:"M16.24 7.76a6 6 0 0 1 0 8.49m-8.48-.01a6 6 0 0 1 0-8.49m11.31-2.82a10 10 0 0 1 0 14.14m-14.14 0a10 10 0 0 1 0-14.14"})]})}function et(){return(0,s.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[(0,s.jsx)("line",{x1:"4",y1:"9",x2:"20",y2:"9"}),(0,s.jsx)("line",{x1:"4",y1:"15",x2:"20",y2:"15"}),(0,s.jsx)("line",{x1:"10",y1:"3",x2:"8",y2:"21"}),(0,s.jsx)("line",{x1:"16",y1:"3",x2:"14",y2:"21"})]})}function en(){return(0,s.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[(0,s.jsx)("circle",{cx:"12",cy:"12",r:"3"}),(0,s.jsx)("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"})]})}function es(){return(0,s.jsx)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:(0,s.jsx)("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"})})}let ea=[{id:"claude",name:"Claude",command:"claude",description:"Claude Code CLI agent",icon:"\uD83E\uDD16"},{id:"codex",name:"Codex",command:"codex",description:"OpenAI Codex agent",icon:"⚡"},{id:"custom",name:"Custom",command:"",description:"Custom command",icon:"\uD83D\uDD27"}],el=["frontend","backend","lead","test","docs","review","deploy","data"];function er(e){let{isOpen:t,onClose:n,onSpawn:l,existingAgents:r,isSpawning:i=!1,error:c}=e,[o,h]=(0,a.useState)(ea[0]),[m,x]=(0,a.useState)(""),[p,g]=(0,a.useState)(""),[f,j]=(0,a.useState)(""),[v,y]=(0,a.useState)(""),[k,w]=(0,a.useState)(null),N=(0,a.useRef)(null),b=(0,a.useCallback)(()=>{let e="claude"===o.id?"claude":o.id,t=1;for(;r.includes("".concat(e,"-").concat(t));)t++;return"".concat(e,"-").concat(t)},[o,r]);(0,a.useEffect)(()=>{t&&(h(ea[0]),x(""),g(""),j(""),y(""),w(null),setTimeout(()=>{var e;return null===(e=N.current)||void 0===e?void 0:e.focus()},100))},[t]);let C=(0,a.useCallback)(e=>e.trim()?/^[a-zA-Z][a-zA-Z0-9-]*$/.test(e)?r.includes(e)?"An agent with this name already exists":null:"Name must start with a letter and contain only letters, numbers, and hyphens":"Name is required",[r]),S=async e=>{e.preventDefault();let t=m.trim()||b(),s=C(t);if(s){w(s);return}let a="custom"===o.id?p:o.command;if(!a.trim()){w("Command is required");return}w(null),await l({name:t,command:a.trim(),cwd:f.trim()||void 0,team:v.trim()||void 0})&&n()};if(!t)return null;let A=m?d(m):d(b()),M=c||k;return(0,s.jsx)("div",{className:"spawn-modal-overlay",onClick:n,children:(0,s.jsxs)("div",{className:"spawn-modal",onClick:e=>e.stopPropagation(),onKeyDown:e=>{"Escape"===e.key&&(e.preventDefault(),n())},children:[(0,s.jsxs)("div",{className:"spawn-modal-header",children:[(0,s.jsx)("h2",{children:"Spawn New Agent"}),(0,s.jsx)("button",{className:"spawn-modal-close",onClick:n,"aria-label":"Close",children:(0,s.jsx)(ei,{})})]}),(0,s.jsxs)("form",{onSubmit:S,children:[(0,s.jsxs)("div",{className:"spawn-modal-section",children:[(0,s.jsx)("label",{className:"spawn-modal-label",children:"Agent Type"}),(0,s.jsx)("div",{className:"spawn-modal-templates",children:ea.map(e=>(0,s.jsxs)("button",{type:"button",className:"spawn-modal-template ".concat(o.id===e.id?"selected":""),onClick:()=>h(e),children:[(0,s.jsx)("span",{className:"spawn-modal-template-icon",children:e.icon}),(0,s.jsx)("span",{className:"spawn-modal-template-name",children:e.name}),(0,s.jsx)("span",{className:"spawn-modal-template-desc",children:e.description})]},e.id))})]}),(0,s.jsxs)("div",{className:"spawn-modal-section",children:[(0,s.jsx)("label",{className:"spawn-modal-label",htmlFor:"agent-name",children:"Agent Name"}),(0,s.jsxs)("div",{className:"spawn-modal-name-input",children:[(0,s.jsx)("div",{className:"spawn-modal-name-preview",style:{backgroundColor:A.primary,color:A.text},children:u(m||b())}),(0,s.jsx)("input",{ref:N,id:"agent-name",type:"text",className:"spawn-modal-input",placeholder:b(),value:m,onChange:e=>{x(e.target.value),w(null)},disabled:i})]}),(0,s.jsx)("div",{className:"spawn-modal-name-suggestions",children:el.slice(0,4).map(e=>(0,s.jsxs)("button",{type:"button",className:"spawn-modal-suggestion",onClick:()=>x("".concat(e,"-1")),children:[e,"-"]},e))})]}),"custom"===o.id&&(0,s.jsxs)("div",{className:"spawn-modal-section",children:[(0,s.jsx)("label",{className:"spawn-modal-label",htmlFor:"agent-command",children:"Command"}),(0,s.jsx)("input",{id:"agent-command",type:"text",className:"spawn-modal-input",placeholder:"e.g., python agent.py",value:p,onChange:e=>g(e.target.value),disabled:i})]}),(0,s.jsxs)("div",{className:"spawn-modal-section",children:[(0,s.jsxs)("label",{className:"spawn-modal-label",htmlFor:"agent-cwd",children:["Working Directory ",(0,s.jsx)("span",{className:"spawn-modal-optional",children:"(optional)"})]}),(0,s.jsx)("input",{id:"agent-cwd",type:"text",className:"spawn-modal-input",placeholder:"Current directory",value:f,onChange:e=>j(e.target.value),disabled:i})]}),(0,s.jsxs)("div",{className:"spawn-modal-section",children:[(0,s.jsxs)("label",{className:"spawn-modal-label",htmlFor:"agent-team",children:["Team ",(0,s.jsx)("span",{className:"spawn-modal-optional",children:"(optional)"})]}),(0,s.jsx)("input",{id:"agent-team",type:"text",className:"spawn-modal-input",placeholder:"e.g., frontend, backend, infra",value:v,onChange:e=>y(e.target.value),disabled:i})]}),M&&(0,s.jsxs)("div",{className:"spawn-modal-error",children:[(0,s.jsx)(ec,{}),(0,s.jsx)("span",{children:M})]}),(0,s.jsxs)("div",{className:"spawn-modal-actions",children:[(0,s.jsx)("button",{type:"button",className:"spawn-modal-btn spawn-modal-btn-secondary",onClick:n,disabled:i,children:"Cancel"}),(0,s.jsx)("button",{type:"submit",className:"spawn-modal-btn spawn-modal-btn-primary",disabled:i,children:i?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(ed,{}),"Spawning..."]}):(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(eo,{}),"Spawn Agent"]})})]})]})]})})}function ei(){return(0,s.jsxs)("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[(0,s.jsx)("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),(0,s.jsx)("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})}function ec(){return(0,s.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[(0,s.jsx)("circle",{cx:"12",cy:"12",r:"10"}),(0,s.jsx)("line",{x1:"12",y1:"8",x2:"12",y2:"12"}),(0,s.jsx)("line",{x1:"12",y1:"16",x2:"12.01",y2:"16"})]})}function eo(){return(0,s.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[(0,s.jsx)("path",{d:"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z"}),(0,s.jsx)("path",{d:"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z"}),(0,s.jsx)("path",{d:"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0"}),(0,s.jsx)("path",{d:"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5"})]})}function ed(){return(0,s.jsx)("svg",{className:"spawn-modal-spinner",width:"16",height:"16",viewBox:"0 0 24 24",children:(0,s.jsx)("circle",{cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"2",fill:"none",strokeDasharray:"32",strokeLinecap:"round"})})}let eu={theme:"system",notifications:{enabled:!0,sound:!0,desktop:!1,mentionsOnly:!1},display:{compactMode:!1,showTimestamps:!0,showAvatars:!0,animationsEnabled:!0},connection:{autoReconnect:!0,reconnectDelay:3e3,keepAliveInterval:3e4}};function eh(e){let{isOpen:t,onClose:n,settings:l,onSettingsChange:r,onResetSettings:i}=e,[c,o]=(0,a.useState)("appearance"),d=(0,a.useCallback)((e,t,n)=>{let s=l[e];r({...l,[e]:{...s,[t]:n}})},[l,r]),u=(0,a.useCallback)(e=>{r({...l,theme:e})},[l,r]);return t?(0,s.jsx)("div",{className:"settings-overlay",onClick:n,children:(0,s.jsxs)("div",{className:"settings-panel",onClick:e=>e.stopPropagation(),children:[(0,s.jsxs)("div",{className:"settings-header",children:[(0,s.jsx)("h2",{children:"Settings"}),(0,s.jsx)("button",{className:"settings-close",onClick:n,children:(0,s.jsx)(ex,{})})]}),(0,s.jsxs)("div",{className:"settings-tabs",children:[(0,s.jsxs)("button",{className:"settings-tab ".concat("appearance"===c?"active":""),onClick:()=>o("appearance"),children:[(0,s.jsx)(ep,{}),"Appearance"]}),(0,s.jsxs)("button",{className:"settings-tab ".concat("notifications"===c?"active":""),onClick:()=>o("notifications"),children:[(0,s.jsx)(eg,{}),"Notifications"]}),(0,s.jsxs)("button",{className:"settings-tab ".concat("connection"===c?"active":""),onClick:()=>o("connection"),children:[(0,s.jsx)(ef,{}),"Connection"]})]}),(0,s.jsxs)("div",{className:"settings-content",children:["appearance"===c&&(0,s.jsxs)("div",{className:"settings-section",children:[(0,s.jsxs)("div",{className:"settings-group",children:[(0,s.jsx)("label",{className:"settings-label",children:"Theme"}),(0,s.jsx)("div",{className:"settings-theme-options",children:["light","dark","system"].map(e=>(0,s.jsxs)("button",{className:"settings-theme-btn ".concat(l.theme===e?"active":""),onClick:()=>u(e),children:["light"===e&&(0,s.jsx)(ej,{}),"dark"===e&&(0,s.jsx)(ev,{}),"system"===e&&(0,s.jsx)(ey,{}),(0,s.jsx)("span",{children:e.charAt(0).toUpperCase()+e.slice(1)})]},e))})]}),(0,s.jsxs)("div",{className:"settings-group",children:[(0,s.jsx)("label",{className:"settings-label",children:"Display Options"}),(0,s.jsx)(em,{label:"Compact mode",description:"Show more content in less space",checked:l.display.compactMode,onChange:e=>d("display","compactMode",e)}),(0,s.jsx)(em,{label:"Show timestamps",description:"Display time for each message",checked:l.display.showTimestamps,onChange:e=>d("display","showTimestamps",e)}),(0,s.jsx)(em,{label:"Show avatars",description:"Display agent avatars in messages",checked:l.display.showAvatars,onChange:e=>d("display","showAvatars",e)}),(0,s.jsx)(em,{label:"Enable animations",description:"Smooth transitions and effects",checked:l.display.animationsEnabled,onChange:e=>d("display","animationsEnabled",e)})]})]}),"notifications"===c&&(0,s.jsx)("div",{className:"settings-section",children:(0,s.jsxs)("div",{className:"settings-group",children:[(0,s.jsx)("label",{className:"settings-label",children:"Notification Preferences"}),(0,s.jsx)(em,{label:"Enable notifications",description:"Receive alerts for new messages",checked:l.notifications.enabled,onChange:e=>d("notifications","enabled",e)}),(0,s.jsx)(em,{label:"Sound alerts",description:"Play sound for new messages",checked:l.notifications.sound,onChange:e=>d("notifications","sound",e),disabled:!l.notifications.enabled}),(0,s.jsx)(em,{label:"Desktop notifications",description:"Show system notifications",checked:l.notifications.desktop,onChange:e=>d("notifications","desktop",e),disabled:!l.notifications.enabled}),(0,s.jsx)(em,{label:"Mentions only",description:"Only notify when mentioned",checked:l.notifications.mentionsOnly,onChange:e=>d("notifications","mentionsOnly",e),disabled:!l.notifications.enabled})]})}),"connection"===c&&(0,s.jsx)("div",{className:"settings-section",children:(0,s.jsxs)("div",{className:"settings-group",children:[(0,s.jsx)("label",{className:"settings-label",children:"Connection Settings"}),(0,s.jsx)(em,{label:"Auto-reconnect",description:"Automatically reconnect on disconnect",checked:l.connection.autoReconnect,onChange:e=>d("connection","autoReconnect",e)}),(0,s.jsxs)("div",{className:"settings-input-group",children:[(0,s.jsx)("label",{children:"Reconnect delay (ms)"}),(0,s.jsx)("input",{type:"number",className:"settings-input",value:l.connection.reconnectDelay,onChange:e=>d("connection","reconnectDelay",parseInt(e.target.value)||3e3),min:1e3,max:3e4,step:1e3,disabled:!l.connection.autoReconnect})]}),(0,s.jsxs)("div",{className:"settings-input-group",children:[(0,s.jsx)("label",{children:"Keep-alive interval (ms)"}),(0,s.jsx)("input",{type:"number",className:"settings-input",value:l.connection.keepAliveInterval,onChange:e=>d("connection","keepAliveInterval",parseInt(e.target.value)||3e4),min:5e3,max:12e4,step:5e3})]})]})})]}),(0,s.jsxs)("div",{className:"settings-footer",children:[i&&(0,s.jsx)("button",{className:"settings-reset-btn",onClick:i,children:"Reset to defaults"}),(0,s.jsx)("button",{className:"settings-done-btn",onClick:n,children:"Done"})]})]})}):null}function em(e){let{label:t,description:n,checked:a,onChange:l,disabled:r}=e;return(0,s.jsxs)("div",{className:"settings-toggle-option ".concat(r?"disabled":""),children:[(0,s.jsxs)("div",{className:"settings-toggle-info",children:[(0,s.jsx)("span",{className:"settings-toggle-label",children:t}),(0,s.jsx)("span",{className:"settings-toggle-desc",children:n})]}),(0,s.jsx)("button",{className:"settings-toggle ".concat(a?"on":""),onClick:()=>!r&&l(!a),disabled:r,role:"switch","aria-checked":a,children:(0,s.jsx)("span",{className:"settings-toggle-thumb"})})]})}function ex(){return(0,s.jsxs)("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[(0,s.jsx)("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),(0,s.jsx)("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})}function ep(){return(0,s.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[(0,s.jsx)("circle",{cx:"13.5",cy:"6.5",r:".5"}),(0,s.jsx)("circle",{cx:"17.5",cy:"10.5",r:".5"}),(0,s.jsx)("circle",{cx:"8.5",cy:"7.5",r:".5"}),(0,s.jsx)("circle",{cx:"6.5",cy:"12.5",r:".5"}),(0,s.jsx)("path",{d:"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.688 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.555C21.965 6.012 17.461 2 12 2z"})]})}function eg(){return(0,s.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[(0,s.jsx)("path",{d:"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"}),(0,s.jsx)("path",{d:"M13.73 21a2 2 0 0 1-3.46 0"})]})}function ef(){return(0,s.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[(0,s.jsx)("path",{d:"M5 12.55a11 11 0 0 1 14.08 0"}),(0,s.jsx)("path",{d:"M1.42 9a16 16 0 0 1 21.16 0"}),(0,s.jsx)("path",{d:"M8.53 16.11a6 6 0 0 1 6.95 0"}),(0,s.jsx)("line",{x1:"12",y1:"20",x2:"12.01",y2:"20"})]})}function ej(){return(0,s.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[(0,s.jsx)("circle",{cx:"12",cy:"12",r:"5"}),(0,s.jsx)("line",{x1:"12",y1:"1",x2:"12",y2:"3"}),(0,s.jsx)("line",{x1:"12",y1:"21",x2:"12",y2:"23"}),(0,s.jsx)("line",{x1:"4.22",y1:"4.22",x2:"5.64",y2:"5.64"}),(0,s.jsx)("line",{x1:"18.36",y1:"18.36",x2:"19.78",y2:"19.78"}),(0,s.jsx)("line",{x1:"1",y1:"12",x2:"3",y2:"12"}),(0,s.jsx)("line",{x1:"21",y1:"12",x2:"23",y2:"12"}),(0,s.jsx)("line",{x1:"4.22",y1:"19.78",x2:"5.64",y2:"18.36"}),(0,s.jsx)("line",{x1:"18.36",y1:"5.64",x2:"19.78",y2:"4.22"})]})}function ev(){return(0,s.jsx)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:(0,s.jsx)("path",{d:"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"})})}function ey(){return(0,s.jsxs)("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",children:[(0,s.jsx)("rect",{x:"2",y:"3",width:"20",height:"14",rx:"2",ry:"2"}),(0,s.jsx)("line",{x1:"8",y1:"21",x2:"16",y2:"21"}),(0,s.jsx)("line",{x1:"12",y1:"17",x2:"12",y2:"21"})]})}function ek(e,t){let n=e.match(/^@(\S*)/);return n&&t<=n[0].length?n[1]:null}function ew(e,t){let n=e.match(/^@\S*/);return n?"@".concat(t," ")+e.substring(n[0].length):e}function eN(e){let{agents:t,inputValue:n,cursorPosition:l,onSelect:r,onClose:i,isVisible:c}=e,[o,h]=(0,a.useState)(0),m=(0,a.useRef)(null),x=(0,a.useMemo)(()=>ek(n,l),[n,l]),p=(0,a.useMemo)(()=>{if(null===x)return[];let e=x.toLowerCase(),n=[];return("*".includes(e)||"everyone".includes(e)||"all".includes(e)||"broadcast".includes(e)||""===e)&&n.push({name:"*",displayName:"@everyone",description:"Broadcast to all agents",isBroadcast:!0}),t.filter(t=>t.name.toLowerCase().includes(e)).forEach(e=>{n.push({name:e.name,displayName:"@".concat(e.name),description:e.status||"Agent"})}),n},[x,t]);(0,a.useEffect)(()=>{h(0)},[p.length]),(0,a.useEffect)(()=>{if(!m.current)return;let e=m.current.querySelector(".mention-item.selected");e&&e.scrollIntoView({block:"nearest"})},[o]);let g=(0,a.useCallback)(e=>{if(c&&0!==p.length)switch(e.key){case"ArrowDown":e.preventDefault(),h(e=>(e+1)%p.length);break;case"ArrowUp":e.preventDefault(),h(e=>(e-1+p.length)%p.length);break;case"Enter":case"Tab":e.preventDefault();let t=p[o];if(t){let e=ew(n,t.name);r(t.name,e)}break;case"Escape":e.preventDefault(),i()}},[c,p,o,n,r,i]);(0,a.useEffect)(()=>{if(c)return window.addEventListener("keydown",g),()=>window.removeEventListener("keydown",g)},[c,g]);let f=(0,a.useCallback)(e=>{let t=ew(n,e.name);r(e.name,t)},[n,r]);return c&&0!==p.length?(0,s.jsx)("div",{className:"mention-autocomplete",ref:m,children:p.map((e,t)=>(0,s.jsxs)("div",{className:"mention-item ".concat(t===o?"selected":""),onClick:()=>f(e),onMouseEnter:()=>h(t),children:[(0,s.jsx)("div",{className:"mention-avatar",style:{background:e.isBroadcast?"var(--accent-warning, #f59e0b)":d(e.name).primary},children:e.isBroadcast?"*":u(e.name)}),(0,s.jsxs)("div",{className:"mention-info",children:[(0,s.jsx)("span",{className:"mention-name",children:e.displayName}),(0,s.jsx)("span",{className:"mention-description",children:e.description})]})]},e.name))}):null}let eb={url:"",autoConnect:!0,reconnect:!0,maxReconnectAttempts:10,reconnectDelay:1e3},eC={async sendMessage(e){try{let t=await fetch("".concat("","/api/send"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),n=await t.json();if(t.ok&&n.success)return{success:!0};return{success:!1,error:n.error||"Failed to send message"}}catch(e){return{success:!1,error:"Network error"}}},async spawnAgent(e){try{let t=await fetch("".concat("","/api/spawn"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});return await t.json()}catch(t){return{success:!1,name:e.name,error:"Network error"}}},async getSpawnedAgents(){try{let e=await fetch("".concat("","/api/spawned")),t=await e.json();if(e.ok&&t.success)return{success:!0,data:{agents:t.agents||[]}};return{success:!1,error:t.error}}catch(e){return{success:!1,error:"Network error"}}},async releaseAgent(e){try{let t=await fetch("".concat("","/api/spawned/").concat(encodeURIComponent(e)),{method:"DELETE"}),n=await t.json();if(t.ok&&n.success)return{success:!0};return{success:!1,error:n.error}}catch(e){return{success:!1,error:"Network error"}}},async getData(){try{let e=await fetch("".concat("","/api/data")),t=await e.json();if(e.ok)return{success:!0,data:t};return{success:!1,error:"Failed to fetch data"}}catch(e){return{success:!1,error:"Network error"}}},async getBridgeData(){try{let e=await fetch("".concat("","/api/bridge")),t=await e.json();if(e.ok)return{success:!0,data:t};return{success:!1,error:"Failed to fetch bridge data"}}catch(e){return{success:!1,error:"Network error"}}},async getMetrics(){try{let e=await fetch("".concat("","/api/metrics")),t=await e.json();if(e.ok)return{success:!0,data:t};return{success:!1,error:"Failed to fetch metrics"}}catch(e){return{success:!1,error:"Network error"}}}};function eS(e){var t,n,l,r;let{wsUrl:i}=e,{data:c,isConnected:o,error:u}=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t={...eb,...e},n=t.url||function(){let e="https:"===window.location.protocol?"wss:":"ws:";return"".concat(e,"//localhost:3888/ws")}(),[s,l]=(0,a.useState)(null),[r,i]=(0,a.useState)(!1),[c,o]=(0,a.useState)(null),d=(0,a.useRef)(null),u=(0,a.useRef)(0),h=(0,a.useRef)(null),m=(0,a.useCallback)(()=>{var e;if((null===(e=d.current)||void 0===e?void 0:e.readyState)!==WebSocket.OPEN)try{let e=new WebSocket(n);e.onopen=()=>{i(!0),o(null),u.current=0},e.onclose=()=>{if(i(!1),d.current=null,t.reconnect&&u.current<t.maxReconnectAttempts){let e=Math.min(t.reconnectDelay*Math.pow(2,u.current),3e4);u.current++,h.current=setTimeout(()=>{m()},e)}},e.onerror=e=>{o(Error("WebSocket connection error")),console.error("[useWebSocket] Error:",e)},e.onmessage=e=>{try{let t=JSON.parse(e.data);l(t)}catch(e){console.error("[useWebSocket] Failed to parse message:",e)}},d.current=e}catch(e){o(e instanceof Error?e:Error("Failed to create WebSocket"))}},[n,t.reconnect,t.maxReconnectAttempts,t.reconnectDelay]),x=(0,a.useCallback)(()=>{h.current&&(clearTimeout(h.current),h.current=null),d.current&&(d.current.close(),d.current=null),i(!1)},[]);return(0,a.useEffect)(()=>(t.autoConnect&&m(),()=>{x()}),[t.autoConnect,m,x]),{data:s,isConnected:r,error:c,connect:m,disconnect:x}}({url:i}),[m,x]=(0,a.useState)("local"),[g,j]=(0,a.useState)([]),[v,y]=(0,a.useState)(),[k,w]=(0,a.useState)(!1),[N,b]=(0,a.useState)(!1),[C,S]=(0,a.useState)(null),[A,M]=(0,a.useState)(!1),[E,D]=(0,a.useState)(!1),[B,W]=(0,a.useState)(eu),[L,R]=(0,a.useState)(!1),T=(0,a.useCallback)(()=>{window.innerWidth<=768&&R(!1)},[]),{agents:O,groups:F,selectedAgent:V,selectAgent:_,searchQuery:I,setSearchQuery:H,totalCount:K,onlineCount:U,needsAttentionCount:J}=function(e){let{agents:t,initialSelected:n,initialSearchQuery:s=""}=e,[l,r]=(0,a.useState)(null!=n?n:null),[i,c]=(0,a.useState)(s),o=(0,a.useMemo)(()=>p(t,i),[t,i]),u=(0,a.useMemo)(()=>h(o),[o]),m=(0,a.useMemo)(()=>[...o].sort((e,t)=>e.name.localeCompare(t.name)),[o]),x=(0,a.useMemo)(()=>{var e;return null!==(e=t.find(e=>e.name===l))&&void 0!==e?e:null},[t,l]),g=(0,a.useMemo)(()=>{let e=f(t);return{totalCount:e.total,onlineCount:e.online,needsAttentionCount:e.needsAttention}},[t]),j=(0,a.useCallback)(e=>{r(e)},[]),v=(0,a.useCallback)(e=>t.find(t=>t.name===e),[t]),y=(0,a.useCallback)(e=>({...e,color:d(e.name)}),[]);return{agents:o,groups:u,sortedAgents:m,selectedAgent:x,selectAgent:j,searchQuery:i,setSearchQuery:c,...g,getAgentByName:v,getAgentWithColor:y}}({agents:null!==(l=null==c?void 0:c.agents)&&void 0!==l?l:[]}),{messages:G,currentChannel:Q,setCurrentChannel:$,currentThread:Y,setCurrentThread:X,sendMessage:ee,isSending:et,sendError:en}=function(e){let{messages:t,currentChannel:n="general"}=e,[s,l]=(0,a.useState)(n),[r,i]=(0,a.useState)(null),[c,o]=(0,a.useState)(!1),[d,u]=(0,a.useState)(null),h=(0,a.useMemo)(()=>"general"===s?t:t.filter(e=>e.from===s||e.to===s),[t,s]),m=(0,a.useCallback)(e=>t.filter(t=>t.thread===e),[t]),x=(0,a.useMemo)(()=>{let e=t.filter(e=>!e.isRead).length;return{totalCount:t.length,unreadCount:e}},[t]);return{messages:h,threadMessages:m,currentChannel:s,setCurrentChannel:l,currentThread:r,setCurrentThread:i,sendMessage:(0,a.useCallback)(async(e,t,n)=>{o(!0),u(null);try{let s=await fetch("/api/send",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({to:e,message:t,thread:n})}),a=await s.json();if(s.ok&&a.success)return!0;return u(a.error||"Failed to send message"),!1}catch(e){return u("Network error"),!1}finally{o(!1)}},[]),isSending:c,sendError:d,...x}}({messages:null!==(r=null==c?void 0:c.messages)&&void 0!==r?r:[]}),es=!!(null==c?void 0:null===(n=c.fleet)||void 0===n?void 0:null===(t=n.servers)||void 0===t?void 0:t.length);(0,a.useEffect)(()=>{if(!es)return;let e=async()=>{let e=await eC.getBridgeData();if(e.success&&e.data){let{servers:t,agents:n}=e.data;j(t.map(e=>({id:e.id,path:e.url,name:e.name||e.url.split("/").pop(),agents:n.filter(t=>t.server===e.id),lead:void 0})))}};e();let t=setInterval(e,3e4);return()=>clearInterval(t)},[es]);let ea=(0,a.useCallback)(e=>{y(e.id),e.agents.length>0&&(_(e.agents[0].name),$(e.agents[0].name)),T()},[_,$,T]),el=(0,a.useCallback)(e=>{_(e.name),$(e.name),T()},[_,$,T]),ei=(0,a.useCallback)(()=>{S(null),w(!0)},[]),ec=(0,a.useCallback)(()=>{D(!0)},[]),eo=(0,a.useCallback)(async e=>{b(!0),S(null);try{let t=await eC.spawnAgent({name:e.name,cli:e.command,team:e.team});if(!t.success)return S(t.error||"Failed to spawn agent"),!1;return!0}catch(e){return S(e instanceof Error?e.message:"Failed to spawn agent"),!1}finally{b(!1)}},[]),ed=(0,a.useCallback)(async e=>{if(e.isSpawned&&window.confirm('Are you sure you want to release agent "'.concat(e.name,'"?')))try{let t=await eC.releaseAgent(e.name);t.success||console.error("Failed to release agent:",t.error)}catch(e){console.error("Failed to release agent:",e)}},[]),em=(0,a.useCallback)(()=>{M(!0)},[]);return a.useEffect(()=>{let e=e=>{let t;t="system"===e?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":e,document.documentElement.setAttribute("data-theme",t)};if(e(B.theme),"system"===B.theme){let t=window.matchMedia("(prefers-color-scheme: dark)"),n=()=>e("system");return t.addEventListener("change",n),()=>t.removeEventListener("change",n)}},[B.theme]),a.useEffect(()=>{let e=e=>{(e.metaKey||e.ctrlKey)&&"k"===e.key&&(e.preventDefault(),M(!0)),(e.metaKey||e.ctrlKey)&&e.shiftKey&&"s"===e.key&&(e.preventDefault(),ei()),"Escape"===e.key&&(M(!1),w(!1))};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[ei]),(0,s.jsxs)("div",{className:"dashboard-app",children:[(0,s.jsx)("div",{className:"sidebar-overlay ".concat(L?"visible":""),onClick:()=>R(!1)}),(0,s.jsx)(P,{agents:O,projects:g,currentProject:v,selectedAgent:null==V?void 0:V.name,viewMode:m,isFleetAvailable:es,isConnected:o,isOpen:L,onAgentSelect:el,onProjectSelect:ea,onViewModeChange:x,onSpawnClick:ei,onReleaseClick:ed,onClose:()=>R(!1)}),(0,s.jsxs)("main",{className:"dashboard-main",children:[(0,s.jsx)(z,{currentChannel:Q,selectedAgent:V,onCommandPaletteOpen:em,onSettingsClick:ec,onMenuClick:()=>R(!0)}),(0,s.jsx)("div",{className:"dashboard-content",children:u?(0,s.jsxs)("div",{className:"error-state",children:[(0,s.jsx)(eE,{}),(0,s.jsx)("h2",{children:"Connection Error"}),(0,s.jsx)("p",{children:u.message}),(0,s.jsx)("button",{onClick:()=>window.location.reload(),children:"Retry Connection"})]}):c?(0,s.jsx)("div",{className:"messages-container",children:(0,s.jsx)(q,{messages:G,currentChannel:Q,onThreadClick:e=>X(e),highlightedMessageId:null!=Y?Y:void 0})}):(0,s.jsxs)("div",{className:"loading-state",children:[(0,s.jsx)(eM,{}),(0,s.jsx)("p",{children:"Connecting to dashboard..."})]})}),(0,s.jsx)("div",{className:"message-composer",children:(0,s.jsx)(eA,{recipient:"general"===Q?"*":Q,agents:O,onSend:ee,isSending:et,error:en})})]}),(0,s.jsx)(Z,{isOpen:A,onClose:()=>M(!1),agents:O,projects:g,currentProject:v,onAgentSelect:el,onProjectSelect:ea,onSpawnClick:ei,onGeneralClick:()=>{_(null),$("general")}}),(0,s.jsx)(er,{isOpen:k,onClose:()=>w(!1),onSpawn:eo,existingAgents:O.map(e=>e.name),isSpawning:N,error:C}),(0,s.jsx)(eh,{isOpen:E,onClose:()=>D(!1),settings:B,onSettingsChange:W,onResetSettings:()=>W(eu)})]})}function eA(e){let{recipient:t,agents:n,onSend:l,isSending:r,error:i}=e,[c,o]=(0,a.useState)(""),[d,u]=(0,a.useState)(0),[h,m]=(0,a.useState)(!1),x=(0,a.useRef)(null),p=async e=>{let n,s;if(e.preventDefault(),!c.trim()||r)return;let a=c.match(/^@(\S+)\s*([\s\S]*)/);if(a){let e=a[1];s=a[2]||"",n="*"===e||"everyone"===e.toLowerCase()||"all"===e.toLowerCase()?"*":e}else n=t,s=c;await l(n,s||c)&&(o(""),m(!1))};return(0,s.jsxs)("form",{className:"composer-form",onSubmit:p,children:[(0,s.jsxs)("div",{className:"composer-input-wrapper",children:[(0,s.jsx)(eN,{agents:n,inputValue:c,cursorPosition:d,onSelect:(e,t)=>{o(t),m(!1),setTimeout(()=>{if(x.current){x.current.focus();let e=t.indexOf(" ")+1;x.current.setSelectionRange(e,e)}},0)},onClose:()=>m(!1),isVisible:h}),(0,s.jsx)("textarea",{ref:x,className:"composer-input",placeholder:"Message ".concat("*"===t?"everyone":"@"+t,"... (Shift+Enter for new line)"),value:c,onChange:e=>{let t=e.target.value,n=e.target.selectionStart||0;o(t),u(n),m(null!==ek(t,n))},onKeyDown:e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),c.trim()&&!r&&p(e))},onSelect:e=>u(e.target.selectionStart||0),disabled:r,rows:1})]}),(0,s.jsx)("button",{type:"submit",className:"composer-send",disabled:!c.trim()||r,title:r?"Sending...":"Send message",children:r?(0,s.jsx)("span",{className:"composer-send-text",children:"Sending..."}):(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("span",{className:"composer-send-text",children:"Send"}),(0,s.jsxs)("svg",{className:"composer-send-icon",width:"18",height:"18",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,s.jsx)("line",{x1:"22",y1:"2",x2:"11",y2:"13"}),(0,s.jsx)("polygon",{points:"22 2 15 22 11 13 2 9 22 2"})]})]})}),i&&(0,s.jsx)("span",{className:"composer-error",children:i})]})}function eM(){return(0,s.jsx)("svg",{className:"spinner",width:"24",height:"24",viewBox:"0 0 24 24",children:(0,s.jsx)("circle",{cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"2",fill:"none",strokeDasharray:"32",strokeLinecap:"round"})})}function eE(){return(0,s.jsxs)("svg",{width:"48",height:"48",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.5",children:[(0,s.jsx)("circle",{cx:"12",cy:"12",r:"10"}),(0,s.jsx)("line",{x1:"12",y1:"8",x2:"12",y2:"12"}),(0,s.jsx)("line",{x1:"12",y1:"16",x2:"12.01",y2:"16"})]})}function eD(){return(0,s.jsx)(eS,{})}}},function(e){e.O(0,[971,117,744],function(){return e(e.s=8440)}),_N_E=e.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[744],{262:function(e,n,t){Promise.resolve().then(t.t.bind(t,2846,23)),Promise.resolve().then(t.t.bind(t,9107,23)),Promise.resolve().then(t.t.bind(t,1060,23)),Promise.resolve().then(t.t.bind(t,4707,23)),Promise.resolve().then(t.t.bind(t,80,23)),Promise.resolve().then(t.t.bind(t,6423,23))}},function(e){var n=function(n){return e(e.s=n)};e.O(0,[971,117],function(){return n(4278),n(262)}),_N_E=e.O()}]);
@@ -1 +0,0 @@
1
- *,:after,:before{box-sizing:border-box;margin:0;padding:0}:root{--color-bg-primary:#1a1d21;--color-bg-secondary:#222529;--color-bg-tertiary:#19171d;--color-bg-hover:hsla(0,0%,100%,.06);--color-bg-active:hsla(0,0%,100%,.1);--color-text-primary:#d1d2d3;--color-text-secondary:#ababad;--color-text-muted:#8d8d8e;--color-text-inverse:#1a1d21;--color-border:hsla(0,0%,100%,.1);--color-border-light:hsla(0,0%,100%,.06);--color-border-dark:hsla(0,0%,100%,.15);--color-accent:#1264a3;--color-accent-hover:#0d4f82;--color-accent-light:rgba(18,100,163,.15);--color-success:#2bac76;--color-success-light:rgba(43,172,118,.15);--color-warning:#e8a427;--color-warning-light:rgba(232,164,39,.15);--color-error:#e01e5a;--color-error-light:rgba(224,30,90,.15);--sidebar-bg:#1a1a2e;--sidebar-border:#2a2a3e;--sidebar-hover:#3a3a4e;--font-sans:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;--font-mono:"SF Mono",SFMono-Regular,Consolas,"Liberation Mono",Menlo,monospace;--text-xs:11px;--text-sm:13px;--text-base:14px;--text-lg:15px;--text-xl:16px;--text-2xl:18px;--font-normal:400;--font-medium:500;--font-semibold:600;--font-bold:700;--space-1:4px;--space-2:8px;--space-3:12px;--space-4:16px;--space-5:20px;--space-6:24px;--space-8:32px;--radius-sm:4px;--radius-md:6px;--radius-lg:8px;--radius-xl:12px;--shadow-sm:0 1px 2px rgba(0,0,0,.05);--shadow-md:0 1px 3px rgba(0,0,0,.1);--shadow-lg:0 4px 6px rgba(0,0,0,.1);--shadow-xl:0 10px 15px rgba(0,0,0,.1);--sidebar-width:260px;--header-height:52px;--transition-fast:150ms ease;--transition-normal:200ms ease;--transition-slow:300ms ease}body,html{height:100%;font-family:var(--font-sans);font-size:var(--text-base);color:var(--color-text-primary);background:var(--color-bg-primary);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px}button:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--color-border-dark);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:var(--color-text-muted)}::selection{background:var(--color-accent-light);color:var(--color-accent)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.status-online{color:var(--color-success)}.status-offline{color:var(--color-text-muted)}.status-busy{color:var(--color-warning)}.status-error{color:var(--color-error)}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes slideUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes slideDown{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}[data-theme=light]{--color-bg-primary:#fff;--color-bg-secondary:#f8f9fa;--color-bg-tertiary:#f1f3f5;--color-bg-hover:rgba(0,0,0,.04);--color-bg-active:rgba(0,0,0,.08);--color-text-primary:#1a1d21;--color-text-secondary:#616061;--color-text-muted:#868686;--color-text-inverse:#fff;--color-border:rgba(0,0,0,.1);--color-border-light:rgba(0,0,0,.06);--color-border-dark:rgba(0,0,0,.15);--color-accent:#1264a3;--color-accent-hover:#0d4f82;--color-accent-light:rgba(18,100,163,.1);--color-success:#2bac76;--color-success-light:rgba(43,172,118,.1);--color-warning:#e8a427;--color-warning-light:rgba(232,164,39,.1);--color-error:#e01e5a;--color-error-light:rgba(224,30,90,.1);--sidebar-bg:#3f0e40;--sidebar-border:#522653;--sidebar-hover:#4a154b}[data-theme=light] .sidebar{background:var(--sidebar-bg);border-right-color:var(--sidebar-border)}[data-theme=light] .sidebar-search,[data-theme=light] .view-mode-toggle{background:hsla(0,0%,100%,.1)}[data-theme=light] .toggle-btn.active{background:hsla(0,0%,100%,.2)}[data-theme=light] .message-badge.broadcast{background:rgba(232,164,39,.15);color:#b47e1a}.dashboard-app{display:flex;height:100vh;background:var(--color-bg-primary)}.dashboard-main{flex:1 1;display:flex;flex-direction:column;min-width:0}.dashboard-content{flex:1 1;overflow-y:auto;padding:var(--space-5)}.error-state,.loading-state{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:var(--color-text-secondary);text-align:center}.loading-state .spinner{animation:spin 1s linear infinite;margin-bottom:var(--space-4)}.error-state svg{color:var(--color-error);margin-bottom:var(--space-4)}.error-state h2{margin:0 0 var(--space-2);color:var(--color-text-primary)}.error-state button{margin-top:var(--space-4);padding:var(--space-2) var(--space-4);background:var(--color-accent);color:var(--color-text-inverse);border:none;border-radius:var(--radius-sm);cursor:pointer;transition:background var(--transition-fast)}.error-state button:hover{background:var(--color-accent-hover)}.messages-container{height:100%}.messages-placeholder{background:var(--color-bg-secondary);border-radius:var(--radius-lg);padding:var(--space-5);box-shadow:var(--shadow-md)}.agent-summary{margin-top:var(--space-4);padding:var(--space-3);background:var(--color-bg-tertiary);border-radius:var(--radius-sm)}.agent-summary p{margin:var(--space-1) 0;font-size:var(--text-sm)}.message-composer{padding:var(--space-4);background:var(--color-bg-secondary);border-top:1px solid var(--color-border)}.composer-form{display:flex;gap:var(--space-2);align-items:center}.composer-input-wrapper{flex:1 1;position:relative}.composer-input{width:100%;padding:10px 14px;border:1px solid var(--color-border);border-radius:var(--radius-md);font-size:var(--text-base);font-family:var(--font-sans);outline:none;transition:border-color var(--transition-fast);box-sizing:border-box;background:var(--color-bg-tertiary);color:var(--color-text-primary)}.composer-input::placeholder{color:var(--color-text-muted)}.composer-input:focus{border-color:var(--color-accent)}.mention-autocomplete{position:absolute;bottom:100%;left:0;right:0;max-height:200px;overflow-y:auto;background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:var(--radius-lg);box-shadow:0 -4px 12px rgba(0,0,0,.1);z-index:100;margin-bottom:4px}.mention-item{display:flex;align-items:center;gap:10px;padding:var(--space-2) var(--space-3);cursor:pointer;transition:background var(--transition-fast)}.mention-item.selected,.mention-item:hover{background:var(--color-bg-hover)}.mention-avatar{width:28px;height:28px;border-radius:var(--radius-md);display:flex;align-items:center;justify-content:center;color:var(--color-text-inverse);font-size:11px;font-weight:var(--font-semibold);flex-shrink:0}.mention-info{display:flex;flex-direction:column;gap:2px;min-width:0}.mention-name{font-size:var(--text-base);font-weight:var(--font-medium);color:var(--color-text-primary)}.mention-description,.mention-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mention-description{font-size:var(--text-sm);color:var(--color-text-muted)}.composer-send{padding:10px 20px;background:var(--color-accent);color:var(--color-text-inverse);border:none;border-radius:var(--radius-md);font-size:var(--text-base);font-weight:var(--font-medium);cursor:pointer;transition:background var(--transition-fast)}.composer-send:hover:not(:disabled){background:var(--color-accent-hover)}.composer-send:disabled{opacity:.5;cursor:not-allowed}.composer-send-icon{display:none}.composer-error{color:var(--color-error);font-size:var(--text-xs)}.modal-overlay{position:fixed;inset:0;background:rgba(0,0,0,.5);display:flex;align-items:center;justify-content:center;z-index:1000;animation:fadeIn var(--transition-fast)}.modal{background:var(--color-bg-secondary);border-radius:var(--radius-lg);padding:var(--space-6);min-width:400px;max-width:90vw;animation:slideUp var(--transition-normal)}.modal h2{margin:0 0 var(--space-4)}.command-palette{border-radius:var(--radius-lg);padding:var(--space-2);width:500px;box-shadow:var(--shadow-xl);animation:slideDown var(--transition-normal)}.command-palette input{width:100%;padding:var(--space-3) var(--space-4);border:none;font-size:var(--text-xl);font-family:var(--font-sans);outline:none}.sidebar{width:280px;height:100vh;background:#1a1a2e;color:#e8e8e8;display:flex;flex-direction:column;border-right:1px solid #2a2a3e}.sidebar-header{padding:16px;border-bottom:1px solid #2a2a3e}.sidebar-title{display:flex;align-items:center;gap:8px;margin-bottom:12px}.sidebar-title h1{font-size:18px;font-weight:600;margin:0}.connection-indicator{width:8px;height:8px;border-radius:50%}.connection-indicator.connected{background:#22c55e}.connection-indicator.disconnected{background:#6b7280}.view-mode-toggle{display:flex;background:#2a2a3e;border-radius:6px;padding:2px}.toggle-btn{flex:1 1;padding:6px 12px;background:transparent;border:none;color:#888;font-size:12px;cursor:pointer;border-radius:4px;transition:all .2s}.toggle-btn.active{background:#3a3a4e;color:#fff}.sidebar-search{padding:12px 16px;display:flex;align-items:center;gap:8px;background:#2a2a3e;margin:12px;border-radius:6px}.sidebar-search input{flex:1 1;background:transparent;border:none;color:#e8e8e8;font-size:13px;outline:none}.sidebar-search input::placeholder{color:#666}.sidebar-search svg{color:#666}.clear-btn{background:transparent;border:none;color:#666;cursor:pointer;padding:2px;display:flex;align-items:center;justify-content:center}.clear-btn:hover{color:#999}.sidebar-content{flex:1 1;overflow-y:auto;padding:0 8px}.sidebar-footer{padding:16px;border-top:1px solid #2a2a3e}.spawn-btn{width:100%;padding:10px 16px;background:#3a3a4e;border:1px solid #4a4a5e;border-radius:6px;color:#e8e8e8;font-size:13px;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:8px;transition:background .2s}.spawn-btn:hover{background:#4a4a5e}.sidebar-footer .metrics-link,a.metrics-link{width:100%;display:flex;align-items:center;justify-content:center;gap:8px;padding:10px 16px;margin-bottom:8px;background:#3a3a4e;border:1px solid #4a4a5e;border-radius:6px;color:#e8e8e8;font-size:13px;font-weight:500;text-decoration:none;cursor:pointer;transition:all .2s ease;box-sizing:border-box}.sidebar-footer .metrics-link:hover,a.metrics-link:hover{background:#4a4a5e;border-color:#5a5a6e;color:#fff}.sidebar-footer .metrics-link:visited,a.metrics-link:visited{color:#e8e8e8}.metrics-link svg{flex-shrink:0;width:16px;height:16px}.header{height:52px;background:var(--color-bg-secondary);border-bottom:1px solid var(--color-border);justify-content:space-between;padding:0 16px}.header,.header-left{display:flex;align-items:center}.header-left{gap:8px}.channel-prefix{color:var(--color-text-muted);font-size:16px}.channel-name{font-weight:600;font-size:15px;color:var(--color-text-primary)}.channel-breadcrumb,.channel-topic{color:var(--color-text-muted);font-size:13px;margin-left:8px;padding-left:8px;border-left:1px solid var(--color-border)}.channel-info{display:flex;flex-direction:column}.channel-info .channel-breadcrumb{margin-left:0;padding-left:0;border-left:none;font-size:11px}.agent-avatar-small{width:28px;height:28px;border-radius:6px;display:flex;align-items:center;justify-content:center;font-weight:600;font-size:11px}.agent-status-badge{background:var(--color-bg-hover);color:var(--color-text-secondary);font-size:11px;padding:2px 8px;border-radius:4px;margin-left:8px}.header-right{gap:8px}.header-btn,.header-right{display:flex;align-items:center}.header-btn{gap:6px;padding:6px 12px;background:var(--color-bg-hover);border:1px solid var(--color-border);border-radius:6px;color:var(--color-text-secondary);font-size:13px;cursor:pointer;transition:all .2s}.header-btn:hover{background:var(--color-bg-active);color:var(--color-text-primary)}.header-btn kbd{background:var(--color-bg-tertiary);border:1px solid var(--color-border);border-radius:3px;padding:1px 4px;font-size:11px;color:var(--color-text-muted)}.icon-btn{padding:6px}.icon-btn svg{display:block}a.header-btn{text-decoration:none}a.header-btn:visited{color:var(--color-text-secondary)}.agent-list{display:flex;flex-direction:column;gap:4px}.agent-list-header{display:flex;justify-content:space-between;align-items:center;padding:8px 12px;font-size:12px;color:#666}.toggle-all-btn{background:none;border:none;color:#1264a3;cursor:pointer;font-size:12px}.toggle-all-btn:hover{text-decoration:underline}.agent-list-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 20px;color:#888;text-align:center}.agent-list-empty svg{margin-bottom:12px;opacity:.5}.agent-group{margin-bottom:4px}.agent-group-header{display:flex;align-items:center;gap:8px;width:100%;padding:8px 12px;background:none;border:none;cursor:pointer;font-size:13px;text-align:left;border-radius:4px;transition:background .2s;position:relative}.agent-group-header:hover{background:var(--group-light,#f5f5f5)}.group-color-bar{position:absolute;left:0;top:4px;bottom:4px;width:3px;background:var(--group-color,#888);border-radius:2px}.chevron-icon{transition:transform .2s;color:#888}.chevron-icon.expanded{transform:rotate(90deg)}.group-name{font-weight:600;color:#e8e8e8}.group-count{color:#888;font-weight:400}.group-stats{margin-left:auto;display:flex;gap:8px}.stat{display:flex;align-items:center;gap:4px;font-size:11px;color:#666}.stat-dot{width:6px;height:6px;border-radius:50%}.agent-group-content{padding:4px 0 4px 16px;display:flex;flex-direction:column;gap:8px}.agent-card{background:var(--agent-light,#f8f8f8);border:1px solid var(--agent-primary,#888);border-radius:8px;padding:12px;cursor:pointer;transition:all .2s ease}.agent-card:hover{box-shadow:0 2px 8px rgba(0,0,0,.1);transform:translateY(-1px)}.agent-card.selected{border-width:2px;box-shadow:0 0 0 2px var(--agent-light,#f8f8f8)}.agent-card-header{display:flex;align-items:center;gap:12px}.agent-avatar{width:40px;height:40px;border-radius:8px;display:flex;align-items:center;justify-content:center;font-weight:600;font-size:14px;position:relative}.status-indicator{position:absolute;bottom:-2px;right:-2px;width:12px;height:12px;border-radius:50%;border:2px solid #fff}.agent-status-dot{width:8px;height:8px;border-radius:50%}.agent-info{flex:1 1;min-width:0}.agent-name-row{display:flex;align-items:center;gap:8px}.agent-display-name{font-weight:600;font-size:14px;color:var(--color-text-primary)}.agent-breadcrumb,.agent-full-name{font-size:12px;color:var(--color-text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.attention-badge{background:#ef4444;color:#fff;font-size:10px;font-weight:700;width:16px;height:16px;border-radius:50%;display:flex;align-items:center;justify-content:center}.agent-task{margin-top:8px;padding:8px;background:var(--color-bg-hover);border-radius:4px;font-size:12px}.task-label{color:var(--color-text-secondary);margin-right:4px}.task-text{color:var(--color-text-primary)}.agent-card-footer{margin-top:12px;display:flex;justify-content:space-between;align-items:center}.agent-meta{display:flex;gap:8px;font-size:11px;color:#888}.agent-cli{background:var(--color-bg-hover);padding:2px 6px;border-radius:4px}.message-count{color:var(--agent-primary,#888)}.message-btn{background:var(--agent-primary,#888);color:#fff;border:none;border-radius:4px;padding:4px 8px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:opacity .2s}.message-btn:hover{opacity:.9}.agent-actions{display:flex;gap:6px}.release-btn{position:relative;background:linear-gradient(180deg,#3a1a1a,#2a0f0f);color:#ff6b6b;border:1px solid #4a2020;border-radius:6px;padding:6px 10px;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:4px;transition:all .2s ease;box-shadow:inset 0 1px 0 hsla(0,100%,71%,.1),0 2px 4px rgba(0,0,0,.3);overflow:hidden}.release-btn:before{content:"";position:absolute;inset:0;background:repeating-linear-gradient(0deg,transparent,transparent 2px,rgba(0,0,0,.1) 0,rgba(0,0,0,.1) 4px);pointer-events:none;opacity:.5}.release-btn:hover{background:linear-gradient(180deg,#4a2020,#3a1515);border-color:#f44;color:#f44;box-shadow:inset 0 1px 0 rgba(255,68,68,.2),0 0 12px rgba(255,68,68,.4),0 2px 8px rgba(0,0,0,.4);transform:scale(1.05)}.release-btn:hover .release-icon{animation:killPulse .6s ease-in-out infinite}@keyframes killPulse{0%,to{opacity:1}50%{opacity:.6}}.release-btn:active{transform:scale(.98);box-shadow:inset 0 2px 4px rgba(0,0,0,.4),0 0 8px rgba(255,68,68,.3)}.agent-card-compact{display:flex;align-items:center;gap:8px;padding:8px 12px;border-radius:4px;cursor:pointer;transition:background .2s}.agent-card-compact.selected,.agent-card-compact:hover{background:var(--agent-light,hsla(0,0%,100%,.1))}.agent-card-compact.selected{border-left:3px solid var(--agent-primary,#888)}.agent-card-compact .agent-name{flex:1 1;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#e8e8e8}.agent-card-compact .attention-badge{width:8px;height:8px;margin-left:auto}.agent-compact-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.release-btn-compact{position:relative;background:transparent;border:1px solid transparent;color:#666;padding:5px;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:5px;transition:all .25s ease;opacity:0}.agent-card-compact:hover .release-btn-compact{opacity:.7}.release-btn-compact:hover{opacity:1!important;background:linear-gradient(180deg,rgba(255,68,68,.15),rgba(180,40,40,.2));border-color:rgba(255,68,68,.5);color:#f55;box-shadow:0 0 10px rgba(255,68,68,.3);transform:scale(1.1)}.release-btn-compact:hover .release-icon{animation:killPulseCompact .5s ease-in-out infinite;filter:drop-shadow(0 0 3px rgba(255,68,68,.6))}@keyframes killPulseCompact{0%,to{transform:scale(1)}50%{transform:scale(1.1)}}.release-btn-compact:active{transform:scale(.95);background:rgba(255,68,68,.25)}.message-list{gap:4px;padding:16px}.message-list,.message-list-empty{display:flex;flex-direction:column}.message-list-empty{align-items:center;justify-content:center;height:100%;color:#888;text-align:center}.message-list-empty svg{margin-bottom:16px;opacity:.5}.message-list-empty h3{margin:0 0 8px;font-size:16px;color:var(--color-text-secondary)}.message-list-empty p{margin:0;font-size:13px}.message-item{display:flex;gap:12px;padding:8px 12px;border-radius:6px;transition:background .15s}.message-item:hover{background:var(--color-bg-hover)}.message-item.highlighted{background:var(--color-warning-light);border-left:3px solid var(--color-warning);padding-left:9px}.message-avatar{flex-shrink:0;width:36px;height:36px;border-radius:8px;display:flex;align-items:center;justify-content:center;font-weight:600;font-size:12px}.message-content{flex:1 1;min-width:0}.message-header{display:flex;align-items:center;gap:6px;margin-bottom:4px}.message-sender{font-weight:600;font-size:14px;color:var(--color-text-primary)}.message-arrow{color:var(--color-text-muted);font-size:12px}.message-recipient{font-weight:500;font-size:13px;color:var(--color-text-secondary)}.message-time{color:#888;font-size:11px;margin-left:auto}.message-badge{font-size:10px;padding:2px 6px;border-radius:3px;text-transform:uppercase;font-weight:500}.message-badge.broadcast{background:#dbeafe;color:#1d4ed8}.message-body{font-size:14px;line-height:1.5;color:var(--color-text-primary);white-space:pre-wrap;word-break:break-word}.message-link{color:#1264a3;text-decoration:none}.message-link:hover{text-decoration:underline}.message-thread-btn{display:inline-flex;align-items:center;gap:4px;margin-top:8px;padding:4px 8px;background:transparent;border:1px solid var(--color-border);border-radius:4px;color:var(--color-text-secondary);font-size:12px;cursor:pointer;transition:all .15s}.message-thread-btn:hover{background:var(--color-bg-hover);border-color:var(--color-border-dark);color:var(--color-text-primary)}.message-thread-btn svg{opacity:.7}.command-palette-overlay{position:fixed;inset:0;background:rgba(0,0,0,.5);display:flex;align-items:flex-start;justify-content:center;padding-top:15vh;z-index:1000;animation:fadeIn .15s ease}.command-palette{background:var(--color-bg-secondary);border-radius:12px;width:560px;max-width:90vw;max-height:60vh;display:flex;flex-direction:column;box-shadow:0 16px 70px rgba(0,0,0,.5);animation:slideDown .2s ease}.command-palette-input-wrapper{display:flex;align-items:center;gap:12px;padding:16px;border-bottom:1px solid var(--color-border)}.command-palette-input-wrapper svg{color:var(--color-text-muted);flex-shrink:0}.command-palette-input{flex:1 1;border:none;font-size:16px;font-family:inherit;outline:none;background:transparent;color:var(--color-text-primary)}.command-palette-input::placeholder{color:var(--color-text-muted)}.command-palette-kbd{background:var(--color-bg-hover);border:1px solid var(--color-border);border-radius:4px;padding:2px 6px;font-size:11px;color:var(--color-text-muted);font-family:inherit}.command-palette-list{flex:1 1;overflow-y:auto;padding:8px}.command-palette-empty{padding:32px;text-align:center;color:#888;font-size:14px}.command-palette-group{margin-bottom:8px}.command-palette-group-label{font-size:11px;font-weight:600;color:#888;text-transform:uppercase;letter-spacing:.5px;padding:8px 12px 4px}.command-palette-item{display:flex;align-items:center;gap:12px;width:100%;padding:10px 12px;border:none;background:transparent;border-radius:8px;cursor:pointer;text-align:left;font-family:inherit;transition:background .1s}.command-palette-item.selected,.command-palette-item:hover{background:var(--color-bg-hover)}.command-palette-item.selected{background:var(--color-accent-light)}.command-palette-item-icon{color:var(--color-text-secondary)}.command-palette-agent-icon,.command-palette-item-icon{display:flex;align-items:center;justify-content:center;width:28px;height:28px}.command-palette-agent-icon{border-radius:6px;font-size:11px;font-weight:600}.command-palette-item-content{flex:1 1;min-width:0;display:flex;flex-direction:column;gap:2px}.command-palette-item-label{font-size:14px;font-weight:500;color:var(--color-text-primary)}.command-palette-item-desc{font-size:12px;color:var(--color-text-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.command-palette-item-shortcut{background:var(--color-bg-hover);border:1px solid var(--color-border);border-radius:4px;padding:2px 6px;font-size:11px;color:var(--color-text-secondary);font-family:inherit}.spawn-modal-overlay{position:fixed;inset:0;background:rgba(0,0,0,.5);display:flex;align-items:center;justify-content:center;z-index:1000;animation:fadeIn .15s ease}.spawn-modal{background:var(--color-bg-secondary);border-radius:12px;width:480px;max-width:90vw;max-height:90vh;overflow-y:auto;box-shadow:0 16px 70px rgba(0,0,0,.5);animation:slideUp .2s ease}.spawn-modal-header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px;border-bottom:1px solid var(--color-border)}.spawn-modal-header h2{margin:0;font-size:18px;font-weight:600}.spawn-modal-close{display:flex;align-items:center;justify-content:center;width:32px;height:32px;background:transparent;border:none;border-radius:6px;color:var(--color-text-secondary);cursor:pointer;transition:all .15s}.spawn-modal-close:hover{background:var(--color-bg-hover);color:var(--color-text-primary)}.spawn-modal form{padding:24px}.spawn-modal-section{margin-bottom:20px}.spawn-modal-label{display:block;font-size:13px;font-weight:600;color:var(--color-text-primary);margin-bottom:8px}.spawn-modal-optional{font-weight:400;color:var(--color-text-muted)}.spawn-modal-templates{display:grid;grid-template-columns:repeat(3,1fr);grid-gap:8px;gap:8px}.spawn-modal-template{display:flex;flex-direction:column;align-items:center;gap:4px;padding:12px 8px;background:var(--color-bg-hover);border:2px solid transparent;border-radius:8px;cursor:pointer;transition:all .15s;font-family:inherit}.spawn-modal-template:hover{background:var(--color-bg-active)}.spawn-modal-template.selected{background:var(--color-accent-light);border-color:var(--color-accent)}.spawn-modal-template-icon{font-size:24px}.spawn-modal-template-name{font-size:13px;font-weight:600;color:var(--color-text-primary)}.spawn-modal-template-desc{font-size:11px;color:var(--color-text-muted);text-align:center}.spawn-modal-name-input{display:flex;align-items:center;gap:12px}.spawn-modal-name-preview{flex-shrink:0;width:40px;height:40px;border-radius:8px;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:600}.spawn-modal-input{flex:1 1;padding:10px 14px;border:1px solid var(--color-border);border-radius:6px;font-size:14px;font-family:inherit;outline:none;transition:border-color .15s;background:var(--color-bg-tertiary);color:var(--color-text-primary)}.spawn-modal-input:focus{border-color:var(--color-accent)}.spawn-modal-input:disabled{background:var(--color-bg-hover);color:var(--color-text-muted)}.spawn-modal-name-suggestions{display:flex;gap:6px;margin-top:8px}.spawn-modal-suggestion{padding:4px 8px;background:var(--color-bg-hover);border:1px solid var(--color-border);border-radius:4px;font-size:12px;color:var(--color-text-secondary);cursor:pointer;font-family:inherit;transition:all .15s}.spawn-modal-suggestion:hover{background:var(--color-bg-active);color:var(--color-text-primary)}.spawn-modal-error{display:flex;align-items:center;gap:8px;padding:12px;background:#fef2f2;border:1px solid #fecaca;border-radius:6px;color:#dc2626;font-size:13px;margin-bottom:20px}.spawn-modal-error svg{flex-shrink:0}.spawn-modal-actions{display:flex;justify-content:flex-end;gap:8px;padding-top:8px;border-top:1px solid var(--color-border)}.spawn-modal-btn{display:flex;align-items:center;gap:6px;padding:10px 16px;border:none;border-radius:6px;font-size:14px;font-weight:500;cursor:pointer;font-family:inherit;transition:all .15s}.spawn-modal-btn:disabled{opacity:.5;cursor:not-allowed}.spawn-modal-btn-secondary{background:var(--color-bg-hover);color:var(--color-text-secondary)}.spawn-modal-btn-secondary:hover:not(:disabled){background:var(--color-bg-active);color:var(--color-text-primary)}.spawn-modal-btn-primary{background:#1264a3;color:#fff}.spawn-modal-btn-primary:hover:not(:disabled){background:#0d4f82}.spawn-modal-spinner{animation:spin 1s linear infinite}.settings-overlay{position:fixed;inset:0;background:rgba(0,0,0,.5);display:flex;align-items:center;justify-content:center;z-index:1000;animation:fadeIn .15s ease}.settings-panel{background:var(--color-bg-secondary);border-radius:12px;width:500px;max-width:90vw;max-height:80vh;display:flex;flex-direction:column;box-shadow:0 16px 70px rgba(0,0,0,.5);animation:slideUp .2s ease}.settings-header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px;border-bottom:1px solid var(--color-border)}.settings-header h2{margin:0;font-size:18px;font-weight:600}.settings-close{display:flex;align-items:center;justify-content:center;width:32px;height:32px;background:transparent;border:none;border-radius:6px;color:var(--color-text-secondary);cursor:pointer;transition:all .15s}.settings-close:hover{background:var(--color-bg-hover);color:var(--color-text-primary)}.settings-tabs{display:flex;gap:4px;padding:12px 24px;border-bottom:1px solid var(--color-border);background:var(--color-bg-tertiary)}.settings-tab{display:flex;align-items:center;gap:6px;padding:8px 14px;background:transparent;border:none;border-radius:6px;font-size:13px;color:var(--color-text-secondary);cursor:pointer;font-family:inherit;transition:all .15s}.settings-tab:hover{background:var(--color-bg-hover);color:var(--color-text-primary)}.settings-tab.active{background:#1264a3;color:#fff}.settings-content{flex:1 1;overflow-y:auto;padding:24px}.settings-section{gap:24px}.settings-group,.settings-section{display:flex;flex-direction:column}.settings-group{gap:12px}.settings-label{font-size:12px;font-weight:600;color:#888;text-transform:uppercase;letter-spacing:.5px}.settings-theme-options{display:flex;gap:8px}.settings-theme-btn{display:flex;flex-direction:column;align-items:center;gap:6px;padding:16px 20px;background:var(--color-bg-hover);border:2px solid transparent;border-radius:8px;font-size:12px;color:var(--color-text-secondary);cursor:pointer;font-family:inherit;transition:all .15s;flex:1 1}.settings-theme-btn:hover{background:var(--color-bg-active)}.settings-theme-btn.active{background:var(--color-accent-light);border-color:var(--color-accent);color:var(--color-accent)}.settings-toggle-option{display:flex;align-items:center;justify-content:space-between;padding:12px;background:var(--color-bg-hover);border-radius:8px}.settings-toggle-option.disabled{opacity:.5}.settings-toggle-info{display:flex;flex-direction:column;gap:2px}.settings-toggle-label{font-size:14px;font-weight:500;color:var(--color-text-primary)}.settings-toggle-desc{font-size:12px;color:var(--color-text-muted)}.settings-toggle{width:44px;height:24px;background:#d0d0d0;border:none;border-radius:12px;cursor:pointer;position:relative;transition:background .2s}.settings-toggle.on{background:#1264a3}.settings-toggle:disabled{cursor:not-allowed}.settings-toggle-thumb{position:absolute;top:2px;left:2px;width:20px;height:20px;background:#fff;border-radius:50%;transition:transform .2s;box-shadow:0 1px 3px rgba(0,0,0,.2)}.settings-toggle.on .settings-toggle-thumb{transform:translateX(20px)}.settings-input-group{display:flex;flex-direction:column;gap:6px;padding:12px;background:var(--color-bg-hover);border-radius:8px}.settings-input-group label{font-weight:500}.settings-input,.settings-input-group label{font-size:14px;color:var(--color-text-primary)}.settings-input{padding:8px 12px;border:1px solid var(--color-border);border-radius:6px;font-family:inherit;outline:none;transition:border-color .15s;background:var(--color-bg-tertiary)}.settings-input:focus{border-color:var(--color-accent)}.settings-input:disabled{background:var(--color-bg-hover);color:var(--color-text-muted)}.settings-footer{display:flex;align-items:center;justify-content:space-between;padding:16px 24px;border-top:1px solid var(--color-border)}.settings-reset-btn{padding:8px 16px;background:transparent;border:1px solid var(--color-border);border-radius:6px;font-size:13px;color:var(--color-text-secondary);cursor:pointer;font-family:inherit;transition:all .15s}.settings-reset-btn:hover{background:var(--color-bg-hover);color:var(--color-text-primary)}.settings-done-btn{padding:8px 20px;background:#1264a3;border:none;border-radius:6px;font-size:13px;font-weight:500;color:#fff;cursor:pointer;font-family:inherit;transition:background .15s}.settings-done-btn:hover{background:#0d4f82}.touch-target{min-width:44px;min-height:44px}.mobile-menu-btn{display:none;align-items:center;justify-content:center;width:44px;height:44px;background:transparent;border:none;color:var(--color-text-primary);cursor:pointer;border-radius:var(--radius-md);transition:background var(--transition-fast)}.mobile-menu-btn:hover{background:var(--color-bg-hover)}.mobile-menu-btn svg{width:24px;height:24px}.sidebar-overlay{display:none;position:fixed;inset:0;background:rgba(0,0,0,.5);z-index:999;animation:fadeIn var(--transition-fast)}.sidebar-overlay.visible{display:block}@media (max-width:768px){.mobile-menu-btn{display:flex}.sidebar{position:fixed;left:0;top:0;z-index:1000;transform:translateX(-100%);transition:transform var(--transition-normal);width:280px;max-width:85vw}.sidebar.open{transform:translateX(0)}.sidebar-overlay{display:none}.sidebar-overlay.visible{display:block}.dashboard-app{flex-direction:column}.dashboard-main{width:100%}.header{padding:0 12px}.header-left{flex:1 1;min-width:0}.channel-name{max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.channel-breadcrumb,.channel-topic,.header-btn kbd,.header-btn span{display:none}.command-palette-btn{padding:8px}.command-palette{width:90vw;max-height:70vh}.command-palette-item{padding:12px;min-height:44px}.spawn-modal{width:95vw;max-height:85vh}.spawn-modal-templates{grid-template-columns:repeat(3,1fr)}.spawn-modal-template{padding:10px 6px;min-height:44px}.settings-panel{width:95vw;max-height:85vh}.settings-tabs{overflow-x:auto;padding:12px;gap:8px}.settings-tab{min-height:44px;white-space:nowrap}.settings-theme-options{flex-direction:column}.settings-theme-btn{flex-direction:row;justify-content:flex-start;padding:12px 16px;min-height:44px}.message-composer{padding:12px}.composer-form{flex-wrap:wrap}.composer-input-wrapper{width:100%;order:1}.composer-send{order:2;width:44px;min-height:44px;padding:0;display:flex;align-items:center;justify-content:center;flex-shrink:0}.composer-send-text{display:none}.composer-send-icon{display:block}.message-list{padding:12px}.message-item{padding:12px 8px}.message-avatar{width:32px;height:32px}.agent-card{padding:16px}.agent-card-compact{padding:12px;min-height:44px}.agent-avatar{width:36px;height:36px}.agent-group-header{padding:12px;min-height:44px}.agent-group-content{padding:8px 0 8px 8px}.fleet-grid{grid-template-columns:1fr}.decision-item{padding:16px}.trajectory-step{padding:12px}.server-card{padding:16px}.notification-toast{width:calc(100vw - 24px);max-width:400px;left:12px;right:12px;margin:0 auto}.project-header{padding:12px;min-height:44px}.project-agents{padding:8px 0 8px 12px}}@media (max-width:480px){.sidebar{width:100vw;max-width:100vw}.sidebar-header{padding:12px}.sidebar-title h1{font-size:16px}.sidebar-search{margin:8px;padding:10px 12px}.sidebar-footer{padding:12px}.spawn-btn{min-height:44px}.header{height:48px;padding:0 8px}.header-left{gap:6px}.channel-name{font-size:14px;max-width:120px}.agent-avatar-small{width:24px;height:24px;font-size:10px}.command-palette-overlay{padding-top:0;align-items:stretch}.command-palette{width:100vw;max-width:100vw;height:100vh;max-height:100vh;border-radius:0}.command-palette-input-wrapper{padding:12px}.command-palette-input{font-size:16px}.command-palette-item{padding:14px 12px}.spawn-modal-overlay{align-items:stretch;padding:0}.spawn-modal{width:100vw;max-width:100vw;height:100vh;max-height:100vh;border-radius:0}.spawn-modal form,.spawn-modal-header{padding:16px}.spawn-modal-templates{grid-template-columns:1fr}.spawn-modal-template{flex-direction:row;justify-content:flex-start;gap:12px;padding:14px}.spawn-modal-template-icon{font-size:20px}.spawn-modal-name-input{flex-direction:column;align-items:stretch}.spawn-modal-name-preview{display:none}.spawn-modal-input{font-size:16px;min-height:44px}.spawn-modal-name-suggestions{flex-wrap:wrap}.spawn-modal-suggestion{min-height:36px;display:flex;align-items:center}.spawn-modal-actions{flex-direction:column-reverse}.spawn-modal-btn{width:100%;justify-content:center;min-height:44px}.settings-overlay{align-items:stretch;padding:0}.settings-panel{width:100vw;max-width:100vw;height:100vh;max-height:100vh;border-radius:0}.settings-header{padding:16px}.settings-tabs{padding:8px 12px}.settings-tab{padding:10px 12px;font-size:12px}.settings-content{padding:16px}.settings-toggle-option{flex-direction:column;align-items:stretch;gap:12px}.settings-toggle{align-self:flex-end}.settings-footer{flex-direction:column-reverse;gap:8px;padding:16px}.settings-done-btn,.settings-reset-btn{width:100%;min-height:44px;justify-content:center}.composer-input{font-size:16px;min-height:44px}.composer-send{width:44px}.message-list{padding:8px}.message-item{flex-direction:column;gap:8px}.message-avatar{width:28px;height:28px}.message-header{flex-wrap:wrap}.message-time{width:100%;margin-left:0;margin-top:4px}.agent-card-compact .agent-name{font-size:14px}.agent-compact-info{flex:1 1;min-width:0}.mention-autocomplete{max-height:50vh}.mention-item{padding:12px;min-height:44px}.notification-toast{bottom:12px;left:8px;right:8px;width:auto}.toast-content{padding:14px 16px}.toast-close{min-width:44px;min-height:44px}}@media (max-width:320px){.header{height:44px}.mobile-menu-btn{width:40px;height:40px}.channel-name{font-size:13px;max-width:100px}.sidebar-title h1{font-size:14px}.settings-header h2,.spawn-modal-header h2{font-size:16px}.command-palette-input{font-size:14px}.agent-card-compact{padding:10px}}@media (max-width:768px) and (orientation:landscape){.sidebar{width:300px}.command-palette{max-height:90vh}.settings-panel,.spawn-modal{max-height:95vh}}@media (-webkit-min-device-pixel-ratio:2),(min-resolution:192dpi){.agent-status-dot,.connection-indicator,.stat-dot{box-shadow:0 0 0 .5px rgba(0,0,0,.1)}}@media (prefers-reduced-motion:reduce){*,:after,:before{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}.sidebar{transition:none}}@supports (padding:env(safe-area-inset-bottom)){.sidebar-footer{padding-bottom:calc(16px + env(safe-area-inset-bottom))}.message-composer{padding-bottom:calc(12px + env(safe-area-inset-bottom))}.settings-footer,.spawn-modal-actions{padding-bottom:calc(16px + env(safe-area-inset-bottom))}.notification-toast{bottom:calc(12px + env(safe-area-inset-bottom))}}