@marimo-team/frontend 0.25.3-dev10 → 0.25.3-dev101

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.
Files changed (461) hide show
  1. package/dist/assets/CellStatus-fK4n2NPc.js +1 -0
  2. package/dist/assets/{ConnectedDataExplorerComponent-t8fH_TNc.js → ConnectedDataExplorerComponent-Dft8R6l5.js} +1 -1
  3. package/dist/assets/{ErrorBoundary-B4n9EnHB.js → ErrorBoundary-CAEGdoFW.js} +2 -2
  4. package/dist/assets/JsonOutput-CyAKmZDD.js +11 -0
  5. package/dist/assets/{LazyAnyLanguageCodeMirror-CKcCbG2G.js → LazyAnyLanguageCodeMirror-BPYE76jR.js} +2 -2
  6. package/dist/assets/MarimoErrorOutput-CgZvP0p0.js +10 -0
  7. package/dist/assets/{RenderHTML-9bMgbYmo.js → RenderHTML-DQvxDDNS.js} +1 -1
  8. package/dist/assets/RunButton-BBDnDL6G.js +1 -0
  9. package/dist/assets/__vite-browser-external-8vDMR0Kk.js +1 -0
  10. package/dist/assets/__vite-browser-external-mKcnhO20.js +1 -0
  11. package/dist/assets/{add-cell-with-ai-f_MnLCwI.js → add-cell-with-ai-Clg5FELx.js} +7 -7
  12. package/dist/assets/{add-connection-dialog-CoE_PhuD.js → add-connection-dialog-BqdWmD-7.js} +2 -2
  13. package/dist/assets/{agent-panel-BWZz24jK.js → agent-panel-5RxG5Y82.js} +3 -3
  14. package/dist/assets/ai-model-dropdown-Bvl1ktQq.js +13 -0
  15. package/dist/assets/{alert-dialog-BaPGzeOK.js → alert-dialog-C-sWmKva.js} +1 -1
  16. package/dist/assets/any-language-editor-DUMe1UCk.js +1 -0
  17. package/dist/assets/{app-config-button-BhU0ulYs.js → app-config-button-0QTeQ2Mv.js} +1 -1
  18. package/dist/assets/arrays-0R2reF2y.js +1 -0
  19. package/dist/assets/{blob-iOBwGaP9.js → blob-5VcB8K_t.js} +1 -1
  20. package/dist/assets/{button-COI-NGrx.js → button-D8gVKwe-.js} +1 -1
  21. package/dist/assets/{cache-panel-DTY1dqvi.js → cache-panel-BV-c7ed0.js} +1 -1
  22. package/dist/assets/{capabilities-BJvf-MD4.js → capabilities-Pq1YNPlK.js} +1 -1
  23. package/dist/assets/cell-editor-Byw5y-oI.js +42 -0
  24. package/dist/assets/cell-link-C5yYyzuF.js +1 -0
  25. package/dist/assets/{cells-rA_jsZCj.js → cells-D_11MjVB.js} +60 -60
  26. package/dist/assets/{chat-display-BmEPmhDP.js → chat-display-BCR_ySiV.js} +1 -1
  27. package/dist/assets/chat-panel-RPRvBsaU.js +4 -0
  28. package/dist/assets/chat-ui-CGviVaRA.js +4 -0
  29. package/dist/assets/{circle-DXf-VWZG.js → circle-B6D_6D8w.js} +1 -1
  30. package/dist/assets/code-visibility-DYDagVy7.js +1 -0
  31. package/dist/assets/coerce-DWjFeXOY.js +1 -0
  32. package/dist/assets/column-preview-xe533-Cn.js +1 -0
  33. package/dist/assets/command-palette-BB9bWdWp.js +1 -0
  34. package/dist/assets/{common-lisZ0l6a.js → common-CaeItbcI.js} +1 -1
  35. package/dist/assets/components-CBE8cOLK.js +1 -0
  36. package/dist/assets/{components-CP_UoFtT.js → components-DCo7mAWO.js} +1 -1
  37. package/dist/assets/{components-Dvd1GnD6.js → components-G6frbw0c.js} +1 -1
  38. package/dist/assets/config-CD1IuZFJ.js +1 -0
  39. package/dist/assets/{config-DJLAC21v.js → config-DMz7oN0r.js} +1 -1
  40. package/dist/assets/config-DpY86_Yq.js +1 -0
  41. package/dist/assets/{copy-D8O_CYCG.js → copy-KlhazlhB.js} +1 -1
  42. package/dist/assets/{copy-icon-BIiRXh_3.js → copy-icon-8-a5vovc.js} +1 -1
  43. package/dist/assets/{createReducer-DgRODTW6.js → createReducer-CaI_Oa0v.js} +1 -1
  44. package/dist/assets/{datasource-Dr1xNKUn.js → datasource-deuXnlU-.js} +1 -1
  45. package/dist/assets/{dates-CfmdTL6B.js → dates-CQMwFko2.js} +1 -1
  46. package/dist/assets/{dependency-graph-panel-B0uP-_id.js → dependency-graph-panel-CIykLnJe.js} +2 -2
  47. package/dist/assets/{dist-iaThVDkA.js → dist-jlhMTKo_.js} +1 -1
  48. package/dist/assets/{documentation-panel-DVl_ebWy.js → documentation-panel-2PQ8kQLa.js} +1 -1
  49. package/dist/assets/{download-Bx55LMki.js → download-dK52bLxZ.js} +1 -1
  50. package/dist/assets/{dropdown-menu-C1rnl-0o.js → dropdown-menu-DS6umAnH.js} +1 -1
  51. package/dist/assets/edit-page-DrElzw10.js +9 -0
  52. package/dist/assets/{error-banner-Cd69vvyX.js → error-banner-B5kzVf_0.js} +1 -1
  53. package/dist/assets/{error-entries-DOWpdGvI.js → error-entries-3GVk2KjS.js} +1 -1
  54. package/dist/assets/{error-panel-DpbNKSLs.js → error-panel-CzDRGPeC.js} +1 -1
  55. package/dist/assets/{errors-DCrsa1nH.js → errors-CNsgAw6m.js} +1 -1
  56. package/dist/assets/{es-Cqst59WX.js → es-N9SHpmG7.js} +1 -1
  57. package/dist/assets/{feedback-button-B99ThNJW.js → feedback-button-C5NgWpFg.js} +2 -2
  58. package/dist/assets/feedback-button-CONwLFpw.js +1 -0
  59. package/dist/assets/file-explorer-panel-B50xDnTZ.js +1 -0
  60. package/dist/assets/{file-name-input-ChnBsDE_.js → file-name-input-DqwMSgGU.js} +1 -1
  61. package/dist/assets/{floating-outline-MYqQW4Vp.js → floating-outline-ChmAuvxz.js} +1 -1
  62. package/dist/assets/{formats-yZ06h1Pl.js → formats-zylfwejq.js} +1 -1
  63. package/dist/assets/{formatting-BqrP-n49.js → formatting-uom1es4b.js} +1 -1
  64. package/dist/assets/{fullscreen-B9tHcfpV.js → fullscreen-BWTs8pYZ.js} +1 -1
  65. package/dist/assets/{gallery-page-DSL0J4md.js → gallery-page-CiL8aMS1.js} +1 -1
  66. package/dist/assets/{ganttDiagram-EL5Y4UJY-2n7Ig5Jm.js → ganttDiagram-EL5Y4UJY-CYqkCfFG.js} +1 -1
  67. package/dist/assets/{glide-data-editor-B1MWlKeM.js → glide-data-editor-CqRclBkp.js} +2 -2
  68. package/dist/assets/{glide-utils-CIrAxdjv.js → glide-utils-HFqhvWHI.js} +2 -2
  69. package/dist/assets/home-page-BgZVl4dP.js +1 -0
  70. package/dist/assets/{hooks-BIogTGCr.js → hooks-DM5n7Osw.js} +1 -1
  71. package/dist/assets/{html-to-image-DK9Zl1lU.js → html-to-image-D_0rd3_B.js} +1 -1
  72. package/dist/assets/index-BnhSnwvB.css +2 -0
  73. package/dist/assets/index-EG2n8Oht.js +30 -0
  74. package/dist/assets/{input-BoBxR50a.js → input-DmHMEZGh.js} +1 -1
  75. package/dist/assets/kiosk-mode-DFS6HopF.js +1 -0
  76. package/dist/assets/layout-BpP8nTjb.js +9 -0
  77. package/dist/assets/linear-Bma8J3iM.js +1 -0
  78. package/dist/assets/links-DX2w97N9.js +1 -0
  79. package/dist/assets/{logs-panel-y0XnfulJ.js → logs-panel-B5eVAZtH.js} +1 -1
  80. package/dist/assets/{markdown-renderer-Q5AhbRU3.js → markdown-renderer-BWUzqkJM.js} +1 -1
  81. package/dist/assets/{menu-items-BrwnTgyK.js → menu-items-BgUyNUpu.js} +1 -1
  82. package/dist/assets/{mermaid-a3xYymTy.js → mermaid-BKXlWk4F.js} +2 -2
  83. package/dist/assets/{name-cell-input-BNOnF6-0.js → name-cell-input-DXW68gRW.js} +1 -1
  84. package/dist/assets/numbers-CsZVw3Dc.js +1 -0
  85. package/dist/assets/{objects-snlMn4yk.js → objects-rLPlQ3X_.js} +1 -1
  86. package/dist/assets/{once-Haz_uxEL.js → once-6KNTRW0u.js} +1 -1
  87. package/dist/assets/{outline-panel-Be7stWwv.js → outline-panel-DPxJhJ_A.js} +1 -1
  88. package/dist/assets/{package-data-dv4FBHxR.js → package-data-CKPmBDtg.js} +1 -1
  89. package/dist/assets/packages-panel-gBE2FWQr.js +1 -0
  90. package/dist/assets/{panel-accordion-state-GeMEdCPw.js → panel-accordion-state-CCF5Gxnc.js} +1 -1
  91. package/dist/assets/panels-Dr6qMCvU.js +105 -0
  92. package/dist/assets/precisionRound-BxlUs8G4.js +1 -0
  93. package/dist/assets/process-output-Cw9IDcKQ.js +1 -0
  94. package/dist/assets/{quadrantDiagram-AXDQQJYC-yBhCDI7E.js → quadrantDiagram-AXDQQJYC-D9KH5Zge.js} +1 -1
  95. package/dist/assets/react-vega-BTNeboR2.js +189 -0
  96. package/dist/assets/{readonly-code-display-YULOXf4h.js → readonly-code-display-DYcZQ28T.js} +1 -1
  97. package/dist/assets/{readonly-python-code-CadgXgRu.js → readonly-python-code-RFuQP50v.js} +1 -1
  98. package/dist/assets/{renderShortcut-BkVJQ_Zh.js → renderShortcut-rUwGqKgC.js} +1 -1
  99. package/dist/assets/{requests-lt0JK8Jt.js → requests-BIFR-h4M.js} +1 -1
  100. package/dist/assets/requests-DuLJN9Tf.js +1 -0
  101. package/dist/assets/{reveal-component-BVAR7ayZ.js → reveal-component-yRrDmCQz.js} +37 -37
  102. package/dist/assets/run-page-B69M4-zE.js +1 -0
  103. package/dist/assets/{runs-BLp5jezv.js → runs-C49hleBy.js} +1 -1
  104. package/dist/assets/{runtime-details-state-DuChzsA6.js → runtime-details-state-pobtu6TO.js} +1 -1
  105. package/dist/assets/{save-worker-BbUSwZRG.js → save-worker-pCkSHhuz.js} +1 -1
  106. package/dist/assets/{schemas-Dv42wLFq.js → schemas-ChRqMOTL.js} +1 -1
  107. package/dist/assets/scratchpad-panel-H44_pvb_.js +1 -0
  108. package/dist/assets/{scroll-to-bottom-button-1FyowpWV.js → scroll-to-bottom-button-CIkON2WJ.js} +1 -1
  109. package/dist/assets/{secrets-panel-Bctbtkrp.js → secrets-panel-bcfEKxRx.js} +1 -1
  110. package/dist/assets/{select-DTBn5eTb.js → select-3CVGlYrC.js} +1 -1
  111. package/dist/assets/{session-DqoWmb7X.js → session-CMLIzZKw.js} +1 -1
  112. package/dist/assets/session-panel-Bnd1iXkO.js +1 -0
  113. package/dist/assets/{snippets-panel-CQ1dn3lA.js → snippets-panel-DKApxKx9.js} +1 -1
  114. package/dist/assets/{spec-BfSBcO5B.js → spec-uCpVvaAR.js} +1 -1
  115. package/dist/assets/{state-uwRvJLb8.js → state-3mcyTS9q.js} +1 -1
  116. package/dist/assets/state-B_MCKzBL.js +1 -0
  117. package/dist/assets/state-Bl9BiY_s.js +3 -0
  118. package/dist/assets/{state-C3oDoyFe.js → state-C5WAeuTu.js} +1 -1
  119. package/dist/assets/{state-DxQnC_1I.js → state-Cv2JW3l9.js} +1 -1
  120. package/dist/assets/{state-Bfh_2SLl.js → state-Dv059B3A.js} +1 -1
  121. package/dist/assets/{strings-B2vv-ENv.js → strings-C25fhMR_.js} +1 -1
  122. package/dist/assets/{swiper-component-a07domrZ.js → swiper-component-CRGRy5_O.js} +1 -1
  123. package/dist/assets/{switch-CTaiAjrz.js → switch-DYjBfpNJ.js} +1 -1
  124. package/dist/assets/{tabs-BuQlZFbt.js → tabs-CY8E4r9U.js} +1 -1
  125. package/dist/assets/{terminal-Ck_vK-34.js → terminal-Ca-kubKb.js} +1 -1
  126. package/dist/assets/{time-MgToa8VM.js → time-DswSXBDk.js} +1 -1
  127. package/dist/assets/{toast-BGzLGnvw.js → toast-Gzxi-le_.js} +1 -1
  128. package/dist/assets/tooltip-Brya4Ghn.js +61 -0
  129. package/dist/assets/{tooltip-C9TuY18o.js → tooltip-CkGm8X7m.js} +1 -1
  130. package/dist/assets/tracing-Clwy4SlW.js +1 -0
  131. package/dist/assets/tracing-panel-BwjLG_aC.js +2 -0
  132. package/dist/assets/{tree-actions-DAd80MbP.js → tree-actions-BZNTQ12N.js} +1 -1
  133. package/dist/assets/{use-restore-focus-BxEGwIbk.js → use-restore-focus-DdS7Tl0F.js} +1 -1
  134. package/dist/assets/{useAddCell-DGstJK0S.js → useAddCell-Cjuqk2YR.js} +1 -1
  135. package/dist/assets/useAsyncData-qvoPYHtx.js +1 -0
  136. package/dist/assets/useBoolean-Dd2nWXFJ.js +1 -0
  137. package/dist/assets/useCellActionButton-MoWLvuGe.js +1 -0
  138. package/dist/assets/useDebounce-DwTQ_1Pu.js +1 -0
  139. package/dist/assets/{useDeepCompareMemoize-DFIVN9dn.js → useDeepCompareMemoize-B2DVK2De.js} +1 -1
  140. package/dist/assets/useDelayElapsed-BlsDT4TV.js +1 -0
  141. package/dist/assets/{useDeleteCell-DFBGlSQk.js → useDeleteCell-BC-MW7d1.js} +1 -1
  142. package/dist/assets/{useDependencyPanelTab-DydxsE5d.js → useDependencyPanelTab-CZU7i-B3.js} +1 -1
  143. package/dist/assets/{useEvent-Dfcbgjhg.js → useEvent-BDjgaBtz.js} +1 -1
  144. package/dist/assets/{useEventListener-D9cftcHj.js → useEventListener-CjDeLqFC.js} +1 -1
  145. package/dist/assets/{useIframeCapabilities-CwTkczVN.js → useIframeCapabilities-Czr9e4uG.js} +1 -1
  146. package/dist/assets/{useInstallPackage-iX1eufdl.js → useInstallPackage-wcDq9hYT.js} +1 -1
  147. package/dist/assets/{useInterval--x3s1VpI.js → useInterval-DJdQmXnq.js} +1 -1
  148. package/dist/assets/useNotebookActions-wFxVdRXQ.js +1 -0
  149. package/dist/assets/{useRunCells-BFjFX3hz.js → useRunCells-ByaWxoIt.js} +1 -1
  150. package/dist/assets/{useSplitCell-Tqv5pPtL.js → useSplitCell-YJIystwv.js} +1 -1
  151. package/dist/assets/useStateForKey-CGMJQT8x.js +1 -0
  152. package/dist/assets/{useTheme-COhSHkCj.js → useTheme-BAA27lh7.js} +1 -1
  153. package/dist/assets/{utils-CaQYvazl.js → utils-DfElfBpz.js} +1 -1
  154. package/dist/assets/vega-component-BeyxAJad.js +1 -0
  155. package/dist/assets/{vega-embed-container-DJPNkHPb.js → vega-embed-container-DtArSJz1.js} +1 -1
  156. package/dist/assets/vega-loader.browser-Bu25TKax.js +6 -0
  157. package/dist/assets/{worker-DTQ7oH2A.js → worker-bSCjCvwz.js} +1 -1
  158. package/dist/assets/{write-secret-modal-DzKAInL2.js → write-secret-modal-BEx-EUlh.js} +1 -1
  159. package/dist/assets/{xychartDiagram-S5SC5T6Z-KbGzG6-u.js → xychartDiagram-S5SC5T6Z-CeRnBS5e.js} +1 -1
  160. package/dist/index.html +80 -78
  161. package/package.json +7 -7
  162. package/src/__tests__/host-imports.test.ts +1 -0
  163. package/src/components/app-config/ai-config.tsx +7 -2
  164. package/src/components/chat/__tests__/message-queue.test.tsx +17 -0
  165. package/src/components/chat/acp/__tests__/state.test.ts +2 -2
  166. package/src/components/chat/acp/blocks.tsx +2 -2
  167. package/src/components/chat/chat-components.tsx +2 -0
  168. package/src/components/chat/chat-panel.tsx +9 -8
  169. package/src/components/chat/chat-utils.ts +4 -8
  170. package/src/components/data-table/__tests__/column-explorer.test.tsx +27 -1
  171. package/src/components/data-table/__tests__/columns.test.tsx +105 -0
  172. package/src/components/data-table/__tests__/context-menu-interaction.test.tsx +130 -0
  173. package/src/components/data-table/__tests__/date-popover.test.tsx +72 -0
  174. package/src/components/data-table/__tests__/export-actions.test.tsx +105 -0
  175. package/src/components/data-table/__tests__/search-highlight.test.tsx +109 -0
  176. package/src/components/data-table/__tests__/url-detector.test.tsx +74 -0
  177. package/src/components/data-table/cell-selection/feature.ts +2 -2
  178. package/src/components/data-table/cell-selection/types.ts +2 -2
  179. package/src/components/data-table/charts/__tests__/chart-panel.test.tsx +74 -1
  180. package/src/components/data-table/charts/__tests__/storage.test.ts +4 -1
  181. package/src/components/data-table/charts/charts.tsx +35 -25
  182. package/src/components/data-table/charts/storage.ts +16 -5
  183. package/src/components/data-table/column-explorer-panel/column-explorer.tsx +1 -1
  184. package/src/components/data-table/column-summary/column-summary.tsx +2 -4
  185. package/src/components/data-table/column-visibility-dropdown.tsx +8 -13
  186. package/src/components/data-table/columns.tsx +45 -46
  187. package/src/components/data-table/context-menu.tsx +36 -20
  188. package/src/components/data-table/data-table.tsx +7 -1
  189. package/src/components/data-table/date-popover.tsx +6 -4
  190. package/src/components/data-table/export-actions.tsx +76 -48
  191. package/src/components/data-table/row-viewer-panel/row-viewer.tsx +2 -2
  192. package/src/components/data-table/search-highlight.tsx +79 -0
  193. package/src/components/data-table/types.ts +1 -0
  194. package/src/components/data-table/url-detector.tsx +49 -9
  195. package/src/components/datasources/__tests__/column-actions.test.tsx +97 -0
  196. package/src/components/datasources/__tests__/column-preview.test.tsx +63 -2
  197. package/src/components/datasources/__tests__/table-list.test.tsx +118 -0
  198. package/src/components/datasources/column-preview.tsx +8 -2
  199. package/src/components/datasources/datasources.tsx +47 -35
  200. package/src/components/debugger/debugger-code.tsx +5 -0
  201. package/src/components/dependency-graph/panels.tsx +2 -1
  202. package/src/components/editor/SortableCell.tsx +1 -3
  203. package/src/components/editor/__tests__/dynamic-favicon.test.tsx +111 -18
  204. package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +24 -0
  205. package/src/components/editor/actions/pair-with-agent-modal.tsx +18 -15
  206. package/src/components/editor/ai/add-cell-with-ai.tsx +3 -3
  207. package/src/components/editor/ai/ai-completion-editor.tsx +1 -0
  208. package/src/components/editor/alerts/startup-logs-alert.tsx +1 -0
  209. package/src/components/editor/cell/CreateCellButton.tsx +8 -10
  210. package/src/components/editor/cell/DeleteButton.tsx +1 -0
  211. package/src/components/editor/cell/__tests__/useShouldShowInterrupt.test.ts +39 -0
  212. package/src/components/editor/cell/code/__tests__/language-toggle.test.tsx +54 -0
  213. package/src/components/editor/cell/code/cell-editor.tsx +1 -1
  214. package/src/components/editor/cell/code/language-toggle.tsx +8 -7
  215. package/src/components/editor/cell/useShouldShowInterrupt.ts +2 -12
  216. package/src/components/editor/chrome/panels/__tests__/packages-panel.test.tsx +30 -1
  217. package/src/components/editor/chrome/panels/cache-panel.tsx +1 -0
  218. package/src/components/editor/chrome/panels/packages-panel.tsx +4 -7
  219. package/src/components/editor/chrome/wrapper/__tests__/attachment-status.test.tsx +12 -18
  220. package/src/components/editor/chrome/wrapper/__tests__/pending-ai-cells.test.tsx +58 -1
  221. package/src/components/editor/chrome/wrapper/footer-items/runtime-settings.tsx +1 -7
  222. package/src/components/editor/chrome/wrapper/pending-ai-cells.tsx +12 -2
  223. package/src/components/editor/chrome/wrapper/storage.ts +1 -1
  224. package/src/components/editor/connections/components.tsx +1 -1
  225. package/src/components/editor/controls/__tests__/command-palette.test.tsx +53 -0
  226. package/src/components/editor/controls/command-palette.tsx +22 -10
  227. package/src/components/editor/dynamic-favicon.tsx +21 -40
  228. package/src/components/editor/errors/__tests__/send-error-report-button.test.tsx +12 -23
  229. package/src/components/editor/file-tree/__tests__/file-explorer-interactions.test.tsx +6 -0
  230. package/src/components/editor/file-tree/__tests__/use-file-search.test.tsx +91 -0
  231. package/src/components/editor/file-tree/file-explorer.tsx +10 -5
  232. package/src/components/editor/file-tree/file-viewer.tsx +4 -2
  233. package/src/components/editor/file-tree/use-file-search.ts +35 -21
  234. package/src/components/editor/notebook-banner.tsx +1 -0
  235. package/src/components/editor/output/MarimoTracebackOutput.tsx +2 -2
  236. package/src/components/editor/output/ansi-reduce.ts +6 -0
  237. package/src/components/editor/output/console/ConsoleOutput.tsx +19 -25
  238. package/src/components/editor/package-alert.tsx +6 -4
  239. package/src/components/editor/renderers/vertical-layout/sidebar/toggle.tsx +7 -1
  240. package/src/components/home/components.tsx +17 -31
  241. package/src/components/icons/__tests__/large-spinner.test.tsx +39 -0
  242. package/src/components/icons/large-spinner.tsx +3 -14
  243. package/src/components/icons/spinner.tsx +1 -1
  244. package/src/components/mcp/mcp-status-indicator.tsx +1 -1
  245. package/src/components/pages/__tests__/home-page.test.tsx +116 -0
  246. package/src/components/pages/home-page.tsx +164 -91
  247. package/src/components/scratchpad/scratchpad.tsx +2 -2
  248. package/src/components/slides/reveal-component.tsx +4 -2
  249. package/src/components/slides/slide-cell-view.tsx +1 -1
  250. package/src/components/slides/slide-form.tsx +1 -0
  251. package/src/components/tracing/tracing.tsx +2 -2
  252. package/src/components/ui/alert-dialog.tsx +1 -1
  253. package/src/core/ai/context/providers/datasource.ts +6 -2
  254. package/src/core/attachments/state.ts +5 -8
  255. package/src/core/cells/__tests__/__snapshots__/cells.test.ts.snap +4 -0
  256. package/src/core/cells/__tests__/cell.test.ts +39 -0
  257. package/src/core/cells/__tests__/cells.test.ts +3 -1
  258. package/src/core/cells/__tests__/collapseConsoleOutputs.test.ts +54 -0
  259. package/src/core/cells/__tests__/notebook-outline.test.ts +113 -0
  260. package/src/core/cells/cell.ts +14 -3
  261. package/src/core/cells/cells.ts +3 -1
  262. package/src/core/cells/pending-delete-service.ts +2 -6
  263. package/src/core/cells/session.ts +1 -1
  264. package/src/core/cells/types.ts +10 -1
  265. package/src/core/codemirror/__tests__/setup.test.ts +1 -1
  266. package/src/core/codemirror/keymaps/vim.ts +2 -6
  267. package/src/core/codemirror/language/languages/markdown.ts +1 -1
  268. package/src/core/codemirror/language/languages/python.ts +3 -3
  269. package/src/core/codemirror/language/panel/panel.tsx +1 -0
  270. package/src/core/datasets/__tests__/data-source-discovery.test.ts +4 -4
  271. package/src/core/datasets/data-source-discovery.ts +4 -6
  272. package/src/core/document/__tests__/draft.test.ts +322 -0
  273. package/src/core/document/__tests__/fixtures.ts +92 -0
  274. package/src/core/document/__tests__/lifecycle-scenarios.test.ts +61 -0
  275. package/src/core/document/__tests__/model.test.ts +158 -0
  276. package/src/core/document/__tests__/protocol-fixtures.ts +38 -0
  277. package/src/core/document/__tests__/recovery-scenarios.test.ts +230 -0
  278. package/src/core/document/__tests__/scenario-fixture.ts +42 -0
  279. package/src/core/document/__tests__/scenarios.test.ts +205 -0
  280. package/src/core/document/__tests__/state.test.ts +446 -0
  281. package/src/core/document/__tests__/submission.test.ts +201 -0
  282. package/src/core/document/__tests__/test-host.test.ts +92 -0
  283. package/src/core/document/__tests__/test-host.ts +247 -0
  284. package/src/core/document/__tests__/test-notebook.ts +139 -0
  285. package/src/core/document/__tests__/user.ts +61 -0
  286. package/src/core/document/draft.ts +472 -0
  287. package/src/core/document/index.ts +10 -0
  288. package/src/core/document/model.ts +53 -0
  289. package/src/core/document/state.ts +401 -0
  290. package/src/core/document/sync.ts +359 -0
  291. package/src/core/edit-app.tsx +2 -2
  292. package/src/core/host/AGENTS.md +12 -2
  293. package/src/core/host/__tests__/attachments.test.ts +56 -0
  294. package/src/core/host/__tests__/document.test.ts +126 -0
  295. package/src/core/host/__tests__/fixtures.ts +41 -0
  296. package/src/core/host/__tests__/notebook-client.test.ts +570 -0
  297. package/src/core/host/connection.ts +42 -0
  298. package/src/core/host/notebook-client.ts +297 -0
  299. package/src/core/host/resources/attachments.ts +22 -0
  300. package/src/core/host/resources/document.ts +101 -0
  301. package/src/core/hotkeys/actions.ts +2 -4
  302. package/src/core/islands/__tests__/bootstrap.test.ts +0 -26
  303. package/src/core/islands/bootstrap.ts +0 -1
  304. package/src/core/kernel/__tests__/RuntimeState.test.ts +1 -1
  305. package/src/core/network/connection.ts +4 -2
  306. package/src/core/network/useConnectionNotice.ts +8 -2
  307. package/src/core/run-app.tsx +2 -2
  308. package/src/core/runtime/__tests__/createWsUrl.test.ts +77 -7
  309. package/src/core/runtime/__tests__/runtime.test.ts +18 -17
  310. package/src/core/runtime/runtime.ts +26 -30
  311. package/src/core/state/__tests__/jotai.test.tsx +108 -0
  312. package/src/core/state/jotai.ts +1 -1
  313. package/src/core/static/files.ts +2 -0
  314. package/src/core/wasm/bridge.ts +2 -10
  315. package/src/core/wasm/store.ts +3 -3
  316. package/src/core/wasm/worker/bootstrap.ts +1 -1
  317. package/src/core/wasm/worker/getMarimoWheel.ts +1 -1
  318. package/src/core/websocket/__tests__/{useMarimoKernelConnection.test.ts → connection-state.test.ts} +15 -29
  319. package/src/core/websocket/__tests__/useNotebookClient.hook.test.tsx +223 -0
  320. package/src/core/websocket/__tests__/useNotebookSession.hook.test.tsx +606 -0
  321. package/src/core/websocket/connection-state.ts +60 -0
  322. package/src/core/websocket/state.ts +7 -0
  323. package/src/core/websocket/transports/__tests__/notebook.test.ts +502 -0
  324. package/src/core/websocket/transports/notebook.ts +213 -0
  325. package/src/core/websocket/types.ts +9 -39
  326. package/src/core/websocket/useNotebookClient.ts +89 -0
  327. package/src/core/websocket/{useMarimoKernelConnection.tsx → useNotebookSession.tsx} +53 -233
  328. package/src/css/globals.css +5 -0
  329. package/src/hooks/__tests__/useAsyncData.test.tsx +148 -0
  330. package/src/hooks/__tests__/useDebounce.test.tsx +51 -0
  331. package/src/hooks/__tests__/useDeepCompareMemoize.test.tsx +39 -0
  332. package/src/hooks/__tests__/useDelayElapsed.test.tsx +28 -0
  333. package/src/hooks/__tests__/useInternalStateWithSync.test.tsx +20 -0
  334. package/src/hooks/__tests__/useScript.test.tsx +77 -0
  335. package/src/hooks/__tests__/useStateForKey.test.tsx +257 -0
  336. package/src/hooks/useAsyncData.ts +3 -3
  337. package/src/hooks/useDataSourceDiscovery.ts +6 -4
  338. package/src/hooks/useDebounce.ts +5 -8
  339. package/src/hooks/useDeepCompareMemoize.ts +1 -1
  340. package/src/hooks/useDelayElapsed.ts +14 -10
  341. package/src/hooks/useElapsedTime.ts +3 -3
  342. package/src/hooks/useInputHistory.ts +4 -7
  343. package/src/hooks/useInternalStateWithSync.ts +6 -6
  344. package/src/hooks/useResizeObserver.ts +4 -7
  345. package/src/hooks/useScript.ts +67 -70
  346. package/src/hooks/useStateForKey.ts +93 -0
  347. package/src/plugins/core/registerReactComponent.tsx +1 -1
  348. package/src/plugins/impl/CodeEditorPlugin.tsx +1 -1
  349. package/src/plugins/impl/DataTablePlugin.tsx +14 -15
  350. package/src/plugins/impl/DropdownPlugin.tsx +2 -6
  351. package/src/plugins/impl/FileBrowserPlugin.tsx +4 -16
  352. package/src/plugins/impl/FormPlugin.tsx +1 -1
  353. package/src/plugins/impl/RangeSliderPlugin.tsx +0 -1
  354. package/src/plugins/impl/RefreshPlugin.tsx +1 -0
  355. package/src/plugins/impl/SliderPlugin.tsx +6 -8
  356. package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +117 -1
  357. package/src/plugins/impl/__tests__/FileBrowserPlugin.test.tsx +45 -0
  358. package/src/plugins/impl/__tests__/SliderPlugin.test.tsx +24 -3
  359. package/src/plugins/impl/anywidget/__tests__/registry.test.ts +2 -0
  360. package/src/plugins/impl/anywidget/__tests__/widget-binding.test.ts +241 -2
  361. package/src/plugins/impl/anywidget/runtime.ts +21 -9
  362. package/src/plugins/impl/anywidget/widget-binding.ts +160 -82
  363. package/src/plugins/impl/chat/__tests__/chat-prompts.test.tsx +93 -0
  364. package/src/plugins/impl/chat/chat-ui.tsx +12 -10
  365. package/src/plugins/impl/code/any-language-editor.tsx +2 -2
  366. package/src/plugins/impl/data-editor/glide-data-editor.tsx +8 -5
  367. package/src/plugins/impl/data-editor/glide-utils.ts +3 -1
  368. package/src/plugins/impl/data-explorer/ConnectedDataExplorerComponent.tsx +1 -1
  369. package/src/plugins/impl/data-explorer/state/reducer.ts +1 -1
  370. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +0 -1
  371. package/src/plugins/impl/mpl-interactive/MplInteractivePlugin.tsx +5 -3
  372. package/src/plugins/impl/panel/PanelPlugin.tsx +16 -17
  373. package/src/plugins/impl/panel/__tests__/utils.test.ts +39 -1
  374. package/src/plugins/impl/panel/utils.ts +17 -0
  375. package/src/plugins/impl/vega/make-selectable.ts +4 -7
  376. package/src/plugins/layout/RoutesPlugin.tsx +1 -1
  377. package/src/stories/__tests__/editor-story.test.tsx +33 -0
  378. package/src/stories/button.stories.tsx +1 -0
  379. package/src/stories/editor.stories.tsx +24 -17
  380. package/src/stories/form-wrapper.stories.tsx +2 -2
  381. package/src/stories/select.stories.tsx +2 -2
  382. package/src/stories/switchable-multi-select.stories.tsx +1 -1
  383. package/src/utils/__tests__/arrays.test.ts +35 -0
  384. package/src/utils/__tests__/batch-requests.test.ts +3 -3
  385. package/src/utils/__tests__/numbers.test.ts +48 -1
  386. package/src/utils/__tests__/objects.test.ts +21 -0
  387. package/src/utils/arrays.ts +10 -0
  388. package/src/utils/blob.ts +1 -1
  389. package/src/utils/numbers.ts +28 -17
  390. package/src/utils/objects.ts +3 -7
  391. package/src/utils/once.ts +19 -19
  392. package/src/utils/zod-utils.ts +1 -3
  393. package/dist/assets/CellStatus-nZpuDkm7.js +0 -1
  394. package/dist/assets/JsonOutput-BxB0NL8w.js +0 -11
  395. package/dist/assets/MarimoErrorOutput-BTy4MOzX.js +0 -10
  396. package/dist/assets/RunButton-CFQUNN5c.js +0 -1
  397. package/dist/assets/__vite-browser-external-CYO_P3S8.js +0 -1
  398. package/dist/assets/__vite-browser-external-FeDVGZU8.js +0 -1
  399. package/dist/assets/ai-model-dropdown-zm-2fXzf.js +0 -13
  400. package/dist/assets/any-language-editor-BLCAD3yx.js +0 -1
  401. package/dist/assets/arrays-BqUx5USx.js +0 -1
  402. package/dist/assets/cell-editor-CAj1UKxx.js +0 -21
  403. package/dist/assets/cell-link-1CynTVGQ.js +0 -1
  404. package/dist/assets/chat-panel-Ce2Xh7dM.js +0 -4
  405. package/dist/assets/chat-ui-DTy98rP3.js +0 -4
  406. package/dist/assets/circle-play-CYIb0qT6.js +0 -1
  407. package/dist/assets/code-visibility-B-_GvwR5.js +0 -1
  408. package/dist/assets/coerce-CpE6kUdX.js +0 -1
  409. package/dist/assets/column-preview-DU6dT80y.js +0 -1
  410. package/dist/assets/command-palette-BMqFKXVr.js +0 -1
  411. package/dist/assets/components-CXfO-F47.js +0 -1
  412. package/dist/assets/config-DX8Y2WbJ.js +0 -1
  413. package/dist/assets/config-VPSq73n8.js +0 -1
  414. package/dist/assets/edit-page-DlfCLUaq.js +0 -9
  415. package/dist/assets/feedback-button-DlqZkJwz.js +0 -1
  416. package/dist/assets/file-explorer-panel-Bo9eN3rW.js +0 -1
  417. package/dist/assets/home-page-KrhQ55Vg.js +0 -4
  418. package/dist/assets/index-6b4mf8Ai.css +0 -2
  419. package/dist/assets/index-B3fcrmuf.js +0 -30
  420. package/dist/assets/kiosk-mode-BZECfg9k.js +0 -1
  421. package/dist/assets/layout-DOpdUwym.js +0 -9
  422. package/dist/assets/linear-0eij_aAG.js +0 -1
  423. package/dist/assets/link-NuFVR7G9.js +0 -1
  424. package/dist/assets/links-DkkL9DVa.js +0 -1
  425. package/dist/assets/numbers-Mk3-CcoU.js +0 -1
  426. package/dist/assets/packages-panel-ClxOAEGy.js +0 -1
  427. package/dist/assets/panels-DfCmzLtT.js +0 -4
  428. package/dist/assets/precisionRound-Bq_nmf5u.js +0 -1
  429. package/dist/assets/process-output-DNFKMODr.js +0 -1
  430. package/dist/assets/react-vega-C3rYGtP6.js +0 -189
  431. package/dist/assets/requests-CgSY1X4a.js +0 -1
  432. package/dist/assets/run-page-Cxu1yV8Q.js +0 -1
  433. package/dist/assets/scratchpad-panel-By-ybhjg.js +0 -1
  434. package/dist/assets/session-panel-BmW6PH4z.js +0 -1
  435. package/dist/assets/state-BAJYRhmO.js +0 -1
  436. package/dist/assets/state-z3dlofZB.js +0 -3
  437. package/dist/assets/tooltip-mT3CGest.js +0 -61
  438. package/dist/assets/tracing-BARlJ_Dk.js +0 -1
  439. package/dist/assets/tracing-panel-dgnr2fIN.js +0 -2
  440. package/dist/assets/useAsyncData-C7aJJz0Y.js +0 -1
  441. package/dist/assets/useBoolean-BDD6_xQQ.js +0 -1
  442. package/dist/assets/useCellActionButton-DY9RlJTb.js +0 -1
  443. package/dist/assets/useDebounce-B_ccBZTp.js +0 -1
  444. package/dist/assets/useNotebookActions-DfvB7RD_.js +0 -1
  445. package/dist/assets/vega-component-CnadTgoE.js +0 -1
  446. package/dist/assets/vega-loader.browser-CLRkNgm7.js +0 -6
  447. package/dist/assets/ws-BXWY541V.js +0 -22
  448. package/src/core/host/__tests__/protocol.test.ts +0 -214
  449. package/src/core/host/protocol.ts +0 -1943
  450. package/src/core/state/__tests__/jotai.test.ts +0 -25
  451. package/src/core/websocket/__tests__/useMarimoKernelConnection.hook.test.tsx +0 -789
  452. package/src/core/websocket/__tests__/useWebSocket.test.ts +0 -49
  453. package/src/core/websocket/transports/__tests__/basic.test.ts +0 -275
  454. package/src/core/websocket/transports/__tests__/sse.test.ts +0 -338
  455. package/src/core/websocket/transports/__tests__/transport.test.ts +0 -308
  456. package/src/core/websocket/transports/__tests__/ws.test.ts +0 -125
  457. package/src/core/websocket/transports/basic.ts +0 -102
  458. package/src/core/websocket/transports/sse.ts +0 -308
  459. package/src/core/websocket/transports/transport.ts +0 -61
  460. package/src/core/websocket/transports/ws.ts +0 -98
  461. package/src/core/websocket/useWebSocket.tsx +0 -88
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { describe, expect, it } from "vitest";
4
4
  import { StatefulOutputMessage } from "@/components/editor/output/ansi-reduce";
5
+ import type { ConsoleOutputMessage } from "@/core/cells/types";
5
6
  import type { OutputMessage } from "@/core/kernel/messages";
6
7
  import {
7
8
  collapseConsoleOutputs,
@@ -279,6 +280,59 @@ describe("collapseConsoleOutputs", () => {
279
280
  expect(result[0].data).toContain("Streaming output truncated");
280
281
  });
281
282
 
283
+ it("keeps the first id when collapsing outputs", () => {
284
+ const consoleOutputs = [
285
+ {
286
+ mimetype: "text/plain",
287
+ channel: "output",
288
+ data: "Hello ",
289
+ timestamp: 0,
290
+ id: 7,
291
+ },
292
+ {
293
+ mimetype: "text/plain",
294
+ channel: "output",
295
+ data: "World",
296
+ timestamp: 0,
297
+ id: 8,
298
+ },
299
+ ] satisfies ConsoleOutputMessage[];
300
+ const result = collapseConsoleOutputs(consoleOutputs);
301
+ expect(result).toHaveLength(1);
302
+ expect(result[0].data).toBe("Hello World");
303
+ expect((result[0] as ConsoleOutputMessage).id).toBe(7);
304
+ });
305
+
306
+ it("keeps ids on outputs that survive truncation", () => {
307
+ const consoleOutputs = [
308
+ {
309
+ mimetype: "text/plain",
310
+ channel: "output",
311
+ data: "one\ntwo",
312
+ timestamp: 0,
313
+ id: 1,
314
+ },
315
+ {
316
+ mimetype: "text/plain",
317
+ channel: "stderr",
318
+ data: "three\nfour",
319
+ timestamp: 0,
320
+ id: 2,
321
+ },
322
+ {
323
+ mimetype: "text/plain",
324
+ channel: "output",
325
+ data: "five",
326
+ timestamp: 0,
327
+ id: 3,
328
+ },
329
+ ] satisfies ConsoleOutputMessage[];
330
+ const result = collapseConsoleOutputs(consoleOutputs, 3);
331
+ const ids = result.map((output) => (output as ConsoleOutputMessage).id);
332
+ expect(result[0].data).toContain("Streaming output truncated");
333
+ expect(ids).toEqual([undefined, 2, 3]);
334
+ });
335
+
282
336
  describe("ANSI escape sequences", () => {
283
337
  it("should handle cursor movement with collapse", () => {
284
338
  const consoleOutputs: OutputMessage[] = [
@@ -0,0 +1,113 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import { createStore } from "jotai";
4
+ import { afterEach, describe, expect, it, vi } from "vitest";
5
+ import { MockNotebook } from "@/__mocks__/notebook";
6
+ import { cellId } from "@/__tests__/branded";
7
+ import {
8
+ createNotebookActions,
9
+ notebookAtom,
10
+ notebookOutline,
11
+ notebookReducer,
12
+ } from "../cells";
13
+ import { exportedForTesting } from "../document-changes";
14
+ import type { Outline } from "../outline";
15
+
16
+ const first = cellId("first");
17
+ const second = cellId("second");
18
+ const firstOutline: Outline = {
19
+ items: [{ name: "First", level: 1, by: { id: "first" } }],
20
+ };
21
+ const secondOutline: Outline = {
22
+ items: [{ name: "Second", level: 2, by: { id: "second" } }],
23
+ };
24
+
25
+ function setup() {
26
+ const store = createStore();
27
+ store.set(
28
+ notebookAtom,
29
+ MockNotebook.notebookState({
30
+ cellData: { [first]: { code: "x = 1" }, [second]: {} },
31
+ cellRuntime: {
32
+ [first]: { outline: firstOutline },
33
+ [second]: { outline: secondOutline },
34
+ },
35
+ }),
36
+ );
37
+ const actions = createNotebookActions((action) =>
38
+ store.set(notebookAtom, (state) => notebookReducer(state, action)),
39
+ );
40
+ return { store, actions };
41
+ }
42
+
43
+ afterEach(() => {
44
+ exportedForTesting.cancelPendingChanges();
45
+ });
46
+
47
+ describe("notebookOutline", () => {
48
+ it("does not notify outline subscribers when cell code changes", () => {
49
+ const { store, actions } = setup();
50
+ const initial = store.get(notebookOutline);
51
+ const listener = vi.fn();
52
+ const unsubscribe = store.sub(notebookOutline, listener);
53
+
54
+ actions.updateCellCode({
55
+ cellId: first,
56
+ code: "x = 2",
57
+ formattingChange: false,
58
+ });
59
+
60
+ expect(store.get(notebookOutline)).toBe(initial);
61
+ expect(listener).not.toHaveBeenCalled();
62
+ unsubscribe();
63
+ });
64
+
65
+ it("updates headings when runtime outlines change or are removed", () => {
66
+ const { store } = setup();
67
+ const updated: Outline = {
68
+ items: [{ name: "Updated", level: 1, by: { id: "updated" } }],
69
+ };
70
+
71
+ for (const outline of [updated, null]) {
72
+ store.set(notebookAtom, (state) => ({
73
+ ...state,
74
+ cellRuntime: {
75
+ ...state.cellRuntime,
76
+ [first]: { ...state.cellRuntime[first], outline },
77
+ },
78
+ }));
79
+ expect(store.get(notebookOutline)).toEqual({
80
+ items: [...(outline?.items ?? []), ...secondOutline.items],
81
+ });
82
+ }
83
+ });
84
+
85
+ it("keeps headings in cell order after moving and deleting cells", () => {
86
+ const { store, actions } = setup();
87
+ actions.moveCell({ cellId: second, before: true });
88
+ expect(store.get(notebookOutline)).toEqual({
89
+ items: [...secondOutline.items, ...firstOutline.items],
90
+ });
91
+
92
+ actions.deleteCell({ cellId: second });
93
+ expect(store.get(notebookOutline)).toEqual(firstOutline);
94
+ });
95
+
96
+ it("notifies subscribers when output is replaced with the same headings", () => {
97
+ const { store } = setup();
98
+ const listener = vi.fn();
99
+ const unsubscribe = store.sub(notebookOutline, listener);
100
+
101
+ store.set(notebookAtom, (state) => ({
102
+ ...state,
103
+ cellRuntime: {
104
+ ...state.cellRuntime,
105
+ [first]: { ...state.cellRuntime[first], outline: { ...firstOutline } },
106
+ },
107
+ }));
108
+
109
+ // Consumers must reconnect to replacement heading elements in the DOM.
110
+ expect(listener).toHaveBeenCalledOnce();
111
+ unsubscribe();
112
+ });
113
+ });
@@ -7,7 +7,12 @@ import { parseOutline } from "../dom/outline";
7
7
  import type { CellMessage, OutputMessage } from "../kernel/messages";
8
8
  import type { RuntimeState } from "../network/types";
9
9
  import { collapseConsoleOutputs } from "./collapseConsoleOutputs";
10
- import type { CellRuntimeState } from "./types";
10
+ import type { CellRuntimeState, ConsoleOutputMessage } from "./types";
11
+
12
+ // Ids increase with position, so the last output holds the maximum.
13
+ function nextConsoleOutputId(outputs: ConsoleOutputMessage[]): number {
14
+ return (outputs.at(-1)?.id ?? 0) + 1;
15
+ }
11
16
 
12
17
  export function transitionCell(
13
18
  cell: CellRuntimeState,
@@ -133,6 +138,7 @@ export function transitionCell(
133
138
  mimetype: output.mimetype,
134
139
  data: output.data,
135
140
  timestamp: output.timestamp,
141
+ id: output.id,
136
142
  response: output.response ?? "",
137
143
  };
138
144
  }
@@ -146,8 +152,13 @@ export function transitionCell(
146
152
  // messageConsole is an output that needs to be appended to the
147
153
  // existing console outputs.
148
154
  consoleOutputs = Array.isArray(messageConsole)
149
- ? collapseConsoleOutputs(messageConsole)
150
- : collapseConsoleOutputs([...consoleOutputs, messageConsole]);
155
+ ? collapseConsoleOutputs(
156
+ messageConsole.map((output, i) => ({ ...output, id: i + 1 })),
157
+ )
158
+ : collapseConsoleOutputs([
159
+ ...consoleOutputs,
160
+ { ...messageConsole, id: nextConsoleOutputId(consoleOutputs) },
161
+ ]);
151
162
  }
152
163
  nextCell.consoleOutputs = consoleOutputs;
153
164
  // Derive outline from output
@@ -1114,6 +1114,7 @@ const {
1114
1114
  mimetype: stdinOutput.mimetype,
1115
1115
  data: stdinOutput.data,
1116
1116
  timestamp: stdinOutput.timestamp,
1117
+ id: stdinOutput.id,
1117
1118
  // An empty response resolves the prompt without retaining the secret.
1118
1119
  response: stdinOutput.mimetype === "text/password" ? "" : response,
1119
1120
  };
@@ -1761,7 +1762,8 @@ export const cellErrorsAtom = atom((get) => {
1761
1762
  });
1762
1763
 
1763
1764
  export const notebookOutline = atom((get) => {
1764
- const { cellIds, cellRuntime } = get(notebookAtom);
1765
+ const cellIds = get(cellIdsAtom);
1766
+ const cellRuntime = get(cellsRuntimeAtom);
1765
1767
  const outlines = cellIds.inOrderIds.map(
1766
1768
  (cellId) => cellRuntime[cellId].outline,
1767
1769
  );
@@ -134,12 +134,8 @@ export function usePendingDeleteService() {
134
134
  submit({ cellIds, deleteCell, deleteManyCells, store });
135
135
  },
136
136
  clear,
137
- get idle() {
138
- return entries.size === 0;
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
 
@@ -56,7 +56,7 @@ function mergeSessionAndNotebookCells(
56
56
  return {
57
57
  cellIds,
58
58
  sessionCellData: new Map(
59
- cellIds.map((id, idx) => [id, null] as [CellId, SessionCell | null]),
59
+ cellIds.map((id) => [id, null] as [CellId, SessionCell | null]),
60
60
  ),
61
61
  notebookCellData: new Map(
62
62
  cellIds.map(
@@ -95,7 +95,7 @@ export interface CellRuntimeState {
95
95
  /** TOC outline */
96
96
  outline: Outline | null;
97
97
  /** messages encoding the cell's console outputs. */
98
- consoleOutputs: WithResponse<OutputMessage>[];
98
+ consoleOutputs: ConsoleOutputMessage[];
99
99
  /** current status of the cell */
100
100
  status: RuntimeState;
101
101
  /** whether the cell has stale inputs*/
@@ -130,3 +130,12 @@ export type WithResponse<T> = T & {
130
130
  */
131
131
  response?: string;
132
132
  };
133
+
134
+ /**
135
+ * A console output as held by the frontend. The id is assigned when the
136
+ * output arrives and never changes, so it can identify the output while
137
+ * neighboring outputs collapse, truncate, or receive a stdin response.
138
+ */
139
+ export type ConsoleOutputMessage = WithResponse<OutputMessage> & {
140
+ id?: number;
141
+ };
@@ -100,7 +100,7 @@ function getDuplicateKeymaps(state: EditorState) {
100
100
  (keymap) => keymap,
101
101
  );
102
102
  const duplicates = Objects.fromEntries(
103
- Object.entries(groupBy).filter(([key, value]) => value.length > 1),
103
+ Object.entries(groupBy).filter(([_key, value]) => value.length > 1),
104
104
  );
105
105
  return duplicates;
106
106
  }
@@ -369,7 +369,7 @@ class CodeMirrorVimSync {
369
369
  // We use onIdle to keep the focused editor snappy
370
370
  onIdle(() => {
371
371
  if (!skipBroadcast) {
372
- this.broadcastModeChange(instance, e.mode, e.subMode);
372
+ this.broadcastModeChange(instance, e.mode);
373
373
  }
374
374
  this.isBroadcasting = false;
375
375
  });
@@ -380,11 +380,7 @@ class CodeMirrorVimSync {
380
380
  this.instances.delete(instance);
381
381
  }
382
382
 
383
- public broadcastModeChange(
384
- originInstance: EditorView,
385
- mode: string,
386
- subMode?: string,
387
- ) {
383
+ public broadcastModeChange(originInstance: EditorView, mode: string) {
388
384
  invariant(
389
385
  "exitInsertMode" in Vim,
390
386
  "Vim does not have an exitInsertMode method",
@@ -73,7 +73,7 @@ export class MarkdownLanguageAdapter implements LanguageAdapter<MarkdownLanguage
73
73
  _cellId: CellId,
74
74
  _completionConfig: CompletionConfig,
75
75
  hotkeys: HotkeyProvider,
76
- _: PlaceholderType,
76
+ _placeholderType: PlaceholderType,
77
77
  ): Extension[] {
78
78
  const markdownLanguageData = markdown().language.data;
79
79
  let view: EditorView | undefined;
@@ -157,7 +157,7 @@ const pylspClient = once((lspConfig: LSPConfig) => {
157
157
  return notebookClient;
158
158
  });
159
159
 
160
- const tyLspClient = once((_: LSPConfig) => {
160
+ const tyLspClient = once((_config: LSPConfig) => {
161
161
  // oxlint-disable-next-line prefer-const -- reassigned after closure capture
162
162
  let resyncCallback: (() => Promise<void>) | undefined;
163
163
 
@@ -176,7 +176,7 @@ const tyLspClient = once((_: LSPConfig) => {
176
176
  const notebookClient = new NotebookLanguageServerClient(
177
177
  new LanguageServerClient({
178
178
  ...lspClientOpts,
179
- getWorkspaceConfiguration: (_) => [{ disableLanguageServices: true }],
179
+ getWorkspaceConfiguration: () => [{ disableLanguageServices: true }],
180
180
  }),
181
181
  {},
182
182
  );
@@ -226,7 +226,7 @@ const pyreflyClient = once(
226
226
  },
227
227
  );
228
228
 
229
- const pyrightClient = once((_: LSPConfig) => {
229
+ const pyrightClient = once((_config: LSPConfig) => {
230
230
  // oxlint-disable-next-line prefer-const -- reassigned after closure capture
231
231
  let resyncCallback: (() => Promise<void>) | undefined;
232
232
 
@@ -101,6 +101,7 @@ export const LanguagePanelComponent: React.FC<{
101
101
  {metadata.engine === DUCKDB_ENGINE && <SQLModeSelect />}
102
102
  <Tooltip content="Format SQL">
103
103
  <Button
104
+ aria-label="Format SQL"
104
105
  variant="text"
105
106
  size="icon"
106
107
  onClick={async () => {
@@ -185,8 +185,8 @@ describe("isDetectedSourceConnected", () => {
185
185
  });
186
186
  const emptySnapshot = {
187
187
  dialects: [] as string[],
188
- storageProtocols: [] as string[],
189
- storageBackendTypes: [] as string[],
188
+ storageProtocols: new Set<string>(),
189
+ storageBackendTypes: new Set<string>(),
190
190
  };
191
191
 
192
192
  it("does not hide a source when nothing is connected", () => {
@@ -242,7 +242,7 @@ describe("isDetectedSourceConnected", () => {
242
242
  expect(
243
243
  isDetectedSourceConnected(s3, {
244
244
  ...emptySnapshot,
245
- storageProtocols: ["s3"],
245
+ storageProtocols: new Set(["s3"]),
246
246
  }),
247
247
  ).toBe(true);
248
248
  });
@@ -262,7 +262,7 @@ describe("isDetectedSourceConnected", () => {
262
262
  expect(
263
263
  isDetectedSourceConnected(hf, {
264
264
  ...emptySnapshot,
265
- storageBackendTypes: ["huggingface"],
265
+ storageBackendTypes: new Set(["huggingface"]),
266
266
  }),
267
267
  ).toBe(true);
268
268
  });
@@ -27,8 +27,8 @@ export function matchesDiscoveryGroup(
27
27
  */
28
28
  export interface LiveConnectionSnapshot {
29
29
  dialects: readonly string[];
30
- storageProtocols: readonly string[];
31
- storageBackendTypes: readonly string[];
30
+ storageProtocols: ReadonlySet<string>;
31
+ storageBackendTypes: ReadonlySet<string>;
32
32
  }
33
33
 
34
34
  /**
@@ -47,15 +47,13 @@ export function isDetectedSourceConnected(
47
47
  }
48
48
 
49
49
  if (
50
- match.protocols.some((protocol) =>
51
- snapshot.storageProtocols.includes(protocol),
52
- )
50
+ match.protocols.some((protocol) => snapshot.storageProtocols.has(protocol))
53
51
  ) {
54
52
  return true;
55
53
  }
56
54
 
57
55
  return match.backendTypes.some((backendType) =>
58
- snapshot.storageBackendTypes.includes(backendType),
56
+ snapshot.storageBackendTypes.has(backendType),
59
57
  );
60
58
  }
61
59