@jxsuite/studio 6.1.1 → 6.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{2020-va2wwra4.js → 2020-f2gkpy8d.js} +3 -3
- package/dist/chunks/{action-group-2mqby73c.js → action-group-4aan7g6g.js} +3 -3
- package/dist/chunks/adapter-4912g339.js +4 -0
- package/dist/chunks/cf-account-picker-wccaenh6.js +4 -0
- package/dist/chunks/cf-settings-br6105tr.js +4 -0
- package/dist/chunks/color-28ksk2qm.js +4 -0
- package/dist/chunks/color-area-0fj8a4ga.js +4 -0
- package/dist/chunks/color-field-xch8kx2g.js +4 -0
- package/dist/chunks/color-slider-jxd8v350.js +4 -0
- package/dist/chunks/combobox-p0efwjke.js +4 -0
- package/dist/chunks/components-db68vsn7.js +4 -0
- package/dist/chunks/content-source-1449qesq.js +4 -0
- package/dist/chunks/convert-to-repeater-5h457egj.js +4 -0
- package/dist/chunks/dialog-c4x05vyx.js +4 -0
- package/dist/chunks/editor-x9jn86a7.js +4 -0
- package/dist/chunks/entry-commands-may24cpt.js +4 -0
- package/dist/chunks/extension-sections-pvr14vxr.js +4 -0
- package/dist/chunks/file-ops-x9v54pcj.js +4 -0
- package/dist/chunks/files-j3knqf0s.js +4 -0
- package/dist/chunks/format-host-tyre2trb.js +4 -0
- package/dist/chunks/fs-events-64ma9htc.js +4 -0
- package/dist/chunks/git-panel-84ps5dex.js +4 -0
- package/dist/chunks/grid-view-d2wq9ezg.js +51 -0
- package/dist/chunks/icons-pnfz478q.js +4 -0
- package/dist/chunks/iframe-entry-fvbk89gm.js +5 -0
- package/dist/chunks/iframe-entry-jdcktez8.js +5 -0
- package/dist/chunks/iframe-entry-x0ygf2yr.js +5 -0
- package/dist/chunks/iframe-entry-zap785cw.js +5 -0
- package/dist/chunks/iframe-host-ck6vejt5.js +4 -0
- package/dist/chunks/index-b8xw3vy9.js +4 -0
- package/dist/chunks/{index-2veqmnhr.js → index-zpjmzqfk.js} +3 -3
- package/dist/chunks/{javascript-8nbvs12s.js → javascript-m54mnwp6.js} +3 -3
- package/dist/chunks/{jsonMode-s8kt9dsj.js → jsonMode-w15cmrcm.js} +8 -8
- package/dist/chunks/jx-validate-at3zn8wa.js +4 -0
- package/dist/chunks/layers-h4xp1pss.js +4 -0
- package/dist/chunks/layers-panel-m5hw1d7g.js +4 -0
- package/dist/chunks/listbox-e74qjyq6.js +4 -0
- package/dist/chunks/lit-html-8t8t3dnr.js +4 -0
- package/dist/chunks/media-picker-2cweexc5.js +4 -0
- package/dist/chunks/menu-n6yzswmy.js +4 -0
- package/dist/chunks/menu-ynw13y0s.js +4 -0
- package/dist/chunks/monaco-binding-7gx83x3r.js +4 -0
- package/dist/chunks/monaco-buffer-qzxn567r.js +4 -0
- package/dist/chunks/monaco-setup-gxf6656g.js +4 -0
- package/dist/chunks/notify-cj5zbrs2.js +4 -0
- package/dist/chunks/number-field-y62xq0ty.js +4 -0
- package/dist/chunks/parse-b7ddhr8m.js +4 -0
- package/dist/chunks/platform-3dfws9js.js +4 -0
- package/dist/chunks/popover-jt2gxmzs.js +4 -0
- package/dist/chunks/publish-panel-1gvxbj21.js +4 -0
- package/dist/chunks/quick-search-0dajrwqg.js +4 -0
- package/dist/chunks/references-49qgt404.js +4 -0
- package/dist/chunks/right-panel-jm1bwe53.js +4 -0
- package/dist/chunks/section-registry-6kwc4fky.js +4 -0
- package/dist/chunks/select-rzds841e.js +4 -0
- package/dist/chunks/split-n2gfpm5m.js +4 -0
- package/dist/chunks/{studio-1q1sh2ax.js → studio-0q988f9w.js} +3 -3
- package/dist/chunks/studio-0rt52vpq.js +5 -0
- package/dist/chunks/studio-18vgbhs5.js +5 -0
- package/dist/chunks/{studio-h46vtzk8.js → studio-1fxkaaea.js} +4 -4
- package/dist/chunks/studio-24mccdrj.js +5 -0
- package/dist/chunks/studio-2eh507zk.js +9 -0
- package/dist/chunks/studio-2hcbccfv.js +5 -0
- package/dist/chunks/studio-2j1cb95x.js +5 -0
- package/dist/chunks/studio-2jbs3rxv.js +5 -0
- package/dist/chunks/{studio-rv11kfwa.js → studio-485046te.js} +7 -7
- package/dist/chunks/studio-4h8k4dw9.js +5 -0
- package/dist/chunks/studio-5f6n18kx.js +5 -0
- package/dist/chunks/studio-5gthpky6.js +5 -0
- package/dist/chunks/studio-5ve6bbep.js +5 -0
- package/dist/chunks/studio-6ep3js6b.js +9 -0
- package/dist/chunks/studio-6wkmf3wz.js +9 -0
- package/dist/chunks/studio-841rf3cg.js +5 -0
- package/dist/chunks/studio-8gmwgheg.js +5 -0
- package/dist/chunks/studio-8qm0ep50.js +5 -0
- package/dist/chunks/{studio-8grwxtqk.js → studio-90pq9km1.js} +4 -4
- package/dist/chunks/studio-924p1tm1.js +6 -0
- package/dist/chunks/{studio-pre0skq6.js → studio-a3g98wjr.js} +4 -4
- package/dist/chunks/studio-a3shpz9y.js +5 -0
- package/dist/chunks/studio-amsbaaar.js +6 -0
- package/dist/chunks/studio-at5spjbc.js +7 -0
- package/dist/chunks/studio-b2xv945e.js +5 -0
- package/dist/chunks/studio-bn5nkafw.js +5 -0
- package/dist/chunks/studio-bw6q5xjf.js +9 -0
- package/dist/chunks/studio-c7q0t9x1.js +5 -0
- package/dist/chunks/studio-camnhc96.js +6 -0
- package/dist/chunks/studio-cffqvnzd.js +5 -0
- package/dist/chunks/studio-d81xfh1g.js +5 -0
- package/dist/chunks/studio-dgz8d0c1.js +5 -0
- package/dist/chunks/studio-efvfrsf8.js +5 -0
- package/dist/chunks/studio-er30bpcx.js +5 -0
- package/dist/chunks/studio-ezscgr64.js +5 -0
- package/dist/chunks/studio-ffrrncvz.js +5 -0
- package/dist/chunks/studio-fpphgn8y.js +10 -0
- package/dist/chunks/studio-j1kvhdjk.js +4 -0
- package/dist/chunks/{studio-vrmcjf9g.js → studio-j430n16g.js} +5 -5
- package/dist/chunks/studio-jjkg84nj.js +5 -0
- package/dist/chunks/studio-m0q32ars.js +4 -0
- package/dist/chunks/studio-m6bdst11.js +5 -0
- package/dist/chunks/studio-nv2cptd4.js +64 -0
- package/dist/chunks/studio-nwfrc98n.js +5 -0
- package/dist/chunks/studio-p1wgvp7r.js +5 -0
- package/dist/chunks/studio-pag2wncm.js +5 -0
- package/dist/chunks/studio-qvanvzfd.js +5 -0
- package/dist/chunks/studio-qwa64kt7.js +5 -0
- package/dist/chunks/studio-rk1zc4x3.js +928 -0
- package/dist/chunks/studio-se2r3ptc.js +5 -0
- package/dist/chunks/studio-sg2a0dh0.js +5 -0
- package/dist/chunks/studio-tjzjhe68.js +5 -0
- package/dist/chunks/{studio-wszjyh0j.js → studio-tq0rtfwj.js} +4 -4
- package/dist/chunks/{studio-kggey1jt.js → studio-v0jzqdjm.js} +4 -4
- package/dist/chunks/studio-v2w7q8r1.js +7 -0
- package/dist/chunks/studio-v5vjq1h0.js +4 -0
- package/dist/chunks/studio-v8aga3vp.js +14 -0
- package/dist/chunks/studio-vfcdrfmv.js +5 -0
- package/dist/chunks/studio-vmfkgdjf.js +5 -0
- package/dist/chunks/studio-wt1816jj.js +5 -0
- package/dist/chunks/studio-wz73q5kq.js +4 -0
- package/dist/chunks/studio-y04qtxvp.js +7 -0
- package/dist/chunks/studio-y21g8zzg.js +5 -0
- package/dist/chunks/{studio-zey7zsdw.js → studio-y64hrt8p.js} +7 -7
- package/dist/chunks/studio-ynn90f58.js +16 -0
- package/dist/chunks/studio-yxz682sx.js +5 -0
- package/dist/chunks/studio-zp7snvkq.js +5 -0
- package/dist/chunks/studio-zq4z6tm6.js +5 -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-c9fn075p.js +4 -0
- package/dist/chunks/toast-host-ke5z4ng7.js +4 -0
- package/dist/chunks/{toolbar-2nnzqhrj.js → toolbar-44cm5cta.js} +3 -3
- package/dist/chunks/tooltip-5v8ngwj2.js +4 -0
- package/dist/chunks/tree-mdq3v5cw.js +4 -0
- package/dist/chunks/{tsMode-2frah6h1.js → tsMode-sf49ee9x.js} +7 -7
- package/dist/chunks/workspace-jtfahpee.js +4 -0
- package/dist/chunks/ws-client-nze0k6mv.js +4 -0
- package/dist/iframe-entry.js +16 -16
- package/dist/manifest.json +63 -63
- package/dist/studio.js +97 -97
- package/package.json +6 -6
- 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/library-layouts.ts +8 -5
- package/src/browse/library-model.ts +18 -6
- package/src/browse/library-pane.ts +37 -21
- package/src/browse/library-preview.ts +14 -9
- package/src/browse/library-source.ts +1 -1
- package/src/canvas/asset-refs.ts +24 -9
- package/src/canvas/asset-resolve.ts +19 -23
- package/src/canvas/canvas-helpers.ts +7 -6
- package/src/canvas/canvas-live-render.ts +44 -53
- package/src/canvas/canvas-patcher.ts +30 -30
- package/src/canvas/canvas-perf.ts +11 -5
- package/src/canvas/canvas-render.ts +62 -41
- package/src/canvas/canvas-surface.ts +5 -3
- package/src/canvas/canvas-utils.ts +90 -49
- 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 +13 -12
- package/src/canvas/iframe-editable-root.ts +29 -16
- package/src/canvas/iframe-entry.ts +80 -63
- package/src/canvas/iframe-eval.ts +73 -49
- package/src/canvas/iframe-host.ts +135 -96
- 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-overlay.ts +1 -1
- package/src/canvas/iframe-patch.ts +18 -15
- package/src/canvas/iframe-position.ts +12 -6
- package/src/canvas/iframe-protocol.ts +12 -16
- package/src/canvas/iframe-render.ts +36 -34
- package/src/canvas/iframe-slash.ts +24 -11
- package/src/canvas/iframe-subtree.ts +6 -2
- 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/serialize-scope.ts +13 -5
- package/src/canvas/stage-scrollbar.ts +2 -1
- package/src/canvas/surface-registry.ts +21 -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/budget.ts +3 -3
- package/src/commands/command-args.ts +103 -71
- package/src/commands/context.ts +22 -20
- package/src/commands/keymap.ts +47 -43
- package/src/commands/levels.ts +3 -3
- package/src/commands/live-context.ts +7 -7
- package/src/commands/reference.ts +2 -1
- package/src/commands/registry.ts +12 -10
- package/src/commands/run-reported.ts +15 -10
- package/src/component-props.ts +46 -30
- package/src/content/collection-match.ts +5 -4
- package/src/content/draft-state.ts +4 -3
- package/src/content/entry-commands.ts +3 -2
- package/src/content/entry-editor.ts +29 -17
- package/src/content/entry-fields.ts +12 -7
- package/src/content/entry-model.ts +21 -12
- 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 +11 -5
- package/src/editor/convert-to-repeater.ts +34 -22
- package/src/editor/editable-tags.ts +17 -2
- package/src/editor/file-drop-action.ts +21 -22
- package/src/editor/inline-edit-apply.ts +35 -17
- package/src/editor/inline-edit.ts +66 -50
- package/src/editor/inline-format.ts +59 -56
- package/src/editor/inline-link.ts +40 -15
- package/src/editor/insert-zone-action.ts +1 -1
- package/src/editor/merge-tags.ts +58 -19
- package/src/editor/repeater-scope.ts +39 -28
- package/src/editor/shortcuts.ts +32 -20
- package/src/editor/slash-menu.ts +1 -6
- package/src/files/asset-versions.ts +4 -4
- package/src/files/components.ts +15 -10
- package/src/files/elements.ts +5 -6
- package/src/files/file-ops.ts +77 -36
- package/src/files/files.ts +90 -95
- package/src/files/media-meta.ts +2 -1
- package/src/files/media-paths.ts +3 -0
- package/src/files/serialize-document.ts +2 -2
- 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 +76 -50
- package/src/github/github-auth-status.ts +27 -3
- package/src/github/github-auth.ts +19 -9
- package/src/github/github-publish.ts +24 -20
- 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 +20 -22
- package/src/grid/grid-layout.ts +21 -5
- package/src/grid/grid-open.ts +3 -6
- package/src/grid/grid-panel.ts +11 -4
- package/src/grid/grid-source.ts +8 -8
- package/src/grid/grid-view.ts +14 -17
- 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 +25 -24
- package/src/grid/sources/csv-file-source.ts +2 -2
- package/src/grid/tabulator-tables.d.ts +55 -34
- package/src/hosting/stage.ts +7 -7
- package/src/i18n/i18n-commands.ts +1 -2
- package/src/media/media-pane.ts +4 -1
- 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 +17 -9
- package/src/panels/ai-chat/attached-context.ts +13 -7
- 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 +46 -35
- package/src/panels/bottom-dock.ts +5 -3
- package/src/panels/canvas-dnd-bridge.ts +31 -24
- package/src/panels/data-explorer.ts +62 -25
- package/src/panels/data-grid.ts +14 -11
- package/src/panels/dnd.ts +108 -118
- package/src/panels/editors.ts +52 -21
- package/src/panels/elements-panel.ts +10 -3
- package/src/panels/events-panel.ts +84 -69
- package/src/panels/formula-workspace.ts +76 -51
- package/src/panels/frontmatter-fields.ts +24 -19
- package/src/panels/frontmatter-panel.ts +44 -34
- package/src/panels/git-diff-open.ts +4 -4
- package/src/panels/git-panel.ts +49 -61
- package/src/panels/head-panel.ts +131 -111
- package/src/panels/i18n-panel.ts +10 -3
- package/src/panels/imports-panel.ts +23 -47
- package/src/panels/jump-bar.ts +48 -29
- package/src/panels/layers-panel.ts +97 -74
- package/src/panels/left-panel.ts +3 -3
- package/src/panels/pane-context.ts +31 -22
- package/src/panels/pane-grid.ts +49 -20
- package/src/panels/panel-registry.ts +22 -37
- package/src/panels/properties-panel.ts +175 -121
- package/src/panels/quick-search.ts +53 -31
- package/src/panels/right-panel.ts +3 -3
- package/src/panels/seo-modal.ts +13 -17
- package/src/panels/settings-menu.ts +15 -15
- package/src/panels/signals-panel.ts +153 -131
- package/src/panels/statement-editor.ts +230 -140
- package/src/panels/style-panel.ts +218 -205
- package/src/panels/style-utils.ts +114 -51
- package/src/panels/stylebook-doc.ts +57 -54
- package/src/panels/stylebook-layers-panel.ts +9 -9
- package/src/panels/stylebook-panel.ts +13 -17
- package/src/panels/tab-drop.ts +27 -11
- package/src/panels/tab-strip.ts +36 -26
- package/src/platform-errors.ts +57 -43
- package/src/platform.ts +58 -30
- package/src/platforms/cloud.ts +345 -175
- package/src/platforms/default-platform.ts +10 -4
- package/src/platforms/devserver.ts +129 -117
- package/src/platforms/read-batcher.ts +16 -8
- package/src/project-list.ts +2 -1
- package/src/publish/deploy-checklist.ts +8 -2
- package/src/publish/pages-service.ts +28 -13
- package/src/publish/publish-commands.ts +5 -4
- package/src/publish/publish-panel.ts +10 -6
- 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 +58 -31
- package/src/services/cem-export.ts +149 -58
- package/src/services/clock.ts +6 -1
- package/src/services/code-services.ts +37 -31
- 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 +18 -12
- 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 +8 -7
- 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 +79 -60
- package/src/settings/css-vars-editor.ts +37 -16
- package/src/settings/defs-editor.ts +38 -35
- package/src/settings/extension-rows.ts +16 -8
- package/src/settings/extension-sections.ts +23 -13
- package/src/settings/extensions-section.ts +4 -1
- package/src/settings/general-settings.ts +11 -8
- package/src/settings/locales-section.ts +20 -12
- package/src/settings/preferences-dialog.ts +9 -6
- package/src/settings/preferences-keymap.ts +7 -5
- package/src/settings/preferences-sections.ts +11 -5
- package/src/settings/project-sections.ts +1 -1
- package/src/settings/schema-field-ui.ts +9 -0
- package/src/settings/settings-document.ts +5 -5
- package/src/shell/tree.ts +6 -5
- package/src/shell.ts +104 -81
- package/src/site-context.ts +37 -22
- package/src/state.ts +41 -49
- package/src/store.ts +54 -34
- package/src/studio.ts +25 -75
- package/src/style/live-preview.ts +1 -1
- package/src/style/project-styles.ts +6 -7
- package/src/style/token-ref.ts +5 -4
- package/src/surfaces/about.ts +18 -19
- package/src/surfaces/add-repo.ts +17 -19
- package/src/surfaces/ai-chat.ts +31 -36
- 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.ts +4 -5
- package/src/surfaces/bottom-dock.ts +9 -18
- package/src/surfaces/canvas-stage.ts +12 -11
- package/src/surfaces/cf-account-picker.ts +17 -18
- package/src/surfaces/commandbar.ts +14 -9
- 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/doc-header.ts +10 -19
- package/src/surfaces/empty-state.ts +7 -10
- package/src/surfaces/entry-editor.ts +14 -11
- 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/git-panel.ts +7 -15
- 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.ts +13 -12
- package/src/surfaces/jump-bar.ts +5 -6
- package/src/surfaces/jxsuite-update.ts +16 -22
- package/src/surfaces/library-pane.ts +19 -20
- package/src/surfaces/logic-panel.ts +17 -30
- package/src/surfaces/logic-workspace.ts +13 -15
- package/src/surfaces/media-browser.ts +11 -10
- package/src/surfaces/media-field.ts +4 -5
- package/src/surfaces/media-pane.ts +8 -7
- package/src/surfaces/menu.ts +29 -23
- package/src/surfaces/navigator-dock.ts +11 -12
- package/src/surfaces/new-project.ts +27 -26
- package/src/surfaces/pane-context.ts +20 -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.ts +5 -6
- 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.ts +11 -18
- package/src/surfaces/panel-problems.ts +5 -7
- package/src/surfaces/panel-signals.ts +20 -34
- package/src/surfaces/panel-stylebook-layers.ts +5 -8
- package/src/surfaces/preferences.ts +21 -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.ts +18 -18
- package/src/surfaces/push-plan.ts +7 -8
- package/src/surfaces/rail.ts +13 -13
- package/src/surfaces/reference-field.ts +11 -15
- package/src/surfaces/schema-builder.ts +16 -22
- package/src/surfaces/schema-form.ts +15 -25
- package/src/surfaces/secret-field.ts +9 -6
- package/src/surfaces/seo.ts +21 -15
- package/src/surfaces/settings-contexts.ts +9 -7
- package/src/surfaces/settings-contributed.ts +14 -10
- package/src/surfaces/settings-css-vars.ts +5 -12
- package/src/surfaces/settings-defs.json +2 -2
- package/src/surfaces/settings-defs.ts +17 -21
- package/src/surfaces/settings-deploy.ts +8 -15
- 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.ts +5 -6
- package/src/surfaces/settings-packages.ts +8 -7
- package/src/surfaces/settings-pane.ts +9 -18
- package/src/surfaces/settings-rawjson.ts +5 -6
- package/src/surfaces/shell.ts +1 -2
- package/src/surfaces/slash-menu.ts +19 -9
- package/src/surfaces/statements.ts +13 -18
- package/src/surfaces/statusbar.ts +17 -14
- package/src/surfaces/style-panel.ts +18 -31
- package/src/surfaces/stylebook-chrome.ts +3 -5
- package/src/surfaces/tab-strip.ts +14 -13
- package/src/surfaces/target-line.ts +6 -7
- package/src/surfaces/welcome.ts +5 -7
- 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 +52 -41
- package/src/tabs/transact.ts +98 -53
- package/src/types.ts +32 -17
- 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 +57 -48
- package/src/ui/formula-catalog.ts +239 -230
- package/src/ui/formula-chips.ts +33 -18
- package/src/ui/layers.ts +44 -31
- package/src/ui/media-picker.ts +18 -9
- package/src/ui/popover-surface.ts +20 -12
- package/src/ui/progress-modal.ts +13 -8
- package/src/ui/regions.ts +7 -6
- package/src/ui/schema-form.ts +113 -70
- 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 +3 -2
- package/src/utils/base64.ts +3 -1
- package/src/utils/edit-display.ts +73 -73
- 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/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 +10 -12
- package/src/workspace/session.ts +53 -43
- package/src/workspace/workspace.ts +40 -36
- 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/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-t6b6qe31.js +0 -5
- package/dist/chunks/studio-tdcprbqb.js +0 -5
- 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-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/workspace-zt81g1ms.js +0 -4
- package/dist/chunks/ws-client-n2bh4hkf.js +0 -4
|
@@ -2,29 +2,30 @@
|
|
|
2
2
|
* Ai-command-tools.ts — the assistant's tools that ARE command records.
|
|
3
3
|
*
|
|
4
4
|
* A `ToolRegistry` that is a VIEW over this window's active command registry, in the idiom of
|
|
5
|
-
* `services/automation.ts`'s `scriptableCommands()`: nothing is registered here, ever. Every call
|
|
6
|
-
* `listForLLM()` enumerates the records that carry an `aiTool` projection and builds one
|
|
7
|
-
* schema per record whose `parameters` is the record's own `args` object — by reference,
|
|
8
|
-
* `derivedEnumProperty` getter serialises live on every agent-loop round — whose `description`
|
|
9
|
-
* the record's, and which is advertised exactly while `registry.isEnabled(id)` holds. `execute`
|
|
10
|
-
* `registry.run(id, args)`.
|
|
5
|
+
* `services/automation.ts`'s `scriptableCommands()`: nothing is registered here, ever. Every call
|
|
6
|
+
* to `listForLLM()` enumerates the records that carry an `aiTool` projection and builds one
|
|
7
|
+
* function schema per record whose `parameters` is the record's own `args` object — by reference,
|
|
8
|
+
* so a `derivedEnumProperty` getter serialises live on every agent-loop round — whose `description`
|
|
9
|
+
* is the record's, and which is advertised exactly while `registry.isEnabled(id)` holds. `execute`
|
|
10
|
+
* is `registry.run(id, args)`.
|
|
11
11
|
*
|
|
12
12
|
* **Why a view and not a registration.** `const assistant = createDocumentAssistant()` runs at
|
|
13
13
|
* module load of `panels/ai-panel.ts`, before the bootstrap composes the registry, so a
|
|
14
14
|
* registration step would have to import `app-commands.ts` (every command module into the
|
|
15
|
-
* assistant's import graph) and read `report` from a record built with `noopCommandDeps` — a
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
15
|
+
* assistant's import graph) and read `report` from a record built with `noopCommandDeps` — a second
|
|
16
|
+
* instance of every record, whose closures are not the app's. A view has neither problem, and it
|
|
17
|
+
* cannot be dormant: issue 273 was forty-seven declarations that reached the assistant from none of
|
|
18
|
+
* them, because each waited on a hand-registered tool nobody wrote. There is no registration step
|
|
19
|
+
* between `aiTool` and the tool, so there is nothing to omit.
|
|
20
20
|
*
|
|
21
|
-
* **What the model reads.** A refusal is the person's own sentence:
|
|
22
|
-
* IS `refusalSentence`, and a `RangeError` from `coerceArgs`
|
|
23
|
-
* every caller) or from inside `run` already names the value and
|
|
24
|
-
* through untouched. There is deliberately no pre-check with
|
|
25
|
-
* the same sentence, and a second call site for one predicate
|
|
26
|
-
* `specs/studio-ui-guidelines.md` §12.4 is about. And because this
|
|
27
|
-
* `@jxsuite/ai`'s `Tool "<name>" execution error:` prefix never wraps a
|
|
21
|
+
* **What the model reads.** A refusal is the person's own sentence:
|
|
22
|
+
* `CommandUnavailableError.message` IS `refusalSentence`, and a `RangeError` from `coerceArgs`
|
|
23
|
+
* (which `registry.run` applies for every caller) or from inside `run` already names the value and
|
|
24
|
+
* the declared list. Both pass through untouched. There is deliberately no pre-check with
|
|
25
|
+
* `refusalMessage` — `run` refuses with the same sentence, and a second call site for one predicate
|
|
26
|
+
* is precisely the divergence `specs/studio-ui-guidelines.md` §12.4 is about. And because this
|
|
27
|
+
* module owns `execute`, `@jxsuite/ai`'s `Tool "<name>" execution error:` prefix never wraps a
|
|
28
|
+
* refusal.
|
|
28
29
|
*
|
|
29
30
|
* **The write witness.** A record with `undo: "document"` is held to having written: `transactDoc`
|
|
30
31
|
* replaces the document's root reference on every applied transaction (`tabs/transact.ts`), so an
|
|
@@ -36,11 +37,11 @@
|
|
|
36
37
|
* a transaction on the configuration document (`tabs/project-config.ts`), whose bind effect keeps
|
|
37
38
|
* `projectState.projectConfig` equal to `toRaw(document.doc.document)` — so a record with `undo:
|
|
38
39
|
* "project"` that left that reference alone wrote nothing, whatever its report says. The ledger
|
|
39
|
-
* then files nothing (`wrote: []`, mechanically, for every project record), and a report that
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
40
|
+
* then files nothing (`wrote: []`, mechanically, for every project record), and a report that named
|
|
41
|
+
* no `wrote` of its own — one with no latch to know it was a no-op — has its sentence replaced by
|
|
42
|
+
* "changed nothing", because "Wrote project.json" over an untouched file is the phantom the ledger
|
|
43
|
+
* exists to keep out. A record whose report answered `wrote: []` itself is one that KNEW, and its
|
|
44
|
+
* sentence ("already enabled") is the one the witness cannot write. That is why
|
|
44
45
|
* `add_project_locale` keeps its latch: the sentence, not the ledger, is what the latch is for.
|
|
45
46
|
*
|
|
46
47
|
* **A tool with nothing it could be called with is withheld.** A `derivedEnumProperty` on a
|
|
@@ -52,8 +53,8 @@
|
|
|
52
53
|
* the coercion's own refusal (`is not declared — declared: none`) rather than `Unknown tool`.
|
|
53
54
|
*
|
|
54
55
|
* **`validate()` is a no-op, on purpose.** `@jxsuite/ai`'s validator never checks `enum` and treats
|
|
55
|
-
* a required `null` as missing (`packages/ai/src/tools.ts`), which would refuse `select_node
|
|
56
|
-
*
|
|
56
|
+
* a required `null` as missing (`packages/ai/src/tools.ts`), which would refuse `select_node {
|
|
57
|
+
* path: null }`. The registry's coercion is the single validator, so every projected tool is
|
|
57
58
|
* `strict: false`.
|
|
58
59
|
*
|
|
59
60
|
* @license MIT
|
|
@@ -61,14 +62,18 @@
|
|
|
61
62
|
|
|
62
63
|
import { createToolContext, toolError } from "@jxsuite/ai/tools";
|
|
63
64
|
import type {
|
|
65
|
+
ToolArguments,
|
|
64
66
|
ToolContext,
|
|
65
67
|
ToolDefinition,
|
|
66
68
|
ToolRegistry,
|
|
67
69
|
ToolResult,
|
|
68
70
|
WriteLedger,
|
|
69
71
|
} from "@jxsuite/ai/tools";
|
|
72
|
+
import { isString } from "@jxsuite/schema/guards";
|
|
73
|
+
import type { ProjectConfig } from "@jxsuite/schema/types";
|
|
70
74
|
import { activeRegistry } from "../commands/active-registry";
|
|
71
75
|
import { argsSchema } from "../commands/command-args";
|
|
76
|
+
import type { CommandArgsSchema, PropertySchema } from "../commands/command-args";
|
|
72
77
|
import { inCanvas } from "../commands/context";
|
|
73
78
|
import { toRaw } from "../reactivity";
|
|
74
79
|
import { projectState } from "../state";
|
|
@@ -99,12 +104,6 @@ export interface CommandToolDeps extends WriteReportDeps {
|
|
|
99
104
|
/** Schema for a record that declares no `args`: an empty object, so the wire shape is uniform. */
|
|
100
105
|
const EMPTY_ARGS = argsSchema({});
|
|
101
106
|
|
|
102
|
-
/** The loosely-typed view of a record's `args` this module reads. */
|
|
103
|
-
interface ArgsShape {
|
|
104
|
-
properties?: Record<string, { enum?: unknown }>;
|
|
105
|
-
required?: readonly string[];
|
|
106
|
-
}
|
|
107
|
-
|
|
108
107
|
/**
|
|
109
108
|
* Whether a required argument's choice list is empty right now.
|
|
110
109
|
*
|
|
@@ -112,10 +111,10 @@ interface ArgsShape {
|
|
|
112
111
|
* runs on the wire — so this is the same answer the model would have been shown. Only a REQUIRED
|
|
113
112
|
* property counts: an optional enum that is empty is an argument the model can leave out.
|
|
114
113
|
*/
|
|
115
|
-
function hasEmptyRequiredEnum(args:
|
|
116
|
-
const
|
|
117
|
-
return (
|
|
118
|
-
const declared =
|
|
114
|
+
function hasEmptyRequiredEnum(args: CommandArgsSchema | undefined): boolean {
|
|
115
|
+
const view = args ?? EMPTY_ARGS;
|
|
116
|
+
return (view.required ?? []).some((key) => {
|
|
117
|
+
const declared = view.properties?.[key]?.enum;
|
|
119
118
|
return Array.isArray(declared) && declared.length === 0;
|
|
120
119
|
});
|
|
121
120
|
}
|
|
@@ -125,9 +124,8 @@ function hasEmptyRequiredEnum(args: object | undefined): boolean {
|
|
|
125
124
|
* description the model reads is the selector's. `undefined` when the selector is not registered,
|
|
126
125
|
* in which case no selection-level record can be composed and none is projected.
|
|
127
126
|
*/
|
|
128
|
-
function pathsProperty(registry: CommandRegistry):
|
|
129
|
-
|
|
130
|
-
return args?.properties?.paths;
|
|
127
|
+
function pathsProperty(registry: CommandRegistry): PropertySchema | undefined {
|
|
128
|
+
return registry.get(SELECTOR)?.args?.properties?.paths;
|
|
131
129
|
}
|
|
132
130
|
|
|
133
131
|
/**
|
|
@@ -136,8 +134,8 @@ function pathsProperty(registry: CommandRegistry): object | undefined {
|
|
|
136
134
|
* selection verb with an argument of its own compose without a rule change — and `register()`
|
|
137
135
|
* refuses a selection-level record that declares `paths` itself, so the two cannot collide.
|
|
138
136
|
*/
|
|
139
|
-
function withPaths(paths:
|
|
140
|
-
const own =
|
|
137
|
+
function withPaths(paths: PropertySchema, args: CommandArgsSchema | undefined): CommandArgsSchema {
|
|
138
|
+
const own = args ?? EMPTY_ARGS;
|
|
141
139
|
return {
|
|
142
140
|
additionalProperties: false,
|
|
143
141
|
properties: { paths, ...own.properties },
|
|
@@ -203,10 +201,10 @@ function projected(registry: CommandRegistry): AnyCommand[] {
|
|
|
203
201
|
function definitionOf(
|
|
204
202
|
registry: CommandRegistry,
|
|
205
203
|
command: AnyCommand,
|
|
206
|
-
execute: (name: string, args:
|
|
204
|
+
execute: (name: string, args: ToolArguments, ctx: ToolContext) => Promise<ToolResult>,
|
|
207
205
|
): ToolDefinition | undefined {
|
|
208
206
|
const tool = command.aiTool!;
|
|
209
|
-
let parameters:
|
|
207
|
+
let parameters: CommandArgsSchema;
|
|
210
208
|
if (command.level === "selection") {
|
|
211
209
|
const paths = pathsProperty(registry);
|
|
212
210
|
if (paths === undefined) {
|
|
@@ -219,6 +217,11 @@ function definitionOf(
|
|
|
219
217
|
return {
|
|
220
218
|
name: tool.name,
|
|
221
219
|
description: `${tool.description}${undoSuffix(command)}`,
|
|
220
|
+
/* SAFETY: `parameters` is an `argsSchema()` object (or the selector's composed from one), a
|
|
221
|
+
JSON Schema object whose only departures from `JSONSchema` are readonly arrays and a
|
|
222
|
+
property `type` that may be a list — neither of which the registry's validator ever reads,
|
|
223
|
+
because every projected tool is `strict: false`. It is passed by reference so a
|
|
224
|
+
`derivedEnumProperty` getter still serialises live on the wire. */
|
|
222
225
|
parameters: parameters as ToolDefinition["parameters"],
|
|
223
226
|
strict: false,
|
|
224
227
|
llmStrict: false,
|
|
@@ -233,15 +236,16 @@ function definitionOf(
|
|
|
233
236
|
* what the gate will honour — one function, not two that agree until someone edits one.
|
|
234
237
|
*
|
|
235
238
|
* @param {CommandRegistry} registry
|
|
236
|
-
* @param {(name: string, args:
|
|
237
|
-
* `execute` calls. Defaults to a refusal, so a caller that only reads definitions
|
|
238
|
-
* one.
|
|
239
|
+
* @param {(name: string, args: ToolArguments) => Promise<ToolResult>} [execute] What each
|
|
240
|
+
* definition's `execute` calls. Defaults to a refusal, so a caller that only reads definitions
|
|
241
|
+
* cannot run one.
|
|
239
242
|
* @returns {ToolDefinition[]}
|
|
240
243
|
*/
|
|
241
244
|
export function advertisedCommandTools(
|
|
242
245
|
registry: CommandRegistry,
|
|
243
|
-
execute: (name: string, args:
|
|
244
|
-
|
|
246
|
+
execute: (name: string, args: ToolArguments, ctx: ToolContext) => Promise<ToolResult> = async (
|
|
247
|
+
name,
|
|
248
|
+
) => toolError(`Tool "${name}" was listed without an executor.`),
|
|
245
249
|
): ToolDefinition[] {
|
|
246
250
|
const definitions: ToolDefinition[] = [];
|
|
247
251
|
for (const command of projected(registry)) {
|
|
@@ -257,10 +261,9 @@ export function advertisedCommandTools(
|
|
|
257
261
|
}
|
|
258
262
|
|
|
259
263
|
/** The parameter list a prompt blurb prints: `a, b?` — required names bare, optional ones marked. */
|
|
260
|
-
function signatureOf(parameters:
|
|
261
|
-
const
|
|
262
|
-
|
|
263
|
-
return Object.keys(shape.properties ?? {})
|
|
264
|
+
function signatureOf(parameters: ToolDefinition["parameters"]): string {
|
|
265
|
+
const required = new Set(parameters.required);
|
|
266
|
+
return Object.keys(parameters.properties ?? {})
|
|
264
267
|
.map((key) => (required.has(key) ? key : `${key}?`))
|
|
265
268
|
.join(", ");
|
|
266
269
|
}
|
|
@@ -290,7 +293,7 @@ export function commandToolBlurbs(registry: CommandRegistry | null): string[] {
|
|
|
290
293
|
|
|
291
294
|
/** A `report` return, normalised: a bare string is a summary alone. */
|
|
292
295
|
function normaliseReport(report: string | AiToolReport): AiToolReport {
|
|
293
|
-
return
|
|
296
|
+
return isString(report) ? { summary: report } : report;
|
|
294
297
|
}
|
|
295
298
|
|
|
296
299
|
/**
|
|
@@ -301,9 +304,9 @@ function normaliseReport(report: string | AiToolReport): AiToolReport {
|
|
|
301
304
|
* configuration document is a new reference here — and an unchanged reference is a run that never
|
|
302
305
|
* transacted, however the record's report reads.
|
|
303
306
|
*/
|
|
304
|
-
function projectConfigRef():
|
|
307
|
+
function projectConfigRef(): ProjectConfig | null {
|
|
305
308
|
const config = projectState?.projectConfig;
|
|
306
|
-
return config ? toRaw(config
|
|
309
|
+
return config ? toRaw(config) : null;
|
|
307
310
|
}
|
|
308
311
|
|
|
309
312
|
/**
|
|
@@ -362,12 +365,12 @@ export function createCommandToolRegistry(deps: CommandToolDeps): ToolRegistry {
|
|
|
362
365
|
* Run one projected record as the agent — the whole of `ai.md` §3.6.
|
|
363
366
|
*
|
|
364
367
|
* @param {string} name
|
|
365
|
-
* @param {
|
|
368
|
+
* @param {ToolArguments} args
|
|
366
369
|
* @returns {Promise<ToolResult>}
|
|
367
370
|
*/
|
|
368
371
|
async function execute(
|
|
369
372
|
name: string,
|
|
370
|
-
|
|
373
|
+
args: ToolArguments,
|
|
371
374
|
ctx: ToolContext = createToolContext(),
|
|
372
375
|
): Promise<ToolResult> {
|
|
373
376
|
const registry = activeRegistry();
|
|
@@ -380,7 +383,6 @@ export function createCommandToolRegistry(deps: CommandToolDeps): ToolRegistry {
|
|
|
380
383
|
: { error: `Cannot run "${name}" — this window has no command registry.`, success: false };
|
|
381
384
|
}
|
|
382
385
|
const tool = command.aiTool!;
|
|
383
|
-
const args = received as Record<string, unknown>;
|
|
384
386
|
|
|
385
387
|
/* The witness and the snapshot, only for a record that writes the document: `rootBefore` is
|
|
386
388
|
what `transactDoc` replaces, and the snapshot is what the verdict compares against. */
|
|
@@ -434,6 +436,10 @@ export function createCommandToolRegistry(deps: CommandToolDeps): ToolRegistry {
|
|
|
434
436
|
const after = registry.context();
|
|
435
437
|
let report: AiToolReport;
|
|
436
438
|
try {
|
|
439
|
+
/* SAFETY: `AnyCommand` erases the record's argument type to `never` (see its declaration), so
|
|
440
|
+
`report` cannot be called without one assertion. Every key here was just accepted by
|
|
441
|
+
`registry.run` — `paths` by the selector, the rest by this record's own `coerceArgs` pass
|
|
442
|
+
against its `args` schema — and a refusal threw into the catch above, which returned. */
|
|
437
443
|
report = normaliseReport(tool.report({ after, args: args as never, before }));
|
|
438
444
|
} catch (error) {
|
|
439
445
|
/* `run` has resolved, so the write HAPPENED; a report that throws must not make it vanish.
|
|
@@ -465,11 +471,11 @@ export function createCommandToolRegistry(deps: CommandToolDeps): ToolRegistry {
|
|
|
465
471
|
/* A success verdict may have appended the token hints; the report's sentence is kept. */
|
|
466
472
|
summary = verdict.summary ?? summary;
|
|
467
473
|
}
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
474
|
+
const result: ToolResult = { success: true, summary };
|
|
475
|
+
if (report.data !== undefined) {
|
|
476
|
+
result.data = report.data;
|
|
477
|
+
}
|
|
478
|
+
return result;
|
|
473
479
|
}
|
|
474
480
|
|
|
475
481
|
return {
|
|
@@ -1,19 +1,18 @@
|
|
|
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
|
-
* import pipeline the platform's `importSite` reaches — a local headless Chrome, or a
|
|
6
|
-
* streams its progress into a record the transcript draws, and then adopts the result
|
|
7
|
-
* scaffold is adopted. Its own module
|
|
8
|
-
*
|
|
9
|
-
* coverage bar.
|
|
4
|
+
* A sibling of `create_project` (`ai-project-tools.ts`) with a different backend: it drives
|
|
5
|
+
* whatever import pipeline the platform's `importSite` reaches — a local headless Chrome, or a
|
|
6
|
+
* hosted one — streams its progress into a record the transcript draws, and then adopts the result
|
|
7
|
+
* exactly as a scaffold is adopted. Its own module rather than an eighth tool in
|
|
8
|
+
* `ai-project-tools.ts`, which is already 650 lines under a per-file coverage bar.
|
|
10
9
|
*
|
|
11
10
|
* Two things it does NOT do are the point:
|
|
12
11
|
*
|
|
13
12
|
* - **It does not invent a destination.** `create_project` requires the model to supply `location`
|
|
14
13
|
* and refuses without one — correct when a bare chat bootstraps a project, a regression on the
|
|
15
|
-
* wizard path where the Location field already has a folder picker, validation and a live
|
|
16
|
-
* The destination comes from the pending brief; a model-supplied one must match it.
|
|
14
|
+
* wizard path where the Location field already has a folder picker, validation and a live
|
|
15
|
+
* preview. The destination comes from the pending brief; a model-supplied one must match it.
|
|
17
16
|
* - **It does not decide what the crawl found.** The pipeline is one-way: it reports and finishes.
|
|
18
17
|
* Everything worth a human's opinion — which skipped pages matter, whether the components it
|
|
19
18
|
* extracted are really components — is in the summary for the model to raise with `ask_user`
|
|
@@ -23,23 +22,26 @@
|
|
|
23
22
|
*/
|
|
24
23
|
|
|
25
24
|
import { createToolDefinition, toolError, toolSuccess } from "@jxsuite/ai/tools";
|
|
25
|
+
import { IMPORT_MAX_PAGES } from "@jxsuite/protocol";
|
|
26
|
+
import { isBoolean, isNumber, isString } from "@jxsuite/schema/guards";
|
|
26
27
|
import { getPlatform } from "../platform";
|
|
27
28
|
import { workspace } from "../workspace/workspace";
|
|
28
29
|
import { getBaseUrl, getOpenAiKey } from "./ai-settings";
|
|
29
30
|
import { preferredModel } from "./ai-models";
|
|
30
|
-
import { clearPendingImportBrief, pendingImportBrief } from "./import-seed";
|
|
31
|
+
import { MAX_IMPORT_DEPTH, clearPendingImportBrief, pendingImportBrief } from "./import-seed";
|
|
31
32
|
import type { ImportBrief } from "./import-seed";
|
|
32
33
|
import { abortImportRun, beginImportRun, finishImportRun, importRun } from "./import-run";
|
|
33
34
|
import { adoptCreatedProject } from "./project-adoption";
|
|
34
|
-
import type { AdoptOutcome } from "./project-adoption";
|
|
35
|
+
import type { AdoptCreatedOptions, AdoptOutcome } from "./project-adoption";
|
|
35
36
|
|
|
36
37
|
import type { JsonValue, ToolRegistry } from "@jxsuite/ai/tools";
|
|
37
38
|
import type { Tab } from "../tabs/tab";
|
|
38
|
-
import type {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
39
|
+
import type {
|
|
40
|
+
ImportBreakpointPolicy,
|
|
41
|
+
ImportReadyEvent,
|
|
42
|
+
ImportSiteOptions,
|
|
43
|
+
ImportSiteSummary,
|
|
44
|
+
} from "../types";
|
|
43
45
|
|
|
44
46
|
/** Log lines quoted back on a hard failure — enough to see WHICH phase died. */
|
|
45
47
|
const FAILURE_TAIL = 5;
|
|
@@ -73,6 +75,15 @@ export interface ImportToolsCtx {
|
|
|
73
75
|
brief?: { read: () => ImportBrief | null; clear: () => void };
|
|
74
76
|
}
|
|
75
77
|
|
|
78
|
+
/**
|
|
79
|
+
* The adoption a `ready` line started, if one did. A holder rather than a `let`, because the
|
|
80
|
+
* assignment happens inside the `onReady` callback and control-flow analysis cannot see it: a plain
|
|
81
|
+
* `let` reads as always-`null` after the run.
|
|
82
|
+
*/
|
|
83
|
+
interface EarlyAdoption {
|
|
84
|
+
pending: Promise<AdoptOutcome> | null;
|
|
85
|
+
}
|
|
86
|
+
|
|
76
87
|
function clamp(value: number, min: number, max: number): number {
|
|
77
88
|
return Math.min(max, Math.max(min, Math.trunc(value)));
|
|
78
89
|
}
|
|
@@ -89,7 +100,11 @@ function clamp(value: number, min: number, max: number): number {
|
|
|
89
100
|
* @returns {ImportBreakpointPolicy | undefined}
|
|
90
101
|
*/
|
|
91
102
|
function breakpointPolicyFor(
|
|
92
|
-
args: {
|
|
103
|
+
args: {
|
|
104
|
+
maxBreakpoints: JsonValue | undefined;
|
|
105
|
+
widths: JsonValue | undefined;
|
|
106
|
+
rounding: JsonValue | undefined;
|
|
107
|
+
},
|
|
93
108
|
fromBrief: ImportBreakpointPolicy | undefined,
|
|
94
109
|
): ImportBreakpointPolicy | undefined {
|
|
95
110
|
const rounding =
|
|
@@ -100,7 +115,7 @@ function breakpointPolicyFor(
|
|
|
100
115
|
if (Array.isArray(args.widths) && args.widths.length > 0) {
|
|
101
116
|
return { mode: "explicit", rounding, widths: args.widths.map(Number) };
|
|
102
117
|
}
|
|
103
|
-
if (
|
|
118
|
+
if (isNumber(args.maxBreakpoints) && Number.isFinite(args.maxBreakpoints)) {
|
|
104
119
|
// Zero is the only spelling a count has for "keep all", and it is worth accepting: it is what
|
|
105
120
|
// A model reaches for when a person says "keep them all".
|
|
106
121
|
return args.maxBreakpoints <= 0
|
|
@@ -346,18 +361,7 @@ export function registerImportTools(
|
|
|
346
361
|
maxBreakpoints,
|
|
347
362
|
breakpointWidths,
|
|
348
363
|
breakpointRounding,
|
|
349
|
-
} = args
|
|
350
|
-
url?: unknown;
|
|
351
|
-
directory?: unknown;
|
|
352
|
-
depth?: unknown;
|
|
353
|
-
maxPages?: unknown;
|
|
354
|
-
aiComponents?: unknown;
|
|
355
|
-
verify?: unknown;
|
|
356
|
-
minFidelity?: unknown;
|
|
357
|
-
maxBreakpoints?: unknown;
|
|
358
|
-
breakpointWidths?: unknown;
|
|
359
|
-
breakpointRounding?: unknown;
|
|
360
|
-
};
|
|
364
|
+
} = args;
|
|
361
365
|
|
|
362
366
|
if (workspace.projectRoot) {
|
|
363
367
|
return toolError(
|
|
@@ -386,7 +390,7 @@ export function registerImportTools(
|
|
|
386
390
|
}
|
|
387
391
|
|
|
388
392
|
const brief = briefStore.read();
|
|
389
|
-
const requested =
|
|
393
|
+
const requested = isString(directory) ? directory.trim() : "";
|
|
390
394
|
if (requested && brief && requested !== brief.directory) {
|
|
391
395
|
/* The wizard's Location field is the user's answer to "where does this go". A model that
|
|
392
396
|
disagrees with it is guessing at a decision that was already made in front of them. */
|
|
@@ -450,44 +454,56 @@ export function registerImportTools(
|
|
|
450
454
|
* failure here is not the run's failure: the import continues either way, and the terminal
|
|
451
455
|
* path below reports honestly on whichever state the window ended up in.
|
|
452
456
|
*/
|
|
453
|
-
|
|
457
|
+
const adoptOptions: AdoptCreatedOptions = { getTab };
|
|
458
|
+
if (adoptProject) {
|
|
459
|
+
adoptOptions.adopt = adoptProject;
|
|
460
|
+
}
|
|
461
|
+
const early: EarlyAdoption = { pending: null };
|
|
454
462
|
const onReady = ({ root }: ImportReadyEvent) => {
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
463
|
+
early.pending ??= adoptCreatedProject(root, adoptOptions);
|
|
464
|
+
};
|
|
465
|
+
|
|
466
|
+
const options: ImportSiteOptions = {
|
|
467
|
+
aiComponents: isBoolean(aiComponents) ? aiComponents : (brief?.aiComponents ?? true),
|
|
468
|
+
depth: clamp(Number(depth ?? brief?.depth ?? 1) || 0, 0, MAX_IMPORT_DEPTH),
|
|
469
|
+
directory: destination,
|
|
470
|
+
maxPages: clamp(Number(maxPages ?? brief?.maxPages ?? 20) || 1, 1, IMPORT_MAX_PAGES),
|
|
471
|
+
name: brief?.name || target.hostname.replace(/^www\./, ""),
|
|
472
|
+
url: target.href,
|
|
459
473
|
};
|
|
474
|
+
if (breakpoints !== undefined) {
|
|
475
|
+
options.breakpoints = breakpoints;
|
|
476
|
+
}
|
|
477
|
+
if (isBoolean(verify)) {
|
|
478
|
+
options.verify = verify;
|
|
479
|
+
} else if (brief?.verify !== undefined) {
|
|
480
|
+
options.verify = brief.verify;
|
|
481
|
+
}
|
|
482
|
+
/* The wizard's number is the user's own answer to "how close is close enough"; the model
|
|
483
|
+
may only override it when it was told to. */
|
|
484
|
+
options.verifyMinFidelity = clamp(
|
|
485
|
+
Number(minFidelity ?? brief?.minFidelity ?? DEFAULT_MIN_FIDELITY) || 0,
|
|
486
|
+
0,
|
|
487
|
+
MAX_FIDELITY,
|
|
488
|
+
);
|
|
489
|
+
if (apiKey) {
|
|
490
|
+
options.apiKey = apiKey;
|
|
491
|
+
}
|
|
492
|
+
if (baseUrl) {
|
|
493
|
+
options.baseUrl = baseUrl;
|
|
494
|
+
}
|
|
495
|
+
if (model) {
|
|
496
|
+
options.model = model;
|
|
497
|
+
}
|
|
460
498
|
|
|
461
499
|
let result: { root: string; result?: ImportSiteSummary };
|
|
462
500
|
try {
|
|
463
501
|
result = await platform.importSite(
|
|
464
|
-
|
|
465
|
-
aiComponents:
|
|
466
|
-
typeof aiComponents === "boolean" ? aiComponents : (brief?.aiComponents ?? true),
|
|
467
|
-
depth: clamp(Number(depth ?? brief?.depth ?? 1) || 0, 0, MAX_DEPTH),
|
|
468
|
-
directory: destination,
|
|
469
|
-
maxPages: clamp(Number(maxPages ?? brief?.maxPages ?? 20) || 1, 1, MAX_PAGES),
|
|
470
|
-
name: brief?.name || target.hostname.replace(/^www\./, ""),
|
|
471
|
-
url: target.href,
|
|
472
|
-
...(breakpoints === undefined ? {} : { breakpoints }),
|
|
473
|
-
...(typeof verify === "boolean"
|
|
474
|
-
? { verify }
|
|
475
|
-
: brief?.verify === undefined
|
|
476
|
-
? {}
|
|
477
|
-
: { verify: brief.verify }),
|
|
478
|
-
/* The wizard's number is the user's own answer to "how close is close enough"; the
|
|
479
|
-
model may only override it when it was told to. */
|
|
480
|
-
verifyMinFidelity: clamp(
|
|
481
|
-
Number(minFidelity ?? brief?.minFidelity ?? DEFAULT_MIN_FIDELITY) || 0,
|
|
482
|
-
0,
|
|
483
|
-
MAX_FIDELITY,
|
|
484
|
-
),
|
|
485
|
-
...(apiKey ? { apiKey } : {}),
|
|
486
|
-
...(baseUrl ? { baseUrl } : {}),
|
|
487
|
-
...(model ? { model } : {}),
|
|
488
|
-
},
|
|
502
|
+
options,
|
|
489
503
|
(evt) => {
|
|
490
|
-
|
|
504
|
+
/* The spread is the event's own fields as an object literal, which TypeScript lets
|
|
505
|
+
stand as a JSON object where the named interface cannot. */
|
|
506
|
+
ctx.progress({ ...evt });
|
|
491
507
|
},
|
|
492
508
|
signal,
|
|
493
509
|
onReady,
|
|
@@ -522,15 +538,12 @@ export function registerImportTools(
|
|
|
522
538
|
|
|
523
539
|
/* The early adoption if there was one, otherwise adopt now: a backend that sends no `ready`
|
|
524
540
|
line is not broken, it is older, and the project must still open. */
|
|
525
|
-
const { adopted, error: adoptionError } = await (
|
|
526
|
-
adoptCreatedProject(result.root,
|
|
527
|
-
getTab,
|
|
528
|
-
...(adoptProject ? { adopt: adoptProject } : {}),
|
|
529
|
-
}));
|
|
541
|
+
const { adopted, error: adoptionError } = await (early.pending ??
|
|
542
|
+
adoptCreatedProject(result.root, adoptOptions));
|
|
530
543
|
if (adopted) {
|
|
531
544
|
onProjectAdopted?.(result.root);
|
|
532
545
|
return toolSuccess(
|
|
533
|
-
{ root: result.root,
|
|
546
|
+
result.result ? { root: result.root, summary: result.result } : { root: result.root },
|
|
534
547
|
describeRun(id, result.root, result.result),
|
|
535
548
|
);
|
|
536
549
|
}
|
|
@@ -10,7 +10,9 @@
|
|
|
10
10
|
* @license MIT
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
+
import type { AiCredentials } from "@jxsuite/ai/streaming-client";
|
|
13
14
|
import type { AiModelsResponse, OfferedAction } from "@jxsuite/protocol";
|
|
15
|
+
import { isBoolean, isNumber, isString } from "@jxsuite/schema/guards";
|
|
14
16
|
import { getPlatform } from "../platform";
|
|
15
17
|
import { offeredActions } from "../platform-errors";
|
|
16
18
|
import { getBaseUrl, getOpenAiKey, hasOpenAiKey, storedModel } from "./ai-settings";
|
|
@@ -38,10 +40,7 @@ export interface AiModel {
|
|
|
38
40
|
* Two fields, taken together or not at all. The per-field overrides this replaces let a caller pass
|
|
39
41
|
* a draft key with a stored base URL, which is a pair that was never configured anywhere.
|
|
40
42
|
*/
|
|
41
|
-
export
|
|
42
|
-
apiKey: string;
|
|
43
|
-
baseUrl: string;
|
|
44
|
-
}
|
|
43
|
+
export type { AiCredentials } from "@jxsuite/ai/streaming-client";
|
|
45
44
|
|
|
46
45
|
/** The credentials the app is configured with right now. */
|
|
47
46
|
export function aiConnection(): AiCredentials {
|
|
@@ -380,19 +379,24 @@ export async function fetchAvailableModels(
|
|
|
380
379
|
if (!resp.ok) {
|
|
381
380
|
throw new Error(`HTTP ${resp.status}`);
|
|
382
381
|
}
|
|
382
|
+
/* SAFETY: this route is served by a Studio backend answering with `AiModelsResponse`
|
|
383
|
+
(`@jxsuite/protocol`); `Partial` because an older backend omits members. The members that
|
|
384
|
+
decide a gate (`configured`, `managed`, `code`, `detail`, a model's capabilities) are each
|
|
385
|
+
compared to a literal or guarded below before use; the rest are passed through as display text. */
|
|
383
386
|
const data = (await resp.json()) as Partial<AiModelsResponse>;
|
|
384
387
|
proxyConfigured = data.configured === true;
|
|
385
388
|
proxyManaged = data.managed === true;
|
|
386
389
|
proxyDefaultModel = data.defaultModel ?? "";
|
|
387
390
|
proxyCode = data.code;
|
|
388
391
|
proxyModelsError = data.upstreamError !== undefined ? (data.upstreamMessage ?? "") : "";
|
|
389
|
-
proxyAction =
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
392
|
+
proxyAction = null;
|
|
393
|
+
if (data.code === "action_required") {
|
|
394
|
+
const offer: ProxyActionOffer = { actions: offeredActions(data.actions) };
|
|
395
|
+
if (isString(data.detail) && data.detail) {
|
|
396
|
+
offer.detail = data.detail;
|
|
397
|
+
}
|
|
398
|
+
proxyAction = offer;
|
|
399
|
+
}
|
|
396
400
|
/* Capabilities are kept, not dropped. The backend has reported `toolSupport` all along and the
|
|
397
401
|
ingest mapped `{id, name}` only, so a Workers AI model that cannot call tools looked exactly
|
|
398
402
|
like one that can — the agent loop ran, called nothing, and answered as if that were normal.
|
|
@@ -400,10 +404,10 @@ export async function fetchAvailableModels(
|
|
|
400
404
|
which is a third state both consumers depend on. */
|
|
401
405
|
cache = (data.models || []).map((m) => {
|
|
402
406
|
const model: AiModel = { id: m.id, name: m.name || m.id };
|
|
403
|
-
if (
|
|
407
|
+
if (isNumber(m.contextWindow)) {
|
|
404
408
|
model.contextWindow = m.contextWindow;
|
|
405
409
|
}
|
|
406
|
-
if (
|
|
410
|
+
if (isBoolean(m.toolSupport)) {
|
|
407
411
|
model.toolSupport = m.toolSupport;
|
|
408
412
|
}
|
|
409
413
|
return model;
|