p-spore 0.1.4 → 0.1.42

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 (393) hide show
  1. package/README.md +110 -15
  2. package/dist/agents/agent-manager.d.ts +3 -3
  3. package/dist/agents/agent-manager.d.ts.map +1 -1
  4. package/dist/agents/agent-manager.js +3 -2
  5. package/dist/agents/agent-manager.js.map +1 -1
  6. package/dist/application/agent-application.d.ts +29 -5
  7. package/dist/application/agent-application.d.ts.map +1 -1
  8. package/dist/application/agent-application.js +444 -14
  9. package/dist/application/agent-application.js.map +1 -1
  10. package/dist/articles/diff.d.ts +70 -0
  11. package/dist/articles/diff.d.ts.map +1 -0
  12. package/dist/articles/diff.js +330 -0
  13. package/dist/articles/diff.js.map +1 -0
  14. package/dist/articles/docx.d.ts +10 -0
  15. package/dist/articles/docx.d.ts.map +1 -0
  16. package/dist/articles/docx.js +219 -0
  17. package/dist/articles/docx.js.map +1 -0
  18. package/dist/articles/draft.d.ts +18 -0
  19. package/dist/articles/draft.d.ts.map +1 -0
  20. package/dist/articles/draft.js +88 -0
  21. package/dist/articles/draft.js.map +1 -0
  22. package/dist/articles/edits.d.ts +24 -0
  23. package/dist/articles/edits.d.ts.map +1 -0
  24. package/dist/articles/edits.js +54 -0
  25. package/dist/articles/edits.js.map +1 -0
  26. package/dist/articles/html.d.ts +10 -0
  27. package/dist/articles/html.d.ts.map +1 -0
  28. package/dist/articles/html.js +122 -0
  29. package/dist/articles/html.js.map +1 -0
  30. package/dist/articles/plain.d.ts +8 -0
  31. package/dist/articles/plain.d.ts.map +1 -0
  32. package/dist/articles/plain.js +69 -0
  33. package/dist/articles/plain.js.map +1 -0
  34. package/dist/articles/preview.d.ts +43 -0
  35. package/dist/articles/preview.d.ts.map +1 -0
  36. package/dist/articles/preview.js +90 -0
  37. package/dist/articles/preview.js.map +1 -0
  38. package/dist/articles/publish.d.ts +10 -0
  39. package/dist/articles/publish.d.ts.map +1 -0
  40. package/dist/articles/publish.js +54 -0
  41. package/dist/articles/publish.js.map +1 -0
  42. package/dist/articles/receipt.d.ts +16 -0
  43. package/dist/articles/receipt.d.ts.map +1 -0
  44. package/dist/articles/receipt.js +27 -0
  45. package/dist/articles/receipt.js.map +1 -0
  46. package/dist/articles/store.d.ts +78 -0
  47. package/dist/articles/store.d.ts.map +1 -0
  48. package/dist/articles/store.js +308 -0
  49. package/dist/articles/store.js.map +1 -0
  50. package/dist/articles/tool.d.ts +14 -0
  51. package/dist/articles/tool.d.ts.map +1 -0
  52. package/dist/articles/tool.js +175 -0
  53. package/dist/articles/tool.js.map +1 -0
  54. package/dist/articles/writer-context.d.ts +5 -0
  55. package/dist/articles/writer-context.d.ts.map +1 -0
  56. package/dist/articles/writer-context.js +56 -0
  57. package/dist/articles/writer-context.js.map +1 -0
  58. package/dist/articles/writer.d.ts +18 -0
  59. package/dist/articles/writer.d.ts.map +1 -0
  60. package/dist/articles/writer.js +79 -0
  61. package/dist/articles/writer.js.map +1 -0
  62. package/dist/articles/zip-write.d.ts +11 -0
  63. package/dist/articles/zip-write.d.ts.map +1 -0
  64. package/dist/articles/zip-write.js +63 -0
  65. package/dist/articles/zip-write.js.map +1 -0
  66. package/dist/bundled-skills/README.md +17 -0
  67. package/dist/bundled-skills/aegis-search/SKILL.md +59 -0
  68. package/dist/bundled-skills/aegis-search/bin/.gitkeep +0 -0
  69. package/dist/bundled-skills/article-canvas/SKILL.md +28 -0
  70. package/dist/bundled-skills/binaries.json +23 -0
  71. package/dist/bundled-skills/doc-extract/SKILL.md +56 -0
  72. package/dist/cli/main.d.ts.map +1 -1
  73. package/dist/cli/main.js +407 -54
  74. package/dist/cli/main.js.map +1 -1
  75. package/dist/config/config.d.ts +43 -0
  76. package/dist/config/config.d.ts.map +1 -1
  77. package/dist/config/config.js +150 -6
  78. package/dist/config/config.js.map +1 -1
  79. package/dist/daemon/daemon.d.ts.map +1 -1
  80. package/dist/daemon/daemon.js +80 -11
  81. package/dist/daemon/daemon.js.map +1 -1
  82. package/dist/desktop/application.d.ts +4 -0
  83. package/dist/desktop/application.d.ts.map +1 -0
  84. package/dist/desktop/application.js +1688 -0
  85. package/dist/desktop/application.js.map +1 -0
  86. package/dist/desktop/article-export.d.ts +12 -0
  87. package/dist/desktop/article-export.d.ts.map +1 -0
  88. package/dist/desktop/article-export.js +87 -0
  89. package/dist/desktop/article-export.js.map +1 -0
  90. package/dist/desktop/assets/pspore.png +0 -0
  91. package/dist/desktop/assets/pspore.svg +24 -0
  92. package/dist/desktop/conversation-smoke.d.ts +5 -0
  93. package/dist/desktop/conversation-smoke.d.ts.map +1 -0
  94. package/dist/desktop/conversation-smoke.js +93 -0
  95. package/dist/desktop/conversation-smoke.js.map +1 -0
  96. package/dist/desktop/daemon-bridge.d.ts.map +1 -1
  97. package/dist/desktop/daemon-bridge.js +62 -17
  98. package/dist/desktop/daemon-bridge.js.map +1 -1
  99. package/dist/desktop/ipc-contract.d.ts +124 -0
  100. package/dist/desktop/ipc-contract.d.ts.map +1 -1
  101. package/dist/desktop/ipc-contract.js +191 -12
  102. package/dist/desktop/ipc-contract.js.map +1 -1
  103. package/dist/desktop/local-path.d.ts +15 -0
  104. package/dist/desktop/local-path.d.ts.map +1 -0
  105. package/dist/desktop/local-path.js +59 -0
  106. package/dist/desktop/local-path.js.map +1 -0
  107. package/dist/desktop/main.d.ts +10 -1
  108. package/dist/desktop/main.d.ts.map +1 -1
  109. package/dist/desktop/main.js +122 -530
  110. package/dist/desktop/main.js.map +1 -1
  111. package/dist/desktop/native-startup.d.ts +4 -0
  112. package/dist/desktop/native-startup.d.ts.map +1 -0
  113. package/dist/desktop/native-startup.js +57 -0
  114. package/dist/desktop/native-startup.js.map +1 -0
  115. package/dist/desktop/preload.cjs +28 -1
  116. package/dist/desktop/renderer/article-panel.d.ts +45 -0
  117. package/dist/desktop/renderer/article-panel.d.ts.map +1 -0
  118. package/dist/desktop/renderer/article-panel.js +1126 -0
  119. package/dist/desktop/renderer/article-panel.js.map +1 -0
  120. package/dist/desktop/renderer/article-split.d.ts +32 -0
  121. package/dist/desktop/renderer/article-split.d.ts.map +1 -0
  122. package/dist/desktop/renderer/article-split.js +48 -0
  123. package/dist/desktop/renderer/article-split.js.map +1 -0
  124. package/dist/desktop/renderer/composer-file-references.d.ts +23 -0
  125. package/dist/desktop/renderer/composer-file-references.d.ts.map +1 -0
  126. package/dist/desktop/renderer/composer-file-references.js +51 -0
  127. package/dist/desktop/renderer/composer-file-references.js.map +1 -0
  128. package/dist/desktop/renderer/conversation.d.ts +23 -0
  129. package/dist/desktop/renderer/conversation.d.ts.map +1 -0
  130. package/dist/desktop/renderer/conversation.js +66 -0
  131. package/dist/desktop/renderer/conversation.js.map +1 -0
  132. package/dist/desktop/renderer/dom-reconcile.d.ts +15 -0
  133. package/dist/desktop/renderer/dom-reconcile.d.ts.map +1 -0
  134. package/dist/desktop/renderer/dom-reconcile.js +33 -0
  135. package/dist/desktop/renderer/dom-reconcile.js.map +1 -0
  136. package/dist/desktop/renderer/index.html +211 -34
  137. package/dist/desktop/renderer/indexing-view.d.ts +22 -0
  138. package/dist/desktop/renderer/indexing-view.d.ts.map +1 -0
  139. package/dist/desktop/renderer/indexing-view.js +115 -0
  140. package/dist/desktop/renderer/indexing-view.js.map +1 -0
  141. package/dist/desktop/renderer/markdown-view.d.ts +23 -0
  142. package/dist/desktop/renderer/markdown-view.d.ts.map +1 -0
  143. package/dist/desktop/renderer/markdown-view.js +436 -0
  144. package/dist/desktop/renderer/markdown-view.js.map +1 -0
  145. package/dist/desktop/renderer/motion.d.ts +67 -0
  146. package/dist/desktop/renderer/motion.d.ts.map +1 -0
  147. package/dist/desktop/renderer/motion.js +296 -0
  148. package/dist/desktop/renderer/motion.js.map +1 -0
  149. package/dist/desktop/renderer/renderer.js +1788 -151
  150. package/dist/desktop/renderer/renderer.js.map +1 -1
  151. package/dist/desktop/renderer/session-find.d.ts +18 -0
  152. package/dist/desktop/renderer/session-find.d.ts.map +1 -0
  153. package/dist/desktop/renderer/session-find.js +29 -0
  154. package/dist/desktop/renderer/session-find.js.map +1 -0
  155. package/dist/desktop/renderer/session-search.d.ts +30 -0
  156. package/dist/desktop/renderer/session-search.d.ts.map +1 -0
  157. package/dist/desktop/renderer/session-search.js +296 -0
  158. package/dist/desktop/renderer/session-search.js.map +1 -0
  159. package/dist/desktop/renderer/store.d.ts +33 -0
  160. package/dist/desktop/renderer/store.d.ts.map +1 -1
  161. package/dist/desktop/renderer/store.js +92 -19
  162. package/dist/desktop/renderer/store.js.map +1 -1
  163. package/dist/desktop/renderer/styles.css +910 -268
  164. package/dist/desktop/renderer/vendor/gsap.min.js +11 -0
  165. package/dist/desktop/renderer-diagnostics.d.ts +5 -0
  166. package/dist/desktop/renderer-diagnostics.d.ts.map +1 -0
  167. package/dist/desktop/renderer-diagnostics.js +47 -0
  168. package/dist/desktop/renderer-diagnostics.js.map +1 -0
  169. package/dist/desktop/security.d.ts +26 -1
  170. package/dist/desktop/security.d.ts.map +1 -1
  171. package/dist/desktop/security.js +26 -6
  172. package/dist/desktop/security.js.map +1 -1
  173. package/dist/desktop/smoke-fixture.d.ts.map +1 -1
  174. package/dist/desktop/smoke-fixture.js +77 -3
  175. package/dist/desktop/smoke-fixture.js.map +1 -1
  176. package/dist/desktop/splash/index.html +25 -0
  177. package/dist/desktop/splash/splash.d.ts +2 -0
  178. package/dist/desktop/splash/splash.d.ts.map +1 -0
  179. package/dist/desktop/splash/splash.js +8 -0
  180. package/dist/desktop/splash/splash.js.map +1 -0
  181. package/dist/desktop/splash/styles.css +24 -0
  182. package/dist/desktop/system-open.d.ts +16 -0
  183. package/dist/desktop/system-open.d.ts.map +1 -0
  184. package/dist/desktop/system-open.js +90 -0
  185. package/dist/desktop/system-open.js.map +1 -0
  186. package/dist/desktop/validation.d.ts.map +1 -1
  187. package/dist/desktop/validation.js +99 -21
  188. package/dist/desktop/validation.js.map +1 -1
  189. package/dist/desktop/window-security.d.ts +4 -0
  190. package/dist/desktop/window-security.d.ts.map +1 -0
  191. package/dist/desktop/window-security.js +26 -0
  192. package/dist/desktop/window-security.js.map +1 -0
  193. package/dist/documents/errors.d.ts +12 -0
  194. package/dist/documents/errors.d.ts.map +1 -0
  195. package/dist/documents/errors.js +12 -0
  196. package/dist/documents/errors.js.map +1 -0
  197. package/dist/documents/extract.d.ts +37 -0
  198. package/dist/documents/extract.d.ts.map +1 -0
  199. package/dist/documents/extract.js +90 -0
  200. package/dist/documents/extract.js.map +1 -0
  201. package/dist/documents/legacy-office.d.ts +23 -0
  202. package/dist/documents/legacy-office.d.ts.map +1 -0
  203. package/dist/documents/legacy-office.js +439 -0
  204. package/dist/documents/legacy-office.js.map +1 -0
  205. package/dist/documents/ole.d.ts +20 -0
  206. package/dist/documents/ole.d.ts.map +1 -0
  207. package/dist/documents/ole.js +189 -0
  208. package/dist/documents/ole.js.map +1 -0
  209. package/dist/documents/ooxml.d.ts +23 -0
  210. package/dist/documents/ooxml.d.ts.map +1 -0
  211. package/dist/documents/ooxml.js +197 -0
  212. package/dist/documents/ooxml.js.map +1 -0
  213. package/dist/documents/pdf.d.ts +20 -0
  214. package/dist/documents/pdf.d.ts.map +1 -0
  215. package/dist/documents/pdf.js +95 -0
  216. package/dist/documents/pdf.js.map +1 -0
  217. package/dist/documents/plain-text.d.ts +22 -0
  218. package/dist/documents/plain-text.d.ts.map +1 -0
  219. package/dist/documents/plain-text.js +57 -0
  220. package/dist/documents/plain-text.js.map +1 -0
  221. package/dist/documents/zip.d.ts +15 -0
  222. package/dist/documents/zip.d.ts.map +1 -0
  223. package/dist/documents/zip.js +137 -0
  224. package/dist/documents/zip.js.map +1 -0
  225. package/dist/domain/indexing.d.ts +60 -0
  226. package/dist/domain/indexing.d.ts.map +1 -0
  227. package/dist/domain/indexing.js +13 -0
  228. package/dist/domain/indexing.js.map +1 -0
  229. package/dist/domain/runtime.d.ts +133 -5
  230. package/dist/domain/runtime.d.ts.map +1 -1
  231. package/dist/gateway/local-gateway.d.ts +8 -0
  232. package/dist/gateway/local-gateway.d.ts.map +1 -1
  233. package/dist/gateway/local-gateway.js +105 -21
  234. package/dist/gateway/local-gateway.js.map +1 -1
  235. package/dist/indexing/index-service.d.ts +56 -0
  236. package/dist/indexing/index-service.d.ts.map +1 -0
  237. package/dist/indexing/index-service.js +262 -0
  238. package/dist/indexing/index-service.js.map +1 -0
  239. package/dist/kernel/loop.d.ts +10 -0
  240. package/dist/kernel/loop.d.ts.map +1 -1
  241. package/dist/kernel/loop.js +6 -2
  242. package/dist/kernel/loop.js.map +1 -1
  243. package/dist/kernel/reducer.d.ts.map +1 -1
  244. package/dist/kernel/reducer.js +17 -1
  245. package/dist/kernel/reducer.js.map +1 -1
  246. package/dist/kernel/state.d.ts +17 -4
  247. package/dist/kernel/state.d.ts.map +1 -1
  248. package/dist/kernel/state.js +2 -0
  249. package/dist/kernel/state.js.map +1 -1
  250. package/dist/pi/context-budget.d.ts +8 -0
  251. package/dist/pi/context-budget.d.ts.map +1 -0
  252. package/dist/pi/context-budget.js +62 -0
  253. package/dist/pi/context-budget.js.map +1 -0
  254. package/dist/pi/pi-runtime-adapter.d.ts +38 -3
  255. package/dist/pi/pi-runtime-adapter.d.ts.map +1 -1
  256. package/dist/pi/pi-runtime-adapter.js +551 -56
  257. package/dist/pi/pi-runtime-adapter.js.map +1 -1
  258. package/dist/plugins/bundled-skills.d.ts +56 -0
  259. package/dist/plugins/bundled-skills.d.ts.map +1 -0
  260. package/dist/plugins/bundled-skills.js +243 -0
  261. package/dist/plugins/bundled-skills.js.map +1 -0
  262. package/dist/plugins/extension-manager.d.ts +23 -1
  263. package/dist/plugins/extension-manager.d.ts.map +1 -1
  264. package/dist/plugins/extension-manager.js +117 -0
  265. package/dist/plugins/extension-manager.js.map +1 -1
  266. package/dist/plugins/types.d.ts +29 -0
  267. package/dist/plugins/types.d.ts.map +1 -1
  268. package/dist/plugins/workspace-skills.d.ts +36 -0
  269. package/dist/plugins/workspace-skills.d.ts.map +1 -0
  270. package/dist/plugins/workspace-skills.js +309 -0
  271. package/dist/plugins/workspace-skills.js.map +1 -0
  272. package/dist/policy/policy.d.ts.map +1 -1
  273. package/dist/policy/policy.js +22 -3
  274. package/dist/policy/policy.js.map +1 -1
  275. package/dist/protocol/client.d.ts +1 -0
  276. package/dist/protocol/client.d.ts.map +1 -1
  277. package/dist/protocol/client.js +49 -24
  278. package/dist/protocol/client.js.map +1 -1
  279. package/dist/protocol/limits.d.ts +69 -0
  280. package/dist/protocol/limits.d.ts.map +1 -0
  281. package/dist/protocol/limits.js +166 -0
  282. package/dist/protocol/limits.js.map +1 -0
  283. package/dist/protocol/schema.d.ts +6 -0
  284. package/dist/protocol/schema.d.ts.map +1 -1
  285. package/dist/protocol/schema.js.map +1 -1
  286. package/dist/protocol/server-frame-codec.d.ts +18 -0
  287. package/dist/protocol/server-frame-codec.d.ts.map +1 -0
  288. package/dist/protocol/server-frame-codec.js +211 -0
  289. package/dist/protocol/server-frame-codec.js.map +1 -0
  290. package/dist/service/legacy-daemon.d.ts +6 -0
  291. package/dist/service/legacy-daemon.d.ts.map +1 -0
  292. package/dist/service/legacy-daemon.js +42 -0
  293. package/dist/service/legacy-daemon.js.map +1 -0
  294. package/dist/service/service-launch.d.ts +10 -0
  295. package/dist/service/service-launch.d.ts.map +1 -0
  296. package/dist/service/service-launch.js +56 -0
  297. package/dist/service/service-launch.js.map +1 -0
  298. package/dist/service/system-service.d.ts +57 -0
  299. package/dist/service/system-service.d.ts.map +1 -0
  300. package/dist/service/system-service.js +263 -0
  301. package/dist/service/system-service.js.map +1 -0
  302. package/dist/sessions/session-catalog.d.ts +45 -0
  303. package/dist/sessions/session-catalog.d.ts.map +1 -0
  304. package/dist/sessions/session-catalog.js +270 -0
  305. package/dist/sessions/session-catalog.js.map +1 -0
  306. package/dist/sessions/session-file.d.ts +12 -0
  307. package/dist/sessions/session-file.d.ts.map +1 -0
  308. package/dist/sessions/session-file.js +47 -0
  309. package/dist/sessions/session-file.js.map +1 -0
  310. package/dist/settings/compaction-settings.d.ts +10 -0
  311. package/dist/settings/compaction-settings.d.ts.map +1 -0
  312. package/dist/settings/compaction-settings.js +8 -0
  313. package/dist/settings/compaction-settings.js.map +1 -0
  314. package/dist/settings/indexing-settings-service.d.ts +16 -0
  315. package/dist/settings/indexing-settings-service.d.ts.map +1 -0
  316. package/dist/settings/indexing-settings-service.js +57 -0
  317. package/dist/settings/indexing-settings-service.js.map +1 -0
  318. package/dist/settings/indexing-settings.d.ts +30 -0
  319. package/dist/settings/indexing-settings.d.ts.map +1 -0
  320. package/dist/settings/indexing-settings.js +58 -0
  321. package/dist/settings/indexing-settings.js.map +1 -0
  322. package/dist/settings/llm-settings-service.d.ts +6 -0
  323. package/dist/settings/llm-settings-service.d.ts.map +1 -1
  324. package/dist/settings/llm-settings-service.js +137 -12
  325. package/dist/settings/llm-settings-service.js.map +1 -1
  326. package/dist/settings/llm-settings.d.ts +68 -2
  327. package/dist/settings/llm-settings.d.ts.map +1 -1
  328. package/dist/settings/llm-settings.js +119 -17
  329. package/dist/settings/llm-settings.js.map +1 -1
  330. package/dist/settings/model-api.d.ts +10 -0
  331. package/dist/settings/model-api.d.ts.map +1 -0
  332. package/dist/settings/model-api.js +10 -0
  333. package/dist/settings/model-api.js.map +1 -0
  334. package/dist/storage/home.d.ts +1 -0
  335. package/dist/storage/home.d.ts.map +1 -1
  336. package/dist/storage/home.js +37 -2
  337. package/dist/storage/home.js.map +1 -1
  338. package/dist/tools/core-tools.d.ts +2 -0
  339. package/dist/tools/core-tools.d.ts.map +1 -1
  340. package/dist/tools/core-tools.js +91 -1
  341. package/dist/tools/core-tools.js.map +1 -1
  342. package/dist/ui/shared/activity.d.ts +2 -0
  343. package/dist/ui/shared/activity.d.ts.map +1 -1
  344. package/dist/ui/shared/activity.js +18 -4
  345. package/dist/ui/shared/activity.js.map +1 -1
  346. package/dist/ui/shared/full-message.d.ts +22 -0
  347. package/dist/ui/shared/full-message.d.ts.map +1 -0
  348. package/dist/ui/shared/full-message.js +40 -0
  349. package/dist/ui/shared/full-message.js.map +1 -0
  350. package/dist/ui/shared/local-links.d.ts +7 -0
  351. package/dist/ui/shared/local-links.d.ts.map +1 -0
  352. package/dist/ui/shared/local-links.js +24 -0
  353. package/dist/ui/shared/local-links.js.map +1 -0
  354. package/dist/ui/shared/markdown-stream.d.ts +25 -0
  355. package/dist/ui/shared/markdown-stream.d.ts.map +1 -0
  356. package/dist/ui/shared/markdown-stream.js +35 -0
  357. package/dist/ui/shared/markdown-stream.js.map +1 -0
  358. package/dist/ui/shared/markdown.d.ts +70 -0
  359. package/dist/ui/shared/markdown.d.ts.map +1 -0
  360. package/dist/ui/shared/markdown.js +434 -0
  361. package/dist/ui/shared/markdown.js.map +1 -0
  362. package/dist/ui/shared/presentation.d.ts +10 -2
  363. package/dist/ui/shared/presentation.d.ts.map +1 -1
  364. package/dist/ui/shared/presentation.js +83 -22
  365. package/dist/ui/shared/presentation.js.map +1 -1
  366. package/dist/ui/shared/protocol-state.d.ts +19 -0
  367. package/dist/ui/shared/protocol-state.d.ts.map +1 -1
  368. package/dist/ui/shared/protocol-state.js +188 -26
  369. package/dist/ui/shared/protocol-state.js.map +1 -1
  370. package/dist/ui/shared/virtual-list.d.ts +34 -0
  371. package/dist/ui/shared/virtual-list.d.ts.map +1 -0
  372. package/dist/ui/shared/virtual-list.js +143 -0
  373. package/dist/ui/shared/virtual-list.js.map +1 -0
  374. package/dist/ui/tui/commands.d.ts +1 -1
  375. package/dist/ui/tui/commands.d.ts.map +1 -1
  376. package/dist/ui/tui/commands.js +8 -3
  377. package/dist/ui/tui/commands.js.map +1 -1
  378. package/dist/ui/tui/store.d.ts +22 -1
  379. package/dist/ui/tui/store.d.ts.map +1 -1
  380. package/dist/ui/tui/store.js +50 -3
  381. package/dist/ui/tui/store.js.map +1 -1
  382. package/dist/ui/tui/tui-app.d.ts.map +1 -1
  383. package/dist/ui/tui/tui-app.js +231 -31
  384. package/dist/ui/tui/tui-app.js.map +1 -1
  385. package/dist/ui/tui/view.d.ts +7 -0
  386. package/dist/ui/tui/view.d.ts.map +1 -1
  387. package/dist/ui/tui/view.js +161 -57
  388. package/dist/ui/tui/view.js.map +1 -1
  389. package/dist/version.d.ts +1 -1
  390. package/dist/version.d.ts.map +1 -1
  391. package/dist/version.js +1 -1
  392. package/dist/version.js.map +1 -1
  393. package/package.json +13 -2
@@ -1,71 +1,93 @@
1
+ /*
2
+ * pSpore desktop — "Cobalt Paper" design system.
3
+ * Daylight (default): cool white canvas, cobalt accent, navy ink.
4
+ * Dark: deep desaturated slate-navy, one restrained blue accent,
5
+ * hairline separation instead of glow or gradients.
6
+ */
7
+
1
8
  :root {
2
- color-scheme: dark;
3
- --canvas: #0e110f;
4
- --canvas-glow: rgba(132, 181, 99, 0.08);
5
- --surface: #151815;
6
- --surface-raised: #1a1e1a;
7
- --surface-soft: #111411;
8
- --surface-input: #121512;
9
- --surface-hover: #202520;
10
- --surface-selected: #202a1e;
11
- --overlay: rgba(7, 9, 7, 0.72);
12
- --border: #303630;
13
- --border-soft: #252b26;
14
- --border-strong: #485149;
15
- --text: #f1f2ed;
16
- --text-soft: #d1d6ce;
17
- --muted: #9da69d;
18
- --faint: #747e75;
19
- --accent: #a9de7d;
20
- --accent-strong: #bbe993;
21
- --accent-ink: #15210f;
22
- --accent-soft: rgba(149, 211, 103, 0.12);
23
- --amber: #e6ba68;
24
- --amber-soft: rgba(230, 186, 104, 0.1);
25
- --red: #ed8b83;
26
- --red-soft: rgba(237, 139, 131, 0.1);
27
- --blue: #8abbd9;
28
- --shadow: 0 24px 70px rgba(0, 0, 0, 0.3);
29
- --shadow-soft: 0 10px 32px rgba(0, 0, 0, 0.18);
9
+ color-scheme: light;
10
+ --canvas: #f4f7fb;
11
+ --canvas-glow: rgba(37, 99, 235, 0.055);
12
+ --surface: #ffffff;
13
+ --surface-raised: #f6f9fd;
14
+ --surface-soft: #f3f7fc;
15
+ --surface-input: #fdfeff;
16
+ --surface-hover: #eef4fb;
17
+ --surface-selected: #e9f1fd;
18
+ --overlay: rgba(21, 33, 56, 0.36);
19
+ --border: #dbe4ef;
20
+ --border-soft: #e8eef6;
21
+ --border-strong: #b7c7dc;
22
+ --text: #16243d;
23
+ --text-soft: #2e405f;
24
+ --muted: #5c6d88;
25
+ --faint: #8695ac;
26
+ --accent: #2563eb;
27
+ --accent-strong: #1d4ed8;
28
+ --accent-ink: #ffffff;
29
+ --accent-soft: rgba(37, 99, 235, 0.09);
30
+ --live: #0e8a63;
31
+ --live-soft: rgba(14, 138, 99, 0.1);
32
+ --honey: #ad5700;
33
+ --honey-soft: rgba(173, 87, 0, 0.08);
34
+ --rust: #bf3944;
35
+ --rust-soft: rgba(191, 57, 68, 0.09);
36
+ --lichen: #2563eb;
37
+ --lichen-soft: rgba(37, 99, 235, 0.07);
38
+ --shadow: 0 24px 64px rgba(23, 42, 76, 0.16);
39
+ --shadow-drawer: 0 18px 48px -12px rgba(23, 42, 76, 0.28);
40
+ --shadow-soft: 0 1px 2px rgba(23, 42, 76, 0.04);
30
41
  --radius-lg: 16px;
31
- --radius-md: 11px;
32
- --radius-sm: 8px;
42
+ --radius-md: 10px;
43
+ --radius-sm: 7px;
33
44
  --motion-out: cubic-bezier(0.16, 1, 0.3, 1);
34
- --font-sans: "Noto Sans CJK SC", "Noto Sans SC", "Source Han Sans SC", sans-serif;
35
- --font-mono: "JetBrains Mono", "SFMono-Regular", Consolas, monospace;
45
+ --font-sans: "Noto Sans CJK SC", "Noto Sans SC", "Source Han Sans SC", system-ui, "Noto Color Emoji", "Segoe UI Emoji", "Apple Color Emoji", "Noto Sans Symbols 2", sans-serif;
46
+ --font-mono: "JetBrains Mono", "SFMono-Regular", "DejaVu Sans Mono", Consolas, "Noto Color Emoji", "Noto Sans Symbols 2", monospace;
47
+ --chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath d='M2.5 4.5 6 8l3.5-3.5' fill='none' stroke='%235c6d88' stroke-width='1.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
36
48
  font-family: var(--font-sans);
37
49
  font-synthesis: none;
38
50
  }
39
51
 
40
- :root[data-theme="light"] {
41
- color-scheme: light;
42
- --canvas: #eeece5;
43
- --canvas-glow: rgba(77, 120, 75, 0.08);
44
- --surface: #faf9f4;
45
- --surface-raised: #f3f2eb;
46
- --surface-soft: #f6f5ef;
47
- --surface-input: #f7f6f0;
48
- --surface-hover: #efeee6;
49
- --surface-selected: #e6eee0;
50
- --overlay: rgba(37, 40, 35, 0.38);
51
- --border: #d2d4cc;
52
- --border-soft: #e2e2db;
53
- --border-strong: #aeb4aa;
54
- --text: #20231f;
55
- --text-soft: #3a413a;
56
- --muted: #677067;
57
- --faint: #899088;
58
- --accent: #3f774d;
59
- --accent-strong: #326640;
60
- --accent-ink: #f7f8f3;
61
- --accent-soft: rgba(63, 119, 77, 0.1);
62
- --amber: #966b27;
63
- --amber-soft: rgba(150, 107, 39, 0.08);
64
- --red: #a54e47;
65
- --red-soft: rgba(165, 78, 71, 0.08);
66
- --blue: #426f8b;
67
- --shadow: 0 22px 64px rgba(47, 51, 44, 0.11);
68
- --shadow-soft: 0 9px 28px rgba(47, 51, 44, 0.08);
52
+ :root[data-theme="dark"] {
53
+ color-scheme: dark;
54
+ --canvas: #0b1119;
55
+ --canvas-glow: rgba(96, 145, 255, 0.05);
56
+ --surface: #101724;
57
+ --surface-raised: #16202f;
58
+ --surface-soft: #0d1420;
59
+ --surface-input: #0c121c;
60
+ --surface-hover: #182233;
61
+ --surface-selected: #13233c;
62
+ --overlay: rgba(2, 6, 12, 0.64);
63
+ --border: #223046;
64
+ --border-soft: #182435;
65
+ --border-strong: #384d70;
66
+ --text: #e6edf8;
67
+ --text-soft: #c5d1e3;
68
+ --muted: #8595ae;
69
+ --faint: #62728d;
70
+ --accent: #5f8dff;
71
+ --accent-strong: #82a8fa;
72
+ --accent-ink: #0a1120;
73
+ --accent-soft: rgba(95, 141, 255, 0.13);
74
+ --live: #3cba8d;
75
+ --live-soft: rgba(60, 186, 141, 0.11);
76
+ --honey: #d69c46;
77
+ --honey-soft: rgba(214, 156, 70, 0.1);
78
+ --rust: #e2686a;
79
+ --rust-soft: rgba(226, 104, 106, 0.11);
80
+ --lichen: #6f9eff;
81
+ --lichen-soft: rgba(111, 158, 255, 0.09);
82
+ --shadow: 0 24px 64px rgba(1, 4, 10, 0.55);
83
+ --shadow-drawer: 0 18px 48px -10px rgba(1, 4, 10, 0.7);
84
+ --shadow-soft: 0 1px 2px rgba(1, 4, 10, 0.35);
85
+ --chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath d='M2.5 4.5 6 8l3.5-3.5' fill='none' stroke='%238595ae' stroke-width='1.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
86
+ }
87
+
88
+ @media (prefers-contrast: more) {
89
+ :root,
90
+ :root[data-theme="dark"] { --muted: var(--text-soft); --faint: var(--text-soft); --border-soft: var(--border); }
69
91
  }
70
92
 
71
93
  * { box-sizing: border-box; }
@@ -75,14 +97,29 @@ html,
75
97
  body {
76
98
  width: 100%;
77
99
  height: 100%;
100
+ min-height: 100%;
78
101
  margin: 0;
79
102
  overflow: hidden;
80
103
  }
81
104
 
105
+ html {
106
+ height: 100%;
107
+ height: 100vh;
108
+ height: 100dvh;
109
+ }
110
+
111
+ body {
112
+ display: flex;
113
+ flex-direction: column;
114
+ min-height: 100%;
115
+ min-height: 100vh;
116
+ min-height: 100dvh;
117
+ }
118
+
82
119
  body {
83
120
  color: var(--text);
84
121
  background:
85
- radial-gradient(circle at 8% -20%, var(--canvas-glow), transparent 36rem),
122
+ radial-gradient(circle at 8% -16%, var(--canvas-glow), transparent 36rem),
86
123
  var(--canvas);
87
124
  font-size: 15px;
88
125
  -webkit-font-smoothing: antialiased;
@@ -99,19 +136,20 @@ input,
99
136
  select,
100
137
  button {
101
138
  transition:
102
- color 210ms var(--motion-out),
103
- background-color 210ms var(--motion-out),
104
- border-color 210ms var(--motion-out),
105
- box-shadow 210ms var(--motion-out);
139
+ color 200ms var(--motion-out),
140
+ background-color 200ms var(--motion-out),
141
+ border-color 200ms var(--motion-out),
142
+ box-shadow 200ms var(--motion-out);
106
143
  }
107
144
 
108
- ::selection { color: var(--accent-ink); background: var(--accent); }
145
+ ::selection { color: var(--text); background: color-mix(in srgb, var(--accent) 20%, transparent); }
109
146
  button,
110
147
  textarea,
111
148
  input,
112
149
  select { font: inherit; }
113
- button { color: inherit; touch-action: manipulation; }
114
- button:disabled { cursor: not-allowed; opacity: 0.45; }
150
+ button { color: inherit; touch-action: manipulation; -webkit-tap-highlight-color: transparent; }
151
+ button:disabled { cursor: not-allowed; opacity: 0.42; }
152
+ h1, h2, h3 { text-wrap: balance; }
115
153
 
116
154
  button:focus-visible,
117
155
  textarea:focus-visible,
@@ -119,8 +157,8 @@ input:focus-visible,
119
157
  select:focus-visible,
120
158
  [tabindex]:focus-visible,
121
159
  .skip-link:focus-visible {
122
- outline: 2px solid var(--accent);
123
- outline-offset: 3px;
160
+ outline: 2px solid color-mix(in srgb, var(--accent) 72%, transparent);
161
+ outline-offset: 2px;
124
162
  }
125
163
 
126
164
  .skip-link {
@@ -138,25 +176,32 @@ select:focus-visible,
138
176
  }
139
177
  .skip-link:focus { transform: translateY(0); }
140
178
 
179
+ /*
180
+ * Flex, not grid: the connection banner is `display: none` while connected, and a
181
+ * fixed three-row grid template kept its empty track's gap, leaving dead space
182
+ * under the workspace on first paint.
183
+ */
141
184
  .app-shell {
185
+ flex: 1 1 auto;
186
+ width: 100%;
187
+ min-height: 0;
142
188
  height: 100%;
143
- display: grid;
144
- grid-template-rows: 64px auto minmax(0, 1fr);
145
- gap: 8px;
146
- padding: 10px;
189
+ display: flex;
190
+ flex-direction: column;
191
+ gap: 10px;
192
+ padding: 10px 12px 10px;
147
193
  }
194
+ .app-shell > .topbar,
195
+ .app-shell > .connection-banner { flex: 0 0 auto; }
196
+ .app-shell > .workspace-grid { flex: 1 1 auto; }
148
197
 
198
+ /* The topbar floats on the canvas without its own card chrome. */
149
199
  .topbar {
150
200
  display: grid;
151
- grid-template-columns: minmax(260px, 1fr) auto minmax(420px, 1fr);
201
+ grid-template-columns: auto auto minmax(0, 1fr);
152
202
  align-items: center;
153
- gap: 20px;
154
- padding: 0 12px;
155
- border: 1px solid var(--border);
156
- border-radius: var(--radius-lg);
157
- background: color-mix(in srgb, var(--surface) 97%, transparent);
158
- box-shadow: var(--shadow-soft);
159
- animation: surface-enter 480ms var(--motion-out) both;
203
+ gap: 22px;
204
+ padding: 2px 6px 0;
160
205
  }
161
206
 
162
207
  .topbar-leading,
@@ -166,44 +211,49 @@ select:focus-visible,
166
211
  .session-health,
167
212
  .composer-actions,
168
213
  .settings-footer > div { display: flex; align-items: center; }
169
- .topbar-leading { gap: 12px; min-width: 0; }
170
- .topbar-actions { justify-self: end; gap: 7px; }
171
- .runtime-status { justify-self: center; gap: 12px; min-width: 0; }
214
+ .topbar-leading { gap: 13px; min-width: 0; }
215
+ .topbar-actions { justify-self: end; gap: 6px; }
216
+ .runtime-status { justify-self: start; gap: 12px; min-width: 0; }
172
217
  .brand-lockup { gap: 11px; min-width: 0; }
173
- .brand-lockup h1 { margin: 0; font-size: 21px; line-height: 1; font-weight: 760; letter-spacing: -0.045em; }
174
- .brand-lockup span:not(.brand-mark) { display: block; margin-top: 5px; color: var(--muted); font: 650 11.5px/1 var(--font-mono); letter-spacing: 0.12em; }
175
-
176
- .brand-mark { position: relative; width: 28px; height: 28px; display: block; flex: 0 0 auto; }
177
- .brand-mark i { position: absolute; display: block; width: 10px; height: 10px; border: 2px solid var(--accent); border-radius: 50%; }
178
- .brand-mark i:nth-child(1) { left: 0; top: 9px; }
179
- .brand-mark i:nth-child(2) { right: 0; top: 1px; }
180
- .brand-mark i:nth-child(3) { right: 0; bottom: 0; }
181
- .brand-mark::before,
182
- .brand-mark::after { content: ""; position: absolute; left: 8px; width: 12px; height: 1.5px; background: var(--accent); transform-origin: left; }
183
- .brand-mark::before { top: 13px; transform: rotate(-32deg); }
184
- .brand-mark::after { top: 15px; transform: rotate(32deg); }
218
+ .brand-lockup h1 { margin: 0; color: var(--text); font-size: 19px; line-height: 1; font-weight: 750; letter-spacing: -0.03em; }
219
+ .brand-lockup span:not(.brand-mark) { display: block; margin-top: 5px; color: var(--faint); font: 600 11px/1 var(--font-mono); letter-spacing: 0.16em; }
220
+
221
+ .brand-mark { width: 34px; height: 34px; display: block; flex: 0 0 auto; }
185
222
 
186
223
  .connection-badge {
187
224
  display: inline-flex;
188
225
  align-items: center;
189
- gap: 7px;
190
- padding: 7px 10px;
226
+ gap: 8px;
227
+ padding: 6px 11px;
191
228
  border: 1px solid var(--border);
192
229
  border-radius: 999px;
193
230
  color: var(--muted);
194
- font: 700 11.5px/1 var(--font-mono);
195
- letter-spacing: 0.06em;
231
+ background: var(--surface-raised);
232
+ font: 650 11.5px/1 var(--font-mono);
233
+ letter-spacing: 0.08em;
196
234
  }
197
- .connection-badge i { width: 7px; height: 7px; border-radius: 50%; background: var(--faint); }
198
- .connection-badge.connected { color: var(--accent); border-color: color-mix(in srgb, var(--accent) 42%, var(--border)); background: var(--accent-soft); }
199
- .connection-badge.connected i { background: var(--accent); box-shadow: 0 0 9px var(--accent); }
200
- .connection-badge.connecting { color: var(--amber); border-color: color-mix(in srgb, var(--amber) 42%, var(--border)); }
201
- .connection-badge.connecting i { background: var(--amber); }
235
+ .connection-badge i { position: relative; width: 6px; height: 6px; border-radius: 50%; background: var(--faint); }
236
+ .connection-badge.connected { color: var(--live); border-color: color-mix(in srgb, var(--live) 34%, var(--border)); background: var(--live-soft); }
237
+ .connection-badge.connected i { background: var(--live); }
238
+ .connection-badge.connected i::after {
239
+ content: "";
240
+ position: absolute;
241
+ inset: -3px;
242
+ border: 1px solid var(--live);
243
+ border-radius: 50%;
244
+ animation: spore-pulse 2.6s var(--motion-out) infinite;
245
+ }
246
+ .connection-badge.connecting { color: var(--honey); border-color: color-mix(in srgb, var(--honey) 38%, var(--border)); background: var(--honey-soft); }
247
+ .connection-badge.connecting i { background: var(--honey); }
248
+ /* A masked reconnect stays ONLINE; only the dot warms up so a long run never
249
+ strobes the badge between states. */
250
+ .connection-badge[data-reconnecting="true"] i { background: var(--honey); }
251
+ .connection-badge[data-reconnecting="true"] i::after { border-color: var(--honey); }
202
252
 
203
- .topbar-metrics { display: flex; align-items: stretch; margin-right: 3px; }
204
- .topbar-metrics > span { min-width: 70px; padding: 2px 11px; border-left: 1px solid var(--border-soft); }
253
+ .topbar-metrics { display: flex; align-items: stretch; gap: 18px; margin-right: 10px; }
254
+ .topbar-metrics > span { min-width: 58px; }
205
255
  .topbar-metrics small { display: block; color: var(--faint); font-size: 11.5px; line-height: 1; }
206
- .topbar-metrics b { display: block; margin-top: 6px; font: 650 13px/1 var(--font-mono); font-variant-numeric: tabular-nums; }
256
+ .topbar-metrics b { display: block; margin-top: 6px; color: var(--text-soft); font: 600 13px/1 var(--font-mono); font-variant-numeric: tabular-nums; }
207
257
 
208
258
  .icon-button,
209
259
  .quiet-icon-button,
@@ -212,8 +262,8 @@ select:focus-visible,
212
262
  .danger-ghost-button,
213
263
  .secondary-button,
214
264
  .primary-button {
215
- min-height: 36px;
216
- border: 1px solid var(--border);
265
+ min-height: 34px;
266
+ border: 1px solid transparent;
217
267
  border-radius: var(--radius-sm);
218
268
  cursor: pointer;
219
269
  transition:
@@ -224,86 +274,269 @@ select:focus-visible,
224
274
  box-shadow 160ms var(--motion-out);
225
275
  }
226
276
  .icon-button:hover,
277
+ .quiet-icon-button:hover,
278
+ .quiet-text-button:hover { color: var(--text); background: var(--surface-hover); }
227
279
  .ghost-button:hover,
228
280
  .secondary-button:hover { color: var(--text); border-color: var(--border-strong); background: var(--surface-hover); }
229
281
  .icon-button:active,
230
282
  .ghost-button:active,
231
283
  .secondary-button:active,
232
284
  .primary-button:active { transform: translateY(1px); }
233
- .icon-button { width: 36px; padding: 0; display: grid; place-items: center; background: var(--surface-raised); color: var(--muted); }
285
+ .icon-button { width: 34px; padding: 0; display: grid; place-items: center; background: transparent; color: var(--muted); }
234
286
  .icon-button svg,
235
- .wide-button svg { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
287
+ .wide-button svg { width: 17px; height: 17px; fill: none; stroke: currentColor; stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round; }
236
288
  .theme-icon.moon { display: none; }
237
- :root[data-theme="light"] .theme-icon.sun { display: none; }
238
- :root[data-theme="light"] .theme-icon.moon { display: block; }
239
- .quiet-icon-button { width: 34px; padding: 0; border-color: transparent; background: transparent; color: var(--muted); font-size: 24px; line-height: 1; }
240
- .quiet-icon-button:hover { color: var(--text); background: var(--surface-hover); }
241
- .quiet-text-button { min-height: 32px; padding: 0 10px; border-color: transparent; background: transparent; color: var(--accent); font-size: 12.5px; }
289
+ :root[data-theme="dark"] .theme-icon.sun { display: none; }
290
+ :root[data-theme="dark"] .theme-icon.moon { display: block; }
291
+ :root[data-theme="light"] .theme-icon.sun { display: block; }
292
+ .quiet-icon-button { width: 32px; padding: 0; background: transparent; color: var(--muted); font-size: 22px; line-height: 1; }
293
+ .quiet-text-button { min-height: 30px; padding: 0 11px; background: transparent; color: var(--text-soft); font: 600 12.5px/1 var(--font-mono); }
242
294
  .ghost-button,
243
295
  .danger-ghost-button { padding: 7px 12px; background: transparent; color: var(--muted); font-size: 13px; }
244
- .danger-ghost-button { border-color: color-mix(in srgb, var(--red) 35%, var(--border)); color: var(--red); }
245
- .danger-ghost-button:hover { border-color: var(--red); background: var(--red-soft); }
246
- .secondary-button { padding: 8px 13px; background: var(--surface-raised); color: var(--text); font-size: 13.5px; }
247
- .primary-button { padding: 9px 16px; color: var(--accent-ink); border-color: var(--accent); background: var(--accent); font-size: 13.5px; font-weight: 730; box-shadow: 0 7px 20px color-mix(in srgb, var(--accent) 12%, transparent); }
248
- .primary-button:hover { border-color: var(--accent-strong); background: var(--accent-strong); box-shadow: 0 9px 24px color-mix(in srgb, var(--accent) 18%, transparent); }
296
+ .danger-ghost-button { border-color: color-mix(in srgb, var(--rust) 30%, var(--border)); color: var(--rust); }
297
+ .danger-ghost-button:hover { border-color: var(--rust); background: var(--rust-soft); }
298
+ .secondary-button { padding: 8px 13px; border-color: var(--border); background: var(--surface-raised); color: var(--text); font-size: 13.5px; }
299
+ .primary-button {
300
+ padding: 9px 15px;
301
+ color: var(--accent-ink);
302
+ background: var(--accent);
303
+ font-size: 13.5px;
304
+ font-weight: 650;
305
+ box-shadow: 0 1px 2px color-mix(in srgb, var(--accent) 32%, transparent);
306
+ }
307
+ .primary-button:hover { background: var(--accent-strong); }
249
308
  .wide-button { width: 100%; display: flex; align-items: center; justify-content: center; gap: 8px; }
250
- kbd { margin-left: 8px; padding: 2px 5px; border-radius: 4px; color: color-mix(in srgb, var(--accent-ink) 76%, transparent); background: color-mix(in srgb, var(--accent-ink) 11%, transparent); font: 650 11.5px/1 var(--font-mono); }
309
+ kbd {
310
+ margin-left: 8px;
311
+ padding: 2px 6px;
312
+ border-radius: 4px;
313
+ color: color-mix(in srgb, var(--accent-ink) 78%, transparent);
314
+ background: color-mix(in srgb, var(--accent-ink) 14%, transparent);
315
+ font: 600 11px/1 var(--font-mono);
316
+ }
251
317
 
252
- .connection-banner { display: none; align-items: center; justify-content: center; gap: 9px; min-height: 38px; padding: 8px 13px; border: 1px solid color-mix(in srgb, var(--amber) 42%, var(--border)); border-radius: var(--radius-md); background: var(--amber-soft); color: var(--amber); font-size: 13.5px; }
318
+ .connection-banner { display: none; align-items: center; justify-content: center; gap: 9px; min-height: 36px; padding: 8px 13px; border: 1px solid color-mix(in srgb, var(--honey) 38%, var(--border)); border-radius: var(--radius-md); background: var(--honey-soft); color: var(--honey); font-size: 13.5px; }
253
319
  .connection-banner.visible { display: flex; }
254
- .spinner { width: 12px; height: 12px; border: 2px solid color-mix(in srgb, var(--amber) 22%, transparent); border-top-color: var(--amber); border-radius: 50%; animation: spin 900ms cubic-bezier(0.5, 0, 0.5, 1) infinite; }
320
+ .spinner { width: 12px; height: 12px; border: 2px solid color-mix(in srgb, var(--honey) 24%, transparent); border-top-color: var(--honey); border-radius: 50%; animation: spin 900ms cubic-bezier(0.5, 0, 0.5, 1) infinite; }
255
321
 
256
322
  .workspace-grid {
257
323
  position: relative;
258
324
  min-height: 0;
325
+ align-self: stretch;
259
326
  display: grid;
260
- grid-template-columns: clamp(228px, 14vw, 264px) minmax(520px, 1fr) clamp(320px, 20vw, 378px);
261
- gap: 8px;
327
+ grid-template-columns: clamp(232px, 14vw, 264px) minmax(520px, 1fr) clamp(320px, 20vw, 380px);
328
+ gap: 10px;
262
329
  }
263
- :root[data-navigation="closed"] .workspace-grid { grid-template-columns: minmax(520px, 1fr) clamp(320px, 20vw, 378px); }
264
- :root[data-inspector="closed"] .workspace-grid { grid-template-columns: clamp(228px, 14vw, 264px) minmax(520px, 1fr); }
330
+ :root[data-navigation="closed"] .workspace-grid { grid-template-columns: minmax(520px, 1fr) clamp(320px, 20vw, 380px); }
331
+ :root[data-inspector="closed"] .workspace-grid { grid-template-columns: clamp(232px, 14vw, 264px) minmax(520px, 1fr); }
265
332
  :root[data-navigation="closed"][data-inspector="closed"] .workspace-grid { grid-template-columns: minmax(0, 1fr); }
266
333
  :root[data-navigation="closed"] .left-rail,
267
334
  :root[data-inspector="closed"] .right-rail { display: none; }
268
335
 
269
- .panel { min-width: 0; min-height: 0; overflow: hidden; border: 1px solid var(--border); border-radius: var(--radius-lg); background: color-mix(in srgb, var(--surface) 98%, transparent); box-shadow: var(--shadow-soft); animation: surface-enter 520ms var(--motion-out) both; }
270
- .left-rail { display: flex; flex-direction: column; animation-delay: 40ms; }
271
- .conversation { animation-delay: 80ms; }
272
- .right-rail { animation-delay: 120ms; }
336
+ .panel { min-width: 0; min-height: 0; height: 100%; overflow: hidden; border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--surface); box-shadow: var(--shadow-soft); }
337
+ .left-rail { display: flex; flex-direction: column; }
338
+ .right-rail { display: grid; grid-template-rows: auto auto minmax(0, 1fr); }
273
339
 
274
340
  .panel-header,
275
- .inspector-header { padding: 20px; border-bottom: 1px solid var(--border-soft); }
276
- .navigation-header .section-heading { margin-bottom: 8px; }
341
+ .inspector-header { padding: 18px 18px 15px; border-bottom: 1px solid var(--border-soft); }
342
+ .navigation-header .section-heading { margin-bottom: 6px; }
277
343
  .panel-header p,
278
- .section-description { margin: 0; color: var(--muted); font-size: 12.5px; line-height: 1.55; }
344
+ .section-description { margin: 0; color: var(--muted); font-size: 12.5px; line-height: 1.6; }
279
345
  .section-description code { color: var(--text-soft); font: 12px var(--font-mono); }
280
- .section-heading { display: flex; align-items: center; justify-content: space-between; margin-bottom: 16px; }
346
+ .section-heading { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 14px; }
347
+ .section-heading-actions { display: flex; align-items: center; gap: 7px; }
281
348
  .section-heading h2,
282
- .inspector-header h2 { margin: 5px 0 0; font-size: 16px; line-height: 1.2; font-weight: 700; letter-spacing: -0.02em; }
283
- .eyebrow { color: var(--accent); font: 700 11.5px/1 var(--font-mono); letter-spacing: 0.1em; }
284
- .eyebrow.warning { color: var(--amber); }
285
- .count-pill { min-width: 27px; padding: 5px 7px; text-align: center; border: 1px solid var(--border); border-radius: 999px; color: var(--muted); font: 650 11.5px/1 var(--font-mono); font-variant-numeric: tabular-nums; }
349
+ .inspector-header h2 { margin: 6px 0 0; font-size: 16px; line-height: 1.2; font-weight: 700; letter-spacing: -0.015em; }
350
+ .eyebrow { color: var(--faint); font: 600 11.5px/1 var(--font-mono); letter-spacing: 0.15em; }
351
+ .eyebrow.warning { color: var(--honey); }
352
+ .count-pill { min-width: 26px; padding: 5px 7px; text-align: center; border: 1px solid var(--border-soft); border-radius: 999px; color: var(--muted); background: var(--surface-soft); font: 600 11.5px/1 var(--font-mono); font-variant-numeric: tabular-nums; }
286
353
  .muted { color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
287
354
 
288
- .sessions-section { min-height: 0; flex: 1 1 auto; overflow: auto; padding: 12px; }
289
- .session-list { display: flex; flex-direction: column; gap: 6px; }
290
- .session-item { width: 100%; min-height: 54px; display: grid; grid-template-columns: 9px minmax(0, 1fr) auto; align-items: center; gap: 10px; padding: 10px; text-align: left; border: 1px solid transparent; border-radius: var(--radius-md); background: transparent; cursor: pointer; }
355
+ .sessions-section { min-height: 0; flex: 1 1 auto; overflow: auto; padding: 10px; }
356
+ /* Run activity: what the agent is doing while it produces no text. Each phase
357
+ gets a different mark because they fail differently — a tool that never
358
+ returns, a model that never answers, and an approval nobody saw are three
359
+ different problems, and the reader has to be able to tell them apart. */
360
+ .run-activity {
361
+ display: flex;
362
+ align-items: center;
363
+ gap: 9px;
364
+ margin: 0 18px;
365
+ padding: 7px 12px;
366
+ border: 1px solid var(--border-soft);
367
+ border-radius: var(--radius-sm);
368
+ background: var(--surface-soft);
369
+ color: var(--muted);
370
+ font: 12.5px/1.4 var(--font-mono);
371
+ }
372
+ .run-activity-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
373
+ .run-activity-elapsed { margin-left: auto; flex: 0 0 auto; color: var(--faint); font-variant-numeric: tabular-nums; }
374
+ .run-activity-mark { flex: 0 0 auto; width: 12px; height: 12px; border-radius: 50%; }
375
+
376
+ /* Waiting on the model: a spinner, because the wait is one opaque request. */
377
+ .run-activity-mark[data-phase="waiting"] {
378
+ border: 2px solid color-mix(in srgb, var(--accent) 24%, transparent);
379
+ border-top-color: var(--accent);
380
+ animation: spin 900ms cubic-bezier(0.5, 0, 0.5, 1) infinite;
381
+ }
382
+ /* Thinking: a slow breath — output is coming, just not yet visible. */
383
+ .run-activity-mark[data-phase="thinking"] {
384
+ background: var(--accent);
385
+ animation: activity-breathe 1.8s var(--motion-out) infinite;
386
+ }
387
+ /* Streaming: a steady blink that matches text arriving. */
388
+ .run-activity-mark[data-phase="streaming"] {
389
+ background: var(--live);
390
+ animation: activity-blink 1s steps(2, end) infinite;
391
+ }
392
+ /* A tool is running: a travelling bar, because work is happening off-screen
393
+ and the reader should not read stillness as a hang. */
394
+ .run-activity[data-phase="tool"] .run-activity-mark {
395
+ width: 26px;
396
+ height: 4px;
397
+ border-radius: 2px;
398
+ background: color-mix(in srgb, var(--honey) 26%, transparent);
399
+ background-image: linear-gradient(90deg, transparent, var(--honey), transparent);
400
+ background-size: 60% 100%;
401
+ background-repeat: no-repeat;
402
+ animation: activity-travel 1.1s linear infinite;
403
+ }
404
+ /* Waiting on the reader: nothing will move until they act, so it insists. */
405
+ .run-activity[data-phase="approval"] { border-color: var(--honey); color: var(--honey); }
406
+ .run-activity[data-phase="approval"] .run-activity-mark {
407
+ background: var(--honey);
408
+ animation: activity-alert 1.1s var(--motion-out) infinite;
409
+ }
410
+
411
+ @keyframes activity-breathe { 0%, 100% { opacity: 0.35; transform: scale(0.8); } 50% { opacity: 1; transform: scale(1); } }
412
+ @keyframes activity-blink { 0% { opacity: 1; } 100% { opacity: 0.3; } }
413
+ @keyframes activity-travel { 0% { background-position: -60% 0; } 100% { background-position: 160% 0; } }
414
+ @keyframes activity-alert { 0%, 100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--honey) 60%, transparent); } 70% { box-shadow: 0 0 0 6px transparent; } }
415
+
416
+ @media (prefers-reduced-motion: reduce) {
417
+ .run-activity-mark { animation: none !important; }
418
+ /* Without motion the tinted track alone marks the bar as busy; the elapsed time carries the rest. */
419
+ .indexing-panel[data-progress="indeterminate"] .indexing-bar i { animation: none !important; background-image: none; }
420
+ }
421
+
422
+ /* The fixed tool list is long and every entry is one short identifier, so it
423
+ wraps as chips instead of turning the panel into a column of near-empty rows. */
424
+ .tool-chips { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 8px; }
425
+ .tool-chip {
426
+ padding: 3px 7px;
427
+ border: 1px solid var(--border-soft);
428
+ border-radius: 999px;
429
+ background: var(--surface-soft);
430
+ color: var(--muted);
431
+ font: 11.5px/1.35 var(--font-mono);
432
+ }
433
+
434
+ .session-list { display: flex; flex-direction: column; gap: 3px; }
435
+ .session-row { position: relative; }
436
+ /* The delete control sits over the row's trailing edge: a button cannot be
437
+ nested inside the session button, and reserving a column for it would shrink
438
+ the title on every row for a control that is only occasionally used. */
439
+ .session-delete {
440
+ position: absolute;
441
+ top: 50%;
442
+ right: 8px;
443
+ transform: translateY(-50%);
444
+ padding: 4px 7px;
445
+ border: 1px solid transparent;
446
+ border-radius: var(--radius-sm);
447
+ background: transparent;
448
+ color: var(--faint);
449
+ font: 600 11.5px/1 var(--font-mono);
450
+ cursor: pointer;
451
+ opacity: 0;
452
+ transition: opacity 150ms var(--motion-out), color 150ms var(--motion-out), background-color 150ms var(--motion-out);
453
+ }
454
+ .session-row:hover .session-delete,
455
+ .session-row:focus-within .session-delete,
456
+ .session-delete.armed { opacity: 1; }
457
+ .session-delete:hover { color: var(--rust); background: var(--surface-soft); }
458
+ .session-delete:focus-visible { opacity: 1; outline: 2px solid var(--accent); outline-offset: 1px; }
459
+ .session-delete:disabled { cursor: not-allowed; opacity: 0; }
460
+ .session-delete.armed {
461
+ border-color: var(--rust);
462
+ color: var(--rust);
463
+ background: var(--surface-soft);
464
+ letter-spacing: 0.04em;
465
+ }
466
+ /* The control overlays the trailing status mark, so the mark yields whenever
467
+ the control is showing rather than the two drawing on top of each other. */
468
+ .session-row:hover .session-status-mark,
469
+ .session-row:focus-within .session-status-mark,
470
+ .session-row.arming .session-status-mark { visibility: hidden; }
471
+ .session-item {
472
+ --indent: calc(11px + var(--session-depth, 0) * 16px);
473
+ position: relative;
474
+ width: 100%;
475
+ min-height: 52px;
476
+ display: grid;
477
+ grid-template-columns: 8px minmax(0, 1fr) auto;
478
+ align-items: center;
479
+ gap: 10px;
480
+ padding: 9px 10px 9px var(--indent);
481
+ text-align: left;
482
+ border: 0;
483
+ border-radius: var(--radius-md);
484
+ background: transparent;
485
+ cursor: pointer;
486
+ transition: background-color 150ms var(--motion-out), box-shadow 150ms var(--motion-out);
487
+ }
291
488
  .session-item:hover { background: var(--surface-hover); }
292
- .session-item.selected { border-color: color-mix(in srgb, var(--accent) 36%, var(--border)); background: var(--surface-selected); }
293
- .session-item .node-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--faint); }
294
- .session-item.running .node-dot { background: var(--accent); box-shadow: 0 0 8px color-mix(in srgb, var(--accent) 70%, transparent); }
295
- .session-item.failed .node-dot { background: var(--red); }
489
+ .session-item.selected { background: var(--surface-selected); box-shadow: inset 2.5px 0 0 var(--accent); }
490
+ .session-item[data-depth]:not([data-depth="0"])::before {
491
+ content: "";
492
+ position: absolute;
493
+ left: calc(var(--indent) - 13px);
494
+ top: -5px;
495
+ bottom: 50%;
496
+ width: 9px;
497
+ border-left: 1px solid var(--border-strong);
498
+ border-bottom: 1px solid var(--border-strong);
499
+ border-bottom-left-radius: 7px;
500
+ }
501
+ .session-item .node-dot { position: relative; width: 7px; height: 7px; border-radius: 50%; background: var(--faint); transition: background-color 150ms var(--motion-out); }
502
+ .session-item.running .node-dot { background: var(--live); }
503
+ .session-item.running .node-dot::after { content: ""; position: absolute; inset: -4px; border: 1px solid var(--live); border-radius: 50%; animation: spore-pulse 2.6s var(--motion-out) infinite; }
504
+ .session-item.failed .node-dot { background: var(--rust); }
296
505
  .session-item .session-copy { min-width: 0; }
297
506
  .session-item strong,
298
507
  .session-item small { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
299
- .session-item strong { font-size: 14px; font-weight: 690; }
300
- .session-item small { margin-top: 4px; color: var(--muted); font-size: 12px; }
301
- .session-item .depth-mark { color: var(--faint); font: 11.5px/1 var(--font-mono); }
508
+ .session-item strong {
509
+ display: flex;
510
+ align-items: baseline;
511
+ gap: 8px;
512
+ font: 600 13.5px/1.2 var(--font-mono);
513
+ letter-spacing: -0.01em;
514
+ }
515
+ /* Pushed to the trailing edge so the ids stay left-aligned and scannable. */
516
+ .session-item .session-time {
517
+ margin-left: auto;
518
+ flex: 0 0 auto;
519
+ color: var(--faint);
520
+ font: 400 11px/1.2 var(--font-mono);
521
+ font-variant-numeric: tabular-nums;
522
+ }
523
+ .session-item small { margin-top: 5px; color: var(--muted); font-size: 12px; }
524
+ .session-item .session-status-mark { color: var(--faint); font: 11px/1 var(--font-mono); letter-spacing: 0.06em; }
525
+ .session-item.running .session-status-mark { color: var(--live); }
526
+ .session-item.failed .session-status-mark { color: var(--rust); }
527
+
528
+ .rail-summary { flex: 0 0 auto; padding: 4px 14px 14px; }
529
+ .rail-summary .subsection-heading { margin: 0 0 9px; }
530
+ .rail-metrics { display: grid; gap: 7px; margin: 0; }
531
+ .rail-metrics > div { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; }
532
+ .rail-metrics dt { color: var(--muted); font-size: 12.5px; }
533
+ .rail-metrics dd { margin: 0; color: var(--text-soft); font: 600 12.5px/1 var(--font-mono); font-variant-numeric: tabular-nums; }
534
+ .rail-metrics dd.attention { color: var(--honey); }
302
535
 
303
536
  .navigation-actions { flex: 0 0 auto; display: flex; flex-direction: column; gap: 8px; padding: 12px; border-top: 1px solid var(--border-soft); }
304
- .inline-editor { padding: 13px; border: 1px solid var(--border); border-radius: var(--radius-md); background: var(--surface-soft); box-shadow: var(--shadow-soft); }
537
+ .inline-editor { padding: 12px; border: 1px solid var(--border); border-radius: var(--radius-md); background: var(--surface-soft); }
305
538
  .inline-editor-heading { display: flex; align-items: flex-start; justify-content: space-between; margin-bottom: 12px; }
306
- .inline-editor-heading h3 { margin: 5px 0 0; font-size: 14px; }
539
+ .inline-editor-heading h3 { margin: 6px 0 0; font-size: 14px; font-weight: 700; }
307
540
  .compact-form { display: flex; flex-direction: column; gap: 9px; }
308
541
  .compact-form label,
309
542
  .settings-form label > span:first-child { color: var(--muted); font-size: 12.5px; }
@@ -314,111 +547,347 @@ textarea,
314
547
  input { width: 100%; border-radius: var(--radius-sm); padding: 10px 11px; resize: none; font-size: 14px; line-height: 1.5; }
315
548
  textarea::placeholder,
316
549
  input::placeholder { color: var(--faint); }
317
- select { min-height: 40px; border-radius: var(--radius-sm); padding: 7px 34px 7px 10px; font-size: 13.5px; }
550
+ textarea:disabled,
551
+ input:disabled,
552
+ select:disabled { color: var(--faint); background-color: var(--surface-soft); border-color: var(--border-soft); cursor: not-allowed; }
553
+ select {
554
+ min-height: 38px;
555
+ border-radius: var(--radius-sm);
556
+ padding: 7px 32px 7px 11px;
557
+ font-size: 13.5px;
558
+ appearance: none;
559
+ background-image: var(--chevron);
560
+ background-repeat: no-repeat;
561
+ background-position: right 10px center;
562
+ background-size: 12px 12px;
563
+ }
318
564
  .inline-form > div { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 8px; }
319
565
  .child-controls { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
320
- .rail-footer { padding: 4px 3px 0; color: var(--faint); font: 11.5px/1.55 var(--font-mono); }
321
- .rail-footer span { display: block; }
322
-
323
- .conversation { display: grid; grid-template-rows: 76px minmax(0, 1fr) auto; overflow: hidden; }
324
- .conversation-header { display: flex; align-items: center; justify-content: space-between; gap: 20px; padding: 0 24px; border-bottom: 1px solid var(--border-soft); }
325
- .conversation-header h2 { max-width: min(70%, 780px); margin: 5px 0 0; overflow: hidden; color: var(--text); font-size: clamp(22px, 1.45vw, 28px); line-height: 1.08; font-weight: 740; letter-spacing: -0.04em; text-overflow: ellipsis; white-space: nowrap; }
326
- .session-health { justify-content: flex-end; gap: 11px; max-width: 45%; }
327
- .status-chip { padding: 6px 8px; border: 1px solid var(--border); border-radius: 7px; color: var(--muted); font: 700 11.5px/1 var(--font-mono); letter-spacing: 0.05em; }
328
- .status-chip.running { border-color: color-mix(in srgb, var(--accent) 40%, var(--border)); color: var(--accent); background: var(--accent-soft); }
329
- .status-chip.failed { border-color: color-mix(in srgb, var(--red) 40%, var(--border)); color: var(--red); background: var(--red-soft); }
330
-
331
- .transcript { min-height: 0; overflow: auto; padding: 34px clamp(28px, 5vw, 84px) 44px; scroll-behavior: smooth; scroll-padding-block: 24px; }
332
- .empty-transcript { min-height: 100%; display: grid; place-items: center; color: var(--muted); text-align: center; }
333
- .empty-transcript strong { display: block; margin-bottom: 8px; color: var(--text); font-size: 20px; font-weight: 690; letter-spacing: -0.025em; }
334
- .empty-transcript span { font-size: 14.5px; }
335
- .message { max-width: 980px; margin: 0 auto 32px; }
336
- .message-meta { display: flex; align-items: center; gap: 9px; margin-bottom: 11px; color: var(--muted); font: 650 11.5px/1 var(--font-mono); text-transform: uppercase; letter-spacing: 0.06em; }
337
- .message-meta .role-dot { width: 7px; height: 7px; border-radius: 2px; background: var(--faint); }
338
- .message.user .role-dot { background: var(--blue); }
566
+ .rail-footer { padding: 2px 3px 0; color: var(--faint); font: 11px/1.6 var(--font-mono); }
567
+ .rail-footer span { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
568
+
569
+ /* One shrinkable column. With the implicit `auto` track, the widest unbreakable
570
+ line inside — a session-switch notice is a full session id, an error notice a
571
+ whole message — set the conversation's minimum width, so beside the document
572
+ it stopped shrinking and was clipped under it instead. The inline-size
573
+ container lets the paddings below follow the column rather than the window. */
574
+ .conversation { display: grid; grid-template-columns: minmax(0, 1fr); grid-template-rows: auto minmax(0, 1fr) auto; overflow: hidden; container-type: inline-size; }
575
+ .conversation-header { display: flex; flex-direction: column; align-items: stretch; gap: 0; padding: 17px 24px 15px; border-bottom: 1px solid var(--border-soft); }
576
+ .conversation-heading { display: flex; align-items: center; justify-content: space-between; gap: 20px; min-width: 0; }
577
+ .conversation-heading > div:first-child { min-width: 0; }
578
+ .conversation-header h2 { max-width: min(70%, 780px); margin: 6px 0 0; overflow: hidden; color: var(--text); font: 600 clamp(21px, 1.3vw, 25px)/1.1 var(--font-mono); letter-spacing: -0.02em; text-overflow: ellipsis; white-space: nowrap; }
579
+ #session-search-button[aria-expanded="true"] { color: var(--accent); background: var(--accent-soft); }
580
+ .session-search { display: flex; align-items: center; gap: 8px; margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--border-soft); }
581
+ .session-search-field { flex: 1 1 auto; min-width: 0; display: flex; align-items: center; gap: 8px; height: 34px; padding: 0 10px; border: 1px solid var(--border); border-radius: var(--radius-sm); background: var(--surface-input); color: var(--faint); }
582
+ .session-search-field:focus-within { border-color: color-mix(in srgb, var(--accent) 55%, var(--border)); box-shadow: 0 0 0 3px var(--accent-soft); }
583
+ .session-search-field svg { width: 15px; height: 15px; flex: 0 0 auto; fill: none; stroke: currentColor; stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round; }
584
+ .session-search-field input { width: 100%; height: 100%; padding: 0; border: 0; border-radius: 0; background: transparent; color: var(--text); font-size: 14px; line-height: 1.4; }
585
+ .session-search-field input:focus-visible { outline: none; }
586
+ .session-search-count { flex: 0 0 auto; min-width: 4.6em; color: var(--faint); font: 12px/1 var(--font-mono); font-variant-numeric: tabular-nums; text-align: right; }
587
+ .session-search-nav { display: flex; align-items: center; gap: 2px; flex: 0 0 auto; }
588
+ .session-search-nav .icon-button { width: 28px; min-height: 28px; }
589
+ .session-search-nav .icon-button:disabled { opacity: 0.38; cursor: default; background: transparent; color: var(--faint); }
590
+ .session-search-nav .icon-button svg { width: 15px; height: 15px; }
591
+ .session-health { justify-content: flex-end; gap: 11px; max-width: 45%; min-width: 0; }
592
+ .session-health > * { flex: 0 0 auto; }
593
+ .session-health > #model-name { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
594
+ .status-chip { padding: 6px 10px; border: 1px solid var(--border); border-radius: 999px; color: var(--muted); background: var(--surface-soft); font: 650 11.5px/1 var(--font-mono); letter-spacing: 0.08em; }
595
+ .status-chip.running { border-color: color-mix(in srgb, var(--live) 38%, var(--border)); color: var(--live); background: var(--live-soft); }
596
+ .status-chip.failed { border-color: color-mix(in srgb, var(--rust) 38%, var(--border)); color: var(--rust); background: var(--rust-soft); }
597
+
598
+ .transcript { min-height: 0; overflow: auto; padding: 32px min(clamp(24px, 4vw, 72px), max(18px, 6cqi)) 36px; scroll-behavior: auto; scroll-padding-block: 24px; }
599
+ .virtual-spacer { width: 1px; min-height: 0; margin: 0 auto; pointer-events: none; }
600
+ .empty-transcript { min-height: 100%; display: grid; place-items: center; color: var(--muted); }
601
+ .empty-transcript > div { max-width: 520px; }
602
+ .empty-transcript strong { display: block; margin-bottom: 12px; color: var(--text); font-size: 24px; font-weight: 750; letter-spacing: -0.025em; }
603
+ .empty-transcript span { display: block; color: var(--muted); font-size: 14.5px; line-height: 1.65; }
604
+ .transcript-suggestions { display: flex; flex-direction: column; gap: 7px; margin-top: 22px; }
605
+ .transcript-suggestions button {
606
+ display: flex;
607
+ align-items: center;
608
+ gap: 10px;
609
+ padding: 12px 14px;
610
+ text-align: left;
611
+ border: 1px solid var(--border-soft);
612
+ border-radius: var(--radius-md);
613
+ background: var(--surface);
614
+ color: var(--text-soft);
615
+ cursor: pointer;
616
+ font-size: 13.5px;
617
+ line-height: 1.45;
618
+ transition: color 150ms var(--motion-out), border-color 150ms var(--motion-out), background-color 150ms var(--motion-out), transform 150ms var(--motion-out);
619
+ }
620
+ .transcript-suggestions button::before { content: "›"; color: var(--accent); font: 600 15px/1 var(--font-mono); }
621
+ .transcript-suggestions button:hover { color: var(--text); border-color: var(--border-strong); transform: translateY(-1px); box-shadow: var(--shadow-soft); }
622
+
623
+ .message { max-width: 800px; margin: 0 auto 28px; }
624
+ .message-meta { display: flex; align-items: center; gap: 9px; margin-bottom: 10px; color: var(--faint); font: 600 11px/1 var(--font-mono); text-transform: uppercase; letter-spacing: 0.13em; }
625
+ .message-meta::after { content: ""; flex: 1 1 auto; height: 1px; background: var(--border-soft); }
626
+ .message-meta .role-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--faint); }
627
+ .message.user .role-dot { background: var(--lichen); }
339
628
  .message.assistant .role-dot,
340
629
  .message.streaming .role-dot { background: var(--accent); }
341
- .message.tool .role-dot { background: var(--amber); }
342
- .message-body { color: var(--text-soft); font-size: 15.5px; line-height: 1.72; overflow-wrap: anywhere; white-space: pre-wrap; }
343
- .message.user .message-body { padding: 14px 16px; border: 1px solid color-mix(in srgb, var(--blue) 24%, var(--border)); border-radius: var(--radius-md); background: color-mix(in srgb, var(--blue) 5%, var(--surface-soft)); }
630
+ .message.tool .role-dot { background: var(--honey); }
631
+ .message-body { color: var(--text-soft); font-size: 15.5px; line-height: 1.78; overflow-wrap: anywhere; white-space: pre-wrap; }
632
+ .message.user .message-body {
633
+ padding: 13px 15px;
634
+ border-left: 2px solid color-mix(in srgb, var(--lichen) 48%, transparent);
635
+ border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
636
+ background: var(--lichen-soft);
637
+ }
344
638
  .message pre,
345
639
  .activity-detail,
346
- .approval-command { max-width: 100%; overflow: auto; padding: 14px; border: 1px solid var(--border); border-radius: var(--radius-sm); background: var(--surface-soft); color: var(--text-soft); font: 12.5px/1.65 var(--font-mono); white-space: pre; tab-size: 2; }
347
- .message details { border: 1px solid var(--border); border-radius: var(--radius-md); background: var(--surface-soft); }
348
- .message details summary { padding: 12px 14px; cursor: pointer; color: var(--amber); font-size: 13px; }
640
+ .approval-command { max-width: 100%; overflow: auto; padding: 13px 15px; border: 1px solid var(--border-soft); border-radius: var(--radius-sm); background: var(--surface-soft); color: var(--text-soft); font: 13px/1.7 var(--font-mono); white-space: pre; tab-size: 2; }
641
+ .message-body > pre { margin: 14px 0; }
642
+
643
+ /* Markdown blocks: prose keeps `pre-wrap` only for messages that render as plain text. */
644
+ .message-body.markdown { white-space: normal; }
645
+ .message-body.markdown > :first-child { margin-top: 0; }
646
+ .message-body.markdown > :last-child { margin-bottom: 0; }
647
+ .md-p { margin: 0 0 12px; }
648
+ .md-h { margin: 22px 0 10px; color: var(--text); font-family: var(--font-sans); font-weight: 700; letter-spacing: -0.02em; line-height: 1.35; }
649
+ .md-h1 { font-size: 21px; }
650
+ .md-h2 { font-size: 19px; }
651
+ .md-h3 { font-size: 17px; }
652
+ .md-h4,
653
+ .md-h5,
654
+ .md-h6 { font-size: 15.5px; }
655
+ .md-h5,
656
+ .md-h6 { color: var(--muted); }
657
+ .md-h1,
658
+ .md-h2 { padding-bottom: 7px; border-bottom: 1px solid var(--border-soft); }
659
+ .md-rule { height: 0; margin: 20px 0; border: 0; border-top: 1px solid var(--border); }
660
+
661
+ .md-list { margin: 0 0 12px; padding-left: 22px; }
662
+ .md-list li { margin: 5px 0; }
663
+ .md-list li::marker { color: var(--faint); font-variant-numeric: tabular-nums; }
664
+ .md-list .md-list { margin: 5px 0 0; }
665
+ .md-list li.md-task { list-style: none; margin-left: -22px; padding-left: 0; display: flex; align-items: flex-start; gap: 9px; }
666
+ .md-check { flex: 0 0 auto; width: 15px; height: 15px; margin-top: 4px; display: inline-flex; align-items: center; justify-content: center; border: 1px solid var(--border-strong); border-radius: 4px; color: var(--live); background: var(--surface-input); font: 700 11px/1 var(--font-mono); }
667
+ .md-check.checked { border-color: color-mix(in srgb, var(--live) 55%, var(--border)); background: var(--live-soft); }
668
+
669
+ .md-quote { margin: 0 0 14px; padding: 3px 0 3px 15px; border-left: 2px solid var(--border-strong); color: var(--muted); }
670
+ .md-quote > :last-child { margin-bottom: 0; }
671
+
672
+ .md-code { margin: 14px 0; border: 1px solid var(--border-soft); border-radius: var(--radius-sm); background: var(--surface-soft); overflow: hidden; }
673
+ .md-code-bar { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 7px 11px 7px 14px; border-bottom: 1px solid var(--border-soft); }
674
+ .md-code-lang { color: var(--faint); font: 600 11.5px/1 var(--font-mono); letter-spacing: 0.1em; text-transform: uppercase; }
675
+ .md-copy { min-height: 24px; padding: 0 9px; border: 1px solid transparent; border-radius: var(--radius-sm); color: var(--muted); background: transparent; cursor: pointer; font: 600 11.5px/1 var(--font-mono); }
676
+ .md-copy:hover { color: var(--text); border-color: var(--border); background: var(--surface-hover); }
677
+ .md-code pre { margin: 0; border: 0; border-radius: 0; background: transparent; }
678
+ .md-code.streaming .md-code-lang::after { content: " ·"; color: var(--accent); }
679
+ .md-copy-carrier { position: fixed; top: -1000px; left: -1000px; width: 1px; height: 1px; opacity: 0; }
680
+
681
+ .md-table-wrap { max-width: 100%; margin: 14px 0; overflow-x: auto; border: 1px solid var(--border-soft); border-radius: var(--radius-sm); }
682
+ .md-table { width: 100%; border-collapse: collapse; font-size: 14px; }
683
+ .md-table th,
684
+ .md-table td { padding: 9px 13px; border-bottom: 1px solid var(--border-soft); text-align: left; vertical-align: top; }
685
+ .md-table th { color: var(--text); background: var(--surface-raised); font: 650 12.5px/1.5 var(--font-mono); letter-spacing: 0.04em; white-space: nowrap; }
686
+ .md-table tbody tr:last-child td { border-bottom: 0; }
687
+ .md-table tbody tr:hover td { background: var(--surface-hover); }
688
+ .md-align-left { text-align: left; }
689
+ .md-align-center { text-align: center; }
690
+ .md-align-right { text-align: right; font-variant-numeric: tabular-nums; }
691
+
692
+ .md-code-span { padding: 2px 5px; border: 1px solid var(--border-soft); border-radius: 4px; color: var(--text); background: var(--surface-soft); font: 0.88em/1.4 var(--font-mono); overflow-wrap: anywhere; }
693
+ .message-body strong { color: var(--text); font-weight: 700; }
694
+ .message-body em { font-style: italic; }
695
+ .message-body s { color: var(--faint); }
696
+ .md-link { color: var(--accent); text-decoration: underline; text-decoration-color: color-mix(in srgb, var(--accent) 40%, transparent); text-underline-offset: 3px; }
697
+ .md-local-link { display: inline; padding: 0; border: 0; background: none; font: inherit; cursor: pointer; overflow-wrap: anywhere; }
698
+ .md-local-link.md-code-span { padding: 2px 5px; border: 1px solid var(--border-soft); background: var(--surface-soft); font: 0.88em/1.4 var(--font-mono); }
699
+ .md-local-link:hover { text-decoration-color: currentColor; }
700
+ .md-local-link:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 2px; }
701
+ .md-local-link:disabled { cursor: wait; opacity: 0.7; }
702
+ .md-local-reveal {
703
+ display: inline-flex;
704
+ align-items: center;
705
+ justify-content: center;
706
+ width: 1.15em;
707
+ height: 1.15em;
708
+ margin: 0 1px 0 3px;
709
+ padding: 0;
710
+ border: 0;
711
+ border-radius: 4px;
712
+ vertical-align: -0.18em;
713
+ color: var(--accent);
714
+ background: var(--accent-soft);
715
+ cursor: pointer;
716
+ }
717
+ .md-local-reveal svg { width: 0.82em; height: 0.82em; fill: none; stroke: currentColor; stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round; }
718
+ .md-local-reveal:hover { color: var(--accent-strong); background: color-mix(in srgb, var(--accent) 16%, transparent); }
719
+ .md-local-reveal:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
720
+ .md-local-reveal:disabled { cursor: wait; opacity: 0.55; }
721
+ .md-link-error { margin-left: 5px; color: var(--rust); font-size: 0.85em; }
722
+ .local-link-menu { position: fixed; z-index: 40; min-width: 188px; display: flex; flex-direction: column; gap: 2px; padding: 4px; border: 1px solid var(--border); border-radius: var(--radius-md); background: var(--surface); box-shadow: var(--shadow-drawer); }
723
+ .local-link-menu-item { width: 100%; padding: 8px 10px; border: 0; border-radius: var(--radius-sm); background: transparent; color: var(--text); cursor: pointer; font: 13.5px/1.3 var(--font-sans); text-align: left; }
724
+ .local-link-menu-item:hover,
725
+ .local-link-menu-item:focus-visible { background: var(--surface-hover); outline: none; }
726
+ mark.session-find-hit { padding: 0 0.05em; border-radius: 3px; color: inherit; background: color-mix(in srgb, var(--honey) 34%, transparent); }
727
+ mark.session-find-hit.current { background: color-mix(in srgb, var(--accent) 36%, transparent); box-shadow: inset 0 -1.5px 0 var(--accent); }
728
+ .md-link-url { margin-left: 5px; color: var(--faint); font: 0.82em/1.4 var(--font-mono); overflow-wrap: anywhere; }
729
+ .md-link-url::before { content: "("; }
730
+ .md-link-url::after { content: ")"; }
731
+ .message details { border: 1px solid var(--border-soft); border-radius: var(--radius-md); background: var(--surface-soft); }
732
+ .message details summary { padding: 11px 14px; cursor: pointer; color: var(--muted); font: 12.5px/1 var(--font-mono); }
733
+ .message details summary:hover { color: var(--text-soft); }
349
734
  .message details pre { margin: 0; border-width: 1px 0 0; border-radius: 0 0 var(--radius-md) var(--radius-md); max-height: 360px; }
350
- .stream-cursor { display: inline-block; width: 7px; height: 16px; margin-left: 4px; vertical-align: -2px; background: var(--accent); animation: blink 1s step-end infinite; }
351
-
352
- .composer-wrap { position: relative; padding: 0 20px 18px; background: linear-gradient(180deg, transparent, var(--surface) 18%); }
353
- .notice-line { height: 28px; padding: 6px 3px 0; color: var(--muted); font-size: 12px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
354
- .composer { border: 1px solid var(--border-strong); border-radius: 14px; background: var(--surface-input); box-shadow: var(--shadow-soft); }
355
- .composer:focus-within { border-color: color-mix(in srgb, var(--accent) 58%, var(--border)); box-shadow: 0 0 0 2px var(--accent-soft), var(--shadow-soft); }
356
- .composer textarea { min-height: 66px; max-height: 180px; border: 0; border-radius: 14px 14px 0 0; background: transparent; padding: 13px 15px; font-size: 15px; line-height: 1.55; }
357
- .composer textarea:focus-visible { outline-offset: -3px; }
735
+ /* Offered on a message the daemon had to cut at its publishing ceiling. */
736
+ .message-truncated { display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; margin-top: 12px; padding: 9px 12px; border: 1px dashed var(--border-soft); border-radius: var(--radius-sm); background: var(--surface-soft); }
737
+ .message-truncated span { color: var(--faint); font: 12px/1.5 var(--font-mono); }
738
+ .message-truncated button { padding: 5px 12px; font-size: 12.5px; }
739
+ .thinking-stream { margin: 0 0 12px; border: 1px solid color-mix(in srgb, var(--accent) 24%, var(--border-soft)); border-radius: var(--radius-sm); background: color-mix(in srgb, var(--surface-soft) 88%, var(--accent-soft)); overflow: hidden; }
740
+ .thinking-stream > header { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 8px 11px; border-bottom: 1px solid var(--border-soft); }
741
+ .thinking-stream > header strong { color: var(--muted); font: 650 11.5px/1 var(--font-mono); letter-spacing: 0.08em; }
742
+ .thinking-stream > header span { color: var(--faint); font: 11px/1 var(--font-mono); }
743
+ .thinking-stream-body { max-height: 180px; padding: 10px 12px; overflow: auto; color: var(--muted); font: 12.5px/1.65 var(--font-mono); white-space: pre-wrap; overflow-wrap: anywhere; }
744
+ .process-message { min-width: 0; }
745
+ .message .process-details { background: transparent; }
746
+ .message .process-summary { line-height: 1.6; overflow-wrap: anywhere; }
747
+ .process-message[data-active="true"] > .process-details { border-color: var(--border-strong); }
748
+ .process-body { min-width: 0; padding: 8px 14px 14px; border-top: 1px solid var(--border-soft); }
749
+ .process-body > .message { margin: 12px 0; }
750
+ .process-body .message-meta { font-size: 11.5px; }
751
+ .settled-thinking { margin: 0; }
752
+ .tool-call { min-width: 0; margin-top: 10px; }
753
+ .message .tool-call-summary { display: flex; align-items: baseline; gap: 10px; line-height: 1.5; }
754
+ .tool-call-summary::before { content: "›"; flex: 0 0 auto; }
755
+ .tool-call > details[open] > .tool-call-summary::before { content: "⌄"; }
756
+ .tool-call-summary::-webkit-details-marker { display: none; }
757
+ .tool-call-name { flex: 0 1 auto; color: var(--text-soft); overflow-wrap: anywhere; }
758
+ .tool-call-target { min-width: 0; flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
759
+ .tool-call-status { flex: 0 0 auto; color: var(--muted); font-size: 11.5px; }
760
+ .tool-call-status.error { color: var(--rust); }
761
+ .tool-section-label { padding: 10px 14px 6px; color: var(--muted); font-size: 11.5px; border-top: 1px solid var(--border-soft); }
762
+ .message .tool-call pre { border: 0; border-radius: 0; max-height: 280px; white-space: pre-wrap; overflow-wrap: anywhere; }
763
+ .stream-cursor { display: inline-block; width: 7px; height: 15px; margin-left: 4px; vertical-align: -2px; background: var(--accent); animation: blink 1s step-end infinite; }
764
+
765
+ .composer-wrap { position: relative; min-width: 0; padding: 0 20px 16px; background: linear-gradient(180deg, transparent, var(--surface) 18%); }
766
+ .notice-line { height: 26px; padding: 5px 3px 0; color: var(--muted); font-size: 12px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
767
+ .message-queue { display: flex; flex-direction: column; gap: 6px; max-height: 142px; margin: 0 0 8px; overflow: auto; }
768
+ .queue-message { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: 9px; padding: 7px 8px 7px 10px; border: 1px solid var(--border-soft); border-radius: var(--radius-sm); background: var(--surface-soft); }
769
+ .queue-message.direct { grid-template-columns: auto minmax(0, 1fr); border-color: color-mix(in srgb, var(--honey) 42%, var(--border-soft)); }
770
+ .queue-message > span { color: var(--honey); font: 600 11px/1 var(--font-mono); white-space: nowrap; }
771
+ .queue-message > p { min-width: 0; margin: 0; color: var(--text-soft); font-size: 12.5px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
772
+ .queue-message > button { min-height: 28px; padding: 4px 8px; font-size: 11.5px; }
773
+ .composer { position: relative; border: 1px solid var(--border); border-radius: var(--radius-md); background: var(--surface-input); box-shadow: var(--shadow-soft); }
774
+ .composer:focus-within { border-color: color-mix(in srgb, var(--accent) 55%, var(--border)); box-shadow: 0 0 0 3px var(--accent-soft); }
775
+ .composer[data-drop-active="true"] { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft); }
776
+ .composer-drop-overlay { position: absolute; inset: -1px; z-index: 4; display: grid; place-content: center; gap: 7px; padding: 18px; text-align: center; border: 1px dashed var(--accent); border-radius: var(--radius-md); color: var(--accent); background: color-mix(in srgb, var(--surface-input) 94%, var(--accent-soft)); pointer-events: none; }
777
+ .composer-drop-overlay strong { font-size: 15px; font-weight: 700; }
778
+ .composer-drop-overlay span { color: var(--muted); font-size: 12.5px; }
779
+ .composer textarea { min-height: 62px; max-height: 180px; border: 0; border-radius: var(--radius-md) var(--radius-md) 0 0; background: transparent; padding: 13px 15px; font-size: 15px; line-height: 1.6; }
780
+ .composer textarea:focus-visible { outline: 0; }
781
+ .composer-references { display: flex; flex-wrap: wrap; gap: 6px; max-height: 88px; padding: 0 10px 10px; overflow: auto; }
782
+ .composer-reference { min-width: 0; max-width: min(100%, 440px); display: flex; align-items: center; gap: 7px; padding: 5px 6px 5px 8px; border: 1px solid color-mix(in srgb, var(--accent) 24%, var(--border)); border-radius: 999px; color: var(--text-soft); background: var(--accent-soft); }
783
+ .composer-reference-kind { flex: 0 0 auto; color: var(--accent); font: 650 10.5px/1 var(--font-mono); letter-spacing: 0.04em; }
784
+ .composer-reference-path { min-width: 0; overflow: hidden; font: 11.5px/1.35 var(--font-mono); text-overflow: ellipsis; white-space: nowrap; }
785
+ .composer-reference-remove { width: 22px; min-height: 22px; flex: 0 0 auto; padding: 0; border: 0; border-radius: 50%; color: var(--muted); background: transparent; cursor: pointer; font: 16px/1 var(--font-sans); }
786
+ .composer-reference-remove:hover { color: var(--rust); background: var(--rust-soft); }
358
787
  .composer-toolbar { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 8px; border-top: 1px solid var(--border-soft); }
359
- .mode-select { display: flex; align-items: center; gap: 8px; color: var(--muted); font-size: 12px; }
360
- .mode-select select { min-height: 34px; padding-block: 5px; font-size: 13px; }
788
+ /* The hint gives way; the controls do not. Wrapping a button label reads as a
789
+ broken layout, and there are enough of them now for a narrow conversation to
790
+ force it. */
791
+ .send-behavior-hint { flex: 0 1 auto; min-width: 0; padding-left: 5px; overflow: hidden; color: var(--faint); font-size: 11.5px; text-overflow: ellipsis; white-space: nowrap; }
792
+ .composer-actions { flex: 0 0 auto; }
793
+ .composer-actions > button { white-space: nowrap; }
361
794
  .composer-actions { gap: 7px; }
362
795
 
363
- .right-rail { display: grid; grid-template-rows: auto auto minmax(0, 1fr); }
364
- .inspector-header { display: flex; align-items: center; justify-content: space-between; padding: 18px 20px 15px; }
365
- .inspector-tabs { display: grid; grid-template-columns: repeat(4, 1fr); padding: 8px 10px; border-bottom: 1px solid var(--border-soft); }
366
- .inspector-tab { min-height: 38px; padding: 0 4px; border: 0; border-radius: 7px; color: var(--muted); background: transparent; cursor: pointer; font-size: 12.5px; }
796
+ .inspector-header { display: flex; align-items: center; justify-content: space-between; padding: 17px 18px 14px; }
797
+ .inspector-tabs { display: grid; grid-template-columns: repeat(4, 1fr); gap: 2px; padding: 8px 10px; border-bottom: 1px solid var(--border-soft); }
798
+ .inspector-tab { min-height: 34px; padding: 0 4px; border: 1px solid transparent; border-radius: var(--radius-sm); color: var(--muted); background: transparent; cursor: pointer; font-size: 12.5px; transition: color 150ms var(--motion-out), background-color 150ms var(--motion-out), border-color 150ms var(--motion-out); }
367
799
  .inspector-tab:hover { color: var(--text); background: var(--surface-hover); }
368
- .inspector-tab.selected { color: var(--text); background: var(--surface-raised); box-shadow: inset 0 0 0 1px var(--border); }
800
+ .inspector-tab.selected { color: var(--text); border-color: var(--border); background: var(--surface-raised); box-shadow: var(--shadow-soft); }
369
801
  .inspector-content { min-height: 0; overflow: auto; }
370
- .inspector-view { padding: 20px; }
371
- .subsection-heading { display: flex; align-items: center; gap: 10px; margin: 22px 0 10px; color: var(--muted); font-size: 12px; }
802
+ .inspector-view { padding: 18px; }
803
+ .subsection-heading { display: flex; align-items: center; gap: 10px; margin: 20px 0 10px; color: var(--faint); font: 600 11.5px/1 var(--font-mono); text-transform: uppercase; letter-spacing: 0.13em; }
372
804
  .subsection-heading::after { content: ""; height: 1px; flex: 1; background: var(--border-soft); }
373
- .section-description { margin: -4px 0 16px; }
805
+ .section-description { margin: -2px 0 14px; }
374
806
 
375
807
  .activity-list,
376
- .dense-list { display: flex; flex-direction: column; gap: 9px; }
808
+ .dense-list { display: flex; flex-direction: column; gap: 7px; }
377
809
  .activity-card,
378
810
  .dense-item { padding: 11px 12px; border: 1px solid var(--border-soft); border-radius: var(--radius-md); background: var(--surface-soft); min-width: 0; }
811
+ .activity-card[data-status="running"] { border-color: color-mix(in srgb, var(--live) 26%, var(--border-soft)); }
812
+ .activity-card[data-status="failed"] { border-color: color-mix(in srgb, var(--rust) 26%, var(--border-soft)); }
379
813
  .activity-card header,
380
814
  .dense-item header { display: flex; align-items: center; justify-content: space-between; gap: 9px; }
381
815
  .activity-card b,
382
- .dense-item b { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13.5px; font-weight: 670; }
816
+ .dense-item b { min-width: 0; display: flex; align-items: center; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13px; font-weight: 650; }
383
817
  .activity-card time,
384
818
  .dense-item small { color: var(--faint); font: 11.5px/1 var(--font-mono); white-space: nowrap; font-variant-numeric: tabular-nums; }
385
819
  .activity-card p,
386
- .dense-item p { margin: 7px 0 0; color: var(--muted); font-size: 12.5px; line-height: 1.5; overflow-wrap: anywhere; }
387
- .activity-card details { margin-top: 8px; }
388
- .activity-card summary { color: var(--muted); cursor: pointer; font-size: 12px; }
389
- .activity-detail { max-height: 230px; margin: 8px 0 0; font-size: 11.5px; }
820
+ .dense-item p { margin: 7px 0 0; color: var(--muted); font-size: 12.5px; line-height: 1.55; overflow-wrap: anywhere; }
821
+ .activity-card details { margin-top: 9px; }
822
+ .activity-card summary { color: var(--faint); cursor: pointer; font: 11.5px/1 var(--font-mono); }
823
+ .activity-card summary:hover { color: var(--muted); }
824
+ .activity-detail { max-height: 230px; margin: 9px 0 0; font-size: 11.5px; }
390
825
  .dense-item .item-actions { display: flex; gap: 7px; margin-top: 10px; }
391
- .dense-item .item-actions button { flex: 1; min-height: 34px; padding: 5px 8px; }
392
- .state-dot { display: inline-block; width: 6px; height: 6px; margin-right: 7px; border-radius: 50%; background: var(--faint); }
826
+ .dense-item .item-actions button { flex: 1; min-height: 32px; padding: 5px 8px; }
827
+ .state-dot { flex: 0 0 auto; display: inline-block; width: 6px; height: 6px; margin-right: 8px; border-radius: 50%; background: var(--faint); }
393
828
  .state-dot.ready,
394
829
  .state-dot.active,
395
- .state-dot.succeeded { background: var(--accent); }
830
+ .state-dot.succeeded { background: var(--live); }
396
831
  .state-dot.running,
397
832
  .state-dot.connecting,
398
- .state-dot.starting { background: var(--amber); }
833
+ .state-dot.starting { background: var(--honey); }
399
834
  .state-dot.failed,
400
835
  .state-dot.degraded,
401
- .state-dot.blocked { background: var(--red); }
402
- .empty-list { padding: 10px 0; color: var(--faint); font-size: 12.5px; }
836
+ .state-dot.blocked { background: var(--rust); }
837
+ .empty-list { padding: 12px 0; color: var(--faint); font-size: 12.5px; line-height: 1.6; }
403
838
  .inspection-result { margin-top: 14px; padding: 12px; border: 1px solid var(--border); border-radius: var(--radius-md); background: var(--surface-soft); color: var(--muted); font-size: 12.5px; overflow-wrap: anywhere; }
404
- .inspection-result b { display: block; color: var(--text); margin-bottom: 6px; font-size: 13.5px; }
405
- .inspection-result p { line-height: 1.5; }
406
- .inspection-result code { display: block; color: var(--accent); font: 11.5px/1.5 var(--font-mono); }
407
- .inspection-result button { width: 100%; margin-top: 10px; }
839
+ .inspection-result b { display: block; color: var(--text); margin-bottom: 7px; font-size: 13.5px; }
840
+ .inspection-result p { line-height: 1.55; }
841
+ .inspection-result code { display: block; color: var(--text-soft); font: 11.5px/1.5 var(--font-mono); }
842
+ .inspection-result button { width: 100%; margin-top: 11px; }
408
843
 
409
844
  .settings-overlay,
410
- .approval-overlay { position: fixed; inset: 0; z-index: 50; display: grid; place-items: center; padding: 28px; background: var(--overlay); backdrop-filter: blur(12px); overscroll-behavior: contain; }
411
- .settings-dialog { width: min(680px, 100%); max-height: calc(100vh - 56px); overflow: auto; border: 1px solid var(--border-strong); border-radius: 20px; background: var(--surface); box-shadow: var(--shadow); animation: dialog-enter 260ms var(--motion-out) both; }
412
- .settings-header { position: sticky; top: 0; z-index: 1; display: flex; align-items: flex-start; justify-content: space-between; padding: 25px 28px 20px; border-bottom: 1px solid var(--border-soft); background: color-mix(in srgb, var(--surface) 96%, transparent); backdrop-filter: blur(14px); }
413
- .settings-header h2 { margin: 7px 0 5px; color: var(--text); font-size: 27px; line-height: 1.1; letter-spacing: -0.04em; }
414
- .settings-header p { margin: 0; color: var(--muted); font-size: 13.5px; }
845
+ .approval-overlay { position: fixed; inset: 0; z-index: 50; display: grid; place-items: center; padding: 28px; background: var(--overlay); backdrop-filter: blur(10px); overscroll-behavior: contain; }
846
+ .settings-dialog { width: min(660px, 100%); max-height: calc(100vh - 56px); overflow: auto; border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--surface); box-shadow: var(--shadow); }
847
+ .settings-header { position: sticky; top: 0; z-index: 1; display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; padding: 24px 26px 18px; border-bottom: 1px solid var(--border-soft); background: var(--surface); }
848
+ .settings-header h2 { margin: 8px 0 6px; color: var(--text); font-size: 24px; line-height: 1.15; font-weight: 750; letter-spacing: -0.03em; }
849
+ .settings-header p { margin: 0; color: var(--muted); font-size: 13.5px; line-height: 1.55; }
415
850
  .settings-form { display: flex; flex-direction: column; }
416
- .settings-section { padding: 22px 28px; border-bottom: 1px solid var(--border-soft); }
417
- .settings-section-title { display: grid; grid-template-columns: 32px minmax(0, 1fr); gap: 12px; margin-bottom: 17px; }
418
- .settings-section-title > span { color: var(--accent); font: 700 12px/1.4 var(--font-mono); }
419
- .settings-section-title h3 { margin: 0 0 4px; color: var(--text); font-size: 16px; }
420
- .settings-section-title p { margin: 0; color: var(--muted); font-size: 12.5px; line-height: 1.5; }
421
- .settings-field-note { margin: 12px 0 0; color: var(--muted); font-size: 12.5px; line-height: 1.55; }
851
+ .settings-section { padding: 20px 26px; border-bottom: 1px solid var(--border-soft); }
852
+ .settings-section-title { margin-bottom: 15px; }
853
+ .settings-section-title h3 { margin: 0 0 4px; color: var(--text); font-size: 15.5px; font-weight: 700; }
854
+ .settings-section-title p { margin: 0; color: var(--muted); font-size: 12.5px; line-height: 1.55; }
855
+ .settings-field-note { margin: 12px 0 0; color: var(--muted); font-size: 12.5px; line-height: 1.6; }
856
+ .indexing-directories { margin: 12px 0 0; }
857
+ .indexing-directories .subsection-heading { display: flex; align-items: center; justify-content: space-between; }
858
+ .indexing-dir-list { display: flex; flex-direction: column; gap: 6px; margin-top: 8px; }
859
+ .indexing-dir-list:empty::after { content: "尚未选择目录,启用后不会索引任何内容"; color: var(--faint); font-size: 12px; }
860
+ .indexing-dir { display: flex; align-items: center; gap: 8px; padding: 6px 9px; border: 1px solid var(--border); border-radius: var(--radius-sm); background: var(--surface-soft); }
861
+ .indexing-dir code { flex: 1 1 auto; min-width: 0; overflow-x: auto; color: var(--text); font-family: var(--font-mono); font-size: 11.5px; white-space: nowrap; }
862
+ .indexing-panel { margin: 0 0 18px; }
863
+ .indexing-bar { position: relative; height: 6px; margin: 0 0 10px; border-radius: 999px; background: var(--surface-soft); border: 1px solid var(--border-soft); overflow: hidden; }
864
+ .indexing-bar i { position: absolute; inset: 0 auto 0 0; width: 0; border-radius: 999px; background: var(--accent); transition: width 220ms var(--motion-out); }
865
+ .indexing-panel[data-phase="failed"] .indexing-bar i { background: var(--rust); }
866
+ /* The CLI walks and compares without reporting counts, sometimes for minutes:
867
+ a travelling fill says "working" where an empty bar read as a hang. */
868
+ .indexing-panel[data-progress="indeterminate"] .indexing-bar i {
869
+ inset: 0;
870
+ width: auto;
871
+ border-radius: 0;
872
+ background: color-mix(in srgb, var(--accent) 18%, transparent);
873
+ background-image: linear-gradient(90deg, transparent, var(--accent), transparent);
874
+ background-size: 45% 100%;
875
+ background-repeat: no-repeat;
876
+ transition: none;
877
+ animation: activity-travel 1.6s linear infinite;
878
+ }
879
+ .indexing-panel[data-phase="idle"] .indexing-bar i { background: var(--live); }
880
+ .indexing-panel[data-phase="disabled"] .indexing-bar,
881
+ .indexing-panel[data-phase="unconfigured"] .indexing-bar,
882
+ .indexing-panel[data-phase="unavailable"] .indexing-bar { opacity: 0.45; }
883
+ .indexing-counts { margin: 0; color: var(--text-soft); font-size: 12.5px; }
884
+ .indexing-current { margin: 4px 0 0; color: var(--faint); font-size: 11.5px; font-family: var(--font-mono); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
885
+ .indexing-current:empty { display: none; }
886
+ .settings-path-note { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; margin: 10px 0 0; color: var(--muted); font-size: 12px; line-height: 1.6; }
887
+ .settings-path-note code { flex: 1 1 220px; min-width: 0; overflow-x: auto; padding: 4px 8px; border: 1px solid var(--border); border-radius: var(--radius-sm); background: var(--surface-soft); color: var(--text); font-family: var(--font-mono); font-size: 11.5px; white-space: nowrap; }
888
+ .settings-path-state { flex: 0 0 auto; padding: 2px 8px; border-radius: 999px; border: 1px solid var(--border); font-size: 11.5px; }
889
+ .settings-path-state[data-state="present"] { border-color: color-mix(in srgb, var(--live) 46%, var(--border)); color: var(--live); }
890
+ .settings-danger-note { margin: 10px 0 0; padding: 11px 13px; border: 1px solid color-mix(in srgb, var(--honey) 46%, var(--border)); border-radius: var(--radius-sm); color: var(--honey); background: var(--honey-soft); font-size: 12.5px; line-height: 1.65; }
422
891
  .settings-section > label:not(.checkbox-field),
423
892
  .field-grid > label { display: flex; flex-direction: column; gap: 7px; }
424
893
  .settings-section > label + .field-grid,
@@ -427,63 +896,64 @@ select { min-height: 40px; border-radius: var(--radius-sm); padding: 7px 34px 7p
427
896
  .field-grid { display: grid; gap: 12px; }
428
897
  .field-grid.two-columns { grid-template-columns: repeat(2, minmax(0, 1fr)); }
429
898
  .settings-form input,
430
- .settings-form select { min-height: 42px; font-size: 14px; }
899
+ .settings-form select { min-height: 40px; font-size: 14px; }
431
900
  .checkbox-field { display: flex; align-items: flex-start; gap: 11px; padding: 11px 12px; border: 1px solid var(--border-soft); border-radius: var(--radius-md); background: var(--surface-soft); cursor: pointer; }
432
- .checkbox-field input { width: 16px; min-height: 16px; margin: 2px 0 0; accent-color: var(--accent); }
901
+ .checkbox-field input { width: 15px; min-height: 15px; margin: 3px 0 0; accent-color: var(--rust); }
433
902
  .checkbox-field span { display: block; min-width: 0; }
434
903
  .checkbox-field b,
435
904
  .checkbox-field small { display: block; }
436
905
  .checkbox-field b { color: var(--text); font-size: 13.5px; font-weight: 650; }
437
- .checkbox-field small { margin-top: 3px; color: var(--muted); font-size: 12px; line-height: 1.4; }
438
- .checkbox-field.destructive:has(input:checked) { border-color: color-mix(in srgb, var(--red) 45%, var(--border)); background: var(--red-soft); }
906
+ .checkbox-field small { margin-top: 4px; color: var(--muted); font-size: 12px; line-height: 1.45; }
907
+ .checkbox-field.destructive:has(input:checked) { border-color: color-mix(in srgb, var(--rust) 42%, var(--border)); background: var(--rust-soft); }
439
908
  .secret-input { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; border: 1px solid var(--border); border-radius: var(--radius-sm); background: var(--surface-input); }
440
- .secret-input:focus-within { outline: 2px solid var(--accent); outline-offset: 2px; }
909
+ .secret-input:focus-within { outline: 2px solid color-mix(in srgb, var(--accent) 72%, transparent); outline-offset: 2px; }
441
910
  .secret-input input { border: 0; background: transparent; }
442
911
  .secret-input input:focus-visible { outline: 0; }
443
- .settings-footer { position: sticky; bottom: 0; display: flex; align-items: center; justify-content: space-between; gap: 18px; padding: 16px 28px; background: color-mix(in srgb, var(--surface) 96%, transparent); backdrop-filter: blur(14px); }
444
- .settings-footer p { min-width: 0; margin: 0; color: var(--muted); font-size: 12.5px; line-height: 1.4; }
912
+ .settings-footer { position: sticky; bottom: 0; display: flex; align-items: center; justify-content: space-between; gap: 18px; padding: 16px 26px; border-top: 1px solid var(--border-soft); background: var(--surface); }
913
+ .settings-footer p { min-width: 0; margin: 0; color: var(--muted); font-size: 12.5px; line-height: 1.45; }
445
914
  .settings-footer > div { flex: 0 0 auto; gap: 8px; }
446
915
 
447
- .approval-dialog { width: min(590px, 100%); max-height: calc(100vh - 64px); overflow: auto; padding: 30px; border: 1px solid color-mix(in srgb, var(--amber) 48%, var(--border)); border-radius: var(--radius-lg); background: var(--surface); box-shadow: var(--shadow), 0 0 50px var(--amber-soft); }
448
- .approval-icon { float: right; display: grid; place-items: center; width: 42px; height: 42px; border: 1px solid color-mix(in srgb, var(--amber) 52%, var(--border)); border-radius: 50%; color: var(--amber); font: 750 20px/1 var(--font-mono); }
449
- .approval-dialog h2 { margin: 9px 0; font-size: 24px; line-height: 1.2; letter-spacing: -0.03em; }
450
- .approval-dialog > p { margin: 0 0 20px; color: var(--text-soft); font-size: 14.5px; line-height: 1.6; }
451
- .approval-details { display: grid; grid-template-columns: 1fr; gap: 1px; overflow: hidden; border: 1px solid var(--border); border-radius: var(--radius-md); }
452
- .approval-details div { display: grid; grid-template-columns: 94px minmax(0, 1fr); padding: 11px; background: var(--surface-soft); }
453
- .approval-details dt { color: var(--muted); font-size: 12px; }
916
+ .approval-dialog { position: relative; width: min(580px, 100%); max-height: calc(100vh - 64px); overflow: auto; padding: 26px 28px 24px; border: 1px solid color-mix(in srgb, var(--honey) 42%, var(--border)); border-radius: var(--radius-lg); background: var(--surface); box-shadow: var(--shadow); }
917
+ .approval-icon { position: absolute; top: 26px; right: 28px; display: grid; place-items: center; width: 34px; height: 34px; border: 1px solid color-mix(in srgb, var(--honey) 48%, var(--border)); border-radius: 50%; color: var(--honey); background: var(--honey-soft); font: 700 17px/1 var(--font-mono); }
918
+ .approval-dialog h2 { margin: 9px 44px 10px 0; font-size: 22px; line-height: 1.25; font-weight: 750; letter-spacing: -0.025em; }
919
+ .approval-dialog > p { margin: 0 0 18px; color: var(--text-soft); font-size: 14.5px; line-height: 1.65; }
920
+ .approval-details { display: grid; grid-template-columns: 1fr; gap: 1px; overflow: hidden; border: 1px solid var(--border-soft); border-radius: var(--radius-md); background: var(--border-soft); }
921
+ .approval-details div { display: grid; grid-template-columns: 84px minmax(0, 1fr); gap: 12px; padding: 11px 13px; background: var(--surface-soft); }
922
+ .approval-details dt { color: var(--faint); font: 11.5px/1.5 var(--font-mono); text-transform: uppercase; letter-spacing: 0.1em; }
454
923
  .approval-details dd { margin: 0; overflow-wrap: anywhere; font: 12.5px/1.5 var(--font-mono); }
455
- .approval-command { margin: 13px 0 0; max-height: 200px; border-color: color-mix(in srgb, var(--amber) 30%, var(--border)); }
456
- .approval-actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 8px; margin-top: 22px; }
457
- .approval-actions button { padding: 9px 13px; }
924
+ .approval-command { margin: 12px 0 0; max-height: 200px; border-color: color-mix(in srgb, var(--honey) 26%, var(--border)); }
925
+ .approval-actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 8px; margin-top: 20px; }
926
+ .approval-actions button { padding: 9px 14px; }
927
+ .approval-actions .danger-ghost-button { color: var(--text); border-color: var(--border-strong); background: var(--surface-raised); font-weight: 650; }
928
+ .approval-actions .danger-ghost-button:hover { border-color: var(--text-soft); background: var(--surface-hover); }
929
+ .approval-actions .secondary-button { color: var(--accent); border-color: color-mix(in srgb, var(--accent) 36%, var(--border)); background: transparent; }
930
+ .approval-actions .secondary-button:hover { border-color: var(--accent); background: var(--accent-soft); }
458
931
 
459
932
  ::-webkit-scrollbar { width: 10px; height: 10px; }
460
933
  ::-webkit-scrollbar-track { background: transparent; }
461
- ::-webkit-scrollbar-thumb { border: 3px solid transparent; border-radius: 999px; background: color-mix(in srgb, var(--muted) 42%, transparent); background-clip: padding-box; }
462
- ::-webkit-scrollbar-thumb:hover { background: color-mix(in srgb, var(--muted) 65%, transparent); background-clip: padding-box; }
934
+ ::-webkit-scrollbar-thumb { border: 3px solid transparent; border-radius: 999px; background: color-mix(in srgb, var(--muted) 32%, transparent); background-clip: padding-box; }
935
+ ::-webkit-scrollbar-thumb:hover { background: color-mix(in srgb, var(--muted) 55%, transparent); background-clip: padding-box; }
463
936
 
464
- @keyframes surface-enter {
465
- from { opacity: 0; transform: translateY(7px); }
466
- to { opacity: 1; transform: translateY(0); }
467
- }
468
- @keyframes dialog-enter {
469
- from { opacity: 0; transform: translateY(12px) scale(0.985); }
470
- to { opacity: 1; transform: translateY(0) scale(1); }
937
+ @keyframes spore-pulse {
938
+ 0% { opacity: 0.75; transform: scale(0.7); }
939
+ 70% { opacity: 0; transform: scale(1.9); }
940
+ 100% { opacity: 0; transform: scale(1.9); }
471
941
  }
472
942
  @keyframes spin { to { transform: rotate(360deg); } }
473
943
  @keyframes blink { 50% { opacity: 0; } }
474
944
 
475
945
  @media (max-width: 1480px) {
476
- .workspace-grid { grid-template-columns: 236px minmax(500px, 1fr) 340px; }
946
+ .workspace-grid { grid-template-columns: 238px minmax(500px, 1fr) 340px; }
477
947
  :root[data-navigation="closed"] .workspace-grid { grid-template-columns: minmax(500px, 1fr) 340px; }
478
- :root[data-inspector="closed"] .workspace-grid { grid-template-columns: 236px minmax(500px, 1fr); }
479
- .topbar { grid-template-columns: minmax(240px, 1fr) auto minmax(390px, 1fr); }
480
- .topbar-metrics > span { min-width: 63px; padding-inline: 9px; }
481
- .transcript { padding-inline: clamp(26px, 4vw, 60px); }
948
+ :root[data-inspector="closed"] .workspace-grid { grid-template-columns: 238px minmax(500px, 1fr); }
949
+ .topbar { gap: 16px; }
950
+ .topbar-metrics { gap: 14px; }
951
+ .transcript { padding-inline: min(clamp(24px, 3.5vw, 56px), max(18px, 6cqi)); }
482
952
  }
483
953
 
484
954
  @media (max-width: 1320px) {
485
955
  .workspace-grid,
486
- :root[data-inspector="closed"] .workspace-grid { grid-template-columns: 236px minmax(0, 1fr); }
956
+ :root[data-inspector="closed"] .workspace-grid { grid-template-columns: 238px minmax(0, 1fr); }
487
957
  :root[data-navigation="closed"] .workspace-grid,
488
958
  :root[data-navigation="closed"][data-inspector="closed"] .workspace-grid { grid-template-columns: minmax(0, 1fr); }
489
959
  :root[data-inspector="open"] .right-rail {
@@ -493,10 +963,9 @@ select { min-height: 40px; border-radius: var(--radius-sm); padding: 7px 34px 7p
493
963
  right: 0;
494
964
  display: grid;
495
965
  width: min(380px, calc(100% - 54px));
496
- box-shadow: var(--shadow);
966
+ box-shadow: var(--shadow-drawer);
497
967
  }
498
968
  .runtime-status .muted { display: none; }
499
- .topbar { grid-template-columns: 1fr auto auto; }
500
969
  }
501
970
 
502
971
  @media (max-width: 1160px) {
@@ -511,21 +980,194 @@ select { min-height: 40px; border-radius: var(--radius-sm); padding: 7px 34px 7p
511
980
  left: 0;
512
981
  display: flex;
513
982
  width: min(280px, calc(100% - 54px));
514
- box-shadow: var(--shadow);
983
+ box-shadow: var(--shadow-drawer);
515
984
  }
516
985
  .conversation-header { padding-inline: 20px; }
517
986
  }
518
987
 
519
988
  @media (max-height: 780px) {
520
- .app-shell { grid-template-rows: 58px auto minmax(0, 1fr); }
521
- .conversation { grid-template-rows: 66px minmax(0, 1fr) auto; }
522
- .transcript { padding-block: 22px 30px; }
523
- .message { margin-bottom: 24px; }
989
+ .transcript { padding-block: 22px 28px; }
990
+ .message { margin-bottom: 22px; }
524
991
  .composer-wrap { padding: 0 14px 12px; }
525
992
  .composer textarea { min-height: 52px; }
526
- .panel-header { padding-block: 16px; }
527
- .settings-section { padding-block: 17px; }
528
- .settings-section-title { margin-bottom: 13px; }
993
+ .panel-header { padding-block: 15px 13px; }
994
+ .settings-section { padding-block: 16px; }
995
+ .settings-section-title { margin-bottom: 12px; }
996
+ .transcript-suggestions { margin-top: 14px; }
997
+ }
998
+
999
+ .article-panel {
1000
+ display: grid;
1001
+ grid-template-rows: auto auto auto minmax(0, 1fr) auto;
1002
+ min-width: 0;
1003
+ }
1004
+ .article-panel[hidden] { display: none; }
1005
+ .article-header,
1006
+ .article-toolbar { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 16px 18px 12px; }
1007
+ .article-header { border-bottom: 1px solid var(--border-soft); }
1008
+ .article-heading h2 { margin: 6px 0 0; font-size: 18px; line-height: 1.25; letter-spacing: -0.02em; }
1009
+ .article-header-actions,
1010
+ .article-export,
1011
+ .article-versions { display: flex; align-items: center; gap: 6px; min-width: 0; }
1012
+ .article-export { gap: 4px; }
1013
+ .article-versions { flex-wrap: wrap; }
1014
+ .article-version {
1015
+ border: 1px solid var(--border-soft);
1016
+ border-radius: 999px;
1017
+ background: var(--surface-soft);
1018
+ color: var(--muted);
1019
+ font: 600 12px/1 var(--font-mono);
1020
+ padding: 6px 8px;
1021
+ }
1022
+ .article-version[aria-pressed="true"] { color: var(--text); border-color: var(--text); }
1023
+ .article-diff-summary { margin: 0; padding: 0 18px 8px; color: var(--live); font: 600 12.5px/1.4 var(--font-mono); }
1024
+ .settings-headers { display: grid; gap: 8px; }
1025
+ .settings-headers-heading { display: flex; align-items: center; justify-content: space-between; gap: 12px; color: var(--muted); font: 600 12px/1 var(--font-mono); letter-spacing: 0.06em; }
1026
+ .settings-header-list { display: grid; gap: 6px; }
1027
+ .settings-header-list:empty { display: none; }
1028
+ .settings-header-row { display: grid; grid-template-columns: minmax(0, 12em) minmax(0, 1fr) auto; gap: 8px; align-items: center; }
1029
+ .settings-header-row input { min-width: 0; }
1030
+ /* Sits in the same row as the format buttons, so it carries their height and
1031
+ size rather than floating above their baseline. */
1032
+ .article-export-label {
1033
+ display: inline-flex;
1034
+ align-items: center;
1035
+ flex: 0 0 auto;
1036
+ min-height: 34px;
1037
+ padding-right: 4px;
1038
+ color: var(--muted);
1039
+ font-size: 13px;
1040
+ letter-spacing: 0.04em;
1041
+ white-space: nowrap;
1042
+ }
1043
+ .segmented { display: inline-flex; border: 1px solid var(--border-soft); border-radius: 999px; background: var(--surface-soft); padding: 2px; gap: 2px; }
1044
+ .segment {
1045
+ border: 0;
1046
+ border-radius: 999px;
1047
+ background: transparent;
1048
+ color: var(--muted);
1049
+ font: 600 12px/1 var(--font-mono);
1050
+ padding: 6px 10px;
1051
+ cursor: pointer;
1052
+ }
1053
+ .segment[aria-pressed="true"] { background: var(--surface); color: var(--text); box-shadow: 0 1px 2px rgb(0 0 0 / 18%); }
1054
+ .segment:disabled { opacity: 0.4; cursor: default; }
1055
+
1056
+ /* Revision view: one row per line, so a rewrite reads as a diff rather than as
1057
+ a paragraph that silently changed. */
1058
+ .article-panel:not([data-view="read"]) .article-render { font-family: var(--font-mono); }
1059
+ .article-diff-line {
1060
+ display: grid;
1061
+ grid-template-columns: 3.2em 1.2em minmax(0, 1fr);
1062
+ gap: 8px;
1063
+ align-items: baseline;
1064
+ min-height: 1.7em;
1065
+ padding: 1px 6px;
1066
+ border-radius: 4px;
1067
+ font: 12.5px/1.7 var(--font-mono);
1068
+ white-space: pre-wrap;
1069
+ overflow-wrap: anywhere;
1070
+ }
1071
+ .article-diff-gutter { color: var(--faint); text-align: right; user-select: none; }
1072
+ .article-diff-mark { color: var(--faint); user-select: none; }
1073
+ .article-diff-line[data-change="same"] { color: var(--muted); }
1074
+ .article-diff-line[data-change="add"] { background: color-mix(in srgb, var(--live) 12%, transparent); color: var(--text); }
1075
+ .article-diff-line[data-change="add"] .article-diff-mark { color: var(--live); }
1076
+ .article-diff-line[data-change="remove"] { background: color-mix(in srgb, var(--rust) 12%, transparent); color: var(--text); }
1077
+ .article-diff-line[data-change="remove"] .article-diff-mark { color: var(--rust); }
1078
+ .article-diff-text ins { background: color-mix(in srgb, var(--live) 30%, transparent); text-decoration: none; border-radius: 3px; padding: 0 1px; }
1079
+ .article-diff-text del { background: color-mix(in srgb, var(--rust) 30%, transparent); text-decoration: line-through; border-radius: 3px; padding: 0 1px; }
1080
+ .article-stage { min-height: 0; overflow: auto; padding: 8px 22px 28px; }
1081
+ .article-removed {
1082
+ margin: 0 0 12px;
1083
+ padding: 8px 10px;
1084
+ border-left: 2px solid var(--rust);
1085
+ color: var(--rust);
1086
+ background: color-mix(in srgb, var(--rust) 8%, transparent);
1087
+ white-space: pre-wrap;
1088
+ text-decoration: line-through;
1089
+ font-size: 13.5px;
1090
+ line-height: 1.6;
1091
+ }
1092
+ /* What this version changed, still visible after it lands. */
1093
+ .article-block[data-change="add"] {
1094
+ border-radius: 8px;
1095
+ border-left: 2px solid color-mix(in srgb, var(--live) 65%, transparent);
1096
+ padding-left: 10px;
1097
+ margin-left: -12px;
1098
+ }
1099
+ .article-status { margin: 0; padding: 10px 18px 14px; border-top: 1px solid var(--border-soft); color: var(--muted); font-size: 12.5px; }
1100
+ .article-status:empty { display: none; }
1101
+ /* A turn that only called a tool keeps its slot in the virtual list, measured at
1102
+ zero height, instead of printing an empty bubble above the tool card. */
1103
+ .message.message-silent { display: none; }
1104
+ .article-reopen { max-width: 180px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1105
+ /* The way back into a document. Reopening a conversation, this is the row a
1106
+ reader is looking for, so it reads as an object rather than as tool output. */
1107
+ .article-receipt {
1108
+ display: flex;
1109
+ align-items: center;
1110
+ gap: 10px;
1111
+ flex-wrap: wrap;
1112
+ padding: 10px 12px;
1113
+ border: 1px solid color-mix(in srgb, var(--accent) 38%, var(--border-soft));
1114
+ border-left: 3px solid var(--accent);
1115
+ border-radius: var(--radius-sm);
1116
+ background: color-mix(in srgb, var(--surface-soft) 82%, var(--accent-soft));
1117
+ }
1118
+ .article-receipt strong { color: var(--text); font-size: 14.5px; }
1119
+ .article-receipt span { color: var(--muted); font: 12.5px var(--font-mono); }
1120
+ /* The document column is whatever width the reader dragged it to, and the value
1121
+ the open and close animations move between. It is a column beside the
1122
+ conversation at every window size the shell allows (1180px and up), never a
1123
+ drawer over it: the split is the reader's to drag either way. */
1124
+ :root { --article-width: 42vw; }
1125
+ :root[data-article="open"] .workspace-grid { grid-template-columns: clamp(232px, 14vw, 264px) minmax(0, 1fr) var(--article-width); }
1126
+ :root[data-article="open"][data-navigation="closed"] .workspace-grid { grid-template-columns: minmax(0, 1fr) var(--article-width); }
1127
+ :root[data-article="open"] .right-rail { display: none; }
1128
+ /* Sits just inside the panel's own left edge: `.panel` clips its overflow, so a
1129
+ handle hanging outside it would be invisible and unclickable. */
1130
+ .article-panel { position: relative; }
1131
+ .article-resize {
1132
+ position: absolute;
1133
+ inset: 0 auto 0 0;
1134
+ width: 10px;
1135
+ z-index: 3;
1136
+ cursor: col-resize;
1137
+ background: transparent;
1138
+ }
1139
+ .article-resize::after {
1140
+ content: "";
1141
+ position: absolute;
1142
+ inset: 0 auto 0 1px;
1143
+ width: 3px;
1144
+ border-radius: 3px;
1145
+ background: transparent;
1146
+ transition: background 160ms var(--motion-out);
1147
+ }
1148
+ .article-resize:hover::after,
1149
+ .article-resize:focus-visible::after,
1150
+ .article-resize[data-dragging="true"]::after { background: var(--accent); }
1151
+ .article-resize:focus-visible { outline: none; }
1152
+ :root[data-article-resizing="true"] { cursor: col-resize; }
1153
+ :root[data-article-resizing="true"] .article-stage,
1154
+ :root[data-article-resizing="true"] .transcript { user-select: none; }
1155
+
1156
+ @media (max-width: 1480px) {
1157
+ :root[data-article="open"] .workspace-grid { grid-template-columns: 238px minmax(0, 1fr) var(--article-width); }
1158
+ :root[data-article="open"][data-navigation="closed"] .workspace-grid { grid-template-columns: minmax(0, 1fr) var(--article-width); }
1159
+ }
1160
+
1161
+ @media (max-width: 1320px) {
1162
+ :root[data-article="open"] .workspace-grid { grid-template-columns: 238px minmax(0, 1fr) var(--article-width); }
1163
+ :root[data-article="open"][data-navigation="closed"] .workspace-grid { grid-template-columns: minmax(0, 1fr) var(--article-width); }
1164
+ }
1165
+
1166
+ /* The session rail is a drawer here, so it takes no column: the conversation and
1167
+ the document share the whole width, and the rail opens over both. */
1168
+ @media (max-width: 1160px) {
1169
+ :root[data-article="open"] .workspace-grid,
1170
+ :root[data-article="open"][data-navigation="closed"] .workspace-grid { grid-template-columns: minmax(0, 1fr) var(--article-width); }
529
1171
  }
530
1172
 
531
1173
  @media (prefers-reduced-motion: reduce) {