@jxsuite/studio 6.1.1 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/dist/chunks/2020-5wtzce5g.js +4 -0
- package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
- package/dist/chunks/adapter-5tphg7xe.js +4 -0
- package/dist/chunks/add-new-flow-psym14sn.js +4 -0
- package/dist/chunks/cf-account-picker-haqazq5r.js +4 -0
- package/dist/chunks/cf-settings-h2wrh6hq.js +4 -0
- package/dist/chunks/color-area-6rbra5dy.js +4 -0
- package/dist/chunks/color-field-gy56c94g.js +4 -0
- package/dist/chunks/color-m7r1vk54.js +4 -0
- package/dist/chunks/color-slider-sqqdyf6c.js +4 -0
- package/dist/chunks/combobox-72h32ejk.js +4 -0
- package/dist/chunks/components-r22xca09.js +4 -0
- package/dist/chunks/content-source-mmppmcyg.js +4 -0
- package/dist/chunks/convert-to-repeater-he70fc2b.js +4 -0
- package/dist/chunks/dialog-c4x05vyx.js +4 -0
- package/dist/chunks/editor-ccd9jwsa.js +4 -0
- package/dist/chunks/entry-commands-6qxz9e8p.js +4 -0
- package/dist/chunks/extension-sections-0egb88dm.js +4 -0
- package/dist/chunks/file-ops-qnab36ek.js +4 -0
- package/dist/chunks/files-rcn56qvm.js +4 -0
- package/dist/chunks/format-host-yxz0kjjs.js +4 -0
- package/dist/chunks/fs-events-d1qxq4z4.js +4 -0
- package/dist/chunks/grid-open-4z1g062t.js +4 -0
- package/dist/chunks/grid-view-qg1b5eqx.js +51 -0
- package/dist/chunks/icons-63bjtbs7.js +4 -0
- package/dist/chunks/iframe-entry-2zggzajv.js +5 -0
- package/dist/chunks/iframe-entry-76j8vwwx.js +5 -0
- package/dist/chunks/iframe-entry-99nr5zfb.js +5 -0
- package/dist/chunks/iframe-entry-pkgmcgp0.js +5 -0
- package/dist/chunks/iframe-host-ssv7kyj0.js +4 -0
- package/dist/chunks/{index-2veqmnhr.js → index-32eqzv1k.js} +3 -3
- package/dist/chunks/index-f0jn7nnp.js +4 -0
- package/dist/chunks/{javascript-8nbvs12s.js → javascript-pjp734q4.js} +3 -3
- package/dist/chunks/jsonMode-njkvsa02.js +13 -0
- package/dist/chunks/jx-validate-ttasrbh7.js +4 -0
- package/dist/chunks/layers-bgyr11tr.js +4 -0
- package/dist/chunks/layers-panel-7ez66zeq.js +4 -0
- package/dist/chunks/listbox-c421cf8c.js +4 -0
- package/dist/chunks/lit-html-v9gh687x.js +4 -0
- package/dist/chunks/media-library-sq468wts.js +4 -0
- package/dist/chunks/media-picker-shfe59pt.js +4 -0
- package/dist/chunks/menu-bdpzbfvs.js +4 -0
- package/dist/chunks/monaco-binding-vq1hgnn0.js +4 -0
- package/dist/chunks/monaco-buffer-3afgwvbp.js +4 -0
- package/dist/chunks/monaco-setup-xrd2cbkp.js +4 -0
- package/dist/chunks/notify-kzrjr3fv.js +4 -0
- package/dist/chunks/number-field-y62xq0ty.js +4 -0
- package/dist/chunks/parse-v77xtwv7.js +4 -0
- package/dist/chunks/platform-7v4rtd7m.js +4 -0
- package/dist/chunks/popover-b89sfej7.js +4 -0
- package/dist/chunks/publish-panel-2z9gw8ee.js +4 -0
- package/dist/chunks/publish-quick-qx2455cj.js +4 -0
- package/dist/chunks/publish-workspace-wrc1dgwx.js +4 -0
- package/dist/chunks/quick-search-n0t0eqxb.js +4 -0
- package/dist/chunks/references-9547rg5s.js +4 -0
- package/dist/chunks/right-panel-wsgnr9pn.js +4 -0
- package/dist/chunks/select-rzds841e.js +4 -0
- package/dist/chunks/source-control-kwktr9y6.js +4 -0
- package/dist/chunks/split-c9zfdgxf.js +4 -0
- package/dist/chunks/studio-03ct6yfv.js +9 -0
- package/dist/chunks/studio-07rcfje3.js +5 -0
- package/dist/chunks/studio-3e54qh39.js +7 -0
- package/dist/chunks/studio-3exxhz5g.js +5 -0
- package/dist/chunks/studio-3q40e3rj.js +5 -0
- package/dist/chunks/studio-3qeh9t0h.js +6 -0
- package/dist/chunks/studio-3qqjeep5.js +6 -0
- package/dist/chunks/studio-43sd2mam.js +4 -0
- package/dist/chunks/studio-4hp8pkyt.js +5 -0
- package/dist/chunks/studio-58xg6j2q.js +9 -0
- package/dist/chunks/studio-5g0rprdt.js +7 -0
- package/dist/chunks/studio-6m380wp7.js +5 -0
- package/dist/chunks/studio-80jyh1xh.js +4 -0
- package/dist/chunks/studio-83mk4bgg.js +9 -0
- package/dist/chunks/{studio-kggey1jt.js → studio-881z1xrx.js} +4 -4
- package/dist/chunks/studio-8m0y2qe7.js +5 -0
- package/dist/chunks/studio-8tr6cfrc.js +5 -0
- package/dist/chunks/studio-8vcvfs7r.js +6 -0
- package/dist/chunks/studio-9tmebf0s.js +5 -0
- package/dist/chunks/studio-a2bvaptz.js +5 -0
- package/dist/chunks/studio-b7y5mr30.js +5 -0
- package/dist/chunks/studio-bavb31r0.js +5 -0
- package/dist/chunks/studio-bbe4c90a.js +5 -0
- package/dist/chunks/studio-c05wdnt3.js +5 -0
- package/dist/chunks/studio-ccv2svc6.js +5 -0
- package/dist/chunks/studio-d5grtb9e.js +16 -0
- package/dist/chunks/studio-df0baea9.js +5 -0
- package/dist/chunks/studio-dgk4dqtx.js +7 -0
- package/dist/chunks/studio-e1g64q43.js +5 -0
- package/dist/chunks/studio-ed1hp6zf.js +6 -0
- package/dist/chunks/studio-ed3xx40h.js +7 -0
- package/dist/chunks/studio-f14e1zdj.js +5 -0
- package/dist/chunks/studio-fbhxxc5f.js +5 -0
- package/dist/chunks/studio-fyh0jc96.js +5 -0
- package/dist/chunks/studio-gcxk20n7.js +5 -0
- package/dist/chunks/studio-jaaz8ce9.js +5 -0
- package/dist/chunks/{studio-8grwxtqk.js → studio-jcnsdaep.js} +4 -4
- package/dist/chunks/studio-jsgf2q5k.js +7 -0
- package/dist/chunks/{studio-1q1sh2ax.js → studio-k3xxbagr.js} +3 -3
- package/dist/chunks/studio-k7evxqh4.js +5 -0
- package/dist/chunks/studio-kt3pjkwd.js +5 -0
- package/dist/chunks/studio-m8g16bgz.js +5 -0
- package/dist/chunks/studio-mn0476ag.js +5 -0
- package/dist/chunks/studio-mx1smyq0.js +5 -0
- package/dist/chunks/studio-n0c5h6mf.js +5 -0
- package/dist/chunks/{studio-rv11kfwa.js → studio-nh6d342n.js} +7 -7
- package/dist/chunks/studio-nqxqf8p2.js +4 -0
- package/dist/chunks/studio-p4nrkvqr.js +5 -0
- package/dist/chunks/{studio-h46vtzk8.js → studio-pbxa5fpc.js} +4 -4
- package/dist/chunks/studio-pgmvdv7z.js +7 -0
- package/dist/chunks/studio-ph84avkf.js +5 -0
- package/dist/chunks/{studio-wszjyh0j.js → studio-q0mvbaq6.js} +4 -4
- package/dist/chunks/studio-q0tccd43.js +5 -0
- package/dist/chunks/studio-q7rtx6zq.js +14 -0
- package/dist/chunks/{studio-pre0skq6.js → studio-qgh13jtz.js} +4 -4
- package/dist/chunks/studio-qmn1xc24.js +5 -0
- package/dist/chunks/studio-qwdqwkj0.js +5 -0
- package/dist/chunks/{studio-t6b6qe31.js → studio-r5qy30vx.js} +4 -4
- package/dist/chunks/studio-rj9eamf8.js +5 -0
- package/dist/chunks/studio-rptgsk96.js +5 -0
- package/dist/chunks/studio-rthyg42z.js +928 -0
- package/dist/chunks/studio-s19tp1xr.js +5 -0
- package/dist/chunks/studio-s32578pn.js +5 -0
- package/dist/chunks/studio-svb7yyve.js +5 -0
- package/dist/chunks/studio-syreb644.js +5 -0
- package/dist/chunks/studio-tf9jryb1.js +10 -0
- package/dist/chunks/studio-tfkznv39.js +5 -0
- package/dist/chunks/studio-tft6r105.js +5 -0
- package/dist/chunks/studio-txf2kysx.js +5 -0
- package/dist/chunks/studio-v8867ddv.js +12 -0
- package/dist/chunks/studio-vxq7fcvv.js +5 -0
- package/dist/chunks/studio-w4rz9hdk.js +5 -0
- package/dist/chunks/studio-wbcjbhy1.js +9 -0
- package/dist/chunks/studio-wc649wss.js +5 -0
- package/dist/chunks/studio-wys23mxz.js +5 -0
- package/dist/chunks/studio-x1x167jh.js +5 -0
- package/dist/chunks/studio-x9hsze61.js +5 -0
- package/dist/chunks/studio-y0n7yxea.js +9 -0
- package/dist/chunks/studio-y3ahhdpx.js +5 -0
- package/dist/chunks/studio-z97c48fk.js +5 -0
- package/dist/chunks/studio-zat62m0c.js +5 -0
- package/dist/chunks/studio-zcd2e7yz.js +5 -0
- package/dist/chunks/studio-zz9qe3rw.js +64 -0
- package/dist/chunks/swatch-group-ewh24n1f.js +4 -0
- package/dist/chunks/tabs-f5cw3tgp.js +4 -0
- package/dist/chunks/textfield-wewc8rq2.js +4 -0
- package/dist/chunks/toast-1gv0h53h.js +4 -0
- package/dist/chunks/toast-host-1yg5ar8d.js +4 -0
- package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
- package/dist/chunks/tooltip-yypz28gq.js +4 -0
- package/dist/chunks/tree-9xa4hm7n.js +4 -0
- package/dist/chunks/tsMode-epyfz1hv.js +14 -0
- package/dist/chunks/workspace-dz7nxfhv.js +4 -0
- package/dist/chunks/workspace-home-xsd7hkjw.js +4 -0
- package/dist/chunks/ws-client-bv552sfx.js +4 -0
- package/dist/iframe-entry.js +20 -16
- package/dist/manifest.json +77 -63
- package/dist/studio.js +106 -107
- package/dist/workers/ts.worker.js +3 -3
- package/package.json +17 -16
- package/src/about/about-modal.ts +4 -3
- package/src/account/action-flow.ts +45 -38
- package/src/account-status.ts +7 -2
- package/src/browse/component-examples.ts +272 -0
- package/src/browse/library-commands.ts +64 -104
- package/src/browse/library-layouts.ts +270 -53
- package/src/browse/library-model.ts +194 -134
- package/src/browse/library-pane.ts +748 -440
- package/src/browse/library-preview.ts +161 -26
- package/src/browse/library-source.ts +308 -41
- package/src/browse/preview-root.ts +78 -0
- package/src/browse/preview-style.ts +155 -0
- package/src/canvas/asset-refs.ts +40 -10
- package/src/canvas/asset-resolve.ts +19 -23
- package/src/canvas/canvas-helpers.ts +7 -6
- package/src/canvas/canvas-live-render.ts +260 -77
- package/src/canvas/canvas-origin.ts +37 -12
- package/src/canvas/canvas-page-context.ts +112 -0
- package/src/canvas/canvas-patcher.ts +30 -30
- package/src/canvas/canvas-perf.ts +11 -5
- package/src/canvas/canvas-render.ts +175 -148
- package/src/canvas/canvas-surface.ts +5 -3
- package/src/canvas/canvas-utils.ts +147 -61
- package/src/canvas/dialog-path.ts +9 -4
- package/src/canvas/dialog-state.ts +1 -2
- package/src/canvas/diff-marks.ts +9 -16
- package/src/canvas/diff-toolbar.ts +8 -7
- package/src/canvas/edit-width-drag.ts +4 -1
- package/src/canvas/edit-width.ts +1 -3
- package/src/canvas/iframe-channel.ts +27 -13
- package/src/canvas/iframe-drop.ts +120 -12
- package/src/canvas/iframe-editable-root.ts +29 -16
- package/src/canvas/iframe-entry.ts +104 -75
- package/src/canvas/iframe-eval.ts +73 -49
- package/src/canvas/iframe-host.ts +269 -158
- package/src/canvas/iframe-inline-edit.ts +49 -30
- package/src/canvas/iframe-insert.ts +5 -4
- package/src/canvas/iframe-interaction.ts +30 -25
- package/src/canvas/iframe-keys.ts +11 -0
- package/src/canvas/iframe-overlay.ts +1 -1
- package/src/canvas/iframe-patch.ts +25 -21
- package/src/canvas/iframe-position.ts +12 -6
- package/src/canvas/iframe-protocol.ts +36 -21
- package/src/canvas/iframe-render.ts +84 -35
- package/src/canvas/iframe-slash.ts +24 -11
- package/src/canvas/iframe-subtree.ts +10 -3
- package/src/canvas/npm-modules.ts +22 -0
- package/src/canvas/path-mapping.ts +19 -12
- package/src/canvas/popover-path.ts +7 -3
- package/src/canvas/popover-state.ts +1 -2
- package/src/canvas/preview-navigate.ts +16 -0
- package/src/canvas/repeater-sources.ts +200 -0
- package/src/canvas/serialize-scope.ts +13 -5
- package/src/canvas/stage-scrollbar.ts +7 -2
- package/src/canvas/surface-registry.ts +27 -3
- package/src/collab/collab-commands.ts +7 -2
- package/src/collab/collab-session.ts +84 -45
- package/src/collab/collab-state.ts +4 -3
- package/src/collab/monaco-binding.ts +16 -13
- package/src/collab/monaco-cursors.ts +5 -2
- package/src/commands/app-commands.ts +16 -6
- package/src/commands/budget.ts +13 -11
- package/src/commands/command-args.ts +103 -71
- package/src/commands/context.ts +55 -28
- package/src/commands/defaults.ts +69 -45
- package/src/commands/keymap.ts +56 -43
- package/src/commands/levels.ts +14 -8
- package/src/commands/live-context.ts +9 -7
- package/src/commands/reference.ts +2 -1
- package/src/commands/registry.ts +22 -11
- package/src/commands/run-reported.ts +15 -10
- package/src/component-props.ts +46 -30
- package/src/content/collection-match.ts +11 -9
- package/src/content/collection-pages.ts +412 -0
- package/src/content/content-collections.ts +270 -0
- package/src/content/draft-state.ts +4 -3
- package/src/content/entry-commands.ts +54 -62
- package/src/content/entry-editor.ts +137 -32
- package/src/content/entry-fields.ts +25 -8
- package/src/content/entry-inspector.ts +225 -0
- package/src/content/entry-model.ts +38 -15
- package/src/content/entry-open.ts +80 -0
- package/src/content/entry-summaries.ts +440 -0
- package/src/content/file-record-ids.ts +80 -0
- package/src/content/file-records.ts +125 -0
- package/src/content/page-summaries.ts +129 -0
- package/src/content/record-entry.ts +201 -0
- package/src/content/writing-banner.ts +177 -0
- package/src/create/add-new-commands.ts +185 -0
- package/src/create/add-new-flow.ts +1116 -0
- package/src/create/add-new.ts +1014 -0
- package/src/create/element-name.ts +121 -0
- package/src/editor/canvas-context-menu.ts +1 -2
- package/src/editor/canvas-slash-bridge.ts +3 -6
- package/src/editor/content-slice.ts +16 -14
- package/src/editor/context-menu.ts +35 -22
- package/src/editor/convert-targets.ts +30 -35
- package/src/editor/convert-to-component.ts +78 -48
- package/src/editor/convert-to-repeater.ts +34 -22
- package/src/editor/editable-tags.ts +17 -2
- package/src/editor/file-drop-action.ts +29 -22
- package/src/editor/inline-edit-apply.ts +79 -17
- package/src/editor/inline-edit.ts +76 -50
- package/src/editor/inline-format.ts +59 -56
- package/src/editor/inline-link.ts +40 -15
- package/src/editor/insert-component.ts +91 -0
- package/src/editor/insert-zone-action.ts +14 -5
- package/src/editor/merge-tags.ts +58 -19
- package/src/editor/repeater-scope.ts +39 -28
- package/src/editor/shortcuts.ts +76 -42
- package/src/editor/slash-menu.ts +52 -14
- package/src/files/asset-versions.ts +4 -4
- package/src/files/components.ts +89 -20
- package/src/files/elements.ts +5 -6
- package/src/files/file-ops.ts +92 -41
- package/src/files/files.ts +248 -239
- package/src/files/fs-events.ts +18 -7
- package/src/files/media-meta.ts +97 -2
- package/src/files/media-paths.ts +3 -0
- package/src/files/media-types.ts +55 -0
- package/src/files/media-upload.ts +209 -52
- package/src/files/new-file-name.ts +156 -0
- package/src/files/serialize-document.ts +15 -5
- package/src/format/constraints.ts +1 -1
- package/src/format/convert-file.ts +27 -13
- package/src/format/format-choices.ts +2 -1
- package/src/format/format-host.ts +91 -50
- package/src/github/github-auth-status.ts +27 -3
- package/src/github/github-auth.ts +21 -11
- package/src/github/github-publish.ts +28 -23
- package/src/grid/cell-editors.ts +46 -31
- package/src/grid/cell-popovers.ts +5 -3
- package/src/grid/edit-buffer.ts +10 -9
- package/src/grid/grid-controller.ts +25 -23
- package/src/grid/grid-layout.ts +21 -5
- package/src/grid/grid-open.ts +3 -33
- package/src/grid/grid-panel.ts +65 -6
- package/src/grid/grid-reveal.ts +34 -0
- package/src/grid/grid-source.ts +9 -31
- package/src/grid/grid-view.ts +45 -23
- package/src/grid/redirects-grid.ts +14 -5
- package/src/grid/redirects.ts +16 -14
- package/src/grid/schema-columns.ts +25 -19
- package/src/grid/sources/connector-source.ts +47 -20
- package/src/grid/sources/content-source.ts +100 -31
- package/src/grid/sources/csv-file-source.ts +2 -2
- package/src/grid/tabulator-tables.d.ts +61 -34
- package/src/hosting/document.ts +2 -2
- package/src/hosting/stage.ts +7 -7
- package/src/i18n/i18n-commands.ts +3 -3
- package/src/media/media-commands.ts +181 -0
- package/src/media/media-library-model.ts +232 -0
- package/src/media/media-library.ts +1283 -0
- package/src/media/media-pane.ts +51 -20
- package/src/new-project/add-repo-modal.ts +20 -19
- package/src/new-project/import-tab.ts +10 -14
- package/src/new-project/location-fields.ts +2 -1
- package/src/new-project/new-project-modal.ts +12 -9
- package/src/packages/jxsuite-update.ts +4 -3
- package/src/packages/pull-package-sync.ts +26 -25
- package/src/page-params.ts +97 -68
- package/src/panels/activity-panel.ts +38 -14
- package/src/panels/ai-chat/attached-context.ts +13 -7
- package/src/panels/ai-chat/chat-markdown.ts +8 -8
- package/src/panels/ai-chat/chat-view.ts +80 -73
- package/src/panels/ai-chat/composer.ts +30 -33
- package/src/panels/ai-chat/sessions-view.ts +1 -2
- package/src/panels/ai-panel.ts +23 -20
- package/src/panels/block-action-bar.ts +57 -46
- package/src/panels/bottom-dock.ts +5 -3
- package/src/panels/canvas-dnd-bridge.ts +36 -26
- package/src/panels/chat-panel.ts +6 -6
- package/src/panels/collections-panel.ts +306 -0
- package/src/panels/component-preview.ts +35 -13
- package/src/panels/data-explorer.ts +63 -26
- package/src/panels/data-grid.ts +18 -11
- package/src/panels/dnd.ts +115 -138
- package/src/panels/editors.ts +52 -21
- package/src/panels/elements-panel.ts +19 -5
- package/src/panels/empty-state.ts +2 -2
- package/src/panels/events-panel.ts +84 -69
- package/src/panels/formula-workspace.ts +78 -54
- package/src/panels/frontmatter-fields.ts +33 -28
- package/src/panels/git-diff-open.ts +10 -6
- package/src/panels/head-panel.ts +488 -202
- package/src/panels/i18n-panel.ts +20 -12
- package/src/panels/imports-panel.ts +25 -47
- package/src/panels/jump-bar.ts +75 -31
- package/src/panels/layers-panel.ts +130 -101
- package/src/panels/left-panel.ts +25 -11
- package/src/panels/navigator-panels.ts +23 -11
- package/src/panels/pane-context.ts +140 -49
- package/src/panels/pane-grid.ts +55 -26
- package/src/panels/panel-registry.ts +36 -46
- package/src/panels/properties-panel.ts +182 -124
- package/src/panels/quick-search.ts +53 -31
- package/src/panels/right-panel.ts +201 -45
- package/src/panels/seo-modal.ts +54 -125
- package/src/panels/settings-menu.ts +63 -61
- package/src/panels/settings-pane.ts +268 -162
- package/src/panels/signals-panel.ts +156 -135
- package/src/panels/site-model.ts +367 -0
- package/src/panels/site-panel.ts +638 -0
- package/src/panels/statement-editor.ts +230 -140
- package/src/panels/style-panel.ts +253 -206
- package/src/panels/style-utils.ts +114 -51
- package/src/panels/stylebook-doc.ts +195 -60
- package/src/panels/stylebook-layers-panel.ts +48 -89
- package/src/panels/stylebook-panel.ts +60 -27
- package/src/panels/styles-panel.ts +327 -0
- package/src/panels/tab-drop.ts +27 -11
- package/src/panels/tab-strip.ts +143 -49
- package/src/platform-errors.ts +57 -43
- package/src/platform.ts +59 -31
- package/src/platforms/cloud.ts +373 -176
- package/src/platforms/default-platform.ts +14 -8
- package/src/platforms/devserver.ts +180 -142
- package/src/platforms/read-batcher.ts +16 -8
- package/src/project-list.ts +2 -1
- package/src/publish/deploy-checklist.ts +20 -9
- package/src/publish/pages-service.ts +66 -27
- package/src/publish/publish-changes.ts +491 -0
- package/src/publish/publish-commands.ts +88 -22
- package/src/publish/publish-ids.ts +49 -0
- package/src/publish/publish-panel.ts +10 -6
- package/src/publish/publish-quick.ts +148 -0
- package/src/publish/publish-workspace.ts +926 -0
- package/src/publish/source-control.ts +907 -0
- package/src/recent-projects.ts +15 -8
- package/src/resize-edges.ts +26 -36
- package/src/services/a11y-report.ts +26 -19
- package/src/services/agent-seed.ts +23 -11
- package/src/services/ai-ask.ts +9 -12
- package/src/services/ai-command-tools.ts +68 -62
- package/src/services/ai-import-tools.ts +80 -67
- package/src/services/ai-models.ts +17 -13
- package/src/services/ai-project-tools.ts +68 -32
- package/src/services/ai-session-store.ts +19 -10
- package/src/services/ai-system-prompt.ts +46 -20
- package/src/services/ai-tools.ts +71 -27
- package/src/services/ai-write-report.ts +20 -12
- package/src/services/ai-writes.ts +4 -4
- package/src/services/automation.ts +74 -51
- package/src/services/cem-export.ts +149 -58
- package/src/services/cf-settings.ts +4 -4
- package/src/services/clock.ts +6 -1
- package/src/services/code-services.ts +37 -31
- package/src/services/connection.ts +2 -2
- package/src/services/context-manager.ts +14 -10
- package/src/services/context-resolver.ts +20 -8
- package/src/services/data-service.ts +19 -15
- package/src/services/directory-picker.ts +20 -14
- package/src/services/document-assistant.ts +39 -19
- package/src/services/gated-registry.ts +10 -6
- package/src/services/harness/chat-reducer.ts +23 -1
- package/src/services/import-client.ts +91 -38
- package/src/services/import-seed.ts +8 -2
- package/src/services/jx-validate.ts +28 -31
- package/src/services/live-preview.ts +0 -0
- package/src/services/live-surfaces.ts +6 -3
- package/src/services/model-uri.ts +10 -2
- package/src/services/module-preloads.ts +12 -8
- package/src/services/monaco-buffer.ts +43 -24
- package/src/services/monaco-lazy.ts +7 -8
- package/src/services/monaco-setup.ts +23 -16
- package/src/services/notify.ts +44 -17
- package/src/services/popover-report.ts +25 -10
- package/src/services/preview-eval.ts +20 -8
- package/src/services/profile.ts +13 -6
- package/src/services/project-path.ts +13 -10
- package/src/services/references.ts +0 -0
- package/src/services/render-critic.ts +29 -9
- package/src/services/settings/definitions.ts +25 -14
- package/src/services/settings/kernel.ts +13 -4
- package/src/services/settings/write-queue.ts +9 -9
- package/src/services/token-lint.ts +12 -10
- package/src/services/tool-executor.ts +17 -5
- package/src/services/tool-outcomes.ts +44 -24
- package/src/services/trusted-types.ts +24 -7
- package/src/settings/contexts-section.ts +11 -8
- package/src/settings/contributed-section.ts +128 -70
- package/src/settings/css-vars-editor.ts +119 -32
- package/src/settings/defs-editor.ts +38 -35
- package/src/settings/developer-panels.ts +43 -0
- package/src/settings/extension-rows.ts +16 -8
- package/src/settings/extension-sections.ts +42 -14
- package/src/settings/extensions-section.ts +4 -1
- package/src/settings/general-settings.ts +101 -28
- package/src/settings/locales-section.ts +20 -12
- package/src/settings/preferences-dialog.ts +17 -7
- package/src/settings/preferences-keymap.ts +7 -5
- package/src/settings/preferences-sections.ts +11 -5
- package/src/settings/project-sections.ts +28 -11
- package/src/settings/schema-field-ui.ts +12 -1
- package/src/settings/section-registry.ts +116 -11
- package/src/settings/settings-dialog.ts +192 -0
- package/src/settings/settings-document.ts +186 -166
- package/src/shell/tree.ts +6 -5
- package/src/shell.ts +536 -477
- package/src/site-context.ts +101 -32
- package/src/state.ts +68 -57
- package/src/store.ts +54 -34
- package/src/studio.ts +219 -116
- package/src/style/live-preview.ts +1 -1
- package/src/style/project-styles.ts +40 -7
- package/src/style/stylebook-specimens.ts +89 -0
- package/src/style/stylebook-target.ts +26 -0
- package/src/style/tag-inheritance.ts +105 -0
- package/src/style/token-ref.ts +5 -4
- package/src/style/variables-focus.ts +61 -0
- package/src/style/variables-view.ts +235 -0
- package/src/surfaces/about.ts +18 -19
- package/src/surfaces/add-new.json +1482 -0
- package/src/surfaces/add-new.ts +325 -0
- package/src/surfaces/add-repo.ts +17 -19
- package/src/surfaces/ai-chat.ts +33 -38
- package/src/surfaces/ai-credentials-form.ts +6 -16
- package/src/surfaces/ai-managed-connect.ts +3 -4
- package/src/surfaces/ai-model-picker.ts +3 -5
- package/src/surfaces/block-action-bar.ts +22 -11
- package/src/surfaces/boot-failure.json +4 -3
- package/src/surfaces/boot-failure.ts +4 -5
- package/src/surfaces/bottom-dock.json +1 -1
- package/src/surfaces/bottom-dock.ts +9 -18
- package/src/surfaces/canvas-stage.json +30 -19
- package/src/surfaces/canvas-stage.ts +17 -16
- package/src/surfaces/cf-account-picker.ts +17 -18
- package/src/surfaces/collections-panel.json +615 -0
- package/src/surfaces/collections-panel.ts +168 -0
- package/src/surfaces/commandbar.json +241 -96
- package/src/surfaces/commandbar.ts +145 -105
- package/src/surfaces/convert-repeater.ts +17 -19
- package/src/surfaces/data-actions.ts +9 -7
- package/src/surfaces/dialog.ts +26 -28
- package/src/surfaces/diff-toolbar.ts +9 -7
- package/src/surfaces/empty-state.json +1 -1
- package/src/surfaces/empty-state.ts +7 -10
- package/src/surfaces/entry-editor.json +136 -0
- package/src/surfaces/entry-editor.ts +35 -11
- package/src/surfaces/entry-inspector.json +371 -0
- package/src/surfaces/entry-inspector.ts +143 -0
- package/src/surfaces/expression-editor.ts +11 -25
- package/src/surfaces/files-panel.ts +27 -14
- package/src/surfaces/formula-palette.ts +4 -5
- package/src/surfaces/github-auth.ts +16 -20
- package/src/surfaces/github-publish.ts +17 -22
- package/src/surfaces/grid-cell.ts +30 -31
- package/src/surfaces/grid-open.ts +10 -14
- package/src/surfaces/grid-panel.ts +13 -9
- package/src/surfaces/grid-replace.ts +13 -13
- package/src/surfaces/grid-views.ts +15 -18
- package/src/surfaces/inspector-dock.json +162 -14
- package/src/surfaces/inspector-dock.ts +59 -31
- package/src/surfaces/jump-bar.ts +5 -6
- package/src/surfaces/jxsuite-update.ts +16 -22
- package/src/surfaces/library-pane.json +670 -437
- package/src/surfaces/library-pane.ts +111 -77
- package/src/surfaces/logic-panel.ts +17 -30
- package/src/surfaces/logic-workspace.ts +13 -15
- package/src/surfaces/media-browser.json +62 -6
- package/src/surfaces/media-browser.ts +26 -11
- package/src/surfaces/media-field.json +1 -1
- package/src/surfaces/media-field.ts +4 -5
- package/src/surfaces/media-library.json +1586 -0
- package/src/surfaces/media-library.ts +282 -0
- package/src/surfaces/media-pane.ts +8 -7
- package/src/surfaces/media-pick-dialog.json +71 -0
- package/src/surfaces/media-pick-dialog.ts +132 -0
- package/src/surfaces/menu.ts +47 -23
- package/src/surfaces/navigator-dock.ts +11 -12
- package/src/surfaces/new-project.ts +27 -26
- package/src/surfaces/pane-context.json +144 -77
- package/src/surfaces/pane-context.ts +44 -25
- package/src/surfaces/pane-grid.ts +15 -10
- package/src/surfaces/panel-activity.ts +5 -6
- package/src/surfaces/panel-data.ts +3 -4
- package/src/surfaces/panel-deploy-checklist.json +12 -6
- package/src/surfaces/panel-deploy-checklist.ts +8 -7
- package/src/surfaces/panel-elements.ts +5 -7
- package/src/surfaces/panel-i18n.ts +5 -7
- package/src/surfaces/panel-imports.ts +6 -13
- package/src/surfaces/panel-outline.ts +25 -19
- package/src/surfaces/panel-page.json +72 -2
- package/src/surfaces/panel-page.ts +49 -25
- package/src/surfaces/panel-problems.ts +5 -7
- package/src/surfaces/panel-signals.json +1 -1
- package/src/surfaces/panel-signals.ts +25 -39
- package/src/surfaces/panel-stylebook-layers.json +71 -204
- package/src/surfaces/panel-stylebook-layers.ts +5 -29
- package/src/surfaces/preferences.json +120 -48
- package/src/surfaces/preferences.ts +29 -11
- package/src/surfaces/progress-modal.ts +15 -9
- package/src/surfaces/properties-panel.json +1 -1
- package/src/surfaces/properties-panel.ts +20 -42
- package/src/surfaces/publish-quick.json +428 -0
- package/src/surfaces/publish-quick.ts +165 -0
- package/src/surfaces/publish-workspace.json +2892 -0
- package/src/surfaces/publish-workspace.ts +391 -0
- package/src/surfaces/publish.ts +18 -18
- package/src/surfaces/push-plan.ts +7 -8
- package/src/surfaces/rail.json +1 -159
- package/src/surfaces/rail.ts +22 -79
- package/src/surfaces/reference-field.ts +11 -15
- package/src/surfaces/schema-builder.ts +16 -22
- package/src/surfaces/schema-form.json +10 -2
- package/src/surfaces/schema-form.ts +17 -25
- package/src/surfaces/secret-field.ts +9 -6
- package/src/surfaces/seo.json +1 -1
- package/src/surfaces/seo.ts +21 -15
- package/src/surfaces/settings-contexts.ts +9 -7
- package/src/surfaces/settings-contributed.json +5 -5
- package/src/surfaces/settings-contributed.ts +32 -12
- package/src/surfaces/settings-css-vars.json +44 -36
- package/src/surfaces/settings-css-vars.ts +82 -16
- package/src/surfaces/settings-defs.json +2 -2
- package/src/surfaces/settings-defs.ts +17 -21
- package/src/surfaces/settings-deploy.json +2 -15
- package/src/surfaces/settings-deploy.ts +9 -16
- package/src/surfaces/settings-dialog.json +51 -0
- package/src/surfaces/settings-dialog.ts +169 -0
- package/src/surfaces/settings-extensions.ts +5 -6
- package/src/surfaces/settings-head.ts +33 -39
- package/src/surfaces/settings-locales.ts +8 -20
- package/src/surfaces/settings-overview.json +3 -3
- package/src/surfaces/settings-overview.ts +14 -8
- package/src/surfaces/settings-packages.ts +8 -7
- package/src/surfaces/settings-pane.json +269 -46
- package/src/surfaces/settings-pane.ts +88 -36
- package/src/surfaces/settings-rawjson.ts +5 -6
- package/src/surfaces/shell.json +2 -1
- package/src/surfaces/shell.ts +1 -2
- package/src/surfaces/site-panel.json +1029 -0
- package/src/surfaces/site-panel.ts +233 -0
- package/src/surfaces/slash-menu.json +63 -21
- package/src/surfaces/slash-menu.ts +42 -9
- package/src/surfaces/statements.ts +13 -18
- package/src/surfaces/statusbar.ts +56 -29
- package/src/surfaces/style-panel.ts +18 -31
- package/src/surfaces/stylebook-chrome.ts +3 -5
- package/src/surfaces/styles-panel.json +735 -0
- package/src/surfaces/styles-panel.ts +195 -0
- package/src/surfaces/styles-variables.json +149 -0
- package/src/surfaces/styles-variables.ts +145 -0
- package/src/surfaces/tab-strip.json +4 -4
- package/src/surfaces/tab-strip.ts +14 -13
- package/src/surfaces/target-line.ts +6 -7
- package/src/surfaces/welcome.ts +6 -8
- package/src/surfaces/writing-banner.json +94 -0
- package/src/surfaces/writing-banner.ts +80 -0
- package/src/tabs/bare-repeaters.ts +101 -0
- package/src/tabs/patch-ops.ts +4 -3
- package/src/tabs/project-config.ts +32 -21
- package/src/tabs/selection.ts +36 -8
- package/src/tabs/tab.ts +99 -48
- package/src/tabs/transact.ts +98 -53
- package/src/types.ts +53 -43
- package/src/ui/ai-credentials-form.ts +10 -13
- package/src/ui/ai-model-picker.ts +3 -3
- package/src/ui/cf-account-picker.ts +7 -9
- package/src/ui/color-selector.ts +9 -5
- package/src/ui/dynamic-slot.ts +7 -8
- package/src/ui/expression-editor.ts +112 -105
- package/src/ui/form-controls.ts +104 -56
- package/src/ui/formula-catalog.ts +239 -230
- package/src/ui/formula-chips.ts +33 -18
- package/src/ui/layers.ts +57 -31
- package/src/ui/media-picker.ts +300 -47
- package/src/ui/popover-surface.ts +20 -12
- package/src/ui/progress-modal.ts +13 -8
- package/src/ui/regions.ts +14 -12
- package/src/ui/schema-form.ts +372 -97
- package/src/ui/surface.ts +71 -8
- package/src/ui/timing.ts +9 -0
- package/src/ui/value-source.ts +44 -31
- package/src/ui/virtual-window.ts +29 -3
- package/src/utils/base64.ts +6 -4
- package/src/utils/edit-display.ts +366 -111
- package/src/utils/element-selectors.ts +3 -2
- package/src/utils/google-fonts.ts +15 -14
- package/src/utils/inherited-style.ts +18 -20
- package/src/utils/link-target.ts +1 -1
- package/src/utils/local-day.ts +18 -0
- package/src/utils/preview-format.ts +25 -3
- package/src/utils/strip-events.ts +49 -22
- package/src/utils/studio-utils.ts +29 -14
- package/src/view.ts +2 -3
- package/src/workspace/pane-derive.ts +14 -16
- package/src/workspace/session.ts +81 -50
- package/src/workspace/tab-workspace.ts +137 -0
- package/src/workspace/workspace-back.ts +189 -0
- package/src/workspace/workspace-home.ts +133 -0
- package/src/workspace/workspace-ids.ts +129 -0
- package/src/workspace/workspace-switch.ts +372 -0
- package/src/workspace/workspace.ts +165 -47
- package/styles/shell-frame.css +30 -7
- package/styles/shell-frame.json +15 -3
- package/dist/chunks/2020-va2wwra4.js +0 -4
- package/dist/chunks/adapter-f93pafd7.js +0 -4
- package/dist/chunks/cf-account-picker-af1h381v.js +0 -4
- package/dist/chunks/cf-settings-125tdm0w.js +0 -4
- package/dist/chunks/color-area-jqhna8zy.js +0 -4
- package/dist/chunks/color-field-embq5ctg.js +0 -4
- package/dist/chunks/color-fpezvnkt.js +0 -4
- package/dist/chunks/color-slider-1qmw7wqy.js +0 -4
- package/dist/chunks/combobox-773hdzyj.js +0 -4
- package/dist/chunks/components-ax2f1fnn.js +0 -4
- package/dist/chunks/content-source-108aqtk1.js +0 -4
- package/dist/chunks/convert-to-repeater-ry5rmppr.js +0 -4
- package/dist/chunks/dialog-mtm9fq5t.js +0 -4
- package/dist/chunks/editor-pfgdmkb0.js +0 -4
- package/dist/chunks/entry-commands-t0k1q0kx.js +0 -4
- package/dist/chunks/extension-sections-6mwh2hf8.js +0 -4
- package/dist/chunks/file-ops-meej5mqf.js +0 -4
- package/dist/chunks/files-44vp8a2s.js +0 -4
- package/dist/chunks/format-host-7q1petb9.js +0 -4
- package/dist/chunks/fs-events-h2mwnxaz.js +0 -4
- package/dist/chunks/git-panel-zngbymvd.js +0 -4
- package/dist/chunks/grid-view-sx9vynsp.js +0 -51
- package/dist/chunks/icons-p44xhjf0.js +0 -4
- package/dist/chunks/iframe-entry-f7mqjwpm.js +0 -5
- package/dist/chunks/iframe-entry-haw7jkvz.js +0 -5
- package/dist/chunks/iframe-entry-z6qrytv3.js +0 -5
- package/dist/chunks/iframe-host-qk3ycq87.js +0 -4
- package/dist/chunks/index-wkyfjeqz.js +0 -4
- package/dist/chunks/jsonMode-s8kt9dsj.js +0 -13
- package/dist/chunks/jx-validate-psgd7vsx.js +0 -4
- package/dist/chunks/layers-panel-1kq2jyfk.js +0 -4
- package/dist/chunks/layers-xd92fg8d.js +0 -4
- package/dist/chunks/listbox-s8fkmnq8.js +0 -4
- package/dist/chunks/lit-html-ac4cwwr4.js +0 -4
- package/dist/chunks/media-picker-0svzkdyb.js +0 -4
- package/dist/chunks/menu-37d07z9m.js +0 -4
- package/dist/chunks/menu-5c55ea3d.js +0 -4
- package/dist/chunks/monaco-binding-z6r70pdt.js +0 -4
- package/dist/chunks/monaco-buffer-fz6gq5y7.js +0 -4
- package/dist/chunks/monaco-setup-q4axkgj7.js +0 -4
- package/dist/chunks/notify-0xgtn8q1.js +0 -4
- package/dist/chunks/number-field-gw7sq8rn.js +0 -4
- package/dist/chunks/parse-897fvqah.js +0 -4
- package/dist/chunks/platform-v1qctbe6.js +0 -4
- package/dist/chunks/popover-8htra4er.js +0 -4
- package/dist/chunks/publish-panel-ym1fmgq5.js +0 -4
- package/dist/chunks/quick-search-a54e6t5n.js +0 -4
- package/dist/chunks/references-gmqp82fs.js +0 -4
- package/dist/chunks/right-panel-v7t9awbk.js +0 -4
- package/dist/chunks/section-registry-vhyf3zsr.js +0 -4
- package/dist/chunks/select-n3v7gwas.js +0 -4
- package/dist/chunks/split-pff8f3ze.js +0 -4
- package/dist/chunks/studio-0bhx5hz6.js +0 -5
- package/dist/chunks/studio-0k1ddnyy.js +0 -6
- package/dist/chunks/studio-1b04pd0j.js +0 -64
- package/dist/chunks/studio-4dwbj6gb.js +0 -5
- package/dist/chunks/studio-4tanh828.js +0 -5
- package/dist/chunks/studio-55h4mstj.js +0 -4
- package/dist/chunks/studio-5tnvjkz4.js +0 -5
- package/dist/chunks/studio-60dqgb0c.js +0 -5
- package/dist/chunks/studio-61dp09qg.js +0 -9
- package/dist/chunks/studio-63epcrj2.js +0 -5
- package/dist/chunks/studio-74k29dy9.js +0 -5
- package/dist/chunks/studio-7vg6jcd3.js +0 -5
- package/dist/chunks/studio-7zx31knw.js +0 -9
- package/dist/chunks/studio-8bxk97km.js +0 -5
- package/dist/chunks/studio-933e30n4.js +0 -5
- package/dist/chunks/studio-98wnwhbg.js +0 -5
- package/dist/chunks/studio-9mccjwjh.js +0 -14
- package/dist/chunks/studio-a2ke1e4t.js +0 -5
- package/dist/chunks/studio-e3a2a6v3.js +0 -4
- package/dist/chunks/studio-e81q1vb9.js +0 -5
- package/dist/chunks/studio-epgrmqqm.js +0 -5
- package/dist/chunks/studio-ery42sqr.js +0 -4
- package/dist/chunks/studio-g1shz58g.js +0 -5
- package/dist/chunks/studio-gf0fz03c.js +0 -5
- package/dist/chunks/studio-gjtpe62q.js +0 -6
- package/dist/chunks/studio-gkskhg7m.js +0 -5
- package/dist/chunks/studio-gx4dnjzd.js +0 -5
- package/dist/chunks/studio-j03zga3y.js +0 -9
- package/dist/chunks/studio-jhpxeckz.js +0 -5
- package/dist/chunks/studio-k01r7ykp.js +0 -5
- package/dist/chunks/studio-kk7h30ne.js +0 -7
- package/dist/chunks/studio-kt1zqney.js +0 -5
- package/dist/chunks/studio-m3cwhvye.js +0 -5
- package/dist/chunks/studio-mcayt6hz.js +0 -5
- package/dist/chunks/studio-myjcghv3.js +0 -5
- package/dist/chunks/studio-n8bxwc3y.js +0 -4
- package/dist/chunks/studio-ngm8gvpb.js +0 -5
- package/dist/chunks/studio-nj5a01jy.js +0 -928
- package/dist/chunks/studio-pcgz8heb.js +0 -5
- package/dist/chunks/studio-qcsq0t15.js +0 -5
- package/dist/chunks/studio-qkstvve9.js +0 -5
- package/dist/chunks/studio-qv1pwd3c.js +0 -5
- package/dist/chunks/studio-rc6dvxjb.js +0 -7
- package/dist/chunks/studio-s8dmmz66.js +0 -5
- package/dist/chunks/studio-sp5xzbj4.js +0 -6
- package/dist/chunks/studio-szsjbj0g.js +0 -5
- package/dist/chunks/studio-t1xzawhr.js +0 -16
- package/dist/chunks/studio-tdcprbqb.js +0 -5
- package/dist/chunks/studio-vrmcjf9g.js +0 -7
- package/dist/chunks/studio-vyc0b4he.js +0 -10
- package/dist/chunks/studio-w0cgf6jg.js +0 -5
- package/dist/chunks/studio-w3hskzqk.js +0 -5
- package/dist/chunks/studio-xgrgcdyh.js +0 -9
- package/dist/chunks/studio-xz2yxfcb.js +0 -5
- package/dist/chunks/studio-y6n42tgs.js +0 -5
- package/dist/chunks/studio-yb560vxr.js +0 -5
- package/dist/chunks/studio-yn9f8vtx.js +0 -5
- package/dist/chunks/studio-yw05w8f0.js +0 -7
- package/dist/chunks/studio-z16sgavc.js +0 -5
- package/dist/chunks/studio-zey7zsdw.js +0 -12
- package/dist/chunks/studio-zyqn40w4.js +0 -5
- package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
- package/dist/chunks/tabs-jwthg40w.js +0 -4
- package/dist/chunks/textfield-spy3hc77.js +0 -4
- package/dist/chunks/toast-4d35zd64.js +0 -4
- package/dist/chunks/toast-host-8sjmfed3.js +0 -4
- package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
- package/dist/chunks/tree-h19v1jfz.js +0 -4
- package/dist/chunks/tsMode-2frah6h1.js +0 -14
- package/dist/chunks/workspace-zt81g1ms.js +0 -4
- package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
- package/src/panels/frontmatter-panel.ts +0 -701
- package/src/panels/git-panel.ts +0 -1120
- package/src/surfaces/doc-header.json +0 -776
- package/src/surfaces/doc-header.ts +0 -231
- package/src/surfaces/git-panel.json +0 -1880
- package/src/surfaces/git-panel.ts +0 -272
|
@@ -26,23 +26,43 @@
|
|
|
26
26
|
* @docs studio/ai/chat
|
|
27
27
|
*/
|
|
28
28
|
|
|
29
|
-
import { isSealContent } from "@jxsuite/ai/messages";
|
|
29
|
+
import { SEAL_RELOADED, isSealContent } from "@jxsuite/ai/messages";
|
|
30
30
|
import type { ToolResult } from "@jxsuite/ai/tools";
|
|
31
|
+
import { isBoolean, isNonNullObject, isString } from "@jxsuite/schema/guards";
|
|
31
32
|
import type { PersistedMessage } from "./ai-session-store";
|
|
32
|
-
import { UNANSWERED_TOOL_RESULT } from "./context-manager";
|
|
33
33
|
|
|
34
34
|
/** The tool that suspends a turn on the author (services/ai-ask.ts). */
|
|
35
|
-
const ASK_TOOL = "ask_user";
|
|
35
|
+
export const ASK_TOOL = "ask_user";
|
|
36
36
|
|
|
37
|
-
/**
|
|
38
|
-
|
|
37
|
+
/**
|
|
38
|
+
* The outcome of an ordinary call that never ran to completion — the seal's own words: the object
|
|
39
|
+
* `context-manager.ts`'s `UNANSWERED_TOOL_RESULT` serializes, built from the same sentence.
|
|
40
|
+
*/
|
|
41
|
+
const NEVER_COMPLETED: ToolResult = { success: false, error: SEAL_RELOADED };
|
|
39
42
|
|
|
40
|
-
/**
|
|
43
|
+
/**
|
|
44
|
+
* A tool-call record as persisted: `id` and `name` are what pairing and the chip read. Every member
|
|
45
|
+
* is optional and unchecked, because the records come back out of storage; each is narrowed where
|
|
46
|
+
* it is read.
|
|
47
|
+
*/
|
|
41
48
|
interface PersistedToolCall {
|
|
42
49
|
id?: unknown;
|
|
43
50
|
name?: unknown;
|
|
44
51
|
result?: unknown;
|
|
45
|
-
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Whether a persisted `toolCalls` entry is a record at all. Any object qualifies — every member of
|
|
56
|
+
* {@link PersistedToolCall} is optional — and a primitive (a corrupt or foreign payload) is passed
|
|
57
|
+
* through untouched by both directions.
|
|
58
|
+
*/
|
|
59
|
+
function isToolCallRecord(value: unknown): value is PersistedToolCall {
|
|
60
|
+
return isNonNullObject(value);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Whether a parsed tool message is a `ToolResult`: an object whose `success` is a boolean. */
|
|
64
|
+
function isToolResult(value: unknown): value is ToolResult {
|
|
65
|
+
return isNonNullObject(value) && "success" in value && isBoolean(value.success);
|
|
46
66
|
}
|
|
47
67
|
|
|
48
68
|
/**
|
|
@@ -61,28 +81,29 @@ export function stripToolResults(messages: readonly PersistedMessage[]): Persist
|
|
|
61
81
|
return {
|
|
62
82
|
...message,
|
|
63
83
|
toolCalls: message.toolCalls.map((call) => {
|
|
64
|
-
if (!call
|
|
84
|
+
if (!isToolCallRecord(call)) {
|
|
65
85
|
return call;
|
|
66
86
|
}
|
|
67
|
-
const { result: _result, ...rest } = call
|
|
87
|
+
const { result: _result, ...rest } = call;
|
|
68
88
|
return rest;
|
|
69
89
|
}),
|
|
70
90
|
};
|
|
71
91
|
});
|
|
72
92
|
}
|
|
73
93
|
|
|
74
|
-
/**
|
|
75
|
-
|
|
76
|
-
|
|
94
|
+
/**
|
|
95
|
+
* A tool message's content as a `ToolResult`, or null when it is not one.
|
|
96
|
+
*
|
|
97
|
+
* The content is re-checked as a string although {@link PersistedMessage} declares one: the message
|
|
98
|
+
* came back out of storage, where a corrupt or foreign payload can hold anything.
|
|
99
|
+
*/
|
|
100
|
+
function parseToolResult(content: string): ToolResult | null {
|
|
101
|
+
if (!isString(content)) {
|
|
77
102
|
return null;
|
|
78
103
|
}
|
|
79
104
|
try {
|
|
80
|
-
const parsed = JSON.parse(content)
|
|
81
|
-
return parsed
|
|
82
|
-
typeof parsed === "object" &&
|
|
83
|
-
typeof (parsed as ToolResult).success === "boolean"
|
|
84
|
-
? (parsed as ToolResult)
|
|
85
|
-
: null;
|
|
105
|
+
const parsed: unknown = JSON.parse(content);
|
|
106
|
+
return isToolResult(parsed) ? parsed : null;
|
|
86
107
|
} catch {
|
|
87
108
|
return null;
|
|
88
109
|
}
|
|
@@ -114,7 +135,7 @@ export function backfillToolResults(messages: readonly PersistedMessage[]): Pers
|
|
|
114
135
|
break;
|
|
115
136
|
}
|
|
116
137
|
const result = parseToolResult(reply.content);
|
|
117
|
-
if (
|
|
138
|
+
if (isString(reply.toolCallId) && result && !replies.has(reply.toolCallId)) {
|
|
118
139
|
replies.set(reply.toolCallId, result);
|
|
119
140
|
if (isSealContent(reply.content)) {
|
|
120
141
|
sealed.add(reply.toolCallId);
|
|
@@ -123,12 +144,11 @@ export function backfillToolResults(messages: readonly PersistedMessage[]): Pers
|
|
|
123
144
|
}
|
|
124
145
|
return {
|
|
125
146
|
...message,
|
|
126
|
-
toolCalls: message.toolCalls.map((
|
|
127
|
-
if (!
|
|
128
|
-
return
|
|
147
|
+
toolCalls: message.toolCalls.map((record) => {
|
|
148
|
+
if (!isToolCallRecord(record)) {
|
|
149
|
+
return record;
|
|
129
150
|
}
|
|
130
|
-
const
|
|
131
|
-
const id = typeof record.id === "string" ? record.id : undefined;
|
|
151
|
+
const id = isString(record.id) ? record.id : undefined;
|
|
132
152
|
const answered = id === undefined ? undefined : replies.get(id);
|
|
133
153
|
if (record.name === ASK_TOOL) {
|
|
134
154
|
/* A question's only outcomes are an answer or none: a seal is not an answer, and a
|
|
@@ -22,6 +22,20 @@
|
|
|
22
22
|
* @docs studio/interface/problems-and-progress
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
|
+
/**
|
|
26
|
+
* A W3C `TrustedHTML`: opaque to script, accepted by an injection sink, and stringifying to the
|
|
27
|
+
* markup it wraps. This TypeScript's `lib.dom` does not declare it, so it is declared here with the
|
|
28
|
+
* one member a reader can rely on.
|
|
29
|
+
*/
|
|
30
|
+
export interface TrustedHtml {
|
|
31
|
+
toString: () => string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** The policy object `createPolicy` answers with, narrowed to the one factory the shell calls. */
|
|
35
|
+
export interface StudioPolicy {
|
|
36
|
+
createHTML: (input: string) => TrustedHtml;
|
|
37
|
+
}
|
|
38
|
+
|
|
25
39
|
/** The subset of the Trusted Types API this module uses — typed here so no DOM lib is required. */
|
|
26
40
|
interface TrustedTypesApi {
|
|
27
41
|
createPolicy: (
|
|
@@ -31,7 +45,7 @@ interface TrustedTypesApi {
|
|
|
31
45
|
createScript?: (input: string) => string;
|
|
32
46
|
createScriptURL?: (input: string) => string;
|
|
33
47
|
},
|
|
34
|
-
) =>
|
|
48
|
+
) => StudioPolicy;
|
|
35
49
|
}
|
|
36
50
|
|
|
37
51
|
/** The policy name, which a CSP `trusted-types` directive would have to allow. */
|
|
@@ -75,18 +89,21 @@ export function assertSanitized(value: string): string {
|
|
|
75
89
|
}
|
|
76
90
|
|
|
77
91
|
/** Created once. A second `createPolicy` with the same name throws when policies are restricted. */
|
|
78
|
-
let policy:
|
|
92
|
+
let policy: StudioPolicy | null = null;
|
|
79
93
|
|
|
80
94
|
/**
|
|
81
95
|
* The shell's Trusted Types policy, or null where the API does not exist.
|
|
82
96
|
*
|
|
83
|
-
* @returns {
|
|
97
|
+
* @returns {StudioPolicy | null}
|
|
84
98
|
*/
|
|
85
|
-
export function studioPolicy():
|
|
99
|
+
export function studioPolicy(): StudioPolicy | null {
|
|
86
100
|
if (policy) {
|
|
87
101
|
return policy;
|
|
88
102
|
}
|
|
89
|
-
|
|
103
|
+
/* SAFETY: `trustedTypes` is the member Trusted Types adds to the global scope, which this
|
|
104
|
+
`lib.dom` predates; the intersection only names it, typed as possibly absent, and an absent
|
|
105
|
+
member (a browser without Trusted Types, and the tests) is the `undefined` handled below. */
|
|
106
|
+
const api = (globalThis as typeof globalThis & { trustedTypes?: TrustedTypesApi }).trustedTypes;
|
|
90
107
|
if (!api) {
|
|
91
108
|
return null;
|
|
92
109
|
}
|
|
@@ -110,9 +127,9 @@ export function studioPolicy(): { createHTML: (input: string) => unknown } | nul
|
|
|
110
127
|
* guard that only fires under Trusted Types would be a guard that never fires in the tests.
|
|
111
128
|
*
|
|
112
129
|
* @param {string} value Markup from `markdownToHtml`.
|
|
113
|
-
* @returns {
|
|
130
|
+
* @returns {TrustedHtml | string} A `TrustedHTML`, or the asserted string.
|
|
114
131
|
*/
|
|
115
|
-
export function trustedHtml(value: string):
|
|
132
|
+
export function trustedHtml(value: string): TrustedHtml | string {
|
|
116
133
|
const active = studioPolicy();
|
|
117
134
|
return active ? active.createHTML(value) : assertSanitized(value);
|
|
118
135
|
}
|
|
@@ -76,6 +76,12 @@ export interface ContextEntry {
|
|
|
76
76
|
kind: ContextKind;
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
+
/** A `$media` map, split: the base width, and every other entry classified. */
|
|
80
|
+
export interface ContextSplit {
|
|
81
|
+
base: string;
|
|
82
|
+
entries: ContextEntry[];
|
|
83
|
+
}
|
|
84
|
+
|
|
79
85
|
/**
|
|
80
86
|
* Which kind of context an entry is.
|
|
81
87
|
*
|
|
@@ -98,12 +104,9 @@ export function contextKindOf(query: string): ContextKind {
|
|
|
98
104
|
* Split a `$media` map into the base width and the three context groups.
|
|
99
105
|
*
|
|
100
106
|
* @param {Record<string, string> | undefined} media
|
|
101
|
-
* @returns {
|
|
107
|
+
* @returns {ContextSplit}
|
|
102
108
|
*/
|
|
103
|
-
export function splitContexts(media?: Record<string, string> | undefined): {
|
|
104
|
-
base: string;
|
|
105
|
-
entries: ContextEntry[];
|
|
106
|
-
} {
|
|
109
|
+
export function splitContexts(media?: Record<string, string> | undefined): ContextSplit {
|
|
107
110
|
const source = media ?? {};
|
|
108
111
|
const entries: ContextEntry[] = [];
|
|
109
112
|
for (const [key, raw] of Object.entries(source)) {
|
|
@@ -232,11 +235,11 @@ export function contextsError(container: HTMLElement): { target: string; message
|
|
|
232
235
|
* a projection, which makes reading through to the store the thing that keeps them honest.
|
|
233
236
|
*/
|
|
234
237
|
function currentConfig(): ProjectConfig {
|
|
235
|
-
return
|
|
238
|
+
return projectState?.projectConfig ?? {};
|
|
236
239
|
}
|
|
237
240
|
|
|
238
241
|
function currentMedia(): Record<string, string> {
|
|
239
|
-
return
|
|
242
|
+
return currentConfig().$media ?? {};
|
|
240
243
|
}
|
|
241
244
|
|
|
242
245
|
// ─── Writing ──────────────────────────────────────────────────────────────────
|
|
@@ -271,7 +274,7 @@ async function persistMedia(
|
|
|
271
274
|
target: ErrorTarget,
|
|
272
275
|
): Promise<void> {
|
|
273
276
|
const config = currentConfig();
|
|
274
|
-
const candidate = { ...config, $media: next }
|
|
277
|
+
const candidate: ProjectConfig = { ...config, $media: next };
|
|
275
278
|
let schemaErrors: string[] = [];
|
|
276
279
|
let inherited: string[] = [];
|
|
277
280
|
try {
|
|
@@ -39,6 +39,7 @@
|
|
|
39
39
|
* text. It is one value now, and the field shows it.
|
|
40
40
|
*/
|
|
41
41
|
|
|
42
|
+
import { isFunction, isJsonObject, isNonNullObject, isString } from "@jxsuite/schema/guards";
|
|
42
43
|
import { errorMessage } from "@jxsuite/schema/parse";
|
|
43
44
|
import { getPlatform } from "../platform";
|
|
44
45
|
import { commitProjectConfig } from "../tabs/project-config";
|
|
@@ -48,12 +49,12 @@ import { resolveContextPointer } from "../services/context-resolver";
|
|
|
48
49
|
import { deriveSecretEnvName } from "../services/data-service";
|
|
49
50
|
import { validateProjectConfig } from "../services/jx-validate";
|
|
50
51
|
import { notify } from "../services/notify";
|
|
51
|
-
import {
|
|
52
|
-
import { paneOfContainer } from "../canvas/canvas-surface";
|
|
52
|
+
import { SETTINGS_DIALOG_REGION } from "../surfaces/settings-dialog";
|
|
53
53
|
import { mountContributedSurface } from "../surfaces/settings-contributed";
|
|
54
54
|
|
|
55
55
|
import type { JsonSchema, SchemaFormContext } from "../ui/schema-form";
|
|
56
|
-
import type {
|
|
56
|
+
import type { JsonObject, JsonValue } from "@jxsuite/schema/types";
|
|
57
|
+
import type { ResolveContextOptions } from "../services/context-resolver";
|
|
57
58
|
import type {
|
|
58
59
|
ContributedActions,
|
|
59
60
|
ContributedSurfaceHandle,
|
|
@@ -74,7 +75,13 @@ export interface SettingsContribution {
|
|
|
74
75
|
entry?:
|
|
75
76
|
| {
|
|
76
77
|
ui?: Record<string, { control?: string; enum?: unknown }> | undefined;
|
|
77
|
-
newEntry?:
|
|
78
|
+
newEntry?: JsonObject | undefined;
|
|
79
|
+
/**
|
|
80
|
+
* What ONE entry of a map section is called, singular and lowercase ("content type",
|
|
81
|
+
* "table"), so the column offers "New content type" rather than "New Entry", a word that
|
|
82
|
+
* means a collection's item everywhere else in Studio. Defaults to "entry".
|
|
83
|
+
*/
|
|
84
|
+
noun?: string | undefined;
|
|
78
85
|
}
|
|
79
86
|
| undefined;
|
|
80
87
|
};
|
|
@@ -139,13 +146,8 @@ export function resetContributedSectionState(): void {
|
|
|
139
146
|
* such entry, so the caller's refusal can name both sides.
|
|
140
147
|
*/
|
|
141
148
|
export function selectContributedEntry(sectionKey: string, entryKey: string): string[] | null {
|
|
142
|
-
const section =
|
|
143
|
-
|
|
144
|
-
];
|
|
145
|
-
const entries =
|
|
146
|
-
section && typeof section === "object" && !Array.isArray(section)
|
|
147
|
-
? (section as Record<string, unknown>)
|
|
148
|
-
: {};
|
|
149
|
+
const section = projectState?.projectConfig?.[sectionKey];
|
|
150
|
+
const entries = isJsonObject(section) ? section : {};
|
|
149
151
|
if (!Object.hasOwn(entries, entryKey)) {
|
|
150
152
|
return Object.keys(entries);
|
|
151
153
|
}
|
|
@@ -170,6 +172,14 @@ export function resetContributedDiagnostics(): void {
|
|
|
170
172
|
diagnostics.clear();
|
|
171
173
|
}
|
|
172
174
|
|
|
175
|
+
/** {@link routeDiagnostics}' answer: per-field messages, and the ones about the record itself. */
|
|
176
|
+
export interface RoutedDiagnostics {
|
|
177
|
+
/** The first message for each property one level under the base, keyed by property name. */
|
|
178
|
+
fields: Record<string, string>;
|
|
179
|
+
/** Messages whose pointer is the base itself, for the section line. */
|
|
180
|
+
section: string[];
|
|
181
|
+
}
|
|
182
|
+
|
|
173
183
|
/**
|
|
174
184
|
* Route `jx-validate` messages ("/search/index: must be string") to the field they are about.
|
|
175
185
|
*
|
|
@@ -182,10 +192,7 @@ export function resetContributedDiagnostics(): void {
|
|
|
182
192
|
* @param {string[]} messages
|
|
183
193
|
* @returns
|
|
184
194
|
*/
|
|
185
|
-
export function routeDiagnostics(
|
|
186
|
-
base: string,
|
|
187
|
-
messages: string[],
|
|
188
|
-
): { fields: Record<string, string>; section: string[] } {
|
|
195
|
+
export function routeDiagnostics(base: string, messages: string[]): RoutedDiagnostics {
|
|
189
196
|
const fields: Record<string, string> = {};
|
|
190
197
|
const section: string[] = [];
|
|
191
198
|
for (const message of messages) {
|
|
@@ -230,7 +237,12 @@ export function routeDiagnostics(
|
|
|
230
237
|
* @param {() => void} rerender
|
|
231
238
|
*/
|
|
232
239
|
async function saveProjectConfig(base: string, rerender: () => void) {
|
|
233
|
-
|
|
240
|
+
/* Every caller reached this through `sectionValue`, which returns null without a config, so a
|
|
241
|
+
project is open here; the guard only states that to the compiler. */
|
|
242
|
+
const config = projectState?.projectConfig;
|
|
243
|
+
if (!config) {
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
234
246
|
|
|
235
247
|
const commit = await commitProjectConfig();
|
|
236
248
|
if (!commit.ok) {
|
|
@@ -258,7 +270,7 @@ async function saveProjectConfig(base: string, rerender: () => void) {
|
|
|
258
270
|
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
259
271
|
|
|
260
272
|
/** Apply a schema-form patch onto a record in place; `undefined` values unset the key. */
|
|
261
|
-
function applyPatch(target: Record<string,
|
|
273
|
+
function applyPatch<V>(target: Record<string, V>, patch: Record<string, V | undefined>) {
|
|
262
274
|
for (const [key, value] of Object.entries(patch)) {
|
|
263
275
|
if (value === undefined) {
|
|
264
276
|
delete target[key];
|
|
@@ -277,30 +289,30 @@ function slugify(name: string): string {
|
|
|
277
289
|
}
|
|
278
290
|
|
|
279
291
|
/** Instantiate a newEntry template, substituting `${key}` in every string value. */
|
|
280
|
-
function instantiateNewEntry(
|
|
281
|
-
template: Record<string, unknown> | undefined,
|
|
282
|
-
key: string,
|
|
283
|
-
): Record<string, unknown> {
|
|
292
|
+
function instantiateNewEntry(template: JsonObject | undefined, key: string): JsonObject {
|
|
284
293
|
if (!template) {
|
|
285
294
|
return {};
|
|
286
295
|
}
|
|
287
|
-
const
|
|
288
|
-
|
|
296
|
+
const substituteObject = (value: JsonObject): JsonObject => {
|
|
297
|
+
const out: JsonObject = {};
|
|
298
|
+
for (const [k, v] of Object.entries(value)) {
|
|
299
|
+
out[k] = substitute(v);
|
|
300
|
+
}
|
|
301
|
+
return out;
|
|
302
|
+
};
|
|
303
|
+
const substitute = (value: JsonValue): JsonValue => {
|
|
304
|
+
if (isString(value)) {
|
|
289
305
|
return value.replaceAll("${key}", key);
|
|
290
306
|
}
|
|
291
307
|
if (Array.isArray(value)) {
|
|
292
308
|
return value.map((item) => substitute(item));
|
|
293
309
|
}
|
|
294
|
-
if (value
|
|
295
|
-
|
|
296
|
-
for (const [k, v] of Object.entries(value)) {
|
|
297
|
-
out[k] = substitute(v);
|
|
298
|
-
}
|
|
299
|
-
return out;
|
|
310
|
+
if (isJsonObject(value)) {
|
|
311
|
+
return substituteObject(value);
|
|
300
312
|
}
|
|
301
313
|
return value;
|
|
302
314
|
};
|
|
303
|
-
return
|
|
315
|
+
return substituteObject(template);
|
|
304
316
|
}
|
|
305
317
|
|
|
306
318
|
/**
|
|
@@ -314,53 +326,68 @@ function buildContext(
|
|
|
314
326
|
entryKey: string | null = null,
|
|
315
327
|
): SchemaFormContext {
|
|
316
328
|
const platform = getPlatform();
|
|
317
|
-
|
|
329
|
+
const context: SchemaFormContext = {
|
|
318
330
|
fieldKeyPrefix: `$settings.${sectionKey}`,
|
|
319
|
-
resolvePointer: (pointer, scope) =>
|
|
320
|
-
|
|
321
|
-
projectConfig:
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
: {}),
|
|
331
|
+
resolvePointer: (pointer, scope) => {
|
|
332
|
+
const resolveOpts: ResolveContextOptions = {
|
|
333
|
+
projectConfig: projectState?.projectConfig ?? {},
|
|
334
|
+
};
|
|
335
|
+
/* The scope is the form's current value record, which is section JSON; the guard is what
|
|
336
|
+
lets the compiler see that, and it also stands for the old `!== undefined` test. */
|
|
337
|
+
if (isJsonObject(scope)) {
|
|
338
|
+
resolveOpts.scope = scope;
|
|
339
|
+
}
|
|
340
|
+
if (opts.formats !== undefined) {
|
|
341
|
+
resolveOpts.formats = opts.formats;
|
|
342
|
+
}
|
|
343
|
+
return resolveContextPointer(pointer, resolveOpts);
|
|
344
|
+
},
|
|
334
345
|
};
|
|
346
|
+
if (isFunction(platform.setSecrets)) {
|
|
347
|
+
context.commitSecret = async (key: string, value: string) => {
|
|
348
|
+
const envName = deriveSecretEnvName(sectionKey, entryKey, key);
|
|
349
|
+
await platform.setSecrets!({ set: { [envName]: value } });
|
|
350
|
+
return envName;
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
return context;
|
|
335
354
|
}
|
|
336
355
|
|
|
337
356
|
/** The section's value object in the project config, created on demand. */
|
|
338
|
-
function sectionValue(key: string):
|
|
339
|
-
const config = projectState?.projectConfig
|
|
357
|
+
function sectionValue(key: string): JsonObject | null {
|
|
358
|
+
const config = projectState?.projectConfig;
|
|
340
359
|
if (!config) {
|
|
341
360
|
return null;
|
|
342
361
|
}
|
|
343
362
|
const existing = config[key];
|
|
344
|
-
if (
|
|
345
|
-
return existing
|
|
363
|
+
if (isJsonObject(existing)) {
|
|
364
|
+
return existing;
|
|
346
365
|
}
|
|
347
|
-
const fresh:
|
|
366
|
+
const fresh: JsonObject = {};
|
|
348
367
|
config[key] = fresh;
|
|
349
368
|
return fresh;
|
|
350
369
|
}
|
|
351
370
|
|
|
352
371
|
// ─── Per-container mount ──────────────────────────────────────────────────────
|
|
353
372
|
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
373
|
+
/**
|
|
374
|
+
* A region under the settings dialog, which is where a contributed section is drawn (§17.1): its
|
|
375
|
+
* entry rows and its entry editor are named under `overlay.dialog:settings`, so a shot can crop one
|
|
376
|
+
* without a selector.
|
|
377
|
+
*
|
|
378
|
+
* @param {string} part
|
|
379
|
+
* @returns {string}
|
|
380
|
+
*/
|
|
381
|
+
function sectionRegion(part: string): string {
|
|
382
|
+
return `${SETTINGS_DIALOG_REGION}/${part}`;
|
|
383
|
+
}
|
|
358
384
|
|
|
359
385
|
/** One mounted section: its document, its two island hosts, and what it was last asked to draw. */
|
|
360
386
|
interface SectionMount {
|
|
361
387
|
/** The element the registry handed the renderer, and this record's identity. */
|
|
362
388
|
container: HTMLElement;
|
|
363
|
-
|
|
389
|
+
/** The mounted document, or `null` for the instant between creating this record and mounting. */
|
|
390
|
+
handle: ContributedSurfaceHandle | null;
|
|
364
391
|
contribution: SettingsContribution;
|
|
365
392
|
opts: ContributedSectionOptions;
|
|
366
393
|
/** Where the schema form goes, once the document has made one. */
|
|
@@ -397,14 +424,39 @@ function say(record: SectionMount, value: string): void {
|
|
|
397
424
|
|
|
398
425
|
// ─── Projection ───────────────────────────────────────────────────────────────
|
|
399
426
|
|
|
427
|
+
/** The default name for one entry of a map section, when the contribution names none. */
|
|
428
|
+
const DEFAULT_ENTRY_NOUN = "entry";
|
|
429
|
+
|
|
430
|
+
/** The map column's words for one entry: the four places a map section names it. */
|
|
431
|
+
export interface EntryWords {
|
|
432
|
+
newLabel: string;
|
|
433
|
+
newFieldLabel: string;
|
|
434
|
+
newPlaceholder: string;
|
|
435
|
+
emptyText: string;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/** The map column's words, from what the contribution calls one entry. */
|
|
439
|
+
export function entryWords(noun?: string): EntryWords {
|
|
440
|
+
const word = noun?.trim().toLowerCase() || DEFAULT_ENTRY_NOUN;
|
|
441
|
+
const capitalised = `${word.charAt(0).toUpperCase()}${word.slice(1)}`;
|
|
442
|
+
// "an entry", "a table": the article English reads before the word's first sound, by its letter.
|
|
443
|
+
const article = /^[aeiou]/u.test(word) ? "an" : "a";
|
|
444
|
+
return {
|
|
445
|
+
emptyText: `Select ${article} ${word} or create one`,
|
|
446
|
+
newFieldLabel: `${capitalised} name`,
|
|
447
|
+
newLabel: `New ${word}`,
|
|
448
|
+
newPlaceholder: `${slugify(word)}-name`,
|
|
449
|
+
};
|
|
450
|
+
}
|
|
451
|
+
|
|
400
452
|
/** What the document draws right now, read from the store and this module's own state. */
|
|
401
453
|
function project(record: SectionMount): ContributedView {
|
|
402
|
-
const {
|
|
454
|
+
const { contribution, opts } = record;
|
|
403
455
|
const sectionKey = contribution.key;
|
|
404
456
|
const title = contribution.title ?? sectionKey;
|
|
405
457
|
const actionsState = opts.actions ? "slot" : "none";
|
|
406
|
-
const
|
|
407
|
-
const
|
|
458
|
+
const editorRegion = sectionRegion("editor");
|
|
459
|
+
const words = entryWords(contribution.settings.entry?.noun);
|
|
408
460
|
|
|
409
461
|
if ((contribution.settings.layout ?? "form") !== "map") {
|
|
410
462
|
return {
|
|
@@ -417,21 +469,21 @@ function project(record: SectionMount): ContributedView {
|
|
|
417
469
|
newName: "",
|
|
418
470
|
newState: "closed",
|
|
419
471
|
title,
|
|
472
|
+
...words,
|
|
420
473
|
};
|
|
421
474
|
}
|
|
422
475
|
|
|
423
476
|
const entries = sectionValue(sectionKey) ?? {};
|
|
424
477
|
const selected = selectedEntries.get(sectionKey) ?? null;
|
|
425
478
|
const value = selected === null ? undefined : entries[selected];
|
|
426
|
-
const editing =
|
|
427
|
-
selected !== null && value !== undefined && value !== null && typeof value === "object";
|
|
479
|
+
const editing = selected !== null && isNonNullObject(value);
|
|
428
480
|
return {
|
|
429
481
|
actionsState,
|
|
430
482
|
editorRegion,
|
|
431
483
|
editorState: editing ? "editing" : "empty",
|
|
432
484
|
entries: Object.keys(entries).map((name) => ({
|
|
433
485
|
key: name,
|
|
434
|
-
region:
|
|
486
|
+
region: sectionRegion(`entry:${name}`),
|
|
435
487
|
selected: name === selected,
|
|
436
488
|
})),
|
|
437
489
|
entryName: record.echo ?? (editing ? selected : ""),
|
|
@@ -439,6 +491,7 @@ function project(record: SectionMount): ContributedView {
|
|
|
439
491
|
newName: newEntryNames.get(sectionKey) ?? "",
|
|
440
492
|
newState: newEntryOpen.has(sectionKey) ? "open" : "closed",
|
|
441
493
|
title,
|
|
494
|
+
...words,
|
|
442
495
|
};
|
|
443
496
|
}
|
|
444
497
|
|
|
@@ -499,11 +552,14 @@ function paintForm(record: SectionMount): void {
|
|
|
499
552
|
const entries = sectionValue(sectionKey) ?? {};
|
|
500
553
|
const selected = selectedEntries.get(sectionKey) ?? null;
|
|
501
554
|
const value = selected === null ? undefined : entries[selected];
|
|
502
|
-
if (selected === null || !value
|
|
555
|
+
if (selected === null || !isNonNullObject(value)) {
|
|
503
556
|
host.replaceChildren();
|
|
504
557
|
return;
|
|
505
558
|
}
|
|
506
|
-
|
|
559
|
+
/* SAFETY: a map section's entries are objects by the section schema (`additionalProperties`
|
|
560
|
+
of type object), and the check above admits only objects; an array entry is malformed config
|
|
561
|
+
the form still treats as the record it should be, reading and writing named members. */
|
|
562
|
+
const entry = value as JsonObject;
|
|
507
563
|
const base = `/${sectionKey}/${selected}`;
|
|
508
564
|
place(
|
|
509
565
|
mountSchemaForm(`section:${sectionKey}:${selected}`, contribution.entrySchema, entry, {
|
|
@@ -619,7 +675,7 @@ function actionsFor(record: SectionMount): ContributedActions {
|
|
|
619
675
|
return;
|
|
620
676
|
}
|
|
621
677
|
// Rebuild the map to preserve entry order under the new key
|
|
622
|
-
const next:
|
|
678
|
+
const next: JsonObject = {};
|
|
623
679
|
for (const [k, v] of Object.entries(target)) {
|
|
624
680
|
next[k === selected ? slug : k] = v;
|
|
625
681
|
delete target[k];
|
|
@@ -655,19 +711,20 @@ export function renderContributedSection(
|
|
|
655
711
|
record.contribution = contribution;
|
|
656
712
|
record.opts = opts;
|
|
657
713
|
}
|
|
658
|
-
|
|
659
|
-
|
|
714
|
+
let handle = record?.handle ?? null;
|
|
715
|
+
if (!record || !handle?.attached()) {
|
|
716
|
+
handle?.dispose();
|
|
660
717
|
const fresh: SectionMount = {
|
|
661
718
|
actionsHost: null,
|
|
662
719
|
container,
|
|
663
720
|
contribution,
|
|
664
721
|
echo: null,
|
|
665
722
|
formHost: null,
|
|
666
|
-
handle:
|
|
723
|
+
handle: null,
|
|
667
724
|
opts,
|
|
668
725
|
};
|
|
669
726
|
mounts.set(container, fresh);
|
|
670
|
-
|
|
727
|
+
handle = mountContributedSurface(container, actionsFor(fresh), {
|
|
671
728
|
actionsSlot: (host) => {
|
|
672
729
|
fresh.actionsHost = host;
|
|
673
730
|
paintActions(fresh);
|
|
@@ -677,9 +734,10 @@ export function renderContributedSection(
|
|
|
677
734
|
paintForm(fresh);
|
|
678
735
|
},
|
|
679
736
|
});
|
|
737
|
+
fresh.handle = handle;
|
|
680
738
|
record = fresh;
|
|
681
739
|
}
|
|
682
|
-
|
|
740
|
+
handle.update(project(record));
|
|
683
741
|
paintActions(record);
|
|
684
742
|
paintForm(record);
|
|
685
743
|
}
|