@jxsuite/studio 5.3.0 → 5.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/data/css-meta.json +28 -27
- package/dist/chunks/{cf-account-picker-nwnwdm6p.js → cf-account-picker-3f08rry6.js} +21 -18
- package/dist/chunks/{cf-settings-adg74qsk.js → cf-settings-m79r7p5y.js} +4 -4
- package/dist/chunks/{components-5y78e05d.js → components-xm826zjw.js} +3 -3
- package/dist/chunks/{content-source-4rzvmp0m.js → content-source-jt7rbcbc.js} +22 -22
- package/dist/chunks/{convert-to-repeater-jxsv62v7.js → convert-to-repeater-vg38bq99.js} +22 -22
- package/dist/chunks/{editor-3qhbg51x.js → editor-ddy019sn.js} +2 -2
- package/dist/chunks/entry-commands-64nb2a9a.js +42 -0
- package/dist/chunks/{extension-sections-2mrptyek.js → extension-sections-r73an5s6.js} +30 -29
- package/dist/chunks/{file-ops-knfqshrm.js → file-ops-3xan8mnj.js} +21 -21
- package/dist/chunks/{files-y6fr4he9.js → files-egsb0ry8.js} +28 -28
- package/dist/chunks/{format-host-1k4qrcqd.js → format-host-mym8qnd0.js} +3 -3
- package/dist/chunks/{fs-events-3y6y0nrm.js → fs-events-z2gg8qjt.js} +4 -4
- package/dist/chunks/{git-panel-2rkrsjva.js → git-panel-a05atk6q.js} +20 -20
- package/dist/chunks/{grid-view-1p6hsyjx.css → grid-view-3g1h2re8.css} +956 -139
- package/dist/chunks/{grid-view-a7b87n2c.js → grid-view-qaqer9kr.js} +24 -24
- package/dist/chunks/{icons-yy10wk9r.js → icons-drxq9q10.js} +8 -2
- package/dist/chunks/{iframe-host-scpw01h8.js → iframe-host-psetcv20.js} +11 -11
- package/dist/chunks/{index-n4j7qxyr.js → index-9yjae3hz.js} +4 -4
- package/dist/chunks/{javascript-4abzjcy9.css → javascript-bc9z461d.css} +688 -54
- package/dist/chunks/{javascript-xvrfrpkb.js → javascript-hr5sg57n.js} +2 -2
- package/dist/chunks/{jsonMode-vvmpmk34.css → jsonMode-qqd9nm1t.css} +1120 -303
- package/dist/chunks/{jsonMode-tyx2kj6p.js → jsonMode-zs88v0wr.js} +4 -4
- package/dist/chunks/layers-panel-83a16ytx.js +41 -0
- package/dist/chunks/{layers-jnvdbqva.js → layers-s6mc01ry.js} +3 -3
- package/dist/chunks/{media-picker-f66nav16.js → media-picker-nhn6rv4w.js} +11 -11
- package/dist/chunks/{menu-1dfhry4s.js → menu-8j4qxjrp.js} +4 -4
- package/dist/chunks/{monaco-binding-sw6en4dw.js → monaco-binding-e8d9wzyk.js} +3 -3
- package/dist/chunks/{monaco-buffer-pykwbm92.js → monaco-buffer-jaq1t9zj.js} +2 -2
- package/dist/chunks/{monaco-setup-8vbyqnhr.css → monaco-setup-ey9cjcm3.css} +954 -137
- package/dist/chunks/{monaco-setup-km6abc6q.js → monaco-setup-gsjdysze.js} +6 -6
- package/dist/chunks/{platform-ts9cg1a4.js → platform-fnchmhy7.js} +5 -3
- package/dist/chunks/publish-panel-ak6hxfma.js +27 -0
- package/dist/chunks/quick-search-c63mkt3b.js +47 -0
- package/dist/chunks/{references-h69xp9zz.js → references-f7bdv3z5.js} +3 -3
- package/dist/chunks/right-panel-t5n8wttg.js +45 -0
- package/dist/chunks/{studio-ze46gzjh.js → studio-01269reb.js} +7 -7
- package/dist/chunks/{studio-rnyf3f8e.js → studio-0a4gncx0.js} +3 -3
- package/dist/chunks/{studio-e1f24eff.js → studio-0d4p4wxj.js} +6778 -2993
- package/dist/chunks/{studio-4wbb9ct0.js → studio-1tejxvba.js} +3006 -1855
- package/dist/chunks/{studio-d1n2bykn.js → studio-3nprwbd9.js} +117 -25
- package/dist/chunks/{studio-4c041r8y.js → studio-40z39dme.js} +3 -3
- package/dist/chunks/{studio-151w0xnh.js → studio-482eeazk.js} +20 -20
- package/dist/chunks/{studio-cgprcdxn.js → studio-4998spet.js} +10 -9
- package/dist/chunks/{studio-nq5yf5mp.js → studio-557bmn0x.js} +2 -2
- package/dist/chunks/{studio-rtskkm43.js → studio-5w26wza5.js} +3 -3
- package/dist/chunks/{studio-6nzaktvy.js → studio-6pwn9j8c.js} +6 -3
- package/dist/chunks/{studio-wnsyffg1.js → studio-6vg0x5fz.js} +3 -2
- package/dist/chunks/{studio-vn5hske5.js → studio-7d3c1m59.js} +12 -5
- package/dist/chunks/{studio-6gryj0sg.js → studio-9vsvz7w7.js} +6 -6
- package/dist/chunks/{studio-50wfwy44.js → studio-9wm0xzpf.js} +19 -19
- package/dist/chunks/{studio-0j7r7s9g.js → studio-ag3z6shb.js} +10 -4
- package/dist/chunks/studio-aj9drheq.js +177 -0
- package/dist/chunks/{studio-xajk70w0.js → studio-apv9x70c.js} +189 -130
- package/dist/chunks/{studio-c04nzbby.js → studio-b9q3znz8.js} +2 -2
- package/dist/chunks/{studio-nfx354t1.js → studio-bh47w0cy.js} +9 -10
- package/dist/chunks/{studio-gk2twyh4.js → studio-dgdm6vvt.js} +264 -52
- package/dist/chunks/{studio-gtfq1dkz.js → studio-dwdcr2e8.js} +4 -4
- package/dist/chunks/{studio-nqgawfks.js → studio-fbcyz234.js} +146 -139
- package/dist/chunks/{studio-27q131j3.js → studio-fqpkpq1t.js} +7 -4
- package/dist/chunks/{studio-c0qgc3tn.js → studio-fy320dfc.js} +62 -68
- package/dist/chunks/{studio-zjjde71a.js → studio-gjj4bbfx.js} +2 -2
- package/dist/chunks/{studio-g33v4fe9.js → studio-jfhxy8h3.js} +7 -7
- package/dist/chunks/{studio-ab87phj1.js → studio-kwewmhhq.js} +4 -4
- package/dist/chunks/{studio-7rrb1esn.js → studio-m58xn8at.js} +25 -24
- package/dist/chunks/{studio-fzjx96t2.js → studio-mfkh1q8d.js} +17 -17
- package/dist/chunks/{studio-drg8qj9k.js → studio-mrh0a92f.js} +17 -17
- package/dist/chunks/{studio-jt27ta6x.js → studio-mt79tn56.js} +3 -3
- package/dist/chunks/{studio-b66rsh78.js → studio-ne593z1j.js} +38 -31
- package/dist/chunks/{studio-h4nvnjvz.js → studio-ptfcxkz5.js} +418 -232
- package/dist/chunks/{studio-dd1qqkry.js → studio-qxye31h7.js} +7 -7
- package/dist/chunks/{studio-ye9drbk8.js → studio-rav5bpmp.js} +73 -52
- package/dist/chunks/{studio-6kvgrkrp.js → studio-rwmmbrth.js} +6 -6
- package/dist/chunks/{studio-b7xacrwe.js → studio-sceg8ws0.js} +8 -8
- package/dist/chunks/{studio-msc1ee1m.js → studio-sjas5b3a.js} +19 -13
- package/dist/chunks/{studio-a65w20ex.js → studio-vd67b66d.js} +3 -3
- package/dist/chunks/{studio-7144epdr.js → studio-w475cbf9.js} +10 -10
- package/dist/chunks/{studio-4f3psrk1.js → studio-w7gpcvfj.js} +9 -9
- package/dist/chunks/{studio-nsgw7dbk.js → studio-xrbfdxgk.js} +7 -7
- package/dist/chunks/{studio-ke09tn9k.js → studio-y49b6mjv.js} +35 -35
- package/dist/chunks/{studio-j0w60gft.js → studio-ygvr9e4q.js} +10 -10
- package/dist/chunks/{studio-z2smx5ce.js → studio-yxmmjy2a.js} +9 -6
- package/dist/chunks/{tsMode-jy4m86rv.js → tsMode-ay4c78ne.js} +4 -4
- package/dist/chunks/{tsMode-hnxxb73h.css → tsMode-c72wyz27.css} +954 -137
- package/dist/chunks/{workspace-np10mayv.js → workspace-b9k2frks.js} +5 -5
- package/dist/chunks/{ws-client-ny4zc51r.js → ws-client-erze4czt.js} +356 -20
- package/dist/codicon.ttf +0 -0
- package/dist/iframe-entry.js +18 -16
- package/dist/studio.css +956 -139
- package/dist/studio.js +1453 -830
- package/dist/workers/editor.worker.js +196 -107
- package/dist/workers/json.worker.js +196 -107
- package/dist/workers/ts.worker.js +196 -107
- package/package.json +15 -14
- package/src/about/about-modal.ts +4 -3
- package/src/browse/library-commands.ts +15 -13
- package/src/browse/library-pane.ts +2 -2
- package/src/canvas/canvas-render.ts +97 -83
- package/src/canvas/canvas-surface.ts +2 -2
- package/src/canvas/canvas-utils.ts +42 -32
- package/src/canvas/diff-toolbar.ts +21 -2
- package/src/canvas/diff-view.ts +30 -6
- package/src/canvas/iframe-entry.ts +2 -2
- package/src/canvas/iframe-host.ts +5 -5
- package/src/canvas/iframe-interaction.ts +7 -6
- package/src/canvas/iframe-overlay.ts +1 -1
- package/src/canvas/iframe-protocol.ts +6 -5
- package/src/canvas/iframe-render.ts +3 -3
- package/src/canvas/popover-state.ts +1 -1
- package/src/canvas/stage-scrollbar.ts +112 -0
- package/src/canvas/surface-registry.ts +9 -2
- package/src/collab/collab-commands.ts +8 -6
- package/src/collab/collab-session.ts +4 -4
- package/src/collab/collab-state.ts +4 -4
- package/src/collab/presence-chips.ts +3 -3
- package/src/commands/app-commands.ts +7 -7
- package/src/commands/budget.ts +17 -16
- package/src/commands/command-args.ts +10 -9
- package/src/commands/context.ts +20 -10
- package/src/commands/defaults.ts +30 -29
- package/src/commands/levels.ts +8 -6
- package/src/commands/live-context.ts +12 -10
- package/src/commands/reference.ts +5 -5
- package/src/commands/registry.ts +2 -2
- package/src/content/draft-state.ts +9 -8
- package/src/content/entry-commands.ts +16 -14
- package/src/content/entry-editor.ts +2 -2
- package/src/content/entry-fields.ts +1 -1
- package/src/editor/context-menu.ts +4 -4
- package/src/editor/convert-to-component.ts +6 -5
- package/src/editor/inline-edit.ts +3 -3
- package/src/editor/shortcuts.ts +88 -20
- package/src/editor/slash-menu.ts +11 -10
- package/src/files/elements.ts +4 -5
- package/src/files/file-ops.ts +1 -1
- package/src/files/files.ts +21 -17
- package/src/files/serialize-document.ts +1 -1
- package/src/format/convert-file.ts +5 -5
- package/src/github/github-auth-status.ts +107 -0
- package/src/github/github-auth.ts +18 -82
- package/src/github/github-publish.ts +7 -6
- package/src/grid/cell-editors.ts +8 -7
- package/src/grid/grid-layout.ts +1 -1
- package/src/grid/grid-open.ts +6 -5
- package/src/grid/grid-panel.ts +13 -12
- package/src/grid/redirects-grid.ts +14 -11
- package/src/grid/redirects.ts +10 -5
- package/src/grid/sources/content-source.ts +10 -9
- package/src/hosting/document.ts +28 -1
- package/src/hosting/stage.ts +15 -4
- package/src/i18n/i18n-commands.ts +9 -7
- package/src/new-project/location-fields.ts +16 -3
- package/src/new-project/new-project-modal.ts +23 -7
- package/src/page-params.ts +6 -6
- package/src/panels/activity-panel.ts +11 -10
- package/src/panels/ai-chat/chat-view.ts +27 -14
- package/src/panels/ai-chat/composer.ts +10 -3
- package/src/panels/ai-panel.ts +87 -29
- package/src/panels/block-action-bar.ts +59 -33
- package/src/panels/bottom-dock.ts +22 -22
- package/src/panels/data-explorer.ts +9 -9
- package/src/panels/data-grid.ts +1 -1
- package/src/panels/editors.ts +8 -8
- package/src/panels/elements-panel.ts +7 -8
- package/src/panels/empty-state.ts +1 -1
- package/src/panels/events-panel.ts +13 -12
- package/src/panels/formula-workspace.ts +8 -5
- package/src/panels/frontmatter-fields.ts +4 -1
- package/src/panels/frontmatter-panel.ts +18 -18
- package/src/panels/git-panel.ts +19 -13
- package/src/panels/head-panel.ts +9 -10
- package/src/panels/i18n-panel.ts +6 -4
- package/src/panels/imports-panel.ts +1 -1
- package/src/panels/jump-bar.ts +20 -18
- package/src/panels/layers-panel.ts +19 -17
- package/src/panels/left-panel.ts +3 -3
- package/src/panels/navigator-panels.ts +8 -8
- package/src/panels/overlays.ts +1 -1
- package/src/panels/pane-context.ts +56 -28
- package/src/panels/pane-grid.ts +9 -8
- package/src/panels/panel-registry.ts +47 -19
- package/src/panels/problems-panel.ts +11 -12
- package/src/panels/properties-panel.ts +21 -20
- package/src/panels/provenance.ts +3 -3
- package/src/panels/quick-search.ts +15 -11
- package/src/panels/right-panel.ts +4 -3
- package/src/panels/seo-modal.ts +5 -4
- package/src/panels/settings-menu.ts +9 -9
- package/src/panels/settings-pane.ts +3 -3
- package/src/panels/signals-panel.ts +16 -9
- package/src/panels/statement-editor.ts +12 -9
- package/src/panels/style-panel.ts +45 -41
- package/src/panels/stylebook-panel.ts +0 -1
- package/src/panels/tab-strip.ts +26 -23
- package/src/platform-errors.ts +2 -2
- package/src/platform.ts +44 -4
- package/src/platforms/cloud.ts +11 -1
- package/src/platforms/default-platform.ts +141 -4
- package/src/platforms/devserver.ts +23 -3
- package/src/publish/deploy-checklist.ts +11 -10
- package/src/publish/publish-commands.ts +9 -8
- package/src/services/a11y-report.ts +1 -1
- package/src/services/ai-ask.ts +39 -16
- package/src/services/ai-command-tools.ts +28 -14
- package/src/services/ai-import-tools.ts +43 -29
- package/src/services/ai-project-tools.ts +20 -38
- package/src/services/ai-settings.ts +55 -2
- package/src/services/ai-tools.ts +69 -58
- package/src/services/ai-write-report.ts +4 -4
- package/src/services/ai-writes.ts +74 -55
- package/src/services/automation.ts +12 -12
- package/src/services/clock.ts +2 -1
- package/src/services/connection.ts +2 -2
- package/src/services/context-manager.ts +69 -6
- package/src/services/directory-picker.ts +93 -27
- package/src/services/document-assistant.ts +86 -17
- package/src/services/gated-registry.ts +4 -3
- package/src/services/idle.ts +5 -4
- package/src/services/live-surfaces.ts +2 -1
- package/src/services/notify.ts +9 -7
- package/src/services/popover-report.ts +3 -3
- package/src/services/preview-eval.ts +1 -1
- package/src/services/project-adoption.ts +34 -1
- package/src/services/project-path.ts +53 -0
- package/src/services/settings/kernel.ts +13 -2
- package/src/services/tool-executor.ts +135 -30
- package/src/services/tool-outcomes.ts +143 -0
- package/src/settings/contexts-section.ts +8 -8
- package/src/settings/contributed-section.ts +6 -6
- package/src/settings/css-vars-editor.ts +6 -5
- package/src/settings/extension-commands.ts +19 -18
- package/src/settings/extension-sections.ts +7 -7
- package/src/settings/extensions-section.ts +3 -3
- package/src/settings/general-settings.ts +21 -18
- package/src/settings/preferences-accounts.ts +3 -3
- package/src/settings/preferences-dialog.ts +9 -8
- package/src/settings/preferences-sections.ts +1 -1
- package/src/settings/project-sections.ts +2 -2
- package/src/settings/section-registry.ts +7 -6
- package/src/settings/settings-document.ts +41 -43
- package/src/shell/tree.ts +29 -0
- package/src/shell.ts +63 -55
- package/src/site-context.ts +1 -1
- package/src/store.ts +2 -2
- package/src/studio.ts +46 -28
- package/src/style/live-preview.ts +8 -8
- package/src/style/project-styles.ts +8 -9
- package/src/style/token-ref.ts +2 -2
- package/src/surfaces/about.json +6 -2
- package/src/surfaces/add-repo.json +2 -2
- package/src/surfaces/add-repo.ts +2 -2
- package/src/surfaces/ai-chat.json +14 -6
- package/src/surfaces/ai-chat.ts +4 -2
- package/src/surfaces/ai-credentials-form.json +53 -49
- package/src/surfaces/ai-credentials-form.ts +18 -4
- package/src/surfaces/ai-managed-connect.json +4 -4
- package/src/surfaces/block-action-bar.json +4 -4
- package/src/surfaces/block-action-bar.ts +3 -3
- package/src/surfaces/boot-failure.json +228 -0
- package/src/surfaces/boot-failure.ts +156 -0
- package/src/surfaces/bottom-dock.json +1 -1
- package/src/surfaces/canvas-stage.json +9 -40
- package/src/surfaces/canvas-stage.ts +9 -9
- package/src/surfaces/cf-account-picker.json +11 -8
- package/src/surfaces/commandbar.ts +11 -10
- package/src/surfaces/convert-repeater.ts +3 -2
- package/src/surfaces/dialog.json +7 -1
- package/src/surfaces/dialog.ts +2 -2
- package/src/surfaces/doc-header.json +6 -13
- package/src/surfaces/doc-header.ts +4 -5
- package/src/surfaces/entry-editor.json +1 -1
- package/src/surfaces/entry-editor.ts +2 -1
- package/src/surfaces/expression-editor.json +5 -5
- package/src/surfaces/files-panel.json +4 -3
- package/src/surfaces/files-panel.ts +1 -1
- package/src/surfaces/formula-palette.json +2 -2
- package/src/surfaces/formula-palette.ts +1 -1
- package/src/surfaces/git-panel.json +167 -109
- package/src/surfaces/git-panel.ts +2 -2
- package/src/surfaces/github-auth.json +2 -1
- package/src/surfaces/github-publish.ts +3 -3
- package/src/surfaces/grid-open.json +1 -1
- package/src/surfaces/grid-panel.json +2 -2
- package/src/surfaces/grid-views.json +1 -1
- package/src/surfaces/inspector-dock.json +2 -2
- package/src/surfaces/jump-bar.json +1 -1
- package/src/surfaces/jump-bar.ts +1 -1
- package/src/surfaces/library-pane.ts +2 -1
- package/src/surfaces/logic-panel.json +7 -7
- package/src/surfaces/logic-panel.ts +6 -4
- package/src/surfaces/logic-workspace.json +2 -2
- package/src/surfaces/logic-workspace.ts +2 -2
- package/src/surfaces/media-browser.ts +3 -3
- package/src/surfaces/media-pane.ts +2 -1
- package/src/surfaces/menu.ts +5 -5
- package/src/surfaces/new-project.json +1 -1
- package/src/surfaces/pane-context.json +86 -57
- package/src/surfaces/pane-context.ts +2 -1
- package/src/surfaces/pane-grid.json +3 -3
- package/src/surfaces/panel-activity.json +2 -1
- package/src/surfaces/panel-deploy-checklist.json +1 -1
- package/src/surfaces/panel-elements.ts +2 -1
- package/src/surfaces/panel-i18n.ts +2 -1
- package/src/surfaces/panel-outline.json +1 -1
- package/src/surfaces/panel-outline.ts +4 -3
- package/src/surfaces/panel-page.json +2 -2
- package/src/surfaces/panel-page.ts +4 -1
- package/src/surfaces/panel-problems.json +4 -3
- package/src/surfaces/panel-problems.ts +2 -2
- package/src/surfaces/panel-signals.json +23 -8
- package/src/surfaces/panel-signals.ts +5 -1
- package/src/surfaces/panel-stylebook-layers.json +1 -1
- package/src/surfaces/panel-stylebook-layers.ts +2 -2
- package/src/surfaces/preferences.json +21 -8
- package/src/surfaces/preferences.ts +9 -1
- package/src/surfaces/properties-panel.json +4 -4
- package/src/surfaces/properties-panel.ts +2 -2
- package/src/surfaces/publish.json +1 -1
- package/src/surfaces/publish.ts +2 -1
- package/src/surfaces/push-plan.json +4 -3
- package/src/surfaces/rail.json +2 -2
- package/src/surfaces/rail.ts +10 -4
- package/src/surfaces/reference-field.json +1 -1
- package/src/surfaces/schema-form.json +2 -2
- package/src/surfaces/schema-form.ts +1 -1
- package/src/surfaces/seo.json +1 -1
- package/src/surfaces/seo.ts +2 -2
- package/src/surfaces/settings-contributed.ts +2 -1
- package/src/surfaces/settings-css-vars.json +4 -4
- package/src/surfaces/settings-deploy.json +4 -4
- package/src/surfaces/settings-deploy.ts +2 -1
- package/src/surfaces/settings-extensions.json +6 -6
- package/src/surfaces/settings-extensions.ts +6 -2
- package/src/surfaces/settings-locales.json +4 -4
- package/src/surfaces/settings-overview.ts +2 -1
- package/src/surfaces/settings-pane.ts +3 -2
- package/src/surfaces/settings-rawjson.ts +1 -1
- package/src/surfaces/slash-menu.ts +4 -4
- package/src/surfaces/statements.json +3 -3
- package/src/surfaces/statusbar.ts +23 -23
- package/src/surfaces/style-panel.json +9 -5
- package/src/surfaces/style-panel.ts +3 -3
- package/src/surfaces/tab-strip.json +2 -2
- package/src/surfaces/target-line.json +1 -1
- package/src/surfaces/target-line.ts +12 -10
- package/src/surfaces/welcome.json +7 -2
- package/src/tabs/doc-op-apply.ts +5 -5
- package/src/tabs/patch-ops.ts +3 -3
- package/src/tabs/project-config.ts +10 -10
- package/src/tabs/selection.ts +1 -1
- package/src/tabs/tab.ts +13 -14
- package/src/tabs/transact.ts +18 -24
- package/src/types.ts +27 -3
- package/src/ui/ai-credentials-form.ts +74 -16
- package/src/ui/ai-managed-connect.ts +68 -19
- package/src/ui/color-selector.ts +1 -1
- package/src/ui/expression-editor.ts +3 -3
- package/src/ui/form-controls.ts +6 -5
- package/src/ui/formula-catalog.ts +4 -4
- package/src/ui/formula-chips.ts +2 -2
- package/src/ui/layers.ts +20 -18
- package/src/ui/panel-resize.ts +5 -5
- package/src/ui/popover-surface.ts +2 -2
- package/src/ui/progress-modal.ts +3 -3
- package/src/ui/regions.ts +14 -9
- package/src/ui/schema-form.ts +10 -9
- package/src/ui/timing.ts +9 -7
- package/src/ui/value-source.ts +4 -4
- package/src/ui/virtual-window.ts +1 -1
- package/src/utils/base64.ts +20 -1
- package/src/utils/canvas-media.ts +1 -1
- package/src/utils/studio-utils.ts +0 -31
- package/src/view.ts +4 -3
- package/src/workspace/pane-derive.ts +14 -13
- package/src/workspace/session.ts +7 -6
- package/src/workspace/workspace.ts +49 -39
- package/styles/canvas.css +1 -27
- package/styles/inspector.css +4 -3
- package/styles/overlays.css +1 -1
- package/styles/tokens.css +17 -1
- package/styles/tokens.json +6 -1
- package/dist/chunks/entry-commands-1wnsqn5d.js +0 -42
- package/dist/chunks/layers-panel-73gfkcga.js +0 -41
- package/dist/chunks/publish-panel-z1zd2da1.js +0 -27
- package/dist/chunks/quick-search-zdv7h8ht.js +0 -47
- package/dist/chunks/right-panel-889vbnm5.js +0 -45
- package/dist/chunks/studio-727xh0e3.js +0 -76
- package/src/files/json-layout.ts +0 -474
- package/src/services/ai-turn-signal.ts +0 -70
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool-outcomes.ts — where a persisted tool call's outcome lives, and how a restore finds it.
|
|
3
|
+
*
|
|
4
|
+
* A tool call's outcome is recorded twice while a turn runs: as the `result` on its
|
|
5
|
+
* `ToolCallRecord`, which the chip renders, and as the `tool` message that answers it, which the
|
|
6
|
+
* provider reads. The second is the one that must survive, because it is the one the wire carries,
|
|
7
|
+
* and it is the one that always did: until the turn became accountable (specs/ai.md §3.2) the first was never populated for a
|
|
8
|
+
* finished call (the loop looked for the record after closing the stream), so every persisted
|
|
9
|
+
* `result` was `null`: every restored chip rendered as still pending, and an answered question as
|
|
10
|
+
* one still open (specs/ai.md §3.4).
|
|
11
|
+
*
|
|
12
|
+
* So the tool message is the single source. A save strips `result` from every record, which keeps
|
|
13
|
+
* the payload free of a second, disagreeing copy; a restore backfills each record from the reply
|
|
14
|
+
* that answers it. A question nothing answered keeps no result, which is what makes it render
|
|
15
|
+
* inert rather than as one still waiting; an ordinary call nothing answered never completed, and
|
|
16
|
+
* says so.
|
|
17
|
+
*
|
|
18
|
+
* **A seal is not an answer.** When a question was left open, the send path seals its request with
|
|
19
|
+
* a synthesized failure so the wire stays well-formed (`pruneOrphanToolMessages`). For an ordinary
|
|
20
|
+
* call that failure IS the outcome to show: it never completed. For a question it is the absence of
|
|
21
|
+
* an answer, so a restore leaves it without a result, and the chip draws the inert "still open when
|
|
22
|
+
* the session was reloaded" card rather than a failure.
|
|
23
|
+
*
|
|
24
|
+
* @docs studio/ai/chat
|
|
25
|
+
* @license MIT
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import type { ToolResult } from "@jxsuite/ai/tools";
|
|
29
|
+
import type { PersistedMessage } from "./ai-session-store";
|
|
30
|
+
import { UNANSWERED_TOOL_RESULT } from "./context-manager";
|
|
31
|
+
|
|
32
|
+
/** The tool that suspends a turn on the author (services/ai-ask.ts). */
|
|
33
|
+
const ASK_TOOL = "ask_user";
|
|
34
|
+
|
|
35
|
+
/** The outcome of an ordinary call that never ran to completion — the seal's own words. */
|
|
36
|
+
const NEVER_COMPLETED = JSON.parse(UNANSWERED_TOOL_RESULT) as ToolResult;
|
|
37
|
+
|
|
38
|
+
/** A tool-call record as persisted: `id` and `name` are what pairing and the chip read. */
|
|
39
|
+
interface PersistedToolCall {
|
|
40
|
+
id?: unknown;
|
|
41
|
+
name?: unknown;
|
|
42
|
+
result?: unknown;
|
|
43
|
+
[key: string]: unknown;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* The messages as they should be persisted: every tool-call record without its `result`.
|
|
48
|
+
*
|
|
49
|
+
* Copies, never mutates — the live chat's records are the ones the panel is rendering.
|
|
50
|
+
*
|
|
51
|
+
* @param {readonly PersistedMessage[]} messages
|
|
52
|
+
* @returns {PersistedMessage[]}
|
|
53
|
+
*/
|
|
54
|
+
export function stripToolResults(messages: readonly PersistedMessage[]): PersistedMessage[] {
|
|
55
|
+
return messages.map((message) => {
|
|
56
|
+
if (!Array.isArray(message.toolCalls)) {
|
|
57
|
+
return message;
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
...message,
|
|
61
|
+
toolCalls: message.toolCalls.map((call) => {
|
|
62
|
+
if (!call || typeof call !== "object") {
|
|
63
|
+
return call;
|
|
64
|
+
}
|
|
65
|
+
const { result: _result, ...rest } = call as PersistedToolCall;
|
|
66
|
+
return rest;
|
|
67
|
+
}),
|
|
68
|
+
};
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** A tool message's content as a `ToolResult`, or null when it is not one. */
|
|
73
|
+
function parseToolResult(content: unknown): ToolResult | null {
|
|
74
|
+
if (typeof content !== "string") {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
const parsed = JSON.parse(content) as unknown;
|
|
79
|
+
return parsed &&
|
|
80
|
+
typeof parsed === "object" &&
|
|
81
|
+
typeof (parsed as ToolResult).success === "boolean"
|
|
82
|
+
? (parsed as ToolResult)
|
|
83
|
+
: null;
|
|
84
|
+
} catch {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* The messages as they should be restored: every tool-call record carrying the result of the tool
|
|
91
|
+
* message that answered it.
|
|
92
|
+
*
|
|
93
|
+
* **Pairing is per request, not by id across the transcript.** A provider may number its calls
|
|
94
|
+
* afresh each round (`call_0` in round one and again in round two), so the reply to a call is
|
|
95
|
+
* looked for only among the `tool` messages directly after the assistant message that made it — the
|
|
96
|
+
* one position the wire allows a reply in. A record that already carries a result (a payload
|
|
97
|
+
* written before results were stripped) keeps it only when no reply is found.
|
|
98
|
+
*
|
|
99
|
+
* @param {readonly PersistedMessage[]} messages
|
|
100
|
+
* @returns {PersistedMessage[]}
|
|
101
|
+
*/
|
|
102
|
+
export function backfillToolResults(messages: readonly PersistedMessage[]): PersistedMessage[] {
|
|
103
|
+
return messages.map((message, index) => {
|
|
104
|
+
if (message.role !== "assistant" || !Array.isArray(message.toolCalls)) {
|
|
105
|
+
return message;
|
|
106
|
+
}
|
|
107
|
+
const replies = new Map<string, ToolResult>();
|
|
108
|
+
const sealed = new Set<string>();
|
|
109
|
+
for (let next = index + 1; next < messages.length; next++) {
|
|
110
|
+
const reply = messages[next]!;
|
|
111
|
+
if (reply.role !== "tool") {
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
const result = parseToolResult(reply.content);
|
|
115
|
+
if (typeof reply.toolCallId === "string" && result && !replies.has(reply.toolCallId)) {
|
|
116
|
+
replies.set(reply.toolCallId, result);
|
|
117
|
+
if (reply.content === UNANSWERED_TOOL_RESULT) {
|
|
118
|
+
sealed.add(reply.toolCallId);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
...message,
|
|
124
|
+
toolCalls: message.toolCalls.map((call) => {
|
|
125
|
+
if (!call || typeof call !== "object") {
|
|
126
|
+
return call;
|
|
127
|
+
}
|
|
128
|
+
const record = call as PersistedToolCall;
|
|
129
|
+
const id = typeof record.id === "string" ? record.id : undefined;
|
|
130
|
+
const answered = id === undefined ? undefined : replies.get(id);
|
|
131
|
+
if (record.name === ASK_TOOL) {
|
|
132
|
+
/* A question's only outcomes are an answer or none: a seal is not an answer, and a
|
|
133
|
+
question nothing answered stays open, which the chip draws as inert. */
|
|
134
|
+
const reply = answered && id !== undefined && !sealed.has(id) ? answered : undefined;
|
|
135
|
+
return { ...record, result: reply ?? record.result ?? null };
|
|
136
|
+
}
|
|
137
|
+
/* Nothing is in flight after a restore, so an ordinary call nothing answered (a round Stop
|
|
138
|
+
ended before its tools ran) never completed: the outcome the next send's seal will say. */
|
|
139
|
+
return { ...record, result: answered ?? record.result ?? NEVER_COMPLETED };
|
|
140
|
+
}),
|
|
141
|
+
};
|
|
142
|
+
});
|
|
143
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference lib="dom" />
|
|
2
2
|
/**
|
|
3
|
-
* Contexts — the ONE place a project's rendering contexts are defined (
|
|
3
|
+
* Contexts — the ONE place a project's rendering contexts are defined (§6.2, §17.1).
|
|
4
4
|
*
|
|
5
5
|
* A rendering context is anything the document can be resolved _under_: a size breakpoint, a colour
|
|
6
6
|
* scheme, a feature query. All three are the same thing on disk — one entry in `project.json`'s
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
* '(prefers-color-scheme: dark)'` to `$media` **without ever using the word breakpoint**, so the
|
|
16
16
|
* one control that created a colour scheme was filed under variables.
|
|
17
17
|
*
|
|
18
|
-
* All four are gone. §2
|
|
19
|
-
*
|
|
20
|
-
*
|
|
18
|
+
* All four are gone. §6.2 is why: **definition and selection are different levels.** The pane
|
|
19
|
+
* context bar's Rendering-context control _selects_ among these; its popover's footer is "Manage
|
|
20
|
+
* contexts…", which opens this section. Nothing here selects, and nothing there defines.
|
|
21
21
|
*
|
|
22
22
|
* **This section writes the project, not the document.** Per-document `$media` overlays still merge
|
|
23
23
|
* at render time (`site-context.ts`'s `getEffectiveMedia`) and the on-disk format is unchanged —
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
* Failures are surfaced, not swallowed: every write runs through {@link persistMedia}, which
|
|
28
28
|
* schema-validates the candidate `project.json` with `jx-validate` first (the human editing this
|
|
29
29
|
* file used to get **no validation at all** — that was wired to the AI's `write_project_config`
|
|
30
|
-
* alone), parks any rejection under the control that caused it, and re-projects. §
|
|
31
|
-
* a bad value belongs at its control, not in a toast that expires.
|
|
30
|
+
* alone), parks any rejection under the control that caused it, and re-projects. §16.1's third
|
|
31
|
+
* tier: a bad value belongs at its control, not in a toast that expires.
|
|
32
32
|
*
|
|
33
33
|
* **The markup is `surfaces/settings-contexts.json`.** This module is the section's decisions —
|
|
34
34
|
* what a context is, what refuses one, and what reaches disk — and the surface adapter beside that
|
|
@@ -120,8 +120,8 @@ export function splitContexts(media?: Record<string, string> | undefined): {
|
|
|
120
120
|
* The `$media` key a typed name becomes: `Wide screen` → `--wide-screen`.
|
|
121
121
|
*
|
|
122
122
|
* Typing the leading dashes is allowed but never required — the dashes are a storage detail of the
|
|
123
|
-
* CSS custom-property namespace `$media` shares, and
|
|
124
|
-
* the
|
|
123
|
+
* CSS custom-property namespace `$media` shares, and a definition surface may not make the user
|
|
124
|
+
* spell one (the plain-word rule, `studio-ui-guidelines.md` §11.3).
|
|
125
125
|
*
|
|
126
126
|
* @param {string} name
|
|
127
127
|
* @returns {string}
|
|
@@ -129,9 +129,9 @@ export function resetContributedSectionState(): void {
|
|
|
129
129
|
* Select an entry of a map-layout section by key — the addressable form of clicking an entry row.
|
|
130
130
|
*
|
|
131
131
|
* Five screenshot steps used to reach these rows by typing an empty string into a hand-stamped
|
|
132
|
-
* region id, carrying `unstable
|
|
133
|
-
*
|
|
134
|
-
*
|
|
132
|
+
* region id, carrying an `unstable` hatch whose reason was `"settings.selectEntry" has no command
|
|
133
|
+
* record`. The record is `settings.open {section, entry}`: an entry is a KEY in the section's own
|
|
134
|
+
* map, so naming it is naming state rather than reproducing a gesture.
|
|
135
135
|
*
|
|
136
136
|
* @param {string} sectionKey
|
|
137
137
|
* @param {string} entryKey
|
|
@@ -153,7 +153,7 @@ export function selectContributedEntry(sectionKey: string, entryKey: string): st
|
|
|
153
153
|
return null;
|
|
154
154
|
}
|
|
155
155
|
|
|
156
|
-
// ─── Validation (§
|
|
156
|
+
// ─── Validation (§16.1 inline tier, §16.3 Problems) ───────────────────────────
|
|
157
157
|
|
|
158
158
|
/**
|
|
159
159
|
* The last validator run's messages, keyed by the JSON-pointer base they were rendered under.
|
|
@@ -215,8 +215,8 @@ export function routeDiagnostics(
|
|
|
215
215
|
* The write itself now belongs to `tabs/project-config.ts` — one serialisation, one error path, and
|
|
216
216
|
* a transaction the author can undo. This module used to own a second writer, at
|
|
217
217
|
* `JSON.stringify(config, null, "\t")`, which re-indented the whole file on any edit; and before
|
|
218
|
-
* that it was `void saveProjectConfig()` at five call sites with no validation at all. §
|
|
219
|
-
* failed config write as a Problem, because it must be fixed and it is about a named file; the
|
|
218
|
+
* that it was `void saveProjectConfig()` at five call sites with no validation at all. §17.1 files
|
|
219
|
+
* a failed config write as a Problem, because it must be fixed and it is about a named file; the
|
|
220
220
|
* chokepoint files it, so a failure here only has to stop.
|
|
221
221
|
*
|
|
222
222
|
* **The write comes first, and the order is the honest one.** This form mutates
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference lib="dom" />
|
|
2
2
|
/**
|
|
3
|
-
* The design-token editor — the token half of **Project Styles** (
|
|
3
|
+
* The design-token editor — the token half of **Project Styles** (§7.1).
|
|
4
4
|
*
|
|
5
5
|
* Every token in the project's root `style` block, grouped by what it names, each editable in place
|
|
6
6
|
* and each able to carry a different value in any **rendering context** the project declares. The
|
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
* Three things it does NOT do, each on purpose:
|
|
18
18
|
*
|
|
19
19
|
* - **It does not define a context.** Breakpoints and colour schemes are declared once, in Project
|
|
20
|
-
* Settings › Contexts, and this level only overrides against them (§2
|
|
21
|
-
*
|
|
20
|
+
* Settings › Contexts, and this level only overrides against them (§6.2). Where nothing is
|
|
21
|
+
* declared it says so and routes there.
|
|
22
22
|
* - **It does not change the file format.** Overrides are the same `"@--ctx": { "--token": … }`
|
|
23
23
|
* blocks the compiler already reads, and an emptied block is removed rather than left behind.
|
|
24
24
|
* - **It does not re-render the canvas.** An edit is pushed to every live canvas in place through
|
|
@@ -272,8 +272,9 @@ function view(container: HTMLElement): CssVarsView {
|
|
|
272
272
|
const hasScheme = declared.some((context) => context.kind === "scheme");
|
|
273
273
|
const groups: GroupView[] = [];
|
|
274
274
|
for (const { group, tokens } of groupTokens(rootStyle)) {
|
|
275
|
-
/* A bucket named "Other" over an empty list teaches nothing (§
|
|
276
|
-
group keeps its heading and its add row, because an empty one is where a palette
|
|
275
|
+
/* A bucket named "Other" over an empty list teaches nothing (`studio-ui-guidelines.md` §11.1).
|
|
276
|
+
Every other group keeps its heading and its add row, because an empty one is where a palette
|
|
277
|
+
starts. */
|
|
277
278
|
if (group.id === "other" && tokens.length === 0) {
|
|
278
279
|
continue;
|
|
279
280
|
}
|
|
@@ -20,11 +20,11 @@
|
|
|
20
20
|
* **`enablement` is `ctx.project.open` and nothing else, on all three.** A precondition that
|
|
21
21
|
* depends on an ARGUMENT cannot live there — `enablement` cannot see one — so "is this a real
|
|
22
22
|
* extension?", "can this backend run it?" and "is it still enabled?" are refused with a
|
|
23
|
-
* `RangeError` naming the value, the shape §12.4 prescribes and
|
|
24
|
-
* first two are answered by the derived enum that `registry.run`
|
|
25
|
-
* value outside it reads `is not declared — declared: …` — and the
|
|
26
|
-
* for the callers that reach it directly (the Extensions section's
|
|
27
|
-
* changed between the schema being read and the verb running.
|
|
23
|
+
* `RangeError` naming the value, the shape `studio-ui-guidelines.md` §12.4 prescribes and
|
|
24
|
+
* `pane.derive` already uses. The first two are answered by the derived enum that `registry.run`
|
|
25
|
+
* coerces `package` against — a value outside it reads `is not declared — declared: …` — and the
|
|
26
|
+
* sentences inside `run` remain for the callers that reach it directly (the Extensions section's
|
|
27
|
+
* switch) and for a row that changed between the schema being read and the verb running.
|
|
28
28
|
*
|
|
29
29
|
* **The in-flight latch lives here, not in the section**, because the assistant can run these too:
|
|
30
30
|
* a latch the renderer owned would let a tool call and a click install concurrently.
|
|
@@ -137,11 +137,11 @@ export async function enableExtension(specifier: string): Promise<void> {
|
|
|
137
137
|
try {
|
|
138
138
|
if (!row.installed && !row.bundled) {
|
|
139
139
|
/*
|
|
140
|
-
* `beginActivity`, not `showProgressModal`. §13.3 reserves blocking
|
|
141
|
-
* cannot proceed while the author edits, and this one can — the only
|
|
142
|
-
* concurrent write, which the latch closes for a fraction of the cost
|
|
143
|
-
* `ui/progress-modal.ts` also enumerates its four call sites as a closed
|
|
144
|
-
* would make a written invariant false.
|
|
140
|
+
* `beginActivity`, not `showProgressModal`. `studio-ui-guidelines.md` §13.3 reserves blocking
|
|
141
|
+
* for an operation that cannot proceed while the author edits, and this one can — the only
|
|
142
|
+
* real hazard is a second concurrent write, which the latch closes for a fraction of the cost
|
|
143
|
+
* of freezing the app. `ui/progress-modal.ts` also enumerates its four call sites as a closed
|
|
144
|
+
* set, and a fifth would make a written invariant false.
|
|
145
145
|
*/
|
|
146
146
|
const activity = beginActivity({
|
|
147
147
|
source: "Extensions",
|
|
@@ -161,8 +161,8 @@ export async function enableExtension(specifier: string): Promise<void> {
|
|
|
161
161
|
* The activity ends HERE, before the config write, and that boundary is load-bearing:
|
|
162
162
|
* `ActivityHandle.fail` raises its own Problem and `commitProjectConfig` raises another keyed
|
|
163
163
|
* `save:project.json`, so an activity spanning both would post two Problems for one failure
|
|
164
|
-
* with different keys — undeduplicable, and exactly what §13.3
|
|
165
|
-
* honest: the install did succeed.
|
|
164
|
+
* with different keys — undeduplicable, and exactly what `studio-ui-guidelines.md` §13.3
|
|
165
|
+
* rule 3 forbids. It is also honest: the install did succeed.
|
|
166
166
|
*/
|
|
167
167
|
activity.done();
|
|
168
168
|
}
|
|
@@ -210,8 +210,8 @@ export async function disableExtension(specifier: string): Promise<void> {
|
|
|
210
210
|
*
|
|
211
211
|
* Refuses while `project.json` still names it, because removing the package under a live
|
|
212
212
|
* `extensions` entry produces precisely the enabled-but-missing state that fails the next build.
|
|
213
|
-
* §12.4's rule: the strict member's refusal is evidence the write is
|
|
214
|
-
* must not do it anyway.
|
|
213
|
+
* `studio-ui-guidelines.md` §12.4's rule: the strict member's refusal is evidence the write is
|
|
214
|
+
* unsafe, so the loose member must not do it anyway.
|
|
215
215
|
*
|
|
216
216
|
* @param {string} name
|
|
217
217
|
* @returns {Promise<void>}
|
|
@@ -357,10 +357,11 @@ export function extensionCommands(): AnyCommand[] {
|
|
|
357
357
|
enablement: (ctx) => ctx.project.open,
|
|
358
358
|
undo: "none",
|
|
359
359
|
/*
|
|
360
|
-
* Deliberately no `aiTool`. §12.4 binds an agent tool that WRITES
|
|
361
|
-
* the command's rule; it does not require every command to have one.
|
|
362
|
-
* that tells it whether a dependency is load-bearing elsewhere in the
|
|
363
|
-
* form the judgement this verb needs, and the act is destructive and
|
|
360
|
+
* Deliberately no `aiTool`. `studio-ui-guidelines.md` §12.4 binds an agent tool that WRITES
|
|
361
|
+
* what a command writes to the command's rule; it does not require every command to have one.
|
|
362
|
+
* The model has no read that tells it whether a dependency is load-bearing elsewhere in the
|
|
363
|
+
* project, so it cannot form the judgement this verb needs, and the act is destructive and
|
|
364
|
+
* not undoable.
|
|
364
365
|
*/
|
|
365
366
|
run: async (_ctx, args) =>
|
|
366
367
|
removeExtensionPackage(stringArg("packages.remove", args, "package")),
|
|
@@ -89,13 +89,13 @@ const registeredKeys = new Set<string>();
|
|
|
89
89
|
/**
|
|
90
90
|
* The sync currently running, so concurrent callers join it instead of racing it.
|
|
91
91
|
*
|
|
92
|
-
* This is half of the deep-link fix (
|
|
93
|
-
* fires this function **fire-and-forget** on project
|
|
94
|
-
* write, and the settings surface used to start a SECOND,
|
|
95
|
-
* The two runs share {@link registeredKeys} and both reach
|
|
96
|
-
* key one run had just registered could be seen as stale by
|
|
97
|
-
* awaited promise had already resolved. Coalescing makes
|
|
98
|
-
* the registry rather than one fact per caller.
|
|
92
|
+
* This is half of the deep-link fix (`settings.open { section, entry }`, §17.1).
|
|
93
|
+
* `refreshExtensionUi` (`format/format-host.ts`) fires this function **fire-and-forget** on project
|
|
94
|
+
* activation and after every `project.json` write, and the settings surface used to start a SECOND,
|
|
95
|
+
* interleaved run and await only its own. The two runs share {@link registeredKeys} and both reach
|
|
96
|
+
* {@link unregisterSettingsSection}, so a key one run had just registered could be seen as stale by
|
|
97
|
+
* the other and unregistered — after the awaited promise had already resolved. Coalescing makes
|
|
98
|
+
* "the sections are ready" one fact about the registry rather than one fact per caller.
|
|
99
99
|
*/
|
|
100
100
|
let _inFlight: Promise<void> | null = null;
|
|
101
101
|
|
|
@@ -126,9 +126,9 @@ function blockedReason(row: ExtensionRow): string {
|
|
|
126
126
|
* The per-row Remove, as the document reads it.
|
|
127
127
|
*
|
|
128
128
|
* Refused while the extension is still enabled, and DISABLED with the reason rather than hidden
|
|
129
|
-
* (guidelines §10): removing the package while `project.json` still names it
|
|
130
|
-
* the broken state this section exists to eliminate. It is absent only when
|
|
131
|
-
* remove — a package the project never installed, or one the backend bundles.
|
|
129
|
+
* (`studio-ui-guidelines.md` §10): removing the package while `project.json` still names it
|
|
130
|
+
* manufactures exactly the broken state this section exists to eliminate. It is absent only when
|
|
131
|
+
* there is nothing to remove — a package the project never installed, or one the backend bundles.
|
|
132
132
|
*/
|
|
133
133
|
function removeFor(
|
|
134
134
|
row: ExtensionRow,
|
|
@@ -3,10 +3,11 @@
|
|
|
3
3
|
* Overview — the project's identity: name, description, production URL, favicon, global styles.
|
|
4
4
|
*
|
|
5
5
|
* It has lost a field twice for the same reason. Breakpoints were one of **four** places `$media`
|
|
6
|
-
* could be defined
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
* could be defined and this was the only one that named them; they live in Contexts now, beside the
|
|
7
|
+
* colour schemes and feature queries they share a map with. The platform adapter has moved to
|
|
8
|
+
* Deploy, because a definition site is a LEVEL, not a field on some other level's form (the rule
|
|
9
|
+
* §6.2 applies to rendering contexts) — and "what this site is" and "where it ships" are two
|
|
10
|
+
* levels.
|
|
10
11
|
*
|
|
11
12
|
* **The markup left too.** The section is the `settings-overview` surface
|
|
12
13
|
* (`surfaces/settings-overview.json`), mounted by `surfaces/settings-overview.ts`; what is here is
|
|
@@ -102,16 +103,17 @@ const CLEAR_URL = { url: undefined } as unknown as Partial<ProjectConfig>;
|
|
|
102
103
|
* What the surface should be showing, from the configuration and the registry as they stand now.
|
|
103
104
|
*
|
|
104
105
|
* The Project Styles button is rendered FROM the `styles.open` record, so it is disabled rather
|
|
105
|
-
* than absent when it cannot act (§12.3) and it cannot drift from the
|
|
106
|
-
* The record's TITLE, and nothing else off the registry:
|
|
107
|
-
*
|
|
108
|
-
*
|
|
109
|
-
*
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
114
|
-
* an existence check, not a
|
|
106
|
+
* than absent when it cannot act (`studio-ui-guidelines.md` §12.3) and it cannot drift from the
|
|
107
|
+
* palette row or the gear menu. The record's TITLE, and nothing else off the registry:
|
|
108
|
+
* `disabledReason` would be the `studio-ui-guidelines.md` §12.3 shape for a control that can be
|
|
109
|
+
* inapplicable, but this one cannot be — `styles.open` is gated on `ctx.project.open` and Overview
|
|
110
|
+
* is a section of the project's own configuration document, so by the time this renders the answer
|
|
111
|
+
* is always yes. Asking anyway would also be a FOCUS read inside a function that was handed a
|
|
112
|
+
* container, which is what `scripts/check-pane-singletons.ts` rule 4 forbids: a pane-scoped surface
|
|
113
|
+
* must not report the focused pane's state. A project-level verb happens to read the same in every
|
|
114
|
+
* pane, but the way to be right about that is not to ask. The one thing that can genuinely be
|
|
115
|
+
* missing is the registry itself (bootstrap order, a test), and that is an existence check, not a
|
|
116
|
+
* state read.
|
|
115
117
|
*/
|
|
116
118
|
function values(container: HTMLElement): OverviewValues {
|
|
117
119
|
const cfg = config();
|
|
@@ -188,10 +190,11 @@ function actions(container: HTMLElement): OverviewActions {
|
|
|
188
190
|
/*
|
|
189
191
|
* Project Styles is the SAME document in a different editor, and `styles.open` is the one place
|
|
190
192
|
* that says so. This used to write `session.ui.canvasMode` here directly — a second
|
|
191
|
-
* implementation of a capability, §12.5's defect in miniature: the
|
|
192
|
-
* disagree about what "open Project Styles" means, and only one of
|
|
193
|
-
* The mode is still a fact about the TAB, and there is exactly one
|
|
194
|
-
* `revealTab`'s `focusPane` puts the keyboard on whichever pane holds
|
|
193
|
+
* implementation of a capability, `studio-ui-guidelines.md` §12.5's defect in miniature: the
|
|
194
|
+
* button and the command could disagree about what "open Project Styles" means, and only one of
|
|
195
|
+
* them was reachable by name. The mode is still a fact about the TAB, and there is exactly one
|
|
196
|
+
* `project.json` tab, so `revealTab`'s `focusPane` puts the keyboard on whichever pane holds
|
|
197
|
+
* it.
|
|
195
198
|
*/
|
|
196
199
|
openStyles: () => {
|
|
197
200
|
void activeRegistry()?.run("styles.open");
|
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
* blank key into a dialog that did not say that is what a blank key means;
|
|
11
11
|
* - The Cloudflare publish token and account id (`services/cf-settings.ts`) — not clearable at all.
|
|
12
12
|
*
|
|
13
|
-
*
|
|
14
|
-
* It is deliberately UI-free — a record per account with a `revoke` — so the disconnect path
|
|
15
|
-
* testable without a dialog, and so the same records can back a future Problems entry or an
|
|
13
|
+
* §15 puts them under Preferences › Accounts, "listed with a Disconnect each". This module is that
|
|
14
|
+
* list. It is deliberately UI-free — a record per account with a `revoke` — so the disconnect path
|
|
15
|
+
* is testable without a dialog, and so the same records can back a future Problems entry or an
|
|
16
16
|
* `accounts.revoke` command without being re-derived from a template.
|
|
17
17
|
*
|
|
18
18
|
* **No secret is ever returned.** A record says whether something is stored and what it is for;
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Preferences-dialog.ts — ⌘, the application-preferences surface Studio did not have.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* §15 draws the line this file finally makes real. **Project Settings** configures a project and
|
|
6
|
+
* belongs to the project (breakpoints, definitions, deploy); **Preferences** configures the
|
|
7
7
|
* application and follows you between them. Studio shipped only the first, behind a gear in the
|
|
8
8
|
* rail — the slot every other editor spends on the second — and so had nowhere at all to put the
|
|
9
9
|
* chrome theme, the assistant's provider key, the keyboard, or the three credentials it holds.
|
|
10
10
|
*
|
|
11
|
-
* Four sections, and each one closes a hole
|
|
11
|
+
* Four sections, and each one closes a hole the shell redesign named:
|
|
12
12
|
*
|
|
13
13
|
* - **Appearance** — the chrome theme. `shell.theme` and `view.setTheme` already existed; nothing
|
|
14
14
|
* rendered them, so the only way to change the theme was to run a command by hand.
|
|
@@ -19,11 +19,12 @@
|
|
|
19
19
|
* this, `clearGithubToken()` had zero callers: signing out of GitHub was not expressible.
|
|
20
20
|
* - **Keyboard** — GENERATED from `commands/reference.ts`'s `shortcutReference()`, the same
|
|
21
21
|
* projection `docs/studio/interface/shortcuts.md` is built from. The registry is the one place a
|
|
22
|
-
* chord is declared, so the sheet cannot drift from the app or from the docs. Per
|
|
23
|
-
* deliberately no screenshot of it — photographing generated content
|
|
24
|
-
* two ways, because there are two questions ("what is the shortcut for
|
|
25
|
-
* press"), and rebindable — as a LAYER over the registry
|
|
26
|
-
* the sheet stays a projection and the app's own record of
|
|
22
|
+
* chord is declared, so the sheet cannot drift from the app or from the docs. Per CLAUDE.md's
|
|
23
|
+
* Screenshot Policy there is deliberately no screenshot of it — photographing generated content
|
|
24
|
+
* is a bug. It is searchable two ways, because there are two questions ("what is the shortcut for
|
|
25
|
+
* X" and "what did I just press"), and rebindable — as a LAYER over the registry
|
|
26
|
+
* (`settings/preferences-keymap.ts`), so the sheet stays a projection and the app's own record of
|
|
27
|
+
* a default is never edited.
|
|
27
28
|
*
|
|
28
29
|
* **This module is the FLOW; `surfaces/preferences.json` is what it draws.** Every function below
|
|
29
30
|
* either answers a question about state or changes some, and the answers leave here as strings and
|
|
@@ -25,7 +25,7 @@ export interface PreferencesSection {
|
|
|
25
25
|
/**
|
|
26
26
|
* The sections, in sheet order.
|
|
27
27
|
*
|
|
28
|
-
* §
|
|
28
|
+
* §15 lists six for the finished surface (Editor behaviour and Updates/About are the other two).
|
|
29
29
|
* Four are built; a section is added here when it has something to configure, never before — an
|
|
30
30
|
* empty pane is the "declared but unbuilt" state the rail already refuses to render.
|
|
31
31
|
*/
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* error plumbing both still share.
|
|
13
13
|
*
|
|
14
14
|
* **Raw JSON does not open a second editor.** It shows what is on disk and hands the author to the
|
|
15
|
-
* Code editor over the SAME tab — one document, three editors (§
|
|
15
|
+
* Code editor over the SAME tab — one document, three editors (§17.1), so switching to the text and
|
|
16
16
|
* back keeps one undo stack instead of forking two.
|
|
17
17
|
*
|
|
18
18
|
* **The markup left.** Each section is a Jx document over the kit — `surfaces/settings-deploy.json`
|
|
@@ -130,7 +130,7 @@ function deployActions(container: HTMLElement): DeployActions {
|
|
|
130
130
|
* Where the project is built for, and what it is built with.
|
|
131
131
|
*
|
|
132
132
|
* The adapter moved off Overview: Overview says what the site IS, and the adapter is a fact about
|
|
133
|
-
* where it SHIPS — the same split §2
|
|
133
|
+
* where it SHIPS — the same split §6.2 applies to Contexts.
|
|
134
134
|
*
|
|
135
135
|
* The pane calls this again whenever something it cannot see may have changed, and a remount would
|
|
136
136
|
* take the keyboard out of the picker the reader is in — so a standing surface is updated and only
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* `registerSettingsSection` is a **preserved public contract** (specs/extensions.md §9.1): an
|
|
5
5
|
* extension's `project` class declares a `$studio.settings` block and `settings/extension-sections`
|
|
6
|
-
* turns it into one of these records.
|
|
7
|
-
*
|
|
6
|
+
* turns it into one of these records. Project Settings moved out of a modal and into a document in
|
|
7
|
+
* the pane (§17.1); the registry did not move with it, because a section is a contribution to
|
|
8
8
|
* CONFIGURATION, not to a dialog. Splitting it out is what lets the host be replaced without the
|
|
9
9
|
* contribution point being touched.
|
|
10
10
|
*
|
|
@@ -15,10 +15,11 @@
|
|
|
15
15
|
*
|
|
16
16
|
* **What is requested and what is displayed are two variables, and unregistering touches neither.**
|
|
17
17
|
* The modal had one, and its `unregisterSettingsSection` reset it to `"general"` — which is half of
|
|
18
|
-
* the deep-link race
|
|
19
|
-
* registers fresh ones, so a section merely being REFRESHED
|
|
20
|
-
* down with it, silently, after the awaited readiness promise
|
|
21
|
-
* outlives its section going away and is satisfied the moment
|
|
18
|
+
* the deep-link race `settings.open { section, entry }` (§17.1) exists to close. The contribution
|
|
19
|
+
* sync unregisters stale keys before it registers fresh ones, so a section merely being REFRESHED
|
|
20
|
+
* took the caller's requested section down with it, silently, after the awaited readiness promise
|
|
21
|
+
* had already resolved. Here a request outlives its section going away and is satisfied the moment
|
|
22
|
+
* the key comes back.
|
|
22
23
|
*/
|
|
23
24
|
|
|
24
25
|
/** A Project Settings section: an inner-nav entry plus a renderer for the content area. */
|