@jxsuite/studio 6.1.0 → 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-f2gkpy8d.js +4 -0
- 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-gybvv7a6.js → index-zpjmzqfk.js} +3 -3
- package/dist/chunks/{javascript-rnvdp3k4.js → javascript-m54mnwp6.js} +3 -3
- package/dist/chunks/jsonMode-w15cmrcm.js +13 -0
- 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-5g0ag7c0.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-pxg4ap1e.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-qbj760tx.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-anyrgzvb.js → studio-90pq9km1.js} +4 -4
- package/dist/chunks/studio-924p1tm1.js +6 -0
- package/dist/chunks/{studio-v2bvmbjj.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-txjjzrsm.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-0x3jyb8r.js → studio-tq0rtfwj.js} +4 -4
- package/dist/chunks/{studio-cpxkgjrj.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-y64hrt8p.js +12 -0
- 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-sf49ee9x.js +14 -0
- 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 +98 -98
- package/dist/workers/ts.worker.js +3 -3
- package/package.json +11 -11
- 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 +66 -42
- package/src/canvas/canvas-surface.ts +5 -3
- package/src/canvas/canvas-utils.ts +163 -64
- 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 +203 -118
- package/src/canvas/iframe-inline-edit.ts +69 -32
- package/src/canvas/iframe-insert.ts +5 -4
- package/src/canvas/iframe-interaction.ts +37 -26
- 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 +15 -16
- package/src/canvas/iframe-render.ts +41 -36
- 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/defaults.ts +4 -1
- package/src/commands/keymap.ts +47 -43
- package/src/commands/levels.ts +3 -3
- package/src/commands/live-context.ts +10 -8
- 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 +87 -47
- 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 +6 -1
- 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 +55 -22
- 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 +254 -216
- 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 +174 -127
- 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 +39 -77
- 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 +25 -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.json +126 -73
- package/src/surfaces/rail.ts +38 -12
- 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/tabs/typing.ts +31 -0
- 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 +103 -74
- 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 +47 -36
- package/dist/chunks/2020-nkxms0ay.js +0 -4
- package/dist/chunks/adapter-m948ab5f.js +0 -4
- package/dist/chunks/cf-account-picker-n8hr38v7.js +0 -4
- package/dist/chunks/cf-settings-356xdtne.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-yk3t844e.js +0 -4
- package/dist/chunks/content-source-bawmyc09.js +0 -4
- package/dist/chunks/convert-to-repeater-7wns8kf1.js +0 -4
- package/dist/chunks/dialog-mtm9fq5t.js +0 -4
- package/dist/chunks/editor-6sc8nacq.js +0 -4
- package/dist/chunks/entry-commands-8ay9fh81.js +0 -4
- package/dist/chunks/extension-sections-na7rj3nr.js +0 -4
- package/dist/chunks/file-ops-gye0qw56.js +0 -4
- package/dist/chunks/files-dmc2xvcq.js +0 -4
- package/dist/chunks/format-host-t76b53f8.js +0 -4
- package/dist/chunks/fs-events-cg4tpz06.js +0 -4
- package/dist/chunks/git-panel-yef7bshy.js +0 -4
- package/dist/chunks/grid-view-7tt4bxw1.js +0 -51
- package/dist/chunks/icons-qbh8akb1.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-tmz30gfp.js +0 -4
- package/dist/chunks/index-nag78a9h.js +0 -4
- package/dist/chunks/jsonMode-zhwsprqk.js +0 -13
- package/dist/chunks/jx-validate-3gbp5nkn.js +0 -4
- package/dist/chunks/layers-fvz99859.js +0 -4
- package/dist/chunks/layers-panel-gchmbf9p.js +0 -4
- package/dist/chunks/listbox-s8fkmnq8.js +0 -4
- package/dist/chunks/lit-html-9agdspkt.js +0 -4
- package/dist/chunks/media-picker-rhjvyy00.js +0 -4
- package/dist/chunks/menu-2e4y9j7b.js +0 -4
- package/dist/chunks/menu-37d07z9m.js +0 -4
- package/dist/chunks/monaco-binding-2jnhjjvr.js +0 -4
- package/dist/chunks/monaco-buffer-rp21359g.js +0 -4
- package/dist/chunks/monaco-setup-vhh7gayr.js +0 -4
- package/dist/chunks/notify-h3www560.js +0 -4
- package/dist/chunks/number-field-gw7sq8rn.js +0 -4
- package/dist/chunks/parse-897fvqah.js +0 -4
- package/dist/chunks/platform-hz34wcd7.js +0 -4
- package/dist/chunks/popover-8htra4er.js +0 -4
- package/dist/chunks/publish-panel-exsmjzyj.js +0 -4
- package/dist/chunks/quick-search-pgaqeh0m.js +0 -4
- package/dist/chunks/references-2cgdxnb8.js +0 -4
- package/dist/chunks/right-panel-jf856w5w.js +0 -4
- package/dist/chunks/section-registry-jnf8r5gy.js +0 -4
- package/dist/chunks/select-n3v7gwas.js +0 -4
- package/dist/chunks/split-pff8f3ze.js +0 -4
- package/dist/chunks/studio-0f55h9ye.js +0 -5
- package/dist/chunks/studio-0sqdhnew.js +0 -12
- package/dist/chunks/studio-19x1c75w.js +0 -5
- package/dist/chunks/studio-2sqcndak.js +0 -5
- package/dist/chunks/studio-3aey7dd3.js +0 -5
- package/dist/chunks/studio-3bpdkq2s.js +0 -5
- package/dist/chunks/studio-47y6fbpf.js +0 -5
- package/dist/chunks/studio-4m3826v2.js +0 -5
- package/dist/chunks/studio-4nx2dj1g.js +0 -4
- package/dist/chunks/studio-4xv5s47r.js +0 -9
- package/dist/chunks/studio-5g4t8v6w.js +0 -5
- package/dist/chunks/studio-5py436sf.js +0 -5
- package/dist/chunks/studio-77kt594t.js +0 -5
- package/dist/chunks/studio-8f87n763.js +0 -10
- package/dist/chunks/studio-8mb00b84.js +0 -5
- package/dist/chunks/studio-8p51gq2h.js +0 -6
- package/dist/chunks/studio-954ds834.js +0 -5
- package/dist/chunks/studio-9ft45c83.js +0 -9
- package/dist/chunks/studio-a2138x5k.js +0 -7
- package/dist/chunks/studio-a9yzstqj.js +0 -5
- package/dist/chunks/studio-acdksxx6.js +0 -5
- package/dist/chunks/studio-ar8jcf2y.js +0 -5
- package/dist/chunks/studio-bmn4mn9j.js +0 -7
- package/dist/chunks/studio-e7xxa0sj.js +0 -5
- package/dist/chunks/studio-ecaz25vk.js +0 -5
- package/dist/chunks/studio-ery42sqr.js +0 -4
- package/dist/chunks/studio-fzdywr6p.js +0 -9
- package/dist/chunks/studio-g5fmf0c1.js +0 -5
- package/dist/chunks/studio-g7nse7zb.js +0 -5
- package/dist/chunks/studio-geq1ea6k.js +0 -14
- package/dist/chunks/studio-ghkb32r8.js +0 -5
- package/dist/chunks/studio-ghrhy2y7.js +0 -5
- package/dist/chunks/studio-grawhey1.js +0 -5
- package/dist/chunks/studio-h0xgswew.js +0 -5
- package/dist/chunks/studio-h9c4p2tx.js +0 -5
- package/dist/chunks/studio-jyzj5cxs.js +0 -5
- package/dist/chunks/studio-mgx8yhnz.js +0 -64
- package/dist/chunks/studio-mpb04y1d.js +0 -6
- package/dist/chunks/studio-n17mty64.js +0 -5
- package/dist/chunks/studio-nwh2eqsk.js +0 -6
- package/dist/chunks/studio-q1h883bt.js +0 -16
- package/dist/chunks/studio-q4tv82h7.js +0 -9
- package/dist/chunks/studio-qpqa7vk3.js +0 -5
- package/dist/chunks/studio-qqz8e5gk.js +0 -5
- package/dist/chunks/studio-qvasen3f.js +0 -5
- package/dist/chunks/studio-rggdb3hm.js +0 -5
- package/dist/chunks/studio-sghy936h.js +0 -4
- package/dist/chunks/studio-skprc6ef.js +0 -5
- package/dist/chunks/studio-tt2nactf.js +0 -5
- package/dist/chunks/studio-tyasmc39.js +0 -5
- package/dist/chunks/studio-vk9ezads.js +0 -5
- package/dist/chunks/studio-vzacdfsc.js +0 -4
- package/dist/chunks/studio-w4c0xmrw.js +0 -5
- package/dist/chunks/studio-wfjqhhbk.js +0 -5
- package/dist/chunks/studio-wgh5kxpj.js +0 -5
- package/dist/chunks/studio-xasj0796.js +0 -5
- package/dist/chunks/studio-y78s8r2n.js +0 -5
- package/dist/chunks/studio-z8w183sh.js +0 -5
- package/dist/chunks/studio-zscd9ty4.js +0 -928
- package/dist/chunks/studio-zxp13sss.js +0 -7
- package/dist/chunks/studio-zygnmm01.js +0 -5
- package/dist/chunks/swatch-group-8qh9a3bm.js +0 -4
- package/dist/chunks/tabs-jwthg40w.js +0 -4
- package/dist/chunks/textfield-spy3hc77.js +0 -4
- package/dist/chunks/toast-4d35zd64.js +0 -4
- package/dist/chunks/toast-host-8sjmfed3.js +0 -4
- package/dist/chunks/tooltip-fd6g9xy3.js +0 -4
- package/dist/chunks/tree-h19v1jfz.js +0 -4
- package/dist/chunks/tsMode-gr0m4dzr.js +0 -14
- package/dist/chunks/workspace-m15qtcqp.js +0 -4
- package/dist/chunks/ws-client-nf61frr1.js +0 -4
|
@@ -15,9 +15,10 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import { createToolDefinition } from "@jxsuite/ai/tools";
|
|
18
|
-
import
|
|
18
|
+
import { isJsonObject, isNumber } from "@jxsuite/schema/guards";
|
|
19
|
+
import type { CreateProjectDestination, StudioPlatform } from "../types";
|
|
19
20
|
import type { ToolRegistry } from "@jxsuite/ai/tools";
|
|
20
|
-
import type { JxMutableNode, ProjectConfig } from "@jxsuite/schema/types";
|
|
21
|
+
import type { JsonValue, JxMutableNode, ProjectConfig } from "@jxsuite/schema/types";
|
|
21
22
|
import { getPlatform } from "../platform";
|
|
22
23
|
import { workspace } from "../workspace/workspace";
|
|
23
24
|
import { projectState } from "../store";
|
|
@@ -26,6 +27,7 @@ import { adoptCreatedProject } from "./project-adoption";
|
|
|
26
27
|
import { translateValidationError } from "./ai-tools";
|
|
27
28
|
import { validateDoc, validateProjectConfig } from "./jx-validate";
|
|
28
29
|
import { flagHardcodedTokens, formatTokenHints } from "./token-lint";
|
|
30
|
+
import type { CandidateDocument } from "./ai-write-report";
|
|
29
31
|
import { invalidPathResult, normalizeRelPath } from "./project-path";
|
|
30
32
|
|
|
31
33
|
/** Directories the file tools never descend into or report. */
|
|
@@ -50,21 +52,26 @@ function isJxDocPath(path: string): boolean {
|
|
|
50
52
|
}
|
|
51
53
|
|
|
52
54
|
/** Structural sniff for Jx-document-shaped JSON values. */
|
|
53
|
-
function looksLikeJxDoc(value:
|
|
54
|
-
return (
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
55
|
+
function looksLikeJxDoc(value: JsonValue): boolean {
|
|
56
|
+
return isJsonObject(value) && ("tagName" in value || "$id" in value || "$elements" in value);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** One row of `list_files`'s answer. `size` is omitted when the platform reports none. */
|
|
60
|
+
interface ListedEntry {
|
|
61
|
+
path: string;
|
|
62
|
+
type: string;
|
|
63
|
+
size?: number;
|
|
60
64
|
}
|
|
61
65
|
|
|
62
66
|
export interface ProjectToolsCtx {
|
|
63
67
|
getTab: () => Tab | null;
|
|
64
|
-
validate?: (doc:
|
|
65
|
-
/**
|
|
66
|
-
|
|
67
|
-
|
|
68
|
+
validate?: (doc: CandidateDocument) => Promise<string[]>;
|
|
69
|
+
/**
|
|
70
|
+
* Gate for `project.json` writes — the per-project entry document, not the document schema. It
|
|
71
|
+
* judges the live configuration and a candidate parsed from the model's text alike.
|
|
72
|
+
*/
|
|
73
|
+
validateProject?: (config: ProjectConfig | JsonValue) => Promise<string[]>;
|
|
74
|
+
renderCheck?: (doc: CandidateDocument) => Promise<{ ok: true } | { ok: false; error: string }>;
|
|
68
75
|
/** Live getter — the project style appears only after a project is open/bootstrapped. */
|
|
69
76
|
getProjectStyle?: () => Record<string, string> | undefined;
|
|
70
77
|
/** The open tab whose `documentPath` equals the given project-relative path, if any. */
|
|
@@ -139,13 +146,15 @@ export function registerProjectTools(
|
|
|
139
146
|
required: [],
|
|
140
147
|
},
|
|
141
148
|
async execute(args) {
|
|
149
|
+
/* SAFETY: a strict tool runs only after the registry's `validate()` passed, which refuses
|
|
150
|
+
a `dir` that is present but not a string. */
|
|
142
151
|
const { dir } = args as { dir?: string };
|
|
143
152
|
const start = dir === undefined || dir === "" ? "." : normalizeRelPath(dir);
|
|
144
153
|
if (start === null) {
|
|
145
154
|
return invalidPathResult(dir);
|
|
146
155
|
}
|
|
147
156
|
const platform = getPlatform();
|
|
148
|
-
const entries:
|
|
157
|
+
const entries: ListedEntry[] = [];
|
|
149
158
|
const queue = [start];
|
|
150
159
|
let truncated = false;
|
|
151
160
|
while (queue.length > 0 && !truncated) {
|
|
@@ -166,11 +175,11 @@ export function registerProjectTools(
|
|
|
166
175
|
truncated = true;
|
|
167
176
|
break;
|
|
168
177
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
178
|
+
const entry: ListedEntry = { path, type: e.type };
|
|
179
|
+
if (isNumber(e.size)) {
|
|
180
|
+
entry.size = e.size;
|
|
181
|
+
}
|
|
182
|
+
entries.push(entry);
|
|
174
183
|
if (e.type === "directory") {
|
|
175
184
|
queue.push(path);
|
|
176
185
|
}
|
|
@@ -204,9 +213,12 @@ export function registerProjectTools(
|
|
|
204
213
|
required: ["path"],
|
|
205
214
|
},
|
|
206
215
|
async execute(args) {
|
|
207
|
-
|
|
216
|
+
/* SAFETY: a strict tool runs only after the registry's `validate()` passed, so the
|
|
217
|
+
required `path` is present and a string. */
|
|
218
|
+
const { path } = args as { path: string };
|
|
219
|
+
const relPath = normalizeRelPath(path);
|
|
208
220
|
if (relPath === null) {
|
|
209
|
-
return invalidPathResult(
|
|
221
|
+
return invalidPathResult(path);
|
|
210
222
|
}
|
|
211
223
|
try {
|
|
212
224
|
const content = await getPlatform().readFile(relPath);
|
|
@@ -255,6 +267,8 @@ export function registerProjectTools(
|
|
|
255
267
|
required: ["path", "content"],
|
|
256
268
|
},
|
|
257
269
|
async execute(args, ctx) {
|
|
270
|
+
/* SAFETY: a strict tool runs only after the registry's `validate()` passed, so the required
|
|
271
|
+
`path` and `content` are both present and strings. */
|
|
258
272
|
const { path, content } = args as { path: string; content: string };
|
|
259
273
|
const relPath = normalizeRelPath(path);
|
|
260
274
|
if (relPath === null) {
|
|
@@ -279,11 +293,12 @@ export function registerProjectTools(
|
|
|
279
293
|
}
|
|
280
294
|
|
|
281
295
|
// Pre-validate Jx documents — disk writes have no undo to lean on.
|
|
282
|
-
let parsed:
|
|
296
|
+
let parsed: JsonValue | undefined;
|
|
283
297
|
const isJson = relPath.endsWith(".json") && relPath !== "project.json";
|
|
284
298
|
if (isJson) {
|
|
285
299
|
try {
|
|
286
|
-
|
|
300
|
+
// SAFETY: `JSON.parse` without a reviver yields nothing but JSON values.
|
|
301
|
+
parsed = JSON.parse(content) as JsonValue;
|
|
287
302
|
} catch (error) {
|
|
288
303
|
return {
|
|
289
304
|
success: false,
|
|
@@ -292,7 +307,8 @@ export function registerProjectTools(
|
|
|
292
307
|
}
|
|
293
308
|
}
|
|
294
309
|
let tokenHints = "";
|
|
295
|
-
|
|
310
|
+
// The parse above sets `parsed` exactly when `isJson` holds: it never yields `undefined`.
|
|
311
|
+
if (parsed !== undefined && (isJxDocPath(relPath) || looksLikeJxDoc(parsed))) {
|
|
296
312
|
const errors = await validate(parsed);
|
|
297
313
|
if (errors.length > 0) {
|
|
298
314
|
const formatted = errors.map((e) => `- ${translateValidationError(e)}`).join("\n");
|
|
@@ -313,6 +329,9 @@ export function registerProjectTools(
|
|
|
313
329
|
const projectStyle = getProjectStyle?.();
|
|
314
330
|
if (projectStyle) {
|
|
315
331
|
tokenHints = formatTokenHints(
|
|
332
|
+
/* SAFETY: `flagHardcodedTokens` re-checks every member it reads — object-ness, each
|
|
333
|
+
`style` value as a string, `children` as an array — so a JSON value that is not
|
|
334
|
+
quite a node is read defensively; its parameter type names the intended input. */
|
|
316
335
|
flagHardcodedTokens(parsed as JxMutableNode, projectStyle),
|
|
317
336
|
);
|
|
318
337
|
}
|
|
@@ -322,9 +341,10 @@ export function registerProjectTools(
|
|
|
322
341
|
model-authored text, and the gate below is the whole reason we do not trust its shape. */
|
|
323
342
|
let projectConfig: ProjectConfig | undefined;
|
|
324
343
|
if (relPath === "project.json") {
|
|
325
|
-
let parsedConfig:
|
|
344
|
+
let parsedConfig: JsonValue;
|
|
326
345
|
try {
|
|
327
|
-
|
|
346
|
+
// SAFETY: `JSON.parse` without a reviver yields nothing but JSON values.
|
|
347
|
+
parsedConfig = JSON.parse(content) as JsonValue;
|
|
328
348
|
} catch (error) {
|
|
329
349
|
return {
|
|
330
350
|
success: false,
|
|
@@ -353,7 +373,9 @@ export function registerProjectTools(
|
|
|
353
373
|
error: `project.json has schema errors — nothing was written. Fix these and retry:\n${formatted}`,
|
|
354
374
|
};
|
|
355
375
|
}
|
|
356
|
-
|
|
376
|
+
/* SAFETY: narrowed only now, because the assertion is earned by the schema gate rather
|
|
377
|
+
than by `JSON.parse`: the per-project entry schema found no violation this text did not
|
|
378
|
+
already have on disk. */
|
|
357
379
|
projectConfig = parsedConfig as ProjectConfig;
|
|
358
380
|
}
|
|
359
381
|
|
|
@@ -416,6 +438,9 @@ export function registerProjectTools(
|
|
|
416
438
|
required: ["query"],
|
|
417
439
|
},
|
|
418
440
|
async execute(args) {
|
|
441
|
+
/* SAFETY: a strict tool runs only after the registry's `validate()` passed: `query` is a
|
|
442
|
+
present string and `extensions`, when present, an array. Its items are not checked here;
|
|
443
|
+
the platform's search receives them as given. */
|
|
419
444
|
const { query, extensions } = args as { query: string; extensions?: string[] };
|
|
420
445
|
try {
|
|
421
446
|
const results = await getPlatform().searchFiles(query, extensions);
|
|
@@ -490,6 +515,10 @@ export function registerProjectTools(
|
|
|
490
515
|
required: ["name"],
|
|
491
516
|
},
|
|
492
517
|
async execute(args, ctx) {
|
|
518
|
+
/* SAFETY: a strict tool runs only after the registry's `validate()` passed: `name` is a
|
|
519
|
+
present string, the optional strings and `private` have their declared types when
|
|
520
|
+
present, and `design` is an object. Its colour and font members are not checked here;
|
|
521
|
+
the platform's scaffold receives them as given. */
|
|
493
522
|
const {
|
|
494
523
|
name,
|
|
495
524
|
description,
|
|
@@ -562,14 +591,21 @@ export function registerProjectTools(
|
|
|
562
591
|
|
|
563
592
|
let result: { root: string; config: object };
|
|
564
593
|
try {
|
|
565
|
-
|
|
594
|
+
const request: Parameters<StudioPlatform["createProject"]>[0] = {
|
|
566
595
|
name,
|
|
567
596
|
destination,
|
|
568
597
|
directory: slug,
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
}
|
|
598
|
+
};
|
|
599
|
+
if (description) {
|
|
600
|
+
request.description = description;
|
|
601
|
+
}
|
|
602
|
+
if (template) {
|
|
603
|
+
request.template = template;
|
|
604
|
+
}
|
|
605
|
+
if (design) {
|
|
606
|
+
request.design = design;
|
|
607
|
+
}
|
|
608
|
+
result = await platform.createProject(request);
|
|
573
609
|
} catch (error) {
|
|
574
610
|
return {
|
|
575
611
|
success: false,
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Ai-session-store.js — project-scoped multi-session chat history in localStorage.
|
|
4
4
|
*
|
|
5
|
-
* Pure storage CRUD for the assistant's conversations: a small index of session
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* Pure storage CRUD for the assistant's conversations: a small index of session metadata plus one
|
|
6
|
+
* payload key per session, so per-send writes touch a single conversation. No reactivity and no
|
|
7
|
+
* chat-state knowledge — document-assistant owns the live session; this module only loads/saves
|
|
8
|
+
* plain message arrays.
|
|
9
9
|
*
|
|
10
|
-
* Cross-window note: multiple studio windows share these keys; index writes are
|
|
11
|
-
*
|
|
10
|
+
* Cross-window note: multiple studio windows share these keys; index writes are last-write-wins,
|
|
11
|
+
* which is accepted for chat history.
|
|
12
12
|
*
|
|
13
13
|
* @license MIT
|
|
14
14
|
*/
|
|
@@ -73,18 +73,27 @@ function legacyKey(root: string) {
|
|
|
73
73
|
|
|
74
74
|
// ─── Storage helpers (defensive: quota/unavailable/corrupt → absent) ────────
|
|
75
75
|
|
|
76
|
+
/** `localStorage`, or `undefined` on a host that has none (a worker, a test run without a DOM). */
|
|
77
|
+
function storage(): Storage | undefined {
|
|
78
|
+
return typeof localStorage === "undefined" ? undefined : localStorage;
|
|
79
|
+
}
|
|
80
|
+
|
|
76
81
|
function readJson<T>(key: string): T | null {
|
|
77
82
|
try {
|
|
78
|
-
const raw =
|
|
83
|
+
const raw = storage()?.getItem(key);
|
|
84
|
+
/* SAFETY: every key this module reads is one it wrote through `writeJson`, with the shape its
|
|
85
|
+
reader names (an index is a `SessionIndex`, a payload or legacy key a `PersistedMessage[]`).
|
|
86
|
+
A value that is not — corrupt, or written by a foreign build — is caught by each reader's
|
|
87
|
+
`Array.isArray` check before any member is used. */
|
|
79
88
|
return raw ? (JSON.parse(raw) as T) : null;
|
|
80
89
|
} catch {
|
|
81
90
|
return null;
|
|
82
91
|
}
|
|
83
92
|
}
|
|
84
93
|
|
|
85
|
-
function writeJson(key: string, value:
|
|
94
|
+
function writeJson(key: string, value: SessionIndex | PersistedMessage[]) {
|
|
86
95
|
try {
|
|
87
|
-
|
|
96
|
+
storage()?.setItem(key, JSON.stringify(value));
|
|
88
97
|
} catch {
|
|
89
98
|
// Storage full or unavailable — chat history is not critical.
|
|
90
99
|
}
|
|
@@ -92,7 +101,7 @@ function writeJson(key: string, value: unknown) {
|
|
|
92
101
|
|
|
93
102
|
function removeKey(key: string) {
|
|
94
103
|
try {
|
|
95
|
-
|
|
104
|
+
storage()?.removeItem(key);
|
|
96
105
|
} catch {
|
|
97
106
|
/* Ignore */
|
|
98
107
|
}
|
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
import { VOID_ELEMENTS } from "../store.js";
|
|
11
11
|
import { flattenTree } from "../state.js";
|
|
12
12
|
import type { ComponentEntry } from "../files/components.js";
|
|
13
|
-
import
|
|
13
|
+
import { isBoolean, isNonNullObject, isNumber, isString } from "@jxsuite/schema/guards";
|
|
14
|
+
import type { JsonPrimitive, JxMutableNode, ProjectConfig } from "@jxsuite/schema/types";
|
|
14
15
|
|
|
15
16
|
/** Options for {@link buildSystemPrompt}. */
|
|
16
17
|
interface BuildSystemPromptOptions {
|
|
@@ -362,7 +363,7 @@ ${[...VOID_ELEMENTS].join(", ")}
|
|
|
362
363
|
|
|
363
364
|
// ─── State Shape Decision Tree ───────────────────────────────────────────────
|
|
364
365
|
|
|
365
|
-
const
|
|
366
|
+
const STATE_ENTRY_DECISION_TREE = `## State Shape Decision Tree
|
|
366
367
|
|
|
367
368
|
When adding state to a component, choose the right shape:
|
|
368
369
|
|
|
@@ -712,7 +713,7 @@ export const SYSTEM_PROMPT_STATIC_PREFIX =
|
|
|
712
713
|
// 2. Jx schema reference — kept in ALL modes (pre-project the model plans starter content)
|
|
713
714
|
JX_SCHEMA_REFERENCE,
|
|
714
715
|
// 2a. State shape decision tree
|
|
715
|
-
|
|
716
|
+
STATE_ENTRY_DECISION_TREE,
|
|
716
717
|
// 2b. Real-world patterns
|
|
717
718
|
REAL_WORLD_PATTERNS,
|
|
718
719
|
// 2c. Design principles — spacing, type, color, layout, restraint
|
|
@@ -756,9 +757,9 @@ export function buildSystemPrompt({
|
|
|
756
757
|
// Their records' own gates, for the same reason — one function answers both the prompt and the
|
|
757
758
|
// Executor (`advertisedCommandTools`).
|
|
758
759
|
const toolList = [
|
|
759
|
-
...AI_TOOL_TIERS.
|
|
760
|
-
toolActive(t, { canImport, hasDocument, hasProject, treeEditable }),
|
|
761
|
-
)
|
|
760
|
+
...AI_TOOL_TIERS.flatMap((t) =>
|
|
761
|
+
toolActive(t, { canImport, hasDocument, hasProject, treeEditable }) ? [t.blurb] : [],
|
|
762
|
+
),
|
|
762
763
|
...commandTools,
|
|
763
764
|
]
|
|
764
765
|
.map((blurb) => `- ${blurb}`)
|
|
@@ -860,6 +861,9 @@ function buildDocumentSummary(doc: JxMutableNode) {
|
|
|
860
861
|
lines.push(`\nElement tree (${flat.length} nodes):`);
|
|
861
862
|
for (const item of flat) {
|
|
862
863
|
const indent = " ".repeat(item.depth);
|
|
864
|
+
/* SAFETY: both added members are optional, so the assertion claims nothing a row must carry;
|
|
865
|
+
one that lacks them reads `undefined`. `FlatRow` itself declares neither, so this label
|
|
866
|
+
currently prints as `undefined` for every row, a known defect rather than a contract. */
|
|
863
867
|
const row = item as typeof item & { id?: string; tag?: string };
|
|
864
868
|
const label = row.id || row.tag;
|
|
865
869
|
lines.push(`${indent}${label}`);
|
|
@@ -872,19 +876,16 @@ function buildDocumentSummary(doc: JxMutableNode) {
|
|
|
872
876
|
lines.push(`\nState keys (${stateKeys.length}): ${stateKeys.join(", ")}`);
|
|
873
877
|
// Add type info for each state entry
|
|
874
878
|
for (const key of stateKeys) {
|
|
875
|
-
const entry
|
|
876
|
-
const entryObj = entry as Record<string, unknown>;
|
|
879
|
+
const entry = doc.state[key];
|
|
877
880
|
let typeStr = "unknown";
|
|
878
|
-
if (!entry
|
|
879
|
-
typeStr =
|
|
880
|
-
} else if (
|
|
881
|
+
if (!isNonNullObject(entry)) {
|
|
882
|
+
typeStr = primitiveTypeName(entry);
|
|
883
|
+
} else if ("$prototype" in entry && entry.$prototype === "Function") {
|
|
881
884
|
typeStr = "Function";
|
|
882
|
-
} else if (
|
|
885
|
+
} else if ("$prototype" in entry && entry.$prototype === "Data") {
|
|
883
886
|
typeStr = "Data source";
|
|
884
|
-
} else if (
|
|
885
|
-
typeStr =
|
|
886
|
-
} else if (entryObj.type) {
|
|
887
|
-
typeStr = `Typed (${entryObj.type})`;
|
|
887
|
+
} else if ("type" in entry && entry.type) {
|
|
888
|
+
typeStr = `Typed (${String(entry.type)})`;
|
|
888
889
|
} else {
|
|
889
890
|
typeStr = "Scalar";
|
|
890
891
|
}
|
|
@@ -895,15 +896,32 @@ function buildDocumentSummary(doc: JxMutableNode) {
|
|
|
895
896
|
|
|
896
897
|
// Imported elements
|
|
897
898
|
if (doc.$elements && doc.$elements.length > 0) {
|
|
898
|
-
const refs = doc.$elements
|
|
899
|
-
.map((e) => (typeof e === "string" ? e : e.$ref || "(unknown)"))
|
|
900
|
-
.join(", ");
|
|
899
|
+
const refs = doc.$elements.map((e) => (isString(e) ? e : e.$ref || "(unknown)")).join(", ");
|
|
901
900
|
lines.push(`\nImported elements: ${refs}`);
|
|
902
901
|
}
|
|
903
902
|
|
|
904
903
|
return lines.join("\n");
|
|
905
904
|
}
|
|
906
905
|
|
|
906
|
+
/**
|
|
907
|
+
* `typeof` of a state entry that is not an object, spelled as the summary has always printed it.
|
|
908
|
+
*
|
|
909
|
+
* @param {JsonPrimitive | undefined} value
|
|
910
|
+
* @returns {string}
|
|
911
|
+
*/
|
|
912
|
+
function primitiveTypeName(value: JsonPrimitive | undefined): string {
|
|
913
|
+
if (isString(value)) {
|
|
914
|
+
return "string";
|
|
915
|
+
}
|
|
916
|
+
if (isNumber(value)) {
|
|
917
|
+
return "number";
|
|
918
|
+
}
|
|
919
|
+
if (isBoolean(value)) {
|
|
920
|
+
return "boolean";
|
|
921
|
+
}
|
|
922
|
+
return value === null ? "object" : "undefined";
|
|
923
|
+
}
|
|
924
|
+
|
|
907
925
|
/**
|
|
908
926
|
* Build a project context summary.
|
|
909
927
|
*
|
|
@@ -937,6 +955,9 @@ function buildProjectSummary({
|
|
|
937
955
|
if (components && components.length > 0) {
|
|
938
956
|
lines.push(`Available components (reuse these instead of rebuilding):`);
|
|
939
957
|
for (const c of components) {
|
|
958
|
+
/* SAFETY: both added members are optional, so the assertion claims nothing an entry must
|
|
959
|
+
carry: a discovered component may still bring a legacy `tag` or `name`, and one without
|
|
960
|
+
them reads `undefined` and falls through to `path`. */
|
|
940
961
|
const entry = c as ComponentEntry & { tag?: string; name?: string };
|
|
941
962
|
const tag = entry.tagName || entry.tag || entry.name || entry.path;
|
|
942
963
|
const label = c.$id ? ` — ${c.$id}` : "";
|
|
@@ -952,7 +973,12 @@ function buildProjectSummary({
|
|
|
952
973
|
`Design tokens (always use var(--token) — never hard-code a color, radius, or font that a token defines):`,
|
|
953
974
|
);
|
|
954
975
|
type TokenEntry = (typeof tokens)[number];
|
|
955
|
-
|
|
976
|
+
interface TokenGroups {
|
|
977
|
+
color: TokenEntry[];
|
|
978
|
+
font: TokenEntry[];
|
|
979
|
+
other: TokenEntry[];
|
|
980
|
+
}
|
|
981
|
+
const groups: TokenGroups = {
|
|
956
982
|
color: [],
|
|
957
983
|
font: [],
|
|
958
984
|
other: [],
|