@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
@@ -10,14 +10,28 @@
10
10
  * produces for the matching built page.
11
11
  */
12
12
 
13
- import { documentUrlPattern as routePattern } from "@jxsuite/site/routes";
13
+ import { documentUrlPattern } from "@jxsuite/site/routes";
14
14
  import { getPlatform } from "./platform";
15
15
  import { loadExtensions } from "./format/format-host";
16
- import type { JxMutableNode, JxPathsDef } from "@jxsuite/schema/types";
16
+ import { isJsonObject, isRef, isString } from "@jxsuite/schema/guards";
17
+ import type {
18
+ JsonObject,
19
+ JsonValue,
20
+ JxDocumentValue,
21
+ JxMutableNode,
22
+ JxPathsDef,
23
+ JxStateDefinition,
24
+ } from "@jxsuite/schema/types";
17
25
 
18
26
  /** Param name → candidate values, in `$paths` declaration order. */
19
27
  export type ParamValues = Record<string, string[]>;
20
28
 
29
+ /** One entry of a resolved ContentCollection, as `/__jx_resolve__` serializes it to JSON. */
30
+ interface ResolvedContentEntry {
31
+ id?: JsonValue;
32
+ data?: JsonObject;
33
+ }
34
+
21
35
  /**
22
36
  * Route derivation is `@jxsuite/site/routes`, re-exported so this module stays the studio's one
23
37
  * import for everything `$params`.
@@ -34,14 +48,21 @@ export { documentUrlPattern, dynamicRouteParams } from "@jxsuite/site/routes";
34
48
  * The `$paths` declaration of an open document. JSON pages carry it on the document root;
35
49
  * format-class pages (markdown) keep it in the frontmatter.
36
50
  *
37
- * @param {{ document?: unknown; frontmatter?: Record<string, unknown> }} doc
51
+ * @param {{
52
+ * document?: JxMutableNode | null;
53
+ * frontmatter?: Record<string, JxDocumentValue | undefined> | null;
54
+ * }} doc
38
55
  * @returns {JxPathsDef | null}
39
56
  */
40
57
  export function pagePathsDef(doc: {
41
58
  document?: JxMutableNode | null;
42
- frontmatter?: Record<string, unknown> | null;
59
+ frontmatter?: Record<string, JxDocumentValue | undefined> | null;
43
60
  }) {
44
- const fromDoc = (doc.document as { $paths?: JxPathsDef } | null | undefined)?.$paths;
61
+ const fromDoc = doc.document?.$paths;
62
+ /* SAFETY: frontmatter `$paths` is the format-page form of the root `$paths` block
63
+ (site-architecture.md §4.3). Its only consumer, loadParamValues, re-checks every JxPathsDef
64
+ shape (array, contentType, values, $ref) before reading it and turns any other value into an
65
+ empty result, so an off-shape block degrades to "no candidates" rather than a crash. */
45
66
  const fromFrontmatter = doc.frontmatter?.$paths as JxPathsDef | undefined;
46
67
  return fromDoc ?? fromFrontmatter ?? null;
47
68
  }
@@ -67,15 +88,15 @@ export function loadParamValues(
67
88
  pathsDef: JxPathsDef | null,
68
89
  ) {
69
90
  if (!pathsDef) {
70
- return Promise.resolve({} as ParamValues);
91
+ return Promise.resolve<ParamValues>({});
71
92
  }
72
93
  const key = `${documentPath ?? ""}::${JSON.stringify(pathsDef)}`;
73
94
  let pending = valueCache.get(key);
74
95
  if (!pending) {
75
- pending = resolveParamValues(pathsDef).catch((error: unknown) => {
96
+ pending = resolveParamValues(pathsDef).catch((error): ParamValues => {
76
97
  valueCache.delete(key);
77
98
  console.warn("page-params: failed to enumerate $paths values:", error);
78
- return {} as ParamValues;
99
+ return {};
79
100
  });
80
101
  valueCache.set(key, pending);
81
102
  }
@@ -104,21 +125,19 @@ async function resolveParamValues(pathsDef: JxPathsDef): Promise<ParamValues> {
104
125
  // Discriminator member on JxPathsDef, so narrow to string. Resolved through the backend's
105
126
  // ContentCollection pipeline (the same one the canvas's ContentEntry uses), so every offered
106
127
  // Value is guaranteed to resolve in preview.
107
- if (
108
- "contentType" in pathsDef &&
109
- typeof pathsDef.contentType === "string" &&
110
- pathsDef.contentType
111
- ) {
128
+ if ("contentType" in pathsDef && isString(pathsDef.contentType) && pathsDef.contentType) {
112
129
  const param = pathsDef.param ?? "slug";
113
130
  const field = pathsDef.field ?? "id";
114
- const entries = (await resolveContentCollection(pathsDef.contentType)) as {
115
- id?: unknown;
116
- data?: Record<string, unknown>;
117
- }[];
118
- const out: ParamValues = { [param]: [] };
119
- if (!Array.isArray(entries)) {
131
+ const resolved = await resolveContentCollection(pathsDef.contentType);
132
+ const out = { [param]: [] } satisfies ParamValues;
133
+ if (!Array.isArray(resolved)) {
120
134
  return out;
121
135
  }
136
+ /* SAFETY: a resolved ContentCollection is its entries array, each `{ id, data }` (the parser's
137
+ ContentLoaderEntry after the JSON hop). Off-shape entries stay harmless: a primitive reads as
138
+ having no id and is skipped, and a null throws on `.id`, which loadParamValues catches and
139
+ degrades to an empty result. */
140
+ const entries = resolved as ResolvedContentEntry[];
122
141
  for (const entry of entries) {
123
142
  pushValue(out, param, field === "id" ? entry.id : (entry.data?.[field] ?? entry.id));
124
143
  }
@@ -128,7 +147,7 @@ async function resolveParamValues(pathsDef: JxPathsDef): Promise<ParamValues> {
128
147
  // Explicit values: { values: ["en", "fr"], param: "lang" }
129
148
  if ("values" in pathsDef && Array.isArray(pathsDef.values)) {
130
149
  const param = pathsDef.param ?? "value";
131
- const out: ParamValues = { [param]: [] };
150
+ const out = { [param]: [] } satisfies ParamValues;
132
151
  for (const value of pathsDef.values) {
133
152
  pushValue(out, param, value);
134
153
  }
@@ -137,17 +156,18 @@ async function resolveParamValues(pathsDef: JxPathsDef): Promise<ParamValues> {
137
156
 
138
157
  // Data file ref: { "$ref": "./data/products.json", param: "id", field: "sku" } — `$ref` also
139
158
  // Reaches here as an open discriminator key, so narrow to a non-empty string.
140
- if ("$ref" in pathsDef && typeof pathsDef.$ref === "string" && pathsDef.$ref) {
159
+ if ("$ref" in pathsDef && isString(pathsDef.$ref) && pathsDef.$ref) {
141
160
  const param = pathsDef.param ?? "id";
142
161
  const field = pathsDef.field ?? "id";
143
162
  const content = await getPlatform().readFile(pathsDef.$ref.replace(/^\.\//, ""));
144
- const data = JSON.parse(content) as unknown;
145
- const out: ParamValues = { [param]: [] };
163
+ // SAFETY: JSON.parse only ever produces JSON values.
164
+ const data = JSON.parse(content) as JsonValue;
165
+ const out = { [param]: [] } satisfies ParamValues;
146
166
  if (!Array.isArray(data)) {
147
167
  return out;
148
168
  }
149
- for (const item of data as Record<string, unknown>[]) {
150
- pushValue(out, param, item?.[field] ?? item?.id ?? item);
169
+ for (const item of data) {
170
+ pushValue(out, param, isJsonObject(item) ? (item[field] ?? item.id ?? item) : item);
151
171
  }
152
172
  return out;
153
173
  }
@@ -179,9 +199,9 @@ async function contentCollectionSrc(): Promise<string> {
179
199
  * fetch on platforms that predate `resolveClass`.
180
200
  *
181
201
  * @param {string} contentType
182
- * @returns {Promise<unknown>}
202
+ * @returns {Promise<JsonValue>}
183
203
  */
184
- async function resolveContentCollection(contentType: string) {
204
+ async function resolveContentCollection(contentType: string): Promise<JsonValue> {
185
205
  const body = {
186
206
  $prototype: "ContentCollection",
187
207
  $src: await contentCollectionSrc(),
@@ -189,26 +209,28 @@ async function resolveContentCollection(contentType: string) {
189
209
  };
190
210
  const platform = getPlatform();
191
211
  if (platform.resolveClass) {
192
- return platform.resolveClass(body);
212
+ /* SAFETY: resolveClass hands back the backend's parsed `/__jx_resolve__` response, and that
213
+ endpoint answers with a JSON body, so the value is a JSON value. */
214
+ return platform.resolveClass(body) as Promise<JsonValue>;
193
215
  }
194
216
  return fetch("/__jx_resolve__", {
195
217
  body: JSON.stringify(body),
196
218
  headers: { "content-type": "application/json" },
197
219
  method: "POST",
198
- }).then((res) => {
220
+ }).then((res): Promise<JsonValue> => {
199
221
  if (!res.ok) {
200
222
  throw new Error(`Class resolution failed: ${res.status}`);
201
223
  }
202
- return res.json() as Promise<unknown>;
224
+ return res.json();
203
225
  });
204
226
  }
205
227
 
206
228
  /**
207
229
  * @param {ParamValues} out
208
230
  * @param {string} param
209
- * @param {unknown} value
231
+ * @param {JsonValue | undefined} value
210
232
  */
211
- function pushValue(out: ParamValues, param: string, value: unknown) {
233
+ function pushValue(out: ParamValues, param: string, value: JsonValue | undefined) {
212
234
  if (value === null || value === undefined || value === "") {
213
235
  return;
214
236
  }
@@ -245,15 +267,15 @@ export function substitutePreviewParams(
245
267
  if (Object.keys(params).length === 0) {
246
268
  return renderDoc;
247
269
  }
248
- const doc = substituteParamRefs(renderDoc, params) as JxMutableNode & {
249
- state?: Record<string, unknown>;
250
- title?: unknown;
251
- };
270
+ /* SAFETY: a render document is a JSON tree (it reaches the canvas iframe by structured clone and
271
+ is serialized back to disk), so its root is a JSON object; substituteObjectRefs rebuilds it key
272
+ for key, replacing only `$params` ref values with strings, so the copy keeps the node's shape. */
273
+ const doc = substituteObjectRefs(renderDoc as JsonObject, params) as JxMutableNode;
252
274
  doc.state ??= {};
253
275
  doc.state.$page = {
254
276
  params: { ...params },
255
- title: typeof doc.title === "string" ? doc.title : "",
256
- url: routePattern(documentPath),
277
+ title: isString(doc.title) ? doc.title : "",
278
+ url: documentUrlPattern(documentPath),
257
279
  };
258
280
  return doc;
259
281
  }
@@ -263,21 +285,20 @@ export function substitutePreviewParams(
263
285
  * These are the entries `substitutePreviewParams` rewrites, and the ones `resolveParamBoundState`
264
286
  * bakes.
265
287
  *
266
- * @param {Record<string, unknown> | null | undefined} state - The ORIGINAL document state (with
267
- * `$ref`s intact — substitution removes the marker)
288
+ * @param {Record<string, JxStateDefinition> | null | undefined} state - The ORIGINAL document state
289
+ * (with `$ref`s intact — substitution removes the marker)
268
290
  * @returns {string[]}
269
291
  */
270
- export function paramBoundStateKeys(state: Record<string, unknown> | null | undefined) {
292
+ export function paramBoundStateKeys(state: Record<string, JxStateDefinition> | null | undefined) {
271
293
  if (!state) {
272
294
  return [];
273
295
  }
274
296
  return Object.keys(state).filter((key) => {
275
- const entry = state[key] as Record<string, unknown> | null;
297
+ const entry = state[key];
276
298
  return (
277
- entry &&
278
- typeof entry === "object" &&
279
- typeof entry.$prototype === "string" &&
280
- typeof entry.$src === "string" &&
299
+ isJsonObject(entry) &&
300
+ isString(entry.$prototype) &&
301
+ isString(entry.$src) &&
281
302
  JSON.stringify(entry).includes('"#/$params/')
282
303
  );
283
304
  });
@@ -306,24 +327,30 @@ export async function resolveParamBoundState(
306
327
  return;
307
328
  }
308
329
  const platform = getPlatform();
309
- if (!platform.resolveClass) {
330
+ const { resolveClass } = platform;
331
+ if (!resolveClass) {
310
332
  return;
311
333
  }
312
- const { state } = renderDoc as { state?: Record<string, unknown> };
334
+ const { state } = renderDoc;
313
335
  if (!state) {
314
336
  return;
315
337
  }
316
338
  await Promise.all(
317
339
  keys.map(async (key) => {
340
+ /* Keys come from paramBoundStateKeys, which only selects plain-object entries; substitution
341
+ keeps such an entry an object unless the whole entry was a param ref (then a string). */
318
342
  const entry = state[key];
319
- if (!entry || typeof entry !== "object") {
343
+ if (!isJsonObject(entry)) {
320
344
  return;
321
345
  }
346
+ const body = { ...entry };
347
+ if (docBase) {
348
+ body.$base = docBase;
349
+ }
322
350
  try {
323
- state[key] = await platform.resolveClass!({
324
- ...(entry as Record<string, unknown>),
325
- ...(docBase ? { $base: docBase } : {}),
326
- });
351
+ /* SAFETY: the backend answers with the class's resolved JSON value (no `$prototype`), which
352
+ the runtime reads as a naked-value state entry, so it is a JxStateDefinition. */
353
+ state[key] = (await resolveClass.call(platform, body)) as JxStateDefinition;
327
354
  } catch (error) {
328
355
  console.warn(`page-params: failed to resolve state.${key} for preview:`, error);
329
356
  }
@@ -332,22 +359,28 @@ export async function resolveParamBoundState(
332
359
  }
333
360
 
334
361
  /**
335
- * @param {unknown} node
362
+ * @param {JsonValue} node
336
363
  * @param {Record<string, string>} params
337
- * @returns {unknown} — a rebuilt copy with matched param refs replaced by literals
364
+ * @returns {JsonValue} — a rebuilt copy with matched param refs replaced by literals
338
365
  */
339
- function substituteParamRefs(node: unknown, params: Record<string, string>): unknown {
366
+ function substituteParamRefs(node: JsonValue, params: Record<string, string>): JsonValue {
340
367
  const replaced = paramRefValue(node, params);
341
368
  if (replaced !== null) {
342
369
  return replaced;
343
370
  }
344
- if (!node || typeof node !== "object") {
345
- return node;
346
- }
347
371
  if (Array.isArray(node)) {
348
372
  return node.map((item) => substituteParamRefs(item, params));
349
373
  }
350
- const out: Record<string, unknown> = {};
374
+ return isJsonObject(node) ? substituteObjectRefs(node, params) : node;
375
+ }
376
+
377
+ /**
378
+ * @param {JsonObject} node
379
+ * @param {Record<string, string>} params
380
+ * @returns {JsonObject} — a rebuilt copy of every member, param refs replaced by literals
381
+ */
382
+ function substituteObjectRefs(node: JsonObject, params: Record<string, string>): JsonObject {
383
+ const out: JsonObject = {};
351
384
  for (const [key, value] of Object.entries(node)) {
352
385
  out[key] = substituteParamRefs(value, params);
353
386
  }
@@ -358,17 +391,13 @@ function substituteParamRefs(node: unknown, params: Record<string, string>): unk
358
391
  * The chosen literal for a `{ "$ref": "#/$params/<name>" }` value, or null when the value is not a
359
392
  * param ref (or no value was chosen for it).
360
393
  *
361
- * @param {unknown} value
394
+ * @param {JsonValue} value
362
395
  * @param {Record<string, string>} params
363
396
  * @returns {string | null}
364
397
  */
365
- function paramRefValue(value: unknown, params: Record<string, string>) {
366
- if (!value || typeof value !== "object" || Array.isArray(value)) {
367
- return null;
368
- }
369
- const ref = (value as { $ref?: unknown }).$ref;
370
- if (typeof ref !== "string" || !ref.startsWith("#/$params/")) {
398
+ function paramRefValue(value: JsonValue, params: Record<string, string>) {
399
+ if (!isRef(value) || !value.$ref.startsWith("#/$params/")) {
371
400
  return null;
372
401
  }
373
- return params[ref.slice("#/$params/".length)] ?? null;
402
+ return params[value.$ref.slice("#/$params/".length)] ?? null;
374
403
  }
@@ -42,6 +42,8 @@ import { disposeActivitySurface, mountActivitySurface } from "../surfaces/panel-
42
42
  import { reactive } from "../reactivity";
43
43
  import { now } from "../services/clock";
44
44
  import { notify } from "../services/notify";
45
+ import type { NotifyOptions } from "../services/notify";
46
+ import type { CommandArgValues } from "../commands/command-args";
45
47
  import { registerPanel } from "./panel-registry";
46
48
  import type { PanelBody } from "./panel-registry";
47
49
  import type {
@@ -179,7 +181,10 @@ export interface ActivityHandle {
179
181
  * The log goes into the notification's `detail`, so the persistent, inspectable error view §16.4
180
182
  * asks for is the Problems row, not a modal that has to stay open to be read.
181
183
  */
182
- fail: (message: string, opts?: { action?: string; path?: string }) => void;
184
+ fail: (
185
+ message: string,
186
+ opts?: { action?: string; actionArgs?: CommandArgValues; path?: string },
187
+ ) => void;
183
188
  }
184
189
 
185
190
  /**
@@ -189,7 +194,7 @@ export interface ActivityHandle {
189
194
  * @returns {ActivityHandle}
190
195
  */
191
196
  export function beginActivity(options: ActivityOptions): ActivityHandle {
192
- const entry: ActivityEntry = {
197
+ const fields = {
193
198
  cancellable: options.cancel !== undefined,
194
199
  endedAt: null,
195
200
  expanded: false,
@@ -200,8 +205,9 @@ export function beginActivity(options: ActivityOptions): ActivityHandle {
200
205
  status: options.status ?? "",
201
206
  steps: (options.steps ?? []).map((label) => ({ label, state: "pending" as const })),
202
207
  title: options.title,
203
- ...(options.source === undefined ? {} : { source: options.source }),
204
- };
208
+ } satisfies ActivityEntry;
209
+ const entry: ActivityEntry =
210
+ options.source === undefined ? fields : { ...fields, source: options.source };
205
211
  if (options.cancel) {
206
212
  _cancels.set(entry.id, options.cancel);
207
213
  }
@@ -209,6 +215,7 @@ export function beginActivity(options: ActivityOptions): ActivityHandle {
209
215
  // The PROXY, not the literal: writing through the raw object a `reactive()` array was handed
210
216
  // Skips every effect depending on it, which is the one bug that would make a running operation
211
217
  // Look frozen. Read back before anything is retired, so the reference is unambiguous.
218
+ // SAFETY: `activities.push(entry)` just above guarantees the array has a last element.
212
219
  const live = activities.at(-1) as ActivityEntry;
213
220
  retireOldest();
214
221
 
@@ -234,7 +241,10 @@ export function beginActivity(options: ActivityOptions): ActivityHandle {
234
241
  finish("done", status);
235
242
  },
236
243
  entry: live,
237
- fail(message: string, opts: { action?: string; path?: string } = {}) {
244
+ fail(
245
+ message: string,
246
+ opts: { action?: string; actionArgs?: CommandArgValues; path?: string } = {},
247
+ ) {
238
248
  // An operation that has already ended does not get to raise a Problem: the first outcome is
239
249
  // The one that happened, and a late `fail()` after a successful `done()` would put a failure
240
250
  // On a list whose whole promise is that everything on it still needs fixing.
@@ -243,12 +253,20 @@ export function beginActivity(options: ActivityOptions): ActivityHandle {
243
253
  }
244
254
  const detail = live.log.join("\n");
245
255
  finish("failed", message);
246
- notify.error(message, {
247
- source: live.source ?? live.title,
248
- ...(detail === "" ? {} : { detail }),
249
- ...(opts.action === undefined ? {} : { action: opts.action }),
250
- ...(opts.path === undefined ? {} : { path: opts.path }),
251
- });
256
+ const notice: NotifyOptions = { source: live.source ?? live.title };
257
+ if (detail !== "") {
258
+ notice.detail = detail;
259
+ }
260
+ if (opts.action !== undefined) {
261
+ notice.action = opts.action;
262
+ }
263
+ if (opts.actionArgs !== undefined) {
264
+ notice.actionArgs = opts.actionArgs;
265
+ }
266
+ if (opts.path !== undefined) {
267
+ notice.path = opts.path;
268
+ }
269
+ notify.error(message, notice);
252
270
  },
253
271
  id: live.id,
254
272
  log(chunk: string) {
@@ -373,8 +391,14 @@ function stepView(step: ActivityStep, index: number): ActivityStepView {
373
391
  };
374
392
  }
375
393
 
376
- /** One operation, as the document reads it. */
377
- function rowView(entry: ActivityEntry): ActivityRowView {
394
+ /**
395
+ * One operation, as a document reads it.
396
+ *
397
+ * Exported because the Activity feed is not its only reader: Publish › Deploys draws a running
398
+ * deploy's steps from the same record (studio.md §22.8), and a second projection of one activity
399
+ * would be a second set of glyphs for the same states.
400
+ */
401
+ export function activityRowView(entry: ActivityEntry): ActivityRowView {
378
402
  const lines = entry.log.length;
379
403
  return {
380
404
  cancellable: entry.cancellable,
@@ -415,7 +439,7 @@ export function activityView(): ActivityView {
415
439
  clearLabel: `Clear ${finished} finished`,
416
440
  hasFinished: finished > 0,
417
441
  hasRows: activities.length > 0,
418
- rows: activities.map((entry) => rowView(entry)),
442
+ rows: activities.map((entry) => activityRowView(entry)),
419
443
  };
420
444
  }
421
445
 
@@ -1,13 +1,13 @@
1
1
  /**
2
2
  * Attached-context.js — the composer's "attach context" message-content convention.
3
3
  *
4
- * Attached context (current page, selected element) is embedded into the user message
5
- * content after a delimiter line: it's the only channel the LLM sees (the streaming
6
- * payload carries message content only) and it persists with the session for free.
7
- * The chat view splits the content back apart to show chips instead of the raw block.
4
+ * Attached context (current page, selected element) is embedded into the user message content after
5
+ * a delimiter line: it's the only channel the LLM sees (the streaming payload carries message
6
+ * content only) and it persists with the session for free. The chat view splits the content back
7
+ * apart to show chips instead of the raw block.
8
8
  *
9
- * The delimiter is a soft convention — a model echoing it would at worst render stray
10
- * chips (no security impact; assistant markdown is sanitized separately).
9
+ * The delimiter is a soft convention — a model echoing it would at worst render stray chips (no
10
+ * security impact; assistant markdown is sanitized separately).
11
11
  *
12
12
  * @license MIT
13
13
  */
@@ -36,8 +36,14 @@ export function buildMessageWithContext(text: string, chips: ContextChip[]): str
36
36
  return `${text}\n\n${ATTACHED_CONTEXT_DELIMITER}\n${lines}`;
37
37
  }
38
38
 
39
+ /** A user message split into its typed body and its attached-context lines. */
40
+ export interface SplitMessage {
41
+ body: string;
42
+ contextLines: string[];
43
+ }
44
+
39
45
  /** Split a user message back into its typed body and any attached-context lines. */
40
- export function splitAttachedContext(content: string): { body: string; contextLines: string[] } {
46
+ export function splitAttachedContext(content: string): SplitMessage {
41
47
  const idx = content.indexOf(`\n\n${ATTACHED_CONTEXT_DELIMITER}\n`);
42
48
  if (idx === -1) {
43
49
  return { body: content, contextLines: [] };
@@ -1,15 +1,15 @@
1
1
  /**
2
2
  * Chat-markdown.ts — memoized markdown rendering for assistant chat messages.
3
3
  *
4
- * Wraps @jxsuite/markup/md-html (sanitized markdown → HTML) with a per-message cache
5
- * keyed by message id + content length, so re-renders during streaming only re-parse
6
- * the message that actually grew.
4
+ * Wraps @jxsuite/markup/md-html (sanitized markdown → HTML) with a per-message cache keyed by
5
+ * message id + content length, so re-renders during streaming only re-parse the message that
6
+ * actually grew.
7
7
  *
8
- * The HTML ends up in `[part="md"]`, the assistant surface's island — this app's ONE injection
9
- * sink — and it goes through the Trusted Types policy on the way THERE, in
10
- * `surfaces/ai-chat.ts`. md-html already sanitizes — raw HTML dropped, javascript: URLs
11
- * stripped — and the policy asserts that it did, rather than taking a comment's word for it. A
12
- * `createHTML` that passed its input through unchanged would satisfy the API and defend nothing.
8
+ * The HTML ends up in `[part="md"]`, the assistant surface's island — this app's ONE injection sink
9
+ * — and it goes through the Trusted Types policy on the way THERE, in `surfaces/ai-chat.ts`.
10
+ * md-html already sanitizes — raw HTML dropped, javascript: URLs stripped — and the policy asserts
11
+ * that it did, rather than taking a comment's word for it. A `createHTML` that passed its input
12
+ * through unchanged would satisfy the API and defend nothing.
13
13
  *
14
14
  * **It returns markup, not a template.** It used to hand back a `TemplateResult` wrapping
15
15
  * `unsafeHTML` (which stringified the trusted value straight back again); the assistant is a Jx