@marimo-team/islands 0.25.3-dev18 → 0.25.3-dev181
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-CNMliVzw.js → ConnectedDataExplorerComponent-Le_OBfmt.js} +21 -19
- package/dist/{ErrorBoundary-DP07HKNC.js → ErrorBoundary-Do1bDnqE.js} +19 -19
- package/dist/{abnfDiagram-VCTEODGH-D-Ez91gV.js → abnfDiagram-VCTEODGH-Tf1ghyQQ.js} +2 -2
- package/dist/any-language-editor-BVFHDDQ3.js +75 -0
- package/dist/{architectureDiagram-5GKGNRK7-CTpcNtO8.js → architectureDiagram-5GKGNRK7-xlnbTG0T.js} +1 -1
- package/dist/{arrays-CN1djC4k.js → arrays-R6JsImiT.js} +8 -0
- package/dist/assets/__vite-browser-external-DVeFf2e7.js +1 -0
- package/dist/assets/worker-C1pfNBsx.js +113 -0
- package/dist/{button-CvjkwdSk.js → button-BQRdqQi1.js} +199 -192
- package/dist/{capabilities-CQ5IjhzL.js → capabilities-CI4xUPsp.js} +2 -2
- package/dist/{chat-ui-DaHynk8g.js → chat-ui-X-cWrL9u.js} +541 -540
- package/dist/{check-EDwSwP89.js → check-C9Mp9eCK.js} +1 -1
- package/dist/{chunk-IMKFNOWR-DGxi-zeo.js → chunk-IMKFNOWR-Cmd4a5jy.js} +1 -1
- package/dist/{chunk-SHT3W25Y-CV9J3rAB.js → chunk-SHT3W25Y-mSNp-WpO.js} +1 -1
- package/dist/{chunk-SVP7TREG-BL-9Fqgg.js → chunk-SVP7TREG-CWC49D8X.js} +1 -1
- package/dist/{chunk-TICWLB2K-Cu_XMjDM.js → chunk-TICWLB2K-De9FINtG.js} +1 -1
- package/dist/{chunk-YOKDWASO-DPZk8vhS.js → chunk-YOKDWASO-DKplTrBY.js} +20 -20
- package/dist/{classDiagram-ZZMXUADV-BXXV13Hq.js → classDiagram-ZZMXUADV-DweTkYdp.js} +2 -2
- package/dist/{classDiagram-v2-VYDZK3BY-B7FXJ1Cp.js → classDiagram-v2-VYDZK3BY-A6MR2TiE.js} +2 -2
- package/dist/{code-visibility-hTy956cB.js → code-visibility-CjilY2pq.js} +25 -25
- package/dist/{common-CiockEHa.js → common-CgbJYN1L.js} +6994 -6819
- package/dist/{copy-icon-Ft7t9bqz.js → copy-icon-De584pZ4.js} +3 -3
- package/dist/{cynefinDiagram-5FMLGOSQ-CH96rwba.js → cynefinDiagram-5FMLGOSQ-BSvo5le-.js} +1 -1
- package/dist/{dagre-GXQ25YYZ-BD3PmpFY.js → dagre-GXQ25YYZ-tXRQslO6.js} +1 -1
- package/dist/{data-grid-overlay-editor-XsGuhhu5.js → data-grid-overlay-editor-Bov1HRwt.js} +5 -5
- package/dist/{data-grid-types-BH_r7g7l.js → data-grid-types-0PJ-9N5n.js} +1 -1
- package/dist/{diagram-S7CK7UJ4-BsSJJldB.js → diagram-S7CK7UJ4-r3t5VtwI.js} +1 -1
- package/dist/{diagram-UQ7AKVKN-muQtNZc4.js → diagram-UQ7AKVKN-qgbC8YnT.js} +1 -1
- package/dist/{diagram-VX7I27RA-CdhuZAqR.js → diagram-VX7I27RA-CiHxEwtp.js} +1 -1
- package/dist/{diagram-Z3DM3KII-BD8mXjOj.js → diagram-Z3DM3KII-D95u15Ev.js} +1 -1
- package/dist/{dialog-CEBFZNyc.js → dialog-DVRfQuhD.js} +25 -25
- package/dist/{dist-F8Ep36rk.js → dist-B1M0bGO3.js} +1 -1
- package/dist/{dist-D6d86eNJ.js → dist-BA13RJj5.js} +1 -1
- package/dist/{dist-Bvs24R_E.js → dist-BJtmSgcE.js} +48 -48
- package/dist/{dist-CN_BeG2I.js → dist-Ba2VIn1K.js} +53 -53
- package/dist/{dist-PXYI_yuP.js → dist-Bj4bmwUm.js} +12 -12
- package/dist/{dist-DoE4XJBC.js → dist-BmS-ZGjl.js} +8626 -8626
- package/dist/{dist-BorMD-uX.js → dist-Bzogh7CW.js} +87 -87
- package/dist/{dist-CN8zI-XC.js → dist-CThPVKaP.js} +1385 -1382
- package/dist/{dist-DiDibOYr.js → dist-CTi5FTiV.js} +87 -87
- package/dist/{dist-diIx5qJW.js → dist-Ck_C32ye.js} +2 -2
- package/dist/{dist-BLfKmR-l.js → dist-D1fnFp1J.js} +1 -1
- package/dist/{dist-OR1OnN-y.js → dist-D3x9__Fu.js} +46 -46
- package/dist/{dist-BMQf5zIS.js → dist-D7mrh5sO.js} +36 -36
- package/dist/{dist-CSJ0MDRw.js → dist-D9Q3xjiP.js} +1 -1
- package/dist/{dist-BuaRHxOc.js → dist-DP60Ubh8.js} +2 -2
- package/dist/{dist-CSbh1PNP.js → dist-DTv9KkpW.js} +12 -12
- package/dist/{dist-D-wwqlzJ.js → dist-DVVwOfrD.js} +109 -109
- package/dist/{dist-C8fAKSH1.js → dist-DYXM73-k.js} +36 -36
- package/dist/{dist-DBtSl3sf.js → dist-DjeybPOb.js} +1 -1
- package/dist/{dist-CrSP_H1M.js → dist-DtGn9N4h.js} +197 -197
- package/dist/{dist-CLdpGQVr.js → dist-KN80qWCP.js} +2 -2
- package/dist/{dist-DpBpA_n1.js → dist-Lm-D-Vr6.js} +3 -3
- package/dist/{dist-Cg7gzw-a.js → dist-O0qFpEJh.js} +56 -56
- package/dist/{dist-CkTTIdBe.js → dist-OUle2RT7.js} +207 -207
- package/dist/{dist-BK4Oj99o.js → dist-T5rh6JvL.js} +1 -1
- package/dist/{dropdown-menu-CP_qCYHC.js → dropdown-menu-DCMbbQ35.js} +1481 -1433
- package/dist/{ebnfDiagram-PWID7BFC-BIN1sweE.js → ebnfDiagram-PWID7BFC-P7e4bryK.js} +2 -2
- package/dist/{erDiagram-RLTQ6QDP-Ctp5cfoN.js → erDiagram-RLTQ6QDP-CUHZcmRj.js} +1 -1
- package/dist/{error-banner-D-WCIiMt.js → error-banner-DxJ3s8YO.js} +86 -86
- package/dist/{error-entries-Bv6bZPF3.js → error-entries-mpoD5t79.js} +4771 -4702
- package/dist/{esm-D2gTsXEV.js → esm-Bbw_Njjx.js} +575 -575
- package/dist/{esm-AMFssoNp.js → esm-mDQNEFe_.js} +354 -354
- package/dist/{feedback-button-CZNhgq7U.js → feedback-button-M3asLLYJ.js} +37 -37
- package/dist/{flowDiagram-HODETNUW-3EfLrlFb.js → flowDiagram-HODETNUW-BGZ95AzI.js} +2 -2
- package/dist/{formats-27CW_UP4.js → formats-DI7HEVv7.js} +3 -3
- package/dist/{ganttDiagram-EL5Y4UJY-BQT16JSc.js → ganttDiagram-EL5Y4UJY-Dh_4cBJZ.js} +2 -2
- package/dist/{glide-data-editor-DNPChdXf.js → glide-data-editor-BYx8nPvz.js} +370 -368
- package/dist/{glide-utils-DJyqh0EM.js → glide-utils-D98laidb.js} +16 -16
- package/dist/{globals-DcKi3Zmn.js → globals-Cha-b9Oo.js} +3 -3
- package/dist/{highlighted-body-KPVGNVTW-zwjq21tf.js → highlighted-body-KPVGNVTW-3Ziwfz-V.js} +2 -2
- package/dist/{html-to-image-Bf8QMGi4.js → html-to-image-BoZthB4P.js} +668 -622
- package/dist/{infoDiagram-27XIBGKW-DipQoHxl.js → infoDiagram-27XIBGKW-BF0YX70D.js} +1 -1
- package/dist/{ishikawaDiagram-5VMMS53U-DgFMjSGz.js → ishikawaDiagram-5VMMS53U-_itsAAn-.js} +1 -1
- package/dist/{kanban-definition-UXKFOSKX-w1ACVjgl.js → kanban-definition-UXKFOSKX-VNW2Beqh.js} +1 -1
- package/dist/{label-BDKF3Afc.js → label-Qvw1E97W.js} +3 -3
- package/dist/{linear-Cnaq3Tfb.js → linear-DWERh7eI.js} +121 -73
- package/dist/{loader-BQOfjTIJ.js → loader-DOVB0Syl.js} +12 -12
- package/dist/main.js +9822 -7824
- package/dist/{mermaid-CHo49Yv-.js → mermaid-CZ6FrClS.js} +38 -38
- package/dist/mermaid-HWGCJPDP-Du3-HPQA.js +2 -0
- package/dist/{mindmap-definition-YA3MSWOX-CrT0KSfX.js → mindmap-definition-YA3MSWOX-DR4ripvd.js} +1 -1
- package/dist/{number-overlay-editor-GnpmNxbw.js → number-overlay-editor-9juAuy71.js} +3 -3
- package/dist/{objects-CzUgoMIF.js → objects-DCmMvZtn.js} +1 -3
- package/dist/{once-BtE-wKRL.js → once-eG8Vmvjd.js} +1 -1
- package/dist/{pegDiagram-XKGWAZYB-BqvywNJA.js → pegDiagram-XKGWAZYB-CFr3XlGl.js} +2 -2
- package/dist/{pieDiagram-E7YTZNPT-BfxJ_XCc.js → pieDiagram-E7YTZNPT-j91XYSLY.js} +1 -1
- package/dist/precisionRound-DhAzeRcm.js +49 -0
- package/dist/{process-output-BZg56CCb.js → process-output-DLS4Mqg_.js} +4 -4
- package/dist/{quadrantDiagram-AXDQQJYC-Ccw0xMjN.js → quadrantDiagram-AXDQQJYC-Blrm7V7_.js} +1 -1
- package/dist/{railroadDiagram-O6MQD6OU-8vFLVTPu.js → railroadDiagram-O6MQD6OU-Cd47ZV9E.js} +2 -2
- package/dist/{react-vega-BED0DjiB.js → react-vega-C4T9Rb_w.js} +12284 -12270
- package/dist/{requirementDiagram-BXWQKSXE-a_MxGvxe.js → requirementDiagram-BXWQKSXE-eJH6gLtX.js} +1 -1
- package/dist/{reveal-component-B1Wbl-hd.js → reveal-component-DPgpYGKs.js} +14 -14
- package/dist/{select-BButFi-d.js → select-2KOiReNY.js} +536 -457
- package/dist/{sequenceDiagram-WJ2MYXX4-CXFMnxGh.js → sequenceDiagram-WJ2MYXX4-DdfFEIrm.js} +1 -1
- package/dist/{spec-BwarBpUJ.js → spec-h69nC3SI.js} +41 -11
- package/dist/{stateDiagram-D77RDMKH-DQeA_CwI.js → stateDiagram-D77RDMKH-DkjDvip8.js} +2 -2
- package/dist/{stateDiagram-v2-MP3YSRHH-BxxQucm1.js → stateDiagram-v2-MP3YSRHH-DBHACnOo.js} +2 -2
- package/dist/style.css +1 -1
- package/dist/{swimlanes-42K2YHIH-Do6L-cYg.js → swimlanes-42K2YHIH-ogImlOmp.js} +1 -1
- package/dist/{swimlanesDiagram-VR7AAH4N-DUzPvSVU.js → swimlanesDiagram-VR7AAH4N-D6x-zsci.js} +2 -2
- package/dist/{swiper-component-DKntyn8p.js → swiper-component-BkCm-kLg.js} +2 -2
- package/dist/{time-BieKwdYS.js → time-BaMbJs4z.js} +18 -18
- package/dist/{timeline-definition-24CTP7MA-D3c46WM5.js → timeline-definition-24CTP7MA-DQpLtsHD.js} +1 -1
- package/dist/{toDate-UtiwmnH2.js → toDate-CDzoofJo.js} +37 -36
- package/dist/{toast-B9UMEi8u.js → toast-B5t9o6s_.js} +219 -201
- package/dist/{tooltip-BO1REbqs.js → tooltip-s4zZxwKe.js} +325 -301
- package/dist/{use-restore-focus-BEM7sFWl.js → use-restore-focus-BgDTd2tc.js} +1482 -1433
- package/dist/{useAsyncData-Deh5kszT.js → useAsyncData-Bn8SxUqM.js} +15 -14
- package/dist/{useDateFormatter-D8XruNGG.js → useDateFormatter-D3Tkfzej.js} +2 -2
- package/dist/{useDeepCompareMemoize-DXwzRINI.js → useDeepCompareMemoize-CC2tnPCk.js} +1 -1
- package/dist/{useIframeCapabilities-DBETvvPl.js → useIframeCapabilities-CSdWn6NP.js} +1 -1
- package/dist/{useLifecycle-j7D9uD1o.js → useLifecycle-BJlxHqWa.js} +28 -25
- package/dist/{useTheme-CRnjkku0.js → useTheme-DMfQYmlG.js} +301 -297
- package/dist/{vega-component-BeF9dfyO.js → vega-component-CovWHi60.js} +148 -148
- package/dist/{vega-embed-container-BNHE18G9.js → vega-embed-container--LYZqguO.js} +2 -2
- package/dist/{vega-loader.browser-DNST6uVf.js → vega-loader.browser-B9Pz0EGP.js} +298 -507
- package/dist/{vennDiagram-4TSXK5OY-BSZD8JcZ.js → vennDiagram-4TSXK5OY-BD-SL_vq.js} +1 -1
- package/dist/{wardleyDiagram-VM6X3IG4-48cUWkfA.js → wardleyDiagram-VM6X3IG4-BDgJV4ah.js} +1 -1
- package/dist/{xychartDiagram-S5SC5T6Z-CswYgYeu.js → xychartDiagram-S5SC5T6Z-1hIHN6Rl.js} +2 -2
- package/package.json +16 -16
- package/src/__mocks__/document.tsx +54 -0
- package/src/__mocks__/notebook.ts +2 -1
- package/src/__mocks__/requests.ts +0 -3
- 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/ai-config.tsx +7 -2
- package/src/components/app-config/user-config-form.tsx +35 -0
- package/src/components/chat/__tests__/message-queue.test.tsx +17 -0
- 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/blocks.tsx +3 -2
- package/src/components/chat/acp/session-tabs.tsx +8 -3
- package/src/components/chat/chat-components.tsx +2 -0
- package/src/components/chat/chat-panel.tsx +12 -11
- package/src/components/chat/chat-utils.ts +4 -8
- 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-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 +55 -42
- package/src/components/datasources/utils.ts +32 -23
- package/src/components/debugger/debugger-code.tsx +5 -0
- 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 +2 -6
- 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 -13
- package/src/components/editor/__tests__/dynamic-favicon.test.tsx +111 -18
- package/src/components/editor/__tests__/output-persistence.test.tsx +6 -1
- 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-modal.test.tsx +34 -8
- package/src/components/editor/actions/__tests__/pair-with-agent.test.tsx +2 -6
- package/src/components/editor/actions/name-cell-input.tsx +4 -3
- package/src/components/editor/actions/pair-with-agent-commands.ts +2 -2
- package/src/components/editor/actions/pair-with-agent-modal.tsx +19 -16
- package/src/components/editor/actions/useCellActionButton.tsx +20 -26
- package/src/components/editor/actions/useNotebookActions.tsx +14 -19
- package/src/components/editor/actions/useRestartKernel.tsx +1 -1
- package/src/components/editor/actions/useSetCodeVisibility.ts +10 -11
- package/src/components/editor/actions/useSetOutputsExpanded.ts +13 -18
- package/src/components/editor/ai/add-cell-with-ai.tsx +3 -3
- package/src/components/editor/ai/ai-completion-editor.tsx +1 -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/app-container.tsx +1 -1
- package/src/components/editor/boundary/__tests__/ErrorBoundary.test.tsx +1 -1
- 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 +2 -2
- package/src/components/editor/cell/StagedAICell.tsx +10 -2
- package/src/components/editor/cell/StopButton.tsx +2 -2
- package/src/components/editor/cell/__tests__/StagedAICell.test.tsx +3 -1
- package/src/components/editor/cell/__tests__/useShouldShowInterrupt.test.ts +39 -0
- package/src/components/editor/cell/code/__tests__/language-toggle.test.tsx +54 -0
- package/src/components/editor/cell/code/cell-editor.tsx +22 -36
- package/src/components/editor/cell/code/language-toggle.tsx +8 -7
- package/src/components/editor/cell/collapse.tsx +5 -3
- 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 +2 -5
- package/src/components/editor/cell/useShouldShowInterrupt.ts +2 -12
- package/src/components/editor/cell/useSplitCell.tsx +2 -1
- package/src/components/editor/chrome/components/__tests__/feedback-button.test.tsx +1 -1
- package/src/components/editor/chrome/components/feedback-button.tsx +1 -1
- 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/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/secrets-panel.tsx +1 -0
- package/src/components/editor/chrome/panels/snippets-panel.tsx +10 -12
- package/src/components/editor/chrome/wrapper/__tests__/attachment-status.test.tsx +9 -18
- 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 +61 -2
- 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 -0
- package/src/components/editor/chrome/wrapper/pending-ai-cells.tsx +12 -2
- package/src/components/editor/chrome/wrapper/storage.ts +1 -1
- package/src/components/editor/columns/sortable-column.tsx +1 -1
- package/src/components/editor/connections/components.tsx +5 -10
- package/src/components/editor/controls/Controls.tsx +3 -3
- 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 +9 -23
- 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__/status.test.tsx +5 -3
- package/src/components/editor/header/app-header.tsx +1 -1
- package/src/components/editor/header/status.tsx +40 -20
- package/src/components/editor/links/__tests__/cell-link.test.tsx +148 -0
- package/src/components/editor/links/cell-link.tsx +16 -6
- package/src/components/editor/navigation/__tests__/clipboard.test.ts +60 -38
- package/src/components/editor/navigation/__tests__/navigation.test.ts +73 -64
- package/src/components/editor/navigation/clipboard.ts +12 -11
- package/src/components/editor/navigation/focus-utils.ts +4 -4
- package/src/components/editor/navigation/multi-cell-action-toolbar.tsx +11 -20
- package/src/components/editor/navigation/navigation.ts +20 -28
- package/src/components/editor/notebook-banner.tsx +1 -0
- package/src/components/editor/notebook-cell.tsx +19 -13
- 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/__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/cell-array.tsx +10 -17
- package/src/components/editor/renderers/grid-layout/grid-layout.tsx +12 -6
- package/src/components/editor/renderers/vertical-layout/sidebar/toggle.tsx +7 -1
- 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 +4 -8
- package/src/components/mcp/mcp-status-indicator.tsx +1 -1
- package/src/components/pages/__tests__/home-page.test.tsx +116 -0
- package/src/components/pages/edit-page.tsx +32 -17
- package/src/components/pages/home-page.tsx +164 -91
- package/src/components/scratchpad/scratchpad.test.tsx +97 -0
- package/src/components/scratchpad/scratchpad.tsx +20 -10
- package/src/components/slides/__tests__/minimap-actions.test.tsx +9 -25
- package/src/components/slides/minimap.tsx +7 -3
- package/src/components/slides/reveal-component.tsx +4 -2
- package/src/components/slides/slide-cell-view.tsx +4 -4
- package/src/components/slides/slide-form.tsx +1 -0
- package/src/components/sort/SortableCellsProvider.tsx +2 -1
- package/src/components/tracing/tracing-keyboard.test.tsx +85 -0
- package/src/components/tracing/tracing.tsx +45 -41
- package/src/components/ui/__tests__/draggable-popover.test.tsx +24 -0
- 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/range-slider.tsx +22 -9
- package/src/core/ai/__tests__/staged-cells.test.ts +26 -25
- package/src/core/ai/context/providers/datasource.ts +6 -2
- package/src/core/ai/staged-cells.ts +15 -18
- package/src/core/ai/tools/__tests__/edit-notebook-tool.test.ts +5 -17
- package/src/core/ai/tools/__tests__/run-cells-tool.test.ts +2 -2
- package/src/core/ai/tools/base.ts +18 -9
- package/src/core/ai/tools/edit-notebook-tool.ts +74 -69
- package/src/core/ai/tools/registry.ts +13 -8
- package/src/core/ai/tools/sample-tool.ts +6 -7
- package/src/core/cells/__tests__/__snapshots__/cells.test.ts.snap +4 -0
- package/src/core/cells/__tests__/actions.test.ts +474 -34
- package/src/core/cells/__tests__/add-missing-import.test.ts +7 -8
- package/src/core/cells/__tests__/cell.test.ts +39 -0
- package/src/core/cells/__tests__/cells.test.ts +260 -1165
- package/src/core/cells/__tests__/collapseConsoleOutputs.test.ts +54 -0
- package/src/core/cells/__tests__/document.test.ts +414 -0
- package/src/core/cells/__tests__/flush-document.test.ts +40 -0
- package/src/core/cells/__tests__/notebook-outline.test.ts +114 -0
- package/src/core/cells/__tests__/outputs.test.tsx +71 -53
- package/src/core/cells/__tests__/session.test.ts +117 -36
- package/src/core/cells/__tests__/with-document-save.test.ts +67 -0
- package/src/core/cells/actions.ts +391 -3
- package/src/core/cells/add-missing-import.ts +46 -42
- package/src/core/cells/cell.ts +14 -3
- package/src/core/cells/cells.ts +99 -599
- package/src/core/cells/columns.ts +38 -0
- package/src/core/cells/document.ts +392 -0
- package/src/core/cells/outputs.ts +12 -28
- package/src/core/cells/pending-delete-service.ts +2 -6
- package/src/core/cells/session.ts +1 -1
- package/src/core/cells/types.ts +22 -1
- package/src/core/codemirror/__tests__/setup.test.ts +29 -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 +42 -1
- package/src/core/codemirror/cells/extensions.ts +27 -9
- package/src/core/codemirror/cells/state.ts +1 -1
- package/src/core/codemirror/format.ts +6 -5
- 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 +16 -10
- 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/notebook-lsp.ts +6 -5
- package/src/core/codemirror/readonly/__tests__/extension.test.ts +1 -1
- package/src/core/codemirror/readonly/extension.ts +2 -2
- package/src/core/codemirror/rtc/extension.ts +24 -13
- package/src/core/codemirror/rtc/loro/awareness.ts +34 -19
- package/src/core/codemirror/rtc/loro/sync.ts +1 -0
- package/src/core/codemirror/utils.ts +1 -0
- package/src/core/config/__tests__/config-schema.test.ts +5 -3
- package/src/core/config/config-schema.ts +3 -0
- 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/edit-app.tsx +19 -23
- package/src/core/errors/error-entries.ts +3 -0
- 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/islands/__tests__/bootstrap.test.ts +73 -43
- package/src/core/islands/__tests__/bridge.test.ts +72 -25
- package/src/core/islands/bootstrap.ts +46 -53
- package/src/core/islands/bridge.ts +74 -23
- package/src/core/islands/components/__tests__/IslandControls.test.tsx +7 -5
- 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 -153
- package/src/core/kernel/handlers.ts +18 -59
- package/src/core/network/__tests__/connection.test.ts +1 -1
- package/src/core/network/__tests__/requests-lazy.test.ts +1 -3
- package/src/core/network/connection-notice.ts +1 -1
- package/src/core/network/connection.ts +1 -1
- package/src/core/network/requests-lazy.ts +1 -4
- package/src/core/network/requests-network.ts +0 -25
- package/src/core/network/requests-static.ts +0 -3
- package/src/core/network/requests-toasting.tsx +0 -3
- package/src/core/network/types.ts +0 -12
- package/src/core/network/useConnectionNotice.ts +8 -2
- package/src/core/notebook/attachments.ts +38 -0
- package/src/core/notebook/document/__tests__/codemirror.test.ts +552 -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__/hold.test.ts +88 -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 +105 -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 +418 -0
- package/src/core/notebook/index.ts +18 -0
- package/src/core/notebook/replica/AGENTS.md +11 -0
- package/src/core/notebook/replica/__tests__/attachments.test.ts +56 -0
- package/src/core/notebook/replica/__tests__/document.test.ts +126 -0
- package/src/core/notebook/replica/__tests__/fixtures.ts +79 -0
- package/src/core/notebook/replica/__tests__/replica.test.ts +550 -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 +13 -0
- package/src/core/notebook/replica/replica.ts +286 -0
- package/src/core/notebook/replica/resources/attachments.ts +22 -0
- package/src/core/notebook/replica/resources/document.ts +101 -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 +48 -51
- package/src/core/runtime/__tests__/adapter.test.ts +1 -1
- package/src/core/runtime/__tests__/createWsUrl.test.ts +77 -7
- package/src/core/runtime/__tests__/runtime.test.ts +32 -58
- package/src/core/runtime/adapter.ts +1 -1
- package/src/core/runtime/config.ts +2 -2
- package/src/core/runtime/runtime.ts +38 -42
- package/src/core/runtime/types.ts +0 -2
- package/src/core/saving/filename.ts +1 -1
- package/src/core/saving/save-component.tsx +10 -4
- package/src/core/saving/useAutoSave.ts +1 -1
- package/src/core/session/__tests__/backend.test.ts +235 -0
- package/src/core/session/__tests__/useNotebookReplica.hook.test.tsx +183 -0
- package/src/core/session/__tests__/useNotebookSession.hook.test.tsx +663 -0
- package/src/core/session/active-notebook.ts +11 -0
- package/src/core/session/backend.ts +125 -0
- package/src/core/{websocket → session}/types.ts +2 -2
- package/src/core/session/useNotebookReplica.ts +72 -0
- package/src/core/{websocket → session}/useNotebookSession.tsx +74 -68
- 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 +175 -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 +84 -0
- package/src/core/transports/wasm.ts +97 -0
- package/src/core/wasm/__tests__/bridge.test.ts +213 -50
- package/src/core/wasm/__tests__/worker.test.ts +187 -0
- package/src/core/wasm/bridge.ts +75 -69
- 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 +29 -18
- package/src/core/wasm/worker/worker.ts +88 -44
- package/src/css/globals.css +66 -22
- 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 +1 -5
- package/src/plugins/__tests__/plugin-object-schemas.test.ts +104 -0
- package/src/plugins/core/registerReactComponent.tsx +1 -1
- package/src/plugins/impl/CodeEditorPlugin.tsx +1 -1
- package/src/plugins/impl/DataEditorPlugin.tsx +1 -1
- 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__/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 +14 -11
- package/src/plugins/impl/code/any-language-editor.tsx +2 -2
- package/src/plugins/impl/data-editor/glide-data-editor.tsx +8 -5
- package/src/plugins/impl/data-editor/glide-utils.ts +3 -1
- 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 +43 -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/RoutesPlugin.tsx +1 -1
- package/src/stories/__tests__/editor-story.test.tsx +33 -0
- package/src/stories/button.stories.tsx +1 -0
- package/src/stories/cell.stories.tsx +1 -1
- 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 +1 -1
- package/src/stories/runtime-story.tsx +23 -16
- package/src/stories/select.stories.tsx +2 -2
- package/src/stories/switchable-multi-select.stories.tsx +1 -1
- 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} +29 -0
- 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 +53 -26
- package/src/utils/maps.ts +0 -3
- package/src/utils/numbers.ts +79 -18
- package/src/utils/objects.ts +4 -9
- package/src/utils/once.ts +19 -19
- package/src/utils/tracer.ts +9 -5
- package/src/utils/zod-utils.ts +1 -3
- package/dist/any-language-editor-DZ_YTVus.js +0 -76
- package/dist/assets/__vite-browser-external-BXYkiFsk.js +0 -1
- package/dist/assets/worker-HPY9fbhz.js +0 -114
- package/dist/mermaid-HWGCJPDP-ByCsZnYF.js +0 -2
- package/dist/precisionRound-DMIVQrt2.js +0 -97
- package/src/core/attachments/state.ts +0 -21
- 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/host/AGENTS.md +0 -6
- package/src/core/host/__tests__/events.test.ts +0 -46
- package/src/core/host/__tests__/notebook-client.test.ts +0 -191
- package/src/core/host/__tests__/protocol.test.ts +0 -214
- package/src/core/host/connection.ts +0 -81
- package/src/core/host/events.ts +0 -60
- package/src/core/host/notebook-client.ts +0 -226
- package/src/core/host/protocol.ts +0 -1943
- 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 -140
- package/src/core/websocket/__tests__/useNotebookSession.hook.test.tsx +0 -883
- 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 -80
- /package/src/{core/attachments/toast.ts → components/editor/agent-toast.ts} +0 -0
- /package/src/core/{websocket → session}/connection-utils.ts +0 -0
|
@@ -7,7 +7,7 @@ import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
|
7
7
|
import { cellId } from "@/__tests__/branded";
|
|
8
8
|
import { CellId } from "@/core/cells/ids";
|
|
9
9
|
import { getCellEditorView } from "../../cells/cells";
|
|
10
|
-
import {
|
|
10
|
+
import { prepareCellCodeUpdate } from "../../codemirror/language/cell-code";
|
|
11
11
|
import {
|
|
12
12
|
stagedAICellsAtom,
|
|
13
13
|
stagedGenerationInProgressAtom,
|
|
@@ -21,7 +21,7 @@ const { stagedGenerationAtom, createActions, reducer, initialState } =
|
|
|
21
21
|
visibleForTesting;
|
|
22
22
|
|
|
23
23
|
// Mock the dependencies
|
|
24
|
-
const
|
|
24
|
+
const mockCreateCell = vi.fn();
|
|
25
25
|
const mockUpdateCellCode = vi.fn();
|
|
26
26
|
const mockDeleteCellCallback = vi.fn();
|
|
27
27
|
|
|
@@ -34,14 +34,16 @@ const mockCellHandle = {
|
|
|
34
34
|
},
|
|
35
35
|
};
|
|
36
36
|
|
|
37
|
+
vi.mock("../../cells/actions", () => ({
|
|
38
|
+
useCellActions: () => ({
|
|
39
|
+
createCell: mockCreateCell,
|
|
40
|
+
updateCellCode: mockUpdateCellCode,
|
|
41
|
+
}),
|
|
42
|
+
}));
|
|
37
43
|
vi.mock("../../cells/cells", async () => {
|
|
38
44
|
const { atom } = await import("jotai");
|
|
39
45
|
return {
|
|
40
46
|
notebookAtom: atom({ cellData: {}, cellIds: { inOrderIds: [] } }),
|
|
41
|
-
useCellActions: () => ({
|
|
42
|
-
createNewCell: mockCreateNewCell,
|
|
43
|
-
updateCellCode: mockUpdateCellCode,
|
|
44
|
-
}),
|
|
45
47
|
cellHandleAtom: vi.fn(() => ({
|
|
46
48
|
read: vi.fn(() => mockCellHandle),
|
|
47
49
|
})),
|
|
@@ -57,8 +59,8 @@ vi.mock("@/core/network/requests", () => ({
|
|
|
57
59
|
getRequestClient: () => ({ sendRun: vi.fn() }),
|
|
58
60
|
}));
|
|
59
61
|
|
|
60
|
-
vi.mock("../../codemirror/language/
|
|
61
|
-
|
|
62
|
+
vi.mock("../../codemirror/language/cell-code", () => ({
|
|
63
|
+
prepareCellCodeUpdate: vi.fn(() => ({ effects: [] })),
|
|
62
64
|
}));
|
|
63
65
|
|
|
64
66
|
// Mock CellId.create
|
|
@@ -261,11 +263,9 @@ describe("staged-cells", () => {
|
|
|
261
263
|
const returnedCellId = result.current.createStagedCell(testCode);
|
|
262
264
|
|
|
263
265
|
expect(returnedCellId).toBe(mockCellId);
|
|
264
|
-
expect(
|
|
265
|
-
cellId: "__end__",
|
|
266
|
+
expect(mockCreateCell).toHaveBeenCalledWith({
|
|
266
267
|
code: testCode,
|
|
267
|
-
|
|
268
|
-
newCellId: mockCellId,
|
|
268
|
+
id: mockCellId,
|
|
269
269
|
});
|
|
270
270
|
});
|
|
271
271
|
|
|
@@ -330,7 +330,7 @@ describe("staged-cells", () => {
|
|
|
330
330
|
|
|
331
331
|
// Verify it was created and added
|
|
332
332
|
expect(createdCellId).toBe(mockCellId);
|
|
333
|
-
expect(
|
|
333
|
+
expect(mockCreateCell).toHaveBeenCalled();
|
|
334
334
|
|
|
335
335
|
let state = store.get(stagedAICellsAtom);
|
|
336
336
|
expect(state.has(mockCellId)).toBe(true);
|
|
@@ -401,8 +401,8 @@ describe("staged cell generation", () => {
|
|
|
401
401
|
result.current.beginStagedCellGeneration();
|
|
402
402
|
|
|
403
403
|
// No cell or cell update should have been called
|
|
404
|
-
expect(
|
|
405
|
-
expect(
|
|
404
|
+
expect(mockCreateCell).not.toHaveBeenCalled();
|
|
405
|
+
expect(prepareCellCodeUpdate).not.toHaveBeenCalled();
|
|
406
406
|
expect(store.get(stagedGenerationInProgressAtom)).toBe(true);
|
|
407
407
|
});
|
|
408
408
|
|
|
@@ -610,11 +610,9 @@ describe("staged cell generation", () => {
|
|
|
610
610
|
},
|
|
611
611
|
});
|
|
612
612
|
|
|
613
|
-
expect(
|
|
614
|
-
cellId: "__end__",
|
|
613
|
+
expect(mockCreateCell).toHaveBeenCalledWith({
|
|
615
614
|
code: "print('```')",
|
|
616
|
-
|
|
617
|
-
newCellId: "mock-cell-id",
|
|
615
|
+
id: "mock-cell-id",
|
|
618
616
|
});
|
|
619
617
|
});
|
|
620
618
|
|
|
@@ -636,16 +634,16 @@ describe("staged cell generation", () => {
|
|
|
636
634
|
},
|
|
637
635
|
});
|
|
638
636
|
|
|
639
|
-
expect(
|
|
637
|
+
expect(mockCreateCell).toHaveBeenCalledWith(
|
|
640
638
|
expect.objectContaining({
|
|
641
639
|
code: "value = 1",
|
|
642
|
-
|
|
640
|
+
id: "first-cell",
|
|
643
641
|
}),
|
|
644
642
|
);
|
|
645
|
-
expect(
|
|
643
|
+
expect(mockCreateCell).toHaveBeenCalledWith(
|
|
646
644
|
expect.objectContaining({
|
|
647
645
|
code: "value",
|
|
648
|
-
|
|
646
|
+
id: "second-cell",
|
|
649
647
|
}),
|
|
650
648
|
);
|
|
651
649
|
});
|
|
@@ -683,10 +681,13 @@ describe("staged cell generation", () => {
|
|
|
683
681
|
},
|
|
684
682
|
});
|
|
685
683
|
|
|
686
|
-
expect(
|
|
684
|
+
expect(mockCreateCell).toHaveBeenCalledTimes(2);
|
|
687
685
|
expect(store.get(stagedAICellsAtom).has(cellId("first-cell"))).toBe(true);
|
|
688
686
|
expect(store.get(stagedAICellsAtom).has(cellId("second-cell"))).toBe(true);
|
|
689
|
-
expect(
|
|
687
|
+
expect(prepareCellCodeUpdate).toHaveBeenCalledTimes(2);
|
|
688
|
+
expect(
|
|
689
|
+
mockCellHandle.current.editorViewOrNull.dispatch,
|
|
690
|
+
).toHaveBeenCalledTimes(2);
|
|
690
691
|
});
|
|
691
692
|
|
|
692
693
|
it("should update notebook state when the cell editor is not mounted", () => {
|
|
@@ -98,8 +98,12 @@ export class DatasourceContextProvider extends AIContextProvider<DatasourceConte
|
|
|
98
98
|
public formatContext(item: DatasourceContextItem): string {
|
|
99
99
|
const data = item.data;
|
|
100
100
|
// Remove certain fields that are not needed in the context
|
|
101
|
-
const {
|
|
102
|
-
|
|
101
|
+
const {
|
|
102
|
+
name,
|
|
103
|
+
display_name: _displayName,
|
|
104
|
+
source: _source,
|
|
105
|
+
...filteredDatasource
|
|
106
|
+
} = data.connection;
|
|
103
107
|
|
|
104
108
|
let datasource = filteredDatasource;
|
|
105
109
|
const isInternalEngine = INTERNAL_SQL_ENGINES.has(name as ConnectionName);
|
|
@@ -14,12 +14,9 @@ import {
|
|
|
14
14
|
notebookCellsCompletionSchema,
|
|
15
15
|
} from "./completion-output";
|
|
16
16
|
import { maybeAddMarimoImport } from "../cells/add-missing-import";
|
|
17
|
-
import {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
useCellActions,
|
|
21
|
-
} from "../cells/cells";
|
|
22
|
-
import { updateEditorCodeFromPython } from "../codemirror/language/utils";
|
|
17
|
+
import { getCellEditorView } from "../cells/cells";
|
|
18
|
+
import { type CreateCell, useCellActions } from "../cells/actions";
|
|
19
|
+
import { prepareCellCodeUpdate } from "../codemirror/language/cell-code";
|
|
23
20
|
import type { JotaiStore } from "../state/jotai";
|
|
24
21
|
import type { EditType } from "./tools/edit-notebook-tool";
|
|
25
22
|
|
|
@@ -98,18 +95,13 @@ interface UpdateStagedCellAction {
|
|
|
98
95
|
/** Manage staged cells without assuming which AI workflow owns them. */
|
|
99
96
|
export function useStagedCells(store: JotaiStore) {
|
|
100
97
|
const { addStagedCell, removeStagedCell } = useStagedAICellsActions();
|
|
101
|
-
const {
|
|
98
|
+
const { updateCellCode, createCell } = useCellActions();
|
|
102
99
|
const deleteCellCallback = useDeleteCellCallback();
|
|
103
100
|
|
|
104
101
|
const createStagedCell = (code: string): CellId => {
|
|
105
102
|
const newCellId = CellId.create();
|
|
106
103
|
addStagedCell({ cellId: newCellId, edit: { type: "add_cell" } });
|
|
107
|
-
|
|
108
|
-
cellId: "__end__",
|
|
109
|
-
code,
|
|
110
|
-
before: false,
|
|
111
|
-
newCellId: newCellId,
|
|
112
|
-
});
|
|
104
|
+
createCell({ code, id: newCellId });
|
|
113
105
|
return newCellId;
|
|
114
106
|
};
|
|
115
107
|
|
|
@@ -124,7 +116,12 @@ export function useStagedCells(store: JotaiStore) {
|
|
|
124
116
|
|
|
125
117
|
const editorView = getCellEditorView(cellId);
|
|
126
118
|
if (editorView) {
|
|
127
|
-
|
|
119
|
+
const update = prepareCellCodeUpdate(editorView.state, code, {
|
|
120
|
+
initialize: true,
|
|
121
|
+
});
|
|
122
|
+
if (update) {
|
|
123
|
+
editorView.dispatch(update);
|
|
124
|
+
}
|
|
128
125
|
} else {
|
|
129
126
|
updateCellCode({ cellId, code, formattingChange: false });
|
|
130
127
|
}
|
|
@@ -147,7 +144,7 @@ export function useStagedCells(store: JotaiStore) {
|
|
|
147
144
|
/** Owns the lifecycle of cells created by one structured completion flow. */
|
|
148
145
|
export function useStagedCellGeneration(store: JotaiStore) {
|
|
149
146
|
const stagedCellActions = useStagedCells(store);
|
|
150
|
-
const {
|
|
147
|
+
const { createCell } = useCellActions();
|
|
151
148
|
const ownedGeneration = useRef<OwnedStagedGeneration | null>(null);
|
|
152
149
|
// Ownership lives in a ref, so subscribe to its backing atoms to rerender
|
|
153
150
|
// consumers when completion or per-cell acceptance changes.
|
|
@@ -175,7 +172,7 @@ export function useStagedCellGeneration(store: JotaiStore) {
|
|
|
175
172
|
status: "in_progress",
|
|
176
173
|
reconciler: new StagedCellReconciler({
|
|
177
174
|
...stagedCellActions,
|
|
178
|
-
|
|
175
|
+
createCell,
|
|
179
176
|
}),
|
|
180
177
|
};
|
|
181
178
|
store.set(stagedGenerationAtom, {
|
|
@@ -297,7 +294,7 @@ interface StagedCellReconcilerActions {
|
|
|
297
294
|
deleteStagedCell: (cellId: CellId) => void;
|
|
298
295
|
removeStagedCell: (cellId: CellId) => void;
|
|
299
296
|
addStagedCell: (payload: { cellId: CellId; edit: Edit }) => void;
|
|
300
|
-
|
|
297
|
+
createCell: CreateCell;
|
|
301
298
|
}
|
|
302
299
|
|
|
303
300
|
class StagedCellReconciler {
|
|
@@ -386,7 +383,7 @@ class StagedCellReconciler {
|
|
|
386
383
|
|
|
387
384
|
const cellId = maybeAddMarimoImport({
|
|
388
385
|
autoInstantiate: false,
|
|
389
|
-
|
|
386
|
+
createCell: this.actions.createCell,
|
|
390
387
|
fromCellId: this.createdCells[0]?.cellId,
|
|
391
388
|
before: true,
|
|
392
389
|
});
|
|
@@ -8,7 +8,6 @@ import { MockNotebook } from "@/__mocks__/notebook";
|
|
|
8
8
|
import { cellId } from "@/__tests__/branded";
|
|
9
9
|
import { notebookAtom } from "@/core/cells/cells";
|
|
10
10
|
import type { CellId } from "@/core/cells/ids";
|
|
11
|
-
import { updateEditorCodeFromPython } from "@/core/codemirror/language/utils";
|
|
12
11
|
import { OverridingHotkeyProvider } from "@/core/hotkeys/hotkeys";
|
|
13
12
|
import { MultiColumn } from "@/utils/id-tree";
|
|
14
13
|
import { cellConfigExtension } from "../../../codemirror/config/extension";
|
|
@@ -22,11 +21,6 @@ vi.mock("@/components/editor/links/cell-link", () => ({
|
|
|
22
21
|
scrollAndHighlightCell: vi.fn(),
|
|
23
22
|
}));
|
|
24
23
|
|
|
25
|
-
// Mock updateEditorCodeFromPython
|
|
26
|
-
vi.mock("@/core/codemirror/language/utils", () => ({
|
|
27
|
-
updateEditorCodeFromPython: vi.fn(),
|
|
28
|
-
}));
|
|
29
|
-
|
|
30
24
|
function createMockEditorView(code: string): EditorView {
|
|
31
25
|
return new EditorView({
|
|
32
26
|
state: EditorState.create({
|
|
@@ -70,7 +64,7 @@ describe("EditNotebookTool", () => {
|
|
|
70
64
|
let cellId3: CellId;
|
|
71
65
|
let toolContext: {
|
|
72
66
|
addStagedCell: ReturnType<typeof vi.fn>;
|
|
73
|
-
|
|
67
|
+
createCell: ReturnType<typeof vi.fn>;
|
|
74
68
|
prepareForRun: ReturnType<typeof vi.fn>;
|
|
75
69
|
sendRun: ReturnType<typeof vi.fn>;
|
|
76
70
|
store: ReturnType<typeof getDefaultStore>;
|
|
@@ -87,7 +81,7 @@ describe("EditNotebookTool", () => {
|
|
|
87
81
|
const current = store.get(stagedAICellsAtom);
|
|
88
82
|
store.set(stagedAICellsAtom, new Map(current).set(cellId, edit));
|
|
89
83
|
}),
|
|
90
|
-
|
|
84
|
+
createCell: vi.fn(),
|
|
91
85
|
prepareForRun: vi.fn(),
|
|
92
86
|
sendRun: vi.fn().mockResolvedValue(null),
|
|
93
87
|
store,
|
|
@@ -140,10 +134,7 @@ describe("EditNotebookTool", () => {
|
|
|
140
134
|
);
|
|
141
135
|
|
|
142
136
|
expect(result.status).toBe("success");
|
|
143
|
-
expect(
|
|
144
|
-
editorView,
|
|
145
|
-
newCode,
|
|
146
|
-
);
|
|
137
|
+
expect(editorView.state.doc.toString()).toBe(newCode);
|
|
147
138
|
|
|
148
139
|
// Check that cell was staged
|
|
149
140
|
const stagedCells = store.get(stagedAICellsAtom);
|
|
@@ -166,10 +157,7 @@ describe("EditNotebookTool", () => {
|
|
|
166
157
|
);
|
|
167
158
|
|
|
168
159
|
expect(result2.status).toBe("success");
|
|
169
|
-
expect(
|
|
170
|
-
editorView,
|
|
171
|
-
"x = 3",
|
|
172
|
-
);
|
|
160
|
+
expect(editorView.state.doc.toString()).toBe("x = 3");
|
|
173
161
|
|
|
174
162
|
const stagedCells2 = store.get(stagedAICellsAtom);
|
|
175
163
|
expect(stagedCells2.has(cellId1)).toBe(true);
|
|
@@ -206,7 +194,7 @@ describe("EditNotebookTool", () => {
|
|
|
206
194
|
|
|
207
195
|
// Should NOT stage the cell or update the editor
|
|
208
196
|
expect(toolContext.addStagedCell).not.toHaveBeenCalled();
|
|
209
|
-
expect(
|
|
197
|
+
expect(editorView.state.doc.toString()).toBe(code);
|
|
210
198
|
|
|
211
199
|
// No staged cells
|
|
212
200
|
const stagedCells = store.get(stagedAICellsAtom);
|
|
@@ -29,7 +29,7 @@ describe("RunStaleCellsTool", () => {
|
|
|
29
29
|
let cellId3: CellId;
|
|
30
30
|
let toolContext: {
|
|
31
31
|
addStagedCell: ReturnType<typeof vi.fn>;
|
|
32
|
-
|
|
32
|
+
createCell: ReturnType<typeof vi.fn>;
|
|
33
33
|
prepareForRun: ReturnType<typeof vi.fn>;
|
|
34
34
|
sendRun: ReturnType<typeof vi.fn>;
|
|
35
35
|
store: ReturnType<typeof getDefaultStore>;
|
|
@@ -39,7 +39,7 @@ describe("RunStaleCellsTool", () => {
|
|
|
39
39
|
store = getDefaultStore();
|
|
40
40
|
toolContext = {
|
|
41
41
|
addStagedCell: vi.fn(),
|
|
42
|
-
|
|
42
|
+
createCell: vi.fn(),
|
|
43
43
|
prepareForRun: vi.fn(),
|
|
44
44
|
sendRun: vi.fn().mockResolvedValue(null),
|
|
45
45
|
store,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
3
|
import { z } from "zod";
|
|
4
|
-
import type {
|
|
4
|
+
import type { CreateCell } from "@/core/cells/actions";
|
|
5
5
|
import type { CellId } from "@/core/cells/ids";
|
|
6
6
|
import type { ExecuteCellsRequest } from "@/core/network/types";
|
|
7
7
|
import type { JotaiStore } from "@/core/state/jotai";
|
|
@@ -20,9 +20,11 @@ export type StatusValue = "success" | "error" | "warning";
|
|
|
20
20
|
* @example
|
|
21
21
|
* throw new ToolExecutionError(
|
|
22
22
|
* "Failed to fetch data",
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
23
|
+
* {
|
|
24
|
+
* code: "FETCH_ERROR",
|
|
25
|
+
* isRetryable: true,
|
|
26
|
+
* suggestedFix: "Check your network connection",
|
|
27
|
+
* }
|
|
26
28
|
* );
|
|
27
29
|
*/
|
|
28
30
|
export class ToolExecutionError extends Error {
|
|
@@ -33,10 +35,17 @@ export class ToolExecutionError extends Error {
|
|
|
33
35
|
|
|
34
36
|
public constructor(
|
|
35
37
|
message: string,
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
{
|
|
39
|
+
code = "TOOL_ERROR",
|
|
40
|
+
isRetryable = false,
|
|
41
|
+
suggestedFix,
|
|
42
|
+
meta,
|
|
43
|
+
}: {
|
|
44
|
+
code?: string;
|
|
45
|
+
isRetryable?: boolean;
|
|
46
|
+
suggestedFix?: string;
|
|
47
|
+
meta?: Record<string, unknown>;
|
|
48
|
+
} = {},
|
|
40
49
|
) {
|
|
41
50
|
super(message);
|
|
42
51
|
this.name = "ToolExecutionError";
|
|
@@ -104,7 +113,7 @@ export interface ToolDescription {
|
|
|
104
113
|
export interface ToolNotebookContext {
|
|
105
114
|
store: JotaiStore;
|
|
106
115
|
addStagedCell: (payload: { cellId: CellId; edit: Edit }) => void;
|
|
107
|
-
|
|
116
|
+
createCell: CreateCell;
|
|
108
117
|
prepareForRun: (payload: { cellId: CellId }) => void;
|
|
109
118
|
sendRun: (request: ExecuteCellsRequest) => Promise<null>;
|
|
110
119
|
}
|
|
@@ -3,13 +3,10 @@
|
|
|
3
3
|
import type { EditorView } from "@codemirror/view";
|
|
4
4
|
import { z } from "zod";
|
|
5
5
|
import { scrollAndHighlightCell } from "@/components/editor/links/cell-link";
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
type NotebookState,
|
|
9
|
-
notebookAtom,
|
|
10
|
-
} from "@/core/cells/cells";
|
|
6
|
+
import { type NotebookState, notebookAtom } from "@/core/cells/cells";
|
|
7
|
+
import type { CreateCellOptions } from "@/core/cells/actions";
|
|
11
8
|
import { CellId } from "@/core/cells/ids";
|
|
12
|
-
import {
|
|
9
|
+
import { prepareCellCodeUpdate } from "@/core/codemirror/language/cell-code";
|
|
13
10
|
import type { CellColumnId } from "@/utils/id-tree";
|
|
14
11
|
import { stagedAICellsAtom } from "../staged-cells";
|
|
15
12
|
import {
|
|
@@ -86,7 +83,7 @@ export class EditNotebookTool implements AiTool<
|
|
|
86
83
|
{ edit }: EditNotebookInput,
|
|
87
84
|
toolContext: ToolNotebookContext,
|
|
88
85
|
): Promise<ToolOutputBase> => {
|
|
89
|
-
const { addStagedCell,
|
|
86
|
+
const { addStagedCell, createCell, store } = toolContext;
|
|
90
87
|
|
|
91
88
|
switch (edit.type) {
|
|
92
89
|
case "update_cell": {
|
|
@@ -94,19 +91,17 @@ export class EditNotebookTool implements AiTool<
|
|
|
94
91
|
const cellId = position.cellId as CellId | undefined;
|
|
95
92
|
|
|
96
93
|
if (!cellId) {
|
|
97
|
-
throw new ToolExecutionError(
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
);
|
|
94
|
+
throw new ToolExecutionError("Cell ID is required for update_cell", {
|
|
95
|
+
code: "CELL_ID_REQUIRED_FOR_UPDATE_CELL",
|
|
96
|
+
isRetryable: true,
|
|
97
|
+
suggestedFix: "Provide a cell ID to update",
|
|
98
|
+
});
|
|
103
99
|
} else if (!code) {
|
|
104
|
-
throw new ToolExecutionError(
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
);
|
|
100
|
+
throw new ToolExecutionError("Code is required for update_cell", {
|
|
101
|
+
code: "CODE_REQUIRED_FOR_UPDATE_CELL",
|
|
102
|
+
isRetryable: true,
|
|
103
|
+
suggestedFix: "Provide the new code to update the cell",
|
|
104
|
+
});
|
|
110
105
|
}
|
|
111
106
|
|
|
112
107
|
const notebook = store.get(notebookAtom);
|
|
@@ -119,7 +114,12 @@ export class EditNotebookTool implements AiTool<
|
|
|
119
114
|
|
|
120
115
|
// If previous edit was from a new cell, just replace editor code with the new code
|
|
121
116
|
if (existingStagedCell?.type === "add_cell") {
|
|
122
|
-
|
|
117
|
+
const update = prepareCellCodeUpdate(editorView.state, code, {
|
|
118
|
+
initialize: true,
|
|
119
|
+
});
|
|
120
|
+
if (update) {
|
|
121
|
+
editorView.dispatch(update);
|
|
122
|
+
}
|
|
123
123
|
break;
|
|
124
124
|
}
|
|
125
125
|
|
|
@@ -139,15 +139,20 @@ export class EditNotebookTool implements AiTool<
|
|
|
139
139
|
edit: { type: "update_cell", previousCode: previousCode },
|
|
140
140
|
});
|
|
141
141
|
|
|
142
|
-
|
|
142
|
+
const update = prepareCellCodeUpdate(editorView.state, code, {
|
|
143
|
+
initialize: true,
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
if (update) {
|
|
147
|
+
editorView.dispatch(update);
|
|
148
|
+
}
|
|
143
149
|
|
|
144
150
|
break;
|
|
145
151
|
}
|
|
146
152
|
case "add_cell": {
|
|
147
153
|
const { position, code } = edit;
|
|
148
154
|
|
|
149
|
-
let
|
|
150
|
-
let before = false;
|
|
155
|
+
let placement: CreateCellOptions = {};
|
|
151
156
|
const newCellId = CellId.create();
|
|
152
157
|
const notebook = store.get(notebookAtom);
|
|
153
158
|
|
|
@@ -157,51 +162,54 @@ export class EditNotebookTool implements AiTool<
|
|
|
157
162
|
if (!cellId) {
|
|
158
163
|
throw new ToolExecutionError(
|
|
159
164
|
"Cell ID is required for add_cell with relative position",
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
165
|
+
{
|
|
166
|
+
code: "TOOL_ERROR",
|
|
167
|
+
isRetryable: true,
|
|
168
|
+
suggestedFix: "Provide a cell ID to add the cell before",
|
|
169
|
+
},
|
|
163
170
|
);
|
|
164
171
|
}
|
|
165
172
|
|
|
166
173
|
if (position.before === undefined) {
|
|
167
174
|
throw new ToolExecutionError(
|
|
168
175
|
"Before is required for add_cell with relative position",
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
176
|
+
{
|
|
177
|
+
code: "TOOL_ERROR",
|
|
178
|
+
isRetryable: true,
|
|
179
|
+
suggestedFix: `Provide a boolean value for before, true to add before cell ${cellId}, false to add after the cell`,
|
|
180
|
+
},
|
|
172
181
|
);
|
|
173
182
|
}
|
|
174
183
|
|
|
175
184
|
this.validateCellIdExists(cellId, notebook);
|
|
176
|
-
|
|
177
|
-
|
|
185
|
+
placement = position.before
|
|
186
|
+
? { before: cellId }
|
|
187
|
+
: { after: cellId };
|
|
178
188
|
break;
|
|
179
189
|
}
|
|
180
|
-
case "column_end":
|
|
190
|
+
case "column_end":
|
|
181
191
|
if (!position.columnIndex) {
|
|
182
192
|
throw new ToolExecutionError(
|
|
183
193
|
"Column index is required for add_cell with column_end position",
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
194
|
+
{
|
|
195
|
+
code: "TOOL_ERROR",
|
|
196
|
+
isRetryable: true,
|
|
197
|
+
suggestedFix:
|
|
198
|
+
"Provide a column index to add the cell at the end of",
|
|
199
|
+
},
|
|
187
200
|
);
|
|
188
201
|
}
|
|
189
202
|
|
|
190
|
-
|
|
191
|
-
|
|
203
|
+
placement = {
|
|
204
|
+
endOf: this.getColumnId(position.columnIndex, notebook),
|
|
205
|
+
};
|
|
192
206
|
break;
|
|
193
|
-
|
|
207
|
+
|
|
194
208
|
case "notebook_end":
|
|
195
|
-
// Use default: notebookPosition = "__end__"
|
|
196
209
|
break;
|
|
197
210
|
}
|
|
198
211
|
|
|
199
|
-
|
|
200
|
-
cellId: notebookPosition,
|
|
201
|
-
before,
|
|
202
|
-
code,
|
|
203
|
-
newCellId,
|
|
204
|
-
});
|
|
212
|
+
createCell({ ...placement, code, id: newCellId });
|
|
205
213
|
|
|
206
214
|
addStagedCell({
|
|
207
215
|
cellId: newCellId,
|
|
@@ -218,12 +226,11 @@ export class EditNotebookTool implements AiTool<
|
|
|
218
226
|
const cellId = position.cellId as CellId | undefined;
|
|
219
227
|
|
|
220
228
|
if (!cellId) {
|
|
221
|
-
throw new ToolExecutionError(
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
);
|
|
229
|
+
throw new ToolExecutionError("Cell ID is required for delete_cell", {
|
|
230
|
+
code: "CELL_ID_REQUIRED_FOR_DELETE_CELL",
|
|
231
|
+
isRetryable: true,
|
|
232
|
+
suggestedFix: "Provide a cell ID to delete",
|
|
233
|
+
});
|
|
227
234
|
}
|
|
228
235
|
|
|
229
236
|
const notebook = store.get(notebookAtom);
|
|
@@ -255,12 +262,11 @@ export class EditNotebookTool implements AiTool<
|
|
|
255
262
|
private validateCellIdExists(cellId: CellId, notebook: NotebookState) {
|
|
256
263
|
const cellIds = notebook.cellIds;
|
|
257
264
|
if (!cellIds.getColumns().some((column) => column.idSet.has(cellId))) {
|
|
258
|
-
throw new ToolExecutionError(
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
);
|
|
265
|
+
throw new ToolExecutionError("Cell not found", {
|
|
266
|
+
code: "CELL_NOT_FOUND",
|
|
267
|
+
isRetryable: false,
|
|
268
|
+
suggestedFix: "Check which cells exist in the notebook",
|
|
269
|
+
});
|
|
264
270
|
}
|
|
265
271
|
}
|
|
266
272
|
|
|
@@ -272,12 +278,12 @@ export class EditNotebookTool implements AiTool<
|
|
|
272
278
|
const columns = cellIds.getColumns();
|
|
273
279
|
|
|
274
280
|
if (columnIndex < 0 || columnIndex >= columns.length) {
|
|
275
|
-
throw new ToolExecutionError(
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
);
|
|
281
|
+
throw new ToolExecutionError("Column index is out of range", {
|
|
282
|
+
code: "COLUMN_INDEX_OUT_OF_RANGE",
|
|
283
|
+
isRetryable: true,
|
|
284
|
+
suggestedFix:
|
|
285
|
+
"Choose a column index between 0 and the number of columns in the notebook (0-based)",
|
|
286
|
+
});
|
|
281
287
|
}
|
|
282
288
|
return columns[columnIndex].id;
|
|
283
289
|
}
|
|
@@ -289,12 +295,11 @@ export class EditNotebookTool implements AiTool<
|
|
|
289
295
|
const cellHandles = notebook.cellHandles;
|
|
290
296
|
const cellHandle = cellHandles[cellId].current;
|
|
291
297
|
if (!cellHandle?.editorView) {
|
|
292
|
-
throw new ToolExecutionError(
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
);
|
|
298
|
+
throw new ToolExecutionError("Cell editor not found", {
|
|
299
|
+
code: "CELL_EDITOR_NOT_FOUND",
|
|
300
|
+
isRetryable: false,
|
|
301
|
+
suggestedFix: "Internal error, ask the user to report this error",
|
|
302
|
+
});
|
|
298
303
|
}
|
|
299
304
|
return cellHandle.editorView;
|
|
300
305
|
}
|
|
@@ -73,9 +73,11 @@ export class FrontendToolRegistry {
|
|
|
73
73
|
const strError = z.prettifyError(inputResponse.error);
|
|
74
74
|
throw new ToolExecutionError(
|
|
75
75
|
`Tool ${toolName} returned invalid input: ${strError}`,
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
76
|
+
{
|
|
77
|
+
code: "INVALID_ARGUMENTS",
|
|
78
|
+
isRetryable: true,
|
|
79
|
+
suggestedFix: "Please check the arguments and try again.",
|
|
80
|
+
},
|
|
79
81
|
);
|
|
80
82
|
}
|
|
81
83
|
const args = inputResponse.data;
|
|
@@ -110,12 +112,15 @@ export class FrontendToolRegistry {
|
|
|
110
112
|
// Handle unknown/generic errors
|
|
111
113
|
const genericError = new ToolExecutionError(
|
|
112
114
|
error instanceof Error ? error.message : String(error),
|
|
113
|
-
"TOOL_ERROR",
|
|
114
|
-
false,
|
|
115
|
-
"Check the error message and try again with valid arguments.",
|
|
116
115
|
{
|
|
117
|
-
|
|
118
|
-
|
|
116
|
+
code: "TOOL_ERROR",
|
|
117
|
+
isRetryable: false,
|
|
118
|
+
suggestedFix:
|
|
119
|
+
"Check the error message and try again with valid arguments.",
|
|
120
|
+
meta: {
|
|
121
|
+
args: rawArgs,
|
|
122
|
+
errorType: error?.constructor?.name ?? typeof error,
|
|
123
|
+
},
|
|
119
124
|
},
|
|
120
125
|
);
|
|
121
126
|
return {
|
|
@@ -50,13 +50,12 @@ export class TestFrontendTool implements AiTool<Input, Output> {
|
|
|
50
50
|
public async handler({ name }: Input): Promise<Output> {
|
|
51
51
|
// Example: Validate input and throw ToolExecutionError on invalid data
|
|
52
52
|
if (!name.trim()) {
|
|
53
|
-
throw new ToolExecutionError(
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
);
|
|
53
|
+
throw new ToolExecutionError("Name cannot be empty", {
|
|
54
|
+
code: "INVALID_INPUT",
|
|
55
|
+
isRetryable: false,
|
|
56
|
+
suggestedFix: "Please provide a non-empty name",
|
|
57
|
+
meta: { field: "name", received: name },
|
|
58
|
+
});
|
|
60
59
|
}
|
|
61
60
|
|
|
62
61
|
return {
|