@jxsuite/studio 4.0.0 → 5.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 +1 -1
- package/data/elements-meta.json +5 -15
- package/data/html-meta.json +51 -6
- package/dist/chunks/{2020-xp8vnwma.js → 2020-g79n01v9.js} +14 -14
- package/dist/chunks/action-group-sp6tna8v.js +118 -0
- package/dist/chunks/adapter-nj7tnjfn.js +13 -0
- package/dist/chunks/cf-account-picker-fyf63pmy.js +495 -0
- package/dist/chunks/cf-settings-71bv5zn9.js +20 -0
- package/dist/chunks/color-area-v17df7b8.js +154 -0
- package/dist/chunks/color-field-anwybnkn.js +208 -0
- package/dist/chunks/color-slider-44ez96fc.js +79 -0
- package/dist/chunks/color-xgg3kfw7.js +35 -0
- package/dist/chunks/combobox-5e7jev23.js +236 -0
- package/dist/chunks/components-2w1f35qs.js +18 -0
- package/dist/chunks/content-source-3wqeas45.js +46 -0
- package/dist/chunks/convert-to-repeater-d0cgnb6d.js +639 -0
- package/dist/chunks/dialog-s890b918.js +85 -0
- package/dist/chunks/editor-3qhbg51x.js +35 -0
- package/dist/chunks/entry-commands-d6g50j7s.js +42 -0
- package/dist/chunks/extension-sections-fy7q4fe9.js +651 -0
- package/dist/chunks/file-ops-3btj6st0.js +47 -0
- package/dist/chunks/files-ef8fgs3w.js +72 -0
- package/dist/chunks/format-host-3c33nwr8.js +40 -0
- package/dist/chunks/fs-events-13tj6sex.js +18 -0
- package/dist/chunks/git-panel-4wp2rn9b.js +49 -0
- package/dist/chunks/icons-yy10wk9r.js +402 -0
- package/dist/chunks/iframe-entry-15g3n6xv.js +114 -0
- package/dist/chunks/iframe-entry-b27vq81n.js +203 -0
- package/dist/chunks/iframe-entry-nbyxee1y.js +154 -0
- package/dist/chunks/iframe-host-jgesd924.js +115 -0
- package/dist/chunks/{index-nj44jpzj.js → index-mdmyx6s2.js} +11 -11
- package/dist/chunks/index-n4j7qxyr.js +109 -0
- package/dist/chunks/{javascript-q8kpmfah.js → javascript-xvrfrpkb.js} +8 -9
- package/dist/chunks/{jsonMode-dkr040ga.js → jsonMode-tyx2kj6p.js} +526 -527
- package/dist/chunks/jx-validate-j0wxk72w.js +15 -0
- package/dist/chunks/layers-1nq5evsh.js +29 -0
- package/dist/chunks/layers-panel-ar2gh90g.js +40 -0
- package/dist/chunks/listbox-6v2ac08j.js +44 -0
- package/dist/chunks/lit-html-m244w9nh.js +17 -0
- package/dist/chunks/media-picker-2qbetq73.js +33 -0
- package/dist/chunks/menu-q99sy9rf.js +285 -0
- package/dist/chunks/menu-rf7n72mf.js +14 -0
- package/dist/chunks/{monaco-binding-rj6xpx9y.js → monaco-binding-sw6en4dw.js} +12 -15
- package/dist/chunks/monaco-buffer-bhy3hb6m.js +24 -0
- package/dist/chunks/{monaco-setup-rws7k4br.js → monaco-setup-8r62fj6y.js} +27 -37
- package/dist/chunks/notify-628t0anh.js +21 -0
- package/dist/chunks/number-field-5cndyft8.js +72 -0
- package/dist/chunks/parse-0zx14y15.js +10 -0
- package/dist/chunks/platform-ts9cg1a4.js +15 -0
- package/dist/chunks/popover-47z3ytva.js +25 -0
- package/dist/chunks/publish-panel-98f7sr3g.js +27 -0
- package/dist/chunks/quick-search-srzz83k2.js +45 -0
- package/dist/chunks/references-n553f0e1.js +26 -0
- package/dist/chunks/right-panel-rrgx2dn3.js +45 -0
- package/dist/chunks/section-registry-5pq32t0q.js +25 -0
- package/dist/chunks/select-2r16ez41.js +49 -0
- package/dist/chunks/split-g7nm1rgb.js +191 -0
- package/dist/chunks/studio-0hqbpbd0.js +62 -0
- package/dist/chunks/studio-18avnhjp.js +2430 -0
- package/dist/chunks/{studio-kryvsw6j.js → studio-1k325pwf.js} +48 -48
- package/dist/chunks/{studio-hbtp0eh1.js → studio-25hkdrkw.js} +356 -85
- package/dist/chunks/studio-26d7myd1.js +258 -0
- package/dist/chunks/{studio-p8j86wag.js → studio-38emantv.js} +22 -5
- package/dist/chunks/studio-3gxv60tn.js +422 -0
- package/dist/chunks/{studio-8swrjbny.js → studio-3hxkd92t.js} +275 -163
- package/dist/chunks/studio-4m0haseg.js +185 -0
- package/dist/chunks/{studio-ynxwkrzd.js → studio-4wbb9ct0.js} +1953 -1785
- package/dist/chunks/{studio-gv8vvshc.js → studio-5523bpzt.js} +11 -11
- package/dist/chunks/{studio-5q69gfag.js → studio-57mf66w2.js} +1753 -2484
- package/dist/chunks/studio-5jy81t3s.js +17463 -0
- package/dist/chunks/studio-5rt7sqa0.js +1168 -0
- package/dist/chunks/studio-5te5tqng.js +81 -0
- package/dist/chunks/{studio-p4ngc046.js → studio-6ewqv390.js} +9 -9
- package/dist/chunks/{studio-9ab8gqsm.js → studio-6nzaktvy.js} +7 -7
- package/dist/chunks/studio-6xa21ej9.js +28 -0
- package/dist/chunks/{studio-5ehhackm.js → studio-727xh0e3.js} +19 -19
- package/dist/chunks/{studio-eenfkt4e.js → studio-79y5sz51.js} +52 -38
- package/dist/chunks/{studio-4q0wznzf.js → studio-7e11jpa9.js} +461 -145
- package/dist/chunks/{studio-q7v10cg2.js → studio-7r42c6ca.js} +17 -7
- package/dist/chunks/studio-7xptrg0j.js +954 -0
- package/dist/chunks/{studio-cft9r4r7.js → studio-81390n6f.js} +22 -22
- package/dist/chunks/{studio-q43a5y9h.js → studio-8jn5yhyn.js} +16 -16
- package/dist/chunks/studio-8qtrpzr3.js +839 -0
- package/dist/chunks/{studio-dg7zyt5x.js → studio-98b3z07n.js} +1 -1
- package/dist/chunks/studio-9xxz1q69.js +1356 -0
- package/dist/chunks/studio-akbww0j5.js +13615 -0
- package/dist/chunks/studio-arfpe389.js +195 -0
- package/dist/chunks/{studio-2zkz8evn.js → studio-az3zd49t.js} +473 -281
- package/dist/chunks/studio-cpvb2ed1.js +1171 -0
- package/dist/chunks/{studio-9r6j5ev1.js → studio-d0300636.js} +5078 -19
- package/dist/chunks/{studio-bgxt93ga.js → studio-d055c37e.js} +13 -13
- package/dist/chunks/studio-d1ja2x9r.js +362 -0
- package/dist/chunks/{studio-b9b6t1dg.js → studio-e1f24eff.js} +5664 -5666
- package/dist/chunks/{studio-4pqqxbrt.js → studio-em9nw8eh.js} +301 -112
- package/dist/chunks/studio-erdatzvp.js +1190 -0
- package/dist/chunks/{studio-g1wdche0.js → studio-esrxgwh6.js} +80 -80
- package/dist/chunks/studio-fabxk6r9.js +2811 -0
- package/dist/chunks/{studio-3n4ndrzh.js → studio-h4nvnjvz.js} +303 -303
- package/dist/chunks/studio-hhvs4sdg.js +195 -0
- package/dist/chunks/{studio-68n67094.js → studio-kcgff4r0.js} +15 -18
- package/dist/chunks/{studio-685s0ytq.js → studio-nqgawfks.js} +572 -572
- package/dist/chunks/{studio-xrapxwwc.js → studio-p1dw8wfw.js} +55 -29
- package/dist/chunks/studio-pm6hgy7r.js +4763 -0
- package/dist/chunks/studio-q0a3yk4n.js +33 -0
- package/dist/chunks/{studio-wcy8trfx.js → studio-q3x06vmj.js} +23 -22
- package/dist/chunks/studio-qahxvnan.js +111 -0
- package/dist/chunks/{studio-53n8bp04.js → studio-r6xmmtfh.js} +1 -1
- package/dist/chunks/{studio-kjjsjak4.js → studio-rkstz940.js} +3661 -6136
- package/dist/chunks/{studio-tvgyw9xw.js → studio-rnyf3f8e.js} +83 -250
- package/dist/chunks/studio-rpyah2ew.js +2805 -0
- package/dist/chunks/studio-rs76k67r.js +12 -0
- package/dist/chunks/{studio-yxrkyv8a.js → studio-s6z853aq.js} +12108 -11766
- package/dist/chunks/{studio-sf7zjgv1.js → studio-sgdc5pfc.js} +8 -8
- package/dist/chunks/studio-tb3ev01j.js +763 -0
- package/dist/chunks/{studio-t5wqwzdh.js → studio-tjjk7jvk.js} +1 -1
- package/dist/chunks/studio-vhv5tgxm.js +51 -0
- package/dist/chunks/{studio-htsf0w6m.js → studio-vz68yn9e.js} +31 -154
- package/dist/chunks/studio-wqpngpsk.js +174 -0
- package/dist/chunks/{studio-eesa1myv.js → studio-x3rty6tr.js} +58 -58
- package/dist/chunks/studio-xsykpvsh.js +8448 -0
- package/dist/chunks/{studio-92ab2jqe.js → studio-y9zedyjn.js} +14 -14
- package/dist/chunks/studio-yxa81f45.js +12 -0
- package/dist/chunks/swatch-group-t0n6h2rn.js +139 -0
- package/dist/chunks/tabs-wbp1cdws.js +156 -0
- package/dist/chunks/textfield-abk6qyee.js +73 -0
- package/dist/chunks/toast-780pvfbv.js +27 -0
- package/dist/chunks/toast-host-3sqv46sn.js +116 -0
- package/dist/chunks/toolbar-xbh5bhtr.js +194 -0
- package/dist/chunks/tooltip-eptb614w.js +369 -0
- package/dist/chunks/tree-a73p0pqm.js +367 -0
- package/dist/chunks/{tsMode-76kr53q0.js → tsMode-jy4m86rv.js} +83 -85
- package/dist/chunks/workspace-wrew8zk4.js +69 -0
- package/dist/chunks/{ws-client-6shc5rze.js → ws-client-ny4zc51r.js} +20 -22
- package/dist/iframe-entry.js +1812 -698
- package/dist/manifest.json +7 -0
- package/dist/studio.js +52900 -36573
- package/dist/workers/editor.worker.js +1040 -1085
- package/dist/workers/json.worker.js +1946 -1991
- package/dist/workers/ts.worker.js +4960 -5005
- package/favicon.ico +0 -0
- package/index.html +2 -0
- package/package.json +22 -55
- package/src/about/about-modal.ts +73 -123
- package/src/browse/library-commands.ts +20 -49
- package/src/browse/library-layouts.ts +87 -218
- package/src/browse/library-pane.ts +406 -438
- package/src/canvas/canvas-helpers.ts +0 -49
- package/src/canvas/canvas-live-render.ts +25 -2
- package/src/canvas/canvas-render.ts +666 -231
- package/src/canvas/canvas-surface.ts +0 -1
- package/src/canvas/canvas-utils.ts +310 -117
- package/src/canvas/dialog-path.ts +76 -0
- package/src/canvas/dialog-state.ts +67 -0
- package/src/canvas/diff-marks.ts +252 -0
- package/src/canvas/diff-toolbar.ts +349 -0
- package/src/canvas/diff-view.ts +123 -0
- package/src/canvas/edit-width-drag.ts +187 -0
- package/src/canvas/edit-width.ts +150 -0
- package/src/canvas/iframe-entry.ts +125 -8
- package/src/canvas/iframe-host.ts +271 -15
- package/src/canvas/iframe-interaction.ts +133 -13
- package/src/canvas/iframe-patch.ts +7 -1
- package/src/canvas/iframe-position.ts +5 -6
- package/src/canvas/iframe-protocol.ts +106 -5
- package/src/canvas/iframe-render.ts +373 -5
- package/src/canvas/iframe-slash.ts +2 -2
- package/src/canvas/iframe-subtree.ts +5 -8
- package/src/canvas/path-mapping.ts +25 -3
- package/src/canvas/popover-path.ts +106 -0
- package/src/canvas/popover-state.ts +155 -0
- package/src/canvas/surface-registry.ts +21 -10
- package/src/collab/presence-chips.ts +51 -73
- package/src/commands/app-commands.ts +10 -0
- package/src/commands/budget.ts +12 -0
- package/src/commands/command-args.ts +369 -6
- package/src/commands/defaults.ts +44 -14
- package/src/commands/live-context.ts +11 -5
- package/src/commands/reference.ts +12 -2
- package/src/commands/registry.ts +165 -8
- package/src/content/entry-commands.ts +16 -23
- package/src/content/entry-editor.ts +144 -101
- package/src/editor/canvas-slash-bridge.ts +2 -2
- package/src/editor/context-menu.ts +49 -200
- package/src/editor/convert-to-component.ts +42 -82
- package/src/editor/convert-to-repeater.ts +132 -173
- package/src/editor/inline-edit.ts +11 -0
- package/src/editor/shortcuts.ts +65 -26
- package/src/editor/slash-menu.ts +150 -157
- package/src/files/file-ops.ts +117 -11
- package/src/files/files.ts +949 -664
- package/src/files/json-layout.ts +474 -0
- package/src/files/media-paths.ts +13 -42
- package/src/files/media-usage.ts +41 -131
- package/src/files/serialize-document.ts +8 -1
- package/src/format/convert-file.ts +16 -10
- package/src/format/format-host.ts +50 -1
- package/src/github/github-auth.ts +71 -29
- package/src/github/github-publish.ts +57 -65
- package/src/grid/cell-editors.ts +46 -4
- package/src/grid/cell-popovers.ts +65 -62
- package/src/grid/grid-open.ts +86 -64
- package/src/grid/grid-panel.ts +390 -469
- package/src/grid/redirects-grid.ts +40 -44
- package/src/hosting/document.ts +2 -0
- package/src/hosting/layout.ts +10 -0
- package/src/i18n/i18n-commands.ts +127 -62
- package/src/media/media-pane.ts +83 -133
- package/src/new-project/add-repo-modal.ts +125 -176
- package/src/new-project/import-tab.ts +201 -250
- package/src/new-project/location-fields.ts +101 -165
- package/src/new-project/new-project-modal.ts +376 -367
- package/src/packages/jxsuite-update.ts +76 -18
- package/src/panels/activity-panel.ts +137 -104
- package/src/panels/ai-chat/chat-markdown.ts +15 -13
- package/src/panels/ai-chat/chat-view.ts +307 -472
- package/src/panels/ai-chat/composer.ts +175 -153
- package/src/panels/ai-chat/sessions-view.ts +31 -62
- package/src/panels/ai-panel.ts +210 -185
- package/src/panels/block-action-bar.ts +437 -643
- package/src/panels/bottom-dock.ts +112 -47
- package/src/panels/chat-panel.ts +19 -14
- package/src/panels/data-explorer.ts +141 -102
- package/src/panels/data-grid.ts +183 -150
- package/src/panels/dnd.ts +75 -20
- package/src/panels/editors.ts +26 -19
- package/src/panels/elements-panel.ts +243 -186
- package/src/panels/empty-state.ts +26 -42
- package/src/panels/events-panel.ts +950 -729
- package/src/panels/formula-workspace.ts +434 -207
- package/src/panels/frontmatter-fields.ts +185 -153
- package/src/panels/frontmatter-panel.ts +411 -187
- package/src/panels/git-diff-open.ts +148 -0
- package/src/panels/git-panel.ts +679 -605
- package/src/panels/head-panel.ts +617 -435
- package/src/panels/i18n-panel.ts +153 -133
- package/src/panels/imports-panel.ts +388 -414
- package/src/panels/jump-bar.ts +174 -147
- package/src/panels/layers-panel.ts +785 -671
- package/src/panels/left-panel.ts +166 -94
- package/src/panels/navigator-panels.ts +1 -1
- package/src/panels/pane-context.ts +529 -677
- package/src/panels/pane-grid.ts +265 -241
- package/src/panels/panel-registry.ts +15 -4
- package/src/panels/problems-panel.ts +177 -99
- package/src/panels/properties-panel.ts +1525 -966
- package/src/panels/provenance.ts +31 -113
- package/src/panels/quick-search.ts +217 -172
- package/src/panels/right-panel.ts +135 -169
- package/src/panels/seo-modal.ts +346 -167
- package/src/panels/settings-menu.ts +109 -646
- package/src/panels/settings-pane.ts +102 -86
- package/src/panels/signals-panel.ts +1318 -1172
- package/src/panels/statement-editor.ts +556 -428
- package/src/panels/style-panel.ts +1367 -630
- package/src/panels/style-utils.ts +36 -32
- package/src/panels/stylebook-doc.ts +30 -73
- package/src/panels/stylebook-layers-panel.ts +202 -109
- package/src/panels/stylebook-panel.ts +124 -88
- package/src/panels/tab-strip.ts +385 -287
- package/src/platforms/cloud.ts +347 -86
- package/src/platforms/devserver.ts +13 -0
- package/src/publish/deploy-checklist.ts +124 -78
- package/src/publish/publish-commands.ts +4 -12
- package/src/publish/publish-panel.ts +165 -299
- package/src/services/a11y-report.ts +100 -43
- package/src/services/ai-command-tools.ts +468 -0
- package/src/services/ai-import-tools.ts +50 -12
- package/src/services/ai-models.ts +108 -1
- package/src/services/ai-session-store.ts +6 -0
- package/src/services/ai-system-prompt.ts +110 -18
- package/src/services/ai-tools.ts +28 -143
- package/src/services/ai-write-report.ts +174 -0
- package/src/services/context-manager.ts +12 -1
- package/src/services/document-assistant.ts +50 -2
- package/src/services/idle.ts +16 -14
- package/src/services/live-surfaces.ts +237 -0
- package/src/services/model-uri.ts +75 -0
- package/src/services/notify.ts +63 -6
- package/src/services/popover-report.ts +325 -0
- package/src/services/surface-registry.ts +56 -0
- package/src/services/tool-executor.ts +17 -0
- package/src/settings/contexts-section.ts +301 -299
- package/src/settings/contributed-section.ts +361 -222
- package/src/settings/css-vars-editor.ts +320 -325
- package/src/settings/defs-editor.ts +572 -535
- package/src/settings/dependencies-editor.ts +79 -107
- package/src/settings/extension-commands.ts +379 -0
- package/src/settings/extension-rows.ts +113 -0
- package/src/settings/extensions-section.ts +287 -0
- package/src/settings/general-settings.ts +130 -181
- package/src/settings/head-editor.ts +10 -305
- package/src/settings/locales-section.ts +146 -196
- package/src/settings/preferences-accounts.ts +193 -12
- package/src/settings/preferences-dialog.ts +384 -307
- package/src/settings/project-sections.ts +108 -181
- package/src/settings/schema-field-ui.ts +11 -399
- package/src/settings/section-registry.ts +8 -1
- package/src/settings/settings-document.ts +31 -29
- package/src/shell/tree.ts +42 -87
- package/src/shell.ts +48 -36
- package/src/studio.ts +90 -67
- package/src/style/token-ref.ts +0 -39
- package/src/surfaces/about.json +263 -0
- package/src/surfaces/about.ts +163 -0
- package/src/surfaces/add-repo.json +486 -0
- package/src/surfaces/add-repo.ts +236 -0
- package/src/surfaces/ai-chat.json +2185 -0
- package/src/surfaces/ai-chat.ts +549 -0
- package/src/surfaces/ai-credentials-form.json +332 -0
- package/src/surfaces/ai-credentials-form.ts +151 -0
- package/src/surfaces/ai-managed-connect.json +108 -0
- package/src/surfaces/ai-managed-connect.ts +123 -0
- package/src/surfaces/ai-model-picker.json +114 -0
- package/src/surfaces/ai-model-picker.ts +139 -0
- package/src/surfaces/block-action-bar.json +640 -0
- package/src/surfaces/block-action-bar.ts +368 -0
- package/src/surfaces/bottom-dock.json +154 -0
- package/src/surfaces/bottom-dock.ts +125 -0
- package/src/surfaces/canvas-stage.json +444 -0
- package/src/surfaces/canvas-stage.ts +253 -0
- package/src/surfaces/cf-account-picker.json +300 -0
- package/src/surfaces/cf-account-picker.ts +214 -0
- package/src/surfaces/commandbar.json +984 -0
- package/src/{panels/toolbar.ts → surfaces/commandbar.ts} +414 -389
- package/src/surfaces/convert-repeater.json +309 -0
- package/src/surfaces/convert-repeater.ts +276 -0
- package/src/surfaces/data-actions.json +157 -0
- package/src/surfaces/data-actions.ts +115 -0
- package/src/surfaces/dialog.json +289 -0
- package/src/surfaces/dialog.ts +343 -0
- package/src/surfaces/diff-toolbar.json +266 -0
- package/src/surfaces/diff-toolbar.ts +139 -0
- package/src/surfaces/doc-header.json +739 -0
- package/src/surfaces/doc-header.ts +223 -0
- package/src/surfaces/empty-state.json +152 -0
- package/src/surfaces/empty-state.ts +173 -0
- package/src/surfaces/entry-editor.json +281 -0
- package/src/surfaces/entry-editor.ts +191 -0
- package/src/surfaces/expression-editor.json +977 -0
- package/src/surfaces/expression-editor.ts +266 -0
- package/src/surfaces/files-panel.json +592 -0
- package/src/surfaces/files-panel.ts +301 -0
- package/src/surfaces/formula-palette.json +364 -0
- package/src/surfaces/formula-palette.ts +340 -0
- package/src/surfaces/git-panel.json +1822 -0
- package/src/surfaces/git-panel.ts +272 -0
- package/src/surfaces/github-auth.json +112 -0
- package/src/surfaces/github-auth.ts +139 -0
- package/src/surfaces/github-publish.json +206 -0
- package/src/surfaces/github-publish.ts +169 -0
- package/src/surfaces/grid-cell.json +218 -0
- package/src/surfaces/grid-cell.ts +120 -0
- package/src/surfaces/grid-open.json +147 -0
- package/src/surfaces/grid-open.ts +87 -0
- package/src/surfaces/grid-panel.json +706 -0
- package/src/surfaces/grid-panel.ts +206 -0
- package/src/surfaces/grid-replace.json +179 -0
- package/src/surfaces/grid-replace.ts +89 -0
- package/src/surfaces/grid-views.json +446 -0
- package/src/surfaces/grid-views.ts +172 -0
- package/src/surfaces/inspector-dock.json +187 -0
- package/src/surfaces/inspector-dock.ts +161 -0
- package/src/surfaces/jump-bar.json +243 -0
- package/src/surfaces/jump-bar.ts +129 -0
- package/src/surfaces/jxsuite-update.json +146 -0
- package/src/surfaces/jxsuite-update.ts +149 -0
- package/src/surfaces/library-pane.json +1509 -0
- package/src/surfaces/library-pane.ts +363 -0
- package/src/surfaces/logic-panel.json +1949 -0
- package/src/surfaces/logic-panel.ts +369 -0
- package/src/surfaces/logic-workspace.json +685 -0
- package/src/surfaces/logic-workspace.ts +238 -0
- package/src/surfaces/media-browser.json +303 -0
- package/src/surfaces/media-browser.ts +145 -0
- package/src/surfaces/media-field.json +163 -0
- package/src/surfaces/media-field.ts +116 -0
- package/src/surfaces/media-pane.json +513 -0
- package/src/surfaces/media-pane.ts +197 -0
- package/src/surfaces/menu.json +232 -0
- package/src/surfaces/menu.ts +375 -0
- package/src/surfaces/navigator-dock.json +113 -0
- package/src/surfaces/navigator-dock.ts +130 -0
- package/src/surfaces/new-project.json +1654 -0
- package/src/surfaces/new-project.ts +411 -0
- package/src/surfaces/palette.json +535 -0
- package/src/surfaces/pane-context.json +1497 -0
- package/src/surfaces/pane-context.ts +513 -0
- package/src/surfaces/pane-grid.json +188 -0
- package/src/surfaces/pane-grid.ts +250 -0
- package/src/surfaces/panel-activity.json +563 -0
- package/src/surfaces/panel-activity.ts +187 -0
- package/src/surfaces/panel-data.json +141 -0
- package/src/surfaces/panel-data.ts +156 -0
- package/src/surfaces/panel-deploy-checklist.json +283 -0
- package/src/surfaces/panel-deploy-checklist.ts +175 -0
- package/src/surfaces/panel-elements.json +367 -0
- package/src/surfaces/panel-elements.ts +175 -0
- package/src/surfaces/panel-i18n.json +569 -0
- package/src/surfaces/panel-i18n.ts +212 -0
- package/src/surfaces/panel-imports.json +780 -0
- package/src/surfaces/panel-imports.ts +209 -0
- package/src/surfaces/panel-outline.json +734 -0
- package/src/surfaces/panel-outline.ts +326 -0
- package/src/surfaces/panel-page.json +1017 -0
- package/src/surfaces/panel-page.ts +240 -0
- package/src/surfaces/panel-problems.json +497 -0
- package/src/surfaces/panel-problems.ts +157 -0
- package/src/surfaces/panel-signals.json +1973 -0
- package/src/surfaces/panel-signals.ts +436 -0
- package/src/surfaces/panel-stylebook-layers.json +317 -0
- package/src/surfaces/panel-stylebook-layers.ts +155 -0
- package/src/surfaces/preferences.json +850 -0
- package/src/surfaces/preferences.ts +332 -0
- package/src/surfaces/progress-modal.json +110 -0
- package/src/surfaces/progress-modal.ts +150 -0
- package/src/surfaces/properties-panel.json +1578 -0
- package/src/surfaces/properties-panel.ts +337 -0
- package/src/surfaces/publish.json +945 -0
- package/src/surfaces/publish.ts +392 -0
- package/src/surfaces/push-plan.json +110 -0
- package/src/surfaces/push-plan.ts +87 -0
- package/src/surfaces/rail.json +255 -0
- package/src/surfaces/rail.ts +206 -0
- package/src/surfaces/reference-field.json +191 -0
- package/src/surfaces/reference-field.ts +168 -0
- package/src/surfaces/schema-builder.json +1011 -0
- package/src/surfaces/schema-builder.ts +181 -0
- package/src/surfaces/schema-form.json +1013 -0
- package/src/surfaces/schema-form.ts +287 -0
- package/src/surfaces/secret-field.json +60 -0
- package/src/surfaces/secret-field.ts +146 -0
- package/src/surfaces/seo.json +932 -0
- package/src/surfaces/seo.ts +334 -0
- package/src/surfaces/settings-contexts.json +538 -0
- package/src/surfaces/settings-contexts.ts +196 -0
- package/src/surfaces/settings-contributed.json +489 -0
- package/src/surfaces/settings-contributed.ts +199 -0
- package/src/surfaces/settings-css-vars.json +820 -0
- package/src/surfaces/settings-css-vars.ts +199 -0
- package/src/surfaces/settings-defs.json +1363 -0
- package/src/surfaces/settings-defs.ts +232 -0
- package/src/surfaces/settings-deploy.json +108 -0
- package/src/surfaces/settings-deploy.ts +135 -0
- package/src/surfaces/settings-extensions.json +486 -0
- package/src/surfaces/settings-extensions.ts +201 -0
- package/src/surfaces/settings-head.json +779 -0
- package/src/surfaces/settings-head.ts +397 -0
- package/src/surfaces/settings-locales.json +420 -0
- package/src/surfaces/settings-locales.ts +137 -0
- package/src/surfaces/settings-overview.json +423 -0
- package/src/surfaces/settings-overview.ts +218 -0
- package/src/surfaces/settings-packages.json +549 -0
- package/src/surfaces/settings-packages.ts +158 -0
- package/src/surfaces/settings-pane.json +147 -0
- package/src/surfaces/settings-pane.ts +150 -0
- package/src/surfaces/settings-rawjson.json +104 -0
- package/src/surfaces/settings-rawjson.ts +107 -0
- package/src/surfaces/shell.json +99 -0
- package/src/surfaces/shell.ts +30 -0
- package/src/surfaces/slash-menu.json +180 -0
- package/src/surfaces/slash-menu.ts +272 -0
- package/src/surfaces/statements.json +607 -0
- package/src/surfaces/statements.ts +238 -0
- package/src/surfaces/statusbar.json +94 -0
- package/src/{panels → surfaces}/statusbar.ts +163 -90
- package/src/surfaces/style-panel.json +1643 -0
- package/src/surfaces/style-panel.ts +338 -0
- package/src/surfaces/stylebook-chrome.json +122 -0
- package/src/surfaces/stylebook-chrome.ts +122 -0
- package/src/surfaces/tab-strip.json +448 -0
- package/src/surfaces/tab-strip.ts +200 -0
- package/src/surfaces/target-line.json +419 -0
- package/src/surfaces/target-line.ts +349 -0
- package/src/surfaces/toasts.json +189 -0
- package/src/surfaces/welcome.json +571 -0
- package/src/surfaces/welcome.ts +338 -0
- package/src/tabs/project-config.ts +71 -15
- package/src/tabs/tab.ts +52 -1
- package/src/types.ts +49 -3
- package/src/ui/ai-credentials-form.ts +104 -100
- package/src/ui/ai-managed-connect.ts +116 -49
- package/src/ui/ai-model-picker.ts +102 -47
- package/src/ui/cf-account-picker.ts +135 -0
- package/src/ui/color-selector.ts +80 -301
- package/src/ui/dynamic-slot.ts +43 -283
- package/src/ui/expression-editor.ts +797 -576
- package/src/ui/field-input.ts +8 -181
- package/src/ui/form-controls.ts +838 -366
- package/src/ui/formula-chips.ts +80 -85
- package/src/ui/kit.ts +33 -0
- package/src/ui/layers.ts +293 -593
- package/src/ui/media-picker.ts +203 -284
- package/src/ui/panel-resize.ts +251 -64
- package/src/ui/popover-surface.ts +153 -0
- package/src/ui/progress-modal.ts +22 -60
- package/src/ui/regions.ts +13 -7
- package/src/ui/schema-form.ts +906 -440
- package/src/ui/surface.ts +122 -0
- package/src/ui/unit-selector.ts +15 -131
- package/src/ui/value-source.ts +14 -0
- package/src/ui/virtual-window.ts +88 -9
- package/src/utils/canvas-media.ts +72 -0
- package/src/utils/edit-display.ts +7 -2
- package/src/utils/element-selectors.ts +69 -0
- package/src/utils/link-target.ts +2 -2
- package/src/utils/studio-utils.ts +0 -10
- package/src/view.ts +15 -0
- package/src/workspace/pane-derive.ts +36 -14
- package/src/workspace/workspace.ts +15 -6
- package/styles/canvas.css +72 -467
- package/styles/forced-colors.css +48 -82
- package/styles/forced-colors.json +41 -0
- package/styles/inspector.css +2 -1301
- package/styles/overlays.css +96 -2823
- package/styles/panels.css +6 -1423
- package/styles/shell-frame.css +272 -0
- package/styles/shell-frame.json +227 -0
- package/styles/shell.css +0 -1532
- package/styles/tokens.css +65 -136
- package/styles/tokens.json +84 -0
- package/dist/chunks/Overlay.dev-723bv0df.js +0 -23
- package/dist/chunks/adapter-jkcyhgtr.js +0 -14
- package/dist/chunks/cf-settings-45fgyx8y.js +0 -21
- package/dist/chunks/components-zmx10t62.js +0 -21
- package/dist/chunks/content-source-t88vb2dr.js +0 -49
- package/dist/chunks/convert-to-repeater-dhw1nrz9.js +0 -268
- package/dist/chunks/editor-cptq5jp1.js +0 -37
- package/dist/chunks/entry-commands-6z6bhxg0.js +0 -46
- package/dist/chunks/extension-sections-3ydgjbdy.js +0 -311
- package/dist/chunks/file-ops-rskmhxyq.js +0 -48
- package/dist/chunks/files-0cratsr0.js +0 -92
- package/dist/chunks/flow-qbfgrpeh.js +0 -634
- package/dist/chunks/focus-trap.esm-ggawf1hy.js +0 -1024
- package/dist/chunks/focus-visible-6eg70z18.js +0 -167
- package/dist/chunks/format-host-tgcmfs4p.js +0 -43
- package/dist/chunks/fs-events-hrrg328g.js +0 -21
- package/dist/chunks/git-panel-0yywyk76.js +0 -58
- package/dist/chunks/index-zqxmqxmh.js +0 -109
- package/dist/chunks/jx-validate-8q2g05x1.js +0 -19
- package/dist/chunks/layers-panel-z3tqe5cd.js +0 -67
- package/dist/chunks/layers-q75tj2mf.js +0 -45
- package/dist/chunks/lit-html-j055mkh8.js +0 -22
- package/dist/chunks/monaco-buffer-dqw0xxpx.js +0 -25
- package/dist/chunks/notify-yjm79n4s.js +0 -30
- package/dist/chunks/parse-24d0gay3.js +0 -19
- package/dist/chunks/platform-ba1j1gbh.js +0 -16
- package/dist/chunks/publish-panel-54jvhskq.js +0 -28
- package/dist/chunks/quick-search-cgfmjwq5.js +0 -65
- package/dist/chunks/references-3qx8fkyp.js +0 -29
- package/dist/chunks/right-panel-cqp8bc4v.js +0 -46
- package/dist/chunks/section-registry-sx1ykvkw.js +0 -30
- package/dist/chunks/sp-overlay.dev-yztmtrs1.js +0 -18
- package/dist/chunks/sp-popover.dev-n2etmqdp.js +0 -9
- package/dist/chunks/sp-progress-circle.dev-hryhj0es.js +0 -15
- package/dist/chunks/sp-tooltip.dev-xcvpnqr0.js +0 -15
- package/dist/chunks/sp-tray.dev-tkbscm06.js +0 -199
- package/dist/chunks/studio-0a5qrh01.js +0 -3
- package/dist/chunks/studio-18j3bmcz.js +0 -14
- package/dist/chunks/studio-1hbqnt19.js +0 -1823
- package/dist/chunks/studio-4rzyrtjz.js +0 -426
- package/dist/chunks/studio-5rywrkxz.js +0 -1903
- package/dist/chunks/studio-7afd21nw.js +0 -67
- package/dist/chunks/studio-7nte2hj4.js +0 -613
- package/dist/chunks/studio-8jpzqk5s.js +0 -128
- package/dist/chunks/studio-8q517dfr.js +0 -24
- package/dist/chunks/studio-9c4k4vhv.js +0 -357
- package/dist/chunks/studio-9n4mrmnb.js +0 -184
- package/dist/chunks/studio-a0tswy0w.js +0 -58
- package/dist/chunks/studio-ahjfdy6e.js +0 -387
- package/dist/chunks/studio-ahnzd9rg.js +0 -23
- package/dist/chunks/studio-bw5dz6km.js +0 -608
- package/dist/chunks/studio-cb12yz9w.js +0 -15055
- package/dist/chunks/studio-d1ks410h.js +0 -175
- package/dist/chunks/studio-eqq1w638.js +0 -113
- package/dist/chunks/studio-ex8zyp98.js +0 -1813
- package/dist/chunks/studio-h4rxscfc.js +0 -10
- package/dist/chunks/studio-kyh9avvv.js +0 -28
- package/dist/chunks/studio-kyk2v92a.js +0 -659
- package/dist/chunks/studio-m3hwn7y1.js +0 -120
- package/dist/chunks/studio-mmv72a27.js +0 -4344
- package/dist/chunks/studio-n8b9wqwy.js +0 -291
- package/dist/chunks/studio-pdfjntbk.js +0 -6939
- package/dist/chunks/studio-qq6jym04.js +0 -53
- package/dist/chunks/studio-r1r7afxx.js +0 -1066
- package/dist/chunks/studio-rdx8jcxy.js +0 -83
- package/dist/chunks/studio-rn9ta2mz.js +0 -111
- package/dist/chunks/studio-t7qb9db8.js +0 -665
- package/dist/chunks/studio-tmc5emrw.js +0 -8
- package/dist/chunks/studio-txwkm6p9.js +0 -12
- package/dist/chunks/studio-v38hmvx1.js +0 -390
- package/dist/chunks/studio-vadzgkrz.js +0 -318
- package/dist/chunks/studio-wx5609xd.js +0 -341
- package/dist/chunks/studio-z6nw2ek2.js +0 -18
- package/dist/chunks/studio-zczps70q.js +0 -378
- package/dist/chunks/workspace-xpres40v.js +0 -89
- package/src/panels/activity-bar.ts +0 -251
- package/src/panels/panel-scheduler.ts +0 -219
- package/src/panels/style-inputs.ts +0 -237
- package/src/panels/target-line.ts +0 -274
- package/src/panels/welcome-screen.ts +0 -346
- package/src/ui/button-group.ts +0 -102
- package/src/ui/choice-field.ts +0 -72
- package/src/ui/field-row.ts +0 -249
- package/src/ui/formula-palette.ts +0 -213
- package/src/ui/icons.ts +0 -52
- package/src/ui/jx-theme.ts +0 -130
- package/src/ui/spectrum.ts +0 -340
- package/src/ui/value-selector.ts +0 -174
- package/src/ui/widgets.ts +0 -172
- /package/dist/chunks/{javascript-s56a8dpk.css → javascript-4abzjcy9.css} +0 -0
- /package/dist/chunks/{jsonMode-zr9sw0c7.css → jsonMode-vvmpmk34.css} +0 -0
- /package/dist/chunks/{monaco-setup-pav68602.css → monaco-setup-8vbyqnhr.css} +0 -0
- /package/dist/chunks/{tsMode-ef187txx.css → tsMode-hnxxb73h.css} +0 -0
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Ai-import-tools.ts — `import_site`, the assistant's other way to bootstrap a project.
|
|
3
3
|
*
|
|
4
|
-
* A sibling of `create_project` (`ai-project-tools.ts`) with a different backend: it drives
|
|
5
|
-
*
|
|
6
|
-
* the transcript draws, and then adopts the result exactly as a
|
|
4
|
+
* A sibling of `create_project` (`ai-project-tools.ts`) with a different backend: it drives whatever
|
|
5
|
+
* import pipeline the platform's `importSite` reaches — a local headless Chrome, or a hosted one —
|
|
6
|
+
* streams its progress into a record the transcript draws, and then adopts the result exactly as a
|
|
7
|
+
* scaffold is adopted. Its own module
|
|
7
8
|
* rather than an eighth tool in `ai-project-tools.ts`, which is already 650 lines under a per-file
|
|
8
9
|
* coverage bar.
|
|
9
10
|
*
|
|
@@ -115,6 +116,40 @@ function isAbsolutePath(path: string): boolean {
|
|
|
115
116
|
return /^(?:[a-zA-Z]:[/\\]|\/)/.test(path);
|
|
116
117
|
}
|
|
117
118
|
|
|
119
|
+
/**
|
|
120
|
+
* `owner/repo`, conservatively — the destination a `createDestination: "repo"` platform writes to.
|
|
121
|
+
*
|
|
122
|
+
* Narrower than GitHub's own rules on purpose: this guards a string the MODEL may supply, and the
|
|
123
|
+
* cost of refusing an exotic-but-legal name is one clarifying question, while the cost of accepting
|
|
124
|
+
* a path-shaped or query-shaped one is a request the backend has to defend against.
|
|
125
|
+
*/
|
|
126
|
+
const REPO_DESTINATION = /^[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?\/[A-Za-z0-9._-]+$/;
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Whether `destination` is a shape THIS platform can write to, or the sentence saying why not.
|
|
130
|
+
*
|
|
131
|
+
* The platform's `createDestination` decides, not the string's own look: a hosted backend creates a
|
|
132
|
+
* GitHub repository and has no filesystem to hold an absolute path, and a desktop backend has no
|
|
133
|
+
* repository to create. Answering by inspecting the string would accept `owner/repo` on desktop,
|
|
134
|
+
* where it silently means a relative directory nobody named.
|
|
135
|
+
*
|
|
136
|
+
* @param {string} destination - The resolved destination, from the model or the wizard's brief
|
|
137
|
+
* @returns {string | null} The refusal, or null when it is usable
|
|
138
|
+
*/
|
|
139
|
+
function destinationProblem(destination: string): string | null {
|
|
140
|
+
if (getPlatform().createDestination === "repo") {
|
|
141
|
+
if (!REPO_DESTINATION.test(destination)) {
|
|
142
|
+
return `"directory" must name a repository as "owner/repo": ${destination}`;
|
|
143
|
+
}
|
|
144
|
+
} else if (!isAbsolutePath(destination)) {
|
|
145
|
+
return `"directory" must be an absolute path: ${destination}`;
|
|
146
|
+
}
|
|
147
|
+
if (destination.split(/[/\\]/).includes("..")) {
|
|
148
|
+
return `"directory" must not contain "..": ${destination}`;
|
|
149
|
+
}
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
|
|
118
153
|
/**
|
|
119
154
|
* One run has already succeeded in this session.
|
|
120
155
|
*
|
|
@@ -242,8 +277,10 @@ export function registerImportTools(
|
|
|
242
277
|
directory: {
|
|
243
278
|
type: "string",
|
|
244
279
|
description:
|
|
245
|
-
"
|
|
246
|
-
|
|
280
|
+
"Where the project goes, in whichever form this studio's backend uses: an absolute " +
|
|
281
|
+
'folder on a filesystem host, or "owner/repo" on a host where a project IS a ' +
|
|
282
|
+
"repository. Omit it when an import was started from the New Project form — that " +
|
|
283
|
+
"destination is the one the user chose, and it wins.",
|
|
247
284
|
},
|
|
248
285
|
depth: {
|
|
249
286
|
type: "number",
|
|
@@ -361,15 +398,16 @@ export function registerImportTools(
|
|
|
361
398
|
const destination = requested || brief?.directory || "";
|
|
362
399
|
if (!destination) {
|
|
363
400
|
return toolError(
|
|
364
|
-
|
|
365
|
-
"the project
|
|
401
|
+
platform.createDestination === "repo"
|
|
402
|
+
? 'Pass "directory" — the "owner/repo" to create the project as. Ask the user which ' +
|
|
403
|
+
"account and repository name rather than guessing."
|
|
404
|
+
: 'Pass "directory" — the absolute folder to create the project in. Ask the user ' +
|
|
405
|
+
"where the project should live rather than guessing.",
|
|
366
406
|
);
|
|
367
407
|
}
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
if (destination.split(/[/\\]/).includes("..")) {
|
|
372
|
-
return toolError(`"directory" must not contain "..": ${destination}`);
|
|
408
|
+
const problem = destinationProblem(destination);
|
|
409
|
+
if (problem) {
|
|
410
|
+
return toolError(problem);
|
|
373
411
|
}
|
|
374
412
|
|
|
375
413
|
const id = currentToolCallId();
|
|
@@ -20,6 +20,16 @@ import { onSettingsChanged } from "./settings/kernel";
|
|
|
20
20
|
export interface AiModel {
|
|
21
21
|
id: string;
|
|
22
22
|
name: string;
|
|
23
|
+
/**
|
|
24
|
+
* Whether the backend says the model can call tools.
|
|
25
|
+
*
|
|
26
|
+
* Absent when it did not say, which is the ordinary case for a BYOK provider — only a managed
|
|
27
|
+
* catalogue knows. `false` is therefore a statement and `undefined` is silence, and no gate may
|
|
28
|
+
* collapse the two: a Workers AI chat-only model must be labelled, an OpenAI model must not.
|
|
29
|
+
*/
|
|
30
|
+
toolSupport?: boolean;
|
|
31
|
+
/** The backend's declared context window in tokens, when it declares one. */
|
|
32
|
+
contextWindow?: number;
|
|
23
33
|
}
|
|
24
34
|
|
|
25
35
|
/**
|
|
@@ -74,6 +84,23 @@ let proxyCode: AiModelsResponse["code"];
|
|
|
74
84
|
let proxyProbe: Promise<void> | null = null;
|
|
75
85
|
const probeListeners = new Set<() => void>();
|
|
76
86
|
|
|
87
|
+
/**
|
|
88
|
+
* How long a settled probe is trusted before a window refocus re-runs it.
|
|
89
|
+
*
|
|
90
|
+
* The probe is one-shot by construction (`proxyProbe ??=`) and the only thing that re-arms it is
|
|
91
|
+
* the settings subscription below — which never fires for a HOSTED grant, because nothing about it
|
|
92
|
+
* is stored in this browser. So a Cloudflare grant that lapsed mid-session left every gate showing
|
|
93
|
+
* the reading it took at boot: the assistant reported itself configured, and every send failed. Ten
|
|
94
|
+
* minutes is well inside the hour a Cloudflare access token lives.
|
|
95
|
+
*/
|
|
96
|
+
export const PROBE_STALE_MS = 600_000;
|
|
97
|
+
|
|
98
|
+
/** When the probe last settled (0 = never). The age {@link PROBE_STALE_MS} is measured against. */
|
|
99
|
+
let probeSettledAt = 0;
|
|
100
|
+
|
|
101
|
+
/** Whether {@link installProbeRefresh} has already registered its listener. */
|
|
102
|
+
let probeRefreshInstalled = false;
|
|
103
|
+
|
|
77
104
|
/**
|
|
78
105
|
* Drop the cached list and the capability reading.
|
|
79
106
|
*
|
|
@@ -93,6 +120,7 @@ export function resetModelCache() {
|
|
|
93
120
|
would strand every gate on a permanent "unconfigured, unmanaged" reading — ensureProxyProbe
|
|
94
121
|
would no-op forever and the managed option would vanish until a full reload. */
|
|
95
122
|
proxyProbe = null;
|
|
123
|
+
probeSettledAt = 0;
|
|
96
124
|
}
|
|
97
125
|
|
|
98
126
|
/** The keys whose value changes what a provider would answer with. */
|
|
@@ -117,6 +145,33 @@ export function cachedModels(credentials: AiCredentials): AiModel[] | null {
|
|
|
117
145
|
return cache && cacheKey === fingerprint(credentials) ? cache : null;
|
|
118
146
|
}
|
|
119
147
|
|
|
148
|
+
/**
|
|
149
|
+
* A model's entry in whatever list is cached, by id.
|
|
150
|
+
*
|
|
151
|
+
* Deliberately NOT keyed by credentials, unlike {@link cachedModels}. That key exists because
|
|
152
|
+
* SHOWING one provider's catalogue under another's credentials is a lie about what is available;
|
|
153
|
+
* asking "what did the backend say about this id" is not — the answer is either recorded or it is
|
|
154
|
+
* not, and a mismatched key just yields `undefined`, which every caller already has to handle.
|
|
155
|
+
*/
|
|
156
|
+
function cachedModel(id: string): AiModel | undefined {
|
|
157
|
+
return cache?.find((model) => model.id === id);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Whether the backend said this model can call tools — `undefined` when it said nothing.
|
|
162
|
+
*
|
|
163
|
+
* The distinction is the whole point: a chat-only model is a legitimate choice, so this labels and
|
|
164
|
+
* warns rather than gating, and silence must read as "no opinion" rather than as "no tools".
|
|
165
|
+
*/
|
|
166
|
+
export function modelToolSupport(id: string): boolean | undefined {
|
|
167
|
+
return cachedModel(id)?.toolSupport;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/** The backend's declared context window for a model, in tokens — `undefined` when it declared none. */
|
|
171
|
+
export function modelContextWindow(id: string): number | undefined {
|
|
172
|
+
return cachedModel(id)?.contextWindow;
|
|
173
|
+
}
|
|
174
|
+
|
|
120
175
|
/**
|
|
121
176
|
* Run the capability probe once, repainting `onSettled` when it lands. Idempotent: concurrent and
|
|
122
177
|
* repeated callers share the single in-flight fetch, and every registered host is notified. Probe
|
|
@@ -133,12 +188,50 @@ export function ensureProxyProbe(onSettled?: () => void) {
|
|
|
133
188
|
// Unreachable proxy — the key gate stays up.
|
|
134
189
|
})
|
|
135
190
|
.then(() => {
|
|
191
|
+
probeSettledAt = Date.now();
|
|
136
192
|
for (const notify of probeListeners) {
|
|
137
193
|
notify();
|
|
138
194
|
}
|
|
139
195
|
});
|
|
140
196
|
}
|
|
141
197
|
|
|
198
|
+
/**
|
|
199
|
+
* Re-run the capability probe when it is older than {@link PROBE_STALE_MS} and the backend holds
|
|
200
|
+
* the credentials. Returns whether it re-armed, so a caller (and a test) can see that it did.
|
|
201
|
+
*
|
|
202
|
+
* Managed-only on purpose. A BYOK reading changes only when the stored key does, and the settings
|
|
203
|
+
* subscription already covers that; a hosted grant expires on a clock this browser cannot see.
|
|
204
|
+
*/
|
|
205
|
+
export function refreshStaleProbe(): boolean {
|
|
206
|
+
if (!proxyManaged || probeSettledAt === 0 || Date.now() - probeSettledAt < PROBE_STALE_MS) {
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
proxyProbe = null;
|
|
210
|
+
probeSettledAt = 0;
|
|
211
|
+
ensureProxyProbe();
|
|
212
|
+
return true;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Re-check the probe whenever the window regains focus, which is where a lapsed grant is noticed.
|
|
217
|
+
*
|
|
218
|
+
* `focus` rather than a timer: the reading only matters when somebody is looking at Studio, and the
|
|
219
|
+
* OAuth reconnect the stale reading would have hidden happens in another tab — so coming back IS
|
|
220
|
+
* the event. Idempotent, and a no-op outside a browser so the module stays importable under a
|
|
221
|
+
* bare-`bun` runner.
|
|
222
|
+
*/
|
|
223
|
+
export function installProbeRefresh(): void {
|
|
224
|
+
if (typeof window === "undefined" || probeRefreshInstalled) {
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
probeRefreshInstalled = true;
|
|
228
|
+
window.addEventListener("focus", () => {
|
|
229
|
+
refreshStaleProbe();
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
installProbeRefresh();
|
|
234
|
+
|
|
142
235
|
/**
|
|
143
236
|
* Whether the assistant can run at all: a key stored in this browser, or a backend that holds
|
|
144
237
|
* credentials itself (managed cloud platforms, env-keyed dev servers). Every credentials gate must
|
|
@@ -263,7 +356,21 @@ export async function fetchAvailableModels(
|
|
|
263
356
|
proxyManaged = data.managed === true;
|
|
264
357
|
proxyDefaultModel = data.defaultModel ?? "";
|
|
265
358
|
proxyCode = data.code;
|
|
266
|
-
|
|
359
|
+
/* Capabilities are kept, not dropped. The backend has reported `toolSupport` all along and the
|
|
360
|
+
ingest mapped `{id, name}` only, so a Workers AI model that cannot call tools looked exactly
|
|
361
|
+
like one that can — the agent loop ran, called nothing, and answered as if that were normal.
|
|
362
|
+
The keys are OMITTED rather than set to undefined: absent means "the backend said nothing",
|
|
363
|
+
which is a third state both consumers depend on. */
|
|
364
|
+
cache = (data.models || []).map((m) => {
|
|
365
|
+
const model: AiModel = { id: m.id, name: m.name || m.id };
|
|
366
|
+
if (typeof m.contextWindow === "number") {
|
|
367
|
+
model.contextWindow = m.contextWindow;
|
|
368
|
+
}
|
|
369
|
+
if (typeof m.toolSupport === "boolean") {
|
|
370
|
+
model.toolSupport = m.toolSupport;
|
|
371
|
+
}
|
|
372
|
+
return model;
|
|
373
|
+
});
|
|
267
374
|
cacheKey = key;
|
|
268
375
|
return cache;
|
|
269
376
|
}
|
|
@@ -45,6 +45,12 @@ export interface PersistedMessage {
|
|
|
45
45
|
id?: string;
|
|
46
46
|
role: string;
|
|
47
47
|
content: string;
|
|
48
|
+
/**
|
|
49
|
+
* A thinking model's chain-of-thought for the turn. Persisted because the provider requires it
|
|
50
|
+
* back: a restored DeepSeek conversation whose reasoning was dropped on the way to storage is one
|
|
51
|
+
* the next send cannot replay (see `@jxsuite/ai`'s `toMessagesArray`).
|
|
52
|
+
*/
|
|
53
|
+
reasoningContent?: string;
|
|
48
54
|
toolCalls?: unknown[];
|
|
49
55
|
toolCallId?: string;
|
|
50
56
|
timestamp?: number;
|
|
@@ -29,6 +29,14 @@ interface BuildSystemPromptOptions {
|
|
|
29
29
|
* prompt-shape tests — advertises the same list it always did.
|
|
30
30
|
*/
|
|
31
31
|
treeEditable?: boolean | undefined;
|
|
32
|
+
/**
|
|
33
|
+
* The blurbs of the tools projected from command records this round —
|
|
34
|
+
* `services/ai-command-tools.ts`'s `commandToolBlurbs(activeRegistry())`. Rendered after the hand
|
|
35
|
+
* tools under every "Tools available right now" heading, one line each. Passed in rather than
|
|
36
|
+
* read here so this stays a pure function of its options: a caller that passes none sees the hand
|
|
37
|
+
* list it always did, and only `document-assistant.ts`, which holds the registry, adds them.
|
|
38
|
+
*/
|
|
39
|
+
commandTools?: readonly string[] | undefined;
|
|
32
40
|
/**
|
|
33
41
|
* Whether the platform can import a site. Defaults TRUE so this stays a pure function of what it
|
|
34
42
|
* is given — a caller that knows nothing about the platform gets the full list, and only
|
|
@@ -37,11 +45,32 @@ interface BuildSystemPromptOptions {
|
|
|
37
45
|
canImport?: boolean | undefined;
|
|
38
46
|
/** Project-relative file paths for the inventory section (project modes; capped). */
|
|
39
47
|
fileInventory?: string[] | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* What this backend can run, enabled or not.
|
|
50
|
+
*
|
|
51
|
+
* Passed in rather than read here, because it comes from the PLATFORM and this builder is a pure
|
|
52
|
+
* function of its options. Without it the model can only discover an extension by being told
|
|
53
|
+
* about one, which is how a request for a blog gets a hand-built Markdown pipeline instead of
|
|
54
|
+
* `@jxsuite/parser`.
|
|
55
|
+
*/
|
|
56
|
+
extensionCatalog?: readonly ExtensionCatalogSummary[] | undefined;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** One extension this backend can run — the prompt's view of a catalogue entry. */
|
|
60
|
+
export interface ExtensionCatalogSummary {
|
|
61
|
+
name: string;
|
|
62
|
+
title?: string | undefined;
|
|
63
|
+
description?: string | undefined;
|
|
64
|
+
/** `project.json` keys that become legal once it is enabled. */
|
|
65
|
+
sections?: readonly string[] | undefined;
|
|
40
66
|
}
|
|
41
67
|
|
|
42
68
|
/** Max file paths embedded in the prompt's inventory section. */
|
|
43
69
|
const FILE_INVENTORY_CAP = 100;
|
|
44
70
|
|
|
71
|
+
/** Max catalogue entries listed in the prompt. */
|
|
72
|
+
const EXTENSION_CATALOG_CAP = 20;
|
|
73
|
+
|
|
45
74
|
// ─── Tool tiers (single source of truth for prompt AND gating) ──────────────
|
|
46
75
|
|
|
47
76
|
/** Studio state a tool tier requires. Used by the gating registry AND the prompt tool list. */
|
|
@@ -54,9 +83,14 @@ const FILE_INVENTORY_CAP = 100;
|
|
|
54
83
|
* with Project Settings open, `project.json` drawn as a layer tree. The assistant's tier asked only
|
|
55
84
|
* whether a tab existed, so in that exact state the agent was advertised `remove_node` and
|
|
56
85
|
* `move_node` and executed them against the file that defines the project, while the human's
|
|
57
|
-
* `delete_node` was refused. `remove_node` self-
|
|
86
|
+
* `delete_node` was refused. `remove_node` self-refused only the document root (`path.length < 2`),
|
|
58
87
|
* a weaker test than `structurallyEditable`, so a repeater template or `$switch` case was removable
|
|
59
|
-
* by the agent and not by the person.
|
|
88
|
+
* by the agent and not by the person. A tier was the first fix; the second predicate went with
|
|
89
|
+
* `remove_node` itself, which is now `delete_node`, the projection of `selection.delete`
|
|
90
|
+
* (`services/ai-command-tools.ts`) — one record, one gate, and no tier row here at all.
|
|
91
|
+
*
|
|
92
|
+
* This union is the HAND table's vocabulary and nothing a record declares: a projected command's
|
|
93
|
+
* tier is derived from its `level` by the bridge.
|
|
60
94
|
*/
|
|
61
95
|
export type AiToolTier = "always" | "no-project" | "project" | "document" | "document-tree";
|
|
62
96
|
|
|
@@ -76,9 +110,15 @@ export interface AiToolInfo {
|
|
|
76
110
|
}
|
|
77
111
|
|
|
78
112
|
/**
|
|
79
|
-
* Every assistant tool with its availability tier and prompt blurb.
|
|
80
|
-
* the gating predicates from the same rows, so the advertised tool
|
|
81
|
-
* list cannot drift (a test asserts the names match the registered
|
|
113
|
+
* Every HAND-REGISTERED assistant tool with its availability tier and prompt blurb.
|
|
114
|
+
* document-assistant.ts derives the gating predicates from the same rows, so the advertised tool
|
|
115
|
+
* list and the executable tool list cannot drift (a test asserts the names match the registered
|
|
116
|
+
* tools, and that none is also a command record's projection).
|
|
117
|
+
*
|
|
118
|
+
* The other kind of tool is not here and must not be added here: a command record that declares
|
|
119
|
+
* `aiTool` is projected by `services/ai-command-tools.ts`, gated by the record's own `when` /
|
|
120
|
+
* `enablement`, and described by the record. `enable_extension`, `disable_extension` and
|
|
121
|
+
* `delete_node` (né `remove_node`) left this table for that one.
|
|
82
122
|
*/
|
|
83
123
|
export const AI_TOOL_TIERS: AiToolInfo[] = [
|
|
84
124
|
// Always — a question is not gated on what happens to be open
|
|
@@ -181,11 +221,6 @@ export const AI_TOOL_TIERS: AiToolInfo[] = [
|
|
|
181
221
|
blurb:
|
|
182
222
|
"add_child(parentPath, index, node) — insert a new node into the children of parentPath at index.",
|
|
183
223
|
},
|
|
184
|
-
{
|
|
185
|
-
name: "remove_node",
|
|
186
|
-
tier: "document-tree",
|
|
187
|
-
blurb: "remove_node(path) — remove the node at path.",
|
|
188
|
-
},
|
|
189
224
|
{
|
|
190
225
|
name: "move_node",
|
|
191
226
|
tier: "document-tree",
|
|
@@ -644,17 +679,24 @@ export function buildSystemPrompt({
|
|
|
644
679
|
hasProject = Boolean(projectRoot),
|
|
645
680
|
treeEditable = true,
|
|
646
681
|
canImport = true,
|
|
682
|
+
commandTools = [],
|
|
647
683
|
fileInventory,
|
|
684
|
+
extensionCatalog,
|
|
648
685
|
}: BuildSystemPromptOptions = {}) {
|
|
649
686
|
const hasDocument = Boolean(document);
|
|
650
687
|
|
|
651
688
|
// 1. Role, state-appropriate workflow, and the tool list for the current state.
|
|
652
689
|
// The list the model is TOLD about and the list the gate will honour are the same filter, so a
|
|
653
|
-
// Refusal is never a surprise to it.
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
.
|
|
690
|
+
// Refusal is never a surprise to it. The command-projected tools arrive already filtered by
|
|
691
|
+
// Their records' own gates, for the same reason — one function answers both the prompt and the
|
|
692
|
+
// Executor (`advertisedCommandTools`).
|
|
693
|
+
const toolList = [
|
|
694
|
+
...AI_TOOL_TIERS.filter((t) =>
|
|
695
|
+
toolActive(t, { canImport, hasDocument, hasProject, treeEditable }),
|
|
696
|
+
).map((t) => t.blurb),
|
|
697
|
+
...commandTools,
|
|
698
|
+
]
|
|
699
|
+
.map((blurb) => `- ${blurb}`)
|
|
658
700
|
.join("\n");
|
|
659
701
|
|
|
660
702
|
const role = `You are an expert Jx builder assistant embedded in Jx Studio. You help users build websites, components, pages, and layouts using the Jx JSON schema. The live jxsuite.com marketing site is built entirely with Jx — you can produce production-quality Jx code.`;
|
|
@@ -722,7 +764,12 @@ Be concise. Don't explain what Jx is unless asked. Just build.`;
|
|
|
722
764
|
|
|
723
765
|
// 6. Project context
|
|
724
766
|
if (hasProject && (projectConfig || components || projectRoot)) {
|
|
725
|
-
const projectSummary = buildProjectSummary({
|
|
767
|
+
const projectSummary = buildProjectSummary({
|
|
768
|
+
components,
|
|
769
|
+
extensionCatalog,
|
|
770
|
+
projectConfig,
|
|
771
|
+
projectRoot,
|
|
772
|
+
});
|
|
726
773
|
if (projectSummary) {
|
|
727
774
|
sections.push(`## Project Context\n\n${projectSummary}`);
|
|
728
775
|
}
|
|
@@ -744,7 +791,7 @@ Be concise. Don't explain what Jx is unless asked. Just build.`;
|
|
|
744
791
|
If a tool call fails (returns { success: false }):
|
|
745
792
|
1. Read the error message carefully — it includes a "→ Fix:" hint telling you exactly how to correct the error.
|
|
746
793
|
2. Each error points to a specific path in the document and a specific rule violation.
|
|
747
|
-
3. Apply the suggested fix using set_property,
|
|
794
|
+
3. Apply the suggested fix using set_property, delete_node, or add_child as appropriate.
|
|
748
795
|
4. Do NOT re-issue the exact same tool call with the same arguments — you must CHANGE something.
|
|
749
796
|
5. If you see the SAME error after 2 attempts, try a completely different approach (e.g., remove and re-add the node instead of patching it).
|
|
750
797
|
|
|
@@ -762,7 +809,7 @@ If a tool call fails (returns { success: false }):
|
|
|
762
809
|
|
|
763
810
|
### If you keep getting errors:
|
|
764
811
|
- Call read_document again — the document may have changed since you last read it.
|
|
765
|
-
- Remove the problematic node entirely with
|
|
812
|
+
- Remove the problematic node entirely with delete_node, then re-create it correctly with add_child.
|
|
766
813
|
- If the error message points to a different path than you expected, the node might have moved due to previous edits.`);
|
|
767
814
|
|
|
768
815
|
return sections.join("\n\n---\n\n");
|
|
@@ -841,6 +888,7 @@ function buildProjectSummary({
|
|
|
841
888
|
projectConfig,
|
|
842
889
|
components,
|
|
843
890
|
projectRoot,
|
|
891
|
+
extensionCatalog,
|
|
844
892
|
}: Omit<BuildSystemPromptOptions, "document">) {
|
|
845
893
|
const lines: string[] = [];
|
|
846
894
|
|
|
@@ -852,6 +900,13 @@ function buildProjectSummary({
|
|
|
852
900
|
lines.push(`Root: ${projectRoot}`);
|
|
853
901
|
}
|
|
854
902
|
|
|
903
|
+
/* One line, closing a gap that was pure oversight: this function has always received the whole
|
|
904
|
+
`projectConfig`, `extensions` included, and dropped it on the floor. */
|
|
905
|
+
const enabled = projectConfig?.extensions ?? [];
|
|
906
|
+
if (enabled.length > 0) {
|
|
907
|
+
lines.push(`Extensions enabled: ${enabled.join(", ")}`);
|
|
908
|
+
}
|
|
909
|
+
|
|
855
910
|
// Available components — tag + purpose so the model can reuse them
|
|
856
911
|
if (components && components.length > 0) {
|
|
857
912
|
lines.push(`Available components (reuse these instead of rebuilding):`);
|
|
@@ -898,6 +953,43 @@ function buildProjectSummary({
|
|
|
898
953
|
}
|
|
899
954
|
}
|
|
900
955
|
|
|
956
|
+
/*
|
|
957
|
+
* The catalogue, last, so the design-token block keeps its prominence. The guidance names
|
|
958
|
+
* CAPABILITIES rather than packages on purpose: the capability-to-package mapping is what each
|
|
959
|
+
* entry's own description is for, and hardcoding "@jxsuite/parser" here would be a second,
|
|
960
|
+
* staler copy of the backend's answer.
|
|
961
|
+
*/
|
|
962
|
+
if (extensionCatalog && extensionCatalog.length > 0) {
|
|
963
|
+
const enabledSet = new Set(enabled);
|
|
964
|
+
lines.push(
|
|
965
|
+
`Extensions available. Turn one on with enable_extension BEFORE writing the project.json ` +
|
|
966
|
+
`section it owns: a section belonging to a disabled extension is a schema error, and an ` +
|
|
967
|
+
`"extensions" entry whose package is not installed fails the build. When a request needs ` +
|
|
968
|
+
`a capability the core does not have (a blog or any folder of Markdown, a search box, a ` +
|
|
969
|
+
`feed, sign-ins, a database table), look for it below rather than hand-building it.`,
|
|
970
|
+
);
|
|
971
|
+
for (const entry of extensionCatalog.slice(0, EXTENSION_CATALOG_CAP)) {
|
|
972
|
+
const parts = [` ${entry.name}`];
|
|
973
|
+
if (entry.title) {
|
|
974
|
+
parts.push(` — ${entry.title}.`);
|
|
975
|
+
}
|
|
976
|
+
if (entry.description) {
|
|
977
|
+
parts.push(` ${entry.description}`);
|
|
978
|
+
}
|
|
979
|
+
if (entry.sections && entry.sections.length > 0) {
|
|
980
|
+
parts.push(` Contributes: ${entry.sections.join(", ")}.`);
|
|
981
|
+
}
|
|
982
|
+
if (enabledSet.has(entry.name)) {
|
|
983
|
+
parts.push(" [enabled]");
|
|
984
|
+
}
|
|
985
|
+
lines.push(parts.join(""));
|
|
986
|
+
}
|
|
987
|
+
if (extensionCatalog.length > EXTENSION_CATALOG_CAP) {
|
|
988
|
+
const more = extensionCatalog.length - EXTENSION_CATALOG_CAP;
|
|
989
|
+
lines.push(` … and ${more} more (open_settings { section: "extensions" })`);
|
|
990
|
+
}
|
|
991
|
+
}
|
|
992
|
+
|
|
901
993
|
// Breakpoints — surfaced prominently so the model uses @--breakpoint responsive overrides
|
|
902
994
|
if (projectConfig?.$media) {
|
|
903
995
|
const breakpoints = Object.entries(projectConfig.$media)
|