@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
@@ -21,7 +21,13 @@
21
21
  * @docs studio/logic/data
22
22
  */
23
23
 
24
- import { displayTagName } from "@jxsuite/schema/guards";
24
+ import {
25
+ displayTagName,
26
+ isJsonObject,
27
+ isNonNullObject,
28
+ isRef,
29
+ isString,
30
+ } from "@jxsuite/schema/guards";
25
31
  import { dynamicRouteParams } from "../page-params";
26
32
  import { projectState } from "../state";
27
33
  import type { JsonValue } from "../types";
@@ -52,12 +58,15 @@ import { mountMediaPicker } from "../ui/media-picker";
52
58
  import { renderOnly } from "../store";
53
59
  import { mountSchemaForm } from "../ui/schema-form";
54
60
  import { resolveContextPointer } from "../services/context-resolver";
61
+ import type { ResolveContextOptions } from "../services/context-resolver";
55
62
  import { mountSignalsSurface } from "../surfaces/panel-signals";
56
- import type { JsonSchema } from "../ui/schema-form";
57
- import type { TabUi } from "../tabs/tab";
63
+ import type { JsonSchema, SchemaFormContext } from "../ui/schema-form";
64
+ import type { Tab, TabUi } from "../tabs/tab";
58
65
  import type {
59
66
  CemEvent,
60
67
  CemParameter,
68
+ JsonObject,
69
+ JxDocumentValue,
61
70
  JxMutableNode,
62
71
  JxStatement,
63
72
  JxStateDefinition,
@@ -74,19 +83,19 @@ import type {
74
83
  SignalChipView,
75
84
  SignalFieldKind,
76
85
  SignalFieldView,
77
- SignalOptionGroup,
78
86
  SignalRowView,
79
87
  SignalsActions,
80
88
  SignalsSurfaceHandle,
81
89
  SignalsView,
82
90
  } from "../surfaces/panel-signals";
91
+ import type { SurfaceOptionGroup } from "../ui/surface";
83
92
 
84
93
  interface SignalsPanelState {
85
94
  document: JxMutableNode;
86
- ui?: TabUi | Record<string, unknown>;
95
+ ui?: TabUi;
87
96
  mode?: string;
88
97
  selection?: (string | number)[][];
89
- canvas?: Record<string, unknown> | null;
98
+ canvas?: Tab["session"]["canvas"] | null;
90
99
  _collapsedSignalCats?: Set<string>;
91
100
  documentPath?: string | null | undefined;
92
101
  }
@@ -117,15 +126,15 @@ export interface SignalDef {
117
126
  $export?: string;
118
127
  $compute?: string;
119
128
  $deps?: string[];
120
- $expression?: Record<string, unknown>;
129
+ $expression?: JsonObject;
121
130
  $handler?: string;
122
131
  type?: string;
123
- default?: unknown;
124
- body?: string | unknown[];
125
- parameters?: string[];
132
+ default?: JsonValue;
133
+ body?: string | JxStatement[];
134
+ parameters?: (string | CemParameter)[];
126
135
  timing?: string;
127
136
  description?: string;
128
- fields?: Record<string, unknown>;
137
+ fields?: JsonObject;
129
138
  url?: string;
130
139
  method?: string;
131
140
  key?: string;
@@ -138,7 +147,7 @@ export interface SignalDef {
138
147
  deprecated?: string | boolean;
139
148
  format?: string;
140
149
  emits?: CemEvent[];
141
- [key: string]: unknown;
150
+ [key: string]: JxDocumentValue | undefined;
142
151
  }
143
152
 
144
153
  // ─── Module-local state ─────────────────────────────────────────────────────
@@ -155,22 +164,25 @@ let renameError: { name: string; message: string } | null = null;
155
164
  /** Track which functions have the advanced param editor open. */
156
165
  const advancedParamOpen = new Set<string>();
157
166
 
158
- /** Default templates for creating new signal definitions. */
159
- const DEF_TEMPLATES = {
160
- computed: { $compute: "", $deps: [] },
161
- cookie: { $prototype: "Cookie", default: "", name: "" },
162
- expression: { $expression: { operator: "=", target: null } },
163
- external: { $prototype: "", $src: "" },
164
- formData: { $prototype: "FormData", fields: {} },
165
- function: { $prototype: "Function", body: "", parameters: [] },
166
- indexedDB: { $prototype: "IndexedDB", database: "", store: "", version: 1 },
167
- localStorage: { $prototype: "LocalStorage", default: null, key: "" },
168
- map: { $prototype: "Map", default: {} },
169
- request: { $prototype: "Request", method: "GET", timing: "client", url: "" },
170
- sessionStorage: { $prototype: "SessionStorage", default: null, key: "" },
171
- set: { $prototype: "Set", default: [] },
172
- state: { default: "", type: "string" },
173
- } as Record<string, SignalDef>;
167
+ /** A field write: the def members to set, with `undefined` dropping one (`mutateUpdateDef`). */
168
+ type DefPatch = Record<string, JxDocumentValue | undefined>;
169
+
170
+ /** Default templates for creating new signal definitions, by the add picker's value. */
171
+ const DEF_TEMPLATES = new Map<string, JsonObject>([
172
+ ["computed", { $compute: "", $deps: [] }],
173
+ ["cookie", { $prototype: "Cookie", default: "", name: "" }],
174
+ ["expression", { $expression: { operator: "=", target: null } }],
175
+ ["external", { $prototype: "", $src: "" }],
176
+ ["formData", { $prototype: "FormData", fields: {} }],
177
+ ["function", { $prototype: "Function", body: "", parameters: [] }],
178
+ ["indexedDB", { $prototype: "IndexedDB", database: "", store: "", version: 1 }],
179
+ ["localStorage", { $prototype: "LocalStorage", default: null, key: "" }],
180
+ ["map", { $prototype: "Map", default: {} }],
181
+ ["request", { $prototype: "Request", method: "GET", timing: "client", url: "" }],
182
+ ["sessionStorage", { $prototype: "SessionStorage", default: null, key: "" }],
183
+ ["set", { $prototype: "Set", default: [] }],
184
+ ["state", { default: "", type: "string" }],
185
+ ]);
174
186
 
175
187
  /** Keys handled by the framework — skip when rendering schema fields. */
176
188
  const STUDIO_RESERVED_KEYS = new Set([
@@ -194,23 +206,27 @@ const DEBOUNCE_MS = 500;
194
206
 
195
207
  // ─── Signals / defs helpers ──────────────────────────────────────────────────
196
208
 
209
+ /** One manifest state class the add picker offers, with the def fields it seeds. */
210
+ export interface ExtensionStateClass {
211
+ name: string;
212
+ stateDefaults?: JsonObject;
213
+ }
214
+
197
215
  /**
198
216
  * Extension-manifest state classes for the add-state picker: plain `$prototype` targets (no
199
217
  * admission blocks) across the enabled extensions, each with its `$studio.stateDefaults` hint
200
218
  * (specs/extensions.md §10). Manifest classes need no `$src` — the registry resolves them.
201
219
  */
202
- export function extensionStateClasses(): {
203
- name: string;
204
- stateDefaults?: Record<string, unknown>;
205
- }[] {
206
- const out: { name: string; stateDefaults?: Record<string, unknown> }[] = [];
220
+ export function extensionStateClasses(): ExtensionStateClass[] {
221
+ const out: ExtensionStateClass[] = [];
207
222
  for (const ext of getExtensions()) {
208
223
  for (const cls of ext.classes ?? []) {
209
224
  if (cls.state) {
210
- out.push({
211
- name: cls.name,
212
- ...(cls.stateDefaults === undefined ? {} : { stateDefaults: cls.stateDefaults }),
213
- });
225
+ const entry: ExtensionStateClass = { name: cls.name };
226
+ if (cls.stateDefaults !== undefined) {
227
+ entry.stateDefaults = cls.stateDefaults;
228
+ }
229
+ out.push(entry);
214
230
  }
215
231
  }
216
232
  }
@@ -220,24 +236,25 @@ export function extensionStateClasses(): {
220
236
  /**
221
237
  * View a state entry through the panel's flattened editing lens. Naked primitive and array entries
222
238
  * surface as an empty view — the builders guard every field access.
223
- *
224
- * @param {import("@jxsuite/schema/types").JxStateDefinition} def
225
- * @returns {SignalDef}
226
239
  */
227
- function asSignalDef(def: JxStateDefinition): SignalDef {
228
- return (typeof def === "object" && def !== null && !Array.isArray(def) ? def : {}) as SignalDef;
240
+ function asSignalDef(def: SignalDef | JxStateDefinition): SignalDef {
241
+ if (!isNonNullObject(def) || Array.isArray(def)) {
242
+ return {};
243
+ }
244
+ /* SAFETY: `def` is one of a state entry's object shapes (function, prototype, expression, server
245
+ function or plain object), and SignalDef is their union flattened into one all-optional record.
246
+ The two places it is narrower than a shape are read only behind the branch that owns them:
247
+ `body` as statements or source for a Function entry, and `$expression` (a JSON node) for an
248
+ expression entry, which is all `expressionHint` and the expression editor take it as. */
249
+ return def as SignalDef;
229
250
  }
230
251
 
231
- /**
232
- * Classify a state entry into a category string.
233
- *
234
- * @param {SignalDef | unknown} def
235
- */
236
- export function defCategory(def: SignalDef | unknown) {
252
+ /** Classify a state entry into a category string. */
253
+ export function defCategory(def: SignalDef | JxStateDefinition | undefined) {
237
254
  if (!def) {
238
255
  return "state";
239
256
  }
240
- const d = def as SignalDef;
257
+ const d = asSignalDef(def);
241
258
  if (d.$expression) {
242
259
  return "expression";
243
260
  }
@@ -253,16 +270,12 @@ export function defCategory(def: SignalDef | unknown) {
253
270
  return "state";
254
271
  }
255
272
 
256
- /**
257
- * Badge label for a def category.
258
- *
259
- * @param {SignalDef | unknown} def
260
- */
261
- export function defBadgeLabel(def: SignalDef | unknown) {
273
+ /** Badge label for a def category. */
274
+ export function defBadgeLabel(def: SignalDef | JxStateDefinition | undefined) {
262
275
  if (!def) {
263
276
  return "S";
264
277
  }
265
- const d = def as SignalDef;
278
+ const d = asSignalDef(def);
266
279
  if (d.$expression) {
267
280
  return "E";
268
281
  }
@@ -350,12 +363,12 @@ export function collectCssParts(
350
363
  parts: { name: string; tag: string }[] = [],
351
364
  ) {
352
365
  const part = node?.attributes?.part;
353
- if (typeof part === "string" && part) {
354
- parts.push({ name: part, tag: displayTagName(node?.tagName) || "div" });
366
+ if (isString(part) && part) {
367
+ parts.push({ name: part, tag: displayTagName(node.tagName) || "div" });
355
368
  }
356
369
  if (Array.isArray(node?.children)) {
357
370
  for (const c of node.children) {
358
- if (typeof c !== "string") {
371
+ if (!isString(c)) {
359
372
  collectCssParts(c, parts);
360
373
  }
361
374
  }
@@ -367,17 +380,18 @@ export function collectCssParts(
367
380
  * Resolve a $ref value to a display string using signal defaults. Used by the canvas to show real
368
381
  * values instead of raw refs.
369
382
  *
370
- * @param {unknown} value
371
- * @param {Record<string, SignalDef> | null | undefined} defs
383
+ * @param {JsonValue | undefined} value
384
+ * @param {Record<string, JxStateDefinition> | null | undefined} defs
372
385
  */
373
386
  export function resolveDefaultForCanvas(
374
- value: unknown,
387
+ value: JsonValue | undefined,
375
388
  defs: Record<string, JxStateDefinition> | null | undefined,
376
389
  ) {
377
- if (!value || typeof value !== "object" || !(value as Record<string, unknown>).$ref) {
390
+ // Anything but a `{ $ref }` with a non-empty pointer is a literal, shown as it is.
391
+ if (!isRef(value) || !value.$ref) {
378
392
  return value;
379
393
  }
380
- const ref = (value as Record<string, unknown>).$ref as string;
394
+ const ref = value.$ref;
381
395
  /** @type {string | undefined} */
382
396
  let defName;
383
397
  if (ref.startsWith("#/state/")) {
@@ -397,7 +411,7 @@ export function resolveDefaultForCanvas(
397
411
  // State signal → use default
398
412
  if (!def.$compute && !def.$prototype) {
399
413
  if (def.default !== undefined && def.default !== null) {
400
- if (typeof def.default === "object") {
414
+ if (isNonNullObject(def.default)) {
401
415
  return JSON.stringify(def.default);
402
416
  }
403
417
  return String(def.default);
@@ -415,7 +429,7 @@ export function resolveDefaultForCanvas(
415
429
  // Storage → use default or key
416
430
  if (def.$prototype === "LocalStorage" || def.$prototype === "SessionStorage") {
417
431
  if (def.default !== undefined && def.default !== null) {
418
- if (typeof def.default === "object") {
432
+ if (isNonNullObject(def.default)) {
419
433
  return JSON.stringify(def.default);
420
434
  }
421
435
  return String(def.default);
@@ -430,14 +444,14 @@ export function resolveDefaultForCanvas(
430
444
 
431
445
  /** Normalize a parameter entry to a CEM object. */
432
446
  export function normParam(p: string | CemParameter): CemParameter {
433
- return typeof p === "string" ? { name: p } : p;
447
+ return isString(p) ? { name: p } : p;
434
448
  }
435
449
 
436
450
  /** Extract the display text from a CEM `{ text }` type value, if present. */
437
451
  function cemTypeText(type: JsonValue | undefined): string {
438
- if (typeof type === "object" && type !== null && !Array.isArray(type)) {
452
+ if (isJsonObject(type)) {
439
453
  const { text } = type;
440
- if (typeof text === "string") {
454
+ if (isString(text)) {
441
455
  return text;
442
456
  }
443
457
  }
@@ -445,11 +459,11 @@ function cemTypeText(type: JsonValue | undefined): string {
445
459
  }
446
460
 
447
461
  /** A value as a field shows it: JSON for a structure, the string for anything else. */
448
- function asText(value: unknown, indent = false): string {
462
+ function asText(value: JsonValue | undefined, indent = false): string {
449
463
  if (value === undefined || value === null) {
450
464
  return "";
451
465
  }
452
- if (typeof value === "object") {
466
+ if (isNonNullObject(value)) {
453
467
  return indent ? JSON.stringify(value, null, 2) : JSON.stringify(value);
454
468
  }
455
469
  return String(value);
@@ -621,7 +635,7 @@ function nameField(S: SignalsPanelState, name: string): SignalFieldView {
621
635
 
622
636
  /** A plain value entry: its type, its default, and the CEM facts a custom element adds. */
623
637
  function stateFields(S: SignalsPanelState, name: string, def: SignalDef): SignalFieldView[] {
624
- const patch = (value: Record<string, JsonValue | undefined>): void => {
638
+ const patch = (value: DefPatch): void => {
625
639
  transactDoc(activeTab.value, (t) => mutateUpdateDef(t, name, value));
626
640
  };
627
641
  const defaultVal = asText(def.default);
@@ -661,7 +675,7 @@ function stateFields(S: SignalsPanelState, name: string, def: SignalDef): Signal
661
675
  } else {
662
676
  out.push(
663
677
  textField(name, "default", "Default", defaultVal, (v: string) => {
664
- let parsed: unknown = v;
678
+ let parsed: JsonValue = v;
665
679
  if (def.type === "integer") {
666
680
  parsed = Math.trunc(Number(v)) || 0;
667
681
  } else if (def.type === "number") {
@@ -670,12 +684,13 @@ function stateFields(S: SignalsPanelState, name: string, def: SignalDef): Signal
670
684
  parsed = v === "true";
671
685
  } else if (def.type === "array" || def.type === "object") {
672
686
  try {
673
- parsed = JSON.parse(v);
687
+ // SAFETY: whatever `JSON.parse` returns without throwing is a JSON value.
688
+ parsed = JSON.parse(v) as JsonValue;
674
689
  } catch {
675
690
  parsed = v;
676
691
  }
677
692
  }
678
- patch({ default: parsed as JsonValue });
693
+ patch({ default: parsed });
679
694
  }),
680
695
  );
681
696
  }
@@ -708,7 +723,7 @@ function stateFields(S: SignalsPanelState, name: string, def: SignalDef): Signal
708
723
  name,
709
724
  "deprecated",
710
725
  "Deprecated",
711
- typeof def.deprecated === "string" ? def.deprecated : "",
726
+ isString(def.deprecated) ? def.deprecated : "",
712
727
  (v) => patch({ deprecated: v || undefined }),
713
728
  ),
714
729
  );
@@ -760,7 +775,7 @@ function computedFields(name: string, def: SignalDef): SignalFieldView[] {
760
775
 
761
776
  /** A fetched, stored or constructed value — one case per `$prototype`. */
762
777
  function dataFields(S: SignalsPanelState, name: string, def: SignalDef): SignalFieldView[] {
763
- const patch = (value: Record<string, JsonValue | undefined>): void => {
778
+ const patch = (value: DefPatch): void => {
764
779
  transactDoc(activeTab.value, (t) => mutateUpdateDef(t, name, value));
765
780
  };
766
781
  const proto = def.$prototype;
@@ -800,8 +815,8 @@ function dataFields(S: SignalsPanelState, name: string, def: SignalDef): SignalF
800
815
  value: stored,
801
816
  write: (v: string) => {
802
817
  try {
803
- // `JSON.parse` answers `any`; the value written is a document default, which is a
804
- // `JsonValue` by construction — naming it keeps the assignment checked.
818
+ /* SAFETY: `JSON.parse` answers `any`, but whatever it returns without throwing is a
819
+ JSON value — and a document default is exactly that. */
805
820
  patch({ default: JSON.parse(v) as JsonValue });
806
821
  } catch {
807
822
  patch({ default: v });
@@ -846,6 +861,7 @@ function dataFields(S: SignalsPanelState, name: string, def: SignalDef): SignalF
846
861
  value: text,
847
862
  write: (v: string) => {
848
863
  try {
864
+ // SAFETY: whatever `JSON.parse` returns without throwing is a JSON value.
849
865
  patch({ [key]: JSON.parse(v) as JsonValue });
850
866
  } catch {}
851
867
  },
@@ -863,7 +879,7 @@ function dataFields(S: SignalsPanelState, name: string, def: SignalDef): SignalF
863
879
  * and the fetch's resolution is what repaints the panel with the form in it.
864
880
  */
865
881
  function externalFields(S: SignalsPanelState, name: string, def: SignalDef): SignalFieldView[] {
866
- const patch = (value: Record<string, JsonValue | undefined>): void => {
882
+ const patch = (value: DefPatch): void => {
867
883
  transactDoc(activeTab.value, (t) => mutateUpdateDef(t, name, value));
868
884
  };
869
885
  const importedPath = def.$prototype
@@ -928,6 +944,9 @@ function externalFields(S: SignalsPanelState, name: string, def: SignalDef): Sig
928
944
  }
929
945
  out.push(field({ key: "schema", kind: "slot", signal: name, slot: "schema" }));
930
946
  islands.set(`${name}/schema`, (host) => {
947
+ /* SAFETY: the cache holds what `fetchPluginSchema` read from the plugin's own schema export,
948
+ which is a JSON Schema object; `JsonSchema` is the form's all-optional view of those same
949
+ keywords. */
931
950
  placeSchemaForm(host, schema as JsonSchema, def, name, S);
932
951
  });
933
952
  return out;
@@ -944,9 +963,13 @@ function writeCemField<T extends CemParameter | CemEvent>(
944
963
  }
945
964
  if (column === "type") {
946
965
  const { type: _type, ...rest } = entry;
966
+ /* SAFETY: `rest` is `entry` less `type`, which CemParameter and CemEvent both declare optional,
967
+ so it is still a `T` whether `type` comes back as `{ text }` or stays dropped. */
947
968
  return (value ? { ...rest, type: { text: value } } : rest) as T;
948
969
  }
949
970
  const { description: _description, ...rest } = entry;
971
+ /* SAFETY: `rest` is `entry` less `description`, which CemParameter and CemEvent both declare
972
+ optional, so it is still a `T` whether `description` comes back or stays dropped. */
950
973
  return (value ? { ...rest, description: value } : rest) as T;
951
974
  }
952
975
 
@@ -1091,7 +1114,7 @@ function parameterField(name: string, def: SignalDef): SignalFieldView {
1091
1114
 
1092
1115
  /** The CEM emits editor — the same table shape, over `emits`. */
1093
1116
  function emitsField(name: string, def: SignalDef): SignalFieldView {
1094
- const emits = def.emits || ([] as CemEvent[]);
1117
+ const emits = def.emits ?? [];
1095
1118
  const write = (next: CemEvent[]): void => {
1096
1119
  transactDoc(activeTab.value, (t) =>
1097
1120
  mutateUpdateDef(t, name, { emits: next.length > 0 ? next : undefined }),
@@ -1145,7 +1168,7 @@ function emitsField(name: string, def: SignalDef): SignalFieldView {
1145
1168
  * change, nothing is converted.
1146
1169
  */
1147
1170
  function functionFields(S: SignalsPanelState, name: string, def: SignalDef): SignalFieldView[] {
1148
- const patch = (value: Record<string, JsonValue | undefined>): void => {
1171
+ const patch = (value: DefPatch): void => {
1149
1172
  transactDoc(activeTab.value, (t) => mutateUpdateDef(t, name, value));
1150
1173
  };
1151
1174
  const out: SignalFieldView[] = [
@@ -1168,7 +1191,8 @@ function functionFields(S: SignalsPanelState, name: string, def: SignalDef): Sig
1168
1191
  return out;
1169
1192
  }
1170
1193
 
1171
- const statements = Array.isArray(def.body);
1194
+ const statementBody = Array.isArray(def.body) ? def.body : null;
1195
+ const statements = statementBody !== null;
1172
1196
  out.push(
1173
1197
  field(
1174
1198
  {
@@ -1224,14 +1248,14 @@ function functionFields(S: SignalsPanelState, name: string, def: SignalDef): Sig
1224
1248
  ),
1225
1249
  );
1226
1250
 
1227
- if (statements) {
1251
+ if (statementBody) {
1228
1252
  out.push(field({ key: "statements", kind: "slot", signal: name, slot: "statements" }));
1229
1253
  islands.set(`${name}/statements`, (host) => {
1230
1254
  mountStatementEditor(
1231
1255
  host,
1232
- def.body as JxStatement[],
1256
+ statementBody,
1233
1257
  (next) => {
1234
- patch({ body: next as unknown as JsonValue });
1258
+ patch({ body: next });
1235
1259
  repaint();
1236
1260
  },
1237
1261
  {
@@ -1246,7 +1270,7 @@ function functionFields(S: SignalsPanelState, name: string, def: SignalDef): Sig
1246
1270
  });
1247
1271
  return out;
1248
1272
  }
1249
- const source = typeof def.body === "string" ? def.body : "";
1273
+ const source = isString(def.body) ? def.body : "";
1250
1274
  out.push(
1251
1275
  field(
1252
1276
  {
@@ -1302,10 +1326,10 @@ function expressionFields(S: SignalsPanelState, name: string, def: SignalDef): S
1302
1326
  mountExpressionEditor(
1303
1327
  host,
1304
1328
  exprNode,
1305
- (newNode: unknown) =>
1329
+ (newNode) =>
1306
1330
  transactDoc(activeTab.value, (t) =>
1307
- // Expression editors emit JSON expression nodes.
1308
- mutateUpdateDef(t, name, { $expression: newNode as JsonValue }),
1331
+ // Expression editors emit JSON expression nodes, written back as the editor built them.
1332
+ mutateUpdateDef(t, name, { $expression: newNode }),
1309
1333
  ),
1310
1334
  {
1311
1335
  allowEventRef: false,
@@ -1316,6 +1340,9 @@ function expressionFields(S: SignalsPanelState, name: string, def: SignalDef): S
1316
1340
  ),
1317
1341
  onInsertDef: (defName, vendored) =>
1318
1342
  transactDoc(activeTab.value, (t) =>
1343
+ /* SAFETY: the one caller is `applyCatalogPick`, vending a packaged formula's entry
1344
+ (`packagedFormulaEntries` in ui/formula-catalog.ts): the object literal
1345
+ `{ $description, $expression, parameters }`, copied from the formulas' JSON. */
1319
1346
  mutateAddDef(t, defName, vendored as Record<string, JsonValue>),
1320
1347
  ),
1321
1348
  stateDefs: Object.keys(S.document.state || {}),
@@ -1360,22 +1387,23 @@ function editorFields(S: SignalsPanelState, name: string, def: SignalDef): Signa
1360
1387
  * the `#/$context/content` root, while the deprecated `"$contentTypes"` string sentinel and the
1361
1388
  * legacy `#/$context/contentTypes` root keep resolving bit-for-bit for old class descriptors.
1362
1389
  *
1363
- * @param {string} pointer
1364
- * @param {Record<string, unknown>} [scope] - Parent def for `{@param}` substitution
1365
- * @returns {unknown}
1390
+ * Typed by the schema form's own context contract, which owns both what a `scope` is (the form's
1391
+ * value record, for `{@param}` substitution) and what an answer may be.
1366
1392
  */
1367
- function resolveSignalsContextPointer(pointer: string, scope?: Record<string, unknown>): unknown {
1393
+ const resolveSignalsContextPointer: SchemaFormContext["resolvePointer"] = (pointer, scope) => {
1368
1394
  if (pointer === "#/$context/content") {
1369
1395
  return projectState?.projectConfig?.content ?? {};
1370
1396
  }
1371
1397
  if (pointer === "$contentTypes" || pointer === "#/$context/contentTypes") {
1372
1398
  return projectState?.projectConfig?.contentTypes ?? {};
1373
1399
  }
1374
- return resolveContextPointer(pointer, {
1375
- projectConfig: (projectState?.projectConfig ?? {}) as Record<string, unknown>,
1376
- ...(scope !== undefined && { scope }),
1377
- });
1378
- }
1400
+ const options: ResolveContextOptions = { projectConfig: projectState?.projectConfig ?? {} };
1401
+ // The form hands over its own value record — the def being configured — for `{@param}` lookups.
1402
+ if (isJsonObject(scope)) {
1403
+ options.scope = scope;
1404
+ }
1405
+ return resolveContextPointer(pointer, options);
1406
+ };
1379
1407
 
1380
1408
  /**
1381
1409
  * Put the shared schema form into the node the document made for it.
@@ -1405,22 +1433,19 @@ function placeSchemaForm(
1405
1433
  const properties = Object.fromEntries(
1406
1434
  Object.entries(schema.properties).filter(([prop]) => !STUDIO_RESERVED_KEYS.has(prop)),
1407
1435
  );
1408
- const form = mountSchemaForm(
1409
- `signal:${name}`,
1410
- { ...schema, properties },
1411
- def as Record<string, unknown>,
1412
- {
1413
- context: {
1414
- fieldKeyPrefix: name,
1415
- params: dynamicRouteParams(S.documentPath),
1416
- resolvePointer: resolveSignalsContextPointer,
1417
- // A config value may point at any signal but this one — a def that reads itself is a cycle.
1418
- signals: bindableSignalNames(S.document).filter((signal) => signal !== name),
1419
- },
1420
- onChange: (patch) => transactDoc(activeTab.value, (t) => mutateUpdateDef(t, name, patch)),
1421
- rerender: repaint,
1436
+ /* SAFETY: `def` is a state entry read from the parsed document (JSON on disk), so every member
1437
+ is JSON; the typed members SignalDef names are views of those same JSON values. */
1438
+ const form = mountSchemaForm(`signal:${name}`, { ...schema, properties }, def as JsonObject, {
1439
+ context: {
1440
+ fieldKeyPrefix: name,
1441
+ params: dynamicRouteParams(S.documentPath),
1442
+ resolvePointer: resolveSignalsContextPointer,
1443
+ // A config value may point at any signal but this one — a def that reads itself is a cycle.
1444
+ signals: bindableSignalNames(S.document).filter((signal) => signal !== name),
1422
1445
  },
1423
- );
1446
+ onChange: (patch) => transactDoc(activeTab.value, (t) => mutateUpdateDef(t, name, patch)),
1447
+ rerender: repaint,
1448
+ });
1424
1449
  if (form.parentNode !== host) {
1425
1450
  host.replaceChildren(form);
1426
1451
  }
@@ -1450,9 +1475,9 @@ function placeSchemaForm(
1450
1475
  function summary(
1451
1476
  name: string,
1452
1477
  def: SignalDef,
1453
- live: unknown,
1478
+ live: JsonValue | undefined,
1454
1479
  resolved: boolean,
1455
- ): { summary: string; summaryTitle: string; summaryTone: string } {
1480
+ ): Pick<SignalRowView, "summary" | "summaryTitle" | "summaryTone"> {
1456
1481
  const holdsNoValue =
1457
1482
  defCategory(def) === "function" ||
1458
1483
  (def.$expression != null && isActionExpression(def.$expression));
@@ -1482,7 +1507,7 @@ const CATEGORY_LABELS: readonly { key: string; label: string }[] = [
1482
1507
  * GROUPED rather than divided: `jx-select` draws both halves of a group's delimiter, so the three
1483
1508
  * unlabelled `sp-menu-divider`s this replaces are named runs a reader can aim at.
1484
1509
  */
1485
- const ADD_GROUPS: readonly SignalOptionGroup[] = [
1510
+ const ADD_GROUPS: readonly SurfaceOptionGroup[] = [
1486
1511
  {
1487
1512
  id: "values",
1488
1513
  label: "Values",
@@ -1524,8 +1549,10 @@ export function signalsView(S: SignalsPanelState, ctx: SignalsPanelCtx): Signals
1524
1549
  const defs = S.document.state || {};
1525
1550
  const entries = Object.entries(defs);
1526
1551
  /* What the canvas actually resolved these to. `S.canvas` is the session's canvas record, so this
1527
- costs a property read — the panel already had the scope in hand. */
1528
- const liveScope = (S.canvas?.scope ?? null) as Record<string, unknown> | null;
1552
+ costs a property read — the panel already had the scope in hand.
1553
+ SAFETY: the canvas scope's one writer (iframe-host.ts, on a `dataScope` message) stores that
1554
+ message's `scope`, a JsonObject of deep-cloned values (serialize-scope.ts). */
1555
+ const liveScope = (S.canvas?.scope ?? null) as JsonObject | null;
1529
1556
  const scope = liveScope ?? {};
1530
1557
  /* A Refresh is out and the canvas has not answered. Read off the tab, so it survives the repaints
1531
1558
  between the press and the `dataScope` that ends it. */
@@ -1542,7 +1569,7 @@ export function signalsView(S: SignalsPanelState, ctx: SignalsPanelCtx): Signals
1542
1569
  grouped.get(defCategory(raw))?.push([name, asSignalDef(raw)]);
1543
1570
  }
1544
1571
 
1545
- S._collapsedSignalCats ||= new Set();
1572
+ S._collapsedSignalCats ??= new Set();
1546
1573
  const collapsed = S._collapsedSignalCats;
1547
1574
 
1548
1575
  const categories: SignalCategoryView[] = [];
@@ -1625,14 +1652,12 @@ function freeName(S: SignalsPanelState, base: string): string {
1625
1652
  * by the "+ Add…" picker and the panel's empty state, so both create the same thing.
1626
1653
  */
1627
1654
  function addTemplateDef(type: string, S: SignalsPanelState): void {
1628
- const template = DEF_TEMPLATES[type];
1655
+ const template = DEF_TEMPLATES.get(type);
1629
1656
  if (!template) {
1630
1657
  return;
1631
1658
  }
1632
1659
  const name = freeName(S, type === "function" ? "newFunction" : "$newSignal");
1633
- transactDoc(activeTab.value, (t) =>
1634
- mutateAddDef(t, name, structuredClone(template) as Record<string, JsonValue>),
1635
- );
1660
+ transactDoc(activeTab.value, (t) => mutateAddDef(t, name, structuredClone(template)));
1636
1661
  setDataRowExpanded(name, true);
1637
1662
  repaint();
1638
1663
  }
@@ -1658,7 +1683,7 @@ function addSignalOfType(type: string): void {
1658
1683
  mutateAddDef(t, name, {
1659
1684
  $prototype: proto,
1660
1685
  ...cls?.stateDefaults,
1661
- } as Record<string, JsonValue>),
1686
+ }),
1662
1687
  );
1663
1688
  setDataRowExpanded(name, true);
1664
1689
  repaint();
@@ -1671,9 +1696,7 @@ function addSignalOfType(type: string): void {
1671
1696
  if (type.startsWith("import:")) {
1672
1697
  const proto = type.slice(7);
1673
1698
  const name = prototypeName(S, proto);
1674
- transactDoc(activeTab.value, (t) =>
1675
- mutateAddDef(t, name, { $prototype: proto } as Record<string, JsonValue>),
1676
- );
1699
+ transactDoc(activeTab.value, (t) => mutateAddDef(t, name, { $prototype: proto }));
1677
1700
  setDataRowExpanded(name, true);
1678
1701
  repaint();
1679
1702
  return;
@@ -1877,8 +1900,7 @@ function definedSignalNames(): string[] {
1877
1900
  export function signalsCommands(): AnyCommand[] {
1878
1901
  /** The named entry, or a refusal listing what the document does define. */
1879
1902
  function requireDef(commandId: string, name: string): SignalDef {
1880
- const defs = (activeTab.value?.doc.document?.state ?? {}) as Record<string, SignalDef>;
1881
- const def = defs[name];
1903
+ const def = activeTab.value?.doc.document?.state?.[name];
1882
1904
  if (!def) {
1883
1905
  const defined = definedSignalNames();
1884
1906
  throw new RangeError(
@@ -1886,7 +1908,7 @@ export function signalsCommands(): AnyCommand[] {
1886
1908
  `defines — it defines: ${defined.length > 0 ? defined.join(", ") : "nothing"}`,
1887
1909
  );
1888
1910
  }
1889
- return def;
1911
+ return asSignalDef(def);
1890
1912
  }
1891
1913
 
1892
1914
  return [