@marimo-team/islands 0.25.3-dev2 → 0.25.3-dev200
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-CNSxdKyJ.js → ConnectedDataExplorerComponent-BsWiIPFk.js} +22 -20
- package/dist/{ErrorBoundary-DWEpirf3.js → ErrorBoundary-UWARECs-.js} +19 -19
- package/dist/{abnfDiagram-VCTEODGH-DQDjNXt3.js → abnfDiagram-VCTEODGH-I2x4Yu25.js} +2 -2
- package/dist/any-language-editor-BVFHDDQ3.js +75 -0
- package/dist/{architectureDiagram-5GKGNRK7-Nmls7Wxn.js → architectureDiagram-5GKGNRK7-1bSQMKzK.js} +1 -1
- package/dist/{arrays-CN1djC4k.js → arrays-DoQ-AILx.js} +15 -27
- package/dist/assets/__vite-browser-external-BCJsx8QS.js +1 -0
- package/dist/assets/worker-DodjWT_Z.js +113 -0
- package/dist/{button-CvjkwdSk.js → button-BQRdqQi1.js} +199 -192
- package/dist/{capabilities-CQ5IjhzL.js → capabilities-C2QUNRXi.js} +2 -2
- package/dist/{chat-ui-BDpymeoe.js → chat-ui-DXDoSuS4.js} +667 -667
- package/dist/{check-EDwSwP89.js → check-C9Mp9eCK.js} +1 -1
- package/dist/{chunk-IMKFNOWR-CoIFEo-1.js → chunk-IMKFNOWR-fsCGAJ9G.js} +1 -1
- package/dist/{chunk-SHT3W25Y-lHiGx3ZC.js → chunk-SHT3W25Y-D2STW4hj.js} +1 -1
- package/dist/{chunk-SVP7TREG-BvsHIrY_.js → chunk-SVP7TREG-CiY7cQG-.js} +1 -1
- package/dist/{chunk-TICWLB2K-BC8YIm_n.js → chunk-TICWLB2K-C_t5RBp9.js} +1 -1
- package/dist/{chunk-YOKDWASO-DPZk8vhS.js → chunk-YOKDWASO-DKplTrBY.js} +20 -20
- package/dist/{classDiagram-ZZMXUADV-Bt98lkkv.js → classDiagram-ZZMXUADV-B2JvZAP4.js} +2 -2
- package/dist/{classDiagram-v2-VYDZK3BY-D9bfbcC3.js → classDiagram-v2-VYDZK3BY-L8VsZG5A.js} +2 -2
- package/dist/{code-visibility-CLNfgCjd.js → code-visibility-33fxfX1p.js} +45 -49
- package/dist/{common-fyD_6mT2.js → common-D09oJJ8Z.js} +7354 -6884
- package/dist/{copy-icon-Ft7t9bqz.js → copy-icon-De584pZ4.js} +3 -3
- package/dist/{cynefinDiagram-5FMLGOSQ-CgWra7wt.js → cynefinDiagram-5FMLGOSQ-DdllC264.js} +1 -1
- package/dist/{dagre-GXQ25YYZ-CFZ8-35c.js → dagre-GXQ25YYZ-BaWHw4_f.js} +1 -1
- package/dist/{data-grid-overlay-editor-BmqASKep.js → data-grid-overlay-editor-lGsInXfR.js} +5 -5
- package/dist/{data-grid-types-BH_r7g7l.js → data-grid-types-0PJ-9N5n.js} +1 -1
- package/dist/{diagram-S7CK7UJ4-lCNQrW7d.js → diagram-S7CK7UJ4-pFt-tUDe.js} +1 -1
- package/dist/{diagram-UQ7AKVKN-CQPQ6pP_.js → diagram-UQ7AKVKN-DqGJiBp4.js} +1 -1
- package/dist/{diagram-VX7I27RA-Cf3b0llz.js → diagram-VX7I27RA-Dr-yzMjf.js} +1 -1
- package/dist/{diagram-Z3DM3KII-Bt4QLrpn.js → diagram-Z3DM3KII-8xzJzv-w.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-NlnsmNA6.js} +1481 -1433
- package/dist/{ebnfDiagram-PWID7BFC-D3NAyPFY.js → ebnfDiagram-PWID7BFC-Br04Wy-E.js} +2 -2
- package/dist/{erDiagram-RLTQ6QDP-Tlu09_Nm.js → erDiagram-RLTQ6QDP-D5-XVgvv.js} +1 -1
- package/dist/{error-banner-Da600cwz.js → error-banner-DxJ3s8YO.js} +89 -84
- package/dist/{cells-C8iCYvLU.js → error-entries-C2Ux0Fjt.js} +7970 -8605
- 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-B0CMhVv7.js +374 -0
- package/dist/{flowDiagram-HODETNUW-CAYbpJmV.js → flowDiagram-HODETNUW-CVl2kREF.js} +2 -2
- package/dist/{formats-BGh2thRc.js → formats-BCYthwyc.js} +3 -3
- package/dist/{ganttDiagram-EL5Y4UJY-BQT16JSc.js → ganttDiagram-EL5Y4UJY-Dh_4cBJZ.js} +2 -2
- package/dist/{glide-data-editor-BkjP14aq.js → glide-data-editor-CL535A5q.js} +370 -368
- package/dist/{glide-utils-DJyqh0EM.js → glide-utils-D98laidb.js} +16 -16
- package/dist/{globals-BN2O0F8N.js → globals-Bsr6T2yD.js} +3 -3
- package/dist/{highlighted-body-KPVGNVTW-zwjq21tf.js → highlighted-body-KPVGNVTW-3Ziwfz-V.js} +2 -2
- package/dist/{html-to-image-CZY1pIZH.js → html-to-image-CkH7vdBZ.js} +478 -381
- package/dist/{infoDiagram-27XIBGKW-XrDxhr0x.js → infoDiagram-27XIBGKW-BJ4vNcZE.js} +1 -1
- package/dist/{ishikawaDiagram-5VMMS53U-CD1muzov.js → ishikawaDiagram-5VMMS53U-B_Jy1Dsm.js} +1 -1
- package/dist/{kanban-definition-UXKFOSKX-Dg9W142_.js → kanban-definition-UXKFOSKX-C6MkS9vw.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 +9706 -7708
- package/dist/{mermaid-CiAXjLpA.js → mermaid-Bh918qrq.js} +52 -52
- package/dist/mermaid-HWGCJPDP-Du3-HPQA.js +2 -0
- package/dist/{mindmap-definition-YA3MSWOX-DgCidgYJ.js → mindmap-definition-YA3MSWOX-BP3ZTuir.js} +1 -1
- package/dist/{number-overlay-editor-BEBWJnbL.js → number-overlay-editor-CzbkG4E2.js} +3 -3
- 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-coOYYKB6.js → pegDiagram-XKGWAZYB-nNGOQtnt.js} +2 -2
- package/dist/{pieDiagram-E7YTZNPT-BnXTc3bj.js → pieDiagram-E7YTZNPT-CpRz5BZz.js} +1 -1
- package/dist/precisionRound-DhAzeRcm.js +49 -0
- package/dist/{process-output-e4jj9Ijt.js → process-output-OujAtFW4.js} +4 -4
- package/dist/{quadrantDiagram-AXDQQJYC-Ccw0xMjN.js → quadrantDiagram-AXDQQJYC-Blrm7V7_.js} +1 -1
- package/dist/{railroadDiagram-O6MQD6OU-B28-u83n.js → railroadDiagram-O6MQD6OU-BqOEN4I0.js} +2 -2
- package/dist/{react-vega-BED0DjiB.js → react-vega-C4T9Rb_w.js} +12284 -12270
- package/dist/{requirementDiagram-BXWQKSXE-CdYCTMu0.js → requirementDiagram-BXWQKSXE-CEfg6vu9.js} +1 -1
- package/dist/{reveal-component-DK69bOki.js → reveal-component-CbEK0sNX.js} +733 -710
- package/dist/{select-BButFi-d.js → select-2KOiReNY.js} +536 -457
- package/dist/{sequenceDiagram-WJ2MYXX4-CM3aRAe_.js → sequenceDiagram-WJ2MYXX4-IOmpQcOi.js} +1 -1
- package/dist/{spec-BwarBpUJ.js → spec-Dkp64vVQ.js} +41 -11
- package/dist/{stateDiagram-D77RDMKH-DOZUMVj8.js → stateDiagram-D77RDMKH-tgU-EY9_.js} +2 -2
- package/dist/{stateDiagram-v2-MP3YSRHH-CISYxma6.js → stateDiagram-v2-MP3YSRHH-BofhG6q1.js} +2 -2
- package/dist/style.css +1 -1
- package/dist/{swimlanes-42K2YHIH-BkSppxp8.js → swimlanes-42K2YHIH-DW4vWDBd.js} +1 -1
- package/dist/{swimlanesDiagram-VR7AAH4N-c8G5pGxC.js → swimlanesDiagram-VR7AAH4N-BJcrqUJr.js} +2 -2
- package/dist/{swiper-component-DKntyn8p.js → swiper-component-BVfnhbnt.js} +2 -2
- package/dist/{time-BieKwdYS.js → time-BaMbJs4z.js} +18 -18
- package/dist/{timeline-definition-24CTP7MA-CaMQayqK.js → timeline-definition-24CTP7MA-D_QU3NGs.js} +1 -1
- package/dist/{toDate-BNJf01u1.js → toDate-BNDEXbfV.js} +77 -74
- 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-ASDni9vH.js} +15 -14
- package/dist/{useDateFormatter-D8XruNGG.js → useDateFormatter-D3Tkfzej.js} +2 -2
- package/dist/{useDeepCompareMemoize-DXwzRINI.js → useDeepCompareMemoize-B1Ogyf53.js} +1 -1
- package/dist/{useIframeCapabilities-DBETvvPl.js → useIframeCapabilities-6a_yDNXp.js} +1 -1
- package/dist/{useLifecycle-j7D9uD1o.js → useLifecycle-Bfpa2m7k.js} +28 -25
- package/dist/{useTheme-CRnjkku0.js → useTheme-5TwyOh3B.js} +522 -314
- package/dist/{vega-component-DG29TAB7.js → vega-component-BHS9UOtC.js} +158 -158
- 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-CF8pfaK3.js → vennDiagram-4TSXK5OY-YFYsNIAh.js} +1 -1
- package/dist/{wardleyDiagram-VM6X3IG4-dGPu39d-.js → wardleyDiagram-VM6X3IG4-i_n8mAWC.js} +1 -1
- package/dist/{xychartDiagram-S5SC5T6Z-CP6-9q56.js → xychartDiagram-S5SC5T6Z-BYGN95wW.js} +2 -2
- package/package.json +16 -16
- package/src/__mocks__/document.tsx +63 -0
- package/src/__mocks__/notebook.ts +3 -4
- package/src/__mocks__/partial.ts +26 -0
- package/src/__mocks__/requests.ts +0 -3
- package/src/__tests__/fixtures/{pair-preview.ts → pair-config.ts} +3 -2
- package/src/__tests__/main.test.tsx +24 -1
- package/src/__tests__/module-entry.test.ts +44 -0
- package/src/__tests__/mount.test.ts +9 -9
- 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/app-config-form.tsx +5 -9
- 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/__tests__/notebook-access-selector.test.tsx +64 -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 +20 -101
- package/src/components/chat/chat-utils.ts +4 -8
- package/src/components/chat/notebook-access-selector.stories.tsx +22 -0
- package/src/components/chat/notebook-access-selector.tsx +100 -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__/context-menu.test.ts +176 -0
- package/src/components/data-table/__tests__/data-table.test.tsx +1 -0
- package/src/components/data-table/__tests__/date-filter-inputs.test.tsx +24 -1
- package/src/components/data-table/__tests__/date-popover.test.tsx +72 -0
- package/src/components/data-table/__tests__/export-actions.test.tsx +434 -6
- 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 +161 -46
- package/src/components/data-table/data-table.tsx +17 -1
- package/src/components/data-table/date-filter-inputs.tsx +15 -42
- package/src/components/data-table/date-popover.tsx +6 -4
- package/src/components/data-table/export-actions.tsx +267 -163
- 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/schemas.ts +14 -36
- 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/data-table/utils.ts +18 -0
- 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 +13 -19
- 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/Output.tsx +9 -2
- package/src/components/editor/SortableCell.tsx +1 -3
- package/src/components/editor/__tests__/Output.test.tsx +50 -32
- package/src/components/editor/__tests__/agent-toast.test.tsx +58 -0
- package/src/components/editor/__tests__/data-attributes.test.tsx +28 -14
- package/src/components/editor/__tests__/dynamic-favicon.test.tsx +111 -18
- package/src/components/editor/__tests__/output-persistence.test.tsx +6 -2
- 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 +80 -252
- package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +218 -40
- 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 +44 -53
- package/src/components/editor/actions/pair-with-agent-modal.tsx +101 -38
- package/src/components/editor/actions/useCellActionButton.tsx +26 -31
- package/src/components/editor/actions/useConfigActions.tsx +3 -4
- package/src/components/editor/actions/useNotebookActions.tsx +19 -23
- 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/agent-toast.ts +15 -0
- 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/alerts/stdin-blocking-alert.tsx +1 -1
- 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/cell-actions.tsx +12 -1
- package/src/components/editor/cell/code/__tests__/language-toggle.test.tsx +54 -0
- package/src/components/editor/cell/code/cell-editor.tsx +36 -43
- package/src/components/editor/cell/code/language-toggle.tsx +8 -7
- package/src/components/editor/cell/collapse.tsx +11 -4
- 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 +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/error-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/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/wrapper/__tests__/attachment-status.test.tsx +363 -0
- 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-item.tsx +32 -24
- package/src/components/editor/chrome/wrapper/footer-items/attachment-status.tsx +237 -0
- 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 +4 -0
- package/src/components/editor/chrome/wrapper/minimap-state.ts +1 -1
- 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/__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 +536 -0
- package/src/components/editor/errors/auto-fix.tsx +4 -8
- package/src/components/editor/errors/send-error-report-button.tsx +66 -0
- 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-list.tsx +1 -1
- package/src/components/editor/links/cell-link.tsx +17 -7
- 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 +71 -70
- 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 +29 -31
- package/src/components/editor/output/MarimoErrorOutput.tsx +23 -6
- package/src/components/editor/output/MarimoTracebackOutput.tsx +54 -37
- package/src/components/editor/output/Outputs.css +8 -0
- package/src/components/editor/output/__tests__/ansi-reduce.test.ts +18 -0
- package/src/components/editor/output/__tests__/traceback.test.tsx +27 -1
- package/src/components/editor/output/ansi-reduce.ts +36 -17
- 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 +22 -33
- package/src/components/editor/renderers/grid-layout/grid-layout.tsx +12 -6
- package/src/components/editor/renderers/slides-layout/__tests__/plugin.test.ts +0 -1
- 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 +1 -1
- package/src/components/editor/stdin-blocking-alert.tsx +1 -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 +19 -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 -11
- 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 +17 -12
- package/src/components/slides/reveal-component.tsx +58 -26
- package/src/components/slides/reveal-slides.css +5 -4
- package/src/components/slides/slide-cell-view.tsx +4 -5
- package/src/components/slides/slide-form.tsx +1 -0
- package/src/components/slides/slide-scroll-hint.tsx +3 -1
- 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__/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/MarimoApp.tsx +1 -1
- package/src/core/ai/__tests__/staged-cells.test.ts +27 -26
- package/src/core/ai/context/providers/__tests__/cell-output.test.ts +8 -12
- package/src/core/ai/context/providers/cell-output.ts +2 -2
- 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 +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 -37
- package/src/core/cells/__tests__/actions.test.ts +624 -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 +39 -0
- package/src/core/cells/__tests__/cells.test.ts +256 -2477
- package/src/core/cells/__tests__/collapseConsoleOutputs.test.ts +54 -0
- package/src/core/cells/__tests__/document.test.ts +341 -0
- package/src/core/cells/__tests__/editor.test.ts +57 -0
- package/src/core/cells/__tests__/error-report.test.ts +139 -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 +177 -0
- package/src/core/cells/__tests__/notebook-outline.test.ts +120 -0
- package/src/core/cells/__tests__/outputs.test.tsx +71 -53
- package/src/core/cells/__tests__/session.test.ts +493 -210
- package/src/core/cells/__tests__/utils.test.ts +9 -108
- package/src/core/cells/__tests__/with-document-save.test.ts +67 -0
- package/src/core/cells/actions.ts +636 -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 +14 -3
- package/src/core/cells/cells.ts +120 -1337
- package/src/core/cells/columns.ts +38 -0
- package/src/core/cells/document.ts +289 -0
- package/src/core/cells/edit.ts +30 -0
- package/src/core/cells/editor.ts +82 -0
- package/src/core/cells/error-report.ts +63 -0
- package/src/core/cells/layout.ts +221 -0
- package/src/core/cells/outputs.ts +12 -28
- package/src/core/cells/pending-delete-service.ts +3 -7
- package/src/core/cells/session.ts +104 -54
- package/src/core/cells/types.ts +22 -6
- package/src/core/cells/utils.ts +10 -8
- 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/copilot/__tests__/getCodes.test.ts +6 -7
- package/src/core/codemirror/copilot/getCodes.ts +2 -2
- 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/__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/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__/app-config.test.ts +64 -0
- package/src/core/config/__tests__/config-schema.test.ts +13 -6
- package/src/core/config/config-schema.ts +13 -3
- package/src/core/config/config.ts +26 -12
- package/src/core/config/pair.ts +5 -3
- 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 +21 -28
- package/src/core/errors/error-entries.ts +4 -1
- 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 +69 -17
- 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/components/web-components.tsx +1 -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 -153
- package/src/core/kernel/handlers.ts +19 -72
- 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 +1 -3
- package/src/core/network/connection-notice.ts +1 -1
- package/src/core/network/connection.ts +5 -3
- 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/__tests__/operations.test.ts +51 -0
- package/src/core/notebook/attachments.ts +38 -0
- package/src/core/notebook/document/__tests__/codemirror.test.ts +586 -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 +19 -0
- package/src/core/notebook/operations.ts +30 -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/{websocket/types.ts → notebook/replica/connection.ts} +10 -15
- 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 +33 -15
- package/src/core/runtime/adapter.ts +1 -1
- package/src/core/runtime/config.ts +2 -2
- package/src/core/runtime/runtime.ts +39 -30
- package/src/core/saving/__tests__/state.test.ts +111 -0
- package/src/core/saving/__tests__/useAutoSave.test.tsx +67 -0
- package/src/core/saving/filename.ts +1 -1
- package/src/core/saving/save-component.tsx +28 -36
- 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 +184 -0
- package/src/core/{websocket/__tests__/useMarimoKernelConnection.hook.test.tsx → session/__tests__/useNotebookSession.hook.test.tsx} +252 -185
- package/src/core/session/active-notebook.ts +22 -0
- package/src/core/session/backend.ts +123 -0
- package/src/core/session/embedded.ts +7 -0
- package/src/core/session/types.ts +17 -0
- package/src/core/session/useNotebookReplica.ts +74 -0
- package/src/core/{websocket/useMarimoKernelConnection.tsx → session/useNotebookSession.tsx} +120 -273
- 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/__tests__/useMarimoKernelConnection.test.ts → transports/__tests__/connection-state.test.ts} +16 -30
- 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/transports/connection-state.ts +63 -0
- 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/wasm/__tests__/bridge.test.ts +214 -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 +23 -14
- 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 +471 -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 +2 -5
- 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 +2 -5
- 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/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__/dates.test.ts +116 -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/dates.ts +94 -0
- 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-B9REGlD9.js +0 -76
- package/dist/assets/__vite-browser-external-BXYkiFsk.js +0 -1
- package/dist/assets/worker-HPY9fbhz.js +0 -114
- package/dist/error-entries-CzoYkIQZ.js +0 -56
- package/dist/feedback-button-fND8YT59.js +0 -380
- package/dist/mermaid-HWGCJPDP-ByCsZnYF.js +0 -2
- package/dist/precisionRound-DMIVQrt2.js +0 -97
- package/src/components/editor/navigation/__tests__/state.test.ts +0 -81
- package/src/components/editor/navigation/state.ts +0 -65
- 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/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__/protocol.test.ts +0 -214
- 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__/useWebSocket.test.ts +0 -49
- package/src/core/websocket/transports/__tests__/basic.test.ts +0 -275
- package/src/core/websocket/transports/__tests__/sse.test.ts +0 -338
- 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/sse.ts +0 -308
- package/src/core/websocket/transports/transport.ts +0 -61
- package/src/core/websocket/transports/ws.ts +0 -98
- package/src/core/websocket/useWebSocket.tsx +0 -88
- package/src/utils/__tests__/id-tree.test.ts +0 -2145
- package/src/utils/id-tree.tsx +0 -1134
- /package/src/core/{websocket → session}/connection-utils.ts +0 -0
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
/** The cells as they appear on the page: by column, with folded sections hidden. */
|
|
4
|
+
|
|
5
|
+
import { atom, useAtomValue } from "jotai";
|
|
6
|
+
import type { EditableDocument } from "@/core/notebook/document";
|
|
7
|
+
import { findCollapseRange } from "../dom/outline";
|
|
8
|
+
import { activeDocumentModelAtom } from "../session/active-notebook";
|
|
9
|
+
import { cellOutlinesAtom } from "./cells";
|
|
10
|
+
import { groupByColumn } from "./columns";
|
|
11
|
+
import { CellId } from "./ids";
|
|
12
|
+
import type { Outline } from "./outline";
|
|
13
|
+
|
|
14
|
+
/** A column's identity on this page, as drag and drop and saved widths refer to it. */
|
|
15
|
+
export type CellColumnId = string & { __brand: "CellColumnId" };
|
|
16
|
+
|
|
17
|
+
/** The headers whose sections the user folded. Only this browser knows. */
|
|
18
|
+
export const collapsedAtom = atom<ReadonlySet<CellId>>(new Set<CellId>());
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* This browser's names for the document's columns, by position. The
|
|
22
|
+
* document knows columns only by position, so `followColumnsAtom` names
|
|
23
|
+
* a column as it appears and forgets one as it goes, and the column
|
|
24
|
+
* operations carry the names along as they rearrange.
|
|
25
|
+
*/
|
|
26
|
+
export const columnIdsAtom = atom<readonly CellColumnId[]>([]);
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Trailing columns a rearrangement here emptied. The document cannot hold
|
|
30
|
+
* an empty column at its end, so the page keeps them, as drop targets for
|
|
31
|
+
* the cell being dragged, until a drop compacts them.
|
|
32
|
+
*/
|
|
33
|
+
export const emptyColumnIdsAtom = atom<readonly CellColumnId[]>([]);
|
|
34
|
+
|
|
35
|
+
export function newColumnId(): CellColumnId {
|
|
36
|
+
return `column-${CellId.create()}` as CellColumnId;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function isColumnId(id: unknown): id is CellColumnId {
|
|
40
|
+
return typeof id === "string" && id.startsWith("column-");
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Name the document's columns as the document changes. A column that
|
|
45
|
+
* appears takes over an empty column the page keeps, or gets a fresh id;
|
|
46
|
+
* one that goes is forgotten.
|
|
47
|
+
*/
|
|
48
|
+
export const followColumnsAtom = atom(
|
|
49
|
+
null,
|
|
50
|
+
(get, set, document: EditableDocument): void => {
|
|
51
|
+
const count = groupByColumn(document).length;
|
|
52
|
+
const ids = get(columnIdsAtom);
|
|
53
|
+
if (ids.length === count) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const empty = get(emptyColumnIdsAtom);
|
|
57
|
+
const named = [...ids, ...empty].slice(0, count);
|
|
58
|
+
while (named.length < count) {
|
|
59
|
+
named.push(newColumnId());
|
|
60
|
+
}
|
|
61
|
+
set(columnIdsAtom, named);
|
|
62
|
+
set(emptyColumnIdsAtom, empty.slice(Math.max(0, count - ids.length)));
|
|
63
|
+
},
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
/** The document's columns, each with its id, then the empty ones the page keeps. */
|
|
67
|
+
function columnsOf(
|
|
68
|
+
document: EditableDocument | null,
|
|
69
|
+
ids: readonly CellColumnId[],
|
|
70
|
+
empty: readonly CellColumnId[],
|
|
71
|
+
): Array<{ id: CellColumnId; ids: CellId[] }> {
|
|
72
|
+
const groups = document === null ? [[]] : groupByColumn(document);
|
|
73
|
+
return [
|
|
74
|
+
...groups.map((cells, index) => ({
|
|
75
|
+
// Before the first document names them, columns go by position.
|
|
76
|
+
id: ids[index] ?? (`column-${index}` as CellColumnId),
|
|
77
|
+
ids: cells,
|
|
78
|
+
})),
|
|
79
|
+
...empty.map((id) => ({ id, ids: [] as CellId[] })),
|
|
80
|
+
];
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export interface LayoutColumn {
|
|
84
|
+
readonly id: CellColumnId;
|
|
85
|
+
/** Every cell of the column, in order. */
|
|
86
|
+
readonly ids: readonly CellId[];
|
|
87
|
+
/** The cells on the page: those no fold hides. */
|
|
88
|
+
readonly visible: readonly CellId[];
|
|
89
|
+
/**
|
|
90
|
+
* Each folded header and the cells it hides, nested sections included. A
|
|
91
|
+
* folded header with nothing under it yet has an empty fold.
|
|
92
|
+
*/
|
|
93
|
+
readonly folds: ReadonlyMap<CellId, readonly CellId[]>;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export interface Layout {
|
|
97
|
+
readonly columns: readonly LayoutColumn[];
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* The cells each folded header hides. A section runs from its header to the
|
|
102
|
+
* cell before the next header of the same or a higher level, so a folded
|
|
103
|
+
* header inside a folded section is hidden along with its own section.
|
|
104
|
+
*/
|
|
105
|
+
export function foldSections(
|
|
106
|
+
ids: readonly CellId[],
|
|
107
|
+
outlines: (Outline | null)[],
|
|
108
|
+
collapsed: ReadonlySet<CellId>,
|
|
109
|
+
): Map<CellId, readonly CellId[]> {
|
|
110
|
+
const folds = new Map<CellId, readonly CellId[]>();
|
|
111
|
+
ids.forEach((id, index) => {
|
|
112
|
+
const outline = outlines[index];
|
|
113
|
+
if (!collapsed.has(id) || !outline || outline.items.length === 0) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const range = findCollapseRange(index, outlines);
|
|
117
|
+
if (range === null) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
folds.set(id, ids.slice(index + 1, range[1] + 1));
|
|
121
|
+
});
|
|
122
|
+
return folds;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export function deriveLayout(
|
|
126
|
+
columns: ReadonlyArray<{ id: CellColumnId; ids: readonly CellId[] }>,
|
|
127
|
+
outlineOf: (id: CellId) => Outline | null,
|
|
128
|
+
collapsed: ReadonlySet<CellId>,
|
|
129
|
+
): Layout {
|
|
130
|
+
return {
|
|
131
|
+
columns: columns.map(({ id, ids }) => {
|
|
132
|
+
const folds = foldSections(ids, ids.map(outlineOf), collapsed);
|
|
133
|
+
const hidden = new Set([...folds.values()].flat());
|
|
134
|
+
return { id, ids, visible: ids.filter((c) => !hidden.has(c)), folds };
|
|
135
|
+
}),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* The layout of the notebook's cells: the document's order and columns,
|
|
141
|
+
* this browser's column ids and folds, and the kernel's outlines.
|
|
142
|
+
*
|
|
143
|
+
* TODO(MO-8028): Outlines come from executions later.
|
|
144
|
+
*/
|
|
145
|
+
export const layoutAtom = atom((get): Layout => {
|
|
146
|
+
const model = get(activeDocumentModelAtom);
|
|
147
|
+
const document = model === null ? null : get(model.documentAtom);
|
|
148
|
+
const outlines = get(cellOutlinesAtom);
|
|
149
|
+
return deriveLayout(
|
|
150
|
+
columnsOf(document, get(columnIdsAtom), get(emptyColumnIdsAtom)),
|
|
151
|
+
(id) => outlines[id] ?? null,
|
|
152
|
+
get(collapsedAtom),
|
|
153
|
+
);
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
export const useLayout = () => useAtomValue(layoutAtom);
|
|
157
|
+
|
|
158
|
+
export const numColumnsAtom = atom((get) => get(layoutAtom).columns.length);
|
|
159
|
+
|
|
160
|
+
export function findColumn(
|
|
161
|
+
layout: Layout,
|
|
162
|
+
columnId: CellColumnId,
|
|
163
|
+
): LayoutColumn | undefined {
|
|
164
|
+
return layout.columns.find((column) => column.id === columnId);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** The column holding `id`. Throws for a cell the layout does not have. */
|
|
168
|
+
export function columnOf(layout: Layout, id: CellId): LayoutColumn {
|
|
169
|
+
const column = layout.columns.find((column) => column.ids.includes(id));
|
|
170
|
+
if (column === undefined) {
|
|
171
|
+
throw new Error(`Cell ${id} is not in the layout`);
|
|
172
|
+
}
|
|
173
|
+
return column;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/** The cells a folded header hides, or undefined when `id` is not a folded header. */
|
|
177
|
+
export function foldOf(
|
|
178
|
+
layout: Layout,
|
|
179
|
+
id: CellId,
|
|
180
|
+
): readonly CellId[] | undefined {
|
|
181
|
+
for (const column of layout.columns) {
|
|
182
|
+
const fold = column.folds.get(id);
|
|
183
|
+
if (fold !== undefined) {
|
|
184
|
+
return fold;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return undefined;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/** The headers whose folds hide `id`. */
|
|
191
|
+
export function foldsHiding(layout: Layout, id: CellId): CellId[] {
|
|
192
|
+
const column = layout.columns.find((column) => column.ids.includes(id));
|
|
193
|
+
if (column === undefined) {
|
|
194
|
+
return [];
|
|
195
|
+
}
|
|
196
|
+
return [...column.folds]
|
|
197
|
+
.filter(([, hidden]) => hidden.includes(id))
|
|
198
|
+
.map(([header]) => header);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* The folded headers whose sections a cell without a heading would fall
|
|
203
|
+
* into, placed right after `id`: those hiding `id`, and `id` itself when it
|
|
204
|
+
* is a folded header. A section runs until the next heading, so a cell
|
|
205
|
+
* placed after the last cell of a fold is still inside it.
|
|
206
|
+
*/
|
|
207
|
+
export function foldsAfter(layout: Layout, id: CellId): CellId[] {
|
|
208
|
+
const hiding = foldsHiding(layout, id);
|
|
209
|
+
return foldOf(layout, id) === undefined ? hiding : [...hiding, id];
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/** The visible cell `offset` places from `id` in its column, if there is one. */
|
|
213
|
+
export function visibleNeighbor(
|
|
214
|
+
layout: Layout,
|
|
215
|
+
id: CellId,
|
|
216
|
+
offset: -1 | 1,
|
|
217
|
+
): CellId | undefined {
|
|
218
|
+
const { visible } = columnOf(layout, id);
|
|
219
|
+
const index = visible.indexOf(id);
|
|
220
|
+
return index === -1 ? undefined : visible[index + offset];
|
|
221
|
+
}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
3
|
import { useAtomValue } from "jotai";
|
|
4
|
-
import {
|
|
5
|
-
import { useEffect, useMemo, useState } from "react";
|
|
4
|
+
import { useEffect, useState } from "react";
|
|
6
5
|
import { useEvent } from "@/hooks/useEvent";
|
|
7
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
useNotebookCellConfig,
|
|
8
|
+
useNotebookDocumentEdit,
|
|
9
|
+
} from "../notebook/document";
|
|
8
10
|
import type { OutputMessage } from "../kernel/messages";
|
|
9
11
|
import { viewStateAtom } from "../mode";
|
|
10
|
-
import {
|
|
11
|
-
import { cellDataAtom, useCellActions } from "./cells";
|
|
12
|
-
import type { CellId } from "./ids";
|
|
12
|
+
import { type CellId, SCRATCH_CELL_ID } from "./ids";
|
|
13
13
|
|
|
14
14
|
// This does not need to be overcomplicated. We can just store the expanded
|
|
15
15
|
// state in a global map instead of Jotai since state is not shared between cells.
|
|
@@ -27,20 +27,9 @@ const expandedConsoleOutputs: Record<CellId, boolean> = {};
|
|
|
27
27
|
*/
|
|
28
28
|
export function useExpandedOutput(cellId: CellId) {
|
|
29
29
|
const { mode } = useAtomValue(viewStateAtom);
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
const isConfigExpanded = useAtomValue(
|
|
34
|
-
useMemo(
|
|
35
|
-
() =>
|
|
36
|
-
selectAtom(
|
|
37
|
-
cellDataAtom(cellId),
|
|
38
|
-
(data) => data?.config.expand_output ?? false,
|
|
39
|
-
Object.is,
|
|
40
|
-
),
|
|
41
|
-
[cellId],
|
|
42
|
-
),
|
|
43
|
-
);
|
|
30
|
+
const edit = useNotebookDocumentEdit();
|
|
31
|
+
const isConfigExpanded =
|
|
32
|
+
useNotebookCellConfig(cellId)?.expand_output ?? false;
|
|
44
33
|
const [isSessionExpanded, setIsSessionExpanded] = useState(
|
|
45
34
|
() => expandedOutputs[cellId] ?? isConfigExpanded,
|
|
46
35
|
);
|
|
@@ -55,16 +44,11 @@ export function useExpandedOutput(cellId: CellId) {
|
|
|
55
44
|
|
|
56
45
|
const setIsExpanded = useEvent((expanded: boolean) => {
|
|
57
46
|
setIsSessionExpanded(expanded);
|
|
58
|
-
|
|
47
|
+
// The scratchpad is not in the document.
|
|
48
|
+
if (!isEditable || cellId === SCRATCH_CELL_ID) {
|
|
59
49
|
return;
|
|
60
50
|
}
|
|
61
|
-
|
|
62
|
-
updateCellConfig({ cellId, config });
|
|
63
|
-
getRequestClient()
|
|
64
|
-
.saveCellConfig({ configs: { [cellId]: config } })
|
|
65
|
-
.catch((error) => {
|
|
66
|
-
Logger.error("Failed to save expand_output config", error);
|
|
67
|
-
});
|
|
51
|
+
edit((tx) => tx.updateConfig(cellId, { expand_output: expanded }));
|
|
68
52
|
});
|
|
69
53
|
|
|
70
54
|
return [isExpanded, setIsExpanded] as const;
|
|
@@ -49,7 +49,7 @@ const { valueAtom: pendingDeleteStateAtom, useActions } = createReducerAndAtoms(
|
|
|
49
49
|
const variables = store.get(variablesAtom);
|
|
50
50
|
|
|
51
51
|
const emptyCells = new Set(
|
|
52
|
-
notebook.cellIds.
|
|
52
|
+
notebook.cellIds.filter(
|
|
53
53
|
(id) => notebook.cellData[id].code.trim() === "",
|
|
54
54
|
),
|
|
55
55
|
);
|
|
@@ -134,12 +134,8 @@ export function usePendingDeleteService() {
|
|
|
134
134
|
submit({ cellIds, deleteCell, deleteManyCells, store });
|
|
135
135
|
},
|
|
136
136
|
clear,
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
},
|
|
140
|
-
get shouldConfirmDelete() {
|
|
141
|
-
return entries.size > 1;
|
|
142
|
-
},
|
|
137
|
+
idle: entries.size === 0,
|
|
138
|
+
shouldConfirmDelete: entries.size > 1,
|
|
143
139
|
};
|
|
144
140
|
}
|
|
145
141
|
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
|
+
/** Read the notebook a page was served with: its cells as a host snapshot, and their outputs. */
|
|
4
|
+
|
|
5
|
+
import type * as Protocol from "@marimo-team/client/protocol";
|
|
3
6
|
import type * as api from "@marimo-team/marimo-api";
|
|
4
7
|
import { mergeArray } from "@/utils/edit-distance";
|
|
5
|
-
import { MultiColumn } from "@/utils/id-tree";
|
|
6
8
|
import { Logger } from "@/utils/Logger";
|
|
7
9
|
import { parseOutline } from "../dom/outline";
|
|
8
|
-
import type {
|
|
10
|
+
import type { StaticNotebookSnapshot } from "../transports/static";
|
|
9
11
|
import { CellId, SETUP_CELL_ID } from "./ids";
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
import { DEFAULT_CELL_NAME } from "./names";
|
|
13
|
+
import { type CellRuntimeState, createCellRuntimeState } from "./types";
|
|
14
|
+
|
|
15
|
+
/** The identity of a snapshot the page carries. A host's own stream replaces it. */
|
|
16
|
+
const EMBEDDED = "embedded";
|
|
15
17
|
|
|
16
18
|
// Constants
|
|
17
19
|
const DEFAULT_TIMESTAMP = 0;
|
|
@@ -56,7 +58,7 @@ function mergeSessionAndNotebookCells(
|
|
|
56
58
|
return {
|
|
57
59
|
cellIds,
|
|
58
60
|
sessionCellData: new Map(
|
|
59
|
-
cellIds.map((id
|
|
61
|
+
cellIds.map((id) => [id, null] as [CellId, SessionCell | null]),
|
|
60
62
|
),
|
|
61
63
|
notebookCellData: new Map(
|
|
62
64
|
cellIds.map(
|
|
@@ -143,7 +145,7 @@ function createEmptyNotebookCell(): NotebookCell {
|
|
|
143
145
|
return {
|
|
144
146
|
id: CellId.create(),
|
|
145
147
|
name: EMPTY_STRING,
|
|
146
|
-
code:
|
|
148
|
+
code: null,
|
|
147
149
|
code_hash: null,
|
|
148
150
|
config: {
|
|
149
151
|
column: null,
|
|
@@ -163,24 +165,22 @@ function createEmptySessionCell(): SessionCell {
|
|
|
163
165
|
};
|
|
164
166
|
}
|
|
165
167
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
notebookCell: NotebookCell,
|
|
169
|
-
): CellData {
|
|
168
|
+
/** The cell as a host would describe it. A snapshot never changes, so its etags only need to be distinct. */
|
|
169
|
+
function cellRecord(cellId: CellId, cell: NotebookCell): Protocol.Cell {
|
|
170
170
|
return {
|
|
171
171
|
id: cellId,
|
|
172
|
-
|
|
173
|
-
code:
|
|
174
|
-
|
|
175
|
-
lastCodeRun: null,
|
|
176
|
-
lastExecutionTime: null,
|
|
172
|
+
notebook_id: EMBEDDED,
|
|
173
|
+
code: cell.code,
|
|
174
|
+
name: cell.name || DEFAULT_CELL_NAME,
|
|
177
175
|
config: {
|
|
178
|
-
column:
|
|
179
|
-
disabled:
|
|
180
|
-
hide_code:
|
|
181
|
-
expand_output:
|
|
176
|
+
column: cell.config?.column ?? null,
|
|
177
|
+
disabled: cell.config?.disabled ?? false,
|
|
178
|
+
hide_code: cell.config?.hide_code ?? false,
|
|
179
|
+
expand_output: cell.config?.expand_output ?? false,
|
|
182
180
|
},
|
|
183
|
-
|
|
181
|
+
etag: `${EMBEDDED}:${cellId}`,
|
|
182
|
+
code_hash: cell.code_hash ?? `${EMBEDDED}:${cellId}:code`,
|
|
183
|
+
version: 1,
|
|
184
184
|
};
|
|
185
185
|
}
|
|
186
186
|
|
|
@@ -206,8 +206,20 @@ function createCellRuntimeFromSession(
|
|
|
206
206
|
channel: "marimo-error",
|
|
207
207
|
data: [
|
|
208
208
|
{
|
|
209
|
-
type: "
|
|
209
|
+
type: "exception",
|
|
210
|
+
exception_type: primaryOutput.ename,
|
|
210
211
|
msg: primaryOutput.evalue,
|
|
212
|
+
raising_cell: null,
|
|
213
|
+
traceback:
|
|
214
|
+
primaryOutput.traceback.length === 0
|
|
215
|
+
? null
|
|
216
|
+
: primaryOutput.traceback
|
|
217
|
+
.map((line, index, lines) =>
|
|
218
|
+
index < lines.length - 1 && !line.endsWith("\n")
|
|
219
|
+
? `${line}\n`
|
|
220
|
+
: line,
|
|
221
|
+
)
|
|
222
|
+
.join(""),
|
|
211
223
|
},
|
|
212
224
|
],
|
|
213
225
|
mimetype: "application/vnd.marimo+error",
|
|
@@ -223,6 +235,9 @@ function createCellRuntimeFromSession(
|
|
|
223
235
|
timestamp: DEFAULT_TIMESTAMP,
|
|
224
236
|
};
|
|
225
237
|
}
|
|
238
|
+
if (runtimeState.output && primaryOutput.code !== undefined) {
|
|
239
|
+
runtimeState.output.code = primaryOutput.code;
|
|
240
|
+
}
|
|
226
241
|
}
|
|
227
242
|
|
|
228
243
|
const consoleOutputs = sessionCell.console || [];
|
|
@@ -237,7 +252,13 @@ function createCellRuntimeFromSession(
|
|
|
237
252
|
channel: "media",
|
|
238
253
|
data: consoleOutput.data,
|
|
239
254
|
mimetype: consoleOutput.mimetype,
|
|
255
|
+
...(consoleOutput.traceback_format === undefined
|
|
256
|
+
? {}
|
|
257
|
+
: { traceback_format: consoleOutput.traceback_format }),
|
|
240
258
|
timestamp: DEFAULT_TIMESTAMP,
|
|
259
|
+
...(consoleOutput.code === undefined
|
|
260
|
+
? {}
|
|
261
|
+
: { code: consoleOutput.code }),
|
|
241
262
|
};
|
|
242
263
|
}
|
|
243
264
|
// Handle StreamOutput (type: "stream")
|
|
@@ -245,51 +266,80 @@ function createCellRuntimeFromSession(
|
|
|
245
266
|
channel: consoleOutput.name === "stderr" ? "stderr" : "stdout",
|
|
246
267
|
data: consoleOutput.text,
|
|
247
268
|
mimetype: consoleOutput.mimetype ?? "text/plain",
|
|
269
|
+
...(consoleOutput.traceback_format === undefined
|
|
270
|
+
? {}
|
|
271
|
+
: { traceback_format: consoleOutput.traceback_format }),
|
|
248
272
|
timestamp: DEFAULT_TIMESTAMP,
|
|
273
|
+
...(consoleOutput.code === undefined
|
|
274
|
+
? {}
|
|
275
|
+
: { code: consoleOutput.code }),
|
|
249
276
|
};
|
|
250
277
|
}),
|
|
251
278
|
};
|
|
252
279
|
}
|
|
253
280
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
281
|
+
/**
|
|
282
|
+
* Read the session and notebook a page embeds.
|
|
283
|
+
*
|
|
284
|
+
* The cells become a host snapshot the replica starts from, and the session's
|
|
285
|
+
* outputs seed each cell's runtime until the kernel speaks. Null when the page
|
|
286
|
+
* carries no cells.
|
|
287
|
+
*/
|
|
288
|
+
export function readExport({
|
|
289
|
+
session,
|
|
290
|
+
notebook,
|
|
291
|
+
filename,
|
|
292
|
+
appConfig,
|
|
293
|
+
}: {
|
|
294
|
+
session: api.Session["NotebookSessionV1"] | null | undefined;
|
|
295
|
+
notebook: api.Notebook["NotebookV1"] | null | undefined;
|
|
296
|
+
filename: string | null;
|
|
297
|
+
appConfig: Record<string, unknown>;
|
|
298
|
+
}): {
|
|
299
|
+
snapshot: StaticNotebookSnapshot | null;
|
|
300
|
+
cellRuntime: Record<CellId, CellRuntimeState>;
|
|
301
|
+
} {
|
|
259
302
|
const { cellIds, sessionCellData, notebookCellData } =
|
|
260
303
|
mergeSessionAndNotebookCells(session, notebook);
|
|
261
|
-
|
|
262
304
|
if (cellIds.length === 0) {
|
|
263
|
-
return null;
|
|
305
|
+
return { snapshot: null, cellRuntime: {} };
|
|
264
306
|
}
|
|
265
307
|
|
|
266
|
-
const
|
|
308
|
+
const cells: Protocol.Cell[] = [];
|
|
267
309
|
const cellRuntime: Record<CellId, CellRuntimeState> = {};
|
|
268
|
-
|
|
269
|
-
// Process each cell
|
|
270
310
|
for (const cellId of cellIds) {
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
// This needs always be created even if there is no session cell
|
|
281
|
-
// in order to display the cell in the correct state
|
|
282
|
-
cellRuntime[cellId] = createCellRuntimeFromSession(sessionCell);
|
|
311
|
+
cells.push(
|
|
312
|
+
cellRecord(
|
|
313
|
+
cellId,
|
|
314
|
+
notebookCellData.get(cellId) ?? createEmptyNotebookCell(),
|
|
315
|
+
),
|
|
316
|
+
);
|
|
317
|
+
cellRuntime[cellId] = createCellRuntimeFromSession(
|
|
318
|
+
sessionCellData.get(cellId),
|
|
319
|
+
);
|
|
283
320
|
}
|
|
284
321
|
|
|
285
322
|
return {
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
323
|
+
snapshot: {
|
|
324
|
+
notebook: {
|
|
325
|
+
id: EMBEDDED,
|
|
326
|
+
project_id: EMBEDDED,
|
|
327
|
+
path: filename,
|
|
328
|
+
name: filename ?? EMPTY_STRING,
|
|
329
|
+
updated_at: null,
|
|
330
|
+
},
|
|
331
|
+
document: {
|
|
332
|
+
notebook_id: EMBEDDED,
|
|
333
|
+
order: cellIds,
|
|
334
|
+
app_config: appConfig,
|
|
335
|
+
etag: `${EMBEDDED}:document`,
|
|
336
|
+
saved_etag: `${EMBEDDED}:document`,
|
|
337
|
+
order_etag: `${EMBEDDED}:order`,
|
|
338
|
+
app_config_etag: `${EMBEDDED}:app_config`,
|
|
339
|
+
version: 1,
|
|
340
|
+
},
|
|
341
|
+
cells,
|
|
342
|
+
},
|
|
343
|
+
cellRuntime,
|
|
294
344
|
};
|
|
295
345
|
}
|
package/src/core/cells/types.ts
CHANGED
|
@@ -1,13 +1,24 @@
|
|
|
1
1
|
/* Copyright 2026 Marimo. All rights reserved. */
|
|
2
2
|
|
|
3
3
|
import type { Milliseconds, Seconds } from "@/utils/time";
|
|
4
|
-
import type { SerializedEditorState } from "../codemirror/types";
|
|
5
4
|
import type { OutputMessage } from "../kernel/messages";
|
|
6
5
|
import type { CellConfig, RuntimeState } from "../network/types";
|
|
7
6
|
import type { CellId } from "./ids";
|
|
8
7
|
import { DEFAULT_CELL_NAME } from "./names";
|
|
9
8
|
import type { Outline } from "./outline";
|
|
10
9
|
|
|
10
|
+
/**
|
|
11
|
+
* Whether a cell's code has changed since it last ran. A cell that never ran
|
|
12
|
+
* is edited once it has code. Whitespace at the ends does not count.
|
|
13
|
+
*
|
|
14
|
+
* TODO(MO-8028): Temporary until staleness comes from the host's executions.
|
|
15
|
+
*/
|
|
16
|
+
export function isEdited(lastCodeRun: string | null, code: string): boolean {
|
|
17
|
+
return lastCodeRun === null
|
|
18
|
+
? code.trim().length > 0
|
|
19
|
+
: lastCodeRun.trim() !== code.trim();
|
|
20
|
+
}
|
|
21
|
+
|
|
11
22
|
/**
|
|
12
23
|
* Create a new cell with default state.
|
|
13
24
|
*/
|
|
@@ -19,7 +30,6 @@ export function createCell({
|
|
|
19
30
|
lastExecutionTime = null,
|
|
20
31
|
edited = false,
|
|
21
32
|
config,
|
|
22
|
-
serializedEditorState = null,
|
|
23
33
|
}: Partial<CellData> & { id: CellId }): CellData {
|
|
24
34
|
return {
|
|
25
35
|
id: id,
|
|
@@ -34,7 +44,6 @@ export function createCell({
|
|
|
34
44
|
edited: edited,
|
|
35
45
|
lastCodeRun: lastCodeRun,
|
|
36
46
|
lastExecutionTime: lastExecutionTime,
|
|
37
|
-
serializedEditorState: serializedEditorState,
|
|
38
47
|
};
|
|
39
48
|
}
|
|
40
49
|
|
|
@@ -85,8 +94,6 @@ export interface CellData {
|
|
|
85
94
|
lastExecutionTime: number | null;
|
|
86
95
|
/** cell configuration */
|
|
87
96
|
config: CellConfig;
|
|
88
|
-
/** serialized state of the underlying editor */
|
|
89
|
-
serializedEditorState: SerializedEditorState | null;
|
|
90
97
|
}
|
|
91
98
|
|
|
92
99
|
export interface CellRuntimeState {
|
|
@@ -95,7 +102,7 @@ export interface CellRuntimeState {
|
|
|
95
102
|
/** TOC outline */
|
|
96
103
|
outline: Outline | null;
|
|
97
104
|
/** messages encoding the cell's console outputs. */
|
|
98
|
-
consoleOutputs:
|
|
105
|
+
consoleOutputs: ConsoleOutputMessage[];
|
|
99
106
|
/** current status of the cell */
|
|
100
107
|
status: RuntimeState;
|
|
101
108
|
/** whether the cell has stale inputs*/
|
|
@@ -130,3 +137,12 @@ export type WithResponse<T> = T & {
|
|
|
130
137
|
*/
|
|
131
138
|
response?: string;
|
|
132
139
|
};
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* A console output as held by the frontend. The id is assigned when the
|
|
143
|
+
* output arrives and never changes, so it can identify the output while
|
|
144
|
+
* neighboring outputs collapse, truncate, or receive a stdin response.
|
|
145
|
+
*/
|
|
146
|
+
export type ConsoleOutputMessage = WithResponse<OutputMessage> & {
|
|
147
|
+
id?: number;
|
|
148
|
+
};
|
package/src/core/cells/utils.ts
CHANGED
|
@@ -25,7 +25,7 @@ export function notebookNeedsRun(state: NotebookState) {
|
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
export function notebookCells(state: NotebookState) {
|
|
28
|
-
return state.cellIds.
|
|
28
|
+
return state.cellIds.map((cellId) => state.cellData[cellId]);
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
export function notebookCellEditorViews({ cellHandles }: NotebookState) {
|
|
@@ -42,7 +42,7 @@ export function notebookCellEditorViews({ cellHandles }: NotebookState) {
|
|
|
42
42
|
export function disabledCellIds(state: NotebookState) {
|
|
43
43
|
const { cellIds, cellData } = state;
|
|
44
44
|
const disabledCells: CellId[] = [];
|
|
45
|
-
for (const cellId of cellIds
|
|
45
|
+
for (const cellId of cellIds) {
|
|
46
46
|
const cell = cellData[cellId];
|
|
47
47
|
if (cell.config.disabled) {
|
|
48
48
|
disabledCells.push(cellId);
|
|
@@ -54,7 +54,7 @@ export function disabledCellIds(state: NotebookState) {
|
|
|
54
54
|
export function enabledCellIds(state: NotebookState) {
|
|
55
55
|
const { cellIds, cellData } = state;
|
|
56
56
|
const enabledCells: CellId[] = [];
|
|
57
|
-
for (const cellId of cellIds
|
|
57
|
+
for (const cellId of cellIds) {
|
|
58
58
|
const cell = cellData[cellId];
|
|
59
59
|
if (!cell.config.disabled) {
|
|
60
60
|
enabledCells.push(cellId);
|
|
@@ -79,11 +79,13 @@ export function getUndoLabel(state: NotebookState): string {
|
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
/**
|
|
82
|
-
*
|
|
82
|
+
* Summarize the run state of the given descendants, whether any is stale,
|
|
83
|
+
* errored, or running.
|
|
83
84
|
*/
|
|
84
|
-
export function getDescendantsStatus(
|
|
85
|
-
|
|
86
|
-
|
|
85
|
+
export function getDescendantsStatus(
|
|
86
|
+
state: NotebookState,
|
|
87
|
+
descendants: readonly CellId[],
|
|
88
|
+
) {
|
|
87
89
|
const stale = descendants.some(
|
|
88
90
|
(id) => state.cellRuntime[id]?.staleInputs || state.cellData[id]?.edited,
|
|
89
91
|
);
|
|
@@ -106,7 +108,7 @@ export function getDescendantsStatus(state: NotebookState, cellId: CellId) {
|
|
|
106
108
|
*/
|
|
107
109
|
export function staleCellIds(state: NotebookState) {
|
|
108
110
|
const { cellIds, cellData, cellRuntime } = state;
|
|
109
|
-
return cellIds.
|
|
111
|
+
return cellIds.filter(
|
|
110
112
|
(cellId) =>
|
|
111
113
|
isUninstantiated({
|
|
112
114
|
// runElapstedTimeMs is what we've seen in this session
|