@hienlh/ppm 0.22.11 → 0.23.1

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 (887) hide show
  1. package/CHANGELOG.md +24 -1
  2. package/CLAUDE.md +14 -0
  3. package/THIRD-PARTY-NOTICES.md +1 -1
  4. package/assets/skills/ppm/SKILL.md +1 -1
  5. package/assets/skills/ppm/references/http-api.md +1 -1
  6. package/bun.lock +17 -0
  7. package/dist/web/assets/__vite-browser-external-CHpXvvmW.js +1 -0
  8. package/dist/web/assets/accounts-settings-section-BR7t8CEk.js +1 -0
  9. package/dist/web/assets/ai-resource-editor-BFVg2d2a.js +1 -0
  10. package/dist/web/assets/ai-settings-section-BJw7E_lM.js +1 -0
  11. package/dist/web/assets/ai-settings-section-CO-i3ghA.js +1 -0
  12. package/dist/web/assets/angular-html-D-rbk4zq.js +1 -0
  13. package/dist/web/assets/angular-ts-B_ldKah2.js +1 -0
  14. package/dist/web/assets/api-client-BgedDTvo.js +1 -0
  15. package/dist/web/assets/api-client-c8YOpTlT.js +1 -0
  16. package/dist/web/assets/api-settings-0s1Rfgcu.js +1 -0
  17. package/dist/web/assets/api-settings-Bnp28Ysw.js +1 -0
  18. package/dist/web/assets/api-themes-Pp-AZvwV.js +1 -0
  19. package/dist/web/assets/apl-19Dr02g6.js +1 -0
  20. package/dist/web/assets/appearance-settings-section-Ck_FPs9g.js +1 -0
  21. package/dist/web/assets/architecture-PBZL5I3N-B_n8ddB4.js +1 -0
  22. package/dist/web/assets/astro-1q5o0N64.js +1 -0
  23. package/dist/web/assets/audio-preview-DXtE1Lpz.js +1 -0
  24. package/dist/web/assets/blade-BNgXZCCk.js +1 -0
  25. package/dist/web/assets/branch-review-tab-CNVxMRuo.js +1 -0
  26. package/dist/web/assets/bsl-C5u8-gEq.js +1 -0
  27. package/dist/web/assets/button-CBehaXpV.js +1 -0
  28. package/dist/web/assets/c-Dko4ZphN.js +1 -0
  29. package/dist/web/assets/cairo-CrhmfCJH.js +1 -0
  30. package/dist/web/assets/chat-tab-DqLqcBci.js +1 -0
  31. package/dist/web/assets/chat-tab-MdU9Jr3F.js +15 -0
  32. package/dist/web/assets/cobol-BgRxrYyZ.js +1 -0
  33. package/dist/web/assets/code-editor-wEeCvvMR.js +7 -0
  34. package/dist/web/assets/codex-daily-guard-B21M4m-P.js +1 -0
  35. package/dist/web/assets/coffee-9hmEOIYs.js +1 -0
  36. package/dist/web/assets/conflict-editor-Cu-z_LdX.js +19 -0
  37. package/dist/web/assets/context-menu-CjYTq8DI.js +1 -0
  38. package/dist/web/assets/cpp-BntsLe3X.js +1 -0
  39. package/dist/web/assets/createLucideIcon-DBXq3G0e.js +1 -0
  40. package/dist/web/assets/crystal-CoXN2Gj8.js +1 -0
  41. package/dist/web/assets/css-DKuKlxIj.js +1 -0
  42. package/dist/web/assets/csv-preview-DHbBIqUu.js +2 -0
  43. package/dist/web/assets/data-grid-overlay-editor-2ERlh7_N.js +1 -0
  44. package/dist/web/assets/data-grid-types-DatI2Wee.js +1 -0
  45. package/dist/web/assets/database-viewer-_McYjRzc.js +1 -0
  46. package/dist/web/assets/design-export-client-SWCbGwwU.js +1 -0
  47. package/dist/web/assets/design-responsive-dialog-CcJETHO2.js +1 -0
  48. package/dist/web/assets/design-tab-C0TUD5g-.js +33 -0
  49. package/dist/web/assets/designs-sidebar-panel-XCAwSNtg.js +1 -0
  50. package/dist/web/assets/dialog-tzBRkGeW.js +1 -0
  51. package/dist/web/assets/diff-viewer-C4z-_68x.js +4 -0
  52. package/dist/web/assets/dist-CgtN5c7X.js +1 -0
  53. package/dist/web/assets/dist-wmDsBD_Z.js +1 -0
  54. package/dist/web/assets/docx-preview-C-UKGMXR.js +12 -0
  55. package/dist/web/assets/edge-gf7weBFr.js +1 -0
  56. package/dist/web/assets/edit-diff-preview-8nIct7kS.js +7 -0
  57. package/dist/web/assets/editor-language-service-D8hW_eew.js +1 -0
  58. package/dist/web/assets/elixir-DOEwBYus.js +1 -0
  59. package/dist/web/assets/elm-7yx1A5qt.js +1 -0
  60. package/dist/web/assets/erb-Bm_J_rBw.js +1 -0
  61. package/dist/web/assets/erlang-DgkAVj5y.js +1 -0
  62. package/dist/web/assets/esm-wquH4IhX.js +2 -0
  63. package/dist/web/assets/explorer-body-CdxolRQG.js +2 -0
  64. package/dist/web/assets/explorer-window-content-D1fkI_cL.js +1 -0
  65. package/dist/web/assets/extension-manager-section-CAaSoAuG.js +1 -0
  66. package/dist/web/assets/extension-webview-DmBZun_i.js +12 -0
  67. package/dist/web/assets/file-icons-BlOxPo3P.js +1 -0
  68. package/dist/web/assets/file-store-CTlJqj2m.js +1 -0
  69. package/dist/web/assets/files-settings-section-BFIzSuBh.js +1 -0
  70. package/dist/web/assets/format-date-BMtvCeb9.js +1 -0
  71. package/dist/web/assets/format-file-meta-DLaHgkdx.js +1 -0
  72. package/dist/web/assets/fortran-fixed-form-s8lQifxM.js +1 -0
  73. package/dist/web/assets/fs-api-RVc5RtTA.js +1 -0
  74. package/dist/web/assets/fsharp-D6bmDjka.js +1 -0
  75. package/dist/web/assets/gdresource-wPII3GWW.js +1 -0
  76. package/dist/web/assets/general-settings-section-BLLUvdhX.js +1 -0
  77. package/dist/web/assets/git-commit-DqLhxK6K.js +1 -0
  78. package/dist/web/assets/git-log-panel-Lq2Vkm8w.js +1 -0
  79. package/dist/web/assets/git-rebase-Cy0Mp9W1.js +1 -0
  80. package/dist/web/assets/git-repo-store-DFTJ5ngK.js +1 -0
  81. package/dist/web/assets/gitGraph-HDMCJU4V-w1WApLyy.js +1 -0
  82. package/dist/web/assets/glide-data-grid-CHdKFqis.js +141 -0
  83. package/dist/web/assets/glimmer-js-CmHFqq4N.js +1 -0
  84. package/dist/web/assets/glimmer-ts-vLmZC1JJ.js +1 -0
  85. package/dist/web/assets/glsl-DArPh0ws.js +1 -0
  86. package/dist/web/assets/graphql-B-_Ilekp.js +1 -0
  87. package/dist/web/assets/group-chat-tab-D2bluLme.js +1 -0
  88. package/dist/web/assets/hack-4KVRpwwM.js +1 -0
  89. package/dist/web/assets/haml-DoK94C5G.js +1 -0
  90. package/dist/web/assets/handlebars-D0_6yNlK.js +1 -0
  91. package/dist/web/assets/html-BOqZwhzR.js +1 -0
  92. package/dist/web/assets/html-derivative-If_2xbJ8.js +1 -0
  93. package/dist/web/assets/http-B6pQhqN4.js +1 -0
  94. package/dist/web/assets/hurl-BjW79rql.js +1 -0
  95. package/dist/web/assets/hxml-B1Yl76u6.js +1 -0
  96. package/dist/web/assets/icons-CO_II6D-.js +1 -0
  97. package/dist/web/assets/image-preview-78Fguk1f.js +1 -0
  98. package/dist/web/assets/index-CzYrKDUF.css +1 -0
  99. package/dist/web/assets/index-DSbUqWiH.js +52 -0
  100. package/dist/web/assets/info-3K5VOQVL-Bv1wKdPY.js +1 -0
  101. package/dist/web/assets/input-CP31LZnN.js +1 -0
  102. package/dist/web/assets/java-DPqGHyuh.js +1 -0
  103. package/dist/web/assets/javascript-D8x_R8ev.js +1 -0
  104. package/dist/web/assets/jinja-DOkXV84k.js +1 -0
  105. package/dist/web/assets/jira-watcher-section-BOe_ztas.js +1 -0
  106. package/dist/web/assets/jison-CGzlyBWT.js +1 -0
  107. package/dist/web/assets/json-kcFjaEWA.js +1 -0
  108. package/dist/web/assets/jsx-BzlJCumN.js +1 -0
  109. package/dist/web/assets/julia-CZrbm1Fa.js +1 -0
  110. package/dist/web/assets/just-bRG6zWI_.js +1 -0
  111. package/dist/web/assets/keybindings-store-DFPJBiXT.js +1 -0
  112. package/dist/web/assets/keyboard-shortcuts-section-CJubMhMq.js +1 -0
  113. package/dist/web/assets/latex-CZHLEkde.js +1 -0
  114. package/dist/web/assets/lib-KePrAxj7.js +4 -0
  115. package/dist/web/assets/liquid-Dcfq3Ccc.js +1 -0
  116. package/dist/web/assets/lua-Ggfu9EYp.js +1 -0
  117. package/dist/web/assets/markdown-renderer-6oU-L6RN.js +5 -0
  118. package/dist/web/assets/markdown-renderer-DxSQ4aqW.js +1 -0
  119. package/dist/web/assets/marko-BUwN_Iax.js +1 -0
  120. package/dist/web/assets/mdc-CIifdeNY.js +1 -0
  121. package/dist/web/assets/media-url-GqzhazJS.js +1 -0
  122. package/dist/web/assets/mobile-bottom-sheet-Cf4kV1hS.js +1 -0
  123. package/dist/web/assets/mobile-explorer-sheet-D0968cuP.js +1 -0
  124. package/dist/web/assets/monaco-dotenv-language-COsgiuQg.js +1 -0
  125. package/dist/web/assets/new-chat-provider-CJx_waY3.js +1 -0
  126. package/dist/web/assets/new-design-dialog-CbrMbKum.js +1 -0
  127. package/dist/web/assets/nextflow-DufnRZW1.js +1 -0
  128. package/dist/web/assets/nginx-DtUJGfad.js +1 -0
  129. package/dist/web/assets/nim-BeBPwibr.js +1 -0
  130. package/dist/web/assets/notification-store-BO3RInEL.js +1 -0
  131. package/dist/web/assets/notifications-settings-section-Bfxqz65i.js +1 -0
  132. package/dist/web/assets/number-overlay-editor-xzM7GhYV.js +9 -0
  133. package/dist/web/assets/onboarding-entry-CcvySZ_l.js +1 -0
  134. package/dist/web/assets/onboarding-quick-orientation-CT4PylG0.js +1 -0
  135. package/dist/web/assets/overview-panel-DshAIz6C.js +1 -0
  136. package/dist/web/assets/packet-RMMSAZCW-Scl5HE6U.js +1 -0
  137. package/dist/web/assets/panel-store-BUQ-CPsd.js +1 -0
  138. package/dist/web/assets/pdf-preview-BWim6mu1.js +1 -0
  139. package/dist/web/assets/perl-hV0EoLCp.js +1 -0
  140. package/dist/web/assets/php-N1YBqBhK.js +1 -0
  141. package/dist/web/assets/pie-UPGHQEXC-sY83O9qJ.js +1 -0
  142. package/dist/web/assets/portal-container-context-NFSuymMu.js +1 -0
  143. package/dist/web/assets/postgres-viewer-HwlL1UTJ.js +3 -0
  144. package/dist/web/assets/ppmbot-settings-section-CHr2FIDj.js +1 -0
  145. package/dist/web/assets/pptx-export-D6DOknBD.js +111 -0
  146. package/dist/web/assets/problems-panel-41z59l78.js +1 -0
  147. package/dist/web/assets/process-table-CVMEMJqQ.js +1 -0
  148. package/dist/web/assets/project-framework-store-XxFXcUpb.js +1 -0
  149. package/dist/web/assets/project-store-C5gJXkvb.js +1 -0
  150. package/dist/web/assets/proxy-settings-section-B4dkvCCx.js +1 -0
  151. package/dist/web/assets/pug-IMA1knL7.js +1 -0
  152. package/dist/web/assets/qml-DuwVuXga.js +1 -0
  153. package/dist/web/assets/query-audit-section-Cn11xqgz.js +1 -0
  154. package/dist/web/assets/r-DsXT2lmn.js +1 -0
  155. package/dist/web/assets/radar-KQ55EAFF-CNhm_kzj.js +1 -0
  156. package/dist/web/assets/razor-Be4LE-G0.js +1 -0
  157. package/dist/web/assets/react-CzUPVyyG.js +1 -0
  158. package/dist/web/assets/regexp-ztLDvplH.js +1 -0
  159. package/dist/web/assets/remote-desktop-clipboard-notice-Co4vEiiB.js +1 -0
  160. package/dist/web/assets/remote-desktop-mobile-sheet-Cv4yo7K4.js +2 -0
  161. package/dist/web/assets/remote-desktop-mobile-view-CcuulHIu.js +1 -0
  162. package/dist/web/assets/remote-desktop-readiness-gate-ouPRvBlu.js +1 -0
  163. package/dist/web/assets/remote-desktop-window-content-DmH3jBuG.js +1 -0
  164. package/dist/web/assets/rolldown-runtime-C5c2KzVm.js +1 -0
  165. package/dist/web/assets/rst-BdtOZUlL.js +1 -0
  166. package/dist/web/assets/ruby-DTna6e9n.js +1 -0
  167. package/dist/web/assets/run-in-terminal-SU9cwoZ4.js +1 -0
  168. package/dist/web/assets/sas-X50YKLBX.js +1 -0
  169. package/dist/web/assets/schedules-settings-section-Dy6hARk0.js +1 -0
  170. package/dist/web/assets/scroll-area-xAtds1T-.js +1 -0
  171. package/dist/web/assets/scss-cQk9zuqD.js +1 -0
  172. package/dist/web/assets/send-to-chat-TSKk3fI9.js +1 -0
  173. package/dist/web/assets/separator-D8SNZI6E.js +1 -0
  174. package/dist/web/assets/settings-body-CZSwxG0i.js +2 -0
  175. package/dist/web/assets/settings-store-DXmQug0m.js +2 -0
  176. package/dist/web/assets/settings-tab-B_WPC-y7.js +1 -0
  177. package/dist/web/assets/settings-window-content-CSWdwQn1.js +1 -0
  178. package/dist/web/assets/shaderlab-CSeOcwk6.js +1 -0
  179. package/dist/web/assets/shellscript-Dtzjnpp9.js +1 -0
  180. package/dist/web/assets/shellsession-AqADqsjv.js +1 -0
  181. package/dist/web/assets/soy-DeMex-y3.js +1 -0
  182. package/dist/web/assets/sparql-CDZTYDwx.js +1 -0
  183. package/dist/web/assets/sql-BS_vTOM8.js +1 -0
  184. package/dist/web/assets/sql-query-editor-6Ee_Zn5j.js +1 -0
  185. package/dist/web/assets/sqlite-viewer-Cj0S_m9V.js +1 -0
  186. package/dist/web/assets/stata-PkjbLwNy.js +1 -0
  187. package/dist/web/assets/surrealql-BJ6bKPXV.js +1 -0
  188. package/dist/web/assets/svelte-D4u1sGpe.js +1 -0
  189. package/dist/web/assets/system-monitor-body-PQqXdK4a.js +2 -0
  190. package/dist/web/assets/system-monitor-tab-BEjvgQuQ.js +1 -0
  191. package/dist/web/assets/system-monitor-window-content-DZwvvN-M.js +1 -0
  192. package/dist/web/assets/tab-host-window-content-CnV4Z4Yt.js +1 -0
  193. package/dist/web/assets/tab-store-DqeaGhhE.js +1 -0
  194. package/dist/web/assets/team-member-sheet-8EVCTM-X.js +2 -0
  195. package/dist/web/assets/team-member-window-content-Bc0ydBAn.js +1 -0
  196. package/dist/web/assets/templ-vtFoIgGG.js +1 -0
  197. package/dist/web/assets/terminal-tab-0b63-txz.js +3 -0
  198. package/dist/web/assets/tex-o6JLe3Qo.js +1 -0
  199. package/dist/web/assets/tool-cards-C09WknHl.js +9 -0
  200. package/dist/web/assets/treemap-KZPCXAKY-CfpX4ULx.js +1 -0
  201. package/dist/web/assets/ts-tags-DkmPnhIx.js +1 -0
  202. package/dist/web/assets/tsx-BUq9xm2T.js +1 -0
  203. package/dist/web/assets/twig-I9ja_Rk_.js +1 -0
  204. package/dist/web/assets/typescript-CP3RLBKz.js +1 -0
  205. package/dist/web/assets/use-blob-url-mZfScQdx.js +1 -0
  206. package/dist/web/assets/use-inline-blame-BuAc9IXE.js +16 -0
  207. package/dist/web/assets/use-is-mobile-CkO33jqU.js +1 -0
  208. package/dist/web/assets/use-lsp-DAtq1G0M.js +6 -0
  209. package/dist/web/assets/use-monaco-theme-Ch_znquJ.js +1 -0
  210. package/dist/web/assets/use-open-team-member-DHzZiJZw.js +1 -0
  211. package/dist/web/assets/use-visual-viewport-C307OVeV.js +1 -0
  212. package/dist/web/assets/use-websocket-DGEOad8p.js +1 -0
  213. package/dist/web/assets/vendor-markdown-QKPNiWEd.js +291 -0
  214. package/dist/web/assets/vendor-mermaid-eg2XWIjK.js +2921 -0
  215. package/dist/web/assets/vendor-ui-BHh12_0v.js +45 -0
  216. package/dist/web/assets/video-preview-DH3RtwVT.js +1 -0
  217. package/dist/web/assets/vue-DJf-APPD.js +1 -0
  218. package/dist/web/assets/vue-html-DUJ89Ycn.js +1 -0
  219. package/dist/web/assets/vue-vine-CWUFwuRE.js +1 -0
  220. package/dist/web/assets/window-pip-registry-DH07f_8k.js +1 -0
  221. package/dist/web/assets/window-store-B4cbZ5rr.js +1 -0
  222. package/dist/web/assets/ws-auth-B_y5rMfZ.js +1 -0
  223. package/dist/web/assets/xml-DshhaDKq.js +1 -0
  224. package/dist/web/assets/xsl-BlRNlmF7.js +1 -0
  225. package/dist/web/assets/yaml-seUOGdyI.js +1 -0
  226. package/dist/web/index.html +37 -36
  227. package/dist/web/sw.js +1 -1
  228. package/docs/architecture/workspace-and-ui.md +47 -0
  229. package/docs/project-roadmap.md +16 -0
  230. package/docs/system-architecture.md +11 -1
  231. package/package.json +4 -1
  232. package/scripts/gen-product-icons.ts +10 -0
  233. package/src/providers/claude-agent-sdk-query-options.ts +68 -1
  234. package/src/providers/claude-agent-sdk.ts +44 -15
  235. package/src/providers/codex-app-server/codex-event-mapper.ts +18 -1
  236. package/src/providers/codex-app-server/codex-jsonrpc-client.ts +4 -3
  237. package/src/providers/codex-app-server/codex-permission-map.ts +11 -1
  238. package/src/providers/codex-app-server/codex-protocol.ts +5 -0
  239. package/src/providers/codex-app-server/codex-provider.ts +32 -15
  240. package/src/providers/codex-app-server/codex-thread-params.ts +96 -0
  241. package/src/server/helpers/preview-asset-guard.ts +36 -0
  242. package/src/server/index.ts +15 -0
  243. package/src/server/routes/chat.ts +41 -4
  244. package/src/server/routes/design-check.ts +48 -0
  245. package/src/server/routes/design-comments.ts +63 -0
  246. package/src/server/routes/design-export.ts +84 -0
  247. package/src/server/routes/design-preview.ts +159 -0
  248. package/src/server/routes/design-route-helpers.ts +25 -0
  249. package/src/server/routes/design-style.ts +28 -0
  250. package/src/server/routes/design-tweaks.ts +38 -0
  251. package/src/server/routes/design-undo.ts +27 -0
  252. package/src/server/routes/designs.ts +101 -0
  253. package/src/server/routes/html-preview.ts +4 -24
  254. package/src/server/routes/project-scoped.ts +2 -0
  255. package/src/server/ws/chat.ts +8 -1
  256. package/src/server/ws/global.ts +22 -1
  257. package/src/services/chat.service.ts +64 -1
  258. package/src/services/db.service.ts +73 -4
  259. package/src/services/design/bridge/bridge-anchor-resolve.ts +96 -0
  260. package/src/services/design/bridge/bridge-core.ts +205 -0
  261. package/src/services/design/bridge/bridge-element-info.ts +180 -0
  262. package/src/services/design/bridge/bridge-extract-blocks.ts +115 -0
  263. package/src/services/design/bridge/bridge-extract-images.ts +96 -0
  264. package/src/services/design/bridge/bridge-extract-slides.ts +169 -0
  265. package/src/services/design/bridge/bridge-extract-text.ts +187 -0
  266. package/src/services/design/bridge/bridge-layout-boxes.ts +137 -0
  267. package/src/services/design/bridge/bridge-layout-check.ts +99 -0
  268. package/src/services/design/bridge/bridge-layout-grid.ts +165 -0
  269. package/src/services/design/bridge/bridge-layout-screenshot.ts +106 -0
  270. package/src/services/design/bridge/bridge-nav-guard.ts +61 -0
  271. package/src/services/design/bridge/bridge-picker-overlay.ts +54 -0
  272. package/src/services/design/bridge/bridge-picker.ts +174 -0
  273. package/src/services/design/bridge/bridge-pins.ts +157 -0
  274. package/src/services/design/bridge/bridge-script.ts +104 -0
  275. package/src/services/design/bridge/bridge-transform-math.ts +104 -0
  276. package/src/services/design/bridge/bridge-transform-overlay.ts +94 -0
  277. package/src/services/design/bridge/bridge-transform-style.ts +78 -0
  278. package/src/services/design/bridge/bridge-transform.ts +201 -0
  279. package/src/services/design/bridge/bridge-tweaks.ts +118 -0
  280. package/src/services/design/check/design-canvas-check-broker.ts +77 -0
  281. package/src/services/design/comments/design-comment-element-context.ts +81 -0
  282. package/src/services/design/comments/design-comments-store.ts +81 -0
  283. package/src/services/design/design-comments.service.ts +140 -0
  284. package/src/services/design/design-edit-undo-journal.ts +125 -0
  285. package/src/services/design/design-error.ts +19 -0
  286. package/src/services/design/design-events.ts +46 -0
  287. package/src/services/design/design-fs.ts +67 -0
  288. package/src/services/design/design-instructions.ts +97 -0
  289. package/src/services/design/design-lock.ts +74 -0
  290. package/src/services/design/design-manifest.ts +92 -0
  291. package/src/services/design/design-paths.ts +97 -0
  292. package/src/services/design/design-restore-journal.ts +143 -0
  293. package/src/services/design/design-restore.service.ts +77 -0
  294. package/src/services/design/design-safe-walk.ts +114 -0
  295. package/src/services/design/design-slug.ts +35 -0
  296. package/src/services/design/design-snapshot-history.ts +159 -0
  297. package/src/services/design/design-snapshots.service.ts +161 -0
  298. package/src/services/design/design-starter-template.ts +100 -0
  299. package/src/services/design/design-store.service.ts +156 -0
  300. package/src/services/design/design-style-patch.service.ts +83 -0
  301. package/src/services/design/design-tool-policy.ts +111 -0
  302. package/src/services/design/design-turn-snapshot.ts +80 -0
  303. package/src/services/design/design-tweaks-commit.service.ts +138 -0
  304. package/src/services/design/design-write-rate-limit.ts +51 -0
  305. package/src/services/design/export/css-url-inline.ts +130 -0
  306. package/src/services/design/export/design-export-asset-reader.ts +57 -0
  307. package/src/services/design/export/design-export-entry.ts +33 -0
  308. package/src/services/design/export/design-standalone-html.ts +167 -0
  309. package/src/services/design/export/design-zip-export.ts +106 -0
  310. package/src/services/design/mcp/design-mcp-access.ts +16 -0
  311. package/src/services/design/mcp/design-mcp-endpoint.ts +118 -0
  312. package/src/services/design/mcp/design-mcp-tokens.ts +82 -0
  313. package/src/services/design/mcp/design-mcp-tool.ts +41 -0
  314. package/src/services/design/preview/design-csp.ts +31 -0
  315. package/src/services/design/preview/design-preview-html.ts +98 -0
  316. package/src/services/design/preview/design-preview-scope.ts +66 -0
  317. package/src/services/design/preview/design-preview-tokens.ts +137 -0
  318. package/src/services/design/preview/expired-page.ts +30 -0
  319. package/src/services/design/preview/html-instrument.ts +119 -0
  320. package/src/services/design/preview/print-view.ts +62 -0
  321. package/src/services/design/source/css-root-selector.ts +20 -0
  322. package/src/services/design/source/css-root-vars-patch.ts +202 -0
  323. package/src/services/design/source/design-source-file.ts +62 -0
  324. package/src/services/design/source/design-style-sources.ts +101 -0
  325. package/src/services/design/source/element-source-range.ts +65 -0
  326. package/src/services/design/source/html-style-blocks.ts +87 -0
  327. package/src/services/design/source/inline-style-declarations.ts +131 -0
  328. package/src/services/design/source/inline-style-patch.ts +79 -0
  329. package/src/services/design/source/tweak-patch-plan.ts +143 -0
  330. package/src/services/file-watcher/ignore-rules.ts +9 -1
  331. package/src/services/server-listen-address.ts +25 -0
  332. package/src/shared/design-bridge-messages-check.ts +44 -0
  333. package/src/shared/design-bridge-messages-picker.ts +142 -0
  334. package/src/shared/design-bridge-messages-slides.ts +37 -0
  335. package/src/shared/design-bridge-messages-transform.ts +121 -0
  336. package/src/shared/design-bridge-messages-tweaks.ts +65 -0
  337. package/src/shared/design-bridge-protocol.ts +158 -0
  338. package/src/shared/design-canvas-check-format.ts +69 -0
  339. package/src/shared/design-canvas-check.ts +148 -0
  340. package/src/shared/design-cdn-hosts.ts +17 -0
  341. package/src/shared/design-comment-types.ts +111 -0
  342. package/src/shared/design-slide-doc-parse.ts +140 -0
  343. package/src/shared/design-slide-doc.ts +91 -0
  344. package/src/shared/design-system-init-prompt.ts +35 -0
  345. package/src/shared/design-tweaks.ts +175 -0
  346. package/src/shared/design-types.ts +63 -0
  347. package/src/shared/untrusted-text.ts +15 -0
  348. package/src/types/chat.ts +22 -0
  349. package/src/types/config.ts +1 -1
  350. package/src/web/components/chat/chat-history-bar.tsx +18 -15
  351. package/src/web/components/chat/chat-history-panel.tsx +3 -9
  352. package/src/web/components/chat/chat-tab.tsx +74 -40
  353. package/src/web/components/chat/message-input.tsx +11 -4
  354. package/src/web/components/chat/session-history-list.tsx +5 -9
  355. package/src/web/components/design/canvas/canvas-geometry.ts +47 -0
  356. package/src/web/components/design/canvas/design-canvas-pane.tsx +192 -0
  357. package/src/web/components/design/canvas/design-issues-badge.tsx +71 -0
  358. package/src/web/components/design/canvas/device-frame-presets.ts +37 -0
  359. package/src/web/components/design/canvas/use-design-bridge.ts +169 -0
  360. package/src/web/components/design/canvas/use-design-canvas-check.ts +110 -0
  361. package/src/web/components/design/canvas/use-design-canvas.ts +107 -0
  362. package/src/web/components/design/canvas/use-design-live-reload.ts +86 -0
  363. package/src/web/components/design/canvas/use-design-preview-url.ts +74 -0
  364. package/src/web/components/design/canvas/use-expanded-canvas-escape.ts +29 -0
  365. package/src/web/components/design/comments/comment-composer.tsx +107 -0
  366. package/src/web/components/design/comments/comment-overlay-geometry.ts +50 -0
  367. package/src/web/components/design/comments/comment-pins-overlay.tsx +70 -0
  368. package/src/web/components/design/comments/comments-panel.tsx +118 -0
  369. package/src/web/components/design/comments/comments-send-preview.tsx +43 -0
  370. package/src/web/components/design/comments/design-comments-layer.tsx +73 -0
  371. package/src/web/components/design/comments/element-action-bar.tsx +105 -0
  372. package/src/web/components/design/comments/use-comment-pins.ts +118 -0
  373. package/src/web/components/design/comments/use-design-comments-feature.ts +124 -0
  374. package/src/web/components/design/comments/use-design-comments.ts +89 -0
  375. package/src/web/components/design/comments/use-element-picker.ts +87 -0
  376. package/src/web/components/design/design-chat-pane.tsx +51 -0
  377. package/src/web/components/design/design-layout-controls.tsx +84 -0
  378. package/src/web/components/design/design-mobile-layout.tsx +34 -0
  379. package/src/web/components/design/design-split-layout.tsx +99 -0
  380. package/src/web/components/design/design-tab-context.ts +44 -0
  381. package/src/web/components/design/design-tab.tsx +116 -0
  382. package/src/web/components/design/design-toolbar-list.tsx +36 -0
  383. package/src/web/components/design/design-toolbar.tsx +200 -0
  384. package/src/web/components/design/designs-sidebar-panel.tsx +117 -0
  385. package/src/web/components/design/dialogs/delete-design-dialog.tsx +69 -0
  386. package/src/web/components/design/dialogs/design-responsive-dialog.tsx +48 -0
  387. package/src/web/components/design/dialogs/new-design-dialog.tsx +113 -0
  388. package/src/web/components/design/dialogs/rename-design-dialog.tsx +56 -0
  389. package/src/web/components/design/export/export-menu.tsx +108 -0
  390. package/src/web/components/design/export/export-warnings-sheet.tsx +35 -0
  391. package/src/web/components/design/export/pptx-export.ts +38 -0
  392. package/src/web/components/design/export/use-design-export.ts +142 -0
  393. package/src/web/components/design/history/design-history-panel.tsx +119 -0
  394. package/src/web/components/design/transform/design-undo-stack.ts +90 -0
  395. package/src/web/components/design/transform/transform-readout.tsx +50 -0
  396. package/src/web/components/design/transform/use-canvas-transform.ts +181 -0
  397. package/src/web/components/design/tweaks/tweak-control.tsx +94 -0
  398. package/src/web/components/design/tweaks/tweaks-panel.tsx +99 -0
  399. package/src/web/components/design/tweaks/use-design-tweaks.ts +151 -0
  400. package/src/web/components/design/use-design-auto-check.ts +94 -0
  401. package/src/web/components/design/use-design-layout.ts +55 -0
  402. package/src/web/components/design/use-design-summary.ts +63 -0
  403. package/src/web/components/layout/command-palette-design-commands.tsx +75 -0
  404. package/src/web/components/layout/command-palette.tsx +12 -4
  405. package/src/web/components/layout/editor-panel.tsx +4 -10
  406. package/src/web/components/layout/mobile-drawer.tsx +9 -2
  407. package/src/web/components/layout/mobile-nav.tsx +3 -2
  408. package/src/web/components/layout/mobile-tab-switcher-sheet.tsx +4 -5
  409. package/src/web/components/layout/sidebar.tsx +8 -1
  410. package/src/web/components/layout/tab-bar.tsx +3 -2
  411. package/src/web/components/layout/tab-content.tsx +5 -0
  412. package/src/web/components/layout/tab-pool.tsx +1 -0
  413. package/src/web/components/onboarding/onboarding-quick-orientation.tsx +1 -0
  414. package/src/web/hooks/use-chat.ts +8 -4
  415. package/src/web/hooks/use-design-session-redirect.ts +39 -0
  416. package/src/web/hooks/use-design-session-state.ts +94 -0
  417. package/src/web/hooks/use-global-events.ts +4 -1
  418. package/src/web/hooks/use-session-history.ts +4 -10
  419. package/src/web/hooks/use-url-sync.ts +10 -2
  420. package/src/web/lib/design/api-design-comments.ts +42 -0
  421. package/src/web/lib/design/api-design-edits.ts +62 -0
  422. package/src/web/lib/design/api-design-tweaks.ts +64 -0
  423. package/src/web/lib/design/api-designs.ts +81 -0
  424. package/src/web/lib/design/deliver-to-design-chat.ts +63 -0
  425. package/src/web/lib/design/design-auto-check-rounds.ts +32 -0
  426. package/src/web/lib/design/design-change-filter.ts +27 -0
  427. package/src/web/lib/design/design-comments-prompt.ts +55 -0
  428. package/src/web/lib/design/design-export-client.ts +101 -0
  429. package/src/web/lib/design/design-handoff-prompt.ts +48 -0
  430. package/src/web/lib/design/design-layout-mode.ts +79 -0
  431. package/src/web/lib/design/design-tab-metadata.ts +41 -0
  432. package/src/web/lib/design/design-transform-proposal.ts +62 -0
  433. package/src/web/lib/design/design-tweaks-model.ts +76 -0
  434. package/src/web/lib/design/design-ui-events.ts +25 -0
  435. package/src/web/lib/design/design-view-prefs.ts +90 -0
  436. package/src/web/lib/design/open-design-tab.ts +78 -0
  437. package/src/web/lib/design/pptx-slide-mapper.ts +118 -0
  438. package/src/web/lib/feature-badges.ts +2 -0
  439. package/src/web/lib/fluent-icon.tsx +38 -2
  440. package/src/web/lib/icons.generated.tsx +17 -1
  441. package/src/web/lib/patch-tab-metadata.ts +30 -0
  442. package/src/web/lib/send-to-chat.ts +16 -2
  443. package/src/web/lib/sidebar-tabs/tab-registry.ts +2 -0
  444. package/src/web/lib/tab-session-id.ts +16 -0
  445. package/src/web/lib/tab-type-icons.ts +2 -1
  446. package/src/web/stores/panel-store.ts +29 -1
  447. package/src/web/stores/panel-utils.ts +8 -1
  448. package/src/web/stores/settings-store.ts +2 -2
  449. package/src/web/stores/tab-store.ts +2 -1
  450. package/src/web/stores/window-panel-persistence.ts +1 -0
  451. package/dist/web/assets/accounts-settings-section-BDXYG6tT.js +0 -1
  452. package/dist/web/assets/ai-resource-editor-C3rKcZKN.js +0 -1
  453. package/dist/web/assets/ai-settings-section-ArqD8Nlg.js +0 -1
  454. package/dist/web/assets/ai-settings-section-DeWoAdLc.js +0 -1
  455. package/dist/web/assets/angular-html-DnrsWZqK.js +0 -1
  456. package/dist/web/assets/angular-ts-BXEqA9t1.js +0 -1
  457. package/dist/web/assets/api-client-Jn3njtNw.js +0 -1
  458. package/dist/web/assets/api-client-rSFnnCj4.js +0 -1
  459. package/dist/web/assets/api-settings-BZFSteM_.js +0 -1
  460. package/dist/web/assets/api-themes-CvKtX6Hd.js +0 -1
  461. package/dist/web/assets/apl-DUQ6Oyth.js +0 -1
  462. package/dist/web/assets/appearance-settings-section-K5o_Di4V.js +0 -1
  463. package/dist/web/assets/architecture-PBZL5I3N-B9M_VqZI.js +0 -1
  464. package/dist/web/assets/astro-CakOjJ6X.js +0 -1
  465. package/dist/web/assets/audio-preview-CwCDCN-_.js +0 -1
  466. package/dist/web/assets/blade-C903KM82.js +0 -1
  467. package/dist/web/assets/branch-review-tab-BNpYiUhC.js +0 -1
  468. package/dist/web/assets/bsl-slfcE_kB.js +0 -1
  469. package/dist/web/assets/button-B9CTrsEf.js +0 -1
  470. package/dist/web/assets/c-BWO-aeyf.js +0 -1
  471. package/dist/web/assets/cairo-DRwEaH6w.js +0 -1
  472. package/dist/web/assets/chat-tab-CC8KANoK.js +0 -15
  473. package/dist/web/assets/cobol--n4m6b70.js +0 -1
  474. package/dist/web/assets/code-editor-Ccf0Egrc.js +0 -7
  475. package/dist/web/assets/codex-daily-guard-CKk2WFlV.js +0 -1
  476. package/dist/web/assets/coffee-CjyFmw8_.js +0 -1
  477. package/dist/web/assets/conflict-editor-BCKbdpXy.js +0 -19
  478. package/dist/web/assets/context-menu-C6pIsf83.js +0 -1
  479. package/dist/web/assets/cpp-D18jdQPZ.js +0 -1
  480. package/dist/web/assets/createLucideIcon-DoiEKeJ_.js +0 -1
  481. package/dist/web/assets/crystal-CySzfH-7.js +0 -1
  482. package/dist/web/assets/css-Ca_hTmU6.js +0 -1
  483. package/dist/web/assets/csv-preview-I3a2lGUx.js +0 -2
  484. package/dist/web/assets/data-grid-overlay-editor-BD9eJweQ.js +0 -1
  485. package/dist/web/assets/data-grid-types-C6UX8kgh.js +0 -1
  486. package/dist/web/assets/database-viewer-DCuBR-bZ.js +0 -1
  487. package/dist/web/assets/dialog-B84_DJQ8.js +0 -1
  488. package/dist/web/assets/diff-viewer-DGaBe_Ln.js +0 -4
  489. package/dist/web/assets/dist-BD2gbdy0.js +0 -1
  490. package/dist/web/assets/docx-preview-CeH6p2Oi.js +0 -12
  491. package/dist/web/assets/edge-B6b5FHmU.js +0 -1
  492. package/dist/web/assets/edit-diff-preview-BG5DsLJG.js +0 -7
  493. package/dist/web/assets/editor-language-service-BaocEaLc.js +0 -1
  494. package/dist/web/assets/elixir-Dpo1rvn2.js +0 -1
  495. package/dist/web/assets/elm-D9CNOsWT.js +0 -1
  496. package/dist/web/assets/erb-sY7Yee1W.js +0 -1
  497. package/dist/web/assets/erlang-CfyrBxyF.js +0 -1
  498. package/dist/web/assets/esm-5AhGJcV8.js +0 -2
  499. package/dist/web/assets/explorer-body-2GYIYmUh.js +0 -2
  500. package/dist/web/assets/explorer-window-content-CYQSEX-g.js +0 -1
  501. package/dist/web/assets/extension-manager-section-BFAGdy3G.js +0 -1
  502. package/dist/web/assets/extension-webview-D5TXIBMf.js +0 -12
  503. package/dist/web/assets/file-icons-wS-OmEVu.js +0 -1
  504. package/dist/web/assets/file-store-Ds3qJ4hC.js +0 -1
  505. package/dist/web/assets/files-settings-section-BE6o-oHu.js +0 -1
  506. package/dist/web/assets/format-file-meta-eKLstbCL.js +0 -1
  507. package/dist/web/assets/fortran-fixed-form-N67gM_wp.js +0 -1
  508. package/dist/web/assets/fs-api-orca76dV.js +0 -1
  509. package/dist/web/assets/fsharp-Dq0K01wX.js +0 -1
  510. package/dist/web/assets/gdresource-DkFbszqY.js +0 -1
  511. package/dist/web/assets/general-settings-section-mQiXM537.js +0 -1
  512. package/dist/web/assets/git-commit-Ddt_nerD.js +0 -1
  513. package/dist/web/assets/git-log-panel-DqbcM9eC.js +0 -1
  514. package/dist/web/assets/git-rebase-CVK5OA7i.js +0 -1
  515. package/dist/web/assets/git-repo-store-BCEPfUGT.js +0 -1
  516. package/dist/web/assets/gitGraph-HDMCJU4V-D3RB33aA.js +0 -1
  517. package/dist/web/assets/glide-data-grid-BjEF7M5i.js +0 -141
  518. package/dist/web/assets/glimmer-js-51jbYnyY.js +0 -1
  519. package/dist/web/assets/glimmer-ts-C5L1J32J.js +0 -1
  520. package/dist/web/assets/glsl-BcsfmwJZ.js +0 -1
  521. package/dist/web/assets/graphql-dv4wuJsK.js +0 -1
  522. package/dist/web/assets/group-chat-tab-aX2GEnkD.js +0 -1
  523. package/dist/web/assets/hack-DLE5d3bx.js +0 -1
  524. package/dist/web/assets/haml-CoKfcM3E.js +0 -1
  525. package/dist/web/assets/handlebars-Bn0jy8pD.js +0 -1
  526. package/dist/web/assets/html-DXzY5Cew.js +0 -1
  527. package/dist/web/assets/html-derivative-DhcVfYuw.js +0 -1
  528. package/dist/web/assets/http-DepeIWQ1.js +0 -1
  529. package/dist/web/assets/hurl-CfsP4sCj.js +0 -1
  530. package/dist/web/assets/hxml-IfVkY3HL.js +0 -1
  531. package/dist/web/assets/icons-DQjqk0lJ.js +0 -1
  532. package/dist/web/assets/image-preview-CWncz5iI.js +0 -1
  533. package/dist/web/assets/index-BoaecXhu.js +0 -52
  534. package/dist/web/assets/index-aXJy_SvC.css +0 -1
  535. package/dist/web/assets/info-3K5VOQVL-DDX-2VB7.js +0 -1
  536. package/dist/web/assets/input-QNG_gTHh.js +0 -1
  537. package/dist/web/assets/java-JWdrzVo8.js +0 -1
  538. package/dist/web/assets/javascript-5aQKJRxB.js +0 -1
  539. package/dist/web/assets/jinja-DcCmNDQ8.js +0 -1
  540. package/dist/web/assets/jira-watcher-section-BKn3A8zI.js +0 -1
  541. package/dist/web/assets/jison-Bt-5cKVZ.js +0 -1
  542. package/dist/web/assets/json-BOq7QblK.js +0 -1
  543. package/dist/web/assets/jsx-BSLWViGE.js +0 -1
  544. package/dist/web/assets/julia-DewYVRtE.js +0 -1
  545. package/dist/web/assets/just-CLT_ggBy.js +0 -1
  546. package/dist/web/assets/keybindings-store-Brz0qepi.js +0 -1
  547. package/dist/web/assets/keyboard-shortcuts-section-Ck8KIbJ8.js +0 -1
  548. package/dist/web/assets/latex-DXmcayW1.js +0 -1
  549. package/dist/web/assets/lib-BWyA9SvU.js +0 -4
  550. package/dist/web/assets/liquid-BVcHf0IA.js +0 -1
  551. package/dist/web/assets/lua-BYupsB1B.js +0 -1
  552. package/dist/web/assets/markdown-renderer-BGuM2PBI.js +0 -5
  553. package/dist/web/assets/markdown-renderer-Ddz8tPbb.js +0 -1
  554. package/dist/web/assets/marko-CsD0R5tv.js +0 -1
  555. package/dist/web/assets/mdc-DP2tC4Kc.js +0 -1
  556. package/dist/web/assets/media-url-CVO4m4zr.js +0 -1
  557. package/dist/web/assets/mobile-bottom-sheet-C3TniEP-.js +0 -1
  558. package/dist/web/assets/mobile-explorer-sheet-DpKfB6iF.js +0 -1
  559. package/dist/web/assets/monaco-dotenv-language-DD8_UQG7.js +0 -1
  560. package/dist/web/assets/nextflow-FQM6iZO2.js +0 -1
  561. package/dist/web/assets/nginx-Bg0TK_a9.js +0 -1
  562. package/dist/web/assets/nim-D1kSCHdq.js +0 -1
  563. package/dist/web/assets/notification-store-ByCdTvCC.js +0 -1
  564. package/dist/web/assets/notifications-settings-section-C5v8FoH9.js +0 -1
  565. package/dist/web/assets/number-overlay-editor-Bsr04yCI.js +0 -9
  566. package/dist/web/assets/onboarding-entry-C81awoR5.js +0 -1
  567. package/dist/web/assets/onboarding-quick-orientation-Dqmis-E5.js +0 -1
  568. package/dist/web/assets/overview-panel-9OdBcYJC.js +0 -1
  569. package/dist/web/assets/packet-RMMSAZCW-B0ZSm6VM.js +0 -1
  570. package/dist/web/assets/panel-store-D20Zuf3i.js +0 -1
  571. package/dist/web/assets/pdf-preview-DuR07OfN.js +0 -1
  572. package/dist/web/assets/perl-B6QNc69s.js +0 -1
  573. package/dist/web/assets/php-Bvwf1t96.js +0 -1
  574. package/dist/web/assets/pie-UPGHQEXC-DKM0oPn7.js +0 -1
  575. package/dist/web/assets/portal-container-context-BarKmT4S.js +0 -1
  576. package/dist/web/assets/postgres-viewer-CGf7_g6Z.js +0 -3
  577. package/dist/web/assets/ppmbot-settings-section-DeTFU1b-.js +0 -1
  578. package/dist/web/assets/problems-panel-Bgkcge5_.js +0 -1
  579. package/dist/web/assets/process-table-DH7pnH5I.js +0 -1
  580. package/dist/web/assets/project-framework-store-ViZgce6y.js +0 -1
  581. package/dist/web/assets/project-store-hNvwfqX3.js +0 -1
  582. package/dist/web/assets/proxy-settings-section-DMGMRHH-.js +0 -1
  583. package/dist/web/assets/pug-I8oitXP4.js +0 -1
  584. package/dist/web/assets/qml-LKb7CHg-.js +0 -1
  585. package/dist/web/assets/query-audit-section-CpiXQVcS.js +0 -1
  586. package/dist/web/assets/r-DHu15BOo.js +0 -1
  587. package/dist/web/assets/radar-KQ55EAFF-DKhtzXmy.js +0 -1
  588. package/dist/web/assets/razor-CIPT897U.js +0 -1
  589. package/dist/web/assets/react-Bghu0NUO.js +0 -1
  590. package/dist/web/assets/regexp-Vdt2OEkk.js +0 -1
  591. package/dist/web/assets/remote-desktop-clipboard-notice-Bj5FtU0O.js +0 -1
  592. package/dist/web/assets/remote-desktop-mobile-sheet-BhwVrKxv.js +0 -2
  593. package/dist/web/assets/remote-desktop-mobile-view-B1oAqbjG.js +0 -1
  594. package/dist/web/assets/remote-desktop-readiness-gate-2LE86aTu.js +0 -1
  595. package/dist/web/assets/remote-desktop-window-content-u8HwuzyN.js +0 -1
  596. package/dist/web/assets/rolldown-runtime-FhOqtrmT.js +0 -1
  597. package/dist/web/assets/rst-BpcmfJFA.js +0 -1
  598. package/dist/web/assets/ruby-Cx413jgE.js +0 -1
  599. package/dist/web/assets/run-in-terminal-BFR70TLU.js +0 -1
  600. package/dist/web/assets/sas-B3ui_NHy.js +0 -1
  601. package/dist/web/assets/schedules-settings-section-C8XNDdi9.js +0 -1
  602. package/dist/web/assets/scroll-area-C0fQWNnx.js +0 -1
  603. package/dist/web/assets/scss-V4NlXnGi.js +0 -1
  604. package/dist/web/assets/send-to-chat-C8l7AcV4.js +0 -1
  605. package/dist/web/assets/separator-DwDoQpxS.js +0 -1
  606. package/dist/web/assets/settings-body-DelxmiKf.js +0 -2
  607. package/dist/web/assets/settings-store-m6qOXoy4.js +0 -2
  608. package/dist/web/assets/settings-tab-Cb_dFdA6.js +0 -1
  609. package/dist/web/assets/settings-window-content-5EQQfC1t.js +0 -1
  610. package/dist/web/assets/shaderlab-Cf7qZ4DR.js +0 -1
  611. package/dist/web/assets/shellscript-DRxJLgrx.js +0 -1
  612. package/dist/web/assets/shellsession-BfA8Fmhb.js +0 -1
  613. package/dist/web/assets/soy-CGKN9rxg.js +0 -1
  614. package/dist/web/assets/sparql-CArCsIdI.js +0 -1
  615. package/dist/web/assets/sql-ljEiM8nf.js +0 -1
  616. package/dist/web/assets/sql-query-editor-B3wrPR6K.js +0 -1
  617. package/dist/web/assets/sqlite-viewer-iQXNp0kH.js +0 -1
  618. package/dist/web/assets/stata-CplvndbA.js +0 -1
  619. package/dist/web/assets/surrealql-DwX1PCpP.js +0 -1
  620. package/dist/web/assets/svelte-DYCNmQjy.js +0 -1
  621. package/dist/web/assets/system-monitor-body-5grJyA7C.js +0 -2
  622. package/dist/web/assets/system-monitor-tab-CJr797F8.js +0 -1
  623. package/dist/web/assets/system-monitor-window-content-OGAhFXXo.js +0 -1
  624. package/dist/web/assets/tab-host-window-content-C-eEo8I7.js +0 -1
  625. package/dist/web/assets/tab-store-krAuHQ6_.js +0 -1
  626. package/dist/web/assets/team-member-sheet-CRvJUtdh.js +0 -2
  627. package/dist/web/assets/team-member-window-content-C97N4RXb.js +0 -1
  628. package/dist/web/assets/templ-b_h2-Z9l.js +0 -1
  629. package/dist/web/assets/terminal-tab-eZwpkvEe.js +0 -3
  630. package/dist/web/assets/tex-022M3-MR.js +0 -1
  631. package/dist/web/assets/tool-cards-Bg4vjDYu.js +0 -9
  632. package/dist/web/assets/treemap-KZPCXAKY-CxqsD_6n.js +0 -1
  633. package/dist/web/assets/ts-tags-BUl0AdO6.js +0 -1
  634. package/dist/web/assets/tsx-CKaH7SzK.js +0 -1
  635. package/dist/web/assets/twig-CMzYUcSa.js +0 -1
  636. package/dist/web/assets/typescript-DZozDFsi.js +0 -1
  637. package/dist/web/assets/use-blob-url-C0VR6Uhh.js +0 -1
  638. package/dist/web/assets/use-inline-blame-CzR8CnOZ.js +0 -16
  639. package/dist/web/assets/use-is-mobile-TkcwP1Gx.js +0 -1
  640. package/dist/web/assets/use-lsp-BAoOSc-L.js +0 -6
  641. package/dist/web/assets/use-monaco-theme-Gd8cpt9n.js +0 -1
  642. package/dist/web/assets/use-open-team-member-y9sVhaNr.js +0 -1
  643. package/dist/web/assets/use-visual-viewport-Lp878uzs.js +0 -1
  644. package/dist/web/assets/use-websocket-CDfXkXo3.js +0 -1
  645. package/dist/web/assets/vendor-markdown-CuWCHIVb.js +0 -291
  646. package/dist/web/assets/vendor-mermaid-D6lgjvVE.js +0 -2921
  647. package/dist/web/assets/vendor-ui-DmZ-Mb-H.js +0 -45
  648. package/dist/web/assets/video-preview-BYJ3aVo1.js +0 -1
  649. package/dist/web/assets/vue-D83SsURi.js +0 -1
  650. package/dist/web/assets/vue-html-BGU-OYYb.js +0 -1
  651. package/dist/web/assets/vue-vine-1sHE1gZn.js +0 -1
  652. package/dist/web/assets/window-pip-registry-D1oXq-Dq.js +0 -1
  653. package/dist/web/assets/window-store-UC1jJeLM.js +0 -1
  654. package/dist/web/assets/ws-auth-CaxV807E.js +0 -1
  655. package/dist/web/assets/xml-bWQJszMK.js +0 -1
  656. package/dist/web/assets/xsl-DTMc1Tsm.js +0 -1
  657. package/dist/web/assets/yaml-4pzZq5KT.js +0 -1
  658. /package/dist/web/assets/{abap-DrxZXLHj.js → abap-DWbETETF.js} +0 -0
  659. /package/dist/web/assets/{actionscript-3-DOPR4pRC.js → actionscript-3-C278tgAF.js} +0 -0
  660. /package/dist/web/assets/{ada-DkqjEnDr.js → ada-C_5J29IC.js} +0 -0
  661. /package/dist/web/assets/{andromeeda-BSZjevw2.js → andromeeda-Ct0fb9Zo.js} +0 -0
  662. /package/dist/web/assets/{apache-DYwdQ5F_.js → apache-oMwCqc2o.js} +0 -0
  663. /package/dist/web/assets/{apex-Dohu7DfB.js → apex-n6XQQudq.js} +0 -0
  664. /package/dist/web/assets/{applescript-CdfGIVqp.js → applescript-QDMA6blY.js} +0 -0
  665. /package/dist/web/assets/{apply-theme-CbR31K6I.js → apply-theme-aVoqSG0I.js} +0 -0
  666. /package/dist/web/assets/{ara-i3_3TMnI.js → ara-D6rg_rTp.js} +0 -0
  667. /package/dist/web/assets/{asciidoc-DJFM-7vl.js → asciidoc-DVeBWv0S.js} +0 -0
  668. /package/dist/web/assets/{asm-bMFssizQ.js → asm-DzHQzzqu.js} +0 -0
  669. /package/dist/web/assets/{aurora-x-CetC7M8b.js → aurora-x-pJESoXa6.js} +0 -0
  670. /package/dist/web/assets/{awk-FFWx9ZrE.js → awk-BwfK4mzn.js} +0 -0
  671. /package/dist/web/assets/{ayu-dark-D4ION2wO.js → ayu-dark-CG-9c7ej.js} +0 -0
  672. /package/dist/web/assets/{ayu-light-BZN99P5A.js → ayu-light-BGUfMG6m.js} +0 -0
  673. /package/dist/web/assets/{ayu-mirage-B-IpsKiL.js → ayu-mirage-CMD89qy6.js} +0 -0
  674. /package/dist/web/assets/{ballerina-DhyJcKkq.js → ballerina-CP5gYaiB.js} +0 -0
  675. /package/dist/web/assets/{bat-GOVQY81F.js → bat-DCRdiK45.js} +0 -0
  676. /package/dist/web/assets/{beancount-BO749Rhc.js → beancount-DHkDiOKO.js} +0 -0
  677. /package/dist/web/assets/{berry-CHYYKXmK.js → berry-B6TPldKS.js} +0 -0
  678. /package/dist/web/assets/{bibtex-BnYiDnxT.js → bibtex-DIor8yh9.js} +0 -0
  679. /package/dist/web/assets/{bicep-kljgR_G3.js → bicep-BbIdLZZ_.js} +0 -0
  680. /package/dist/web/assets/{bird2-DnLtJGhV.js → bird2-C76TmOG1.js} +0 -0
  681. /package/dist/web/assets/{c3-fc_jio6D.js → c3-CqZ77xXr.js} +0 -0
  682. /package/dist/web/assets/{cadence-DopRCrdB.js → cadence-BlaAb6F6.js} +0 -0
  683. /package/dist/web/assets/{can-open-in-ppm-CUW3vVJg.js → can-open-in-ppm-D8T6Xca-.js} +0 -0
  684. /package/dist/web/assets/{catppuccin-frappe-DL6iCUa8.js → catppuccin-frappe-BuV7Zg67.js} +0 -0
  685. /package/dist/web/assets/{catppuccin-latte-DNF7n3uY.js → catppuccin-latte-B7HXEZf7.js} +0 -0
  686. /package/dist/web/assets/{catppuccin-macchiato-ByMic_k0.js → catppuccin-macchiato-B0KctcoC.js} +0 -0
  687. /package/dist/web/assets/{catppuccin-mocha-DcrJtZtv.js → catppuccin-mocha-Bofr5rzo.js} +0 -0
  688. /package/dist/web/assets/{clarity-0cRLlvQe.js → clarity-CerfZ3dW.js} +0 -0
  689. /package/dist/web/assets/{clojure-DPqZAcpI.js → clojure-BCEG1uj6.js} +0 -0
  690. /package/dist/web/assets/{cmake-Bx26bw5u.js → cmake-CRxSSKSr.js} +0 -0
  691. /package/dist/web/assets/{codeowners-BpgxIgxr.js → codeowners-BqW6DYSk.js} +0 -0
  692. /package/dist/web/assets/{codeql-TRoWjo5g.js → codeql-DlnOpgWF.js} +0 -0
  693. /package/dist/web/assets/{common-lisp-Ctohamsb.js → common-lisp-DgIX9jkq.js} +0 -0
  694. /package/dist/web/assets/{coq-BO6TJSED.js → coq-CFeLOER-.js} +0 -0
  695. /package/dist/web/assets/{csharp-DSy4nlrl.js → csharp-BGFGcV8G.js} +0 -0
  696. /package/dist/web/assets/{csv-DND7YJXD.js → csv-Cx126-fo.js} +0 -0
  697. /package/dist/web/assets/{csv-parser-DZ_75eCb.js → csv-parser-BXeH-yzY.js} +0 -0
  698. /package/dist/web/assets/{cue-BUnWK221.js → cue-Cd0PEGFL.js} +0 -0
  699. /package/dist/web/assets/{cypher-CInm9Etl.js → cypher-QS9S-1Nu.js} +0 -0
  700. /package/dist/web/assets/{d-BbsB8r6R.js → d-Bx6zK6J7.js} +0 -0
  701. /package/dist/web/assets/{dark-plus-DkzIiuQX.js → dark-plus-DLqXEd2I.js} +0 -0
  702. /package/dist/web/assets/{dart-BG2nw7Se.js → dart-BL2C2Z6E.js} +0 -0
  703. /package/dist/web/assets/{dax-j4h6VhlV.js → dax-ClxUDxvY.js} +0 -0
  704. /package/dist/web/assets/{desktop-Dg34JDlS.js → desktop-DLEkw1UR.js} +0 -0
  705. /package/dist/web/assets/{diff-CRrKo-mH.js → diff-Dlp9KQSL.js} +0 -0
  706. /package/dist/web/assets/{dist-D39GQICe.js → dist-CDpxSUMU.js} +0 -0
  707. /package/dist/web/assets/{docker-DAtcxZjt.js → docker-DVBsQYb-.js} +0 -0
  708. /package/dist/web/assets/{dotenv-DNUcgQCn.js → dotenv-DjBB7S8B.js} +0 -0
  709. /package/dist/web/assets/{dracula-bhhaShNC.js → dracula-Cu055q9D.js} +0 -0
  710. /package/dist/web/assets/{dracula-soft-CeHAoi-D.js → dracula-soft-BiX_luwV.js} +0 -0
  711. /package/dist/web/assets/{dream-maker-BMH1JI2G.js → dream-maker-S6ie6kFg.js} +0 -0
  712. /package/dist/web/assets/{editor-font-D_4aaSCa.js → editor-font-BOjGgYeg.js} +0 -0
  713. /package/dist/web/assets/{emacs-lisp-BaAYIdWN.js → emacs-lisp-DpOda430.js} +0 -0
  714. /package/dist/web/assets/{everforest-dark-Cs91gPa_.js → everforest-dark-BAfSXdLG.js} +0 -0
  715. /package/dist/web/assets/{everforest-light-lTkE6qWA.js → everforest-light-Dp59kp4R.js} +0 -0
  716. /package/dist/web/assets/{fennel-CmhYEhcM.js → fennel-CNaNUmMo.js} +0 -0
  717. /package/dist/web/assets/{fish-p1jauFum.js → fish-C8Z04ic7.js} +0 -0
  718. /package/dist/web/assets/{fluent-BsH-lUh2.js → fluent-Bugk01mf.js} +0 -0
  719. /package/dist/web/assets/{format-bytes-amUJ8Js8.js → format-bytes-DBBzVCYA.js} +0 -0
  720. /package/dist/web/assets/{fortran-free-form-CB6SdVKB.js → fortran-free-form-csIz6MQj.js} +0 -0
  721. /package/dist/web/assets/{gdscript--YoKuvEA.js → gdscript-fdzYQLfk.js} +0 -0
  722. /package/dist/web/assets/{gdshader-BRtMwf5z.js → gdshader-CfsEtDeZ.js} +0 -0
  723. /package/dist/web/assets/{genie-wrzVG2Z8.js → genie-CtHN5N2Q.js} +0 -0
  724. /package/dist/web/assets/{gherkin-HnpURN27.js → gherkin-gSp2ZJTf.js} +0 -0
  725. /package/dist/web/assets/{github-dark-XlZ3pGhn.js → github-dark-D7O9efii.js} +0 -0
  726. /package/dist/web/assets/{github-dark-default-D_R0hfJe.js → github-dark-default-Bv2wIhqD.js} +0 -0
  727. /package/dist/web/assets/{github-dark-dimmed-BHQgHLnK.js → github-dark-dimmed-BuY_SpCX.js} +0 -0
  728. /package/dist/web/assets/{github-dark-high-contrast-Pbl4mEFe.js → github-dark-high-contrast-Chv0f5Wu.js} +0 -0
  729. /package/dist/web/assets/{github-light-0P0VANJn.js → github-light-DV8f-W2f.js} +0 -0
  730. /package/dist/web/assets/{github-light-default-DTfsnyDq.js → github-light-default-CNBSU3dB.js} +0 -0
  731. /package/dist/web/assets/{github-light-high-contrast-DKITR-5Y.js → github-light-high-contrast-sg94tHwU.js} +0 -0
  732. /package/dist/web/assets/{gleam-refSZtkM.js → gleam-w7270-PJ.js} +0 -0
  733. /package/dist/web/assets/{gn-BZ9cGckR.js → gn-yo_iE_A_.js} +0 -0
  734. /package/dist/web/assets/{gnuplot-CMHqDcTW.js → gnuplot-DSBPrzl4.js} +0 -0
  735. /package/dist/web/assets/{go-bFdCrzvY.js → go-D1S7g97D.js} +0 -0
  736. /package/dist/web/assets/{groovy-Dvz5tluQ.js → groovy-C7xW-5IV.js} +0 -0
  737. /package/dist/web/assets/{gruvbox-dark-hard-D0Z-pclr.js → gruvbox-dark-hard-BZald7Z_.js} +0 -0
  738. /package/dist/web/assets/{gruvbox-dark-medium-BG6oIRQR.js → gruvbox-dark-medium-v6W4PZne.js} +0 -0
  739. /package/dist/web/assets/{gruvbox-dark-soft-ILJ-3tU6.js → gruvbox-dark-soft-CN5mIGkw.js} +0 -0
  740. /package/dist/web/assets/{gruvbox-light-hard-Bl95khkz.js → gruvbox-light-hard-D3NIGRxd.js} +0 -0
  741. /package/dist/web/assets/{gruvbox-light-medium-CdislFOh.js → gruvbox-light-medium-m4ShuCnD.js} +0 -0
  742. /package/dist/web/assets/{gruvbox-light-soft-CTcEyxlX.js → gruvbox-light-soft-BEEYNyk-.js} +0 -0
  743. /package/dist/web/assets/{haskell-D9jfkQuH.js → haskell-CgtdXIH3.js} +0 -0
  744. /package/dist/web/assets/{haxe-Ckfl4osD.js → haxe-D7HQqtIx.js} +0 -0
  745. /package/dist/web/assets/{hcl-t03N4k5N.js → hcl-C-YHDaXH.js} +0 -0
  746. /package/dist/web/assets/{hjson-B_TIVRki.js → hjson-BrgEMvJK.js} +0 -0
  747. /package/dist/web/assets/{hlsl-BBCTeANz.js → hlsl-BsDumu1j.js} +0 -0
  748. /package/dist/web/assets/{horizon-CRY-xdGU.js → horizon-D9Kre3KQ.js} +0 -0
  749. /package/dist/web/assets/{horizon-bright-BpUM2C5u.js → horizon-bright-DJq8c_Yq.js} +0 -0
  750. /package/dist/web/assets/{houston-RVyAGlyS.js → houston-B9tnxzX8.js} +0 -0
  751. /package/dist/web/assets/{hy-BHFJHuHd.js → hy-DUYVvXOj.js} +0 -0
  752. /package/dist/web/assets/{image-gallery-DdQblMAe.js → image-gallery-DvAgPQ3L.js} +0 -0
  753. /package/dist/web/assets/{image-preview-geometry-BFKR37Pj.js → image-preview-geometry-B-SdD7_D.js} +0 -0
  754. /package/dist/web/assets/{imba-DyG0_0MS.js → imba-CGW-TsRm.js} +0 -0
  755. /package/dist/web/assets/{ini-CsCTH-_o.js → ini-PqgYiEAV.js} +0 -0
  756. /package/dist/web/assets/{json5-g3g-IFTV.js → json5-sbkvqHou.js} +0 -0
  757. /package/dist/web/assets/{jsonc-DQHBJwib.js → jsonc-pnywfpws.js} +0 -0
  758. /package/dist/web/assets/{jsonl-zFLDm4eB.js → jsonl-ZPOQ0pRn.js} +0 -0
  759. /package/dist/web/assets/{jsonnet-DgNm2IGn.js → jsonnet-B_Q7j1YF.js} +0 -0
  760. /package/dist/web/assets/{jssm-BErkU0In.js → jssm-K-xYeQyp.js} +0 -0
  761. /package/dist/web/assets/{kanagawa-dragon-Dgymfjca.js → kanagawa-dragon-DAdLBtU8.js} +0 -0
  762. /package/dist/web/assets/{kanagawa-lotus-CWZEYd27.js → kanagawa-lotus-5BwvVGu8.js} +0 -0
  763. /package/dist/web/assets/{kanagawa-wave-CQg17ecf.js → kanagawa-wave-C0h9fsDT.js} +0 -0
  764. /package/dist/web/assets/{kdl-DY4GHmJC.js → kdl-DXSsFcms.js} +0 -0
  765. /package/dist/web/assets/{kotlin-DeGTz7bl.js → kotlin-BXNIvloo.js} +0 -0
  766. /package/dist/web/assets/{kusto-BN-OqpQj.js → kusto-wM3eio5V.js} +0 -0
  767. /package/dist/web/assets/{laserwave-bAqiAiOp.js → laserwave-FcbxdP2A.js} +0 -0
  768. /package/dist/web/assets/{lean-CAypLWCf.js → lean-RenzGeoM.js} +0 -0
  769. /package/dist/web/assets/{less-ikHAUlPb.js → less-CcUdtNJi.js} +0 -0
  770. /package/dist/web/assets/{libesm-cUHvIIuW.js → libesm-DMnQ3WlF.js} +0 -0
  771. /package/dist/web/assets/{light-plus-BamuTcT9.js → light-plus-BsMoOZJR.js} +0 -0
  772. /package/dist/web/assets/{llvm-CddObVkW.js → llvm-CyylMBuq.js} +0 -0
  773. /package/dist/web/assets/{log-CWbfGTTc.js → log-BOi0GB58.js} +0 -0
  774. /package/dist/web/assets/{logo-AHyhxX3Z.js → logo-BQUr3X2Y.js} +0 -0
  775. /package/dist/web/assets/{luau-y7she9L3.js → luau-3YZRDIsh.js} +0 -0
  776. /package/dist/web/assets/{make-DP3sQaP3.js → make-DEkKRDRU.js} +0 -0
  777. /package/dist/web/assets/{markdown-9Nuxib8a.js → markdown-BmFN0-A1.js} +0 -0
  778. /package/dist/web/assets/{material-theme-DDpm-uS7.js → material-theme-DqLHjEZ8.js} +0 -0
  779. /package/dist/web/assets/{material-theme-darker-CHk91wbm.js → material-theme-darker-DhbvULnI.js} +0 -0
  780. /package/dist/web/assets/{material-theme-lighter-LkmOI8KM.js → material-theme-lighter-C_aA4yVe.js} +0 -0
  781. /package/dist/web/assets/{material-theme-ocean-PpkUhB4-.js → material-theme-ocean-Pk5JltJS.js} +0 -0
  782. /package/dist/web/assets/{material-theme-palenight-DZAigXgW.js → material-theme-palenight-DNi3VguV.js} +0 -0
  783. /package/dist/web/assets/{matlab-CexKVVPc.js → matlab-BqUtv2ml.js} +0 -0
  784. /package/dist/web/assets/{mdx-BrcepHfI.js → mdx-DFMrnHBn.js} +0 -0
  785. /package/dist/web/assets/{mermaid-CNFhZZaG.js → mermaid-BpyuE0L_.js} +0 -0
  786. /package/dist/web/assets/{min-dark-hd3nbDV4.js → min-dark-DVfCMEPW.js} +0 -0
  787. /package/dist/web/assets/{min-light-AqA5jmks.js → min-light-B96aMADV.js} +0 -0
  788. /package/dist/web/assets/{mipsasm-B3x4L8Zk.js → mipsasm-DHhEcvKr.js} +0 -0
  789. /package/dist/web/assets/{mojo-CvfXy3YL.js → mojo-BQ6HsVIQ.js} +0 -0
  790. /package/dist/web/assets/{monokai-CdxwmnU_.js → monokai-amcXAKGG.js} +0 -0
  791. /package/dist/web/assets/{moonbit-6Z_VCO0_.js → moonbit-CGSXXQJI.js} +0 -0
  792. /package/dist/web/assets/{move-B2__B6Po.js → move-BOa4mq0q.js} +0 -0
  793. /package/dist/web/assets/{narrat-D6vL6wL-.js → narrat-dBYNSnhr.js} +0 -0
  794. /package/dist/web/assets/{nextflow-groovy-L-FBME4e.js → nextflow-groovy-Dm2Y_qgn.js} +0 -0
  795. /package/dist/web/assets/{night-owl-DjKrkDjv.js → night-owl-Dy9ibYHN.js} +0 -0
  796. /package/dist/web/assets/{night-owl-light-CeGjPuUQ.js → night-owl-light-DamYjQKi.js} +0 -0
  797. /package/dist/web/assets/{nix-dr279CcA.js → nix-C1LyoszC.js} +0 -0
  798. /package/dist/web/assets/{nord-Dxn-_H_Y.js → nord-LtGRYAFI.js} +0 -0
  799. /package/dist/web/assets/{nushell-DgeAQO7j.js → nushell-BMoOkt47.js} +0 -0
  800. /package/dist/web/assets/{objective-c-CO0-Pacn.js → objective-c-CILaOZJu.js} +0 -0
  801. /package/dist/web/assets/{objective-cpp-SkrjegYw.js → objective-cpp-D5Fo-SoM.js} +0 -0
  802. /package/dist/web/assets/{ocaml-CAihtkib.js → ocaml-D1TCTCEJ.js} +0 -0
  803. /package/dist/web/assets/{odin-D0XZbUDB.js → odin-CjdYcmpW.js} +0 -0
  804. /package/dist/web/assets/{one-dark-pro-BUMNMxjX.js → one-dark-pro-GpsZUGZl.js} +0 -0
  805. /package/dist/web/assets/{one-light-C0Ui69Bx.js → one-light-DlketcS4.js} +0 -0
  806. /package/dist/web/assets/{openscad-fZ9ggqM-.js → openscad-BoT8wwuI.js} +0 -0
  807. /package/dist/web/assets/{pascal-DvZm-eun.js → pascal-Cqy403Sf.js} +0 -0
  808. /package/dist/web/assets/{pkl-CQSIp_z8.js → pkl-D6gRI9qQ.js} +0 -0
  809. /package/dist/web/assets/{plastic-CMspsouJ.js → plastic-DgvX8DXX.js} +0 -0
  810. /package/dist/web/assets/{plsql-B_HL7UfT.js → plsql-CTDnCVE3.js} +0 -0
  811. /package/dist/web/assets/{po-DxAfbdfe.js → po-DDnzm7AQ.js} +0 -0
  812. /package/dist/web/assets/{poimandres-JGmqmwux.js → poimandres-C4HQwFp-.js} +0 -0
  813. /package/dist/web/assets/{polar-_mNmplk8.js → polar-WBTQdMzX.js} +0 -0
  814. /package/dist/web/assets/{postcss-GpU0Sjqc.js → postcss-CWxogTg1.js} +0 -0
  815. /package/dist/web/assets/{powerquery-B1IP1lCQ.js → powerquery-DVtReIRR.js} +0 -0
  816. /package/dist/web/assets/{powershell-BiSO9XmG.js → powershell-Cb_RNzSh.js} +0 -0
  817. /package/dist/web/assets/{prisma-4QqDYSnH.js → prisma-nKLUh3DY.js} +0 -0
  818. /package/dist/web/assets/{prolog-BNjvyRqT.js → prolog-BD9orEy4.js} +0 -0
  819. /package/dist/web/assets/{proto-RNOumnkw.js → proto-B-AFoz75.js} +0 -0
  820. /package/dist/web/assets/{puppet-CDfv5o8f.js → puppet-DDW6wWm4.js} +0 -0
  821. /package/dist/web/assets/{purescript-YTjSoifd.js → purescript-DXy49AJg.js} +0 -0
  822. /package/dist/web/assets/{python-Mh7JD25U.js → python-BQnvDlc7.js} +0 -0
  823. /package/dist/web/assets/{qmldir-Da_ZrqZy.js → qmldir-CboMQXQW.js} +0 -0
  824. /package/dist/web/assets/{qss-DANVkyhy.js → qss-8XaprLEt.js} +0 -0
  825. /package/dist/web/assets/{racket-CwPOn4T1.js → racket-ChcVp15M.js} +0 -0
  826. /package/dist/web/assets/{raku-B04lBsXd.js → raku-dEgEXW0A.js} +0 -0
  827. /package/dist/web/assets/{red-MW6Zm5pd.js → red-hmwjontD.js} +0 -0
  828. /package/dist/web/assets/{reg-44SURM-E.js → reg-CIkOufh2.js} +0 -0
  829. /package/dist/web/assets/{rel-Gu5Erhpm.js → rel-NXKKDiTi.js} +0 -0
  830. /package/dist/web/assets/{resolve-theme-BNubecVz.js → resolve-theme-B87m6l4i.js} +0 -0
  831. /package/dist/web/assets/{riscv-DZDP0Ce7.js → riscv-BEIzhPcg.js} +0 -0
  832. /package/dist/web/assets/{ron-BwLObbl6.js → ron-CW2Bt8rN.js} +0 -0
  833. /package/dist/web/assets/{rose-pine-Bz6ToXok.js → rose-pine-DhnBfr5a.js} +0 -0
  834. /package/dist/web/assets/{rose-pine-dawn-LyFogzAh.js → rose-pine-dawn-Jyj59rVs.js} +0 -0
  835. /package/dist/web/assets/{rose-pine-moon-CpjkefjD.js → rose-pine-moon-BMulxhJC.js} +0 -0
  836. /package/dist/web/assets/{rosmsg-BldDLaz1.js → rosmsg-DuctJm-Q.js} +0 -0
  837. /package/dist/web/assets/{rust-74skZ8CC.js → rust-FbJ2fCp9.js} +0 -0
  838. /package/dist/web/assets/{sass-CitUFDWl.js → sass-Dfxwdu2h.js} +0 -0
  839. /package/dist/web/assets/{scala-D2kl5ghT.js → scala-ClsSR0wG.js} +0 -0
  840. /package/dist/web/assets/{scheme-DZqhC9Xs.js → scheme-Jj_Cc-8H.js} +0 -0
  841. /package/dist/web/assets/{sdbl-D6a8sHP9.js → sdbl-Bi8D_DGN.js} +0 -0
  842. /package/dist/web/assets/{slack-dark-DrlPLUB_.js → slack-dark-B7gbmJT9.js} +0 -0
  843. /package/dist/web/assets/{slack-ochin-Djgychog.js → slack-ochin-O7j_c76D.js} +0 -0
  844. /package/dist/web/assets/{smalltalk-CYQHXftK.js → smalltalk-BD5-U3JK.js} +0 -0
  845. /package/dist/web/assets/{snazzy-light-BQAdF14K.js → snazzy-light-BbiRB69_.js} +0 -0
  846. /package/dist/web/assets/{solarized-dark-JDtJfY-g.js → solarized-dark-2OWHYEBu.js} +0 -0
  847. /package/dist/web/assets/{solarized-light-DHzVPLDD.js → solarized-light-Cew4YqT3.js} +0 -0
  848. /package/dist/web/assets/{solidity-CYCEiPu1.js → solidity-Bpbne2Tx.js} +0 -0
  849. /package/dist/web/assets/{splunk-B7RHmJY2.js → splunk-Dq86L1_O.js} +0 -0
  850. /package/dist/web/assets/{ssh-config-B74-n00O.js → ssh-config-j5hsMvbs.js} +0 -0
  851. /package/dist/web/assets/{stylus-xlRhcbpN.js → stylus-DWhCIBg0.js} +0 -0
  852. /package/dist/web/assets/{swift-DTFwWJtu.js → swift-29fG5ztW.js} +0 -0
  853. /package/dist/web/assets/{synthwave-84-BuCpuX2E.js → synthwave-84-DraIUmiw.js} +0 -0
  854. /package/dist/web/assets/{system-verilog-CgxJCrOK.js → system-verilog-DqcJAWq_.js} +0 -0
  855. /package/dist/web/assets/{systemd-D0x7_XYJ.js → systemd-BUPJrx1D.js} +0 -0
  856. /package/dist/web/assets/{talonscript-B50aQRuc.js → talonscript-BGYbnAKh.js} +0 -0
  857. /package/dist/web/assets/{tasl-Byv8gHCL.js → tasl-CwbSJqng.js} +0 -0
  858. /package/dist/web/assets/{tcl-CzMjCzWo.js → tcl-Ba9376wa.js} +0 -0
  859. /package/dist/web/assets/{terraform-D6GH4CXG.js → terraform-ChSasWu8.js} +0 -0
  860. /package/dist/web/assets/{tokyo-night-CQ4rTpHY.js → tokyo-night-Bbw1Yguv.js} +0 -0
  861. /package/dist/web/assets/{toml-D9W-BuJE.js → toml-CYb7zi5B.js} +0 -0
  862. /package/dist/web/assets/{tsv-BddanT8p.js → tsv-P2eVmwf9.js} +0 -0
  863. /package/dist/web/assets/{turtle-BddVklvD.js → turtle-DIoQTATC.js} +0 -0
  864. /package/dist/web/assets/{typespec-D60I2kfB.js → typespec-Dpr1bC2k.js} +0 -0
  865. /package/dist/web/assets/{typst-Bxvc-9ID.js → typst-D4WMCDMn.js} +0 -0
  866. /package/dist/web/assets/{utils-Bmf_8h7Y.js → utils-btZ8C8-R.js} +0 -0
  867. /package/dist/web/assets/{v-kVYZE10o.js → v-B1wY-VFU.js} +0 -0
  868. /package/dist/web/assets/{vala-B3zj44PV.js → vala-BKqhrirP.js} +0 -0
  869. /package/dist/web/assets/{vb-CHgWrFTj.js → vb-S9PHCa7-.js} +0 -0
  870. /package/dist/web/assets/{vendor-xterm-_yyu5n32.js → vendor-xterm-BHKF_Nsf.js} +0 -0
  871. /package/dist/web/assets/{verilog-zIMuE3hE.js → verilog-CrztYl3V.js} +0 -0
  872. /package/dist/web/assets/{vesper-BjqPTQr0.js → vesper-C5KfcyFv.js} +0 -0
  873. /package/dist/web/assets/{vhdl-Q2EtgpQN.js → vhdl-D0qMeIJu.js} +0 -0
  874. /package/dist/web/assets/{viml-CrtDZkFz.js → viml-Dsv9mRPK.js} +0 -0
  875. /package/dist/web/assets/{vitesse-black-D2VWO3oN.js → vitesse-black-rJvNN5GN.js} +0 -0
  876. /package/dist/web/assets/{vitesse-dark-lleZmHBJ.js → vitesse-dark-CYp0WWjf.js} +0 -0
  877. /package/dist/web/assets/{vitesse-light-utUY298S.js → vitesse-light-BczSAvzE.js} +0 -0
  878. /package/dist/web/assets/{vyper-LQ1KxOUo.js → vyper-DM7bKz7E.js} +0 -0
  879. /package/dist/web/assets/{wasm-CJ9U4zWg.js → wasm-BXCHhbrz.js} +0 -0
  880. /package/dist/web/assets/{wasm-B-mpMVDM.js → wasm-CAJoqhGc.js} +0 -0
  881. /package/dist/web/assets/{wenyan-LqMyA7px.js → wenyan-NQ8fdbEq.js} +0 -0
  882. /package/dist/web/assets/{wgsl-eI4U21sm.js → wgsl-C88C7vmC.js} +0 -0
  883. /package/dist/web/assets/{wikitext-CuWC2dfS.js → wikitext-D92r7uX8.js} +0 -0
  884. /package/dist/web/assets/{wit-CCPY0MNz.js → wit-DNvTfQjW.js} +0 -0
  885. /package/dist/web/assets/{wolfram-CXhjyJun.js → wolfram-CNS5lCGj.js} +0 -0
  886. /package/dist/web/assets/{zenscript-BzHPI08Q.js → zenscript-B_rGi-H_.js} +0 -0
  887. /package/dist/web/assets/{zig-CBuhKUve.js → zig-BRi9UYQa.js} +0 -0
@@ -7,6 +7,7 @@ import { splitAttachmentMarkers } from "@/lib/attachment-marker-split";
7
7
  import type { ChatAttemptEvent } from "@/lib/chat-attempt-lifecycle";
8
8
  import { useChat } from "@/hooks/use-chat";
9
9
  import { useUsage } from "@/hooks/use-usage";
10
+ import { useDesignSessionRedirect } from "@/hooks/use-design-session-redirect";
10
11
  import { useTabStore } from "@/stores/tab-store";
11
12
  import { useSettingsStore } from "@/stores/settings-store";
12
13
  import { usePanelStore } from "@/stores/panel-store";
@@ -24,14 +25,31 @@ import { FilePicker } from "./file-picker";
24
25
  import { ChatHistoryBar } from "./chat-history-bar";
25
26
  import { NewChatProviderGate } from "./new-chat-provider-gate";
26
27
  import { useDraft, type DraftAttachment } from "@/hooks/use-draft";
28
+ import { patchTabMetadata } from "@/lib/patch-tab-metadata";
27
29
 
28
30
  import type { DragEvent } from "react";
29
31
  import type { FileNode } from "../../../types/project";
30
32
  import type { Session, SessionInfo } from "../../../types/chat";
31
33
 
34
+ /** A fork a host has taken over: the forked session, and the message to resend in it. */
35
+ export interface ChatForkRequest {
36
+ sessionId: string;
37
+ providerId: string;
38
+ pendingMessage: string;
39
+ }
40
+
32
41
  interface ChatTabProps {
33
42
  metadata?: Record<string, unknown>;
34
43
  tabId?: string;
44
+ /**
45
+ * Replaces "open a new chat tab" (`/clear`) for a host that keeps its conversation in
46
+ * place — a design tab starts the next session inside itself, where it stays in design mode.
47
+ */
48
+ onNewSession?: (clearedFrom?: string) => void;
49
+ /** Replaces "open the fork in a new tab"; the host swaps the fork into itself. */
50
+ onFork?: (fork: ChatForkRequest) => void;
51
+ /** Lists only this design's sessions in the history picker. */
52
+ historyFilter?: string;
35
53
  }
36
54
 
37
55
  /**
@@ -43,15 +61,18 @@ interface ChatTabProps {
43
61
  const SESSION_CREATE_TIMEOUT_MS = 30_000;
44
62
  const PENDING_SEND_TIMEOUT_MS = 45_000;
45
63
 
46
- export function ChatTab({ metadata, tabId }: ChatTabProps) {
64
+ export function ChatTab(props: ChatTabProps) {
65
+ const { metadata, tabId } = props;
47
66
  return tabId && metadata ? (
48
67
  <NewChatProviderGate tabId={tabId} metadata={metadata}>
49
- <ChatTabContent metadata={metadata} tabId={tabId} />
68
+ <ChatTabContent {...props} />
50
69
  </NewChatProviderGate>
51
- ) : <ChatTabContent metadata={metadata} tabId={tabId} />;
70
+ ) : <ChatTabContent {...props} />;
52
71
  }
53
72
 
54
- function ChatTabContent({ metadata, tabId }: ChatTabProps) {
73
+ function ChatTabContent({ metadata, tabId, onNewSession, onFork, historyFilter }: ChatTabProps) {
74
+ // A design chat is created with its slug and keeps the design's name as its tab title.
75
+ const designSlug = typeof metadata?.designSlug === "string" && metadata.designSlug ? metadata.designSlug : undefined;
55
76
  const [sessionId, setSessionId] = useState<string | null>(
56
77
  (metadata?.sessionId as string) ?? null,
57
78
  );
@@ -113,6 +134,7 @@ function ChatTabContent({ metadata, tabId }: ChatTabProps) {
113
134
 
114
135
  // Use tab's own project, not global activeProject (keep-alive: hidden tabs must not react to switches)
115
136
  const projectName = (metadata?.projectName as string) ?? "";
137
+ useDesignSessionRedirect({ tabId, sessionId, designSlug, projectName, providerId });
116
138
  const updateTab = useTabStore((s) => s.updateTab);
117
139
  const version = useSettingsStore((s) => s.version);
118
140
 
@@ -140,18 +162,19 @@ function ChatTabContent({ metadata, tabId }: ChatTabProps) {
140
162
  // is the only account that matters, and it is the one the server re-routes when an
141
163
  // account goes bad. Keeping the tab's copy alongside it would give the chip a second,
142
164
  // staler answer to the same question.
165
+ //
166
+ // Merged into the metadata the store holds now, never the `metadata` prop: the prop is
167
+ // whatever this component last rendered with, and spreading it back would revert keys a
168
+ // host (a design tab) or the panel store wrote in the meantime.
143
169
  useEffect(() => {
144
170
  if (!tabId || !sessionId) return;
145
- updateTab(tabId, {
146
- metadata: {
147
- ...metadata,
148
- sessionId,
149
- providerId,
150
- permissionMode,
151
- pickedAccountId: undefined,
152
- pickedAccountLabel: undefined,
153
- pickedAccountProvider: undefined,
154
- },
171
+ patchTabMetadata(tabId, {
172
+ sessionId,
173
+ providerId,
174
+ permissionMode,
175
+ pickedAccountId: undefined,
176
+ pickedAccountLabel: undefined,
177
+ pickedAccountProvider: undefined,
155
178
  });
156
179
  }, [sessionId, providerId, permissionMode]); // eslint-disable-line react-hooks/exhaustive-deps
157
180
 
@@ -163,8 +186,8 @@ function ChatTabContent({ metadata, tabId }: ChatTabProps) {
163
186
  */
164
187
  const handleProviderChange = useCallback((id: string) => {
165
188
  setProviderId(id);
166
- if (tabId) updateTab(tabId, { metadata: { ...metadata, providerId: id } });
167
- }, [tabId, metadata, updateTab]);
189
+ if (tabId) patchTabMetadata(tabId, { providerId: id });
190
+ }, [tabId]);
168
191
 
169
192
  /** The account this tab claimed while it had no session yet, and who it was claimed from. */
170
193
  const pickedAccountId = metadata?.pickedAccountId as string | undefined;
@@ -194,13 +217,10 @@ function ChatTabContent({ metadata, tabId }: ChatTabProps) {
194
217
  pickAccountForTab(providerId)
195
218
  .then((picked) => {
196
219
  if (cancelled || !picked) return;
197
- updateTab(tabId, {
198
- metadata: {
199
- ...metadata,
200
- pickedAccountId: picked.id,
201
- pickedAccountLabel: picked.label,
202
- pickedAccountProvider: providerId,
203
- },
220
+ patchTabMetadata(tabId, {
221
+ pickedAccountId: picked.id,
222
+ pickedAccountLabel: picked.label,
223
+ pickedAccountProvider: providerId,
204
224
  });
205
225
  })
206
226
  .catch(() => { /* leave the chip blank rather than naming an account we did not get */ });
@@ -241,9 +261,7 @@ function ChatTabContent({ metadata, tabId }: ChatTabProps) {
241
261
  return null;
242
262
  }
243
263
  if (!tabId) return null;
244
- updateTab(tabId, {
245
- metadata: { ...metadata, pickedAccountId: accountId, pickedAccountLabel: label, pickedAccountProvider: providerId },
246
- });
264
+ patchTabMetadata(tabId, { pickedAccountId: accountId, pickedAccountLabel: label, pickedAccountProvider: providerId });
247
265
  return null;
248
266
  }, [sessionId, projectName, tabId, metadata, providerId, updateTab, reloadUsage]); // eslint-disable-line react-hooks/exhaustive-deps
249
267
 
@@ -368,9 +386,10 @@ function ChatTabContent({ metadata, tabId }: ChatTabProps) {
368
386
  };
369
387
  }, [sessionId, tabId]);
370
388
 
371
- // Update tab title when SDK summary arrives
389
+ // Update tab title when SDK summary arrives. A design tab is named after its design, not
390
+ // after whichever of its sessions happens to be open.
372
391
  useEffect(() => {
373
- if (tabId && sessionTitle) {
392
+ if (tabId && sessionTitle && !designSlug) {
374
393
  updateTab(tabId, { title: sessionTitle });
375
394
  }
376
395
  }, [sessionTitle]); // eslint-disable-line react-hooks/exhaustive-deps
@@ -486,7 +505,7 @@ function ChatTabContent({ metadata, tabId }: ChatTabProps) {
486
505
  useEffect(() => {
487
506
  if (forkDraft && isConnected && sessionId && tabId) {
488
507
  // Clear from tab metadata once consumed
489
- updateTab(tabId, { metadata: { ...metadata, pendingMessage: undefined } });
508
+ patchTabMetadata(tabId, { pendingMessage: undefined });
490
509
  }
491
510
  }, [isConnected, sessionId]); // eslint-disable-line react-hooks/exhaustive-deps
492
511
 
@@ -503,6 +522,10 @@ function ChatTabContent({ metadata, tabId }: ChatTabProps) {
503
522
  }, [editForking]);
504
523
 
505
524
  const handleNewSession = useCallback((title?: string, clearedFrom?: string) => {
525
+ if (onNewSession) {
526
+ onNewSession(clearedFrom);
527
+ return;
528
+ }
506
529
  useTabStore.getState().openTab({
507
530
  type: "chat",
508
531
  title: title || "AI Chat",
@@ -510,7 +533,7 @@ function ChatTabContent({ metadata, tabId }: ChatTabProps) {
510
533
  projectId: projectName || null,
511
534
  closable: true,
512
535
  });
513
- }, [projectName, providerId]);
536
+ }, [projectName, providerId, onNewSession]);
514
537
 
515
538
  const handleSelectSession = useCallback((session: SessionInfo) => {
516
539
  // A message still waiting for its own session's socket must not ride the
@@ -519,10 +542,10 @@ function ChatTabContent({ metadata, tabId }: ChatTabProps) {
519
542
  abandonPendingSend("You switched to another chat before it connected.");
520
543
  setSessionId(session.id);
521
544
  setProviderId(session.providerId);
522
- if (tabId) updateTab(tabId, { title: session.title || "Chat" });
545
+ if (tabId && !designSlug) updateTab(tabId, { title: session.title || "Chat" });
523
546
  // Immediately clear notification for the selected session
524
547
  useNotificationStore.getState().clearForSession(session.id);
525
- }, [tabId, updateTab, abandonPendingSend]);
548
+ }, [tabId, updateTab, abandonPendingSend, designSlug]);
526
549
 
527
550
  /** Fork current session and open new tab with the forked session, resending userMessage */
528
551
  const handleFork = useCallback(async (userMessage: string, messageId?: string) => {
@@ -533,7 +556,12 @@ function ChatTabContent({ metadata, tabId }: ChatTabProps) {
533
556
  `${projectUrl(projectName)}/chat/sessions/${sessionId}/fork?providerId=${providerId}`,
534
557
  { messageId },
535
558
  );
536
- // Open new chat tab with forked session — it will send userMessage on connect
559
+ // A host that keeps the conversation in place takes the fork over; otherwise open a
560
+ // new chat tab with the forked session — it will send userMessage on connect.
561
+ if (onFork) {
562
+ onFork({ sessionId: forked.id, providerId, pendingMessage: userMessage });
563
+ return;
564
+ }
537
565
  useTabStore.getState().openTab({
538
566
  type: "chat",
539
567
  title: `Fork: ${userMessage.slice(0, 30)}`,
@@ -553,7 +581,7 @@ function ChatTabContent({ metadata, tabId }: ChatTabProps) {
553
581
  : msg,
554
582
  });
555
583
  }
556
- }, [sessionId, projectName, providerId]);
584
+ }, [sessionId, projectName, providerId, onFork]);
557
585
 
558
586
  /** Edit a user message: prefill input + arm same-tab fork on next send */
559
587
  const handleEdit = useCallback((userMessage: string, messageId?: string, ownMsgId?: string) => {
@@ -594,7 +622,7 @@ function ChatTabContent({ metadata, tabId }: ChatTabProps) {
594
622
  queuePendingSend({ content: fullContent, draftId: sessionId, permissionMode });
595
623
  // Swap the current tab to the forked session (no new tab).
596
624
  setStaleSwap(true);
597
- if (tabId) updateTab(tabId, { metadata: { ...metadata, sessionId: forked.id } });
625
+ if (tabId) patchTabMetadata(tabId, { sessionId: forked.id });
598
626
  setSessionId(forked.id);
599
627
  } catch (e) {
600
628
  setEditForking(false);
@@ -610,7 +638,7 @@ function ChatTabContent({ metadata, tabId }: ChatTabProps) {
610
638
  setRestore({ text: fullContent, nonce: Date.now() });
611
639
  }
612
640
  },
613
- [sessionId, projectName, providerId, permissionMode, tabId, updateTab, metadata, queuePendingSend],
641
+ [sessionId, projectName, providerId, permissionMode, tabId, queuePendingSend],
614
642
  );
615
643
 
616
644
  /** Swap THIS tab to another version's session (version switcher prev/next) */
@@ -620,10 +648,10 @@ function ChatTabContent({ metadata, tabId }: ChatTabProps) {
620
648
  // Same as handleSelectSession: a queued edit must not land in the version switched to.
621
649
  abandonPendingSend("You switched to another version before it connected.");
622
650
  setStaleSwap(true);
623
- if (tabId) updateTab(tabId, { metadata: { ...metadata, sessionId: targetSessionId } });
651
+ if (tabId) patchTabMetadata(tabId, { sessionId: targetSessionId });
624
652
  setSessionId(targetSessionId);
625
653
  },
626
- [sessionId, tabId, updateTab, metadata, abandonPendingSend],
654
+ [sessionId, tabId, abandonPendingSend],
627
655
  );
628
656
 
629
657
  /** Build message content with file references and inline text snippets prepended */
@@ -698,6 +726,9 @@ function ChatTabContent({ metadata, tabId }: ChatTabProps) {
698
726
  // The account this tab claimed on open and has been displaying since. Redeeming
699
727
  // it here is what makes that display true rather than a guess.
700
728
  accountId: pickedAccountId,
729
+ // Fixed at creation: the server gives every turn of this session the design's
730
+ // instructions and the design permission default.
731
+ ...(designSlug && { designSlug }),
701
732
  }, { signal: AbortSignal.timeout(SESSION_CREATE_TIMEOUT_MS) });
702
733
  setSessionId(session.id);
703
734
  setProviderId(session.providerId);
@@ -718,7 +749,7 @@ function ChatTabContent({ metadata, tabId }: ChatTabProps) {
718
749
  // Only now: the message is on (or queued for) a live session's socket.
719
750
  clearDraft();
720
751
  },
721
- [sessionId, providerId, projectName, sendMessage, buildMessageWithAttachments, permissionMode, metadata, pickedAccountId, queuePendingSend, restoreUnsentMessage, clearDraft],
752
+ [sessionId, providerId, projectName, sendMessage, buildMessageWithAttachments, permissionMode, metadata, pickedAccountId, queuePendingSend, restoreUnsentMessage, clearDraft, designSlug],
722
753
  );
723
754
 
724
755
  // Read through a ref so handleInputSend keeps a stable identity — it is passed to
@@ -981,6 +1012,7 @@ function ChatTabContent({ metadata, tabId }: ChatTabProps) {
981
1012
  pickedAccountId={servingAccount?.id ?? (claimMatchesProvider ? pickedAccountId ?? null : null)}
982
1013
  onSelectAccount={handleSelectAccount}
983
1014
  onSelectSession={handleSelectSession}
1015
+ historyFilter={historyFilter}
984
1016
  onBugReport={sessionId ? () => openBugReportPopup(version, { sessionId, projectName }) : undefined}
985
1017
  isConnected={isConnected}
986
1018
  onReload={() => {
@@ -1064,7 +1096,9 @@ function ChatTabContent({ metadata, tabId }: ChatTabProps) {
1064
1096
  onModeChange={setPermissionMode}
1065
1097
  providerId={providerId}
1066
1098
  sessionId={sessionId ?? undefined}
1067
- onProviderChange={!sessionId ? handleProviderChange : undefined}
1099
+ // A design chat's provider was chosen among those that carry design instructions;
1100
+ // the composer's picker offers every provider, so it is not offered here.
1101
+ onProviderChange={!sessionId && !designSlug ? handleProviderChange : undefined}
1068
1102
  model={model}
1069
1103
  onModelChange={setModel}
1070
1104
  effort={effort}
@@ -7,7 +7,7 @@ import { downscaleImage } from "@/lib/image-resize";
7
7
  import { INLINE_IMAGE_LIMITS } from "@/lib/image-resize-limits";
8
8
  import { randomId } from "@/lib/utils";
9
9
  import { ownsGlobalShortcut } from "@/lib/owns-global-shortcut";
10
- import { SEND_TO_CHAT_EVENT, SEND_TO_CHAT_ACK_EVENT, type SendToChatDetail } from "@/lib/send-to-chat";
10
+ import { SEND_TO_CHAT_EVENT, SEND_TO_CHAT_ACK_EVENT, type SendToChatAck, type SendToChatDetail } from "@/lib/send-to-chat";
11
11
  import { isImageFile } from "@/lib/file-support";
12
12
  import { AttachmentChips } from "./attachment-chips";
13
13
  import { stepHistory } from "./message-history-recall";
@@ -290,10 +290,17 @@ export const MessageInput = memo(function MessageInput({
290
290
  // may consume it, or the same output lands in every open chat at once.
291
291
  useEffect(() => {
292
292
  const handler = (e: Event) => {
293
- const { text, label, targetTabId } = ((e as CustomEvent).detail ?? {}) as SendToChatDetail;
293
+ const { text, label, targetTabId, autoSend } = ((e as CustomEvent).detail ?? {}) as SendToChatDetail;
294
294
  if (!text) return;
295
295
  if (targetTabId ? targetTabId !== tabId : !ownsGlobalShortcut(getVisibleTextarea())) return;
296
- window.dispatchEvent(new Event(SEND_TO_CHAT_ACK_EVENT));
296
+ // Sent as-is only into an idle, empty composer: anything the user has typed or
297
+ // attached is theirs, and the text joins it as a chip for them to send instead.
298
+ const send = !!autoSend && !!targetTabId && !disabled && !isStreaming && !valueRef.current.trim() && attachments.length === 0;
299
+ window.dispatchEvent(new CustomEvent<SendToChatAck>(SEND_TO_CHAT_ACK_EVENT, { detail: { sent: send } }));
300
+ if (send) {
301
+ onSend(text, []);
302
+ return;
303
+ }
297
304
  const att: ChatAttachment = {
298
305
  id: randomId(),
299
306
  name: label ?? "Terminal output",
@@ -307,7 +314,7 @@ export const MessageInput = memo(function MessageInput({
307
314
  };
308
315
  window.addEventListener(SEND_TO_CHAT_EVENT, handler);
309
316
  return () => window.removeEventListener(SEND_TO_CHAT_EVENT, handler);
310
- }, [getVisibleTextarea, tabId]);
317
+ }, [getVisibleTextarea, tabId, disabled, isStreaming, attachments.length, onSend]);
311
318
 
312
319
  // Apply initialValue when it changes (e.g. "Ask AI" from command palette).
313
320
  // A restored draft can land after the input is already on screen, so never
@@ -2,7 +2,7 @@ import { Loader2, RefreshCw, Search, Pencil, Check, X, Pin, PinOff, Trash2, Bot,
2
2
  import { SidebarHeader } from "@/components/ui/sidebar-header";
3
3
  import { cn } from "@/lib/utils";
4
4
  import { useNotificationStore, notificationTint } from "@/stores/notification-store";
5
- import { useTabStore } from "@/stores/tab-store";
5
+ import { openSessionInItsTab } from "@/lib/design/open-design-tab";
6
6
  import { formatRelativeDate } from "@/lib/format-date";
7
7
  import { TagSettingsSection } from "@/components/settings/tag-settings-section";
8
8
  import { SessionContextMenu } from "./session-context-menu";
@@ -73,7 +73,6 @@ export function SessionHistoryList({ projectName, variant, sessionId, onSelectSe
73
73
  enableKeyboardShortcuts: variant === "bar",
74
74
  });
75
75
  const notifications = useNotificationStore((s) => s.notifications);
76
- const openTab = useTabStore((s) => s.openTab);
77
76
 
78
77
  const isSidebar = variant === "sidebar";
79
78
  // Content-aware unified search is a sidebar affordance; the bar keeps its
@@ -82,13 +81,10 @@ export function SessionHistoryList({ projectName, variant, sessionId, onSelectSe
82
81
  const showSearch = isSidebar && h.searchQuery.trim().length > 0;
83
82
 
84
83
  function openResult(r: ChatSearchResult) {
85
- openTab({
86
- type: "chat",
87
- title: r.title || "Chat",
88
- projectId: projectName,
89
- metadata: { projectName, sessionId: r.sessionId, providerId: r.providerId },
90
- closable: true,
91
- });
84
+ openSessionInItsTab(
85
+ { id: r.sessionId, providerId: r.providerId, title: r.title ?? undefined, designSlug: r.designSlug },
86
+ projectName,
87
+ );
92
88
  onNavigate?.();
93
89
  }
94
90
 
@@ -0,0 +1,47 @@
1
+ /**
2
+ * How a fixed-size device frame sits in the canvas pane.
3
+ *
4
+ * The frame keeps its own CSS size — a phone design must lay out at 390px, not at the pane's
5
+ * width — and is scaled with a transform to fit. It is never scaled *up*: enlarging a 390px
6
+ * layout on a wide pane would show it bigger than any phone ever will.
7
+ */
8
+
9
+ export interface Size {
10
+ width: number;
11
+ height: number;
12
+ }
13
+
14
+ export interface FrameFit {
15
+ /** The frame's CSS size, i.e. what the design lays out against. */
16
+ width: number;
17
+ height: number;
18
+ /** The transform scale that fits it into the pane. */
19
+ scale: number;
20
+ /** The frame's footprint on screen after scaling. */
21
+ outerWidth: number;
22
+ outerHeight: number;
23
+ }
24
+
25
+ /** Room left around a scaled frame so its edge stays visible against the canvas. */
26
+ export const FRAME_PADDING = 16;
27
+ /** Below this a frame is unreadable anyway; stops a collapsed pane from producing 0 or NaN. */
28
+ export const MIN_FRAME_SCALE = 0.05;
29
+
30
+ export function fitFrame(frame: Size | null, pane: Size, padding = FRAME_PADDING): FrameFit {
31
+ const paneW = Math.max(0, finite(pane.width));
32
+ const paneH = Math.max(0, finite(pane.height));
33
+ if (!frame) {
34
+ return { width: paneW, height: paneH, scale: 1, outerWidth: paneW, outerHeight: paneH };
35
+ }
36
+ const width = Math.max(1, finite(frame.width));
37
+ const height = Math.max(1, finite(frame.height));
38
+ const availW = Math.max(0, paneW - 2 * padding);
39
+ const availH = Math.max(0, paneH - 2 * padding);
40
+ const raw = Math.min(1, availW / width, availH / height);
41
+ const scale = Math.max(MIN_FRAME_SCALE, Number.isFinite(raw) ? raw : 1);
42
+ return { width, height, scale, outerWidth: width * scale, outerHeight: height * scale };
43
+ }
44
+
45
+ function finite(n: number): number {
46
+ return Number.isFinite(n) ? n : 0;
47
+ }
@@ -0,0 +1,192 @@
1
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
2
+ import { Loader2, Minimize2, RefreshCw } from "@/lib/icons";
3
+ import { BottomSheet } from "@/components/ui/mobile-bottom-sheet";
4
+ import { cn } from "@/lib/utils";
5
+ import {
6
+ designFrameKey, loadDesignViewPrefs, saveDesignViewPrefs, withFrame,
7
+ } from "@/lib/design/design-view-prefs";
8
+ import { useDesignTab } from "../design-tab-context";
9
+ import { DesignToolbar, type DesignToolbarContext } from "../design-toolbar";
10
+ import { DesignToolbarList } from "../design-toolbar-list";
11
+ import { DesignHistoryPanel } from "../history/design-history-panel";
12
+ import { useDesignCanvas } from "./use-design-canvas";
13
+ import { defaultFrameFor, framePreset, type DeviceFrameId } from "./device-frame-presets";
14
+ import { fitFrame, type Size } from "./canvas-geometry";
15
+ import { DesignIssuesBadge } from "./design-issues-badge";
16
+ import { useDesignCommentsFeature } from "../comments/use-design-comments-feature";
17
+ import { DesignCommentsOverlay, DesignCommentsSidePanel } from "../comments/design-comments-layer";
18
+ import { useDesignTweaks } from "../tweaks/use-design-tweaks";
19
+ import { TweaksPanel } from "../tweaks/tweaks-panel";
20
+ import { useCanvasTransform } from "../transform/use-canvas-transform";
21
+ import { useDesignUndo } from "../transform/design-undo-stack";
22
+ import { TransformReadout } from "../transform/transform-readout";
23
+ import { useDesignExport } from "../export/use-design-export";
24
+ import { ExportSheet } from "../export/export-menu";
25
+ import { ExportWarningsSheet } from "../export/export-warnings-sheet";
26
+ import { useDesignCanvasCheckResponder } from "./use-design-canvas-check";
27
+ import { useDesignAutoCheck } from "../use-design-auto-check";
28
+ import { useExpandedCanvasEscape } from "./use-expanded-canvas-escape";
29
+
30
+ /**
31
+ * The live canvas: the design's entry page in a sandboxed iframe, sized to the chosen
32
+ * device frame, with the toolbar above it (desktop) or behind the More sheet (phone).
33
+ *
34
+ * `sandbox="allow-scripts"` without `allow-same-origin` gives the page an opaque origin, so
35
+ * it can read nothing of PPM's; `no-referrer` keeps its capability URL out of any request
36
+ * the page makes.
37
+ */
38
+ export function DesignCanvasPane({ moreOpen = false, onMoreClose }: { moreOpen?: boolean; onMoreClose?: () => void }) {
39
+ const tab = useDesignTab();
40
+ const canvas = useDesignCanvas(tab);
41
+ const [historyOpen, setHistoryOpen] = useState(false);
42
+ const frameKey = designFrameKey(tab.projectName, tab.slug);
43
+ const [frame, setFrameState] = useState<DeviceFrameId>(
44
+ () => loadDesignViewPrefs().frames[frameKey] ?? defaultFrameFor(tab.design.kind),
45
+ );
46
+ const setFrame = useCallback((next: DeviceFrameId) => {
47
+ setFrameState(next);
48
+ saveDesignViewPrefs(withFrame(loadDesignViewPrefs(), frameKey, next));
49
+ }, [frameKey]);
50
+
51
+ const stageRef = useRef<HTMLDivElement>(null);
52
+ const [stage, setStage] = useState<Size>({ width: 0, height: 0 });
53
+ useEffect(() => {
54
+ const el = stageRef.current;
55
+ if (!el) return;
56
+ const observer = new ResizeObserver(([entry]) => {
57
+ if (entry) setStage({ width: entry.contentRect.width, height: entry.contentRect.height });
58
+ });
59
+ observer.observe(el);
60
+ return () => observer.disconnect();
61
+ }, []);
62
+ const fit = fitFrame(framePreset(frame).size, stage);
63
+ const framed = frame !== "desktop";
64
+
65
+ // Comments, tweaks and the history share the side column, so opening one closes the others.
66
+ const closeTweaksRef = useRef<() => void>(() => {});
67
+ const comments = useDesignCommentsFeature(tab, canvas.bridge, {
68
+ onPanelOpen: () => { setHistoryOpen(false); closeTweaksRef.current(); },
69
+ });
70
+ const { closePanel: closeComments } = comments;
71
+ const tweaks = useDesignTweaks(tab, canvas.bridge, canvas.reload, {
72
+ onPanelOpen: () => { setHistoryOpen(false); closeComments(); },
73
+ });
74
+ const { closePanel: closeTweaks } = tweaks;
75
+ closeTweaksRef.current = closeTweaks;
76
+ const toggleHistory = useCallback(() => {
77
+ if (!historyOpen) { closeComments(); closeTweaks(); }
78
+ setHistoryOpen(!historyOpen);
79
+ }, [historyOpen, closeComments, closeTweaks]);
80
+
81
+ const transform = useCanvasTransform(tab, canvas.bridge, comments.picker, fit.scale, canvas.reload);
82
+ const openHistory = useCallback(() => {
83
+ closeComments();
84
+ closeTweaks();
85
+ setHistoryOpen(true);
86
+ }, [closeComments, closeTweaks]);
87
+ const undo = useDesignUndo(tab, { openHistory });
88
+ const exports = useDesignExport(tab, canvas.bridge);
89
+ // The self-check: on demand for the agent's design_check tool, and by itself after a turn.
90
+ const checkContext = () => ({ issues: canvas.issues, frame: framePreset(frame).label });
91
+ useDesignCanvasCheckResponder({ projectName: tab.projectName, slug: tab.slug, bridge: canvas.bridge, context: checkContext });
92
+ const layoutIssues = useDesignAutoCheck({ tab, bridge: canvas.bridge, context: checkContext });
93
+ const allIssues = useMemo(() => [...canvas.issues, ...layoutIssues], [canvas.issues, layoutIssues]);
94
+
95
+ const { expanded, setExpanded } = tab.layout;
96
+ useExpandedCanvasEscape(expanded, () => setExpanded(false), () => comments.picker.on);
97
+
98
+ const toolbarCtx = useMemo<DesignToolbarContext>(() => ({
99
+ ...tab, canvas, frame, setFrame, historyOpen, toggleHistory, comments, tweaks, transform, undo, exports,
100
+ }), [tab, canvas, frame, setFrame, historyOpen, toggleHistory, comments, tweaks, transform, undo, exports]);
101
+ const tweaksPanel = tweaks.panelOpen && <TweaksPanel feature={tweaks} tabId={tab.tabId} slug={tab.slug} />;
102
+
103
+ const history = historyOpen && (
104
+ <DesignHistoryPanel onClose={() => setHistoryOpen(false)} onRestored={canvas.reload} />
105
+ );
106
+
107
+ return (
108
+ // Expanding only restyles this element: `fixed` lifts it over the whole window from where
109
+ // it stands, where moving it to a portal would reload the iframe. Above the mobile nav
110
+ // (z-40), below dialogs, sheets and toasts (z-50 and up).
111
+ <div className={cn("flex h-full min-h-0 flex-col bg-background",
112
+ expanded && "fixed inset-0 z-[45] pt-[env(safe-area-inset-top)] pb-[env(safe-area-inset-bottom)]")}>
113
+ {!tab.isMobile && <DesignToolbar ctx={toolbarCtx} />}
114
+ <div className="flex min-h-0 flex-1">
115
+ {/* Focusable in Move mode, so arrow keys pressed here nudge the selected element. */}
116
+ <div ref={stageRef} className={cn("relative min-w-0 flex-1 overflow-hidden outline-none", framed && "bg-surface-elevated/40")}
117
+ tabIndex={transform.moveOn ? 0 : undefined} onKeyDown={transform.onPaneKeyDown}
118
+ aria-label={transform.moveOn ? "Canvas: arrow keys move the selected element" : undefined}>
119
+ {canvas.src && (
120
+ <div
121
+ className={cn("absolute left-1/2 top-1/2 origin-center", framed && "rounded-md shadow-lg ring-1 ring-border")}
122
+ style={{
123
+ width: fit.width, height: fit.height,
124
+ transform: `translate(-50%, -50%) scale(${fit.scale})`,
125
+ }}
126
+ >
127
+ <iframe
128
+ ref={canvas.iframeRef}
129
+ src={canvas.src}
130
+ title={`Design canvas: ${tab.design.title}`}
131
+ sandbox="allow-scripts"
132
+ referrerPolicy="no-referrer"
133
+ onLoad={canvas.bridge.frameLoaded}
134
+ className="block size-full border-0 bg-white [[data-design-resizing]_&]:pointer-events-none"
135
+ />
136
+ </div>
137
+ )}
138
+ {!canvas.src && !canvas.error && (
139
+ <div className="absolute inset-0 flex items-center justify-center text-sm text-text-subtle">
140
+ <Loader2 className="mr-2 size-4 animate-spin" /> Opening canvas…
141
+ </div>
142
+ )}
143
+ {(canvas.dead || canvas.error) && (
144
+ <div className="absolute inset-x-0 top-0 flex items-center justify-center p-2">
145
+ <div className="flex items-center gap-2 rounded-md border border-border bg-popover px-3 py-2 text-xs shadow-md" role="alert">
146
+ {canvas.error ?? "The canvas stopped responding."}
147
+ <button type="button" onClick={canvas.reload}
148
+ className="flex min-h-11 items-center gap-1 px-2 text-primary underline md:min-h-7">
149
+ <RefreshCw className="size-3.5" /> Reload
150
+ </button>
151
+ </div>
152
+ </div>
153
+ )}
154
+ <DesignIssuesBadge issues={allIssues} className="absolute right-2 top-2" />
155
+ {expanded && (
156
+ <button type="button" onClick={() => setExpanded(false)}
157
+ className="absolute left-2 top-2 z-30 flex min-h-8 items-center gap-1.5 rounded-md border border-border bg-popover px-2.5 text-xs font-medium shadow-md hover:bg-surface-elevated pointer-coarse:min-h-11 pointer-coarse:px-3">
158
+ <Minimize2 className="size-3.5" /> Exit full view
159
+ </button>
160
+ )}
161
+ {canvas.src && (
162
+ <DesignCommentsOverlay feature={comments} fit={fit} stage={stage} isMobile={tab.isMobile} selectionHint={transform.hint} />
163
+ )}
164
+ {canvas.src && <TransformReadout feature={transform} isMobile={tab.isMobile} />}
165
+ </div>
166
+ {!tab.isMobile && history && <div className="w-72 shrink-0 border-l border-border">{history}</div>}
167
+ {!tab.isMobile && comments.panelOpen && (
168
+ <div className="w-72 shrink-0 border-l border-border"><DesignCommentsSidePanel feature={comments} /></div>
169
+ )}
170
+ {!tab.isMobile && tweaksPanel && <div className="w-72 shrink-0 border-l border-border">{tweaksPanel}</div>}
171
+ </div>
172
+ {/* Docked under the canvas rather than in a sheet: a sheet's backdrop would dim the very
173
+ colours being tweaked, and the canvas has to stay in view while a slider moves. */}
174
+ {tab.isMobile && tweaksPanel && <div className="h-[45%] shrink-0 border-t border-border">{tweaksPanel}</div>}
175
+ <ExportWarningsSheet feature={exports} />
176
+ {tab.isMobile && (
177
+ <>
178
+ <ExportSheet feature={exports} />
179
+ <BottomSheet open={moreOpen} onClose={() => onMoreClose?.()}>
180
+ <DesignToolbarList ctx={toolbarCtx} onDone={() => onMoreClose?.()} />
181
+ </BottomSheet>
182
+ <BottomSheet open={historyOpen} onClose={() => setHistoryOpen(false)} className="flex h-[70vh] flex-col">
183
+ <div className="min-h-0 flex-1">{history}</div>
184
+ </BottomSheet>
185
+ <BottomSheet open={comments.panelOpen} onClose={closeComments} className="flex h-[70vh] flex-col">
186
+ <div className="min-h-0 flex-1"><DesignCommentsSidePanel feature={comments} /></div>
187
+ </BottomSheet>
188
+ </>
189
+ )}
190
+ </div>
191
+ );
192
+ }