@jxsuite/studio 4.1.0 → 5.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/data/elements-meta.json +5 -15
- package/data/html-meta.json +51 -6
- package/dist/chunks/{2020-n6tfwnda.js → 2020-g79n01v9.js} +14 -14
- package/dist/chunks/action-group-sp6tna8v.js +118 -0
- package/dist/chunks/adapter-nj7tnjfn.js +13 -0
- package/dist/chunks/cf-account-picker-qwkm9zrf.js +495 -0
- package/dist/chunks/cf-settings-71bv5zn9.js +20 -0
- package/dist/chunks/color-area-v17df7b8.js +154 -0
- package/dist/chunks/color-field-anwybnkn.js +208 -0
- package/dist/chunks/color-slider-44ez96fc.js +79 -0
- package/dist/chunks/color-xgg3kfw7.js +35 -0
- package/dist/chunks/combobox-5e7jev23.js +236 -0
- package/dist/chunks/components-vj72gqtq.js +20 -0
- package/dist/chunks/content-source-5mex4x1h.js +46 -0
- package/dist/chunks/convert-to-repeater-n64h8znc.js +639 -0
- package/dist/chunks/dialog-s890b918.js +85 -0
- package/dist/chunks/editor-3qhbg51x.js +35 -0
- package/dist/chunks/entry-commands-234hjnqw.js +42 -0
- package/dist/chunks/extension-sections-3hpcambp.js +651 -0
- package/dist/chunks/file-ops-8yhd83xr.js +47 -0
- package/dist/chunks/files-hnxqxtsg.js +72 -0
- package/dist/chunks/format-host-779sfp2n.js +40 -0
- package/dist/chunks/fs-events-b88z7g4h.js +18 -0
- package/dist/chunks/git-panel-xwj8fpab.js +49 -0
- package/dist/chunks/icons-yy10wk9r.js +402 -0
- package/dist/chunks/iframe-entry-15g3n6xv.js +114 -0
- package/dist/chunks/iframe-entry-b27vq81n.js +203 -0
- package/dist/chunks/iframe-entry-nbyxee1y.js +154 -0
- package/dist/chunks/iframe-host-syr0f9sb.js +115 -0
- package/dist/chunks/{index-wcnt3r9g.js → index-mdmyx6s2.js} +11 -11
- package/dist/chunks/index-n4j7qxyr.js +109 -0
- package/dist/chunks/{javascript-q8kpmfah.js → javascript-xvrfrpkb.js} +8 -9
- package/dist/chunks/{jsonMode-dkr040ga.js → jsonMode-tyx2kj6p.js} +526 -527
- package/dist/chunks/jx-validate-j0wxk72w.js +15 -0
- package/dist/chunks/layers-ff81wthn.js +30 -0
- package/dist/chunks/layers-panel-pnnghw12.js +40 -0
- package/dist/chunks/listbox-6v2ac08j.js +44 -0
- package/dist/chunks/lit-html-m244w9nh.js +17 -0
- package/dist/chunks/media-picker-cqhhxhhe.js +33 -0
- package/dist/chunks/menu-9p2w46gj.js +15 -0
- package/dist/chunks/menu-q99sy9rf.js +285 -0
- package/dist/chunks/{monaco-binding-rj6xpx9y.js → monaco-binding-sw6en4dw.js} +12 -15
- package/dist/chunks/monaco-buffer-bhy3hb6m.js +24 -0
- package/dist/chunks/{monaco-setup-vx9bhp1d.js → monaco-setup-8r62fj6y.js} +27 -37
- package/dist/chunks/notify-628t0anh.js +21 -0
- package/dist/chunks/number-field-5cndyft8.js +72 -0
- package/dist/chunks/parse-0zx14y15.js +10 -0
- package/dist/chunks/platform-ts9cg1a4.js +15 -0
- package/dist/chunks/popover-47z3ytva.js +25 -0
- package/dist/chunks/publish-panel-5zt840sy.js +27 -0
- package/dist/chunks/quick-search-3748564r.js +45 -0
- package/dist/chunks/references-qvvxej7h.js +26 -0
- package/dist/chunks/right-panel-eccz92qt.js +45 -0
- package/dist/chunks/section-registry-5pq32t0q.js +25 -0
- package/dist/chunks/select-2r16ez41.js +49 -0
- package/dist/chunks/split-g7nm1rgb.js +191 -0
- package/dist/chunks/studio-0hqbpbd0.js +62 -0
- package/dist/chunks/{studio-kryvsw6j.js → studio-1k325pwf.js} +48 -48
- package/dist/chunks/{studio-b55y6ewx.js → studio-1knfqgy7.js} +58 -58
- package/dist/chunks/{studio-2b946z26.js → studio-1z1kcjv4.js} +3628 -6095
- package/dist/chunks/studio-3773086z.js +111 -0
- package/dist/chunks/{studio-4r1pv6zf.js → studio-38emantv.js} +22 -5
- package/dist/chunks/{studio-x813zp48.js → studio-3rz5md06.js} +30 -30
- package/dist/chunks/{studio-ynxwkrzd.js → studio-4wbb9ct0.js} +1953 -1785
- package/dist/chunks/studio-5te5tqng.js +81 -0
- package/dist/chunks/studio-5wt9nvhd.js +4763 -0
- package/dist/chunks/{studio-p4ngc046.js → studio-6ewqv390.js} +9 -9
- package/dist/chunks/{studio-9ab8gqsm.js → studio-6nzaktvy.js} +7 -7
- package/dist/chunks/studio-6xa21ej9.js +28 -0
- package/dist/chunks/{studio-5ehhackm.js → studio-727xh0e3.js} +19 -19
- package/dist/chunks/{studio-gcye7qka.js → studio-7e11jpa9.js} +21 -21
- package/dist/chunks/{studio-q7v10cg2.js → studio-7r42c6ca.js} +17 -7
- package/dist/chunks/studio-7xnmgv66.js +13615 -0
- package/dist/chunks/studio-8scdew0e.js +258 -0
- package/dist/chunks/{studio-fbf92ckf.js → studio-93zafjcm.js} +275 -163
- package/dist/chunks/{studio-dg7zyt5x.js → studio-98b3z07n.js} +1 -1
- package/dist/chunks/studio-a79k90n9.js +1162 -0
- package/dist/chunks/studio-aj37eer3.js +422 -0
- package/dist/chunks/studio-b0k5tqgp.js +2432 -0
- package/dist/chunks/studio-b4s9eykd.js +2811 -0
- package/dist/chunks/{studio-f3wqjtk5.js → studio-d0300636.js} +5076 -18
- package/dist/chunks/{studio-b9b6t1dg.js → studio-e1f24eff.js} +5664 -5666
- package/dist/chunks/studio-e1pgga3k.js +839 -0
- package/dist/chunks/{studio-g1wdche0.js → studio-esrxgwh6.js} +80 -80
- package/dist/chunks/{studio-q43a5y9h.js → studio-g3jevyjt.js} +16 -16
- package/dist/chunks/studio-gb13095a.js +2806 -0
- package/dist/chunks/{studio-3n4ndrzh.js → studio-h4nvnjvz.js} +303 -303
- package/dist/chunks/{studio-dm19q43r.js → studio-hhvs4sdg.js} +10 -10
- package/dist/chunks/{studio-x4qkdat5.js → studio-js8nv53n.js} +1749 -2481
- package/dist/chunks/{studio-qjy2z9bv.js → studio-jxp12rnj.js} +32 -137
- package/dist/chunks/{studio-trxrabqf.js → studio-k75n7vhp.js} +527 -283
- package/dist/chunks/{studio-q9jd1a60.js → studio-kcgff4r0.js} +15 -18
- package/dist/chunks/studio-kkqkcp3d.js +17668 -0
- package/dist/chunks/studio-mhhyamxf.js +763 -0
- package/dist/chunks/{studio-cft9r4r7.js → studio-nq5yf5mp.js} +22 -22
- package/dist/chunks/{studio-685s0ytq.js → studio-nqgawfks.js} +572 -572
- package/dist/chunks/studio-nzzpvzx9.js +185 -0
- package/dist/chunks/{studio-xrapxwwc.js → studio-p1dw8wfw.js} +55 -29
- package/dist/chunks/{studio-3bqpr0zh.js → studio-pxbgypmg.js} +299 -110
- package/dist/chunks/studio-q0a3yk4n.js +33 -0
- package/dist/chunks/{studio-wcy8trfx.js → studio-q3x06vmj.js} +23 -22
- package/dist/chunks/{studio-6yw4y3my.js → studio-qhhm6hbt.js} +8 -8
- package/dist/chunks/studio-qk4bfsq2.js +362 -0
- package/dist/chunks/{studio-msd847zn.js → studio-qk90fgqm.js} +361 -90
- package/dist/chunks/{studio-jkftxyvz.js → studio-r6nvacqs.js} +5861 -2154
- package/dist/chunks/{studio-53n8bp04.js → studio-r6xmmtfh.js} +1 -1
- package/dist/chunks/{studio-tvgyw9xw.js → studio-rnyf3f8e.js} +83 -250
- package/dist/chunks/studio-rs76k67r.js +12 -0
- package/dist/chunks/studio-sbjyc8bt.js +954 -0
- package/dist/chunks/{studio-1wagb550.js → studio-syg2tadj.js} +11 -11
- package/dist/chunks/{studio-t5wqwzdh.js → studio-tjjk7jvk.js} +1 -1
- package/dist/chunks/studio-tqgryxwg.js +1171 -0
- package/dist/chunks/studio-try13h8c.js +8448 -0
- package/dist/chunks/studio-vfq8qpjt.js +1219 -0
- package/dist/chunks/studio-vhv5tgxm.js +51 -0
- package/dist/chunks/{studio-ahn3pdgx.js → studio-vw7mzp6z.js} +52 -38
- package/dist/chunks/studio-wqpngpsk.js +174 -0
- package/dist/chunks/studio-wqz6dggm.js +1356 -0
- package/dist/chunks/{studio-92ab2jqe.js → studio-y9zedyjn.js} +14 -14
- package/dist/chunks/studio-yxa81f45.js +12 -0
- package/dist/chunks/studio-zdn2g6dt.js +148 -0
- package/dist/chunks/swatch-group-t0n6h2rn.js +139 -0
- package/dist/chunks/tabs-wbp1cdws.js +156 -0
- package/dist/chunks/textfield-abk6qyee.js +73 -0
- package/dist/chunks/toast-780pvfbv.js +27 -0
- package/dist/chunks/toast-host-3sqv46sn.js +116 -0
- package/dist/chunks/toolbar-xbh5bhtr.js +194 -0
- package/dist/chunks/tooltip-eptb614w.js +369 -0
- package/dist/chunks/tree-a73p0pqm.js +367 -0
- package/dist/chunks/{tsMode-76kr53q0.js → tsMode-jy4m86rv.js} +83 -85
- package/dist/chunks/workspace-t55jdjbx.js +69 -0
- package/dist/chunks/{ws-client-6shc5rze.js → ws-client-ny4zc51r.js} +20 -22
- package/dist/iframe-entry.js +1873 -673
- package/dist/studio.js +52757 -36535
- package/dist/workers/editor.worker.js +1040 -1085
- package/dist/workers/json.worker.js +1946 -1991
- package/dist/workers/ts.worker.js +4960 -5005
- package/index.html +1 -0
- package/package.json +18 -52
- package/src/about/about-modal.ts +72 -123
- package/src/browse/library-commands.ts +20 -49
- package/src/browse/library-layouts.ts +87 -218
- package/src/browse/library-pane.ts +406 -438
- package/src/canvas/canvas-helpers.ts +0 -49
- package/src/canvas/canvas-live-render.ts +25 -2
- package/src/canvas/canvas-render.ts +666 -231
- package/src/canvas/canvas-surface.ts +0 -1
- package/src/canvas/canvas-utils.ts +333 -113
- package/src/canvas/dialog-path.ts +76 -0
- package/src/canvas/dialog-state.ts +67 -0
- package/src/canvas/diff-marks.ts +252 -0
- package/src/canvas/diff-toolbar.ts +349 -0
- package/src/canvas/diff-view.ts +123 -0
- package/src/canvas/edit-width-drag.ts +187 -0
- package/src/canvas/edit-width.ts +150 -0
- package/src/canvas/iframe-entry.ts +125 -8
- package/src/canvas/iframe-host.ts +271 -15
- package/src/canvas/iframe-interaction.ts +133 -13
- package/src/canvas/iframe-patch.ts +7 -1
- package/src/canvas/iframe-position.ts +5 -6
- package/src/canvas/iframe-protocol.ts +106 -5
- package/src/canvas/iframe-render.ts +373 -5
- package/src/canvas/iframe-slash.ts +2 -2
- package/src/canvas/iframe-subtree.ts +5 -8
- package/src/canvas/path-mapping.ts +25 -3
- package/src/canvas/popover-path.ts +106 -0
- package/src/canvas/popover-state.ts +155 -0
- package/src/canvas/surface-registry.ts +21 -10
- package/src/collab/presence-chips.ts +51 -73
- package/src/commands/app-commands.ts +10 -0
- package/src/commands/budget.ts +12 -0
- package/src/commands/command-args.ts +404 -6
- package/src/commands/defaults.ts +44 -14
- package/src/commands/live-context.ts +11 -5
- package/src/commands/reference.ts +12 -2
- package/src/commands/registry.ts +177 -10
- package/src/commands/run-reported.ts +120 -0
- package/src/content/entry-commands.ts +16 -23
- package/src/content/entry-editor.ts +144 -101
- package/src/editor/canvas-slash-bridge.ts +2 -2
- package/src/editor/context-menu.ts +49 -200
- package/src/editor/convert-to-component.ts +42 -82
- package/src/editor/convert-to-repeater.ts +132 -173
- package/src/editor/inline-edit.ts +11 -0
- package/src/editor/shortcuts.ts +76 -49
- package/src/editor/slash-menu.ts +150 -157
- package/src/files/components.ts +39 -0
- package/src/files/file-ops.ts +117 -11
- package/src/files/files.ts +944 -660
- package/src/files/json-layout.ts +474 -0
- package/src/files/serialize-document.ts +8 -1
- package/src/format/convert-file.ts +16 -10
- package/src/format/format-host.ts +50 -1
- package/src/github/github-auth.ts +71 -29
- package/src/github/github-publish.ts +57 -65
- package/src/grid/cell-editors.ts +46 -4
- package/src/grid/cell-popovers.ts +65 -62
- package/src/grid/grid-open.ts +86 -64
- package/src/grid/grid-panel.ts +390 -469
- package/src/grid/redirects-grid.ts +40 -44
- package/src/hosting/layout.ts +2 -0
- package/src/i18n/i18n-commands.ts +137 -62
- package/src/media/media-pane.ts +83 -133
- package/src/new-project/add-repo-modal.ts +125 -176
- package/src/new-project/import-tab.ts +181 -252
- package/src/new-project/location-fields.ts +93 -160
- package/src/new-project/new-project-modal.ts +376 -367
- package/src/packages/jxsuite-update.ts +76 -18
- package/src/packages/pull-package-sync.ts +5 -1
- package/src/panels/activity-panel.ts +137 -104
- package/src/panels/ai-chat/chat-markdown.ts +15 -13
- package/src/panels/ai-chat/chat-view.ts +307 -472
- package/src/panels/ai-chat/composer.ts +175 -163
- package/src/panels/ai-chat/sessions-view.ts +31 -62
- package/src/panels/ai-panel.ts +213 -185
- package/src/panels/block-action-bar.ts +444 -645
- package/src/panels/bottom-dock.ts +112 -47
- package/src/panels/chat-panel.ts +19 -14
- package/src/panels/data-explorer.ts +141 -102
- package/src/panels/data-grid.ts +183 -150
- package/src/panels/dnd.ts +75 -20
- package/src/panels/editors.ts +26 -19
- package/src/panels/elements-panel.ts +243 -186
- package/src/panels/empty-state.ts +26 -42
- package/src/panels/events-panel.ts +950 -729
- package/src/panels/formula-workspace.ts +434 -207
- package/src/panels/frontmatter-fields.ts +185 -153
- package/src/panels/frontmatter-panel.ts +411 -187
- package/src/panels/git-diff-open.ts +148 -0
- package/src/panels/git-panel.ts +679 -605
- package/src/panels/head-panel.ts +617 -435
- package/src/panels/i18n-panel.ts +148 -135
- package/src/panels/imports-panel.ts +388 -414
- package/src/panels/jump-bar.ts +175 -147
- package/src/panels/layers-panel.ts +785 -671
- package/src/panels/left-panel.ts +166 -94
- package/src/panels/navigator-panels.ts +1 -1
- package/src/panels/pane-context.ts +529 -677
- package/src/panels/pane-grid.ts +265 -241
- package/src/panels/panel-registry.ts +15 -4
- package/src/panels/problems-panel.ts +181 -99
- package/src/panels/properties-panel.ts +1525 -966
- package/src/panels/provenance.ts +31 -113
- package/src/panels/quick-search.ts +223 -184
- package/src/panels/right-panel.ts +135 -169
- package/src/panels/seo-modal.ts +346 -167
- package/src/panels/settings-menu.ts +114 -661
- package/src/panels/settings-pane.ts +102 -86
- package/src/panels/signals-panel.ts +1318 -1172
- package/src/panels/statement-editor.ts +556 -428
- package/src/panels/style-panel.ts +1367 -630
- package/src/panels/style-utils.ts +36 -32
- package/src/panels/stylebook-doc.ts +30 -73
- package/src/panels/stylebook-layers-panel.ts +202 -109
- package/src/panels/stylebook-panel.ts +124 -88
- package/src/panels/tab-strip.ts +386 -288
- package/src/platforms/cloud.ts +106 -16
- package/src/platforms/devserver.ts +13 -0
- package/src/publish/deploy-checklist.ts +124 -78
- package/src/publish/publish-commands.ts +4 -12
- package/src/publish/publish-panel.ts +134 -328
- package/src/services/a11y-report.ts +100 -43
- package/src/services/ai-command-tools.ts +538 -0
- package/src/services/ai-project-tools.ts +8 -2
- package/src/services/ai-session-store.ts +6 -0
- package/src/services/ai-system-prompt.ts +112 -24
- package/src/services/ai-tools.ts +36 -212
- package/src/services/ai-write-report.ts +174 -0
- package/src/services/document-assistant.ts +59 -8
- package/src/services/idle.ts +16 -14
- package/src/services/live-surfaces.ts +237 -0
- package/src/services/model-uri.ts +75 -0
- package/src/services/notify.ts +63 -6
- package/src/services/popover-report.ts +325 -0
- package/src/services/surface-registry.ts +56 -0
- package/src/services/tool-executor.ts +6 -0
- package/src/settings/contexts-section.ts +301 -299
- package/src/settings/contributed-section.ts +361 -222
- package/src/settings/css-vars-editor.ts +320 -325
- package/src/settings/defs-editor.ts +572 -535
- package/src/settings/dependencies-editor.ts +79 -107
- package/src/settings/extension-commands.ts +379 -0
- package/src/settings/extension-rows.ts +113 -0
- package/src/settings/extensions-section.ts +287 -0
- package/src/settings/general-settings.ts +130 -181
- package/src/settings/head-editor.ts +10 -305
- package/src/settings/locales-section.ts +146 -196
- package/src/settings/preferences-accounts.ts +1 -1
- package/src/settings/preferences-dialog.ts +350 -330
- package/src/settings/project-sections.ts +108 -181
- package/src/settings/schema-field-ui.ts +11 -399
- package/src/settings/section-registry.ts +8 -1
- package/src/settings/settings-document.ts +31 -29
- package/src/shell/tree.ts +42 -87
- package/src/shell.ts +48 -36
- package/src/studio.ts +104 -69
- package/src/style/token-ref.ts +0 -39
- package/src/surfaces/about.json +263 -0
- package/src/surfaces/about.ts +163 -0
- package/src/surfaces/add-repo.json +486 -0
- package/src/surfaces/add-repo.ts +236 -0
- package/src/surfaces/ai-chat.json +2185 -0
- package/src/surfaces/ai-chat.ts +549 -0
- package/src/surfaces/ai-credentials-form.json +332 -0
- package/src/surfaces/ai-credentials-form.ts +151 -0
- package/src/surfaces/ai-managed-connect.json +108 -0
- package/src/surfaces/ai-managed-connect.ts +123 -0
- package/src/surfaces/ai-model-picker.json +114 -0
- package/src/surfaces/ai-model-picker.ts +139 -0
- package/src/surfaces/block-action-bar.json +640 -0
- package/src/surfaces/block-action-bar.ts +368 -0
- package/src/surfaces/bottom-dock.json +154 -0
- package/src/surfaces/bottom-dock.ts +125 -0
- package/src/surfaces/canvas-stage.json +444 -0
- package/src/surfaces/canvas-stage.ts +253 -0
- package/src/surfaces/cf-account-picker.json +300 -0
- package/src/surfaces/cf-account-picker.ts +214 -0
- package/src/surfaces/commandbar.json +985 -0
- package/src/{panels/toolbar.ts → surfaces/commandbar.ts} +417 -391
- package/src/surfaces/convert-repeater.json +309 -0
- package/src/surfaces/convert-repeater.ts +276 -0
- package/src/surfaces/data-actions.json +157 -0
- package/src/surfaces/data-actions.ts +115 -0
- package/src/surfaces/dialog.json +289 -0
- package/src/surfaces/dialog.ts +343 -0
- package/src/surfaces/diff-toolbar.json +266 -0
- package/src/surfaces/diff-toolbar.ts +139 -0
- package/src/surfaces/doc-header.json +739 -0
- package/src/surfaces/doc-header.ts +223 -0
- package/src/surfaces/empty-state.json +152 -0
- package/src/surfaces/empty-state.ts +173 -0
- package/src/surfaces/entry-editor.json +281 -0
- package/src/surfaces/entry-editor.ts +191 -0
- package/src/surfaces/expression-editor.json +977 -0
- package/src/surfaces/expression-editor.ts +266 -0
- package/src/surfaces/files-panel.json +592 -0
- package/src/surfaces/files-panel.ts +301 -0
- package/src/surfaces/formula-palette.json +364 -0
- package/src/surfaces/formula-palette.ts +340 -0
- package/src/surfaces/git-panel.json +1822 -0
- package/src/surfaces/git-panel.ts +272 -0
- package/src/surfaces/github-auth.json +112 -0
- package/src/surfaces/github-auth.ts +139 -0
- package/src/surfaces/github-publish.json +206 -0
- package/src/surfaces/github-publish.ts +169 -0
- package/src/surfaces/grid-cell.json +218 -0
- package/src/surfaces/grid-cell.ts +120 -0
- package/src/surfaces/grid-open.json +147 -0
- package/src/surfaces/grid-open.ts +87 -0
- package/src/surfaces/grid-panel.json +706 -0
- package/src/surfaces/grid-panel.ts +206 -0
- package/src/surfaces/grid-replace.json +179 -0
- package/src/surfaces/grid-replace.ts +89 -0
- package/src/surfaces/grid-views.json +446 -0
- package/src/surfaces/grid-views.ts +172 -0
- package/src/surfaces/inspector-dock.json +187 -0
- package/src/surfaces/inspector-dock.ts +161 -0
- package/src/surfaces/jump-bar.json +243 -0
- package/src/surfaces/jump-bar.ts +129 -0
- package/src/surfaces/jxsuite-update.json +146 -0
- package/src/surfaces/jxsuite-update.ts +149 -0
- package/src/surfaces/library-pane.json +1509 -0
- package/src/surfaces/library-pane.ts +363 -0
- package/src/surfaces/logic-panel.json +1949 -0
- package/src/surfaces/logic-panel.ts +369 -0
- package/src/surfaces/logic-workspace.json +685 -0
- package/src/surfaces/logic-workspace.ts +238 -0
- package/src/surfaces/media-browser.json +303 -0
- package/src/surfaces/media-browser.ts +145 -0
- package/src/surfaces/media-field.json +163 -0
- package/src/surfaces/media-field.ts +116 -0
- package/src/surfaces/media-pane.json +513 -0
- package/src/surfaces/media-pane.ts +197 -0
- package/src/surfaces/menu.json +232 -0
- package/src/surfaces/menu.ts +375 -0
- package/src/surfaces/navigator-dock.json +113 -0
- package/src/surfaces/navigator-dock.ts +130 -0
- package/src/surfaces/new-project.json +1654 -0
- package/src/surfaces/new-project.ts +411 -0
- package/src/surfaces/palette.json +535 -0
- package/src/surfaces/pane-context.json +1497 -0
- package/src/surfaces/pane-context.ts +513 -0
- package/src/surfaces/pane-grid.json +188 -0
- package/src/surfaces/pane-grid.ts +250 -0
- package/src/surfaces/panel-activity.json +563 -0
- package/src/surfaces/panel-activity.ts +187 -0
- package/src/surfaces/panel-data.json +141 -0
- package/src/surfaces/panel-data.ts +156 -0
- package/src/surfaces/panel-deploy-checklist.json +283 -0
- package/src/surfaces/panel-deploy-checklist.ts +175 -0
- package/src/surfaces/panel-elements.json +367 -0
- package/src/surfaces/panel-elements.ts +175 -0
- package/src/surfaces/panel-i18n.json +569 -0
- package/src/surfaces/panel-i18n.ts +212 -0
- package/src/surfaces/panel-imports.json +780 -0
- package/src/surfaces/panel-imports.ts +209 -0
- package/src/surfaces/panel-outline.json +734 -0
- package/src/surfaces/panel-outline.ts +326 -0
- package/src/surfaces/panel-page.json +1017 -0
- package/src/surfaces/panel-page.ts +240 -0
- package/src/surfaces/panel-problems.json +497 -0
- package/src/surfaces/panel-problems.ts +157 -0
- package/src/surfaces/panel-signals.json +1973 -0
- package/src/surfaces/panel-signals.ts +436 -0
- package/src/surfaces/panel-stylebook-layers.json +317 -0
- package/src/surfaces/panel-stylebook-layers.ts +155 -0
- package/src/surfaces/preferences.json +850 -0
- package/src/surfaces/preferences.ts +332 -0
- package/src/surfaces/progress-modal.json +110 -0
- package/src/surfaces/progress-modal.ts +150 -0
- package/src/surfaces/properties-panel.json +1578 -0
- package/src/surfaces/properties-panel.ts +337 -0
- package/src/surfaces/publish.json +945 -0
- package/src/surfaces/publish.ts +392 -0
- package/src/surfaces/push-plan.json +110 -0
- package/src/surfaces/push-plan.ts +87 -0
- package/src/surfaces/rail.json +255 -0
- package/src/surfaces/rail.ts +206 -0
- package/src/surfaces/reference-field.json +191 -0
- package/src/surfaces/reference-field.ts +168 -0
- package/src/surfaces/schema-builder.json +1011 -0
- package/src/surfaces/schema-builder.ts +181 -0
- package/src/surfaces/schema-form.json +1013 -0
- package/src/surfaces/schema-form.ts +287 -0
- package/src/surfaces/secret-field.json +60 -0
- package/src/surfaces/secret-field.ts +146 -0
- package/src/surfaces/seo.json +932 -0
- package/src/surfaces/seo.ts +334 -0
- package/src/surfaces/settings-contexts.json +538 -0
- package/src/surfaces/settings-contexts.ts +196 -0
- package/src/surfaces/settings-contributed.json +489 -0
- package/src/surfaces/settings-contributed.ts +199 -0
- package/src/surfaces/settings-css-vars.json +820 -0
- package/src/surfaces/settings-css-vars.ts +199 -0
- package/src/surfaces/settings-defs.json +1363 -0
- package/src/surfaces/settings-defs.ts +232 -0
- package/src/surfaces/settings-deploy.json +108 -0
- package/src/surfaces/settings-deploy.ts +135 -0
- package/src/surfaces/settings-extensions.json +486 -0
- package/src/surfaces/settings-extensions.ts +201 -0
- package/src/surfaces/settings-head.json +779 -0
- package/src/surfaces/settings-head.ts +397 -0
- package/src/surfaces/settings-locales.json +420 -0
- package/src/surfaces/settings-locales.ts +137 -0
- package/src/surfaces/settings-overview.json +423 -0
- package/src/surfaces/settings-overview.ts +218 -0
- package/src/surfaces/settings-packages.json +549 -0
- package/src/surfaces/settings-packages.ts +158 -0
- package/src/surfaces/settings-pane.json +147 -0
- package/src/surfaces/settings-pane.ts +150 -0
- package/src/surfaces/settings-rawjson.json +104 -0
- package/src/surfaces/settings-rawjson.ts +107 -0
- package/src/surfaces/shell.json +99 -0
- package/src/surfaces/shell.ts +30 -0
- package/src/surfaces/slash-menu.json +180 -0
- package/src/surfaces/slash-menu.ts +272 -0
- package/src/surfaces/statements.json +607 -0
- package/src/surfaces/statements.ts +238 -0
- package/src/surfaces/statusbar.json +94 -0
- package/src/{panels → surfaces}/statusbar.ts +164 -90
- package/src/surfaces/style-panel.json +1643 -0
- package/src/surfaces/style-panel.ts +338 -0
- package/src/surfaces/stylebook-chrome.json +122 -0
- package/src/surfaces/stylebook-chrome.ts +122 -0
- package/src/surfaces/tab-strip.json +448 -0
- package/src/surfaces/tab-strip.ts +200 -0
- package/src/surfaces/target-line.json +419 -0
- package/src/surfaces/target-line.ts +349 -0
- package/src/surfaces/toasts.json +189 -0
- package/src/surfaces/welcome.json +571 -0
- package/src/surfaces/welcome.ts +338 -0
- package/src/tabs/project-config.ts +111 -21
- package/src/tabs/tab.ts +52 -1
- package/src/types.ts +22 -0
- package/src/ui/ai-credentials-form.ts +104 -100
- package/src/ui/ai-managed-connect.ts +54 -36
- package/src/ui/ai-model-picker.ts +75 -47
- package/src/ui/cf-account-picker.ts +76 -141
- package/src/ui/color-selector.ts +80 -301
- package/src/ui/dynamic-slot.ts +43 -283
- package/src/ui/expression-editor.ts +797 -576
- package/src/ui/field-input.ts +8 -181
- package/src/ui/form-controls.ts +838 -366
- package/src/ui/formula-chips.ts +80 -85
- package/src/ui/kit.ts +33 -0
- package/src/ui/layers.ts +296 -593
- package/src/ui/media-picker.ts +203 -284
- package/src/ui/panel-resize.ts +251 -64
- package/src/ui/popover-surface.ts +153 -0
- package/src/ui/progress-modal.ts +22 -60
- package/src/ui/regions.ts +13 -7
- package/src/ui/schema-form.ts +906 -440
- package/src/ui/surface.ts +122 -0
- package/src/ui/unit-selector.ts +15 -131
- package/src/ui/value-source.ts +14 -0
- package/src/ui/virtual-window.ts +88 -9
- package/src/utils/canvas-media.ts +72 -0
- package/src/utils/edit-display.ts +7 -2
- package/src/utils/element-selectors.ts +69 -0
- package/src/utils/link-target.ts +2 -2
- package/src/utils/studio-utils.ts +0 -10
- package/src/view.ts +15 -0
- package/src/workspace/pane-derive.ts +36 -14
- package/src/workspace/workspace.ts +75 -6
- package/styles/canvas.css +72 -467
- package/styles/forced-colors.css +48 -82
- package/styles/forced-colors.json +41 -0
- package/styles/inspector.css +2 -1301
- package/styles/overlays.css +96 -2823
- package/styles/panels.css +6 -1423
- package/styles/shell-frame.css +272 -0
- package/styles/shell-frame.json +227 -0
- package/styles/shell.css +0 -1568
- package/styles/tokens.css +65 -136
- package/styles/tokens.json +84 -0
- package/dist/chunks/Overlay.dev-etqjwyf9.js +0 -23
- package/dist/chunks/adapter-jkcyhgtr.js +0 -14
- package/dist/chunks/cf-account-picker-en86v7x7.js +0 -163
- package/dist/chunks/cf-settings-45fgyx8y.js +0 -21
- package/dist/chunks/components-zmx10t62.js +0 -21
- package/dist/chunks/content-source-48xg86wj.js +0 -49
- package/dist/chunks/convert-to-repeater-43tfn7cs.js +0 -268
- package/dist/chunks/editor-cptq5jp1.js +0 -37
- package/dist/chunks/entry-commands-e63f1xc0.js +0 -46
- package/dist/chunks/extension-sections-txv08xxg.js +0 -311
- package/dist/chunks/file-ops-wbh4hhsx.js +0 -48
- package/dist/chunks/files-3kfkwhk4.js +0 -93
- package/dist/chunks/flow-qbfgrpeh.js +0 -634
- package/dist/chunks/focus-trap.esm-9t2drp0g.js +0 -1025
- package/dist/chunks/focus-visible-6eg70z18.js +0 -167
- package/dist/chunks/format-host-w16q81tf.js +0 -43
- package/dist/chunks/fs-events-hrrg328g.js +0 -21
- package/dist/chunks/git-panel-532whr1y.js +0 -59
- package/dist/chunks/index-zqxmqxmh.js +0 -109
- package/dist/chunks/jx-validate-8er6gbxy.js +0 -19
- package/dist/chunks/layers-panel-07hm7g5j.js +0 -67
- package/dist/chunks/layers-q75tj2mf.js +0 -45
- package/dist/chunks/lit-html-j055mkh8.js +0 -22
- package/dist/chunks/monaco-buffer-dqw0xxpx.js +0 -25
- package/dist/chunks/notify-yjm79n4s.js +0 -30
- package/dist/chunks/parse-24d0gay3.js +0 -19
- package/dist/chunks/platform-ba1j1gbh.js +0 -16
- package/dist/chunks/publish-panel-v9st96ja.js +0 -29
- package/dist/chunks/quick-search-zccjp6gv.js +0 -66
- package/dist/chunks/references-3qx8fkyp.js +0 -29
- package/dist/chunks/right-panel-vm3b6kwy.js +0 -46
- package/dist/chunks/section-registry-sx1ykvkw.js +0 -30
- package/dist/chunks/sp-overlay.dev-qgvhnxf4.js +0 -18
- package/dist/chunks/sp-popover.dev-n2etmqdp.js +0 -9
- package/dist/chunks/sp-progress-circle.dev-hryhj0es.js +0 -15
- package/dist/chunks/sp-tooltip.dev-4sastdnw.js +0 -15
- package/dist/chunks/sp-tray.dev-tkbscm06.js +0 -199
- package/dist/chunks/studio-0a5qrh01.js +0 -3
- package/dist/chunks/studio-0bq6eh7v.js +0 -12
- package/dist/chunks/studio-18j3bmcz.js +0 -14
- package/dist/chunks/studio-1ngbejft.js +0 -181
- package/dist/chunks/studio-4b5z1x43.js +0 -424
- package/dist/chunks/studio-4n2b5gzb.js +0 -357
- package/dist/chunks/studio-4rzyrtjz.js +0 -426
- package/dist/chunks/studio-5fx3g9jg.js +0 -4325
- package/dist/chunks/studio-5myknm0a.js +0 -1903
- package/dist/chunks/studio-7afd21nw.js +0 -67
- package/dist/chunks/studio-7nte2hj4.js +0 -613
- package/dist/chunks/studio-8jpzqk5s.js +0 -128
- package/dist/chunks/studio-8q517dfr.js +0 -24
- package/dist/chunks/studio-950k0dx6.js +0 -6939
- package/dist/chunks/studio-9n4mrmnb.js +0 -184
- package/dist/chunks/studio-a0tswy0w.js +0 -58
- package/dist/chunks/studio-ahnzd9rg.js +0 -23
- package/dist/chunks/studio-bgxt93ga.js +0 -62
- package/dist/chunks/studio-cmb03bg5.js +0 -13890
- package/dist/chunks/studio-d1ks410h.js +0 -175
- package/dist/chunks/studio-ef49pnzx.js +0 -387
- package/dist/chunks/studio-eqq1w638.js +0 -113
- package/dist/chunks/studio-ew0djmhg.js +0 -341
- package/dist/chunks/studio-gfgb8pe6.js +0 -1652
- package/dist/chunks/studio-h4rxscfc.js +0 -10
- package/dist/chunks/studio-jc994dnr.js +0 -1066
- package/dist/chunks/studio-kyh9avvv.js +0 -28
- package/dist/chunks/studio-m3hwn7y1.js +0 -120
- package/dist/chunks/studio-mtfnaqs9.js +0 -659
- package/dist/chunks/studio-n6j9t10q.js +0 -318
- package/dist/chunks/studio-n8b9wqwy.js +0 -291
- package/dist/chunks/studio-qcy05dp8.js +0 -1743
- package/dist/chunks/studio-qq6jym04.js +0 -53
- package/dist/chunks/studio-rdx8jcxy.js +0 -83
- package/dist/chunks/studio-rn9ta2mz.js +0 -111
- package/dist/chunks/studio-t7qb9db8.js +0 -665
- package/dist/chunks/studio-tmc5emrw.js +0 -8
- package/dist/chunks/studio-z6nw2ek2.js +0 -18
- package/dist/chunks/studio-zczps70q.js +0 -378
- package/dist/chunks/studio-zqazsct2.js +0 -1823
- package/dist/chunks/workspace-fjx52ryv.js +0 -89
- package/src/panels/activity-bar.ts +0 -251
- package/src/panels/panel-scheduler.ts +0 -219
- package/src/panels/style-inputs.ts +0 -237
- package/src/panels/target-line.ts +0 -274
- package/src/panels/welcome-screen.ts +0 -346
- package/src/ui/button-group.ts +0 -102
- package/src/ui/choice-field.ts +0 -72
- package/src/ui/field-row.ts +0 -249
- package/src/ui/formula-palette.ts +0 -213
- package/src/ui/icons.ts +0 -52
- package/src/ui/jx-theme.ts +0 -130
- package/src/ui/spectrum.ts +0 -340
- package/src/ui/value-selector.ts +0 -174
- package/src/ui/widgets.ts +0 -172
- /package/dist/chunks/{javascript-s56a8dpk.css → javascript-4abzjcy9.css} +0 -0
- /package/dist/chunks/{jsonMode-zr9sw0c7.css → jsonMode-vvmpmk34.css} +0 -0
- /package/dist/chunks/{monaco-setup-pav68602.css → monaco-setup-8vbyqnhr.css} +0 -0
- /package/dist/chunks/{tsMode-ef187txx.css → tsMode-hnxxb73h.css} +0 -0
|
@@ -1,40 +1,45 @@
|
|
|
1
1
|
/// <reference lib="dom" />
|
|
2
2
|
/**
|
|
3
|
-
* Composer.
|
|
3
|
+
* Composer.ts — the sticky bottom chat input, as state and decisions.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* draft state never leaks between hosts.
|
|
5
|
+
* The draft, the attached-context chips, the attach menu and the model picker. Enter sends and
|
|
6
|
+
* Shift+Enter opens a line; the button morphs into Stop while a turn is in flight. Closure factory
|
|
7
|
+
* (precedent: createAiCredentialsForm) so draft state never leaks between hosts.
|
|
9
8
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
9
|
+
* **There is no markup here.** `surfaces/ai-chat.json` draws the composer and this module says what
|
|
10
|
+
* it holds — which is what let the auto-grow go entirely: the textarea grows with
|
|
11
|
+
* `field-sizing: content`, where this file used to write `scrollHeight` back into `style.height` on
|
|
12
|
+
* every keystroke.
|
|
13
|
+
*
|
|
14
|
+
* **The draft is a controlled value now, and that is safe for the reason it was not before.** The
|
|
15
|
+
* lit textarea had to be uncontrolled, because a streaming repaint re-rendered the whole panel and
|
|
16
|
+
* would have clobbered the caret; a document's binding re-runs only when what it reads CHANGES, and
|
|
17
|
+
* a write equal to what the field already says is skipped. So a token arriving mid-stream touches
|
|
18
|
+
* one text node in the transcript and nothing at all down here.
|
|
19
|
+
*
|
|
20
|
+
* The attach menu is `surfaces/menu.ts`, the kit menu every other menu in Studio opens. It was an
|
|
21
|
+
* `overlay-trigger` + `sp-popover` + `sp-menu` of its own, which is a second answer to a settled
|
|
22
|
+
* question — and the one that did not get roving focus, typeahead or light dismissal.
|
|
13
23
|
*
|
|
14
24
|
* @license MIT
|
|
15
25
|
*/
|
|
16
26
|
|
|
17
|
-
import { html, nothing } from "lit-html";
|
|
18
27
|
import { displayTagName } from "@jxsuite/schema/guards";
|
|
19
|
-
import type { TemplateResult } from "lit-html";
|
|
20
|
-
import { ref } from "lit-html/directives/ref.js";
|
|
21
28
|
import { getNodeAtPath } from "../../state";
|
|
22
29
|
import { createModelPicker } from "../../ui/ai-model-picker";
|
|
30
|
+
import { openMenu } from "../../surfaces/menu";
|
|
31
|
+
import { rectOf } from "../../utils/geometry";
|
|
23
32
|
import { activeTab } from "../../workspace/workspace";
|
|
24
33
|
import { primarySelection } from "../../tabs/selection";
|
|
25
34
|
import { buildMessageWithContext } from "./attached-context";
|
|
26
35
|
import type { ContextChip } from "./attached-context";
|
|
36
|
+
import type { ChatComposerChip } from "../../surfaces/ai-chat";
|
|
37
|
+
import type { MenuHandle } from "../../surfaces/menu";
|
|
27
38
|
import type { JxMutableNode } from "@jxsuite/schema/types";
|
|
28
39
|
|
|
29
|
-
/** Tallest the textarea auto-grows before it scrolls internally. */
|
|
30
|
-
const MAX_INPUT_HEIGHT = 120;
|
|
31
|
-
|
|
32
40
|
export interface ComposerOptions {
|
|
33
41
|
/** Receives the full message content (typed text + serialized context). */
|
|
34
42
|
onSend: (text: string) => void;
|
|
35
|
-
onStop: () => void;
|
|
36
|
-
/** Opens the credentials form. */
|
|
37
|
-
onOpenSettings: () => void;
|
|
38
43
|
isStreaming: () => boolean;
|
|
39
44
|
/**
|
|
40
45
|
* Whether the turn is suspended on a question. The composer becomes the answer field: Enter still
|
|
@@ -43,14 +48,39 @@ export interface ComposerOptions {
|
|
|
43
48
|
* Optional so the evals harness and tests that predate `ask_user` keep compiling.
|
|
44
49
|
*/
|
|
45
50
|
isAwaiting?: () => boolean;
|
|
46
|
-
/** Host re-
|
|
51
|
+
/** Host re-projection scheduler — called whenever composer state changes. */
|
|
47
52
|
requestRender: () => void;
|
|
48
53
|
}
|
|
49
54
|
|
|
55
|
+
/** What the composer contributes to the surface's projection. */
|
|
56
|
+
export interface ComposerView {
|
|
57
|
+
draft: string;
|
|
58
|
+
placeholder: string;
|
|
59
|
+
composerChips: ChatComposerChip[];
|
|
60
|
+
hasComposerChips: boolean;
|
|
61
|
+
/** `send` or `stop`. */
|
|
62
|
+
sendState: string;
|
|
63
|
+
sendLabel: string;
|
|
64
|
+
sendDisabled: boolean;
|
|
65
|
+
note: string;
|
|
66
|
+
noteState: string;
|
|
67
|
+
awaiting: boolean;
|
|
68
|
+
}
|
|
69
|
+
|
|
50
70
|
export interface Composer {
|
|
51
|
-
|
|
52
|
-
|
|
71
|
+
/** What the composer says right now, for the panel's projection. */
|
|
72
|
+
view: () => ComposerView;
|
|
73
|
+
/** The reader typed. */
|
|
74
|
+
edit: (text: string) => void;
|
|
75
|
+
/** Send what is typed, if anything is and nothing is already in flight. */
|
|
76
|
+
send: () => void;
|
|
53
77
|
clear: () => void;
|
|
78
|
+
/** Open the attach menu under the button that was pressed. */
|
|
79
|
+
openAttachMenu: (anchor: unknown) => void;
|
|
80
|
+
/** Take a chip off, by its kind. */
|
|
81
|
+
dropChip: (kind: string) => void;
|
|
82
|
+
/** The model picker's host is in the page; put the picker's own element in it. */
|
|
83
|
+
pickerSlot: (host: HTMLElement) => void;
|
|
54
84
|
/**
|
|
55
85
|
* Attach the canvas selection as a context chip, as the attach menu's second item does.
|
|
56
86
|
*
|
|
@@ -64,17 +94,19 @@ export interface Composer {
|
|
|
64
94
|
}
|
|
65
95
|
|
|
66
96
|
/**
|
|
67
|
-
* Create a composer instance bound to a host's
|
|
97
|
+
* Create a composer instance bound to a host's projection scheduler.
|
|
68
98
|
*
|
|
69
99
|
* @param {ComposerOptions} opts
|
|
70
100
|
* @returns {Composer}
|
|
71
101
|
*/
|
|
72
102
|
export function createComposer(opts: ComposerOptions): Composer {
|
|
73
|
-
let
|
|
74
|
-
let hasText = false;
|
|
103
|
+
let draft = "";
|
|
75
104
|
let chips: ContextChip[] = [];
|
|
105
|
+
let menu: MenuHandle | null = null;
|
|
106
|
+
/** The slot the document rendered for the picker, once it has. */
|
|
107
|
+
let pickerHost: HTMLElement | null = null;
|
|
76
108
|
|
|
77
|
-
/* The model picker is `ui/ai-model-picker.ts
|
|
109
|
+
/* The model picker is `ui/ai-model-picker.ts`, not forty lines here: the New Project Import
|
|
78
110
|
source chooses a model too, and the "never hold the list privately" invariant is the kind that
|
|
79
111
|
only breaks in the copy nobody looked at. */
|
|
80
112
|
const modelPicker = createModelPicker({ requestRender: opts.requestRender });
|
|
@@ -117,7 +149,7 @@ export function createComposer(opts: ComposerOptions): Composer {
|
|
|
117
149
|
opts.requestRender();
|
|
118
150
|
}
|
|
119
151
|
|
|
120
|
-
function
|
|
152
|
+
function dropChip(kind: string) {
|
|
121
153
|
chips = chips.filter((c) => c.kind !== kind);
|
|
122
154
|
opts.requestRender();
|
|
123
155
|
}
|
|
@@ -132,167 +164,147 @@ export function createComposer(opts: ComposerOptions): Composer {
|
|
|
132
164
|
return true;
|
|
133
165
|
}
|
|
134
166
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
if (value === "page" && pageChip) {
|
|
147
|
-
addChip(pageChip);
|
|
148
|
-
} else if (value === "selection" && selectionChip) {
|
|
149
|
-
addChip(selectionChip);
|
|
150
|
-
}
|
|
151
|
-
}}
|
|
152
|
-
>
|
|
153
|
-
<sp-menu-item value="page" ?disabled=${!pageChip}>
|
|
154
|
-
Current page${pageChip ? ` — ${pageChip.label}` : ""}
|
|
155
|
-
</sp-menu-item>
|
|
156
|
-
<sp-menu-item value="selection" ?disabled=${!selectionChip}>
|
|
157
|
-
Selected element${selectionChip ? ` — ${selectionChip.label}` : ""}
|
|
158
|
-
</sp-menu-item>
|
|
159
|
-
</sp-menu>
|
|
160
|
-
</sp-popover>
|
|
161
|
-
</overlay-trigger>
|
|
162
|
-
`;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
function renderChips(): TemplateResult | typeof nothing {
|
|
166
|
-
if (chips.length === 0) {
|
|
167
|
-
return nothing;
|
|
167
|
+
/**
|
|
168
|
+
* The attach menu, under its own button. A second press closes it: the button is a toggle.
|
|
169
|
+
*
|
|
170
|
+
* `openMenu` rather than a popover of this module's own — the kit menu is the settled answer, and
|
|
171
|
+
* it brings roving focus, typeahead, Escape and light dismissal with it.
|
|
172
|
+
*/
|
|
173
|
+
function openAttachMenu(anchor: unknown): void {
|
|
174
|
+
if (menu) {
|
|
175
|
+
menu.close();
|
|
176
|
+
menu = null;
|
|
177
|
+
return;
|
|
168
178
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
179
|
+
const opener = anchor instanceof HTMLElement ? anchor : null;
|
|
180
|
+
const { pageChip, selectionChip } = contextCandidates();
|
|
181
|
+
menu = openMenu({
|
|
182
|
+
label: "Attach context",
|
|
183
|
+
onClosed: (handle) => {
|
|
184
|
+
if (menu === handle) {
|
|
185
|
+
menu = null;
|
|
186
|
+
}
|
|
187
|
+
},
|
|
188
|
+
...(opener ? { opener } : {}),
|
|
189
|
+
...(opener
|
|
190
|
+
? {
|
|
191
|
+
place: () => {
|
|
192
|
+
const box = rectOf(opener);
|
|
193
|
+
return { x: box.left, y: box.top - 4 };
|
|
194
|
+
},
|
|
195
|
+
}
|
|
196
|
+
: { origin: { x: 0, y: 0 } }),
|
|
197
|
+
region: "assistant-attach",
|
|
198
|
+
rows: [
|
|
199
|
+
{
|
|
200
|
+
destructive: false,
|
|
201
|
+
disabled: pageChip === null,
|
|
202
|
+
dividerAbove: false,
|
|
203
|
+
id: "attach.page",
|
|
204
|
+
requires: "a page open in this pane",
|
|
205
|
+
run: () => {
|
|
206
|
+
if (pageChip) {
|
|
207
|
+
addChip(pageChip);
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
title: pageChip ? `Current page — ${pageChip.label}` : "Current page",
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
destructive: false,
|
|
214
|
+
disabled: selectionChip === null,
|
|
215
|
+
dividerAbove: false,
|
|
216
|
+
id: "attach.selection",
|
|
217
|
+
requires: "an element selected on the canvas",
|
|
218
|
+
run: () => {
|
|
219
|
+
if (selectionChip) {
|
|
220
|
+
addChip(selectionChip);
|
|
221
|
+
}
|
|
222
|
+
},
|
|
223
|
+
title: selectionChip ? `Selected element — ${selectionChip.label}` : "Selected element",
|
|
224
|
+
},
|
|
225
|
+
],
|
|
226
|
+
});
|
|
183
227
|
}
|
|
184
228
|
|
|
185
229
|
// ── Input ─────────────────────────────────────────────────────────────
|
|
186
230
|
|
|
187
|
-
function
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
function onInput() {
|
|
196
|
-
autoGrow();
|
|
197
|
-
const nowHasText = Boolean(textareaEl?.value.trim());
|
|
198
|
-
if (nowHasText !== hasText) {
|
|
199
|
-
hasText = nowHasText;
|
|
200
|
-
// Only re-render on the empty↔non-empty flip so typing stays cheap.
|
|
231
|
+
function edit(text: string) {
|
|
232
|
+
const had = draft.trim().length > 0;
|
|
233
|
+
draft = text;
|
|
234
|
+
if (had !== draft.trim().length > 0) {
|
|
235
|
+
// Only re-project on the empty↔non-empty flip: the send button is the only thing that moves,
|
|
236
|
+
// And the field itself is bound to `draft`, which the document already has.
|
|
201
237
|
opts.requestRender();
|
|
202
238
|
}
|
|
203
239
|
}
|
|
204
240
|
|
|
205
|
-
function
|
|
206
|
-
if (
|
|
207
|
-
e.preventDefault();
|
|
208
|
-
trySend();
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
function trySend() {
|
|
213
|
-
const text = textareaEl?.value ?? "";
|
|
214
|
-
if (!text.trim() || opts.isStreaming()) {
|
|
241
|
+
function send() {
|
|
242
|
+
if (!draft.trim() || opts.isStreaming()) {
|
|
215
243
|
return;
|
|
216
244
|
}
|
|
217
|
-
|
|
245
|
+
const text = buildMessageWithContext(draft, chips);
|
|
218
246
|
clear();
|
|
247
|
+
opts.onSend(text);
|
|
219
248
|
opts.requestRender();
|
|
220
249
|
}
|
|
221
250
|
|
|
222
251
|
function clear() {
|
|
223
|
-
|
|
224
|
-
textareaEl.value = "";
|
|
225
|
-
textareaEl.style.height = "auto";
|
|
226
|
-
}
|
|
227
|
-
hasText = false;
|
|
252
|
+
draft = "";
|
|
228
253
|
chips = [];
|
|
229
254
|
}
|
|
230
255
|
|
|
231
|
-
|
|
232
|
-
|
|
256
|
+
/**
|
|
257
|
+
* Bring the picker up to date and keep its host element in the slot.
|
|
258
|
+
*
|
|
259
|
+
* `createModelPicker().render()` is both the update and the element: it re-reads the catalogue
|
|
260
|
+
* for the CURRENT credentials on every call, which is the invariant that stops one provider's
|
|
261
|
+
* models being offered while another is configured. Re-appending a node already in place is a
|
|
262
|
+
* no-op, so this costs nothing on a repaint.
|
|
263
|
+
*/
|
|
264
|
+
function refreshPicker(): void {
|
|
265
|
+
const element = modelPicker.render();
|
|
266
|
+
if (pickerHost && element.parentNode !== pickerHost) {
|
|
267
|
+
pickerHost.append(element);
|
|
268
|
+
}
|
|
233
269
|
}
|
|
234
270
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
function render(): TemplateResult {
|
|
271
|
+
function view(): ComposerView {
|
|
272
|
+
refreshPicker();
|
|
238
273
|
const streaming = opts.isStreaming();
|
|
239
274
|
const awaiting = opts.isAwaiting?.() ?? false;
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
<sp-action-button size="s" quiet title="API key & endpoint" @click=${opts.onOpenSettings}>
|
|
261
|
-
<sp-icon-settings slot="icon"></sp-icon-settings>
|
|
262
|
-
</sp-action-button>
|
|
263
|
-
${
|
|
264
|
-
streaming
|
|
265
|
-
? html`
|
|
266
|
-
<sp-action-button size="s" class="ai-send-btn" title="Stop" @click=${opts.onStop}>
|
|
267
|
-
<sp-icon-stop slot="icon"></sp-icon-stop>
|
|
268
|
-
</sp-action-button>
|
|
269
|
-
`
|
|
270
|
-
: html`
|
|
271
|
-
<sp-action-button
|
|
272
|
-
size="s"
|
|
273
|
-
class="ai-send-btn"
|
|
274
|
-
title=${awaiting ? "Answer" : "Send"}
|
|
275
|
-
?disabled=${!hasText}
|
|
276
|
-
@click=${trySend}
|
|
277
|
-
>
|
|
278
|
-
<sp-icon-send slot="icon"></sp-icon-send>
|
|
279
|
-
</sp-action-button>
|
|
280
|
-
`
|
|
281
|
-
}
|
|
282
|
-
</div>
|
|
283
|
-
${
|
|
284
|
-
/* Said once, quietly, under the picker that caused it. A chat-only model still answers,
|
|
285
|
-
so this is not a gate — but the agent loop it silently disables is the whole reason
|
|
286
|
-
the panel exists, and nothing else on screen would have mentioned it. */
|
|
287
|
-
modelPicker.selectedLacksTools()
|
|
288
|
-
? html`<div class="ai-composer-note">
|
|
289
|
-
This model can't use editing tools — the assistant will answer but not edit.
|
|
290
|
-
</div>`
|
|
291
|
-
: nothing
|
|
292
|
-
}
|
|
293
|
-
</div>
|
|
294
|
-
`;
|
|
275
|
+
/* Said once, quietly, under the picker that caused it. A chat-only model still answers, so this
|
|
276
|
+
is not a gate — but the agent loop it silently disables is the whole reason the panel exists,
|
|
277
|
+
and nothing else on screen would have mentioned it. */
|
|
278
|
+
const note = modelPicker.selectedLacksTools()
|
|
279
|
+
? "This model can't use editing tools — the assistant will answer but not edit."
|
|
280
|
+
: "";
|
|
281
|
+
return {
|
|
282
|
+
awaiting,
|
|
283
|
+
composerChips: chips.map((c) => ({ hint: c.detail, key: c.kind, label: c.label })),
|
|
284
|
+
draft,
|
|
285
|
+
hasComposerChips: chips.length > 0,
|
|
286
|
+
note,
|
|
287
|
+
noteState: note ? "shown" : "hidden",
|
|
288
|
+
placeholder: awaiting
|
|
289
|
+
? "Answer the assistant… (Enter to reply)"
|
|
290
|
+
: "Ask the assistant… (Enter to send)",
|
|
291
|
+
sendDisabled: draft.trim().length === 0,
|
|
292
|
+
sendLabel: awaiting ? "Answer" : "Send",
|
|
293
|
+
sendState: streaming ? "stop" : "send",
|
|
294
|
+
};
|
|
295
295
|
}
|
|
296
296
|
|
|
297
|
-
return {
|
|
297
|
+
return {
|
|
298
|
+
attachSelection,
|
|
299
|
+
clear,
|
|
300
|
+
dropChip,
|
|
301
|
+
edit,
|
|
302
|
+
openAttachMenu,
|
|
303
|
+
pickerSlot: (host: HTMLElement) => {
|
|
304
|
+
pickerHost = host;
|
|
305
|
+
refreshPicker();
|
|
306
|
+
},
|
|
307
|
+
send,
|
|
308
|
+
view,
|
|
309
|
+
};
|
|
298
310
|
}
|
|
@@ -1,24 +1,21 @@
|
|
|
1
|
-
/// <reference lib="dom" />
|
|
2
1
|
/**
|
|
3
|
-
* Sessions-view.
|
|
2
|
+
* Sessions-view.ts — the chat history pane's projection.
|
|
4
3
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* ai-panel / document-assistant;
|
|
8
|
-
*
|
|
4
|
+
* Turns the stored session metadata into the rows the assistant surface draws: a title, and one
|
|
5
|
+
* sentence saying when the chat was last touched and how big it is. State and storage live in
|
|
6
|
+
* ai-panel / document-assistant; what a row DOES — open, delete — is a pair of actions the panel
|
|
7
|
+
* hands the surface, because each addresses one session.
|
|
9
8
|
*
|
|
10
|
-
* New Chat is
|
|
11
|
-
* header runs
|
|
12
|
-
* second definition site is exactly how they would come to disagree about its name,
|
|
13
|
-
* chord, or when it is offered.
|
|
9
|
+
* New Chat is not here at all, and that is the point: it is `assistant.newChat`, the same record
|
|
10
|
+
* the chat header runs, projected once by `panels/ai-panel.ts`. The two headers draw the same
|
|
11
|
+
* button, so a second definition site is exactly how they would come to disagree about its name,
|
|
12
|
+
* its chord, or when it is offered.
|
|
14
13
|
*
|
|
15
14
|
* @license MIT
|
|
16
15
|
*/
|
|
17
16
|
|
|
18
|
-
import { html } from "lit-html";
|
|
19
17
|
import { now } from "../../services/clock";
|
|
20
|
-
import {
|
|
21
|
-
import type { TemplateResult } from "lit-html";
|
|
18
|
+
import type { ChatSessionView } from "../../surfaces/ai-chat";
|
|
22
19
|
import type { SessionMeta } from "../../services/ai-session-store";
|
|
23
20
|
|
|
24
21
|
const MINUTE = 60_000;
|
|
@@ -53,55 +50,27 @@ export function relativeTime(ts: number, at: number = now()): string {
|
|
|
53
50
|
return new Date(ts).toLocaleDateString();
|
|
54
51
|
}
|
|
55
52
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
function
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
${s.messageCount === 1 ? "message" : "messages"}
|
|
70
|
-
</div>
|
|
71
|
-
</div>
|
|
72
|
-
<sp-action-button
|
|
73
|
-
quiet
|
|
74
|
-
size="s"
|
|
75
|
-
class="ai-session-delete"
|
|
76
|
-
title="Delete chat"
|
|
77
|
-
@click=${(e: Event) => {
|
|
78
|
-
e.stopPropagation();
|
|
79
|
-
opts.onDelete(s.id);
|
|
80
|
-
}}
|
|
81
|
-
>
|
|
82
|
-
<sp-icon-delete slot="icon"></sp-icon-delete>
|
|
83
|
-
</sp-action-button>
|
|
84
|
-
</div>
|
|
85
|
-
`;
|
|
53
|
+
/**
|
|
54
|
+
* One stored session, as the surface reads it.
|
|
55
|
+
*
|
|
56
|
+
* @param {SessionMeta} session
|
|
57
|
+
* @returns {ChatSessionView}
|
|
58
|
+
*/
|
|
59
|
+
export function projectSession(session: SessionMeta): ChatSessionView {
|
|
60
|
+
const count = session.messageCount;
|
|
61
|
+
return {
|
|
62
|
+
key: session.id,
|
|
63
|
+
meta: `${relativeTime(session.updatedAt)} · ${count} ${count === 1 ? "message" : "messages"}`,
|
|
64
|
+
title: session.title,
|
|
65
|
+
};
|
|
86
66
|
}
|
|
87
67
|
|
|
88
|
-
/**
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
quiet: true,
|
|
97
|
-
})}
|
|
98
|
-
</div>
|
|
99
|
-
<div class="ai-sessions">
|
|
100
|
-
${
|
|
101
|
-
opts.sessions.length === 0
|
|
102
|
-
? html`<div class="ai-sessions-empty">No previous chats</div>`
|
|
103
|
-
: opts.sessions.map((s) => renderRow(s, opts))
|
|
104
|
-
}
|
|
105
|
-
</div>
|
|
106
|
-
`;
|
|
68
|
+
/**
|
|
69
|
+
* The chat history, in the order the store keeps it.
|
|
70
|
+
*
|
|
71
|
+
* @param {readonly SessionMeta[]} sessions
|
|
72
|
+
* @returns {ChatSessionView[]}
|
|
73
|
+
*/
|
|
74
|
+
export function projectSessions(sessions: readonly SessionMeta[]): ChatSessionView[] {
|
|
75
|
+
return sessions.map((session) => projectSession(session));
|
|
107
76
|
}
|