@joekytc/dsh-swarm 0.1.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (603) hide show
  1. package/README.md +177 -140
  2. package/README.zh-CN.md +173 -126
  3. package/client/BoardCard.tsx +24 -2
  4. package/client/ConfigSection.tsx +162 -0
  5. package/client/ConfigSelect.tsx +71 -0
  6. package/client/KanbanBoard.tsx +3 -0
  7. package/client/KanbanTab.tsx +4 -3
  8. package/client/TaskDrawer.tsx +4 -26
  9. package/client/WorkflowRail.tsx +3 -1
  10. package/client/config-store.ts +92 -0
  11. package/client/config.css +110 -0
  12. package/client/index.ts +39 -4
  13. package/client/kanban.css +88 -2
  14. package/client/session-bridge.ts +39 -0
  15. package/client/timeline-model.ts +12 -1
  16. package/client/workflow-model.ts +3 -1
  17. package/lib/client.js +519 -56
  18. package/lib/config.d.ts +26 -2
  19. package/lib/config.js +20 -1
  20. package/lib/dispatcher/agent-runner.d.ts +37 -7
  21. package/lib/dispatcher/agent-runner.js +239 -86
  22. package/lib/dispatcher/chain-auditor.d.ts +4 -4
  23. package/lib/dispatcher/chain-auditor.js +14 -9
  24. package/lib/dispatcher/dispatcher.d.ts +69 -10
  25. package/lib/dispatcher/dispatcher.js +281 -42
  26. package/lib/dispatcher/event-waker.d.ts +1 -1
  27. package/lib/dispatcher/event-waker.js +2 -2
  28. package/lib/dispatcher/git-credentials.d.ts +2 -2
  29. package/lib/dispatcher/git-credentials.js +2 -2
  30. package/lib/dispatcher/model-candidates.d.ts +1 -1
  31. package/lib/dispatcher/model-candidates.js +1 -1
  32. package/lib/dispatcher/session-events.d.ts +12 -16
  33. package/lib/dispatcher/session-events.js +18 -6
  34. package/lib/dispatcher/target-repo.d.ts +2 -2
  35. package/lib/dispatcher/target-repo.js +3 -3
  36. package/lib/dispatcher/v-orchestrator.d.ts +44 -11
  37. package/lib/dispatcher/v-orchestrator.js +257 -49
  38. package/lib/dispatcher/watchdog.d.ts +1 -1
  39. package/lib/dispatcher/watchdog.js +2 -2
  40. package/lib/domain/config-override.d.ts +52 -0
  41. package/lib/domain/config-override.js +138 -0
  42. package/lib/domain/delivery-contract.d.ts +4 -3
  43. package/lib/domain/delivery-contract.js +30 -18
  44. package/lib/domain/delivery-evidence.d.ts +1 -1
  45. package/lib/domain/delivery-evidence.js +1 -1
  46. package/lib/domain/event-store.js +1 -1
  47. package/lib/domain/gate-policy.d.ts +26 -0
  48. package/lib/domain/gate-policy.js +44 -0
  49. package/lib/domain/im-message.d.ts +15 -0
  50. package/lib/domain/im-message.js +149 -0
  51. package/lib/domain/kanban-service.d.ts +28 -12
  52. package/lib/domain/kanban-service.js +73 -30
  53. package/lib/domain/memory.js +1 -1
  54. package/lib/domain/ocr-review.d.ts +47 -0
  55. package/lib/domain/ocr-review.js +105 -0
  56. package/lib/domain/permissions.js +6 -6
  57. package/lib/domain/planning-checklist.d.ts +5 -0
  58. package/lib/domain/planning-checklist.js +80 -6
  59. package/lib/domain/projection.js +8 -7
  60. package/lib/domain/review-evidence.js +1 -1
  61. package/lib/domain/state-machine.js +3 -2
  62. package/lib/domain/task-parents.js +1 -1
  63. package/lib/domain/types.d.ts +5 -5
  64. package/lib/index.js +28 -25
  65. package/lib/roles/clean-fs-tools.d.ts +22 -0
  66. package/lib/roles/clean-fs-tools.js +117 -0
  67. package/lib/roles/preset-installer.js +3 -3
  68. package/lib/roles/skill-installer.d.ts +6 -0
  69. package/lib/roles/skill-installer.js +32 -0
  70. package/lib/roles/toolsets.d.ts +71 -15
  71. package/lib/roles/toolsets.js +418 -68
  72. package/lib/roles/wiki-worker.d.ts +1 -0
  73. package/lib/roles/wiki-worker.js +12 -4
  74. package/lib/routes/kanban-http.d.ts +28 -2
  75. package/lib/routes/kanban-http.js +199 -6
  76. package/lib/routes/kanban-sse.d.ts +1 -1
  77. package/lib/routes/kanban-sse.js +1 -1
  78. package/lib/routes/planning-driver.d.ts +6 -2
  79. package/lib/routes/planning-driver.js +15 -7
  80. package/lib/routes/prefix-router.d.ts +19 -3
  81. package/lib/routes/prefix-router.js +40 -3
  82. package/lib/services/config-provider.d.ts +38 -0
  83. package/lib/services/config-provider.js +92 -0
  84. package/lib/services/gate-runner.d.ts +24 -0
  85. package/lib/services/gate-runner.js +87 -0
  86. package/lib/services/im-delivery.d.ts +94 -0
  87. package/lib/services/im-delivery.js +263 -0
  88. package/lib/services/kanban-provider.d.ts +6 -2
  89. package/lib/services/kanban-provider.js +41 -3
  90. package/lib/services/llm-catalog.d.ts +35 -0
  91. package/lib/services/llm-catalog.js +19 -0
  92. package/lib/services/ocr-cli.d.ts +35 -0
  93. package/lib/services/ocr-cli.js +128 -0
  94. package/lib/tools/kanban-tools.d.ts +2 -2
  95. package/lib/tools/kanban-tools.js +2 -1
  96. package/lib/tools/main-session-tools.d.ts +22 -3
  97. package/lib/tools/main-session-tools.js +135 -30
  98. package/lib/tools/ocr-review-tools.d.ts +11 -0
  99. package/lib/tools/ocr-review-tools.js +63 -0
  100. package/lib/tools/planning-tools.d.ts +8 -1
  101. package/lib/tools/planning-tools.js +44 -15
  102. package/lib/tools/prefetch-tools.js +1 -0
  103. package/lib/tools/spec-card-tools.js +1 -0
  104. package/lib/tools/wiki-tools.js +6 -5
  105. package/lib/wiki/kb-linkage.d.ts +9 -2
  106. package/lib/wiki/kb-linkage.js +3 -3
  107. package/lib/wiki/local-kb-client.d.ts +14 -0
  108. package/lib/wiki/local-kb-client.js +101 -0
  109. package/lib/wiki/local-kb.d.ts +6 -0
  110. package/lib/wiki/local-kb.js +25 -0
  111. package/lib/wiki/memory-recall.d.ts +14 -6
  112. package/lib/wiki/memory-recall.js +17 -13
  113. package/lib/wiki/page-path.d.ts +9 -3
  114. package/lib/wiki/page-path.js +33 -12
  115. package/lib/wiki/wiki-vault-client.d.ts +3 -3
  116. package/lib/wiki/wiki-vault-client.js +6 -6
  117. package/package.json +16 -11
  118. package/personas/kanban-d/agent.cordis.yml +5 -5
  119. package/personas/kanban-d/preset.yml +1 -1
  120. package/personas/kanban-dt/agent.cordis.yml +25 -7
  121. package/personas/kanban-dt/preset.yml +1 -1
  122. package/personas/kanban-p/agent.cordis.yml +19 -3
  123. package/personas/kanban-p/preset.yml +1 -1
  124. package/personas/kanban-pt/agent.cordis.yml +39 -9
  125. package/personas/kanban-pt/preset.yml +1 -1
  126. package/personas/kanban-v/agent.cordis.yml +3 -3
  127. package/personas/kanban-w/agent.cordis.yml +37 -18
  128. package/personas/kanban-w/preset.yml +1 -1
  129. package/personas/persona-d.md +1 -1
  130. package/personas/persona-dt.md +13 -5
  131. package/personas/persona-p.md +5 -2
  132. package/personas/persona-pt.md +13 -6
  133. package/personas/persona-v.md +2 -2
  134. package/personas/persona-w.md +11 -9
  135. package/personas/swarm/agent.cordis.yml +43 -0
  136. package/personas/swarm/preset.yml +5 -0
  137. package/skills/grill-me/SKILL.md +71 -0
  138. package/skills/llm-wiki-skill/.mise.toml +2 -0
  139. package/skills/llm-wiki-skill/.nvmrc +1 -0
  140. package/skills/llm-wiki-skill/AGENTS.md +173 -0
  141. package/skills/llm-wiki-skill/CHANGELOG.md +548 -0
  142. package/skills/llm-wiki-skill/CLAUDE.md +152 -0
  143. package/skills/llm-wiki-skill/HERMES.md +44 -0
  144. package/skills/llm-wiki-skill/README.en.md +261 -0
  145. package/skills/llm-wiki-skill/README.md +291 -0
  146. package/skills/llm-wiki-skill/SKILL.md +1133 -0
  147. package/skills/llm-wiki-skill/assets/graph-demo.gif +0 -0
  148. package/skills/llm-wiki-skill/assets/graph-preview.png +0 -0
  149. package/skills/llm-wiki-skill/deps/LICENSE-d3.txt +13 -0
  150. package/skills/llm-wiki-skill/deps/LICENSE-marked.txt +44 -0
  151. package/skills/llm-wiki-skill/deps/LICENSE-purify.txt +568 -0
  152. package/skills/llm-wiki-skill/deps/LICENSE-roughjs.txt +21 -0
  153. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/SKILL.md +261 -0
  154. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/references/config/first-time-setup.md +106 -0
  155. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/cdp.ts +179 -0
  156. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/constants.ts +13 -0
  157. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/defuddle-converter.ts +58 -0
  158. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/html-to-markdown.ts +135 -0
  159. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/legacy-converter.ts +629 -0
  160. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/main.ts +314 -0
  161. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/markdown-conversion-shared.ts +305 -0
  162. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/media-localizer.ts +317 -0
  163. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/package.json +14 -0
  164. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/paths.ts +29 -0
  165. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/vendor/baoyu-chrome-cdp/package.json +9 -0
  166. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/vendor/baoyu-chrome-cdp/src/index.test.ts +307 -0
  167. package/skills/llm-wiki-skill/deps/baoyu-url-to-markdown/scripts/vendor/baoyu-chrome-cdp/src/index.ts +523 -0
  168. package/skills/llm-wiki-skill/deps/d3.min.js +2 -0
  169. package/skills/llm-wiki-skill/deps/marked.min.js +6 -0
  170. package/skills/llm-wiki-skill/deps/purify.min.js +3 -0
  171. package/skills/llm-wiki-skill/deps/rough.min.js +7 -0
  172. package/skills/llm-wiki-skill/deps/youtube-transcript/SKILL.md +47 -0
  173. package/skills/llm-wiki-skill/deps/youtube-transcript/scripts/get_transcript.py +72 -0
  174. package/skills/llm-wiki-skill/designs/graph-edge-legibility/graph-edge-treatments.html +480 -0
  175. package/skills/llm-wiki-skill/docs/design/oriental-atlas/DESIGN.md +183 -0
  176. package/skills/llm-wiki-skill/docs/design/oriental-atlas/README.md +10 -0
  177. package/skills/llm-wiki-skill/docs/design/oriental-atlas/design-brief.md +170 -0
  178. package/skills/llm-wiki-skill/docs/design/oriental-atlas/oriental-editorial-atlas.html +1908 -0
  179. package/skills/llm-wiki-skill/docs/design/oriental-atlas/reviews/result-review.md +68 -0
  180. package/skills/llm-wiki-skill/docs/graph/2026-06-16-interaction-risk-audit.md +88 -0
  181. package/skills/llm-wiki-skill/docs/graph/2026-06-16-interaction-test-coverage-map.md +212 -0
  182. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-0-2-baseline.md +86 -0
  183. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-1-3-dom-svg-large-baseline.md +85 -0
  184. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-1-4-disposable-validation-gate.md +97 -0
  185. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-18-phase-2-4-global-renderer-trial-matrix.md +168 -0
  186. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-1-sigma-graphology-trial.md +71 -0
  187. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-2-vis-network-trial.md +78 -0
  188. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-3-aggregation-fallback-trial.md +72 -0
  189. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-phase-6-4-global-renderer-route-decision.md +94 -0
  190. package/skills/llm-wiki-skill/docs/graph/performance/2026-06-19-sigma-global-production-integration-result.md +102 -0
  191. package/skills/llm-wiki-skill/docs/graph/performance/artifacts/2026-06-18-phase-0-2/stage-4.5-offline-dense-wheel.json +9 -0
  192. package/skills/llm-wiki-skill/docs/graph/performance/artifacts/2026-06-18-phase-0-2/stage-4.5-offline-dense-wheel.png +0 -0
  193. package/skills/llm-wiki-skill/docs/graph/performance/artifacts/2026-06-18-phase-0-2/stage-4.5-offline-navigation.png +0 -0
  194. package/skills/llm-wiki-skill/docs/spark/2026-06-15-omp-tool-status-events-design.md +174 -0
  195. package/skills/llm-wiki-skill/docs/spark/2026-06-16-graph-interaction-geometry-design.md +832 -0
  196. package/skills/llm-wiki-skill/docs/spark/2026-06-16-graph-six-layer-architecture-design.md +577 -0
  197. package/skills/llm-wiki-skill/docs/spark/2026-06-17-static-renderer-coordination-split-design.md +172 -0
  198. package/skills/llm-wiki-skill/docs/spark/2026-06-18-large-graph-global-community-design.md +909 -0
  199. package/skills/llm-wiki-skill/docs/spark/2026-06-19-sigma-global-graph-renderer-design.md +360 -0
  200. package/skills/llm-wiki-skill/docs/spark/2026-06-20-paper-ui-port-design.md +162 -0
  201. package/skills/llm-wiki-skill/docs/spark/2026-06-20-paper-ui-v2-shell-alignment-design.md +384 -0
  202. package/skills/llm-wiki-skill/docs/spark/2026-06-21-graph-experience-completion-design.md +534 -0
  203. package/skills/llm-wiki-skill/docs/spark/2026-06-22-chat-auto-scroll-design.md +185 -0
  204. package/skills/llm-wiki-skill/docs/spark/2026-06-22-graph-community-node-visual-design.md +266 -0
  205. package/skills/llm-wiki-skill/docs/spark/2026-06-25-sigma-overlay-refactor-perf-design.md +170 -0
  206. package/skills/llm-wiki-skill/docs/spark/2026-06-26-global-sigma-community-spotlight-design.md +393 -0
  207. package/skills/llm-wiki-skill/docs/spark/mockups/2026-06-18-large-graph-global-community-flow.html +746 -0
  208. package/skills/llm-wiki-skill/install.ps1 +87 -0
  209. package/skills/llm-wiki-skill/install.sh +722 -0
  210. package/skills/llm-wiki-skill/package-lock.json +11171 -0
  211. package/skills/llm-wiki-skill/package.json +24 -0
  212. package/skills/llm-wiki-skill/packages/graph-engine/package.json +37 -0
  213. package/skills/llm-wiki-skill/packages/graph-engine/src/anim/.gitkeep +1 -0
  214. package/skills/llm-wiki-skill/packages/graph-engine/src/anim/index.ts +179 -0
  215. package/skills/llm-wiki-skill/packages/graph-engine/src/architecture.ts +79 -0
  216. package/skills/llm-wiki-skill/packages/graph-engine/src/diff.ts +121 -0
  217. package/skills/llm-wiki-skill/packages/graph-engine/src/facade.ts +1406 -0
  218. package/skills/llm-wiki-skill/packages/graph-engine/src/graph-node.ts +37 -0
  219. package/skills/llm-wiki-skill/packages/graph-engine/src/index.ts +25 -0
  220. package/skills/llm-wiki-skill/packages/graph-engine/src/layout/edge-geometry.ts +17 -0
  221. package/skills/llm-wiki-skill/packages/graph-engine/src/layout/index.ts +16 -0
  222. package/skills/llm-wiki-skill/packages/graph-engine/src/layout/spatial-index.ts +509 -0
  223. package/skills/llm-wiki-skill/packages/graph-engine/src/model/atlas.ts +18 -0
  224. package/skills/llm-wiki-skill/packages/graph-engine/src/model/index.ts +10 -0
  225. package/skills/llm-wiki-skill/packages/graph-engine/src/model/labels.ts +11 -0
  226. package/skills/llm-wiki-skill/packages/graph-engine/src/model/layout.ts +81 -0
  227. package/skills/llm-wiki-skill/packages/graph-engine/src/model/learning.ts +8 -0
  228. package/skills/llm-wiki-skill/packages/graph-engine/src/model/legacy-helpers.ts +1379 -0
  229. package/skills/llm-wiki-skill/packages/graph-engine/src/model/queue.ts +7 -0
  230. package/skills/llm-wiki-skill/packages/graph-engine/src/model/storage.ts +4 -0
  231. package/skills/llm-wiki-skill/packages/graph-engine/src/model/visibility.ts +9 -0
  232. package/skills/llm-wiki-skill/packages/graph-engine/src/render/.gitkeep +1 -0
  233. package/skills/llm-wiki-skill/packages/graph-engine/src/render/adapter.ts +443 -0
  234. package/skills/llm-wiki-skill/packages/graph-engine/src/render/aggregation-containers.ts +64 -0
  235. package/skills/llm-wiki-skill/packages/graph-engine/src/render/community-cloud-geometry.ts +178 -0
  236. package/skills/llm-wiki-skill/packages/graph-engine/src/render/community-wash.ts +238 -0
  237. package/skills/llm-wiki-skill/packages/graph-engine/src/render/community-washes.ts +19 -0
  238. package/skills/llm-wiki-skill/packages/graph-engine/src/render/compat-contract.ts +14 -0
  239. package/skills/llm-wiki-skill/packages/graph-engine/src/render/controller.ts +705 -0
  240. package/skills/llm-wiki-skill/packages/graph-engine/src/render/controls.ts +288 -0
  241. package/skills/llm-wiki-skill/packages/graph-engine/src/render/dom-svg-renderer.ts +180 -0
  242. package/skills/llm-wiki-skill/packages/graph-engine/src/render/edges.ts +51 -0
  243. package/skills/llm-wiki-skill/packages/graph-engine/src/render/geometry.ts +380 -0
  244. package/skills/llm-wiki-skill/packages/graph-engine/src/render/gestures.ts +673 -0
  245. package/skills/llm-wiki-skill/packages/graph-engine/src/render/graph-renderer-root.ts +387 -0
  246. package/skills/llm-wiki-skill/packages/graph-engine/src/render/hit-testing.ts +56 -0
  247. package/skills/llm-wiki-skill/packages/graph-engine/src/render/host-dom.ts +14 -0
  248. package/skills/llm-wiki-skill/packages/graph-engine/src/render/hover-card.ts +37 -0
  249. package/skills/llm-wiki-skill/packages/graph-engine/src/render/index.ts +213 -0
  250. package/skills/llm-wiki-skill/packages/graph-engine/src/render/keyboard.ts +48 -0
  251. package/skills/llm-wiki-skill/packages/graph-engine/src/render/legend.ts +25 -0
  252. package/skills/llm-wiki-skill/packages/graph-engine/src/render/minimap.ts +45 -0
  253. package/skills/llm-wiki-skill/packages/graph-engine/src/render/model.ts +1339 -0
  254. package/skills/llm-wiki-skill/packages/graph-engine/src/render/node-drag-lifecycle.ts +94 -0
  255. package/skills/llm-wiki-skill/packages/graph-engine/src/render/nodes.ts +103 -0
  256. package/skills/llm-wiki-skill/packages/graph-engine/src/render/offline-reader.ts +209 -0
  257. package/skills/llm-wiki-skill/packages/graph-engine/src/render/overlays-presenter.ts +192 -0
  258. package/skills/llm-wiki-skill/packages/graph-engine/src/render/overlays.ts +73 -0
  259. package/skills/llm-wiki-skill/packages/graph-engine/src/render/pin-position.ts +51 -0
  260. package/skills/llm-wiki-skill/packages/graph-engine/src/render/preview.ts +65 -0
  261. package/skills/llm-wiki-skill/packages/graph-engine/src/render/relation-focus.ts +91 -0
  262. package/skills/llm-wiki-skill/packages/graph-engine/src/render/render-context.ts +85 -0
  263. package/skills/llm-wiki-skill/packages/graph-engine/src/render/render-pipeline.ts +871 -0
  264. package/skills/llm-wiki-skill/packages/graph-engine/src/render/render-styles.ts +1405 -0
  265. package/skills/llm-wiki-skill/packages/graph-engine/src/render/renderer-surface.ts +75 -0
  266. package/skills/llm-wiki-skill/packages/graph-engine/src/render/search.ts +57 -0
  267. package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-coordinates.ts +44 -0
  268. package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-global-drag.ts +246 -0
  269. package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-global-renderer.ts +1425 -0
  270. package/skills/llm-wiki-skill/packages/graph-engine/src/render/sigma-overlay-svg.ts +121 -0
  271. package/skills/llm-wiki-skill/packages/graph-engine/src/render/simulation-bridge.ts +59 -0
  272. package/skills/llm-wiki-skill/packages/graph-engine/src/render/state.ts +262 -0
  273. package/skills/llm-wiki-skill/packages/graph-engine/src/render/toolbar.ts +40 -0
  274. package/skills/llm-wiki-skill/packages/graph-engine/src/render/viewport.ts +336 -0
  275. package/skills/llm-wiki-skill/packages/graph-engine/src/select/.gitkeep +1 -0
  276. package/skills/llm-wiki-skill/packages/graph-engine/src/select/index.ts +189 -0
  277. package/skills/llm-wiki-skill/packages/graph-engine/src/sim/index.ts +372 -0
  278. package/skills/llm-wiki-skill/packages/graph-engine/src/sim/pins.ts +84 -0
  279. package/skills/llm-wiki-skill/packages/graph-engine/src/summary/index.ts +447 -0
  280. package/skills/llm-wiki-skill/packages/graph-engine/src/themes/.gitkeep +1 -0
  281. package/skills/llm-wiki-skill/packages/graph-engine/src/themes/index.ts +8 -0
  282. package/skills/llm-wiki-skill/packages/graph-engine/src/themes/tokens.ts +117 -0
  283. package/skills/llm-wiki-skill/packages/graph-engine/src/types/d3-quadtree.d.ts +22 -0
  284. package/skills/llm-wiki-skill/packages/graph-engine/src/types.ts +531 -0
  285. package/skills/llm-wiki-skill/packages/graph-engine/test/aggregation-fallback-trial-adapter.test.ts +115 -0
  286. package/skills/llm-wiki-skill/packages/graph-engine/test/aggregation-fallback-trial-adapter.ts +222 -0
  287. package/skills/llm-wiki-skill/packages/graph-engine/test/anim.test.ts +121 -0
  288. package/skills/llm-wiki-skill/packages/graph-engine/test/architecture.test.ts +63 -0
  289. package/skills/llm-wiki-skill/packages/graph-engine/test/community-cloud-geometry.test.ts +86 -0
  290. package/skills/llm-wiki-skill/packages/graph-engine/test/community-wash.test.ts +97 -0
  291. package/skills/llm-wiki-skill/packages/graph-engine/test/diff.test.ts +133 -0
  292. package/skills/llm-wiki-skill/packages/graph-engine/test/facade.test.ts +1369 -0
  293. package/skills/llm-wiki-skill/packages/graph-engine/test/geometry.test.ts +147 -0
  294. package/skills/llm-wiki-skill/packages/graph-engine/test/gestures.test.ts +768 -0
  295. package/skills/llm-wiki-skill/packages/graph-engine/test/graph-layout.test.ts +110 -0
  296. package/skills/llm-wiki-skill/packages/graph-engine/test/helpers.test.ts +287 -0
  297. package/skills/llm-wiki-skill/packages/graph-engine/test/interaction-contract.test.ts +106 -0
  298. package/skills/llm-wiki-skill/packages/graph-engine/test/keyboard.test.ts +59 -0
  299. package/skills/llm-wiki-skill/packages/graph-engine/test/large-fixtures.test.ts +47 -0
  300. package/skills/llm-wiki-skill/packages/graph-engine/test/large-graph-fixtures.ts +420 -0
  301. package/skills/llm-wiki-skill/packages/graph-engine/test/learning.test.ts +259 -0
  302. package/skills/llm-wiki-skill/packages/graph-engine/test/node-drag-lifecycle.test.ts +166 -0
  303. package/skills/llm-wiki-skill/packages/graph-engine/test/overlays.test.ts +115 -0
  304. package/skills/llm-wiki-skill/packages/graph-engine/test/preview.test.ts +56 -0
  305. package/skills/llm-wiki-skill/packages/graph-engine/test/queue.test.ts +114 -0
  306. package/skills/llm-wiki-skill/packages/graph-engine/test/relation-focus.test.ts +115 -0
  307. package/skills/llm-wiki-skill/packages/graph-engine/test/render-model.test.ts +1030 -0
  308. package/skills/llm-wiki-skill/packages/graph-engine/test/renderer-adapter-contract.test.ts +271 -0
  309. package/skills/llm-wiki-skill/packages/graph-engine/test/renderer-boundary.test.ts +618 -0
  310. package/skills/llm-wiki-skill/packages/graph-engine/test/renderer-lifecycle.test.ts +1711 -0
  311. package/skills/llm-wiki-skill/packages/graph-engine/test/route-continuity.test.ts +284 -0
  312. package/skills/llm-wiki-skill/packages/graph-engine/test/runtime-state.test.ts +281 -0
  313. package/skills/llm-wiki-skill/packages/graph-engine/test/search-and-legend.test.ts +124 -0
  314. package/skills/llm-wiki-skill/packages/graph-engine/test/select.test.ts +168 -0
  315. package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-coordinates.test.ts +50 -0
  316. package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-global-renderer.test.ts +2210 -0
  317. package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-trial-adapter.test.ts +82 -0
  318. package/skills/llm-wiki-skill/packages/graph-engine/test/sigma-trial-adapter.ts +271 -0
  319. package/skills/llm-wiki-skill/packages/graph-engine/test/sim.test.ts +207 -0
  320. package/skills/llm-wiki-skill/packages/graph-engine/test/simulation-bridge.test.ts +96 -0
  321. package/skills/llm-wiki-skill/packages/graph-engine/test/spatial-index.test.ts +222 -0
  322. package/skills/llm-wiki-skill/packages/graph-engine/test/state.test.ts +189 -0
  323. package/skills/llm-wiki-skill/packages/graph-engine/test/summary-contract.test.ts +422 -0
  324. package/skills/llm-wiki-skill/packages/graph-engine/test/themes.test.ts +62 -0
  325. package/skills/llm-wiki-skill/packages/graph-engine/test/toolbar.test.ts +64 -0
  326. package/skills/llm-wiki-skill/packages/graph-engine/test/viewport.test.ts +213 -0
  327. package/skills/llm-wiki-skill/packages/graph-engine/test/vis-network-trial-adapter.test.ts +82 -0
  328. package/skills/llm-wiki-skill/packages/graph-engine/test/vis-network-trial-adapter.ts +186 -0
  329. package/skills/llm-wiki-skill/packages/graph-engine/tsconfig.json +17 -0
  330. package/skills/llm-wiki-skill/packages/graph-engine/vite.config.ts +15 -0
  331. package/skills/llm-wiki-skill/platforms/claude/CLAUDE.md +37 -0
  332. package/skills/llm-wiki-skill/platforms/claude/companions/llm-wiki-upgrade/SKILL.md +95 -0
  333. package/skills/llm-wiki-skill/platforms/codex/AGENTS.md +23 -0
  334. package/skills/llm-wiki-skill/platforms/hermes/README.md +31 -0
  335. package/skills/llm-wiki-skill/platforms/openclaw/README.md +31 -0
  336. package/skills/llm-wiki-skill/scripts/adapter-state.sh +424 -0
  337. package/skills/llm-wiki-skill/scripts/build-graph-data.sh +395 -0
  338. package/skills/llm-wiki-skill/scripts/build-graph-html.sh +459 -0
  339. package/skills/llm-wiki-skill/scripts/cache.sh +352 -0
  340. package/skills/llm-wiki-skill/scripts/create-source-page.sh +100 -0
  341. package/skills/llm-wiki-skill/scripts/delete-helper.sh +68 -0
  342. package/skills/llm-wiki-skill/scripts/graph-analysis.js +732 -0
  343. package/skills/llm-wiki-skill/scripts/hook-session-start.sh +46 -0
  344. package/skills/llm-wiki-skill/scripts/init-wiki.sh +95 -0
  345. package/skills/llm-wiki-skill/scripts/lib/source-signal-eligibility.js +158 -0
  346. package/skills/llm-wiki-skill/scripts/lint-fix.sh +114 -0
  347. package/skills/llm-wiki-skill/scripts/lint-runner.sh +217 -0
  348. package/skills/llm-wiki-skill/scripts/runtime-context.sh +77 -0
  349. package/skills/llm-wiki-skill/scripts/shared-config.sh +83 -0
  350. package/skills/llm-wiki-skill/scripts/source-record-contract.tsv +10 -0
  351. package/skills/llm-wiki-skill/scripts/source-registry.sh +349 -0
  352. package/skills/llm-wiki-skill/scripts/source-registry.tsv +10 -0
  353. package/skills/llm-wiki-skill/scripts/source-signal-coverage.js +83 -0
  354. package/skills/llm-wiki-skill/scripts/validate-step1.sh +144 -0
  355. package/skills/llm-wiki-skill/scripts/wiki-compat.sh +267 -0
  356. package/skills/llm-wiki-skill/setup.sh +8 -0
  357. package/skills/llm-wiki-skill/templates/entity-template.md +30 -0
  358. package/skills/llm-wiki-skill/templates/graph-styles/wash/footer.html +27 -0
  359. package/skills/llm-wiki-skill/templates/graph-styles/wash/graph-wash-helpers.js +1326 -0
  360. package/skills/llm-wiki-skill/templates/graph-styles/wash/graph-wash.js +1009 -0
  361. package/skills/llm-wiki-skill/templates/graph-styles/wash/header.html +2002 -0
  362. package/skills/llm-wiki-skill/templates/index-en-template.md +51 -0
  363. package/skills/llm-wiki-skill/templates/index-template.md +51 -0
  364. package/skills/llm-wiki-skill/templates/log-en-template.md +11 -0
  365. package/skills/llm-wiki-skill/templates/log-template.md +11 -0
  366. package/skills/llm-wiki-skill/templates/overview-en-template.md +41 -0
  367. package/skills/llm-wiki-skill/templates/overview-template.md +41 -0
  368. package/skills/llm-wiki-skill/templates/purpose-en-template.md +16 -0
  369. package/skills/llm-wiki-skill/templates/purpose-template.md +16 -0
  370. package/skills/llm-wiki-skill/templates/query-template.md +19 -0
  371. package/skills/llm-wiki-skill/templates/schema-template.md +185 -0
  372. package/skills/llm-wiki-skill/templates/source-template.md +51 -0
  373. package/skills/llm-wiki-skill/templates/synthesis-template.md +25 -0
  374. package/skills/llm-wiki-skill/templates/topic-template.md +35 -0
  375. package/skills/llm-wiki-skill/tests/adapter-state.sh +338 -0
  376. package/skills/llm-wiki-skill/tests/browser/graph-aggregation-fallback-trial.ts +737 -0
  377. package/skills/llm-wiki-skill/tests/browser/graph-community-node-map.mjs +255 -0
  378. package/skills/llm-wiki-skill/tests/browser/graph-community-wash-interactions.mjs +170 -0
  379. package/skills/llm-wiki-skill/tests/browser/graph-default-behavior.mjs +630 -0
  380. package/skills/llm-wiki-skill/tests/browser/graph-density-preview.mjs +53 -0
  381. package/skills/llm-wiki-skill/tests/browser/graph-html-insights.mjs +41 -0
  382. package/skills/llm-wiki-skill/tests/browser/graph-large-performance.ts +689 -0
  383. package/skills/llm-wiki-skill/tests/browser/graph-node-slim.mjs +75 -0
  384. package/skills/llm-wiki-skill/tests/browser/graph-offline-phase-6.mjs +660 -0
  385. package/skills/llm-wiki-skill/tests/browser/graph-renderer-trial-shared.ts +291 -0
  386. package/skills/llm-wiki-skill/tests/browser/graph-sigma-global-production.ts +1437 -0
  387. package/skills/llm-wiki-skill/tests/browser/graph-sigma-graphology-trial.ts +949 -0
  388. package/skills/llm-wiki-skill/tests/browser/graph-stage-4-5.mjs +815 -0
  389. package/skills/llm-wiki-skill/tests/browser/graph-vis-network-trial.ts +762 -0
  390. package/skills/llm-wiki-skill/tests/browser/graph-workbench-interactions.mjs +730 -0
  391. package/skills/llm-wiki-skill/tests/browser/validate-graph-trial-result.mjs +149 -0
  392. package/skills/llm-wiki-skill/tests/expected/graph-data-empty.json +60 -0
  393. package/skills/llm-wiki-skill/tests/expected/graph-data-sample.json +396 -0
  394. package/skills/llm-wiki-skill/tests/expected/graph-interactive-basic.html +1736 -0
  395. package/skills/llm-wiki-skill/tests/expected/lint-output.txt +44 -0
  396. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/index.md +1 -0
  397. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Alpha.md +10 -0
  398. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Beta.md +7 -0
  399. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Delta.md +8 -0
  400. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/entities/Gamma.md +8 -0
  401. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/queries/20260422-abc.md +10 -0
  402. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/synthesis/Crystal.md +8 -0
  403. package/skills/llm-wiki-skill/tests/fixtures/coverage-sample-wiki/wiki/topics/Overview.md +9 -0
  404. package/skills/llm-wiki-skill/tests/fixtures/graph-data-empty-wiki/wiki/entities/.gitkeep +0 -0
  405. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/purpose.md +3 -0
  406. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Attention.md +7 -0
  407. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Decoder.md +7 -0
  408. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Encoder.md +7 -0
  409. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/GPT.md +7 -0
  410. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/entities/Transformer.md +13 -0
  411. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/sources/paper.md +9 -0
  412. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/topics/arch.md +12 -0
  413. package/skills/llm-wiki-skill/tests/fixtures/graph-data-sample-wiki/wiki/topics/finetune.md +9 -0
  414. package/skills/llm-wiki-skill/tests/fixtures/graph-interactive-basic/wiki/graph-data.json +40 -0
  415. package/skills/llm-wiki-skill/tests/fixtures/graph-interactive-dense/wiki/graph-data.json +3965 -0
  416. package/skills/llm-wiki-skill/tests/fixtures/graph-interactive-multicomm/wiki/graph-data.json +212 -0
  417. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/index.md +14 -0
  418. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/C++.md +6 -0
  419. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/Lonely.md +4 -0
  420. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/Other.md +8 -0
  421. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/entities/Real.md +7 -0
  422. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/sources/2026-01-01-test-source.md +15 -0
  423. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/sources/2026-02-01-inline-img.md +12 -0
  424. package/skills/llm-wiki-skill/tests/fixtures/lint-sample-wiki/wiki/topics/AIbasic.md +3 -0
  425. package/skills/llm-wiki-skill/tests/graph-aggregation-fallback-trial.regression-1.sh +46 -0
  426. package/skills/llm-wiki-skill/tests/graph-analysis-helper.regression-1.sh +237 -0
  427. package/skills/llm-wiki-skill/tests/graph-browser-large-performance.regression-1.sh +39 -0
  428. package/skills/llm-wiki-skill/tests/graph-browser-stage-4-5.regression-1.sh +163 -0
  429. package/skills/llm-wiki-skill/tests/graph-build-failures.regression-1.sh +91 -0
  430. package/skills/llm-wiki-skill/tests/graph-community-node-map.regression-1.sh +107 -0
  431. package/skills/llm-wiki-skill/tests/graph-community-wash-interactions.regression-1.sh +35 -0
  432. package/skills/llm-wiki-skill/tests/graph-data-confidence-merge.regression-1.sh +309 -0
  433. package/skills/llm-wiki-skill/tests/graph-data-source-paths.regression-1.sh +49 -0
  434. package/skills/llm-wiki-skill/tests/graph-default-behavior.regression-1.sh +35 -0
  435. package/skills/llm-wiki-skill/tests/graph-html-a11y.regression-1.sh +50 -0
  436. package/skills/llm-wiki-skill/tests/graph-html-brand-link.regression-1.sh +47 -0
  437. package/skills/llm-wiki-skill/tests/graph-html-density.regression-1.sh +228 -0
  438. package/skills/llm-wiki-skill/tests/graph-html-drawer-neighbors.regression-1.sh +47 -0
  439. package/skills/llm-wiki-skill/tests/graph-html-insights.regression-1.sh +80 -0
  440. package/skills/llm-wiki-skill/tests/graph-html-long-label.regression-1.sh +92 -0
  441. package/skills/llm-wiki-skill/tests/graph-html-minimap.regression-1.sh +51 -0
  442. package/skills/llm-wiki-skill/tests/graph-html-mobile.regression-1.sh +48 -0
  443. package/skills/llm-wiki-skill/tests/graph-html-oriental-atlas-contract.regression-1.sh +94 -0
  444. package/skills/llm-wiki-skill/tests/graph-html-oriental-design-contract.regression-1.sh +82 -0
  445. package/skills/llm-wiki-skill/tests/graph-html-search.regression-1.sh +52 -0
  446. package/skills/llm-wiki-skill/tests/graph-html-styles.regression-1.sh +66 -0
  447. package/skills/llm-wiki-skill/tests/graph-html-toolbar.regression-1.sh +62 -0
  448. package/skills/llm-wiki-skill/tests/graph-offline-phase-6.regression-1.sh +51 -0
  449. package/skills/llm-wiki-skill/tests/graph-sigma-global-production.regression-1.sh +64 -0
  450. package/skills/llm-wiki-skill/tests/graph-sigma-graphology-trial.regression-1.sh +46 -0
  451. package/skills/llm-wiki-skill/tests/graph-vis-network-trial.regression-1.sh +46 -0
  452. package/skills/llm-wiki-skill/tests/graph-workbench-interactions.regression-1.sh +151 -0
  453. package/skills/llm-wiki-skill/tests/js/graph-wash-bootstrap.test.js +110 -0
  454. package/skills/llm-wiki-skill/tests/js/graph-wash-helpers.test.js +296 -0
  455. package/skills/llm-wiki-skill/tests/js/graph-wash-learning.test.js +260 -0
  456. package/skills/llm-wiki-skill/tests/js/graph-wash-queue.test.js +115 -0
  457. package/skills/llm-wiki-skill/tests/js/graph-wash-runtime-state.test.js +282 -0
  458. package/skills/llm-wiki-skill/tests/js/source-signal-coverage.test.js +48 -0
  459. package/skills/llm-wiki-skill/tests/js/source-signal-eligibility.test.js +202 -0
  460. package/skills/llm-wiki-skill/tests/lib/graph-html-engine-helpers.sh +110 -0
  461. package/skills/llm-wiki-skill/tests/lint-output.regression-1.sh +32 -0
  462. package/skills/llm-wiki-skill/tests/regression.sh +1754 -0
  463. package/skills/llm-wiki-skill/workbench/AGENTS.md +110 -0
  464. package/skills/llm-wiki-skill/workbench/CLAUDE.md +55 -0
  465. package/skills/llm-wiki-skill/workbench/LICENSE +21 -0
  466. package/skills/llm-wiki-skill/workbench/PRODUCT.md +1353 -0
  467. package/skills/llm-wiki-skill/workbench/README.md +30 -0
  468. package/skills/llm-wiki-skill/workbench/docs/current-kb-retrieval-design.md +587 -0
  469. package/skills/llm-wiki-skill/workbench/docs/graph-evolution-1-design.md +210 -0
  470. package/skills/llm-wiki-skill/workbench/docs/stage-2-design.md +1139 -0
  471. package/skills/llm-wiki-skill/workbench/docs/stage-3-design.md +1269 -0
  472. package/skills/llm-wiki-skill/workbench/docs/stage-3.5-design.md +1164 -0
  473. package/skills/llm-wiki-skill/workbench/docs/stage-4-design.md +504 -0
  474. package/skills/llm-wiki-skill/workbench/docs/stage-4.5-design.md +195 -0
  475. package/skills/llm-wiki-skill/workbench/docs/superpowers/specs/2026-05-28-resizable-preview-layout-design.md +165 -0
  476. package/skills/llm-wiki-skill/workbench/docs/superpowers/specs/2026-05-28-settings-panel-scroll-fix.md +50 -0
  477. package/skills/llm-wiki-skill/workbench/server/package.json +31 -0
  478. package/skills/llm-wiki-skill/workbench/server/src/agent.ts +457 -0
  479. package/skills/llm-wiki-skill/workbench/server/src/artifacts.ts +248 -0
  480. package/skills/llm-wiki-skill/workbench/server/src/auth.ts +164 -0
  481. package/skills/llm-wiki-skill/workbench/server/src/config.ts +130 -0
  482. package/skills/llm-wiki-skill/workbench/server/src/conversations.test.ts +159 -0
  483. package/skills/llm-wiki-skill/workbench/server/src/conversations.ts +270 -0
  484. package/skills/llm-wiki-skill/workbench/server/src/digest/batch.ts +189 -0
  485. package/skills/llm-wiki-skill/workbench/server/src/digest/concurrency.test.ts +36 -0
  486. package/skills/llm-wiki-skill/workbench/server/src/digest/concurrency.ts +31 -0
  487. package/skills/llm-wiki-skill/workbench/server/src/digest/subagent.ts +91 -0
  488. package/skills/llm-wiki-skill/workbench/server/src/extensions/artifacts.ts +81 -0
  489. package/skills/llm-wiki-skill/workbench/server/src/extensions/knowledge-base.ts +263 -0
  490. package/skills/llm-wiki-skill/workbench/server/src/extensions/new-wiki.ts +42 -0
  491. package/skills/llm-wiki-skill/workbench/server/src/extensions/synthesis.ts +172 -0
  492. package/skills/llm-wiki-skill/workbench/server/src/graph-watcher.test.ts +196 -0
  493. package/skills/llm-wiki-skill/workbench/server/src/graph.test.ts +113 -0
  494. package/skills/llm-wiki-skill/workbench/server/src/graph.ts +351 -0
  495. package/skills/llm-wiki-skill/workbench/server/src/index.ts +1148 -0
  496. package/skills/llm-wiki-skill/workbench/server/src/knowledge-bases.test.ts +30 -0
  497. package/skills/llm-wiki-skill/workbench/server/src/knowledge-bases.ts +321 -0
  498. package/skills/llm-wiki-skill/workbench/server/src/pages.test.ts +41 -0
  499. package/skills/llm-wiki-skill/workbench/server/src/pages.ts +160 -0
  500. package/skills/llm-wiki-skill/workbench/server/src/retrieval.test.ts +151 -0
  501. package/skills/llm-wiki-skill/workbench/server/src/retrieval.ts +427 -0
  502. package/skills/llm-wiki-skill/workbench/server/src/tool-status-events.test.ts +363 -0
  503. package/skills/llm-wiki-skill/workbench/server/src/tool-status-events.ts +616 -0
  504. package/skills/llm-wiki-skill/workbench/server/src/wiki-init.test.ts +19 -0
  505. package/skills/llm-wiki-skill/workbench/server/src/wiki-init.ts +188 -0
  506. package/skills/llm-wiki-skill/workbench/server/tsconfig.json +10 -0
  507. package/skills/llm-wiki-skill/workbench/tsconfig.json +20 -0
  508. package/skills/llm-wiki-skill/workbench/web/README.md +73 -0
  509. package/skills/llm-wiki-skill/workbench/web/components.json +21 -0
  510. package/skills/llm-wiki-skill/workbench/web/eslint.config.js +22 -0
  511. package/skills/llm-wiki-skill/workbench/web/index.html +16 -0
  512. package/skills/llm-wiki-skill/workbench/web/package.json +54 -0
  513. package/skills/llm-wiki-skill/workbench/web/src/App.tsx +1195 -0
  514. package/skills/llm-wiki-skill/workbench/web/src/components/AddExternalDialog.tsx +375 -0
  515. package/skills/llm-wiki-skill/workbench/web/src/components/AppearancePanel.tsx +158 -0
  516. package/skills/llm-wiki-skill/workbench/web/src/components/ArtifactView.tsx +15 -0
  517. package/skills/llm-wiki-skill/workbench/web/src/components/BatchDigestPanel.tsx +117 -0
  518. package/skills/llm-wiki-skill/workbench/web/src/components/ChatPanel.tsx +890 -0
  519. package/skills/llm-wiki-skill/workbench/web/src/components/CommandMenu.tsx +75 -0
  520. package/skills/llm-wiki-skill/workbench/web/src/components/ExportButtons.tsx +58 -0
  521. package/skills/llm-wiki-skill/workbench/web/src/components/GraphPanel.tsx +800 -0
  522. package/skills/llm-wiki-skill/workbench/web/src/components/GraphReader.tsx +52 -0
  523. package/skills/llm-wiki-skill/workbench/web/src/components/GraphSelection.tsx +100 -0
  524. package/skills/llm-wiki-skill/workbench/web/src/components/GraphSummaryDrawer.tsx +269 -0
  525. package/skills/llm-wiki-skill/workbench/web/src/components/MainViewTabs.tsx +69 -0
  526. package/skills/llm-wiki-skill/workbench/web/src/components/MarkdownView.tsx +106 -0
  527. package/skills/llm-wiki-skill/workbench/web/src/components/NewWikiDialog.tsx +103 -0
  528. package/skills/llm-wiki-skill/workbench/web/src/components/RefMenu.tsx +44 -0
  529. package/skills/llm-wiki-skill/workbench/web/src/components/RightDrawer.tsx +298 -0
  530. package/skills/llm-wiki-skill/workbench/web/src/components/SearchPanel.tsx +165 -0
  531. package/skills/llm-wiki-skill/workbench/web/src/components/SettingsPanel.tsx +320 -0
  532. package/skills/llm-wiki-skill/workbench/web/src/components/Sidebar.tsx +354 -0
  533. package/skills/llm-wiki-skill/workbench/web/src/components/ToolHistorySummary.tsx +111 -0
  534. package/skills/llm-wiki-skill/workbench/web/src/components/ToolStatusRunway.tsx +70 -0
  535. package/skills/llm-wiki-skill/workbench/web/src/components/TopBar.tsx +348 -0
  536. package/skills/llm-wiki-skill/workbench/web/src/components/renderers/DownloadOnlyRenderer.tsx +88 -0
  537. package/skills/llm-wiki-skill/workbench/web/src/components/renderers/HtmlRenderer.tsx +92 -0
  538. package/skills/llm-wiki-skill/workbench/web/src/components/ui/button.tsx +52 -0
  539. package/skills/llm-wiki-skill/workbench/web/src/components/ui/command.tsx +50 -0
  540. package/skills/llm-wiki-skill/workbench/web/src/components/ui/dialog.tsx +156 -0
  541. package/skills/llm-wiki-skill/workbench/web/src/components/ui/input.tsx +21 -0
  542. package/skills/llm-wiki-skill/workbench/web/src/components/ui/tooltip.tsx +57 -0
  543. package/skills/llm-wiki-skill/workbench/web/src/index.css +4204 -0
  544. package/skills/llm-wiki-skill/workbench/web/src/lib/api.ts +648 -0
  545. package/skills/llm-wiki-skill/workbench/web/src/lib/appearance.ts +114 -0
  546. package/skills/llm-wiki-skill/workbench/web/src/lib/drawer-layout.ts +41 -0
  547. package/skills/llm-wiki-skill/workbench/web/src/lib/drawer-state.ts +168 -0
  548. package/skills/llm-wiki-skill/workbench/web/src/lib/graph-reader.ts +25 -0
  549. package/skills/llm-wiki-skill/workbench/web/src/lib/graph-selection-drawer.ts +35 -0
  550. package/skills/llm-wiki-skill/workbench/web/src/lib/graph-selection.ts +96 -0
  551. package/skills/llm-wiki-skill/workbench/web/src/lib/graph-summary-actions.ts +184 -0
  552. package/skills/llm-wiki-skill/workbench/web/src/lib/legacy-tool-status.ts +113 -0
  553. package/skills/llm-wiki-skill/workbench/web/src/lib/model-roles.ts +20 -0
  554. package/skills/llm-wiki-skill/workbench/web/src/lib/search-filter.ts +104 -0
  555. package/skills/llm-wiki-skill/workbench/web/src/lib/sse.ts +72 -0
  556. package/skills/llm-wiki-skill/workbench/web/src/lib/tool-status-format.ts +170 -0
  557. package/skills/llm-wiki-skill/workbench/web/src/lib/tool-status-model.ts +392 -0
  558. package/skills/llm-wiki-skill/workbench/web/src/lib/utils.ts +10 -0
  559. package/skills/llm-wiki-skill/workbench/web/src/lib/view-status.ts +16 -0
  560. package/skills/llm-wiki-skill/workbench/web/src/lib/wiki-links.ts +32 -0
  561. package/skills/llm-wiki-skill/workbench/web/src/main.tsx +10 -0
  562. package/skills/llm-wiki-skill/workbench/web/test/api.test.ts +61 -0
  563. package/skills/llm-wiki-skill/workbench/web/test/app-shell-drawer-layout.test.tsx +48 -0
  564. package/skills/llm-wiki-skill/workbench/web/test/appearance-panel.test.tsx +121 -0
  565. package/skills/llm-wiki-skill/workbench/web/test/appearance.test.ts +262 -0
  566. package/skills/llm-wiki-skill/workbench/web/test/chat-host-source.test.tsx +22 -0
  567. package/skills/llm-wiki-skill/workbench/web/test/chat-panel-auto-scroll.test.tsx +311 -0
  568. package/skills/llm-wiki-skill/workbench/web/test/chat-panel-bubbles.test.tsx +48 -0
  569. package/skills/llm-wiki-skill/workbench/web/test/chat-panel-composer.test.tsx +86 -0
  570. package/skills/llm-wiki-skill/workbench/web/test/chat-panel-tool-status.test.tsx +26 -0
  571. package/skills/llm-wiki-skill/workbench/web/test/export-batch-paper.test.tsx +101 -0
  572. package/skills/llm-wiki-skill/workbench/web/test/graph-drawer-state.test.ts +257 -0
  573. package/skills/llm-wiki-skill/workbench/web/test/graph-panel-paper.test.tsx +200 -0
  574. package/skills/llm-wiki-skill/workbench/web/test/graph-reader-request.test.ts +32 -0
  575. package/skills/llm-wiki-skill/workbench/web/test/graph-reader.test.ts +62 -0
  576. package/skills/llm-wiki-skill/workbench/web/test/graph-selection-drawer.test.ts +56 -0
  577. package/skills/llm-wiki-skill/workbench/web/test/graph-selection.test.ts +83 -0
  578. package/skills/llm-wiki-skill/workbench/web/test/graph-summary-actions.test.ts +188 -0
  579. package/skills/llm-wiki-skill/workbench/web/test/main-view-tabs.test.tsx +34 -0
  580. package/skills/llm-wiki-skill/workbench/web/test/markdown-view.test.tsx +34 -0
  581. package/skills/llm-wiki-skill/workbench/web/test/popup-menus.test.tsx +85 -0
  582. package/skills/llm-wiki-skill/workbench/web/test/render.test.tsx +30 -0
  583. package/skills/llm-wiki-skill/workbench/web/test/render.tsx +38 -0
  584. package/skills/llm-wiki-skill/workbench/web/test/right-drawer-graph-summary.test.tsx +287 -0
  585. package/skills/llm-wiki-skill/workbench/web/test/right-drawer-interactions.test.tsx +182 -0
  586. package/skills/llm-wiki-skill/workbench/web/test/search-filter.test.ts +65 -0
  587. package/skills/llm-wiki-skill/workbench/web/test/search-panel.test.tsx +155 -0
  588. package/skills/llm-wiki-skill/workbench/web/test/setup-dom.ts +66 -0
  589. package/skills/llm-wiki-skill/workbench/web/test/sidebar-v2-source.test.ts +17 -0
  590. package/skills/llm-wiki-skill/workbench/web/test/sidebar.test.tsx +110 -0
  591. package/skills/llm-wiki-skill/workbench/web/test/tool-history-summary.test.tsx +150 -0
  592. package/skills/llm-wiki-skill/workbench/web/test/tool-status-format.test.ts +107 -0
  593. package/skills/llm-wiki-skill/workbench/web/test/tool-status-model.test.ts +324 -0
  594. package/skills/llm-wiki-skill/workbench/web/test/tool-status-runway.test.ts +159 -0
  595. package/skills/llm-wiki-skill/workbench/web/test/topbar.test.tsx +248 -0
  596. package/skills/llm-wiki-skill/workbench/web/test/visual/paper-ui.ts +898 -0
  597. package/skills/llm-wiki-skill/workbench/web/test/wiki-links.test.ts +23 -0
  598. package/skills/llm-wiki-skill/workbench/web/test-results/paper-ui/actual/.gitkeep +1 -0
  599. package/skills/llm-wiki-skill/workbench/web/test-results/paper-ui/baseline/.gitkeep +1 -0
  600. package/skills/llm-wiki-skill/workbench/web/tsconfig.app.json +30 -0
  601. package/skills/llm-wiki-skill/workbench/web/tsconfig.json +7 -0
  602. package/skills/llm-wiki-skill/workbench/web/tsconfig.node.json +24 -0
  603. package/skills/llm-wiki-skill/workbench/web/vite.config.ts +28 -0
@@ -0,0 +1,4204 @@
1
+ @import "tailwindcss";
2
+ @import "tw-animate-css";
3
+
4
+ @custom-variant dark (&:is(.dark *));
5
+
6
+ :root,
7
+ [data-theme="light"] {
8
+ --background: var(--app-bg);
9
+ --foreground: var(--app-fg);
10
+ --card: var(--app-surface);
11
+ --card-foreground: var(--app-fg);
12
+ --popover: var(--app-surface);
13
+ --popover-foreground: var(--app-fg);
14
+ --primary: var(--app-accent);
15
+ --primary-foreground: #fffdf7;
16
+ --secondary: var(--app-raised);
17
+ --secondary-foreground: var(--app-fg);
18
+ --muted: var(--app-raised);
19
+ --muted-foreground: var(--app-muted);
20
+ --accent: var(--app-accent);
21
+ --accent-foreground: #fffdf7;
22
+ --destructive: var(--app-danger);
23
+ --destructive-foreground: #fffdf7;
24
+ --border: var(--app-border);
25
+ --input: var(--app-border);
26
+ --ring: var(--app-accent);
27
+ --radius: 0.5rem;
28
+
29
+ --font-sans: "Plus Jakarta Sans", -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", "Microsoft YaHei", system-ui, sans-serif;
30
+ --font-hand: "Caveat", "Plus Jakarta Sans", "PingFang SC", cursive;
31
+ --font-mono: "JetBrains Mono", "SF Mono", ui-monospace, Menlo, Consolas, monospace;
32
+ }
33
+
34
+ .dark,
35
+ [data-theme="dark"] {
36
+ --background: var(--app-bg);
37
+ --foreground: var(--app-fg);
38
+ --card: var(--app-surface);
39
+ --card-foreground: var(--app-fg);
40
+ --popover: var(--app-surface);
41
+ --popover-foreground: var(--app-fg);
42
+ --primary: var(--app-accent);
43
+ --primary-foreground: #fffdf7;
44
+ --secondary: var(--app-raised);
45
+ --secondary-foreground: var(--app-fg);
46
+ --muted: var(--app-raised);
47
+ --muted-foreground: var(--app-muted);
48
+ --accent: var(--app-accent);
49
+ --accent-foreground: #fffdf7;
50
+ --destructive: var(--app-danger);
51
+ --destructive-foreground: #fffdf7;
52
+ --border: var(--app-border);
53
+ --input: var(--app-border);
54
+ --ring: var(--app-accent);
55
+ }
56
+
57
+ /* 终端式光标闪烁:opacity 1→0 突变,1s 一次,比默认 animate-pulse 的渐变明显 */
58
+ @keyframes cursor-blink {
59
+ 0%, 49% { opacity: 1; }
60
+ 50%, 100% { opacity: 0; }
61
+ }
62
+
63
+ @theme inline {
64
+ --animate-cursor-blink: cursor-blink 1s steps(1) infinite;
65
+
66
+ --color-background: var(--background);
67
+ --color-foreground: var(--foreground);
68
+ --color-card: var(--card);
69
+ --color-card-foreground: var(--card-foreground);
70
+ --color-popover: var(--popover);
71
+ --color-popover-foreground: var(--popover-foreground);
72
+ --color-primary: var(--primary);
73
+ --color-primary-foreground: var(--primary-foreground);
74
+ --color-secondary: var(--secondary);
75
+ --color-secondary-foreground: var(--secondary-foreground);
76
+ --color-muted: var(--muted);
77
+ --color-muted-foreground: var(--muted-foreground);
78
+ --color-accent: var(--accent);
79
+ --color-accent-foreground: var(--accent-foreground);
80
+ --color-destructive: var(--destructive);
81
+ --color-destructive-foreground: var(--destructive-foreground);
82
+ --color-border: var(--border);
83
+ --color-input: var(--input);
84
+ --color-ring: var(--ring);
85
+ --radius-sm: calc(var(--radius) - 4px);
86
+ --radius-md: calc(var(--radius) - 2px);
87
+ --radius-lg: var(--radius);
88
+ --radius-xl: calc(var(--radius) + 4px);
89
+ }
90
+
91
+ @layer base {
92
+ * {
93
+ border-color: var(--border);
94
+ }
95
+ body {
96
+ background-color: var(--background);
97
+ color: var(--foreground);
98
+ font-family: var(--font-sans);
99
+ margin: 0;
100
+ height: 100vh;
101
+ overflow: hidden;
102
+ line-height: 1.5;
103
+ -webkit-font-smoothing: antialiased;
104
+ text-rendering: optimizeLegibility;
105
+ }
106
+ code, pre, kbd, samp {
107
+ font-family: var(--font-mono);
108
+ }
109
+ ::selection {
110
+ background: color-mix(in srgb, var(--app-accent) 22%, transparent);
111
+ }
112
+ *::-webkit-scrollbar {
113
+ width: 8px;
114
+ height: 8px;
115
+ }
116
+ *::-webkit-scrollbar-thumb {
117
+ border: 2px solid transparent;
118
+ border-radius: 999px;
119
+ background: var(--app-border-strong);
120
+ background-clip: padding-box;
121
+ }
122
+ *::-webkit-scrollbar-thumb:hover {
123
+ background: var(--app-faint);
124
+ background-clip: padding-box;
125
+ }
126
+ *::-webkit-scrollbar-track {
127
+ background: transparent;
128
+ }
129
+ }
130
+
131
+ @layer components {
132
+ .app-shell {
133
+ display: flex;
134
+ flex-direction: column;
135
+ position: relative;
136
+ width: 100vw;
137
+ height: 100vh;
138
+ overflow: hidden;
139
+ background-color: var(--app-bg);
140
+ background-image: var(--paper-glow), var(--paper-vignette), var(--paper-mottle);
141
+ background-size: 100% 100%, 100% 100%, 620px 620px;
142
+ color: var(--app-fg);
143
+ }
144
+
145
+ .app-body {
146
+ display: flex;
147
+ position: relative;
148
+ flex: 1;
149
+ min-height: 0;
150
+ width: 100%;
151
+ overflow: hidden;
152
+ }
153
+
154
+ .topbar {
155
+ min-height: 60px;
156
+ display: flex;
157
+ align-items: center;
158
+ justify-content: flex-start;
159
+ gap: 14px;
160
+ padding: 0 18px;
161
+ border-bottom: 1px solid var(--app-border);
162
+ background: color-mix(in srgb, var(--app-bg) 88%, var(--app-surface));
163
+ flex-shrink: 0;
164
+ z-index: 20;
165
+ }
166
+
167
+ .topbar-kb {
168
+ min-width: 180px;
169
+ max-width: min(36vw, 430px);
170
+ display: flex;
171
+ align-items: center;
172
+ gap: 10px;
173
+ padding: 6px 10px;
174
+ border-radius: 10px;
175
+ transition: background 0.12s;
176
+ }
177
+
178
+ .topbar-kb:hover {
179
+ background: var(--app-hover);
180
+ }
181
+
182
+ .topbar-kb-icon {
183
+ width: 30px;
184
+ height: 30px;
185
+ display: inline-grid;
186
+ place-items: center;
187
+ border: 1px solid var(--app-border);
188
+ border-radius: 8px;
189
+ background: var(--app-surface);
190
+ color: var(--app-muted);
191
+ box-shadow: 0 1px 2px rgba(70, 55, 40, 0.05);
192
+ flex-shrink: 0;
193
+ }
194
+
195
+ .topbar-kb-icon svg,
196
+ .topbar-actions svg {
197
+ width: 14px;
198
+ height: 14px;
199
+ }
200
+
201
+ .topbar-kb-icon-valid {
202
+ color: var(--app-accent-deep);
203
+ }
204
+
205
+ .topbar-kb-icon-invalid {
206
+ color: var(--app-danger);
207
+ }
208
+
209
+ .topbar-kb-copy {
210
+ min-width: 0;
211
+ display: grid;
212
+ gap: 2px;
213
+ }
214
+
215
+ .topbar-kb-name {
216
+ min-width: 0;
217
+ overflow: hidden;
218
+ color: var(--app-fg);
219
+ font-size: 15px;
220
+ font-weight: 750;
221
+ line-height: 1.1;
222
+ text-overflow: ellipsis;
223
+ white-space: nowrap;
224
+ }
225
+
226
+ .topbar-kb-meta {
227
+ display: flex;
228
+ align-items: center;
229
+ gap: 5px;
230
+ min-width: 0;
231
+ }
232
+
233
+ .topbar-kb-badge {
234
+ min-height: 18px;
235
+ display: inline-flex;
236
+ align-items: center;
237
+ gap: 4px;
238
+ padding: 1px 6px;
239
+ border: 1px solid color-mix(in srgb, var(--app-border) 78%, transparent);
240
+ border-radius: 7px;
241
+ background: color-mix(in srgb, var(--app-surface) 68%, transparent);
242
+ color: var(--app-muted);
243
+ font-size: 10px;
244
+ font-weight: 650;
245
+ white-space: nowrap;
246
+ }
247
+
248
+ .topbar-kb-badge svg {
249
+ width: 11px;
250
+ height: 11px;
251
+ }
252
+
253
+ .topbar-kb-badge-valid {
254
+ color: color-mix(in srgb, var(--app-success) 78%, var(--app-fg));
255
+ }
256
+
257
+ .topbar-kb-badge-invalid {
258
+ color: var(--app-danger);
259
+ }
260
+
261
+ .topbar-status {
262
+ min-width: 0;
263
+ display: flex;
264
+ align-items: center;
265
+ gap: 5px;
266
+ color: var(--app-muted);
267
+ }
268
+
269
+ .topbar-status-pill {
270
+ min-height: 24px;
271
+ max-width: 118px;
272
+ display: inline-flex;
273
+ align-items: center;
274
+ gap: 5px;
275
+ overflow: hidden;
276
+ padding: 0 6px;
277
+ border: 1px solid transparent;
278
+ border-radius: 7px;
279
+ background: transparent;
280
+ color: var(--app-muted);
281
+ font-size: 11px;
282
+ font-weight: 650;
283
+ white-space: nowrap;
284
+ }
285
+
286
+ .topbar-status-pill span:last-child {
287
+ overflow: hidden;
288
+ text-overflow: ellipsis;
289
+ }
290
+
291
+ .topbar-status-dot {
292
+ width: 7px;
293
+ height: 7px;
294
+ border-radius: 50%;
295
+ background: var(--app-faint);
296
+ flex-shrink: 0;
297
+ }
298
+
299
+ .topbar-status-pill-busy {
300
+ color: color-mix(in srgb, var(--app-warn) 78%, var(--app-fg));
301
+ }
302
+
303
+ .topbar-status-pill-busy .topbar-status-dot {
304
+ background: var(--app-warn);
305
+ box-shadow: 0 0 0 4px color-mix(in srgb, var(--app-warn) 18%, transparent);
306
+ }
307
+
308
+ .topbar-status-pill-ready {
309
+ color: color-mix(in srgb, var(--app-success) 78%, var(--app-fg));
310
+ }
311
+
312
+ .topbar-status-pill-ready .topbar-status-dot {
313
+ background: var(--app-success);
314
+ }
315
+
316
+ .topbar-status-pill-error {
317
+ color: var(--app-danger);
318
+ }
319
+
320
+ .topbar-status-pill-error .topbar-status-dot {
321
+ background: var(--app-danger);
322
+ }
323
+
324
+ .topbar-actions {
325
+ display: flex;
326
+ align-items: center;
327
+ justify-content: flex-end;
328
+ gap: 8px;
329
+ margin-left: auto;
330
+ flex-shrink: 0;
331
+ }
332
+
333
+ .topbar-search,
334
+ .topbar-model,
335
+ .topbar-icon-action {
336
+ height: 34px;
337
+ display: inline-flex;
338
+ align-items: center;
339
+ justify-content: center;
340
+ gap: 6px;
341
+ border: 1px solid var(--app-border);
342
+ border-radius: 9px;
343
+ background: color-mix(in srgb, var(--app-surface) 84%, transparent);
344
+ color: var(--app-muted);
345
+ font-size: 13px;
346
+ font-weight: 650;
347
+ transition: background 0.14s, border-color 0.14s, color 0.14s, box-shadow 0.14s;
348
+ }
349
+
350
+ .topbar-search,
351
+ .topbar-model {
352
+ padding: 0 10px;
353
+ }
354
+
355
+ .topbar-model {
356
+ max-width: 250px;
357
+ }
358
+
359
+ .topbar-model-wrap {
360
+ position: relative;
361
+ display: inline-flex;
362
+ }
363
+
364
+ .topbar-model-active {
365
+ border-color: color-mix(in srgb, var(--app-accent) 48%, var(--app-border));
366
+ background: var(--app-accent-soft);
367
+ color: var(--app-accent-deep);
368
+ }
369
+
370
+ .topbar-model span {
371
+ min-width: 0;
372
+ overflow: hidden;
373
+ text-overflow: ellipsis;
374
+ white-space: nowrap;
375
+ }
376
+
377
+ .topbar-model-menu {
378
+ position: absolute;
379
+ top: calc(100% + 8px);
380
+ right: 0;
381
+ width: min(340px, calc(100vw - 28px));
382
+ display: grid;
383
+ gap: 4px;
384
+ padding: 6px;
385
+ border: 1px solid var(--app-border);
386
+ border-radius: 12px;
387
+ background: color-mix(in srgb, var(--app-surface) 94%, var(--app-bg));
388
+ box-shadow: var(--shadow-lg);
389
+ z-index: 80;
390
+ }
391
+
392
+ .topbar-model-option {
393
+ min-height: 34px;
394
+ display: grid;
395
+ grid-template-columns: minmax(0, 1fr) auto;
396
+ align-items: center;
397
+ gap: 10px;
398
+ padding: 7px 9px;
399
+ border-radius: 8px;
400
+ color: var(--app-fg);
401
+ font-size: 12px;
402
+ text-align: left;
403
+ }
404
+
405
+ .topbar-model-option:hover:not(:disabled),
406
+ .topbar-model-option-active {
407
+ background: var(--app-accent-soft);
408
+ color: var(--app-accent-deep);
409
+ }
410
+
411
+ .topbar-model-option:disabled {
412
+ cursor: not-allowed;
413
+ opacity: 0.5;
414
+ }
415
+
416
+ .topbar-model-option span:first-child {
417
+ min-width: 0;
418
+ overflow: hidden;
419
+ text-overflow: ellipsis;
420
+ white-space: nowrap;
421
+ }
422
+
423
+ .topbar-model-option-note {
424
+ color: var(--app-faint);
425
+ font-size: 10px;
426
+ font-weight: 700;
427
+ white-space: nowrap;
428
+ }
429
+
430
+ .topbar-model-state {
431
+ padding: 8px 9px;
432
+ color: var(--app-muted);
433
+ font-size: 12px;
434
+ }
435
+
436
+ .topbar-model-state-error {
437
+ color: var(--app-danger);
438
+ }
439
+
440
+ .topbar-icon-action {
441
+ width: 34px;
442
+ padding: 0;
443
+ }
444
+
445
+ .topbar-text-action {
446
+ width: auto;
447
+ padding: 0 12px;
448
+ }
449
+
450
+ .topbar-search:hover:not(:disabled),
451
+ .topbar-model:hover:not(:disabled),
452
+ .topbar-icon-action:hover:not(:disabled),
453
+ .topbar-icon-action-active {
454
+ border-color: color-mix(in srgb, var(--app-accent) 48%, var(--app-border));
455
+ background: var(--app-accent-soft);
456
+ color: var(--app-accent-deep);
457
+ box-shadow: 0 2px 6px color-mix(in srgb, var(--app-accent) 13%, transparent);
458
+ }
459
+
460
+ .topbar-search:disabled,
461
+ .topbar-model:disabled,
462
+ .topbar-icon-action:disabled {
463
+ cursor: not-allowed;
464
+ opacity: 0.45;
465
+ }
466
+
467
+ .topbar-search kbd {
468
+ min-width: 25px;
469
+ margin-left: 1px;
470
+ padding: 1px 4px;
471
+ border-radius: 4px;
472
+ background: var(--app-fg);
473
+ color: var(--app-bg);
474
+ font-family: var(--font-mono);
475
+ font-size: 9px;
476
+ font-weight: 700;
477
+ }
478
+
479
+ .search-overlay {
480
+ position: absolute;
481
+ inset: 0;
482
+ display: flex;
483
+ align-items: flex-start;
484
+ justify-content: center;
485
+ padding: 76px 18px 18px;
486
+ background:
487
+ radial-gradient(circle at 50% 0%, color-mix(in srgb, var(--app-accent) 12%, transparent), transparent 30%),
488
+ color-mix(in srgb, var(--app-bg) 36%, transparent);
489
+ backdrop-filter: blur(6px);
490
+ z-index: 90;
491
+ }
492
+
493
+ .search-panel {
494
+ width: min(680px, 100%);
495
+ max-height: min(680px, calc(100vh - 104px));
496
+ display: grid;
497
+ grid-template-rows: auto auto minmax(0, 1fr);
498
+ gap: 12px;
499
+ overflow: hidden;
500
+ padding: 14px;
501
+ border: 1px solid color-mix(in srgb, var(--app-border-strong) 78%, transparent);
502
+ border-radius: 16px;
503
+ background:
504
+ linear-gradient(180deg, color-mix(in srgb, var(--app-surface) 96%, transparent), color-mix(in srgb, var(--app-bg) 86%, var(--app-surface))),
505
+ var(--paper-grain);
506
+ background-size: auto, 180px 180px;
507
+ box-shadow: var(--shadow-lg);
508
+ color: var(--app-fg);
509
+ }
510
+
511
+ .search-panel-header {
512
+ display: flex;
513
+ align-items: flex-start;
514
+ justify-content: space-between;
515
+ gap: 14px;
516
+ }
517
+
518
+ .search-panel-title {
519
+ color: var(--app-fg);
520
+ font-size: 16px;
521
+ font-weight: 800;
522
+ line-height: 1.2;
523
+ }
524
+
525
+ .search-panel-subtitle {
526
+ margin-top: 3px;
527
+ color: var(--app-faint);
528
+ font-size: 11px;
529
+ font-weight: 700;
530
+ }
531
+
532
+ .search-input-wrap {
533
+ min-height: 42px;
534
+ display: grid;
535
+ grid-template-columns: auto minmax(0, 1fr) auto;
536
+ align-items: center;
537
+ gap: 9px;
538
+ padding: 0 11px;
539
+ border: 1px solid color-mix(in srgb, var(--app-accent) 28%, var(--app-border));
540
+ border-radius: 12px;
541
+ background: color-mix(in srgb, var(--app-surface) 82%, transparent);
542
+ box-shadow: inset 0 1px 0 color-mix(in srgb, white 32%, transparent);
543
+ color: var(--app-muted);
544
+ }
545
+
546
+ .search-input-wrap:focus-within {
547
+ border-color: color-mix(in srgb, var(--app-accent) 70%, var(--app-border));
548
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--app-accent) 14%, transparent), inset 0 1px 0 color-mix(in srgb, white 32%, transparent);
549
+ }
550
+
551
+ .search-input-wrap input {
552
+ min-width: 0;
553
+ height: 40px;
554
+ border: 0;
555
+ outline: 0;
556
+ background: transparent;
557
+ color: var(--app-fg);
558
+ font-size: 15px;
559
+ font-weight: 650;
560
+ }
561
+
562
+ .search-input-wrap input::placeholder {
563
+ color: var(--app-faint);
564
+ }
565
+
566
+ [data-hand="on"] .search-input-wrap input::placeholder {
567
+ font-family: var(--font-hand);
568
+ font-size: 18px;
569
+ font-weight: 600;
570
+ }
571
+
572
+ .search-input-wrap kbd {
573
+ padding: 2px 7px;
574
+ border: 1px solid var(--app-border);
575
+ border-radius: 999px;
576
+ background: color-mix(in srgb, var(--app-bg) 74%, var(--app-surface));
577
+ color: var(--app-faint);
578
+ font-family: var(--font-mono);
579
+ font-size: 10px;
580
+ font-weight: 800;
581
+ }
582
+
583
+ .search-panel-body {
584
+ min-height: 180px;
585
+ overflow: auto;
586
+ padding-right: 2px;
587
+ }
588
+
589
+ .search-results {
590
+ display: grid;
591
+ gap: 6px;
592
+ }
593
+
594
+ .search-result {
595
+ min-height: 54px;
596
+ display: grid;
597
+ grid-template-columns: minmax(0, 1fr) auto;
598
+ align-items: stretch;
599
+ gap: 6px;
600
+ padding: 5px;
601
+ border: 1px solid transparent;
602
+ border-radius: 12px;
603
+ background: color-mix(in srgb, var(--app-surface) 52%, transparent);
604
+ transition: background 0.14s, border-color 0.14s, box-shadow 0.14s, transform 0.14s;
605
+ }
606
+
607
+ .search-result:hover,
608
+ .search-result-selected {
609
+ border-color: color-mix(in srgb, var(--app-accent) 42%, var(--app-border));
610
+ background: var(--app-accent-soft);
611
+ box-shadow: 0 8px 24px color-mix(in srgb, var(--app-accent) 10%, transparent);
612
+ transform: translateY(-1px);
613
+ }
614
+
615
+ .search-result-main {
616
+ min-width: 0;
617
+ display: grid;
618
+ grid-template-columns: auto minmax(0, 1fr) auto;
619
+ align-items: center;
620
+ gap: 10px;
621
+ padding: 7px 8px;
622
+ border-radius: 9px;
623
+ color: inherit;
624
+ text-align: left;
625
+ }
626
+
627
+ .search-result-kind {
628
+ min-width: 42px;
629
+ padding: 3px 7px;
630
+ border: 1px solid color-mix(in srgb, var(--app-border) 78%, transparent);
631
+ border-radius: 999px;
632
+ background: color-mix(in srgb, var(--app-bg) 58%, transparent);
633
+ color: var(--app-muted);
634
+ font-size: 10px;
635
+ font-weight: 800;
636
+ text-align: center;
637
+ }
638
+
639
+ .search-result-copy {
640
+ min-width: 0;
641
+ display: grid;
642
+ gap: 2px;
643
+ }
644
+
645
+ .search-result-title,
646
+ .search-result-path {
647
+ min-width: 0;
648
+ overflow: hidden;
649
+ text-overflow: ellipsis;
650
+ white-space: nowrap;
651
+ }
652
+
653
+ .search-result-title {
654
+ color: var(--app-fg);
655
+ font-size: 13px;
656
+ font-weight: 750;
657
+ }
658
+
659
+ .search-result-path {
660
+ color: var(--app-faint);
661
+ font-family: var(--font-mono);
662
+ font-size: 11px;
663
+ }
664
+
665
+ .search-result-main svg {
666
+ color: var(--app-faint);
667
+ }
668
+
669
+ .search-insert-btn {
670
+ min-width: 74px;
671
+ display: inline-flex;
672
+ align-items: center;
673
+ justify-content: center;
674
+ gap: 5px;
675
+ padding: 0 10px;
676
+ border: 1px solid color-mix(in srgb, var(--app-accent) 34%, var(--app-border));
677
+ border-radius: 9px;
678
+ background: color-mix(in srgb, var(--app-surface) 70%, transparent);
679
+ color: var(--app-accent-deep);
680
+ font-size: 12px;
681
+ font-weight: 800;
682
+ }
683
+
684
+ .search-insert-btn:hover {
685
+ background: color-mix(in srgb, var(--app-accent) 16%, var(--app-surface));
686
+ }
687
+
688
+ .search-state {
689
+ min-height: 180px;
690
+ display: grid;
691
+ place-items: center;
692
+ padding: 18px;
693
+ border: 1px dashed color-mix(in srgb, var(--app-border) 82%, transparent);
694
+ border-radius: 12px;
695
+ background: color-mix(in srgb, var(--app-bg) 46%, transparent);
696
+ color: var(--app-muted);
697
+ font-size: 13px;
698
+ font-weight: 700;
699
+ text-align: center;
700
+ }
701
+
702
+ .search-state-error {
703
+ border-color: color-mix(in srgb, var(--app-danger) 46%, var(--app-border));
704
+ color: var(--app-danger);
705
+ }
706
+
707
+ .appearance-panel {
708
+ position: absolute;
709
+ top: 58px;
710
+ right: 14px;
711
+ width: min(306px, calc(100vw - 28px));
712
+ display: grid;
713
+ gap: 14px;
714
+ padding: 14px;
715
+ border: 1px solid color-mix(in srgb, var(--app-border-strong) 78%, transparent);
716
+ border-radius: 12px;
717
+ background:
718
+ linear-gradient(180deg, color-mix(in srgb, var(--app-surface) 96%, transparent), color-mix(in srgb, var(--app-bg) 88%, var(--app-surface))),
719
+ var(--paper-grain);
720
+ background-size: auto, 180px 180px;
721
+ box-shadow: var(--shadow-lg);
722
+ color: var(--app-fg);
723
+ z-index: 70;
724
+ }
725
+
726
+ .appearance-panel-header {
727
+ display: flex;
728
+ align-items: flex-start;
729
+ justify-content: space-between;
730
+ gap: 12px;
731
+ }
732
+
733
+ .appearance-panel-header h2 {
734
+ margin: 0;
735
+ color: var(--app-fg);
736
+ font-size: 14px;
737
+ font-weight: 750;
738
+ line-height: 1.2;
739
+ }
740
+
741
+ .appearance-panel-header p {
742
+ margin: 2px 0 0;
743
+ color: var(--app-faint);
744
+ font-size: 10px;
745
+ font-weight: 700;
746
+ text-transform: uppercase;
747
+ }
748
+
749
+ .appearance-close {
750
+ width: 28px;
751
+ height: 28px;
752
+ display: inline-grid;
753
+ place-items: center;
754
+ border: 1px solid var(--app-border);
755
+ border-radius: 999px;
756
+ background: color-mix(in srgb, var(--app-surface) 76%, transparent);
757
+ color: var(--app-muted);
758
+ transition: background 0.14s, border-color 0.14s, color 0.14s;
759
+ }
760
+
761
+ .appearance-close:hover {
762
+ border-color: color-mix(in srgb, var(--app-accent) 44%, var(--app-border));
763
+ background: var(--app-accent-soft);
764
+ color: var(--app-accent-deep);
765
+ }
766
+
767
+ .appearance-close svg {
768
+ width: 14px;
769
+ height: 14px;
770
+ }
771
+
772
+ .appearance-group {
773
+ display: grid;
774
+ gap: 7px;
775
+ }
776
+
777
+ .appearance-label {
778
+ color: var(--app-muted);
779
+ font-size: 11px;
780
+ font-weight: 750;
781
+ }
782
+
783
+ .appearance-segmented {
784
+ display: grid;
785
+ grid-auto-flow: column;
786
+ grid-auto-columns: 1fr;
787
+ gap: 4px;
788
+ padding: 4px;
789
+ border: 1px solid color-mix(in srgb, var(--app-border) 88%, transparent);
790
+ border-radius: 10px;
791
+ background: color-mix(in srgb, var(--app-bg) 76%, transparent);
792
+ }
793
+
794
+ .appearance-segment {
795
+ min-width: 0;
796
+ min-height: 29px;
797
+ overflow: hidden;
798
+ padding: 0 8px;
799
+ border-radius: 8px;
800
+ color: var(--app-muted);
801
+ font-size: 12px;
802
+ font-weight: 700;
803
+ text-overflow: ellipsis;
804
+ white-space: nowrap;
805
+ transition: background 0.14s, color 0.14s, box-shadow 0.14s;
806
+ }
807
+
808
+ .appearance-segment:hover,
809
+ .appearance-segment-active {
810
+ background: var(--app-surface);
811
+ color: var(--app-accent-deep);
812
+ box-shadow: 0 1px 0 color-mix(in srgb, white 40%, transparent), 0 5px 14px color-mix(in srgb, var(--app-accent) 8%, transparent);
813
+ }
814
+
815
+ .appearance-swatches {
816
+ display: grid;
817
+ grid-template-columns: repeat(4, 1fr);
818
+ gap: 8px;
819
+ }
820
+
821
+ .appearance-swatch {
822
+ height: 34px;
823
+ display: inline-grid;
824
+ place-items: center;
825
+ border: 1px solid color-mix(in srgb, var(--app-border) 76%, transparent);
826
+ border-radius: 10px;
827
+ color: #fffdf7;
828
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.34), 0 5px 14px rgba(70, 55, 40, 0.08);
829
+ transition: transform 0.14s, box-shadow 0.14s, border-color 0.14s;
830
+ }
831
+
832
+ .appearance-swatch:hover,
833
+ .appearance-swatch-active {
834
+ transform: translateY(-1px);
835
+ border-color: color-mix(in srgb, var(--app-fg) 28%, transparent);
836
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.38), 0 9px 22px rgba(70, 55, 40, 0.16);
837
+ }
838
+
839
+ .appearance-swatch svg {
840
+ width: 15px;
841
+ height: 15px;
842
+ filter: drop-shadow(0 1px 2px rgba(50, 36, 22, 0.22));
843
+ }
844
+
845
+ .appearance-swatch-terracotta {
846
+ background: #e07a5f;
847
+ }
848
+
849
+ .appearance-swatch-clay {
850
+ background: #cf6a48;
851
+ }
852
+
853
+ .appearance-swatch-amber {
854
+ background: #d6913f;
855
+ }
856
+
857
+ .appearance-swatch-rose {
858
+ background: #d36f72;
859
+ }
860
+
861
+ [data-paper="grid"] .app-shell {
862
+ background-image:
863
+ var(--paper-glow),
864
+ var(--paper-vignette),
865
+ radial-gradient(var(--dot) 1.3px, transparent 1.7px),
866
+ var(--paper-mottle);
867
+ background-size: 100% 100%, 100% 100%, 22px 22px, 620px 620px;
868
+ }
869
+
870
+ [data-paper="laid"] .app-shell {
871
+ background-image: var(--paper-glow), var(--paper-vignette), var(--paper-grain), var(--paper-mottle);
872
+ background-size: 100% 100%, 100% 100%, 180px 180px, 620px 620px;
873
+ }
874
+
875
+ .shell-sidebar {
876
+ position: relative;
877
+ width: 252px;
878
+ min-width: 252px;
879
+ height: 100%;
880
+ display: flex;
881
+ flex-direction: column;
882
+ background:
883
+ linear-gradient(180deg, color-mix(in srgb, var(--app-bg) 86%, var(--app-surface)), color-mix(in srgb, var(--app-surface) 72%, var(--app-bg))),
884
+ var(--paper-grain);
885
+ background-size: auto, 180px 180px;
886
+ border-right: 1px solid color-mix(in srgb, var(--app-border-strong) 74%, transparent);
887
+ box-shadow: 1px 0 0 color-mix(in srgb, white 26%, transparent);
888
+ user-select: none;
889
+ }
890
+
891
+ .shell-sidebar-collapsed {
892
+ width: 52px;
893
+ min-width: 52px;
894
+ }
895
+
896
+ .shell-main {
897
+ flex: 1;
898
+ min-width: 0;
899
+ height: 100%;
900
+ display: flex;
901
+ flex-direction: column;
902
+ overflow: hidden;
903
+ background: transparent;
904
+ transition: flex-basis 0.2s ease, width 0.2s ease;
905
+ }
906
+
907
+ .app-body[data-drawer-open="true"] .shell-main {
908
+ min-width: 0;
909
+ }
910
+
911
+ .main-view-tabs {
912
+ display: flex;
913
+ align-items: center;
914
+ gap: 2px;
915
+ flex-shrink: 0;
916
+ margin: 10px 22px 8px;
917
+ }
918
+
919
+ .main-view-tab {
920
+ position: relative;
921
+ display: inline-flex;
922
+ min-height: 34px;
923
+ align-items: center;
924
+ gap: 7px;
925
+ padding: 7px 14px;
926
+ border: 1px solid transparent;
927
+ border-radius: 8px;
928
+ color: var(--app-faint);
929
+ font-size: 13.5px;
930
+ font-weight: 600;
931
+ line-height: 1;
932
+ transition: background 0.14s ease, border-color 0.14s ease, box-shadow 0.14s ease, color 0.14s ease;
933
+ }
934
+
935
+ .main-view-tab svg {
936
+ width: 15px;
937
+ height: 15px;
938
+ stroke-width: 2;
939
+ }
940
+
941
+ .main-view-tab:hover {
942
+ color: var(--app-fg);
943
+ background: color-mix(in srgb, var(--app-surface) 62%, transparent);
944
+ }
945
+
946
+ .main-view-tab-active {
947
+ border-color: var(--app-border);
948
+ background: var(--app-surface);
949
+ color: var(--app-fg);
950
+ box-shadow: 0 1px 3px rgba(70, 55, 40, 0.08);
951
+ }
952
+
953
+ .main-view-tab-dot {
954
+ width: 7px;
955
+ height: 7px;
956
+ border-radius: 999px;
957
+ background: var(--app-accent);
958
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--app-accent) 16%, transparent);
959
+ }
960
+
961
+ .main-view-content {
962
+ flex: 1;
963
+ min-width: 0;
964
+ min-height: 0;
965
+ overflow: hidden;
966
+ }
967
+
968
+ .chat-host {
969
+ height: 100%;
970
+ min-height: 0;
971
+ }
972
+
973
+ .chat-host-hidden {
974
+ display: none;
975
+ }
976
+
977
+ .sidebar-header {
978
+ position: absolute;
979
+ top: 10px;
980
+ right: 10px;
981
+ z-index: 2;
982
+ display: flex;
983
+ align-items: center;
984
+ justify-content: flex-end;
985
+ padding: 0;
986
+ border-bottom: 0;
987
+ }
988
+
989
+ .sidebar-rail {
990
+ display: flex;
991
+ height: 100%;
992
+ flex-direction: column;
993
+ align-items: center;
994
+ gap: 6px;
995
+ padding: 10px 8px;
996
+ }
997
+
998
+ .sidebar-rail-btn {
999
+ width: 34px;
1000
+ height: 34px;
1001
+ display: inline-grid;
1002
+ position: relative;
1003
+ place-items: center;
1004
+ border: 1px solid transparent;
1005
+ border-radius: 9px;
1006
+ color: var(--app-muted);
1007
+ transition: color 0.12s, background 0.12s, border-color 0.12s, box-shadow 0.12s;
1008
+ }
1009
+
1010
+ .sidebar-rail-btn:hover {
1011
+ color: var(--app-fg);
1012
+ border-color: color-mix(in srgb, var(--app-border) 84%, transparent);
1013
+ background: color-mix(in srgb, var(--app-surface) 70%, transparent);
1014
+ }
1015
+
1016
+ .sidebar-rail-btn:disabled {
1017
+ cursor: not-allowed;
1018
+ opacity: 0.4;
1019
+ }
1020
+
1021
+ .sidebar-rail-btn-active {
1022
+ border-color: color-mix(in srgb, var(--app-accent) 34%, var(--app-border));
1023
+ color: var(--app-accent-deep);
1024
+ background: var(--app-accent-soft);
1025
+ box-shadow: 0 5px 14px color-mix(in srgb, var(--app-accent) 10%, transparent);
1026
+ }
1027
+
1028
+ .sidebar-rail-btn svg {
1029
+ width: 15px;
1030
+ height: 15px;
1031
+ }
1032
+
1033
+ .sidebar-rail-badge {
1034
+ position: absolute;
1035
+ top: 7px;
1036
+ right: 7px;
1037
+ width: 7px;
1038
+ height: 7px;
1039
+ border: 1px solid var(--app-bg);
1040
+ border-radius: 999px;
1041
+ background: var(--app-accent);
1042
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--app-accent) 18%, transparent);
1043
+ }
1044
+
1045
+ .sidebar-rail-separator {
1046
+ width: 24px;
1047
+ height: 1px;
1048
+ margin: 2px 0;
1049
+ background: var(--app-border);
1050
+ }
1051
+
1052
+ .sidebar-rail-spacer {
1053
+ flex: 1;
1054
+ }
1055
+
1056
+ .sidebar-brand {
1057
+ display: flex;
1058
+ align-items: center;
1059
+ gap: 7px;
1060
+ font-size: 13px;
1061
+ font-weight: 750;
1062
+ color: var(--app-fg);
1063
+ }
1064
+
1065
+ .sidebar-brand-dot {
1066
+ width: 7px;
1067
+ height: 7px;
1068
+ border-radius: 999px;
1069
+ background: var(--app-accent);
1070
+ box-shadow: 0 0 0 4px color-mix(in srgb, var(--app-accent) 14%, transparent);
1071
+ }
1072
+
1073
+ .icon-btn {
1074
+ width: 28px;
1075
+ height: 28px;
1076
+ display: inline-grid;
1077
+ place-items: center;
1078
+ border: 1px solid transparent;
1079
+ border-radius: 9px;
1080
+ color: var(--app-muted);
1081
+ transition: color 0.12s, background 0.12s, border-color 0.12s;
1082
+ }
1083
+
1084
+ .icon-btn:hover {
1085
+ border-color: color-mix(in srgb, var(--app-border) 84%, transparent);
1086
+ color: var(--app-accent-deep);
1087
+ background: color-mix(in srgb, var(--app-surface) 70%, transparent);
1088
+ }
1089
+
1090
+ .icon-btn svg {
1091
+ width: 14px;
1092
+ height: 14px;
1093
+ }
1094
+
1095
+ .sidebar-body {
1096
+ flex: 1;
1097
+ overflow-y: auto;
1098
+ padding: 18px 10px 9px;
1099
+ display: flex;
1100
+ flex-direction: column;
1101
+ gap: 8px;
1102
+ }
1103
+
1104
+ .sidebar-section {
1105
+ display: grid;
1106
+ gap: 6px;
1107
+ }
1108
+
1109
+ .sidebar-section + .sidebar-section {
1110
+ margin-top: 16px;
1111
+ }
1112
+
1113
+ .sidebar-section-head {
1114
+ display: flex;
1115
+ min-height: 24px;
1116
+ align-items: center;
1117
+ justify-content: space-between;
1118
+ gap: 8px;
1119
+ }
1120
+
1121
+ .sidebar-section-label {
1122
+ padding: 4px 6px;
1123
+ color: var(--app-muted);
1124
+ font-size: 10px;
1125
+ font-weight: 650;
1126
+ letter-spacing: 0.06em;
1127
+ text-transform: uppercase;
1128
+ }
1129
+
1130
+ .sidebar-section-body {
1131
+ display: grid;
1132
+ gap: 3px;
1133
+ }
1134
+
1135
+ .section-action {
1136
+ display: inline-grid;
1137
+ width: 22px;
1138
+ height: 22px;
1139
+ place-items: center;
1140
+ border: 1px solid transparent;
1141
+ border-radius: 7px;
1142
+ color: var(--app-muted);
1143
+ }
1144
+
1145
+ .section-action:hover {
1146
+ border-color: var(--app-border);
1147
+ background: var(--app-surface);
1148
+ color: var(--app-accent-deep);
1149
+ }
1150
+
1151
+ .kb-row {
1152
+ display: flex;
1153
+ width: 100%;
1154
+ align-items: center;
1155
+ gap: 6px;
1156
+ min-height: 32px;
1157
+ padding: 6px 8px;
1158
+ border: 1px solid transparent;
1159
+ border-radius: 8px;
1160
+ color: var(--app-fg);
1161
+ cursor: pointer;
1162
+ transition: background 0.1s, border-color 0.1s, color 0.1s, box-shadow 0.1s;
1163
+ }
1164
+
1165
+ .kb-row:hover {
1166
+ border-color: color-mix(in srgb, var(--app-border) 78%, transparent);
1167
+ background: color-mix(in srgb, var(--app-surface) 66%, transparent);
1168
+ }
1169
+
1170
+ .kb-row-active {
1171
+ border-color: color-mix(in srgb, var(--app-accent) 28%, var(--app-border));
1172
+ background: var(--app-accent-soft);
1173
+ box-shadow: inset 2px 0 0 var(--app-accent), 0 5px 14px color-mix(in srgb, var(--app-accent) 8%, transparent);
1174
+ color: var(--app-accent-deep);
1175
+ }
1176
+
1177
+ .kb-row-disabled {
1178
+ opacity: 0.42;
1179
+ cursor: not-allowed;
1180
+ }
1181
+
1182
+ .kb-name {
1183
+ flex: 1;
1184
+ min-width: 0;
1185
+ overflow: hidden;
1186
+ text-overflow: ellipsis;
1187
+ white-space: nowrap;
1188
+ font-size: 13px;
1189
+ font-weight: 550;
1190
+ line-height: 1.3;
1191
+ }
1192
+
1193
+ .kb-badge {
1194
+ flex-shrink: 0;
1195
+ padding: 2px 6px;
1196
+ border-radius: 999px;
1197
+ border: 1px solid var(--app-border);
1198
+ background: var(--app-surface);
1199
+ color: var(--app-faint);
1200
+ font-size: 9px;
1201
+ font-weight: 700;
1202
+ letter-spacing: 0.03em;
1203
+ }
1204
+
1205
+ .kb-badge-external {
1206
+ background: color-mix(in srgb, var(--comm-seq) 35%, var(--app-surface));
1207
+ color: var(--app-muted);
1208
+ }
1209
+
1210
+ .kb-badge-invalid {
1211
+ background: color-mix(in srgb, var(--app-danger) 12%, var(--app-surface));
1212
+ color: var(--app-danger);
1213
+ }
1214
+
1215
+ .conv-row {
1216
+ width: 100%;
1217
+ text-align: left;
1218
+ border-radius: 8px;
1219
+ transition: background 0.1s, color 0.1s;
1220
+ }
1221
+
1222
+ .conv-row {
1223
+ display: flex;
1224
+ flex-direction: column;
1225
+ gap: 1px;
1226
+ margin: 1px 0;
1227
+ padding: 5px 10px;
1228
+ border: 1px solid transparent;
1229
+ }
1230
+
1231
+ .conv-row:hover {
1232
+ color: var(--app-fg);
1233
+ background: var(--app-hover);
1234
+ }
1235
+
1236
+ .conv-row-active {
1237
+ border-color: color-mix(in srgb, var(--app-accent) 24%, transparent);
1238
+ background: var(--app-accent-soft);
1239
+ color: var(--app-accent-deep);
1240
+ }
1241
+
1242
+ .conv-title {
1243
+ overflow: hidden;
1244
+ text-overflow: ellipsis;
1245
+ white-space: nowrap;
1246
+ color: var(--app-fg);
1247
+ font-size: 12px;
1248
+ line-height: 1.35;
1249
+ }
1250
+
1251
+ .conv-time {
1252
+ color: var(--app-muted);
1253
+ font-size: 10px;
1254
+ }
1255
+
1256
+ .sidebar-footer {
1257
+ flex-shrink: 0;
1258
+ display: flex;
1259
+ flex-direction: column;
1260
+ gap: 4px;
1261
+ padding: 9px;
1262
+ border-top: 1px solid color-mix(in srgb, var(--app-border) 82%, transparent);
1263
+ background: color-mix(in srgb, var(--app-bg) 54%, transparent);
1264
+ }
1265
+
1266
+ .sidebar-footer-v2 {
1267
+ gap: 5px;
1268
+ }
1269
+
1270
+ .sidebar-footer-btn {
1271
+ display: flex;
1272
+ align-items: center;
1273
+ gap: 7px;
1274
+ width: 100%;
1275
+ padding: 7px 10px;
1276
+ border: 1px solid transparent;
1277
+ border-radius: 8px;
1278
+ color: var(--app-muted);
1279
+ font-size: 12px;
1280
+ font-weight: 550;
1281
+ transition: background 0.12s, border-color 0.12s, color 0.12s, box-shadow 0.12s;
1282
+ }
1283
+
1284
+ .sidebar-footer-btn:hover {
1285
+ border-color: color-mix(in srgb, var(--app-border) 84%, transparent);
1286
+ color: var(--app-fg);
1287
+ background: color-mix(in srgb, var(--app-surface) 70%, transparent);
1288
+ }
1289
+
1290
+ .sidebar-footer-btn:disabled {
1291
+ cursor: not-allowed;
1292
+ opacity: 0.45;
1293
+ }
1294
+
1295
+ .sidebar-footer-btn-active {
1296
+ border-color: color-mix(in srgb, var(--app-accent) 28%, var(--app-border));
1297
+ background: var(--app-accent-soft);
1298
+ color: var(--app-accent-deep);
1299
+ }
1300
+
1301
+ .sidebar-footer-btn-primary {
1302
+ color: var(--app-accent-deep);
1303
+ }
1304
+
1305
+ .sidebar-footer-btn-primary:hover {
1306
+ background: var(--app-accent-soft);
1307
+ box-shadow: 0 5px 14px color-mix(in srgb, var(--app-accent) 9%, transparent);
1308
+ }
1309
+
1310
+ .chat-screen {
1311
+ display: flex;
1312
+ flex-direction: column;
1313
+ height: 100%;
1314
+ background: transparent;
1315
+ }
1316
+
1317
+ .graph-update-dot {
1318
+ width: 7px;
1319
+ height: 7px;
1320
+ border-radius: 999px;
1321
+ background: var(--app-accent);
1322
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--app-accent) 16%, transparent);
1323
+ }
1324
+
1325
+ .graph-screen {
1326
+ display: flex;
1327
+ height: 100%;
1328
+ min-height: 0;
1329
+ min-width: 0;
1330
+ flex-direction: column;
1331
+ padding: 10px;
1332
+ background: color-mix(in srgb, var(--app-bg) 78%, transparent);
1333
+ }
1334
+
1335
+ .graph-shell {
1336
+ display: grid;
1337
+ grid-template-rows: auto minmax(0, 1fr);
1338
+ flex: 1;
1339
+ min-height: 0;
1340
+ min-width: 0;
1341
+ gap: 10px;
1342
+ }
1343
+
1344
+ .graph-shell-toolbar {
1345
+ position: relative;
1346
+ z-index: 1;
1347
+ display: flex;
1348
+ min-height: 44px;
1349
+ flex-shrink: 0;
1350
+ align-items: center;
1351
+ justify-content: space-between;
1352
+ gap: 12px;
1353
+ padding: 8px 10px;
1354
+ border: 1px solid color-mix(in srgb, var(--app-border-strong) 70%, transparent);
1355
+ border-radius: 11px;
1356
+ background:
1357
+ linear-gradient(180deg, color-mix(in srgb, var(--app-surface) 94%, transparent), color-mix(in srgb, var(--app-bg) 82%, var(--app-surface))),
1358
+ var(--paper-grain);
1359
+ background-size: auto, 180px 180px;
1360
+ box-shadow: var(--shadow);
1361
+ }
1362
+
1363
+ .graph-shell-toolbar-left,
1364
+ .graph-shell-toolbar-actions {
1365
+ display: inline-flex;
1366
+ min-width: 0;
1367
+ align-items: center;
1368
+ gap: 8px;
1369
+ }
1370
+
1371
+ .graph-shell-toolbar-left {
1372
+ flex: 1;
1373
+ }
1374
+
1375
+ .graph-shell-toolbar-actions {
1376
+ flex-shrink: 0;
1377
+ justify-content: flex-end;
1378
+ }
1379
+
1380
+ .graph-shell-toolbar-dot {
1381
+ width: 8px;
1382
+ height: 8px;
1383
+ flex-shrink: 0;
1384
+ border-radius: 50%;
1385
+ background: var(--app-success);
1386
+ box-shadow: 0 0 0 4px color-mix(in srgb, var(--app-success) 14%, transparent);
1387
+ }
1388
+
1389
+ .graph-shell-toolbar-dot-warn {
1390
+ background: var(--app-warn);
1391
+ box-shadow: 0 0 0 4px color-mix(in srgb, var(--app-warn) 14%, transparent);
1392
+ }
1393
+
1394
+ .graph-shell-toolbar-dot-error {
1395
+ background: var(--app-danger);
1396
+ box-shadow: 0 0 0 4px color-mix(in srgb, var(--app-danger) 14%, transparent);
1397
+ }
1398
+
1399
+ .graph-shell-toolbar-title {
1400
+ display: grid;
1401
+ min-width: 0;
1402
+ gap: 1px;
1403
+ }
1404
+
1405
+ .graph-shell-toolbar-title span {
1406
+ overflow: hidden;
1407
+ color: var(--app-fg);
1408
+ font-size: 14px;
1409
+ font-weight: 750;
1410
+ text-overflow: ellipsis;
1411
+ white-space: nowrap;
1412
+ }
1413
+
1414
+ .graph-shell-toolbar-title small {
1415
+ color: var(--app-muted);
1416
+ font-size: 10px;
1417
+ font-weight: 650;
1418
+ }
1419
+
1420
+ .graph-shell-toolbar-chip,
1421
+ .graph-shell-toolbar-button {
1422
+ display: inline-flex;
1423
+ min-height: 28px;
1424
+ align-items: center;
1425
+ justify-content: center;
1426
+ gap: 6px;
1427
+ padding: 5px 9px;
1428
+ border: 1px solid color-mix(in srgb, var(--app-accent) 26%, var(--app-border));
1429
+ border-radius: 8px;
1430
+ background: var(--app-accent-soft);
1431
+ color: var(--app-accent-deep);
1432
+ font-size: 11px;
1433
+ font-weight: 750;
1434
+ white-space: nowrap;
1435
+ }
1436
+
1437
+ .graph-shell-toolbar-chip-muted {
1438
+ border-color: color-mix(in srgb, var(--app-border) 82%, transparent);
1439
+ background: color-mix(in srgb, var(--app-surface) 70%, transparent);
1440
+ color: var(--app-muted);
1441
+ font-family: var(--font-mono);
1442
+ font-weight: 700;
1443
+ }
1444
+
1445
+ .graph-shell-toolbar-button {
1446
+ cursor: pointer;
1447
+ transition: transform 0.14s, border-color 0.14s, background 0.14s, color 0.14s;
1448
+ }
1449
+
1450
+ .graph-shell-toolbar-button:hover:not(:disabled) {
1451
+ transform: translateY(-1px);
1452
+ border-color: color-mix(in srgb, var(--app-accent) 58%, var(--app-border));
1453
+ background: color-mix(in srgb, var(--app-accent) 18%, var(--app-surface));
1454
+ }
1455
+
1456
+ .graph-shell-toolbar-button:disabled {
1457
+ cursor: not-allowed;
1458
+ opacity: 0.48;
1459
+ }
1460
+
1461
+ .graph-shell-toolbar-button svg {
1462
+ width: 14px;
1463
+ height: 14px;
1464
+ }
1465
+
1466
+ .graph-shell-toolbar-button[data-active="true"] {
1467
+ border-color: color-mix(in srgb, var(--app-accent) 62%, var(--app-border));
1468
+ background: color-mix(in srgb, var(--app-accent) 20%, var(--app-surface));
1469
+ color: var(--app-accent-deep);
1470
+ }
1471
+
1472
+ .graph-edge-tuning {
1473
+ position: relative;
1474
+ display: inline-flex;
1475
+ flex-shrink: 0;
1476
+ }
1477
+
1478
+ .graph-edge-tuning-panel {
1479
+ position: absolute;
1480
+ top: calc(100% + 8px);
1481
+ right: 0;
1482
+ z-index: 10;
1483
+ display: grid;
1484
+ width: min(220px, calc(100vw - 28px));
1485
+ gap: 8px;
1486
+ padding: 10px;
1487
+ border: 1px solid color-mix(in srgb, var(--app-border-strong) 68%, transparent);
1488
+ border-radius: 8px;
1489
+ background:
1490
+ linear-gradient(180deg, color-mix(in srgb, var(--app-surface) 96%, transparent), color-mix(in srgb, var(--app-bg) 88%, var(--app-surface))),
1491
+ var(--paper-grain);
1492
+ background-size: auto, 180px 180px;
1493
+ box-shadow: var(--shadow);
1494
+ }
1495
+
1496
+ .graph-edge-tuning-heading {
1497
+ display: flex;
1498
+ align-items: center;
1499
+ justify-content: space-between;
1500
+ color: var(--app-fg);
1501
+ font-size: 12px;
1502
+ font-weight: 750;
1503
+ }
1504
+
1505
+ .graph-edge-tuning-base {
1506
+ min-height: 28px;
1507
+ display: flex;
1508
+ align-items: center;
1509
+ padding: 5px 8px;
1510
+ border-radius: 8px;
1511
+ background: color-mix(in srgb, var(--app-surface) 72%, transparent);
1512
+ color: var(--app-muted);
1513
+ font-size: 11px;
1514
+ font-weight: 700;
1515
+ }
1516
+
1517
+ .graph-edge-tuning-toggle {
1518
+ display: flex;
1519
+ min-height: 44px;
1520
+ align-items: center;
1521
+ justify-content: space-between;
1522
+ gap: 10px;
1523
+ padding: 7px 8px;
1524
+ border-radius: 8px;
1525
+ color: var(--app-fg);
1526
+ font-size: 12px;
1527
+ font-weight: 700;
1528
+ }
1529
+
1530
+ .graph-edge-tuning-toggle:hover {
1531
+ background: color-mix(in srgb, var(--app-accent) 10%, transparent);
1532
+ }
1533
+
1534
+ .graph-edge-tuning-toggle input {
1535
+ order: 2;
1536
+ margin: 0;
1537
+ accent-color: var(--app-accent);
1538
+ }
1539
+
1540
+ .graph-shell-legend {
1541
+ display: flex;
1542
+ min-width: 0;
1543
+ align-items: center;
1544
+ gap: 12px;
1545
+ color: var(--app-muted);
1546
+ font-size: 11px;
1547
+ font-weight: 700;
1548
+ }
1549
+
1550
+ .graph-shell-legend span {
1551
+ display: inline-flex;
1552
+ align-items: center;
1553
+ gap: 5px;
1554
+ white-space: nowrap;
1555
+ }
1556
+
1557
+ .graph-shell-legend .graph-legend-dot {
1558
+ width: 8px;
1559
+ height: 8px;
1560
+ border-radius: 999px;
1561
+ background: var(--app-accent);
1562
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--app-accent) 14%, transparent);
1563
+ }
1564
+
1565
+ .graph-shell-legend .graph-legend-line {
1566
+ width: 16px;
1567
+ height: 1px;
1568
+ background: color-mix(in srgb, var(--app-fg) 46%, transparent);
1569
+ }
1570
+
1571
+ .graph-shell-legend .graph-legend-cloud {
1572
+ width: 14px;
1573
+ height: 8px;
1574
+ border-radius: 999px;
1575
+ background: color-mix(in srgb, var(--comm-seq) 42%, transparent);
1576
+ }
1577
+
1578
+ .graph-stage {
1579
+ position: relative;
1580
+ min-height: 0;
1581
+ min-width: 0;
1582
+ overflow: hidden;
1583
+ border: 1px solid color-mix(in srgb, var(--app-border-strong) 70%, transparent);
1584
+ border-radius: 16px;
1585
+ background:
1586
+ radial-gradient(circle at 18px 18px, var(--dot) 1px, transparent 1.25px),
1587
+ linear-gradient(180deg, color-mix(in srgb, var(--app-surface) 56%, transparent), color-mix(in srgb, var(--app-bg) 88%, transparent));
1588
+ background-size: 26px 26px, auto;
1589
+ box-shadow: inset 0 1px 0 color-mix(in srgb, white 24%, transparent);
1590
+ }
1591
+
1592
+ .graph-stage .graph-toolbar-actions,
1593
+ .graph-stage .graph-toolbar-panel,
1594
+ .graph-stage .graph-search-status {
1595
+ background: color-mix(in srgb, var(--app-surface) 88%, transparent);
1596
+ border-color: color-mix(in srgb, var(--app-border-strong) 82%, transparent);
1597
+ box-shadow: 0 12px 28px color-mix(in srgb, var(--app-fg) 10%, transparent);
1598
+ }
1599
+
1600
+ .graph-stage .graph-toolbar-button {
1601
+ color: color-mix(in srgb, var(--app-fg) 78%, var(--app-muted));
1602
+ font-weight: 760;
1603
+ }
1604
+
1605
+ .graph-stage .graph-toolbar-button:hover,
1606
+ .graph-stage .graph-toolbar-button[data-active="true"] {
1607
+ background: var(--app-accent-soft);
1608
+ color: var(--app-accent-deep);
1609
+ }
1610
+
1611
+ .graph-host {
1612
+ position: absolute;
1613
+ inset: 0;
1614
+ }
1615
+
1616
+ .graph-host-empty {
1617
+ opacity: 0.42;
1618
+ }
1619
+
1620
+ .graph-state {
1621
+ position: absolute;
1622
+ top: 50%;
1623
+ left: 50%;
1624
+ z-index: 6;
1625
+ width: min(360px, calc(100% - 48px));
1626
+ transform: translate(-50%, -50%);
1627
+ border: 1px solid var(--app-border);
1628
+ border-radius: 12px;
1629
+ background: color-mix(in srgb, var(--app-surface) 92%, transparent);
1630
+ padding: 18px;
1631
+ text-align: center;
1632
+ box-shadow: var(--shadow-lg);
1633
+ }
1634
+
1635
+ .graph-state-title {
1636
+ color: var(--app-fg);
1637
+ font-size: 15px;
1638
+ font-weight: 700;
1639
+ }
1640
+
1641
+ .graph-state-copy {
1642
+ margin-top: 7px;
1643
+ color: var(--app-muted);
1644
+ font-size: 12px;
1645
+ line-height: 1.55;
1646
+ }
1647
+
1648
+ .graph-metrics {
1649
+ position: absolute;
1650
+ left: 16px;
1651
+ bottom: 16px;
1652
+ z-index: 5;
1653
+ display: inline-flex;
1654
+ gap: 6px;
1655
+ padding: 6px 9px;
1656
+ border: 1px solid color-mix(in srgb, var(--app-border) 76%, transparent);
1657
+ border-radius: 999px;
1658
+ background: color-mix(in srgb, var(--app-surface) 82%, transparent);
1659
+ color: var(--app-muted);
1660
+ font-family: var(--font-mono);
1661
+ font-size: 11px;
1662
+ box-shadow: var(--shadow);
1663
+ }
1664
+
1665
+ .graph-growth-indicator {
1666
+ position: absolute;
1667
+ left: 16px;
1668
+ bottom: 52px;
1669
+ z-index: 5;
1670
+ border: 1px solid color-mix(in srgb, var(--app-accent) 30%, var(--app-border));
1671
+ border-radius: 999px;
1672
+ background: var(--app-accent-soft);
1673
+ padding: 6px 9px;
1674
+ color: var(--app-accent-deep);
1675
+ font-family: var(--font-mono);
1676
+ font-size: 11px;
1677
+ box-shadow: var(--shadow);
1678
+ }
1679
+
1680
+ .graph-toast {
1681
+ position: absolute;
1682
+ right: 16px;
1683
+ bottom: 16px;
1684
+ z-index: 7;
1685
+ display: inline-flex;
1686
+ align-items: center;
1687
+ gap: 10px;
1688
+ max-width: min(360px, calc(100% - 32px));
1689
+ padding: 8px 10px;
1690
+ border: 1px solid color-mix(in srgb, var(--app-border-strong) 70%, transparent);
1691
+ border-radius: 12px;
1692
+ background:
1693
+ linear-gradient(180deg, color-mix(in srgb, var(--app-surface) 94%, transparent), color-mix(in srgb, var(--app-bg) 82%, var(--app-surface))),
1694
+ var(--paper-grain);
1695
+ background-size: auto, 180px 180px;
1696
+ color: var(--app-fg);
1697
+ font-size: 12px;
1698
+ box-shadow: var(--shadow-lg);
1699
+ }
1700
+
1701
+ .graph-toast span {
1702
+ min-width: 0;
1703
+ overflow: hidden;
1704
+ text-overflow: ellipsis;
1705
+ white-space: nowrap;
1706
+ }
1707
+
1708
+ .graph-toast button {
1709
+ flex-shrink: 0;
1710
+ border-radius: 999px;
1711
+ padding: 4px 7px;
1712
+ color: var(--app-accent);
1713
+ font-weight: 650;
1714
+ }
1715
+
1716
+ .graph-toast button:hover {
1717
+ background: var(--app-accent-soft);
1718
+ }
1719
+
1720
+ .graph-selection-drawer {
1721
+ display: flex;
1722
+ flex-direction: column;
1723
+ gap: 12px;
1724
+ }
1725
+
1726
+ .graph-selection-head {
1727
+ display: flex;
1728
+ align-items: flex-start;
1729
+ justify-content: space-between;
1730
+ gap: 10px;
1731
+ }
1732
+
1733
+ .graph-selection-kicker {
1734
+ color: var(--app-muted);
1735
+ font-family: var(--font-mono);
1736
+ font-size: 10px;
1737
+ }
1738
+
1739
+ .graph-selection-hint {
1740
+ border: 1px solid var(--app-border);
1741
+ border-radius: 6px;
1742
+ background: var(--app-raised);
1743
+ padding: 8px 10px;
1744
+ color: var(--app-muted);
1745
+ font-size: 12px;
1746
+ }
1747
+
1748
+ .graph-selection-title {
1749
+ margin-top: 2px;
1750
+ overflow: hidden;
1751
+ color: var(--app-fg);
1752
+ font-size: 14px;
1753
+ font-weight: 700;
1754
+ line-height: 1.3;
1755
+ text-overflow: ellipsis;
1756
+ white-space: nowrap;
1757
+ }
1758
+
1759
+ .graph-selection-facts {
1760
+ display: grid;
1761
+ grid-template-columns: repeat(4, minmax(0, 1fr));
1762
+ gap: 6px;
1763
+ }
1764
+
1765
+ .graph-selection-fact {
1766
+ min-width: 0;
1767
+ border: 1px solid var(--app-border);
1768
+ border-radius: 6px;
1769
+ background: var(--app-raised);
1770
+ padding: 7px 6px;
1771
+ text-align: center;
1772
+ }
1773
+
1774
+ .graph-selection-fact strong {
1775
+ display: block;
1776
+ color: var(--app-fg);
1777
+ font-family: var(--font-mono);
1778
+ font-size: 15px;
1779
+ line-height: 1.1;
1780
+ }
1781
+
1782
+ .graph-selection-fact span {
1783
+ display: block;
1784
+ margin-top: 3px;
1785
+ color: var(--app-muted);
1786
+ font-size: 10px;
1787
+ }
1788
+
1789
+ .graph-selection-actions {
1790
+ display: flex;
1791
+ flex-wrap: wrap;
1792
+ gap: 6px;
1793
+ }
1794
+
1795
+ .graph-selection-action,
1796
+ .graph-selection-send,
1797
+ .graph-selection-secondary {
1798
+ display: inline-flex;
1799
+ min-width: 0;
1800
+ align-items: center;
1801
+ justify-content: center;
1802
+ gap: 5px;
1803
+ border-radius: 6px;
1804
+ font-size: 12px;
1805
+ font-weight: 650;
1806
+ line-height: 1.2;
1807
+ }
1808
+
1809
+ .graph-selection-action {
1810
+ flex: 1 1 calc(50% - 3px);
1811
+ min-height: 30px;
1812
+ border: 1px solid var(--app-border);
1813
+ background: var(--app-raised);
1814
+ padding: 6px 8px;
1815
+ color: var(--app-fg);
1816
+ }
1817
+
1818
+ .graph-selection-action-muted {
1819
+ color: var(--app-muted);
1820
+ }
1821
+
1822
+ .graph-selection-action:hover:not(:disabled),
1823
+ .graph-selection-secondary:hover:not(:disabled) {
1824
+ border-color: var(--app-muted);
1825
+ background: var(--app-fg-soft);
1826
+ }
1827
+
1828
+ .graph-selection-action:disabled,
1829
+ .graph-selection-send:disabled,
1830
+ .graph-selection-secondary:disabled {
1831
+ cursor: not-allowed;
1832
+ opacity: 0.4;
1833
+ }
1834
+
1835
+ .graph-selection-action svg,
1836
+ .graph-selection-send svg,
1837
+ .graph-selection-secondary svg {
1838
+ width: 13px;
1839
+ height: 13px;
1840
+ flex-shrink: 0;
1841
+ }
1842
+
1843
+ .graph-selection-textarea {
1844
+ width: 100%;
1845
+ min-height: 72px;
1846
+ resize: vertical;
1847
+ border: 1px solid var(--app-border);
1848
+ border-radius: 8px;
1849
+ background: var(--app-raised);
1850
+ padding: 8px 10px;
1851
+ color: var(--app-fg);
1852
+ font-size: 12px;
1853
+ line-height: 1.5;
1854
+ outline: none;
1855
+ }
1856
+
1857
+ .graph-selection-textarea:focus {
1858
+ border-color: var(--app-accent);
1859
+ }
1860
+
1861
+ .graph-selection-footer {
1862
+ display: grid;
1863
+ grid-template-columns: 1fr 1fr;
1864
+ gap: 6px;
1865
+ }
1866
+
1867
+ .graph-selection-send {
1868
+ min-height: 32px;
1869
+ background: var(--app-accent);
1870
+ padding: 7px 10px;
1871
+ color: white;
1872
+ }
1873
+
1874
+ .graph-selection-secondary {
1875
+ min-height: 32px;
1876
+ border: 1px solid var(--app-border);
1877
+ background: var(--app-raised);
1878
+ padding: 7px 10px;
1879
+ color: var(--app-muted);
1880
+ }
1881
+
1882
+ .chat-messages {
1883
+ flex: 1;
1884
+ overflow-y: auto;
1885
+ display: flex;
1886
+ flex-direction: column;
1887
+ gap: 24px;
1888
+ padding: 22px 28px 24px;
1889
+ }
1890
+
1891
+ [data-density="compact"] .chat-messages {
1892
+ gap: 16px;
1893
+ padding-top: 14px;
1894
+ padding-bottom: 16px;
1895
+ }
1896
+
1897
+ .chat-empty {
1898
+ flex: 1;
1899
+ display: flex;
1900
+ flex-direction: column;
1901
+ align-items: center;
1902
+ justify-content: center;
1903
+ gap: 12px;
1904
+ color: var(--app-muted);
1905
+ text-align: center;
1906
+ }
1907
+
1908
+ .chat-empty-title {
1909
+ color: var(--app-fg);
1910
+ font-size: 15px;
1911
+ font-weight: 550;
1912
+ }
1913
+
1914
+ .chat-empty-hint {
1915
+ max-width: 360px;
1916
+ font-size: 12px;
1917
+ line-height: 1.5;
1918
+ }
1919
+
1920
+ .msg-row {
1921
+ display: flex;
1922
+ width: min(78%, 760px);
1923
+ gap: 12px;
1924
+ animation: fadeIn 0.2s ease;
1925
+ }
1926
+
1927
+ .msg-row-user {
1928
+ align-self: flex-end;
1929
+ flex-direction: row-reverse;
1930
+ width: fit-content;
1931
+ max-width: min(72%, 680px);
1932
+ }
1933
+
1934
+ .msg-row-assistant {
1935
+ align-self: flex-start;
1936
+ max-width: min(82%, 800px);
1937
+ }
1938
+
1939
+ .msg-avatar {
1940
+ width: 34px;
1941
+ height: 34px;
1942
+ flex-shrink: 0;
1943
+ display: grid;
1944
+ place-items: center;
1945
+ margin-top: 20px;
1946
+ border: 1px solid var(--app-border);
1947
+ border-radius: 11px;
1948
+ font-size: 11px;
1949
+ font-weight: 760;
1950
+ letter-spacing: 0;
1951
+ }
1952
+
1953
+ .msg-avatar-user {
1954
+ border-color: transparent;
1955
+ background: var(--app-user);
1956
+ color: #fff;
1957
+ box-shadow: 0 2px 6px color-mix(in srgb, var(--app-accent) 28%, transparent);
1958
+ }
1959
+
1960
+ .msg-avatar-assistant {
1961
+ background: linear-gradient(155deg, var(--app-surface), color-mix(in srgb, var(--app-accent-soft) 76%, var(--app-bg)));
1962
+ color: var(--app-accent-deep);
1963
+ box-shadow: var(--shadow);
1964
+ }
1965
+
1966
+ .msg-body {
1967
+ min-width: 0;
1968
+ display: flex;
1969
+ flex-direction: column;
1970
+ align-items: flex-start;
1971
+ }
1972
+
1973
+ .msg-row-user .msg-body {
1974
+ align-items: flex-end;
1975
+ }
1976
+
1977
+ .msg-role {
1978
+ margin-bottom: 5px;
1979
+ padding: 0 3px;
1980
+ color: var(--app-muted);
1981
+ font-size: 10.5px;
1982
+ font-weight: 720;
1983
+ line-height: 1;
1984
+ text-transform: uppercase;
1985
+ }
1986
+
1987
+ .msg-content {
1988
+ color: var(--app-fg);
1989
+ border: 1px solid transparent;
1990
+ padding: 13px 17px;
1991
+ font-size: 14px;
1992
+ line-height: 1.72;
1993
+ word-break: break-word;
1994
+ overflow-wrap: anywhere;
1995
+ }
1996
+
1997
+ [data-userbubble="solid"] .msg-row-user .msg-content {
1998
+ border-color: transparent;
1999
+ background: var(--app-user);
2000
+ color: #fff;
2001
+ box-shadow: 0 2px 7px color-mix(in srgb, var(--app-accent) 26%, transparent);
2002
+ }
2003
+
2004
+ [data-density="compact"] .msg-avatar {
2005
+ width: 30px;
2006
+ height: 30px;
2007
+ margin-top: 18px;
2008
+ border-radius: 10px;
2009
+ font-size: 10px;
2010
+ }
2011
+
2012
+ [data-density="compact"] .msg-role {
2013
+ margin-bottom: 4px;
2014
+ font-size: 10px;
2015
+ }
2016
+
2017
+ [data-density="compact"] .msg-content {
2018
+ padding: 10px 14px;
2019
+ font-size: 13.5px;
2020
+ line-height: 1.62;
2021
+ }
2022
+
2023
+ .msg-content code,
2024
+ .drawer-content code {
2025
+ border-radius: 5px;
2026
+ background: var(--app-raised);
2027
+ padding: 2px 5px;
2028
+ font-family: var(--font-mono);
2029
+ font-size: 12px;
2030
+ }
2031
+
2032
+ .msg-content pre,
2033
+ .drawer-content pre {
2034
+ overflow-x: auto;
2035
+ margin: 8px 0;
2036
+ padding: 12px 14px;
2037
+ border: 1px solid var(--app-border);
2038
+ border-radius: 10px;
2039
+ background: var(--app-raised);
2040
+ font-family: var(--font-mono);
2041
+ font-size: 12px;
2042
+ line-height: 1.45;
2043
+ }
2044
+
2045
+ .msg-content .at,
2046
+ .drawer-content .at {
2047
+ display: inline;
2048
+ border-radius: 5px;
2049
+ background: linear-gradient(180deg, transparent 52%, color-mix(in srgb, var(--app-accent) 20%, transparent) 52%);
2050
+ color: var(--app-accent-deep);
2051
+ font-weight: 650;
2052
+ text-decoration-line: underline;
2053
+ text-decoration-color: color-mix(in srgb, var(--app-accent) 42%, transparent);
2054
+ text-decoration-thickness: 1.5px;
2055
+ text-underline-offset: 4px;
2056
+ cursor: pointer;
2057
+ }
2058
+
2059
+ .msg-content .at:hover,
2060
+ .drawer-content .at:hover {
2061
+ background: linear-gradient(180deg, color-mix(in srgb, var(--app-accent) 8%, transparent), color-mix(in srgb, var(--app-accent) 24%, transparent));
2062
+ color: var(--app-accent);
2063
+ }
2064
+
2065
+ .msg-content .hl,
2066
+ .drawer-content .hl {
2067
+ border-radius: 5px;
2068
+ background: linear-gradient(180deg, transparent 18%, color-mix(in srgb, var(--comm-attn) 58%, transparent) 18%, color-mix(in srgb, var(--comm-attn) 64%, transparent) 88%, transparent 88%);
2069
+ padding: 0 2px;
2070
+ color: inherit;
2071
+ font-style: normal;
2072
+ box-decoration-break: clone;
2073
+ -webkit-box-decoration-break: clone;
2074
+ }
2075
+
2076
+ .msg-content table,
2077
+ .drawer-content table {
2078
+ width: 100%;
2079
+ margin: 8px 0;
2080
+ border-collapse: collapse;
2081
+ font-size: 12px;
2082
+ }
2083
+
2084
+ .msg-content th,
2085
+ .msg-content td,
2086
+ .drawer-content th,
2087
+ .drawer-content td {
2088
+ padding: 6px 10px;
2089
+ border-bottom: 1px solid var(--app-border);
2090
+ text-align: left;
2091
+ }
2092
+
2093
+ .msg-content th,
2094
+ .drawer-content th {
2095
+ color: var(--app-muted);
2096
+ font-family: var(--font-mono);
2097
+ font-size: 11px;
2098
+ font-weight: 550;
2099
+ }
2100
+
2101
+ .tool-runway {
2102
+ position: relative;
2103
+ display: flex;
2104
+ min-width: 0;
2105
+ max-width: min(560px, 100%);
2106
+ gap: 11px;
2107
+ margin: 2px 0 10px;
2108
+ padding: 7px 9px;
2109
+ overflow: hidden;
2110
+ border: 1px solid color-mix(in srgb, var(--tool-runway-color) 32%, var(--app-border));
2111
+ border-radius: 12px;
2112
+ background:
2113
+ linear-gradient(90deg, color-mix(in srgb, var(--tool-runway-color) 16%, transparent), transparent 68%),
2114
+ linear-gradient(180deg, color-mix(in srgb, var(--app-surface) 98%, transparent), color-mix(in srgb, var(--app-bg) 72%, var(--app-surface))),
2115
+ var(--paper-grain);
2116
+ color: var(--app-fg);
2117
+ box-shadow: 0 1px 2px rgba(70, 55, 40, 0.04), 0 8px 20px rgba(70, 55, 40, 0.055);
2118
+ }
2119
+
2120
+ .tool-runway::after {
2121
+ position: absolute;
2122
+ inset: 0;
2123
+ pointer-events: none;
2124
+ background: linear-gradient(90deg, transparent, color-mix(in srgb, var(--tool-runway-color) 10%, transparent), transparent);
2125
+ content: "";
2126
+ opacity: 0.42;
2127
+ }
2128
+
2129
+ .tool-runway-running {
2130
+ --tool-runway-color: var(--app-accent);
2131
+ }
2132
+
2133
+ .tool-runway-done {
2134
+ --tool-runway-color: var(--app-success);
2135
+ }
2136
+
2137
+ .tool-runway-failed {
2138
+ --tool-runway-color: var(--app-danger);
2139
+ }
2140
+
2141
+ .tool-runway-cancelled {
2142
+ --tool-runway-color: var(--app-muted);
2143
+ }
2144
+
2145
+ .tool-runway-pulse {
2146
+ position: relative;
2147
+ z-index: 1;
2148
+ width: 6px;
2149
+ border-radius: 999px;
2150
+ background: linear-gradient(180deg, color-mix(in srgb, var(--tool-runway-color) 64%, white), var(--tool-runway-color));
2151
+ flex: 0 0 auto;
2152
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--tool-runway-color) 12%, transparent);
2153
+ }
2154
+
2155
+ .tool-runway-running .tool-runway-pulse {
2156
+ animation: runway-pulse 1.1s ease-in-out infinite;
2157
+ }
2158
+
2159
+ .tool-runway-main {
2160
+ position: relative;
2161
+ z-index: 1;
2162
+ min-width: 0;
2163
+ flex: 1;
2164
+ }
2165
+
2166
+ .tool-runway-current {
2167
+ display: flex;
2168
+ min-width: 0;
2169
+ align-items: center;
2170
+ gap: 6px;
2171
+ font-size: 12px;
2172
+ white-space: nowrap;
2173
+ }
2174
+
2175
+ .tool-runway-status,
2176
+ .tool-runway-action {
2177
+ flex: 0 0 auto;
2178
+ font-weight: 720;
2179
+ }
2180
+
2181
+ .tool-runway-status {
2182
+ border-radius: 999px;
2183
+ background: color-mix(in srgb, var(--tool-runway-color) 14%, transparent);
2184
+ padding: 2px 7px;
2185
+ color: var(--tool-runway-color);
2186
+ }
2187
+
2188
+ .tool-runway-target,
2189
+ .tool-runway-meta {
2190
+ min-width: 0;
2191
+ overflow: hidden;
2192
+ color: var(--app-muted);
2193
+ text-overflow: ellipsis;
2194
+ white-space: nowrap;
2195
+ }
2196
+
2197
+ .tool-runway-target {
2198
+ flex: 1 1 auto;
2199
+ font-family: var(--font-mono);
2200
+ }
2201
+
2202
+ .tool-runway-meta {
2203
+ flex: 0 1 auto;
2204
+ }
2205
+
2206
+ .tool-history-summary {
2207
+ max-width: min(560px, 100%);
2208
+ margin: 8px 0 11px;
2209
+ overflow: hidden;
2210
+ border: 1px solid color-mix(in srgb, var(--app-border) 88%, transparent);
2211
+ border-radius: 12px;
2212
+ background:
2213
+ linear-gradient(180deg, color-mix(in srgb, var(--app-surface) 97%, transparent), color-mix(in srgb, var(--app-bg) 70%, var(--app-surface))),
2214
+ var(--paper-grain);
2215
+ box-shadow: 0 1px 2px rgba(70, 55, 40, 0.04), 0 8px 20px rgba(70, 55, 40, 0.05);
2216
+ }
2217
+
2218
+ .tool-history-header {
2219
+ display: flex;
2220
+ width: 100%;
2221
+ min-height: 30px;
2222
+ gap: 8px;
2223
+ align-items: center;
2224
+ border: 0;
2225
+ padding: 9px 11px;
2226
+ background: transparent;
2227
+ color: inherit;
2228
+ cursor: pointer;
2229
+ font: inherit;
2230
+ list-style: none;
2231
+ text-align: left;
2232
+ }
2233
+
2234
+ .tool-history-header::-webkit-details-marker {
2235
+ display: none;
2236
+ }
2237
+
2238
+ .tool-history-title {
2239
+ font-size: 12px;
2240
+ font-weight: 720;
2241
+ white-space: nowrap;
2242
+ }
2243
+
2244
+ .tool-history-title {
2245
+ color: var(--app-accent-deep);
2246
+ }
2247
+
2248
+ .tool-history-groups {
2249
+ display: flex;
2250
+ min-width: 0;
2251
+ flex-wrap: wrap;
2252
+ gap: 5px;
2253
+ }
2254
+
2255
+ .tool-history-group {
2256
+ min-width: 0;
2257
+ overflow: hidden;
2258
+ padding: 3px 7px;
2259
+ border-radius: 999px;
2260
+ border: 1px solid color-mix(in srgb, var(--app-border) 72%, transparent);
2261
+ background: color-mix(in srgb, var(--app-raised) 84%, var(--app-surface));
2262
+ color: var(--app-muted);
2263
+ font-size: 11px;
2264
+ text-overflow: ellipsis;
2265
+ white-space: nowrap;
2266
+ }
2267
+
2268
+ .tool-history-detail {
2269
+ display: grid;
2270
+ gap: 1px;
2271
+ padding: 0 10px 8px;
2272
+ }
2273
+
2274
+ .tool-history-row {
2275
+ display: grid;
2276
+ grid-template-columns: 44px 64px minmax(0, 1fr);
2277
+ gap: 8px;
2278
+ align-items: center;
2279
+ min-width: 0;
2280
+ padding: 6px 0;
2281
+ border-top: 1px solid color-mix(in srgb, var(--app-border) 76%, transparent);
2282
+ font-size: 11px;
2283
+ }
2284
+
2285
+ .tool-history-row-status,
2286
+ .tool-history-row-action {
2287
+ color: var(--app-muted);
2288
+ font-weight: 650;
2289
+ }
2290
+
2291
+ .tool-history-row-target,
2292
+ .tool-history-row-summary {
2293
+ min-width: 0;
2294
+ overflow: hidden;
2295
+ text-overflow: ellipsis;
2296
+ white-space: nowrap;
2297
+ }
2298
+
2299
+ .tool-history-row-target {
2300
+ font-family: var(--font-mono);
2301
+ }
2302
+
2303
+ .tool-history-row-summary {
2304
+ grid-column: 3;
2305
+ color: var(--app-muted);
2306
+ }
2307
+
2308
+ .tool-history-more {
2309
+ padding-top: 6px;
2310
+ border-top: 1px solid color-mix(in srgb, var(--app-border) 76%, transparent);
2311
+ color: var(--app-muted);
2312
+ font-size: 11px;
2313
+ }
2314
+
2315
+ .chat-input-area {
2316
+ position: relative;
2317
+ padding: 13px 16px 15px;
2318
+ border-top: 1px solid var(--app-border);
2319
+ background:
2320
+ linear-gradient(180deg, color-mix(in srgb, var(--app-bg) 82%, transparent), color-mix(in srgb, var(--app-surface) 74%, var(--app-bg))),
2321
+ var(--paper-grain);
2322
+ }
2323
+
2324
+ .chat-scroll-bottom {
2325
+ position: absolute;
2326
+ z-index: 20;
2327
+ top: -52px;
2328
+ left: 0;
2329
+ right: 0;
2330
+ display: flex;
2331
+ justify-content: center;
2332
+ pointer-events: none;
2333
+ }
2334
+
2335
+ .chat-scroll-bottom-btn {
2336
+ pointer-events: auto;
2337
+ display: grid;
2338
+ width: 34px;
2339
+ height: 34px;
2340
+ place-items: center;
2341
+ border: 1px solid color-mix(in srgb, var(--app-border) 86%, transparent);
2342
+ border-radius: 999px;
2343
+ background: color-mix(in srgb, var(--app-surface) 94%, var(--app-bg));
2344
+ color: var(--app-muted);
2345
+ box-shadow:
2346
+ 0 1px 2px rgba(70, 55, 40, 0.08),
2347
+ 0 10px 24px rgba(70, 55, 40, 0.12);
2348
+ transition: background 0.14s ease, border-color 0.14s ease, color 0.14s ease, transform 0.14s ease, box-shadow 0.14s ease;
2349
+ }
2350
+
2351
+ .chat-scroll-bottom-btn:hover {
2352
+ border-color: color-mix(in srgb, var(--app-accent) 42%, var(--app-border));
2353
+ background: color-mix(in srgb, var(--app-surface) 80%, var(--app-accent-soft));
2354
+ color: var(--app-fg);
2355
+ transform: translateY(-1px);
2356
+ box-shadow:
2357
+ 0 1px 2px rgba(70, 55, 40, 0.08),
2358
+ 0 12px 28px rgba(70, 55, 40, 0.14);
2359
+ }
2360
+
2361
+ .chat-scroll-bottom-btn:focus-visible {
2362
+ outline: 2px solid color-mix(in srgb, var(--app-accent) 62%, transparent);
2363
+ outline-offset: 3px;
2364
+ }
2365
+
2366
+ [data-density="compact"] .chat-scroll-bottom {
2367
+ top: -46px;
2368
+ }
2369
+
2370
+ .chat-input-hints {
2371
+ display: flex;
2372
+ align-items: center;
2373
+ flex-wrap: wrap;
2374
+ gap: 12px;
2375
+ margin-bottom: 8px;
2376
+ }
2377
+
2378
+ .chat-input-hint {
2379
+ display: inline-flex;
2380
+ align-items: center;
2381
+ gap: 4px;
2382
+ color: var(--app-muted);
2383
+ font-family: var(--font-mono);
2384
+ font-size: 11px;
2385
+ }
2386
+
2387
+ .chat-input-hint kbd {
2388
+ border: 1px solid var(--app-border);
2389
+ border-radius: 5px;
2390
+ background: var(--app-surface);
2391
+ padding: 1px 5px;
2392
+ color: var(--app-accent-deep);
2393
+ font-family: var(--font-mono);
2394
+ font-size: 10px;
2395
+ }
2396
+
2397
+ .chat-input-artifact {
2398
+ display: inline-flex;
2399
+ align-items: center;
2400
+ gap: 5px;
2401
+ min-height: 24px;
2402
+ padding: 3px 8px;
2403
+ border: 1px solid color-mix(in srgb, var(--app-accent) 24%, var(--app-border));
2404
+ border-radius: 8px;
2405
+ background: color-mix(in srgb, var(--app-accent-soft) 62%, transparent);
2406
+ color: var(--app-accent-deep);
2407
+ font-family: var(--font-mono);
2408
+ font-size: 11px;
2409
+ font-weight: 700;
2410
+ white-space: nowrap;
2411
+ transition: background 0.12s, border-color 0.12s, color 0.12s;
2412
+ }
2413
+
2414
+ .chat-input-artifact:hover {
2415
+ border-color: color-mix(in srgb, var(--app-accent) 52%, var(--app-border));
2416
+ background: var(--app-accent-soft);
2417
+ }
2418
+
2419
+ .input-chip {
2420
+ display: flex;
2421
+ max-width: 42rem;
2422
+ align-items: center;
2423
+ justify-content: space-between;
2424
+ gap: 12px;
2425
+ margin-bottom: 8px;
2426
+ padding: 7px 10px;
2427
+ border: 1px solid var(--app-border);
2428
+ border-radius: 10px;
2429
+ background: var(--app-surface);
2430
+ box-shadow: var(--shadow);
2431
+ color: var(--app-muted);
2432
+ font-size: 12px;
2433
+ }
2434
+
2435
+ .composer-card {
2436
+ position: relative;
2437
+ display: flex;
2438
+ align-items: flex-end;
2439
+ gap: 8px;
2440
+ overflow: visible;
2441
+ border: 1px solid color-mix(in srgb, var(--app-border) 90%, transparent);
2442
+ border-radius: 14px;
2443
+ background:
2444
+ linear-gradient(180deg, color-mix(in srgb, var(--app-surface) 98%, transparent), color-mix(in srgb, var(--app-bg) 68%, var(--app-surface))),
2445
+ var(--paper-grain);
2446
+ padding: 6px 7px 6px 15px;
2447
+ box-shadow: 0 1px 2px rgba(70, 55, 40, 0.04), 0 12px 28px rgba(70, 55, 40, 0.075);
2448
+ transition: border-color 0.15s, box-shadow 0.15s, background-color 0.15s;
2449
+ }
2450
+
2451
+ .composer-card:focus-within {
2452
+ border-color: color-mix(in srgb, var(--app-accent) 55%, var(--app-border));
2453
+ box-shadow:
2454
+ 0 1px 2px rgba(70, 55, 40, 0.04),
2455
+ 0 14px 34px rgba(70, 55, 40, 0.09),
2456
+ 0 0 0 4px color-mix(in srgb, var(--app-accent) 14%, transparent);
2457
+ }
2458
+
2459
+ .chat-textarea {
2460
+ flex: 1;
2461
+ width: 100%;
2462
+ min-height: 40px;
2463
+ max-height: 160px;
2464
+ resize: none;
2465
+ border: 0;
2466
+ background: transparent;
2467
+ padding: 9px 0;
2468
+ color: var(--app-fg);
2469
+ font-size: 14.5px;
2470
+ line-height: 1.55;
2471
+ outline: none;
2472
+ box-shadow: none;
2473
+ }
2474
+
2475
+ .chat-textarea:focus {
2476
+ box-shadow: none;
2477
+ }
2478
+
2479
+ .chat-textarea::placeholder {
2480
+ color: var(--app-faint);
2481
+ }
2482
+
2483
+ [data-hand="on"] .chat-textarea::placeholder {
2484
+ font-family: var(--font-hand);
2485
+ font-size: 17px;
2486
+ }
2487
+
2488
+ .composer-actions {
2489
+ display: inline-flex;
2490
+ align-items: center;
2491
+ gap: 8px;
2492
+ flex: 0 0 auto;
2493
+ }
2494
+
2495
+ .composer-status {
2496
+ max-width: 88px;
2497
+ overflow: hidden;
2498
+ color: var(--app-muted);
2499
+ font-size: 11px;
2500
+ text-overflow: ellipsis;
2501
+ white-space: nowrap;
2502
+ }
2503
+
2504
+ .composer-tools {
2505
+ display: flex;
2506
+ align-items: center;
2507
+ justify-content: flex-end;
2508
+ gap: 8px;
2509
+ margin-top: 8px;
2510
+ }
2511
+
2512
+ .export-bar {
2513
+ display: flex;
2514
+ align-items: center;
2515
+ flex-wrap: wrap;
2516
+ gap: 7px;
2517
+ margin-top: 0;
2518
+ border-top: 1px solid color-mix(in srgb, var(--app-border) 72%, transparent);
2519
+ background:
2520
+ linear-gradient(135deg, color-mix(in srgb, var(--app-accent-soft) 30%, transparent), color-mix(in srgb, var(--app-surface) 62%, transparent)),
2521
+ var(--paper-grain);
2522
+ background-size: auto, 180px 180px;
2523
+ box-shadow: none;
2524
+ padding: 7px 9px;
2525
+ }
2526
+
2527
+ .export-bar-head {
2528
+ display: flex;
2529
+ min-width: 112px;
2530
+ flex-direction: column;
2531
+ gap: 1px;
2532
+ padding: 0 4px 0 0;
2533
+ }
2534
+
2535
+ .export-label {
2536
+ color: var(--app-accent-deep);
2537
+ font-size: 12px;
2538
+ font-weight: 800;
2539
+ }
2540
+
2541
+ .export-hint {
2542
+ color: var(--app-muted);
2543
+ font-size: 10px;
2544
+ white-space: nowrap;
2545
+ }
2546
+
2547
+ .export-btn {
2548
+ display: inline-flex;
2549
+ align-items: center;
2550
+ gap: 5px;
2551
+ min-height: 32px;
2552
+ padding: 5px 10px;
2553
+ border: 1px solid color-mix(in srgb, var(--app-border) 86%, transparent);
2554
+ border-radius: 9px;
2555
+ background: color-mix(in srgb, var(--card) 84%, var(--app-accent-soft));
2556
+ color: var(--app-fg);
2557
+ font-size: 12px;
2558
+ font-weight: 650;
2559
+ box-shadow: inset 0 1px 0 color-mix(in srgb, white 38%, transparent);
2560
+ transition:
2561
+ border-color 0.12s ease,
2562
+ background 0.12s ease,
2563
+ color 0.12s ease,
2564
+ transform 0.12s ease,
2565
+ box-shadow 0.12s ease;
2566
+ }
2567
+
2568
+ .export-btn:hover {
2569
+ color: var(--app-accent-deep);
2570
+ border-color: color-mix(in srgb, var(--app-accent) 45%, var(--app-border));
2571
+ background: var(--app-accent-soft);
2572
+ transform: translateY(-1px);
2573
+ box-shadow: 0 6px 14px color-mix(in srgb, var(--app-accent) 16%, transparent);
2574
+ }
2575
+
2576
+ .export-btn:disabled {
2577
+ opacity: 0.45;
2578
+ cursor: not-allowed;
2579
+ transform: none;
2580
+ box-shadow: none;
2581
+ }
2582
+
2583
+ .send-btn {
2584
+ display: inline-flex;
2585
+ width: 36px;
2586
+ height: 36px;
2587
+ align-items: center;
2588
+ justify-content: center;
2589
+ gap: 6px;
2590
+ min-height: 36px;
2591
+ flex: 0 0 auto;
2592
+ padding: 0;
2593
+ border-radius: 10px;
2594
+ background: var(--app-accent);
2595
+ color: white;
2596
+ font-size: 13px;
2597
+ font-weight: 550;
2598
+ box-shadow: 0 2px 5px color-mix(in srgb, var(--app-accent) 28%, transparent);
2599
+ transition: opacity 0.12s, transform 0.12s, box-shadow 0.12s;
2600
+ }
2601
+
2602
+ .send-btn:hover {
2603
+ opacity: 0.88;
2604
+ transform: translateY(-1px);
2605
+ box-shadow: 0 4px 10px color-mix(in srgb, var(--app-accent) 32%, transparent);
2606
+ }
2607
+
2608
+ .send-btn:disabled {
2609
+ opacity: 0.35;
2610
+ cursor: not-allowed;
2611
+ }
2612
+
2613
+ .stop-btn {
2614
+ background: var(--app-danger);
2615
+ }
2616
+
2617
+ .composer-tools .export-bar {
2618
+ margin-left: auto;
2619
+ border: 1px solid color-mix(in srgb, var(--app-border) 72%, transparent);
2620
+ border-radius: 999px;
2621
+ background: color-mix(in srgb, var(--app-surface) 74%, transparent);
2622
+ padding: 5px 7px;
2623
+ }
2624
+
2625
+ .composer-tools .export-bar-head {
2626
+ min-width: auto;
2627
+ flex-direction: row;
2628
+ align-items: center;
2629
+ gap: 6px;
2630
+ }
2631
+
2632
+ .composer-tools .export-hint {
2633
+ display: none;
2634
+ }
2635
+
2636
+ .composer-tools .export-btn {
2637
+ min-height: 28px;
2638
+ padding: 4px 8px;
2639
+ border-radius: 999px;
2640
+ font-size: 11px;
2641
+ }
2642
+
2643
+ .popup-menu {
2644
+ position: absolute;
2645
+ right: 0;
2646
+ bottom: 100%;
2647
+ left: 0;
2648
+ z-index: 20;
2649
+ margin-bottom: 8px;
2650
+ max-height: min(320px, 48vh);
2651
+ overflow-y: auto;
2652
+ overscroll-behavior: contain;
2653
+ border: 1px solid color-mix(in srgb, var(--app-accent) 18%, var(--app-border));
2654
+ border-radius: 16px;
2655
+ background:
2656
+ linear-gradient(145deg, color-mix(in srgb, var(--card) 94%, var(--app-accent-soft)), var(--card)),
2657
+ var(--paper-grain);
2658
+ box-shadow: 0 18px 46px color-mix(in srgb, var(--app-shadow) 82%, transparent);
2659
+ padding: 7px;
2660
+ color: var(--app-fg);
2661
+ backdrop-filter: blur(10px);
2662
+ }
2663
+
2664
+ .popup-menu::before {
2665
+ content: "";
2666
+ position: sticky;
2667
+ top: 0;
2668
+ display: block;
2669
+ height: 0;
2670
+ pointer-events: none;
2671
+ box-shadow: 0 1px 0 color-mix(in srgb, var(--app-accent) 20%, transparent);
2672
+ }
2673
+
2674
+ .popup-group + .popup-group {
2675
+ margin-top: 5px;
2676
+ padding-top: 5px;
2677
+ border-top: 1px dashed color-mix(in srgb, var(--app-border) 78%, transparent);
2678
+ }
2679
+
2680
+ .popup-menu-heading {
2681
+ display: flex;
2682
+ align-items: center;
2683
+ gap: 7px;
2684
+ padding: 5px 7px 7px;
2685
+ color: var(--app-muted);
2686
+ font-size: 10px;
2687
+ font-weight: 700;
2688
+ letter-spacing: 0.04em;
2689
+ text-transform: uppercase;
2690
+ }
2691
+
2692
+ .popup-menu-symbol {
2693
+ display: inline-grid;
2694
+ width: 20px;
2695
+ height: 20px;
2696
+ place-items: center;
2697
+ border: 1px solid color-mix(in srgb, var(--app-accent) 26%, var(--app-border));
2698
+ border-radius: 999px;
2699
+ background: var(--app-accent-soft);
2700
+ color: var(--app-accent-deep);
2701
+ font-family: var(--font-mono);
2702
+ font-size: 12px;
2703
+ letter-spacing: 0;
2704
+ }
2705
+
2706
+ .popup-menu-query {
2707
+ min-width: 0;
2708
+ overflow: hidden;
2709
+ color: color-mix(in srgb, var(--app-muted) 78%, var(--app-accent));
2710
+ font-weight: 600;
2711
+ text-overflow: ellipsis;
2712
+ text-transform: none;
2713
+ white-space: nowrap;
2714
+ }
2715
+
2716
+ .popup-item {
2717
+ position: relative;
2718
+ display: flex;
2719
+ align-items: center;
2720
+ gap: 10px;
2721
+ min-height: 42px;
2722
+ border: 1px solid transparent;
2723
+ border-radius: 11px;
2724
+ padding: 8px 10px;
2725
+ color: var(--app-fg);
2726
+ font-size: 12px;
2727
+ transition:
2728
+ background 0.12s ease,
2729
+ border-color 0.12s ease,
2730
+ transform 0.12s ease,
2731
+ box-shadow 0.12s ease;
2732
+ }
2733
+
2734
+ .popup-item-selected {
2735
+ border-color: color-mix(in srgb, var(--app-accent) 28%, var(--app-border));
2736
+ background:
2737
+ linear-gradient(90deg, color-mix(in srgb, var(--app-accent-soft) 92%, transparent), transparent 86%),
2738
+ color-mix(in srgb, var(--card) 96%, var(--app-accent-soft));
2739
+ color: var(--app-accent-deep);
2740
+ box-shadow: inset 3px 0 0 var(--app-accent), 0 7px 16px color-mix(in srgb, var(--app-accent) 12%, transparent);
2741
+ }
2742
+
2743
+ .popup-item:hover {
2744
+ border-color: color-mix(in srgb, var(--app-accent) 22%, var(--app-border));
2745
+ background: color-mix(in srgb, var(--app-accent-soft) 54%, var(--card));
2746
+ transform: translateY(-1px);
2747
+ }
2748
+
2749
+ .popup-item-desc {
2750
+ margin-top: 2px;
2751
+ color: color-mix(in srgb, var(--app-muted) 86%, var(--app-fg));
2752
+ font-size: 10px;
2753
+ }
2754
+
2755
+ .popup-item-kind,
2756
+ .popup-source {
2757
+ flex-shrink: 0;
2758
+ border: 1px solid color-mix(in srgb, var(--app-border) 78%, transparent);
2759
+ border-radius: 999px;
2760
+ background: color-mix(in srgb, var(--card) 82%, var(--app-accent-soft));
2761
+ color: var(--app-muted);
2762
+ font-size: 10px;
2763
+ font-weight: 700;
2764
+ white-space: nowrap;
2765
+ }
2766
+
2767
+ .popup-item-kind {
2768
+ min-width: 68px;
2769
+ padding: 3px 7px;
2770
+ text-align: center;
2771
+ }
2772
+
2773
+ .popup-item-command {
2774
+ flex-shrink: 0;
2775
+ width: 76px;
2776
+ overflow: hidden;
2777
+ border-radius: 999px;
2778
+ background: var(--app-accent-soft);
2779
+ color: var(--app-accent-deep);
2780
+ font-family: var(--font-mono);
2781
+ font-size: 11px;
2782
+ font-weight: 700;
2783
+ padding: 4px 8px;
2784
+ text-overflow: ellipsis;
2785
+ white-space: nowrap;
2786
+ }
2787
+
2788
+ .popup-source {
2789
+ padding: 3px 7px;
2790
+ }
2791
+
2792
+ .popup-item-empty {
2793
+ justify-content: center;
2794
+ min-height: 52px;
2795
+ color: var(--app-muted);
2796
+ font-style: italic;
2797
+ }
2798
+
2799
+ .drawer-panel {
2800
+ position: relative;
2801
+ width: 0;
2802
+ min-width: 0;
2803
+ height: 100%;
2804
+ display: flex;
2805
+ flex-direction: column;
2806
+ overflow: hidden;
2807
+ border-left: 1px solid var(--app-border);
2808
+ background: var(--app-surface);
2809
+ box-shadow: var(--shadow-lg);
2810
+ transition: width 0.2s ease;
2811
+ }
2812
+
2813
+ .drawer-panel-open {
2814
+ width: var(--drawer-width, 420px);
2815
+ min-width: var(--drawer-width, 420px);
2816
+ }
2817
+
2818
+ .app-body[data-graph-drawer-overlay="true"] .drawer-panel-open {
2819
+ position: absolute;
2820
+ inset: 0 0 0 auto;
2821
+ z-index: 30;
2822
+ height: 100%;
2823
+ }
2824
+
2825
+ .drawer-panel.drawer-panel-fullscreen {
2826
+ position: fixed;
2827
+ inset: 0;
2828
+ z-index: 50;
2829
+ width: 100vw;
2830
+ min-width: 100vw;
2831
+ height: 100vh;
2832
+ }
2833
+
2834
+ .drawer-resize-handle {
2835
+ position: absolute;
2836
+ top: 0;
2837
+ bottom: 0;
2838
+ left: -4px;
2839
+ z-index: 2;
2840
+ width: 8px;
2841
+ cursor: col-resize;
2842
+ touch-action: none;
2843
+ }
2844
+
2845
+ .drawer-resize-handle::after {
2846
+ position: absolute;
2847
+ top: 0;
2848
+ bottom: 0;
2849
+ left: 3px;
2850
+ width: 2px;
2851
+ content: "";
2852
+ background: transparent;
2853
+ transition: background 0.12s, width 0.12s, left 0.12s;
2854
+ }
2855
+
2856
+ .drawer-resize-handle:hover::after,
2857
+ .drawer-resize-handle:focus-visible::after {
2858
+ left: 2px;
2859
+ width: 3px;
2860
+ background: var(--app-accent);
2861
+ }
2862
+
2863
+ body.drawer-resizing {
2864
+ cursor: col-resize;
2865
+ user-select: none;
2866
+ }
2867
+
2868
+ body.drawer-resizing .drawer-resize-handle::after {
2869
+ left: 2px;
2870
+ width: 3px;
2871
+ background: var(--app-accent);
2872
+ }
2873
+
2874
+ .drawer-header {
2875
+ flex-shrink: 0;
2876
+ display: flex;
2877
+ align-items: center;
2878
+ justify-content: space-between;
2879
+ gap: 8px;
2880
+ padding: 9px 14px;
2881
+ border-bottom: 1px solid color-mix(in srgb, var(--app-border) 82%, transparent);
2882
+ }
2883
+
2884
+ .drawer-title {
2885
+ min-width: 0;
2886
+ overflow: hidden;
2887
+ text-overflow: ellipsis;
2888
+ white-space: nowrap;
2889
+ color: var(--app-muted);
2890
+ font-family: var(--font-mono);
2891
+ font-size: 11px;
2892
+ }
2893
+
2894
+ .drawer-tabs {
2895
+ flex-shrink: 0;
2896
+ display: flex;
2897
+ gap: 2px;
2898
+ overflow-x: auto;
2899
+ padding: 6px 10px;
2900
+ border-bottom: 1px solid color-mix(in srgb, var(--app-border) 82%, transparent);
2901
+ }
2902
+
2903
+ .drawer-tab {
2904
+ flex-shrink: 0;
2905
+ padding: 4px 10px;
2906
+ border-radius: 999px;
2907
+ color: var(--app-muted);
2908
+ font-size: 11px;
2909
+ white-space: nowrap;
2910
+ }
2911
+
2912
+ .drawer-tab:hover {
2913
+ color: var(--app-fg);
2914
+ background: var(--app-hover);
2915
+ }
2916
+
2917
+ .drawer-tab-active {
2918
+ background: var(--app-accent);
2919
+ color: white;
2920
+ box-shadow: 0 2px 5px color-mix(in srgb, var(--app-accent) 22%, transparent);
2921
+ }
2922
+
2923
+ .drawer-content {
2924
+ flex: 1;
2925
+ overflow-y: auto;
2926
+ padding: 16px;
2927
+ color: var(--app-fg);
2928
+ font-size: 13px;
2929
+ line-height: 1.6;
2930
+ }
2931
+
2932
+ .drawer-empty {
2933
+ display: flex;
2934
+ height: 100%;
2935
+ flex-direction: column;
2936
+ align-items: center;
2937
+ justify-content: center;
2938
+ gap: 6px;
2939
+ color: var(--app-muted);
2940
+ font-size: 12px;
2941
+ text-align: center;
2942
+ }
2943
+
2944
+ .graph-summary-drawer {
2945
+ display: grid;
2946
+ gap: 14px;
2947
+ padding: 14px;
2948
+ border: 1px solid color-mix(in srgb, var(--app-border-strong) 70%, transparent);
2949
+ border-radius: 16px;
2950
+ background:
2951
+ linear-gradient(180deg, color-mix(in srgb, var(--app-surface) 96%, transparent), color-mix(in srgb, var(--app-bg) 84%, var(--app-surface))),
2952
+ var(--paper-grain);
2953
+ background-size: auto, 180px 180px;
2954
+ box-shadow: var(--shadow-lg);
2955
+ }
2956
+
2957
+ .graph-summary-kicker {
2958
+ width: fit-content;
2959
+ padding: 4px 9px;
2960
+ border: 1px solid color-mix(in srgb, var(--app-accent) 30%, var(--app-border));
2961
+ border-radius: 999px;
2962
+ background: var(--app-accent-soft);
2963
+ color: var(--app-accent-deep);
2964
+ font-size: 11px;
2965
+ font-weight: 800;
2966
+ letter-spacing: 0;
2967
+ }
2968
+
2969
+ .graph-summary-title {
2970
+ margin: 0;
2971
+ color: var(--app-fg);
2972
+ font-size: 19px;
2973
+ font-weight: 800;
2974
+ line-height: 1.25;
2975
+ }
2976
+
2977
+ .graph-summary-facts {
2978
+ display: grid;
2979
+ grid-template-columns: repeat(3, minmax(0, 1fr));
2980
+ gap: 8px;
2981
+ }
2982
+
2983
+ .graph-summary-fact {
2984
+ padding: 9px 10px;
2985
+ border: 1px solid color-mix(in srgb, var(--app-border) 78%, transparent);
2986
+ border-radius: 12px;
2987
+ background: color-mix(in srgb, var(--app-surface) 76%, transparent);
2988
+ box-shadow: inset 0 1px 0 color-mix(in srgb, white 28%, transparent);
2989
+ }
2990
+
2991
+ .graph-summary-fact strong,
2992
+ .graph-summary-fact span {
2993
+ display: block;
2994
+ }
2995
+
2996
+ .graph-summary-fact strong {
2997
+ color: var(--app-accent-deep);
2998
+ font-size: 16px;
2999
+ line-height: 1.1;
3000
+ }
3001
+
3002
+ .graph-summary-fact span {
3003
+ margin-top: 4px;
3004
+ color: var(--app-muted);
3005
+ font-size: 11px;
3006
+ }
3007
+
3008
+ .graph-summary-meta,
3009
+ .graph-summary-actions {
3010
+ display: flex;
3011
+ flex-wrap: wrap;
3012
+ gap: 8px;
3013
+ }
3014
+
3015
+ .graph-summary-meta span {
3016
+ display: inline-flex;
3017
+ align-items: center;
3018
+ gap: 6px;
3019
+ min-height: 24px;
3020
+ padding: 3px 9px;
3021
+ border: 1px solid color-mix(in srgb, var(--app-border) 78%, transparent);
3022
+ border-radius: 999px;
3023
+ background: color-mix(in srgb, var(--app-surface) 72%, transparent);
3024
+ color: var(--app-muted);
3025
+ font-size: 11px;
3026
+ font-weight: 700;
3027
+ }
3028
+
3029
+ .graph-summary-community-chip::before {
3030
+ width: 7px;
3031
+ height: 7px;
3032
+ border-radius: 999px;
3033
+ content: "";
3034
+ background: var(--app-accent);
3035
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--app-accent) 16%, transparent);
3036
+ }
3037
+
3038
+ .graph-summary-excerpt {
3039
+ margin: 0;
3040
+ padding: 12px 13px;
3041
+ border: 1px solid color-mix(in srgb, var(--app-border) 72%, transparent);
3042
+ border-radius: 12px;
3043
+ background: color-mix(in srgb, var(--app-bg) 54%, transparent);
3044
+ color: color-mix(in srgb, var(--app-fg) 78%, var(--app-muted));
3045
+ font-size: 13px;
3046
+ line-height: 1.6;
3047
+ }
3048
+
3049
+ .graph-summary-section {
3050
+ display: grid;
3051
+ gap: 8px;
3052
+ padding: 11px;
3053
+ border: 1px solid color-mix(in srgb, var(--app-border) 70%, transparent);
3054
+ border-radius: 12px;
3055
+ background: color-mix(in srgb, var(--app-surface) 48%, transparent);
3056
+ }
3057
+
3058
+ .graph-summary-section h3 {
3059
+ margin: 0;
3060
+ color: var(--app-fg);
3061
+ font-size: 12px;
3062
+ font-weight: 800;
3063
+ }
3064
+
3065
+ .graph-summary-section-header {
3066
+ display: flex;
3067
+ align-items: center;
3068
+ justify-content: space-between;
3069
+ gap: 8px;
3070
+ }
3071
+
3072
+ .graph-summary-section-header h3 {
3073
+ margin: 0;
3074
+ }
3075
+
3076
+ .graph-summary-list {
3077
+ display: flex;
3078
+ flex-direction: column;
3079
+ gap: 6px;
3080
+ margin: 0;
3081
+ padding: 0;
3082
+ list-style: none;
3083
+ }
3084
+
3085
+ .graph-summary-list li {
3086
+ display: flex;
3087
+ min-width: 0;
3088
+ align-items: center;
3089
+ justify-content: space-between;
3090
+ gap: 8px;
3091
+ padding: 7px 8px;
3092
+ border: 1px solid color-mix(in srgb, var(--app-border) 58%, transparent);
3093
+ border-radius: 9px;
3094
+ background: color-mix(in srgb, var(--app-bg) 42%, transparent);
3095
+ color: var(--app-fg);
3096
+ font-size: 12px;
3097
+ }
3098
+
3099
+ .graph-summary-click-list li {
3100
+ padding: 0;
3101
+ overflow: hidden;
3102
+ }
3103
+
3104
+ .graph-summary-node-link,
3105
+ .graph-summary-inline-action {
3106
+ border: 0;
3107
+ background: transparent;
3108
+ color: var(--app-fg);
3109
+ cursor: pointer;
3110
+ font: inherit;
3111
+ }
3112
+
3113
+ .graph-summary-node-link {
3114
+ width: 100%;
3115
+ padding: 7px 8px;
3116
+ text-align: left;
3117
+ }
3118
+
3119
+ .graph-summary-node-link:hover,
3120
+ .graph-summary-inline-action:hover {
3121
+ color: var(--app-accent-deep);
3122
+ }
3123
+
3124
+ .graph-summary-inline-action {
3125
+ flex-shrink: 0;
3126
+ padding: 3px 8px;
3127
+ border: 1px solid color-mix(in srgb, var(--app-accent) 30%, var(--app-border));
3128
+ border-radius: 999px;
3129
+ background: var(--app-accent-soft);
3130
+ color: var(--app-accent-deep);
3131
+ font-size: 12px;
3132
+ font-weight: 800;
3133
+ }
3134
+
3135
+ .graph-summary-list small,
3136
+ .graph-summary-muted {
3137
+ color: var(--app-muted);
3138
+ font-size: 12px;
3139
+ }
3140
+
3141
+ .graph-summary-relation-pill {
3142
+ max-width: 46%;
3143
+ overflow: hidden;
3144
+ padding: 3px 8px;
3145
+ border: 1px solid color-mix(in srgb, var(--app-accent) 28%, var(--app-border));
3146
+ border-radius: 999px;
3147
+ background: var(--app-accent-soft);
3148
+ color: var(--app-accent-deep);
3149
+ font-weight: 800;
3150
+ text-overflow: ellipsis;
3151
+ white-space: nowrap;
3152
+ }
3153
+
3154
+ .graph-summary-action {
3155
+ min-height: 34px;
3156
+ padding: 7px 12px;
3157
+ border: 1px solid color-mix(in srgb, var(--app-accent) 34%, var(--app-border));
3158
+ border-radius: 10px;
3159
+ background: color-mix(in srgb, var(--app-surface) 82%, transparent);
3160
+ color: var(--app-accent-deep);
3161
+ font-size: 12px;
3162
+ font-weight: 800;
3163
+ cursor: pointer;
3164
+ box-shadow: var(--shadow);
3165
+ transition: transform 0.14s, border-color 0.14s, background 0.14s, box-shadow 0.14s;
3166
+ }
3167
+
3168
+ .graph-summary-action:hover {
3169
+ transform: translateY(-1px);
3170
+ border-color: color-mix(in srgb, var(--app-accent) 64%, var(--app-border));
3171
+ background: var(--app-accent-soft);
3172
+ box-shadow: 0 10px 24px color-mix(in srgb, var(--app-accent) 12%, transparent);
3173
+ }
3174
+
3175
+ .batch-panel {
3176
+ position: fixed;
3177
+ right: 22px;
3178
+ bottom: 26px;
3179
+ z-index: 40;
3180
+ width: 360px;
3181
+ max-width: calc(100vw - 2rem);
3182
+ overflow: hidden;
3183
+ border: 1px solid color-mix(in srgb, var(--app-accent) 22%, var(--app-border));
3184
+ border-radius: 16px;
3185
+ background:
3186
+ linear-gradient(145deg, color-mix(in srgb, var(--card) 92%, var(--app-accent-soft)), var(--card)),
3187
+ var(--paper-grain);
3188
+ box-shadow: 0 18px 50px color-mix(in srgb, var(--app-shadow) 82%, transparent);
3189
+ }
3190
+
3191
+ .batch-header {
3192
+ display: flex;
3193
+ align-items: center;
3194
+ gap: 10px;
3195
+ justify-content: space-between;
3196
+ padding: 12px 14px;
3197
+ border-bottom: 1px solid color-mix(in srgb, var(--app-border) 80%, transparent);
3198
+ background: color-mix(in srgb, var(--app-accent-soft) 48%, transparent);
3199
+ }
3200
+
3201
+ .batch-title {
3202
+ color: var(--app-fg);
3203
+ font-size: 14px;
3204
+ font-weight: 800;
3205
+ }
3206
+
3207
+ .batch-subtitle {
3208
+ margin-top: 2px;
3209
+ color: var(--app-muted);
3210
+ font-size: 11px;
3211
+ }
3212
+
3213
+ .batch-status {
3214
+ flex-shrink: 0;
3215
+ border: 1px solid color-mix(in srgb, var(--app-border) 78%, transparent);
3216
+ border-radius: 999px;
3217
+ padding: 3px 8px;
3218
+ color: var(--app-muted);
3219
+ font-size: 10px;
3220
+ font-weight: 800;
3221
+ }
3222
+
3223
+ .batch-status-running {
3224
+ border-color: color-mix(in srgb, var(--app-accent) 32%, var(--app-border));
3225
+ background: var(--app-accent-soft);
3226
+ color: var(--app-accent-deep);
3227
+ }
3228
+
3229
+ .batch-status-done {
3230
+ border-color: color-mix(in srgb, var(--app-success) 34%, var(--app-border));
3231
+ background: color-mix(in srgb, var(--app-success) 14%, var(--card));
3232
+ color: var(--app-success);
3233
+ }
3234
+
3235
+ .batch-status-error {
3236
+ border-color: color-mix(in srgb, var(--app-danger) 34%, var(--app-border));
3237
+ background: color-mix(in srgb, var(--app-danger) 12%, var(--card));
3238
+ color: var(--app-danger);
3239
+ }
3240
+
3241
+ .batch-body {
3242
+ max-height: 310px;
3243
+ overflow-y: auto;
3244
+ padding: 13px 14px 14px;
3245
+ }
3246
+
3247
+ .batch-progress {
3248
+ height: 7px;
3249
+ overflow: hidden;
3250
+ border: 1px solid color-mix(in srgb, var(--app-border) 74%, transparent);
3251
+ border-radius: 999px;
3252
+ background: color-mix(in srgb, var(--app-raised) 68%, transparent);
3253
+ }
3254
+
3255
+ .batch-progress-bar {
3256
+ height: 100%;
3257
+ border-radius: inherit;
3258
+ background: linear-gradient(90deg, var(--app-accent), color-mix(in srgb, var(--app-accent) 68%, var(--app-warn)));
3259
+ box-shadow: 0 0 12px color-mix(in srgb, var(--app-accent) 28%, transparent);
3260
+ transition: width 0.3s ease;
3261
+ }
3262
+
3263
+ .batch-progress-meta {
3264
+ display: flex;
3265
+ justify-content: space-between;
3266
+ gap: 8px;
3267
+ margin: 6px 0 10px;
3268
+ color: var(--app-muted);
3269
+ font-size: 10px;
3270
+ font-weight: 700;
3271
+ }
3272
+
3273
+ .batch-current {
3274
+ overflow: hidden;
3275
+ margin-bottom: 8px;
3276
+ border: 1px dashed color-mix(in srgb, var(--app-accent) 25%, var(--app-border));
3277
+ border-radius: 10px;
3278
+ background: color-mix(in srgb, var(--app-accent-soft) 44%, transparent);
3279
+ padding: 6px 8px;
3280
+ color: var(--app-muted);
3281
+ font-family: var(--font-mono);
3282
+ font-size: 11px;
3283
+ text-overflow: ellipsis;
3284
+ white-space: nowrap;
3285
+ }
3286
+
3287
+ .batch-file {
3288
+ display: grid;
3289
+ grid-template-columns: 12px minmax(0, 1fr) auto;
3290
+ align-items: center;
3291
+ gap: 8px;
3292
+ border: 1px solid transparent;
3293
+ border-radius: 11px;
3294
+ padding: 7px 8px;
3295
+ color: var(--app-muted);
3296
+ font-family: var(--font-mono);
3297
+ font-size: 11px;
3298
+ }
3299
+
3300
+ .batch-file + .batch-file {
3301
+ margin-top: 4px;
3302
+ }
3303
+
3304
+ .batch-file-running {
3305
+ border-color: color-mix(in srgb, var(--app-accent) 18%, var(--app-border));
3306
+ background: color-mix(in srgb, var(--app-accent-soft) 38%, transparent);
3307
+ }
3308
+
3309
+ .batch-file-done {
3310
+ background: color-mix(in srgb, var(--app-success) 7%, transparent);
3311
+ }
3312
+
3313
+ .batch-file-error {
3314
+ background: color-mix(in srgb, var(--app-danger) 8%, transparent);
3315
+ }
3316
+
3317
+ .batch-file-name,
3318
+ .batch-file-detail {
3319
+ overflow: hidden;
3320
+ text-overflow: ellipsis;
3321
+ white-space: nowrap;
3322
+ }
3323
+
3324
+ .batch-file-name {
3325
+ color: var(--app-fg);
3326
+ font-weight: 700;
3327
+ }
3328
+
3329
+ .batch-file-detail {
3330
+ margin-top: 2px;
3331
+ color: var(--app-muted);
3332
+ }
3333
+
3334
+ .batch-dot {
3335
+ width: 8px;
3336
+ height: 8px;
3337
+ border-radius: 999px;
3338
+ }
3339
+
3340
+ .batch-dot-queued {
3341
+ background: var(--app-border);
3342
+ }
3343
+
3344
+ .batch-dot-running {
3345
+ background: var(--app-accent);
3346
+ animation: pulse-dot 1s infinite;
3347
+ }
3348
+
3349
+ .batch-dot-done {
3350
+ background: var(--app-success);
3351
+ }
3352
+
3353
+ .batch-dot-error {
3354
+ background: var(--app-danger);
3355
+ }
3356
+
3357
+ .batch-output-btn {
3358
+ display: inline-grid;
3359
+ width: 28px;
3360
+ height: 28px;
3361
+ place-items: center;
3362
+ border: 1px solid color-mix(in srgb, var(--app-border) 80%, transparent);
3363
+ border-radius: 999px;
3364
+ background: var(--card);
3365
+ color: var(--app-muted);
3366
+ }
3367
+
3368
+ .batch-output-btn:hover {
3369
+ border-color: var(--app-accent);
3370
+ color: var(--app-accent-deep);
3371
+ background: var(--app-accent-soft);
3372
+ }
3373
+
3374
+ .batch-result {
3375
+ margin-top: 10px;
3376
+ border-radius: 10px;
3377
+ padding: 7px 9px;
3378
+ font-size: 11px;
3379
+ }
3380
+
3381
+ .batch-result-done {
3382
+ background: color-mix(in srgb, var(--app-success) 12%, var(--card));
3383
+ color: var(--app-success);
3384
+ }
3385
+
3386
+ .batch-result-error {
3387
+ background: color-mix(in srgb, var(--app-danger) 10%, var(--card));
3388
+ color: var(--app-danger);
3389
+ }
3390
+
3391
+ .dialog-surface {
3392
+ border: 1px solid var(--app-border);
3393
+ background: var(--app-surface);
3394
+ color: var(--app-fg);
3395
+ box-shadow: var(--shadow-lg);
3396
+ }
3397
+
3398
+ .form-field {
3399
+ width: 100%;
3400
+ border: 1px solid var(--app-border);
3401
+ border-radius: 8px;
3402
+ background: var(--app-surface);
3403
+ padding: 8px 10px;
3404
+ color: var(--app-fg);
3405
+ font-size: 13px;
3406
+ outline: none;
3407
+ }
3408
+
3409
+ .form-label {
3410
+ display: block;
3411
+ margin-bottom: 6px;
3412
+ color: var(--app-muted);
3413
+ font-size: 11px;
3414
+ font-weight: 650;
3415
+ }
3416
+
3417
+ /* Workbench visual polish: calmer paper, clearer hierarchy, lighter motion. */
3418
+ body {
3419
+ font-size: 16px;
3420
+ }
3421
+
3422
+ .app-shell {
3423
+ background-size: 100% 100%, 100% 100%, 680px 680px;
3424
+ }
3425
+
3426
+ .app-shell::before {
3427
+ position: absolute;
3428
+ inset: 60px 0 auto;
3429
+ height: 1px;
3430
+ pointer-events: none;
3431
+ content: "";
3432
+ background: linear-gradient(90deg, transparent, color-mix(in srgb, var(--app-border-strong) 72%, transparent), transparent);
3433
+ opacity: 0.75;
3434
+ z-index: 18;
3435
+ }
3436
+
3437
+ .topbar {
3438
+ min-height: 62px;
3439
+ padding: 0 20px;
3440
+ border-bottom-color: color-mix(in srgb, var(--app-border-strong) 58%, transparent);
3441
+ background:
3442
+ linear-gradient(180deg, color-mix(in srgb, var(--app-surface) 78%, transparent), color-mix(in srgb, var(--app-bg) 78%, transparent)),
3443
+ var(--paper-grain);
3444
+ background-size: auto, 220px 220px;
3445
+ box-shadow: 0 1px 0 color-mix(in srgb, white 32%, transparent);
3446
+ backdrop-filter: blur(12px);
3447
+ }
3448
+
3449
+ .topbar-kb,
3450
+ .topbar-search,
3451
+ .topbar-model,
3452
+ .topbar-icon-action,
3453
+ .topbar-model-option,
3454
+ .icon-btn,
3455
+ .sidebar-rail-btn,
3456
+ .kb-row,
3457
+ .conv-row,
3458
+ .section-action,
3459
+ .sidebar-footer-btn,
3460
+ .main-view-tab,
3461
+ .graph-shell-toolbar-button,
3462
+ .graph-stage .graph-toolbar-button,
3463
+ .drawer-tab,
3464
+ .graph-summary-action,
3465
+ .send-btn,
3466
+ .export-btn,
3467
+ .popup-item {
3468
+ cursor: pointer;
3469
+ }
3470
+
3471
+ .topbar-kb {
3472
+ border: 1px solid transparent;
3473
+ border-radius: 12px;
3474
+ transition: background 0.16s ease, border-color 0.16s ease, transform 0.16s ease;
3475
+ }
3476
+
3477
+ .topbar-kb:hover {
3478
+ border-color: color-mix(in srgb, var(--app-border) 80%, transparent);
3479
+ background: color-mix(in srgb, var(--app-surface) 62%, transparent);
3480
+ transform: translateY(-1px);
3481
+ }
3482
+
3483
+ .topbar-kb-icon {
3484
+ border-color: color-mix(in srgb, var(--app-border-strong) 58%, transparent);
3485
+ border-radius: 10px;
3486
+ background:
3487
+ linear-gradient(145deg, color-mix(in srgb, var(--app-surface) 94%, transparent), color-mix(in srgb, var(--app-raised) 46%, transparent));
3488
+ box-shadow: inset 0 1px 0 color-mix(in srgb, white 36%, transparent), 0 6px 16px rgba(70, 55, 40, 0.055);
3489
+ }
3490
+
3491
+ .topbar-kb-name {
3492
+ letter-spacing: 0;
3493
+ }
3494
+
3495
+ .topbar-kb-badge,
3496
+ .topbar-status-pill {
3497
+ border-radius: 999px;
3498
+ }
3499
+
3500
+ .topbar-status-pill {
3501
+ background: color-mix(in srgb, var(--app-surface) 50%, transparent);
3502
+ }
3503
+
3504
+ .topbar-search,
3505
+ .topbar-model,
3506
+ .topbar-icon-action {
3507
+ height: 36px;
3508
+ border-color: color-mix(in srgb, var(--app-border-strong) 56%, transparent);
3509
+ border-radius: 10px;
3510
+ background: color-mix(in srgb, var(--app-surface) 72%, transparent);
3511
+ box-shadow: inset 0 1px 0 color-mix(in srgb, white 30%, transparent);
3512
+ }
3513
+
3514
+ .topbar-search:hover:not(:disabled),
3515
+ .topbar-model:hover:not(:disabled),
3516
+ .topbar-icon-action:hover:not(:disabled),
3517
+ .topbar-icon-action-active {
3518
+ box-shadow: inset 0 1px 0 color-mix(in srgb, white 36%, transparent), 0 8px 22px color-mix(in srgb, var(--app-accent) 10%, transparent);
3519
+ transform: translateY(-1px);
3520
+ }
3521
+
3522
+ .topbar-text-action {
3523
+ border-color: transparent;
3524
+ background: var(--app-accent);
3525
+ color: #fff;
3526
+ box-shadow: 0 2px 4px color-mix(in srgb, var(--app-accent) 22%, transparent);
3527
+ }
3528
+
3529
+ .topbar-text-action:hover:not(:disabled) {
3530
+ border-color: transparent;
3531
+ background: var(--app-accent-deep);
3532
+ color: #fff;
3533
+ box-shadow: 0 2px 4px color-mix(in srgb, var(--app-accent) 24%, transparent);
3534
+ }
3535
+
3536
+ .shell-sidebar {
3537
+ border-right-color: color-mix(in srgb, var(--app-border-strong) 62%, transparent);
3538
+ background:
3539
+ linear-gradient(180deg, color-mix(in srgb, var(--app-bg) 74%, var(--app-surface)), color-mix(in srgb, var(--app-surface) 48%, var(--app-bg))),
3540
+ var(--paper-grain);
3541
+ background-size: auto, 220px 220px;
3542
+ box-shadow: inset -1px 0 0 color-mix(in srgb, white 18%, transparent);
3543
+ overflow: hidden;
3544
+ }
3545
+
3546
+ .sidebar-header {
3547
+ top: 12px;
3548
+ right: 12px;
3549
+ }
3550
+
3551
+ .sidebar-body {
3552
+ padding: 22px 12px 11px;
3553
+ gap: 10px;
3554
+ min-width: 0;
3555
+ overflow-x: hidden;
3556
+ }
3557
+
3558
+ .sidebar-error {
3559
+ box-sizing: border-box;
3560
+ max-width: 100%;
3561
+ overflow: hidden;
3562
+ text-overflow: ellipsis;
3563
+ white-space: nowrap;
3564
+ }
3565
+
3566
+ .sidebar-section + .sidebar-section {
3567
+ margin-top: 18px;
3568
+ }
3569
+
3570
+ .sidebar-section,
3571
+ .sidebar-section-head,
3572
+ .sidebar-section-body {
3573
+ min-width: 0;
3574
+ max-width: 100%;
3575
+ }
3576
+
3577
+ .sidebar-section-body {
3578
+ overflow: hidden;
3579
+ }
3580
+
3581
+ .sidebar-section-label {
3582
+ padding: 4px 7px;
3583
+ color: color-mix(in srgb, var(--app-muted) 88%, var(--app-fg));
3584
+ font-size: 12px;
3585
+ font-weight: 720;
3586
+ letter-spacing: 0;
3587
+ text-transform: none;
3588
+ }
3589
+
3590
+ .kb-row,
3591
+ .conv-row,
3592
+ .sidebar-footer-btn {
3593
+ border-radius: 10px;
3594
+ }
3595
+
3596
+ .kb-row {
3597
+ min-height: 34px;
3598
+ box-sizing: border-box;
3599
+ min-width: 0;
3600
+ max-width: 100%;
3601
+ justify-content: flex-start;
3602
+ overflow: hidden;
3603
+ padding: 7px 9px;
3604
+ text-align: left;
3605
+ transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease, transform 0.15s ease, box-shadow 0.15s ease;
3606
+ }
3607
+
3608
+ .kb-name {
3609
+ min-width: 0;
3610
+ text-align: left;
3611
+ }
3612
+
3613
+ .kb-row:hover {
3614
+ transform: translateX(1px);
3615
+ }
3616
+
3617
+ .kb-row-active {
3618
+ border-color: color-mix(in srgb, var(--app-accent) 26%, var(--app-border));
3619
+ background:
3620
+ linear-gradient(90deg, color-mix(in srgb, var(--app-accent) 12%, transparent), transparent 86%),
3621
+ color-mix(in srgb, var(--app-surface) 62%, transparent);
3622
+ box-shadow: inset 3px 0 0 var(--app-accent), 0 8px 22px color-mix(in srgb, var(--app-accent) 7%, transparent);
3623
+ }
3624
+
3625
+ .conv-row {
3626
+ box-sizing: border-box;
3627
+ width: 100%;
3628
+ min-width: 0;
3629
+ max-width: 100%;
3630
+ align-items: stretch;
3631
+ overflow: hidden;
3632
+ padding: 7px 10px;
3633
+ text-align: left;
3634
+ transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease, transform 0.15s ease;
3635
+ }
3636
+
3637
+ .conv-title,
3638
+ .conv-time {
3639
+ min-width: 0;
3640
+ max-width: 100%;
3641
+ overflow: hidden;
3642
+ text-align: left;
3643
+ text-overflow: ellipsis;
3644
+ white-space: nowrap;
3645
+ }
3646
+
3647
+ .conv-row:hover {
3648
+ transform: translateX(1px);
3649
+ }
3650
+
3651
+ .conv-row-active {
3652
+ border-color: color-mix(in srgb, var(--app-accent) 22%, var(--app-border));
3653
+ background:
3654
+ linear-gradient(90deg, color-mix(in srgb, var(--app-accent) 10%, transparent), transparent 88%),
3655
+ color-mix(in srgb, var(--app-surface) 54%, transparent);
3656
+ }
3657
+
3658
+ .sidebar-footer {
3659
+ padding: 10px 11px 12px;
3660
+ background:
3661
+ linear-gradient(180deg, color-mix(in srgb, var(--app-bg) 34%, transparent), color-mix(in srgb, var(--app-surface) 46%, transparent));
3662
+ }
3663
+
3664
+ .sidebar-footer-btn {
3665
+ min-height: 34px;
3666
+ padding: 8px 10px;
3667
+ }
3668
+
3669
+ .sidebar-footer-btn-primary {
3670
+ border-color: color-mix(in srgb, var(--app-accent) 18%, transparent);
3671
+ background: color-mix(in srgb, var(--app-accent) 7%, transparent);
3672
+ }
3673
+
3674
+ .shell-main {
3675
+ background:
3676
+ linear-gradient(180deg, color-mix(in srgb, var(--app-surface) 14%, transparent), transparent 32%);
3677
+ }
3678
+
3679
+ .main-view-tabs {
3680
+ margin: 12px 24px 10px;
3681
+ }
3682
+
3683
+ .main-view-tab {
3684
+ min-height: 36px;
3685
+ padding: 8px 15px;
3686
+ border-radius: 10px;
3687
+ }
3688
+
3689
+ .main-view-tab-active {
3690
+ border-color: color-mix(in srgb, var(--app-border-strong) 62%, transparent);
3691
+ background: color-mix(in srgb, var(--app-surface) 78%, transparent);
3692
+ box-shadow: 0 1px 2px rgba(70, 55, 40, 0.04), 0 8px 20px rgba(70, 55, 40, 0.055);
3693
+ }
3694
+
3695
+ .chat-messages {
3696
+ gap: 26px;
3697
+ padding: 26px 34px 28px;
3698
+ }
3699
+
3700
+ .chat-empty {
3701
+ margin: 22px;
3702
+ border: 1px dashed color-mix(in srgb, var(--app-border-strong) 58%, transparent);
3703
+ border-radius: 18px;
3704
+ background:
3705
+ linear-gradient(180deg, color-mix(in srgb, var(--app-surface) 50%, transparent), color-mix(in srgb, var(--app-bg) 36%, transparent));
3706
+ }
3707
+
3708
+ .chat-empty-title {
3709
+ font-size: 16px;
3710
+ font-weight: 700;
3711
+ }
3712
+
3713
+ .msg-row {
3714
+ animation: polished-fade-in 0.24s ease;
3715
+ }
3716
+
3717
+ .msg-avatar {
3718
+ width: 32px;
3719
+ height: 32px;
3720
+ border-radius: 10px;
3721
+ }
3722
+
3723
+ .msg-content {
3724
+ border-color: color-mix(in srgb, var(--app-border-strong) 44%, transparent);
3725
+ border-radius: 7px 17px 17px;
3726
+ background:
3727
+ linear-gradient(180deg, color-mix(in srgb, var(--app-surface) 94%, transparent), color-mix(in srgb, var(--app-bg) 42%, var(--app-surface)));
3728
+ box-shadow: 0 1px 2px rgba(70, 55, 40, 0.035), 0 12px 30px rgba(70, 55, 40, 0.065);
3729
+ }
3730
+
3731
+ .msg-row-user .msg-content {
3732
+ border-color: color-mix(in srgb, var(--app-accent) 28%, transparent);
3733
+ border-radius: 17px 7px 17px 17px;
3734
+ background: var(--app-accent-soft);
3735
+ color: var(--app-accent-deep);
3736
+ box-shadow: 0 1px 2px color-mix(in srgb, var(--app-accent) 8%, transparent);
3737
+ }
3738
+
3739
+ .tool-runway {
3740
+ border-radius: 13px;
3741
+ background:
3742
+ linear-gradient(90deg, color-mix(in srgb, var(--tool-runway-color) 12%, transparent), transparent 66%),
3743
+ color-mix(in srgb, var(--app-surface) 78%, transparent);
3744
+ box-shadow: 0 1px 2px rgba(70, 55, 40, 0.035), 0 10px 26px rgba(70, 55, 40, 0.06);
3745
+ }
3746
+
3747
+ .chat-input-area {
3748
+ padding: 14px 18px 17px;
3749
+ border-top-color: color-mix(in srgb, var(--app-border-strong) 54%, transparent);
3750
+ background:
3751
+ linear-gradient(180deg, color-mix(in srgb, var(--app-bg) 58%, transparent), color-mix(in srgb, var(--app-surface) 64%, var(--app-bg))),
3752
+ var(--paper-grain);
3753
+ background-size: auto, 220px 220px;
3754
+ box-shadow: 0 -1px 0 color-mix(in srgb, white 22%, transparent);
3755
+ }
3756
+
3757
+ .composer-card {
3758
+ border-color: color-mix(in srgb, var(--app-border-strong) 56%, transparent);
3759
+ background:
3760
+ linear-gradient(180deg, color-mix(in srgb, var(--app-surface) 96%, transparent), color-mix(in srgb, var(--app-bg) 38%, var(--app-surface)));
3761
+ box-shadow: 0 1px 2px rgba(70, 55, 40, 0.04), 0 14px 32px rgba(70, 55, 40, 0.08);
3762
+ backdrop-filter: blur(8px);
3763
+ }
3764
+
3765
+ .composer-card:focus-within {
3766
+ box-shadow:
3767
+ 0 1px 2px rgba(70, 55, 40, 0.04),
3768
+ 0 16px 38px rgba(70, 55, 40, 0.1),
3769
+ 0 0 0 4px color-mix(in srgb, var(--app-accent) 12%, transparent);
3770
+ }
3771
+
3772
+ .send-btn {
3773
+ transition: opacity 0.12s ease, transform 0.12s ease, box-shadow 0.12s ease, background 0.12s ease;
3774
+ }
3775
+
3776
+ .send-btn:hover:not(:disabled) {
3777
+ background: var(--app-accent-deep);
3778
+ }
3779
+
3780
+ .popup-menu,
3781
+ .topbar-model-menu,
3782
+ .search-panel,
3783
+ .appearance-panel,
3784
+ .batch-panel {
3785
+ border-color: color-mix(in srgb, var(--app-border-strong) 64%, transparent);
3786
+ background:
3787
+ linear-gradient(180deg, color-mix(in srgb, var(--app-surface) 96%, transparent), color-mix(in srgb, var(--app-bg) 40%, var(--app-surface)));
3788
+ background-size: auto;
3789
+ backdrop-filter: blur(14px);
3790
+ }
3791
+
3792
+ .graph-screen {
3793
+ padding: 12px;
3794
+ background: transparent;
3795
+ }
3796
+
3797
+ .graph-shell {
3798
+ gap: 12px;
3799
+ }
3800
+
3801
+ .graph-shell-toolbar {
3802
+ min-height: 48px;
3803
+ padding: 9px 12px;
3804
+ border-color: color-mix(in srgb, var(--app-border-strong) 58%, transparent);
3805
+ border-radius: 14px;
3806
+ background:
3807
+ linear-gradient(180deg, color-mix(in srgb, var(--app-surface) 88%, transparent), color-mix(in srgb, var(--app-bg) 44%, var(--app-surface)));
3808
+ box-shadow: 0 1px 2px rgba(70, 55, 40, 0.035), 0 10px 26px rgba(70, 55, 40, 0.065);
3809
+ }
3810
+
3811
+ .graph-shell-toolbar-chip,
3812
+ .graph-shell-toolbar-button {
3813
+ border-radius: 999px;
3814
+ }
3815
+
3816
+ .graph-stage {
3817
+ border-color: color-mix(in srgb, var(--app-border-strong) 58%, transparent);
3818
+ border-radius: 18px;
3819
+ background:
3820
+ radial-gradient(circle at 18px 18px, color-mix(in srgb, var(--dot) 76%, transparent) 0.85px, transparent 1.25px),
3821
+ linear-gradient(180deg, color-mix(in srgb, var(--app-surface) 44%, transparent), color-mix(in srgb, var(--app-bg) 76%, transparent));
3822
+ background-size: 28px 28px, auto;
3823
+ box-shadow: inset 0 1px 0 color-mix(in srgb, white 22%, transparent), 0 16px 42px rgba(70, 55, 40, 0.07);
3824
+ }
3825
+
3826
+ .graph-stage .graph-toolbar-actions,
3827
+ .graph-stage .graph-toolbar-panel,
3828
+ .graph-stage .graph-search-status {
3829
+ border-color: color-mix(in srgb, var(--app-border-strong) 70%, transparent);
3830
+ background: color-mix(in srgb, var(--app-surface) 92%, transparent);
3831
+ color: var(--app-fg);
3832
+ box-shadow: 0 12px 28px rgba(70, 55, 40, 0.08);
3833
+ backdrop-filter: blur(10px);
3834
+ }
3835
+
3836
+ .graph-stage .graph-toolbar-button,
3837
+ .graph-stage .graph-search-status {
3838
+ border-color: color-mix(in srgb, var(--app-border-strong) 66%, transparent);
3839
+ background: color-mix(in srgb, var(--app-surface) 86%, transparent);
3840
+ color: color-mix(in srgb, var(--app-fg) 78%, var(--app-muted));
3841
+ box-shadow: inset 0 1px 0 color-mix(in srgb, white 30%, transparent);
3842
+ }
3843
+
3844
+ .graph-stage .graph-toolbar-button:hover,
3845
+ .graph-stage .graph-toolbar-button[data-active="true"] {
3846
+ border-color: color-mix(in srgb, var(--app-accent) 38%, var(--app-border));
3847
+ background: color-mix(in srgb, var(--app-accent) 10%, var(--app-surface));
3848
+ color: var(--app-accent-deep);
3849
+ }
3850
+
3851
+ .graph-metrics,
3852
+ .graph-growth-indicator,
3853
+ .graph-toast {
3854
+ backdrop-filter: blur(10px);
3855
+ }
3856
+
3857
+ .drawer-panel {
3858
+ border-left-color: color-mix(in srgb, var(--app-border-strong) 62%, transparent);
3859
+ background:
3860
+ linear-gradient(180deg, color-mix(in srgb, var(--app-surface) 96%, transparent), color-mix(in srgb, var(--app-bg) 32%, var(--app-surface))),
3861
+ var(--paper-grain);
3862
+ background-size: auto, 220px 220px;
3863
+ }
3864
+
3865
+ .drawer-header,
3866
+ .drawer-tabs {
3867
+ background: color-mix(in srgb, var(--app-surface) 54%, transparent);
3868
+ backdrop-filter: blur(10px);
3869
+ }
3870
+
3871
+ .graph-summary-drawer {
3872
+ border-color: color-mix(in srgb, var(--app-border-strong) 54%, transparent);
3873
+ background:
3874
+ linear-gradient(180deg, color-mix(in srgb, var(--app-surface) 94%, transparent), color-mix(in srgb, var(--app-bg) 36%, var(--app-surface)));
3875
+ box-shadow: 0 1px 2px rgba(70, 55, 40, 0.035), 0 12px 30px rgba(70, 55, 40, 0.07);
3876
+ }
3877
+
3878
+ .graph-summary-fact,
3879
+ .graph-summary-section,
3880
+ .graph-summary-list li {
3881
+ border-color: color-mix(in srgb, var(--app-border-strong) 42%, transparent);
3882
+ }
3883
+
3884
+ .graph-summary-action {
3885
+ border-radius: 999px;
3886
+ }
3887
+
3888
+ @keyframes polished-fade-in {
3889
+ from {
3890
+ opacity: 0;
3891
+ transform: translateY(6px) scale(0.995);
3892
+ }
3893
+ to {
3894
+ opacity: 1;
3895
+ transform: translateY(0) scale(1);
3896
+ }
3897
+ }
3898
+
3899
+ @media (prefers-reduced-motion: reduce) {
3900
+ .msg-row,
3901
+ .topbar-kb,
3902
+ .topbar-search,
3903
+ .topbar-model,
3904
+ .topbar-icon-action,
3905
+ .kb-row,
3906
+ .conv-row,
3907
+ .main-view-tab,
3908
+ .send-btn,
3909
+ .graph-shell-toolbar-button,
3910
+ .graph-summary-action {
3911
+ animation: none;
3912
+ transition: none;
3913
+ }
3914
+ }
3915
+
3916
+ @keyframes pulse-dot {
3917
+ 0%, 100% { opacity: 1; }
3918
+ 50% { opacity: 0.3; }
3919
+ }
3920
+
3921
+ @keyframes runway-pulse {
3922
+ 0%, 100% {
3923
+ opacity: 1;
3924
+ transform: scaleY(1);
3925
+ }
3926
+ 50% {
3927
+ opacity: 0.45;
3928
+ transform: scaleY(0.55);
3929
+ }
3930
+ }
3931
+
3932
+ @keyframes fadeIn {
3933
+ from { opacity: 0; transform: translateY(4px); }
3934
+ to { opacity: 1; transform: translateY(0); }
3935
+ }
3936
+
3937
+ @media (prefers-reduced-motion: reduce) {
3938
+ .tool-runway-running .tool-runway-pulse {
3939
+ animation: none;
3940
+ }
3941
+ }
3942
+
3943
+ @media (max-width: 900px) {
3944
+ .drawer-panel-open {
3945
+ position: fixed;
3946
+ inset: 60px 0 0 auto;
3947
+ z-index: 35;
3948
+ width: min(var(--drawer-width, 420px), 100vw);
3949
+ min-width: min(var(--drawer-width, 420px), 100vw);
3950
+ height: calc(100vh - 60px);
3951
+ }
3952
+ }
3953
+
3954
+ @media (max-width: 1024px) {
3955
+ .topbar {
3956
+ gap: 10px;
3957
+ padding: 0 12px;
3958
+ }
3959
+
3960
+ .topbar-kb {
3961
+ min-width: 150px;
3962
+ max-width: 30vw;
3963
+ padding: 5px 8px;
3964
+ }
3965
+
3966
+ .topbar-status {
3967
+ gap: 2px;
3968
+ }
3969
+
3970
+ .topbar-status-pill {
3971
+ width: 24px;
3972
+ max-width: 24px;
3973
+ justify-content: center;
3974
+ padding: 0;
3975
+ }
3976
+
3977
+ .topbar-status-pill span:last-child {
3978
+ display: none;
3979
+ }
3980
+
3981
+ .topbar-model {
3982
+ max-width: 170px;
3983
+ }
3984
+
3985
+ .shell-sidebar {
3986
+ width: 252px;
3987
+ min-width: 252px;
3988
+ }
3989
+
3990
+ .shell-sidebar-collapsed {
3991
+ width: 52px;
3992
+ min-width: 52px;
3993
+ }
3994
+
3995
+ .app-body .drawer-panel-open {
3996
+ width: var(--drawer-width, 360px);
3997
+ min-width: var(--drawer-width, 360px);
3998
+ }
3999
+ }
4000
+
4001
+ @media (max-width: 768px) {
4002
+ .topbar {
4003
+ min-height: 56px;
4004
+ gap: 6px;
4005
+ padding: 0 8px;
4006
+ }
4007
+
4008
+ .topbar-kb {
4009
+ flex: 1 1 auto;
4010
+ min-width: 128px;
4011
+ max-width: none;
4012
+ padding: 4px 6px;
4013
+ }
4014
+
4015
+ .topbar-kb-icon {
4016
+ width: 28px;
4017
+ height: 28px;
4018
+ }
4019
+
4020
+ .topbar-kb-name {
4021
+ font-size: 13px;
4022
+ }
4023
+
4024
+ .topbar-kb-meta {
4025
+ display: none;
4026
+ }
4027
+
4028
+ .topbar-actions {
4029
+ gap: 5px;
4030
+ }
4031
+
4032
+ .topbar-search {
4033
+ padding: 0 7px;
4034
+ }
4035
+
4036
+ .topbar-search span,
4037
+ .topbar-text-action span {
4038
+ display: none;
4039
+ }
4040
+
4041
+ .topbar-model {
4042
+ max-width: 112px;
4043
+ padding: 0 8px;
4044
+ }
4045
+
4046
+ .topbar-text-action {
4047
+ width: 34px;
4048
+ padding: 0;
4049
+ }
4050
+
4051
+ .app-body .drawer-panel-open {
4052
+ inset: 56px 0 0 auto;
4053
+ width: 100vw;
4054
+ min-width: 100vw;
4055
+ height: calc(100vh - 56px);
4056
+ }
4057
+
4058
+ .drawer-resize-handle {
4059
+ display: none;
4060
+ }
4061
+
4062
+ .chat-messages {
4063
+ padding: 12px;
4064
+ }
4065
+
4066
+ .msg-row {
4067
+ max-width: 95%;
4068
+ }
4069
+
4070
+ .chat-input-area {
4071
+ padding: 10px;
4072
+ }
4073
+
4074
+ .chat-input-hints {
4075
+ gap: 8px;
4076
+ }
4077
+
4078
+ .chat-input-hints .chat-input-hint:last-child {
4079
+ display: none;
4080
+ }
4081
+
4082
+ .export-bar-head {
4083
+ min-width: 100%;
4084
+ padding-bottom: 2px;
4085
+ }
4086
+
4087
+ .graph-screen {
4088
+ padding: 8px;
4089
+ }
4090
+
4091
+ .graph-shell {
4092
+ gap: 8px;
4093
+ }
4094
+
4095
+ .graph-shell-toolbar {
4096
+ align-items: flex-start;
4097
+ flex-wrap: wrap;
4098
+ }
4099
+
4100
+ .graph-shell-toolbar-left {
4101
+ min-width: 100%;
4102
+ flex-wrap: wrap;
4103
+ }
4104
+
4105
+ .graph-shell-toolbar-actions {
4106
+ width: 100%;
4107
+ justify-content: flex-start;
4108
+ overflow-x: auto;
4109
+ }
4110
+ }
4111
+ }
4112
+
4113
+ /* Theme tokens live outside Tailwind layers so they override the base palette. */
4114
+ :root,
4115
+ [data-theme="light"] {
4116
+ --app-bg: #fdfaf2;
4117
+ --app-surface: #fffdf7;
4118
+ --app-raised: #f4ede0;
4119
+ --app-fg: #3a3530;
4120
+ --app-muted: #8a8175;
4121
+ --app-faint: #b3a48c;
4122
+ --app-border: #ece3d2;
4123
+ --app-border-strong: #f0e6d4;
4124
+ --app-accent: #e07a5f;
4125
+ --app-accent-deep: #c0573f;
4126
+ --app-user: var(--app-accent);
4127
+ --app-accent-soft: #fff1ef;
4128
+ --app-fg-soft: color-mix(in srgb, var(--app-fg) 5%, transparent);
4129
+ --app-hover: rgba(224, 122, 95, 0.06);
4130
+ --app-success: #7ea868;
4131
+ --app-warn: #c98e3a;
4132
+ --app-danger: #c0573f;
4133
+ --comm-attn: #e9b9a6;
4134
+ --comm-seq: #bcd0a8;
4135
+ --comm-ssm: #c7c0a0;
4136
+ --paper-glow: radial-gradient(140% 95% at 50% -25%, rgba(255, 251, 240, 0.7), rgba(255, 251, 240, 0) 55%);
4137
+ --paper-vignette: radial-gradient(ellipse 105% 92% at 50% 40%, rgba(255, 255, 255, 0) 52%, rgba(120, 98, 70, 0.05) 100%);
4138
+ --paper-mottle: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='620' height='620'%3E%3Cfilter id='m'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.014' numOctaves='3' seed='11' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 0.55 0 0 0 0 0.45 0 0 0 0 0.33 0 0 0 0.13 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23m)'/%3E%3C/svg%3E");
4139
+ --paper-grain: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.6' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 0.5 0 0 0 0 0.42 0 0 0 0 0.3 0 0 0 0.075 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23g)'/%3E%3C/svg%3E");
4140
+ --dot: rgba(150, 132, 105, 0.22);
4141
+ --shadow: 0 1px 2px rgba(70, 55, 40, 0.05), 0 6px 16px rgba(70, 55, 40, 0.06);
4142
+ --shadow-lg: 0 4px 12px rgba(70, 55, 40, 0.08), 0 18px 44px rgba(70, 55, 40, 0.14);
4143
+ --soft-shadow: var(--shadow);
4144
+ }
4145
+
4146
+ .dark,
4147
+ [data-theme="dark"] {
4148
+ --app-bg: #211c16;
4149
+ --app-surface: #2a241d;
4150
+ --app-raised: #332a22;
4151
+ --app-fg: #ece4d4;
4152
+ --app-muted: #a89a82;
4153
+ --app-faint: #7d7060;
4154
+ --app-border: #3a3026;
4155
+ --app-border-strong: #4a3d30;
4156
+ --app-accent: #e8826a;
4157
+ --app-accent-deep: #f09680;
4158
+ --app-user: var(--app-accent);
4159
+ --app-accent-soft: rgba(224, 122, 95, 0.16);
4160
+ --app-fg-soft: color-mix(in srgb, var(--app-fg) 6%, transparent);
4161
+ --app-hover: rgba(224, 122, 95, 0.1);
4162
+ --app-success: #8eb074;
4163
+ --app-warn: #d9a857;
4164
+ --app-danger: #d4634a;
4165
+ --comm-attn: rgba(233, 185, 166, 0.24);
4166
+ --comm-seq: rgba(188, 208, 168, 0.24);
4167
+ --comm-ssm: rgba(199, 192, 160, 0.24);
4168
+ --paper-glow: radial-gradient(150% 100% at 50% -20%, rgba(232, 130, 106, 0.07), rgba(232, 130, 106, 0) 50%);
4169
+ --paper-vignette: radial-gradient(ellipse 110% 95% at 50% 38%, rgba(255, 255, 255, 0) 46%, rgba(0, 0, 0, 0.22) 100%);
4170
+ --paper-mottle: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='620' height='620'%3E%3Cfilter id='m'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.016' numOctaves='3' seed='11' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 0.92 0 0 0 0 0.85 0 0 0 0 0.74 0 0 0 0.05 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23m)'/%3E%3C/svg%3E");
4171
+ --paper-grain: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.6' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 0.9 0 0 0 0 0.83 0 0 0 0 0.72 0 0 0 0.06 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23g)'/%3E%3C/svg%3E");
4172
+ --dot: rgba(224, 200, 170, 0.13);
4173
+ --shadow: 0 1px 2px rgba(0, 0, 0, 0.25), 0 6px 16px rgba(0, 0, 0, 0.3);
4174
+ --shadow-lg: 0 4px 12px rgba(0, 0, 0, 0.3), 0 18px 44px rgba(0, 0, 0, 0.45);
4175
+ --soft-shadow: var(--shadow);
4176
+ }
4177
+
4178
+ [data-accent="clay"] {
4179
+ --app-accent: #cf6a48;
4180
+ --app-accent-deep: #a8492c;
4181
+ --app-user: var(--app-accent);
4182
+ --app-accent-soft: color-mix(in srgb, var(--app-accent) 13%, var(--card));
4183
+ }
4184
+
4185
+ [data-accent="terracotta"] {
4186
+ --app-accent: #e07a5f;
4187
+ --app-accent-deep: #c0573f;
4188
+ --app-user: var(--app-accent);
4189
+ --app-accent-soft: color-mix(in srgb, var(--app-accent) 13%, var(--card));
4190
+ }
4191
+
4192
+ [data-accent="amber"] {
4193
+ --app-accent: #d6913f;
4194
+ --app-accent-deep: #b06c20;
4195
+ --app-user: var(--app-accent);
4196
+ --app-accent-soft: color-mix(in srgb, var(--app-accent) 13%, var(--card));
4197
+ }
4198
+
4199
+ [data-accent="rose"] {
4200
+ --app-accent: #d36f72;
4201
+ --app-accent-deep: #b14a4d;
4202
+ --app-user: var(--app-accent);
4203
+ --app-accent-soft: color-mix(in srgb, var(--app-accent) 13%, var(--card));
4204
+ }