@jxsuite/studio 6.1.1 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (785) hide show
  1. package/README.md +5 -5
  2. package/dist/chunks/2020-5wtzce5g.js +4 -0
  3. package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
  4. package/dist/chunks/adapter-5tphg7xe.js +4 -0
  5. package/dist/chunks/add-new-flow-psym14sn.js +4 -0
  6. package/dist/chunks/cf-account-picker-haqazq5r.js +4 -0
  7. package/dist/chunks/cf-settings-h2wrh6hq.js +4 -0
  8. package/dist/chunks/color-area-6rbra5dy.js +4 -0
  9. package/dist/chunks/color-field-gy56c94g.js +4 -0
  10. package/dist/chunks/color-m7r1vk54.js +4 -0
  11. package/dist/chunks/color-slider-sqqdyf6c.js +4 -0
  12. package/dist/chunks/combobox-72h32ejk.js +4 -0
  13. package/dist/chunks/components-r22xca09.js +4 -0
  14. package/dist/chunks/content-source-mmppmcyg.js +4 -0
  15. package/dist/chunks/convert-to-repeater-he70fc2b.js +4 -0
  16. package/dist/chunks/dialog-c4x05vyx.js +4 -0
  17. package/dist/chunks/editor-ccd9jwsa.js +4 -0
  18. package/dist/chunks/entry-commands-6qxz9e8p.js +4 -0
  19. package/dist/chunks/extension-sections-0egb88dm.js +4 -0
  20. package/dist/chunks/file-ops-qnab36ek.js +4 -0
  21. package/dist/chunks/files-rcn56qvm.js +4 -0
  22. package/dist/chunks/format-host-yxz0kjjs.js +4 -0
  23. package/dist/chunks/fs-events-d1qxq4z4.js +4 -0
  24. package/dist/chunks/grid-open-4z1g062t.js +4 -0
  25. package/dist/chunks/grid-view-qg1b5eqx.js +51 -0
  26. package/dist/chunks/icons-63bjtbs7.js +4 -0
  27. package/dist/chunks/iframe-entry-2zggzajv.js +5 -0
  28. package/dist/chunks/iframe-entry-76j8vwwx.js +5 -0
  29. package/dist/chunks/iframe-entry-99nr5zfb.js +5 -0
  30. package/dist/chunks/iframe-entry-pkgmcgp0.js +5 -0
  31. package/dist/chunks/iframe-host-ssv7kyj0.js +4 -0
  32. package/dist/chunks/{index-2veqmnhr.js → index-32eqzv1k.js} +3 -3
  33. package/dist/chunks/index-f0jn7nnp.js +4 -0
  34. package/dist/chunks/{javascript-8nbvs12s.js → javascript-pjp734q4.js} +3 -3
  35. package/dist/chunks/jsonMode-njkvsa02.js +13 -0
  36. package/dist/chunks/jx-validate-ttasrbh7.js +4 -0
  37. package/dist/chunks/layers-bgyr11tr.js +4 -0
  38. package/dist/chunks/layers-panel-7ez66zeq.js +4 -0
  39. package/dist/chunks/listbox-c421cf8c.js +4 -0
  40. package/dist/chunks/lit-html-v9gh687x.js +4 -0
  41. package/dist/chunks/media-library-sq468wts.js +4 -0
  42. package/dist/chunks/media-picker-shfe59pt.js +4 -0
  43. package/dist/chunks/menu-bdpzbfvs.js +4 -0
  44. package/dist/chunks/monaco-binding-vq1hgnn0.js +4 -0
  45. package/dist/chunks/monaco-buffer-3afgwvbp.js +4 -0
  46. package/dist/chunks/monaco-setup-xrd2cbkp.js +4 -0
  47. package/dist/chunks/notify-kzrjr3fv.js +4 -0
  48. package/dist/chunks/number-field-y62xq0ty.js +4 -0
  49. package/dist/chunks/parse-v77xtwv7.js +4 -0
  50. package/dist/chunks/platform-7v4rtd7m.js +4 -0
  51. package/dist/chunks/popover-b89sfej7.js +4 -0
  52. package/dist/chunks/publish-panel-2z9gw8ee.js +4 -0
  53. package/dist/chunks/publish-quick-qx2455cj.js +4 -0
  54. package/dist/chunks/publish-workspace-wrc1dgwx.js +4 -0
  55. package/dist/chunks/quick-search-n0t0eqxb.js +4 -0
  56. package/dist/chunks/references-9547rg5s.js +4 -0
  57. package/dist/chunks/right-panel-wsgnr9pn.js +4 -0
  58. package/dist/chunks/select-rzds841e.js +4 -0
  59. package/dist/chunks/source-control-kwktr9y6.js +4 -0
  60. package/dist/chunks/split-c9zfdgxf.js +4 -0
  61. package/dist/chunks/studio-03ct6yfv.js +9 -0
  62. package/dist/chunks/studio-07rcfje3.js +5 -0
  63. package/dist/chunks/studio-3e54qh39.js +7 -0
  64. package/dist/chunks/studio-3exxhz5g.js +5 -0
  65. package/dist/chunks/studio-3q40e3rj.js +5 -0
  66. package/dist/chunks/studio-3qeh9t0h.js +6 -0
  67. package/dist/chunks/studio-3qqjeep5.js +6 -0
  68. package/dist/chunks/studio-43sd2mam.js +4 -0
  69. package/dist/chunks/studio-4hp8pkyt.js +5 -0
  70. package/dist/chunks/studio-58xg6j2q.js +9 -0
  71. package/dist/chunks/studio-5g0rprdt.js +7 -0
  72. package/dist/chunks/studio-6m380wp7.js +5 -0
  73. package/dist/chunks/studio-80jyh1xh.js +4 -0
  74. package/dist/chunks/studio-83mk4bgg.js +9 -0
  75. package/dist/chunks/{studio-kggey1jt.js → studio-881z1xrx.js} +4 -4
  76. package/dist/chunks/studio-8m0y2qe7.js +5 -0
  77. package/dist/chunks/studio-8tr6cfrc.js +5 -0
  78. package/dist/chunks/studio-8vcvfs7r.js +6 -0
  79. package/dist/chunks/studio-9tmebf0s.js +5 -0
  80. package/dist/chunks/studio-a2bvaptz.js +5 -0
  81. package/dist/chunks/studio-b7y5mr30.js +5 -0
  82. package/dist/chunks/studio-bavb31r0.js +5 -0
  83. package/dist/chunks/studio-bbe4c90a.js +5 -0
  84. package/dist/chunks/studio-c05wdnt3.js +5 -0
  85. package/dist/chunks/studio-ccv2svc6.js +5 -0
  86. package/dist/chunks/studio-d5grtb9e.js +16 -0
  87. package/dist/chunks/studio-df0baea9.js +5 -0
  88. package/dist/chunks/studio-dgk4dqtx.js +7 -0
  89. package/dist/chunks/studio-e1g64q43.js +5 -0
  90. package/dist/chunks/studio-ed1hp6zf.js +6 -0
  91. package/dist/chunks/studio-ed3xx40h.js +7 -0
  92. package/dist/chunks/studio-f14e1zdj.js +5 -0
  93. package/dist/chunks/studio-fbhxxc5f.js +5 -0
  94. package/dist/chunks/studio-fyh0jc96.js +5 -0
  95. package/dist/chunks/studio-gcxk20n7.js +5 -0
  96. package/dist/chunks/studio-jaaz8ce9.js +5 -0
  97. package/dist/chunks/{studio-8grwxtqk.js → studio-jcnsdaep.js} +4 -4
  98. package/dist/chunks/studio-jsgf2q5k.js +7 -0
  99. package/dist/chunks/{studio-1q1sh2ax.js → studio-k3xxbagr.js} +3 -3
  100. package/dist/chunks/studio-k7evxqh4.js +5 -0
  101. package/dist/chunks/studio-kt3pjkwd.js +5 -0
  102. package/dist/chunks/studio-m8g16bgz.js +5 -0
  103. package/dist/chunks/studio-mn0476ag.js +5 -0
  104. package/dist/chunks/studio-mx1smyq0.js +5 -0
  105. package/dist/chunks/studio-n0c5h6mf.js +5 -0
  106. package/dist/chunks/{studio-rv11kfwa.js → studio-nh6d342n.js} +7 -7
  107. package/dist/chunks/studio-nqxqf8p2.js +4 -0
  108. package/dist/chunks/studio-p4nrkvqr.js +5 -0
  109. package/dist/chunks/{studio-h46vtzk8.js → studio-pbxa5fpc.js} +4 -4
  110. package/dist/chunks/studio-pgmvdv7z.js +7 -0
  111. package/dist/chunks/studio-ph84avkf.js +5 -0
  112. package/dist/chunks/{studio-wszjyh0j.js → studio-q0mvbaq6.js} +4 -4
  113. package/dist/chunks/studio-q0tccd43.js +5 -0
  114. package/dist/chunks/studio-q7rtx6zq.js +14 -0
  115. package/dist/chunks/{studio-pre0skq6.js → studio-qgh13jtz.js} +4 -4
  116. package/dist/chunks/studio-qmn1xc24.js +5 -0
  117. package/dist/chunks/studio-qwdqwkj0.js +5 -0
  118. package/dist/chunks/{studio-t6b6qe31.js → studio-r5qy30vx.js} +4 -4
  119. package/dist/chunks/studio-rj9eamf8.js +5 -0
  120. package/dist/chunks/studio-rptgsk96.js +5 -0
  121. package/dist/chunks/studio-rthyg42z.js +928 -0
  122. package/dist/chunks/studio-s19tp1xr.js +5 -0
  123. package/dist/chunks/studio-s32578pn.js +5 -0
  124. package/dist/chunks/studio-svb7yyve.js +5 -0
  125. package/dist/chunks/studio-syreb644.js +5 -0
  126. package/dist/chunks/studio-tf9jryb1.js +10 -0
  127. package/dist/chunks/studio-tfkznv39.js +5 -0
  128. package/dist/chunks/studio-tft6r105.js +5 -0
  129. package/dist/chunks/studio-txf2kysx.js +5 -0
  130. package/dist/chunks/studio-v8867ddv.js +12 -0
  131. package/dist/chunks/studio-vxq7fcvv.js +5 -0
  132. package/dist/chunks/studio-w4rz9hdk.js +5 -0
  133. package/dist/chunks/studio-wbcjbhy1.js +9 -0
  134. package/dist/chunks/studio-wc649wss.js +5 -0
  135. package/dist/chunks/studio-wys23mxz.js +5 -0
  136. package/dist/chunks/studio-x1x167jh.js +5 -0
  137. package/dist/chunks/studio-x9hsze61.js +5 -0
  138. package/dist/chunks/studio-y0n7yxea.js +9 -0
  139. package/dist/chunks/studio-y3ahhdpx.js +5 -0
  140. package/dist/chunks/studio-z97c48fk.js +5 -0
  141. package/dist/chunks/studio-zat62m0c.js +5 -0
  142. package/dist/chunks/studio-zcd2e7yz.js +5 -0
  143. package/dist/chunks/studio-zz9qe3rw.js +64 -0
  144. package/dist/chunks/swatch-group-ewh24n1f.js +4 -0
  145. package/dist/chunks/tabs-f5cw3tgp.js +4 -0
  146. package/dist/chunks/textfield-wewc8rq2.js +4 -0
  147. package/dist/chunks/toast-1gv0h53h.js +4 -0
  148. package/dist/chunks/toast-host-1yg5ar8d.js +4 -0
  149. package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
  150. package/dist/chunks/tooltip-yypz28gq.js +4 -0
  151. package/dist/chunks/tree-9xa4hm7n.js +4 -0
  152. package/dist/chunks/tsMode-epyfz1hv.js +14 -0
  153. package/dist/chunks/workspace-dz7nxfhv.js +4 -0
  154. package/dist/chunks/workspace-home-xsd7hkjw.js +4 -0
  155. package/dist/chunks/ws-client-bv552sfx.js +4 -0
  156. package/dist/iframe-entry.js +20 -16
  157. package/dist/manifest.json +77 -63
  158. package/dist/studio.js +106 -107
  159. package/dist/workers/ts.worker.js +3 -3
  160. package/package.json +17 -16
  161. package/src/about/about-modal.ts +4 -3
  162. package/src/account/action-flow.ts +45 -38
  163. package/src/account-status.ts +7 -2
  164. package/src/browse/component-examples.ts +272 -0
  165. package/src/browse/library-commands.ts +64 -104
  166. package/src/browse/library-layouts.ts +270 -53
  167. package/src/browse/library-model.ts +194 -134
  168. package/src/browse/library-pane.ts +748 -440
  169. package/src/browse/library-preview.ts +161 -26
  170. package/src/browse/library-source.ts +308 -41
  171. package/src/browse/preview-root.ts +78 -0
  172. package/src/browse/preview-style.ts +155 -0
  173. package/src/canvas/asset-refs.ts +40 -10
  174. package/src/canvas/asset-resolve.ts +19 -23
  175. package/src/canvas/canvas-helpers.ts +7 -6
  176. package/src/canvas/canvas-live-render.ts +260 -77
  177. package/src/canvas/canvas-origin.ts +37 -12
  178. package/src/canvas/canvas-page-context.ts +112 -0
  179. package/src/canvas/canvas-patcher.ts +30 -30
  180. package/src/canvas/canvas-perf.ts +11 -5
  181. package/src/canvas/canvas-render.ts +175 -148
  182. package/src/canvas/canvas-surface.ts +5 -3
  183. package/src/canvas/canvas-utils.ts +147 -61
  184. package/src/canvas/dialog-path.ts +9 -4
  185. package/src/canvas/dialog-state.ts +1 -2
  186. package/src/canvas/diff-marks.ts +9 -16
  187. package/src/canvas/diff-toolbar.ts +8 -7
  188. package/src/canvas/edit-width-drag.ts +4 -1
  189. package/src/canvas/edit-width.ts +1 -3
  190. package/src/canvas/iframe-channel.ts +27 -13
  191. package/src/canvas/iframe-drop.ts +120 -12
  192. package/src/canvas/iframe-editable-root.ts +29 -16
  193. package/src/canvas/iframe-entry.ts +104 -75
  194. package/src/canvas/iframe-eval.ts +73 -49
  195. package/src/canvas/iframe-host.ts +269 -158
  196. package/src/canvas/iframe-inline-edit.ts +49 -30
  197. package/src/canvas/iframe-insert.ts +5 -4
  198. package/src/canvas/iframe-interaction.ts +30 -25
  199. package/src/canvas/iframe-keys.ts +11 -0
  200. package/src/canvas/iframe-overlay.ts +1 -1
  201. package/src/canvas/iframe-patch.ts +25 -21
  202. package/src/canvas/iframe-position.ts +12 -6
  203. package/src/canvas/iframe-protocol.ts +36 -21
  204. package/src/canvas/iframe-render.ts +84 -35
  205. package/src/canvas/iframe-slash.ts +24 -11
  206. package/src/canvas/iframe-subtree.ts +10 -3
  207. package/src/canvas/npm-modules.ts +22 -0
  208. package/src/canvas/path-mapping.ts +19 -12
  209. package/src/canvas/popover-path.ts +7 -3
  210. package/src/canvas/popover-state.ts +1 -2
  211. package/src/canvas/preview-navigate.ts +16 -0
  212. package/src/canvas/repeater-sources.ts +200 -0
  213. package/src/canvas/serialize-scope.ts +13 -5
  214. package/src/canvas/stage-scrollbar.ts +7 -2
  215. package/src/canvas/surface-registry.ts +27 -3
  216. package/src/collab/collab-commands.ts +7 -2
  217. package/src/collab/collab-session.ts +84 -45
  218. package/src/collab/collab-state.ts +4 -3
  219. package/src/collab/monaco-binding.ts +16 -13
  220. package/src/collab/monaco-cursors.ts +5 -2
  221. package/src/commands/app-commands.ts +16 -6
  222. package/src/commands/budget.ts +13 -11
  223. package/src/commands/command-args.ts +103 -71
  224. package/src/commands/context.ts +55 -28
  225. package/src/commands/defaults.ts +69 -45
  226. package/src/commands/keymap.ts +56 -43
  227. package/src/commands/levels.ts +14 -8
  228. package/src/commands/live-context.ts +9 -7
  229. package/src/commands/reference.ts +2 -1
  230. package/src/commands/registry.ts +22 -11
  231. package/src/commands/run-reported.ts +15 -10
  232. package/src/component-props.ts +46 -30
  233. package/src/content/collection-match.ts +11 -9
  234. package/src/content/collection-pages.ts +412 -0
  235. package/src/content/content-collections.ts +270 -0
  236. package/src/content/draft-state.ts +4 -3
  237. package/src/content/entry-commands.ts +54 -62
  238. package/src/content/entry-editor.ts +137 -32
  239. package/src/content/entry-fields.ts +25 -8
  240. package/src/content/entry-inspector.ts +225 -0
  241. package/src/content/entry-model.ts +38 -15
  242. package/src/content/entry-open.ts +80 -0
  243. package/src/content/entry-summaries.ts +440 -0
  244. package/src/content/file-record-ids.ts +80 -0
  245. package/src/content/file-records.ts +125 -0
  246. package/src/content/page-summaries.ts +129 -0
  247. package/src/content/record-entry.ts +201 -0
  248. package/src/content/writing-banner.ts +177 -0
  249. package/src/create/add-new-commands.ts +185 -0
  250. package/src/create/add-new-flow.ts +1116 -0
  251. package/src/create/add-new.ts +1014 -0
  252. package/src/create/element-name.ts +121 -0
  253. package/src/editor/canvas-context-menu.ts +1 -2
  254. package/src/editor/canvas-slash-bridge.ts +3 -6
  255. package/src/editor/content-slice.ts +16 -14
  256. package/src/editor/context-menu.ts +35 -22
  257. package/src/editor/convert-targets.ts +30 -35
  258. package/src/editor/convert-to-component.ts +78 -48
  259. package/src/editor/convert-to-repeater.ts +34 -22
  260. package/src/editor/editable-tags.ts +17 -2
  261. package/src/editor/file-drop-action.ts +29 -22
  262. package/src/editor/inline-edit-apply.ts +79 -17
  263. package/src/editor/inline-edit.ts +76 -50
  264. package/src/editor/inline-format.ts +59 -56
  265. package/src/editor/inline-link.ts +40 -15
  266. package/src/editor/insert-component.ts +91 -0
  267. package/src/editor/insert-zone-action.ts +14 -5
  268. package/src/editor/merge-tags.ts +58 -19
  269. package/src/editor/repeater-scope.ts +39 -28
  270. package/src/editor/shortcuts.ts +76 -42
  271. package/src/editor/slash-menu.ts +52 -14
  272. package/src/files/asset-versions.ts +4 -4
  273. package/src/files/components.ts +89 -20
  274. package/src/files/elements.ts +5 -6
  275. package/src/files/file-ops.ts +92 -41
  276. package/src/files/files.ts +248 -239
  277. package/src/files/fs-events.ts +18 -7
  278. package/src/files/media-meta.ts +97 -2
  279. package/src/files/media-paths.ts +3 -0
  280. package/src/files/media-types.ts +55 -0
  281. package/src/files/media-upload.ts +209 -52
  282. package/src/files/new-file-name.ts +156 -0
  283. package/src/files/serialize-document.ts +15 -5
  284. package/src/format/constraints.ts +1 -1
  285. package/src/format/convert-file.ts +27 -13
  286. package/src/format/format-choices.ts +2 -1
  287. package/src/format/format-host.ts +91 -50
  288. package/src/github/github-auth-status.ts +27 -3
  289. package/src/github/github-auth.ts +21 -11
  290. package/src/github/github-publish.ts +28 -23
  291. package/src/grid/cell-editors.ts +46 -31
  292. package/src/grid/cell-popovers.ts +5 -3
  293. package/src/grid/edit-buffer.ts +10 -9
  294. package/src/grid/grid-controller.ts +25 -23
  295. package/src/grid/grid-layout.ts +21 -5
  296. package/src/grid/grid-open.ts +3 -33
  297. package/src/grid/grid-panel.ts +65 -6
  298. package/src/grid/grid-reveal.ts +34 -0
  299. package/src/grid/grid-source.ts +9 -31
  300. package/src/grid/grid-view.ts +45 -23
  301. package/src/grid/redirects-grid.ts +14 -5
  302. package/src/grid/redirects.ts +16 -14
  303. package/src/grid/schema-columns.ts +25 -19
  304. package/src/grid/sources/connector-source.ts +47 -20
  305. package/src/grid/sources/content-source.ts +100 -31
  306. package/src/grid/sources/csv-file-source.ts +2 -2
  307. package/src/grid/tabulator-tables.d.ts +61 -34
  308. package/src/hosting/document.ts +2 -2
  309. package/src/hosting/stage.ts +7 -7
  310. package/src/i18n/i18n-commands.ts +3 -3
  311. package/src/media/media-commands.ts +181 -0
  312. package/src/media/media-library-model.ts +232 -0
  313. package/src/media/media-library.ts +1283 -0
  314. package/src/media/media-pane.ts +51 -20
  315. package/src/new-project/add-repo-modal.ts +20 -19
  316. package/src/new-project/import-tab.ts +10 -14
  317. package/src/new-project/location-fields.ts +2 -1
  318. package/src/new-project/new-project-modal.ts +12 -9
  319. package/src/packages/jxsuite-update.ts +4 -3
  320. package/src/packages/pull-package-sync.ts +26 -25
  321. package/src/page-params.ts +97 -68
  322. package/src/panels/activity-panel.ts +38 -14
  323. package/src/panels/ai-chat/attached-context.ts +13 -7
  324. package/src/panels/ai-chat/chat-markdown.ts +8 -8
  325. package/src/panels/ai-chat/chat-view.ts +80 -73
  326. package/src/panels/ai-chat/composer.ts +30 -33
  327. package/src/panels/ai-chat/sessions-view.ts +1 -2
  328. package/src/panels/ai-panel.ts +23 -20
  329. package/src/panels/block-action-bar.ts +57 -46
  330. package/src/panels/bottom-dock.ts +5 -3
  331. package/src/panels/canvas-dnd-bridge.ts +36 -26
  332. package/src/panels/chat-panel.ts +6 -6
  333. package/src/panels/collections-panel.ts +306 -0
  334. package/src/panels/component-preview.ts +35 -13
  335. package/src/panels/data-explorer.ts +63 -26
  336. package/src/panels/data-grid.ts +18 -11
  337. package/src/panels/dnd.ts +115 -138
  338. package/src/panels/editors.ts +52 -21
  339. package/src/panels/elements-panel.ts +19 -5
  340. package/src/panels/empty-state.ts +2 -2
  341. package/src/panels/events-panel.ts +84 -69
  342. package/src/panels/formula-workspace.ts +78 -54
  343. package/src/panels/frontmatter-fields.ts +33 -28
  344. package/src/panels/git-diff-open.ts +10 -6
  345. package/src/panels/head-panel.ts +488 -202
  346. package/src/panels/i18n-panel.ts +20 -12
  347. package/src/panels/imports-panel.ts +25 -47
  348. package/src/panels/jump-bar.ts +75 -31
  349. package/src/panels/layers-panel.ts +130 -101
  350. package/src/panels/left-panel.ts +25 -11
  351. package/src/panels/navigator-panels.ts +23 -11
  352. package/src/panels/pane-context.ts +140 -49
  353. package/src/panels/pane-grid.ts +55 -26
  354. package/src/panels/panel-registry.ts +36 -46
  355. package/src/panels/properties-panel.ts +182 -124
  356. package/src/panels/quick-search.ts +53 -31
  357. package/src/panels/right-panel.ts +201 -45
  358. package/src/panels/seo-modal.ts +54 -125
  359. package/src/panels/settings-menu.ts +63 -61
  360. package/src/panels/settings-pane.ts +268 -162
  361. package/src/panels/signals-panel.ts +156 -135
  362. package/src/panels/site-model.ts +367 -0
  363. package/src/panels/site-panel.ts +638 -0
  364. package/src/panels/statement-editor.ts +230 -140
  365. package/src/panels/style-panel.ts +253 -206
  366. package/src/panels/style-utils.ts +114 -51
  367. package/src/panels/stylebook-doc.ts +195 -60
  368. package/src/panels/stylebook-layers-panel.ts +48 -89
  369. package/src/panels/stylebook-panel.ts +60 -27
  370. package/src/panels/styles-panel.ts +327 -0
  371. package/src/panels/tab-drop.ts +27 -11
  372. package/src/panels/tab-strip.ts +143 -49
  373. package/src/platform-errors.ts +57 -43
  374. package/src/platform.ts +59 -31
  375. package/src/platforms/cloud.ts +373 -176
  376. package/src/platforms/default-platform.ts +14 -8
  377. package/src/platforms/devserver.ts +180 -142
  378. package/src/platforms/read-batcher.ts +16 -8
  379. package/src/project-list.ts +2 -1
  380. package/src/publish/deploy-checklist.ts +20 -9
  381. package/src/publish/pages-service.ts +66 -27
  382. package/src/publish/publish-changes.ts +491 -0
  383. package/src/publish/publish-commands.ts +88 -22
  384. package/src/publish/publish-ids.ts +49 -0
  385. package/src/publish/publish-panel.ts +10 -6
  386. package/src/publish/publish-quick.ts +148 -0
  387. package/src/publish/publish-workspace.ts +926 -0
  388. package/src/publish/source-control.ts +907 -0
  389. package/src/recent-projects.ts +15 -8
  390. package/src/resize-edges.ts +26 -36
  391. package/src/services/a11y-report.ts +26 -19
  392. package/src/services/agent-seed.ts +23 -11
  393. package/src/services/ai-ask.ts +9 -12
  394. package/src/services/ai-command-tools.ts +68 -62
  395. package/src/services/ai-import-tools.ts +80 -67
  396. package/src/services/ai-models.ts +17 -13
  397. package/src/services/ai-project-tools.ts +68 -32
  398. package/src/services/ai-session-store.ts +19 -10
  399. package/src/services/ai-system-prompt.ts +46 -20
  400. package/src/services/ai-tools.ts +71 -27
  401. package/src/services/ai-write-report.ts +20 -12
  402. package/src/services/ai-writes.ts +4 -4
  403. package/src/services/automation.ts +74 -51
  404. package/src/services/cem-export.ts +149 -58
  405. package/src/services/cf-settings.ts +4 -4
  406. package/src/services/clock.ts +6 -1
  407. package/src/services/code-services.ts +37 -31
  408. package/src/services/connection.ts +2 -2
  409. package/src/services/context-manager.ts +14 -10
  410. package/src/services/context-resolver.ts +20 -8
  411. package/src/services/data-service.ts +19 -15
  412. package/src/services/directory-picker.ts +20 -14
  413. package/src/services/document-assistant.ts +39 -19
  414. package/src/services/gated-registry.ts +10 -6
  415. package/src/services/harness/chat-reducer.ts +23 -1
  416. package/src/services/import-client.ts +91 -38
  417. package/src/services/import-seed.ts +8 -2
  418. package/src/services/jx-validate.ts +28 -31
  419. package/src/services/live-preview.ts +0 -0
  420. package/src/services/live-surfaces.ts +6 -3
  421. package/src/services/model-uri.ts +10 -2
  422. package/src/services/module-preloads.ts +12 -8
  423. package/src/services/monaco-buffer.ts +43 -24
  424. package/src/services/monaco-lazy.ts +7 -8
  425. package/src/services/monaco-setup.ts +23 -16
  426. package/src/services/notify.ts +44 -17
  427. package/src/services/popover-report.ts +25 -10
  428. package/src/services/preview-eval.ts +20 -8
  429. package/src/services/profile.ts +13 -6
  430. package/src/services/project-path.ts +13 -10
  431. package/src/services/references.ts +0 -0
  432. package/src/services/render-critic.ts +29 -9
  433. package/src/services/settings/definitions.ts +25 -14
  434. package/src/services/settings/kernel.ts +13 -4
  435. package/src/services/settings/write-queue.ts +9 -9
  436. package/src/services/token-lint.ts +12 -10
  437. package/src/services/tool-executor.ts +17 -5
  438. package/src/services/tool-outcomes.ts +44 -24
  439. package/src/services/trusted-types.ts +24 -7
  440. package/src/settings/contexts-section.ts +11 -8
  441. package/src/settings/contributed-section.ts +128 -70
  442. package/src/settings/css-vars-editor.ts +119 -32
  443. package/src/settings/defs-editor.ts +38 -35
  444. package/src/settings/developer-panels.ts +43 -0
  445. package/src/settings/extension-rows.ts +16 -8
  446. package/src/settings/extension-sections.ts +42 -14
  447. package/src/settings/extensions-section.ts +4 -1
  448. package/src/settings/general-settings.ts +101 -28
  449. package/src/settings/locales-section.ts +20 -12
  450. package/src/settings/preferences-dialog.ts +17 -7
  451. package/src/settings/preferences-keymap.ts +7 -5
  452. package/src/settings/preferences-sections.ts +11 -5
  453. package/src/settings/project-sections.ts +28 -11
  454. package/src/settings/schema-field-ui.ts +12 -1
  455. package/src/settings/section-registry.ts +116 -11
  456. package/src/settings/settings-dialog.ts +192 -0
  457. package/src/settings/settings-document.ts +186 -166
  458. package/src/shell/tree.ts +6 -5
  459. package/src/shell.ts +536 -477
  460. package/src/site-context.ts +101 -32
  461. package/src/state.ts +68 -57
  462. package/src/store.ts +54 -34
  463. package/src/studio.ts +219 -116
  464. package/src/style/live-preview.ts +1 -1
  465. package/src/style/project-styles.ts +40 -7
  466. package/src/style/stylebook-specimens.ts +89 -0
  467. package/src/style/stylebook-target.ts +26 -0
  468. package/src/style/tag-inheritance.ts +105 -0
  469. package/src/style/token-ref.ts +5 -4
  470. package/src/style/variables-focus.ts +61 -0
  471. package/src/style/variables-view.ts +235 -0
  472. package/src/surfaces/about.ts +18 -19
  473. package/src/surfaces/add-new.json +1482 -0
  474. package/src/surfaces/add-new.ts +325 -0
  475. package/src/surfaces/add-repo.ts +17 -19
  476. package/src/surfaces/ai-chat.ts +33 -38
  477. package/src/surfaces/ai-credentials-form.ts +6 -16
  478. package/src/surfaces/ai-managed-connect.ts +3 -4
  479. package/src/surfaces/ai-model-picker.ts +3 -5
  480. package/src/surfaces/block-action-bar.ts +22 -11
  481. package/src/surfaces/boot-failure.json +4 -3
  482. package/src/surfaces/boot-failure.ts +4 -5
  483. package/src/surfaces/bottom-dock.json +1 -1
  484. package/src/surfaces/bottom-dock.ts +9 -18
  485. package/src/surfaces/canvas-stage.json +30 -19
  486. package/src/surfaces/canvas-stage.ts +17 -16
  487. package/src/surfaces/cf-account-picker.ts +17 -18
  488. package/src/surfaces/collections-panel.json +615 -0
  489. package/src/surfaces/collections-panel.ts +168 -0
  490. package/src/surfaces/commandbar.json +241 -96
  491. package/src/surfaces/commandbar.ts +145 -105
  492. package/src/surfaces/convert-repeater.ts +17 -19
  493. package/src/surfaces/data-actions.ts +9 -7
  494. package/src/surfaces/dialog.ts +26 -28
  495. package/src/surfaces/diff-toolbar.ts +9 -7
  496. package/src/surfaces/empty-state.json +1 -1
  497. package/src/surfaces/empty-state.ts +7 -10
  498. package/src/surfaces/entry-editor.json +136 -0
  499. package/src/surfaces/entry-editor.ts +35 -11
  500. package/src/surfaces/entry-inspector.json +371 -0
  501. package/src/surfaces/entry-inspector.ts +143 -0
  502. package/src/surfaces/expression-editor.ts +11 -25
  503. package/src/surfaces/files-panel.ts +27 -14
  504. package/src/surfaces/formula-palette.ts +4 -5
  505. package/src/surfaces/github-auth.ts +16 -20
  506. package/src/surfaces/github-publish.ts +17 -22
  507. package/src/surfaces/grid-cell.ts +30 -31
  508. package/src/surfaces/grid-open.ts +10 -14
  509. package/src/surfaces/grid-panel.ts +13 -9
  510. package/src/surfaces/grid-replace.ts +13 -13
  511. package/src/surfaces/grid-views.ts +15 -18
  512. package/src/surfaces/inspector-dock.json +162 -14
  513. package/src/surfaces/inspector-dock.ts +59 -31
  514. package/src/surfaces/jump-bar.ts +5 -6
  515. package/src/surfaces/jxsuite-update.ts +16 -22
  516. package/src/surfaces/library-pane.json +670 -437
  517. package/src/surfaces/library-pane.ts +111 -77
  518. package/src/surfaces/logic-panel.ts +17 -30
  519. package/src/surfaces/logic-workspace.ts +13 -15
  520. package/src/surfaces/media-browser.json +62 -6
  521. package/src/surfaces/media-browser.ts +26 -11
  522. package/src/surfaces/media-field.json +1 -1
  523. package/src/surfaces/media-field.ts +4 -5
  524. package/src/surfaces/media-library.json +1586 -0
  525. package/src/surfaces/media-library.ts +282 -0
  526. package/src/surfaces/media-pane.ts +8 -7
  527. package/src/surfaces/media-pick-dialog.json +71 -0
  528. package/src/surfaces/media-pick-dialog.ts +132 -0
  529. package/src/surfaces/menu.ts +47 -23
  530. package/src/surfaces/navigator-dock.ts +11 -12
  531. package/src/surfaces/new-project.ts +27 -26
  532. package/src/surfaces/pane-context.json +144 -77
  533. package/src/surfaces/pane-context.ts +44 -25
  534. package/src/surfaces/pane-grid.ts +15 -10
  535. package/src/surfaces/panel-activity.ts +5 -6
  536. package/src/surfaces/panel-data.ts +3 -4
  537. package/src/surfaces/panel-deploy-checklist.json +12 -6
  538. package/src/surfaces/panel-deploy-checklist.ts +8 -7
  539. package/src/surfaces/panel-elements.ts +5 -7
  540. package/src/surfaces/panel-i18n.ts +5 -7
  541. package/src/surfaces/panel-imports.ts +6 -13
  542. package/src/surfaces/panel-outline.ts +25 -19
  543. package/src/surfaces/panel-page.json +72 -2
  544. package/src/surfaces/panel-page.ts +49 -25
  545. package/src/surfaces/panel-problems.ts +5 -7
  546. package/src/surfaces/panel-signals.json +1 -1
  547. package/src/surfaces/panel-signals.ts +25 -39
  548. package/src/surfaces/panel-stylebook-layers.json +71 -204
  549. package/src/surfaces/panel-stylebook-layers.ts +5 -29
  550. package/src/surfaces/preferences.json +120 -48
  551. package/src/surfaces/preferences.ts +29 -11
  552. package/src/surfaces/progress-modal.ts +15 -9
  553. package/src/surfaces/properties-panel.json +1 -1
  554. package/src/surfaces/properties-panel.ts +20 -42
  555. package/src/surfaces/publish-quick.json +428 -0
  556. package/src/surfaces/publish-quick.ts +165 -0
  557. package/src/surfaces/publish-workspace.json +2892 -0
  558. package/src/surfaces/publish-workspace.ts +391 -0
  559. package/src/surfaces/publish.ts +18 -18
  560. package/src/surfaces/push-plan.ts +7 -8
  561. package/src/surfaces/rail.json +1 -159
  562. package/src/surfaces/rail.ts +22 -79
  563. package/src/surfaces/reference-field.ts +11 -15
  564. package/src/surfaces/schema-builder.ts +16 -22
  565. package/src/surfaces/schema-form.json +10 -2
  566. package/src/surfaces/schema-form.ts +17 -25
  567. package/src/surfaces/secret-field.ts +9 -6
  568. package/src/surfaces/seo.json +1 -1
  569. package/src/surfaces/seo.ts +21 -15
  570. package/src/surfaces/settings-contexts.ts +9 -7
  571. package/src/surfaces/settings-contributed.json +5 -5
  572. package/src/surfaces/settings-contributed.ts +32 -12
  573. package/src/surfaces/settings-css-vars.json +44 -36
  574. package/src/surfaces/settings-css-vars.ts +82 -16
  575. package/src/surfaces/settings-defs.json +2 -2
  576. package/src/surfaces/settings-defs.ts +17 -21
  577. package/src/surfaces/settings-deploy.json +2 -15
  578. package/src/surfaces/settings-deploy.ts +9 -16
  579. package/src/surfaces/settings-dialog.json +51 -0
  580. package/src/surfaces/settings-dialog.ts +169 -0
  581. package/src/surfaces/settings-extensions.ts +5 -6
  582. package/src/surfaces/settings-head.ts +33 -39
  583. package/src/surfaces/settings-locales.ts +8 -20
  584. package/src/surfaces/settings-overview.json +3 -3
  585. package/src/surfaces/settings-overview.ts +14 -8
  586. package/src/surfaces/settings-packages.ts +8 -7
  587. package/src/surfaces/settings-pane.json +269 -46
  588. package/src/surfaces/settings-pane.ts +88 -36
  589. package/src/surfaces/settings-rawjson.ts +5 -6
  590. package/src/surfaces/shell.json +2 -1
  591. package/src/surfaces/shell.ts +1 -2
  592. package/src/surfaces/site-panel.json +1029 -0
  593. package/src/surfaces/site-panel.ts +233 -0
  594. package/src/surfaces/slash-menu.json +63 -21
  595. package/src/surfaces/slash-menu.ts +42 -9
  596. package/src/surfaces/statements.ts +13 -18
  597. package/src/surfaces/statusbar.ts +56 -29
  598. package/src/surfaces/style-panel.ts +18 -31
  599. package/src/surfaces/stylebook-chrome.ts +3 -5
  600. package/src/surfaces/styles-panel.json +735 -0
  601. package/src/surfaces/styles-panel.ts +195 -0
  602. package/src/surfaces/styles-variables.json +149 -0
  603. package/src/surfaces/styles-variables.ts +145 -0
  604. package/src/surfaces/tab-strip.json +4 -4
  605. package/src/surfaces/tab-strip.ts +14 -13
  606. package/src/surfaces/target-line.ts +6 -7
  607. package/src/surfaces/welcome.ts +6 -8
  608. package/src/surfaces/writing-banner.json +94 -0
  609. package/src/surfaces/writing-banner.ts +80 -0
  610. package/src/tabs/bare-repeaters.ts +101 -0
  611. package/src/tabs/patch-ops.ts +4 -3
  612. package/src/tabs/project-config.ts +32 -21
  613. package/src/tabs/selection.ts +36 -8
  614. package/src/tabs/tab.ts +99 -48
  615. package/src/tabs/transact.ts +98 -53
  616. package/src/types.ts +53 -43
  617. package/src/ui/ai-credentials-form.ts +10 -13
  618. package/src/ui/ai-model-picker.ts +3 -3
  619. package/src/ui/cf-account-picker.ts +7 -9
  620. package/src/ui/color-selector.ts +9 -5
  621. package/src/ui/dynamic-slot.ts +7 -8
  622. package/src/ui/expression-editor.ts +112 -105
  623. package/src/ui/form-controls.ts +104 -56
  624. package/src/ui/formula-catalog.ts +239 -230
  625. package/src/ui/formula-chips.ts +33 -18
  626. package/src/ui/layers.ts +57 -31
  627. package/src/ui/media-picker.ts +300 -47
  628. package/src/ui/popover-surface.ts +20 -12
  629. package/src/ui/progress-modal.ts +13 -8
  630. package/src/ui/regions.ts +14 -12
  631. package/src/ui/schema-form.ts +372 -97
  632. package/src/ui/surface.ts +71 -8
  633. package/src/ui/timing.ts +9 -0
  634. package/src/ui/value-source.ts +44 -31
  635. package/src/ui/virtual-window.ts +29 -3
  636. package/src/utils/base64.ts +6 -4
  637. package/src/utils/edit-display.ts +366 -111
  638. package/src/utils/element-selectors.ts +3 -2
  639. package/src/utils/google-fonts.ts +15 -14
  640. package/src/utils/inherited-style.ts +18 -20
  641. package/src/utils/link-target.ts +1 -1
  642. package/src/utils/local-day.ts +18 -0
  643. package/src/utils/preview-format.ts +25 -3
  644. package/src/utils/strip-events.ts +49 -22
  645. package/src/utils/studio-utils.ts +29 -14
  646. package/src/view.ts +2 -3
  647. package/src/workspace/pane-derive.ts +14 -16
  648. package/src/workspace/session.ts +81 -50
  649. package/src/workspace/tab-workspace.ts +137 -0
  650. package/src/workspace/workspace-back.ts +189 -0
  651. package/src/workspace/workspace-home.ts +133 -0
  652. package/src/workspace/workspace-ids.ts +129 -0
  653. package/src/workspace/workspace-switch.ts +372 -0
  654. package/src/workspace/workspace.ts +165 -47
  655. package/styles/shell-frame.css +30 -7
  656. package/styles/shell-frame.json +15 -3
  657. package/dist/chunks/2020-va2wwra4.js +0 -4
  658. package/dist/chunks/adapter-f93pafd7.js +0 -4
  659. package/dist/chunks/cf-account-picker-af1h381v.js +0 -4
  660. package/dist/chunks/cf-settings-125tdm0w.js +0 -4
  661. package/dist/chunks/color-area-jqhna8zy.js +0 -4
  662. package/dist/chunks/color-field-embq5ctg.js +0 -4
  663. package/dist/chunks/color-fpezvnkt.js +0 -4
  664. package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
  665. package/dist/chunks/combobox-773hdzyj.js +0 -4
  666. package/dist/chunks/components-ax2f1fnn.js +0 -4
  667. package/dist/chunks/content-source-108aqtk1.js +0 -4
  668. package/dist/chunks/convert-to-repeater-ry5rmppr.js +0 -4
  669. package/dist/chunks/dialog-mtm9fq5t.js +0 -4
  670. package/dist/chunks/editor-pfgdmkb0.js +0 -4
  671. package/dist/chunks/entry-commands-t0k1q0kx.js +0 -4
  672. package/dist/chunks/extension-sections-6mwh2hf8.js +0 -4
  673. package/dist/chunks/file-ops-meej5mqf.js +0 -4
  674. package/dist/chunks/files-44vp8a2s.js +0 -4
  675. package/dist/chunks/format-host-7q1petb9.js +0 -4
  676. package/dist/chunks/fs-events-h2mwnxaz.js +0 -4
  677. package/dist/chunks/git-panel-zngbymvd.js +0 -4
  678. package/dist/chunks/grid-view-sx9vynsp.js +0 -51
  679. package/dist/chunks/icons-p44xhjf0.js +0 -4
  680. package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
  681. package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
  682. package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
  683. package/dist/chunks/iframe-host-qk3ycq87.js +0 -4
  684. package/dist/chunks/index-wkyfjeqz.js +0 -4
  685. package/dist/chunks/jsonMode-s8kt9dsj.js +0 -13
  686. package/dist/chunks/jx-validate-psgd7vsx.js +0 -4
  687. package/dist/chunks/layers-panel-1kq2jyfk.js +0 -4
  688. package/dist/chunks/layers-xd92fg8d.js +0 -4
  689. package/dist/chunks/listbox-s8fkmnq8.js +0 -4
  690. package/dist/chunks/lit-html-ac4cwwr4.js +0 -4
  691. package/dist/chunks/media-picker-0svzkdyb.js +0 -4
  692. package/dist/chunks/menu-37d07z9m.js +0 -4
  693. package/dist/chunks/menu-5c55ea3d.js +0 -4
  694. package/dist/chunks/monaco-binding-z6r70pdt.js +0 -4
  695. package/dist/chunks/monaco-buffer-fz6gq5y7.js +0 -4
  696. package/dist/chunks/monaco-setup-q4axkgj7.js +0 -4
  697. package/dist/chunks/notify-0xgtn8q1.js +0 -4
  698. package/dist/chunks/number-field-gw7sq8rn.js +0 -4
  699. package/dist/chunks/parse-897fvqah.js +0 -4
  700. package/dist/chunks/platform-v1qctbe6.js +0 -4
  701. package/dist/chunks/popover-8htra4er.js +0 -4
  702. package/dist/chunks/publish-panel-ym1fmgq5.js +0 -4
  703. package/dist/chunks/quick-search-a54e6t5n.js +0 -4
  704. package/dist/chunks/references-gmqp82fs.js +0 -4
  705. package/dist/chunks/right-panel-v7t9awbk.js +0 -4
  706. package/dist/chunks/section-registry-vhyf3zsr.js +0 -4
  707. package/dist/chunks/select-n3v7gwas.js +0 -4
  708. package/dist/chunks/split-pff8f3ze.js +0 -4
  709. package/dist/chunks/studio-0bhx5hz6.js +0 -5
  710. package/dist/chunks/studio-0k1ddnyy.js +0 -6
  711. package/dist/chunks/studio-1b04pd0j.js +0 -64
  712. package/dist/chunks/studio-4dwbj6gb.js +0 -5
  713. package/dist/chunks/studio-4tanh828.js +0 -5
  714. package/dist/chunks/studio-55h4mstj.js +0 -4
  715. package/dist/chunks/studio-5tnvjkz4.js +0 -5
  716. package/dist/chunks/studio-60dqgb0c.js +0 -5
  717. package/dist/chunks/studio-61dp09qg.js +0 -9
  718. package/dist/chunks/studio-63epcrj2.js +0 -5
  719. package/dist/chunks/studio-74k29dy9.js +0 -5
  720. package/dist/chunks/studio-7vg6jcd3.js +0 -5
  721. package/dist/chunks/studio-7zx31knw.js +0 -9
  722. package/dist/chunks/studio-8bxk97km.js +0 -5
  723. package/dist/chunks/studio-933e30n4.js +0 -5
  724. package/dist/chunks/studio-98wnwhbg.js +0 -5
  725. package/dist/chunks/studio-9mccjwjh.js +0 -14
  726. package/dist/chunks/studio-a2ke1e4t.js +0 -5
  727. package/dist/chunks/studio-e3a2a6v3.js +0 -4
  728. package/dist/chunks/studio-e81q1vb9.js +0 -5
  729. package/dist/chunks/studio-epgrmqqm.js +0 -5
  730. package/dist/chunks/studio-ery42sqr.js +0 -4
  731. package/dist/chunks/studio-g1shz58g.js +0 -5
  732. package/dist/chunks/studio-gf0fz03c.js +0 -5
  733. package/dist/chunks/studio-gjtpe62q.js +0 -6
  734. package/dist/chunks/studio-gkskhg7m.js +0 -5
  735. package/dist/chunks/studio-gx4dnjzd.js +0 -5
  736. package/dist/chunks/studio-j03zga3y.js +0 -9
  737. package/dist/chunks/studio-jhpxeckz.js +0 -5
  738. package/dist/chunks/studio-k01r7ykp.js +0 -5
  739. package/dist/chunks/studio-kk7h30ne.js +0 -7
  740. package/dist/chunks/studio-kt1zqney.js +0 -5
  741. package/dist/chunks/studio-m3cwhvye.js +0 -5
  742. package/dist/chunks/studio-mcayt6hz.js +0 -5
  743. package/dist/chunks/studio-myjcghv3.js +0 -5
  744. package/dist/chunks/studio-n8bxwc3y.js +0 -4
  745. package/dist/chunks/studio-ngm8gvpb.js +0 -5
  746. package/dist/chunks/studio-nj5a01jy.js +0 -928
  747. package/dist/chunks/studio-pcgz8heb.js +0 -5
  748. package/dist/chunks/studio-qcsq0t15.js +0 -5
  749. package/dist/chunks/studio-qkstvve9.js +0 -5
  750. package/dist/chunks/studio-qv1pwd3c.js +0 -5
  751. package/dist/chunks/studio-rc6dvxjb.js +0 -7
  752. package/dist/chunks/studio-s8dmmz66.js +0 -5
  753. package/dist/chunks/studio-sp5xzbj4.js +0 -6
  754. package/dist/chunks/studio-szsjbj0g.js +0 -5
  755. package/dist/chunks/studio-t1xzawhr.js +0 -16
  756. package/dist/chunks/studio-tdcprbqb.js +0 -5
  757. package/dist/chunks/studio-vrmcjf9g.js +0 -7
  758. package/dist/chunks/studio-vyc0b4he.js +0 -10
  759. package/dist/chunks/studio-w0cgf6jg.js +0 -5
  760. package/dist/chunks/studio-w3hskzqk.js +0 -5
  761. package/dist/chunks/studio-xgrgcdyh.js +0 -9
  762. package/dist/chunks/studio-xz2yxfcb.js +0 -5
  763. package/dist/chunks/studio-y6n42tgs.js +0 -5
  764. package/dist/chunks/studio-yb560vxr.js +0 -5
  765. package/dist/chunks/studio-yn9f8vtx.js +0 -5
  766. package/dist/chunks/studio-yw05w8f0.js +0 -7
  767. package/dist/chunks/studio-z16sgavc.js +0 -5
  768. package/dist/chunks/studio-zey7zsdw.js +0 -12
  769. package/dist/chunks/studio-zyqn40w4.js +0 -5
  770. package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
  771. package/dist/chunks/tabs-jwthg40w.js +0 -4
  772. package/dist/chunks/textfield-spy3hc77.js +0 -4
  773. package/dist/chunks/toast-4d35zd64.js +0 -4
  774. package/dist/chunks/toast-host-8sjmfed3.js +0 -4
  775. package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
  776. package/dist/chunks/tree-h19v1jfz.js +0 -4
  777. package/dist/chunks/tsMode-2frah6h1.js +0 -14
  778. package/dist/chunks/workspace-zt81g1ms.js +0 -4
  779. package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
  780. package/src/panels/frontmatter-panel.ts +0 -701
  781. package/src/panels/git-panel.ts +0 -1120
  782. package/src/surfaces/doc-header.json +0 -776
  783. package/src/surfaces/doc-header.ts +0 -231
  784. package/src/surfaces/git-panel.json +0 -1880
  785. package/src/surfaces/git-panel.ts +0 -272
@@ -13,9 +13,9 @@ import { canPickDirectory, pickDirectoryPath } from "../services/directory-picke
13
13
  import { negotiateCollab } from "@jxsuite/collab/negotiate";
14
14
  import type { CollabNegotiation } from "@jxsuite/collab/negotiate";
15
15
  import type { WsCollabConnection } from "@jxsuite/collab/client";
16
- import type { ProjectConfig } from "@jxsuite/schema/types";
16
+ import { isFunction } from "@jxsuite/schema/guards";
17
+ import type { JsonObject, JsonValue, JxMutableNode, ProjectConfig } from "@jxsuite/schema/types";
17
18
  import type {
18
- CreateProjectDestination,
19
19
  DataConnectionsResponse,
20
20
  DataConnectionTestResult,
21
21
  DataPushResult,
@@ -35,20 +35,22 @@ import type {
35
35
  ProjectSchemasResponse,
36
36
  ReferencesResult,
37
37
  RenameResult,
38
- SecretsSetRequest,
38
+ KeyValuePatch,
39
39
  SecretsSetResponse,
40
40
  SiteBuildResult,
41
41
  SitePreviewResult,
42
42
  StarterInfo,
43
+ StudioPlatform,
43
44
  } from "../types";
44
45
  import { problemDetail, problemMessage } from "@jxsuite/protocol";
46
+ import type { CfProxyEnvelope } from "./cloud";
45
47
  import type { UploadResult } from "@jxsuite/protocol";
46
48
 
47
- /** A directory entry from the server, tolerating extra wire fields. */
48
- type WireDirEntry = DirEntry & Record<string, unknown>;
49
-
50
49
  /** Parse a fetch Response body as JSON, asserting the expected shape at the boundary. */
51
50
  async function readJson<T>(res: Response): Promise<T> {
51
+ /* SAFETY: every route read here is a `/__studio/*` route of @jxsuite/server (specs/server.md §4),
52
+ whose replies have the shapes ../types and the wire interfaces in this file describe, and each
53
+ caller names the type of the route it called. */
52
54
  return (await res.json()) as T;
53
55
  }
54
56
 
@@ -56,11 +58,46 @@ interface ErrorBody {
56
58
  error?: string;
57
59
  }
58
60
 
61
+ /** One entry of the `/__studio/sites` glob: a site's folder and its parsed project.json. */
59
62
  interface SiteEntry {
60
- config: unknown;
63
+ config: ProjectConfig | null;
61
64
  path: string;
62
65
  }
63
66
 
67
+ /**
68
+ * `GET /__studio/project-info`: what the server knows about a folder. The route sends more than
69
+ * Studio reads (`projectRoot` among them), and those members ride along untouched.
70
+ */
71
+ interface ProjectInfoReply {
72
+ isSiteProject: boolean;
73
+ projectConfig?: ProjectConfig | null;
74
+ directories?: string[];
75
+ [member: string]: JsonValue | ProjectConfig | undefined;
76
+ }
77
+
78
+ /** The body of an `fs` event on the `/__reload` stream (the server's watcher batches them). */
79
+ interface FsEventBatch {
80
+ events?: FsEvent[];
81
+ }
82
+
83
+ /** `showDirectoryPicker()` (WICG File System Access), which only Chromium-based browsers expose. */
84
+ type ShowDirectoryPicker = (options: { mode: string }) => Promise<FileSystemDirectoryHandle>;
85
+
86
+ /** True when the window implements the File System Access directory picker. */
87
+ function hasDirectoryPicker(
88
+ host: Window,
89
+ ): host is Window & { showDirectoryPicker: ShowDirectoryPicker } {
90
+ return "showDirectoryPicker" in host && isFunction(host.showDirectoryPicker);
91
+ }
92
+
93
+ /** The options object {@link StudioPlatform.createProject} takes. */
94
+ type CreateProjectOptions = Parameters<StudioPlatform["createProject"]>[0];
95
+
96
+ /** What a row insert or update answers: the row as stored. */
97
+ interface DataRowWrite {
98
+ row: JsonObject;
99
+ }
100
+
64
101
  /**
65
102
  * Create a DevServerPlatform instance.
66
103
  *
@@ -117,7 +154,7 @@ export function createDevServerPlatform() {
117
154
  method: "POST",
118
155
  });
119
156
  if (!res.ok) {
120
- const body = (await readJson<ErrorBody>(res).catch(() => ({}))) as ErrorBody;
157
+ const body = await readJson<ErrorBody>(res).catch((): ErrorBody => ({}));
121
158
  throw new Error(
122
159
  `Could not open ${root}: ${problemDetail(body) ?? `activation failed (${res.status})`}`,
123
160
  );
@@ -134,7 +171,7 @@ export function createDevServerPlatform() {
134
171
  if (!_projectRoot) {
135
172
  return;
136
173
  }
137
- _activation = postActivate(_projectRoot).catch((error: unknown) => {
174
+ _activation = postActivate(_projectRoot).catch((error) => {
138
175
  console.error("Project re-activation failed:", error);
139
176
  });
140
177
  }
@@ -158,6 +195,23 @@ export function createDevServerPlatform() {
158
195
  return `${_projectRoot}/${r}`;
159
196
  }
160
197
 
198
+ /**
199
+ * A `/__studio/git/*` route that names this session's project with `?dir=`.
200
+ *
201
+ * The server serves every Studio tab pointed at it, and its active project is whichever one was
202
+ * activated last; a git call that named no project ran in that one, so Initialize Repository in
203
+ * one session initialised another's project. With no project open, nothing is named and the
204
+ * server falls back to its own root (a clone from the welcome screen).
205
+ */
206
+ function gitRoute(command: string, params: Record<string, string> = {}): string {
207
+ const query = new URLSearchParams(params);
208
+ if (_projectRoot) {
209
+ query.set("dir", serverPath("."));
210
+ }
211
+ const search = query.toString();
212
+ return `/__studio/git/${command}${search ? `?${search}` : ""}`;
213
+ }
214
+
161
215
  /**
162
216
  * Strip the project root prefix from a server-root-relative path.
163
217
  *
@@ -171,6 +225,36 @@ export function createDevServerPlatform() {
171
225
  return p.startsWith(`${_projectRoot}/`) ? p.slice(_projectRoot.length + 1) : p;
172
226
  }
173
227
 
228
+ /**
229
+ * Native folder chooser for the New Project modal's Browse… button. Present only when the browser
230
+ * implements `showDirectoryPicker` (Chromium-based); elsewhere the member stays undefined and the
231
+ * modal falls back to a typed Location field.
232
+ *
233
+ * The picked handle carries no filesystem path, so it is resolved by the id the picker tags the
234
+ * folder with (see `@jxsuite/studio/directory-picker`). Resolves `null` only when the user
235
+ * dismisses the chooser; every other failure rejects with a sentence the modal shows under
236
+ * Location. So `locate` keeps the helper's contract: `null` is "no folder holds this id" (the
237
+ * route's 200 `{ path: null }`), and a non-ok answer throws the problem the server sent rather
238
+ * than posing as a miss. A network failure (`TypeError: Failed to fetch`, e.g. a page that is not
239
+ * being served by the dev server at all) propagates as is, and the picker names it.
240
+ */
241
+ const directoryPicking: Pick<StudioPlatform, "pickDirectory"> = {};
242
+ if (canPickDirectory()) {
243
+ directoryPicking.pickDirectory = async (): Promise<string | null> =>
244
+ pickDirectoryPath(async ({ id, name }) => {
245
+ const res = await fetch(
246
+ `/__studio/locate-directory?name=${encodeURIComponent(name)}&id=${encodeURIComponent(id)}`,
247
+ );
248
+ if (!res.ok) {
249
+ // A proxy, or a `views://` host with no dev server behind it, may answer in HTML.
250
+ const body = await readJson<JsonValue>(res).catch(() => null);
251
+ throw new Error(problemMessage(body, res.status));
252
+ }
253
+ const found = await readJson<{ path?: string | null }>(res);
254
+ return found.path ?? null;
255
+ });
256
+ }
257
+
174
258
  return {
175
259
  id: "devserver",
176
260
 
@@ -189,7 +273,7 @@ export function createDevServerPlatform() {
189
273
  // Fire-and-forget: callers that need the binding in place before reading await activate()
190
274
  // Themselves. The rejection is reported rather than dropped — an unactivated root leaves
191
275
  // Every rootless endpoint (git especially) operating on the server's OWN root.
192
- _activation = this.activate(_projectRoot).catch((error: unknown) => {
276
+ _activation = this.activate(_projectRoot).catch((error) => {
193
277
  console.error("Project activation failed:", error);
194
278
  });
195
279
  }
@@ -213,17 +297,14 @@ export function createDevServerPlatform() {
213
297
 
214
298
  async openProject() {
215
299
  // Use Chrome's showDirectoryPicker API
216
- if (!("showDirectoryPicker" in window)) {
300
+ const host = window;
301
+ if (!hasDirectoryPicker(host)) {
217
302
  throw new Error("showDirectoryPicker not available — use a Chromium-based browser");
218
303
  }
219
304
 
220
305
  let dirHandle;
221
306
  try {
222
- dirHandle = await (
223
- window as unknown as {
224
- showDirectoryPicker: (opts: { mode: string }) => Promise<FileSystemDirectoryHandle>;
225
- }
226
- ).showDirectoryPicker({ mode: "readwrite" });
307
+ dirHandle = await host.showDirectoryPicker({ mode: "readwrite" });
227
308
  } catch (error) {
228
309
  // User cancelled the picker
229
310
  if (error instanceof Error && error.name === "AbortError") {
@@ -241,6 +322,9 @@ export function createDevServerPlatform() {
241
322
  }
242
323
 
243
324
  const file = await siteHandle.getFile();
325
+ /* SAFETY: the user picked this folder as a project, and project.json is that project's own
326
+ config file; it is matched below against the server's parse of the same file, and every
327
+ adapter hands project.json to Studio as the ProjectConfig the session edits. */
244
328
  const config = JSON.parse(await file.text()) as ProjectConfig;
245
329
 
246
330
  // Resolve server-relative path by matching against known sites
@@ -297,12 +381,7 @@ export function createDevServerPlatform() {
297
381
  ? await readJson<{ name: string; root: string }>(projectRes)
298
382
  : { name: "project", root: "." };
299
383
  const info = infoRes.ok
300
- ? await readJson<{
301
- isSiteProject: boolean;
302
- projectConfig?: ProjectConfig | null;
303
- directories?: string[];
304
- [key: string]: unknown;
305
- }>(infoRes)
384
+ ? await readJson<ProjectInfoReply>(infoRes)
306
385
  : { isSiteProject: false };
307
386
  return { info, meta };
308
387
  } catch {
@@ -315,27 +394,8 @@ export function createDevServerPlatform() {
315
394
  /**
316
395
  * Scaffold a project at `destination.parent/directory`. The dev server refuses the request
317
396
  * outright when no destination is supplied — it will not fall back to its own root.
318
- *
319
- * @param {{
320
- * name: string;
321
- * description?: string;
322
- * url?: string;
323
- * adapter?: string;
324
- * directory: string;
325
- * destination: CreateProjectDestination;
326
- * }} opts
327
397
  */
328
- async createProject(opts: {
329
- name: string;
330
- description?: string;
331
- url?: string;
332
- adapter?: string;
333
- directory: string;
334
- destination: CreateProjectDestination;
335
- starter?: string;
336
- template?: string;
337
- design?: Record<string, unknown>;
338
- }) {
398
+ async createProject(opts: CreateProjectOptions) {
339
399
  const res = await fetch("/__studio/create-project", {
340
400
  body: JSON.stringify(opts),
341
401
  headers: { "Content-Type": "application/json" },
@@ -348,37 +408,7 @@ export function createDevServerPlatform() {
348
408
  return await res.json();
349
409
  },
350
410
 
351
- /**
352
- * Native folder chooser for the New Project modal's Browse… button. Present only when the
353
- * browser implements `showDirectoryPicker` (Chromium-based); elsewhere the member stays
354
- * undefined and the modal falls back to a typed Location field.
355
- *
356
- * The picked handle carries no filesystem path, so it is resolved by the id the picker tags the
357
- * folder with (see `@jxsuite/studio/directory-picker`). Resolves `null` only when the user
358
- * dismisses the chooser; every other failure rejects with a sentence the modal shows under
359
- * Location. So `locate` keeps the helper's contract: `null` is "no folder holds this id" (the
360
- * route's 200 `{ path: null }`), and a non-ok answer throws the problem the server sent rather
361
- * than posing as a miss. A network failure (`TypeError: Failed to fetch`, e.g. a page that is
362
- * not being served by the dev server at all) propagates as is, and the picker names it.
363
- */
364
- ...(canPickDirectory()
365
- ? {
366
- async pickDirectory(): Promise<string | null> {
367
- return pickDirectoryPath(async ({ id, name }) => {
368
- const res = await fetch(
369
- `/__studio/locate-directory?name=${encodeURIComponent(name)}&id=${encodeURIComponent(id)}`,
370
- );
371
- if (!res.ok) {
372
- // A proxy, or a `views://` host with no dev server behind it, may answer in HTML.
373
- const body: unknown = await res.json().catch(() => null);
374
- throw new Error(problemMessage(body, res.status));
375
- }
376
- const found = await readJson<{ path?: string | null }>(res);
377
- return found.path ?? null;
378
- });
379
- },
380
- }
381
- : {}),
411
+ ...directoryPicking,
382
412
 
383
413
  /** List starter templates from the dev server. */
384
414
  async listStarters(): Promise<StarterInfo[]> {
@@ -407,20 +437,32 @@ export function createDevServerPlatform() {
407
437
  if (!res.ok) {
408
438
  throw new Error(`Failed to list directory: ${dir}`);
409
439
  }
410
- const entries = await readJson<WireDirEntry[]>(res);
440
+ const entries = await readJson<DirEntry[]>(res);
411
441
  for (const e of entries) {
412
442
  e.path = stripRoot(e.path);
413
443
  }
414
444
  return entries;
415
445
  },
416
446
 
417
- /** @param {string} path */
447
+ /**
448
+ * Read a file as text. A missing file still rejects, as the PAL says; it is only asked for with
449
+ * `optional=1` (`specs/server.md` §4.1), so the absence arrives as a `null` body rather than a 404.
450
+ * Studio probes for files it expects may be missing (a `.gitignore` per listed directory), and
451
+ * a failed request per probe was console noise that read as a fault.
452
+ *
453
+ * @param {string} path
454
+ */
418
455
  async readFile(path: string) {
419
- const res = await fetch(`/__studio/file?path=${encodeURIComponent(serverPath(path))}`);
456
+ const res = await fetch(
457
+ `/__studio/file?path=${encodeURIComponent(serverPath(path))}&optional=1`,
458
+ );
420
459
  if (!res.ok) {
421
460
  throw new Error(`Failed to read file: ${path}`);
422
461
  }
423
- const data = await readJson<{ content: string }>(res);
462
+ const data = await readJson<{ content: string | null }>(res);
463
+ if (data.content === null) {
464
+ throw new Error(`Failed to read file: ${path} (not found)`);
465
+ }
424
466
  return data.content;
425
467
  },
426
468
 
@@ -465,10 +507,14 @@ export function createDevServerPlatform() {
465
507
  if (!res.ok) {
466
508
  throw new Error(`Upload failed: ${path}`);
467
509
  }
468
- const body = (await res.json()) as Partial<UploadResult>;
510
+ const body = await readJson<Partial<UploadResult>>(res);
469
511
  // The dev server echoes the path today; falling back to the request keeps a backend that says
470
512
  // Nothing working rather than writing `undefined` into a document.
471
- return { path: body.path ?? path, ...(body.size === undefined ? {} : { size: body.size }) };
513
+ const uploaded: UploadResult = { path: body.path ?? path };
514
+ if (body.size !== undefined) {
515
+ uploaded.size = body.size;
516
+ }
517
+ return uploaded;
472
518
  },
473
519
 
474
520
  /** @param {string} path */
@@ -552,10 +598,12 @@ export function createDevServerPlatform() {
552
598
  options?.onResync?.("reconnect");
553
599
  }
554
600
  });
555
- es.addEventListener("fs", (ev: MessageEvent) => {
556
- let payload: { events?: FsEvent[] };
601
+ es.addEventListener("fs", (ev: MessageEvent<string>) => {
602
+ let payload: FsEventBatch;
557
603
  try {
558
- payload = JSON.parse(ev.data as string) as { events?: FsEvent[] };
604
+ /* SAFETY: `fs` events on /__reload are sent only by @jxsuite/server's watcher, as
605
+ broadcastEvent("fs", { events }) over its batched FsEvent buffer (server watch.ts). */
606
+ payload = JSON.parse(ev.data) as FsEventBatch;
559
607
  } catch {
560
608
  return;
561
609
  }
@@ -597,7 +645,7 @@ export function createDevServerPlatform() {
597
645
  }
598
646
  if (_collabProbe === null) {
599
647
  _collabProbe = fetch("/__studio/collab")
600
- .then(async (res) => (res.ok ? negotiateCollab(await res.json()) : null))
648
+ .then(async (res) => (res.ok ? negotiateCollab(await readJson<JsonValue>(res)) : null))
601
649
  .catch(() => null);
602
650
  }
603
651
  const negotiation = await _collabProbe;
@@ -694,7 +742,7 @@ export function createDevServerPlatform() {
694
742
  if (!res.ok) {
695
743
  return false;
696
744
  }
697
- const data = (await res.json()) as { needsInstall?: boolean };
745
+ const data = await readJson<{ needsInstall?: boolean }>(res);
698
746
  return Boolean(data.needsInstall);
699
747
  },
700
748
 
@@ -721,11 +769,8 @@ export function createDevServerPlatform() {
721
769
 
722
770
  // ─── Code services (optional) ─────────────────────────────────────────
723
771
 
724
- /**
725
- * @param {string} action
726
- * @param {unknown} payload
727
- */
728
- async codeService(action: string, payload: unknown) {
772
+ /** Run one code-service action on the server; null when the route fails or is absent. */
773
+ async codeService(action: string, payload: Parameters<StudioPlatform["codeService"]>[1]) {
729
774
  try {
730
775
  const res = await fetch(`/__studio/code/${action}`, {
731
776
  body: JSON.stringify(payload),
@@ -788,7 +833,7 @@ export function createDevServerPlatform() {
788
833
  if (!res.ok) {
789
834
  return [];
790
835
  }
791
- const entries = await readJson<WireDirEntry[]>(res);
836
+ const entries = await readJson<DirEntry[]>(res);
792
837
  for (const e of entries) {
793
838
  e.path = stripRoot(e.path);
794
839
  }
@@ -911,26 +956,26 @@ export function createDevServerPlatform() {
911
956
  return data;
912
957
  },
913
958
 
914
- async dataInsertRow(req: DataRowInsert): Promise<{ row: Record<string, unknown> }> {
959
+ async dataInsertRow(req: DataRowInsert): Promise<DataRowWrite> {
915
960
  const res = await fetch(`/__studio/data/rows?dir=${encodeURIComponent(serverPath("."))}`, {
916
961
  body: JSON.stringify(req),
917
962
  headers: { "Content-Type": "application/json" },
918
963
  method: "POST",
919
964
  });
920
- const data = await readJson<{ row: Record<string, unknown> } & ErrorBody>(res);
965
+ const data = await readJson<DataRowWrite & ErrorBody>(res);
921
966
  if (!res.ok) {
922
967
  throw new Error(problemDetail(data) ?? "Insert failed");
923
968
  }
924
969
  return data;
925
970
  },
926
971
 
927
- async dataUpdateRow(req: DataRowUpdate): Promise<{ row: Record<string, unknown> }> {
972
+ async dataUpdateRow(req: DataRowUpdate): Promise<DataRowWrite> {
928
973
  const res = await fetch(`/__studio/data/rows?dir=${encodeURIComponent(serverPath("."))}`, {
929
974
  body: JSON.stringify(req),
930
975
  headers: { "Content-Type": "application/json" },
931
976
  method: "PUT",
932
977
  });
933
- const data = await readJson<{ row: Record<string, unknown> } & ErrorBody>(res);
978
+ const data = await readJson<DataRowWrite & ErrorBody>(res);
934
979
  if (!res.ok) {
935
980
  throw new Error(problemDetail(data) ?? "Update failed");
936
981
  }
@@ -966,7 +1011,7 @@ export function createDevServerPlatform() {
966
1011
  },
967
1012
 
968
1013
  /** Write/remove secrets in the dev server's .dev.vars; names-only response. */
969
- async setSecrets(req: SecretsSetRequest): Promise<SecretsSetResponse> {
1014
+ async setSecrets(req: KeyValuePatch): Promise<SecretsSetResponse> {
970
1015
  const res = await fetch(`/__studio/secrets?dir=${encodeURIComponent(serverPath("."))}`, {
971
1016
  body: JSON.stringify(req),
972
1017
  headers: { "Content-Type": "application/json" },
@@ -982,15 +1027,17 @@ export function createDevServerPlatform() {
982
1027
  /**
983
1028
  * Invoke a format capability (parse/serialize) server-side.
984
1029
  *
985
- * @param {Record<string, unknown>} payload — { format, action, source?, doc?, options? }
1030
+ * @param payload — { format, action, source?, doc?, options? }
986
1031
  */
987
- async formatAction(payload: Record<string, unknown>) {
1032
+ async formatAction(payload: Parameters<NonNullable<StudioPlatform["formatAction"]>>[0]) {
988
1033
  const res = await fetch("/__studio/format", {
989
1034
  body: JSON.stringify({ ...payload, dir: serverPath(".") }),
990
1035
  headers: { "Content-Type": "application/json" },
991
1036
  method: "POST",
992
1037
  });
993
- const data = await readJson<{ error?: string; result?: unknown }>(res);
1038
+ /* The format route answers `{ result }` on success (the document a format class's `parse`
1039
+ built, or the text its `serialize` wrote) and a problem document otherwise. */
1040
+ const data = await readJson<JsonObject & { result: JxMutableNode | string }>(res);
994
1041
  if (!res.ok) {
995
1042
  throw new Error(problemDetail(data) ?? "Format action failed");
996
1043
  }
@@ -1016,14 +1063,13 @@ export function createDevServerPlatform() {
1016
1063
  if (!res.ok) {
1017
1064
  return null;
1018
1065
  }
1019
- const { schema } = await readJson<{ schema: unknown }>(res);
1066
+ const { schema } = await readJson<{ schema: JsonValue }>(res);
1020
1067
  return schema;
1021
1068
  },
1022
1069
 
1023
1070
  // ─── Class resolution (dev-proxy) ─────────────────────────────────────
1024
1071
 
1025
- /** @param {Record<string, unknown>} body */
1026
- async resolveClass(body: Record<string, unknown>) {
1072
+ async resolveClass(body: Parameters<NonNullable<StudioPlatform["resolveClass"]>>[0]) {
1027
1073
  const res = await fetch("/__jx_resolve__", {
1028
1074
  body: JSON.stringify(body),
1029
1075
  headers: { "content-type": "application/json" },
@@ -1032,13 +1078,13 @@ export function createDevServerPlatform() {
1032
1078
  if (!res.ok) {
1033
1079
  throw new Error(`Class resolution failed: ${res.status}`);
1034
1080
  }
1035
- return await readJson<unknown>(res);
1081
+ return await readJson<JsonValue>(res);
1036
1082
  },
1037
1083
 
1038
1084
  // ─── Git operations ──────────────────────────────────────────────────
1039
1085
 
1040
1086
  async gitStatus() {
1041
- const res = await fetch("/__studio/git/status");
1087
+ const res = await fetch(gitRoute("status"));
1042
1088
  if (!res.ok) {
1043
1089
  throw new Error(await res.text());
1044
1090
  }
@@ -1046,7 +1092,7 @@ export function createDevServerPlatform() {
1046
1092
  },
1047
1093
 
1048
1094
  async gitBranches() {
1049
- const res = await fetch("/__studio/git/branches");
1095
+ const res = await fetch(gitRoute("branches"));
1050
1096
  if (!res.ok) {
1051
1097
  throw new Error(await res.text());
1052
1098
  }
@@ -1055,8 +1101,7 @@ export function createDevServerPlatform() {
1055
1101
 
1056
1102
  /** @param {number} [limit] */
1057
1103
  async gitLog(limit?: number) {
1058
- const q = limit ? `?limit=${limit}` : "";
1059
- const res = await fetch(`/__studio/git/log${q}`);
1104
+ const res = await fetch(gitRoute("log", limit ? { limit: String(limit) } : {}));
1060
1105
  if (!res.ok) {
1061
1106
  throw new Error(await res.text());
1062
1107
  }
@@ -1065,7 +1110,7 @@ export function createDevServerPlatform() {
1065
1110
 
1066
1111
  /** @param {string[]} files */
1067
1112
  async gitStage(files: string[]) {
1068
- const res = await fetch("/__studio/git/stage", {
1113
+ const res = await fetch(gitRoute("stage"), {
1069
1114
  body: JSON.stringify({ files }),
1070
1115
  headers: { "Content-Type": "application/json" },
1071
1116
  method: "POST",
@@ -1079,7 +1124,7 @@ export function createDevServerPlatform() {
1079
1124
 
1080
1125
  /** @param {string[]} files */
1081
1126
  async gitUnstage(files: string[]) {
1082
- const res = await fetch("/__studio/git/unstage", {
1127
+ const res = await fetch(gitRoute("unstage"), {
1083
1128
  body: JSON.stringify({ files }),
1084
1129
  headers: { "Content-Type": "application/json" },
1085
1130
  method: "POST",
@@ -1093,7 +1138,7 @@ export function createDevServerPlatform() {
1093
1138
 
1094
1139
  /** @param {string} message */
1095
1140
  async gitCommit(message: string) {
1096
- const res = await fetch("/__studio/git/commit", {
1141
+ const res = await fetch(gitRoute("commit"), {
1097
1142
  body: JSON.stringify({ message }),
1098
1143
  headers: { "Content-Type": "application/json" },
1099
1144
  method: "POST",
@@ -1107,7 +1152,7 @@ export function createDevServerPlatform() {
1107
1152
 
1108
1153
  /** @param {{ setUpstream?: boolean }} [opts] */
1109
1154
  async gitPush(opts?: { setUpstream?: boolean }) {
1110
- const res = await fetch("/__studio/git/push", {
1155
+ const res = await fetch(gitRoute("push"), {
1111
1156
  body: JSON.stringify(opts || {}),
1112
1157
  headers: { "Content-Type": "application/json" },
1113
1158
  method: "POST",
@@ -1120,7 +1165,7 @@ export function createDevServerPlatform() {
1120
1165
  },
1121
1166
 
1122
1167
  async gitPull() {
1123
- const res = await fetch("/__studio/git/pull", { method: "POST" });
1168
+ const res = await fetch(gitRoute("pull"), { method: "POST" });
1124
1169
  if (!res.ok) {
1125
1170
  const body = await readJson<ErrorBody>(res);
1126
1171
  throw new Error(problemMessage(body));
@@ -1129,7 +1174,7 @@ export function createDevServerPlatform() {
1129
1174
  },
1130
1175
 
1131
1176
  async gitFetch() {
1132
- const res = await fetch("/__studio/git/fetch", { method: "POST" });
1177
+ const res = await fetch(gitRoute("fetch"), { method: "POST" });
1133
1178
  if (!res.ok) {
1134
1179
  const body = await readJson<ErrorBody>(res);
1135
1180
  throw new Error(problemMessage(body));
@@ -1139,7 +1184,7 @@ export function createDevServerPlatform() {
1139
1184
 
1140
1185
  /** @param {string} branch */
1141
1186
  async gitCheckout(branch: string) {
1142
- const res = await fetch("/__studio/git/checkout", {
1187
+ const res = await fetch(gitRoute("checkout"), {
1143
1188
  body: JSON.stringify({ branch }),
1144
1189
  headers: { "Content-Type": "application/json" },
1145
1190
  method: "POST",
@@ -1153,7 +1198,7 @@ export function createDevServerPlatform() {
1153
1198
 
1154
1199
  /** @param {string} name */
1155
1200
  async gitCreateBranch(name: string) {
1156
- const res = await fetch("/__studio/git/create-branch", {
1201
+ const res = await fetch(gitRoute("create-branch"), {
1157
1202
  body: JSON.stringify({ name }),
1158
1203
  headers: { "Content-Type": "application/json" },
1159
1204
  method: "POST",
@@ -1167,7 +1212,7 @@ export function createDevServerPlatform() {
1167
1212
 
1168
1213
  /** @param {string} [path] */
1169
1214
  async gitDiff(path?: string) {
1170
- const res = await fetch(`/__studio/git/diff?path=${encodeURIComponent(path ?? "")}`);
1215
+ const res = await fetch(gitRoute("diff", { path: path ?? "" }));
1171
1216
  if (!res.ok) {
1172
1217
  throw new Error(await res.text());
1173
1218
  }
@@ -1176,11 +1221,9 @@ export function createDevServerPlatform() {
1176
1221
 
1177
1222
  /** @param {{ path: string; ref?: string }} opts */
1178
1223
  async gitShow(opts: { path: string; ref?: string }) {
1179
- const params = new URLSearchParams({ path: opts.path });
1180
- if (opts.ref) {
1181
- params.set("ref", opts.ref);
1182
- }
1183
- const res = await fetch(`/__studio/git/show?${params}`);
1224
+ const res = await fetch(
1225
+ gitRoute("show", opts.ref ? { path: opts.path, ref: opts.ref } : { path: opts.path }),
1226
+ );
1184
1227
  if (!res.ok) {
1185
1228
  throw new Error(await res.text());
1186
1229
  }
@@ -1190,7 +1233,7 @@ export function createDevServerPlatform() {
1190
1233
 
1191
1234
  /** @param {string[]} files */
1192
1235
  async gitDiscard(files: string[]) {
1193
- const res = await fetch("/__studio/git/discard", {
1236
+ const res = await fetch(gitRoute("discard"), {
1194
1237
  body: JSON.stringify({ files }),
1195
1238
  headers: { "Content-Type": "application/json" },
1196
1239
  method: "POST",
@@ -1204,7 +1247,7 @@ export function createDevServerPlatform() {
1204
1247
 
1205
1248
  /** @param {string} url */
1206
1249
  async gitClone(url: string) {
1207
- const res = await fetch("/__studio/git/clone", {
1250
+ const res = await fetch(gitRoute("clone"), {
1208
1251
  body: JSON.stringify({ url }),
1209
1252
  headers: { "Content-Type": "application/json" },
1210
1253
  method: "POST",
@@ -1217,7 +1260,7 @@ export function createDevServerPlatform() {
1217
1260
  },
1218
1261
 
1219
1262
  async gitInit() {
1220
- const res = await fetch("/__studio/git/init", { method: "POST" });
1263
+ const res = await fetch(gitRoute("init"), { method: "POST" });
1221
1264
  if (!res.ok) {
1222
1265
  const body = await readJson<ErrorBody>(res);
1223
1266
  throw new Error(problemMessage(body));
@@ -1229,7 +1272,7 @@ export function createDevServerPlatform() {
1229
1272
  const body = await readJson<ErrorBody>(res);
1230
1273
  throw new Error(problemDetail(body) ?? "The site could not be built.");
1231
1274
  }
1232
- return (await res.json()) as SiteBuildResult;
1275
+ return await readJson<SiteBuildResult>(res);
1233
1276
  },
1234
1277
 
1235
1278
  /**
@@ -1248,7 +1291,7 @@ export function createDevServerPlatform() {
1248
1291
  const body = await readJson<ErrorBody>(res);
1249
1292
  throw new Error(problemDetail(body) ?? "The site could not be previewed.");
1250
1293
  }
1251
- return (await res.json()) as SitePreviewResult;
1294
+ return await readJson<SitePreviewResult>(res);
1252
1295
  },
1253
1296
 
1254
1297
  async setPreviewOverlay(path: string, contents: string) {
@@ -1272,7 +1315,7 @@ export function createDevServerPlatform() {
1272
1315
  * @param {string} url
1273
1316
  */
1274
1317
  async gitAddRemote(name: string, url: string) {
1275
- const res = await fetch("/__studio/git/add-remote", {
1318
+ const res = await fetch(gitRoute("add-remote"), {
1276
1319
  body: JSON.stringify({ name, url }),
1277
1320
  headers: { "Content-Type": "application/json" },
1278
1321
  method: "POST",
@@ -1300,12 +1343,7 @@ export function createDevServerPlatform() {
1300
1343
  headers: { "Content-Type": "application/json", "X-CF-Token": token },
1301
1344
  body: JSON.stringify({ path: apiPath, method: init?.method ?? "GET", body: init?.body }),
1302
1345
  });
1303
- const envelope = (await res.json()) as {
1304
- success?: boolean;
1305
- result?: unknown;
1306
- errors?: { message: string }[];
1307
- error?: string;
1308
- };
1346
+ const envelope = await readJson<CfProxyEnvelope>(res);
1309
1347
  if (!res.ok || envelope.success === false) {
1310
1348
  const message =
1311
1349
  envelope.errors?.map((e) => e.message).join("; ") ?? envelope.error ?? res.statusText;
@@ -1322,10 +1360,13 @@ export function createDevServerPlatform() {
1322
1360
  return null;
1323
1361
  }
1324
1362
  try {
1325
- const accounts = (await this.cfApi?.("/accounts")) as { id: string; name: string }[];
1326
- if (!accounts?.length) {
1363
+ const result = await this.cfApi("/accounts");
1364
+ if (!Array.isArray(result) || result.length === 0) {
1327
1365
  return { connected: false };
1328
1366
  }
1367
+ /* SAFETY: cfApi resolved the v4 envelope's `result`, and Cloudflare documents GET /accounts
1368
+ as answering an array of account objects, each with a string `id` and `name`. */
1369
+ const accounts = result as { id: string; name: string }[];
1329
1370
  const chosen = accounts.find((a) => a.id === getCfAccountId()) ?? accounts[0]!;
1330
1371
  setCfAccountId(chosen.id);
1331
1372
  return { connected: true, accountId: chosen.id, accountName: chosen.name };
@@ -1343,14 +1384,11 @@ export function createDevServerPlatform() {
1343
1384
  return [];
1344
1385
  }
1345
1386
  const sites = await readJson<SiteEntry[]>(res);
1346
- return sites.map((site) => {
1347
- const config = site.config as { name?: string } | null;
1348
- return {
1349
- name: config?.name || site.path.split("/").at(-1) || site.path,
1350
- root: site.path,
1351
- description: site.path,
1352
- };
1353
- });
1387
+ return sites.map((site) => ({
1388
+ name: site.config?.name || site.path.split("/").at(-1) || site.path,
1389
+ root: site.path,
1390
+ description: site.path,
1391
+ }));
1354
1392
  },
1355
1393
 
1356
1394
  // ─── AI Assistant (Stack B: OpenAI-compatible SSE proxy) ───────────────────