@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
@@ -8,6 +8,7 @@
8
8
  * (specs/extensions.md §13).
9
9
  */
10
10
 
11
+ import { isFunction } from "@jxsuite/schema/guards";
11
12
  import { getPlatform } from "../platform";
12
13
  import type {
13
14
  DataConnectionsResponse,
@@ -18,7 +19,7 @@ import type {
18
19
  DataRowsQuery,
19
20
  DataRowsResult,
20
21
  DataRowUpdate,
21
- SecretsSetRequest,
22
+ KeyValuePatch,
22
23
  SecretsSetResponse,
23
24
  StudioPlatform,
24
25
  } from "../types";
@@ -34,18 +35,18 @@ function platformOrNull(): StudioPlatform | null {
34
35
 
35
36
  /** True when the platform serves the data grid (the family's gating member is dataRows). */
36
37
  export function dataSurfaceAvailable(): boolean {
37
- return typeof platformOrNull()?.dataRows === "function";
38
+ return isFunction(platformOrNull()?.dataRows);
38
39
  }
39
40
 
40
41
  /** True when the platform can store secret values (backs the "secret" form control). */
41
42
  export function secretsAvailable(): boolean {
42
- return typeof platformOrNull()?.setSecrets === "function";
43
+ return isFunction(platformOrNull()?.setSecrets);
43
44
  }
44
45
 
45
46
  /** Connections with configured state and table names; null when the backend lacks the route. */
46
47
  export async function fetchConnections(): Promise<DataConnectionsResponse | null> {
47
48
  const platform = platformOrNull();
48
- if (typeof platform?.dataConnections !== "function") {
49
+ if (!isFunction(platform?.dataConnections)) {
49
50
  return null;
50
51
  }
51
52
  return platform.dataConnections();
@@ -54,7 +55,7 @@ export async function fetchConnections(): Promise<DataConnectionsResponse | null
54
55
  /** Probe one connection; degrades to an error result instead of throwing. */
55
56
  export async function testConnection(connection: string): Promise<DataConnectionTestResult> {
56
57
  const platform = platformOrNull();
57
- if (typeof platform?.dataConnectionTest !== "function") {
58
+ if (!isFunction(platform?.dataConnectionTest)) {
58
59
  return { error: "Connection tests are not supported by this backend", ok: false };
59
60
  }
60
61
  try {
@@ -70,7 +71,7 @@ export async function pushSchema(opts?: {
70
71
  dryRun?: boolean;
71
72
  }): Promise<DataPushResult> {
72
73
  const platform = platformOrNull();
73
- if (typeof platform?.dataPush !== "function") {
74
+ if (!isFunction(platform?.dataPush)) {
74
75
  return { applied: false, errors: ["Schema push is not supported by this backend"], plan: [] };
75
76
  }
76
77
  try {
@@ -88,10 +89,10 @@ export async function pushSchema(opts?: {
88
89
  function requireMember<K extends keyof StudioPlatform>(name: K): NonNullable<StudioPlatform[K]> {
89
90
  const platform = platformOrNull();
90
91
  const member = platform?.[name];
91
- if (member === undefined || member === null) {
92
+ if (member === undefined) {
92
93
  throw new Error(`The ${String(name)} surface is not supported by this backend`);
93
94
  }
94
- return member as NonNullable<StudioPlatform[K]>;
95
+ return member;
95
96
  }
96
97
 
97
98
  /** Page a table's rows (grid callers handle errors per load). */
@@ -99,11 +100,13 @@ export function fetchRows(query: DataRowsQuery): Promise<DataRowsResult> {
99
100
  return requireMember("dataRows")(query);
100
101
  }
101
102
 
102
- export function insertRow(req: DataRowInsert): Promise<{ row: Record<string, unknown> }> {
103
+ /** Insert one row; the platform answers with the row as stored. */
104
+ export function insertRow(req: DataRowInsert) {
103
105
  return requireMember("dataInsertRow")(req);
104
106
  }
105
107
 
106
- export function updateRow(req: DataRowUpdate): Promise<{ row: Record<string, unknown> }> {
108
+ /** Update one row; the platform answers with the row as stored. */
109
+ export function updateRow(req: DataRowUpdate) {
107
110
  return requireMember("dataUpdateRow")(req);
108
111
  }
109
112
 
@@ -114,14 +117,14 @@ export function deleteRow(req: DataRowDelete): Promise<{ ok: boolean }> {
114
117
  /** Configured secret env-var NAMES; null when the backend has no secrets surface. */
115
118
  export async function listSecretNames(): Promise<string[] | null> {
116
119
  const platform = platformOrNull();
117
- if (typeof platform?.listSecrets !== "function") {
120
+ if (!isFunction(platform?.listSecrets)) {
118
121
  return null;
119
122
  }
120
123
  return platform.listSecrets();
121
124
  }
122
125
 
123
126
  /** Write/remove secrets through the platform store (values flow in, names come back). */
124
- export function saveSecrets(req: SecretsSetRequest): Promise<SecretsSetResponse> {
127
+ export function saveSecrets(req: KeyValuePatch): Promise<SecretsSetResponse> {
125
128
  return requireMember("setSecrets")(req);
126
129
  }
127
130
 
@@ -147,9 +150,10 @@ export function deriveSecretEnvName(
147
150
  .replaceAll(/[^A-Za-z0-9]+/g, "_")
148
151
  .replaceAll(/^_+|_+$/g, "")
149
152
  .toUpperCase();
150
- const parts = [entryKey ?? sectionKey, fieldKey.replace(/Env$/, "")]
151
- .map((part) => constant(part))
152
- .filter(Boolean);
153
+ const parts = [entryKey ?? sectionKey, fieldKey.replace(/Env$/, "")].flatMap((part) => {
154
+ const segment = constant(part);
155
+ return segment ? [segment] : [];
156
+ });
153
157
  const name = parts.join("_") || "SECRET";
154
158
  return /^\d/.test(name) ? `JX_${name}` : name;
155
159
  }
@@ -25,13 +25,14 @@
25
25
  * cancel, and Browse… a button that silently did nothing.
26
26
  *
27
27
  * Only the plain dev-server browser session needs this. Every packaged build has a real native
28
- * dialog that returns a path directly and keeps it — electrobun's `Utils.openFileDialog`, and the
29
- * NixOS chromium build's XDG desktop portal.
28
+ * dialog that returns a path directly and keeps it — the Electron app's native folder dialog, and
29
+ * the NixOS chromium build's XDG desktop portal.
30
30
  *
31
31
  * @docs studio/projects/create
32
32
  */
33
33
 
34
34
  import { LOCATION_ID_FILE } from "@jxsuite/protocol/routes";
35
+ import { isNonNullObject, isString } from "@jxsuite/schema/guards";
35
36
  import { errorMessage } from "@jxsuite/schema/parse";
36
37
 
37
38
  /** Re-exported so a caller wiring up `locate` need not also reach into the protocol package. */
@@ -57,11 +58,20 @@ type ShowDirectoryPicker = (opts?: {
57
58
  startIn?: string;
58
59
  }) => Promise<DirectoryHandle>;
59
60
 
61
+ /** A realm that exposes the File System Access API's folder chooser. */
62
+ type DirectoryPickerRealm = typeof globalThis & { showDirectoryPicker: ShowDirectoryPicker };
63
+
64
+ /**
65
+ * Whether a realm carries `showDirectoryPicker`. The DOM lib this package compiles against does not
66
+ * declare it (the API is Chromium-only), so the global is probed rather than read.
67
+ */
68
+ function hasDirectoryPicker(realm: typeof globalThis): realm is DirectoryPickerRealm {
69
+ return "showDirectoryPicker" in realm && typeof realm.showDirectoryPicker === "function";
70
+ }
71
+
60
72
  /** Whether this browser can open a native folder chooser at all. */
61
73
  export function canPickDirectory(): boolean {
62
- return (
63
- typeof (globalThis as { showDirectoryPicker?: unknown }).showDirectoryPicker === "function"
64
- );
74
+ return hasDirectoryPicker(globalThis);
65
75
  }
66
76
 
67
77
  /** A location id: URL-safe, unguessable enough that a concurrent pick cannot collide. */
@@ -76,13 +86,8 @@ function newLocationId(): string {
76
86
  * `showDirectoryPicker`, a test double) is not `instanceof Error` here, but it still says what it
77
87
  * is.
78
88
  */
79
- function nameOf(error: unknown): string {
80
- return typeof error === "object" &&
81
- error !== null &&
82
- "name" in error &&
83
- typeof error.name === "string"
84
- ? error.name
85
- : "";
89
+ function nameOf(cause: unknown): string {
90
+ return isNonNullObject(cause) && "name" in cause && isString(cause.name) ? cause.name : "";
86
91
  }
87
92
 
88
93
  /**
@@ -111,12 +116,13 @@ function nameOf(error: unknown): string {
111
116
  export async function pickDirectoryPath(
112
117
  locate: (query: { name: string; id: string }) => Promise<string | null>,
113
118
  ): Promise<string | null> {
114
- const show = (globalThis as { showDirectoryPicker?: ShowDirectoryPicker }).showDirectoryPicker;
115
- if (typeof show !== "function") {
119
+ const realm = globalThis;
120
+ if (!hasDirectoryPicker(realm)) {
116
121
  throw new TypeError(
117
122
  "This browser has no folder chooser. Type the folder's path into Location instead.",
118
123
  );
119
124
  }
125
+ const show = realm.showDirectoryPicker;
120
126
 
121
127
  let handle: DirectoryHandle;
122
128
  try {
@@ -42,6 +42,7 @@ import { getBaseUrl, getOpenAiKey } from "./ai-settings";
42
42
  import { preferredModel } from "./ai-models";
43
43
  import { pruneOrphanToolMessages, trimContext } from "./context-manager";
44
44
  import { renderCheck } from "./render-critic";
45
+ import type { CandidateDocument, RenderVerdict } from "./ai-write-report";
45
46
  import { validateDoc } from "./jx-validate";
46
47
  import { reloadFileInTab } from "../files/files";
47
48
  import { getExtensionCatalog, refreshExtensionUi } from "../format/format-host";
@@ -59,6 +60,20 @@ function projectRoot() {
59
60
  return workspace.projectRoot || "";
60
61
  }
61
62
 
63
+ /**
64
+ * The open project's configuration.
65
+ *
66
+ * @returns {ProjectConfig | null}
67
+ */
68
+ function projectConfig(): ProjectConfig | null {
69
+ return workspace.projectConfig;
70
+ }
71
+
72
+ /* SAFETY: renderCheck runs the whole render inside a try and answers `{ ok: false, error }` for
73
+ anything it cannot render, so JSON that is not (yet) a valid document is exactly what it is safe
74
+ to hand; its JxDocument parameter names what renders, not what may be probed. */
75
+ const probeRender = renderCheck as (doc: CandidateDocument) => Promise<RenderVerdict>;
76
+
62
77
  /**
63
78
  * Create a document-assistant session bound to the currently active tab.
64
79
  *
@@ -82,8 +97,10 @@ export function createDocumentAssistant() {
82
97
  `ctx.session`. New Chat starts over; a new session id keeps what the conversation knew. */
83
98
  let sessionFacts = createSessionFacts();
84
99
 
85
- const getProjectStyle = () =>
86
- (workspace.projectConfig as ProjectConfig | null)?.style as Record<string, string> | undefined;
100
+ /* SAFETY: the token tools read only the top-level `--*` keys of the project style block, and skip
101
+ any whose value is not a string, so the nested rule blocks a JxStyle may also hold are never
102
+ read as tokens. */
103
+ const getProjectStyle = () => projectConfig()?.style as Record<string, string> | undefined;
87
104
 
88
105
  const findOpenTab = (path: string): Tab | null => {
89
106
  for (const tab of workspace.tabs.values()) {
@@ -106,9 +123,7 @@ export function createDocumentAssistant() {
106
123
  const plat = getPlatform();
107
124
  await plat.writeFile(relPath, content);
108
125
  },
109
- renderCheck: renderCheck as (
110
- doc: unknown,
111
- ) => Promise<{ ok: true } | { ok: false; error: string }>,
126
+ renderCheck: probeRender,
112
127
  getProjectStyle,
113
128
  findOpenTab,
114
129
  reloadTab: reloadFileInTab,
@@ -126,9 +141,7 @@ export function createDocumentAssistant() {
126
141
  });
127
142
  registerProjectTools(innerRegistry, {
128
143
  getTab: () => activeTab.value,
129
- renderCheck: renderCheck as (
130
- doc: unknown,
131
- ) => Promise<{ ok: true } | { ok: false; error: string }>,
144
+ renderCheck: probeRender,
132
145
  getProjectStyle,
133
146
  findOpenTab,
134
147
  reloadTab: reloadFileInTab,
@@ -221,9 +234,7 @@ export function createDocumentAssistant() {
221
234
  const commandTools = createCommandToolRegistry({
222
235
  getProjectStyle,
223
236
  getTab: () => activeTab.value,
224
- renderCheck: renderCheck as (
225
- doc: unknown,
226
- ) => Promise<{ ok: true } | { ok: false; error: string }>,
237
+ renderCheck: probeRender,
227
238
  validate: validateDoc,
228
239
  });
229
240
  const toolRegistry = composeToolRegistries(
@@ -263,16 +274,21 @@ export function createDocumentAssistant() {
263
274
  be two answers to "what can this project turn on". */
264
275
  const catalog: ExtensionCatalogSummary[] = [];
265
276
  for (const entry of getExtensionCatalog()) {
266
- catalog.push({
277
+ const summary: ExtensionCatalogSummary = {
267
278
  name: entry.name,
268
279
  sections: entry.sections.map((section) => section.key),
269
- ...(entry.title === undefined ? {} : { title: entry.title }),
270
- ...(entry.description === undefined ? {} : { description: entry.description }),
271
- });
280
+ };
281
+ if (entry.title !== undefined) {
282
+ summary.title = entry.title;
283
+ }
284
+ if (entry.description !== undefined) {
285
+ summary.description = entry.description;
286
+ }
287
+ catalog.push(summary);
272
288
  }
273
289
  return buildSystemPrompt({
274
290
  document: tab ? toRaw(tab.doc.document) : undefined,
275
- projectConfig: (workspace.projectConfig as ProjectConfig | null) || undefined,
291
+ projectConfig: projectConfig() || undefined,
276
292
  components: componentRegistry.length > 0 ? componentRegistry : undefined,
277
293
  projectRoot: workspace.projectRoot || undefined,
278
294
  hasProject: Boolean(workspace.projectRoot),
@@ -285,8 +301,9 @@ export function createDocumentAssistant() {
285
301
  /* Read per turn from the live registry — a projected tool the gate will honour this round is
286
302
  listed this round, and one it will not is not. */
287
303
  commandTools: commandToolBlurbs(activeRegistry()),
288
- ...(inventory && inventory.length > 0 ? { fileInventory: inventory } : {}),
289
- ...(catalog.length > 0 ? { extensionCatalog: catalog } : {}),
304
+ // Absent and undefined read the same: every option is destructured without a default.
305
+ fileInventory: inventory && inventory.length > 0 ? inventory : undefined,
306
+ extensionCatalog: catalog.length > 0 ? catalog : undefined,
290
307
  });
291
308
  }
292
309
 
@@ -347,7 +364,7 @@ export function createDocumentAssistant() {
347
364
  baseUrl: getBaseUrl() || undefined,
348
365
  /* The persisted conversation, so the backend can keep its rounds on one warm prompt cache.
349
366
  Sent to the backend only, which hashes it before any provider sees it (specs/ai.md §2.5). */
350
- sessionId: sessionId ?? undefined,
367
+ sessionId,
351
368
  });
352
369
 
353
370
  if (sessionFacts.sessionId !== sessionId) {
@@ -480,6 +497,9 @@ export function createDocumentAssistant() {
480
497
  */
481
498
  function pushRestoredMessages(msgs: sessionStore.PersistedMessage[]) {
482
499
  for (const m of backfillToolResults(msgs)) {
500
+ /* SAFETY: every persisted message was written by persistChat from a live message (its role,
501
+ tool calls and timestamp included) and its call results were restored by
502
+ backfillToolResults above; only the id a legacy entry may lack is synthesized here. */
483
503
  chatState.messages.push({
484
504
  ...m,
485
505
  id: m.id || `restored_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`,
@@ -13,7 +13,7 @@
13
13
  * @license MIT
14
14
  */
15
15
 
16
- import type { ToolContext, ToolDefinition, ToolRegistry } from "@jxsuite/ai/tools";
16
+ import type { ToolArguments, ToolContext, ToolDefinition, ToolRegistry } from "@jxsuite/ai/tools";
17
17
 
18
18
  export interface ToolAvailability {
19
19
  /** Whether the tool is currently advertised/executable. */
@@ -48,17 +48,21 @@ export function createGatedToolRegistry(
48
48
  },
49
49
  listForLLM() {
50
50
  const available = new Set(this.list().map((t) => t.name));
51
- return inner
52
- .listForLLM()
53
- .filter((t) => available.has((t as { function?: { name?: string } }).function?.name ?? ""));
51
+ return inner.listForLLM().filter((t) => {
52
+ /* SAFETY: a @jxsuite/ai registry lists each tool in OpenAI function-calling form,
53
+ `{ type: "function", function: { name, … } }`; the registry interface types the entries
54
+ as bare objects, and the optional chain still answers "" for any other shape. */
55
+ const tool = t as { function?: { name?: string } };
56
+ return available.has(tool.function?.name ?? "");
57
+ });
54
58
  },
55
59
  getDefinition(toolName: string) {
56
60
  return inner.getDefinition(toolName);
57
61
  },
58
- validate(toolName: string, args: object) {
62
+ validate(toolName: string, args: ToolArguments) {
59
63
  return inner.validate(toolName, args);
60
64
  },
61
- async execute(toolName: string, args: object, ctx?: ToolContext) {
65
+ async execute(toolName: string, args: ToolArguments, ctx?: ToolContext) {
62
66
  if (inner.getDefinition(toolName) && !isAvailable(toolName)) {
63
67
  const gate = availability.get(toolName);
64
68
  return {
@@ -11,11 +11,30 @@
11
11
 
12
12
  import type { createChatState } from "@jxsuite/ai/chat-state";
13
13
  import type { HarnessEvent, TurnOutcome } from "@jxsuite/ai/harness";
14
+ import { isJsonObject, isNumber, isString } from "@jxsuite/schema/guards";
14
15
  import type { ImportProgressEvent } from "../../types";
15
16
  import { recordImportProgress } from "../import-run";
16
17
 
17
18
  type ChatStore = ReturnType<typeof createChatState>;
18
19
 
20
+ /**
21
+ * Whether a tool's progress payload is an import progress line. The engine carries progress as
22
+ * opaque JSON; only the import tool reports any, and only in this shape. Exported so the test
23
+ * harness's tool context records exactly what this reducer records.
24
+ */
25
+ export function isImportProgressEvent(value: unknown): value is ImportProgressEvent {
26
+ if (!isJsonObject(value)) {
27
+ return false;
28
+ }
29
+ const { phase, message, current, total } = value;
30
+ return (
31
+ isString(phase) &&
32
+ isString(message) &&
33
+ (current === undefined || isNumber(current)) &&
34
+ (total === undefined || isNumber(total))
35
+ );
36
+ }
37
+
19
38
  /** How a turn's end reads in the transcript: the cap message, an error row, or nothing more. */
20
39
  function applyOutcome(chat: ChatStore, outcome: TurnOutcome): void {
21
40
  switch (outcome.kind) {
@@ -96,7 +115,10 @@ export function applyHarnessEvent(chat: ChatStore, event: HarnessEvent): void {
96
115
  break;
97
116
  }
98
117
  case "tool_progress": {
99
- recordImportProgress(event.callId, event.progress as unknown as ImportProgressEvent);
118
+ // A call that is not an import run has no record to update either way.
119
+ if (isImportProgressEvent(event.progress)) {
120
+ recordImportProgress(event.callId, event.progress);
121
+ }
100
122
  break;
101
123
  }
102
124
  case "tool_result": {
@@ -18,6 +18,7 @@ import type {
18
18
  ImportSiteOptions,
19
19
  ImportSiteSummary,
20
20
  } from "../types";
21
+ import { isJsonObject } from "@jxsuite/schema/guards";
21
22
  import type { ProjectConfig } from "@jxsuite/schema/types";
22
23
 
23
24
  /**
@@ -29,6 +30,34 @@ import type { ProjectConfig } from "@jxsuite/schema/types";
29
30
  */
30
31
  export const IMPORT_WARNING_PHASE = "warning";
31
32
 
33
+ /** The request headers: JSON, plus the caller's AI credentials when it has them. */
34
+ interface ImportRequestHeaders {
35
+ "Content-Type": string;
36
+ "X-Api-Key"?: string;
37
+ "X-Api-Base-URL"?: string;
38
+ }
39
+
40
+ /** The JSON body the import-site route reads; `model` travels as `aiModel`. */
41
+ interface ImportRequestBody {
42
+ url: string;
43
+ directory: string;
44
+ depth: number;
45
+ maxPages: number;
46
+ aiComponents: boolean;
47
+ breakpoints?: ImportSiteOptions["breakpoints"];
48
+ aiModel?: ImportSiteOptions["model"];
49
+ verify?: boolean;
50
+ verifyThreshold?: number;
51
+ verifyMinFidelity?: number;
52
+ }
53
+
54
+ /** What a `done` line settles the stream with. */
55
+ export interface ImportStreamResult {
56
+ root: string;
57
+ config: ProjectConfig;
58
+ result?: ImportSiteSummary;
59
+ }
60
+
32
61
  interface StreamLine {
33
62
  type: string;
34
63
  phase?: string;
@@ -58,8 +87,8 @@ export async function streamImport(
58
87
  onProgress: (evt: ImportProgressEvent) => void,
59
88
  signal?: AbortSignal,
60
89
  onReady?: (evt: ImportReadyEvent) => void,
61
- ): Promise<{ root: string; config: ProjectConfig; result?: ImportSiteSummary }> {
62
- const headers: Record<string, string> = { "Content-Type": "application/json" };
90
+ ): Promise<ImportStreamResult> {
91
+ const headers: ImportRequestHeaders = { "Content-Type": "application/json" };
63
92
  if (opts.apiKey) {
64
93
  headers["X-Api-Key"] = opts.apiKey;
65
94
  }
@@ -67,32 +96,46 @@ export async function streamImport(
67
96
  headers["X-Api-Base-URL"] = opts.baseUrl;
68
97
  }
69
98
 
70
- const res = await fetch(endpoint, {
71
- body: JSON.stringify({
72
- url: opts.url,
73
- directory: opts.directory,
74
- depth: opts.depth,
75
- maxPages: opts.maxPages,
76
- aiComponents: opts.aiComponents,
77
- ...(opts.breakpoints === undefined ? {} : { breakpoints: opts.breakpoints }),
78
- ...(opts.model === undefined ? {} : { aiModel: opts.model }),
79
- ...(opts.verify === undefined ? {} : { verify: opts.verify }),
80
- ...(opts.verifyThreshold === undefined ? {} : { verifyThreshold: opts.verifyThreshold }),
81
- ...(opts.verifyMinFidelity === undefined
82
- ? {}
83
- : { verifyMinFidelity: opts.verifyMinFidelity }),
84
- }),
85
- headers,
99
+ const request: ImportRequestBody = {
100
+ url: opts.url,
101
+ directory: opts.directory,
102
+ depth: opts.depth,
103
+ maxPages: opts.maxPages,
104
+ aiComponents: opts.aiComponents,
105
+ };
106
+ if (opts.breakpoints !== undefined) {
107
+ request.breakpoints = opts.breakpoints;
108
+ }
109
+ if (opts.model !== undefined) {
110
+ request.aiModel = opts.model;
111
+ }
112
+ if (opts.verify !== undefined) {
113
+ request.verify = opts.verify;
114
+ }
115
+ if (opts.verifyThreshold !== undefined) {
116
+ request.verifyThreshold = opts.verifyThreshold;
117
+ }
118
+ if (opts.verifyMinFidelity !== undefined) {
119
+ request.verifyMinFidelity = opts.verifyMinFidelity;
120
+ }
121
+ // The spread is a plain record copy: an interface is not assignable to the `HeadersInit` record.
122
+ const init: RequestInit = {
123
+ body: JSON.stringify(request),
124
+ headers: { ...headers },
86
125
  method: "POST",
87
- ...(signal === undefined ? {} : { signal }),
88
- });
126
+ };
127
+ if (signal !== undefined) {
128
+ init.signal = signal;
129
+ }
130
+ const res = await fetch(endpoint, init);
89
131
 
90
132
  if (!res.ok) {
91
133
  let message = `Import failed (${res.status})`;
92
134
  try {
93
- const body = (await res.json()) as { error?: string };
94
- if (body.error) {
95
- message = body.error;
135
+ const body: unknown = await res.json();
136
+ // `new Error()` stringifies a non-string message, so String() keeps any `error` value's text.
137
+ if (isJsonObject(body) && body.error) {
138
+ message = String(body.error);
96
139
  }
97
140
  } catch {
98
141
  /* Non-JSON error body — keep the status message. */
@@ -106,7 +149,7 @@ export async function streamImport(
106
149
  const reader = res.body.getReader();
107
150
  const decoder = new TextDecoder();
108
151
  let buffer = "";
109
- let result: { root: string; config: ProjectConfig; result?: ImportSiteSummary } | null = null;
152
+ let result: ImportStreamResult | null = null;
110
153
  /*
111
154
  * Lines the parser could not read. Tolerating one is right — an import that ran for two minutes
112
155
  * should not die on a garbled progress line — but doing it *silently* is not: the import then
@@ -115,37 +158,47 @@ export async function streamImport(
115
158
  */
116
159
  let unreadable = 0;
117
160
 
118
- const handleLine = (line: string) => {
161
+ /** Apply one line; a `done` line's result is returned for the read loop to keep. */
162
+ const handleLine = (line: string): ImportStreamResult | undefined => {
119
163
  const trimmed = line.trim();
120
164
  if (!trimmed) {
121
- return;
165
+ return undefined;
122
166
  }
123
167
  let parsed: StreamLine;
124
168
  try {
169
+ /* SAFETY: the import-site route writes every line as JSON.stringify of one stream line
170
+ object with a string `type`, and every other member is optional; each branch below
171
+ compares `type` to a literal and checks the members it reads before using them. */
125
172
  parsed = JSON.parse(trimmed) as StreamLine;
126
173
  } catch {
127
174
  unreadable += 1;
128
- return; // Tolerate a mangled line rather than killing the whole import.
175
+ return undefined; // Tolerate a mangled line rather than killing the whole import.
129
176
  }
130
177
  if (parsed.type === "progress") {
131
- onProgress({
178
+ const progress: ImportProgressEvent = {
132
179
  phase: parsed.phase ?? "",
133
180
  message: parsed.message ?? "",
134
- ...(parsed.current === undefined ? {} : { current: parsed.current }),
135
- ...(parsed.total === undefined ? {} : { total: parsed.total }),
136
- });
181
+ };
182
+ if (parsed.current !== undefined) {
183
+ progress.current = parsed.current;
184
+ }
185
+ if (parsed.total !== undefined) {
186
+ progress.total = parsed.total;
187
+ }
188
+ onProgress(progress);
137
189
  } else if (parsed.type === "ready" && parsed.root !== undefined) {
138
190
  onReady?.({ root: parsed.root });
139
191
  } else if (parsed.type === "done" && parsed.root !== undefined && parsed.config) {
140
- result = {
141
- root: parsed.root,
142
- config: parsed.config,
143
- ...(parsed.result === undefined ? {} : { result: parsed.result }),
144
- };
192
+ const settled: ImportStreamResult = { root: parsed.root, config: parsed.config };
193
+ if (parsed.result !== undefined) {
194
+ settled.result = parsed.result;
195
+ }
196
+ return settled;
145
197
  } else if (parsed.type === "error") {
146
198
  throw new Error(parsed.error || "Import failed");
147
199
  }
148
200
  // Heartbeats and unknown line types are ignored.
201
+ return undefined;
149
202
  };
150
203
 
151
204
  try {
@@ -159,10 +212,10 @@ export async function streamImport(
159
212
  const lines = buffer.split("\n");
160
213
  buffer = lines.pop() ?? "";
161
214
  for (const line of lines) {
162
- handleLine(line);
215
+ result = handleLine(line) ?? result;
163
216
  }
164
217
  }
165
- handleLine(buffer);
218
+ result = handleLine(buffer) ?? result;
166
219
  } finally {
167
220
  try {
168
221
  await reader.cancel();
@@ -5,8 +5,8 @@
5
5
  * the turn and runs the import as a tool call. This holds what the form gathered for the one turn
6
6
  * that consumes it.
7
7
  *
8
- * **Module state, and deliberately NOT a copy of `agent-seed.ts`.** That one uses localStorage keyed
9
- * by project root because the project it seeds opens in a NEW WINDOW, and the key is the
8
+ * **Module state, and deliberately NOT a copy of `agent-seed.ts`.** That one uses localStorage
9
+ * keyed by project root because the project it seeds opens in a NEW WINDOW, and the key is the
10
10
  * cross-window channel. Neither half of that applies here: the project does not exist yet at
11
11
  * hand-off time, so there is no root to key on, and the assistant taking the turn is in this window
12
12
  * — `import_site` is `no-project` tiered precisely because it runs before there is a project. A
@@ -18,6 +18,12 @@
18
18
 
19
19
  import type { ImportBreakpointPolicy } from "../types";
20
20
 
21
+ /**
22
+ * The deepest crawl the import pipeline accepts: the bound `packages/server/src/import-api.ts`
23
+ * clamps to, which both the wizard's depth field and `import_site` honour.
24
+ */
25
+ export const MAX_IMPORT_DEPTH = 5;
26
+
21
27
  /** What the wizard gathered, as the tool needs it. */
22
28
  export interface ImportBrief {
23
29
  /** Absolute http(s) URL of the site to clone. */