repoburg 1.3.202 → 1.3.209

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 (288) hide show
  1. package/agent-pane/backend/dist/index.js +2103 -32003
  2. package/agent-pane/backend/dist/server.js +45313 -0
  3. package/backend/dist/src/agent-runtime/agent-runtime.types.d.ts +1 -0
  4. package/backend/dist/src/llm-orchestration/hooks/frontend-notification.hook.js +6 -6
  5. package/backend/dist/src/llm-orchestration/hooks/frontend-notification.hook.js.map +1 -1
  6. package/backend/dist/src/llm-orchestration/llm-turn-processor.service.js +1 -0
  7. package/backend/dist/src/llm-orchestration/llm-turn-processor.service.js.map +1 -1
  8. package/backend/dist/tsconfig.build.tsbuildinfo +1 -1
  9. package/daemon/dist/agentPane.js +128 -0
  10. package/daemon/dist/agentPane.spec.js +183 -0
  11. package/daemon/dist/index.js +28 -8
  12. package/daemon/package.json +1 -1
  13. package/model-selector-scroll.png +0 -0
  14. package/package.json +10 -2
  15. package/agent-pane/.prettierignore +0 -5
  16. package/agent-pane/.prettierrc +0 -8
  17. package/agent-pane/backend/coverage/base.css +0 -224
  18. package/agent-pane/backend/coverage/block-navigation.js +0 -87
  19. package/agent-pane/backend/coverage/clover.xml +0 -887
  20. package/agent-pane/backend/coverage/coverage-final.json +0 -10
  21. package/agent-pane/backend/coverage/favicon.png +0 -0
  22. package/agent-pane/backend/coverage/index.html +0 -176
  23. package/agent-pane/backend/coverage/prettify.css +0 -1
  24. package/agent-pane/backend/coverage/prettify.js +0 -2
  25. package/agent-pane/backend/coverage/sort-arrow-sprite.png +0 -0
  26. package/agent-pane/backend/coverage/sorter.js +0 -210
  27. package/agent-pane/backend/coverage/src/codex/codex-provider.ts.html +0 -1402
  28. package/agent-pane/backend/coverage/src/codex/index.html +0 -131
  29. package/agent-pane/backend/coverage/src/codex/item-mapper.ts.html +0 -331
  30. package/agent-pane/backend/coverage/src/db/index.html +0 -131
  31. package/agent-pane/backend/coverage/src/db/index.ts.html +0 -436
  32. package/agent-pane/backend/coverage/src/db/schema.ts.html +0 -175
  33. package/agent-pane/backend/coverage/src/index.html +0 -116
  34. package/agent-pane/backend/coverage/src/index.ts.html +0 -262
  35. package/agent-pane/backend/coverage/src/routes/index.html +0 -146
  36. package/agent-pane/backend/coverage/src/routes/sessions.ts.html +0 -991
  37. package/agent-pane/backend/coverage/src/routes/turns.ts.html +0 -256
  38. package/agent-pane/backend/coverage/src/routes/workspaces.ts.html +0 -406
  39. package/agent-pane/backend/coverage/src/ws/index.html +0 -116
  40. package/agent-pane/backend/coverage/src/ws/index.ts.html +0 -238
  41. package/agent-pane/backend/data.db +0 -0
  42. package/agent-pane/backend/data.db-shm +0 -0
  43. package/agent-pane/backend/data.db-wal +0 -0
  44. package/agent-pane/backend/package-lock.json +0 -5945
  45. package/agent-pane/backend/package.json +0 -33
  46. package/agent-pane/backend/scripts/backfill-from-jsonl.ts +0 -206
  47. package/agent-pane/backend/scripts/import-session-from-jsonl.ts +0 -264
  48. package/agent-pane/backend/src/claude/claude-message-mapper.test.ts +0 -271
  49. package/agent-pane/backend/src/claude/claude-message-mapper.ts +0 -259
  50. package/agent-pane/backend/src/claude/claude-provider.test.ts +0 -455
  51. package/agent-pane/backend/src/claude/claude-provider.ts +0 -1319
  52. package/agent-pane/backend/src/claude/claude-types.ts +0 -45
  53. package/agent-pane/backend/src/codex/app-server-client.test.ts +0 -183
  54. package/agent-pane/backend/src/codex/app-server-client.ts +0 -247
  55. package/agent-pane/backend/src/codex/app-server-types.ts +0 -259
  56. package/agent-pane/backend/src/codex/codex-provider-runtime-config.test.ts +0 -56
  57. package/agent-pane/backend/src/codex/codex-provider.test.ts +0 -60
  58. package/agent-pane/backend/src/codex/codex-provider.ts +0 -619
  59. package/agent-pane/backend/src/codex/item-mapper.test.ts +0 -221
  60. package/agent-pane/backend/src/codex/item-mapper.ts +0 -86
  61. package/agent-pane/backend/src/codex/shared-app-server.ts +0 -25
  62. package/agent-pane/backend/src/db/index.test.ts +0 -125
  63. package/agent-pane/backend/src/db/index.ts +0 -236
  64. package/agent-pane/backend/src/db/schema.ts +0 -34
  65. package/agent-pane/backend/src/index.ts +0 -89
  66. package/agent-pane/backend/src/integration/__fixtures__/cancel-turn.json +0 -29
  67. package/agent-pane/backend/src/integration/__fixtures__/delta-streaming.json +0 -40
  68. package/agent-pane/backend/src/integration/__fixtures__/failed-turn.json +0 -16
  69. package/agent-pane/backend/src/integration/__fixtures__/mcp-tool-call.json +0 -60
  70. package/agent-pane/backend/src/integration/__fixtures__/missing-item-started.json +0 -34
  71. package/agent-pane/backend/src/integration/__fixtures__/multi-item-turn.json +0 -85
  72. package/agent-pane/backend/src/integration/__fixtures__/multi-turn.json +0 -48
  73. package/agent-pane/backend/src/integration/__fixtures__/simple-turn.json +0 -35
  74. package/agent-pane/backend/src/integration/delta-streaming.test.ts +0 -130
  75. package/agent-pane/backend/src/integration/helpers/app-server-mock.ts +0 -272
  76. package/agent-pane/backend/src/integration/helpers/test-app.ts +0 -110
  77. package/agent-pane/backend/src/integration/helpers/ws-capture.ts +0 -64
  78. package/agent-pane/backend/src/integration/item-lifecycle.test.ts +0 -133
  79. package/agent-pane/backend/src/integration/mcp-tool-call.test.ts +0 -102
  80. package/agent-pane/backend/src/integration/missing-item-started.test.ts +0 -91
  81. package/agent-pane/backend/src/integration/multi-turn.test.ts +0 -121
  82. package/agent-pane/backend/src/integration/session-operations.test.ts +0 -175
  83. package/agent-pane/backend/src/integration/threads-claude-fork.test.ts +0 -241
  84. package/agent-pane/backend/src/integration/threads.test.ts +0 -309
  85. package/agent-pane/backend/src/integration/title-generation.test.ts +0 -109
  86. package/agent-pane/backend/src/integration/turn-cancel.test.ts +0 -111
  87. package/agent-pane/backend/src/integration/turn-failure.test.ts +0 -97
  88. package/agent-pane/backend/src/integration/turn-lifecycle.test.ts +0 -141
  89. package/agent-pane/backend/src/providers/index.ts +0 -16
  90. package/agent-pane/backend/src/providers/registry.test.ts +0 -92
  91. package/agent-pane/backend/src/providers/registry.ts +0 -43
  92. package/agent-pane/backend/src/providers/runtime-provider.ts +0 -49
  93. package/agent-pane/backend/src/repoburg/action-mapping.test.ts +0 -122
  94. package/agent-pane/backend/src/repoburg/action-mapping.ts +0 -294
  95. package/agent-pane/backend/src/repoburg/agent-runtime-client.test.ts +0 -271
  96. package/agent-pane/backend/src/repoburg/agent-runtime-client.ts +0 -285
  97. package/agent-pane/backend/src/repoburg/backend-resolver.test.ts +0 -356
  98. package/agent-pane/backend/src/repoburg/backend-resolver.ts +0 -261
  99. package/agent-pane/backend/src/repoburg/repoburg-client.test.ts +0 -180
  100. package/agent-pane/backend/src/repoburg/repoburg-client.ts +0 -194
  101. package/agent-pane/backend/src/repoburg/repoburg-provider.test.ts +0 -780
  102. package/agent-pane/backend/src/repoburg/repoburg-provider.ts +0 -471
  103. package/agent-pane/backend/src/repoburg/turn-projector.test.ts +0 -621
  104. package/agent-pane/backend/src/repoburg/turn-projector.ts +0 -637
  105. package/agent-pane/backend/src/routes/files.ts +0 -31
  106. package/agent-pane/backend/src/routes/mcp.ts +0 -33
  107. package/agent-pane/backend/src/routes/models.test.ts +0 -92
  108. package/agent-pane/backend/src/routes/models.ts +0 -16
  109. package/agent-pane/backend/src/routes/plugins.ts +0 -40
  110. package/agent-pane/backend/src/routes/providers.test.ts +0 -86
  111. package/agent-pane/backend/src/routes/providers.ts +0 -86
  112. package/agent-pane/backend/src/routes/sessions.test.ts +0 -772
  113. package/agent-pane/backend/src/routes/sessions.ts +0 -565
  114. package/agent-pane/backend/src/routes/skills.test.ts +0 -114
  115. package/agent-pane/backend/src/routes/skills.ts +0 -70
  116. package/agent-pane/backend/src/routes/threads.ts +0 -323
  117. package/agent-pane/backend/src/routes/turns.test.ts +0 -196
  118. package/agent-pane/backend/src/routes/turns.ts +0 -103
  119. package/agent-pane/backend/src/routes/workspaces.test.ts +0 -197
  120. package/agent-pane/backend/src/routes/workspaces.ts +0 -128
  121. package/agent-pane/backend/src/ws/index.test.ts +0 -107
  122. package/agent-pane/backend/src/ws/index.ts +0 -51
  123. package/agent-pane/backend/tsconfig.json +0 -25
  124. package/agent-pane/backend/vitest.config.ts +0 -20
  125. package/agent-pane/eslint.config.js +0 -33
  126. package/agent-pane/frontend/coverage/base.css +0 -224
  127. package/agent-pane/frontend/coverage/block-navigation.js +0 -87
  128. package/agent-pane/frontend/coverage/clover.xml +0 -2962
  129. package/agent-pane/frontend/coverage/coverage-final.json +0 -37
  130. package/agent-pane/frontend/coverage/favicon.png +0 -0
  131. package/agent-pane/frontend/coverage/index.html +0 -251
  132. package/agent-pane/frontend/coverage/prettify.css +0 -1
  133. package/agent-pane/frontend/coverage/prettify.js +0 -2
  134. package/agent-pane/frontend/coverage/sort-arrow-sprite.png +0 -0
  135. package/agent-pane/frontend/coverage/sorter.js +0 -210
  136. package/agent-pane/frontend/coverage/src/App.tsx.html +0 -217
  137. package/agent-pane/frontend/coverage/src/AppInitializer.tsx.html +0 -223
  138. package/agent-pane/frontend/coverage/src/api/client.ts.html +0 -187
  139. package/agent-pane/frontend/coverage/src/api/index.html +0 -161
  140. package/agent-pane/frontend/coverage/src/api/sessions.ts.html +0 -316
  141. package/agent-pane/frontend/coverage/src/api/websocket.ts.html +0 -544
  142. package/agent-pane/frontend/coverage/src/api/workspaces.ts.html +0 -199
  143. package/agent-pane/frontend/coverage/src/components/CollapsibleToolCalls.tsx.html +0 -226
  144. package/agent-pane/frontend/coverage/src/components/CommandInputBar.tsx.html +0 -382
  145. package/agent-pane/frontend/coverage/src/components/CommandPalette.tsx.html +0 -715
  146. package/agent-pane/frontend/coverage/src/components/IdeWorkspace.tsx.html +0 -160
  147. package/agent-pane/frontend/coverage/src/components/ModelSelector.tsx.html +0 -478
  148. package/agent-pane/frontend/coverage/src/components/NewSessionDialog.tsx.html +0 -472
  149. package/agent-pane/frontend/coverage/src/components/RenderArea.tsx.html +0 -574
  150. package/agent-pane/frontend/coverage/src/components/RightPanel.tsx.html +0 -205
  151. package/agent-pane/frontend/coverage/src/components/RuntimeIcon.tsx.html +0 -133
  152. package/agent-pane/frontend/coverage/src/components/SessionTabs.tsx.html +0 -217
  153. package/agent-pane/frontend/coverage/src/components/StatusBar.tsx.html +0 -271
  154. package/agent-pane/frontend/coverage/src/components/StatusDot.tsx.html +0 -109
  155. package/agent-pane/frontend/coverage/src/components/Toast.tsx.html +0 -313
  156. package/agent-pane/frontend/coverage/src/components/TurnContent.tsx.html +0 -1216
  157. package/agent-pane/frontend/coverage/src/components/WorkspaceSidebar.tsx.html +0 -1138
  158. package/agent-pane/frontend/coverage/src/components/index.html +0 -326
  159. package/agent-pane/frontend/coverage/src/components/panels/ChangesPanel.tsx.html +0 -247
  160. package/agent-pane/frontend/coverage/src/components/panels/LogsPanel.tsx.html +0 -160
  161. package/agent-pane/frontend/coverage/src/components/panels/MetricsPanel.tsx.html +0 -427
  162. package/agent-pane/frontend/coverage/src/components/panels/TurnsPanel.tsx.html +0 -397
  163. package/agent-pane/frontend/coverage/src/components/panels/index.html +0 -161
  164. package/agent-pane/frontend/coverage/src/constants/index.html +0 -116
  165. package/agent-pane/frontend/coverage/src/constants/models.ts.html +0 -406
  166. package/agent-pane/frontend/coverage/src/hooks/index.html +0 -146
  167. package/agent-pane/frontend/coverage/src/hooks/useEscapeKey.ts.html +0 -124
  168. package/agent-pane/frontend/coverage/src/hooks/useOutsideClick.ts.html +0 -142
  169. package/agent-pane/frontend/coverage/src/hooks/useSessionStatus.ts.html +0 -187
  170. package/agent-pane/frontend/coverage/src/index.html +0 -146
  171. package/agent-pane/frontend/coverage/src/main.tsx.html +0 -115
  172. package/agent-pane/frontend/coverage/src/store/index.html +0 -116
  173. package/agent-pane/frontend/coverage/src/store/store.ts.html +0 -2404
  174. package/agent-pane/frontend/coverage/src/test/component-helpers.ts.html +0 -190
  175. package/agent-pane/frontend/coverage/src/test/fixtures.ts.html +0 -367
  176. package/agent-pane/frontend/coverage/src/test/index.html +0 -131
  177. package/agent-pane/frontend/coverage/src/types/index.html +0 -116
  178. package/agent-pane/frontend/coverage/src/types/index.ts.html +0 -466
  179. package/agent-pane/frontend/coverage/src/utils/changes.ts.html +0 -202
  180. package/agent-pane/frontend/coverage/src/utils/duration.ts.html +0 -127
  181. package/agent-pane/frontend/coverage/src/utils/index.html +0 -131
  182. package/agent-pane/frontend/dist/assets/index-CJxD4YmJ.js +0 -370
  183. package/agent-pane/frontend/dist/assets/index-r-xwfOKQ.css +0 -1
  184. package/agent-pane/frontend/dist/index.html +0 -19
  185. package/agent-pane/frontend/index.html +0 -18
  186. package/agent-pane/frontend/package-lock.json +0 -4211
  187. package/agent-pane/frontend/package.json +0 -35
  188. package/agent-pane/frontend/src/App.test.tsx +0 -74
  189. package/agent-pane/frontend/src/App.tsx +0 -44
  190. package/agent-pane/frontend/src/AppInitializer.test.tsx +0 -142
  191. package/agent-pane/frontend/src/AppInitializer.tsx +0 -46
  192. package/agent-pane/frontend/src/__tests__/ThreadsPanel.test.tsx +0 -192
  193. package/agent-pane/frontend/src/api/client.test.ts +0 -126
  194. package/agent-pane/frontend/src/api/client.ts +0 -34
  195. package/agent-pane/frontend/src/api/models.ts +0 -7
  196. package/agent-pane/frontend/src/api/providers.ts +0 -17
  197. package/agent-pane/frontend/src/api/sessions.test.ts +0 -246
  198. package/agent-pane/frontend/src/api/sessions.ts +0 -97
  199. package/agent-pane/frontend/src/api/skills.ts +0 -12
  200. package/agent-pane/frontend/src/api/websocket.test.ts +0 -288
  201. package/agent-pane/frontend/src/api/websocket.ts +0 -240
  202. package/agent-pane/frontend/src/api/workspaces.test.ts +0 -112
  203. package/agent-pane/frontend/src/api/workspaces.ts +0 -38
  204. package/agent-pane/frontend/src/components/AskUserItem.test.tsx +0 -143
  205. package/agent-pane/frontend/src/components/AskUserItem.tsx +0 -207
  206. package/agent-pane/frontend/src/components/CollapsibleToolCalls.test.tsx +0 -49
  207. package/agent-pane/frontend/src/components/CollapsibleToolCalls.tsx +0 -56
  208. package/agent-pane/frontend/src/components/CommandInputBar.test.tsx +0 -133
  209. package/agent-pane/frontend/src/components/CommandInputBar.tsx +0 -584
  210. package/agent-pane/frontend/src/components/CommandPalette.test.tsx +0 -226
  211. package/agent-pane/frontend/src/components/CommandPalette.tsx +0 -194
  212. package/agent-pane/frontend/src/components/CommentableText.test.tsx +0 -196
  213. package/agent-pane/frontend/src/components/CommentableText.tsx +0 -379
  214. package/agent-pane/frontend/src/components/IdeWorkspace.test.tsx +0 -39
  215. package/agent-pane/frontend/src/components/IdeWorkspace.tsx +0 -51
  216. package/agent-pane/frontend/src/components/ModelSelector.test.tsx +0 -129
  217. package/agent-pane/frontend/src/components/ModelSelector.tsx +0 -191
  218. package/agent-pane/frontend/src/components/NewSessionDialog.test.tsx +0 -95
  219. package/agent-pane/frontend/src/components/NewSessionDialog.tsx +0 -129
  220. package/agent-pane/frontend/src/components/RenderArea.test.tsx +0 -160
  221. package/agent-pane/frontend/src/components/RenderArea.tsx +0 -170
  222. package/agent-pane/frontend/src/components/ResizeHandle.tsx +0 -29
  223. package/agent-pane/frontend/src/components/RightPanel.test.tsx +0 -43
  224. package/agent-pane/frontend/src/components/RightPanel.tsx +0 -46
  225. package/agent-pane/frontend/src/components/RuntimeIcon.test.tsx +0 -32
  226. package/agent-pane/frontend/src/components/RuntimeIcon.tsx +0 -16
  227. package/agent-pane/frontend/src/components/SessionTabs.test.tsx +0 -72
  228. package/agent-pane/frontend/src/components/SessionTabs.tsx +0 -49
  229. package/agent-pane/frontend/src/components/StatusBar.test.tsx +0 -56
  230. package/agent-pane/frontend/src/components/StatusBar.tsx +0 -129
  231. package/agent-pane/frontend/src/components/StatusDot.test.tsx +0 -25
  232. package/agent-pane/frontend/src/components/StatusDot.tsx +0 -8
  233. package/agent-pane/frontend/src/components/Toast.test.tsx +0 -79
  234. package/agent-pane/frontend/src/components/Toast.tsx +0 -76
  235. package/agent-pane/frontend/src/components/TurnContent.test.tsx +0 -377
  236. package/agent-pane/frontend/src/components/TurnContent.tsx +0 -594
  237. package/agent-pane/frontend/src/components/WorkspaceSidebar.test.tsx +0 -297
  238. package/agent-pane/frontend/src/components/WorkspaceSidebar.tsx +0 -351
  239. package/agent-pane/frontend/src/components/input/OptionSubPopup.tsx +0 -32
  240. package/agent-pane/frontend/src/components/input/SkillMentionPopup.test.tsx +0 -63
  241. package/agent-pane/frontend/src/components/input/SkillMentionPopup.tsx +0 -78
  242. package/agent-pane/frontend/src/components/input/SlashPopup.test.tsx +0 -96
  243. package/agent-pane/frontend/src/components/input/SlashPopup.tsx +0 -82
  244. package/agent-pane/frontend/src/components/panels/ChangesPanel.test.tsx +0 -61
  245. package/agent-pane/frontend/src/components/panels/ChangesPanel.tsx +0 -54
  246. package/agent-pane/frontend/src/components/panels/TasksPanel.test.tsx +0 -97
  247. package/agent-pane/frontend/src/components/panels/TasksPanel.tsx +0 -208
  248. package/agent-pane/frontend/src/components/panels/ThreadsPanel.tsx +0 -382
  249. package/agent-pane/frontend/src/components/panels/TurnsPanel.test.tsx +0 -131
  250. package/agent-pane/frontend/src/components/panels/TurnsPanel.tsx +0 -131
  251. package/agent-pane/frontend/src/constants/models.test.ts +0 -97
  252. package/agent-pane/frontend/src/constants/models.ts +0 -166
  253. package/agent-pane/frontend/src/hooks/useEscapeKey.test.ts +0 -42
  254. package/agent-pane/frontend/src/hooks/useEscapeKey.ts +0 -13
  255. package/agent-pane/frontend/src/hooks/useOutsideClick.test.ts +0 -92
  256. package/agent-pane/frontend/src/hooks/useOutsideClick.ts +0 -19
  257. package/agent-pane/frontend/src/hooks/useProvider.ts +0 -44
  258. package/agent-pane/frontend/src/hooks/useResizable.test.ts +0 -97
  259. package/agent-pane/frontend/src/hooks/useResizable.ts +0 -75
  260. package/agent-pane/frontend/src/hooks/useSessionStatus.test.ts +0 -116
  261. package/agent-pane/frontend/src/hooks/useSessionStatus.ts +0 -34
  262. package/agent-pane/frontend/src/main.test.tsx +0 -37
  263. package/agent-pane/frontend/src/main.tsx +0 -10
  264. package/agent-pane/frontend/src/store/sessionSlice.ts +0 -440
  265. package/agent-pane/frontend/src/store/store.test.ts +0 -1338
  266. package/agent-pane/frontend/src/store/store.ts +0 -37
  267. package/agent-pane/frontend/src/store/threadSlice.ts +0 -136
  268. package/agent-pane/frontend/src/store/uiSlice.ts +0 -133
  269. package/agent-pane/frontend/src/store/workspaceSlice.ts +0 -77
  270. package/agent-pane/frontend/src/store/wsSlice.ts +0 -368
  271. package/agent-pane/frontend/src/styles/app.css +0 -627
  272. package/agent-pane/frontend/src/styles/tokens.css +0 -62
  273. package/agent-pane/frontend/src/test/component-helpers.ts +0 -38
  274. package/agent-pane/frontend/src/test/fixtures.ts +0 -101
  275. package/agent-pane/frontend/src/test-setup.ts +0 -5
  276. package/agent-pane/frontend/src/types/index.test.ts +0 -128
  277. package/agent-pane/frontend/src/types/index.ts +0 -134
  278. package/agent-pane/frontend/src/utils/changes.test.ts +0 -81
  279. package/agent-pane/frontend/src/utils/changes.ts +0 -39
  280. package/agent-pane/frontend/src/utils/duration.test.ts +0 -76
  281. package/agent-pane/frontend/src/utils/duration.ts +0 -14
  282. package/agent-pane/frontend/tsconfig.json +0 -25
  283. package/agent-pane/frontend/vite.config.ts +0 -22
  284. package/agent-pane/frontend/vitest.config.ts +0 -29
  285. package/agent-pane/package-lock.json +0 -1527
  286. package/agent-pane/package.json +0 -19
  287. package/agent-pane/shared/provider-types.ts +0 -67
  288. package/agent-pane/shared/types.ts +0 -184
@@ -1,627 +0,0 @@
1
- @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;450;510;590;600&family=JetBrains+Mono:wght@400;500&display=swap');
2
- @import './tokens.css';
3
-
4
- * { margin: 0; padding: 0; box-sizing: border-box; }
5
-
6
- html, body { height: 100%; overflow: hidden; }
7
-
8
- body {
9
- font-family: var(--font-sans);
10
- font-size: 13px;
11
- font-weight: 400;
12
- background: var(--canvas);
13
- color: var(--text-2);
14
- -webkit-font-smoothing: antialiased;
15
- -moz-osx-font-smoothing: grayscale;
16
- text-rendering: optimizeLegibility;
17
- font-feature-settings: "ss03", "cv11";
18
- font-variant-numeric: tabular-nums;
19
- letter-spacing: -0.01em;
20
- }
21
-
22
- ::-webkit-scrollbar { width: 6px; height: 6px; }
23
- ::-webkit-scrollbar-track { background: transparent; }
24
- ::-webkit-scrollbar-thumb { background: var(--surface-3); border-radius: 3px; }
25
- ::-webkit-scrollbar-thumb:hover { background: var(--border-hover); }
26
-
27
- :focus-visible { outline: none; box-shadow: var(--focus-ring); border-radius: var(--r-md); }
28
-
29
- /* === IDE Root Layout === */
30
- .ide-root { display: flex; flex-direction: column; height: 100vh; }
31
- /* Default track sizes match uiSlice defaults; IdeWorkspace overrides via inline style
32
- once hydrated (and adds two 6px resize-handle tracks: 240px 6px 1fr 6px 300px). */
33
- .ide-layout { display: grid; grid-template-columns: 240px 6px 1fr 6px 300px; flex: 1; overflow: hidden; }
34
-
35
- /* === Resize handles === */
36
- .resize-handle { width: 6px; cursor: col-resize; background: transparent; flex-shrink: 0; transition: background var(--dur-fast) var(--ease); }
37
- .resize-handle:hover, .resize-handle.dragging { background: var(--border-hover); }
38
- /* While dragging, suppress text selection across the whole app. */
39
- body.is-resizing { user-select: none; }
40
- body.is-resizing * { cursor: col-resize !important; }
41
-
42
- /* === Sidebar === */
43
- .ide-sidebar { background: var(--surface-0); border-right: 1px solid var(--border); overflow-y: auto; display: flex; flex-direction: column; }
44
- .sidebar-header { padding: 10px 12px 8px; display: flex; align-items: center; justify-content: space-between; }
45
- .sidebar-header-title { font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-muted); }
46
- .sidebar-add { width: 20px; height: 20px; border-radius: var(--r-sm); border: none; background: transparent; color: var(--text-muted); cursor: pointer; font-size: 15px; display: flex; align-items: center; justify-content: center; transition: all var(--dur-normal) var(--ease); }
47
- .sidebar-add:hover { background: rgba(0,0,0,0.06); color: var(--text); }
48
-
49
- .tree-section { margin-bottom: 2px; }
50
- .tree-section-header { padding: 5px 8px; display: flex; align-items: center; gap: 6px; font-size: 11px; font-weight: 590; color: var(--text-2); cursor: pointer; user-select: none; border-radius: var(--r-sm); transition: background var(--dur-fast) var(--ease); }
51
- .tree-section-header:hover { background: rgba(0,0,0,0.04); }
52
- .tree-chevron { font-size: 9px; color: var(--text-muted); width: 10px; transition: transform var(--dur-normal) var(--ease); }
53
- .tree-section.collapsed .tree-chevron { transform: rotate(-90deg); }
54
- .tree-section.collapsed .tree-children { display: none; }
55
- .tree-count { margin-left: auto; font-size: 10px; background: var(--surface-2); padding: 1px 6px; border-radius: var(--r-pill); color: var(--text-muted); font-variant-numeric: tabular-nums; }
56
- .tree-children { padding-left: 4px; }
57
- .tree-item { padding: 4px 8px 4px 26px; border-radius: var(--r-sm); font-size: 12px; cursor: pointer; display: flex; align-items: center; gap: 6px; color: var(--text-2); user-select: none; transition: all var(--dur-fast) var(--ease); position: relative; }
58
- .tree-item:hover { background: rgba(0,0,0,0.04); color: var(--text); }
59
- .tree-item.active { background: var(--accent-soft); color: var(--text); }
60
- .tree-item.active::before { content: ''; position: absolute; left: 0; top: 4px; bottom: 4px; width: 2px; background: var(--accent); border-radius: var(--r-pill); }
61
- .tree-item .ri { width: 16px; height: 16px; border-radius: 3px; display: flex; align-items: center; justify-content: center; font-size: 8px; font-weight: 700; color: #fff; flex-shrink: 0; }
62
- .tree-label { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
63
- .sidebar-footer { margin-top: auto; padding: 8px 12px; border-top: 1px solid var(--border-muted); font-size: 11px; color: var(--text-muted); display: flex; align-items: center; gap: 6px; cursor: pointer; }
64
- .sidebar-footer:hover { color: var(--text-2); }
65
-
66
- /* === Center === */
67
- .ide-center { display: flex; flex-direction: column; background: var(--canvas); overflow: hidden; min-height: 0; }
68
- .ide-tabs { display: flex; background: var(--surface-0); border-bottom: 1px solid var(--border); overflow-x: auto; flex-shrink: 0; scrollbar-width: none; }
69
- .ide-tabs::-webkit-scrollbar { display: none; }
70
- .ide-tab { padding: 8px 12px; font-size: 12px; color: var(--text-3); border-right: 1px solid var(--border-muted); cursor: pointer; display: flex; align-items: center; gap: 6px; white-space: nowrap; user-select: none; transition: all var(--dur-fast) var(--ease); position: relative; }
71
- .ide-tab:hover { background: rgba(0,0,0,0.03); color: var(--text-2); }
72
- .ide-tab.active { color: var(--text); background: var(--canvas); }
73
- .ide-tab.active::after { content: ''; position: absolute; left: 0; right: 0; top: 0; height: 2px; background: var(--accent); }
74
- .ide-tab .ri { width: 14px; height: 14px; font-size: 7px; border-radius: 3px; }
75
- .ide-tab-close { margin-left: 4px; color: var(--text-muted); font-size: 14px; opacity: 0; transition: opacity var(--dur-fast) var(--ease); display: flex; align-items: center; }
76
- .ide-tab:hover .ide-tab-close { opacity: 1; }
77
- .ide-tab-close:hover { color: var(--red); }
78
- .ide-tab-add { padding: 8px 10px; color: var(--text-muted); cursor: pointer; font-size: 14px; transition: color var(--dur-fast) var(--ease); display: flex; align-items: center; }
79
- .ide-tab-add:hover { color: var(--text); }
80
-
81
- .ide-render { flex: 1; overflow: hidden; display: flex; flex-direction: column; position: relative; min-height: 0; }
82
- .render-scroll { flex: 1; padding: 20px 28px; overflow-y: auto; font-size: 14px; line-height: 1.7; color: var(--text); min-height: 0; }
83
-
84
- /* === Markdown === */
85
- .render-content { max-width: 720px; }
86
- .render-content h1, .render-content h2, .render-content h3 { margin: 20px 0 8px; font-weight: 600; color: var(--text); line-height: 1.3; }
87
- .render-content h1 { font-size: 20px; }
88
- .render-content h2 { font-size: 17px; }
89
- .render-content h3 { font-size: 15px; }
90
- .render-content p { margin-bottom: 12px; color: var(--text-2); }
91
- .render-content ul, .render-content ol { margin-bottom: 12px; padding-left: 24px; }
92
- .render-content li { margin-bottom: 4px; color: var(--text-2); }
93
- .render-content code { font-family: var(--font-mono); font-size: 12px; background: var(--surface-1); padding: 2px 6px; border-radius: var(--r-sm); color: var(--accent); }
94
- .render-content pre { background: var(--surface-0); border: 1px solid var(--border); border-radius: var(--r-md); padding: 12px 16px; overflow-x: auto; margin-bottom: 12px; }
95
- .render-content pre code { background: none; padding: 0; color: var(--text); font-size: 12.5px; line-height: 1.6; }
96
- .render-content a { color: var(--accent); text-decoration: none; }
97
- .render-content a:hover { text-decoration: underline; }
98
- .render-content blockquote { border-left: 3px solid var(--border); padding-left: 14px; color: var(--text-3); margin-bottom: 12px; }
99
- .render-content table { width: 100%; border-collapse: collapse; margin-bottom: 12px; }
100
- .render-content th, .render-content td { border: 1px solid var(--border); padding: 6px 10px; font-size: 13px; }
101
- .render-content th { background: var(--surface-1); font-weight: 510; }
102
-
103
- /* === Turn cards === */
104
- .turn-header { display: flex; align-items: center; gap: 8px; margin-bottom: 14px; }
105
- .turn-header-icon { width: 24px; height: 24px; border-radius: var(--r-sm); display: flex; align-items: center; justify-content: center; flex-shrink: 0; font-size: 9px; font-weight: 700; color: #fff; }
106
- .turn-header-title { font-size: 14px; font-weight: 600; color: var(--text); }
107
- .turn-header-meta { font-size: 11px; color: var(--text-muted); }
108
-
109
- /* Collapsible tool calls */
110
- .tool-calls { margin-bottom: 16px; }
111
- .tool-calls-header {
112
- display: flex; align-items: center; gap: 8px;
113
- padding: 6px 12px;
114
- background: var(--surface-1);
115
- border: 1px solid var(--border);
116
- border-radius: var(--r-sm);
117
- cursor: pointer;
118
- transition: background 150ms ease-out;
119
- user-select: none;
120
- }
121
- .tool-calls-header:hover { background: var(--surface-2); }
122
- .tool-calls-icon { display: flex; align-items: center; color: var(--text-3); flex-shrink: 0; }
123
- .tool-calls-summary { font-size: 13px; font-weight: 500; color: var(--text-2); flex: 1; }
124
- .tool-calls-chevron { color: var(--text-muted); transition: transform 150ms ease-out; flex-shrink: 0; }
125
- .tool-calls-body { margin-top: 8px; padding-left: 16px; border-left: 2px solid var(--border); }
126
- .intermediate-segment { margin-bottom: 16px; }
127
- .intermediate-segment:last-child { margin-bottom: 0; }
128
- .user-message { font-size: 14px; color: var(--text); background: var(--accent-soft); padding: 12px 16px; border-radius: var(--r-md); border: 1px solid rgba(217,119,6,0.15); }
129
-
130
- /* === Command input === */
131
- .cmd-bar { position: relative; display: flex; flex-direction: column; padding: 0; background: var(--surface-0); border-top: 1px solid var(--border); flex-shrink: 0; }
132
- .cmd-input-row { display: flex; align-items: flex-end; gap: 8px; padding: 8px 12px; }
133
- .cmd-bar:focus-within { box-shadow: inset 0 0 0 1px rgba(217, 119, 6, 0.4); }
134
- .cmd-textarea { flex: 1; border: none; background: transparent; color: var(--text); font-size: 13px; font-family: var(--font-sans); outline: none; resize: none; overflow-y: auto; line-height: 1.5; padding: 6px 0; }
135
- .cmd-textarea::placeholder { color: var(--text-muted); }
136
- .cmd-textarea:disabled { opacity: 0.5; }
137
- .cmd-textarea:focus-visible { box-shadow: none; }
138
- .cmd-send-btn { width: 28px; height: 28px; border: none; border-radius: var(--r-sm); background: var(--surface-2); color: var(--text-muted); cursor: default; display: flex; align-items: center; justify-content: center; flex-shrink: 0; transition: all var(--dur-fast) var(--ease); }
139
- .cmd-send-btn:not(:disabled) { background: var(--accent); color: #fff; cursor: pointer; }
140
- .cmd-send-btn:not(:disabled):hover { background: var(--accent-hover); }
141
- .cmd-send-btn:disabled { opacity: 0.4; }
142
- .cmd-stop-btn { width: 28px; height: 28px; border: none; border-radius: var(--r-sm); background: var(--red); color: #fff; cursor: pointer; display: flex; align-items: center; justify-content: center; flex-shrink: 0; transition: all var(--dur-fast) var(--ease); }
143
- .cmd-stop-btn:hover { background: #b91c1c; }
144
-
145
- /* === Right Panel === */
146
- .ide-right { background: var(--surface-0); border-left: 1px solid var(--border); display: flex; flex-direction: column; overflow: hidden; }
147
- .right-tabs { display: flex; padding: 0 8px; border-bottom: 1px solid var(--border); flex-shrink: 0; gap: 2px; }
148
- .right-tab { padding: 7px 10px; font-size: 11px; font-weight: 510; color: var(--text-3); cursor: pointer; border-bottom: 2px solid transparent; user-select: none; transition: all var(--dur-fast) var(--ease); margin-bottom: -1px; }
149
- .right-tab:hover { color: var(--text-2); }
150
- .right-tab.active { color: var(--text); border-bottom-color: var(--accent); }
151
- .right-content { flex: 1; overflow-y: auto; padding: 14px; }
152
-
153
- .right-section { margin-bottom: 20px; }
154
- .right-section-title { font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-muted); margin-bottom: 8px; }
155
-
156
- /* === Turns panel === */
157
- .turn-item { display: flex; align-items: center; gap: 8px; padding: 7px 10px; border-radius: var(--r-sm); cursor: pointer; font-size: 12px; color: var(--text-3); transition: all var(--dur-fast) var(--ease); position: relative; }
158
- .turn-item:hover { background: rgba(0,0,0,0.04); color: var(--text-2); }
159
- .turn-item.active { background: var(--accent-soft); color: var(--text); }
160
- .turn-item.active::before { content: ''; position: absolute; left: 0; top: 4px; bottom: 4px; width: 2px; background: var(--accent); border-radius: var(--r-pill); }
161
- .turn-item-icon { width: 18px; height: 18px; border-radius: var(--r-sm); display: flex; align-items: center; justify-content: center; flex-shrink: 0; font-size: 8px; font-weight: 700; color: #fff; }
162
- .turn-item-label { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
163
- .turn-item-status { font-size: 10px; color: var(--amber); flex-shrink: 0; }
164
- .turn-item-meta { font-size: 10px; color: var(--text-muted); flex-shrink: 0; }
165
-
166
- /* === File changes === */
167
- .file-change { display: flex; align-items: center; gap: 8px; padding: 5px 0; font-size: 12px; border-bottom: 1px solid var(--border-muted); }
168
- .file-change:last-child { border: none; }
169
- .file-change.clickable { cursor: pointer; transition: background var(--dur-fast) var(--ease); }
170
- .file-change.clickable:hover { background: rgba(0,0,0,0.03); }
171
- .fc-status { width: 14px; text-align: center; font-weight: 700; font-size: 11px; flex-shrink: 0; }
172
- .fc-add { color: var(--green); }
173
- .fc-mod { color: var(--amber); }
174
- .fc-del { color: var(--red); }
175
- .fc-name { flex: 1; color: var(--text-2); font-family: var(--font-mono); font-size: 11px; }
176
- .fc-delta { font-size: 10px; color: var(--text-muted); flex-shrink: 0; font-variant-numeric: tabular-nums; }
177
-
178
- /* === Diff === */
179
- .diff-file-header { display: flex; align-items: center; gap: 10px; padding: 10px 14px; background: var(--surface-0); border: 1px solid var(--border); border-radius: var(--r-md) var(--r-md) 0 0; border-bottom: none; }
180
- .diff-file-status { width: 16px; height: 16px; border-radius: 3px; display: flex; align-items: center; justify-content: center; font-size: 9px; font-weight: 700; flex-shrink: 0; }
181
- .diff-file-name { font-family: var(--font-mono); font-size: 13px; font-weight: 510; color: var(--text); }
182
- .diff-file-stats { display: flex; align-items: center; gap: 6px; margin-left: auto; font-size: 11px; font-variant-numeric: tabular-nums; }
183
- .diff-file-badge { padding: 1px 7px; border-radius: var(--r-pill); background: var(--surface-2); color: var(--text-3); font-size: 10px; }
184
- .diff-body { border: 1px solid var(--border); border-radius: 0 0 var(--r-md) var(--r-md); overflow: hidden; margin-bottom: 20px; }
185
- .diff-line { display: flex; align-items: flex-start; font-family: var(--font-mono); font-size: 12px; line-height: 1.6; }
186
- .diff-line-num { width: 42px; flex-shrink: 0; text-align: right; padding: 0 8px; color: var(--text-muted); background: var(--surface-0); user-select: none; border-right: 1px solid var(--border-muted); }
187
- .diff-sign { width: 20px; flex-shrink: 0; text-align: center; user-select: none; font-weight: 700; }
188
- .diff-line-content { flex: 1; padding: 0 8px; white-space: pre-wrap; word-break: break-all; min-width: 0; }
189
- .diff-line-add { background: rgba(22, 163, 74, 0.06); }
190
- .diff-line-add .diff-sign { color: var(--green); }
191
- .diff-line-del { background: rgba(220, 38, 38, 0.06); }
192
- .diff-line-del .diff-sign { color: var(--red); }
193
- .diff-line-ctx .diff-sign { color: var(--text-muted); }
194
- .diff-line-ctx .diff-line-content { color: var(--text-3); }
195
-
196
- /* === Scope toggle === */
197
- .changes-scope-toggle { display: flex; gap: 2px; margin-bottom: 12px; padding: 2px; background: var(--surface-1); border-radius: var(--r-md); }
198
- .scope-btn { flex: 1; padding: 5px 10px; border: none; background: transparent; color: var(--text-3); font-size: 11px; font-weight: 510; cursor: pointer; border-radius: var(--r-sm); font-family: var(--font-sans); transition: all var(--dur-fast) var(--ease); }
199
- .scope-btn:hover { color: var(--text-2); }
200
- .scope-btn.active { background: var(--surface-0); color: var(--text); box-shadow: var(--inset-highlight); }
201
-
202
- /* === Status Bar === */
203
- .ide-statusbar { display: flex; align-items: center; gap: 12px; padding: 0 12px; height: 24px; background: var(--surface-0); border-top: 1px solid var(--border); font-size: 11px; color: var(--text-muted); flex-shrink: 0; font-variant-numeric: tabular-nums; }
204
- .sb-item { display: flex; align-items: center; gap: 3px; cursor: pointer; transition: color var(--dur-fast) var(--ease); }
205
- .sb-item:hover { color: var(--text-2); }
206
- .sb-spacer { flex: 1; }
207
- .sb-divider { color: var(--border); }
208
- .sb-context { display: flex; align-items: center; gap: 5px; }
209
- .sb-context-text { font-size: 10px; color: var(--text-muted); font-variant-numeric: tabular-nums; }
210
-
211
- /* Model selector — 3-level cascading popover */
212
- .model-selector { position: relative; }
213
- .model-selector-btn {
214
- display: flex; align-items: center; gap: 4px;
215
- background: none; border: none; cursor: pointer;
216
- color: var(--text-muted); font-size: 11px;
217
- padding: 2px 6px; border-radius: 3px;
218
- transition: background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
219
- }
220
- .model-selector-btn:hover { background: var(--surface-1); color: var(--text-2); }
221
- .model-selector-provider { font-weight: 500; color: var(--accent); }
222
- .model-selector-sep { color: var(--border); margin: 0 1px; }
223
- .model-selector-model { color: var(--text-2); }
224
- .model-selector-reasoning { color: var(--text-muted); font-style: italic; }
225
- .model-selector-chevron { opacity: 0.5; flex-shrink: 0; }
226
-
227
- .model-selector-popover {
228
- position: absolute; bottom: calc(100% + 4px); left: 0;
229
- display: flex; gap: 1px;
230
- background: var(--surface-0);
231
- border: 1px solid var(--border);
232
- border-radius: 6px;
233
- box-shadow: 0 4px 16px rgba(0,0,0,0.2);
234
- z-index: 100;
235
- min-width: 0;
236
- overflow: hidden;
237
- }
238
- .model-selector-column {
239
- min-width: 140px; max-width: 220px;
240
- padding: 4px 0;
241
- background: var(--surface-0);
242
- }
243
- .model-selector-col-header {
244
- padding: 4px 10px;
245
- font-size: 9px; font-weight: 600; text-transform: uppercase;
246
- color: var(--text-muted); letter-spacing: 0.5px;
247
- }
248
- .model-selector-item {
249
- display: flex; align-items: center; gap: 6px;
250
- padding: 6px 10px;
251
- cursor: pointer;
252
- font-size: 11px; color: var(--text-2);
253
- transition: background var(--dur-fast) var(--ease);
254
- }
255
- .model-selector-item:hover { background: var(--surface-1); }
256
- .model-selector-item.selected { color: var(--accent); }
257
- .model-selector-item.disabled { cursor: default; opacity: 0.5; }
258
- .model-selector-item.disabled:hover { background: none; }
259
- .model-selector-item-main { display: flex; flex-direction: column; gap: 1px; flex: 1; min-width: 0; }
260
- .model-selector-item-name { font-weight: 500; white-space: nowrap; }
261
- .model-selector-item-desc { font-size: 9px; color: var(--text-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
262
- .model-selector-coming-soon {
263
- display: flex; align-items: center; gap: 2px;
264
- font-size: 9px; color: var(--text-muted); font-style: italic;
265
- }
266
- .model-selector-empty {
267
- padding: 8px 10px;
268
- font-size: 10px; color: var(--text-muted); font-style: italic;
269
- }
270
-
271
- /* Dialog select dropdowns */
272
- .dialog-select {
273
- appearance: none;
274
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%23888' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
275
- background-repeat: no-repeat;
276
- background-position: right 8px center;
277
- padding-right: 26px;
278
- }
279
-
280
- /* === Badges === */
281
- .badge { display: inline-flex; align-items: center; gap: 4px; padding: 2px 8px; border-radius: var(--r-pill); font-size: 11px; font-weight: 510; white-space: nowrap; }
282
- .badge-running { background: var(--green-soft); color: var(--green); }
283
- .badge-queued { background: var(--amber-soft); color: var(--amber); }
284
- .badge-done { background: var(--accent-soft); color: var(--accent); }
285
- .badge-failed { background: var(--red-soft); color: var(--red); }
286
- .badge-paused { background: rgba(168, 163, 153, 0.12); color: var(--text-muted); }
287
-
288
- /* === Runtime Icons === */
289
- .runtime-icon { width: 20px; height: 20px; border-radius: var(--r-sm); display: flex; align-items: center; justify-content: center; font-size: 9px; font-weight: 700; color: #fff; flex-shrink: 0; letter-spacing: 0; }
290
- .ic-claude { background: var(--ic-claude); }
291
- .ic-codex { background: var(--ic-codex); }
292
- .ic-repoburg { background: var(--ic-repoburg); }
293
- .ic-cursor { background: var(--ic-cursor); }
294
-
295
- /* === Status dots === */
296
- .status-dot { width: 6px; height: 6px; border-radius: 50%; display: inline-block; flex-shrink: 0; }
297
- .status-dot.running { background: var(--green); animation: dot-pulse 1.5s ease-in-out infinite; }
298
- .status-dot.queued { background: var(--amber); }
299
- .status-dot.error { background: var(--red); }
300
- .status-dot.done { background: var(--accent); }
301
- .status-dot.paused { background: var(--text-muted); }
302
-
303
- /* === Lucide === */
304
- [data-lucide], svg.lucide { width: 16px; height: 16px; stroke-width: 1.5; flex-shrink: 0; }
305
- .icon-xs { width: 12px !important; height: 12px !important; }
306
- .icon-sm { width: 14px !important; height: 14px !important; }
307
- .icon-lg { width: 20px !important; height: 20px !important; }
308
-
309
- /* === Dialog === */
310
- .dialog-overlay { position: fixed; inset: 0; background: rgba(0,0,0,0.3); display: flex; align-items: center; justify-content: center; z-index: 100; }
311
- .dialog { background: var(--surface-0); border: 1px solid var(--border); border-radius: var(--r-lg); width: 400px; max-width: 90vw; box-shadow: 0 8px 32px rgba(0,0,0,0.16); }
312
- .dialog-header { display: flex; align-items: center; justify-content: space-between; padding: 14px 16px; border-bottom: 1px solid var(--border-muted); }
313
- .dialog-title { font-size: 14px; font-weight: 600; color: var(--text); }
314
- .dialog-close { border: none; background: transparent; color: var(--text-muted); cursor: pointer; padding: 4px; border-radius: var(--r-sm); display: flex; align-items: center; transition: all var(--dur-fast) var(--ease); }
315
- .dialog-close:hover { background: rgba(0,0,0,0.06); color: var(--text); }
316
- .dialog-body { padding: 16px; display: flex; flex-direction: column; gap: 14px; }
317
- .dialog-label { display: flex; flex-direction: column; gap: 4px; font-size: 11px; font-weight: 510; color: var(--text-muted); }
318
- .dialog-input { border: 1px solid var(--border); border-radius: var(--r-sm); padding: 8px 10px; font-size: 13px; font-family: var(--font-sans); color: var(--text); background: var(--canvas); outline: none; transition: border-color var(--dur-fast) var(--ease); }
319
- .dialog-input:focus { border-color: var(--accent); box-shadow: var(--focus-ring); }
320
- .dialog-footer { display: flex; justify-content: flex-end; gap: 8px; padding: 12px 16px; border-top: 1px solid var(--border-muted); }
321
- .dialog-btn-cancel { padding: 6px 14px; border-radius: var(--r-sm); border: 1px solid var(--border); background: transparent; color: var(--text-2); font-size: 12px; cursor: pointer; font-family: var(--font-sans); transition: all var(--dur-fast) var(--ease); }
322
- .dialog-btn-cancel:hover { background: var(--surface-2); color: var(--text); }
323
- .dialog-btn-create { padding: 6px 14px; border-radius: var(--r-sm); border: none; background: var(--accent); color: #fff; font-size: 12px; font-weight: 510; cursor: pointer; font-family: var(--font-sans); transition: all var(--dur-fast) var(--ease); }
324
- .dialog-btn-create:hover { background: var(--accent-hover); }
325
-
326
- /* === Turn group === */
327
- .turn-group { margin-bottom: 24px; }
328
- .turn-block { margin-bottom: 32px; padding-bottom: 8px; border-bottom: 1px solid var(--border); }
329
- .turn-block:last-child { border-bottom: none; }
330
- .cmd-block { background: var(--surface-0); border: 1px solid var(--border); border-radius: var(--r-md); padding: 10px 14px; overflow-x: auto; margin-bottom: 12px; }
331
- .cmd-block code { font-family: var(--font-mono); font-size: 12px; color: var(--text); }
332
- .cmd-output { background: var(--surface-0); border: 1px solid var(--border-muted); border-radius: var(--r-md); padding: 10px 14px; overflow-x: auto; margin-bottom: 12px; max-height: 200px; overflow-y: auto; }
333
- .cmd-output code { font-family: var(--font-mono); font-size: 12px; color: var(--text-3); }
334
-
335
- /* Output truncation toggle */
336
- .cmd-output-toggle { border: 1px solid var(--border); border-radius: var(--r-sm); background: var(--surface-1); color: var(--text-muted); font-size: 11px; font-family: var(--font-sans); padding: 4px 10px; cursor: pointer; margin-bottom: 12px; transition: all var(--dur-fast) var(--ease); }
337
- .cmd-output-toggle:hover { background: var(--surface-2); color: var(--text-2); }
338
-
339
- /* MCP tool call arguments + results */
340
- .mcp-args { margin-bottom: 12px; }
341
- .mcp-arg { margin-bottom: 6px; }
342
- .mcp-arg-key { font-size: 11px; font-weight: 600; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.04em; display: block; margin-bottom: 3px; }
343
- .mcp-arg-value { font-size: 12px; color: var(--text-2); white-space: pre-wrap; word-break: break-word; }
344
- .file-change-list { display: flex; flex-direction: column; gap: 2px; }
345
- .todo-list { list-style: none; padding-left: 0; }
346
- .todo-done { color: var(--text-3); text-decoration: line-through; }
347
- .todo-pending { color: var(--text-2); }
348
-
349
- /* === Empty state === */
350
- .empty-state { padding: 40px 20px; text-align: center; color: var(--text-muted); font-size: 13px; }
351
-
352
- /* === Command Palette === */
353
- .palette-overlay { position: fixed; inset: 0; background: rgba(0,0,0,0.25); backdrop-filter: blur(2px); display: flex; align-items: flex-start; justify-content: center; padding-top: 120px; z-index: 200; }
354
- .palette { background: var(--surface-0); border: 1px solid var(--border); border-radius: var(--r-lg); width: 520px; max-width: 90vw; box-shadow: 0 12px 40px rgba(0,0,0,0.2); overflow: hidden; }
355
- .palette-search { display: flex; align-items: center; gap: 8px; padding: 12px 16px; border-bottom: 1px solid var(--border-muted); }
356
- .palette-search input { flex: 1; border: none; background: transparent; color: var(--text); font-size: 15px; font-family: var(--font-sans); outline: none; }
357
- .palette-search input::placeholder { color: var(--text-muted); }
358
- .palette-esc { font-size: 10px; font-weight: 600; color: var(--text-muted); background: var(--surface-2); padding: 2px 6px; border-radius: var(--r-sm); }
359
- .palette-list { max-height: 360px; overflow-y: auto; padding: 4px; }
360
- .palette-empty { padding: 24px; text-align: center; color: var(--text-muted); font-size: 13px; }
361
- .palette-item { display: flex; align-items: center; gap: 10px; padding: 8px 12px; border-radius: var(--r-sm); cursor: pointer; transition: background var(--dur-fast) var(--ease); }
362
- .palette-item.selected { background: var(--accent-soft); }
363
- .palette-item-icon { color: var(--text-muted); flex-shrink: 0; display: flex; align-items: center; }
364
- .palette-item.selected .palette-item-icon { color: var(--accent); }
365
- .palette-item-label { font-size: 13px; color: var(--text); font-weight: 510; }
366
- .palette-item-hint { font-size: 11px; color: var(--text-muted); margin-left: auto; }
367
- .palette-item-enter { color: var(--text-muted); flex-shrink: 0; }
368
-
369
- /* === Toast === */
370
- .toast-container { position: fixed; bottom: 36px; right: 16px; display: flex; flex-direction: column-reverse; gap: 8px; z-index: 300; pointer-events: none; }
371
- .toast { display: flex; align-items: center; gap: 8px; padding: 10px 14px; border-radius: var(--r-md); font-size: 12px; font-weight: 500; min-width: 280px; max-width: 400px; pointer-events: auto; animation: toast-in 200ms ease-out; border: 1px solid var(--border); background: var(--surface-0); box-shadow: 0 4px 16px rgba(0,0,0,0.12); }
372
- @keyframes toast-in { from { opacity: 0; transform: translateX(20px); } to { opacity: 1; transform: translateX(0); } }
373
- .toast-success { border-left: 3px solid var(--green); } .toast-success svg { color: var(--green); }
374
- .toast-error { border-left: 3px solid var(--red); } .toast-error svg { color: var(--red); }
375
- .toast-info { border-left: 3px solid var(--accent); } .toast-info svg { color: var(--accent); }
376
- .toast-warn { border-left: 3px solid var(--amber); } .toast-warn svg { color: var(--amber); }
377
- .toast-message { flex: 1; color: var(--text-2); }
378
- .toast-close { border: none; background: transparent; color: var(--text-muted); cursor: pointer; padding: 2px; border-radius: var(--r-sm); display: flex; align-items: center; transition: color var(--dur-fast) var(--ease); }
379
- .toast-close:hover { color: var(--text); }
380
-
381
- /* === Error / Aborted Banner === */
382
- .error-banner { display: flex; align-items: center; gap: 10px; padding: 10px 16px; background: rgba(220,38,38,0.08); border: 1px solid rgba(220,38,38,0.2); border-radius: var(--r-md); margin-bottom: 16px; }
383
- .banner-icon { width: 20px; height: 20px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 700; flex-shrink: 0; }
384
- .error-banner .banner-icon { background: var(--red); color: #fff; }
385
- .error-banner .banner-text { color: var(--red); font-size: 13px; font-weight: 500; }
386
- .aborted-banner { display: flex; align-items: center; gap: 10px; padding: 10px 16px; background: rgba(217,119,6,0.08); border: 1px solid rgba(217,119,6,0.2); border-radius: var(--r-md); margin-bottom: 16px; }
387
- .aborted-banner .banner-icon { background: var(--amber); color: #fff; }
388
- .aborted-banner .banner-text { color: var(--amber); font-size: 13px; font-weight: 500; }
389
-
390
- @media (prefers-reduced-motion: reduce) {
391
- *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; }
392
- }
393
-
394
- /* === Skeleton Loading (F2) === */
395
- .skeleton-bars { width: 80%; max-width: 500px; margin: 20px 0; }
396
- .skeleton-bar { height: 10px; border-radius: var(--r-sm); background: var(--surface-1); margin-bottom: 8px; animation: shimmer 1.2s infinite; }
397
- .skeleton-bar:nth-child(1) { width: 60%; }
398
- .skeleton-bar:nth-child(2) { width: 85%; }
399
- .skeleton-bar:nth-child(3) { width: 70%; }
400
- .skeleton-bar:nth-child(4) { width: 90%; }
401
- .skeleton-bar:nth-child(5) { width: 50%; }
402
- @keyframes shimmer { 0% { opacity: 0.3; } 50% { opacity: 0.6; } 100% { opacity: 0.3; } }
403
-
404
- @keyframes dot-pulse {
405
- from { opacity: 1; }
406
- to { opacity: 0.4; }
407
- }
408
-
409
- /* === Diff Highlight (F4) === */
410
- .diff-file-header { transition: background 300ms ease-out; }
411
- .diff-file-header.diff-highlight { background: var(--accent-soft); }
412
-
413
- /* === Palette Footer (F5) === */
414
- .palette-footer { display: flex; gap: 16px; padding: 8px 16px; border-top: 1px solid var(--border-muted); font-size: 11px; color: var(--text-muted); }
415
- .palette-footer-hint { display: flex; align-items: center; gap: 4px; }
416
- .kbd { font-family: var(--font-mono); font-size: 10px; padding: 1px 5px; border-radius: var(--r-sm); background: var(--surface-2); border: 1px solid var(--border); }
417
-
418
- /* === Toast Undo (F6) === */
419
- .toast-undo { font-size: 12px; font-weight: 500; color: var(--accent); background: transparent; border: none; cursor: pointer; padding: 2px 8px; border-radius: var(--r-sm); display: flex; align-items: center; gap: 4px; transition: background var(--dur-fast) var(--ease); }
420
- .toast-undo:hover { background: var(--accent-soft); }
421
-
422
- /* === Workspace Sidebar (hierarchy + quick create) === */
423
- .tree-section-label { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 11px; }
424
- .tree-section-add { width: 18px; height: 18px; border: none; border-radius: var(--r-sm); background: transparent; color: var(--text-muted); cursor: pointer; display: flex; align-items: center; justify-content: center; transition: all var(--dur-fast) var(--ease); flex-shrink: 0; }
425
- .tree-section-add:hover { background: var(--accent-soft); color: var(--accent); }
426
- .tree-empty { padding: 4px 8px 4px 26px; font-size: 11px; color: var(--text-muted); font-style: italic; }
427
-
428
- /* === Sidebar sub-groups (Working / Finished) === */
429
- .tree-subgroup { margin-bottom: 1px; }
430
- .tree-subgroup-header { padding: 3px 8px 3px 18px; display: flex; align-items: center; gap: 5px; font-size: 10px; font-weight: 590; color: var(--text-muted); cursor: pointer; user-select: none; border-radius: var(--r-sm); transition: background var(--dur-fast) var(--ease); }
431
- .tree-subgroup-header:hover { background: rgba(0,0,0,0.04); color: var(--text-2); }
432
- .tree-subgroup.collapsed .tree-chevron { transform: rotate(-90deg); }
433
- .tree-subgroup.collapsed .tree-subgroup-items { display: none; }
434
- .tree-subgroup-label { text-transform: uppercase; letter-spacing: 0.05em; }
435
- .tree-subgroup-count { margin-left: auto; font-size: 9px; color: var(--text-muted); font-variant-numeric: tabular-nums; }
436
- .tree-subgroup-items { padding-left: 0; }
437
- .tree-item-finished .tree-label { color: var(--text-muted); opacity: 0.6; }
438
- .tree-item-finished:hover .tree-label { opacity: 0.85; }
439
-
440
- /* === Context Menu === */
441
- .ctx-menu { background: var(--surface-0); border: 1px solid var(--border); border-radius: var(--r-md); box-shadow: 0 4px 16px rgba(0,0,0,0.12); padding: 4px; min-width: 160px; }
442
- .ctx-menu-item { display: flex; align-items: center; gap: 8px; padding: 6px 10px; border-radius: var(--r-sm); font-size: 12px; color: var(--text-2); cursor: pointer; transition: background var(--dur-fast) var(--ease); }
443
- .ctx-menu-item:hover { background: var(--accent-soft); color: var(--text); }
444
- .ctx-menu-item.ctx-danger:hover { background: rgba(220,38,38,0.08); color: var(--red); }
445
- .ctx-menu-item.ctx-disabled { opacity: 0.4; cursor: default; }
446
- .ctx-menu-item.ctx-disabled:hover { background: transparent; color: var(--text-2); }
447
-
448
- /* === Inline rename input in sidebar === */
449
- .tree-rename-input { flex: 1; border: 1px solid var(--accent); border-radius: var(--r-sm); padding: 1px 6px; font-size: 12px; font-family: var(--font-sans); color: var(--text); background: var(--canvas); outline: none; box-shadow: var(--focus-ring); min-width: 0; }
450
-
451
- /* === Slash Popup === */
452
- .slash-popup { position: absolute; bottom: 100%; left: 12px; right: 12px; margin-bottom: 4px; background: var(--surface-0); border: 1px solid var(--border); border-radius: var(--r-md); box-shadow: 0 4px 16px rgba(0,0,0,0.12); max-height: 280px; overflow-y: auto; z-index: 100; }
453
- .slash-popup-header { padding: 6px 10px; font-size: 10px; font-weight: 600; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.05em; border-bottom: 1px solid var(--border); display: flex; align-items: center; gap: 4px; }
454
- .slash-popup-back { background: none; border: none; color: var(--text-muted); cursor: pointer; font-size: 11px; padding: 2px 4px; border-radius: var(--r-sm); }
455
- .slash-popup-back:hover { background: var(--surface-1); color: var(--text-2); }
456
- .slash-popup-empty { padding: 12px 10px; font-size: 12px; color: var(--text-muted); text-align: center; }
457
- .slash-popup-item { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 6px 10px; cursor: pointer; border-radius: var(--r-sm); transition: background var(--dur-fast) var(--ease); }
458
- .slash-popup-item:hover, .slash-popup-item.selected { background: var(--accent-soft); }
459
- .slash-popup-label { font-size: 12px; font-weight: 500; color: var(--text-2); font-family: var(--font-mono); }
460
- .slash-popup-hint { font-size: 11px; color: var(--text-muted); }
461
- .slash-popup-item-main { display: flex; flex-direction: column; gap: 1px; }
462
- .slash-popup-check { color: var(--accent); font-size: 13px; }
463
-
464
- /* === Skill Badges === */
465
- .skill-badges { display: flex; flex-wrap: wrap; gap: 4px; padding: 6px 12px 0; }
466
- .skill-badge { display: inline-flex; align-items: center; gap: 4px; padding: 2px 6px; font-size: 11px; font-family: var(--font-mono); color: var(--accent); background: var(--accent-soft); border-radius: var(--r-sm); }
467
- .skill-badge-remove { background: none; border: none; color: var(--text-muted); cursor: pointer; font-size: 13px; line-height: 1; padding: 0; }
468
- .skill-badge-remove:hover { color: var(--red); }
469
-
470
- /* === Attachment Preview Area (input bar) === */
471
- .attachment-preview-area { display: flex; flex-wrap: wrap; gap: 4px; padding: 6px 12px 0; }
472
- .attachment-chip { display: inline-flex; align-items: center; gap: 4px; padding: 2px 6px 2px 2px; border: 1px solid var(--border); border-radius: var(--r-pill); background: var(--surface-1); max-width: 180px; position: relative; transition: border-color var(--dur-fast) var(--ease); }
473
- .attachment-chip:hover { border-color: var(--accent); }
474
- .attachment-thumb { width: 18px; height: 18px; object-fit: cover; border-radius: 50%; flex-shrink: 0; }
475
- .attachment-file-icon { width: 14px; height: 14px; color: var(--text-muted); flex-shrink: 0; }
476
- .attachment-info { display: flex; flex-direction: column; gap: 0; overflow: hidden; min-width: 0; }
477
- .attachment-name { font-size: 10px; font-family: var(--font-mono); color: var(--text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100px; }
478
- .attachment-size { font-size: 9px; color: var(--text-muted); font-variant-numeric: tabular-nums; }
479
- .attachment-remove { background: none; border: none; color: var(--text-muted); cursor: pointer; padding: 1px; display: flex; align-items: center; justify-content: center; border-radius: var(--r-xs); transition: all var(--dur-fast) var(--ease); flex-shrink: 0; }
480
- .attachment-remove:hover { color: var(--red); background: rgba(239,68,68,0.1); }
481
-
482
- /* === Paperclip Button === */
483
- .attachment-clip-btn { width: 28px; height: 28px; border: none; border-radius: var(--r-sm); background: transparent; color: var(--text-muted); cursor: pointer; display: flex; align-items: center; justify-content: center; flex-shrink: 0; transition: all var(--dur-fast) var(--ease); }
484
- .attachment-clip-btn:hover { color: var(--accent); background: var(--surface-2); }
485
- .attachment-clip-btn:disabled { opacity: 0.3; cursor: default; }
486
-
487
- /* === Drag-over Highlight === */
488
- .cmd-bar.drag-over { box-shadow: inset 0 0 0 2px var(--accent); background: var(--accent-soft); }
489
-
490
- /* === Image Preview Modal === */
491
- .image-preview-modal { position: fixed; inset: 0; z-index: 10000; background: rgba(0,0,0,0.8); display: flex; align-items: center; justify-content: center; padding: 32px; animation: modal-fade-in 150ms ease-out; }
492
- @keyframes modal-fade-in { from { opacity: 0; } to { opacity: 1; } }
493
- .image-preview-content { position: relative; max-width: 90vw; max-height: 90vh; display: flex; flex-direction: column; align-items: center; gap: 8px; }
494
- .image-preview-content img { max-width: 100%; max-height: 80vh; object-fit: contain; border-radius: var(--r-sm); border: 1px solid var(--border); }
495
- .image-preview-info { display: flex; gap: 12px; font-size: 12px; color: var(--text-muted); font-family: var(--font-mono); }
496
- .image-preview-close { position: absolute; top: -12px; right: -12px; width: 28px; height: 28px; border: none; border-radius: 50%; background: var(--surface-2); color: var(--text); cursor: pointer; display: flex; align-items: center; justify-content: center; transition: all var(--dur-fast) var(--ease); }
497
- .image-preview-close:hover { background: var(--red); color: #fff; }
498
-
499
- /* === Attachment Pills (render area) === */
500
- .attachment-pills { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 6px; }
501
- .attachment-pill { display: inline-flex; align-items: center; gap: 4px; padding: 2px 8px 2px 2px; border: 1px solid var(--border); border-radius: var(--r-pill); background: var(--surface-1); font-size: 10px; font-family: var(--font-mono); color: var(--text-muted); transition: border-color var(--dur-fast) var(--ease); }
502
- .attachment-pill:hover { border-color: var(--accent); }
503
- .attachment-pill-thumb { width: 16px; height: 16px; object-fit: cover; border-radius: 50%; flex-shrink: 0; }
504
- .attachment-pill-icon { color: var(--text-muted); flex-shrink: 0; }
505
- .attachment-pill-name { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100px; }
506
- /* === Tasks Panel === */
507
- .right-tab-badge { display: inline-flex; align-items: center; justify-content: center; min-width: 16px; height: 16px; padding: 0 4px; margin-left: 4px; font-size: 10px; font-weight: 600; color: #fff; background: var(--accent); border-radius: 8px; }
508
- .task-count-badge { font-size: 10px; font-weight: 500; }
509
- .task-card { border: 1px solid var(--border); border-radius: var(--r-md); padding: 10px 12px; margin-bottom: 10px; transition: border-color var(--dur-fast) var(--ease); }
510
- .task-card.task-running { border-color: var(--accent); }
511
- .task-card.task-failed { border-color: var(--red); }
512
- .task-card-header { display: flex; align-items: center; gap: 8px; }
513
- .task-card-icon { display: flex; align-items: center; justify-content: center; width: 20px; height: 20px; border-radius: var(--r-sm); background: var(--surface-2); color: var(--text-3); flex-shrink: 0; }
514
- .task-card-type { font-size: 13px; font-weight: 600; color: var(--text); }
515
- .task-card-status { display: flex; align-items: center; gap: 3px; font-size: 11px; padding: 2px 6px; border-radius: var(--r-sm); flex-shrink: 0; }
516
- .task-status-running { color: var(--accent); background: var(--accent-soft); }
517
- .task-status-done { color: var(--green); background: var(--green-soft); }
518
- .task-status-failed { color: var(--red); background: var(--red-soft); }
519
- .task-card-chevron { color: var(--text-muted); flex-shrink: 0; transition: transform var(--dur-fast) var(--ease); }
520
- .task-card-desc { font-size: 12px; color: var(--text-2); margin-top: 6px; font-family: var(--font-mono); }
521
- .task-card-meta { font-size: 11px; color: var(--text-muted); margin-top: 4px; }
522
- .task-card-body { margin-top: 8px; }
523
- .task-output { max-height: 300px; }
524
- .task-card-placeholder { font-size: 12px; color: var(--text-muted); font-style: italic; padding: 8px 0; }
525
- .task-card-context { font-size: 10px; color: var(--text-muted); margin-top: 6px; padding-top: 6px; border-top: 1px solid var(--border-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
526
-
527
- /* === Discussion Threads === */
528
- /* Highlight marks on anchored text */
529
- mark[data-thread-id] { background: rgba(217, 119, 6, 0.18); border-radius: 2px; cursor: pointer; padding: 0 1px; transition: background var(--dur-fast) var(--ease); }
530
- mark[data-thread-id]:hover { background: rgba(217, 119, 6, 0.3); }
531
- mark[data-thread-id].thread-mark-resolved { background: transparent; border-bottom: 2px dashed var(--text-muted); }
532
-
533
- /* Floating selection actions (Discuss + Quote) */
534
- .selection-actions { position: fixed; z-index: 9999; display: flex; gap: 4px; }
535
- .discuss-button { display: flex; align-items: center; gap: 4px; padding: 4px 10px; border: 1px solid var(--border); border-radius: var(--r-sm); background: var(--surface-0); color: var(--accent); font-size: 11px; font-weight: 500; cursor: pointer; box-shadow: 0 2px 8px rgba(0,0,0,0.12); transition: all var(--dur-fast) var(--ease); }
536
- .discuss-button:hover { background: var(--accent-soft); border-color: var(--accent); }
537
-
538
- /* Thread creation popover */
539
- .thread-create-popover { position: fixed; z-index: 9999; min-width: 280px; max-width: 360px; background: var(--surface-0); border: 1px solid var(--border); border-radius: var(--r-md); box-shadow: 0 4px 16px rgba(0,0,0,0.15); padding: 10px; display: flex; flex-direction: column; gap: 8px; transform: translateX(-100%); }
540
- .thread-create-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 8px; }
541
- .thread-create-quote { font-size: 11px; color: var(--text-muted); font-style: italic; flex: 1; line-height: 1.4; }
542
- .thread-create-close { border: none; background: transparent; color: var(--text-muted); cursor: pointer; padding: 2px; border-radius: var(--r-sm); flex-shrink: 0; }
543
- .thread-create-close:hover { background: var(--surface-1); color: var(--text); }
544
- .thread-create-input { border: 1px solid var(--border); border-radius: var(--r-sm); padding: 8px 10px; font-size: 13px; font-family: var(--font-sans); color: var(--text); background: var(--canvas); outline: none; resize: none; line-height: 1.5; transition: border-color var(--dur-fast) var(--ease); }
545
- .thread-create-input:focus { border-color: var(--accent); box-shadow: var(--focus-ring); }
546
- .thread-create-footer { display: flex; align-items: center; justify-content: space-between; }
547
- .thread-create-hint { font-size: 10px; color: var(--text-muted); }
548
- .thread-create-send { display: flex; align-items: center; gap: 4px; padding: 4px 10px; border: none; border-radius: var(--r-sm); background: var(--accent); color: #fff; font-size: 11px; font-weight: 500; cursor: pointer; transition: background var(--dur-fast) var(--ease); }
549
- .thread-create-send:disabled { opacity: 0.4; cursor: default; }
550
- .thread-create-send:not(:disabled):hover { background: var(--accent-hover); }
551
-
552
- /* Threads sidebar — filter tabs */
553
- .thread-filter-tabs { display: flex; gap: 2px; margin-bottom: 12px; padding: 2px; background: var(--surface-1); border-radius: var(--r-md); }
554
- .thread-filter-tab { flex: 1; padding: 4px 8px; border: none; background: transparent; color: var(--text-3); font-size: 10px; font-weight: 500; cursor: pointer; border-radius: var(--r-sm); font-family: var(--font-sans); transition: all var(--dur-fast) var(--ease); }
555
- .thread-filter-tab:hover { color: var(--text-2); }
556
- .thread-filter-tab.active { background: var(--surface-0); color: var(--text); box-shadow: var(--inset-highlight); }
557
-
558
- /* Thread card */
559
- .thread-card { border: 1px solid var(--border); border-radius: var(--r-md); padding: 10px 12px; margin-bottom: 10px; transition: border-color var(--dur-fast) var(--ease), background var(--dur-fast) var(--ease); }
560
- .thread-card.thread-resolved { opacity: 0.7; }
561
- .thread-card-highlighted { border-color: var(--accent); background: var(--accent-soft); }
562
- .thread-card-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 8px; cursor: pointer; }
563
- .thread-card-quote { font-size: 11px; color: var(--text-muted); font-style: italic; line-height: 1.4; flex: 1; }
564
- .thread-card-header-right { display: flex; align-items: center; gap: 4px; flex-shrink: 0; }
565
- .thread-status-badge { font-size: 10px; font-weight: 600; padding: 2px 8px; border-radius: var(--r-pill); }
566
- .thread-status-open { background: var(--accent-soft); color: var(--accent); }
567
- .thread-status-resolved { background: var(--green-soft); color: var(--green); }
568
-
569
- /* Thread conversation */
570
- .thread-card-conversation { margin-top: 8px; max-height: 300px; overflow-y: auto; }
571
- .thread-card-turn { margin-bottom: 8px; padding-bottom: 8px; border-bottom: 1px solid var(--border-muted); }
572
- .thread-card-turn:last-child { border-bottom: none; margin-bottom: 0; padding-bottom: 0; }
573
- .thread-card-user-message { font-size: 12px; color: var(--text); background: var(--accent-soft); padding: 6px 10px; border-radius: var(--r-sm); border: 1px solid rgba(217,119,6,0.15); margin-bottom: 4px; }
574
- .thread-card-ai-response { font-size: 12px; color: var(--text-2); padding: 4px 0; line-height: 1.5; }
575
- .thread-card-ai-response p { margin-bottom: 6px; }
576
- .thread-card-ai-response code { font-family: var(--font-mono); font-size: 11px; background: var(--surface-1); padding: 1px 4px; border-radius: var(--r-sm); color: var(--accent); }
577
- .thread-card-ai-response pre { background: var(--surface-0); border: 1px solid var(--border); border-radius: var(--r-sm); padding: 8px; overflow-x: auto; margin-bottom: 6px; }
578
- .thread-card-ai-response pre code { background: none; padding: 0; }
579
- .thread-card-pending { font-size: 11px; color: var(--text-muted); font-style: italic; padding: 4px 0; }
580
- .thread-card-placeholder { font-size: 11px; color: var(--text-muted); font-style: italic; padding: 8px 0; }
581
-
582
- /* Follow-up input */
583
- .thread-card-followup { display: flex; gap: 4px; margin-top: 8px; }
584
- .thread-card-followup-input { flex: 1; border: 1px solid var(--border); border-radius: var(--r-sm); padding: 6px 8px; font-size: 12px; font-family: var(--font-sans); color: var(--text); background: var(--canvas); outline: none; resize: none; line-height: 1.5; transition: border-color var(--dur-fast) var(--ease); }
585
- .thread-card-followup-input:focus { border-color: var(--accent); }
586
- .thread-card-followup-input:disabled { opacity: 0.5; }
587
- .thread-card-followup-send { width: 28px; height: 28px; border: none; border-radius: var(--r-sm); background: var(--accent); color: #fff; cursor: pointer; display: flex; align-items: center; justify-content: center; flex-shrink: 0; transition: background var(--dur-fast) var(--ease); }
588
- .thread-card-followup-send:disabled { opacity: 0.4; cursor: default; }
589
- .thread-card-followup-send:not(:disabled):hover { background: var(--accent-hover); }
590
-
591
- .thread-locate-btn { background: none; border: none; color: var(--text-muted); cursor: pointer; padding: 2px; border-radius: 3px; display: flex; align-items: center; transition: all var(--dur-fast) var(--ease); flex-shrink: 0; }
592
- .thread-locate-btn:hover { color: var(--accent); background: var(--accent-soft); }
593
-
594
- /* Thread mark flash animation */
595
- .thread-mark-flash { animation: mark-flash 1.5s ease-out; }
596
- @keyframes mark-flash { 0% { background: rgba(217,119,6,0.5); } 100% { background: rgba(217,119,6,0.18); } }
597
-
598
- /* Thread actions */
599
- .thread-card-actions { display: flex; gap: 6px; margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--border-muted); }
600
- .thread-action-btn { display: flex; align-items: center; gap: 4px; padding: 4px 8px; border: 1px solid var(--border); border-radius: var(--r-sm); background: transparent; color: var(--text-3); font-size: 11px; cursor: pointer; font-family: var(--font-sans); transition: all var(--dur-fast) var(--ease); }
601
- .thread-action-btn:hover { background: var(--surface-1); color: var(--text); }
602
- .thread-action-btn.thread-action-danger:hover { background: rgba(220,38,38,0.08); color: var(--red); border-color: rgba(220,38,38,0.2); }
603
-
604
- /* === Agent call card (non-clickable status display) === */
605
- .agent-call-card { display: flex; align-items: center; gap: 8px; padding: 8px 14px; border-left: 3px solid var(--accent); background: var(--surface); border-radius: 0 var(--r-sm) var(--r-sm) 0; }
606
- .agent-call-icon { color: var(--text-2); display: flex; align-items: center; }
607
- .agent-call-desc { font-size: 13px; color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: 1; }
608
- .agent-call-status { font-size: 10px; font-family: var(--font-mono); padding: 1px 6px; border-radius: var(--r-sm); }
609
- .agent-call-status.running { color: var(--accent); background: var(--accent-soft); }
610
- .agent-call-status.done { color: var(--green); background: rgba(34,197,94,0.08); }
611
- .agent-call-status.failed { color: var(--red); background: rgba(239,68,68,0.08); }
612
-
613
- /* === Ask-user selection buttons (platform parity) === */
614
- .ask-user-card { border-left: 3px solid var(--accent); }
615
- .ask-user-groups { display: flex; flex-direction: column; gap: 10px; margin-top: 6px; }
616
- .ask-user-group { display: flex; flex-direction: column; gap: 6px; }
617
- .ask-user-question { font-size: 12px; font-weight: 600; color: var(--text-2); }
618
- .ask-user-options { display: flex; flex-wrap: wrap; gap: 6px; }
619
- .ask-user-option { padding: 4px 10px; font-size: 12px; font-family: var(--font-sans); color: var(--text-2); background: var(--canvas); border: 1px solid var(--border); border-radius: var(--r-sm); cursor: pointer; transition: all var(--dur-fast) var(--ease); }
620
- .ask-user-option:not(:disabled):hover { border-color: var(--accent); color: var(--accent); }
621
- .ask-user-option.selected { background: var(--accent); border-color: var(--accent); color: #fff; }
622
- .ask-user-option:disabled { opacity: 0.55; cursor: default; }
623
- .ask-user-option.selected:disabled { opacity: 0.8; }
624
- .ask-user-send { display: inline-flex; align-items: center; gap: 5px; padding: 4px 12px; font-size: 12px; font-family: var(--font-sans); color: #fff; background: var(--accent); border: none; border-radius: var(--r-sm); cursor: pointer; align-self: flex-start; transition: background var(--dur-fast) var(--ease); }
625
- .ask-user-send:disabled { opacity: 0.4; cursor: default; }
626
- .ask-user-send:not(:disabled):hover { background: var(--accent-hover); }
627
- .ask-user-submitted { font-size: 11px; color: var(--text-muted); font-style: italic; }