agent-bundle 0.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 (376) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +161 -0
  3. package/dist/agent/agent.d.ts +32 -0
  4. package/dist/agent/agent.js +241 -0
  5. package/dist/agent/agent.js.map +1 -0
  6. package/dist/agent/agent.test-helpers.d.ts +63 -0
  7. package/dist/agent/agent.test-helpers.js +170 -0
  8. package/dist/agent/agent.test-helpers.js.map +1 -0
  9. package/dist/agent/define-agent.d.ts +2 -0
  10. package/dist/agent/define-agent.js +18 -0
  11. package/dist/agent/define-agent.js.map +1 -0
  12. package/dist/agent/dependencies.d.ts +15 -0
  13. package/dist/agent/dependencies.js +14 -0
  14. package/dist/agent/dependencies.js.map +1 -0
  15. package/dist/agent/index.d.ts +4 -0
  16. package/dist/agent/index.js +5 -0
  17. package/dist/agent/index.js.map +1 -0
  18. package/dist/agent/internals.d.ts +28 -0
  19. package/dist/agent/internals.js +160 -0
  20. package/dist/agent/internals.js.map +1 -0
  21. package/dist/agent/session.d.ts +4 -0
  22. package/dist/agent/session.js +2 -0
  23. package/dist/agent/session.js.map +1 -0
  24. package/dist/agent/types.d.ts +52 -0
  25. package/dist/agent/types.js +2 -0
  26. package/dist/agent/types.js.map +1 -0
  27. package/dist/agent-loop/agent-loop.d.ts +27 -0
  28. package/dist/agent-loop/agent-loop.js +2 -0
  29. package/dist/agent-loop/agent-loop.js.map +1 -0
  30. package/dist/agent-loop/index.d.ts +4 -0
  31. package/dist/agent-loop/index.js +5 -0
  32. package/dist/agent-loop/index.js.map +1 -0
  33. package/dist/agent-loop/pi-mono/events.d.ts +3 -0
  34. package/dist/agent-loop/pi-mono/events.js +73 -0
  35. package/dist/agent-loop/pi-mono/events.js.map +1 -0
  36. package/dist/agent-loop/pi-mono/index.d.ts +1 -0
  37. package/dist/agent-loop/pi-mono/index.js +2 -0
  38. package/dist/agent-loop/pi-mono/index.js.map +1 -0
  39. package/dist/agent-loop/pi-mono/input.d.ts +6 -0
  40. package/dist/agent-loop/pi-mono/input.js +120 -0
  41. package/dist/agent-loop/pi-mono/input.js.map +1 -0
  42. package/dist/agent-loop/pi-mono/model.d.ts +7 -0
  43. package/dist/agent-loop/pi-mono/model.js +72 -0
  44. package/dist/agent-loop/pi-mono/model.js.map +1 -0
  45. package/dist/agent-loop/pi-mono/pi-mono-loop.d.ts +11 -0
  46. package/dist/agent-loop/pi-mono/pi-mono-loop.js +167 -0
  47. package/dist/agent-loop/pi-mono/pi-mono-loop.js.map +1 -0
  48. package/dist/agent-loop/pi-mono/pi-mono-loop.test-helpers.d.ts +28 -0
  49. package/dist/agent-loop/pi-mono/pi-mono-loop.test-helpers.js +76 -0
  50. package/dist/agent-loop/pi-mono/pi-mono-loop.test-helpers.js.map +1 -0
  51. package/dist/agent-loop/pi-mono/queue.d.ts +9 -0
  52. package/dist/agent-loop/pi-mono/queue.js +37 -0
  53. package/dist/agent-loop/pi-mono/queue.js.map +1 -0
  54. package/dist/agent-loop/pi-mono/tools.d.ts +4 -0
  55. package/dist/agent-loop/pi-mono/tools.js +164 -0
  56. package/dist/agent-loop/pi-mono/tools.js.map +1 -0
  57. package/dist/agent-loop/pi-mono/utils.d.ts +14 -0
  58. package/dist/agent-loop/pi-mono/utils.js +83 -0
  59. package/dist/agent-loop/pi-mono/utils.js.map +1 -0
  60. package/dist/agent-loop/system-prompt/fill.d.ts +1 -0
  61. package/dist/agent-loop/system-prompt/fill.js +19 -0
  62. package/dist/agent-loop/system-prompt/fill.js.map +1 -0
  63. package/dist/agent-loop/system-prompt/generate.d.ts +11 -0
  64. package/dist/agent-loop/system-prompt/generate.js +21 -0
  65. package/dist/agent-loop/system-prompt/generate.js.map +1 -0
  66. package/dist/agent-loop/system-prompt/index.d.ts +2 -0
  67. package/dist/agent-loop/system-prompt/index.js +3 -0
  68. package/dist/agent-loop/system-prompt/index.js.map +1 -0
  69. package/dist/agent-loop/types.d.ts +77 -0
  70. package/dist/agent-loop/types.js +2 -0
  71. package/dist/agent-loop/types.js.map +1 -0
  72. package/dist/cli/build/build.d.ts +35 -0
  73. package/dist/cli/build/build.js +174 -0
  74. package/dist/cli/build/build.js.map +1 -0
  75. package/dist/cli/build/build.test-helpers.d.ts +9 -0
  76. package/dist/cli/build/build.test-helpers.js +50 -0
  77. package/dist/cli/build/build.test-helpers.js.map +1 -0
  78. package/dist/cli/build/codegen-commands.d.ts +16 -0
  79. package/dist/cli/build/codegen-commands.js +81 -0
  80. package/dist/cli/build/codegen-commands.js.map +1 -0
  81. package/dist/cli/build/codegen.d.ts +55 -0
  82. package/dist/cli/build/codegen.js +212 -0
  83. package/dist/cli/build/codegen.js.map +1 -0
  84. package/dist/cli/build/e2b-template.d.ts +38 -0
  85. package/dist/cli/build/e2b-template.js +210 -0
  86. package/dist/cli/build/e2b-template.js.map +1 -0
  87. package/dist/cli/build/e2b-template.test-helpers.d.ts +19 -0
  88. package/dist/cli/build/e2b-template.test-helpers.js +80 -0
  89. package/dist/cli/build/e2b-template.test-helpers.js.map +1 -0
  90. package/dist/cli/build/sandbox-image.d.ts +35 -0
  91. package/dist/cli/build/sandbox-image.js +57 -0
  92. package/dist/cli/build/sandbox-image.js.map +1 -0
  93. package/dist/cli/build-codegen.d.ts +41 -0
  94. package/dist/cli/build-codegen.js +168 -0
  95. package/dist/cli/build-codegen.js.map +1 -0
  96. package/dist/cli/build-e2b-template.d.ts +38 -0
  97. package/dist/cli/build-e2b-template.js +223 -0
  98. package/dist/cli/build-e2b-template.js.map +1 -0
  99. package/dist/cli/build-e2b-template.test-helpers.d.ts +19 -0
  100. package/dist/cli/build-e2b-template.test-helpers.js +80 -0
  101. package/dist/cli/build-e2b-template.test-helpers.js.map +1 -0
  102. package/dist/cli/build-sandbox-image.d.ts +35 -0
  103. package/dist/cli/build-sandbox-image.js +57 -0
  104. package/dist/cli/build-sandbox-image.js.map +1 -0
  105. package/dist/cli/build.d.ts +30 -0
  106. package/dist/cli/build.js +151 -0
  107. package/dist/cli/build.js.map +1 -0
  108. package/dist/cli/build.test-helpers.d.ts +9 -0
  109. package/dist/cli/build.test-helpers.js +50 -0
  110. package/dist/cli/build.test-helpers.js.map +1 -0
  111. package/dist/cli/config/load-bundle-config.d.ts +2 -0
  112. package/dist/cli/config/load-bundle-config.js +20 -0
  113. package/dist/cli/config/load-bundle-config.js.map +1 -0
  114. package/dist/cli/config/resolve-project-root.d.ts +1 -0
  115. package/dist/cli/config/resolve-project-root.js +19 -0
  116. package/dist/cli/config/resolve-project-root.js.map +1 -0
  117. package/dist/cli/deploy/aws-cli.d.ts +42 -0
  118. package/dist/cli/deploy/aws-cli.js +95 -0
  119. package/dist/cli/deploy/aws-cli.js.map +1 -0
  120. package/dist/cli/deploy/aws-ecr.d.ts +20 -0
  121. package/dist/cli/deploy/aws-ecr.js +97 -0
  122. package/dist/cli/deploy/aws-ecr.js.map +1 -0
  123. package/dist/cli/deploy/aws-ecs-infra.d.ts +39 -0
  124. package/dist/cli/deploy/aws-ecs-infra.js +169 -0
  125. package/dist/cli/deploy/aws-ecs-infra.js.map +1 -0
  126. package/dist/cli/deploy/aws-ecs-role.d.ts +9 -0
  127. package/dist/cli/deploy/aws-ecs-role.js +114 -0
  128. package/dist/cli/deploy/aws-ecs-role.js.map +1 -0
  129. package/dist/cli/deploy/aws-ecs-service.d.ts +37 -0
  130. package/dist/cli/deploy/aws-ecs-service.js +207 -0
  131. package/dist/cli/deploy/aws-ecs-service.js.map +1 -0
  132. package/dist/cli/deploy/aws-ecs-shared.d.ts +59 -0
  133. package/dist/cli/deploy/aws-ecs-shared.js +30 -0
  134. package/dist/cli/deploy/aws-ecs-shared.js.map +1 -0
  135. package/dist/cli/deploy/aws-ecs.d.ts +3 -0
  136. package/dist/cli/deploy/aws-ecs.js +141 -0
  137. package/dist/cli/deploy/aws-ecs.js.map +1 -0
  138. package/dist/cli/deploy/aws-prerequisites.d.ts +16 -0
  139. package/dist/cli/deploy/aws-prerequisites.js +28 -0
  140. package/dist/cli/deploy/aws-prerequisites.js.map +1 -0
  141. package/dist/cli/deploy/aws-teardown.d.ts +13 -0
  142. package/dist/cli/deploy/aws-teardown.js +204 -0
  143. package/dist/cli/deploy/aws-teardown.js.map +1 -0
  144. package/dist/cli/deploy/deploy.d.ts +36 -0
  145. package/dist/cli/deploy/deploy.js +209 -0
  146. package/dist/cli/deploy/deploy.js.map +1 -0
  147. package/dist/cli/error.d.ts +1 -0
  148. package/dist/cli/error.js +4 -0
  149. package/dist/cli/error.js.map +1 -0
  150. package/dist/cli/generate/generate.d.ts +37 -0
  151. package/dist/cli/generate/generate.js +121 -0
  152. package/dist/cli/generate/generate.js.map +1 -0
  153. package/dist/cli/generate.d.ts +32 -0
  154. package/dist/cli/generate.js +102 -0
  155. package/dist/cli/generate.js.map +1 -0
  156. package/dist/cli/index.d.ts +2 -0
  157. package/dist/cli/index.js +182 -0
  158. package/dist/cli/index.js.map +1 -0
  159. package/dist/cli/load-bundle-config.d.ts +2 -0
  160. package/dist/cli/load-bundle-config.js +20 -0
  161. package/dist/cli/load-bundle-config.js.map +1 -0
  162. package/dist/cli/resolve-project-root.d.ts +1 -0
  163. package/dist/cli/resolve-project-root.js +19 -0
  164. package/dist/cli/resolve-project-root.js.map +1 -0
  165. package/dist/cli/serve/dev.d.ts +6 -0
  166. package/dist/cli/serve/dev.js +73 -0
  167. package/dist/cli/serve/dev.js.map +1 -0
  168. package/dist/cli/serve/http.d.ts +12 -0
  169. package/dist/cli/serve/http.js +123 -0
  170. package/dist/cli/serve/http.js.map +1 -0
  171. package/dist/cli/serve/init.d.ts +42 -0
  172. package/dist/cli/serve/init.js +110 -0
  173. package/dist/cli/serve/init.js.map +1 -0
  174. package/dist/cli/serve/runtime.d.ts +25 -0
  175. package/dist/cli/serve/runtime.js +142 -0
  176. package/dist/cli/serve/runtime.js.map +1 -0
  177. package/dist/cli/serve/serve.d.ts +7 -0
  178. package/dist/cli/serve/serve.js +63 -0
  179. package/dist/cli/serve/serve.js.map +1 -0
  180. package/dist/cli/serve/serve.test-helpers.d.ts +36 -0
  181. package/dist/cli/serve/serve.test-helpers.js +205 -0
  182. package/dist/cli/serve/serve.test-helpers.js.map +1 -0
  183. package/dist/cli/serve/worktree-port.d.ts +36 -0
  184. package/dist/cli/serve/worktree-port.js +124 -0
  185. package/dist/cli/serve/worktree-port.js.map +1 -0
  186. package/dist/cli/serve-http.d.ts +12 -0
  187. package/dist/cli/serve-http.js +112 -0
  188. package/dist/cli/serve-http.js.map +1 -0
  189. package/dist/cli/serve-runtime.d.ts +16 -0
  190. package/dist/cli/serve-runtime.js +122 -0
  191. package/dist/cli/serve-runtime.js.map +1 -0
  192. package/dist/cli/serve.d.ts +33 -0
  193. package/dist/cli/serve.js +150 -0
  194. package/dist/cli/serve.js.map +1 -0
  195. package/dist/cli/serve.test-helpers.d.ts +30 -0
  196. package/dist/cli/serve.test-helpers.js +145 -0
  197. package/dist/cli/serve.test-helpers.js.map +1 -0
  198. package/dist/code-formatter/bundle.json +41 -0
  199. package/dist/code-formatter/index.ts +26 -0
  200. package/dist/code-formatter/package.json +10 -0
  201. package/dist/code-formatter/types.ts +2 -0
  202. package/dist/code-formatter-e2b/bundle.json +40 -0
  203. package/dist/code-formatter-e2b/index.ts +25 -0
  204. package/dist/code-formatter-e2b/package.json +10 -0
  205. package/dist/code-formatter-e2b/types.ts +2 -0
  206. package/dist/coding-assistant-ollama/bundle.json +43 -0
  207. package/dist/coding-assistant-ollama/index.ts +28 -0
  208. package/dist/coding-assistant-ollama/package.json +10 -0
  209. package/dist/coding-assistant-ollama/types.ts +2 -0
  210. package/dist/commands/find.d.ts +8 -0
  211. package/dist/commands/find.js +11 -0
  212. package/dist/commands/find.js.map +1 -0
  213. package/dist/commands/loader.d.ts +13 -0
  214. package/dist/commands/loader.js +163 -0
  215. package/dist/commands/loader.js.map +1 -0
  216. package/dist/commands/types.d.ts +7 -0
  217. package/dist/commands/types.js +2 -0
  218. package/dist/commands/types.js.map +1 -0
  219. package/dist/commands/with-commands.d.ts +6 -0
  220. package/dist/commands/with-commands.js +19 -0
  221. package/dist/commands/with-commands.js.map +1 -0
  222. package/dist/data-analyst/bundle.json +40 -0
  223. package/dist/data-analyst/index.ts +25 -0
  224. package/dist/data-analyst/package.json +10 -0
  225. package/dist/data-analyst/types.ts +2 -0
  226. package/dist/financial-analyst/bundle.json +40 -0
  227. package/dist/financial-analyst/index.ts +25 -0
  228. package/dist/financial-analyst/package.json +10 -0
  229. package/dist/financial-analyst/types.ts +2 -0
  230. package/dist/mcp/client-manager.d.ts +26 -0
  231. package/dist/mcp/client-manager.js +101 -0
  232. package/dist/mcp/client-manager.js.map +1 -0
  233. package/dist/mcp/connect-server.d.ts +21 -0
  234. package/dist/mcp/connect-server.js +170 -0
  235. package/dist/mcp/connect-server.js.map +1 -0
  236. package/dist/mcp/index.d.ts +2 -0
  237. package/dist/mcp/index.js +3 -0
  238. package/dist/mcp/index.js.map +1 -0
  239. package/dist/mcp/sandbox-stdio-transport.d.ts +32 -0
  240. package/dist/mcp/sandbox-stdio-transport.js +199 -0
  241. package/dist/mcp/sandbox-stdio-transport.js.map +1 -0
  242. package/dist/observability/hooks.d.ts +10 -0
  243. package/dist/observability/hooks.js +97 -0
  244. package/dist/observability/hooks.js.map +1 -0
  245. package/dist/observability/index.d.ts +6 -0
  246. package/dist/observability/index.js +7 -0
  247. package/dist/observability/index.js.map +1 -0
  248. package/dist/observability/metrics.d.ts +31 -0
  249. package/dist/observability/metrics.js +61 -0
  250. package/dist/observability/metrics.js.map +1 -0
  251. package/dist/observability/middleware.d.ts +12 -0
  252. package/dist/observability/middleware.js +45 -0
  253. package/dist/observability/middleware.js.map +1 -0
  254. package/dist/observability/otel-harness.test-util.d.ts +37 -0
  255. package/dist/observability/otel-harness.test-util.js +96 -0
  256. package/dist/observability/otel-harness.test-util.js.map +1 -0
  257. package/dist/observability/provider.d.ts +8 -0
  258. package/dist/observability/provider.js +19 -0
  259. package/dist/observability/provider.js.map +1 -0
  260. package/dist/observability/tracing.d.ts +14 -0
  261. package/dist/observability/tracing.js +40 -0
  262. package/dist/observability/tracing.js.map +1 -0
  263. package/dist/observability/types.d.ts +39 -0
  264. package/dist/observability/types.js +31 -0
  265. package/dist/observability/types.js.map +1 -0
  266. package/dist/personalized-recommend/bundle.json +64 -0
  267. package/dist/personalized-recommend/index.ts +41 -0
  268. package/dist/personalized-recommend/package.json +10 -0
  269. package/dist/personalized-recommend/types.ts +2 -0
  270. package/dist/plugins/loader.d.ts +11 -0
  271. package/dist/plugins/loader.js +100 -0
  272. package/dist/plugins/loader.js.map +1 -0
  273. package/dist/plugins/merge.d.ts +10 -0
  274. package/dist/plugins/merge.js +22 -0
  275. package/dist/plugins/merge.js.map +1 -0
  276. package/dist/plugins/parse.d.ts +10 -0
  277. package/dist/plugins/parse.js +139 -0
  278. package/dist/plugins/parse.js.map +1 -0
  279. package/dist/plugins/types.d.ts +28 -0
  280. package/dist/plugins/types.js +2 -0
  281. package/dist/plugins/types.js.map +1 -0
  282. package/dist/plugins/urls.d.ts +7 -0
  283. package/dist/plugins/urls.js +40 -0
  284. package/dist/plugins/urls.js.map +1 -0
  285. package/dist/runtime.d.ts +5 -0
  286. package/dist/runtime.js +3 -0
  287. package/dist/runtime.js.map +1 -0
  288. package/dist/sandbox/factory.d.ts +2 -0
  289. package/dist/sandbox/factory.js +27 -0
  290. package/dist/sandbox/factory.js.map +1 -0
  291. package/dist/sandbox/index.d.ts +4 -0
  292. package/dist/sandbox/index.js +5 -0
  293. package/dist/sandbox/index.js.map +1 -0
  294. package/dist/sandbox/providers/e2b.d.ts +28 -0
  295. package/dist/sandbox/providers/e2b.js +294 -0
  296. package/dist/sandbox/providers/e2b.js.map +1 -0
  297. package/dist/sandbox/providers/kubernetes-command-run.d.ts +8 -0
  298. package/dist/sandbox/providers/kubernetes-command-run.js +195 -0
  299. package/dist/sandbox/providers/kubernetes-command-run.js.map +1 -0
  300. package/dist/sandbox/providers/kubernetes-helpers.d.ts +31 -0
  301. package/dist/sandbox/providers/kubernetes-helpers.js +152 -0
  302. package/dist/sandbox/providers/kubernetes-helpers.js.map +1 -0
  303. package/dist/sandbox/providers/kubernetes-kubeconfig.d.ts +7 -0
  304. package/dist/sandbox/providers/kubernetes-kubeconfig.js +51 -0
  305. package/dist/sandbox/providers/kubernetes-kubeconfig.js.map +1 -0
  306. package/dist/sandbox/providers/kubernetes-spawn.d.ts +2 -0
  307. package/dist/sandbox/providers/kubernetes-spawn.js +42 -0
  308. package/dist/sandbox/providers/kubernetes-spawn.js.map +1 -0
  309. package/dist/sandbox/providers/kubernetes-spawn.utils.d.ts +32 -0
  310. package/dist/sandbox/providers/kubernetes-spawn.utils.js +249 -0
  311. package/dist/sandbox/providers/kubernetes-spawn.utils.js.map +1 -0
  312. package/dist/sandbox/providers/kubernetes.constants.d.ts +3 -0
  313. package/dist/sandbox/providers/kubernetes.constants.js +4 -0
  314. package/dist/sandbox/providers/kubernetes.constants.js.map +1 -0
  315. package/dist/sandbox/providers/kubernetes.d.ts +37 -0
  316. package/dist/sandbox/providers/kubernetes.js +258 -0
  317. package/dist/sandbox/providers/kubernetes.js.map +1 -0
  318. package/dist/sandbox/types.d.ts +57 -0
  319. package/dist/sandbox/types.js +2 -0
  320. package/dist/sandbox/types.js.map +1 -0
  321. package/dist/sandbox/utils.d.ts +1 -0
  322. package/dist/sandbox/utils.js +4 -0
  323. package/dist/sandbox/utils.js.map +1 -0
  324. package/dist/schema/bundle.d.ts +143 -0
  325. package/dist/schema/bundle.js +203 -0
  326. package/dist/schema/bundle.js.map +1 -0
  327. package/dist/service/command-routes.d.ts +8 -0
  328. package/dist/service/command-routes.js +44 -0
  329. package/dist/service/command-routes.js.map +1 -0
  330. package/dist/service/create-server.d.ts +9 -0
  331. package/dist/service/create-server.js +113 -0
  332. package/dist/service/create-server.js.map +1 -0
  333. package/dist/service/index.d.ts +1 -0
  334. package/dist/service/index.js +2 -0
  335. package/dist/service/index.js.map +1 -0
  336. package/dist/skills/index.d.ts +1 -0
  337. package/dist/skills/index.js +2 -0
  338. package/dist/skills/index.js.map +1 -0
  339. package/dist/skills/loader.d.ts +18 -0
  340. package/dist/skills/loader.js +142 -0
  341. package/dist/skills/loader.js.map +1 -0
  342. package/dist/skills/summaries.d.ts +8 -0
  343. package/dist/skills/summaries.js +9 -0
  344. package/dist/skills/summaries.js.map +1 -0
  345. package/dist/test-helpers/env.d.ts +2 -0
  346. package/dist/test-helpers/env.js +20 -0
  347. package/dist/test-helpers/env.js.map +1 -0
  348. package/dist/test-helpers/mock-agent.d.ts +56 -0
  349. package/dist/test-helpers/mock-agent.js +180 -0
  350. package/dist/test-helpers/mock-agent.js.map +1 -0
  351. package/dist/test-helpers/mock-sandbox.d.ts +33 -0
  352. package/dist/test-helpers/mock-sandbox.js +200 -0
  353. package/dist/test-helpers/mock-sandbox.js.map +1 -0
  354. package/dist/tui/index.d.ts +2 -0
  355. package/dist/tui/index.js +3 -0
  356. package/dist/tui/index.js.map +1 -0
  357. package/dist/tui/render.d.ts +8 -0
  358. package/dist/tui/render.js +40 -0
  359. package/dist/tui/render.js.map +1 -0
  360. package/dist/tui/tui.d.ts +19 -0
  361. package/dist/tui/tui.js +133 -0
  362. package/dist/tui/tui.js.map +1 -0
  363. package/dist/webui/create-webui-server.d.ts +22 -0
  364. package/dist/webui/create-webui-server.js +293 -0
  365. package/dist/webui/create-webui-server.js.map +1 -0
  366. package/dist/webui/event-bus.d.ts +16 -0
  367. package/dist/webui/event-bus.js +24 -0
  368. package/dist/webui/event-bus.js.map +1 -0
  369. package/dist/webui/index.d.ts +2 -0
  370. package/dist/webui/index.js +3 -0
  371. package/dist/webui/index.js.map +1 -0
  372. package/dist/webui/public/app.js +847 -0
  373. package/dist/webui/public/file-transfer.js +114 -0
  374. package/dist/webui/public/index.html +166 -0
  375. package/dist/webui/public/styles.css +1678 -0
  376. package/package.json +99 -0
@@ -0,0 +1,1678 @@
1
+ /* ==========================================================================
2
+ agent-bundle WebUI — Stylesheet
3
+ Design system aligned with site/index.html landing page
4
+ ========================================================================== */
5
+
6
+ /* -- Reset -- */
7
+ *,
8
+ *::before,
9
+ *::after {
10
+ margin: 0;
11
+ padding: 0;
12
+ box-sizing: border-box;
13
+ }
14
+
15
+ /* -- Design Tokens -- */
16
+ :root {
17
+ --bg: #13151c;
18
+ --bg-elevated: #1c1f2b;
19
+ --bg-card: #1f2330;
20
+ --bg-input: #232738;
21
+ --bg-surface: #272b3b;
22
+ --border: rgba(255, 255, 255, 0.14);
23
+ --border-hover: rgba(255, 255, 255, 0.24);
24
+ --border-strong: rgba(255, 255, 255, 0.20);
25
+ --text: #f5f5f7;
26
+ --text-secondary: #b0b0bc;
27
+ --text-muted: #8e8e9d;
28
+ --violet: #8b5cf6;
29
+ --violet-soft: rgba(139, 92, 246, 0.18);
30
+ --violet-glow: rgba(139, 92, 246, 0.35);
31
+ --teal: #2dd4bf;
32
+ --teal-soft: rgba(45, 212, 191, 0.14);
33
+ --green: #4ade80;
34
+ --green-soft: rgba(74, 222, 128, 0.14);
35
+ --red: #f87171;
36
+ --red-soft: rgba(248, 113, 113, 0.14);
37
+ --yellow: #fbbf24;
38
+ --yellow-soft: rgba(251, 191, 36, 0.10);
39
+ --blue: #60a5fa;
40
+ --blue-soft: rgba(96, 165, 250, 0.10);
41
+ --orange: #fb923c;
42
+ --pink: #f472b6;
43
+ --font-sans: 'Outfit', system-ui, -apple-system, sans-serif;
44
+ --font-mono: 'Fira Code', 'SF Mono', 'Cascadia Code', 'JetBrains Mono', monospace;
45
+ --radius: 8px;
46
+ --radius-lg: 12px;
47
+ --radius-sm: 6px;
48
+ --header-h: 52px;
49
+ --input-min-h: 52px;
50
+ --sidebar-w: 220px;
51
+ --chat-w: 380px;
52
+ --transition-fast: 0.15s ease-out;
53
+ --transition-normal: 0.25s ease-out;
54
+ --transition-slow: 0.4s ease-out;
55
+ --panel-bg: #181b25;
56
+ --panel-header-bg: #1a1d28;
57
+ }
58
+
59
+ html, body {
60
+ height: 100%;
61
+ background: var(--bg);
62
+ color: var(--text);
63
+ font-family: var(--font-sans);
64
+ font-size: 15px;
65
+ line-height: 1.6;
66
+ overflow: hidden;
67
+ -webkit-font-smoothing: antialiased;
68
+ -moz-osx-font-smoothing: grayscale;
69
+ }
70
+
71
+ /* -- App Shell -- */
72
+ #app {
73
+ display: flex;
74
+ flex-direction: column;
75
+ height: 100%;
76
+ position: relative;
77
+ z-index: 2;
78
+ }
79
+
80
+ /* ==========================================================================
81
+ Gradient Mesh Background + Noise
82
+ ========================================================================== */
83
+
84
+ .mesh-bg {
85
+ position: fixed;
86
+ inset: 0;
87
+ z-index: 0;
88
+ pointer-events: none;
89
+ overflow: hidden;
90
+ }
91
+
92
+ .mesh-bg::before {
93
+ content: '';
94
+ position: absolute;
95
+ width: 800px;
96
+ height: 800px;
97
+ top: -200px;
98
+ right: -200px;
99
+ background: radial-gradient(circle, rgba(139, 92, 246, 0.10) 0%, transparent 70%);
100
+ animation: meshDrift1 20s ease-in-out infinite alternate;
101
+ }
102
+
103
+ .mesh-bg::after {
104
+ content: '';
105
+ position: absolute;
106
+ width: 600px;
107
+ height: 600px;
108
+ bottom: -100px;
109
+ left: -100px;
110
+ background: radial-gradient(circle, rgba(45, 212, 191, 0.07) 0%, transparent 70%);
111
+ animation: meshDrift2 25s ease-in-out infinite alternate;
112
+ }
113
+
114
+ @keyframes meshDrift1 {
115
+ from { transform: translate(0, 0); }
116
+ to { transform: translate(-80px, 60px); }
117
+ }
118
+
119
+ @keyframes meshDrift2 {
120
+ from { transform: translate(0, 0); }
121
+ to { transform: translate(60px, -40px); }
122
+ }
123
+
124
+ .noise {
125
+ position: fixed;
126
+ inset: 0;
127
+ z-index: 1;
128
+ pointer-events: none;
129
+ opacity: 0.04;
130
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
131
+ background-repeat: repeat;
132
+ background-size: 256px 256px;
133
+ }
134
+
135
+ /* ==========================================================================
136
+ Header
137
+ ========================================================================== */
138
+
139
+ #header {
140
+ height: var(--header-h);
141
+ display: flex;
142
+ align-items: center;
143
+ gap: 12px;
144
+ padding: 0 20px;
145
+ border-bottom: 1px solid var(--border);
146
+ background: rgba(15, 17, 23, 0.80);
147
+ backdrop-filter: blur(24px) saturate(1.2);
148
+ -webkit-backdrop-filter: blur(24px) saturate(1.2);
149
+ flex-shrink: 0;
150
+ z-index: 50;
151
+ border-top: 2px solid transparent;
152
+ border-image: linear-gradient(90deg, var(--violet), rgba(139, 92, 246, 0.3), transparent) 1;
153
+ }
154
+
155
+ .logo {
156
+ font-family: var(--font-sans);
157
+ font-weight: 700;
158
+ font-size: 16px;
159
+ color: var(--text);
160
+ letter-spacing: -0.3px;
161
+ user-select: none;
162
+ }
163
+
164
+ .logo .dot, .logo .logo-dot { color: var(--violet); }
165
+
166
+ /* Hamburger menu toggle */
167
+ .menu-toggle {
168
+ display: none;
169
+ align-items: center;
170
+ justify-content: center;
171
+ width: 44px;
172
+ height: 44px;
173
+ border-radius: var(--radius);
174
+ border: 1px solid rgba(255, 255, 255, 0.10);
175
+ background: rgba(255, 255, 255, 0.04);
176
+ color: var(--text-secondary);
177
+ font-size: 18px;
178
+ cursor: pointer;
179
+ transition: all var(--transition-fast);
180
+ flex-shrink: 0;
181
+ }
182
+
183
+ .menu-toggle:hover {
184
+ background: rgba(255, 255, 255, 0.08);
185
+ color: var(--text);
186
+ border-color: rgba(255, 255, 255, 0.15);
187
+ }
188
+
189
+ .menu-toggle:active {
190
+ background: rgba(139, 92, 246, 0.10);
191
+ transform: scale(0.95);
192
+ }
193
+
194
+ .menu-toggle:focus-visible {
195
+ outline: 2px solid var(--violet);
196
+ outline-offset: 2px;
197
+ }
198
+
199
+ /* Status Badge */
200
+ .badge {
201
+ font-family: var(--font-sans);
202
+ font-size: 12px;
203
+ padding: 3px 10px;
204
+ border-radius: 100px;
205
+ font-weight: 500;
206
+ text-transform: uppercase;
207
+ letter-spacing: 0.5px;
208
+ transition: all var(--transition-fast);
209
+ display: inline-flex;
210
+ align-items: center;
211
+ gap: 6px;
212
+ }
213
+
214
+ .badge::before {
215
+ content: '';
216
+ width: 6px;
217
+ height: 6px;
218
+ border-radius: 50%;
219
+ flex-shrink: 0;
220
+ }
221
+
222
+ .badge--idle {
223
+ background: rgba(255, 255, 255, 0.07);
224
+ border: 1px solid var(--border);
225
+ color: var(--text-secondary);
226
+ }
227
+
228
+ .badge--idle::before { background: var(--text-muted); }
229
+
230
+ .badge--running {
231
+ background: var(--violet-soft);
232
+ border: 1px solid rgba(139, 92, 246, 0.2);
233
+ color: var(--violet);
234
+ }
235
+
236
+ .badge--running::before {
237
+ background: var(--violet);
238
+ animation: badgePulse 1.5s ease-in-out infinite;
239
+ }
240
+
241
+ .badge--error {
242
+ background: var(--red-soft);
243
+ border: 1px solid rgba(248, 113, 113, 0.2);
244
+ color: var(--red);
245
+ }
246
+
247
+ .badge--error::before { background: var(--red); }
248
+
249
+ @keyframes badgePulse {
250
+ 0%, 100% { opacity: 1; }
251
+ 50% { opacity: 0.4; }
252
+ }
253
+
254
+ /* ==========================================================================
255
+ Panel Layout — [FileTree 220px | Workspace flex:1 | Chat 380px]
256
+ ========================================================================== */
257
+
258
+ #panels {
259
+ display: flex;
260
+ flex: 1;
261
+ min-height: 0;
262
+ }
263
+
264
+ /* ==========================================================================
265
+ File Panel (Left Sidebar)
266
+ ========================================================================== */
267
+
268
+ #file-panel {
269
+ width: var(--sidebar-w);
270
+ flex-shrink: 0;
271
+ border-right: 1px solid var(--border-strong);
272
+ background: var(--panel-bg);
273
+ display: flex;
274
+ flex-direction: column;
275
+ overflow: hidden;
276
+ transition: width var(--transition-normal);
277
+ box-shadow: 1px 0 0 0 var(--border), 2px 0 12px -4px rgba(0, 0, 0, 0.3);
278
+ }
279
+
280
+ .panel-header {
281
+ height: 40px;
282
+ display: flex;
283
+ align-items: center;
284
+ gap: 8px;
285
+ padding: 0 16px;
286
+ border-bottom: 1px solid var(--border);
287
+ font-family: var(--font-sans);
288
+ font-size: 13px;
289
+ font-weight: 600;
290
+ color: var(--text-secondary);
291
+ flex-shrink: 0;
292
+ text-transform: uppercase;
293
+ letter-spacing: 0.5px;
294
+ }
295
+
296
+ .panel-header .subtle {
297
+ color: var(--text-muted);
298
+ font-weight: 400;
299
+ text-transform: none;
300
+ letter-spacing: 0;
301
+ }
302
+
303
+ /* File Tree */
304
+ .file-tree {
305
+ flex: 1;
306
+ overflow-y: auto;
307
+ overflow-x: hidden;
308
+ padding: 6px 0;
309
+ }
310
+
311
+ .file-tree::-webkit-scrollbar { width: 5px; }
312
+ .file-tree::-webkit-scrollbar-track { background: transparent; }
313
+ .file-tree::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.08); border-radius: 3px; }
314
+ .file-tree::-webkit-scrollbar-thumb:hover { background: rgba(255, 255, 255, 0.14); }
315
+
316
+ .ft-item {
317
+ display: flex;
318
+ align-items: center;
319
+ gap: 8px;
320
+ padding: 5px 16px;
321
+ cursor: pointer;
322
+ white-space: nowrap;
323
+ overflow: hidden;
324
+ text-overflow: ellipsis;
325
+ font-family: var(--font-mono);
326
+ font-size: 13px;
327
+ line-height: 26px;
328
+ color: var(--text-secondary);
329
+ transition: all var(--transition-fast);
330
+ }
331
+
332
+ .ft-item:hover {
333
+ background: rgba(139, 92, 246, 0.10);
334
+ color: var(--text);
335
+ }
336
+
337
+ .ft-item--active {
338
+ background: rgba(139, 92, 246, 0.18);
339
+ color: var(--text);
340
+ border-left: 2px solid var(--violet);
341
+ }
342
+
343
+ .ft-icon {
344
+ flex-shrink: 0;
345
+ width: 16px;
346
+ text-align: center;
347
+ font-size: 12px;
348
+ }
349
+
350
+ .ft-icon--dir { color: var(--violet); }
351
+ .ft-icon--dir-chevron {
352
+ width: 12px;
353
+ font-size: 10px;
354
+ color: var(--text-muted);
355
+ transition: transform var(--transition-fast);
356
+ flex-shrink: 0;
357
+ }
358
+ .ft-icon--dir-chevron.expanded { transform: rotate(90deg); }
359
+ .ft-icon--py { color: var(--yellow); }
360
+ .ft-icon--js, .ft-icon--ts { color: var(--yellow); }
361
+ .ft-icon--json { color: var(--teal); }
362
+ .ft-icon--md { color: var(--blue); }
363
+ .ft-icon--html, .ft-icon--css { color: var(--orange); }
364
+ .ft-icon--png, .ft-icon--jpg, .ft-icon--svg, .ft-icon--gif { color: var(--pink); }
365
+ .ft-icon--yaml, .ft-icon--yml { color: var(--red); }
366
+ .ft-icon--csv { color: var(--green); }
367
+ .ft-icon--default { color: var(--text-muted); }
368
+
369
+ .ft-name { overflow: hidden; text-overflow: ellipsis; }
370
+ .ft-indent { flex-shrink: 0; }
371
+
372
+ .ft-item--new { animation: fileNew 1.5s ease-out; }
373
+
374
+ @keyframes fileNew {
375
+ 0% { background: rgba(139, 92, 246, 0.2); box-shadow: inset 0 0 12px rgba(139, 92, 246, 0.15); }
376
+ 100% { background: transparent; box-shadow: none; }
377
+ }
378
+
379
+ /* ==========================================================================
380
+ Workspace Panel (Center — Hero)
381
+ ========================================================================== */
382
+
383
+ #workspace-panel {
384
+ flex: 1;
385
+ display: flex;
386
+ flex-direction: column;
387
+ min-width: 0;
388
+ background: rgba(255, 255, 255, 0.015);
389
+ }
390
+
391
+ /* Workspace Content */
392
+ .workspace-content {
393
+ flex: 1;
394
+ display: flex;
395
+ flex-direction: column;
396
+ min-height: 0;
397
+ position: relative;
398
+ }
399
+
400
+ /* Preview Area (inside workspace) */
401
+ .preview-area {
402
+ flex: 1;
403
+ display: flex;
404
+ flex-direction: column;
405
+ min-height: 0;
406
+ }
407
+
408
+ .preview-header {
409
+ height: 40px;
410
+ display: flex;
411
+ align-items: center;
412
+ justify-content: space-between;
413
+ padding: 0 16px;
414
+ border-bottom: 1px solid var(--border);
415
+ background: var(--panel-header-bg);
416
+ flex-shrink: 0;
417
+ }
418
+
419
+ .preview-filename {
420
+ font-family: var(--font-mono);
421
+ font-size: 13px;
422
+ color: var(--text-secondary);
423
+ overflow: hidden;
424
+ text-overflow: ellipsis;
425
+ white-space: nowrap;
426
+ }
427
+
428
+ .preview-close {
429
+ display: flex;
430
+ align-items: center;
431
+ justify-content: center;
432
+ width: 32px;
433
+ height: 32px;
434
+ border-radius: var(--radius-sm);
435
+ border: 1px solid var(--border);
436
+ background: var(--bg-surface);
437
+ color: var(--text-secondary);
438
+ cursor: pointer;
439
+ font-size: 18px;
440
+ padding: 0;
441
+ line-height: 1;
442
+ transition: all var(--transition-fast);
443
+ }
444
+
445
+ .preview-close:hover {
446
+ background: rgba(255, 255, 255, 0.06);
447
+ border-color: var(--border);
448
+ color: var(--text);
449
+ }
450
+
451
+ .preview-close:active {
452
+ background: rgba(248, 113, 113, 0.10);
453
+ color: var(--red);
454
+ }
455
+
456
+ .preview-close:focus-visible {
457
+ outline: 2px solid var(--violet);
458
+ outline-offset: 2px;
459
+ }
460
+
461
+ .preview-content {
462
+ flex: 1;
463
+ overflow: auto;
464
+ padding: 20px 24px;
465
+ font-family: var(--font-mono);
466
+ font-size: 13px;
467
+ line-height: 1.7;
468
+ color: var(--text);
469
+ }
470
+
471
+ .preview-content pre { margin: 0; white-space: pre-wrap; word-wrap: break-word; }
472
+ .preview-content img { max-width: 100%; border-radius: var(--radius); margin: 4px 0; }
473
+
474
+ /* ==========================================================================
475
+ Chat Sidebar (Right)
476
+ ========================================================================== */
477
+
478
+ .chat-sidebar {
479
+ width: var(--chat-w);
480
+ flex-shrink: 0;
481
+ border-left: 1px solid var(--border-strong);
482
+ background: var(--panel-bg);
483
+ display: flex;
484
+ flex-direction: column;
485
+ overflow: hidden;
486
+ box-shadow: -1px 0 0 0 var(--border), -2px 0 12px -4px rgba(0, 0, 0, 0.3);
487
+ }
488
+
489
+ .chat-sidebar-header {
490
+ height: 40px;
491
+ display: flex;
492
+ align-items: center;
493
+ justify-content: space-between;
494
+ padding: 0 16px;
495
+ border-bottom: 1px solid var(--border);
496
+ flex-shrink: 0;
497
+ }
498
+
499
+ .chat-sidebar-title {
500
+ font-family: var(--font-sans);
501
+ font-size: 12px;
502
+ font-weight: 600;
503
+ color: var(--text-secondary);
504
+ text-transform: uppercase;
505
+ letter-spacing: 0.5px;
506
+ }
507
+
508
+ /* ==========================================================================
509
+ Chat Messages Area
510
+ ========================================================================== */
511
+
512
+ .chat-messages {
513
+ flex: 1;
514
+ overflow-y: auto;
515
+ overflow-x: hidden;
516
+ padding: 16px 14px 12px;
517
+ scroll-behavior: smooth;
518
+ }
519
+
520
+ .chat-messages::-webkit-scrollbar { width: 6px; }
521
+ .chat-messages::-webkit-scrollbar-track { background: transparent; }
522
+ .chat-messages::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.06); border-radius: 3px; }
523
+ .chat-messages::-webkit-scrollbar-thumb:hover { background: rgba(255, 255, 255, 0.12); }
524
+
525
+ /* Message container */
526
+ .message {
527
+ margin: 0 0 16px;
528
+ animation: messageIn 0.3s ease-out;
529
+ }
530
+
531
+ .message + .message { margin-top: 0; }
532
+
533
+ @keyframes messageIn {
534
+ from { opacity: 0; transform: translateY(8px); }
535
+ to { opacity: 1; transform: translateY(0); }
536
+ }
537
+
538
+ /* User messages */
539
+ .message--user {
540
+ display: flex;
541
+ justify-content: flex-end;
542
+ }
543
+
544
+ .message--user .message-content {
545
+ background: var(--violet-soft);
546
+ border: 1px solid rgba(139, 92, 246, 0.15);
547
+ border-radius: var(--radius-lg) var(--radius-lg) var(--radius-sm) var(--radius-lg);
548
+ padding: 10px 14px;
549
+ max-width: 90%;
550
+ color: var(--text);
551
+ font-size: 14px;
552
+ line-height: 1.6;
553
+ }
554
+
555
+ /* Agent messages */
556
+ .message--agent {
557
+ display: flex;
558
+ flex-direction: column;
559
+ align-items: flex-start;
560
+ }
561
+
562
+ .message--agent .message-content {
563
+ background: var(--bg-card);
564
+ border: 1px solid var(--border);
565
+ border-radius: var(--radius-sm) var(--radius-lg) var(--radius-lg) var(--radius-lg);
566
+ padding: 12px 14px;
567
+ max-width: 100%;
568
+ width: auto;
569
+ color: var(--text);
570
+ font-size: 14px;
571
+ line-height: 1.7;
572
+ }
573
+
574
+ /* Tool call messages */
575
+ .message--tool {
576
+ display: flex;
577
+ flex-direction: column;
578
+ }
579
+
580
+ .message--tool .message-content {
581
+ background: rgba(255, 255, 255, 0.02);
582
+ border: 1px solid var(--border);
583
+ border-radius: var(--radius);
584
+ overflow: hidden;
585
+ width: 100%;
586
+ }
587
+
588
+ .tool-header {
589
+ display: flex;
590
+ align-items: center;
591
+ gap: 8px;
592
+ padding: 8px 12px;
593
+ cursor: pointer;
594
+ font-family: var(--font-mono);
595
+ font-size: 12px;
596
+ color: var(--text-secondary);
597
+ transition: background var(--transition-fast);
598
+ user-select: none;
599
+ }
600
+
601
+ .tool-header:hover { background: rgba(255, 255, 255, 0.06); color: var(--text); }
602
+
603
+ .tool-header:active { background: rgba(45, 212, 191, 0.08); }
604
+
605
+ .tool-header:focus-visible {
606
+ outline: 2px solid var(--teal);
607
+ outline-offset: -2px;
608
+ }
609
+
610
+ .tool-header .tool-icon { color: var(--teal); font-size: 11px; flex-shrink: 0; }
611
+ .tool-header .tool-name { font-weight: 600; color: var(--teal); }
612
+
613
+ .tool-header .tool-chevron {
614
+ margin-left: auto;
615
+ font-size: 12px;
616
+ color: var(--text-muted);
617
+ transition: transform var(--transition-fast);
618
+ }
619
+
620
+ .tool-header .tool-chevron--open { transform: rotate(90deg); }
621
+
622
+ .tool-body {
623
+ display: none;
624
+ padding: 10px 12px;
625
+ border-top: 1px solid var(--border);
626
+ font-family: var(--font-mono);
627
+ font-size: 12px;
628
+ line-height: 1.7;
629
+ color: var(--text-secondary);
630
+ max-height: 200px;
631
+ overflow-y: auto;
632
+ background: rgba(0, 0, 0, 0.2);
633
+ }
634
+
635
+ .tool-body--open { display: block; }
636
+ .tool-status { font-size: 11px; color: var(--text-muted); margin-left: 8px; }
637
+ .tool-status--success { color: var(--green); }
638
+ .tool-status--error { color: var(--red); }
639
+
640
+ /* Error messages */
641
+ .message--error .message-content {
642
+ background: var(--red-soft);
643
+ border: 1px solid rgba(248, 113, 113, 0.2);
644
+ border-radius: var(--radius);
645
+ padding: 10px 14px;
646
+ color: var(--red);
647
+ font-size: 12px;
648
+ font-family: var(--font-mono);
649
+ width: 100%;
650
+ }
651
+
652
+ /* Message label */
653
+ .message-label {
654
+ font-family: var(--font-sans);
655
+ font-size: 11px;
656
+ font-weight: 600;
657
+ color: var(--text-muted);
658
+ text-transform: uppercase;
659
+ letter-spacing: 0.5px;
660
+ margin-bottom: 4px;
661
+ padding-left: 2px;
662
+ }
663
+
664
+ /* Thinking Indicator */
665
+ .thinking-indicator {
666
+ display: flex;
667
+ align-items: center;
668
+ gap: 4px;
669
+ padding: 12px 14px;
670
+ margin: 0 0 12px;
671
+ }
672
+
673
+ .thinking-indicator .dot {
674
+ width: 7px;
675
+ height: 7px;
676
+ border-radius: 50%;
677
+ background: var(--violet);
678
+ animation: thinkingDot 1.4s ease-in-out infinite;
679
+ }
680
+
681
+ .thinking-indicator .dot:nth-child(2) { animation-delay: 0.2s; }
682
+ .thinking-indicator .dot:nth-child(3) { animation-delay: 0.4s; }
683
+
684
+ .thinking-indicator .thinking-label {
685
+ font-size: 12px;
686
+ color: var(--text-muted);
687
+ margin-left: 8px;
688
+ font-style: normal;
689
+ font-weight: 500;
690
+ }
691
+
692
+ @keyframes thinkingDot {
693
+ 0%, 80%, 100% { opacity: 0.3; transform: translateY(0) scale(0.85); }
694
+ 40% { opacity: 1; transform: translateY(-4px) scale(1); }
695
+ }
696
+
697
+ /* ==========================================================================
698
+ Markdown Content Rendering
699
+ ========================================================================== */
700
+
701
+ .message-content h1, .message-content h2, .message-content h3,
702
+ .message-content h4, .message-content h5, .message-content h6 {
703
+ font-family: var(--font-sans);
704
+ color: var(--text);
705
+ line-height: 1.3;
706
+ margin-top: 1em;
707
+ margin-bottom: 0.4em;
708
+ }
709
+
710
+ .message-content h1:first-child, .message-content h2:first-child,
711
+ .message-content h3:first-child { margin-top: 0; }
712
+
713
+ .message-content h1 { font-size: 1.3em; font-weight: 700; letter-spacing: -0.5px; }
714
+ .message-content h2 { font-size: 1.15em; font-weight: 600; letter-spacing: -0.3px; }
715
+ .message-content h3 { font-size: 1.05em; font-weight: 600; }
716
+ .message-content h4 { font-size: 1em; font-weight: 600; color: var(--text-secondary); }
717
+ .message-content h5, .message-content h6 {
718
+ font-size: 0.9em; font-weight: 600; color: var(--text-muted);
719
+ text-transform: uppercase; letter-spacing: 0.5px;
720
+ }
721
+
722
+ .message-content p { margin-bottom: 0.6em; }
723
+ .message-content p:last-child { margin-bottom: 0; }
724
+ .message-content strong { font-weight: 600; color: var(--text); }
725
+ .message-content em { font-style: italic; color: var(--text-secondary); }
726
+
727
+ .message-content ul, .message-content ol { margin-bottom: 0.6em; padding-left: 1.5em; }
728
+ .message-content li { margin-bottom: 0.2em; line-height: 1.6; }
729
+ .message-content li > ul, .message-content li > ol { margin-top: 0.2em; margin-bottom: 0; }
730
+
731
+ /* Inline code */
732
+ .message-content code {
733
+ font-family: var(--font-mono);
734
+ font-size: 0.85em;
735
+ padding: 2px 5px;
736
+ background: rgba(255, 255, 255, 0.06);
737
+ border: 1px solid var(--border);
738
+ border-radius: 4px;
739
+ color: var(--teal);
740
+ }
741
+
742
+ /* Code blocks */
743
+ .message-content pre {
744
+ margin: 0.6em 0;
745
+ border-radius: var(--radius);
746
+ background: var(--bg-elevated);
747
+ border: 1px solid var(--border);
748
+ overflow-x: auto;
749
+ }
750
+
751
+ .message-content pre code {
752
+ display: block;
753
+ padding: 10px 14px;
754
+ background: none;
755
+ border: none;
756
+ border-radius: 0;
757
+ font-size: 13px;
758
+ line-height: 1.7;
759
+ color: var(--text-secondary);
760
+ white-space: pre;
761
+ overflow-x: auto;
762
+ }
763
+
764
+ .message-content pre:last-child { margin-bottom: 0; }
765
+
766
+ /* Blockquote */
767
+ .message-content blockquote {
768
+ margin: 0.6em 0;
769
+ padding: 6px 12px;
770
+ border-left: 3px solid var(--violet);
771
+ background: var(--violet-soft);
772
+ border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
773
+ color: var(--text-secondary);
774
+ font-style: italic;
775
+ }
776
+
777
+ .message-content blockquote p:last-child { margin-bottom: 0; }
778
+
779
+ /* Links */
780
+ .message-content a {
781
+ color: var(--violet);
782
+ text-decoration: none;
783
+ border-bottom: 1px solid rgba(139, 92, 246, 0.3);
784
+ transition: all var(--transition-fast);
785
+ }
786
+
787
+ .message-content a:hover { color: #a78bfa; border-bottom-color: var(--violet); }
788
+
789
+ /* Tables */
790
+ .message-content table {
791
+ width: 100%;
792
+ border-collapse: collapse;
793
+ margin: 0.6em 0;
794
+ font-size: 12px;
795
+ border: 1px solid var(--border);
796
+ border-radius: var(--radius);
797
+ overflow: hidden;
798
+ }
799
+
800
+ .message-content thead { background: var(--bg-elevated); }
801
+
802
+ .message-content th {
803
+ text-align: left;
804
+ padding: 6px 10px;
805
+ font-weight: 600;
806
+ color: var(--text);
807
+ border-bottom: 1px solid var(--border);
808
+ font-family: var(--font-sans);
809
+ font-size: 11px;
810
+ text-transform: uppercase;
811
+ letter-spacing: 0.3px;
812
+ }
813
+
814
+ .message-content td {
815
+ padding: 6px 10px;
816
+ border-bottom: 1px solid var(--border);
817
+ color: var(--text-secondary);
818
+ }
819
+
820
+ .message-content tbody tr:nth-child(even) { background: rgba(255, 255, 255, 0.015); }
821
+ .message-content tbody tr:last-child td { border-bottom: none; }
822
+ .message-content tbody tr:hover { background: rgba(255, 255, 255, 0.03); }
823
+
824
+ .message-content hr {
825
+ border: none;
826
+ height: 1px;
827
+ background: linear-gradient(90deg, transparent, var(--border), transparent);
828
+ margin: 1em 0;
829
+ }
830
+
831
+ .message-content img {
832
+ max-width: 100%;
833
+ height: auto;
834
+ border-radius: var(--radius);
835
+ margin: 0.5em 0;
836
+ }
837
+
838
+ /* ==========================================================================
839
+ Chat Inline Images
840
+ ========================================================================== */
841
+
842
+ .chat-image {
843
+ max-width: 100%;
844
+ max-height: 300px;
845
+ border-radius: var(--radius);
846
+ border: 1px solid var(--border);
847
+ cursor: pointer;
848
+ transition: all var(--transition-normal);
849
+ display: block;
850
+ margin: 8px 0;
851
+ object-fit: contain;
852
+ background: var(--bg-elevated);
853
+ }
854
+
855
+ .chat-image:hover {
856
+ border-color: var(--border-hover);
857
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.4);
858
+ transform: scale(1.01);
859
+ }
860
+
861
+ /* Image modal / lightbox */
862
+ .image-modal {
863
+ position: fixed;
864
+ inset: 0;
865
+ z-index: 1000;
866
+ display: none;
867
+ align-items: center;
868
+ justify-content: center;
869
+ background: rgba(0, 0, 0, 0.85);
870
+ backdrop-filter: blur(8px);
871
+ -webkit-backdrop-filter: blur(8px);
872
+ cursor: zoom-out;
873
+ animation: fadeIn 0.2s ease;
874
+ }
875
+
876
+ .image-modal--open { display: flex; }
877
+
878
+ .image-modal img {
879
+ max-width: 90vw;
880
+ max-height: 90vh;
881
+ object-fit: contain;
882
+ border-radius: var(--radius-lg);
883
+ box-shadow: 0 16px 64px rgba(0, 0, 0, 0.6);
884
+ }
885
+
886
+ .image-modal-close, .modal-close {
887
+ position: absolute;
888
+ top: 20px;
889
+ right: 20px;
890
+ width: 36px;
891
+ height: 36px;
892
+ border-radius: 50%;
893
+ border: 1px solid rgba(255, 255, 255, 0.15);
894
+ background: rgba(255, 255, 255, 0.08);
895
+ color: var(--text);
896
+ font-size: 18px;
897
+ cursor: pointer;
898
+ display: flex;
899
+ align-items: center;
900
+ justify-content: center;
901
+ transition: all var(--transition-fast);
902
+ }
903
+
904
+ .image-modal-close:hover, .modal-close:hover {
905
+ background: rgba(255, 255, 255, 0.15);
906
+ border-color: rgba(255, 255, 255, 0.25);
907
+ }
908
+
909
+ /* ==========================================================================
910
+ Welcome / Empty State (inside Workspace)
911
+ ========================================================================== */
912
+
913
+ .welcome-state {
914
+ flex: 1;
915
+ display: flex;
916
+ flex-direction: column;
917
+ align-items: center;
918
+ justify-content: center;
919
+ padding: 40px 24px;
920
+ text-align: center;
921
+ animation: fadeIn 0.5s ease;
922
+ min-height: 0;
923
+ position: relative;
924
+ }
925
+
926
+ .welcome-state::before {
927
+ content: '';
928
+ position: absolute;
929
+ width: 400px;
930
+ height: 400px;
931
+ border-radius: 50%;
932
+ background: radial-gradient(circle, rgba(139, 92, 246, 0.08) 0%, transparent 70%);
933
+ pointer-events: none;
934
+ z-index: -1;
935
+ }
936
+
937
+ .welcome-icon { font-size: 36px; margin-bottom: 12px; line-height: 1; }
938
+
939
+ .welcome-title {
940
+ font-family: var(--font-sans);
941
+ font-weight: 800;
942
+ font-size: 28px;
943
+ color: var(--text);
944
+ letter-spacing: -1px;
945
+ margin-bottom: 4px;
946
+ }
947
+
948
+ .welcome-powered {
949
+ font-size: 13px;
950
+ color: var(--text-muted);
951
+ font-weight: 400;
952
+ margin-bottom: 4px;
953
+ }
954
+ .welcome-powered .dot { color: var(--violet); }
955
+
956
+ .welcome-logo {
957
+ font-family: var(--font-sans);
958
+ font-weight: 800;
959
+ font-size: 28px;
960
+ color: var(--text);
961
+ letter-spacing: -1px;
962
+ margin-bottom: 8px;
963
+ }
964
+
965
+ .welcome-logo .dot, .welcome-title .dot { color: var(--violet); }
966
+
967
+ .welcome-subtitle {
968
+ font-size: 16px;
969
+ color: var(--text-secondary);
970
+ font-weight: 400;
971
+ margin-bottom: 24px;
972
+ max-width: 400px;
973
+ }
974
+
975
+ .welcome-heading {
976
+ font-family: var(--font-sans);
977
+ font-size: 13px;
978
+ font-weight: 600;
979
+ color: var(--text-muted);
980
+ text-transform: uppercase;
981
+ letter-spacing: 0.5px;
982
+ margin-bottom: 14px;
983
+ }
984
+
985
+ /* Skill Badges */
986
+ .skill-badges {
987
+ display: flex;
988
+ flex-wrap: wrap;
989
+ gap: 8px;
990
+ justify-content: center;
991
+ margin-bottom: 32px;
992
+ }
993
+
994
+ .skill-badge {
995
+ display: inline-flex;
996
+ align-items: center;
997
+ gap: 6px;
998
+ padding: 5px 12px;
999
+ border-radius: 100px;
1000
+ font-family: var(--font-mono);
1001
+ font-size: 12px;
1002
+ font-weight: 500;
1003
+ background: var(--violet-soft);
1004
+ border: 1px solid rgba(139, 92, 246, 0.18);
1005
+ color: var(--violet);
1006
+ }
1007
+
1008
+ .skill-badge .skill-icon { font-size: 11px; }
1009
+
1010
+ /* Prompt Chips */
1011
+ .prompt-chips {
1012
+ display: grid;
1013
+ grid-template-columns: repeat(3, 1fr);
1014
+ gap: 10px;
1015
+ max-width: 640px;
1016
+ width: 100%;
1017
+ }
1018
+
1019
+ .prompt-chip {
1020
+ display: flex;
1021
+ align-items: center;
1022
+ gap: 10px;
1023
+ padding: 14px 18px;
1024
+ border-radius: var(--radius-lg);
1025
+ background: var(--bg-surface);
1026
+ border: 1px solid var(--border-strong);
1027
+ color: var(--text);
1028
+ font-size: 14px;
1029
+ font-weight: 500;
1030
+ cursor: pointer;
1031
+ transition: all var(--transition-fast);
1032
+ text-align: left;
1033
+ font-family: var(--font-sans);
1034
+ line-height: 1.4;
1035
+ animation: chipIn 0.35s ease-out backwards;
1036
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);
1037
+ }
1038
+
1039
+ .prompt-chip:nth-child(1) { animation-delay: 0ms; background: rgba(139, 92, 246, 0.08); border-color: rgba(139, 92, 246, 0.22); }
1040
+ .prompt-chip:nth-child(2) { animation-delay: 60ms; background: rgba(45, 212, 191, 0.08); border-color: rgba(45, 212, 191, 0.22); }
1041
+ .prompt-chip:nth-child(3) { animation-delay: 120ms; background: rgba(96, 165, 250, 0.08); border-color: rgba(96, 165, 250, 0.22); }
1042
+
1043
+ .prompt-chip:hover {
1044
+ background: #2e3348;
1045
+ border-color: rgba(139, 92, 246, 0.45);
1046
+ color: var(--text);
1047
+ transform: translateY(-2px);
1048
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.35), 0 0 0 1px rgba(139, 92, 246, 0.15);
1049
+ }
1050
+
1051
+ .prompt-chip:active {
1052
+ transform: translateY(0);
1053
+ background: rgba(139, 92, 246, 0.10);
1054
+ border-color: rgba(139, 92, 246, 0.4);
1055
+ }
1056
+
1057
+ .prompt-chip:focus-visible {
1058
+ outline: 2px solid var(--violet);
1059
+ outline-offset: 2px;
1060
+ }
1061
+
1062
+ @keyframes chipIn {
1063
+ from { opacity: 0; transform: translateY(8px); }
1064
+ to { opacity: 1; transform: translateY(0); }
1065
+ }
1066
+
1067
+ /* ==========================================================================
1068
+ Chat Input (inside Chat Sidebar)
1069
+ ========================================================================== */
1070
+
1071
+ #chat-form {
1072
+ display: flex;
1073
+ flex-direction: column;
1074
+ gap: 6px;
1075
+ padding: 12px 14px 14px;
1076
+ border-top: 1px solid var(--border);
1077
+ background: rgba(15, 17, 23, 0.7);
1078
+ backdrop-filter: blur(12px);
1079
+ -webkit-backdrop-filter: blur(12px);
1080
+ flex-shrink: 0;
1081
+ }
1082
+
1083
+ .input-wrapper {
1084
+ display: flex;
1085
+ align-items: flex-end;
1086
+ gap: 0;
1087
+ position: relative;
1088
+ background: var(--bg-input);
1089
+ border: 1px solid var(--border);
1090
+ border-radius: var(--radius-lg);
1091
+ transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
1092
+ }
1093
+
1094
+ .input-wrapper:focus-within {
1095
+ border-color: rgba(139, 92, 246, 0.4);
1096
+ box-shadow: 0 0 0 3px var(--violet-soft);
1097
+ }
1098
+
1099
+ #chat-input {
1100
+ flex: 1;
1101
+ min-height: 42px;
1102
+ max-height: 120px;
1103
+ padding: 10px 14px;
1104
+ background: transparent;
1105
+ border: none;
1106
+ border-radius: var(--radius-lg) 0 0 var(--radius-lg);
1107
+ color: var(--text);
1108
+ font-family: var(--font-sans);
1109
+ font-size: 14px;
1110
+ line-height: 1.5;
1111
+ outline: none;
1112
+ resize: none;
1113
+ overflow-y: auto;
1114
+ }
1115
+
1116
+ #chat-input:focus { border-color: transparent; box-shadow: none; }
1117
+ #chat-input::placeholder { color: var(--text-muted); font-family: var(--font-sans); }
1118
+
1119
+ .input-hint {
1120
+ font-size: 12px;
1121
+ color: var(--text-muted);
1122
+ padding-left: 4px;
1123
+ font-family: var(--font-sans);
1124
+ text-align: left;
1125
+ }
1126
+
1127
+ #send-btn {
1128
+ width: 44px;
1129
+ height: 44px;
1130
+ margin: 3px;
1131
+ padding: 0;
1132
+ background: var(--violet);
1133
+ color: white;
1134
+ border: none;
1135
+ border-radius: var(--radius-lg);
1136
+ font-family: var(--font-sans);
1137
+ font-size: 13px;
1138
+ font-weight: 600;
1139
+ cursor: pointer;
1140
+ transition: all var(--transition-fast);
1141
+ display: flex;
1142
+ align-items: center;
1143
+ justify-content: center;
1144
+ flex-shrink: 0;
1145
+ box-shadow: 0 2px 12px rgba(139, 92, 246, 0.35);
1146
+ }
1147
+
1148
+ #send-btn svg { width: 16px; height: 16px; }
1149
+
1150
+ #send-btn:hover:not(:disabled) {
1151
+ background: #9d74f7;
1152
+ box-shadow: 0 0 24px var(--violet-glow);
1153
+ transform: scale(1.05);
1154
+ }
1155
+
1156
+ #send-btn:active:not(:disabled) {
1157
+ transform: scale(0.93);
1158
+ background: #7c4de4;
1159
+ box-shadow: 0 0 8px var(--violet-soft);
1160
+ }
1161
+
1162
+ #send-btn:focus-visible {
1163
+ outline: 2px solid var(--violet);
1164
+ outline-offset: 2px;
1165
+ }
1166
+
1167
+ #send-btn:disabled { opacity: 0.5; cursor: not-allowed; filter: none; box-shadow: none; transform: none; }
1168
+
1169
+ /* ==========================================================================
1170
+ Utility Classes
1171
+ ========================================================================== */
1172
+
1173
+ .hidden { display: none !important; }
1174
+
1175
+ .sr-only {
1176
+ position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
1177
+ overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border-width: 0;
1178
+ }
1179
+
1180
+ /* ==========================================================================
1181
+ Animations
1182
+ ========================================================================== */
1183
+
1184
+ @keyframes fadeIn {
1185
+ from { opacity: 0; transform: translateY(12px); }
1186
+ to { opacity: 1; transform: translateY(0); }
1187
+ }
1188
+
1189
+ @keyframes slideInLeft {
1190
+ from { opacity: 0; transform: translateX(-16px); }
1191
+ to { opacity: 1; transform: translateX(0); }
1192
+ }
1193
+
1194
+ @keyframes slideInRight {
1195
+ from { opacity: 0; transform: translateX(16px); }
1196
+ to { opacity: 1; transform: translateX(0); }
1197
+ }
1198
+
1199
+ /* Streaming cursor for agent messages */
1200
+ .streaming-cursor::after {
1201
+ content: '';
1202
+ display: inline-block;
1203
+ width: 2px;
1204
+ height: 1em;
1205
+ background: var(--violet);
1206
+ margin-left: 2px;
1207
+ vertical-align: text-bottom;
1208
+ animation: cursorBlink 1s step-end infinite;
1209
+ }
1210
+
1211
+ @keyframes cursorBlink { 50% { opacity: 0; } }
1212
+
1213
+ /* Panel overlay (mobile) */
1214
+ .panel-overlay {
1215
+ position: fixed;
1216
+ inset: 0;
1217
+ z-index: 35;
1218
+ background: rgba(0, 0, 0, 0.5);
1219
+ display: none;
1220
+ }
1221
+
1222
+ .panel-overlay--visible { display: block; }
1223
+
1224
+ /* ==========================================================================
1225
+ Responsive Breakpoints
1226
+ ========================================================================== */
1227
+
1228
+ /* Tablet: hide file tree, workspace + chat only */
1229
+ @media (max-width: 1024px) {
1230
+ .menu-toggle { display: flex; }
1231
+
1232
+ #file-panel {
1233
+ position: fixed;
1234
+ top: var(--header-h);
1235
+ left: 0;
1236
+ bottom: 0;
1237
+ z-index: 40;
1238
+ width: 260px;
1239
+ transform: translateX(-100%);
1240
+ transition: transform var(--transition-normal);
1241
+ box-shadow: 4px 0 24px rgba(0, 0, 0, 0.4);
1242
+ }
1243
+
1244
+ #file-panel.panel--open { transform: translateX(0); }
1245
+
1246
+ .chat-sidebar { width: 340px; }
1247
+
1248
+ .prompt-chips { grid-template-columns: repeat(2, 1fr); max-width: 480px; }
1249
+
1250
+ .welcome-state { padding: 32px 20px; }
1251
+ }
1252
+
1253
+ /* Mobile: chat becomes full width, workspace collapses */
1254
+ @media (max-width: 768px) {
1255
+ #panels { flex-direction: column; }
1256
+
1257
+ #workspace-panel { flex: 1; min-height: 200px; }
1258
+
1259
+ .chat-sidebar {
1260
+ width: 100%;
1261
+ height: 50%;
1262
+ border-left: none;
1263
+ border-top: 1px solid var(--border);
1264
+ }
1265
+
1266
+ #file-panel {
1267
+ position: fixed;
1268
+ top: var(--header-h);
1269
+ left: 0;
1270
+ bottom: 0;
1271
+ z-index: 40;
1272
+ width: 260px;
1273
+ transform: translateX(-100%);
1274
+ transition: transform var(--transition-normal);
1275
+ box-shadow: 4px 0 24px rgba(0, 0, 0, 0.4);
1276
+ }
1277
+
1278
+ #file-panel.panel--open { transform: translateX(0); }
1279
+
1280
+ .menu-toggle { display: flex; }
1281
+
1282
+ #header { padding: 0 14px; }
1283
+
1284
+ .chat-messages { padding: 12px 10px; }
1285
+ #chat-form { padding: 8px 10px 10px; }
1286
+
1287
+ .message--user .message-content { max-width: 85%; }
1288
+
1289
+ .prompt-chips { grid-template-columns: 1fr; max-width: 100%; }
1290
+
1291
+ .welcome-logo, .welcome-title { font-size: 24px; }
1292
+ .welcome-subtitle { font-size: 14px; }
1293
+ }
1294
+
1295
+ /* Phone */
1296
+ @media (max-width: 480px) {
1297
+ :root { --header-h: 48px; }
1298
+
1299
+ #header { padding: 0 12px; gap: 8px; }
1300
+ .logo { font-size: 14px; }
1301
+ .badge { font-size: 10px; padding: 2px 8px; }
1302
+
1303
+ .chat-messages { padding: 10px 8px; }
1304
+
1305
+ .message--user .message-content { max-width: 90%; padding: 8px 12px; font-size: 12px; }
1306
+ .message--agent .message-content { padding: 10px 12px; font-size: 12px; }
1307
+
1308
+ #chat-form { padding: 6px 8px 10px; gap: 4px; }
1309
+ #chat-input { min-height: 40px; padding: 8px 12px; font-size: 13px; }
1310
+ .input-wrapper { border-radius: var(--radius); }
1311
+ #send-btn { width: 44px; height: 44px; margin: 2px; border-radius: var(--radius-sm); }
1312
+ .ft-upload-btn, .ft-download-btn { width: 44px; height: 44px; }
1313
+ .modal-close { width: 44px; height: 44px; }
1314
+
1315
+ .welcome-state { padding: 24px 16px; }
1316
+ .welcome-logo, .welcome-title { font-size: 22px; }
1317
+ .skill-badges { gap: 6px; }
1318
+ .skill-badge { font-size: 11px; padding: 4px 10px; }
1319
+ .prompt-chip { padding: 10px 14px; font-size: 12px; }
1320
+
1321
+ .image-modal img { max-width: 95vw; max-height: 85vh; border-radius: var(--radius); }
1322
+ .image-modal-close, .modal-close { top: 12px; right: 12px; width: 44px; height: 44px; }
1323
+ }
1324
+
1325
+ /* ==========================================================================
1326
+ File Transfer (upload / download / toast)
1327
+ ========================================================================== */
1328
+
1329
+ /* Upload button in file-panel header */
1330
+ .ft-upload-btn {
1331
+ margin-left: auto;
1332
+ display: flex;
1333
+ align-items: center;
1334
+ justify-content: center;
1335
+ width: 36px;
1336
+ height: 36px;
1337
+ border-radius: var(--radius-sm);
1338
+ border: 1px solid var(--border-strong);
1339
+ background: var(--bg-surface);
1340
+ color: var(--text-secondary);
1341
+ cursor: pointer;
1342
+ transition: all var(--transition-fast);
1343
+ flex-shrink: 0;
1344
+ }
1345
+
1346
+ .ft-upload-btn:hover {
1347
+ background: rgba(139, 92, 246, 0.10);
1348
+ color: var(--violet);
1349
+ border-color: rgba(139, 92, 246, 0.25);
1350
+ }
1351
+
1352
+ /* Download button in preview header */
1353
+ .ft-download-btn {
1354
+ display: flex;
1355
+ align-items: center;
1356
+ justify-content: center;
1357
+ width: 36px;
1358
+ height: 36px;
1359
+ border-radius: var(--radius-sm);
1360
+ border: 1px solid var(--border-strong);
1361
+ background: var(--bg-surface);
1362
+ color: var(--text-secondary);
1363
+ cursor: pointer;
1364
+ transition: all var(--transition-fast);
1365
+ flex-shrink: 0;
1366
+ margin-left: auto;
1367
+ margin-right: 6px;
1368
+ }
1369
+
1370
+ .ft-download-btn:hover {
1371
+ background: rgba(45, 212, 191, 0.10);
1372
+ color: var(--teal);
1373
+ border-color: rgba(45, 212, 191, 0.25);
1374
+ }
1375
+
1376
+ .ft-upload-btn:active, .ft-download-btn:active {
1377
+ transform: scale(0.92);
1378
+ }
1379
+
1380
+ .ft-upload-btn:focus-visible, .ft-download-btn:focus-visible {
1381
+ outline: 2px solid var(--violet);
1382
+ outline-offset: 2px;
1383
+ }
1384
+
1385
+ /* Drag-over visual on file tree */
1386
+ .ft-drag-over {
1387
+ background: var(--violet-soft) !important;
1388
+ outline: 2px dashed var(--violet);
1389
+ outline-offset: -2px;
1390
+ border-radius: var(--radius-sm);
1391
+ }
1392
+
1393
+ /* Toast notifications */
1394
+ .ft-toast {
1395
+ position: fixed;
1396
+ bottom: 24px;
1397
+ left: 50%;
1398
+ transform: translateX(-50%);
1399
+ padding: 8px 20px;
1400
+ border-radius: var(--radius);
1401
+ font-family: var(--font-sans);
1402
+ font-size: 13px;
1403
+ font-weight: 500;
1404
+ color: #fff;
1405
+ background: var(--green);
1406
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.4);
1407
+ z-index: 9999;
1408
+ animation: toastIn 0.25s ease-out, toastOut 0.3s ease-in 2.7s forwards;
1409
+ pointer-events: none;
1410
+ }
1411
+
1412
+ .ft-toast--error {
1413
+ background: var(--red);
1414
+ }
1415
+
1416
+ @keyframes toastIn {
1417
+ from { opacity: 0; transform: translateX(-50%) translateY(12px); }
1418
+ to { opacity: 1; transform: translateX(-50%) translateY(0); }
1419
+ }
1420
+
1421
+ @keyframes toastOut {
1422
+ from { opacity: 1; }
1423
+ to { opacity: 0; }
1424
+ }
1425
+
1426
+ /* ==========================================================================
1427
+ Global Focus Ring
1428
+ ========================================================================== */
1429
+
1430
+ :focus-visible {
1431
+ outline: 2px solid var(--violet);
1432
+ outline-offset: 2px;
1433
+ }
1434
+
1435
+ :focus:not(:focus-visible) {
1436
+ outline: none;
1437
+ }
1438
+
1439
+ /* ==========================================================================
1440
+ Skeleton Loading
1441
+ ========================================================================== */
1442
+
1443
+ .skeleton {
1444
+ background: linear-gradient(
1445
+ 90deg,
1446
+ rgba(255, 255, 255, 0.04) 25%,
1447
+ rgba(255, 255, 255, 0.08) 50%,
1448
+ rgba(255, 255, 255, 0.04) 75%
1449
+ );
1450
+ background-size: 200% 100%;
1451
+ animation: skeletonPulse 1.5s ease-in-out infinite;
1452
+ border-radius: var(--radius-sm);
1453
+ }
1454
+
1455
+ @keyframes skeletonPulse {
1456
+ 0% { background-position: 200% 0; }
1457
+ 100% { background-position: -200% 0; }
1458
+ }
1459
+
1460
+ /* ==========================================================================
1461
+ Code Block Copy Button
1462
+ ========================================================================== */
1463
+
1464
+ .message-content pre {
1465
+ position: relative;
1466
+ }
1467
+
1468
+ .code-copy-btn {
1469
+ position: absolute;
1470
+ top: 8px;
1471
+ right: 8px;
1472
+ width: 28px;
1473
+ height: 28px;
1474
+ display: flex;
1475
+ align-items: center;
1476
+ justify-content: center;
1477
+ background: rgba(255, 255, 255, 0.06);
1478
+ border: 1px solid var(--border);
1479
+ border-radius: var(--radius-sm);
1480
+ color: var(--text-muted);
1481
+ cursor: pointer;
1482
+ font-size: 12px;
1483
+ opacity: 0;
1484
+ transition: all var(--transition-fast);
1485
+ }
1486
+
1487
+ .message-content pre:hover .code-copy-btn { opacity: 1; }
1488
+
1489
+ .code-copy-btn:hover {
1490
+ background: rgba(255, 255, 255, 0.10);
1491
+ color: var(--text);
1492
+ }
1493
+
1494
+ .code-copy-btn--copied {
1495
+ color: var(--green);
1496
+ border-color: rgba(74, 222, 128, 0.3);
1497
+ }
1498
+
1499
+ /* ==========================================================================
1500
+ Workspace Empty States
1501
+ ========================================================================== */
1502
+
1503
+ .workspace-empty {
1504
+ flex: 1;
1505
+ display: flex;
1506
+ flex-direction: column;
1507
+ align-items: center;
1508
+ justify-content: center;
1509
+ padding: 40px 24px;
1510
+ text-align: center;
1511
+ animation: fadeIn 0.3s ease-out;
1512
+ min-height: 0;
1513
+ }
1514
+
1515
+ .workspace-empty-card {
1516
+ background: var(--bg-card);
1517
+ border: 1px solid var(--border);
1518
+ border-radius: var(--radius-lg);
1519
+ padding: 32px 40px;
1520
+ max-width: 400px;
1521
+ }
1522
+
1523
+ .workspace-empty-icon { font-size: 32px; color: var(--text-muted); margin-bottom: 12px; }
1524
+
1525
+ .workspace-empty-text {
1526
+ font-size: 14px;
1527
+ color: var(--text-secondary);
1528
+ line-height: 1.6;
1529
+ margin-bottom: 16px;
1530
+ }
1531
+
1532
+ .workspace-empty-suggestions { display: flex; flex-direction: column; gap: 8px; }
1533
+
1534
+ .workspace-empty-suggestion {
1535
+ padding: 8px 16px;
1536
+ border-radius: var(--radius);
1537
+ background: var(--bg-surface);
1538
+ border: 1px solid var(--border);
1539
+ color: var(--text-secondary);
1540
+ font-size: 13px;
1541
+ cursor: pointer;
1542
+ transition: all var(--transition-fast);
1543
+ text-align: left;
1544
+ font-family: var(--font-sans);
1545
+ }
1546
+
1547
+ .workspace-empty-suggestion:hover {
1548
+ background: rgba(139, 92, 246, 0.10);
1549
+ border-color: rgba(139, 92, 246, 0.25);
1550
+ color: var(--text);
1551
+ }
1552
+
1553
+ .workspace-empty-header {
1554
+ font-family: var(--font-sans);
1555
+ font-size: 12px;
1556
+ font-weight: 600;
1557
+ color: var(--text-muted);
1558
+ text-transform: uppercase;
1559
+ letter-spacing: 1px;
1560
+ padding: 16px 24px 12px;
1561
+ align-self: flex-start;
1562
+ }
1563
+
1564
+ .file-card-grid {
1565
+ display: grid;
1566
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
1567
+ gap: 12px;
1568
+ padding: 0 24px 24px;
1569
+ width: 100%;
1570
+ align-self: flex-start;
1571
+ }
1572
+
1573
+ .file-card {
1574
+ background: var(--bg-card);
1575
+ border: 1px solid var(--border);
1576
+ border-radius: var(--radius);
1577
+ padding: 14px 16px;
1578
+ cursor: pointer;
1579
+ transition: all var(--transition-fast);
1580
+ display: flex;
1581
+ flex-direction: column;
1582
+ gap: 8px;
1583
+ animation: chipIn 0.35s ease-out backwards;
1584
+ }
1585
+
1586
+ .file-card:hover {
1587
+ background: var(--bg-surface);
1588
+ border-color: var(--border-hover);
1589
+ transform: translateY(-1px);
1590
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
1591
+ }
1592
+
1593
+ .file-card--new {
1594
+ border-color: rgba(139, 92, 246, 0.3);
1595
+ box-shadow: 0 0 12px rgba(139, 92, 246, 0.1);
1596
+ }
1597
+
1598
+ .file-card-name {
1599
+ font-family: var(--font-mono);
1600
+ font-size: 13px;
1601
+ font-weight: 500;
1602
+ color: var(--text);
1603
+ overflow: hidden;
1604
+ text-overflow: ellipsis;
1605
+ white-space: nowrap;
1606
+ }
1607
+
1608
+ .file-card-preview {
1609
+ font-family: var(--font-mono);
1610
+ font-size: 11px;
1611
+ line-height: 1.5;
1612
+ color: var(--text-muted);
1613
+ overflow: hidden;
1614
+ max-height: 54px;
1615
+ border-radius: var(--radius-sm);
1616
+ background: rgba(0, 0, 0, 0.15);
1617
+ padding: 6px 8px;
1618
+ }
1619
+
1620
+ .file-card-preview img {
1621
+ max-width: 100%;
1622
+ max-height: 80px;
1623
+ object-fit: contain;
1624
+ border-radius: var(--radius-sm);
1625
+ }
1626
+
1627
+ .file-card-time { font-size: 11px; color: var(--text-muted); }
1628
+
1629
+ /* Breadcrumb in preview header */
1630
+ .preview-breadcrumb {
1631
+ display: flex;
1632
+ align-items: center;
1633
+ gap: 4px;
1634
+ font-family: var(--font-mono);
1635
+ font-size: 13px;
1636
+ overflow: hidden;
1637
+ }
1638
+
1639
+ .preview-breadcrumb-segment {
1640
+ color: var(--text-muted);
1641
+ cursor: pointer;
1642
+ transition: color var(--transition-fast);
1643
+ flex-shrink: 0;
1644
+ }
1645
+
1646
+ .preview-breadcrumb-segment:hover { color: var(--violet); }
1647
+
1648
+ .preview-breadcrumb-separator { color: var(--text-muted); font-size: 10px; flex-shrink: 0; }
1649
+
1650
+ .preview-breadcrumb-current {
1651
+ color: var(--text-secondary);
1652
+ font-weight: 500;
1653
+ overflow: hidden;
1654
+ text-overflow: ellipsis;
1655
+ white-space: nowrap;
1656
+ }
1657
+
1658
+ /* Unread badge on file tree items */
1659
+ .ft-item-badge {
1660
+ width: 7px;
1661
+ height: 7px;
1662
+ border-radius: 50%;
1663
+ background: var(--violet);
1664
+ flex-shrink: 0;
1665
+ margin-left: auto;
1666
+ animation: badgePulse 1.5s ease-in-out infinite;
1667
+ }
1668
+
1669
+ /* ==========================================================================
1670
+ Reduced Motion Support
1671
+ ========================================================================== */
1672
+
1673
+ @media (prefers-reduced-motion: reduce) {
1674
+ *, *::before, *::after {
1675
+ animation-duration: 0.01ms !important;
1676
+ transition-duration: 0.01ms !important;
1677
+ }
1678
+ }