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