@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
@@ -19,21 +19,21 @@
19
19
 
20
20
  import coreDocumentSchema from "@jxsuite/schema/schema.json";
21
21
  import coreProjectSchema from "@jxsuite/schema/project-schema.json";
22
-
23
- type ValidateFn = ((doc: unknown) => boolean) & {
24
- errors?: { instancePath?: string; message?: string; params?: Record<string, unknown> }[] | null;
25
- };
22
+ import { isJsonObject, isString } from "@jxsuite/schema/guards";
23
+ import type { JsonObject, JsonValue, ProjectConfig } from "@jxsuite/schema/types";
24
+ import type { ValidateFunction } from "ajv/dist/2020.js";
25
+ import type { CandidateDocument } from "./ai-write-report";
26
26
 
27
27
  /** Which of the two entry documents a validator covers. */
28
28
  type SchemaKind = "document" | "project";
29
29
 
30
- const CORE: Record<SchemaKind, object> = {
31
- document: coreDocumentSchema as object,
32
- project: coreProjectSchema as object,
30
+ const CORE: Record<SchemaKind, JsonObject> = {
31
+ document: coreDocumentSchema,
32
+ project: coreProjectSchema,
33
33
  };
34
34
 
35
- const active: Record<SchemaKind, object> = { ...CORE };
36
- const compiling: Record<SchemaKind, Promise<ValidateFn | null> | null> = {
35
+ const active: Record<SchemaKind, JsonObject> = { ...CORE };
36
+ const compiling: Record<SchemaKind, Promise<ValidateFunction | null> | null> = {
37
37
  document: null,
38
38
  project: null,
39
39
  };
@@ -49,9 +49,9 @@ let reportedFailure = false;
49
49
  * unavailable or the schema will not compile.
50
50
  *
51
51
  * @param {SchemaKind} kind - Which entry document to compile
52
- * @returns {Promise<ValidateFn | null>} The compiled validator, or null when unavailable
52
+ * @returns {Promise<ValidateFunction | null>} The compiled validator, or null when unavailable
53
53
  */
54
- function getValidator(kind: SchemaKind): Promise<ValidateFn | null> {
54
+ function getValidator(kind: SchemaKind): Promise<ValidateFunction | null> {
55
55
  compiling[kind] ??= (async () => {
56
56
  try {
57
57
  // The generated schemas are JSON Schema draft 2020-12, so they need Ajv's 2020 build —
@@ -62,7 +62,7 @@ function getValidator(kind: SchemaKind): Promise<ValidateFn | null> {
62
62
  const { default: addFormats } = await import("ajv-formats");
63
63
  const ajv = new Ajv2020({ allErrors: true, strict: false, allowUnionTypes: true });
64
64
  addFormats(ajv);
65
- return ajv.compile(active[kind]) as ValidateFn;
65
+ return ajv.compile(active[kind]);
66
66
  } catch (error) {
67
67
  if (!reportedFailure) {
68
68
  reportedFailure = true;
@@ -78,14 +78,9 @@ function getValidator(kind: SchemaKind): Promise<ValidateFn | null> {
78
78
  return compiling[kind];
79
79
  }
80
80
 
81
- /** A payload half that is usable as a JSON Schema — a non-empty, non-array object. */
82
- function asSchema(value: unknown): object | undefined {
83
- return typeof value === "object" &&
84
- value !== null &&
85
- !Array.isArray(value) &&
86
- Object.keys(value).length > 0
87
- ? (value as object)
88
- : undefined;
81
+ /** Whether a payload half is usable as a JSON Schema — a non-empty, non-array object. */
82
+ function isSchemaObject(value: unknown): value is JsonObject {
83
+ return isJsonObject(value) && Object.keys(value).length > 0;
89
84
  }
90
85
 
91
86
  /**
@@ -107,8 +102,10 @@ export function applyProjectSchemas(
107
102
  * an error envelope under `document` would not fail loudly — it would install a validator that
108
103
  * calls every document valid, and every consumer would go on trusting it.
109
104
  */
110
- const document = asSchema(schemas?.document) ?? CORE.document;
111
- const project = asSchema(schemas?.project) ?? CORE.project;
105
+ const documentHalf = schemas?.document;
106
+ const projectHalf = schemas?.project;
107
+ const document = isSchemaObject(documentHalf) ? documentHalf : CORE.document;
108
+ const project = isSchemaObject(projectHalf) ? projectHalf : CORE.project;
112
109
  const applied = document !== CORE.document || project !== CORE.project;
113
110
  if (document === active.document && project === active.project) {
114
111
  return applied;
@@ -140,13 +137,13 @@ const ERROR_PROPERTY_KEYS = ["unevaluatedProperty", "additionalProperty", "missi
140
137
  * Format ajv errors the way the agent loop consumes them (see ai-tools.ts
141
138
  * `translateValidationError`).
142
139
  *
143
- * @param {ValidateFn} validate - The validator that just ran
140
+ * @param {ValidateFunction} validate - The validator that just ran
144
141
  * @returns {string[]} One formatted string per error
145
142
  */
146
- function formatErrors(validate: ValidateFn): string[] {
143
+ function formatErrors(validate: ValidateFunction): string[] {
147
144
  return (validate.errors || []).map((e) => {
148
- const key = ERROR_PROPERTY_KEYS.find((name) => typeof e.params?.[name] === "string");
149
- const property = key ? ` (${String(e.params?.[key])})` : "";
145
+ const key = ERROR_PROPERTY_KEYS.find((name) => isString(e.params[name]));
146
+ const property = key ? ` (${String(e.params[key])})` : "";
150
147
  return `${e.instancePath || "(root)"}: ${e.message}${property}`;
151
148
  });
152
149
  }
@@ -154,10 +151,10 @@ function formatErrors(validate: ValidateFn): string[] {
154
151
  /**
155
152
  * Validate a Jx document against the active document schema.
156
153
  *
157
- * @param {unknown} doc - Parsed document
154
+ * @param {CandidateDocument} doc - Parsed document
158
155
  * @returns {Promise<string[]>} Formatted error strings; empty when valid or validation unavailable
159
156
  */
160
- export async function validateDoc(doc: unknown): Promise<string[]> {
157
+ export async function validateDoc(doc: CandidateDocument): Promise<string[]> {
161
158
  const validate = await getValidator("document");
162
159
  if (!validate || validate(doc)) {
163
160
  return [];
@@ -176,7 +173,7 @@ export async function validateDoc(doc: unknown): Promise<string[]> {
176
173
  * @param doc - Parsed document
177
174
  * @returns The errors, `[]` when valid, or `null` when no validator could be compiled
178
175
  */
179
- export async function validateDocOrNull(doc: unknown): Promise<string[] | null> {
176
+ export async function validateDocOrNull(doc: CandidateDocument): Promise<string[] | null> {
180
177
  const validate = await getValidator("document");
181
178
  if (!validate) {
182
179
  return null;
@@ -190,10 +187,10 @@ export async function validateDocOrNull(doc: unknown): Promise<string[] | null>
190
187
  * extension's fragment), so this is the only gate that catches a typo'd section key or a misshapen
191
188
  * extension section before the write lands.
192
189
  *
193
- * @param {unknown} config - Parsed project.json
190
+ * @param {ProjectConfig | JsonValue} config - Parsed project.json
194
191
  * @returns {Promise<string[]>} Formatted error strings; empty when valid or validation unavailable
195
192
  */
196
- export async function validateProjectConfig(config: unknown): Promise<string[]> {
193
+ export async function validateProjectConfig(config: ProjectConfig | JsonValue): Promise<string[]> {
197
194
  const validate = await getValidator("project");
198
195
  if (!validate || validate(config)) {
199
196
  return [];
Binary file
@@ -173,12 +173,15 @@ export interface LiveSurfaceDeps {
173
173
  redefineOnCanvases: (doc: JxDocument, base: string) => number;
174
174
  }
175
175
 
176
- /** The sentence a result is said in. Exported so the wording is tested, not only the branch. */
177
- export function liveSaveNotice(result: LiveSurfaceResult): {
176
+ /** How a save's result is announced: the toast key it replaces, its level and its sentence. */
177
+ export interface LiveSaveNotice {
178
178
  key: string;
179
179
  level: "info" | "warn";
180
180
  message: string;
181
- } {
181
+ }
182
+
183
+ /** The sentence a result is said in. Exported so the wording is tested, not only the branch. */
184
+ export function liveSaveNotice(result: LiveSurfaceResult): LiveSaveNotice {
182
185
  const what =
183
186
  result.target.kind === "surface" ? `surface ${result.target.name}` : result.target.tag;
184
187
  const key = `live-chrome:${what}`;
@@ -30,6 +30,14 @@ export function modelUriFor(path: string): string {
30
30
  return ENTRY_SCHEMA_FILES.has(path) ? `file:///.jx/generated/${path}` : `file:///${path}`;
31
31
  }
32
32
 
33
+ /** The two Monaco model URIs one pane's comparison of one file uses. */
34
+ export interface DiffModelUris {
35
+ /** The committed (HEAD) side. */
36
+ head: string;
37
+ /** The working-tree side. */
38
+ work: string;
39
+ }
40
+
33
41
  /**
34
42
  * The two model URIs a comparison's Monaco diff editor mounts at.
35
43
  *
@@ -50,9 +58,9 @@ export function modelUriFor(path: string): string {
50
58
  *
51
59
  * @param {string} paneId
52
60
  * @param {string} path - Project-relative file path
53
- * @returns {{ head: string; work: string }}
61
+ * @returns {DiffModelUris}
54
62
  */
55
- export function diffModelUrisFor(paneId: string, path: string): { head: string; work: string } {
63
+ export function diffModelUrisFor(paneId: string, path: string): DiffModelUris {
56
64
  return {
57
65
  head: `file:///.jx/diff/${paneId}/head/${path}`,
58
66
  work: `file:///.jx/diff/${paneId}/work/${path}`,
@@ -19,6 +19,11 @@
19
19
  * studio's own lazy surfaces runs.
20
20
  */
21
21
 
22
+ /** A document head carrying the batcher's install flag. */
23
+ interface BatchedHead extends HTMLHeadElement {
24
+ __modulePreloadsBatched?: boolean;
25
+ }
26
+
22
27
  const QUEUED: HTMLLinkElement[] = [];
23
28
  let frame: number | null = null;
24
29
  let originalAppend: (<T extends Node>(node: T) => T) | null = null;
@@ -53,15 +58,14 @@ function appendChildPatched<T extends Node>(this: Node, node: T): T {
53
58
  }
54
59
 
55
60
  export function installModulePreloadBatcher(): void {
56
- const { head } = document;
57
- if (
58
- !head ||
59
- (head as HTMLElement & { __modulePreloadsBatched?: boolean }).__modulePreloadsBatched
60
- ) {
61
+ /* SAFETY: a widening. The DOM standard declares `document.head` nullable (a document with no head
62
+ element has none) where lib.dom says it is always there; the install flag is an optional expando
63
+ this module alone writes. */
64
+ const head = document.head as BatchedHead | null;
65
+ if (!head || head.__modulePreloadsBatched) {
61
66
  return;
62
67
  }
63
- const patched = head as HTMLElement & { __modulePreloadsBatched?: boolean };
64
68
  originalAppend = Node.prototype.appendChild.bind(head);
65
- patched.__modulePreloadsBatched = true;
66
- head.appendChild = appendChildPatched as unknown as typeof head.appendChild;
69
+ head.__modulePreloadsBatched = true;
70
+ head.appendChild = appendChildPatched;
67
71
  }
@@ -105,8 +105,10 @@
105
105
  * @docs studio/logic/code
106
106
  */
107
107
 
108
+ import { isFunction, isNonNullObject } from "@jxsuite/schema/guards";
108
109
  import { toRaw } from "../reactivity";
109
110
  import { notify } from "./notify";
111
+ import type { NotifyOptions } from "./notify";
110
112
  import type { Tab } from "../tabs/tab";
111
113
  import { view } from "../view";
112
114
  import { allCanvasSurfaces } from "../canvas/surface-registry";
@@ -114,7 +116,7 @@ import { allCanvasSurfaces } from "../canvas/surface-registry";
114
116
  /** The slice of a Monaco editor this module needs. Both of Studio's Monacos satisfy it. */
115
117
  export interface MonacoBuffer {
116
118
  getValue: () => string;
117
- getModel: () => unknown;
119
+ getModel: () => object | null;
118
120
  hasTextFocus: () => boolean;
119
121
  /** The debounced work armed over THIS buffer. Installed by {@link bufferWrites}. */
120
122
  _writes?: BufferWrites;
@@ -199,6 +201,19 @@ export interface BufferWrites {
199
201
  */
200
202
  export const BUFFER_COMMIT = "commit";
201
203
 
204
+ /**
205
+ * Whether a run answered with a promise to wait for, rather than finishing synchronously.
206
+ *
207
+ * Asked of the thenable shape, not of `instanceof Promise`, because that is what `await` itself
208
+ * asks: whatever the armed work handed back is waited on exactly when `await` would wait on it.
209
+ *
210
+ * @param {void | Promise<void>} result What an armed run (or a flush of one) returned.
211
+ * @returns {boolean}
212
+ */
213
+ function isPending(result: void | Promise<void>): result is Promise<void> {
214
+ return isNonNullObject(result) && isFunction(result.then);
215
+ }
216
+
202
217
  /**
203
218
  * Install (and return) the debounce holder for `buffer`.
204
219
  *
@@ -223,10 +238,10 @@ export function bufferWrites(buffer: MonacoBuffer): BufferWrites {
223
238
  * report.
224
239
  */
225
240
  function track(key: string, result: void | Promise<void>): void | Promise<void> {
226
- if (typeof (result as Promise<void> | undefined)?.then !== "function") {
241
+ if (!isPending(result)) {
227
242
  return result;
228
243
  }
229
- const promise = (result as Promise<void>).finally(() => {
244
+ const promise = result.finally(() => {
230
245
  if (inFlight.get(key) === promise) {
231
246
  inFlight.delete(key);
232
247
  }
@@ -340,18 +355,19 @@ function reportDiscarded(
340
355
  const tab = buffer._editingTab ?? null;
341
356
  const where = tab?.documentPath ?? "Untitled";
342
357
  const { holds, reached, source } = SURFACE[surface];
343
- notify.warn(`${holds} was discarded — it was never ${reached} "${where}".`, {
344
- ...(failure ? { detail: describeCommitFailure(failure.error) } : {}),
345
- key: `buffer-discarded:${surface}:${tab?.id ?? "none"}`,
346
- source,
347
- ...(tab?.documentPath ? { path: tab.documentPath } : {}),
348
- });
358
+ const options: NotifyOptions = failure ? { detail: describeCommitFailure(failure.error) } : {};
359
+ options.key = `buffer-discarded:${surface}:${tab?.id ?? "none"}`;
360
+ options.source = source;
361
+ if (tab?.documentPath) {
362
+ options.path = tab.documentPath;
363
+ }
364
+ notify.warn(`${holds} was discarded — it was never ${reached} "${where}".`, options);
349
365
  return false;
350
366
  }
351
367
 
352
368
  /** What a failed commit is worth showing: the stack when there is one, the value otherwise. */
353
- function describeCommitFailure(error: unknown): string {
354
- return error instanceof Error ? (error.stack ?? error.message) : String(error);
369
+ function describeCommitFailure(cause: unknown): string {
370
+ return cause instanceof Error ? (cause.stack ?? cause.message) : String(cause);
355
371
  }
356
372
 
357
373
  /**
@@ -428,21 +444,21 @@ export function commitBufferWrites(
428
444
  ran, and a live 500ms timer was left over an editor whose container lit was about to replace.
429
445
  A timer reading `""` off a detached model is the exact defect this module was created to
430
446
  prevent, so the teardown below must happen whatever the commit does. */
431
- let pending: Promise<void> | undefined;
447
+ let pending: void | Promise<void>;
432
448
  try {
433
449
  // Fire-and-forget on purpose: the disposer is synchronous, and the commit read `getValue()`
434
450
  // Before its own first `await`. What is left to await is the write INTO the document, which
435
451
  // Does not need this editor to still exist.
436
- pending = writes.flush(BUFFER_COMMIT) as Promise<void> | undefined;
452
+ pending = writes.flush(BUFFER_COMMIT);
437
453
  } catch (error) {
438
454
  writes.cancel();
439
455
  return reportDiscarded(buffer, surface, { error });
440
456
  }
441
457
  writes.cancel();
442
- if (typeof pending?.then === "function") {
458
+ if (isPending(pending)) {
443
459
  void pending.then(
444
460
  () => reportDiscarded(buffer, surface, null),
445
- (error: unknown) => reportDiscarded(buffer, surface, { error }),
461
+ (error) => reportDiscarded(buffer, surface, { error }),
446
462
  );
447
463
  return true;
448
464
  }
@@ -512,20 +528,20 @@ export function bufferMovedOn(buffer: MonacoBuffer, expected?: string): boolean
512
528
  * @returns {MonacoBuffer[]}
513
529
  */
514
530
  function buffersForTab(tab: Tab): MonacoBuffer[] {
515
- const raw = toRaw(tab as object);
531
+ const raw = toRaw(tab);
516
532
  /* Every stage's source buffer, plus the dock's one function editor.
517
533
  The source view is per-PANE now: two Code panes are two Monaco instances over two documents,
518
534
  and a close gate that asked only "the" source editor would have missed whichever one it was
519
535
  not holding — which is the same half-answer that let ⌘W close a tab over unprompted typing. */
520
536
  const mounted: (MonacoBuffer | null)[] = [
521
- ...allCanvasSurfaces().map((surface) => surface.monacoEditor as MonacoBuffer | null),
537
+ ...allCanvasSurfaces().map((surface) => surface.monacoEditor),
522
538
  view.functionEditor,
523
539
  ];
524
540
  return mounted.filter(
525
541
  (buffer): buffer is MonacoBuffer =>
526
542
  buffer != null &&
527
543
  buffer._editingTab != null &&
528
- toRaw(buffer._editingTab as object) === raw &&
544
+ toRaw(buffer._editingTab) === raw &&
529
545
  bufferIsLive(buffer),
530
546
  );
531
547
  }
@@ -598,14 +614,17 @@ export async function commitTabBuffers(tab: Tab): Promise<void> {
598
614
  try {
599
615
  await buffer._writes?.flush(BUFFER_COMMIT);
600
616
  } catch (error) {
617
+ const options: NotifyOptions = {
618
+ detail: describeCommitFailure(error),
619
+ key: `buffer-commit:${tab.id}`,
620
+ source: "Editor",
621
+ };
622
+ if (tab.documentPath) {
623
+ options.path = tab.documentPath;
624
+ }
601
625
  notify.error(
602
626
  `Could not save the editor's contents into "${tab.documentPath ?? "Untitled"}".`,
603
- {
604
- detail: error instanceof Error ? (error.stack ?? error.message) : String(error),
605
- key: `buffer-commit:${tab.id}`,
606
- source: "Editor",
607
- ...(tab.documentPath ? { path: tab.documentPath } : {}),
608
- },
627
+ options,
609
628
  );
610
629
  }
611
630
  }
@@ -26,6 +26,7 @@
26
26
  on the object {@link loadMonaco} resolves to — typing this as the root would make five namespaces
27
27
  look available that are not. `./editor` is exactly the editor API surface that import returns. */
28
28
  import type * as monacoNs from "monaco-editor/editor";
29
+ import type { ProjectSchemasResponse } from "../types";
29
30
 
30
31
  export type Monaco = typeof monacoNs;
31
32
 
@@ -41,7 +42,7 @@ let _loading: Promise<Monaco> | null = null;
41
42
  * which is precisely what the lazy path exists to avoid. So the schemas wait here instead, and the
42
43
  * loader applies whatever is pending once an editor actually needs one.
43
44
  */
44
- let _pendingSchemas: { project?: unknown; document?: unknown } | null = null;
45
+ let _pendingSchemas: ProjectSchemasResponse | null = null;
45
46
  let _pendingSchemasDirty = false;
46
47
 
47
48
  /**
@@ -54,9 +55,7 @@ let _pendingSchemasDirty = false;
54
55
  * @returns Settles once the schemas are in force. Fire-and-forget is a valid use — say so with
55
56
  * `void` at the call site rather than having this hide it.
56
57
  */
57
- export function setProjectSchemasForMonaco(
58
- schemas: { project?: unknown; document?: unknown } | null,
59
- ): Promise<void> {
58
+ export function setProjectSchemasForMonaco(schemas: ProjectSchemasResponse | null): Promise<void> {
60
59
  _pendingSchemas = schemas;
61
60
  _pendingSchemasDirty = true;
62
61
  /* Resolves when the schemas have REACHED Monaco, not when they were queued. With Monaco already
@@ -100,7 +99,7 @@ export function loadMonaco(): Promise<Monaco> {
100
99
  import("monaco-editor/editor"),
101
100
  import("./monaco-setup.js"),
102
101
  ]);
103
- _monaco = monaco as unknown as Monaco;
102
+ _monaco = monaco;
104
103
  // The project's schemas may have arrived long before now; register them before the first editor
105
104
  // Mounts so its very first validation pass uses the right rules.
106
105
  await applyPendingSchemas();
@@ -138,15 +137,15 @@ export function loadedMonaco(): Monaco | null {
138
137
  * attached to anything, and no URI briefly claimed by a model nobody holds.
139
138
  *
140
139
  * @param {Element | null | undefined} container Where the editor was going to be created.
141
- * @param {unknown} existing The surface's editor handle (`view.monacoEditor` /
142
- * `view.functionEditor`). Non-null means another mount already won this race.
140
+ * @param {monacoNs.editor.IEditor | null} existing The surface's editor handle (`view.monacoEditor`
141
+ * / `view.functionEditor`). Non-null means another mount already won this race.
143
142
  * @param {() => boolean} stillTargeted Whether the app still wants exactly THIS mount — the same
144
143
  * tab, the same mode, the same editing target. Lazy: the two cheap clauses above answer first.
145
144
  * @returns {boolean}
146
145
  */
147
146
  export function mountStillWanted(
148
147
  container: Element | null | undefined,
149
- existing: unknown,
148
+ existing: monacoNs.editor.IEditor | null,
150
149
  stillTargeted: () => boolean,
151
150
  ): boolean {
152
151
  if (!container?.isConnected || existing) {
@@ -80,18 +80,24 @@ import "monaco-editor/languages/definitions/javascript/register";
80
80
  import { flattenSchema } from "@jxsuite/schema/project-schemas";
81
81
  import jxSchema from "@jxsuite/schema/schema.json";
82
82
  import projectSchema from "@jxsuite/schema/project-schema.json";
83
+ import type { JsonObject } from "@jxsuite/schema/types";
84
+ import type { ProjectSchemasResponse } from "../types";
83
85
  import { bundleUrl } from "./bundle-base";
84
86
 
85
87
  /* Re-exported for the modules that already imported it from here. New callers should reach for
86
88
  `./model-uri` directly — it is Monaco-free, and importing this module loads the editor. */
87
89
  export { modelUriFor } from "./model-uri";
88
90
 
89
- const WORKER_FILES: Record<string, string> = {
90
- editorWorkerService: "editor.worker.js",
91
- javascript: "ts.worker.js",
92
- json: "json.worker.js",
93
- typescript: "ts.worker.js",
94
- };
91
+ /** The worker every label without a language service of its own runs in. */
92
+ const EDITOR_WORKER_FILE = "editor.worker.js";
93
+
94
+ /** Monaco worker label → the pre-bundled worker file that serves it. */
95
+ const WORKER_FILES = new Map([
96
+ ["editorWorkerService", EDITOR_WORKER_FILE],
97
+ ["javascript", "ts.worker.js"],
98
+ ["json", "json.worker.js"],
99
+ ["typescript", "ts.worker.js"],
100
+ ]);
95
101
 
96
102
  /**
97
103
  * Resolve a Monaco worker to the PRE-BUNDLED copy that ships NEXT TO THE ENTRY — `dist/workers/`
@@ -119,7 +125,7 @@ const WORKER_FILES: Record<string, string> = {
119
125
  * @returns {string} Absolute URL of the worker bundle
120
126
  */
121
127
  export function workerUrl(label: string): string {
122
- const file = WORKER_FILES[label] || WORKER_FILES.editorWorkerService!;
128
+ const file = WORKER_FILES.get(label) ?? EDITOR_WORKER_FILE;
123
129
  return bundleUrl(`workers/${file}`);
124
130
  }
125
131
 
@@ -132,10 +138,13 @@ self.MonacoEnvironment = {
132
138
  /* Monaco caches glyph widths when an editor is created. JetBrains Mono is a
133
139
  vendored webfont (index.html @font-face) and may finish loading after the
134
140
  first editor mounts, so remeasure once all document fonts are ready to keep
135
- cursor and selection alignment correct. */
136
- if (typeof document !== "undefined" && document.fonts?.ready) {
141
+ cursor and selection alignment correct. `lib.dom` declares `document.fonts` unconditionally, but
142
+ DOM shims (happy-dom under test) ship without it, so the font set is typed as possibly absent. */
143
+ const documentFonts: FontFaceSet | undefined =
144
+ typeof document === "undefined" ? undefined : document.fonts;
145
+ if (documentFonts?.ready) {
137
146
  // oxlint-disable-next-line unicorn/prefer-top-level-await -- fire-and-forget: awaiting fonts.ready at top level would block module evaluation (and studio startup) until webfonts load
138
- void document.fonts.ready.then(async () => {
147
+ void documentFonts.ready.then(async () => {
139
148
  const monaco = await import("monaco-editor/editor");
140
149
  monaco.editor.remeasureFonts();
141
150
  });
@@ -186,7 +195,7 @@ const DOCUMENT_ENTRY_SCHEMA_ID = "file:///document.schema.json";
186
195
  * worse, resolved to an empty schema, so the fileMatch registration never ran and REAL violations
187
196
  * went unreported behind that one diagnostic.
188
197
  */
189
- function applyJsonSchemas(documentSchema: unknown, projectJsonSchema: unknown) {
198
+ function applyJsonSchemas(documentSchema: JsonObject, projectJsonSchema: JsonObject) {
190
199
  jsonDefaults.setDiagnosticsOptions({
191
200
  allowComments: false,
192
201
  schemas: [
@@ -212,8 +221,8 @@ function applyJsonSchemas(documentSchema: unknown, projectJsonSchema: unknown) {
212
221
  a URI before the `#` by FETCHING it — with `enableSchemaRequest` off that just fails, leaving
213
222
  `$paths` reporting an unresolvable ref. Flattening rewrites those refs onto the shipped defaults
214
223
  embedded in the same document, which is exactly the right fallback semantics. */
215
- const FALLBACK_DOCUMENT_SCHEMA = flattenSchema(jxSchema as Record<string, unknown>);
216
- const FALLBACK_PROJECT_SCHEMA = flattenSchema(projectSchema as Record<string, unknown>);
224
+ const FALLBACK_DOCUMENT_SCHEMA = flattenSchema(jxSchema);
225
+ const FALLBACK_PROJECT_SCHEMA = flattenSchema(projectSchema);
217
226
 
218
227
  // Bundled core schemas register at module init — the offline fallback every platform starts from.
219
228
  applyJsonSchemas(FALLBACK_DOCUMENT_SCHEMA, FALLBACK_PROJECT_SCHEMA);
@@ -232,9 +241,7 @@ applyJsonSchemas(FALLBACK_DOCUMENT_SCHEMA, FALLBACK_PROJECT_SCHEMA);
232
241
  * @param {object | null} schemas - Pre-bundled `{ document, project }` payload
233
242
  * @returns {boolean} True when per-project schemas were applied; false on fallback
234
243
  */
235
- export function applyProjectSchemas(
236
- schemas: { project?: unknown; document?: unknown } | null | undefined,
237
- ): boolean {
244
+ export function applyProjectSchemas(schemas: ProjectSchemasResponse | null | undefined): boolean {
238
245
  const { document, project } = schemas ?? {};
239
246
  if (!document && !project) {
240
247
  return false;
@@ -34,6 +34,7 @@
34
34
  * this module learning it exists.
35
35
  */
36
36
 
37
+ import type { CommandArgValues } from "../commands/command-args";
37
38
  import { reactive } from "../reactivity";
38
39
  import { announce } from "./announce";
39
40
  import { now } from "./clock";
@@ -87,7 +88,7 @@ export interface NotifyOptions {
87
88
  */
88
89
  action?: string;
89
90
  /** Args passed to {@link NotifyOptions.action} when it runs. */
90
- actionArgs?: Record<string, unknown>;
91
+ actionArgs?: CommandArgValues;
91
92
  /** The long form — a stack, a captured log, a validator's output. Rendered in Problems only. */
92
93
  detail?: string;
93
94
  /** Who reported it: "Save", "Source Control", "Canvas", "Assistant". Groups the Problems list. */
@@ -114,7 +115,7 @@ export interface Notification {
114
115
  /** Epoch ms from {@link now}, so a pinned clock pins the "2m ago" a Problems row renders. */
115
116
  readonly at: number;
116
117
  readonly action?: string;
117
- readonly actionArgs?: Record<string, unknown>;
118
+ readonly actionArgs?: CommandArgValues;
118
119
  readonly detail?: string;
119
120
  readonly source?: string;
120
121
  readonly path?: string;
@@ -158,6 +159,45 @@ function storeFor(tier: NotificationTier): Notification[] {
158
159
  return tier === "problem" ? problems : toasts;
159
160
  }
160
161
 
162
+ /** A record's mutable draft: {@link Notification} is frozen to readers, not to its one builder. */
163
+ type NotificationDraft = { -readonly [K in keyof Notification]: Notification[K] };
164
+
165
+ /**
166
+ * Build the record for one outcome, copying only the options the caller actually set — so a host
167
+ * rendering `record.detail` never meets an explicit `undefined` — in the order every record has
168
+ * always carried its keys.
169
+ */
170
+ function recordFor(
171
+ severity: Severity,
172
+ message: string,
173
+ tier: NotificationTier,
174
+ options: NotifyOptions,
175
+ ): Notification {
176
+ const record: NotificationDraft = { at: now(), id: nextId(), message, severity, tier };
177
+ if (options.action !== undefined) {
178
+ record.action = options.action;
179
+ }
180
+ if (options.actionArgs !== undefined) {
181
+ record.actionArgs = options.actionArgs;
182
+ }
183
+ if (options.detail !== undefined) {
184
+ record.detail = options.detail;
185
+ }
186
+ if (options.source !== undefined) {
187
+ record.source = options.source;
188
+ }
189
+ if (options.path !== undefined) {
190
+ record.path = options.path;
191
+ }
192
+ if (options.key !== undefined) {
193
+ record.key = options.key;
194
+ }
195
+ if (tier === "toast") {
196
+ record.timeoutMs = options.timeoutMs ?? TOAST_LIFETIME_MS[severity];
197
+ }
198
+ return record;
199
+ }
200
+
161
201
  /**
162
202
  * Record an outcome and return it.
163
203
  *
@@ -170,20 +210,7 @@ export function notify(
170
210
  options: NotifyOptions = {},
171
211
  ): Notification {
172
212
  const tier = options.tier ?? DEFAULT_TIER[severity];
173
- const record: Notification = {
174
- at: now(),
175
- id: nextId(),
176
- message,
177
- severity,
178
- tier,
179
- ...(options.action === undefined ? {} : { action: options.action }),
180
- ...(options.actionArgs === undefined ? {} : { actionArgs: options.actionArgs }),
181
- ...(options.detail === undefined ? {} : { detail: options.detail }),
182
- ...(options.source === undefined ? {} : { source: options.source }),
183
- ...(options.path === undefined ? {} : { path: options.path }),
184
- ...(options.key === undefined ? {} : { key: options.key }),
185
- ...(tier === "toast" ? { timeoutMs: options.timeoutMs ?? TOAST_LIFETIME_MS[severity] } : {}),
186
- };
213
+ const record = recordFor(severity, message, tier, options);
187
214
 
188
215
  const store = storeFor(tier);
189
216
  if (record.key !== undefined) {
@@ -273,7 +300,7 @@ export interface ProblemFinding {
273
300
  path?: string;
274
301
  key?: string;
275
302
  action?: string;
276
- actionArgs?: Record<string, unknown>;
303
+ actionArgs?: CommandArgValues;
277
304
  }
278
305
 
279
306
  /**