pmx-canvas 0.10.0 → 0.12.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 (343) hide show
  1. package/.github/extensions/pmx-canvas/extension.mjs +3 -1
  2. package/.github/extensions/pmx-canvas/runtime.json +1 -1
  3. package/.github/extensions/pmx-canvas/tools.json +688 -128
  4. package/CHANGELOG.md +69 -0
  5. package/dist/amp-plugin/pmx-canvas/LICENSE +21 -0
  6. package/dist/amp-plugin/pmx-canvas/THIRD_PARTY_LICENSES.txt +331 -0
  7. package/dist/amp-plugin/pmx-canvas/index.js +5445 -0
  8. package/dist/amp-plugin/pmx-canvas/runtime.json +3 -0
  9. package/dist/amp-plugin/pmx-canvas/shared-runtime.mjs +194 -0
  10. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/SKILL.md +251 -0
  11. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/evals/evals.json +1086 -0
  12. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/evals/fixtures/code-exploration/src/auth/jwt.ts +17 -0
  13. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/evals/fixtures/code-exploration/src/auth/login.ts +12 -0
  14. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/evals/fixtures/code-exploration/src/auth/middleware.ts +13 -0
  15. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/evals/fixtures/code-exploration/src/routes/auth.ts +13 -0
  16. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/evals/fixtures/investigation-board/src/handlers/users.ts +27 -0
  17. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/mcp.json +36 -0
  18. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/ax-html-control-surface.md +101 -0
  19. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/codex-app-adapter.md +151 -0
  20. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/excalidraw-diagram-authoring.md +150 -0
  21. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/full-reference.md +1785 -0
  22. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/github-copilot-app-adapter.md +223 -0
  23. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/html-primitives.md +139 -0
  24. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/importing-context.md +132 -0
  25. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/installing-pmx-canvas.md +251 -0
  26. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/tours-and-recording.md +111 -0
  27. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas/references/workbench-workflows.md +900 -0
  28. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas-orchestration/SKILL.md +141 -0
  29. package/dist/amp-plugin/pmx-canvas/skills/pmx-canvas-testing/SKILL.md +266 -0
  30. package/dist/amp-plugin/pmx-canvas/start-mcp.mjs +14857 -0
  31. package/dist/amp-plugin/pmx-canvas/tools.json +10963 -0
  32. package/dist/canvas/chunks/abnfDiagram-N423BO3Z-cwtsds5d.js +1 -0
  33. package/dist/canvas/chunks/architecture-TIHT7OUA-x63cwejs.js +1 -0
  34. package/dist/canvas/chunks/architectureDiagram-T3A2C74G-b4xc9tpz.js +36 -0
  35. package/dist/canvas/chunks/blockDiagram-VBNYF7ZC-ahp3yxxs.js +132 -0
  36. package/dist/canvas/chunks/c4Diagram-5PPSVZJV-nappnay7.js +10 -0
  37. package/dist/canvas/chunks/classDiagram-JCYQIIEL-k1j2xc1t.js +1 -0
  38. package/dist/canvas/chunks/classDiagram-v2-OCEON4UE-33x08xf2.js +1 -0
  39. package/dist/canvas/chunks/cose-bilkent-JH36ORCC-a428syda.js +1 -0
  40. package/dist/canvas/chunks/cynefin-VYW2F7L2-8v6jxfz8.js +1 -0
  41. package/dist/canvas/chunks/cynefinDiagram-MW4NZA55-nspsqebj.js +62 -0
  42. package/dist/canvas/chunks/dagre-VZM6K2ZE-8y6177fh.js +4 -0
  43. package/dist/canvas/chunks/diagram-7IWD3JNH-vym028wn.js +30 -0
  44. package/dist/canvas/chunks/diagram-B4RE2ZJO-jddqb8sy.js +3 -0
  45. package/dist/canvas/chunks/diagram-LBJQPF4R-bjwbpkrn.js +24 -0
  46. package/dist/canvas/chunks/diagram-Q27KOJAE-j6ph6hcx.js +24 -0
  47. package/dist/canvas/chunks/diagram-UB23O5K3-p09w8jej.js +41 -0
  48. package/dist/canvas/chunks/ebnfDiagram-BXEA7PRR-j975ycq5.js +1 -0
  49. package/dist/canvas/chunks/erDiagram-JOGREHBK-sxp6hjn8.js +85 -0
  50. package/dist/canvas/chunks/eventmodeling-45OFAUF4-xzfgn6xg.js +1 -0
  51. package/dist/canvas/chunks/flowDiagram-UKHOOZJN-2nsmkskb.js +1 -0
  52. package/dist/canvas/chunks/ganttDiagram-PKOTCBZU-4tv230y2.js +292 -0
  53. package/dist/canvas/chunks/gitGraph-TEB2WS4Q-macbhand.js +1 -0
  54. package/dist/canvas/chunks/gitGraphDiagram-DS77QQ5N-mqgmnw9g.js +106 -0
  55. package/dist/canvas/chunks/index-037z5dz2.js +232 -0
  56. package/dist/canvas/chunks/index-081n3har.js +207 -0
  57. package/dist/canvas/chunks/index-5n03dmb9.js +2 -0
  58. package/dist/canvas/chunks/index-5tv8v1hk.js +1 -0
  59. package/dist/canvas/chunks/index-60pgzdqe.js +157 -0
  60. package/dist/canvas/chunks/index-6ceya556.js +332 -0
  61. package/dist/canvas/chunks/index-8g1vb57n.js +2 -0
  62. package/dist/canvas/chunks/index-8rjes9r6.js +2 -0
  63. package/dist/canvas/chunks/index-9022d1n9.js +16 -0
  64. package/dist/canvas/chunks/index-9b02042t.js +2 -0
  65. package/dist/canvas/chunks/index-ap4q4vez.js +2 -0
  66. package/dist/canvas/chunks/index-dyp2nhd3.js +2 -0
  67. package/dist/canvas/chunks/index-frvta4tm.js +2 -0
  68. package/dist/canvas/chunks/index-gf4e0et4.js +2 -0
  69. package/dist/canvas/chunks/index-h9ycj8n2.js +2 -0
  70. package/dist/canvas/chunks/index-hj99nz1f.js +1 -0
  71. package/dist/canvas/chunks/index-mergmj97.js +2 -0
  72. package/dist/canvas/chunks/index-nwsya6dj.js +301 -0
  73. package/dist/canvas/chunks/index-nz8qbd1p.js +2 -0
  74. package/dist/canvas/chunks/index-qhfrazv3.js +2 -0
  75. package/dist/canvas/chunks/index-v119nznk.js +4 -0
  76. package/dist/canvas/chunks/index-vpt37m3d.js +89 -0
  77. package/dist/canvas/chunks/index-y9ma6azy.js +2 -0
  78. package/dist/canvas/chunks/index-zx0j3a2z.js +179 -0
  79. package/dist/canvas/chunks/info-DKCQHKI2-a0ykzs9z.js +1 -0
  80. package/dist/canvas/chunks/infoDiagram-6WML65LV-qv97qq6a.js +2 -0
  81. package/dist/canvas/chunks/ishikawaDiagram-WSZJBQD7-p9306gh0.js +70 -0
  82. package/dist/canvas/chunks/journeyDiagram-NVQOT4AX-sv67zats.js +139 -0
  83. package/dist/canvas/chunks/kanban-definition-27J2QSJJ-k2pfam6p.js +89 -0
  84. package/dist/canvas/chunks/katex-dmg8k4zm.js +257 -0
  85. package/dist/canvas/chunks/mermaid.core-83r0fdce.js +12 -0
  86. package/dist/canvas/chunks/mindmap-definition-FAOFIHXS-vg2newm1.js +96 -0
  87. package/dist/canvas/chunks/packet-7NZHBO7P-tqnabcdv.js +1 -0
  88. package/dist/canvas/chunks/pegDiagram-VL7TDLO6-k2h7zc5n.js +1 -0
  89. package/dist/canvas/chunks/pie-RZYD4A2V-wke6gyhe.js +1 -0
  90. package/dist/canvas/chunks/pieDiagram-7S7Q4E2Y-hg169p1v.js +39 -0
  91. package/dist/canvas/chunks/quadrantDiagram-CIZ2JOQS-bxtvsq0b.js +7 -0
  92. package/dist/canvas/chunks/radar-I7S5WNFK-w7ka0drw.js +1 -0
  93. package/dist/canvas/chunks/railroad-3IZDKUUU-y3vg318x.js +1 -0
  94. package/dist/canvas/chunks/railroad-abnf-AHOZXSZD-6hqvcz3c.js +1 -0
  95. package/dist/canvas/chunks/railroad-ebnf-EBAXGLYW-vcae260m.js +1 -0
  96. package/dist/canvas/chunks/railroad-peg-LSFZ7HO6-0dbyme23.js +1 -0
  97. package/dist/canvas/chunks/railroadDiagram-AXF67PYL-njyhcp4p.js +1 -0
  98. package/dist/canvas/chunks/requirementDiagram-LRYGKXZP-2z6v09gm.js +84 -0
  99. package/dist/canvas/chunks/sankeyDiagram-W5VNT64P-15mzam0e.js +40 -0
  100. package/dist/canvas/chunks/sequenceDiagram-SI44F4Z6-rbshyd2c.js +162 -0
  101. package/dist/canvas/chunks/sizeCapture-X5ZJPWSS-sg26xwts.js +1 -0
  102. package/dist/canvas/chunks/stateDiagram-OKZ733FA-6eahp98e.js +1 -0
  103. package/dist/canvas/chunks/stateDiagram-v2-UEYNNEHI-tty0ggn5.js +1 -0
  104. package/dist/canvas/chunks/swimlanes-SLNWSIFB-ze5db10t.js +1 -0
  105. package/dist/canvas/chunks/swimlanesDiagram-ULZ7WXOC-thze75gq.js +8 -0
  106. package/dist/canvas/chunks/timeline-definition-Z64GVDOM-vnp7jyy8.js +120 -0
  107. package/dist/canvas/chunks/treeView-QDETBFTQ-6ysffnm6.js +1 -0
  108. package/dist/canvas/chunks/treemap-6X3UGDF4-m3h9p066.js +1 -0
  109. package/dist/canvas/chunks/vennDiagram-T6HMQDX7-0qrnb7mj.js +34 -0
  110. package/dist/canvas/chunks/wardley-OPB4EBWU-dp37drwx.js +1 -0
  111. package/dist/canvas/chunks/wardleyDiagram-T6FBY63Y-8nxg8wqt.js +78 -0
  112. package/dist/canvas/chunks/xychartDiagram-ELKLHX3M-nj921e7s.js +7 -0
  113. package/dist/canvas/global.css +483 -230
  114. package/dist/canvas/index.js +158 -219
  115. package/dist/canvas/mcp-app.html +4301 -548
  116. package/dist/canvas/mermaid-entry.js +338 -338
  117. package/dist/canvas/surface-theme.css +6 -6
  118. package/dist/json-render/index.css +1 -1
  119. package/dist/json-render/index.js +49 -49
  120. package/dist/types/client/canvas/BarHint.d.ts +5 -3
  121. package/dist/types/client/canvas/BoardMoveDialog.d.ts +2 -0
  122. package/dist/types/client/canvas/CanvasNode.d.ts +0 -11
  123. package/dist/types/client/canvas/EdgeEditor.d.ts +19 -0
  124. package/dist/types/client/canvas/EdgeLayer.d.ts +1 -2
  125. package/dist/types/client/canvas/GroupNavigation.d.ts +2 -0
  126. package/dist/types/client/canvas/TextPrompt.d.ts +4 -0
  127. package/dist/types/client/canvas/auto-fit.d.ts +4 -5
  128. package/dist/types/client/mermaid-entry.d.ts +1 -2
  129. package/dist/types/client/mermaid-render.d.ts +1 -0
  130. package/dist/types/client/nodes/BoardNode.d.ts +1 -1
  131. package/dist/types/client/nodes/ExtAppFrame.d.ts +7 -90
  132. package/dist/types/client/nodes/McpAppNode.d.ts +1 -25
  133. package/dist/types/client/nodes/MermaidNode.d.ts +1 -8
  134. package/dist/types/client/nodes/PromptNode.d.ts +1 -0
  135. package/dist/types/client/nodes/ViewerFrame.d.ts +29 -0
  136. package/dist/types/client/nodes/ViewerHost.d.ts +6 -0
  137. package/dist/types/client/nodes/WorkCard.d.ts +7 -0
  138. package/dist/types/client/nodes/iframe-document-url.d.ts +3 -9
  139. package/dist/types/client/nodes/primitive-copy.d.ts +5 -0
  140. package/dist/types/client/nodes/use-ax-surface-bridge.d.ts +1 -0
  141. package/dist/types/client/nodes/use-iframe-content-height.d.ts +1 -1
  142. package/dist/types/client/nodes/use-surface-frame.d.ts +4 -6
  143. package/dist/types/client/nodes/viewer-runtime-state.d.ts +2 -1
  144. package/dist/types/client/state/canvas-store.d.ts +18 -1
  145. package/dist/types/client/state/human-store.d.ts +2 -0
  146. package/dist/types/client/state/intent-bridge.d.ts +5 -2
  147. package/dist/types/client/state/presentation.d.ts +17 -6
  148. package/dist/types/client/state/relation-store.d.ts +11 -0
  149. package/dist/types/client/types.d.ts +1 -1
  150. package/dist/types/json-render/catalog.d.ts +2 -2
  151. package/dist/types/json-render/server.d.ts +2 -1
  152. package/dist/types/server/agent-presence.d.ts +1 -0
  153. package/dist/types/server/ax-interaction.d.ts +1 -0
  154. package/dist/types/server/ax-state-manager.d.ts +10 -2
  155. package/dist/types/server/board-local.d.ts +4 -0
  156. package/dist/types/server/board-move.d.ts +38 -0
  157. package/dist/types/server/canvas-db.d.ts +12 -2
  158. package/dist/types/server/canvas-operations.d.ts +5 -6
  159. package/dist/types/server/canvas-provenance.d.ts +1 -1
  160. package/dist/types/server/canvas-serialization.d.ts +1 -0
  161. package/dist/types/server/canvas-state.d.ts +86 -20
  162. package/dist/types/server/card-relocation.d.ts +6 -0
  163. package/dist/types/server/context-reads.d.ts +3 -1
  164. package/dist/types/server/human-presence.d.ts +1 -1
  165. package/dist/types/server/index.d.ts +26 -10
  166. package/dist/types/server/intent-registry.d.ts +8 -4
  167. package/dist/types/server/knowledge-lifecycle.d.ts +4 -2
  168. package/dist/types/server/mutation-history.d.ts +7 -5
  169. package/dist/types/server/operations/ops/boards.d.ts +0 -1
  170. package/dist/types/server/operations/registry.d.ts +2 -0
  171. package/dist/types/server/tour-control.d.ts +13 -3
  172. package/dist/types/server/trace-manager.d.ts +1 -0
  173. package/dist/types/shared/ax-kinds.d.ts +6 -0
  174. package/dist/types/shared/ax-surface-protocol.d.ts +8 -9
  175. package/dist/types/shared/human-presence.d.ts +1 -0
  176. package/dist/types/shared/lifecycle-status.d.ts +2 -0
  177. package/dist/types/shared/tour.d.ts +8 -0
  178. package/docs/RELEASE.md +21 -14
  179. package/docs/agent-plugin.md +16 -2
  180. package/docs/amp-plugin.md +271 -0
  181. package/docs/cli.md +42 -3
  182. package/docs/design/Chrome.dc.html +32 -6
  183. package/docs/design/GuestName.dc.html +50 -0
  184. package/docs/design/PluginLogo.svg +7 -0
  185. package/docs/design/Types1.dc.html +3 -2
  186. package/docs/design/Types2.dc.html +1 -1
  187. package/docs/design/Types3.dc.html +1 -1
  188. package/docs/design/WorkCards.dc.html +39 -0
  189. package/docs/design/Zoom.dc.html +37 -60
  190. package/docs/design/canvas.json +17 -1
  191. package/docs/design/plugin-logo.png +0 -0
  192. package/docs/design.md +280 -12
  193. package/docs/evals/agents-md-sections.md +38 -0
  194. package/docs/http-api.md +179 -11
  195. package/docs/mcp.md +69 -9
  196. package/docs/node-types.md +109 -4
  197. package/docs/plans/plan-009-tech-debt-backlog.md +3 -3
  198. package/docs/plans/plan-019-post-0.9-roadmap.md +327 -31
  199. package/docs/plans/plan-020-wave-5-work-planning.md +553 -0
  200. package/docs/product-vision-2026-09.md +42 -17
  201. package/docs/sdk.md +18 -0
  202. package/package.json +7 -4
  203. package/plugins/pmx-canvas/assets/preview.png +0 -0
  204. package/plugins/pmx-canvas/com.github.copilot/extensions/pmx-canvas/extension.mjs +3 -1
  205. package/plugins/pmx-canvas/com.github.copilot/extensions/pmx-canvas/runtime.json +1 -1
  206. package/plugins/pmx-canvas/plugin.json +2 -2
  207. package/plugins/pmx-canvas/runtime.json +1 -1
  208. package/plugins/pmx-canvas/tools.json +688 -128
  209. package/skills/data-analysis/SKILL.md +13 -26
  210. package/skills/frontend-design/LICENSE.txt +177 -0
  211. package/skills/frontend-design/SKILL.md +3 -0
  212. package/skills/pmx-canvas/SKILL.md +232 -849
  213. package/skills/pmx-canvas/evals/evals.json +26 -3
  214. package/skills/pmx-canvas/references/full-reference.md +89 -24
  215. package/skills/pmx-canvas/references/html-primitives.md +7 -0
  216. package/skills/pmx-canvas/references/installing-pmx-canvas.md +6 -6
  217. package/skills/pmx-canvas/references/tours-and-recording.md +29 -2
  218. package/skills/pmx-canvas/references/workbench-workflows.md +900 -0
  219. package/skills/pmx-canvas-testing/SKILL.md +7 -5
  220. package/skills/published-consumer-e2e/SKILL.md +25 -8
  221. package/skills/published-consumer-e2e/scripts/run-published-consumer-e2e.sh +51 -77
  222. package/skills/web-artifacts-builder/LICENSE.txt +202 -0
  223. package/skills/web-artifacts-builder/SKILL.md +6 -0
  224. package/skills/web-artifacts-builder/scripts/init-artifact.sh +2 -2
  225. package/src/cli/commands/apps.ts +1 -0
  226. package/src/cli/commands/boards.ts +30 -0
  227. package/src/client/App.tsx +20 -4
  228. package/src/client/canvas/AttentionHistory.tsx +10 -2
  229. package/src/client/canvas/BarHint.tsx +6 -3
  230. package/src/client/canvas/BoardMoveDialog.tsx +225 -0
  231. package/src/client/canvas/CanvasNode.tsx +79 -49
  232. package/src/client/canvas/CanvasViewport.tsx +42 -14
  233. package/src/client/canvas/ContextMenu.tsx +97 -15
  234. package/src/client/canvas/EdgeEditor.tsx +149 -0
  235. package/src/client/canvas/EdgeLayer.tsx +441 -174
  236. package/src/client/canvas/ExpandedNodeOverlay.tsx +5 -2
  237. package/src/client/canvas/GroupNavigation.tsx +85 -0
  238. package/src/client/canvas/Presentation.tsx +53 -3
  239. package/src/client/canvas/RelationsPanel.tsx +9 -0
  240. package/src/client/canvas/SelectionBar.tsx +21 -0
  241. package/src/client/canvas/SessionPanel.tsx +35 -1
  242. package/src/client/canvas/TextPrompt.tsx +18 -1
  243. package/src/client/canvas/TopBar.tsx +54 -9
  244. package/src/client/canvas/auto-fit.ts +9 -11
  245. package/src/client/canvas/canvas-area.ts +2 -2
  246. package/src/client/canvas/use-focus-trap.ts +6 -1
  247. package/src/client/mermaid-entry.ts +6 -20
  248. package/src/client/mermaid-render.ts +39 -0
  249. package/src/client/nodes/AxStepControls.tsx +45 -69
  250. package/src/client/nodes/BoardNode.tsx +65 -9
  251. package/src/client/nodes/ContextNode.tsx +88 -396
  252. package/src/client/nodes/ExtAppFrame.tsx +302 -1465
  253. package/src/client/nodes/FileNode.tsx +92 -81
  254. package/src/client/nodes/HtmlNode.tsx +8 -36
  255. package/src/client/nodes/LedgerNode.tsx +31 -17
  256. package/src/client/nodes/MarkdownNode.tsx +14 -24
  257. package/src/client/nodes/McpAppNode.tsx +48 -154
  258. package/src/client/nodes/MermaidNode.tsx +80 -69
  259. package/src/client/nodes/PromptNode.tsx +44 -17
  260. package/src/client/nodes/ResponseNode.tsx +8 -6
  261. package/src/client/nodes/StatusNode.tsx +34 -7
  262. package/src/client/nodes/StatusSummary.tsx +16 -3
  263. package/src/client/nodes/TraceNode.tsx +8 -8
  264. package/src/client/nodes/ViewerFrame.tsx +273 -0
  265. package/src/client/nodes/ViewerHost.tsx +41 -0
  266. package/src/client/nodes/WebpageNode.tsx +22 -24
  267. package/src/client/nodes/WorkCard.tsx +175 -0
  268. package/src/client/nodes/iframe-document-url.ts +20 -27
  269. package/src/client/nodes/primitive-copy.ts +97 -0
  270. package/src/client/nodes/use-ax-surface-bridge.ts +18 -14
  271. package/src/client/nodes/use-iframe-content-height.ts +34 -10
  272. package/src/client/nodes/use-surface-frame.ts +22 -11
  273. package/src/client/nodes/viewer-runtime-state.ts +41 -35
  274. package/src/client/state/attention-bridge.ts +5 -0
  275. package/src/client/state/attention-store.ts +1 -0
  276. package/src/client/state/canvas-store.ts +202 -26
  277. package/src/client/state/human-store.ts +22 -2
  278. package/src/client/state/intent-bridge.ts +20 -5
  279. package/src/client/state/presentation.ts +135 -15
  280. package/src/client/state/relation-store.ts +127 -1
  281. package/src/client/state/sse-bridge.ts +18 -19
  282. package/src/client/theme/global.css +483 -230
  283. package/src/client/theme/surface-theme.css +6 -6
  284. package/src/client/types.ts +1 -0
  285. package/src/json-render/charts/tufte-components.tsx +44 -2
  286. package/src/json-render/renderer/index.css +62 -2
  287. package/src/json-render/renderer/index.tsx +31 -7
  288. package/src/json-render/server.ts +3 -2
  289. package/src/mcp/server.ts +13 -3
  290. package/src/server/agent-presence.ts +43 -23
  291. package/src/server/ax-flow-loop.ts +6 -0
  292. package/src/server/ax-gate-ttl.ts +8 -1
  293. package/src/server/ax-interaction.ts +16 -10
  294. package/src/server/ax-state-manager.ts +17 -4
  295. package/src/server/ax-wait.ts +20 -6
  296. package/src/server/board-export.ts +54 -30
  297. package/src/server/board-local.ts +20 -0
  298. package/src/server/board-move.ts +297 -0
  299. package/src/server/canvas-db.ts +249 -158
  300. package/src/server/canvas-geometry.ts +1 -0
  301. package/src/server/canvas-operations.ts +139 -109
  302. package/src/server/canvas-schema.ts +21 -0
  303. package/src/server/canvas-serialization.ts +2 -0
  304. package/src/server/canvas-state.ts +797 -159
  305. package/src/server/card-relocation.ts +53 -0
  306. package/src/server/code-graph.ts +4 -3
  307. package/src/server/context-reads.ts +83 -55
  308. package/src/server/demo-state.json +140 -114
  309. package/src/server/file-watcher.ts +30 -10
  310. package/src/server/html-primitives.ts +3 -9
  311. package/src/server/html-surface.ts +8 -0
  312. package/src/server/human-presence.ts +18 -5
  313. package/src/server/index.ts +54 -24
  314. package/src/server/intent-registry.ts +43 -5
  315. package/src/server/knowledge-lifecycle.ts +32 -9
  316. package/src/server/lifecycle-status.ts +29 -1
  317. package/src/server/mcp-app-runtime.ts +26 -7
  318. package/src/server/mutation-history.ts +37 -8
  319. package/src/server/operations/composites.ts +6 -3
  320. package/src/server/operations/mcp-contracts.ts +32 -2
  321. package/src/server/operations/mcp.ts +36 -9
  322. package/src/server/operations/ops/annotation.ts +22 -1
  323. package/src/server/operations/ops/ax-await.ts +1 -0
  324. package/src/server/operations/ops/ax-timeline.ts +28 -2
  325. package/src/server/operations/ops/batch.ts +25 -11
  326. package/src/server/operations/ops/boards.ts +45 -6
  327. package/src/server/operations/ops/nodes.ts +70 -0
  328. package/src/server/operations/ops/query.ts +32 -3
  329. package/src/server/operations/ops/snapshots.ts +1 -0
  330. package/src/server/operations/ops/viewport.ts +11 -9
  331. package/src/server/operations/registry.ts +49 -4
  332. package/src/server/server.ts +69 -75
  333. package/src/server/tour-control.ts +97 -12
  334. package/src/server/trace-manager.ts +4 -0
  335. package/src/server/web-artifacts/scripts/init-artifact.sh +2 -2
  336. package/src/shared/agent-context.ts +7 -1
  337. package/src/shared/auto-arrange.ts +5 -4
  338. package/src/shared/ax-kinds.ts +13 -0
  339. package/src/shared/ax-surface-protocol.ts +20 -9
  340. package/src/shared/content-height-reporter.ts +4 -3
  341. package/src/shared/human-presence.ts +1 -0
  342. package/src/shared/lifecycle-status.ts +2 -0
  343. package/src/shared/tour.ts +8 -0
@@ -84,12 +84,12 @@
84
84
  /* ── Core palette (dark · ink + cyan) ────────────────────── */
85
85
  --c-bg: #081524;
86
86
  --c-panel: #0f1d31;
87
- --c-panel-soft: #0a1729;
87
+ --c-panel-soft: #13243b;
88
88
  --c-line: #1b2c44;
89
89
  --c-text: #e6eef7;
90
- --c-text-soft: #c7d3ea;
90
+ --c-text-soft: #b9c6d6;
91
91
  --c-muted: #8ea3bd;
92
- --c-dim: #5c6b80;
92
+ --c-dim: #6b7d94;
93
93
  --c-accent: #4BBCFF;
94
94
  --c-ok: #2fd07f;
95
95
  --c-warn: #f4c542;
@@ -106,7 +106,7 @@
106
106
  --c-rel-informs: #E58FB0;
107
107
  --c-rel-related: #8ea3bd;
108
108
  --c-input-bg: #0a1729;
109
- --c-dot-grid: rgba(75, 188, 255, 0.08);
109
+ --c-dot-grid: rgba(142, 163, 189, 0.14);
110
110
  --c-panel-overlay: rgba(8, 21, 36, 0.6);
111
111
  --c-panel-glass: rgba(15, 29, 49, 0.92);
112
112
  --c-shadow: rgba(0, 0, 0, 0.3);
@@ -148,19 +148,19 @@
148
148
  }
149
149
 
150
150
  .board-node, .md-card-preview { display: flex; flex-direction: column; height: 100%; min-height: 0; }
151
+ .board-node > .home-thumb { height: 96px; flex-shrink: 0; }
152
+ .board-node-missing { display: grid; place-items: center; min-height: 72px; margin: 10px 10px 0; border: 1px dashed var(--c-line); border-radius: var(--r-control); color: var(--c-muted); font-size: var(--fs-meta); }
153
+ .board-node-relink { max-width: 100%; margin-top: 8px; padding: 4px 8px; color: var(--c-text); background: var(--c-panel); border: 1px solid var(--c-line); border-radius: var(--r-control); font: var(--fs-ui) var(--font-ui); }
151
154
  .board-node-content { flex: 1; min-height: 0; overflow: auto; padding: 16px; overflow-wrap: anywhere; }
152
- .board-node-label { color: var(--c-dim); font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: .1em; margin-bottom: 8px; }
153
155
  .board-node-title { display: block; font-size: 17px; line-height: 1.35; margin-bottom: 6px; }
154
156
  .board-node-meta { color: var(--c-dim); font-size: 11px; line-height: 1.5; }
155
157
  .board-node-summary { color: var(--c-text-soft); font-size: 13px; line-height: 1.6; margin: 14px 0; }
156
158
  .board-node-open { display: flex; justify-content: space-between; align-items: center; flex-shrink: 0; width: 100%; padding: 10px 16px; border: 0; border-top: 1px solid var(--c-line); background: var(--c-panel); color: var(--c-accent); font: 500 12px var(--font-ui); text-align: left; cursor: pointer; }
157
- .board-node-open:hover:not(:disabled) { background: color-mix(in srgb, var(--c-accent) 8%, transparent); }
158
- .board-node-open:disabled { color: var(--c-dim); cursor: default; }
159
+ .board-node-open:hover { background: color-mix(in srgb, var(--c-accent) 8%, transparent); }
159
160
  .md-card-content { flex: 1; min-height: 0; overflow: auto; }
160
161
  .md-card-actions { display: flex; align-items: center; gap: 8px; flex-shrink: 0; border-top: 1px solid var(--c-line); padding: 6px 36px 6px 8px; background: var(--c-panel); }
161
- .md-card-actions button { border: 1px solid transparent; border-radius: var(--radius-sm); background: transparent; color: var(--c-dim); padding: 4px 8px; font: 500 11px var(--font-ui); cursor: pointer; }
162
+ .md-card-actions button { border: 1px solid transparent; border-radius: var(--r-control); background: transparent; color: var(--c-dim); padding: 4px 8px; font: 500 var(--fs-meta) var(--font-ui); cursor: pointer; }
162
163
  .md-card-actions button:hover { color: var(--c-text); background: color-mix(in srgb, var(--c-accent) 8%, transparent); }
163
- .md-card-actions .md-readme-btn[aria-pressed="true"] { color: var(--c-accent); background: color-mix(in srgb, var(--c-accent) 8%, transparent); border-color: color-mix(in srgb, var(--c-accent) 25%, transparent); }
164
164
  .md-card-edit { margin-left: auto; }
165
165
  .board-node-open:focus-visible, .md-card-actions button:focus-visible { outline: 2px solid var(--c-accent); outline-offset: -2px; }
166
166
  .canvas-node[data-node-type="markdown"] .node-body,
@@ -599,30 +599,62 @@ body,
599
599
  display: contents;
600
600
  }
601
601
 
602
+ .node-header-meta {
603
+ color: var(--c-dim);
604
+ font-size: var(--fs-meta);
605
+ white-space: nowrap;
606
+ overflow: hidden;
607
+ text-overflow: ellipsis;
608
+ max-width: 20%;
609
+ }
610
+
611
+ .node-readme-mark {
612
+ flex-shrink: 0;
613
+ color: var(--c-muted);
614
+ font-size: var(--fs-meta);
615
+ white-space: nowrap;
616
+ }
617
+
618
+ /* Chrome §9: the markdown title becomes the section heading. */
619
+ .canvas-node.heading-node {
620
+ background: transparent;
621
+ border-color: transparent;
622
+ box-shadow: none;
623
+ }
624
+ .canvas-node.heading-node .node-titlebar {
625
+ border: 0;
626
+ padding: 8px 16px 0;
627
+ background: transparent;
628
+ }
629
+ .canvas-node.heading-node .node-title {
630
+ font-size: var(--fs-heading);
631
+ line-height: 28px;
632
+ letter-spacing: -0.01em;
633
+ }
634
+ .canvas-node.heading-node .node-type-icon { display: none; }
635
+ .heading-node:not(:hover):not(:focus-within) .node-controls { visibility: hidden; }
636
+ .heading-node:not(:hover):not(:focus-within) .node-resize-handle { visibility: hidden; }
637
+ .canvas-node.heading-node .node-body { padding: 0 16px 8px; color: var(--c-muted); }
638
+
602
639
  .canvas-node:hover {
603
- box-shadow: 0 6px 32px var(--c-shadow);
640
+ box-shadow: var(--e-2);
604
641
  }
605
642
 
606
643
  .canvas-node.active {
607
644
  border-color: var(--c-accent);
608
- box-shadow: 0 0 0 1px var(--c-accent), 0 6px 32px color-mix(in srgb, var(--c-accent) 15%, transparent);
645
+ box-shadow: 0 0 0 1px var(--c-accent), var(--e-1);
609
646
  }
610
647
 
611
648
  .canvas-node.neighbor {
612
649
  border-color: color-mix(in srgb, var(--c-accent) 40%, transparent);
613
- box-shadow: 0 0 0 1px color-mix(in srgb, var(--c-accent) 30%, transparent), 0 4px 20px color-mix(in srgb, var(--c-accent) 15%, transparent);
650
+ box-shadow: var(--e-1);
614
651
  transition: border-color 0.2s, box-shadow 0.2s, opacity 0.15s ease;
615
652
  }
616
653
 
617
654
  /* Spatial search highlighting — canvas lights up as you type in Cmd+K */
618
655
  .canvas-node.search-match {
619
656
  border-color: var(--c-accent);
620
- box-shadow: 0 0 0 2px var(--c-accent), 0 0 20px color-mix(in srgb, var(--c-accent) 30%, transparent), 0 0 40px color-mix(in srgb, var(--c-accent) 15%, transparent);
621
- animation: search-pulse 1.5s ease-in-out infinite;
622
- }
623
- @keyframes search-pulse {
624
- 0%, 100% { box-shadow: 0 0 0 2px var(--c-accent), 0 0 20px color-mix(in srgb, var(--c-accent) 30%, transparent), 0 0 40px color-mix(in srgb, var(--c-accent) 15%, transparent); }
625
- 50% { box-shadow: 0 0 0 2px var(--c-accent), 0 0 30px color-mix(in srgb, var(--c-accent) 40%, transparent), 0 0 60px color-mix(in srgb, var(--c-accent) 25%, transparent); }
657
+ box-shadow: 0 0 0 2px var(--c-accent), var(--e-1);
626
658
  }
627
659
  .canvas-node.search-dimmed {
628
660
  opacity: 0.25;
@@ -687,9 +719,9 @@ body,
687
719
  .canvas-node .node-titlebar {
688
720
  display: flex;
689
721
  align-items: center;
690
- gap: calc(8px * var(--node-chrome-scale, 1));
691
- padding: calc(7px * var(--node-chrome-scale, 1)) calc(12px * var(--node-chrome-scale, 1));
692
- background: var(--c-panel-overlay);
722
+ gap: 8px;
723
+ padding: 7px 12px;
724
+ background: transparent;
693
725
  border-bottom: 1px solid var(--c-line);
694
726
  cursor: grab;
695
727
  user-select: none;
@@ -701,9 +733,10 @@ body,
701
733
  }
702
734
 
703
735
  .canvas-node .node-title {
704
- font-size: calc(12px * var(--node-chrome-scale, 1));
736
+ font-size: calc(12px * var(--node-title-scale, 1));
737
+ line-height: 22px;
705
738
  font-weight: 600;
706
- color: var(--c-text-soft);
739
+ color: var(--c-text);
707
740
  white-space: nowrap;
708
741
  overflow: hidden;
709
742
  text-overflow: ellipsis;
@@ -718,16 +751,16 @@ body,
718
751
  display: inline-flex;
719
752
  align-items: center;
720
753
  justify-content: center;
721
- width: calc(14px * var(--node-chrome-scale, 1));
722
- height: calc(14px * var(--node-chrome-scale, 1));
754
+ width: 14px;
755
+ height: 14px;
723
756
  color: var(--c-muted);
724
757
  flex-shrink: 0;
725
758
  }
726
759
 
727
760
  .canvas-node .node-type-badge {
728
- font-size: calc(10px * var(--node-chrome-scale, 1));
729
- padding: calc(1px * var(--node-chrome-scale, 1)) calc(6px * var(--node-chrome-scale, 1));
730
- border-radius: calc(4px * var(--node-chrome-scale, 1));
761
+ font-size: 10px;
762
+ padding: 1px 6px;
763
+ border-radius: 4px;
731
764
  background: color-mix(in srgb, var(--c-accent) 12%, transparent);
732
765
  color: var(--c-accent);
733
766
  text-transform: uppercase;
@@ -736,16 +769,12 @@ body,
736
769
  }
737
770
 
738
771
  .canvas-node .node-ax-status {
739
- /* A long status ("in-progress") must not push the node's NAME out of the bar;
740
- the pill is a glance-level cue, the name is the identity. */
741
- max-width: 11ch;
742
- overflow: hidden;
743
- text-overflow: ellipsis;
772
+ /* The status is a complete word, never an ellipsis: the title is the part of
773
+ the bar that gives way (HeaderMarks keeps it its minimum width). */
744
774
  white-space: nowrap;
745
- flex-shrink: 1;
746
- font-size: calc(9px * var(--node-chrome-scale, 1));
747
- padding: calc(1px * var(--node-chrome-scale, 1)) calc(6px * var(--node-chrome-scale, 1));
748
- border-radius: calc(4px * var(--node-chrome-scale, 1));
775
+ font-size: 9px;
776
+ padding: 1px 6px;
777
+ border-radius: 4px;
749
778
  background: var(--c-panel-overlay);
750
779
  color: var(--c-muted);
751
780
  text-transform: uppercase;
@@ -768,7 +797,7 @@ body,
768
797
  .canvas-node .node-controls {
769
798
  display: flex;
770
799
  align-items: center;
771
- gap: calc(4px * var(--node-chrome-scale, 1));
800
+ gap: 4px;
772
801
  flex-shrink: 0;
773
802
  }
774
803
 
@@ -780,12 +809,12 @@ body,
780
809
  display: inline-flex;
781
810
  align-items: center;
782
811
  justify-content: center;
783
- min-width: calc(22px * var(--node-chrome-scale, 1));
784
- min-height: calc(22px * var(--node-chrome-scale, 1));
785
- padding: calc(2px * var(--node-chrome-scale, 1)) calc(4px * var(--node-chrome-scale, 1));
786
- font-size: calc(14px * var(--node-chrome-scale, 1));
812
+ min-width: 22px;
813
+ min-height: 22px;
814
+ padding: 2px 4px;
815
+ font-size: 14px;
787
816
  line-height: 1;
788
- border-radius: calc(3px * var(--node-chrome-scale, 1));
817
+ border-radius: 3px;
789
818
  }
790
819
 
791
820
  .canvas-node .node-controls button svg {
@@ -815,11 +844,36 @@ body,
815
844
  overflow: auto;
816
845
  padding: 10px 14px;
817
846
  min-height: 0;
818
- font-size: 11px;
847
+ font-size: var(--fs-ui);
819
848
  line-height: 1.6;
820
849
  color: var(--c-text-soft);
821
850
  }
822
851
 
852
+ /* In-card editing is view state, never a persisted resize. */
853
+ .canvas-node:has(.work-card-editor) { height: auto !important; }
854
+ .canvas-node:has(.work-card-editor) .node-body { flex: none; overflow: visible; }
855
+ .work-card { display: flex; flex-direction: column; gap: 12px; }
856
+ .work-card-state { color: var(--c-text); font-weight: 600; }
857
+ .work-card-blocked .work-card-state, .work-card-state.work-card-blocked, .work-card-error { color: var(--c-warn); }
858
+ .work-card-done .work-card-state, .work-card-state.work-card-done { color: var(--c-ok); }
859
+ .work-card-cancelled .work-card-state, .work-card-state.work-card-cancelled { color: var(--c-muted); }
860
+ .work-card-detail { white-space: pre-wrap; overflow-wrap: anywhere; }
861
+ .work-card-live { color: var(--c-muted); font-size: var(--fs-meta); overflow-wrap: anywhere; }
862
+ .work-card-progress { color: var(--c-muted); font-size: var(--fs-meta); }
863
+ .work-card footer, .work-card-editor footer { display: flex; justify-content: flex-end; gap: 8px; margin-top: 8px; }
864
+ .work-card button, .work-card-editor button, .work-card-editor input, .work-card-editor select, .work-card-editor textarea {
865
+ font: inherit; color: var(--c-text); background: var(--c-input-bg); border: 1px solid var(--c-line); border-radius: var(--r-control); padding: 8px;
866
+ }
867
+ .work-card button, .work-card-editor button { cursor: pointer; }
868
+ .work-card button:hover, .work-card-editor button:hover { border-color: var(--c-text-soft); }
869
+ .work-card-editor fieldset { border: 0; margin: 0; padding: 0; min-width: 0; }
870
+ .work-card-editor label { display: flex; flex-direction: column; gap: 4px; margin-bottom: 12px; }
871
+ .work-card-editor input, .work-card-editor select, .work-card-editor textarea { width: 100%; box-sizing: border-box; }
872
+ .work-card-editor textarea { min-height: 80px; resize: vertical; }
873
+ .work-card-editor .work-card-save { background: var(--c-accent); color: var(--c-contrast-fg); }
874
+ .work-card-editor :disabled { cursor: wait; opacity: 0.65; }
875
+ .work-card-editor :focus-visible, .work-card button:focus-visible { outline: 2px solid var(--c-accent); outline-offset: 2px; }
876
+
823
877
  /* Markdown rendered content inside nodes */
824
878
  .canvas-node .node-body h1,
825
879
  .canvas-node .node-body h2,
@@ -1268,6 +1322,18 @@ body,
1268
1322
  border-color: var(--c-line);
1269
1323
  }
1270
1324
 
1325
+ .human-name-control { order: 4; flex-shrink: 0; }
1326
+ .human-name-button {
1327
+ width: 28px;
1328
+ height: 28px;
1329
+ padding: 0;
1330
+ border-color: var(--c-line);
1331
+ border-radius: var(--r-pill);
1332
+ background: var(--c-panel-soft);
1333
+ color: var(--c-text-soft);
1334
+ font: 600 12px var(--font-ui);
1335
+ }
1336
+
1271
1337
  .top-bar-zoom-label {
1272
1338
  min-width: 38px;
1273
1339
  text-align: center;
@@ -1420,7 +1486,7 @@ body,
1420
1486
  outline-offset: 2px;
1421
1487
  }
1422
1488
  .agent-chip-who {
1423
- font: 10px var(--font-code);
1489
+ font: var(--fs-meta) var(--font-code);
1424
1490
  font-weight: 400;
1425
1491
  color: var(--c-muted);
1426
1492
  white-space: nowrap;
@@ -1454,7 +1520,7 @@ body,
1454
1520
  transform-origin: top left;
1455
1521
  }
1456
1522
  .agent-cursor.is-worker .agent-cursor-chip {
1457
- font-size: 9px;
1523
+ font-size: var(--fs-meta);
1458
1524
  padding: 1px 6px;
1459
1525
  }
1460
1526
  /* Parked idle cursors leave the board (user feedback, 0.5.1 cycle): with many agents
@@ -1477,7 +1543,7 @@ body,
1477
1543
  border-radius: 8px;
1478
1544
  background: color-mix(in srgb, var(--c-accent) 16%, transparent);
1479
1545
  color: var(--c-accent);
1480
- font-size: 9px;
1546
+ font-size: var(--fs-meta);
1481
1547
  font-weight: 700;
1482
1548
  letter-spacing: 0.04em;
1483
1549
  white-space: nowrap;
@@ -1601,10 +1667,10 @@ body,
1601
1667
  border: 1px solid color-mix(in srgb, var(--presence-color) 35%, transparent);
1602
1668
  background: color-mix(in srgb, var(--c-panel) 92%, var(--presence-color) 8%);
1603
1669
  color: var(--presence-color);
1604
- font-size: 10.5px;
1670
+ font-size: var(--fs-meta);
1605
1671
  font-weight: 600;
1606
1672
  white-space: nowrap;
1607
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
1673
+ box-shadow: var(--e-2);
1608
1674
  }
1609
1675
  .agent-cursor-dot {
1610
1676
  width: 6px;
@@ -1617,7 +1683,7 @@ body,
1617
1683
  animation: presence-pulse 1.4s ease-in-out infinite;
1618
1684
  }
1619
1685
  .agent-cursor-who {
1620
- font: 9.5px var(--font-code);
1686
+ font: var(--fs-meta) var(--font-code);
1621
1687
  font-weight: 400;
1622
1688
  color: var(--c-muted);
1623
1689
  }
@@ -1673,7 +1739,7 @@ body,
1673
1739
  }
1674
1740
  .session-collapsed-label {
1675
1741
  writing-mode: vertical-rl;
1676
- font-size: 10px;
1742
+ font-size: var(--fs-meta);
1677
1743
  font-weight: 600;
1678
1744
  letter-spacing: 0.08em;
1679
1745
  text-transform: uppercase;
@@ -1684,7 +1750,7 @@ body,
1684
1750
  flex-direction: column;
1685
1751
  align-items: center;
1686
1752
  gap: 4px;
1687
- font: 9px var(--font-code);
1753
+ font: var(--fs-meta) var(--font-code);
1688
1754
  color: var(--c-dim);
1689
1755
  }
1690
1756
  .session-collapsed-live .session-live-dot {
@@ -1712,7 +1778,7 @@ body,
1712
1778
  display: inline-flex;
1713
1779
  align-items: center;
1714
1780
  gap: 5px;
1715
- font: 10px var(--font-code);
1781
+ font: var(--fs-meta) var(--font-code);
1716
1782
  color: var(--c-muted);
1717
1783
  }
1718
1784
  .session-live.phase-thinking {
@@ -1765,14 +1831,14 @@ body,
1765
1831
  }
1766
1832
  .session-section-title {
1767
1833
  margin: 0 0 8px;
1768
- font-size: 10px;
1834
+ font-size: var(--fs-meta);
1769
1835
  font-weight: 700;
1770
1836
  letter-spacing: 0.08em;
1771
1837
  text-transform: uppercase;
1772
1838
  color: var(--c-dim);
1773
1839
  }
1774
1840
  .session-empty {
1775
- font-size: 10.5px;
1841
+ font-size: var(--fs-meta);
1776
1842
  line-height: 1.5;
1777
1843
  color: var(--c-dim);
1778
1844
  }
@@ -1823,6 +1889,19 @@ body,
1823
1889
  flex: 1;
1824
1890
  min-width: 0;
1825
1891
  }
1892
+ .session-show-work {
1893
+ margin-top: 8px;
1894
+ padding: 4px 8px;
1895
+ font: inherit;
1896
+ color: var(--c-text);
1897
+ background: var(--c-input-bg);
1898
+ border: 1px solid var(--c-line);
1899
+ border-radius: var(--r-control);
1900
+ cursor: pointer;
1901
+ }
1902
+ .session-show-work:hover { border-color: var(--c-text-soft); }
1903
+ .session-show-work:focus-visible { outline: 2px solid var(--c-accent); outline-offset: 2px; }
1904
+ .session-show-work:disabled { cursor: wait; opacity: 0.65; }
1826
1905
  .session-item-title {
1827
1906
  display: block;
1828
1907
  width: 100%;
@@ -1846,12 +1925,12 @@ body,
1846
1925
  }
1847
1926
  .session-item-detail {
1848
1927
  margin-top: 2px;
1849
- font-size: 10.5px;
1928
+ font-size: var(--fs-meta);
1850
1929
  line-height: 1.45;
1851
1930
  color: var(--c-muted);
1852
1931
  }
1853
1932
  .session-item-status {
1854
- font-size: 9px;
1933
+ font-size: var(--fs-meta);
1855
1934
  font-weight: 700;
1856
1935
  letter-spacing: 0.06em;
1857
1936
  text-transform: uppercase;
@@ -1860,7 +1939,7 @@ body,
1860
1939
  margin-top: 3px;
1861
1940
  }
1862
1941
  .session-item-time {
1863
- font: 9px var(--font-code);
1942
+ font: var(--fs-meta) var(--font-code);
1864
1943
  color: var(--c-dim);
1865
1944
  flex-shrink: 0;
1866
1945
  margin-top: 4px;
@@ -1871,7 +1950,7 @@ body,
1871
1950
  }
1872
1951
  .session-gate-ttl {
1873
1952
  margin-top: 4px;
1874
- font: 10px var(--font-code);
1953
+ font: var(--fs-meta) var(--font-code);
1875
1954
  color: var(--c-warn);
1876
1955
  }
1877
1956
  .session-gate-held {
@@ -1933,7 +2012,7 @@ body,
1933
2012
  display: inline-flex;
1934
2013
  align-items: center;
1935
2014
  gap: 6px;
1936
- font: 10px/1 var(--font-code);
2015
+ font: var(--fs-meta)/1 var(--font-code);
1937
2016
  color: var(--c-muted);
1938
2017
  }
1939
2018
  .session-work-dot {
@@ -2015,7 +2094,7 @@ body,
2015
2094
  anchored tooltip would clip against the filter row's own scroll container. */
2016
2095
  .session-timeline-hint {
2017
2096
  margin: -4px 0 8px;
2018
- font-size: 10px;
2097
+ font-size: var(--fs-meta);
2019
2098
  line-height: 1.35;
2020
2099
  color: var(--c-muted);
2021
2100
  min-height: 14px;
@@ -2071,7 +2150,7 @@ body,
2071
2150
  /* Row writer in its identity hue — multi-assistant boards need every row to
2072
2151
  answer "who wrote this" without opening anything. */
2073
2152
  .session-timeline-who {
2074
- font-size: 10px;
2153
+ font-size: var(--fs-meta);
2075
2154
  font-weight: 600;
2076
2155
  color: var(--identity-color, var(--c-muted));
2077
2156
  white-space: nowrap;
@@ -2100,11 +2179,11 @@ body,
2100
2179
  }
2101
2180
  .session-timeline-undone {
2102
2181
  margin-top: 2px;
2103
- font: 9px var(--font-code);
2182
+ font: var(--fs-meta) var(--font-code);
2104
2183
  color: var(--c-dim);
2105
2184
  }
2106
2185
  .session-timeline-body {
2107
- font-size: 10.5px;
2186
+ font-size: var(--fs-meta);
2108
2187
  line-height: 1.5;
2109
2188
  color: var(--c-text-soft);
2110
2189
  overflow-wrap: anywhere;
@@ -2117,7 +2196,7 @@ body,
2117
2196
  gap: 8px;
2118
2197
  padding: 8px 12px 8px 16px;
2119
2198
  border-bottom: 1px solid var(--c-line);
2120
- font-size: 10.5px;
2199
+ font-size: var(--fs-meta);
2121
2200
  color: var(--c-muted);
2122
2201
  }
2123
2202
  .session-scope.is-fenced {
@@ -2147,7 +2226,7 @@ body,
2147
2226
  border: 1px solid var(--c-line);
2148
2227
  background: none;
2149
2228
  color: var(--c-muted);
2150
- font-size: 10.5px;
2229
+ font-size: var(--fs-meta);
2151
2230
  font-weight: 600;
2152
2231
  cursor: pointer;
2153
2232
  white-space: nowrap;
@@ -2181,7 +2260,7 @@ body,
2181
2260
  border: 1px solid color-mix(in srgb, var(--c-agent) 35%, transparent);
2182
2261
  background: color-mix(in srgb, var(--c-panel) 92%, var(--c-agent) 8%);
2183
2262
  color: var(--c-agent);
2184
- font-size: 10px;
2263
+ font-size: var(--fs-meta);
2185
2264
  font-weight: 600;
2186
2265
  letter-spacing: 0.04em;
2187
2266
  white-space: nowrap;
@@ -2315,7 +2394,7 @@ body,
2315
2394
  background: color-mix(in srgb, var(--c-pin) 25%, transparent);
2316
2395
  }
2317
2396
  .command-bar-chips-note {
2318
- font-size: 10px;
2397
+ font-size: var(--fs-meta);
2319
2398
  color: var(--c-dim);
2320
2399
  }
2321
2400
  .command-bar-composer {
@@ -2328,7 +2407,7 @@ body,
2328
2407
  border: 1px solid var(--c-line);
2329
2408
  background: color-mix(in srgb, var(--c-panel) 95%, transparent);
2330
2409
  backdrop-filter: blur(16px);
2331
- box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5);
2410
+ box-shadow: var(--e-2);
2332
2411
  }
2333
2412
  .command-bar-target {
2334
2413
  max-width: 148px;
@@ -2448,7 +2527,7 @@ body,
2448
2527
  border-radius: 50%;
2449
2528
  border: 1.5px solid var(--c-panel-soft);
2450
2529
  color: var(--c-bg);
2451
- font-size: 8.5px;
2530
+ font-size: var(--fs-meta);
2452
2531
  font-weight: 700;
2453
2532
  flex-shrink: 0;
2454
2533
  }
@@ -2482,7 +2561,7 @@ body,
2482
2561
  font-weight: 600;
2483
2562
  }
2484
2563
  .external-indicator-ops {
2485
- font: 10px var(--font-code);
2564
+ font: var(--fs-meta) var(--font-code);
2486
2565
  color: var(--c-muted);
2487
2566
  }
2488
2567
  .external-indicator-dot {
@@ -2504,8 +2583,8 @@ body,
2504
2583
  flex-direction: column;
2505
2584
  background: var(--c-panel);
2506
2585
  border: 1px solid color-mix(in srgb, var(--c-agent) 30%, transparent);
2507
- border-radius: 10px;
2508
- box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5);
2586
+ border-radius: var(--r-overlay);
2587
+ box-shadow: var(--e-2);
2509
2588
  /* Popover-level like the rail menus: above the minimap, below the rail. */
2510
2589
  z-index: 9999;
2511
2590
  overflow: hidden;
@@ -2528,7 +2607,7 @@ body,
2528
2607
  color: var(--c-text);
2529
2608
  }
2530
2609
  .activity-feed-sub {
2531
- font: 9px var(--font-code);
2610
+ font: var(--fs-meta) var(--font-code);
2532
2611
  color: var(--c-dim);
2533
2612
  }
2534
2613
  .activity-feed-close {
@@ -2556,7 +2635,7 @@ body,
2556
2635
  border: 1px solid var(--c-line);
2557
2636
  background: none;
2558
2637
  color: var(--c-muted);
2559
- font-size: 10px;
2638
+ font-size: var(--fs-meta);
2560
2639
  font-weight: 600;
2561
2640
  cursor: pointer;
2562
2641
  }
@@ -2614,7 +2693,7 @@ body,
2614
2693
  overflow-wrap: anywhere;
2615
2694
  }
2616
2695
  .activity-meta {
2617
- font-size: 10px;
2696
+ font-size: var(--fs-meta);
2618
2697
  line-height: 1.45;
2619
2698
  color: var(--c-muted);
2620
2699
  }
@@ -2633,7 +2712,7 @@ body,
2633
2712
  background: none;
2634
2713
  border: 1px solid color-mix(in srgb, var(--c-danger) 40%, transparent);
2635
2714
  color: var(--c-danger);
2636
- font-size: 10.5px;
2715
+ font-size: var(--fs-meta);
2637
2716
  font-weight: 600;
2638
2717
  cursor: pointer;
2639
2718
  }
@@ -2642,7 +2721,7 @@ body,
2642
2721
  }
2643
2722
  .activity-hint,
2644
2723
  .activity-age {
2645
- font: 9px var(--font-code);
2724
+ font: var(--fs-meta) var(--font-code);
2646
2725
  color: var(--c-dim);
2647
2726
  flex-shrink: 0;
2648
2727
  }
@@ -2661,7 +2740,7 @@ body,
2661
2740
  }
2662
2741
  .activity-feed-note {
2663
2742
  flex: 1;
2664
- font-size: 10px;
2743
+ font-size: var(--fs-meta);
2665
2744
  color: var(--c-dim);
2666
2745
  }
2667
2746
  .activity-feed-link {
@@ -2669,7 +2748,7 @@ body,
2669
2748
  border: none;
2670
2749
  padding: 0;
2671
2750
  color: var(--c-muted);
2672
- font-size: 10.5px;
2751
+ font-size: var(--fs-meta);
2673
2752
  font-weight: 600;
2674
2753
  cursor: pointer;
2675
2754
  }
@@ -2698,8 +2777,8 @@ body,
2698
2777
  max-width: calc(100% - 48px);
2699
2778
  background: var(--c-panel);
2700
2779
  border: 1px solid var(--c-line);
2701
- border-radius: 12px;
2702
- box-shadow: 0 24px 60px rgba(0, 0, 0, 0.6);
2780
+ border-radius: var(--r-overlay);
2781
+ box-shadow: var(--e-2);
2703
2782
  z-index: 10000;
2704
2783
  overflow: hidden;
2705
2784
  }
@@ -2718,7 +2797,7 @@ body,
2718
2797
  color: var(--c-text);
2719
2798
  }
2720
2799
  .writers-board {
2721
- font: 9px var(--font-code);
2800
+ font: var(--fs-meta) var(--font-code);
2722
2801
  color: var(--c-dim);
2723
2802
  }
2724
2803
  .writers-body {
@@ -2729,7 +2808,7 @@ body,
2729
2808
  }
2730
2809
  .writers-section {
2731
2810
  padding: 8px 0 2px;
2732
- font-size: 9px;
2811
+ font-size: var(--fs-meta);
2733
2812
  font-weight: 700;
2734
2813
  letter-spacing: 0.08em;
2735
2814
  text-transform: uppercase;
@@ -2754,7 +2833,7 @@ body,
2754
2833
  font: 11px var(--font-code);
2755
2834
  }
2756
2835
  .writers-config {
2757
- font-size: 9.5px;
2836
+ font-size: var(--fs-meta);
2758
2837
  font-weight: 600;
2759
2838
  padding: 2px 8px;
2760
2839
  border-radius: 999px;
@@ -2762,11 +2841,11 @@ body,
2762
2841
  color: var(--c-agent);
2763
2842
  }
2764
2843
  .writers-meta {
2765
- font: 9.5px var(--font-code);
2844
+ font: var(--fs-meta) var(--font-code);
2766
2845
  color: var(--c-dim);
2767
2846
  }
2768
2847
  .writers-empty {
2769
- font-size: 10.5px;
2848
+ font-size: var(--fs-meta);
2770
2849
  color: var(--c-dim);
2771
2850
  padding: 4px 0;
2772
2851
  }
@@ -2780,7 +2859,7 @@ body,
2780
2859
  }
2781
2860
  .writers-note {
2782
2861
  flex: 1;
2783
- font-size: 10px;
2862
+ font-size: var(--fs-meta);
2784
2863
  color: var(--c-dim);
2785
2864
  }
2786
2865
  .writers-done {
@@ -2803,9 +2882,9 @@ body,
2803
2882
  width: 168px;
2804
2883
  height: 112px;
2805
2884
  border: 1px solid var(--c-line);
2806
- border-radius: 8px;
2885
+ border-radius: var(--r-node);
2807
2886
  overflow: hidden;
2808
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.35);
2887
+ box-shadow: var(--e-2);
2809
2888
  background: color-mix(in srgb, var(--c-panel-soft) 94%, transparent);
2810
2889
  backdrop-filter: blur(8px);
2811
2890
  z-index: 60;
@@ -2820,7 +2899,7 @@ body,
2820
2899
  .minimap:hover {
2821
2900
  opacity: 1;
2822
2901
  transform: scale(1.7);
2823
- box-shadow: 0 12px 40px rgba(0, 0, 0, 0.55);
2902
+ box-shadow: var(--e-2);
2824
2903
  }
2825
2904
  .minimap-node {
2826
2905
  position: absolute;
@@ -2939,7 +3018,7 @@ body,
2939
3018
  border-radius: 8px;
2940
3019
  border: 1px solid color-mix(in srgb, var(--c-accent) 45%, transparent);
2941
3020
  color: var(--c-accent);
2942
- font-size: 9px;
3021
+ font-size: var(--fs-meta);
2943
3022
  font-weight: 700;
2944
3023
  letter-spacing: 0.06em;
2945
3024
  text-transform: uppercase;
@@ -2973,12 +3052,12 @@ body,
2973
3052
  white-space: nowrap;
2974
3053
  }
2975
3054
  .edge-hint-main {
2976
- font-size: 10px;
3055
+ font-size: var(--fs-meta);
2977
3056
  font-weight: 600;
2978
3057
  color: var(--c-accent);
2979
3058
  }
2980
3059
  .edge-hint-keys {
2981
- font: 9px var(--font-code);
3060
+ font: var(--fs-meta) var(--font-code);
2982
3061
  color: var(--c-dim);
2983
3062
  }
2984
3063
 
@@ -3010,7 +3089,7 @@ body,
3010
3089
  border-radius: 999px;
3011
3090
  background: color-mix(in srgb, var(--c-ok) 92%, transparent);
3012
3091
  color: var(--c-bg);
3013
- font-size: 10px;
3092
+ font-size: var(--fs-meta);
3014
3093
  font-weight: 600;
3015
3094
  white-space: nowrap;
3016
3095
  }
@@ -3033,7 +3112,7 @@ body,
3033
3112
  background: var(--c-panel-soft);
3034
3113
  border: 1px solid color-mix(in srgb, var(--c-agent) 40%, transparent);
3035
3114
  color: var(--c-agent);
3036
- font-size: 9.5px;
3115
+ font-size: var(--fs-meta);
3037
3116
  font-weight: 600;
3038
3117
  white-space: nowrap;
3039
3118
  }
@@ -3079,7 +3158,7 @@ body,
3079
3158
  border: 1px solid var(--c-line);
3080
3159
  background: none;
3081
3160
  color: var(--c-muted);
3082
- font-size: 10.5px;
3161
+ font-size: var(--fs-meta);
3083
3162
  font-weight: 600;
3084
3163
  cursor: pointer;
3085
3164
  }
@@ -3156,7 +3235,7 @@ body,
3156
3235
  gap: 2px;
3157
3236
  }
3158
3237
  .session-receipt-tile-label {
3159
- font-size: 9.5px;
3238
+ font-size: var(--fs-meta);
3160
3239
  color: var(--c-dim);
3161
3240
  }
3162
3241
  .session-receipt-tile-value {
@@ -3364,7 +3443,7 @@ body,
3364
3443
  .session-receipt-note,
3365
3444
  .session-receipt-diff {
3366
3445
  margin-top: 10px;
3367
- font-size: 10.5px;
3446
+ font-size: var(--fs-meta);
3368
3447
  line-height: 1.5;
3369
3448
  color: var(--c-muted);
3370
3449
  }
@@ -3437,7 +3516,7 @@ body,
3437
3516
  right: 0;
3438
3517
  bottom: 0;
3439
3518
  width: 312px;
3440
- box-shadow: -16px 0 40px rgba(0, 0, 0, 0.5);
3519
+ box-shadow: var(--e-2);
3441
3520
  }
3442
3521
  }
3443
3522
 
@@ -3711,7 +3790,7 @@ body,
3711
3790
  min-width: 0;
3712
3791
  }
3713
3792
  .connection-banner-meta {
3714
- font: 9.5px var(--font-code);
3793
+ font: var(--fs-meta) var(--font-code);
3715
3794
  color: var(--c-muted);
3716
3795
  }
3717
3796
  .connection-banner-progress {
@@ -3784,6 +3863,29 @@ body,
3784
3863
  background: var(--c-panel);
3785
3864
  }
3786
3865
 
3866
+ /* A floating hint would clip inside the scrolling menu. Keep its explanation in flow. */
3867
+ .top-bar-more-menu .toolbar-tooltip-anchor {
3868
+ display: flex;
3869
+ flex-direction: column;
3870
+ align-items: stretch;
3871
+ }
3872
+ .toolbar-menu.top-bar-more-menu .toolbar-tooltip {
3873
+ position: static;
3874
+ display: none;
3875
+ opacity: 1;
3876
+ transform: none;
3877
+ min-width: 0;
3878
+ max-width: 240px;
3879
+ white-space: normal;
3880
+ box-shadow: none;
3881
+ margin: 0 4px 8px;
3882
+ }
3883
+ .top-bar-more-menu .toolbar-tooltip-anchor:hover .toolbar-tooltip,
3884
+ .top-bar-more-menu .toolbar-tooltip-anchor:has(> :focus-visible) .toolbar-tooltip {
3885
+ display: flex;
3886
+ }
3887
+ .top-bar-more-menu .toolbar-tooltip::after { display: none; }
3888
+
3787
3889
  .toolbar-menu-item {
3788
3890
  display: flex;
3789
3891
  align-items: center;
@@ -3844,7 +3946,7 @@ kbd.toolbar-menu-hint {
3844
3946
 
3845
3947
  .toolbar-menu-heading {
3846
3948
  padding: 6px 12px 2px;
3847
- font-size: 10px;
3949
+ font-size: var(--fs-meta);
3848
3950
  letter-spacing: 0.08em;
3849
3951
  text-transform: uppercase;
3850
3952
  color: var(--c-dim);
@@ -3882,7 +3984,7 @@ kbd.toolbar-menu-hint {
3882
3984
  margin: 0;
3883
3985
  padding: 5px 10px;
3884
3986
  color: var(--c-muted);
3885
- font-size: 10px;
3987
+ font-size: var(--fs-meta);
3886
3988
  line-height: 1.5;
3887
3989
  }
3888
3990
 
@@ -4473,7 +4575,7 @@ html.is-node-resizing .ext-app-preview-catcher {
4473
4575
 
4474
4576
  .canvas-node .pin-indicator {
4475
4577
  color: var(--c-accent);
4476
- font-size: calc(11px * var(--node-chrome-scale, 1));
4578
+ font-size: 11px;
4477
4579
  opacity: 0.6;
4478
4580
  }
4479
4581
 
@@ -4481,13 +4583,13 @@ html.is-node-resizing .ext-app-preview-catcher {
4481
4583
  .canvas-node .node-title-input {
4482
4584
  flex: 1;
4483
4585
  min-width: 0;
4484
- font-size: calc(12px * var(--node-chrome-scale, 1));
4586
+ font-size: calc(12px * var(--node-title-scale, 1));
4485
4587
  font-weight: 600;
4486
4588
  color: var(--c-text);
4487
4589
  background: var(--c-surface-hover);
4488
4590
  border: 1px solid var(--c-accent);
4489
- border-radius: calc(3px * var(--node-chrome-scale, 1));
4490
- padding: calc(1px * var(--node-chrome-scale, 1)) calc(6px * var(--node-chrome-scale, 1));
4591
+ border-radius: 3px;
4592
+ padding: 1px 6px;
4491
4593
  outline: none;
4492
4594
  font-family: inherit;
4493
4595
  }
@@ -4518,18 +4620,28 @@ html.is-node-resizing .ext-app-preview-catcher {
4518
4620
  text-align: left;
4519
4621
  }
4520
4622
 
4521
- .context-menu-item:hover {
4623
+ .context-menu-item:hover:not(:disabled), .context-menu-item:focus-visible {
4522
4624
  background: color-mix(in srgb, var(--c-accent) 10%, transparent);
4523
4625
  color: var(--c-accent);
4524
4626
  }
4525
4627
 
4628
+ .context-menu-item:focus-visible {
4629
+ outline: 2px solid var(--c-accent);
4630
+ outline-offset: -2px;
4631
+ }
4632
+
4633
+ .context-menu-item:disabled {
4634
+ color: var(--c-muted);
4635
+ cursor: default;
4636
+ }
4637
+
4526
4638
  .context-menu-item.is-danger .context-menu-label {
4527
4639
  color: var(--c-danger);
4528
4640
  }
4529
4641
 
4530
4642
  .context-menu-shortcut {
4531
4643
  color: var(--c-muted);
4532
- font-size: 10px;
4644
+ font-size: var(--fs-meta);
4533
4645
  margin-left: 16px;
4534
4646
  }
4535
4647
 
@@ -4559,7 +4671,7 @@ html.is-node-resizing .ext-app-preview-catcher {
4559
4671
 
4560
4672
  .context-menu-section-label {
4561
4673
  color: var(--c-muted);
4562
- font-size: 10px;
4674
+ font-size: var(--fs-meta);
4563
4675
  font-weight: 600;
4564
4676
  letter-spacing: 0.08em;
4565
4677
  text-transform: uppercase;
@@ -4710,7 +4822,7 @@ html.is-node-resizing .ext-app-preview-catcher {
4710
4822
  background: var(--c-input-bg);
4711
4823
  color: var(--c-text);
4712
4824
  }
4713
- .relation-legend { position: absolute; top: 8px; left: 12px; right: 12px; display: flex; flex-wrap: wrap; align-content: flex-start; gap: 6px; max-height: min(180px, 25%); overflow-x: hidden; overflow-y: auto; }
4825
+ .relation-legend { position: absolute; top: 8px; left: 12px; right: 12px; display: flex; flex-wrap: wrap; align-content: flex-start; gap: 6px; max-height: min(180px, 25%); overflow-x: hidden; overflow-y: auto; pointer-events: none; }
4714
4826
  .lifecycle-filters ~ .relation-legend { top: 48px; }
4715
4827
  .relation-legend > * { pointer-events: auto; flex-shrink: 0; max-width: 100%; height: 24px; box-sizing: border-box; border: 1px solid var(--c-line); border-radius: var(--r-control); background: var(--c-panel); color: var(--c-text); font: 500 11px var(--font-ui); padding: 0 9px; cursor: pointer; }
4716
4828
  .relation-legend select { background: var(--c-panel-soft); font-weight: 600; padding: 0 10px; }
@@ -4718,6 +4830,31 @@ html.is-node-resizing .ext-app-preview-catcher {
4718
4830
  .relation-legend button[aria-pressed="true"] { border-color: var(--relation-ink); }
4719
4831
  .relation-swatch { width: 14px; height: 2.5px; border-radius: 2px; background: var(--relation-ink); }
4720
4832
  .relation-count { color: var(--c-muted); font-variant-numeric: tabular-nums; }
4833
+ .relation-legend > span { display: flex; align-items: center; cursor: default; }
4834
+ .relation-legend .relation-warning { color: var(--c-warn); }
4835
+ .edge-editor { position: fixed; z-index: 1000; box-sizing: border-box; padding: 3px; border: 1px solid var(--c-line); border-radius: 8px; background: var(--c-panel); color: var(--c-text); box-shadow: var(--e-1); font: 500 11px var(--font-ui); }
4836
+ .edge-editor fieldset { border: 0; padding: 0; margin: 0; min-width: 0; }
4837
+ .edge-editor-tools { display: flex; gap: 3px; }
4838
+ .edge-editor-tools select { flex: 1; min-width: 0; }
4839
+ .edge-editor button, .edge-editor select, .relation-navigation button, .group-breadcrumbs button { min-height: 24px; border: 1px solid var(--c-line); border-radius: var(--r-control); padding: 3px 7px; background: var(--c-panel-soft); color: var(--c-text); font: inherit; cursor: pointer; }
4840
+ .edge-editor button:hover, .group-breadcrumbs button:hover, .relation-navigation button:hover { background: var(--c-hover); }
4841
+ .edge-editor-field { display: grid; gap: 8px; padding: 8px; }
4842
+ .edge-editor-field label { display: grid; gap: 4px; }
4843
+ .edge-editor input { box-sizing: border-box; width: 100%; min-width: 0; padding: 6px; border: 1px solid var(--c-line); border-radius: var(--r-control); color: var(--c-text); background: var(--c-input-bg); font: inherit; }
4844
+ .edge-editor p { margin: 6px; color: var(--c-warn); }
4845
+ .relation-navigation { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 12px; }
4846
+ .group-breadcrumbs { position: absolute; top: 8px; left: 12px; right: 12px; display: flex; flex-wrap: wrap; align-items: center; gap: 4px; max-height: 64px; overflow: auto; pointer-events: auto; color: var(--c-muted); font: 500 11px var(--font-ui); }
4847
+ .group-breadcrumbs button[aria-current] { color: var(--c-text); cursor: default; }
4848
+ .group-breadcrumbs > button:last-child { margin-left: auto; }
4849
+ .canvas-region:has(.group-breadcrumbs) .relation-legend { top: 80px; }
4850
+ .canvas-region:has(.group-breadcrumbs) .lifecycle-filters { top: 80px; }
4851
+ .canvas-region:has(.group-breadcrumbs) .lifecycle-filters ~ .relation-legend { top: 120px; }
4852
+ .group-inside-frame { position: absolute; border: 1px dashed var(--c-line); border-radius: 12px; pointer-events: none; box-sizing: border-box; z-index: -6; }
4853
+ .group-inside-frame > span { position: absolute; top: -9px; left: 12px; padding: 0 6px; background: var(--c-bg); color: var(--c-muted); font: 500 12px var(--font-ui); }
4854
+ .group-outside-endpoint { position: absolute; width: 170px; height: 60px; z-index: 2; }
4855
+ .group-outside-label { position: absolute; top: -24px; color: var(--c-muted); font: 500 12px var(--font-ui); }
4856
+ .group-outside-stub { width: 100%; height: 100%; box-sizing: border-box; padding: 8px 12px; border: 1px dashed var(--c-line); border-radius: 10px; text-align: left; background: var(--c-panel); color: var(--c-text); font: 600 12px var(--font-ui); cursor: pointer; overflow: hidden; }
4857
+ .group-outside-stub span { display: block; margin-top: 4px; color: var(--c-muted); font: 11px var(--font-ui); }
4721
4858
  .expanded-content-row { display: flex; flex: 1; min-height: 0; }
4722
4859
  .expanded-content-row > .expanded-body { flex: 1; min-width: 0; }
4723
4860
  .relations-panel {
@@ -4743,9 +4880,9 @@ html.is-node-resizing .ext-app-preview-catcher {
4743
4880
  .relations-panel { width: auto; flex: none; border-left: 0; border-top: 1px solid var(--c-line); overflow: visible; }
4744
4881
  }
4745
4882
 
4746
- /* Trace nodes — compact pills for agent tool/subagent visualization */
4883
+ /* Types1: trace cards share the node shell, with a violet running mark. */
4747
4884
  .canvas-node.trace-node {
4748
- border-radius: 28px;
4885
+ border-radius: var(--r-node);
4749
4886
  min-height: 0;
4750
4887
  }
4751
4888
 
@@ -4764,19 +4901,27 @@ html.is-node-resizing .ext-app-preview-catcher {
4764
4901
  }
4765
4902
 
4766
4903
  .canvas-node.trace-node.trace-running {
4767
- border-color: var(--c-accent);
4768
- animation: trace-pulse 2s ease-in-out infinite;
4769
- }
4770
-
4771
- @keyframes trace-pulse {
4772
- 0%,
4773
- 100% {
4774
- box-shadow: 0 0 0 0 color-mix(in srgb, var(--c-accent) 30%, transparent);
4775
- }
4776
- 50% {
4777
- box-shadow: 0 0 0 4px color-mix(in srgb, var(--c-accent) 15%, transparent);
4778
- }
4779
- }
4904
+ border-top: 3px solid var(--c-agent);
4905
+ }
4906
+
4907
+ .context-node { display: flex; flex-direction: column; gap: 8px; font-size: var(--fs-ui); }
4908
+ .context-node-expanded { max-width: 760px; margin: 0 auto; }
4909
+ .context-node-toolbar { display: flex; align-items: center; justify-content: space-between; gap: 8px; flex-wrap: wrap; }
4910
+ .context-usage { display: flex; align-items: center; gap: 8px; font-size: var(--fs-meta); color: var(--c-muted); flex-wrap: wrap; }
4911
+ .context-usage-track { display: inline-block; width: 64px; height: 4px; overflow: hidden; border-radius: var(--r-pill); background: var(--c-line); }
4912
+ .context-usage-track > span, .status-progress > div { display: block; height: 100%; }
4913
+ .context-node-label { color: var(--c-muted); font-size: var(--fs-meta); font-weight: 600; }
4914
+ .context-row { display: block; padding: 8px 0; border-top: 1px solid var(--c-line); overflow-wrap: anywhere; }
4915
+ .context-row-title { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; }
4916
+ .context-row-title > span { flex-shrink: 0; font-size: var(--fs-meta); color: var(--c-muted); }
4917
+ .context-row-title > .context-row-warning { color: var(--c-warn); }
4918
+ .context-row-meta, .context-row-summary { color: var(--c-muted); font-size: var(--fs-meta); line-height: 1.5; }
4919
+ .context-row-summary { white-space: pre-wrap; }
4920
+ .context-row-open { margin-top: 6px; padding: 4px 8px; background: var(--c-panel-soft); border: 1px solid var(--c-line); border-radius: var(--r-control); color: var(--c-text); font-size: var(--fs-meta); cursor: pointer; }
4921
+ .status-progress { height: 4px; background: var(--c-line); border-radius: var(--r-pill); overflow: hidden; }
4922
+ .node-file-toolbar { min-width: 0; max-width: 50%; }
4923
+ .file-toolbar-metadata { display: flex; align-items: center; gap: 8px; flex: 1; min-width: 0; overflow: hidden; white-space: nowrap; }
4924
+ .prompt-key-hint { padding: 2px 6px; border: 1px solid var(--c-line); border-radius: var(--r-control); color: var(--c-muted); font: var(--fs-meta) var(--font-ui); }
4780
4925
 
4781
4926
  /* Diff nodes — unified diff viewer with per-file sections */
4782
4927
  .diff-node {
@@ -4858,7 +5003,7 @@ html.is-node-resizing .ext-app-preview-catcher {
4858
5003
  flex-shrink: 0;
4859
5004
  padding: 4px 10px;
4860
5005
  color: var(--c-muted);
4861
- font-size: 10px;
5006
+ font-size: var(--fs-meta);
4862
5007
  }
4863
5008
 
4864
5009
  /* Own scroll port so a wide CSV scrolls inside the node instead of blowing out
@@ -4933,23 +5078,59 @@ html.is-node-resizing .ext-app-preview-catcher {
4933
5078
  }
4934
5079
 
4935
5080
  /* MCP app iframe */
5081
+ .viewer-host, .mermaid-viewer, .mermaid-diagram, .ext-app-viewer {
5082
+ position: relative;
5083
+ display: flex;
5084
+ flex-direction: column;
5085
+ flex: 1;
5086
+ width: 100%;
5087
+ height: 100%;
5088
+ min-width: 0;
5089
+ min-height: 0;
5090
+ }
5091
+ .mermaid-viewer { overflow: auto; }
5092
+ .mermaid-diagram > svg { display: block; flex-shrink: 0; }
5093
+ .ext-app-frame { width: 100%; height: 100%; border: 0; background: transparent; }
5094
+ .ext-app-preview-catcher { position: absolute; inset: 0; z-index: 3; border: 0; padding: 0; background: transparent; cursor: zoom-in; }
5095
+ .ext-app-session-notice { padding: 8px 12px; font-size: var(--fs-meta); color: var(--c-warn); }
5096
+ .viewer-placeholder, .viewer-fallback {
5097
+ display: flex;
5098
+ flex-direction: column;
5099
+ align-items: center;
5100
+ justify-content: center;
5101
+ gap: 8px;
5102
+ padding: 16px;
5103
+ height: 100%;
5104
+ color: var(--c-muted);
5105
+ font-size: var(--fs-ui);
5106
+ }
5107
+ .viewer-fallback { position: absolute; inset: 0; z-index: 2; background: var(--c-panel); }
5108
+ .viewer-fallback-retained { top: auto; height: auto; flex-direction: row; }
5109
+ .viewer-placeholder button, .viewer-fallback button {
5110
+ padding: 4px 12px;
5111
+ border: 1px solid var(--c-line);
5112
+ border-radius: var(--r-control);
5113
+ color: var(--c-text);
5114
+ background: var(--c-panel-soft);
5115
+ }
5116
+ .canvas-node:is([data-node-type="html"], [data-node-type="json-render"], [data-node-type="graph"], [data-node-type="mcp-app"], [data-node-type="mermaid"]) .node-body { padding: 0; display: flex; flex-direction: column; }
4936
5117
  .mcp-app-frame-stack {
4937
5118
  position: relative;
4938
5119
  isolation: isolate;
4939
5120
  flex: 1;
4940
5121
  min-width: 0;
4941
5122
  min-height: 0;
4942
- background: var(--c-panel-soft);
5123
+ background: var(--c-panel);
4943
5124
  overflow: hidden;
4944
- border-radius: 0 0 calc(var(--radius) - 1px) calc(var(--radius) - 1px);
5125
+ border-radius: 0;
4945
5126
  }
4946
5127
 
4947
5128
  .mcp-app-frame-stack:has(.html-node-frame) {
4948
5129
  width: 100%;
4949
5130
  height: 100%;
4950
- min-height: 300px;
4951
- background: var(--c-bg);
4952
- border-radius: 6px;
5131
+ min-height: 0;
5132
+ background: var(--c-panel);
5133
+ border-radius: 0;
4953
5134
  }
4954
5135
 
4955
5136
  .mcp-app-frame-stack:has(.html-node-frame-presentation) {
@@ -5188,6 +5369,11 @@ html.is-node-resizing .ext-app-preview-catcher {
5188
5369
  font-weight: 600;
5189
5370
  color: var(--c-text);
5190
5371
  }
5372
+ .text-prompt-description {
5373
+ font-size: 12px;
5374
+ line-height: 1.4;
5375
+ color: var(--c-muted);
5376
+ }
5191
5377
  .text-prompt-input {
5192
5378
  width: 100%;
5193
5379
  padding: 8px 10px;
@@ -5292,7 +5478,7 @@ html.is-node-resizing .ext-app-preview-catcher {
5292
5478
  backdrop-filter: blur(12px);
5293
5479
  border: 1px solid var(--c-line);
5294
5480
  border-radius: 10px;
5295
- box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5);
5481
+ box-shadow: var(--e-2);
5296
5482
  z-index: 66;
5297
5483
  white-space: nowrap;
5298
5484
  }
@@ -5481,25 +5667,22 @@ html.is-node-resizing .ext-app-preview-catcher {
5481
5667
 
5482
5668
  .attention-history-tab {
5483
5669
  position: absolute;
5484
- top: 60px;
5485
- right: 0;
5670
+ top: 7px;
5671
+ right: 8px;
5486
5672
  display: flex;
5487
5673
  align-items: center;
5488
- gap: 8px;
5489
- padding: 8px 12px 8px 14px;
5490
- background: color-mix(in srgb, var(--c-panel-glass) 96%, transparent);
5491
- backdrop-filter: blur(16px);
5492
- border: 1px solid color-mix(in srgb, var(--c-line) 82%, var(--c-accent) 18%);
5493
- border-right: 0;
5494
- border-radius: 14px 0 0 14px;
5495
- box-shadow: 0 12px 36px var(--c-shadow);
5496
- color: var(--c-text);
5674
+ gap: 6px;
5675
+ height: 30px;
5676
+ padding: 0 10px;
5677
+ background: var(--c-panel);
5678
+ border: 1px solid var(--c-line);
5679
+ border-radius: var(--r-pill);
5680
+ box-shadow: var(--e-2);
5681
+ color: var(--c-text-soft);
5497
5682
  cursor: pointer;
5498
5683
  font: inherit;
5499
- font-size: 11px;
5500
- font-weight: 600;
5501
- letter-spacing: 0.08em;
5502
- text-transform: uppercase;
5684
+ font-size: var(--fs-ui);
5685
+ font-weight: 500;
5503
5686
  z-index: 60;
5504
5687
  }
5505
5688
 
@@ -5519,17 +5702,12 @@ html.is-node-resizing .ext-app-preview-catcher {
5519
5702
  }
5520
5703
 
5521
5704
  .attention-history-tab-badge {
5522
- min-width: 18px;
5523
- height: 18px;
5524
- padding: 0 5px;
5525
5705
  display: inline-flex;
5526
5706
  align-items: center;
5527
5707
  justify-content: center;
5528
- border-radius: 9px;
5529
- background: var(--c-accent);
5530
- color: var(--c-contrast-fg);
5531
- font-size: 10px;
5532
- font-weight: 700;
5708
+ color: var(--c-accent);
5709
+ font-size: var(--fs-ui);
5710
+ font-weight: 500;
5533
5711
  letter-spacing: 0;
5534
5712
  text-transform: none;
5535
5713
  }
@@ -5613,7 +5791,7 @@ html.is-node-resizing .ext-app-preview-catcher {
5613
5791
  }
5614
5792
 
5615
5793
  .attention-history-time {
5616
- font-size: 10px;
5794
+ font-size: var(--fs-meta);
5617
5795
  color: var(--c-dim);
5618
5796
  white-space: nowrap;
5619
5797
  }
@@ -5788,17 +5966,15 @@ html.is-node-resizing .ext-app-preview-catcher {
5788
5966
  max-width: 70%;
5789
5967
  }
5790
5968
  .group-name {
5791
- font-size: 10px;
5792
- font-weight: 700;
5793
- letter-spacing: 0.08em;
5794
- text-transform: uppercase;
5795
- color: var(--group-color, var(--c-accent));
5969
+ font-size: var(--fs-ui);
5970
+ font-weight: 600;
5971
+ color: var(--c-text);
5796
5972
  white-space: nowrap;
5797
5973
  overflow: hidden;
5798
5974
  text-overflow: ellipsis;
5799
5975
  }
5800
5976
  .group-count {
5801
- font: 9px var(--font-code);
5977
+ font: var(--fs-meta) var(--font-ui);
5802
5978
  color: var(--c-dim);
5803
5979
  }
5804
5980
  .group-title-input {
@@ -5858,7 +6034,7 @@ html.is-node-resizing .ext-app-preview-catcher {
5858
6034
  background: var(--c-panel);
5859
6035
  border: 1px solid var(--c-line);
5860
6036
  border-radius: 8px;
5861
- box-shadow: 0 12px 32px rgba(0, 0, 0, 0.45);
6037
+ box-shadow: var(--e-2);
5862
6038
  z-index: 20;
5863
6039
  }
5864
6040
  .group-menu button {
@@ -5917,10 +6093,8 @@ html.is-node-resizing .ext-app-preview-catcher {
5917
6093
  cursor: pointer;
5918
6094
  }
5919
6095
  .group-chip-name {
5920
- font-size: 10px;
5921
- font-weight: 700;
5922
- letter-spacing: 0.08em;
5923
- text-transform: uppercase;
6096
+ font-size: var(--fs-ui);
6097
+ font-weight: 600;
5924
6098
  color: var(--group-color, var(--c-accent));
5925
6099
  white-space: nowrap;
5926
6100
  }
@@ -5938,7 +6112,7 @@ html.is-node-resizing .ext-app-preview-catcher {
5938
6112
  opacity: 0.8;
5939
6113
  }
5940
6114
  .group-chip-count {
5941
- font: 9px var(--font-code);
6115
+ font: var(--fs-meta) var(--font-code);
5942
6116
  color: var(--c-dim);
5943
6117
  }
5944
6118
 
@@ -5957,12 +6131,12 @@ html.is-node-resizing .ext-app-preview-catcher {
5957
6131
  white-space: nowrap;
5958
6132
  }
5959
6133
  .drop-pill-text {
5960
- font-size: 10px;
6134
+ font-size: var(--fs-meta);
5961
6135
  font-weight: 600;
5962
6136
  color: var(--c-accent);
5963
6137
  }
5964
6138
  .drop-pill-hint {
5965
- font: 9px var(--font-code);
6139
+ font: var(--fs-meta) var(--font-code);
5966
6140
  color: var(--c-dim);
5967
6141
  }
5968
6142
 
@@ -5986,13 +6160,60 @@ html.is-node-resizing .ext-app-preview-catcher {
5986
6160
  flex-direction: column;
5987
6161
  background: var(--c-panel);
5988
6162
  border: 1px solid var(--c-line);
5989
- border-radius: 14px;
5990
- box-shadow: 0 24px 80px rgba(0, 0, 0, 0.6);
6163
+ border-radius: var(--r-overlay);
6164
+ box-shadow: var(--e-2);
5991
6165
  overflow: hidden;
5992
6166
  }
5993
6167
  .expanded-overlay-panel.is-pinned {
5994
6168
  border-color: color-mix(in srgb, var(--c-pin) 45%, var(--c-line));
5995
6169
  }
6170
+ /* AX step footer (AxStepControls). The expanded overlay places it as a sibling of
6171
+ its padded content area (--ax-dock-bleed: 0) and keeps it stuck to the bottom. */
6172
+ .ax-step-dock {
6173
+ position: sticky;
6174
+ bottom: calc(-1 * var(--ax-dock-bleed, 12px));
6175
+ margin: 12px calc(-1 * var(--ax-dock-bleed, 12px)) calc(-1 * var(--ax-dock-bleed, 12px));
6176
+ padding: 9px var(--ax-dock-pad, 12px) 10px;
6177
+ background: var(--c-panel-overlay);
6178
+ border-top: 1px solid var(--c-line);
6179
+ backdrop-filter: blur(6px);
6180
+ }
6181
+ /* On a card the step is one body and one footer row: the step controls beside the
6182
+ card's own actions. Rows: content (scrolls by itself, never taller than it needs),
6183
+ extras, free space, footer. Nothing bleeds past the body, so it never scrolls. */
6184
+ .canvas-node .node-body:has(> .ax-step-dock) {
6185
+ display: grid;
6186
+ grid-template: minmax(0, max-content) auto 1fr auto / minmax(0, 1fr) auto;
6187
+ padding: 0;
6188
+ overflow: hidden;
6189
+ }
6190
+ .canvas-node .node-body:has(> .ax-step-dock) > .md-card-preview { display: contents; }
6191
+ .canvas-node .node-body:has(> .ax-step-dock) > :first-child:not(.md-card-preview),
6192
+ .canvas-node .node-body:has(> .ax-step-dock) > .md-card-preview > .md-card-content {
6193
+ grid-area: 1 / 1 / 2 / -1;
6194
+ min-height: 0;
6195
+ overflow: auto;
6196
+ padding: 10px 14px;
6197
+ }
6198
+ .canvas-node .node-body:has(> .ax-step-dock) > :not(.ax-step-dock),
6199
+ .canvas-node .node-body:has(> .ax-step-dock) > .md-card-preview > * {
6200
+ grid-column: 1 / -1;
6201
+ }
6202
+ .canvas-node .node-body > .ax-step-dock,
6203
+ .canvas-node .node-body:has(> .ax-step-dock) > .md-card-preview > .md-card-actions {
6204
+ grid-row: 4;
6205
+ position: static;
6206
+ margin: 0;
6207
+ background: var(--c-panel);
6208
+ border-top: 1px solid var(--c-line);
6209
+ backdrop-filter: none;
6210
+ }
6211
+ .canvas-node .node-body > .ax-step-dock { grid-column: 1; padding: 6px 4px 6px 12px; }
6212
+ .canvas-node .node-body:has(> .ax-step-dock) > .md-card-preview > .md-card-actions {
6213
+ grid-column: 2;
6214
+ align-items: flex-start;
6215
+ padding: 6px 36px 6px 4px;
6216
+ }
5996
6217
  .expanded-overlay-panel .ax-step-dock {
5997
6218
  /* Its sticky/backdrop-filter context must paint hints above the Source FAB. */
5998
6219
  z-index: 2;
@@ -6030,7 +6251,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6030
6251
  min-width: 0;
6031
6252
  }
6032
6253
  .expanded-kind-pill {
6033
- font-size: 9px;
6254
+ font-size: var(--fs-meta);
6034
6255
  font-weight: 600;
6035
6256
  padding: 2px 8px;
6036
6257
  border-radius: 999px;
@@ -6081,7 +6302,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6081
6302
  padding: 8px 16px;
6082
6303
  border-top: 1px solid var(--c-line);
6083
6304
  background: color-mix(in srgb, var(--c-bg) 50%, transparent);
6084
- font: 9.5px var(--font-code);
6305
+ font: var(--fs-meta) var(--font-code);
6085
6306
  color: var(--c-dim);
6086
6307
  flex-shrink: 0;
6087
6308
  }
@@ -6095,6 +6316,10 @@ html.is-node-resizing .ext-app-preview-catcher {
6095
6316
  }
6096
6317
 
6097
6318
  .expanded-action-btn {
6319
+ display: inline-flex;
6320
+ align-items: center;
6321
+ gap: 6px;
6322
+ white-space: nowrap;
6098
6323
  padding: 3px 10px;
6099
6324
  font-size: 11px;
6100
6325
  font-weight: 600;
@@ -6106,6 +6331,12 @@ html.is-node-resizing .ext-app-preview-catcher {
6106
6331
  font-family: var(--font-ui);
6107
6332
  }
6108
6333
 
6334
+ @media (max-width: 760px) {
6335
+ .expanded-header { height: auto; min-height: 46px; flex-wrap: wrap; row-gap: 8px; padding: 10px 16px; }
6336
+ .expanded-title { flex: 1; }
6337
+ .expanded-actions { order: 1; flex-basis: 100%; flex-wrap: wrap; }
6338
+ }
6339
+
6109
6340
  .expanded-action-btn:hover {
6110
6341
  background: var(--c-surface-hover);
6111
6342
  color: var(--c-text);
@@ -6136,7 +6367,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6136
6367
  }
6137
6368
 
6138
6369
  .expanded-meta {
6139
- font-size: 10px;
6370
+ font-size: var(--fs-meta);
6140
6371
  color: var(--c-muted);
6141
6372
  padding: 0 4px;
6142
6373
  }
@@ -6213,18 +6444,18 @@ html.is-node-resizing .ext-app-preview-catcher {
6213
6444
  .node-context-mark {
6214
6445
  display: inline-flex;
6215
6446
  align-items: center;
6216
- gap: calc(4px * var(--node-chrome-scale, 1));
6217
- height: calc(20px * var(--node-chrome-scale, 1));
6218
- padding: 0 calc(7px * var(--node-chrome-scale, 1));
6447
+ gap: 4px;
6448
+ height: 20px;
6449
+ padding: 0 7px;
6219
6450
  border-radius: var(--r-pill);
6220
- font-size: calc(var(--fs-meta) * var(--node-chrome-scale, 1));
6451
+ font-size: var(--fs-meta);
6221
6452
  font-weight: 500;
6222
6453
  white-space: nowrap;
6223
6454
  flex-shrink: 0;
6224
6455
  }
6225
6456
  .node-context-mark svg {
6226
- width: calc(12px * var(--node-chrome-scale, 1));
6227
- height: calc(12px * var(--node-chrome-scale, 1));
6457
+ width: 12px;
6458
+ height: 12px;
6228
6459
  fill: none;
6229
6460
  stroke: currentColor;
6230
6461
  stroke-width: 2;
@@ -6249,8 +6480,8 @@ html.is-node-resizing .ext-app-preview-catcher {
6249
6480
  .node-context-mark.is-glyph,
6250
6481
  .node-near-mark.is-glyph {
6251
6482
  justify-content: center;
6252
- width: calc(22px * var(--node-chrome-scale, 1));
6253
- height: calc(22px * var(--node-chrome-scale, 1));
6483
+ width: 22px;
6484
+ height: 22px;
6254
6485
  padding: 0;
6255
6486
  box-sizing: border-box;
6256
6487
  }
@@ -6262,20 +6493,20 @@ html.is-node-resizing .ext-app-preview-catcher {
6262
6493
  cursor: pointer;
6263
6494
  display: inline-flex;
6264
6495
  align-items: center;
6265
- gap: calc(4px * var(--node-chrome-scale, 1));
6266
- height: calc(18px * var(--node-chrome-scale, 1));
6267
- padding: 0 calc(7px * var(--node-chrome-scale, 1));
6496
+ gap: 4px;
6497
+ height: 18px;
6498
+ padding: 0 7px;
6268
6499
  border: 1px dotted var(--c-pin);
6269
6500
  border-radius: var(--r-pill);
6270
6501
  color: color-mix(in srgb, var(--c-pin) 75%, var(--c-text));
6271
- font-size: calc(var(--fs-meta) * var(--node-chrome-scale, 1));
6502
+ font-size: var(--fs-meta);
6272
6503
  font-weight: 500;
6273
6504
  white-space: nowrap;
6274
6505
  flex-shrink: 0;
6275
6506
  }
6276
6507
  .node-near-mark svg {
6277
- width: calc(12px * var(--node-chrome-scale, 1));
6278
- height: calc(12px * var(--node-chrome-scale, 1));
6508
+ width: 12px;
6509
+ height: 12px;
6279
6510
  }
6280
6511
  .node-near-ring {
6281
6512
  fill: none;
@@ -6438,15 +6669,15 @@ html.is-node-resizing .ext-app-preview-catcher {
6438
6669
 
6439
6670
  /* The drawn 18 px circle sits inside the standard control hit target. */
6440
6671
  .ctx-pin-mark {
6441
- width: calc(18px * var(--node-chrome-scale, 1));
6442
- height: calc(18px * var(--node-chrome-scale, 1));
6672
+ width: 18px;
6673
+ height: 18px;
6443
6674
  box-sizing: border-box;
6444
6675
  border: 1.5px solid var(--c-muted);
6445
6676
  border-radius: var(--r-pill);
6446
6677
  display: flex;
6447
6678
  align-items: center;
6448
6679
  justify-content: center;
6449
- font-size: calc(13px * var(--node-chrome-scale, 1));
6680
+ font-size: 13px;
6450
6681
  color: var(--c-text-soft);
6451
6682
  }
6452
6683
 
@@ -6484,7 +6715,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6484
6715
  .board-pin-btn .ctx-pin-mark {
6485
6716
  width: 18px;
6486
6717
  height: 18px;
6487
- font-size: 10px;
6718
+ font-size: var(--fs-meta);
6488
6719
  }
6489
6720
 
6490
6721
  /* ── Context pin HUD — top-right pill ────────────────────────── */
@@ -6527,7 +6758,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6527
6758
 
6528
6759
  .thread-turn-assistant {
6529
6760
  padding: 6px 0;
6530
- border-left: 2px solid color-mix(in srgb, var(--c-ok) 20%, transparent);
6761
+ border-left: 2px solid color-mix(in srgb, var(--c-agent) 35%, transparent);
6531
6762
  padding-left: 10px;
6532
6763
  margin-left: 2px;
6533
6764
  overflow: hidden;
@@ -6545,10 +6776,8 @@ html.is-node-resizing .ext-app-preview-catcher {
6545
6776
  }
6546
6777
 
6547
6778
  .thread-turn-role {
6548
- font-size: 10px;
6549
- font-weight: 700;
6550
- text-transform: uppercase;
6551
- letter-spacing: 0.04em;
6779
+ font-size: var(--fs-meta);
6780
+ font-weight: 600;
6552
6781
  margin-bottom: 3px;
6553
6782
  display: flex;
6554
6783
  align-items: center;
@@ -6571,11 +6800,11 @@ html.is-node-resizing .ext-app-preview-catcher {
6571
6800
  }
6572
6801
 
6573
6802
  .thread-turn-assistant .thread-turn-role {
6574
- color: var(--c-ok);
6803
+ color: var(--c-agent);
6575
6804
  }
6576
6805
 
6577
6806
  .thread-turn-assistant .status-dot {
6578
- background: var(--c-ok);
6807
+ background: var(--c-agent);
6579
6808
  }
6580
6809
 
6581
6810
  .thread-turn-assistant .status-dot.pulsing {
@@ -6629,7 +6858,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6629
6858
  flex-direction: column;
6630
6859
  background: var(--c-panel-soft);
6631
6860
  border-left: 1px solid var(--c-line);
6632
- box-shadow: -16px 0 40px rgba(0, 0, 0, 0.45);
6861
+ box-shadow: var(--e-2);
6633
6862
  /* Above the receipt it is opened from, below the rail popovers. */
6634
6863
  z-index: 9999;
6635
6864
  overflow: hidden;
@@ -6658,7 +6887,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6658
6887
  color: var(--c-text);
6659
6888
  }
6660
6889
  .snapshot-panel-sub {
6661
- font-size: 10px;
6890
+ font-size: var(--fs-meta);
6662
6891
  color: var(--c-dim);
6663
6892
  }
6664
6893
  .snapshot-panel-spacer {
@@ -6714,7 +6943,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6714
6943
  }
6715
6944
  .snapshot-restore-note {
6716
6945
  padding: 0 12px 8px;
6717
- font-size: 9.5px;
6946
+ font-size: var(--fs-meta);
6718
6947
  color: var(--c-dim);
6719
6948
  }
6720
6949
 
@@ -6734,7 +6963,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6734
6963
  }
6735
6964
  .snapshot-section-header {
6736
6965
  margin: 10px 2px 4px;
6737
- font-size: 10px;
6966
+ font-size: var(--fs-meta);
6738
6967
  font-weight: 700;
6739
6968
  letter-spacing: 0.08em;
6740
6969
  text-transform: uppercase;
@@ -6781,12 +7010,12 @@ html.is-node-resizing .ext-app-preview-catcher {
6781
7010
  color: var(--c-text);
6782
7011
  }
6783
7012
  .snapshot-item-time {
6784
- font: 9px var(--font-code);
7013
+ font: var(--fs-meta) var(--font-code);
6785
7014
  color: var(--c-dim);
6786
7015
  }
6787
7016
  .snapshot-item-meta {
6788
7017
  margin-top: 3px;
6789
- font-size: 10.5px;
7018
+ font-size: var(--fs-meta);
6790
7019
  color: var(--c-muted);
6791
7020
  }
6792
7021
  .snapshot-item-diff {
@@ -6804,7 +7033,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6804
7033
  border-radius: 6px;
6805
7034
  background: none;
6806
7035
  color: var(--c-muted);
6807
- font-size: 10.5px;
7036
+ font-size: var(--fs-meta);
6808
7037
  font-weight: 600;
6809
7038
  cursor: pointer;
6810
7039
  }
@@ -6842,7 +7071,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6842
7071
  .snapshot-panel-foot {
6843
7072
  padding: 9px 14px;
6844
7073
  border-top: 1px solid var(--c-line);
6845
- font-size: 9.5px;
7074
+ font-size: var(--fs-meta);
6846
7075
  color: var(--c-dim);
6847
7076
  flex-shrink: 0;
6848
7077
  }
@@ -6868,8 +7097,8 @@ html.is-node-resizing .ext-app-preview-catcher {
6868
7097
  flex-direction: column;
6869
7098
  background: var(--c-panel);
6870
7099
  border: 1px solid var(--c-line);
6871
- border-radius: 12px;
6872
- box-shadow: 0 24px 60px rgba(0, 0, 0, 0.6);
7100
+ border-radius: var(--r-overlay);
7101
+ box-shadow: var(--e-2);
6873
7102
  overflow: hidden;
6874
7103
  animation: command-palette-in 0.12s ease-out;
6875
7104
  align-self: flex-start;
@@ -6906,7 +7135,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6906
7135
  padding: 1px 6px;
6907
7136
  border: 1px solid var(--c-line);
6908
7137
  border-radius: 4px;
6909
- font: 9.5px var(--font-code);
7138
+ font: var(--fs-meta) var(--font-code);
6910
7139
  color: var(--c-muted);
6911
7140
  }
6912
7141
  .command-palette-esc {
@@ -6928,7 +7157,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6928
7157
  }
6929
7158
  .command-palette-group {
6930
7159
  padding: 6px 10px 4px;
6931
- font-size: 9px;
7160
+ font-size: var(--fs-meta);
6932
7161
  font-weight: 700;
6933
7162
  letter-spacing: 0.08em;
6934
7163
  text-transform: uppercase;
@@ -6992,7 +7221,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6992
7221
  padding: 8px 14px;
6993
7222
  border-top: 1px solid var(--c-line);
6994
7223
  background: color-mix(in srgb, var(--c-bg) 50%, transparent);
6995
- font: 9.5px var(--font-code);
7224
+ font: var(--fs-meta) var(--font-code);
6996
7225
  color: var(--c-dim);
6997
7226
  }
6998
7227
  .command-palette-hint-spacer {
@@ -7020,7 +7249,7 @@ html.is-node-resizing .ext-app-preview-catcher {
7020
7249
  backdrop-filter: blur(16px);
7021
7250
  border: 1px solid var(--c-line);
7022
7251
  border-radius: var(--radius);
7023
- box-shadow: 0 12px 40px var(--c-shadow-heavy), 0 0 0 1px rgba(255,255,255,0.04);
7252
+ box-shadow: var(--e-2);
7024
7253
  overflow: hidden;
7025
7254
  animation: command-palette-in 0.12s ease-out;
7026
7255
  }
@@ -7040,7 +7269,7 @@ html.is-node-resizing .ext-app-preview-catcher {
7040
7269
  }
7041
7270
 
7042
7271
  .shortcut-overlay-hint {
7043
- font-size: 10px;
7272
+ font-size: var(--fs-meta);
7044
7273
  color: var(--c-dim);
7045
7274
  }
7046
7275
  .shortcut-overlay-hint kbd {
@@ -7050,7 +7279,7 @@ html.is-node-resizing .ext-app-preview-catcher {
7050
7279
  border-radius: 3px;
7051
7280
  padding: 0 4px;
7052
7281
  font-family: var(--font-ui);
7053
- font-size: 9px;
7282
+ font-size: var(--fs-meta);
7054
7283
  line-height: 1.6;
7055
7284
  margin: 0 2px;
7056
7285
  }
@@ -7070,7 +7299,7 @@ html.is-node-resizing .ext-app-preview-catcher {
7070
7299
  }
7071
7300
 
7072
7301
  .shortcut-group-title {
7073
- font-size: 10px;
7302
+ font-size: var(--fs-meta);
7074
7303
  font-weight: 600;
7075
7304
  text-transform: uppercase;
7076
7305
  letter-spacing: 0.06em;
@@ -7228,18 +7457,18 @@ html.is-node-resizing .ext-app-preview-catcher {
7228
7457
  padding: 1px 6px;
7229
7458
  border: 1px solid var(--c-line);
7230
7459
  border-radius: 4px;
7231
- font: 9.5px var(--font-code);
7460
+ font: var(--fs-meta) var(--font-code);
7232
7461
  color: var(--c-dim);
7233
7462
  }
7234
7463
  .empty-state-action-hint {
7235
- font-size: 10px;
7464
+ font-size: var(--fs-meta);
7236
7465
  color: var(--c-dim);
7237
7466
  }
7238
7467
  .empty-state-hint {
7239
7468
  background: none;
7240
7469
  border: none;
7241
7470
  padding: 0;
7242
- font: 10.5px var(--font-code);
7471
+ font: var(--fs-meta) var(--font-code);
7243
7472
  color: var(--c-dim);
7244
7473
  cursor: pointer;
7245
7474
  }
@@ -7306,7 +7535,7 @@ html.is-node-resizing .ext-app-preview-catcher {
7306
7535
  }
7307
7536
 
7308
7537
  .image-node-warning-title {
7309
- font-size: 10px;
7538
+ font-size: var(--fs-meta);
7310
7539
  font-weight: 700;
7311
7540
  letter-spacing: 0.06em;
7312
7541
  text-transform: uppercase;
@@ -7372,7 +7601,7 @@ html.is-node-resizing .ext-app-preview-catcher {
7372
7601
 
7373
7602
  .image-node-error-path {
7374
7603
  font-family: var(--font-code);
7375
- font-size: 10px;
7604
+ font-size: var(--fs-meta);
7376
7605
  color: var(--c-muted);
7377
7606
  word-break: break-all;
7378
7607
  max-width: 250px;
@@ -7405,7 +7634,7 @@ html.is-node-resizing .ext-app-preview-catcher {
7405
7634
  padding: 4px 10px;
7406
7635
  border-top: 1px solid var(--c-line);
7407
7636
  background: var(--c-panel-soft);
7408
- font-size: 10px;
7637
+ font-size: var(--fs-meta);
7409
7638
  color: var(--c-dim);
7410
7639
  gap: 8px;
7411
7640
  min-height: 24px;
@@ -7433,7 +7662,7 @@ html.is-node-resizing .ext-app-preview-catcher {
7433
7662
  border-radius: 3px;
7434
7663
  padding: 1px 6px;
7435
7664
  font: inherit;
7436
- font-size: 10px;
7665
+ font-size: var(--fs-meta);
7437
7666
  color: var(--c-accent);
7438
7667
  cursor: pointer;
7439
7668
  }
@@ -7597,7 +7826,7 @@ html.is-node-resizing .ext-app-preview-catcher {
7597
7826
  border-radius: 999px;
7598
7827
  background: var(--c-accent);
7599
7828
  color: var(--c-bg);
7600
- font-size: 10px;
7829
+ font-size: var(--fs-meta);
7601
7830
  font-weight: 700;
7602
7831
  }
7603
7832
 
@@ -7616,7 +7845,7 @@ html.is-node-resizing .ext-app-preview-catcher {
7616
7845
  }
7617
7846
 
7618
7847
  .intent-confidence {
7619
- font-size: 10px;
7848
+ font-size: var(--fs-meta);
7620
7849
  font-variant-numeric: tabular-nums;
7621
7850
  color: var(--c-muted);
7622
7851
  }
@@ -7735,10 +7964,17 @@ html.is-node-dragging .intent-line-layer {
7735
7964
  inset: 0;
7736
7965
  z-index: 99;
7737
7966
  }
7738
- .presentation-exit {
7967
+ .presentation-controls {
7739
7968
  position: absolute;
7740
7969
  top: 16px;
7741
7970
  right: 16px;
7971
+ max-width: calc(100% - 32px);
7972
+ display: flex;
7973
+ flex-wrap: wrap;
7974
+ justify-content: flex-end;
7975
+ gap: 8px;
7976
+ }
7977
+ .presentation-controls button {
7742
7978
  box-shadow: 0 2px 12px var(--c-shadow);
7743
7979
  }
7744
7980
  .presentation-error {
@@ -7827,7 +8063,7 @@ html.is-node-dragging .intent-line-layer {
7827
8063
  }
7828
8064
  .board-switcher-item-folder { font-size: 11px; line-height: 1.4; color: var(--c-dim); overflow-wrap: anywhere; }
7829
8065
  .board-switcher-item-meta {
7830
- font-size: 10px;
8066
+ font-size: var(--fs-meta);
7831
8067
  color: var(--c-dim);
7832
8068
  white-space: nowrap;
7833
8069
  align-self: flex-start;
@@ -8674,6 +8910,19 @@ html.is-node-dragging .intent-line-layer {
8674
8910
  cursor: pointer;
8675
8911
  }
8676
8912
  }
8913
+ .board-move-backdrop { padding: 20px 0; align-items: center; }
8914
+ .board-move-dialog {
8915
+ width: min(540px, calc(100% - 32px));
8916
+ max-height: calc(100% - 40px);
8917
+ overflow-y: auto;
8918
+ box-sizing: border-box;
8919
+ }
8920
+ .board-move-dialog form { display: flex; flex-direction: column; gap: 8px; }
8921
+ .board-move-dialog h2 { margin: 0 0 12px; font-size: 17px; }
8922
+ .board-move-dialog p { margin: 0; font-size: 12px; line-height: 1.5; color: var(--c-text-soft); }
8923
+ .board-move-dialog .board-move-warning { color: var(--c-warn); font-size: 12px; line-height: 1.5; overflow-wrap: anywhere; }
8924
+ .board-move-cards { margin: 0; max-height: 100px; overflow-y: auto; font-size: 12px; }
8925
+ .board-move-dialog .text-prompt-actions { margin-top: 8px; }
8677
8926
  .board-copy-dialog,
8678
8927
  .board-link-dialog {
8679
8928
  width: min(540px, calc(100vw - 32px));
@@ -8761,6 +9010,7 @@ html.is-node-dragging .intent-line-layer {
8761
9010
  .attachment-node a, .md-import-source a { color: var(--c-accent); }
8762
9011
  .attachment-status { font-weight: 600; }
8763
9012
  .attachment-button,
9013
+ .presentation-step,
8764
9014
  .presentation-exit,
8765
9015
  .export-dialog-links a {
8766
9016
  min-height: 38px;
@@ -8776,12 +9026,15 @@ html.is-node-dragging .intent-line-layer {
8776
9026
  .attachment-button.is-primary,
8777
9027
  .export-dialog-links a.is-primary { background: var(--c-accent); border-color: var(--c-accent); color: var(--c-bg); }
8778
9028
  .attachment-button:hover:not(:disabled),
9029
+ .presentation-step:hover:not([aria-disabled="true"]),
8779
9030
  .presentation-exit:hover,
8780
9031
  .export-dialog-links a:hover { filter: brightness(1.12); }
8781
9032
  .attachment-button:focus-visible,
9033
+ .presentation-step:focus-visible,
8782
9034
  .presentation-exit:focus-visible,
8783
9035
  .export-dialog-links a:focus-visible { outline: 2px solid var(--c-accent); outline-offset: 3px; }
8784
- .attachment-button:disabled { opacity: 0.5; cursor: default; }
9036
+ .attachment-button:disabled,
9037
+ .presentation-step[aria-disabled="true"] { opacity: 0.5; cursor: default; }
8785
9038
  .attachment-review { width: 100%; border-top: 1px solid var(--c-line); padding-top: 12px; }
8786
9039
  .attachment-review-actions {
8787
9040
  position: sticky;