@marimo-team/islands 0.25.3-dev28 → 0.25.3-dev284
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ConnectedDataExplorerComponent-7EaP9VWb.js → ConnectedDataExplorerComponent-CErm132k.js} +116 -113
- package/dist/{ErrorBoundary-CUdSBv06.js → ErrorBoundary-DlAypzMw.js} +76 -82
- package/dist/_baseSet-BfI5FjBM.js +328 -0
- package/dist/{abnfDiagram-VCTEODGH-z_OSynK8.js → abnfDiagram-VCTEODGH-d-Qn2fwb.js} +2 -2
- package/dist/any-language-editor-6k6F12Z3.js +75 -0
- package/dist/{architectureDiagram-5GKGNRK7-Cs8J8BZr.js → architectureDiagram-5GKGNRK7-DxragHYv.js} +1 -1
- package/dist/{arrays-CN1djC4k.js → arrays-DoQ-AILx.js} +15 -27
- package/dist/assertNever-B-YzWzbL.js +507 -0
- package/dist/assets/__vite-browser-external-BKBpimif.js +1 -0
- package/dist/assets/worker-CgoMtD-_.js +113 -0
- package/dist/{blockDiagram-I7D4REHJ-Cg25UrxT.js → blockDiagram-I7D4REHJ-Dkhe6_PP.js} +1 -1
- package/dist/{button-CvjkwdSk.js → button-DZuNnIZO.js} +56 -48
- package/dist/{capabilities-CQ5IjhzL.js → capabilities-D9FskwsK.js} +2 -2
- package/dist/{chat-ui-BzjAsTFN.js → chat-ui-ByGe2rP1.js} +2100 -1810
- package/dist/{check-BMKBBrdc.js → check-XFzZeH-y.js} +1 -1
- package/dist/{chunk-IMKFNOWR-aoSFasqF.js → chunk-IMKFNOWR-C0x0feFg.js} +1 -1
- package/dist/{chunk-SHT3W25Y-CMaybO3O.js → chunk-SHT3W25Y-D0ZdASqB.js} +1 -1
- package/dist/{chunk-SVP7TREG-BNBrTAw1.js → chunk-SVP7TREG-BHjL96zx.js} +1 -1
- package/dist/{chunk-TICWLB2K-DXNxvUJn.js → chunk-TICWLB2K-CzcrwGfp.js} +1 -1
- package/dist/{classDiagram-ZZMXUADV-DXdCCDOg.js → classDiagram-ZZMXUADV-BTqFAZTP.js} +2 -2
- package/dist/{classDiagram-v2-VYDZK3BY-DyZqrtLP.js → classDiagram-v2-VYDZK3BY-EPXb0Elt.js} +2 -2
- package/dist/{code-visibility-BuxqA3v5.js → code-visibility-kxOpbw86.js} +43 -50
- package/dist/{common-xtZHxsM2.js → common-58GnHt6Y.js} +10605 -10045
- package/dist/config-C8MFHQ2E.js +637 -0
- package/dist/{copy-icon-BgUO8jsi.js → copy-icon-CtllOdmg.js} +3 -3
- package/dist/createReducer-DRqwmaTc.js +67 -0
- package/dist/{cynefinDiagram-5FMLGOSQ-DWHuKJs8.js → cynefinDiagram-5FMLGOSQ-CBSD344q.js} +1 -1
- package/dist/{dagre-GXQ25YYZ-DYLu-OCU.js → dagre-GXQ25YYZ-JItjh3Ge.js} +3 -3
- package/dist/{dagre-BGSfXNEb.js → dagre-mqiMAsFY.js} +531 -680
- package/dist/{data-grid-overlay-editor-qnbf5J94.js → data-grid-overlay-editor-CeO8C9Le.js} +1 -1
- package/dist/{debounce-C3jyATpc.js → debounce-DrhhziJv.js} +2 -2
- package/dist/{diagram-S7CK7UJ4-PwwcUOHP.js → diagram-S7CK7UJ4-CTD9xTVb.js} +1 -1
- package/dist/{diagram-UQ7AKVKN-CvJbL_IM.js → diagram-UQ7AKVKN-DTfnFai8.js} +1 -1
- package/dist/{diagram-VX7I27RA-B5RkqnzN.js → diagram-VX7I27RA-BcSnucV-.js} +1 -1
- package/dist/{diagram-Z3DM3KII-CyijwTR2.js → diagram-Z3DM3KII-C2ATIE8A.js} +1 -1
- package/dist/{dialog-Cc479ZEH.js → dialog-CaYm5imE.js} +32 -32
- package/dist/{dist-Bvs24R_E.js → dist-11T5wq3_.js} +31 -30
- package/dist/{dist-F8Ep36rk.js → dist-17ugwGZc.js} +59 -58
- package/dist/{dist-BMQf5zIS.js → dist-7cRjf--y.js} +123 -122
- package/dist/{dist-diIx5qJW.js → dist-B8pkfkzc.js} +31 -30
- package/dist/{dist-CN_BeG2I.js → dist-B9UoM_wq.js} +58 -57
- package/dist/{dist-CLdpGQVr.js → dist-BGuMTs1i.js} +118 -117
- package/dist/{dist-BK4Oj99o.js → dist-BHW11fni.js} +18 -17
- package/dist/dist-BLY4m1Wi.js +850 -0
- package/dist/{dist-PXYI_yuP.js → dist-BNlcVoxs.js} +24 -23
- package/dist/{dist-D6d86eNJ.js → dist-BQYe5Bju.js} +47 -46
- package/dist/{dist-CkTTIdBe.js → dist-BX1mn8na.js} +337 -337
- package/dist/{dist-DiDibOYr.js → dist-Bh0PTKUW.js} +151 -150
- package/dist/{dist-CSJ0MDRw.js → dist-CKaXK92p.js} +56 -55
- package/dist/{dist-C8fAKSH1.js → dist-CLhwfhpJ.js} +53 -52
- package/dist/{dist-DoE4XJBC.js → dist-CYeqK4Xw.js} +9801 -10649
- package/dist/{dist-BLfKmR-l.js → dist-Cxlp3WH6.js} +16 -15
- package/dist/{dist-D-wwqlzJ.js → dist-DSJPGj42.js} +158 -157
- package/dist/{dist-BorMD-uX.js → dist-DU9ICsWZ.js} +75 -74
- package/dist/{dist-DBtSl3sf.js → dist-DWv0ALBi.js} +47 -46
- package/dist/{dist-OR1OnN-y.js → dist-DiBpWEsB.js} +31 -30
- package/dist/{dist-CrSP_H1M.js → dist-DiLFTlnl.js} +242 -242
- package/dist/{dist-CN8zI-XC.js → dist-X9CsotJl.js} +239 -239
- package/dist/{dist-CSbh1PNP.js → dist-cVDV5IuI.js} +23 -22
- package/dist/{dist-BuaRHxOc.js → dist-fRfaOoq8.js} +44 -43
- package/dist/{dist-Cg7gzw-a.js → dist-gTTI-9Px.js} +78 -77
- package/dist/{dropdown-menu-BuE2b8Yb.js → dropdown-menu-Bb0bFOIk.js} +2904 -1493
- package/dist/{ebnfDiagram-PWID7BFC-DG90ELFp.js → ebnfDiagram-PWID7BFC-B7B9JPxc.js} +2 -2
- package/dist/{erDiagram-RLTQ6QDP-FMo_SpyX.js → erDiagram-RLTQ6QDP-v6hDno1O.js} +1 -1
- package/dist/{error-banner-CFPHFw4h.js → error-banner-CHCdHVFB.js} +87 -87
- package/dist/error-entries-9U4BFHjf.js +2586 -0
- package/dist/{esm-AMFssoNp.js → esm-BDqqT86j.js} +329 -329
- package/dist/{esm-D2gTsXEV.js → esm-BgKjMvWw.js} +530 -529
- package/dist/feedback-button-CU5tLok7.js +374 -0
- package/dist/{flowDiagram-HODETNUW-DQ4JuadE.js → flowDiagram-HODETNUW-aIFlAtOy.js} +2 -2
- package/dist/{formats-Bv_5N2Ff.js → formats-PzBQMUnr.js} +6 -6
- package/dist/{glide-data-editor-DQ_cEi05.js → glide-data-editor-D-EO3BiP.js} +6630 -2846
- package/dist/{glide-utils-pisbYVjH.js → glide-utils-BSQr4d90.js} +107 -76
- package/dist/{globals-D7vITxEX.js → globals-BscgCh7D.js} +3 -3
- package/dist/{graphlib-BmY_CCV9.js → graphlib-nlwT3Wvy.js} +177 -220
- package/dist/hasIn-C20JsQ2m.js +28 -0
- package/dist/{error-entries-j85LP88u.js → html-to-image-BYh_MorV.js} +26294 -26451
- package/dist/{infoDiagram-27XIBGKW-CRSDtRrd.js → infoDiagram-27XIBGKW-D6YHLeCP.js} +1 -1
- package/dist/isArrayLikeObject-B-HXCsex.js +626 -0
- package/dist/isEmpty-CdX7MTE1.js +14 -0
- package/dist/{ishikawaDiagram-5VMMS53U-DxLEUldB.js → ishikawaDiagram-5VMMS53U-D1ZvprOX.js} +1 -1
- package/dist/{kanban-definition-UXKFOSKX-BLhvu8o4.js → kanban-definition-UXKFOSKX-Bna_3BMr.js} +1 -1
- package/dist/{loader-BPdQhmlq.js → loader-DZvtzQoD.js} +3 -3
- package/dist/main.js +10276 -8171
- package/dist/{mermaid-Bjm6C1qN.js → mermaid-A36unKXJ.js} +62 -62
- package/dist/{mindmap-definition-YA3MSWOX-g2LwxnYQ.js → mindmap-definition-YA3MSWOX-CyVCs__G.js} +1 -1
- package/dist/{now-jM8-M7IR.js → now-BKZCLE5P.js} +12 -13
- package/dist/{number-overlay-editor-DJHB-CGK.js → number-overlay-editor-Dtmaj1ET.js} +1 -1
- package/dist/{objects-CzUgoMIF.js → objects-DCmMvZtn.js} +1 -3
- package/dist/{once-BtE-wKRL.js → once-NnpX_HnX.js} +1 -1
- package/dist/{pegDiagram-XKGWAZYB-CpMAt3Qs.js → pegDiagram-XKGWAZYB-9hNBD2wZ.js} +2 -2
- package/dist/pencil-DYUlSKxZ.js +10 -0
- package/dist/pick-tCszMUbm.js +35 -0
- package/dist/{pieDiagram-E7YTZNPT-CVTthoZo.js → pieDiagram-E7YTZNPT-8tr-NYo7.js} +1 -1
- package/dist/{process-output-DGzGHArA.js → process-output-bS3MGJ3f.js} +4 -4
- package/dist/{railroadDiagram-O6MQD6OU-ao8cqqFB.js → railroadDiagram-O6MQD6OU-Dzg1dyyp.js} +2 -2
- package/dist/{react-vega-BDpbvBCb.js → react-vega-C4T9Rb_w.js} +1 -1
- package/dist/{requirementDiagram-BXWQKSXE--J8vyfm-.js → requirementDiagram-BXWQKSXE-B7sNqwGG.js} +1 -1
- package/dist/{reveal-component-BxYUpAPg.js → reveal-component-DDr66wjo.js} +1151 -1128
- package/dist/select-DsoP1qe8.js +1200 -0
- package/dist/{sequenceDiagram-WJ2MYXX4-CiQbn62x.js → sequenceDiagram-WJ2MYXX4-oP9shbaG.js} +1 -1
- package/dist/{spec-D_u2ipzF.js → spec-BZMDxAu7.js} +41 -11
- package/dist/{stateDiagram-D77RDMKH-DVEeGs5b.js → stateDiagram-D77RDMKH-CjCv4ogv.js} +4 -4
- package/dist/{stateDiagram-v2-MP3YSRHH-1OQRe6iA.js → stateDiagram-v2-MP3YSRHH-BW9X162a.js} +2 -2
- package/dist/static-state-D-Q-Ajaa.js +72 -0
- package/dist/style.css +1 -1
- package/dist/{swimlanes-42K2YHIH-CqkGoGqn.js → swimlanes-42K2YHIH-Ckfs9Wrn.js} +1 -1
- package/dist/{swimlanesDiagram-VR7AAH4N-CszjkrKo.js → swimlanesDiagram-VR7AAH4N-DpTNG9YP.js} +2 -2
- package/dist/{swiper-component-DKntyn8p.js → swiper-component-DQbK_ZWm.js} +7 -7
- package/dist/{timeline-definition-24CTP7MA-DLRUNVAx.js → timeline-definition-24CTP7MA-BXaBlV6U.js} +1 -1
- package/dist/toast-BhjIy3Tq.js +491 -0
- package/dist/{tooltip-CtBZ5q8p.js → tooltip-DMMiOn2f.js} +321 -297
- package/dist/use-restore-focus-CosX7-gx.js +7568 -0
- package/dist/{useAsyncData-BneN349z.js → useAsyncData-Ci4AvJff.js} +18 -17
- package/dist/{useDateFormatter-DkajGwwd.js → useDateFormatter-CPlava52.js} +2 -2
- package/dist/{useDeepCompareMemoize-Z_7R8wTt.js → useDeepCompareMemoize-NaaWoFlX.js} +1 -1
- package/dist/useEvent-BRH-aCqi.js +19 -0
- package/dist/{useIframeCapabilities-DBETvvPl.js → useIframeCapabilities-BXhDDoCG.js} +1 -1
- package/dist/useLifecycle-SniivYmC.js +112 -0
- package/dist/{vega-component-DPd52jvr.js → vega-component-DIxaDQNs.js} +161 -160
- package/dist/{vega-embed-container-BgKnsDbB.js → vega-embed-container--LYZqguO.js} +2 -2
- package/dist/{vega-loader.browser-CpbZAXub.js → vega-loader.browser-B9Pz0EGP.js} +1 -1
- package/dist/{vennDiagram-4TSXK5OY-CypgoBVZ.js → vennDiagram-4TSXK5OY-C-hQ4iNJ.js} +1 -1
- package/dist/{wardleyDiagram-VM6X3IG4-B6xjiQ_g.js → wardleyDiagram-VM6X3IG4-C2MQ_Umv.js} +1 -1
- package/dist/{xychartDiagram-S5SC5T6Z-e0PefDVs.js → xychartDiagram-S5SC5T6Z-BtTTBn7Q.js} +1 -1
- package/package.json +16 -20
- package/src/__mocks__/document.tsx +63 -0
- package/src/__mocks__/executions.ts +197 -0
- package/src/__mocks__/notebook.ts +3 -7
- package/src/__mocks__/partial.ts +26 -0
- package/src/__mocks__/requests.ts +1 -4
- package/src/__tests__/CellStatus.test.tsx +25 -26
- package/src/__tests__/fixtures/pair-config.ts +1 -1
- package/src/__tests__/main.test.tsx +24 -1
- package/src/__tests__/module-entry.test.ts +44 -0
- package/src/__tests__/mount.test.ts +1 -21
- package/src/__tests__/{host-imports.test.ts → replica-imports.test.ts} +12 -11
- package/src/components/ai/__tests__/ai-model-dropdown.test.tsx +63 -0
- package/src/components/ai/ai-model-dropdown.tsx +11 -6
- package/src/components/app-config/__tests__/state.test.tsx +50 -0
- package/src/components/app-config/ai-config.tsx +156 -150
- package/src/components/app-config/app-config-button.tsx +6 -5
- package/src/components/app-config/app-config-form.tsx +5 -9
- package/src/components/app-config/common.tsx +7 -9
- package/src/components/app-config/data-form.tsx +112 -113
- package/src/components/app-config/mcp-config.tsx +30 -53
- package/src/components/app-config/user-config-form.css +91 -0
- package/src/components/app-config/user-config-form.tsx +266 -349
- package/src/components/chat/__tests__/capabilities-popover.test.tsx +0 -1
- package/src/components/chat/__tests__/chat-display.test.tsx +196 -0
- package/src/components/chat/__tests__/chat-markdown.test.tsx +43 -0
- package/src/components/chat/__tests__/chat-utils.test.ts +93 -1
- package/src/components/chat/__tests__/message-queue.test.tsx +17 -0
- package/src/components/chat/__tests__/notebook-access-selector.test.tsx +64 -0
- package/src/components/chat/__tests__/turn-timing.test.ts +84 -0
- package/src/components/chat/__tests__/use-assistant-turn.test.ts +95 -0
- package/src/components/chat/__tests__/user-message.test.tsx +27 -0
- package/src/components/chat/acp/__tests__/agent-panel-initialization.test.tsx +1 -1
- package/src/components/chat/acp/__tests__/agent-panel.test.tsx +22 -17
- package/src/components/chat/acp/__tests__/session-tabs.test.tsx +43 -0
- package/src/components/chat/acp/__tests__/state.test.ts +2 -2
- package/src/components/chat/acp/agent-panel.tsx +6 -3
- package/src/components/chat/acp/blocks.tsx +13 -12
- package/src/components/chat/acp/common.tsx +4 -5
- package/src/components/chat/acp/model-selector.tsx +1 -1
- package/src/components/chat/acp/session-tabs.tsx +8 -3
- package/src/components/chat/agent-activity.tsx +132 -0
- package/src/components/chat/capabilities-popover.tsx +2 -11
- package/src/components/chat/chat-components.tsx +9 -4
- package/src/components/chat/chat-display.tsx +131 -57
- package/src/components/chat/chat-history-popover.tsx +6 -1
- package/src/components/chat/chat-markdown.tsx +15 -0
- package/src/components/chat/chat-panel.tsx +216 -294
- package/src/components/chat/chat-typography.css +108 -0
- package/src/components/chat/chat-utils.ts +24 -35
- package/src/components/chat/notebook-access-selector.stories.tsx +22 -0
- package/src/components/chat/notebook-access-selector.tsx +100 -0
- package/src/components/chat/tool-call/__tests__/tool-labels.test.ts +76 -0
- package/src/components/chat/tool-call/__tests__/tool-step.test.tsx +57 -0
- package/src/components/chat/tool-call/shared.ts +6 -0
- package/src/components/chat/tool-call/tool-call-view.tsx +22 -76
- package/src/components/chat/tool-call/tool-labels.ts +172 -0
- package/src/components/chat/tool-call/tool-result.tsx +1 -1
- package/src/components/chat/tool-call/tool-step.tsx +145 -0
- package/src/components/chat/turn-timing.ts +73 -0
- package/src/components/chat/use-assistant-turn.ts +65 -0
- package/src/components/chat/use-chat-generation.ts +20 -0
- package/src/components/chat/user-message.tsx +145 -0
- package/src/components/data-table/TableBottomBar.tsx +4 -1
- package/src/components/data-table/TableTopBar.tsx +2 -0
- package/src/components/data-table/__tests__/chart-spec-model.test.ts +195 -195
- package/src/components/data-table/__tests__/column-explorer.test.tsx +27 -1
- package/src/components/data-table/__tests__/columns.test.tsx +105 -0
- package/src/components/data-table/__tests__/context-menu-interaction.test.tsx +130 -0
- package/src/components/data-table/__tests__/data-table.test.tsx +1 -0
- package/src/components/data-table/__tests__/date-popover.test.tsx +72 -0
- package/src/components/data-table/__tests__/export-actions.test.tsx +105 -0
- package/src/components/data-table/__tests__/keyboard-selection.test.tsx +188 -0
- package/src/components/data-table/__tests__/pagination.test.tsx +28 -1
- package/src/components/data-table/__tests__/search-highlight.test.tsx +109 -0
- package/src/components/data-table/__tests__/url-detector.test.tsx +74 -0
- package/src/components/data-table/cell-selection/feature.ts +2 -2
- package/src/components/data-table/cell-selection/types.ts +2 -2
- package/src/components/data-table/charts/__tests__/chart-panel.test.tsx +74 -1
- package/src/components/data-table/charts/__tests__/spec-snapshot.test.ts +20 -20
- package/src/components/data-table/charts/__tests__/spec.test.ts +78 -52
- package/src/components/data-table/charts/__tests__/storage.test.ts +4 -1
- package/src/components/data-table/charts/chart-spec/spec.ts +68 -43
- package/src/components/data-table/charts/charts.tsx +40 -30
- package/src/components/data-table/charts/storage.ts +16 -5
- package/src/components/data-table/column-explorer-panel/column-explorer.tsx +1 -1
- package/src/components/data-table/column-formatting/types.ts +1 -2
- package/src/components/data-table/column-summary/chart-spec-model.tsx +23 -16
- package/src/components/data-table/column-summary/column-summary.tsx +2 -4
- package/src/components/data-table/column-visibility-dropdown.tsx +8 -13
- package/src/components/data-table/columns.tsx +45 -46
- package/src/components/data-table/context-menu.tsx +36 -20
- package/src/components/data-table/data-table.tsx +17 -1
- package/src/components/data-table/date-popover.tsx +6 -4
- package/src/components/data-table/export-actions.tsx +76 -48
- package/src/components/data-table/pagination.tsx +44 -33
- package/src/components/data-table/range-focus/atoms.ts +4 -6
- package/src/components/data-table/range-focus/use-cell-range-selection.ts +65 -38
- package/src/components/data-table/range-focus/use-scroll-into-view.ts +21 -2
- package/src/components/data-table/renderers.tsx +16 -7
- package/src/components/data-table/row-viewer-panel/__tests__/row-viewer.test.tsx +24 -1
- package/src/components/data-table/row-viewer-panel/row-viewer.tsx +4 -4
- package/src/components/data-table/search-highlight.tsx +79 -0
- package/src/components/data-table/types.ts +1 -0
- package/src/components/data-table/url-detector.tsx +49 -9
- package/src/components/datasources/__tests__/column-actions.test.tsx +97 -0
- package/src/components/datasources/__tests__/column-preview.test.tsx +96 -5
- package/src/components/datasources/__tests__/datasources-interactions.test.tsx +181 -0
- package/src/components/datasources/__tests__/table-list.test.tsx +118 -0
- package/src/components/datasources/__tests__/utils.test.ts +57 -6
- package/src/components/datasources/column-preview.tsx +17 -12
- package/src/components/datasources/datasources.tsx +56 -43
- package/src/components/datasources/utils.ts +32 -23
- package/src/components/debugger/debugger-code.tsx +5 -0
- package/src/components/dependency-graph/custom-node.tsx +1 -1
- package/src/components/dependency-graph/dependency-graph-tree.tsx +8 -8
- package/src/components/dependency-graph/elements.ts +24 -21
- package/src/components/dependency-graph/minimap-content.tsx +15 -20
- package/src/components/dependency-graph/panels.tsx +4 -2
- package/src/components/dependency-graph/utils/__tests__/layout.test.ts +18 -11
- package/src/components/editor/SortableCell.tsx +1 -3
- package/src/components/editor/__tests__/Output.test.tsx +50 -32
- package/src/{core/attachments/__tests__/toast.test.tsx → components/editor/__tests__/agent-toast.test.tsx} +1 -1
- package/src/components/editor/__tests__/data-attributes.test.tsx +28 -23
- package/src/components/editor/__tests__/dynamic-favicon.test.tsx +111 -18
- package/src/components/editor/__tests__/output-persistence.test.tsx +28 -9
- package/src/components/editor/__tests__/package-alert.test.tsx +22 -1
- package/src/components/editor/actions/__tests__/name-cell-input.test.tsx +69 -0
- package/src/components/editor/actions/__tests__/pair-with-agent-commands.test.ts +21 -40
- package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +41 -14
- package/src/components/editor/actions/__tests__/pair-with-agent.test.tsx +6 -24
- package/src/components/editor/actions/__tests__/useCellActionButton.test.tsx +131 -0
- package/src/components/editor/actions/name-cell-input.tsx +4 -3
- package/src/components/editor/actions/pair-with-agent-commands.ts +10 -7
- package/src/components/editor/actions/pair-with-agent-modal.tsx +29 -30
- package/src/components/editor/actions/pair-with-agent.tsx +16 -39
- package/src/components/editor/actions/useCellActionButton.tsx +47 -35
- package/src/components/editor/actions/useConfigActions.tsx +3 -4
- package/src/components/editor/actions/useNotebookActions.tsx +25 -29
- package/src/components/editor/actions/useRestartKernel.tsx +1 -1
- package/src/components/editor/actions/useSetCodeVisibility.ts +11 -12
- package/src/components/editor/actions/useSetOutputsExpanded.ts +14 -19
- package/src/components/editor/ai/ai-completion-editor.tsx +2 -1
- package/src/components/editor/ai/completion-handlers.tsx +0 -37
- package/src/components/editor/ai/prompt-input.tsx +189 -0
- package/src/components/editor/alerts/__tests__/connection-notice.test.tsx +1 -1
- package/src/components/editor/alerts/connection-notice.tsx +1 -1
- package/src/components/editor/alerts/startup-logs-alert.tsx +1 -0
- package/src/components/editor/alerts/stdin-blocking-alert.tsx +4 -2
- package/src/components/editor/app-container.tsx +1 -1
- package/src/components/editor/boundary/__tests__/ErrorBoundary.test.tsx +1 -1
- package/src/components/editor/cell/CellStatus.tsx +28 -23
- package/src/components/editor/cell/CreateCellButton.tsx +15 -21
- package/src/components/editor/cell/DeleteButton.tsx +3 -2
- package/src/components/editor/cell/RunButton.tsx +18 -8
- package/src/components/editor/cell/StagedAICell.tsx +52 -137
- package/src/components/editor/cell/StopButton.tsx +2 -2
- package/src/components/editor/cell/__tests__/useRunCells.test.tsx +169 -0
- package/src/components/editor/cell/__tests__/useShouldShowInterrupt.test.ts +39 -0
- package/src/components/editor/cell/cell-actions.tsx +12 -1
- package/src/components/editor/cell/cell-context-menu.tsx +4 -1
- package/src/components/editor/cell/code/__tests__/language-toggle.test.tsx +54 -0
- package/src/components/editor/cell/code/cell-editor.tsx +65 -169
- package/src/components/editor/cell/code/language-toggle.tsx +8 -7
- package/src/components/editor/cell/collapse.tsx +16 -6
- package/src/components/editor/cell/useAddCell.ts +4 -8
- package/src/components/editor/cell/useDeleteCell.tsx +10 -36
- package/src/components/editor/cell/useRunCells.ts +49 -8
- package/src/components/editor/cell/useShouldShowInterrupt.ts +2 -12
- package/src/components/editor/cell/useSplitCell.tsx +10 -6
- package/src/components/editor/chrome/components/__tests__/feedback-button.test.tsx +1 -1
- package/src/components/editor/chrome/components/feedback-button.tsx +2 -8
- package/src/components/editor/chrome/panels/__tests__/packages-panel.test.tsx +31 -2
- package/src/components/editor/chrome/panels/__tests__/runtime-details.test.tsx +1 -1
- package/src/components/editor/chrome/panels/__tests__/sandbox-recovery.test.tsx +1 -1
- package/src/components/editor/chrome/panels/cache-panel.tsx +1 -0
- package/src/components/editor/chrome/panels/dependency-graph-panel.tsx +1 -1
- package/src/components/editor/chrome/panels/logs-panel.tsx +2 -1
- package/src/components/editor/chrome/panels/outline/__tests__/outline-keyboard.test.tsx +84 -0
- package/src/components/editor/chrome/panels/outline/floating-outline.tsx +39 -14
- package/src/components/editor/chrome/panels/outline/useActiveOutline.tsx +3 -2
- package/src/components/editor/chrome/panels/packages-panel.tsx +4 -7
- package/src/components/editor/chrome/panels/panel-header.tsx +13 -0
- package/src/components/editor/chrome/panels/secrets-panel.tsx +1 -0
- package/src/components/editor/chrome/panels/session-panel.tsx +1 -1
- package/src/components/editor/chrome/panels/snippets-panel.tsx +10 -12
- package/src/components/editor/chrome/panels/variable-panel.tsx +1 -5
- package/src/components/editor/chrome/types.ts +1 -1
- package/src/components/editor/chrome/wrapper/__tests__/attachment-status.test.tsx +7 -9
- package/src/components/editor/chrome/wrapper/__tests__/document-sync-status.test.tsx +92 -0
- package/src/components/editor/chrome/wrapper/__tests__/pending-ai-cells.test.tsx +265 -37
- package/src/components/editor/chrome/wrapper/__tests__/useAskAiAboutCell.test.tsx +58 -0
- package/src/components/editor/chrome/wrapper/app-chrome.tsx +91 -74
- package/src/components/editor/chrome/wrapper/footer-items/attachment-status.tsx +4 -4
- package/src/components/editor/chrome/wrapper/footer-items/backend-status.tsx +1 -1
- package/src/components/editor/chrome/wrapper/footer-items/document-sync-status.tsx +54 -0
- package/src/components/editor/chrome/wrapper/footer-items/lsp-status.tsx +1 -1
- package/src/components/editor/chrome/wrapper/footer-items/machine-stats.tsx +1 -1
- package/src/components/editor/chrome/wrapper/footer-items/runtime-settings.tsx +1 -7
- package/src/components/editor/chrome/wrapper/footer.tsx +2 -2
- package/src/components/editor/chrome/wrapper/minimap-state.ts +1 -1
- package/src/components/editor/chrome/wrapper/pending-ai-cells.tsx +143 -72
- package/src/components/editor/chrome/wrapper/pending-ai-changes-badge.tsx +25 -0
- package/src/components/editor/chrome/wrapper/sidebar.tsx +8 -4
- package/src/components/editor/chrome/wrapper/storage.ts +1 -1
- package/src/components/editor/chrome/wrapper/useAskAiAboutCell.ts +36 -0
- package/src/components/editor/columns/__tests__/cell-column.test.tsx +1 -1
- package/src/components/editor/columns/cell-column.tsx +1 -1
- package/src/components/editor/columns/sortable-column.tsx +2 -2
- package/src/components/editor/connections/components.tsx +5 -10
- package/src/components/editor/controls/Controls.tsx +4 -4
- package/src/components/editor/controls/__tests__/command-palette.test.tsx +53 -0
- package/src/components/editor/controls/__tests__/keyboard-shortcuts.test.tsx +61 -0
- package/src/components/editor/controls/__tests__/notebook-menu-dropdown.test.tsx +10 -4
- package/src/components/editor/controls/command-palette.tsx +22 -10
- package/src/components/editor/controls/keyboard-shortcuts.tsx +14 -5
- package/src/components/editor/documentation.css +34 -11
- package/src/components/editor/dynamic-favicon.tsx +21 -40
- package/src/components/editor/errors/__tests__/send-error-report-button.test.tsx +26 -22
- package/src/components/editor/errors/auto-fix.tsx +4 -8
- package/src/components/editor/errors/send-error-report-button.tsx +3 -6
- package/src/components/editor/file-tree/__tests__/file-explorer-interactions.test.tsx +6 -0
- package/src/components/editor/file-tree/__tests__/file-explorer-navigation.test.tsx +47 -0
- package/src/components/editor/file-tree/__tests__/use-file-search.test.tsx +91 -0
- package/src/components/editor/file-tree/file-explorer.tsx +48 -15
- package/src/components/editor/file-tree/file-name-input.tsx +1 -0
- package/src/components/editor/file-tree/file-viewer.tsx +4 -2
- package/src/components/editor/file-tree/use-file-search.ts +35 -21
- package/src/components/editor/header/__tests__/filename-form.test.tsx +1 -4
- package/src/components/editor/header/__tests__/status.test.tsx +5 -3
- package/src/components/editor/header/app-header.tsx +1 -1
- package/src/components/editor/header/filename-form.tsx +1 -1
- package/src/components/editor/header/status.tsx +44 -22
- package/src/components/editor/links/__tests__/cell-link.test.tsx +148 -0
- package/src/components/editor/links/cell-link-list.tsx +1 -1
- package/src/components/editor/links/cell-link.tsx +21 -11
- package/src/components/editor/navigation/__tests__/clipboard.test.ts +60 -38
- package/src/components/editor/navigation/__tests__/navigation.test.ts +108 -85
- package/src/components/editor/navigation/__tests__/selection.test.ts +43 -21
- package/src/components/editor/navigation/clipboard.ts +17 -14
- package/src/components/editor/navigation/focus-utils.ts +23 -4
- package/src/components/editor/navigation/multi-cell-action-toolbar.tsx +17 -33
- package/src/components/editor/navigation/navigation.ts +74 -72
- package/src/components/editor/navigation/selection.ts +30 -29
- package/src/components/editor/notebook-banner.tsx +1 -0
- package/src/components/editor/notebook-cell.tsx +126 -152
- package/src/components/editor/output/MarimoErrorOutput.tsx +2 -1
- package/src/components/editor/output/MarimoTracebackOutput.tsx +19 -17
- package/src/components/editor/output/Outputs.css +8 -0
- package/src/components/editor/output/VideoOutput.tsx +6 -0
- package/src/components/editor/output/__tests__/VideoOutput.test.tsx +131 -0
- package/src/components/editor/output/__tests__/traceback.test.tsx +27 -1
- package/src/components/editor/output/ansi-reduce.ts +33 -20
- package/src/components/editor/output/console/ConsoleOutput.tsx +19 -25
- package/src/components/editor/output/console/__tests__/ConsoleOutput.test.tsx +125 -69
- package/src/components/editor/package-alert.tsx +14 -7
- package/src/components/editor/renderers/__tests__/add-cell-buttons.test.tsx +18 -0
- package/src/components/editor/renderers/cell-array.tsx +32 -100
- package/src/components/editor/renderers/grid-layout/__tests__/grid-layout.test.tsx +75 -0
- package/src/components/editor/renderers/grid-layout/grid-layout.tsx +28 -22
- package/src/components/editor/renderers/slides-layout/__tests__/plugin.test.ts +0 -4
- package/src/components/editor/renderers/slides-layout/slides-layout.tsx +1 -1
- package/src/components/editor/renderers/vertical-layout/__tests__/useFocusFirstEditor.test.ts +4 -4
- package/src/components/editor/renderers/vertical-layout/sidebar/toggle.tsx +7 -1
- package/src/components/editor/renderers/vertical-layout/useFocusFirstEditor.ts +1 -1
- package/src/components/editor/renderers/vertical-layout/vertical-layout.tsx +19 -37
- package/src/components/editor/stdin-blocking-alert.tsx +4 -2
- package/src/components/home/components.tsx +17 -31
- package/src/components/icons/__tests__/large-spinner.test.tsx +39 -0
- package/src/components/icons/large-spinner.tsx +3 -14
- package/src/components/icons/spinner.tsx +1 -1
- package/src/components/markdown/markdown-renderer.tsx +39 -28
- package/src/components/mcp/mcp-status-indicator.tsx +18 -14
- package/src/components/pages/__tests__/home-page.test.tsx +116 -0
- package/src/components/pages/edit-page.tsx +19 -17
- package/src/components/pages/home-page.tsx +164 -91
- package/src/components/scratchpad/scratchpad.test.tsx +89 -0
- package/src/components/scratchpad/scratchpad.tsx +47 -33
- package/src/components/scratchpad/state.ts +7 -0
- package/src/components/slides/__tests__/minimap-actions.test.tsx +22 -29
- package/src/components/slides/__tests__/minimap.test.ts +38 -19
- package/src/components/slides/__tests__/slide-scroll-hint.test.tsx +37 -0
- package/src/components/slides/minimap.tsx +22 -14
- package/src/components/slides/reveal-component.tsx +73 -36
- package/src/components/slides/reveal-slides.css +5 -4
- package/src/components/slides/slide-cell-view.tsx +37 -34
- package/src/components/slides/slide-form.tsx +1 -0
- package/src/components/slides/slide-scroll-hint.tsx +3 -1
- package/src/components/slides/slide.tsx +3 -4
- package/src/components/sort/SortableCellsProvider.tsx +8 -25
- package/src/components/tracing/tracing-keyboard.test.tsx +85 -0
- package/src/components/tracing/tracing.tsx +46 -42
- package/src/components/ui/__tests__/draggable-popover.test.tsx +24 -0
- package/src/components/ui/__tests__/fullscreen.test.tsx +44 -2
- package/src/components/ui/__tests__/range-slider.test.tsx +165 -0
- package/src/components/ui/alert-dialog.tsx +1 -1
- package/src/components/ui/draggable-popover.tsx +24 -2
- package/src/components/ui/fullscreen.tsx +25 -1
- package/src/components/ui/range-slider.tsx +22 -9
- package/src/components/ui/toast.tsx +1 -1
- package/src/core/MarimoApp.tsx +3 -1
- package/src/core/ai/__tests__/staged-cells.test.ts +89 -608
- package/src/core/ai/context/context.ts +2 -0
- package/src/core/ai/context/providers/__tests__/cell-output.test.ts +8 -12
- package/src/core/ai/context/providers/__tests__/cell.test.ts +49 -0
- package/src/core/ai/context/providers/cell-output.ts +2 -2
- package/src/core/ai/context/providers/cell.ts +54 -0
- package/src/core/ai/context/providers/datasource.ts +6 -2
- package/src/core/ai/staged-cells.ts +56 -323
- package/src/core/ai/state.ts +3 -0
- package/src/core/ai/tools/__tests__/edit-notebook-tool.test.ts +40 -88
- package/src/core/ai/tools/__tests__/registry.test.ts +17 -0
- package/src/core/ai/tools/base.ts +18 -15
- package/src/core/ai/tools/edit-notebook-tool.ts +86 -80
- package/src/core/ai/tools/registry.ts +13 -10
- package/src/core/ai/tools/sample-tool.ts +6 -7
- package/src/core/cells/__tests__/__snapshots__/cells.test.ts.snap +4 -527
- package/src/core/cells/__tests__/actions.test.ts +623 -35
- package/src/core/cells/__tests__/add-missing-import.test.ts +7 -8
- package/src/core/cells/__tests__/arrange.test.ts +432 -0
- package/src/core/cells/__tests__/cell.test.ts +148 -150
- package/src/core/cells/__tests__/cells.test.ts +390 -2925
- package/src/core/cells/__tests__/collapseConsoleOutputs.test.ts +54 -0
- package/src/core/cells/__tests__/document.test.ts +158 -0
- package/src/core/cells/__tests__/editor.test.ts +57 -0
- package/src/core/cells/__tests__/flush-document.test.ts +40 -0
- package/src/core/cells/__tests__/harness.ts +106 -0
- package/src/core/cells/__tests__/layout.test.ts +176 -0
- package/src/core/cells/__tests__/logs.test.ts +0 -13
- package/src/core/cells/__tests__/notebook-outline.test.ts +122 -0
- package/src/core/cells/__tests__/outputs.test.tsx +71 -53
- package/src/core/cells/__tests__/pending-delete-service.test.tsx +11 -20
- package/src/core/cells/__tests__/session.test.ts +445 -211
- package/src/core/cells/__tests__/utils.test.ts +135 -337
- package/src/core/cells/actions.ts +677 -6
- package/src/core/cells/add-missing-import.ts +47 -43
- package/src/core/cells/arrange.ts +529 -0
- package/src/core/cells/cell.ts +78 -146
- package/src/core/cells/cells.ts +116 -1457
- package/src/core/cells/columns.ts +38 -0
- package/src/core/cells/document.ts +167 -0
- package/src/core/cells/edit.ts +30 -0
- package/src/core/cells/editor.ts +82 -0
- package/src/core/cells/focus.ts +27 -6
- package/src/core/cells/layout.ts +221 -0
- package/src/core/cells/outputs.ts +12 -28
- package/src/core/cells/pending-delete-service.ts +8 -14
- package/src/core/cells/scrollCellIntoView.ts +6 -0
- package/src/core/cells/session.ts +76 -53
- package/src/core/cells/types.ts +21 -51
- package/src/core/cells/utils.ts +85 -87
- package/src/core/codemirror/__tests__/format.test.ts +0 -34
- package/src/core/codemirror/__tests__/setup.test.ts +61 -29
- package/src/core/codemirror/ai/__tests__/resources.test.ts +117 -0
- package/src/core/codemirror/ai/resources.ts +1 -1
- package/src/core/codemirror/cells/__tests__/extensions.test.ts +2 -6
- package/src/core/codemirror/cells/extensions.ts +18 -30
- package/src/core/codemirror/cells/state.ts +2 -6
- package/src/core/codemirror/cm.ts +5 -1
- package/src/core/codemirror/config/types.ts +1 -1
- package/src/core/codemirror/copilot/__tests__/getCodes.test.ts +6 -7
- package/src/core/codemirror/copilot/getCodes.ts +2 -2
- package/src/core/codemirror/format.ts +6 -23
- package/src/core/codemirror/keymaps/vim.ts +4 -8
- package/src/core/codemirror/language/__tests__/sql.test.ts +22 -20
- package/src/core/codemirror/language/__tests__/utils.test.ts +187 -15
- package/src/core/codemirror/language/cell-code.ts +114 -0
- package/src/core/codemirror/language/extension.ts +52 -35
- package/src/core/codemirror/language/languages/markdown.ts +8 -6
- package/src/core/codemirror/language/languages/python.ts +19 -13
- package/src/core/codemirror/language/languages/sql/sql.ts +16 -24
- package/src/core/codemirror/language/panel/panel.tsx +1 -0
- package/src/core/codemirror/language/types.ts +7 -7
- package/src/core/codemirror/language/utils.ts +9 -39
- package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +1 -2
- package/src/core/codemirror/lsp/notebook-lsp.ts +6 -5
- package/src/core/codemirror/lsp/utils.ts +1 -1
- package/src/core/codemirror/misc/__tests__/paste.test.ts +3 -1
- package/src/core/codemirror/misc/paste.ts +1 -1
- package/src/core/codemirror/placeholder/__tests__/extensions.test.ts +75 -0
- package/src/core/codemirror/placeholder/extensions.ts +80 -19
- package/src/core/codemirror/readonly/__tests__/extension.test.ts +1 -1
- package/src/core/codemirror/readonly/extension.ts +2 -2
- package/src/core/codemirror/utils.ts +1 -0
- package/src/core/config/__tests__/app-config.test.ts +64 -0
- package/src/core/config/__tests__/config-schema.test.ts +56 -6
- package/src/core/config/config-schema.ts +17 -4
- package/src/core/config/config.ts +65 -20
- package/src/core/config/feature-flag.tsx +0 -2
- package/src/core/datasets/__tests__/data-source-discovery.test.ts +5 -5
- package/src/core/datasets/data-source-discovery.ts +4 -6
- package/src/core/documentation/doc-lookup.ts +1 -1
- package/src/core/edit-app.tsx +22 -28
- package/src/core/errors/__tests__/error-entries.test.ts +40 -1
- package/src/core/errors/error-entries.ts +6 -4
- package/src/core/executions/__tests__/atoms.test.ts +98 -0
- package/src/core/executions/__tests__/freshness.test.ts +482 -0
- package/src/core/executions/__tests__/hooks.test.tsx +106 -0
- package/src/core/executions/__tests__/select.test.ts +268 -0
- package/src/core/executions/atoms.ts +228 -0
- package/src/core/executions/freshness.ts +171 -0
- package/src/core/executions/hooks.ts +47 -0
- package/src/core/executions/index.ts +33 -0
- package/src/core/executions/select.ts +175 -0
- package/src/core/export/__tests__/hooks.test.ts +0 -5
- package/src/core/export/hooks.ts +1 -1
- package/src/core/export/layout.ts +2 -2
- package/src/core/hotkeys/actions.ts +2 -4
- package/src/core/hotkeys/hotkeys.ts +2 -1
- package/src/core/islands/__tests__/bootstrap.test.ts +69 -17
- package/src/core/islands/__tests__/bridge.test.ts +85 -27
- package/src/core/islands/bootstrap.ts +49 -54
- package/src/core/islands/bridge.ts +84 -25
- package/src/core/islands/components/__tests__/IslandControls.test.tsx +7 -5
- package/src/core/islands/components/__tests__/web-components.test.tsx +63 -0
- package/src/core/islands/components/output-wrapper.tsx +5 -5
- package/src/core/islands/components/web-components.tsx +12 -1
- package/src/core/islands/worker/__tests__/controller.test.ts +62 -4
- package/src/core/islands/worker/controller.ts +4 -10
- package/src/core/islands/worker/worker.tsx +33 -33
- package/src/core/kernel/__tests__/RuntimeState.test.ts +1 -1
- package/src/core/kernel/__tests__/handlers.test.ts +7 -157
- package/src/core/kernel/handlers.ts +13 -79
- package/src/core/kernel/state.ts +0 -15
- package/src/core/lifecycle/render-policy.ts +12 -26
- package/src/core/meta/__tests__/code-visibility.test.tsx +78 -70
- package/src/core/meta/code-visibility.ts +18 -9
- package/src/core/network/__tests__/connection.test.ts +1 -1
- package/src/core/network/__tests__/requests-lazy.test.ts +6 -8
- package/src/core/network/connection-notice.ts +1 -1
- package/src/core/network/connection.ts +1 -1
- package/src/core/network/requests-lazy.ts +5 -8
- package/src/core/network/requests-network.ts +5 -31
- package/src/core/network/requests-static.ts +1 -4
- package/src/core/network/requests-toasting.tsx +1 -4
- package/src/core/network/types.ts +6 -14
- package/src/core/network/useConnectionNotice.ts +8 -2
- package/src/core/notebook/__tests__/operations.test.ts +51 -0
- package/src/core/notebook/attachments.ts +38 -0
- package/src/core/notebook/document/__tests__/codemirror.test.ts +759 -0
- package/src/core/notebook/document/__tests__/draft.test.ts +363 -0
- package/src/core/notebook/document/__tests__/fixtures.ts +92 -0
- package/src/core/notebook/document/__tests__/hooks.test.tsx +391 -0
- package/src/core/notebook/document/__tests__/lifecycle-scenarios.test.ts +61 -0
- package/src/core/notebook/document/__tests__/model.test.ts +247 -0
- package/src/core/notebook/document/__tests__/protocol-fixtures.ts +38 -0
- package/src/core/notebook/document/__tests__/recovery-scenarios.test.ts +230 -0
- package/src/core/notebook/document/__tests__/scenario-fixture.ts +43 -0
- package/src/core/notebook/document/__tests__/scenarios.test.ts +205 -0
- package/src/core/notebook/document/__tests__/state.test.ts +459 -0
- package/src/core/notebook/document/__tests__/submission.test.ts +203 -0
- package/src/core/notebook/document/__tests__/test-host.test.ts +92 -0
- package/src/core/notebook/document/__tests__/test-host.ts +247 -0
- package/src/core/notebook/document/__tests__/test-notebook.ts +149 -0
- package/src/core/notebook/document/__tests__/user.ts +61 -0
- package/src/core/notebook/document/codemirror.ts +216 -0
- package/src/core/notebook/document/draft.ts +502 -0
- package/src/core/notebook/document/hooks.tsx +118 -0
- package/src/core/notebook/document/index.ts +24 -0
- package/src/core/notebook/document/model.ts +102 -0
- package/src/core/notebook/document/select.ts +41 -0
- package/src/core/notebook/document/state.ts +378 -0
- package/src/core/notebook/document/sync.ts +369 -0
- package/src/core/notebook/index.ts +19 -0
- package/src/core/notebook/operations.ts +30 -0
- package/src/core/notebook/replica/AGENTS.md +11 -0
- package/src/core/{host → notebook/replica}/__tests__/attachments.test.ts +9 -10
- package/src/core/{host → notebook/replica}/__tests__/document.test.ts +18 -16
- package/src/core/notebook/replica/__tests__/executions.test.ts +200 -0
- package/src/core/notebook/replica/__tests__/fixtures.ts +79 -0
- package/src/core/notebook/replica/__tests__/replica.test.ts +559 -0
- package/src/core/notebook/replica/__tests__/results.test.ts +193 -0
- package/src/core/notebook/replica/__tests__/runtime.test.ts +78 -0
- package/src/core/notebook/replica/backend.ts +19 -0
- package/src/core/notebook/replica/connection.ts +42 -0
- package/src/core/notebook/replica/index.ts +20 -0
- package/src/core/notebook/replica/replica.ts +336 -0
- package/src/core/{host → notebook/replica}/resources/attachments.ts +6 -3
- package/src/core/{host → notebook/replica}/resources/document.ts +3 -3
- package/src/core/notebook/replica/resources/executions.ts +157 -0
- package/src/core/notebook/replica/resources/results.ts +48 -0
- package/src/core/notebook/replica/resources/runtime.ts +14 -0
- package/src/core/packages/__tests__/useSandboxController.test.tsx +1 -1
- package/src/core/packages/useSandboxController.ts +1 -1
- package/src/core/run-app.tsx +49 -51
- package/src/core/runtime/__tests__/adapter.test.ts +4 -4
- package/src/core/runtime/__tests__/createWsUrl.test.ts +77 -7
- package/src/core/runtime/__tests__/runtime.test.ts +32 -74
- package/src/core/runtime/adapter.ts +5 -5
- package/src/core/runtime/config.ts +2 -2
- package/src/core/runtime/runtime.ts +33 -46
- package/src/core/runtime/types.ts +0 -2
- package/src/core/saving/__tests__/document.test.tsx +123 -0
- package/src/core/saving/__tests__/state.test.ts +111 -0
- package/src/core/saving/__tests__/useAutoSave.test.tsx +67 -0
- package/src/core/saving/document.ts +33 -0
- package/src/core/saving/filename.ts +1 -1
- package/src/core/saving/save-component.tsx +39 -60
- package/src/core/saving/state.ts +38 -39
- package/src/core/saving/useAutoSave.ts +17 -53
- package/src/core/session/__tests__/backend.test.ts +236 -0
- package/src/core/session/__tests__/useNotebookReplica.hook.test.tsx +186 -0
- package/src/core/{websocket → session}/__tests__/useNotebookSession.hook.test.tsx +245 -262
- package/src/core/session/active-notebook.ts +28 -0
- package/src/core/session/backend.ts +123 -0
- package/src/core/session/embedded.ts +7 -0
- package/src/core/{websocket → session}/types.ts +2 -2
- package/src/core/session/useNotebookReplica.ts +74 -0
- package/src/core/{websocket → session}/useNotebookSession.tsx +80 -67
- package/src/core/state/__tests__/jotai.test.tsx +108 -0
- package/src/core/state/jotai.ts +1 -1
- package/src/core/static/__tests__/files.test.ts +38 -10
- package/src/core/static/files.ts +2 -0
- package/src/core/{websocket → transports}/__tests__/connection-state.test.ts +1 -13
- package/src/core/transports/__tests__/server.test.ts +408 -0
- package/src/core/transports/__tests__/static.test.ts +306 -0
- package/src/core/transports/__tests__/wasm.test.ts +166 -0
- package/src/core/{websocket → transports}/connection-state.ts +9 -16
- package/src/core/transports/server.ts +152 -0
- package/src/core/transports/static.ts +166 -0
- package/src/core/transports/wasm.ts +97 -0
- package/src/core/vscode/__tests__/vscode-bindings.test.ts +125 -0
- package/src/core/vscode/vscode-bindings.ts +14 -2
- package/src/core/wasm/__tests__/bridge.test.ts +210 -64
- package/src/core/wasm/__tests__/worker.test.ts +188 -0
- package/src/core/wasm/bridge.ts +120 -73
- package/src/core/wasm/rpc.ts +15 -3
- package/src/core/wasm/store.ts +3 -3
- package/src/core/wasm/worker/bootstrap.ts +55 -51
- package/src/core/wasm/worker/getMarimoWheel.ts +1 -1
- package/src/core/wasm/worker/save-worker.ts +9 -10
- package/src/core/wasm/worker/types.ts +30 -18
- package/src/core/wasm/worker/worker.ts +118 -72
- package/src/css/app/Cell.css +7 -36
- package/src/css/app/codemirror.css +1 -1
- package/src/css/common.css +1 -1
- package/src/css/globals.css +72 -24
- package/src/hooks/__tests__/useAsyncData.test.tsx +148 -0
- package/src/hooks/__tests__/useDebounce.test.tsx +51 -0
- package/src/hooks/__tests__/useDeepCompareMemoize.test.tsx +39 -0
- package/src/hooks/__tests__/useDelayElapsed.test.tsx +28 -0
- package/src/hooks/__tests__/useInternalStateWithSync.test.tsx +20 -0
- package/src/hooks/__tests__/useScript.test.tsx +77 -0
- package/src/hooks/__tests__/useStateForKey.test.tsx +257 -0
- package/src/hooks/useAsyncData.ts +3 -3
- package/src/hooks/useDataSourceDiscovery.ts +6 -4
- package/src/hooks/useDebounce.ts +6 -10
- package/src/hooks/useDeepCompareMemoize.ts +1 -1
- package/src/hooks/useDelayElapsed.ts +14 -10
- package/src/hooks/useElapsedTime.ts +3 -3
- package/src/hooks/useEventListener.ts +1 -2
- package/src/hooks/useInputHistory.ts +4 -7
- package/src/hooks/useInternalStateWithSync.ts +6 -6
- package/src/hooks/useResizeObserver.ts +4 -7
- package/src/hooks/useScript.ts +67 -70
- package/src/hooks/useStateForKey.ts +93 -0
- package/src/mount.tsx +20 -15
- package/src/plugins/__tests__/plugin-object-schemas.test.ts +104 -0
- package/src/plugins/core/RenderHTML.tsx +3 -5
- package/src/plugins/core/__test__/RenderHTML-copy.test.tsx +60 -0
- package/src/plugins/core/registerReactComponent.tsx +5 -14
- package/src/plugins/impl/CodeEditorPlugin.tsx +1 -1
- package/src/plugins/impl/DataEditorPlugin.tsx +34 -13
- package/src/plugins/impl/DataTablePlugin.tsx +69 -37
- package/src/plugins/impl/DropdownPlugin.tsx +2 -6
- package/src/plugins/impl/FileBrowserPlugin.tsx +4 -16
- package/src/plugins/impl/FormPlugin.tsx +1 -1
- package/src/plugins/impl/RangeSliderPlugin.tsx +16 -2
- package/src/plugins/impl/RefreshPlugin.tsx +1 -0
- package/src/plugins/impl/SliderPlugin.tsx +6 -8
- package/src/plugins/impl/__tests__/DataEditorPlugin.test.ts +93 -4
- package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +387 -1
- package/src/plugins/impl/__tests__/FileBrowserPlugin.test.tsx +45 -0
- package/src/plugins/impl/__tests__/RangeSliderPlugin.test.tsx +109 -0
- package/src/plugins/impl/__tests__/SliderPlugin.test.tsx +24 -3
- package/src/plugins/impl/anywidget/__tests__/registry.test.ts +153 -0
- package/src/plugins/impl/anywidget/__tests__/widget-binding.test.ts +241 -2
- package/src/plugins/impl/anywidget/model.ts +3 -1
- package/src/plugins/impl/anywidget/registry.ts +18 -14
- package/src/plugins/impl/anywidget/runtime.ts +21 -9
- package/src/plugins/impl/anywidget/widget-binding.ts +160 -82
- package/src/plugins/impl/chat/__tests__/chat-prompts.test.tsx +93 -0
- package/src/plugins/impl/chat/chat-ui.tsx +17 -15
- package/src/plugins/impl/code/any-language-editor.tsx +2 -2
- package/src/plugins/impl/common/error-banner.tsx +5 -3
- package/src/plugins/impl/data-editor/__tests__/column-types.test.ts +42 -0
- package/src/plugins/impl/data-editor/__tests__/editor-state.test.ts +52 -1
- package/src/plugins/impl/data-editor/__tests__/glide-data-editor.test.tsx +120 -4
- package/src/plugins/impl/data-editor/__tests__/glide-utils.test.ts +116 -0
- package/src/plugins/impl/data-editor/column-types.ts +55 -0
- package/src/plugins/impl/data-editor/editor-state.ts +18 -2
- package/src/plugins/impl/data-editor/glide-data-editor.tsx +74 -12
- package/src/plugins/impl/data-editor/glide-utils.ts +39 -38
- package/src/plugins/impl/data-editor/types.ts +5 -0
- package/src/plugins/impl/data-explorer/ConnectedDataExplorerComponent.tsx +1 -1
- package/src/plugins/impl/data-explorer/components/column-summary.tsx +4 -2
- package/src/plugins/impl/data-explorer/state/reducer.ts +1 -1
- package/src/plugins/impl/data-frames/DataFramePlugin.tsx +1 -2
- package/src/plugins/impl/data-frames/__tests__/sidebar.test.tsx +160 -0
- package/src/plugins/impl/data-frames/forms/__tests__/__snapshots__/form.test.tsx.snap +66 -66
- package/src/plugins/impl/data-frames/panel.tsx +44 -16
- package/src/plugins/impl/mpl-interactive/MplInteractivePlugin.tsx +5 -3
- package/src/plugins/impl/panel/PanelPlugin.tsx +16 -17
- package/src/plugins/impl/panel/__tests__/utils.test.ts +39 -1
- package/src/plugins/impl/panel/utils.ts +17 -0
- package/src/plugins/impl/plotly/PlotlyPlugin.tsx +2 -5
- package/src/plugins/impl/plotly/selection.ts +25 -19
- package/src/plugins/impl/vega/VegaPlugin.tsx +2 -3
- package/src/plugins/impl/vega/make-selectable.ts +4 -7
- package/src/plugins/layout/DownloadPlugin.tsx +7 -11
- package/src/plugins/layout/RoutesPlugin.tsx +1 -1
- package/src/plugins/layout/__test__/DownloadPlugin.test.tsx +205 -0
- package/src/stories/__tests__/editor-story.test.tsx +33 -0
- package/src/stories/button.stories.tsx +1 -0
- package/src/stories/cell-status.stories.tsx +29 -24
- package/src/stories/cell.stories.tsx +46 -46
- package/src/stories/data-table.stories.tsx +31 -0
- package/src/stories/editor.stories.tsx +24 -17
- package/src/stories/form-wrapper.stories.tsx +2 -2
- package/src/stories/layout/vertical/one-column.stories.tsx +28 -42
- package/src/stories/runtime-story.tsx +23 -17
- package/src/stories/select.stories.tsx +2 -2
- package/src/stories/switchable-multi-select.stories.tsx +1 -1
- package/src/theme/__tests__/islands-theme.test.tsx +276 -0
- package/src/theme/namespace.tsx +4 -3
- package/src/theme/useTheme.ts +71 -41
- package/src/utils/__tests__/arrays.test.ts +35 -0
- package/src/utils/__tests__/batch-requests.test.ts +3 -3
- package/src/utils/__tests__/{createReducer.test.ts → createReducer.test.tsx} +127 -1
- package/src/utils/__tests__/download.test.tsx +183 -23
- package/src/utils/__tests__/numbers.test.ts +105 -1
- package/src/utils/__tests__/objects.test.ts +21 -0
- package/src/utils/arrays.ts +11 -2
- package/src/utils/blob.ts +1 -1
- package/src/utils/createReducer.ts +115 -79
- package/src/utils/download.ts +67 -6
- package/src/utils/maps.ts +0 -3
- package/src/utils/numbers.ts +79 -18
- package/src/utils/objects.ts +4 -9
- package/src/utils/time.ts +10 -0
- package/src/utils/tracer.ts +9 -5
- package/src/utils/zod-utils.ts +1 -3
- package/dist/_baseMerge-BiGRwuqv.js +0 -165
- package/dist/any-language-editor-D4q-IFcM.js +0 -76
- package/dist/assets/__vite-browser-external-BXYkiFsk.js +0 -1
- package/dist/assets/worker-HPY9fbhz.js +0 -114
- package/dist/feedback-button-g9eH5l7Q.js +0 -379
- package/dist/hasIn-o2Us0uVx.js +0 -132
- package/dist/html-to-image-B5H-xKRH.js +0 -3251
- package/dist/isArrayLikeObject-BZl-15ir.js +0 -450
- package/dist/isEmpty-BSZ1LaUo.js +0 -35
- package/dist/isSymbol-kQcfYbNX.js +0 -8
- package/dist/label-DoysmLMW.js +0 -281
- package/dist/pick-CJeoxYOS.js +0 -51
- package/dist/select-DemoKT4G.js +0 -1344
- package/dist/toDate-BvdkR0aH.js +0 -1185
- package/dist/toast-PkdZraM8.js +0 -1830
- package/dist/use-restore-focus-CKjfFjLM.js +0 -6369
- package/dist/useLifecycle-Dfq8UD-b.js +0 -169
- package/dist/useTheme-Bu5bBgrh.js +0 -904
- package/src/components/chat/reasoning-accordion.tsx +0 -61
- package/src/components/chat/tool-call/tool-error-card.tsx +0 -81
- package/src/components/chat/tool-call/tool-history-row.tsx +0 -174
- package/src/components/editor/ai/__tests__/staged-cell-submission.test.ts +0 -106
- package/src/components/editor/ai/add-cell-with-ai.tsx +0 -506
- package/src/components/editor/ai/staged-cell-submission.ts +0 -46
- package/src/components/editor/cell/__tests__/StagedAICell.test.tsx +0 -64
- package/src/components/editor/cell/code/__tests__/rtc-editor-config.test.ts +0 -50
- package/src/components/editor/chrome/wrapper/footer-items/rtc-status.tsx +0 -65
- package/src/components/editor/navigation/__tests__/state.test.ts +0 -81
- package/src/components/editor/navigation/state.ts +0 -65
- package/src/components/icons/loading-ellipsis.tsx +0 -46
- package/src/core/ai/tools/__tests__/run-cells-tool.test.ts +0 -656
- package/src/core/ai/tools/run-cells-tool.ts +0 -303
- package/src/core/attachments/state.ts +0 -18
- package/src/core/cells/__tests__/apply-transaction.test.ts +0 -991
- package/src/core/cells/__tests__/document-changes.test.ts +0 -1140
- package/src/core/cells/__tests__/document-roundtrip.test.ts +0 -392
- package/src/core/cells/document-changes.ts +0 -944
- package/src/core/codemirror/rtc/extension.ts +0 -453
- package/src/core/codemirror/rtc/loro/__tests__/sync.test.ts +0 -52
- package/src/core/codemirror/rtc/loro/awareness.ts +0 -531
- package/src/core/codemirror/rtc/loro/colors.ts +0 -38
- package/src/core/codemirror/rtc/loro/sync.ts +0 -168
- package/src/core/host/AGENTS.md +0 -11
- package/src/core/host/__tests__/events.test.ts +0 -46
- package/src/core/host/__tests__/fixtures.ts +0 -39
- package/src/core/host/__tests__/notebook-client.test.ts +0 -433
- package/src/core/host/__tests__/protocol.test.ts +0 -214
- package/src/core/host/__tests__/stream.test.ts +0 -209
- package/src/core/host/connection.ts +0 -81
- package/src/core/host/events.ts +0 -61
- package/src/core/host/notebook-client.ts +0 -290
- package/src/core/host/protocol.ts +0 -1945
- package/src/core/host/resources/resource.ts +0 -47
- package/src/core/host/stream.ts +0 -211
- package/src/core/rtc/state.ts +0 -34
- package/src/core/state/__tests__/jotai.test.ts +0 -25
- package/src/core/wasm/worker/message-buffer.ts +0 -33
- package/src/core/websocket/__tests__/createConnectionTransport.test.ts +0 -49
- package/src/core/websocket/__tests__/useNotebookClient.hook.test.tsx +0 -170
- package/src/core/websocket/state.ts +0 -7
- package/src/core/websocket/transports/__tests__/basic.test.ts +0 -275
- package/src/core/websocket/transports/__tests__/sse.test.ts +0 -335
- package/src/core/websocket/transports/__tests__/transport.test.ts +0 -308
- package/src/core/websocket/transports/__tests__/ws.test.ts +0 -125
- package/src/core/websocket/transports/basic.ts +0 -102
- package/src/core/websocket/transports/create.ts +0 -31
- package/src/core/websocket/transports/sse.ts +0 -308
- package/src/core/websocket/transports/transport.ts +0 -50
- package/src/core/websocket/transports/ws.ts +0 -98
- package/src/core/websocket/useNotebookClient.ts +0 -88
- package/src/utils/__tests__/id-tree.test.ts +0 -2145
- package/src/utils/id-tree.tsx +0 -1134
- /package/src/{core/attachments/toast.ts → components/editor/agent-toast.ts} +0 -0
- /package/src/core/{websocket → session}/connection-utils.ts +0 -0
|
@@ -48,6 +48,7 @@ import { DEFAULT_AI_MODEL, type UserConfig } from "@/core/config/config-schema";
|
|
|
48
48
|
import { isWasm } from "@/core/wasm/utils";
|
|
49
49
|
import { cn } from "@/utils/cn";
|
|
50
50
|
import { Events } from "@/utils/events";
|
|
51
|
+
import { Objects } from "@/utils/objects";
|
|
51
52
|
import { Strings } from "@/utils/strings";
|
|
52
53
|
import { AIModelDropdown, getProviderLabel } from "../ai/ai-model-dropdown";
|
|
53
54
|
import {
|
|
@@ -118,7 +119,7 @@ export const AiProviderTitle: React.FC<AiProviderTitleProps> = ({
|
|
|
118
119
|
children,
|
|
119
120
|
}) => {
|
|
120
121
|
return (
|
|
121
|
-
<div className="flex items-center text-
|
|
122
|
+
<div className="flex items-center text-sm font-medium">
|
|
122
123
|
{provider && <AiProviderIcon provider={provider} className="mr-2" />}
|
|
123
124
|
{children}
|
|
124
125
|
</div>
|
|
@@ -148,9 +149,10 @@ export const ApiKey: React.FC<ApiKeyProps> = ({
|
|
|
148
149
|
control={form.control}
|
|
149
150
|
name={name}
|
|
150
151
|
render={({ field, override }) => (
|
|
151
|
-
<div className="flex flex-col space-y-1">
|
|
152
|
+
<div className="settings-field flex flex-col space-y-1">
|
|
152
153
|
<FormItem className={formItemClasses}>
|
|
153
|
-
<FormLabel>API
|
|
154
|
+
<FormLabel>API key</FormLabel>
|
|
155
|
+
{description && <FormDescription>{description}</FormDescription>}
|
|
154
156
|
<FormControl>
|
|
155
157
|
<Input
|
|
156
158
|
data-testid={testId}
|
|
@@ -173,7 +175,6 @@ export const ApiKey: React.FC<ApiKeyProps> = ({
|
|
|
173
175
|
<FormMessage />
|
|
174
176
|
<IsOverridden override={override} />
|
|
175
177
|
</FormItem>
|
|
176
|
-
{description && <FormDescription>{description}</FormDescription>}
|
|
177
178
|
</div>
|
|
178
179
|
)}
|
|
179
180
|
/>
|
|
@@ -217,9 +218,10 @@ export const BaseUrl: React.FC<BaseUrlProps> = ({
|
|
|
217
218
|
control={form.control}
|
|
218
219
|
name={name}
|
|
219
220
|
render={({ field, override }) => (
|
|
220
|
-
<div className="flex flex-col space-y-1">
|
|
221
|
+
<div className="settings-field flex flex-col space-y-1">
|
|
221
222
|
<FormItem className={formItemClasses}>
|
|
222
223
|
<FormLabel>Base URL</FormLabel>
|
|
224
|
+
{description && <FormDescription>{description}</FormDescription>}
|
|
223
225
|
<FormControl>
|
|
224
226
|
<Input
|
|
225
227
|
data-testid={testId}
|
|
@@ -238,7 +240,6 @@ export const BaseUrl: React.FC<BaseUrlProps> = ({
|
|
|
238
240
|
<FormMessage />
|
|
239
241
|
<IsOverridden override={override} />
|
|
240
242
|
</FormItem>
|
|
241
|
-
{description && <FormDescription>{description}</FormDescription>}
|
|
242
243
|
</div>
|
|
243
244
|
)}
|
|
244
245
|
/>
|
|
@@ -282,6 +283,7 @@ export const ModelSelector: React.FC<ModelSelectorProps> = ({
|
|
|
282
283
|
const renderFormItem = () => (
|
|
283
284
|
<FormItem className={formItemClasses}>
|
|
284
285
|
<FormLabel>{label}</FormLabel>
|
|
286
|
+
{description && <FormDescription>{description}</FormDescription>}
|
|
285
287
|
<FormControl>
|
|
286
288
|
<AIModelDropdown
|
|
287
289
|
value={value}
|
|
@@ -324,11 +326,10 @@ export const ModelSelector: React.FC<ModelSelectorProps> = ({
|
|
|
324
326
|
);
|
|
325
327
|
|
|
326
328
|
return (
|
|
327
|
-
<div className="flex flex-col space-y-1">
|
|
329
|
+
<div className="settings-field flex flex-col space-y-1">
|
|
328
330
|
{renderFormItem()}
|
|
329
331
|
<IsOverridden override={override} />
|
|
330
332
|
<IncorrectModelId value={value} />
|
|
331
|
-
{description && <FormDescription>{description}</FormDescription>}
|
|
332
333
|
</div>
|
|
333
334
|
);
|
|
334
335
|
}}
|
|
@@ -343,6 +344,7 @@ interface ProviderSelectProps {
|
|
|
343
344
|
options: string[];
|
|
344
345
|
testId: string;
|
|
345
346
|
disabled?: boolean;
|
|
347
|
+
description?: React.ReactNode;
|
|
346
348
|
}
|
|
347
349
|
|
|
348
350
|
export const ProviderSelect: React.FC<ProviderSelectProps> = ({
|
|
@@ -351,15 +353,17 @@ export const ProviderSelect: React.FC<ProviderSelectProps> = ({
|
|
|
351
353
|
options,
|
|
352
354
|
testId,
|
|
353
355
|
disabled = false,
|
|
356
|
+
description,
|
|
354
357
|
}) => {
|
|
355
358
|
return (
|
|
356
359
|
<OverriddenFormField
|
|
357
360
|
control={form.control}
|
|
358
361
|
name={name}
|
|
359
362
|
render={({ field, override }) => (
|
|
360
|
-
<div className="flex flex-col space-y-1">
|
|
363
|
+
<div className="settings-field flex flex-col space-y-1">
|
|
361
364
|
<FormItem className={formItemClasses}>
|
|
362
365
|
<FormLabel>Provider</FormLabel>
|
|
366
|
+
{description && <FormDescription>{description}</FormDescription>}
|
|
363
367
|
<FormControl>
|
|
364
368
|
<NativeSelect
|
|
365
369
|
data-testid={testId}
|
|
@@ -439,7 +443,7 @@ const renderCopilotProvider = ({
|
|
|
439
443
|
if (copilot === "custom") {
|
|
440
444
|
return (
|
|
441
445
|
<ModelSelector
|
|
442
|
-
label="Autocomplete
|
|
446
|
+
label="Autocomplete model"
|
|
443
447
|
form={form}
|
|
444
448
|
config={config}
|
|
445
449
|
name="ai.models.autocomplete_model"
|
|
@@ -460,7 +464,9 @@ const SettingGroup = ({
|
|
|
460
464
|
className?: string;
|
|
461
465
|
}) => {
|
|
462
466
|
return (
|
|
463
|
-
<div className={cn("flex flex-col gap-4
|
|
467
|
+
<div className={cn("settings-group flex flex-col gap-4", className)}>
|
|
468
|
+
{children}
|
|
469
|
+
</div>
|
|
464
470
|
);
|
|
465
471
|
};
|
|
466
472
|
|
|
@@ -501,6 +507,7 @@ const ModelListItem: React.FC<ModelListItemProps> = ({
|
|
|
501
507
|
<ModelInfoCard model={model} />
|
|
502
508
|
{model.custom && (
|
|
503
509
|
<Button
|
|
510
|
+
aria-label={`Delete model ${model.name}`}
|
|
504
511
|
variant="ghost"
|
|
505
512
|
size="icon"
|
|
506
513
|
onClick={handleDelete}
|
|
@@ -561,18 +568,14 @@ export const AiCodeCompletionConfig: React.FC<AiConfigProps> = ({
|
|
|
561
568
|
const { value: copilot } = getOverride("completion.copilot", watchedCopilot);
|
|
562
569
|
return (
|
|
563
570
|
<SettingGroup>
|
|
564
|
-
<SettingSubtitle>
|
|
565
|
-
<p className="text-sm text-muted-secondary">
|
|
566
|
-
Choose GitHub Copilot, Codeium, or a custom provider (such as Ollama) to
|
|
567
|
-
enable AI-powered code completion.
|
|
568
|
-
</p>
|
|
569
|
-
|
|
571
|
+
<SettingSubtitle>Copilot</SettingSubtitle>
|
|
570
572
|
<ProviderSelect
|
|
571
573
|
form={form}
|
|
572
574
|
config={config}
|
|
573
575
|
name="completion.copilot"
|
|
574
576
|
options={["none", "github", "codeium", "custom"]}
|
|
575
577
|
testId="copilot-select"
|
|
578
|
+
description="Choose GitHub Copilot, Codeium, or a custom provider (such as Ollama) to enable AI-powered code completion."
|
|
576
579
|
/>
|
|
577
580
|
|
|
578
581
|
{renderCopilotProvider({ form, config, onSubmit, copilot })}
|
|
@@ -681,7 +684,10 @@ export const CustomProvidersConfig: React.FC<AiConfigProps> = ({
|
|
|
681
684
|
};
|
|
682
685
|
|
|
683
686
|
const removeProvider = (providerName: string) => {
|
|
684
|
-
const
|
|
687
|
+
const rest = Objects.filter(
|
|
688
|
+
customProviders,
|
|
689
|
+
(_, name) => name !== providerName,
|
|
690
|
+
);
|
|
685
691
|
// Reset to clear nested dirty state, then set new value
|
|
686
692
|
form.resetField("ai.custom_providers");
|
|
687
693
|
form.setValue("ai.custom_providers", rest, { shouldDirty: true });
|
|
@@ -691,7 +697,7 @@ export const CustomProvidersConfig: React.FC<AiConfigProps> = ({
|
|
|
691
697
|
const providerForm = (
|
|
692
698
|
<div className="flex flex-col gap-3 p-4 border border-border rounded-md bg-muted/20">
|
|
693
699
|
<div className="flex flex-col gap-1.5">
|
|
694
|
-
<Label htmlFor={providerNameInputId}>Provider
|
|
700
|
+
<Label htmlFor={providerNameInputId}>Provider name</Label>
|
|
695
701
|
<Input
|
|
696
702
|
id={providerNameInputId}
|
|
697
703
|
placeholder="e.g., together, groq, mistral"
|
|
@@ -729,7 +735,7 @@ export const CustomProvidersConfig: React.FC<AiConfigProps> = ({
|
|
|
729
735
|
</div>
|
|
730
736
|
|
|
731
737
|
<div className="flex flex-col gap-1.5">
|
|
732
|
-
<Label htmlFor={apiKeyInputId}>API
|
|
738
|
+
<Label htmlFor={apiKeyInputId}>API key (optional)</Label>
|
|
733
739
|
<Input
|
|
734
740
|
id={apiKeyInputId}
|
|
735
741
|
placeholder="sk-..."
|
|
@@ -745,7 +751,7 @@ export const CustomProvidersConfig: React.FC<AiConfigProps> = ({
|
|
|
745
751
|
disabled={!hasValidValues}
|
|
746
752
|
size="xs"
|
|
747
753
|
>
|
|
748
|
-
Add
|
|
754
|
+
Add provider
|
|
749
755
|
</Button>
|
|
750
756
|
<Button variant="outline" onClick={resetForm} size="xs">
|
|
751
757
|
Cancel
|
|
@@ -834,7 +840,7 @@ export const CustomProvidersConfig: React.FC<AiConfigProps> = ({
|
|
|
834
840
|
className="w-fit self-end"
|
|
835
841
|
>
|
|
836
842
|
<Trash2Icon className="h-4 w-4 mr-2" />
|
|
837
|
-
Remove
|
|
843
|
+
Remove provider
|
|
838
844
|
</Button>
|
|
839
845
|
</AccordionFormItem>
|
|
840
846
|
);
|
|
@@ -842,10 +848,10 @@ export const CustomProvidersConfig: React.FC<AiConfigProps> = ({
|
|
|
842
848
|
|
|
843
849
|
return (
|
|
844
850
|
<SettingGroup>
|
|
845
|
-
<SettingSubtitle>Custom
|
|
851
|
+
<SettingSubtitle>Custom providers</SettingSubtitle>
|
|
846
852
|
<p className="text-sm text-muted-secondary">
|
|
847
853
|
Add your own OpenAI-compatible provider. Once added, you can
|
|
848
|
-
configure models in the AI
|
|
854
|
+
configure models in the AI models tab.
|
|
849
855
|
</p>
|
|
850
856
|
|
|
851
857
|
{customProviderEntries.length > 0 && (
|
|
@@ -867,7 +873,7 @@ export const CustomProvidersConfig: React.FC<AiConfigProps> = ({
|
|
|
867
873
|
className="self-start"
|
|
868
874
|
isFormOpen={isAddingProvider}
|
|
869
875
|
setIsFormOpen={setIsAddingProvider}
|
|
870
|
-
label="Add
|
|
876
|
+
label="Add provider"
|
|
871
877
|
/>
|
|
872
878
|
)}
|
|
873
879
|
</SettingGroup>
|
|
@@ -1203,9 +1209,12 @@ export const AiProvidersConfig: React.FC<AiConfigProps> = ({
|
|
|
1203
1209
|
disabled={isWasmRuntime}
|
|
1204
1210
|
name="ai.bedrock.region_name"
|
|
1205
1211
|
render={({ field, override }) => (
|
|
1206
|
-
<div className="flex flex-col space-y-1">
|
|
1212
|
+
<div className="settings-field flex flex-col space-y-1">
|
|
1207
1213
|
<FormItem className={formItemClasses}>
|
|
1208
|
-
<FormLabel>AWS
|
|
1214
|
+
<FormLabel>AWS region</FormLabel>
|
|
1215
|
+
<FormDescription>
|
|
1216
|
+
The AWS region where Bedrock service is available.
|
|
1217
|
+
</FormDescription>
|
|
1209
1218
|
<FormControl>
|
|
1210
1219
|
<NativeSelect
|
|
1211
1220
|
data-testid="bedrock-region-select"
|
|
@@ -1228,9 +1237,6 @@ export const AiProvidersConfig: React.FC<AiConfigProps> = ({
|
|
|
1228
1237
|
<FormMessage />
|
|
1229
1238
|
<IsOverridden override={override} />
|
|
1230
1239
|
</FormItem>
|
|
1231
|
-
<FormDescription>
|
|
1232
|
-
The AWS region where Bedrock service is available.
|
|
1233
|
-
</FormDescription>
|
|
1234
1240
|
</div>
|
|
1235
1241
|
)}
|
|
1236
1242
|
/>
|
|
@@ -1240,9 +1246,13 @@ export const AiProvidersConfig: React.FC<AiConfigProps> = ({
|
|
|
1240
1246
|
disabled={isWasmRuntime}
|
|
1241
1247
|
name="ai.bedrock.profile_name"
|
|
1242
1248
|
render={({ field, override }) => (
|
|
1243
|
-
<div className="flex flex-col space-y-1">
|
|
1249
|
+
<div className="settings-field flex flex-col space-y-1">
|
|
1244
1250
|
<FormItem className={formItemClasses}>
|
|
1245
|
-
<FormLabel>AWS
|
|
1251
|
+
<FormLabel>AWS profile name (optional)</FormLabel>
|
|
1252
|
+
<FormDescription>
|
|
1253
|
+
The AWS profile name from your ~/.aws/credentials file.
|
|
1254
|
+
Leave blank to use your default AWS credentials.
|
|
1255
|
+
</FormDescription>
|
|
1246
1256
|
<FormControl>
|
|
1247
1257
|
<Input
|
|
1248
1258
|
data-testid="bedrock-profile-input"
|
|
@@ -1257,17 +1267,13 @@ export const AiProvidersConfig: React.FC<AiConfigProps> = ({
|
|
|
1257
1267
|
<FormMessage />
|
|
1258
1268
|
<IsOverridden override={override} />
|
|
1259
1269
|
</FormItem>
|
|
1260
|
-
<FormDescription>
|
|
1261
|
-
The AWS profile name from your ~/.aws/credentials file. Leave
|
|
1262
|
-
blank to use your default AWS credentials.
|
|
1263
|
-
</FormDescription>
|
|
1264
1270
|
</div>
|
|
1265
1271
|
)}
|
|
1266
1272
|
/>
|
|
1267
1273
|
</AccordionFormItem>
|
|
1268
1274
|
|
|
1269
1275
|
<AccordionFormItem
|
|
1270
|
-
title="OpenAI-
|
|
1276
|
+
title="OpenAI-compatible (legacy)"
|
|
1271
1277
|
provider="openai-compatible"
|
|
1272
1278
|
isConfigured={
|
|
1273
1279
|
hasValue("ai.open_ai_compatible.api_key") &&
|
|
@@ -1275,7 +1281,7 @@ export const AiProvidersConfig: React.FC<AiConfigProps> = ({
|
|
|
1275
1281
|
}
|
|
1276
1282
|
>
|
|
1277
1283
|
<p className="text-sm text-amber-600 dark:text-amber-400 mb-2">
|
|
1278
|
-
Consider using Custom
|
|
1284
|
+
Consider using Custom providers instead, which allows you to add
|
|
1279
1285
|
multiple providers with distinct names.
|
|
1280
1286
|
</p>
|
|
1281
1287
|
<ApiKey
|
|
@@ -1321,98 +1327,11 @@ export const AiAssistConfig: React.FC<AiConfigProps> = ({
|
|
|
1321
1327
|
|
|
1322
1328
|
return (
|
|
1323
1329
|
<SettingGroup>
|
|
1324
|
-
<SettingSubtitle>AI
|
|
1325
|
-
|
|
1326
|
-
<FormField
|
|
1327
|
-
control={form.control}
|
|
1328
|
-
name="ai.inline_tooltip"
|
|
1329
|
-
render={({ field }) => (
|
|
1330
|
-
<div className="flex flex-col gap-y-1">
|
|
1331
|
-
<FormItem className={formItemClasses}>
|
|
1332
|
-
<FormLabel className="font-normal">AI Edit Tooltip</FormLabel>
|
|
1333
|
-
<FormControl>
|
|
1334
|
-
<Checkbox
|
|
1335
|
-
data-testid="inline-ai-checkbox"
|
|
1336
|
-
checked={field.value === true}
|
|
1337
|
-
onCheckedChange={field.onChange}
|
|
1338
|
-
/>
|
|
1339
|
-
</FormControl>
|
|
1340
|
-
</FormItem>
|
|
1341
|
-
<FormDescription>
|
|
1342
|
-
Enable "Edit with AI" tooltip when selecting code.
|
|
1343
|
-
</FormDescription>
|
|
1344
|
-
</div>
|
|
1345
|
-
)}
|
|
1346
|
-
/>
|
|
1347
|
-
|
|
1348
|
-
<FormField
|
|
1349
|
-
control={form.control}
|
|
1350
|
-
name="ai.max_tokens"
|
|
1351
|
-
render={({ field }) => {
|
|
1352
|
-
return (
|
|
1353
|
-
<div className="flex flex-col gap-y-1">
|
|
1354
|
-
<div className="flex items-center gap-x-2">
|
|
1355
|
-
<FormItem className={formItemClasses}>
|
|
1356
|
-
<FormLabel className="font-normal">
|
|
1357
|
-
Max output tokens
|
|
1358
|
-
</FormLabel>
|
|
1359
|
-
<FormControl>
|
|
1360
|
-
<Input
|
|
1361
|
-
data-testid="ai-max-tokens-input"
|
|
1362
|
-
type="number"
|
|
1363
|
-
min={1}
|
|
1364
|
-
disabled={!maxTokensEnabled}
|
|
1365
|
-
className="w-28 h-6"
|
|
1366
|
-
value={field.value ?? (maxTokensEnabled ? "" : 32768)}
|
|
1367
|
-
onChange={(e) => {
|
|
1368
|
-
const n = Number.parseInt(e.target.value, 10);
|
|
1369
|
-
field.onChange(Number.isFinite(n) && n > 0 ? n : null);
|
|
1370
|
-
}}
|
|
1371
|
-
/>
|
|
1372
|
-
</FormControl>
|
|
1373
|
-
</FormItem>
|
|
1374
|
-
<FormItem className={formItemClasses}>
|
|
1375
|
-
<Checkbox
|
|
1376
|
-
data-testid="ai-max-tokens-checkbox"
|
|
1377
|
-
checked={maxTokensEnabled}
|
|
1378
|
-
onCheckedChange={(checked) => {
|
|
1379
|
-
const isChecked = checked === true;
|
|
1380
|
-
setMaxTokensEnabled(isChecked);
|
|
1381
|
-
// null signals delete to the server; cast because
|
|
1382
|
-
// UserConfig (OpenAPI-derived) types max_tokens as
|
|
1383
|
-
// `number | undefined`, but zod accepts `null`.
|
|
1384
|
-
const next = (
|
|
1385
|
-
isChecked ? (field.value ?? 32768) : null
|
|
1386
|
-
) as number | undefined;
|
|
1387
|
-
// shouldDirty: true forces RHF to keep this in
|
|
1388
|
-
// dirtyFields even when `next` happens to equal the
|
|
1389
|
-
// form's defaultValue (e.g. untick → tick when disk
|
|
1390
|
-
// started with 32768). Otherwise getDirtyValues
|
|
1391
|
-
// would skip it and the save body would be empty.
|
|
1392
|
-
form.setValue("ai.max_tokens", next, {
|
|
1393
|
-
shouldDirty: true,
|
|
1394
|
-
shouldTouch: true,
|
|
1395
|
-
});
|
|
1396
|
-
onSubmit(form.getValues());
|
|
1397
|
-
}}
|
|
1398
|
-
/>
|
|
1399
|
-
<FormLabel className="font-normal">Override</FormLabel>
|
|
1400
|
-
</FormItem>
|
|
1401
|
-
</div>
|
|
1402
|
-
|
|
1403
|
-
<FormDescription>
|
|
1404
|
-
Each provider sets its own max output tokens (Anthropic uses a
|
|
1405
|
-
recommended default). Adjust to control costs or enable more
|
|
1406
|
-
output.
|
|
1407
|
-
</FormDescription>
|
|
1408
|
-
</div>
|
|
1409
|
-
);
|
|
1410
|
-
}}
|
|
1411
|
-
/>
|
|
1330
|
+
<SettingSubtitle>AI assistant</SettingSubtitle>
|
|
1412
1331
|
|
|
1413
1332
|
<FormErrorsBanner />
|
|
1414
1333
|
<ModelSelector
|
|
1415
|
-
label="Chat
|
|
1334
|
+
label="Chat model"
|
|
1416
1335
|
form={form}
|
|
1417
1336
|
config={config}
|
|
1418
1337
|
name="ai.models.chat_model"
|
|
@@ -1424,7 +1343,7 @@ export const AiAssistConfig: React.FC<AiConfigProps> = ({
|
|
|
1424
1343
|
onSubmit={onSubmit}
|
|
1425
1344
|
/>
|
|
1426
1345
|
<ModelSelector
|
|
1427
|
-
label="Edit
|
|
1346
|
+
label="Edit model"
|
|
1428
1347
|
form={form}
|
|
1429
1348
|
config={config}
|
|
1430
1349
|
name="ai.models.edit_model"
|
|
@@ -1432,20 +1351,87 @@ export const AiAssistConfig: React.FC<AiConfigProps> = ({
|
|
|
1432
1351
|
description={
|
|
1433
1352
|
<span>
|
|
1434
1353
|
Model to use for code editing with the{" "}
|
|
1435
|
-
<Kbd className="inline">
|
|
1354
|
+
<Kbd className="inline">Edit with AI</Kbd> action.
|
|
1436
1355
|
</span>
|
|
1437
1356
|
}
|
|
1438
1357
|
forRole="edit"
|
|
1439
1358
|
onSubmit={onSubmit}
|
|
1440
1359
|
/>
|
|
1441
1360
|
|
|
1361
|
+
<FormField
|
|
1362
|
+
control={form.control}
|
|
1363
|
+
name="ai.max_tokens"
|
|
1364
|
+
render={({ field }) => {
|
|
1365
|
+
return (
|
|
1366
|
+
<div className="settings-field flex flex-col gap-y-1">
|
|
1367
|
+
<FormItem className={formItemClasses}>
|
|
1368
|
+
<FormLabel className="font-normal">Max output tokens</FormLabel>
|
|
1369
|
+
<FormDescription>
|
|
1370
|
+
Limit output tokens for both chat and code edits. When not
|
|
1371
|
+
overridden, each provider uses its default (Anthropic uses a
|
|
1372
|
+
recommended default).
|
|
1373
|
+
</FormDescription>
|
|
1374
|
+
<div className="flex flex-wrap items-center gap-2">
|
|
1375
|
+
<FormControl>
|
|
1376
|
+
<Input
|
|
1377
|
+
data-testid="ai-max-tokens-input"
|
|
1378
|
+
type="number"
|
|
1379
|
+
min={1}
|
|
1380
|
+
disabled={!maxTokensEnabled}
|
|
1381
|
+
className="w-20 h-7"
|
|
1382
|
+
value={field.value ?? (maxTokensEnabled ? "" : 32768)}
|
|
1383
|
+
onChange={(e) => {
|
|
1384
|
+
const n = Number.parseInt(e.target.value, 10);
|
|
1385
|
+
field.onChange(Number.isFinite(n) && n > 0 ? n : null);
|
|
1386
|
+
}}
|
|
1387
|
+
/>
|
|
1388
|
+
</FormControl>
|
|
1389
|
+
<FormItem className="flex-row items-center gap-1.5">
|
|
1390
|
+
<FormControl>
|
|
1391
|
+
<Checkbox
|
|
1392
|
+
data-testid="ai-max-tokens-checkbox"
|
|
1393
|
+
checked={maxTokensEnabled}
|
|
1394
|
+
onCheckedChange={(checked) => {
|
|
1395
|
+
const isChecked = checked === true;
|
|
1396
|
+
setMaxTokensEnabled(isChecked);
|
|
1397
|
+
// null signals delete to the server; cast because
|
|
1398
|
+
// UserConfig (OpenAPI-derived) types max_tokens as
|
|
1399
|
+
// `number | undefined`, but zod accepts `null`.
|
|
1400
|
+
const next = (
|
|
1401
|
+
isChecked ? (field.value ?? 32768) : null
|
|
1402
|
+
) as number | undefined;
|
|
1403
|
+
// shouldDirty: true forces RHF to keep this in
|
|
1404
|
+
// dirtyFields even when `next` happens to equal the
|
|
1405
|
+
// form's defaultValue (e.g. untick → tick when disk
|
|
1406
|
+
// started with 32768). Otherwise getDirtyValues
|
|
1407
|
+
// would skip it and the save body would be empty.
|
|
1408
|
+
form.setValue("ai.max_tokens", next, {
|
|
1409
|
+
shouldDirty: true,
|
|
1410
|
+
shouldTouch: true,
|
|
1411
|
+
});
|
|
1412
|
+
onSubmit(form.getValues());
|
|
1413
|
+
}}
|
|
1414
|
+
/>
|
|
1415
|
+
</FormControl>
|
|
1416
|
+
<FormLabel className="font-normal">Override</FormLabel>
|
|
1417
|
+
</FormItem>
|
|
1418
|
+
</div>
|
|
1419
|
+
</FormItem>
|
|
1420
|
+
</div>
|
|
1421
|
+
);
|
|
1422
|
+
}}
|
|
1423
|
+
/>
|
|
1424
|
+
|
|
1442
1425
|
<OverriddenFormField
|
|
1443
1426
|
control={form.control}
|
|
1444
1427
|
name="ai.rules"
|
|
1445
1428
|
render={({ field, override }) => (
|
|
1446
|
-
<div className="flex flex-col">
|
|
1429
|
+
<div className="settings-field flex flex-col">
|
|
1447
1430
|
<FormItem>
|
|
1448
|
-
<FormLabel>Custom
|
|
1431
|
+
<FormLabel>Custom rules</FormLabel>
|
|
1432
|
+
<FormDescription>
|
|
1433
|
+
Custom rules to include in all AI completion prompts.
|
|
1434
|
+
</FormDescription>
|
|
1449
1435
|
<FormControl>
|
|
1450
1436
|
<Textarea
|
|
1451
1437
|
data-testid="ai-rules-input"
|
|
@@ -1459,8 +1445,28 @@ export const AiAssistConfig: React.FC<AiConfigProps> = ({
|
|
|
1459
1445
|
<FormMessage />
|
|
1460
1446
|
<IsOverridden override={override} />
|
|
1461
1447
|
</FormItem>
|
|
1448
|
+
</div>
|
|
1449
|
+
)}
|
|
1450
|
+
/>
|
|
1451
|
+
<FormField
|
|
1452
|
+
control={form.control}
|
|
1453
|
+
name="ai.inline_tooltip"
|
|
1454
|
+
render={({ field }) => (
|
|
1455
|
+
<div className="settings-field flex flex-col gap-y-1">
|
|
1456
|
+
<FormItem className={formItemClasses}>
|
|
1457
|
+
<FormLabel className="font-normal">
|
|
1458
|
+
Show “Edit with AI” on text selection
|
|
1459
|
+
</FormLabel>
|
|
1460
|
+
<FormControl>
|
|
1461
|
+
<Checkbox
|
|
1462
|
+
data-testid="inline-ai-checkbox"
|
|
1463
|
+
checked={field.value === true}
|
|
1464
|
+
onCheckedChange={field.onChange}
|
|
1465
|
+
/>
|
|
1466
|
+
</FormControl>
|
|
1467
|
+
</FormItem>
|
|
1462
1468
|
<FormDescription>
|
|
1463
|
-
|
|
1469
|
+
Enable "Edit with AI" tooltip when selecting code.
|
|
1464
1470
|
</FormDescription>
|
|
1465
1471
|
</div>
|
|
1466
1472
|
)}
|
|
@@ -1653,7 +1659,7 @@ export const AiModelDisplayConfig: React.FC<AiConfigProps> = ({
|
|
|
1653
1659
|
|
|
1654
1660
|
<div className="bg-background">
|
|
1655
1661
|
<Tree
|
|
1656
|
-
aria-label="AI
|
|
1662
|
+
aria-label="AI models by provider"
|
|
1657
1663
|
className="flex-1 overflow-auto outline-hidden focus-visible:outline-hidden"
|
|
1658
1664
|
selectionMode="none"
|
|
1659
1665
|
>
|
|
@@ -1765,7 +1771,7 @@ export const AddModelForm: React.FC<{
|
|
|
1765
1771
|
{customProviderNames.length > 0 && (
|
|
1766
1772
|
<>
|
|
1767
1773
|
<p className="px-2 py-1 text-xs text-muted-secondary font-medium">
|
|
1768
|
-
Custom
|
|
1774
|
+
Custom providers
|
|
1769
1775
|
</p>
|
|
1770
1776
|
{customProviderNames.map((p) => (
|
|
1771
1777
|
<SelectItem key={p} value={p}>
|
|
@@ -1777,7 +1783,7 @@ export const AddModelForm: React.FC<{
|
|
|
1777
1783
|
))}
|
|
1778
1784
|
{knownProviders.length > 0 && (
|
|
1779
1785
|
<p className="px-2 py-1 text-xs text-muted-secondary font-medium mt-1">
|
|
1780
|
-
Built-in
|
|
1786
|
+
Built-in providers
|
|
1781
1787
|
</p>
|
|
1782
1788
|
)}
|
|
1783
1789
|
</>
|
|
@@ -1846,7 +1852,7 @@ export const AddModelForm: React.FC<{
|
|
|
1846
1852
|
id={modelNameInputId}
|
|
1847
1853
|
value={modelName}
|
|
1848
1854
|
onChange={(e) => setModelName(e.target.value)}
|
|
1849
|
-
placeholder="gpt-
|
|
1855
|
+
placeholder="gpt-5.6-sol"
|
|
1850
1856
|
className="text-xs mb-0"
|
|
1851
1857
|
/>
|
|
1852
1858
|
</div>
|
|
@@ -1876,7 +1882,7 @@ export const AddModelForm: React.FC<{
|
|
|
1876
1882
|
<AddButton
|
|
1877
1883
|
isFormOpen={isFormOpen}
|
|
1878
1884
|
setIsFormOpen={setIsFormOpen}
|
|
1879
|
-
label="Add
|
|
1885
|
+
label="Add model"
|
|
1880
1886
|
className="pl-2"
|
|
1881
1887
|
/>
|
|
1882
1888
|
{modelAdded && (
|
|
@@ -1930,9 +1936,9 @@ const AiEnabledConfig: React.FC<AiConfigProps> = ({ form }) => {
|
|
|
1930
1936
|
control={form.control}
|
|
1931
1937
|
name="ai.enabled"
|
|
1932
1938
|
render={({ field, override }) => (
|
|
1933
|
-
<div className="flex flex-col gap-y-1">
|
|
1939
|
+
<div className="settings-field flex flex-col gap-y-1">
|
|
1934
1940
|
<FormItem className={formItemClasses}>
|
|
1935
|
-
<FormLabel className="font-normal">
|
|
1941
|
+
<FormLabel className="font-normal">Show AI features</FormLabel>
|
|
1936
1942
|
<FormControl>
|
|
1937
1943
|
<Checkbox
|
|
1938
1944
|
data-testid="ai-enabled-checkbox"
|
|
@@ -1946,8 +1952,8 @@ const AiEnabledConfig: React.FC<AiConfigProps> = ({ form }) => {
|
|
|
1946
1952
|
<IsOverridden override={override} />
|
|
1947
1953
|
</FormItem>
|
|
1948
1954
|
<FormDescription>
|
|
1949
|
-
When disabled, AI
|
|
1950
|
-
UI.
|
|
1955
|
+
When disabled, various AI-related features are hidden from the
|
|
1956
|
+
marimo UI.
|
|
1951
1957
|
</FormDescription>
|
|
1952
1958
|
</div>
|
|
1953
1959
|
)}
|
|
@@ -1981,32 +1987,32 @@ export const AiConfig: React.FC<AiConfigProps> = ({
|
|
|
1981
1987
|
onValueChange={(value) => setActiveTab(value as AiSettingsSubTab)}
|
|
1982
1988
|
className="flex-1"
|
|
1983
1989
|
>
|
|
1984
|
-
<TabsList className="mb-2">
|
|
1985
|
-
<TabsTrigger value="ai-features">AI
|
|
1990
|
+
<TabsList className="mb-2 max-w-full justify-start overflow-x-auto">
|
|
1991
|
+
<TabsTrigger value="ai-features">AI features</TabsTrigger>
|
|
1986
1992
|
{aiEnabled !== false && (
|
|
1987
1993
|
<>
|
|
1988
|
-
<TabsTrigger value="ai-providers">AI
|
|
1989
|
-
<TabsTrigger value="ai-models">AI
|
|
1994
|
+
<TabsTrigger value="ai-providers">AI providers</TabsTrigger>
|
|
1995
|
+
<TabsTrigger value="ai-models">AI models</TabsTrigger>
|
|
1990
1996
|
{!wasm && <TabsTrigger value="mcp">MCP</TabsTrigger>}
|
|
1991
1997
|
</>
|
|
1992
1998
|
)}
|
|
1993
1999
|
</TabsList>
|
|
2000
|
+
{aiEnabled !== false && <PairWithAgentBanner className="mt-2 mb-6" />}
|
|
1994
2001
|
|
|
1995
|
-
<TabsContent value="ai-features">
|
|
2002
|
+
<TabsContent value="ai-features" className="space-y-6">
|
|
2003
|
+
{aiEnabled !== false && (
|
|
2004
|
+
<AiAssistConfig form={form} config={config} onSubmit={onSubmit} />
|
|
2005
|
+
)}
|
|
1996
2006
|
<AiCodeCompletionConfig
|
|
1997
2007
|
form={form}
|
|
1998
2008
|
config={config}
|
|
1999
2009
|
onSubmit={onSubmit}
|
|
2000
2010
|
/>
|
|
2001
2011
|
<AiEnabledConfig form={form} config={config} onSubmit={onSubmit} />
|
|
2002
|
-
{aiEnabled !== false && (
|
|
2003
|
-
<AiAssistConfig form={form} config={config} onSubmit={onSubmit} />
|
|
2004
|
-
)}
|
|
2005
2012
|
</TabsContent>
|
|
2006
2013
|
{aiEnabled !== false && (
|
|
2007
2014
|
<>
|
|
2008
2015
|
<TabsContent value="ai-providers">
|
|
2009
|
-
<PairWithAgentBanner className="mb-4" />
|
|
2010
2016
|
<AiProvidersConfig
|
|
2011
2017
|
form={form}
|
|
2012
2018
|
config={config}
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
import { useAtom } from "jotai";
|
|
4
4
|
import { SettingsIcon } from "lucide-react";
|
|
5
|
-
import { VisuallyHidden } from "react-aria";
|
|
6
5
|
import { AppConfigForm } from "@/components/app-config/app-config-form";
|
|
7
6
|
import {
|
|
8
7
|
Popover,
|
|
@@ -51,10 +50,12 @@ export const ConfigButton: React.FC<Props> = ({
|
|
|
51
50
|
);
|
|
52
51
|
|
|
53
52
|
const userSettingsDialog = (
|
|
54
|
-
<DialogContent className="w-[
|
|
55
|
-
<
|
|
56
|
-
<DialogTitle
|
|
57
|
-
|
|
53
|
+
<DialogContent className="flex flex-col gap-0 w-[94vw] h-[90vh] overflow-hidden sm:max-w-5xl top-[5vh] p-0 font-prose">
|
|
54
|
+
<div className="border-b px-6 py-4 pr-12">
|
|
55
|
+
<DialogTitle className="text-base font-semibold">
|
|
56
|
+
User settings
|
|
57
|
+
</DialogTitle>
|
|
58
|
+
</div>
|
|
58
59
|
<UserConfigForm />
|
|
59
60
|
</DialogContent>
|
|
60
61
|
);
|
|
@@ -37,7 +37,7 @@ import {
|
|
|
37
37
|
const FORM_DEBOUNCE = 100; // ms;
|
|
38
38
|
|
|
39
39
|
export const AppConfigForm: React.FC = () => {
|
|
40
|
-
const
|
|
40
|
+
const config = useAppConfig();
|
|
41
41
|
const { saveAppConfig } = useRequestClient();
|
|
42
42
|
const htmlCheckboxId = useId();
|
|
43
43
|
const ipynbCheckboxId = useId();
|
|
@@ -50,18 +50,14 @@ export const AppConfigForm: React.FC = () => {
|
|
|
50
50
|
defaultValues: config,
|
|
51
51
|
});
|
|
52
52
|
|
|
53
|
+
// The host document carries the saved config back.
|
|
53
54
|
const onSubmit = async (values: AppConfig) => {
|
|
54
|
-
await saveAppConfig({ config: values })
|
|
55
|
-
.then(() => {
|
|
56
|
-
setConfig(values);
|
|
57
|
-
})
|
|
58
|
-
.catch(() => {
|
|
59
|
-
setConfig(values);
|
|
60
|
-
});
|
|
55
|
+
await saveAppConfig({ config: values });
|
|
61
56
|
};
|
|
62
57
|
|
|
63
58
|
const debouncedSubmit = useDebouncedCallback((v: AppConfig) => {
|
|
64
|
-
|
|
59
|
+
// The request client reports a failed save, so nothing is left to handle.
|
|
60
|
+
onSubmit(v).catch(() => undefined);
|
|
65
61
|
}, FORM_DEBOUNCE);
|
|
66
62
|
|
|
67
63
|
// When width is changed, dispatch a resize event so widgets know to resize
|