@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
@@ -0,0 +1,71 @@
1
+ import { useState } from "react";
2
+ import { AlertTriangle, X } from "@/lib/icons";
3
+ import { cn } from "@/lib/utils";
4
+
5
+ /**
6
+ * What went wrong in the design document on screen: script errors, failed loads, CSP
7
+ * blocks, links the canvas refused to follow, and layout problems the self-check found
8
+ * after the last turn. Everything here was reported by the page, so it is untrusted and
9
+ * rendered as plain text only.
10
+ */
11
+
12
+ export type CanvasIssue =
13
+ | { kind: "error" | "rejection" | "resource" | "csp"; message: string; source?: string; line?: number }
14
+ | { kind: "navigate-blocked"; message: string; source: string }
15
+ /** Found by the canvas self-check after a turn; `source` names the element. */
16
+ | { kind: "layout"; message: string; source?: string };
17
+
18
+ const KIND_LABEL: Record<CanvasIssue["kind"], string> = {
19
+ error: "Error",
20
+ rejection: "Unhandled rejection",
21
+ resource: "Failed to load",
22
+ csp: "Blocked by policy",
23
+ "navigate-blocked": "Link blocked",
24
+ layout: "Layout",
25
+ };
26
+
27
+ /** Kept per document load; the bridge itself stops at 20, and so does this list. */
28
+ export const MAX_CANVAS_ISSUES = 20;
29
+
30
+ export function DesignIssuesBadge({ issues, className }: { issues: CanvasIssue[]; className?: string }) {
31
+ const [open, setOpen] = useState(false);
32
+ if (issues.length === 0) return null;
33
+ return (
34
+ <div className={cn("pointer-events-auto", className)}>
35
+ <button
36
+ type="button"
37
+ onClick={() => setOpen((v) => !v)}
38
+ aria-expanded={open}
39
+ aria-label={`${issues.length} canvas ${issues.length === 1 ? "issue" : "issues"}`}
40
+ className="flex min-h-11 items-center gap-1.5 rounded-full border border-warning/40 bg-panel px-3 text-xs font-medium text-warning shadow-md md:min-h-8"
41
+ >
42
+ <AlertTriangle className="size-4" />
43
+ {issues.length}
44
+ </button>
45
+ {open && (
46
+ <div className="absolute right-0 top-full z-10 mt-1 w-[min(22rem,calc(100vw-2rem))] rounded-lg border border-border bg-popover text-popover-foreground shadow-lg">
47
+ <div className="flex items-center justify-between border-b border-border px-3 py-1.5">
48
+ <span className="text-xs font-semibold">Canvas issues</span>
49
+ <button type="button" onClick={() => setOpen(false)} aria-label="Close"
50
+ className="flex size-11 items-center justify-center rounded-md text-text-subtle hover:bg-surface-elevated md:size-7">
51
+ <X className="size-4" />
52
+ </button>
53
+ </div>
54
+ <ul className="max-h-72 overflow-y-auto p-2 text-xs">
55
+ {issues.map((issue, i) => (
56
+ <li key={i} className="border-b border-border/50 py-1.5 last:border-0">
57
+ <span className="font-medium text-warning">{KIND_LABEL[issue.kind]}</span>{" "}
58
+ <span className="break-words">{issue.message}</span>
59
+ {issue.source && (
60
+ <span className="block truncate text-text-subtle" title={issue.source}>
61
+ {issue.source}{"line" in issue && issue.line ? `:${issue.line}` : ""}
62
+ </span>
63
+ )}
64
+ </li>
65
+ ))}
66
+ </ul>
67
+ </div>
68
+ )}
69
+ </div>
70
+ );
71
+ }
@@ -0,0 +1,37 @@
1
+ import type { DesignKind } from "../../../../shared/design-types";
2
+
3
+ /**
4
+ * The sizes a design can be previewed at. `desktop` is the canvas itself (whatever room
5
+ * the pane has); every other frame is a fixed CSS size that is scaled down to fit, so a
6
+ * phone layout is laid out at 390px even on a narrow pane.
7
+ */
8
+ export const DEVICE_FRAME_IDS = ["desktop", "tablet", "phone", "slide"] as const;
9
+ export type DeviceFrameId = (typeof DEVICE_FRAME_IDS)[number];
10
+
11
+ export interface DeviceFramePreset {
12
+ id: DeviceFrameId;
13
+ label: string;
14
+ /** CSS pixels, or null for "fill the pane". */
15
+ size: { width: number; height: number } | null;
16
+ }
17
+
18
+ export const DEVICE_FRAMES: readonly DeviceFramePreset[] = [
19
+ { id: "desktop", label: "Desktop", size: null },
20
+ { id: "tablet", label: "Tablet", size: { width: 820, height: 1180 } },
21
+ { id: "phone", label: "Phone", size: { width: 390, height: 844 } },
22
+ // The deck format the design instructions ask for, so a slide fills its frame exactly.
23
+ { id: "slide", label: "Slide", size: { width: 1280, height: 720 } },
24
+ ];
25
+
26
+ export function isDeviceFrameId(value: unknown): value is DeviceFrameId {
27
+ return typeof value === "string" && (DEVICE_FRAME_IDS as readonly string[]).includes(value);
28
+ }
29
+
30
+ export function framePreset(id: DeviceFrameId): DeviceFramePreset {
31
+ return DEVICE_FRAMES.find((f) => f.id === id) ?? DEVICE_FRAMES[0]!;
32
+ }
33
+
34
+ /** A deck opens on its slide frame; everything else on the plain canvas. */
35
+ export function defaultFrameFor(kind: DesignKind | undefined): DeviceFrameId {
36
+ return kind === "slides" ? "slide" : "desktop";
37
+ }
@@ -0,0 +1,169 @@
1
+ import { useCallback, useEffect, useMemo, useRef, useState, type RefObject } from "react";
2
+ import {
3
+ parentEnvelope, parseChildMessage, parseParentMessage,
4
+ type ChildMessage, type ChildMessageType, type ParentMessage,
5
+ } from "../../../../shared/design-bridge-protocol";
6
+
7
+ /**
8
+ * The parent side of the design bridge: which frame messages are believed, how to talk
9
+ * back, and what to redo every time the frame starts over.
10
+ *
11
+ * A message from the frame is accepted only when it comes from the iframe's current
12
+ * `contentWindow` AND carries the nonce minted for the current load. The source check alone
13
+ * is not enough: a frame that navigated itself to a foreign page is still the same
14
+ * `contentWindow`, but that page never saw the nonce — parent → frame messages never carry
15
+ * one (see `design-bridge-protocol.ts`), and none goes out at all while the frame looks dead
16
+ * (loaded but not yet proven itself with `ready`), which is the only window such a page could
17
+ * otherwise use to snoop one off the wire and echo it back to forge its own `ready`. A stale
18
+ * nonce (a message from the document before a reload) is dropped the same way.
19
+ *
20
+ * Every `ready` is a brand-new document — a live reload, a token rotation, or the tab pool
21
+ * moving the tab to another panel (which reloads any iframe it reparents). Features register
22
+ * a replay callback to restore their state (scroll, modes, pins) on each one.
23
+ */
24
+
25
+ export type ReadyMessage = Extract<ChildMessage, { type: "ready" }>;
26
+ type Handler<T extends ChildMessageType> = (message: Extract<ChildMessage, { type: T }>) => void;
27
+ export type BridgeSend = (message: ParentMessage) => boolean;
28
+
29
+ export interface BridgeExpectation {
30
+ contentWindow: unknown;
31
+ nonce: string | null;
32
+ }
33
+
34
+ /** The accept rule, pure so it can be tested without a frame: source, shape, then nonce. */
35
+ export function acceptBridgeEvent(event: { source: unknown; data: unknown }, expected: BridgeExpectation): ChildMessage | null {
36
+ if (!expected.contentWindow || event.source !== expected.contentWindow) return null;
37
+ const message = parseChildMessage(event.data);
38
+ if (!message) return null;
39
+ if (!expected.nonce || message.nonce !== expected.nonce) return null;
40
+ return message;
41
+ }
42
+
43
+ /** 16 random bytes as base64url: 22 characters, inside the protocol's nonce shape. */
44
+ export function newBridgeNonce(): string {
45
+ const bytes = new Uint8Array(16);
46
+ crypto.getRandomValues(bytes);
47
+ let bin = "";
48
+ for (const b of bytes) bin += String.fromCharCode(b);
49
+ return btoa(bin).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
50
+ }
51
+
52
+ /** How long a document may take to say `ready` after its `load` before the canvas is dead. */
53
+ export const BRIDGE_LIVENESS_MS = 3000;
54
+
55
+ /**
56
+ * Whether the frame is showing a document that never said `ready`.
57
+ *
58
+ * Counted rather than flagged, because the two events race: `ready` is posted at
59
+ * DOMContentLoaded and usually lands *before* the iframe's `load`, but a slow parent can see
60
+ * them the other way round. Every genuine document produces one of each; a page the frame
61
+ * navigated to on its own (or an error page) produces a `load` and nothing else.
62
+ */
63
+ export function frameLooksDead(loads: number, readies: number): boolean {
64
+ return loads > readies;
65
+ }
66
+
67
+ export interface DesignBridge {
68
+ send: BridgeSend;
69
+ on<T extends ChildMessageType>(type: T, handler: Handler<T>): () => void;
70
+ /** Runs on every `ready`, after the frame reports it; returns the unregister function. */
71
+ onReplay(replay: (send: BridgeSend, ready: ReadyMessage) => void): () => void;
72
+ /** The last `ready` of the current load, or null while the frame is (re)loading. */
73
+ ready: ReadyMessage | null;
74
+ /** Call from the iframe's `load` event: starts the liveness clock for this document. */
75
+ frameLoaded(): void;
76
+ }
77
+
78
+ export function useDesignBridge(
79
+ iframeRef: RefObject<HTMLIFrameElement | null>,
80
+ nonce: string | null,
81
+ onDead: () => void,
82
+ ): DesignBridge {
83
+ const [ready, setReady] = useState<ReadyMessage | null>(null);
84
+ const nonceRef = useRef(nonce);
85
+ const handlers = useRef(new Map<string, Set<(m: ChildMessage) => void>>());
86
+ const replays = useRef(new Set<(send: BridgeSend, ready: ReadyMessage) => void>());
87
+ const livenessTimer = useRef<ReturnType<typeof setTimeout> | null>(null);
88
+ const counts = useRef({ loads: 0, readies: 0 });
89
+ const onDeadRef = useRef(onDead);
90
+ onDeadRef.current = onDead;
91
+
92
+ const clearLiveness = useCallback(() => {
93
+ if (livenessTimer.current) clearTimeout(livenessTimer.current);
94
+ livenessTimer.current = null;
95
+ }, []);
96
+
97
+ // A new nonce means a new load is on its way: nothing from the old document counts now.
98
+ // Its liveness clock goes too, or it would judge the new document by the old one's load.
99
+ useEffect(() => {
100
+ nonceRef.current = nonce;
101
+ counts.current = { loads: 0, readies: 0 };
102
+ clearLiveness();
103
+ setReady(null);
104
+ }, [nonce, clearLiveness]);
105
+
106
+ const send = useCallback<BridgeSend>((message) => {
107
+ const win = iframeRef.current?.contentWindow;
108
+ if (!win || !nonceRef.current) return false;
109
+ // A load that fired `load` without a `ready` yet might already be showing a page the
110
+ // frame navigated itself to. Nothing goes out until the real document proves itself, or
111
+ // there would be a window where a parent message reaches that foreign page instead.
112
+ if (frameLooksDead(counts.current.loads, counts.current.readies)) return false;
113
+ const envelope = parentEnvelope(message);
114
+ // Validated before it leaves, so a feature cannot post a shape the bridge would reject.
115
+ if (!parseParentMessage(envelope)) return false;
116
+ // "*": the frame's origin is opaque, and nothing sensitive ever goes this way.
117
+ win.postMessage(envelope, "*");
118
+ return true;
119
+ }, [iframeRef]);
120
+
121
+ useEffect(() => {
122
+ const onMessage = (event: MessageEvent) => {
123
+ const message = acceptBridgeEvent(event, {
124
+ contentWindow: iframeRef.current?.contentWindow ?? null, nonce: nonceRef.current,
125
+ });
126
+ if (!message) return;
127
+ if (message.type === "ready") {
128
+ counts.current.readies++;
129
+ if (!frameLooksDead(counts.current.loads, counts.current.readies)) clearLiveness();
130
+ setReady(message);
131
+ for (const replay of replays.current) {
132
+ try { replay(send, message); } catch (e) { console.warn("[design] replay failed:", e); }
133
+ }
134
+ }
135
+ for (const handler of handlers.current.get(message.type) ?? []) {
136
+ try { handler(message); } catch (e) { console.warn(`[design] ${message.type} handler failed:`, e); }
137
+ }
138
+ };
139
+ window.addEventListener("message", onMessage);
140
+ return () => window.removeEventListener("message", onMessage);
141
+ }, [iframeRef, send, clearLiveness]);
142
+
143
+ useEffect(() => clearLiveness, [clearLiveness]);
144
+
145
+ const frameLoaded = useCallback(() => {
146
+ counts.current.loads++;
147
+ if (!frameLooksDead(counts.current.loads, counts.current.readies)) return;
148
+ clearLiveness();
149
+ livenessTimer.current = setTimeout(() => {
150
+ livenessTimer.current = null;
151
+ if (frameLooksDead(counts.current.loads, counts.current.readies)) onDeadRef.current();
152
+ }, BRIDGE_LIVENESS_MS);
153
+ }, [clearLiveness]);
154
+
155
+ const on = useCallback(<T extends ChildMessageType>(type: T, handler: Handler<T>) => {
156
+ const set = handlers.current.get(type) ?? new Set();
157
+ const wrapped = handler as (m: ChildMessage) => void;
158
+ set.add(wrapped);
159
+ handlers.current.set(type, set);
160
+ return () => { set.delete(wrapped); };
161
+ }, []);
162
+
163
+ const onReplay = useCallback((replay: (send: BridgeSend, ready: ReadyMessage) => void) => {
164
+ replays.current.add(replay);
165
+ return () => { replays.current.delete(replay); };
166
+ }, []);
167
+
168
+ return useMemo(() => ({ send, on, onReplay, ready, frameLoaded }), [send, on, onReplay, ready, frameLoaded]);
169
+ }
@@ -0,0 +1,110 @@
1
+ import { useEffect, useRef } from "react";
2
+ import { api, projectUrl } from "@/lib/api-client";
3
+ import {
4
+ CHECK_REQUEST_ID_RE, withRuntimeIssues, type CanvasCheckReport, type LayoutCheckReport,
5
+ } from "../../../../shared/design-canvas-check";
6
+ import { newBridgeNonce, type DesignBridge, type ReadyMessage } from "./use-design-bridge";
7
+ import type { CanvasIssue } from "./design-issues-badge";
8
+
9
+ /**
10
+ * Running the canvas self-check from the parent, and answering the server when an agent's
11
+ * `design_check` tool asks for one.
12
+ *
13
+ * The frame measures itself (`check-run` → `check-result`); the parent adds what only it
14
+ * knows — the runtime issues it collected for this load and the device frame on screen. The
15
+ * screenshot library is fetched only when a screenshot is wanted, as its own lazy chunk,
16
+ * and handed to the frame as source because the frame can load nothing from PPM's origin.
17
+ */
18
+
19
+ const CHECK_TIMEOUT_MS = 15_000;
20
+ /** How long a canvas that is (re)loading gets to say `ready` before a request gives up. */
21
+ const READY_WAIT_MS = 8_000;
22
+
23
+ let libSource: Promise<string> | null = null;
24
+ function screenshotLib(): Promise<string> {
25
+ libSource ??= import("modern-screenshot/dist/index.js?raw").then((m) => m.default).catch((e: unknown) => {
26
+ libSource = null;
27
+ throw e;
28
+ });
29
+ return libSource;
30
+ }
31
+
32
+ export interface CanvasCheckContext {
33
+ issues: readonly CanvasIssue[];
34
+ /** The device frame's label, e.g. "Desktop". */
35
+ frame: string;
36
+ }
37
+
38
+ /**
39
+ * The frame's current `ready`, or its next one if it is (re)loading; null if none comes in
40
+ * time. `bridge` may be a render old, so a load that completes meanwhile is taken from the
41
+ * event rather than from `bridge.ready`.
42
+ */
43
+ function whenReady(bridge: DesignBridge): Promise<ReadyMessage | null> {
44
+ if (bridge.ready) return Promise.resolve(bridge.ready);
45
+ return new Promise((resolve) => {
46
+ const timer = setTimeout(() => { off(); resolve(null); }, READY_WAIT_MS);
47
+ const off = bridge.on("ready", (m) => { clearTimeout(timer); off(); resolve(m); });
48
+ });
49
+ }
50
+
51
+ export async function runCanvasCheck(
52
+ bridge: DesignBridge,
53
+ ctx: CanvasCheckContext,
54
+ opts: { screenshot: boolean },
55
+ ): Promise<CanvasCheckReport> {
56
+ const lib = opts.screenshot ? await screenshotLib().catch(() => undefined) : undefined;
57
+ const ready = await whenReady(bridge);
58
+ if (!ready) throw new Error("The canvas is still loading");
59
+ const report = await new Promise<LayoutCheckReport>((resolve, reject) => {
60
+ const requestId = newBridgeNonce();
61
+ const cleanup = (): void => { offResult(); offError(); clearTimeout(timer); };
62
+ const offResult = bridge.on("check-result", (m) => { if (m.requestId === requestId) { cleanup(); resolve(m.report); } });
63
+ const offError = bridge.on("check-error", (m) => { if (m.requestId === requestId) { cleanup(); reject(new Error(m.message)); } });
64
+ const timer = setTimeout(() => { cleanup(); reject(new Error("The canvas did not answer in time")); }, CHECK_TIMEOUT_MS);
65
+ if (!bridge.send({ type: "check-run", requestId, screenshot: opts.screenshot, ...(lib ? { lib } : {}) })) {
66
+ cleanup();
67
+ reject(new Error("The canvas is not accepting messages"));
68
+ }
69
+ });
70
+ const runtime = ctx.issues.filter((i) => i.kind !== "navigate-blocked" && i.kind !== "layout");
71
+ const withIssues = withRuntimeIssues(report, runtime);
72
+ const note = opts.screenshot && !lib ? "The screenshot library could not be loaded." : withIssues.screenshotNote;
73
+ return { ...withIssues, ...(note ? { screenshotNote: note } : {}), file: ready.file, gen: ready.gen, frame: ctx.frame };
74
+ }
75
+
76
+ /**
77
+ * Answers `design:check_request` for this design: the server asks every browser showing it,
78
+ * and the first report posted back settles the agent's tool call. A tab that cannot check
79
+ * (still loading, frame dead) stays silent rather than answer with an error, so another
80
+ * device that can still wins.
81
+ */
82
+ export function useDesignCanvasCheckResponder(opts: {
83
+ projectName: string;
84
+ slug: string;
85
+ bridge: DesignBridge;
86
+ context: () => CanvasCheckContext;
87
+ }): void {
88
+ const ref = useRef(opts);
89
+ ref.current = opts;
90
+ const { projectName, slug } = opts;
91
+
92
+ useEffect(() => {
93
+ const onRequest = (e: Event) => {
94
+ const d = (e as CustomEvent<{ projectName?: unknown; slug?: unknown; requestId?: unknown; screenshot?: unknown }>).detail;
95
+ if (!d || d.projectName !== projectName || d.slug !== slug) return;
96
+ if (typeof d.requestId !== "string" || !CHECK_REQUEST_ID_RE.test(d.requestId)) return;
97
+ const requestId = d.requestId;
98
+ const { bridge, context } = ref.current;
99
+ runCanvasCheck(bridge, context(), { screenshot: d.screenshot === true })
100
+ .then((report) => api.post(`${projectUrl(projectName)}/designs/${encodeURIComponent(slug)}/check/${requestId}`, report))
101
+ .catch((err: unknown) => {
102
+ // A 404 means another client answered first; anything else is worth a line.
103
+ const message = (err as Error)?.message ?? String(err);
104
+ if (!/pending check/i.test(message)) console.warn(`[design] canvas check for ${slug} not sent: ${message}`);
105
+ });
106
+ };
107
+ window.addEventListener("design:check_request", onRequest);
108
+ return () => window.removeEventListener("design:check_request", onRequest);
109
+ }, [projectName, slug]);
110
+ }
@@ -0,0 +1,107 @@
1
+ import { useCallback, useEffect, useRef, useState } from "react";
2
+ import { useDesignPreviewUrl } from "./use-design-preview-url";
3
+ import { newBridgeNonce, useDesignBridge } from "./use-design-bridge";
4
+ import { useDesignLiveReload } from "./use-design-live-reload";
5
+ import { MAX_CANVAS_ISSUES, type CanvasIssue } from "./design-issues-badge";
6
+ import type { DesignTabContextValue } from "../design-tab-context";
7
+
8
+ /**
9
+ * Everything that keeps the canvas iframe showing the right document.
10
+ *
11
+ * Each load gets a fresh nonce on its URL (`?n=`), and reloading means setting a new `src` —
12
+ * the frame's origin is opaque, so `location.reload()` is not available to the parent. The
13
+ * frame is recovered at most once per healthy document: an `expired` message or a load that
14
+ * never says `ready` re-mints the token and reloads; if that fails too the canvas says so
15
+ * instead of reloading forever.
16
+ *
17
+ * `expired` is only trusted before this load's `ready` arrives: the real expired stand-in
18
+ * (`expired-page.ts`) never sends one, but the actual design document could — its own script
19
+ * can read `?n=` off its URL — so a document that already proved itself must not be able to
20
+ * keep claiming its token died and loop the canvas through remints, each of which evicts
21
+ * another open canvas's token from the shared store.
22
+ */
23
+
24
+ /** Whether an `expired` message for the current load should trigger a remint-and-reload. */
25
+ export function acceptsExpired(readyForCurrentLoad: boolean): boolean {
26
+ return !readyForCurrentLoad;
27
+ }
28
+
29
+ export function useDesignCanvas(ctx: DesignTabContextValue) {
30
+ const { projectName, slug, design, isActive, refreshDesign } = ctx;
31
+ const iframeRef = useRef<HTMLIFrameElement | null>(null);
32
+ const preview = useDesignPreviewUrl(projectName, slug);
33
+ const [load, setLoad] = useState<{ url: string; nonce: string } | null>(null);
34
+ const [dead, setDead] = useState(false);
35
+ const [issues, setIssues] = useState<CanvasIssue[]>([]);
36
+ const recovering = useRef(false);
37
+ const lastScroll = useRef<{ x: number; y: number } | null>(null);
38
+
39
+ const reload = useCallback(async (opts?: { remint?: boolean }) => {
40
+ const url = opts?.remint ? await preview.remint() : preview.latestUrl();
41
+ if (!url) { setDead(true); return; }
42
+ setIssues([]);
43
+ setLoad({ url, nonce: newBridgeNonce() });
44
+ }, [preview]);
45
+
46
+ const recover = useCallback(() => {
47
+ if (recovering.current) { setDead(true); return; }
48
+ recovering.current = true;
49
+ void reload({ remint: true });
50
+ }, [reload]);
51
+
52
+ const bridge = useDesignBridge(iframeRef, load?.nonce ?? null, recover);
53
+ // Read inside the "expired" handler below instead of `bridge.ready` directly: that handler
54
+ // is registered in an effect that does not re-run on every render, so it would otherwise
55
+ // see whichever load was current the last time the effect ran.
56
+ const readyForLoad = useRef(false);
57
+ readyForLoad.current = bridge.ready !== null;
58
+
59
+ // First URL: load it.
60
+ useEffect(() => {
61
+ if (preview.initialUrl) setLoad({ url: preview.initialUrl, nonce: newBridgeNonce() });
62
+ }, [preview.initialUrl]);
63
+
64
+ // A manifest that names another entry page needs a URL for that page.
65
+ const entry = useRef(design.entry);
66
+ useEffect(() => {
67
+ if (entry.current === design.entry) return;
68
+ entry.current = design.entry;
69
+ void reload({ remint: true });
70
+ }, [design.entry, reload]);
71
+
72
+ useEffect(() => {
73
+ const offs = [
74
+ bridge.on("ready", () => { recovering.current = false; setDead(false); }),
75
+ bridge.on("expired", () => { if (acceptsExpired(readyForLoad.current)) recover(); }),
76
+ bridge.on("scroll", (m) => { lastScroll.current = { x: m.x, y: m.y }; }),
77
+ bridge.on("issue", (m) => setIssues((list) => list.length >= MAX_CANVAS_ISSUES ? list
78
+ : [...list, { kind: m.kind, message: m.message, source: m.source, line: m.line }])),
79
+ bridge.on("navigate-blocked", (m) => setIssues((list) => list.length >= MAX_CANVAS_ISSUES ? list
80
+ : [...list, { kind: "navigate-blocked", message: "The canvas does not follow links out of the design.", source: m.href }])),
81
+ // Every new document starts at the top; put the reader back where they were.
82
+ bridge.onReplay((send) => {
83
+ const at = lastScroll.current;
84
+ if (at && (at.x || at.y)) send({ type: "restore-scroll", x: at.x, y: at.y });
85
+ }),
86
+ ];
87
+ return () => { for (const off of offs) off(); };
88
+ }, [bridge.on, bridge.onReplay, recover]); // eslint-disable-line react-hooks/exhaustive-deps
89
+
90
+ const readyGen = useRef<string | null>(null);
91
+ readyGen.current = bridge.ready?.gen ?? null;
92
+ useDesignLiveReload({
93
+ projectName, slug, isActive,
94
+ reload: (opts) => { void reload(opts); },
95
+ onManifestChanged: refreshDesign,
96
+ currentUrl: () => load?.url ?? null,
97
+ readyGen: () => readyGen.current,
98
+ });
99
+
100
+ const src = load ? `${load.url}?n=${encodeURIComponent(load.nonce)}` : null;
101
+ return {
102
+ iframeRef, src, bridge, issues, dead, error: preview.error,
103
+ reload: () => { recovering.current = false; setDead(false); void reload(); },
104
+ };
105
+ }
106
+
107
+ export type DesignCanvasState = ReturnType<typeof useDesignCanvas>;
@@ -0,0 +1,86 @@
1
+ import { useEffect, useRef } from "react";
2
+ import { classifyDesignChange } from "@/lib/design/design-change-filter";
3
+
4
+ /**
5
+ * Keep the canvas in step with the design's files.
6
+ *
7
+ * While the design's project is the active one, the file watcher reports every change and
8
+ * a burst of them (an agent writing three files) becomes one reload 300 ms after the last.
9
+ * The watcher follows the active project only, though, so a canvas that was hidden — another
10
+ * project, another tab, a backgrounded browser — asks the server when it comes back: a HEAD
11
+ * on its preview URL answers with the page's current `X-PPM-Gen`, and a gen other than the
12
+ * one the frame last reported means it is showing an old version.
13
+ */
14
+
15
+ export const LIVE_RELOAD_DEBOUNCE_MS = 300;
16
+
17
+ export interface LiveReloadOptions {
18
+ projectName: string;
19
+ slug: string;
20
+ /** True while the design tab is the visible tab of its panel. */
21
+ isActive: boolean;
22
+ reload: (opts?: { remint?: boolean }) => void;
23
+ onManifestChanged: () => void;
24
+ /** The URL the frame is showing now (for the gen check), or null while none is loaded. */
25
+ currentUrl: () => string | null;
26
+ /** The gen the frame last reported in `ready`, or null while none has. */
27
+ readyGen: () => string | null;
28
+ }
29
+
30
+ export function useDesignLiveReload(opts: LiveReloadOptions): void {
31
+ const optsRef = useRef(opts);
32
+ optsRef.current = opts;
33
+ const { projectName, slug, isActive } = opts;
34
+
35
+ useEffect(() => {
36
+ let timer: ReturnType<typeof setTimeout> | null = null;
37
+ const onChange = (e: Event) => {
38
+ const detail = (e as CustomEvent<{ projectName?: string; path?: string }>).detail;
39
+ if (!detail || detail.projectName !== projectName || typeof detail.path !== "string") return;
40
+ const change = classifyDesignChange(detail.path, slug);
41
+ if (change === "manifest") optsRef.current.onManifestChanged();
42
+ if (change !== "reload") return;
43
+ if (timer) clearTimeout(timer);
44
+ timer = setTimeout(() => {
45
+ timer = null;
46
+ optsRef.current.reload();
47
+ }, LIVE_RELOAD_DEBOUNCE_MS);
48
+ };
49
+ window.addEventListener("file:changed", onChange);
50
+ return () => {
51
+ window.removeEventListener("file:changed", onChange);
52
+ if (timer) clearTimeout(timer);
53
+ };
54
+ }, [projectName, slug]);
55
+
56
+ const wasActive = useRef(isActive);
57
+ useEffect(() => {
58
+ let cancelled = false;
59
+ const check = async () => {
60
+ const { currentUrl, readyGen, reload } = optsRef.current;
61
+ const url = currentUrl();
62
+ const gen = readyGen();
63
+ if (!url || !gen) return;
64
+ try {
65
+ const res = await fetch(url, { method: "HEAD", cache: "no-store", referrerPolicy: "no-referrer" });
66
+ if (cancelled) return;
67
+ if (res.status === 404) { reload({ remint: true }); return; }
68
+ const current = res.headers.get("X-PPM-Gen");
69
+ if (res.ok && current && current !== gen) reload();
70
+ } catch (e) {
71
+ // Offline or a server restart in progress: the frame's own liveness check covers it.
72
+ console.warn(`[design] gen check for ${slug} failed: ${(e as Error).message}`);
73
+ }
74
+ };
75
+ if (isActive && !wasActive.current) void check();
76
+ wasActive.current = isActive;
77
+ const onVisibility = () => {
78
+ if (document.visibilityState === "visible" && optsRef.current.isActive) void check();
79
+ };
80
+ document.addEventListener("visibilitychange", onVisibility);
81
+ return () => {
82
+ cancelled = true;
83
+ document.removeEventListener("visibilitychange", onVisibility);
84
+ };
85
+ }, [isActive, slug]);
86
+ }
@@ -0,0 +1,74 @@
1
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
2
+ import { requestCanvasPreview } from "@/lib/design/api-designs";
3
+
4
+ /**
5
+ * The canvas's capability URL for one design.
6
+ *
7
+ * Minted once when the canvas mounts, then refreshed through the authenticated API every
8
+ * 10 minutes while it stays mounted — the iframe's own requests never extend a token. A
9
+ * refresh may rotate the token; the successor is kept for the *next* load and the document
10
+ * on screen is never reloaded for it (its old token stays valid until its own expiry).
11
+ *
12
+ * `remint` gets a fresh token outright: the recovery path when the frame reports its token
13
+ * expired, or stopped answering.
14
+ */
15
+
16
+ export const PREVIEW_REFRESH_MS = 10 * 60 * 1000;
17
+
18
+ export interface DesignPreviewUrl {
19
+ /** The URL the next load should use (the newest token), or null before the first mint. */
20
+ latestUrl: () => string | null;
21
+ /** Set once the first mint finished; a change asks the canvas to load it. */
22
+ initialUrl: string | null;
23
+ error: string | null;
24
+ remint: () => Promise<string | null>;
25
+ }
26
+
27
+ export function useDesignPreviewUrl(projectName: string, slug: string): DesignPreviewUrl {
28
+ const [initialUrl, setInitialUrl] = useState<string | null>(null);
29
+ const [error, setError] = useState<string | null>(null);
30
+ const latest = useRef<{ url: string; token: string } | null>(null);
31
+ const alive = useRef(true);
32
+
33
+ const remint = useCallback(async (): Promise<string | null> => {
34
+ try {
35
+ const cap = await requestCanvasPreview(projectName, slug);
36
+ if (!alive.current) return null;
37
+ latest.current = { url: cap.url, token: cap.token };
38
+ setError(null);
39
+ return cap.url;
40
+ } catch (e) {
41
+ if (alive.current) setError((e as Error).message || "Could not open the preview");
42
+ return null;
43
+ }
44
+ }, [projectName, slug]);
45
+
46
+ useEffect(() => {
47
+ alive.current = true;
48
+ latest.current = null;
49
+ setInitialUrl(null);
50
+ void remint().then((url) => { if (url) setInitialUrl(url); });
51
+ return () => { alive.current = false; };
52
+ }, [remint]);
53
+
54
+ useEffect(() => {
55
+ const timer = setInterval(() => {
56
+ const current = latest.current;
57
+ if (!current) return;
58
+ requestCanvasPreview(projectName, slug, current.token)
59
+ .then((cap) => {
60
+ // Only the token for the next load changes; the frame on screen keeps its own.
61
+ if (alive.current && cap.rotated) latest.current = { url: cap.url, token: cap.token };
62
+ })
63
+ .catch((e) => {
64
+ // An expired token cannot be refreshed; the frame posts `expired` on its next
65
+ // load and the canvas re-mints then. Anything else is worth a line in the console.
66
+ console.warn(`[design] preview refresh for ${slug} failed: ${(e as Error).message}`);
67
+ });
68
+ }, PREVIEW_REFRESH_MS);
69
+ return () => clearInterval(timer);
70
+ }, [projectName, slug]);
71
+
72
+ const latestUrl = useCallback(() => latest.current?.url ?? null, []);
73
+ return useMemo(() => ({ latestUrl, initialUrl, error, remint }), [latestUrl, initialUrl, error, remint]);
74
+ }