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