@jxsuite/studio 6.1.0 → 6.1.2

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 (645) hide show
  1. package/dist/chunks/2020-f2gkpy8d.js +4 -0
  2. package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
  3. package/dist/chunks/adapter-4912g339.js +4 -0
  4. package/dist/chunks/cf-account-picker-wccaenh6.js +4 -0
  5. package/dist/chunks/cf-settings-br6105tr.js +4 -0
  6. package/dist/chunks/color-28ksk2qm.js +4 -0
  7. package/dist/chunks/color-area-0fj8a4ga.js +4 -0
  8. package/dist/chunks/color-field-xch8kx2g.js +4 -0
  9. package/dist/chunks/color-slider-jxd8v350.js +4 -0
  10. package/dist/chunks/combobox-p0efwjke.js +4 -0
  11. package/dist/chunks/components-db68vsn7.js +4 -0
  12. package/dist/chunks/content-source-1449qesq.js +4 -0
  13. package/dist/chunks/convert-to-repeater-5h457egj.js +4 -0
  14. package/dist/chunks/dialog-c4x05vyx.js +4 -0
  15. package/dist/chunks/editor-x9jn86a7.js +4 -0
  16. package/dist/chunks/entry-commands-may24cpt.js +4 -0
  17. package/dist/chunks/extension-sections-pvr14vxr.js +4 -0
  18. package/dist/chunks/file-ops-x9v54pcj.js +4 -0
  19. package/dist/chunks/files-j3knqf0s.js +4 -0
  20. package/dist/chunks/format-host-tyre2trb.js +4 -0
  21. package/dist/chunks/fs-events-64ma9htc.js +4 -0
  22. package/dist/chunks/git-panel-84ps5dex.js +4 -0
  23. package/dist/chunks/grid-view-d2wq9ezg.js +51 -0
  24. package/dist/chunks/icons-pnfz478q.js +4 -0
  25. package/dist/chunks/iframe-entry-fvbk89gm.js +5 -0
  26. package/dist/chunks/iframe-entry-jdcktez8.js +5 -0
  27. package/dist/chunks/iframe-entry-x0ygf2yr.js +5 -0
  28. package/dist/chunks/iframe-entry-zap785cw.js +5 -0
  29. package/dist/chunks/iframe-host-ck6vejt5.js +4 -0
  30. package/dist/chunks/index-b8xw3vy9.js +4 -0
  31. package/dist/chunks/{index-gybvv7a6.js → index-zpjmzqfk.js} +3 -3
  32. package/dist/chunks/{javascript-rnvdp3k4.js → javascript-m54mnwp6.js} +3 -3
  33. package/dist/chunks/jsonMode-w15cmrcm.js +13 -0
  34. package/dist/chunks/jx-validate-at3zn8wa.js +4 -0
  35. package/dist/chunks/layers-h4xp1pss.js +4 -0
  36. package/dist/chunks/layers-panel-m5hw1d7g.js +4 -0
  37. package/dist/chunks/listbox-e74qjyq6.js +4 -0
  38. package/dist/chunks/lit-html-8t8t3dnr.js +4 -0
  39. package/dist/chunks/media-picker-2cweexc5.js +4 -0
  40. package/dist/chunks/menu-n6yzswmy.js +4 -0
  41. package/dist/chunks/menu-ynw13y0s.js +4 -0
  42. package/dist/chunks/monaco-binding-7gx83x3r.js +4 -0
  43. package/dist/chunks/monaco-buffer-qzxn567r.js +4 -0
  44. package/dist/chunks/monaco-setup-gxf6656g.js +4 -0
  45. package/dist/chunks/notify-cj5zbrs2.js +4 -0
  46. package/dist/chunks/number-field-y62xq0ty.js +4 -0
  47. package/dist/chunks/parse-b7ddhr8m.js +4 -0
  48. package/dist/chunks/platform-3dfws9js.js +4 -0
  49. package/dist/chunks/popover-jt2gxmzs.js +4 -0
  50. package/dist/chunks/publish-panel-1gvxbj21.js +4 -0
  51. package/dist/chunks/quick-search-0dajrwqg.js +4 -0
  52. package/dist/chunks/references-49qgt404.js +4 -0
  53. package/dist/chunks/right-panel-jm1bwe53.js +4 -0
  54. package/dist/chunks/section-registry-6kwc4fky.js +4 -0
  55. package/dist/chunks/select-rzds841e.js +4 -0
  56. package/dist/chunks/split-n2gfpm5m.js +4 -0
  57. package/dist/chunks/{studio-5g0ag7c0.js → studio-0q988f9w.js} +3 -3
  58. package/dist/chunks/studio-0rt52vpq.js +5 -0
  59. package/dist/chunks/studio-18vgbhs5.js +5 -0
  60. package/dist/chunks/{studio-pxg4ap1e.js → studio-1fxkaaea.js} +4 -4
  61. package/dist/chunks/studio-24mccdrj.js +5 -0
  62. package/dist/chunks/studio-2eh507zk.js +9 -0
  63. package/dist/chunks/studio-2hcbccfv.js +5 -0
  64. package/dist/chunks/studio-2j1cb95x.js +5 -0
  65. package/dist/chunks/studio-2jbs3rxv.js +5 -0
  66. package/dist/chunks/{studio-qbj760tx.js → studio-485046te.js} +7 -7
  67. package/dist/chunks/studio-4h8k4dw9.js +5 -0
  68. package/dist/chunks/studio-5f6n18kx.js +5 -0
  69. package/dist/chunks/studio-5gthpky6.js +5 -0
  70. package/dist/chunks/studio-5ve6bbep.js +5 -0
  71. package/dist/chunks/studio-6ep3js6b.js +9 -0
  72. package/dist/chunks/studio-6wkmf3wz.js +9 -0
  73. package/dist/chunks/studio-841rf3cg.js +5 -0
  74. package/dist/chunks/studio-8gmwgheg.js +5 -0
  75. package/dist/chunks/studio-8qm0ep50.js +5 -0
  76. package/dist/chunks/{studio-anyrgzvb.js → studio-90pq9km1.js} +4 -4
  77. package/dist/chunks/studio-924p1tm1.js +6 -0
  78. package/dist/chunks/{studio-v2bvmbjj.js → studio-a3g98wjr.js} +4 -4
  79. package/dist/chunks/studio-a3shpz9y.js +5 -0
  80. package/dist/chunks/studio-amsbaaar.js +6 -0
  81. package/dist/chunks/studio-at5spjbc.js +7 -0
  82. package/dist/chunks/studio-b2xv945e.js +5 -0
  83. package/dist/chunks/studio-bn5nkafw.js +5 -0
  84. package/dist/chunks/studio-bw6q5xjf.js +9 -0
  85. package/dist/chunks/studio-c7q0t9x1.js +5 -0
  86. package/dist/chunks/studio-camnhc96.js +6 -0
  87. package/dist/chunks/studio-cffqvnzd.js +5 -0
  88. package/dist/chunks/studio-d81xfh1g.js +5 -0
  89. package/dist/chunks/studio-dgz8d0c1.js +5 -0
  90. package/dist/chunks/studio-efvfrsf8.js +5 -0
  91. package/dist/chunks/studio-er30bpcx.js +5 -0
  92. package/dist/chunks/studio-ezscgr64.js +5 -0
  93. package/dist/chunks/studio-ffrrncvz.js +5 -0
  94. package/dist/chunks/studio-fpphgn8y.js +10 -0
  95. package/dist/chunks/studio-j1kvhdjk.js +4 -0
  96. package/dist/chunks/{studio-txjjzrsm.js → studio-j430n16g.js} +5 -5
  97. package/dist/chunks/studio-jjkg84nj.js +5 -0
  98. package/dist/chunks/studio-m0q32ars.js +4 -0
  99. package/dist/chunks/studio-m6bdst11.js +5 -0
  100. package/dist/chunks/studio-nv2cptd4.js +64 -0
  101. package/dist/chunks/studio-nwfrc98n.js +5 -0
  102. package/dist/chunks/studio-p1wgvp7r.js +5 -0
  103. package/dist/chunks/studio-pag2wncm.js +5 -0
  104. package/dist/chunks/studio-qvanvzfd.js +5 -0
  105. package/dist/chunks/studio-qwa64kt7.js +5 -0
  106. package/dist/chunks/studio-rk1zc4x3.js +928 -0
  107. package/dist/chunks/studio-se2r3ptc.js +5 -0
  108. package/dist/chunks/studio-sg2a0dh0.js +5 -0
  109. package/dist/chunks/studio-tjzjhe68.js +5 -0
  110. package/dist/chunks/{studio-0x3jyb8r.js → studio-tq0rtfwj.js} +4 -4
  111. package/dist/chunks/{studio-cpxkgjrj.js → studio-v0jzqdjm.js} +4 -4
  112. package/dist/chunks/studio-v2w7q8r1.js +7 -0
  113. package/dist/chunks/studio-v5vjq1h0.js +4 -0
  114. package/dist/chunks/studio-v8aga3vp.js +14 -0
  115. package/dist/chunks/studio-vfcdrfmv.js +5 -0
  116. package/dist/chunks/studio-vmfkgdjf.js +5 -0
  117. package/dist/chunks/studio-wt1816jj.js +5 -0
  118. package/dist/chunks/studio-wz73q5kq.js +4 -0
  119. package/dist/chunks/studio-y04qtxvp.js +7 -0
  120. package/dist/chunks/studio-y21g8zzg.js +5 -0
  121. package/dist/chunks/studio-y64hrt8p.js +12 -0
  122. package/dist/chunks/studio-ynn90f58.js +16 -0
  123. package/dist/chunks/studio-yxz682sx.js +5 -0
  124. package/dist/chunks/studio-zp7snvkq.js +5 -0
  125. package/dist/chunks/studio-zq4z6tm6.js +5 -0
  126. package/dist/chunks/swatch-group-ewh24n1f.js +4 -0
  127. package/dist/chunks/tabs-f5cw3tgp.js +4 -0
  128. package/dist/chunks/textfield-wewc8rq2.js +4 -0
  129. package/dist/chunks/toast-c9fn075p.js +4 -0
  130. package/dist/chunks/toast-host-ke5z4ng7.js +4 -0
  131. package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
  132. package/dist/chunks/tooltip-5v8ngwj2.js +4 -0
  133. package/dist/chunks/tree-mdq3v5cw.js +4 -0
  134. package/dist/chunks/tsMode-sf49ee9x.js +14 -0
  135. package/dist/chunks/workspace-jtfahpee.js +4 -0
  136. package/dist/chunks/ws-client-nze0k6mv.js +4 -0
  137. package/dist/iframe-entry.js +16 -16
  138. package/dist/manifest.json +63 -63
  139. package/dist/studio.js +98 -98
  140. package/dist/workers/ts.worker.js +3 -3
  141. package/package.json +11 -11
  142. package/src/about/about-modal.ts +4 -3
  143. package/src/account/action-flow.ts +45 -38
  144. package/src/account-status.ts +7 -2
  145. package/src/browse/library-layouts.ts +8 -5
  146. package/src/browse/library-model.ts +18 -6
  147. package/src/browse/library-pane.ts +37 -21
  148. package/src/browse/library-preview.ts +14 -9
  149. package/src/browse/library-source.ts +1 -1
  150. package/src/canvas/asset-refs.ts +24 -9
  151. package/src/canvas/asset-resolve.ts +19 -23
  152. package/src/canvas/canvas-helpers.ts +7 -6
  153. package/src/canvas/canvas-live-render.ts +44 -53
  154. package/src/canvas/canvas-patcher.ts +30 -30
  155. package/src/canvas/canvas-perf.ts +11 -5
  156. package/src/canvas/canvas-render.ts +66 -42
  157. package/src/canvas/canvas-surface.ts +5 -3
  158. package/src/canvas/canvas-utils.ts +163 -64
  159. package/src/canvas/dialog-path.ts +9 -4
  160. package/src/canvas/dialog-state.ts +1 -2
  161. package/src/canvas/diff-marks.ts +9 -16
  162. package/src/canvas/diff-toolbar.ts +8 -7
  163. package/src/canvas/edit-width-drag.ts +4 -1
  164. package/src/canvas/edit-width.ts +1 -3
  165. package/src/canvas/iframe-channel.ts +27 -13
  166. package/src/canvas/iframe-drop.ts +13 -12
  167. package/src/canvas/iframe-editable-root.ts +29 -16
  168. package/src/canvas/iframe-entry.ts +80 -63
  169. package/src/canvas/iframe-eval.ts +73 -49
  170. package/src/canvas/iframe-host.ts +203 -118
  171. package/src/canvas/iframe-inline-edit.ts +69 -32
  172. package/src/canvas/iframe-insert.ts +5 -4
  173. package/src/canvas/iframe-interaction.ts +37 -26
  174. package/src/canvas/iframe-overlay.ts +1 -1
  175. package/src/canvas/iframe-patch.ts +18 -15
  176. package/src/canvas/iframe-position.ts +12 -6
  177. package/src/canvas/iframe-protocol.ts +15 -16
  178. package/src/canvas/iframe-render.ts +41 -36
  179. package/src/canvas/iframe-slash.ts +24 -11
  180. package/src/canvas/iframe-subtree.ts +6 -2
  181. package/src/canvas/path-mapping.ts +19 -12
  182. package/src/canvas/popover-path.ts +7 -3
  183. package/src/canvas/popover-state.ts +1 -2
  184. package/src/canvas/serialize-scope.ts +13 -5
  185. package/src/canvas/stage-scrollbar.ts +2 -1
  186. package/src/canvas/surface-registry.ts +21 -3
  187. package/src/collab/collab-commands.ts +7 -2
  188. package/src/collab/collab-session.ts +84 -45
  189. package/src/collab/collab-state.ts +4 -3
  190. package/src/collab/monaco-binding.ts +16 -13
  191. package/src/collab/monaco-cursors.ts +5 -2
  192. package/src/commands/budget.ts +3 -3
  193. package/src/commands/command-args.ts +103 -71
  194. package/src/commands/context.ts +22 -20
  195. package/src/commands/defaults.ts +4 -1
  196. package/src/commands/keymap.ts +47 -43
  197. package/src/commands/levels.ts +3 -3
  198. package/src/commands/live-context.ts +10 -8
  199. package/src/commands/reference.ts +2 -1
  200. package/src/commands/registry.ts +12 -10
  201. package/src/commands/run-reported.ts +15 -10
  202. package/src/component-props.ts +46 -30
  203. package/src/content/collection-match.ts +5 -4
  204. package/src/content/draft-state.ts +4 -3
  205. package/src/content/entry-commands.ts +3 -2
  206. package/src/content/entry-editor.ts +29 -17
  207. package/src/content/entry-fields.ts +12 -7
  208. package/src/content/entry-model.ts +21 -12
  209. package/src/editor/canvas-context-menu.ts +1 -2
  210. package/src/editor/canvas-slash-bridge.ts +3 -6
  211. package/src/editor/content-slice.ts +16 -14
  212. package/src/editor/context-menu.ts +35 -22
  213. package/src/editor/convert-targets.ts +30 -35
  214. package/src/editor/convert-to-component.ts +11 -5
  215. package/src/editor/convert-to-repeater.ts +34 -22
  216. package/src/editor/editable-tags.ts +17 -2
  217. package/src/editor/file-drop-action.ts +21 -22
  218. package/src/editor/inline-edit-apply.ts +35 -17
  219. package/src/editor/inline-edit.ts +66 -50
  220. package/src/editor/inline-format.ts +59 -56
  221. package/src/editor/inline-link.ts +40 -15
  222. package/src/editor/insert-zone-action.ts +1 -1
  223. package/src/editor/merge-tags.ts +58 -19
  224. package/src/editor/repeater-scope.ts +39 -28
  225. package/src/editor/shortcuts.ts +87 -47
  226. package/src/editor/slash-menu.ts +1 -6
  227. package/src/files/asset-versions.ts +4 -4
  228. package/src/files/components.ts +15 -10
  229. package/src/files/elements.ts +5 -6
  230. package/src/files/file-ops.ts +77 -36
  231. package/src/files/files.ts +90 -95
  232. package/src/files/media-meta.ts +2 -1
  233. package/src/files/media-paths.ts +6 -1
  234. package/src/files/serialize-document.ts +2 -2
  235. package/src/format/constraints.ts +1 -1
  236. package/src/format/convert-file.ts +27 -13
  237. package/src/format/format-choices.ts +2 -1
  238. package/src/format/format-host.ts +76 -50
  239. package/src/github/github-auth-status.ts +27 -3
  240. package/src/github/github-auth.ts +19 -9
  241. package/src/github/github-publish.ts +24 -20
  242. package/src/grid/cell-editors.ts +46 -31
  243. package/src/grid/cell-popovers.ts +5 -3
  244. package/src/grid/edit-buffer.ts +10 -9
  245. package/src/grid/grid-controller.ts +20 -22
  246. package/src/grid/grid-layout.ts +21 -5
  247. package/src/grid/grid-open.ts +3 -6
  248. package/src/grid/grid-panel.ts +11 -4
  249. package/src/grid/grid-source.ts +8 -8
  250. package/src/grid/grid-view.ts +14 -17
  251. package/src/grid/redirects-grid.ts +14 -5
  252. package/src/grid/redirects.ts +16 -14
  253. package/src/grid/schema-columns.ts +25 -19
  254. package/src/grid/sources/connector-source.ts +47 -20
  255. package/src/grid/sources/content-source.ts +25 -24
  256. package/src/grid/sources/csv-file-source.ts +2 -2
  257. package/src/grid/tabulator-tables.d.ts +55 -34
  258. package/src/hosting/stage.ts +7 -7
  259. package/src/i18n/i18n-commands.ts +1 -2
  260. package/src/media/media-pane.ts +4 -1
  261. package/src/new-project/add-repo-modal.ts +20 -19
  262. package/src/new-project/import-tab.ts +10 -14
  263. package/src/new-project/location-fields.ts +2 -1
  264. package/src/new-project/new-project-modal.ts +12 -9
  265. package/src/packages/jxsuite-update.ts +4 -3
  266. package/src/packages/pull-package-sync.ts +26 -25
  267. package/src/page-params.ts +97 -68
  268. package/src/panels/activity-panel.ts +17 -9
  269. package/src/panels/ai-chat/attached-context.ts +13 -7
  270. package/src/panels/ai-chat/chat-view.ts +80 -73
  271. package/src/panels/ai-chat/composer.ts +30 -33
  272. package/src/panels/ai-chat/sessions-view.ts +1 -2
  273. package/src/panels/ai-panel.ts +23 -20
  274. package/src/panels/block-action-bar.ts +46 -35
  275. package/src/panels/bottom-dock.ts +5 -3
  276. package/src/panels/canvas-dnd-bridge.ts +31 -24
  277. package/src/panels/data-explorer.ts +62 -25
  278. package/src/panels/data-grid.ts +14 -11
  279. package/src/panels/dnd.ts +108 -118
  280. package/src/panels/editors.ts +55 -22
  281. package/src/panels/elements-panel.ts +10 -3
  282. package/src/panels/events-panel.ts +84 -69
  283. package/src/panels/formula-workspace.ts +76 -51
  284. package/src/panels/frontmatter-fields.ts +24 -19
  285. package/src/panels/frontmatter-panel.ts +44 -34
  286. package/src/panels/git-diff-open.ts +4 -4
  287. package/src/panels/git-panel.ts +49 -61
  288. package/src/panels/head-panel.ts +131 -111
  289. package/src/panels/i18n-panel.ts +10 -3
  290. package/src/panels/imports-panel.ts +23 -47
  291. package/src/panels/jump-bar.ts +48 -29
  292. package/src/panels/layers-panel.ts +97 -74
  293. package/src/panels/left-panel.ts +3 -3
  294. package/src/panels/pane-context.ts +31 -22
  295. package/src/panels/pane-grid.ts +49 -20
  296. package/src/panels/panel-registry.ts +22 -37
  297. package/src/panels/properties-panel.ts +175 -121
  298. package/src/panels/quick-search.ts +53 -31
  299. package/src/panels/right-panel.ts +3 -3
  300. package/src/panels/seo-modal.ts +13 -17
  301. package/src/panels/settings-menu.ts +15 -15
  302. package/src/panels/signals-panel.ts +153 -131
  303. package/src/panels/statement-editor.ts +230 -140
  304. package/src/panels/style-panel.ts +254 -216
  305. package/src/panels/style-utils.ts +114 -51
  306. package/src/panels/stylebook-doc.ts +57 -54
  307. package/src/panels/stylebook-layers-panel.ts +9 -9
  308. package/src/panels/stylebook-panel.ts +13 -17
  309. package/src/panels/tab-drop.ts +27 -11
  310. package/src/panels/tab-strip.ts +36 -26
  311. package/src/platform-errors.ts +57 -43
  312. package/src/platform.ts +58 -30
  313. package/src/platforms/cloud.ts +345 -175
  314. package/src/platforms/default-platform.ts +10 -4
  315. package/src/platforms/devserver.ts +174 -127
  316. package/src/platforms/read-batcher.ts +16 -8
  317. package/src/project-list.ts +2 -1
  318. package/src/publish/deploy-checklist.ts +8 -2
  319. package/src/publish/pages-service.ts +28 -13
  320. package/src/publish/publish-commands.ts +5 -4
  321. package/src/publish/publish-panel.ts +10 -6
  322. package/src/recent-projects.ts +15 -8
  323. package/src/resize-edges.ts +26 -36
  324. package/src/services/a11y-report.ts +26 -19
  325. package/src/services/agent-seed.ts +23 -11
  326. package/src/services/ai-ask.ts +9 -12
  327. package/src/services/ai-command-tools.ts +68 -62
  328. package/src/services/ai-import-tools.ts +80 -67
  329. package/src/services/ai-models.ts +17 -13
  330. package/src/services/ai-project-tools.ts +68 -32
  331. package/src/services/ai-session-store.ts +19 -10
  332. package/src/services/ai-system-prompt.ts +46 -20
  333. package/src/services/ai-tools.ts +71 -27
  334. package/src/services/ai-write-report.ts +20 -12
  335. package/src/services/ai-writes.ts +4 -4
  336. package/src/services/automation.ts +58 -31
  337. package/src/services/cem-export.ts +149 -58
  338. package/src/services/clock.ts +6 -1
  339. package/src/services/code-services.ts +37 -31
  340. package/src/services/context-manager.ts +14 -10
  341. package/src/services/context-resolver.ts +20 -8
  342. package/src/services/data-service.ts +19 -15
  343. package/src/services/directory-picker.ts +18 -12
  344. package/src/services/document-assistant.ts +39 -19
  345. package/src/services/gated-registry.ts +10 -6
  346. package/src/services/harness/chat-reducer.ts +23 -1
  347. package/src/services/import-client.ts +91 -38
  348. package/src/services/import-seed.ts +8 -2
  349. package/src/services/jx-validate.ts +28 -31
  350. package/src/services/live-preview.ts +0 -0
  351. package/src/services/live-surfaces.ts +6 -3
  352. package/src/services/model-uri.ts +10 -2
  353. package/src/services/module-preloads.ts +12 -8
  354. package/src/services/monaco-buffer.ts +43 -24
  355. package/src/services/monaco-lazy.ts +7 -8
  356. package/src/services/monaco-setup.ts +23 -16
  357. package/src/services/notify.ts +44 -17
  358. package/src/services/popover-report.ts +25 -10
  359. package/src/services/preview-eval.ts +20 -8
  360. package/src/services/profile.ts +13 -6
  361. package/src/services/project-path.ts +13 -10
  362. package/src/services/references.ts +0 -0
  363. package/src/services/render-critic.ts +8 -7
  364. package/src/services/settings/kernel.ts +13 -4
  365. package/src/services/settings/write-queue.ts +9 -9
  366. package/src/services/token-lint.ts +12 -10
  367. package/src/services/tool-executor.ts +17 -5
  368. package/src/services/tool-outcomes.ts +44 -24
  369. package/src/services/trusted-types.ts +24 -7
  370. package/src/settings/contexts-section.ts +11 -8
  371. package/src/settings/contributed-section.ts +79 -60
  372. package/src/settings/css-vars-editor.ts +37 -16
  373. package/src/settings/defs-editor.ts +38 -35
  374. package/src/settings/extension-rows.ts +16 -8
  375. package/src/settings/extension-sections.ts +23 -13
  376. package/src/settings/extensions-section.ts +4 -1
  377. package/src/settings/general-settings.ts +11 -8
  378. package/src/settings/locales-section.ts +20 -12
  379. package/src/settings/preferences-dialog.ts +9 -6
  380. package/src/settings/preferences-keymap.ts +7 -5
  381. package/src/settings/preferences-sections.ts +11 -5
  382. package/src/settings/project-sections.ts +1 -1
  383. package/src/settings/schema-field-ui.ts +9 -0
  384. package/src/settings/settings-document.ts +5 -5
  385. package/src/shell/tree.ts +6 -5
  386. package/src/shell.ts +104 -81
  387. package/src/site-context.ts +37 -22
  388. package/src/state.ts +41 -49
  389. package/src/store.ts +54 -34
  390. package/src/studio.ts +39 -77
  391. package/src/style/live-preview.ts +1 -1
  392. package/src/style/project-styles.ts +6 -7
  393. package/src/style/token-ref.ts +5 -4
  394. package/src/surfaces/about.ts +18 -19
  395. package/src/surfaces/add-repo.ts +17 -19
  396. package/src/surfaces/ai-chat.ts +31 -36
  397. package/src/surfaces/ai-credentials-form.ts +6 -16
  398. package/src/surfaces/ai-managed-connect.ts +3 -4
  399. package/src/surfaces/ai-model-picker.ts +3 -5
  400. package/src/surfaces/block-action-bar.ts +22 -11
  401. package/src/surfaces/boot-failure.ts +4 -5
  402. package/src/surfaces/bottom-dock.ts +9 -18
  403. package/src/surfaces/canvas-stage.ts +12 -11
  404. package/src/surfaces/cf-account-picker.ts +17 -18
  405. package/src/surfaces/commandbar.ts +14 -9
  406. package/src/surfaces/convert-repeater.ts +17 -19
  407. package/src/surfaces/data-actions.ts +9 -7
  408. package/src/surfaces/dialog.ts +26 -28
  409. package/src/surfaces/diff-toolbar.ts +9 -7
  410. package/src/surfaces/doc-header.ts +10 -19
  411. package/src/surfaces/empty-state.ts +7 -10
  412. package/src/surfaces/entry-editor.ts +14 -11
  413. package/src/surfaces/expression-editor.ts +11 -25
  414. package/src/surfaces/files-panel.ts +27 -14
  415. package/src/surfaces/formula-palette.ts +4 -5
  416. package/src/surfaces/git-panel.ts +7 -15
  417. package/src/surfaces/github-auth.ts +16 -20
  418. package/src/surfaces/github-publish.ts +17 -22
  419. package/src/surfaces/grid-cell.ts +30 -31
  420. package/src/surfaces/grid-open.ts +10 -14
  421. package/src/surfaces/grid-panel.ts +13 -9
  422. package/src/surfaces/grid-replace.ts +13 -13
  423. package/src/surfaces/grid-views.ts +15 -18
  424. package/src/surfaces/inspector-dock.ts +13 -12
  425. package/src/surfaces/jump-bar.ts +5 -6
  426. package/src/surfaces/jxsuite-update.ts +16 -22
  427. package/src/surfaces/library-pane.ts +25 -20
  428. package/src/surfaces/logic-panel.ts +17 -30
  429. package/src/surfaces/logic-workspace.ts +13 -15
  430. package/src/surfaces/media-browser.ts +11 -10
  431. package/src/surfaces/media-field.ts +4 -5
  432. package/src/surfaces/media-pane.ts +8 -7
  433. package/src/surfaces/menu.ts +29 -23
  434. package/src/surfaces/navigator-dock.ts +11 -12
  435. package/src/surfaces/new-project.ts +27 -26
  436. package/src/surfaces/pane-context.ts +20 -25
  437. package/src/surfaces/pane-grid.ts +15 -10
  438. package/src/surfaces/panel-activity.ts +5 -6
  439. package/src/surfaces/panel-data.ts +3 -4
  440. package/src/surfaces/panel-deploy-checklist.ts +5 -6
  441. package/src/surfaces/panel-elements.ts +5 -7
  442. package/src/surfaces/panel-i18n.ts +5 -7
  443. package/src/surfaces/panel-imports.ts +6 -13
  444. package/src/surfaces/panel-outline.ts +25 -19
  445. package/src/surfaces/panel-page.ts +11 -18
  446. package/src/surfaces/panel-problems.ts +5 -7
  447. package/src/surfaces/panel-signals.ts +20 -34
  448. package/src/surfaces/panel-stylebook-layers.ts +5 -8
  449. package/src/surfaces/preferences.ts +21 -11
  450. package/src/surfaces/progress-modal.ts +15 -9
  451. package/src/surfaces/properties-panel.json +1 -1
  452. package/src/surfaces/properties-panel.ts +20 -42
  453. package/src/surfaces/publish.ts +18 -18
  454. package/src/surfaces/push-plan.ts +7 -8
  455. package/src/surfaces/rail.json +126 -73
  456. package/src/surfaces/rail.ts +38 -12
  457. package/src/surfaces/reference-field.ts +11 -15
  458. package/src/surfaces/schema-builder.ts +16 -22
  459. package/src/surfaces/schema-form.ts +15 -25
  460. package/src/surfaces/secret-field.ts +9 -6
  461. package/src/surfaces/seo.ts +21 -15
  462. package/src/surfaces/settings-contexts.ts +9 -7
  463. package/src/surfaces/settings-contributed.ts +14 -10
  464. package/src/surfaces/settings-css-vars.ts +5 -12
  465. package/src/surfaces/settings-defs.json +2 -2
  466. package/src/surfaces/settings-defs.ts +17 -21
  467. package/src/surfaces/settings-deploy.ts +8 -15
  468. package/src/surfaces/settings-extensions.ts +5 -6
  469. package/src/surfaces/settings-head.ts +33 -39
  470. package/src/surfaces/settings-locales.ts +8 -20
  471. package/src/surfaces/settings-overview.ts +5 -6
  472. package/src/surfaces/settings-packages.ts +8 -7
  473. package/src/surfaces/settings-pane.ts +9 -18
  474. package/src/surfaces/settings-rawjson.ts +5 -6
  475. package/src/surfaces/shell.ts +1 -2
  476. package/src/surfaces/slash-menu.ts +19 -9
  477. package/src/surfaces/statements.ts +13 -18
  478. package/src/surfaces/statusbar.ts +17 -14
  479. package/src/surfaces/style-panel.ts +18 -31
  480. package/src/surfaces/stylebook-chrome.ts +3 -5
  481. package/src/surfaces/tab-strip.ts +14 -13
  482. package/src/surfaces/target-line.ts +6 -7
  483. package/src/surfaces/welcome.ts +5 -7
  484. package/src/tabs/patch-ops.ts +4 -3
  485. package/src/tabs/project-config.ts +32 -21
  486. package/src/tabs/selection.ts +36 -8
  487. package/src/tabs/tab.ts +52 -41
  488. package/src/tabs/transact.ts +98 -53
  489. package/src/tabs/typing.ts +31 -0
  490. package/src/types.ts +32 -17
  491. package/src/ui/ai-credentials-form.ts +10 -13
  492. package/src/ui/ai-model-picker.ts +3 -3
  493. package/src/ui/cf-account-picker.ts +7 -9
  494. package/src/ui/color-selector.ts +9 -5
  495. package/src/ui/dynamic-slot.ts +7 -8
  496. package/src/ui/expression-editor.ts +112 -105
  497. package/src/ui/form-controls.ts +57 -48
  498. package/src/ui/formula-catalog.ts +239 -230
  499. package/src/ui/formula-chips.ts +33 -18
  500. package/src/ui/layers.ts +44 -31
  501. package/src/ui/media-picker.ts +18 -9
  502. package/src/ui/popover-surface.ts +20 -12
  503. package/src/ui/progress-modal.ts +13 -8
  504. package/src/ui/regions.ts +7 -6
  505. package/src/ui/schema-form.ts +113 -70
  506. package/src/ui/surface.ts +71 -8
  507. package/src/ui/timing.ts +9 -0
  508. package/src/ui/value-source.ts +44 -31
  509. package/src/ui/virtual-window.ts +3 -2
  510. package/src/utils/base64.ts +3 -1
  511. package/src/utils/edit-display.ts +103 -74
  512. package/src/utils/element-selectors.ts +3 -2
  513. package/src/utils/google-fonts.ts +15 -14
  514. package/src/utils/inherited-style.ts +18 -20
  515. package/src/utils/link-target.ts +1 -1
  516. package/src/utils/preview-format.ts +25 -3
  517. package/src/utils/strip-events.ts +49 -22
  518. package/src/utils/studio-utils.ts +29 -14
  519. package/src/view.ts +2 -3
  520. package/src/workspace/pane-derive.ts +10 -12
  521. package/src/workspace/session.ts +53 -43
  522. package/src/workspace/workspace.ts +47 -36
  523. package/dist/chunks/2020-nkxms0ay.js +0 -4
  524. package/dist/chunks/adapter-m948ab5f.js +0 -4
  525. package/dist/chunks/cf-account-picker-n8hr38v7.js +0 -4
  526. package/dist/chunks/cf-settings-356xdtne.js +0 -4
  527. package/dist/chunks/color-area-jqhna8zy.js +0 -4
  528. package/dist/chunks/color-field-embq5ctg.js +0 -4
  529. package/dist/chunks/color-fpezvnkt.js +0 -4
  530. package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
  531. package/dist/chunks/combobox-773hdzyj.js +0 -4
  532. package/dist/chunks/components-yk3t844e.js +0 -4
  533. package/dist/chunks/content-source-bawmyc09.js +0 -4
  534. package/dist/chunks/convert-to-repeater-7wns8kf1.js +0 -4
  535. package/dist/chunks/dialog-mtm9fq5t.js +0 -4
  536. package/dist/chunks/editor-6sc8nacq.js +0 -4
  537. package/dist/chunks/entry-commands-8ay9fh81.js +0 -4
  538. package/dist/chunks/extension-sections-na7rj3nr.js +0 -4
  539. package/dist/chunks/file-ops-gye0qw56.js +0 -4
  540. package/dist/chunks/files-dmc2xvcq.js +0 -4
  541. package/dist/chunks/format-host-t76b53f8.js +0 -4
  542. package/dist/chunks/fs-events-cg4tpz06.js +0 -4
  543. package/dist/chunks/git-panel-yef7bshy.js +0 -4
  544. package/dist/chunks/grid-view-7tt4bxw1.js +0 -51
  545. package/dist/chunks/icons-qbh8akb1.js +0 -4
  546. package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
  547. package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
  548. package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
  549. package/dist/chunks/iframe-host-tmz30gfp.js +0 -4
  550. package/dist/chunks/index-nag78a9h.js +0 -4
  551. package/dist/chunks/jsonMode-zhwsprqk.js +0 -13
  552. package/dist/chunks/jx-validate-3gbp5nkn.js +0 -4
  553. package/dist/chunks/layers-fvz99859.js +0 -4
  554. package/dist/chunks/layers-panel-gchmbf9p.js +0 -4
  555. package/dist/chunks/listbox-s8fkmnq8.js +0 -4
  556. package/dist/chunks/lit-html-9agdspkt.js +0 -4
  557. package/dist/chunks/media-picker-rhjvyy00.js +0 -4
  558. package/dist/chunks/menu-2e4y9j7b.js +0 -4
  559. package/dist/chunks/menu-37d07z9m.js +0 -4
  560. package/dist/chunks/monaco-binding-2jnhjjvr.js +0 -4
  561. package/dist/chunks/monaco-buffer-rp21359g.js +0 -4
  562. package/dist/chunks/monaco-setup-vhh7gayr.js +0 -4
  563. package/dist/chunks/notify-h3www560.js +0 -4
  564. package/dist/chunks/number-field-gw7sq8rn.js +0 -4
  565. package/dist/chunks/parse-897fvqah.js +0 -4
  566. package/dist/chunks/platform-hz34wcd7.js +0 -4
  567. package/dist/chunks/popover-8htra4er.js +0 -4
  568. package/dist/chunks/publish-panel-exsmjzyj.js +0 -4
  569. package/dist/chunks/quick-search-pgaqeh0m.js +0 -4
  570. package/dist/chunks/references-2cgdxnb8.js +0 -4
  571. package/dist/chunks/right-panel-jf856w5w.js +0 -4
  572. package/dist/chunks/section-registry-jnf8r5gy.js +0 -4
  573. package/dist/chunks/select-n3v7gwas.js +0 -4
  574. package/dist/chunks/split-pff8f3ze.js +0 -4
  575. package/dist/chunks/studio-0f55h9ye.js +0 -5
  576. package/dist/chunks/studio-0sqdhnew.js +0 -12
  577. package/dist/chunks/studio-19x1c75w.js +0 -5
  578. package/dist/chunks/studio-2sqcndak.js +0 -5
  579. package/dist/chunks/studio-3aey7dd3.js +0 -5
  580. package/dist/chunks/studio-3bpdkq2s.js +0 -5
  581. package/dist/chunks/studio-47y6fbpf.js +0 -5
  582. package/dist/chunks/studio-4m3826v2.js +0 -5
  583. package/dist/chunks/studio-4nx2dj1g.js +0 -4
  584. package/dist/chunks/studio-4xv5s47r.js +0 -9
  585. package/dist/chunks/studio-5g4t8v6w.js +0 -5
  586. package/dist/chunks/studio-5py436sf.js +0 -5
  587. package/dist/chunks/studio-77kt594t.js +0 -5
  588. package/dist/chunks/studio-8f87n763.js +0 -10
  589. package/dist/chunks/studio-8mb00b84.js +0 -5
  590. package/dist/chunks/studio-8p51gq2h.js +0 -6
  591. package/dist/chunks/studio-954ds834.js +0 -5
  592. package/dist/chunks/studio-9ft45c83.js +0 -9
  593. package/dist/chunks/studio-a2138x5k.js +0 -7
  594. package/dist/chunks/studio-a9yzstqj.js +0 -5
  595. package/dist/chunks/studio-acdksxx6.js +0 -5
  596. package/dist/chunks/studio-ar8jcf2y.js +0 -5
  597. package/dist/chunks/studio-bmn4mn9j.js +0 -7
  598. package/dist/chunks/studio-e7xxa0sj.js +0 -5
  599. package/dist/chunks/studio-ecaz25vk.js +0 -5
  600. package/dist/chunks/studio-ery42sqr.js +0 -4
  601. package/dist/chunks/studio-fzdywr6p.js +0 -9
  602. package/dist/chunks/studio-g5fmf0c1.js +0 -5
  603. package/dist/chunks/studio-g7nse7zb.js +0 -5
  604. package/dist/chunks/studio-geq1ea6k.js +0 -14
  605. package/dist/chunks/studio-ghkb32r8.js +0 -5
  606. package/dist/chunks/studio-ghrhy2y7.js +0 -5
  607. package/dist/chunks/studio-grawhey1.js +0 -5
  608. package/dist/chunks/studio-h0xgswew.js +0 -5
  609. package/dist/chunks/studio-h9c4p2tx.js +0 -5
  610. package/dist/chunks/studio-jyzj5cxs.js +0 -5
  611. package/dist/chunks/studio-mgx8yhnz.js +0 -64
  612. package/dist/chunks/studio-mpb04y1d.js +0 -6
  613. package/dist/chunks/studio-n17mty64.js +0 -5
  614. package/dist/chunks/studio-nwh2eqsk.js +0 -6
  615. package/dist/chunks/studio-q1h883bt.js +0 -16
  616. package/dist/chunks/studio-q4tv82h7.js +0 -9
  617. package/dist/chunks/studio-qpqa7vk3.js +0 -5
  618. package/dist/chunks/studio-qqz8e5gk.js +0 -5
  619. package/dist/chunks/studio-qvasen3f.js +0 -5
  620. package/dist/chunks/studio-rggdb3hm.js +0 -5
  621. package/dist/chunks/studio-sghy936h.js +0 -4
  622. package/dist/chunks/studio-skprc6ef.js +0 -5
  623. package/dist/chunks/studio-tt2nactf.js +0 -5
  624. package/dist/chunks/studio-tyasmc39.js +0 -5
  625. package/dist/chunks/studio-vk9ezads.js +0 -5
  626. package/dist/chunks/studio-vzacdfsc.js +0 -4
  627. package/dist/chunks/studio-w4c0xmrw.js +0 -5
  628. package/dist/chunks/studio-wfjqhhbk.js +0 -5
  629. package/dist/chunks/studio-wgh5kxpj.js +0 -5
  630. package/dist/chunks/studio-xasj0796.js +0 -5
  631. package/dist/chunks/studio-y78s8r2n.js +0 -5
  632. package/dist/chunks/studio-z8w183sh.js +0 -5
  633. package/dist/chunks/studio-zscd9ty4.js +0 -928
  634. package/dist/chunks/studio-zxp13sss.js +0 -7
  635. package/dist/chunks/studio-zygnmm01.js +0 -5
  636. package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
  637. package/dist/chunks/tabs-jwthg40w.js +0 -4
  638. package/dist/chunks/textfield-spy3hc77.js +0 -4
  639. package/dist/chunks/toast-4d35zd64.js +0 -4
  640. package/dist/chunks/toast-host-8sjmfed3.js +0 -4
  641. package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
  642. package/dist/chunks/tree-h19v1jfz.js +0 -4
  643. package/dist/chunks/tsMode-gr0m4dzr.js +0 -14
  644. package/dist/chunks/workspace-m15qtcqp.js +0 -4
  645. package/dist/chunks/ws-client-nf61frr1.js +0 -4
@@ -1,21 +1,91 @@
1
1
  /// <reference lib="dom" />
2
- import type { CemParameter, JxMutableNode, JxStateObject } from "@jxsuite/schema/types";
2
+ import type {
3
+ CemParameter,
4
+ JxElementTagName,
5
+ JxMutableNode,
6
+ JxStateDefinition,
7
+ JxStateObject,
8
+ JsonValue,
9
+ } from "@jxsuite/schema/types";
3
10
  import {
4
11
  displayTagName,
5
12
  isFunctionDef,
6
13
  isJsonObject,
7
14
  isPrivateStateKey,
15
+ isString,
8
16
  } from "@jxsuite/schema/guards";
9
17
 
18
+ /** A CEM `{ text }` type reference. */
19
+ interface CemTypeText {
20
+ text: string;
21
+ }
22
+
23
+ /** A CEM class member: a `method` (function entry) or a `field` (signal / type def). */
24
+ interface CemMember {
25
+ kind: "method" | "field";
26
+ name: string;
27
+ type?: CemTypeText;
28
+ default?: string;
29
+ description?: string;
30
+ parameters?: CemParameter[];
31
+ attribute?: string;
32
+ reflects?: true;
33
+ deprecated?: string | true;
34
+ }
35
+
36
+ /** A CEM attribute linked to a field. */
37
+ interface CemAttribute {
38
+ name: string;
39
+ type?: CemTypeText;
40
+ fieldName: string;
41
+ }
42
+
43
+ /** A CEM event a method dispatches. */
44
+ interface CemManifestEvent {
45
+ name: string;
46
+ type?: JsonValue;
47
+ description?: string;
48
+ }
49
+
50
+ /** A CEM slot; the default slot has an empty name. */
51
+ interface CemSlot {
52
+ name: string;
53
+ description?: string;
54
+ }
55
+
56
+ /** A CEM CSS custom property. */
57
+ interface CemCssProperty {
58
+ default: string;
59
+ name: string;
60
+ }
61
+
62
+ /** A CEM CSS part. */
63
+ interface CemCssPart {
64
+ name: string;
65
+ }
66
+
67
+ /** The single custom-element class declaration the manifest exports. */
68
+ interface CemClassDeclaration {
69
+ kind: "class";
70
+ members: CemMember[];
71
+ name: JxElementTagName;
72
+ tagName: JxElementTagName;
73
+ attributes?: CemAttribute[];
74
+ events?: CemManifestEvent[];
75
+ slots?: CemSlot[];
76
+ cssProperties?: CemCssProperty[];
77
+ cssParts?: CemCssPart[];
78
+ }
79
+
10
80
  /** Collect slot elements from the document tree. Whitespace-only names count as unnamed. */
11
81
  export function collectSlots(node?: JxMutableNode | null, slots: string[] = []) {
12
82
  if (node?.tagName === "slot") {
13
83
  const name = node.attributes?.name;
14
- slots.push(typeof name === "string" ? name.trim() : "");
84
+ slots.push(isString(name) ? name.trim() : "");
15
85
  }
16
86
  if (Array.isArray(node?.children)) {
17
87
  for (const c of node.children) {
18
- collectSlots(typeof c === "string" ? undefined : c, slots);
88
+ collectSlots(isString(c) ? undefined : c, slots);
19
89
  }
20
90
  }
21
91
  return slots;
@@ -47,7 +117,7 @@ export function validateComponentSlots(doc: JxMutableNode): string | null {
47
117
  *
48
118
  * @param {{ document: JxMutableNode }} S - Studio state
49
119
  * @param {{
50
- * defCategory: (d: unknown) => string;
120
+ * defCategory: (d: JxStateDefinition) => string;
51
121
  * normParam: (p: string | CemParameter) => CemParameter;
52
122
  * collectCssParts: (node: JxMutableNode) => { name: string }[];
53
123
  * }} helpers
@@ -55,7 +125,7 @@ export function validateComponentSlots(doc: JxMutableNode): string | null {
55
125
  export function exportCemManifest(
56
126
  S: { document: JxMutableNode },
57
127
  helpers: {
58
- defCategory: (d: unknown) => string;
128
+ defCategory: (d: JxStateDefinition) => string;
59
129
  normParam: (p: string | CemParameter) => CemParameter;
60
130
  collectCssParts: (node: JxMutableNode) => { name: string }[];
61
131
  },
@@ -68,9 +138,9 @@ export function exportCemManifest(
68
138
  }
69
139
 
70
140
  const state = doc.state || {};
71
- const members: Record<string, unknown>[] = [];
72
- const attributes: Record<string, unknown>[] = [];
73
- const events: Record<string, unknown>[] = [];
141
+ const members: CemMember[] = [];
142
+ const attributes: CemAttribute[] = [];
143
+ const events: CemManifestEvent[] = [];
74
144
  const seenEvents = new Set<string>();
75
145
 
76
146
  for (const [key, d] of Object.entries(state)) {
@@ -82,56 +152,72 @@ export function exportCemManifest(
82
152
 
83
153
  if (cat === "function") {
84
154
  if (isFunctionDef(d)) {
85
- members.push({
86
- kind: "method",
87
- name: key,
88
- ...(d.description ? { description: d.description } : {}),
89
- ...(d.parameters ? { parameters: d.parameters.map(normParam) } : {}),
90
- ...(d.deprecated
91
- ? { deprecated: typeof d.deprecated === "string" ? d.deprecated : true }
92
- : {}),
93
- });
155
+ const method: CemMember = { kind: "method", name: key };
156
+ if (d.description) {
157
+ method.description = d.description;
158
+ }
159
+ if (d.parameters) {
160
+ method.parameters = d.parameters.map(normParam);
161
+ }
162
+ if (d.deprecated) {
163
+ method.deprecated = isString(d.deprecated) ? d.deprecated : true;
164
+ }
165
+ members.push(method);
94
166
  // Collect emits
95
167
  for (const ev of d.emits ?? []) {
96
168
  if (ev.name && !seenEvents.has(ev.name)) {
97
169
  seenEvents.add(ev.name);
98
- events.push({
99
- name: ev.name,
100
- ...(ev.type !== undefined ? { type: ev.type } : {}),
101
- ...(ev.description ? { description: ev.description } : {}),
102
- });
170
+ const event: CemManifestEvent = { name: ev.name };
171
+ if (ev.type !== undefined) {
172
+ event.type = ev.type;
173
+ }
174
+ if (ev.description) {
175
+ event.description = ev.description;
176
+ }
177
+ events.push(event);
103
178
  }
104
179
  }
105
180
  } else if (isJsonObject(d)) {
106
181
  // Legacy $handler entry — emit a bare method member
107
182
  const { description } = d;
108
- members.push({
109
- kind: "method",
110
- name: key,
111
- ...(typeof description === "string" ? { description } : {}),
112
- });
183
+ const method: CemMember = { kind: "method", name: key };
184
+ if (isString(description)) {
185
+ method.description = description;
186
+ }
187
+ members.push(method);
113
188
  }
114
189
  } else if (cat === "state") {
115
190
  // Naked primitive values carry no metadata; object defs are signals/type defs.
191
+ /* SAFETY: defCategory classified this entry as "state", which it only does when the entry
192
+ Carries no $expression, $prototype, $handler or $compute, so an object entry here is an
193
+ Expanded signal or schema type def: the JxStateObject shape. */
116
194
  const def: JxStateObject | null = isJsonObject(d) ? (d as JxStateObject) : null;
117
- members.push({
118
- kind: "field",
119
- name: key,
120
- ...(def?.type ? { type: { text: def.type } } : {}),
121
- ...(def && def.default !== undefined ? { default: String(def.default) } : {}),
122
- ...(def?.description ? { description: def.description } : {}),
123
- ...(def?.attribute ? { attribute: def.attribute } : {}),
124
- ...(def?.reflects ? { reflects: true } : {}),
125
- ...(def?.deprecated
126
- ? { deprecated: typeof def.deprecated === "string" ? def.deprecated : true }
127
- : {}),
128
- });
195
+ const field: CemMember = { kind: "field", name: key };
196
+ if (def?.type) {
197
+ field.type = { text: def.type };
198
+ }
199
+ if (def && def.default !== undefined) {
200
+ field.default = String(def.default);
201
+ }
202
+ if (def?.description) {
203
+ field.description = def.description;
204
+ }
205
+ if (def?.attribute) {
206
+ field.attribute = def.attribute;
207
+ }
208
+ if (def?.reflects) {
209
+ field.reflects = true;
210
+ }
211
+ if (def?.deprecated) {
212
+ field.deprecated = isString(def.deprecated) ? def.deprecated : true;
213
+ }
214
+ members.push(field);
129
215
  if (def?.attribute) {
130
- attributes.push({
131
- name: def.attribute,
132
- ...(def.type ? { type: { text: def.type } } : {}),
133
- fieldName: key,
134
- });
216
+ attributes.push(
217
+ def.type
218
+ ? { name: def.attribute, type: { text: def.type }, fieldName: key }
219
+ : { name: def.attribute, fieldName: key },
220
+ );
135
221
  }
136
222
  }
137
223
  }
@@ -139,7 +225,7 @@ export function exportCemManifest(
139
225
  // Slots
140
226
  const slotNames = collectSlots(doc);
141
227
  const slots = slotNames.map((name: string) => {
142
- const slot: { name: string; description?: string } = { name: name || "" };
228
+ const slot: CemSlot = { name: name || "" };
143
229
  if (!name) {
144
230
  slot.description = "Default slot";
145
231
  }
@@ -155,22 +241,27 @@ export function exportCemManifest(
155
241
  // CSS parts
156
242
  const cssParts = collectCssParts(doc).map((p) => ({ name: p.name }));
157
243
 
244
+ const declaration: CemClassDeclaration = { kind: "class", members, name: tagName, tagName };
245
+ if (attributes.length > 0) {
246
+ declaration.attributes = attributes;
247
+ }
248
+ if (events.length > 0) {
249
+ declaration.events = events;
250
+ }
251
+ if (slots.length > 0) {
252
+ declaration.slots = slots;
253
+ }
254
+ if (cssProperties.length > 0) {
255
+ declaration.cssProperties = cssProperties;
256
+ }
257
+ if (cssParts.length > 0) {
258
+ declaration.cssParts = cssParts;
259
+ }
260
+
158
261
  const manifest = {
159
262
  modules: [
160
263
  {
161
- declarations: [
162
- {
163
- kind: "class",
164
- members,
165
- name: tagName,
166
- tagName,
167
- ...(attributes.length > 0 ? { attributes } : {}),
168
- ...(events.length > 0 ? { events } : {}),
169
- ...(slots.length > 0 ? { slots } : {}),
170
- ...(cssProperties.length > 0 ? { cssProperties } : {}),
171
- ...(cssParts.length > 0 ? { cssParts } : {}),
172
- },
173
- ],
264
+ declarations: [declaration],
174
265
  kind: "javascript-module",
175
266
  path: "",
176
267
  },
@@ -19,6 +19,11 @@
19
19
  * value the formatter reads back.
20
20
  */
21
21
 
22
+ import { isNumber } from "@jxsuite/schema/guards";
23
+
24
+ /** One minute in milliseconds: the unit the relative-time formatters count up from. */
25
+ export const MINUTE = 60_000;
26
+
22
27
  /** Epoch milliseconds the clock is pinned to, or `null` while it follows the real clock. */
23
28
  let _pinned: number | null = null;
24
29
 
@@ -43,7 +48,7 @@ export function now(): number {
43
48
  * photograph the wall clock and the capture would be accepted.
44
49
  */
45
50
  export function pinClock(at: number | string | Date): number {
46
- const ms = at instanceof Date ? at.getTime() : typeof at === "number" ? at : Date.parse(at);
51
+ const ms = at instanceof Date ? at.getTime() : isNumber(at) ? at : Date.parse(at);
47
52
  if (!Number.isFinite(ms)) {
48
53
  throw new TypeError(`clock: cannot pin to ${JSON.stringify(at)}`);
49
54
  }
@@ -6,7 +6,13 @@ import { projectState } from "../state";
6
6
  import { getNodeAtPath } from "../store";
7
7
  import { loadedMonaco } from "./monaco-lazy";
8
8
  import type { JxPath } from "../state";
9
- import type { JxFunctionDef, JxMutableNode } from "@jxsuite/schema/types";
9
+ import type {
10
+ JsonObject,
11
+ JsonValue,
12
+ JxDocumentValue,
13
+ JxFunctionDef,
14
+ JxMutableNode,
15
+ } from "@jxsuite/schema/types";
10
16
  import type { editor } from "monaco-editor";
11
17
 
12
18
  export interface OxLintDiagnostic {
@@ -19,15 +25,13 @@ export interface OxLintDiagnostic {
19
25
  }
20
26
 
21
27
  /**
28
+ * Run one code-service action. The payload travels to the backend as a JSON body.
29
+ *
22
30
  * @param {string} action
23
- * @param {unknown} payload
31
+ * @param {JsonValue} payload
24
32
  */
25
- export async function codeService(action: string, payload: unknown) {
26
- const platform = getPlatform();
27
- if (!platform.codeService) {
28
- return null;
29
- }
30
- return platform.codeService(action, payload);
33
+ export async function codeService(action: string, payload: JsonValue) {
34
+ return getPlatform().codeService(action, payload);
31
35
  }
32
36
 
33
37
  /**
@@ -36,21 +40,17 @@ export async function codeService(action: string, payload: unknown) {
36
40
  * @param {string} name
37
41
  */
38
42
  export async function locateDocument(name: string) {
39
- const platform = getPlatform();
40
- if (!platform.locateFile) {
41
- return null;
42
- }
43
- return platform.locateFile(name);
43
+ return getPlatform().locateFile(name);
44
44
  }
45
45
 
46
46
  /** Schema returned by a plugin's `$prototype` module (loose superset used across panels). */
47
47
  export interface PluginSchema {
48
48
  type?: string;
49
49
  description?: string;
50
- properties?: Record<string, unknown>;
50
+ properties?: JsonObject;
51
51
  required?: string[];
52
52
  returns?: { type?: string };
53
- [key: string]: unknown;
53
+ [key: string]: JsonValue | undefined;
54
54
  }
55
55
 
56
56
  /** Cache of plugin schemas keyed by "$src::$prototype". */
@@ -81,12 +81,12 @@ export async function fetchPluginSchema(
81
81
 
82
82
  try {
83
83
  const platform = getPlatform();
84
- if (!platform.fetchPluginSchema) {
85
- pluginSchemaCache.set(cacheKey, null);
86
- return null;
87
- }
88
84
  const base =
89
85
  !importedPath && state.documentPath ? `${location.origin}/${state.documentPath}` : undefined;
86
+ /* SAFETY: every platform answers with the plugin module's JSON Schema export, parsed from JSON,
87
+ Or null when it has none; PluginSchema is the all-optional, JSON-open view of that object. A
88
+ Platform without the method throws here, and the catch below caches null exactly as for a
89
+ Failed fetch. */
90
90
  const schema = (await platform.fetchPluginSchema(
91
91
  src,
92
92
  def.$prototype,
@@ -117,14 +117,14 @@ export function setLintMarkers(
117
117
  if (!monaco) {
118
118
  return;
119
119
  }
120
- const markers = diagnostics
121
- .map((d) => {
122
- const label = d.labels?.[0];
123
- if (!label) {
124
- return null;
125
- }
126
- const { line, column, length } = label.span;
127
- return {
120
+ const markers = diagnostics.flatMap((d) => {
121
+ const label = d.labels?.[0];
122
+ if (!label) {
123
+ return [];
124
+ }
125
+ const { line, column, length } = label.span;
126
+ return [
127
+ {
128
128
  code: d.url ? { target: monaco.Uri.parse(d.url), value: d.code } : d.code,
129
129
  endColumn: column + (length || 1),
130
130
  endLineNumber: line,
@@ -134,9 +134,12 @@ export function setLintMarkers(
134
134
  source: "oxlint",
135
135
  startColumn: column,
136
136
  startLineNumber: line,
137
- };
138
- })
139
- .filter(Boolean);
137
+ },
138
+ ];
139
+ });
140
+ /* SAFETY: each marker is an IMarkerData except that `code` (and the object form's `value`) may be
141
+ Undefined when oxlint reports a diagnostic without a rule code; Monaco treats an undefined code
142
+ Exactly like an absent one. */
140
143
  monaco.editor.setModelMarkers(model, "oxlint", markers as editor.IMarkerData[]);
141
144
  }
142
145
 
@@ -149,7 +152,7 @@ export function getFunctionArgs(
149
152
  document: JxMutableNode | null | undefined,
150
153
  ): string[] {
151
154
  // Read parameters off any object-shaped def (covers legacy entries without $prototype).
152
- const fromDef = (def: unknown): string[] | null => {
155
+ const fromDef = (def: JxDocumentValue | undefined): string[] | null => {
153
156
  if (!isJsonObject(def)) {
154
157
  return null;
155
158
  }
@@ -157,6 +160,9 @@ export function getFunctionArgs(
157
160
  if (!Array.isArray(params) || params.length === 0) {
158
161
  return null;
159
162
  }
163
+ /* SAFETY: a def's `parameters` array holds bare names or CEM parameter objects — the form the
164
+ Schema admits for Function, prototype and legacy handler entries alike — which is the
165
+ Element type paramNames reads. */
160
166
  return paramNames(params as JxFunctionDef["parameters"]);
161
167
  };
162
168
  if (editing.type === "def") {
@@ -12,14 +12,23 @@
12
12
  */
13
13
 
14
14
  import type { createChatState } from "@jxsuite/ai/chat-state";
15
+ import { CHARS_PER_TOKEN } from "@jxsuite/ai/harness";
15
16
  import {
16
17
  SEAL_RELOADED,
17
18
  repairToolPairs,
18
19
  toChatMessages,
19
20
  toLiveMessages,
20
21
  } from "@jxsuite/ai/messages";
22
+ import { isString } from "@jxsuite/schema/guards";
21
23
  import { modelContextWindow } from "./ai-models";
22
24
 
25
+ /** How many tool messages {@link pruneOrphanToolMessages} dropped, moved and sealed. */
26
+ export interface OrphanToolRepair {
27
+ dropped: number;
28
+ moved: number;
29
+ sealed: number;
30
+ }
31
+
23
32
  /** Shape of a single entry returned by `chatState.toMessagesArray()`. */
24
33
  interface MessageArrayEntry {
25
34
  role: string;
@@ -31,9 +40,6 @@ interface MessageArrayEntry {
31
40
 
32
41
  // ─── Constants ──────────────────────────────────────────────────────────────
33
42
 
34
- /** Rough heuristic: average 4 characters per token. */
35
- const CHARS_PER_TOKEN = 4;
36
-
37
43
  /**
38
44
  * Approximate context windows (in tokens) per model id, longest-prefix matched. Used to derive a
39
45
  * model-aware budget instead of a flat cap (specs/ai.md §2.1). Conservative fallback for unknown
@@ -109,7 +115,7 @@ const MIN_USER_TURNS = 3;
109
115
  * @returns {number}
110
116
  */
111
117
  function estimateTokens(input: string | MessageArrayEntry[]): number {
112
- if (typeof input === "string") {
118
+ if (isString(input)) {
113
119
  return Math.ceil(input.length / CHARS_PER_TOKEN);
114
120
  }
115
121
  let total = 0;
@@ -174,7 +180,7 @@ function contextTokens(
174
180
  return reused;
175
181
  }
176
182
  }
177
- return systemTokens + estimateTokens(chatState.toMessagesArray() as MessageArrayEntry[]);
183
+ return systemTokens + estimateTokens(chatState.toMessagesArray());
178
184
  }
179
185
 
180
186
  /**
@@ -316,11 +322,9 @@ export const UNANSWERED_TOOL_RESULT = JSON.stringify({ success: false, error: SE
316
322
  * @param {ReturnType<typeof createChatState>} chatState
317
323
  * @returns {{ dropped: number; moved: number; sealed: number }}
318
324
  */
319
- export function pruneOrphanToolMessages(chatState: ReturnType<typeof createChatState>): {
320
- dropped: number;
321
- moved: number;
322
- sealed: number;
323
- } {
325
+ export function pruneOrphanToolMessages(
326
+ chatState: ReturnType<typeof createChatState>,
327
+ ): OrphanToolRepair {
324
328
  const live = chatState.messages;
325
329
  const neutral = toChatMessages(live);
326
330
  const { messages, sealed, dropped, moved } = repairToolPairs(neutral);
@@ -7,12 +7,15 @@
7
7
  * resolves to the registered format names instead of a project.json key.
8
8
  */
9
9
 
10
+ import { isNonNullObject, isNumber, isString } from "@jxsuite/schema/guards";
11
+ import type { JsonObject, JsonValue, ProjectConfig } from "@jxsuite/schema/types";
12
+
10
13
  /** Options for {@link resolveContextPointer}. */
11
14
  export interface ResolveContextOptions {
12
15
  /** The project configuration object the pointer walks over. */
13
- projectConfig: Record<string, unknown>;
16
+ projectConfig: ProjectConfig;
14
17
  /** Scope record supplying `{@param}` substitutions (e.g. the enclosing form value). */
15
- scope?: Record<string, unknown> | undefined;
18
+ scope?: JsonObject | undefined;
16
19
  /** Registered formats backing the `$formats` virtual root. */
17
20
  formats?: { name: string }[] | undefined;
18
21
  }
@@ -30,9 +33,13 @@ const PARAM_SEGMENT = /^\{@(\w+)\}$/;
30
33
  *
31
34
  * @param {string} pointer
32
35
  * @param {ResolveContextOptions} opts
33
- * @returns {unknown} The resolved value, or `undefined` when the pointer does not resolve.
36
+ * @returns {JsonValue | undefined} The resolved value, or `undefined` when the pointer does not
37
+ * resolve.
34
38
  */
35
- export function resolveContextPointer(pointer: string, opts: ResolveContextOptions): unknown {
39
+ export function resolveContextPointer(
40
+ pointer: string,
41
+ opts: ResolveContextOptions,
42
+ ): JsonValue | undefined {
36
43
  if (!pointer.startsWith("#/$context/")) {
37
44
  return undefined;
38
45
  }
@@ -42,7 +49,7 @@ export function resolveContextPointer(pointer: string, opts: ResolveContextOptio
42
49
  const match = raw.match(PARAM_SEGMENT);
43
50
  if (match) {
44
51
  const value = opts.scope?.[match[1]!];
45
- if (typeof value !== "string" && typeof value !== "number") {
52
+ if (!isString(value) && !isNumber(value)) {
46
53
  return undefined;
47
54
  }
48
55
  const substituted = String(value);
@@ -62,12 +69,17 @@ export function resolveContextPointer(pointer: string, opts: ResolveContextOptio
62
69
  return (opts.formats ?? []).map((format) => format.name);
63
70
  }
64
71
 
65
- let node: unknown = opts.projectConfig;
72
+ /* SAFETY: the project config is parsed project.json, so every value under it is JSON;
73
+ ProjectConfig is the typed reading of that same object. */
74
+ let node: JsonValue | undefined = opts.projectConfig as JsonObject;
66
75
  for (const segment of segments) {
67
- if (node === null || typeof node !== "object") {
76
+ if (!isNonNullObject(node)) {
68
77
  return undefined;
69
78
  }
70
- node = (node as Record<string, unknown>)[segment];
79
+ /* SAFETY: node is a JSON object or array, and a pointer segment reads an array by its own
80
+ Index (and `length`) keys exactly as it reads an object's members, so the object view of
81
+ an array addresses the same values. */
82
+ node = (node as JsonObject)[segment];
71
83
  }
72
84
  return node;
73
85
  }
@@ -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
  }