@marimo-team/islands 0.22.1-dev9 → 0.22.1

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 (481) hide show
  1. package/dist/{ConnectedDataExplorerComponent-iT7t3FxV.js → ConnectedDataExplorerComponent-DuD8BVl6.js} +54 -54
  2. package/dist/{Plot-WhbJAbBh.js → Plot-BxlSHo0G.js} +47 -38
  3. package/dist/_basePickBy-Sow3pJjS.js +41 -0
  4. package/dist/{_baseUniq-B4eL5sTC.js → _baseUniq-C87CckHL.js} +15 -54
  5. package/dist/{any-language-editor-CT_9yBde.js → any-language-editor-BHH_pQ6M.js} +21 -21
  6. package/dist/architecture-7HQA4BMR-BHdkAMvZ.js +6 -0
  7. package/dist/{architectureDiagram-VXUJARFQ-vxgYGIMP.js → architectureDiagram-VXUJARFQ-B3YQo9At.js} +15 -15
  8. package/dist/{arrays-Du-jRBAy.js → arrays-beUWo8RF.js} +1 -1
  9. package/dist/assets/__vite-browser-external-WSlCcXn_.js +1 -0
  10. package/dist/assets/{worker-D10K3OOz.js → worker-DUYMdbtA.js} +2 -2
  11. package/dist/{blockDiagram-VD42YOAC-C7x6YTH7.js → blockDiagram-VD42YOAC-CpQ3TKEN.js} +7 -7
  12. package/dist/{button-qsiIHncQ.js → button-DNlNlZY_.js} +82 -84
  13. package/dist/{c4Diagram-YG6GDRKO-Cx4oseGg.js → c4Diagram-YG6GDRKO-CZSU4uqU.js} +4 -4
  14. package/dist/{capabilities-26mwv03y.js → capabilities-Coe9eM9T.js} +2 -2
  15. package/dist/{channel-C_50jIAn.js → channel-X3JKk8gE.js} +1 -1
  16. package/dist/{chat-ui-CtqUthFR.js → chat-ui-Cel1kBfc.js} +147 -146
  17. package/dist/{check-D_YwHEgY.js → check-CWUkiHmb.js} +1 -1
  18. package/dist/{chunk-4F5CHEZ2-Dvo_CFnR.js → chunk-4F5CHEZ2-D5mClyDv.js} +1 -1
  19. package/dist/{chunk-ABZYJK2D-D5YIs71w.js → chunk-ABZYJK2D-CZYCCtLy.js} +1 -1
  20. package/dist/{chunk-ATLVNIR6-CyOjzOcf.js → chunk-ATLVNIR6-DaOzLLgN.js} +1 -1
  21. package/dist/{chunk-B2363JML-BzZqINRO.js → chunk-B2363JML-Br0eA2T3.js} +1 -1
  22. package/dist/{chunk-B4BG7PRW-ZJeV3KdD.js → chunk-B4BG7PRW-4BjV11Br.js} +4 -4
  23. package/dist/{chunk-DI55MBZ5-Dx_wwX6l.js → chunk-DI55MBZ5-DITY3EyP.js} +4 -4
  24. package/dist/{chunk-EXTU4WIE-CgefpSXQ.js → chunk-EXTU4WIE-jUPSAk3i.js} +1 -1
  25. package/dist/{chunk-FRFDVMJY-Derq8UzY.js → chunk-FRFDVMJY-DnEvEFRR.js} +1 -1
  26. package/dist/{chunk-JA3XYJ7Z-CcIOIFpc.js → chunk-JA3XYJ7Z-BcPEfxk_.js} +2 -2
  27. package/dist/{chunk-JZLCHNYA-CgO0GG1p.js → chunk-JZLCHNYA-2bnLL3xL.js} +4 -4
  28. package/dist/{chunk-N4CR4FBY-2qzGzAxT.js → chunk-N4CR4FBY-CpZSuGSU.js} +5 -5
  29. package/dist/{chunk-PL6DKKU2-KoG71Zin.js → chunk-PL6DKKU2-DnId6G-x.js} +1 -1
  30. package/dist/{chunk-QN33PNHL-Dp1qBo28.js → chunk-QN33PNHL-B9p5ojHB.js} +1 -1
  31. package/dist/{chunk-QXUST7PY-BxmmeIwf.js → chunk-QXUST7PY-Ch6F5Obl.js} +5 -5
  32. package/dist/{chunk-S3R3BYOJ-D3Rys9ZW.js → chunk-S3R3BYOJ-B0UOFJwq.js} +3 -3
  33. package/dist/{chunk-SJTYNZTY-Co-DhKAG.js → chunk-SJTYNZTY-BsBZnJUj.js} +1 -1
  34. package/dist/{chunk-TCCFYFTB-BAhzIqBO.js → chunk-TCCFYFTB-Clbl-fTg.js} +8 -7
  35. package/dist/{chunk-TQ3KTPDO-DxYI735Z.js → chunk-TQ3KTPDO-CFkSQ30e.js} +1 -1
  36. package/dist/{chunk-TZMSLE5B-Dxumt0wv.js → chunk-TZMSLE5B-D45397J2.js} +1 -1
  37. package/dist/{chunk-UMXZTB3W-CuahpKin.js → chunk-UMXZTB3W-D-A834Bq.js} +1 -1
  38. package/dist/{classDiagram-v2-WZHVMYZB-CYoFMQKE.js → classDiagram-2ON5EDUG-C8-zE3Zv.js} +10 -10
  39. package/dist/{classDiagram-2ON5EDUG-DkOvXRlx.js → classDiagram-v2-WZHVMYZB-DrmbGANl.js} +10 -10
  40. package/dist/{clone-DDndUqI0.js → clone-DZFQCtFJ.js} +1 -1
  41. package/dist/{constants-D1Am36hX.js → constants-CvyfaCvs.js} +3 -3
  42. package/dist/{copy-CBo9JcJW.js → copy-B7781WJ3.js} +2 -2
  43. package/dist/{dagre-6UL2VRFP-BXBaU8PB.js → dagre-6UL2VRFP-OMItEBnY.js} +12 -12
  44. package/dist/{dagre-D3dlYz-r.js → dagre-QVd-lCXU.js} +13 -23
  45. package/dist/{data-grid-overlay-editor-nZux6_d2.js → data-grid-overlay-editor-lKF301ME.js} +1 -1
  46. package/dist/{diagram-PSM6KHXK-CJxjk4LG.js → diagram-PSM6KHXK-CkKbohWI.js} +16 -16
  47. package/dist/{diagram-QEK2KX5R-IMILPh_p.js → diagram-QEK2KX5R-DjUMpVcx.js} +14 -14
  48. package/dist/{diagram-S2PKOQOG-6O0g6Boj.js → diagram-S2PKOQOG-b-c0d-wZ.js} +14 -14
  49. package/dist/{dist-BkXs8bw0.js → dist--6TSlp8H.js} +1 -1
  50. package/dist/dist-7K5doRvB.js +6 -0
  51. package/dist/{dist-CQidOwep.js → dist-B43sbpd0.js} +3 -3
  52. package/dist/dist-B6I_A2-E.js +8 -0
  53. package/dist/dist-BEQsmaZY.js +5 -0
  54. package/dist/dist-BasY2RHp.js +8 -0
  55. package/dist/{dist-BemtTYzN.js → dist-Bfp1XXWt.js} +5 -5
  56. package/dist/{dist-v-1kgqZ3.js → dist-BjDuO5JW.js} +1 -1
  57. package/dist/dist-Bosc00dY.js +5 -0
  58. package/dist/{dist-DLNKBPsk.js → dist-BrxqmS9Q.js} +4 -4
  59. package/dist/{dist-DBYL08Lu.js → dist-BvhGByxL.js} +4 -4
  60. package/dist/{dist-CVqlhD3M.js → dist-C4bq5Ioy.js} +2 -2
  61. package/dist/{dist-DwmxBUOe.js → dist-CFKdzOIu.js} +2 -2
  62. package/dist/{dist-5nTQE2yt.js → dist-CIB8w0Fl.js} +2 -2
  63. package/dist/{dist-C-EcLtO9.js → dist-CNF0QBLR.js} +1 -1
  64. package/dist/dist-CQMZOn-_.js +8 -0
  65. package/dist/dist-CViQhWZ8.js +5 -0
  66. package/dist/{dist-Dg65j0em.js → dist-CcMfr7jD.js} +1 -1
  67. package/dist/{dist-C0XYIHKJ.js → dist-Ci0CXEFt.js} +1 -1
  68. package/dist/dist-Cz6rLfwY.js +5 -0
  69. package/dist/dist-D8eq8st3.js +6 -0
  70. package/dist/{dist-qoCY8giM.js → dist-DAfcmt-d.js} +2 -2
  71. package/dist/{dist-B6Op2ogv.js → dist-DD_cYHOl.js} +2 -2
  72. package/dist/{dist-BUSLKXcu.js → dist-DFK94vuS.js} +2 -2
  73. package/dist/{dist-DBXPlQ0D.js → dist-DGNtjMZu.js} +1 -1
  74. package/dist/{dist-C9qF7MRB.js → dist-DJ9F1eHs.js} +2 -2
  75. package/dist/{dist-Ci_jEudG.js → dist-DJKubHDd.js} +1 -1
  76. package/dist/{dist-CnFp2Kcl.js → dist-DLafRu9s.js} +2 -2
  77. package/dist/dist-DM1UDXdl.js +5 -0
  78. package/dist/dist-DNrtWPgS.js +5 -0
  79. package/dist/dist-D_UjpfOY.js +1381 -0
  80. package/dist/{dist-DmFS6KZW.js → dist-DbnBiLNH.js} +3 -3
  81. package/dist/{dist-BiZZAo22.js → dist-DlSUOIm9.js} +1 -1
  82. package/dist/{dist-DStU8He1.js → dist-Doy0mQDg.js} +2 -2
  83. package/dist/{dist-CxAX99oC.js → dist-DpkJHKB8.js} +2 -2
  84. package/dist/{dist-DjaZNkZ7.js → dist-LhQNUe5A.js} +3 -3
  85. package/dist/dist-V7q2qnpA.js +5 -0
  86. package/dist/{dist-BJ3fhRYu.js → dist-VqF3W_ue.js} +2 -2
  87. package/dist/dist-a5_hPgu2.js +8 -0
  88. package/dist/{dist-B9KLrfoh.js → dist-ej6AQKaS.js} +1 -1
  89. package/dist/{dist-Brb6VNc4.js → dist-m9tsXsFf.js} +2 -2
  90. package/dist/{dist-CBwMSFDu.js → dist-tGk0aZ--.js} +2 -2
  91. package/dist/dist-uVyZcV1-.js +5 -0
  92. package/dist/{erDiagram-Q2GNP2WA-sho7Cl9f.js → erDiagram-Q2GNP2WA-CDhLaOZ1.js} +10 -10
  93. package/dist/{error-banner-Bx9kIgrs.js → error-banner-Cjf0RU9I.js} +79 -79
  94. package/dist/{esm-CMg2ABu6.js → esm-4wmsH2lp.js} +6 -6
  95. package/dist/{esm-cqK9POGH.js → esm-CD1iby2n.js} +23 -23
  96. package/dist/{flowDiagram-NV44I4VS-C4nY4Fbz.js → flowDiagram-NV44I4VS-BDi4O4CL.js} +10 -10
  97. package/dist/{ganttDiagram-JELNMOA3-CtxNcCM2.js → ganttDiagram-JELNMOA3-BpZE6kVp.js} +3 -3
  98. package/dist/{gitGraph-G5XIXVHT-SL6TDof6.js → gitGraph-G5XIXVHT-B_c6xFJv.js} +3 -3
  99. package/dist/{gitGraphDiagram-V2S2FVAM-D9885mxd.js → gitGraphDiagram-V2S2FVAM-iQnXzbPM.js} +13 -13
  100. package/dist/{glide-data-editor-CkVEV-Gk.js → glide-data-editor-BqnvTmDo.js} +1739 -1708
  101. package/dist/{graphlib-CxWdvYQt.js → graphlib-BV1_gi0C.js} +4 -3
  102. package/dist/hasIn-DnfJcYpY.js +108 -0
  103. package/dist/{info-VBDWY6EO-6MXPTSmi.js → info-VBDWY6EO-BTyzxmhr.js} +3 -3
  104. package/dist/{infoDiagram-HS3SLOUP-Bw2FlRwF.js → infoDiagram-HS3SLOUP-OYrX6uO3.js} +13 -13
  105. package/dist/{input-BSde8uV4.js → input-CFY9gApZ.js} +5055 -5055
  106. package/dist/{isEmpty-BQtUinxJ.js → isEmpty-B7FX9wKt.js} +1 -1
  107. package/dist/{isSymbol-DFp8040B.js → isSymbol-DCbjQG_U.js} +1 -1
  108. package/dist/{journeyDiagram-XKPGCS4Q-BXlCEth8.js → journeyDiagram-XKPGCS4Q-ClPC94aN.js} +3 -3
  109. package/dist/{kanban-definition-3W4ZIXB7-CorxzSYm.js → kanban-definition-3W4ZIXB7-DHEAKdZt.js} +7 -7
  110. package/dist/{label-DTNqw9tv.js → label-DbZGAoCH.js} +538 -569
  111. package/dist/{loader-CMMa6QVT.js → loader-Bd1kgLn7.js} +15 -15
  112. package/dist/main.js +35011 -34898
  113. package/dist/{memoize-CuHciEBb.js → memoize-CSTI9eOX.js} +1 -1
  114. package/dist/{merge-CA_buyY3.js → merge-CVhG7q_o.js} +1 -1
  115. package/dist/{mermaid-CEKslOkI.js → mermaid-B2HDLx2g.js} +54 -54
  116. package/dist/{mermaid-parser.core-cq4YDee-.js → mermaid-parser.core-ntCgyx0x.js} +8 -8
  117. package/dist/min-Ds3gG0Ff.js +96 -0
  118. package/dist/{mindmap-definition-VGOIOE7T-DRsT8UaN.js → mindmap-definition-VGOIOE7T-CxEUZZvY.js} +9 -9
  119. package/dist/{now-CXAdKY5k.js → now-nrrrOr01.js} +1 -1
  120. package/dist/{once-CZno0h-b.js → once-C_TIu-kR.js} +1 -1
  121. package/dist/{packet-DYOGHKS2-Dw08gMaZ.js → packet-DYOGHKS2-BhvnpoGi.js} +3 -3
  122. package/dist/{pie-VRWISCQL-C5SPSvT8.js → pie-VRWISCQL-dILuA3iG.js} +3 -3
  123. package/dist/{pieDiagram-ADFJNKIX-DhJ1Cx2O.js → pieDiagram-ADFJNKIX-U3LrUqAS.js} +14 -14
  124. package/dist/{process-output-KyzWazB-.js → process-output-DC1TOnIl.js} +3184 -3207
  125. package/dist/{quadrantDiagram-AYHSOK5B-DXUFIWlz.js → quadrantDiagram-AYHSOK5B-BVWuq-3R.js} +2 -2
  126. package/dist/{radar-ZZBFDIW7-BvY0bgSg.js → radar-ZZBFDIW7-DwFrOJDj.js} +3 -3
  127. package/dist/range-fJeId9Ri.js +30 -0
  128. package/dist/{requirementDiagram-UZGBJVZJ-DO_gtQIb.js → requirementDiagram-UZGBJVZJ-D0zpQnKC.js} +9 -9
  129. package/dist/{sankeyDiagram-TZEHDZUN-OZzXEkuG.js → sankeyDiagram-TZEHDZUN-CExy1joT.js} +2 -2
  130. package/dist/{sequenceDiagram-WL72ISMW-K7nZRifV.js → sequenceDiagram-WL72ISMW-D1BJxLjH.js} +4 -4
  131. package/dist/{slides-component-CIcSvFh7.js → slides-component-CX2JC-Ws.js} +2 -2
  132. package/dist/{spec-DYaR1rJh.js → spec-CD7QaCV-.js} +3 -3
  133. package/dist/{stateDiagram-FKZM4ZOC-DzXJZAq7.js → stateDiagram-FKZM4ZOC-B1S8jGMn.js} +12 -12
  134. package/dist/{stateDiagram-v2-4FDKWEC3-BZBPUmyF.js → stateDiagram-v2-4FDKWEC3-BH5ozUbc.js} +10 -10
  135. package/dist/stex-CQDv3aS8.js +4 -0
  136. package/dist/style.css +1 -1
  137. package/dist/{timeline-definition-IT6M3QCI-DNoLAh-i.js → timeline-definition-IT6M3QCI-BDT9JAmn.js} +2 -2
  138. package/dist/{toDate-D6VXexnV.js → toDate-CUqpEbBS.js} +5 -5
  139. package/dist/{toNumber-xFPoy1OI.js → toNumber-55tjPCWr.js} +2 -2
  140. package/dist/tooltip-BXEpXV3R.js +404 -0
  141. package/dist/{treemap-GDKQZRPO-C5OoxpmV.js → treemap-GDKQZRPO-bx2ngsgN.js} +3 -3
  142. package/dist/{types-CQ-RbYxp.js → types-D_ntCXg0.js} +3 -3
  143. package/dist/{useAsyncData-Cd4Urlww.js → useAsyncData-rN1nzPaS.js} +2 -2
  144. package/dist/{useDeepCompareMemoize-DOzKCTzc.js → useDeepCompareMemoize-Ch-7Rk2x.js} +4 -4
  145. package/dist/{useIframeCapabilities-BVQrlRBd.js → useIframeCapabilities-CqhrVue6.js} +1 -1
  146. package/dist/useLifecycle-4fA1pHoh.js +177 -0
  147. package/dist/{useTheme-Dm1WaAGy.js → useTheme-MWfxn4oz.js} +4 -5
  148. package/dist/{vega-component-BaDgUvQP.js → vega-component-CPhNLfZZ.js} +25 -25
  149. package/dist/{xychartDiagram-PRI3JC2R-ehVeySMW.js → xychartDiagram-PRI3JC2R-CuAZiqHS.js} +5 -5
  150. package/dist/{Combination-B--d1_LV.js → zod-C6UGQ3fz.js} +8085 -8151
  151. package/package.json +8 -41
  152. package/src/__mocks__/common.ts +4 -4
  153. package/src/__tests__/main.test.tsx +12 -14
  154. package/src/components/ai/ai-provider-icon.tsx +3 -2
  155. package/src/components/app-config/user-config-form.tsx +0 -27
  156. package/src/components/chat/acp/agent-docs.tsx +3 -3
  157. package/src/components/chat/acp/agent-panel.tsx +71 -24
  158. package/src/components/chat/acp/agent-selector.tsx +2 -11
  159. package/src/components/chat/acp/state.ts +15 -3
  160. package/src/components/chat/chat-history-popover.tsx +1 -1
  161. package/src/components/chat/chat-panel.tsx +2 -1
  162. package/src/components/data-table/TableBottomBar.tsx +7 -1
  163. package/src/components/data-table/TableTopBar.tsx +31 -35
  164. package/src/components/data-table/__tests__/columns.test.tsx +7 -7
  165. package/src/components/data-table/cell-hover-template/types.ts +1 -1
  166. package/src/components/data-table/cell-hover-text/types.ts +1 -1
  167. package/src/components/data-table/cell-selection/__tests__/feature.test.ts +1 -1
  168. package/src/components/data-table/cell-selection/types.ts +4 -3
  169. package/src/components/data-table/cell-styling/types.ts +1 -1
  170. package/src/components/data-table/charts/chart-spec/altair-generator.ts +2 -2
  171. package/src/components/data-table/charts/charts.tsx +2 -2
  172. package/src/components/data-table/charts/components/chart-items.tsx +1 -1
  173. package/src/components/data-table/column-explorer-panel/column-explorer.tsx +1 -1
  174. package/src/components/data-table/column-formatting/types.ts +5 -4
  175. package/src/components/data-table/column-header.tsx +4 -2
  176. package/src/components/data-table/column-summary/legacy-chart-spec.ts +1 -1
  177. package/src/components/data-table/column-wrapping/types.ts +4 -3
  178. package/src/components/data-table/columns.tsx +4 -1
  179. package/src/components/data-table/copy-column/types.ts +4 -3
  180. package/src/components/data-table/data-table.tsx +12 -11
  181. package/src/components/data-table/focus-row/types.ts +4 -3
  182. package/src/components/data-table/loading-table.tsx +1 -1
  183. package/src/components/data-table/pagination.tsx +1 -1
  184. package/src/components/data-table/range-focus/__tests__/atoms.test.ts +13 -13
  185. package/src/components/data-table/range-focus/__tests__/use-cell-range-selection.test.ts +9 -11
  186. package/src/components/data-table/range-focus/atoms.ts +2 -2
  187. package/src/components/data-table/range-focus/cell-selection-stats.tsx +3 -1
  188. package/src/components/data-table/renderers.tsx +18 -12
  189. package/src/components/data-table/row-viewer-panel/row-viewer.tsx +1 -1
  190. package/src/components/data-table/table-explorer-panel/table-explorer-panel.tsx +2 -2
  191. package/src/components/dependency-graph/dependency-graph-tree.tsx +1 -1
  192. package/src/components/editor/__tests__/data-attributes.test.tsx +93 -94
  193. package/src/components/editor/__tests__/dynamic-favicon.test.tsx +1 -1
  194. package/src/components/editor/actions/name-cell-input.tsx +4 -2
  195. package/src/components/editor/actions/pair-with-agent-modal.tsx +179 -0
  196. package/src/components/editor/actions/useCellActionButton.tsx +4 -2
  197. package/src/components/editor/actions/useNotebookActions.tsx +10 -0
  198. package/src/components/editor/ai/add-cell-with-ai.tsx +2 -1
  199. package/src/components/editor/ai/ai-completion-editor.tsx +1 -1
  200. package/src/components/editor/app-container.tsx +1 -1
  201. package/src/components/editor/cell/CellStatus.tsx +4 -5
  202. package/src/components/editor/cell/cell-context-menu.tsx +4 -2
  203. package/src/components/editor/cell/code/cell-editor.tsx +3 -2
  204. package/src/components/editor/cell/toolbar.tsx +2 -1
  205. package/src/components/editor/chrome/components/contribute-snippet-button.tsx +4 -1
  206. package/src/components/editor/chrome/components/feedback-button.tsx +4 -1
  207. package/src/components/editor/chrome/panels/context-aware-panel/context-aware-panel.tsx +1 -1
  208. package/src/components/editor/chrome/panels/empty-state.tsx +1 -0
  209. package/src/components/editor/chrome/panels/file-explorer-panel.tsx +0 -10
  210. package/src/components/editor/chrome/panels/snippets-panel.tsx +1 -1
  211. package/src/components/editor/chrome/panels/write-secret-modal.tsx +1 -1
  212. package/src/components/editor/chrome/wrapper/app-chrome.tsx +4 -1
  213. package/src/components/editor/chrome/wrapper/footer-items/lsp-status.tsx +2 -1
  214. package/src/components/editor/chrome/wrapper/storage.ts +2 -2
  215. package/src/components/editor/connections/database/as-code.ts +1 -1
  216. package/src/components/editor/connections/form-renderers.tsx +1 -1
  217. package/src/components/editor/connections/storage/as-code.ts +1 -1
  218. package/src/components/editor/controls/keyboard-shortcuts.tsx +1 -1
  219. package/src/components/editor/header/filename-input.tsx +4 -1
  220. package/src/components/editor/links/cell-link-list.tsx +1 -1
  221. package/src/components/editor/navigation/__tests__/navigation.test.ts +1 -1
  222. package/src/components/editor/navigation/clipboard.ts +1 -1
  223. package/src/components/editor/navigation/multi-cell-action-toolbar.tsx +2 -2
  224. package/src/components/editor/navigation/navigation.ts +3 -3
  225. package/src/components/editor/notebook-cell.tsx +1 -1
  226. package/src/components/editor/output/JsonOutput.tsx +6 -6
  227. package/src/components/editor/output/ansi-reduce.ts +2 -2
  228. package/src/components/editor/output/console/ConsoleOutput.tsx +2 -2
  229. package/src/components/editor/renderers/cells-renderer.tsx +1 -1
  230. package/src/components/editor/renderers/grid-layout/grid-layout.tsx +1 -1
  231. package/src/components/editor/renderers/plugins.ts +1 -1
  232. package/src/components/editor/renderers/slides-layout/types.ts +2 -2
  233. package/src/components/editor/renderers/vertical-layout/__tests__/useFocusFirstEditor.test.ts +2 -2
  234. package/src/components/editor/renderers/vertical-layout/__tests__/vertical-layout.test.ts +1 -1
  235. package/src/components/editor/renderers/vertical-layout/vertical-layout.tsx +12 -13
  236. package/src/components/find-replace/find-replace.tsx +3 -1
  237. package/src/components/forms/form.tsx +1 -1
  238. package/src/components/forms/options.ts +1 -1
  239. package/src/components/pages/gallery-page.tsx +1 -1
  240. package/src/components/static-html/static-banner.tsx +2 -2
  241. package/src/components/storage/__tests__/storage-snippets.test.ts +4 -6
  242. package/src/components/terminal/terminal.tsx +4 -4
  243. package/src/components/tracing/tracing.test.tsx +30 -30
  244. package/src/components/ui/accordion.tsx +1 -1
  245. package/src/components/ui/alert-dialog.tsx +1 -1
  246. package/src/components/ui/badge.tsx +2 -1
  247. package/src/components/ui/button.tsx +5 -4
  248. package/src/components/ui/calendar.tsx +3 -2
  249. package/src/components/ui/checkbox.tsx +1 -1
  250. package/src/components/ui/combobox.tsx +2 -1
  251. package/src/components/ui/command.tsx +5 -2
  252. package/src/components/ui/context-menu.tsx +1 -1
  253. package/src/components/ui/date-input.tsx +7 -6
  254. package/src/components/ui/date-picker.tsx +6 -4
  255. package/src/components/ui/dialog.tsx +1 -1
  256. package/src/components/ui/draggable-popover.tsx +1 -1
  257. package/src/components/ui/dropdown-menu.tsx +2 -1
  258. package/src/components/ui/field.tsx +1 -2
  259. package/src/components/ui/form.tsx +4 -5
  260. package/src/components/ui/fullscreen.tsx +4 -1
  261. package/src/components/ui/label.tsx +1 -1
  262. package/src/components/ui/navigation.tsx +1 -1
  263. package/src/components/ui/popover.tsx +1 -1
  264. package/src/components/ui/progress.tsx +4 -3
  265. package/src/components/ui/query-param-preserving-link.tsx +4 -2
  266. package/src/components/ui/radio-group.tsx +1 -1
  267. package/src/components/ui/range-slider.tsx +1 -1
  268. package/src/components/ui/scroll-area.tsx +1 -1
  269. package/src/components/ui/select.tsx +1 -1
  270. package/src/components/ui/sheet.tsx +3 -2
  271. package/src/components/ui/slider.tsx +1 -1
  272. package/src/components/ui/switch.tsx +1 -1
  273. package/src/components/ui/tabs.tsx +1 -1
  274. package/src/components/ui/textarea.tsx +1 -2
  275. package/src/components/ui/toast.tsx +1 -1
  276. package/src/components/ui/toggle.tsx +1 -1
  277. package/src/components/ui/tooltip.tsx +1 -1
  278. package/src/components/variables/variables-table.tsx +1 -1
  279. package/src/core/ai/context/providers/__tests__/datasource.test.ts +1 -1
  280. package/src/core/ai/context/providers/__tests__/error.test.ts +1 -1
  281. package/src/core/ai/context/providers/__tests__/variable.test.ts +1 -1
  282. package/src/core/ai/context/providers/cell-output.ts +1 -2
  283. package/src/core/ai/context/registry.ts +2 -2
  284. package/src/core/ai/tools/edit-notebook-tool.ts +4 -3
  285. package/src/core/ai/tools/registry.ts +1 -1
  286. package/src/core/ai/tools/run-cells-tool.ts +4 -3
  287. package/src/core/cells/__tests__/add-missing-import.test.ts +23 -22
  288. package/src/core/cells/__tests__/cell.test.ts +14 -13
  289. package/src/core/cells/__tests__/cells.test.ts +2 -2
  290. package/src/core/cells/__tests__/scrollCellIntoView.test.ts +1 -1
  291. package/src/core/cells/__tests__/session.test.ts +1 -1
  292. package/src/core/cells/__tests__/utils.test.ts +1 -1
  293. package/src/core/cells/cells.ts +2 -2
  294. package/src/core/cells/ids.ts +1 -1
  295. package/src/core/cells/logs.ts +1 -1
  296. package/src/core/codemirror/ai/request.ts +1 -1
  297. package/src/core/codemirror/cells/__tests__/extensions.test.ts +15 -17
  298. package/src/core/codemirror/cells/traceback-decorations.ts +1 -1
  299. package/src/core/codemirror/copilot/__tests__/language-server.test.ts +1 -1
  300. package/src/core/codemirror/copilot/__tests__/transport.test.ts +129 -3
  301. package/src/core/codemirror/copilot/client.ts +9 -2
  302. package/src/core/codemirror/copilot/getCodes.ts +1 -1
  303. package/src/core/codemirror/copilot/language-server.ts +12 -1
  304. package/src/core/codemirror/copilot/transport.ts +34 -8
  305. package/src/core/codemirror/copilot/types.ts +1 -1
  306. package/src/core/codemirror/facet.ts +1 -1
  307. package/src/core/codemirror/language/__tests__/sql.test.ts +4 -4
  308. package/src/core/codemirror/language/languages/markdown.ts +1 -3
  309. package/src/core/codemirror/language/languages/python.ts +4 -0
  310. package/src/core/codemirror/language/languages/sql/completion-builder.ts +1 -1
  311. package/src/core/codemirror/language/languages/sql/completion-sources.tsx +4 -6
  312. package/src/core/codemirror/language/languages/sql/sql.ts +1 -3
  313. package/src/core/codemirror/language/metadata.ts +1 -1
  314. package/src/core/codemirror/language/panel/sql.tsx +4 -1
  315. package/src/core/codemirror/language/types.ts +1 -1
  316. package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +1 -1
  317. package/src/core/codemirror/lsp/notebook-lsp.ts +1 -1
  318. package/src/core/codemirror/misc/__tests__/dnd.test.ts +1 -1
  319. package/src/core/codemirror/reactive-references/__tests__/analyzer.test.ts +28 -42
  320. package/src/core/codemirror/rtc/loro/awareness.ts +1 -1
  321. package/src/core/config/__tests__/config-schema.test.ts +2 -6
  322. package/src/core/config/config-schema.ts +0 -1
  323. package/src/core/config/feature-flag.tsx +1 -3
  324. package/src/core/datasets/data-source-connections.ts +4 -2
  325. package/src/core/datasets/state.ts +1 -1
  326. package/src/core/dom/__tests__/htmlUtils.test.ts +8 -14
  327. package/src/core/dom/__tests__/outline.test.ts +2 -3
  328. package/src/core/dom/outline.ts +1 -1
  329. package/src/core/dom/uiregistry.ts +42 -8
  330. package/src/core/edit-app.tsx +4 -1
  331. package/src/core/export/__tests__/hooks.test.ts +1 -1
  332. package/src/core/hotkeys/__tests__/hotkeys.test.ts +1 -1
  333. package/src/core/hotkeys/shortcuts.ts +1 -1
  334. package/src/core/islands/__tests__/bridge.test.ts +2 -2
  335. package/src/core/islands/__tests__/parse.test.ts +8 -7
  336. package/src/core/islands/bridge.ts +2 -2
  337. package/src/core/islands/components/output-wrapper.tsx +1 -1
  338. package/src/core/islands/parse.ts +1 -1
  339. package/src/core/lsp/__tests__/transport.test.ts +1 -1
  340. package/src/core/network/CachingRequestRegistry.ts +1 -1
  341. package/src/core/network/DeferredRequestRegistry.ts +1 -1
  342. package/src/core/network/__tests__/requests-network.test.ts +1 -1
  343. package/src/core/network/api.ts +2 -2
  344. package/src/core/network/requests-lazy.ts +1 -1
  345. package/src/core/network/requests-toasting.tsx +1 -1
  346. package/src/core/runtime/runtime.ts +1 -0
  347. package/src/core/saving/__tests__/filename.test.ts +7 -6
  348. package/src/core/static/__tests__/download-html.test.ts +16 -15
  349. package/src/core/static/__tests__/files.test.ts +30 -28
  350. package/src/core/static/files.ts +1 -1
  351. package/src/core/vscode/vscode-bindings.ts +1 -1
  352. package/src/core/wasm/bridge.ts +3 -3
  353. package/src/core/wasm/worker/tracer.ts +1 -1
  354. package/src/core/websocket/useWebSocket.tsx +5 -3
  355. package/src/css/app/Cell.css +5 -2
  356. package/src/css/globals.css +18 -16
  357. package/src/custom.d.ts +1 -1
  358. package/src/hooks/__tests__/useDuplicateShortcuts.test.ts +3 -3
  359. package/src/hooks/debug.ts +3 -3
  360. package/src/hooks/useDebounce.ts +1 -1
  361. package/src/hooks/useEventListener.ts +1 -1
  362. package/src/hooks/useHotkey.ts +1 -1
  363. package/src/hooks/useLifecycle.ts +2 -2
  364. package/src/hooks/useNonce.ts +1 -1
  365. package/src/hooks/useResizeObserver.ts +2 -2
  366. package/src/main.tsx +1 -1
  367. package/src/plugins/core/BadPlugin.tsx +7 -6
  368. package/src/plugins/core/RenderHTML.tsx +3 -3
  369. package/src/plugins/core/__test__/registerReactComponent.test.ts +1 -1
  370. package/src/plugins/core/registerReactComponent.tsx +4 -4
  371. package/src/plugins/core/rpc.ts +1 -1
  372. package/src/plugins/impl/CheckboxPlugin.tsx +4 -1
  373. package/src/plugins/impl/DataEditorPlugin.tsx +8 -3
  374. package/src/plugins/impl/DataTablePlugin.tsx +5 -2
  375. package/src/plugins/impl/FileBrowserPlugin.tsx +1 -1
  376. package/src/plugins/impl/FormPlugin.tsx +2 -3
  377. package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +4 -1
  378. package/src/plugins/impl/__tests__/MatrixPlugin.test.tsx +1 -1
  379. package/src/plugins/impl/__tests__/SliderPlugin.test.tsx +43 -15
  380. package/src/plugins/impl/anywidget/AnyWidgetPlugin.tsx +3 -12
  381. package/src/plugins/impl/anywidget/__tests__/model.test.ts +2 -2
  382. package/src/plugins/impl/anywidget/model.ts +1 -1
  383. package/src/plugins/impl/anywidget/types.ts +2 -2
  384. package/src/plugins/impl/anywidget/widget-binding.ts +1 -1
  385. package/src/plugins/impl/chat/ChatPlugin.tsx +1 -1
  386. package/src/plugins/impl/chat/chat-ui.tsx +5 -2
  387. package/src/plugins/impl/data-editor/glide-data-editor.tsx +2 -2
  388. package/src/plugins/impl/data-explorer/ConnectedDataExplorerComponent.tsx +2 -2
  389. package/src/plugins/impl/data-explorer/components/query-form.tsx +1 -1
  390. package/src/plugins/impl/data-explorer/functions/function.ts +1 -1
  391. package/src/plugins/impl/data-explorer/queries/types.ts +1 -1
  392. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +1 -1
  393. package/src/plugins/impl/data-frames/forms/__tests__/form.test.tsx +7 -9
  394. package/src/plugins/impl/data-frames/forms/renderers.tsx +1 -1
  395. package/src/plugins/impl/data-frames/utils/operators.ts +1 -1
  396. package/src/plugins/impl/matplotlib/MatplotlibPlugin.tsx +1 -1
  397. package/src/plugins/impl/mpl-interactive/MplInteractivePlugin.tsx +1 -1
  398. package/src/plugins/impl/panel/PanelPlugin.tsx +2 -2
  399. package/src/plugins/impl/plotly/Plot.tsx +3 -3
  400. package/src/plugins/impl/plotly/PlotlyPlugin.tsx +65 -103
  401. package/src/plugins/impl/plotly/__tests__/PlotlyPlugin.test.tsx +114 -0
  402. package/src/plugins/impl/plotly/__tests__/selection.test.ts +199 -0
  403. package/src/plugins/impl/plotly/selection.ts +333 -0
  404. package/src/plugins/impl/vega/__tests__/make-selectable.test.ts +13 -14
  405. package/src/plugins/impl/vega/batched.ts +1 -1
  406. package/src/plugins/impl/vega/make-selectable.ts +3 -3
  407. package/src/plugins/impl/vega/types.ts +1 -1
  408. package/src/plugins/layout/DownloadPlugin.tsx +1 -1
  409. package/src/plugins/layout/ImageComparisonPlugin.tsx +1 -3
  410. package/src/plugins/layout/LazyPlugin.tsx +1 -1
  411. package/src/plugins/layout/RoutesPlugin.tsx +1 -1
  412. package/src/plugins/layout/mermaid/mermaid.tsx +1 -1
  413. package/src/plugins/plugins.ts +1 -1
  414. package/src/plugins/stateless-plugin.ts +4 -2
  415. package/src/stories/data-explorer.stories.tsx +1 -1
  416. package/src/stories/dataframe.stories.tsx +1 -1
  417. package/src/stories/editor.stories.tsx +1 -1
  418. package/src/stories/select.stories.tsx +1 -1
  419. package/src/stories/switchable-multi-select.stories.tsx +1 -1
  420. package/src/utils/Logger.ts +1 -1
  421. package/src/utils/__tests__/arrays.test.ts +1 -1
  422. package/src/utils/__tests__/blob.test.ts +1 -1
  423. package/src/utils/__tests__/cell-urls.test.ts +24 -21
  424. package/src/utils/__tests__/dates.test.ts +1 -1
  425. package/src/utils/__tests__/errors.test.ts +1 -1
  426. package/src/utils/__tests__/filenames.test.ts +15 -14
  427. package/src/utils/__tests__/json-parser.test.ts +14 -21
  428. package/src/utils/__tests__/multi-map.test.ts +3 -3
  429. package/src/utils/__tests__/objects.test.ts +3 -3
  430. package/src/utils/__tests__/path.test.ts +34 -31
  431. package/src/utils/__tests__/urls.test.ts +19 -18
  432. package/src/utils/__tests__/versions.test.ts +5 -5
  433. package/src/utils/__tests__/waitForWs.test.ts +1 -1
  434. package/src/utils/arrays.ts +2 -2
  435. package/src/utils/assertNever.ts +1 -1
  436. package/src/utils/batch-requests.ts +2 -2
  437. package/src/utils/createReducer.ts +2 -2
  438. package/src/utils/id-tree.tsx +2 -2
  439. package/src/utils/idle.ts +1 -1
  440. package/src/utils/invariant.ts +1 -2
  441. package/src/utils/json/base64.ts +2 -5
  442. package/src/utils/maps.ts +1 -1
  443. package/src/utils/math.ts +0 -1
  444. package/src/utils/mime-types.ts +1 -1
  445. package/src/utils/multi-map.ts +1 -1
  446. package/src/utils/objects.ts +1 -1
  447. package/src/utils/once.ts +2 -2
  448. package/src/utils/staticImplements.ts +1 -1
  449. package/src/utils/storage/jotai.ts +1 -1
  450. package/src/utils/tracer.ts +3 -2
  451. package/dist/_basePickBy-QjOmBDRE.js +0 -110
  452. package/dist/_baseSet-xgn1IbGV.js +0 -27
  453. package/dist/architecture-7HQA4BMR-BRyVh_Za.js +0 -6
  454. package/dist/assets/__vite-browser-external-Us1ds95c.js +0 -1
  455. package/dist/dist-B0R_ZM4-.js +0 -6
  456. package/dist/dist-B4a9_9pj.js +0 -5
  457. package/dist/dist-BCSUKEwO.js +0 -5
  458. package/dist/dist-BONIDQq6.js +0 -5
  459. package/dist/dist-BYeRx2hb.js +0 -5
  460. package/dist/dist-D2Rk1j4R.js +0 -1381
  461. package/dist/dist-DZjX5TYv.js +0 -5
  462. package/dist/dist-Dkw9x6kc.js +0 -5
  463. package/dist/dist-Ds6UaXGR.js +0 -6
  464. package/dist/dist-KuEJ1Q53.js +0 -8
  465. package/dist/dist-S72WNyTZ.js +0 -5
  466. package/dist/dist-bTG-yssT.js +0 -5
  467. package/dist/dist-diF0sguc.js +0 -8
  468. package/dist/dist-mJ84BIgu.js +0 -8
  469. package/dist/dist-wSIhFWQz.js +0 -8
  470. package/dist/get-CqrzlV1v.js +0 -68
  471. package/dist/range-CYz5jI--.js +0 -17
  472. package/dist/stex-CZyTRGVB.js +0 -4
  473. package/dist/tooltip-DGHTbHl5.js +0 -404
  474. package/dist/useLifecycle-Dids8BPm.js +0 -173
  475. /package/dist/{dist-KZI_BHqV.js → dist-CxZvoNao.js} +0 -0
  476. /package/dist/{invariant-D4hPsZFI.js → invariant-e8eBgdux.js} +0 -0
  477. /package/dist/{isArrayLikeObject-C-hFPChh.js → isArrayLikeObject-LXbTYiBa.js} +0 -0
  478. /package/dist/{main-CvkAPtaq.js → main-XimWhSi_.js} +0 -0
  479. /package/dist/{purify.es-ukiMXY-F.js → purify.es-hTCfRGdl.js} +0 -0
  480. /package/dist/{react-dom-BKwCWYPW.js → react-dom-BSUuJjCR.js} +0 -0
  481. /package/dist/{stex-Ze8D4R_5.js → stex-D887Ylhf.js} +0 -0
@@ -80,7 +80,7 @@ export interface NotebookState {
80
80
  */
81
81
  history: {
82
82
  name: string;
83
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
83
+ // oxlint-disable-next-line typescript/no-explicit-any
84
84
  serializedEditorState: any;
85
85
  column: CellColumnId;
86
86
  index: CellIndex;
@@ -1226,7 +1226,7 @@ const {
1226
1226
  i--;
1227
1227
  }
1228
1228
 
1229
- const collapseRanges = reversedCollapseRanges.reverse();
1229
+ const collapseRanges = reversedCollapseRanges.toReversed();
1230
1230
  return column.collapseAll(collapseRanges);
1231
1231
  }),
1232
1232
  };
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-redeclare */
2
+ /* oxlint-disable typescript/no-redeclare */
3
3
 
4
4
  import type { components } from "@marimo-team/marimo-api";
5
5
  import { OBJECT_ID_ATTR } from "@/core/dom/ui-element-constants";
@@ -98,7 +98,7 @@ const CellLogLogger = {
98
98
  ? "red"
99
99
  : "orange";
100
100
  const status = payload.level.toUpperCase();
101
- /** biome-ignore lint/suspicious/noConsole: for debugging */
101
+ // oxlint-disable-next-line no-console -- intentional debug logging
102
102
  console.log(
103
103
  `%c[${status}]`,
104
104
  `color:${color}; padding:2px 0; border-radius:2px; font-weight:bold`,
@@ -53,7 +53,7 @@ ${opts.codeAfter}
53
53
  }
54
54
 
55
55
  let result = "";
56
- // eslint-disable-next-line no-constant-condition
56
+ // oxlint-disable-next-line no-constant-condition
57
57
  while (true) {
58
58
  const { done, value } = await reader.read();
59
59
  if (done) {
@@ -18,24 +18,22 @@ function createTransaction(spec: TransactionSpec) {
18
18
  }
19
19
 
20
20
  describe("shouldAutorunMarkdownUpdate", () => {
21
- it.each([
22
- "input.type",
23
- "delete.backward",
24
- "undo",
25
- "redo",
26
- ])("accepts local %s transactions", (userEvent) => {
27
- const transaction = createTransaction({
28
- changes: { from: 0, insert: "#" },
29
- annotations: [Transaction.userEvent.of(userEvent)],
30
- });
21
+ it.each(["input.type", "delete.backward", "undo", "redo"])(
22
+ "accepts local %s transactions",
23
+ (userEvent) => {
24
+ const transaction = createTransaction({
25
+ changes: { from: 0, insert: "#" },
26
+ annotations: [Transaction.userEvent.of(userEvent)],
27
+ });
31
28
 
32
- expect(
33
- shouldAutorunMarkdownUpdate({
34
- docChanged: transaction.docChanged,
35
- transactions: [transaction],
36
- }),
37
- ).toBe(true);
38
- });
29
+ expect(
30
+ shouldAutorunMarkdownUpdate({
31
+ docChanged: transaction.docChanged,
32
+ transactions: [transaction],
33
+ }),
34
+ ).toBe(true);
35
+ },
36
+ );
39
37
 
40
38
  it("ignores formatting changes", () => {
41
39
  const transaction = createTransaction({
@@ -32,7 +32,7 @@ function createErrorDecorations(state: EditorState, errors: TracebackInfos) {
32
32
  // Filter and sort errors by line number to ensure they're added in order
33
33
  const relevantErrors = errors
34
34
  .filter((error) => error.kind === "cell" && error.cellId === cellId)
35
- .sort((a, b) => a.lineNumber - b.lineNumber);
35
+ .toSorted((a, b) => a.lineNumber - b.lineNumber);
36
36
 
37
37
  for (const error of relevantErrors) {
38
38
  try {
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* oxlint-disable typescript/no-explicit-any */
3
3
 
4
4
  import { Transport } from "@open-rpc/client-js/build/transports/Transport";
5
5
  import { beforeEach, describe, expect, it, vi } from "vitest";
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* oxlint-disable typescript/no-explicit-any */
3
3
 
4
4
  import { WebSocketTransport } from "@open-rpc/client-js";
5
5
  import { beforeEach, describe, expect, it, vi } from "vitest";
@@ -365,7 +365,7 @@ describe("LazyWebsocketTransport", () => {
365
365
  expect(delegate.connect).toHaveBeenCalled();
366
366
  });
367
367
 
368
- it("should clamp timeout to maxTimeoutMs", async () => {
368
+ it("should use maxTimeoutMs as default when no timeout is provided", async () => {
369
369
  const transport = new LazyWebsocketTransport({
370
370
  getWsUrl: mockGetWsUrl,
371
371
  waitForReady: mockWaitForReady,
@@ -376,12 +376,29 @@ describe("LazyWebsocketTransport", () => {
376
376
  await transport.connect();
377
377
 
378
378
  const data: any = { method: "test", params: [] };
379
- await transport.sendData(data, 10_000);
379
+ await transport.sendData(data, undefined);
380
380
 
381
381
  const delegate = (transport as any).delegate;
382
382
  expect(delegate.sendData).toHaveBeenCalledWith(data, 5000);
383
383
  });
384
384
 
385
+ it("should respect caller-provided timeout without clamping", async () => {
386
+ const transport = new LazyWebsocketTransport({
387
+ getWsUrl: mockGetWsUrl,
388
+ waitForReady: mockWaitForReady,
389
+ showError: mockShowError,
390
+ maxTimeoutMs: 5000,
391
+ });
392
+
393
+ await transport.connect();
394
+
395
+ const data: any = { method: "test", params: [] };
396
+ await transport.sendData(data, 30_000);
397
+
398
+ const delegate = (transport as any).delegate;
399
+ expect(delegate.sendData).toHaveBeenCalledWith(data, 30_000);
400
+ });
401
+
385
402
  it("should throw error if reconnection fails", async () => {
386
403
  const connectionError = new Error("Connection failed");
387
404
  (WebSocketTransport as any).mockImplementation(function (this: any) {
@@ -407,6 +424,115 @@ describe("LazyWebsocketTransport", () => {
407
424
  });
408
425
  });
409
426
 
427
+ describe("onReconnect", () => {
428
+ it("should call onReconnect after close + sendData reconnection", async () => {
429
+ const transport = new LazyWebsocketTransport({
430
+ getWsUrl: mockGetWsUrl,
431
+ waitForReady: mockWaitForReady,
432
+ showError: mockShowError,
433
+ });
434
+
435
+ const onReconnect = vi.fn().mockResolvedValue(undefined);
436
+ transport.onReconnect = onReconnect;
437
+
438
+ // Initial connect
439
+ await transport.connect();
440
+ expect(onReconnect).not.toHaveBeenCalled();
441
+
442
+ // Close the transport (simulates failure handling)
443
+ transport.close();
444
+
445
+ // sendData should reconnect and call onReconnect
446
+ const data: any = { method: "test", params: [] };
447
+ await transport.sendData(data, 5000);
448
+
449
+ expect(onReconnect).toHaveBeenCalledTimes(1);
450
+ });
451
+
452
+ it("should NOT call onReconnect on initial sendData connection", async () => {
453
+ const transport = new LazyWebsocketTransport({
454
+ getWsUrl: mockGetWsUrl,
455
+ waitForReady: mockWaitForReady,
456
+ showError: mockShowError,
457
+ });
458
+
459
+ const onReconnect = vi.fn().mockResolvedValue(undefined);
460
+ transport.onReconnect = onReconnect;
461
+
462
+ // sendData without prior connect — this is the initial connection
463
+ const data: any = { method: "test", params: [] };
464
+ await transport.sendData(data, 5000);
465
+
466
+ expect(onReconnect).not.toHaveBeenCalled();
467
+ });
468
+
469
+ it("should call onReconnect after tryConnect failure + retry via sendData", async () => {
470
+ let connectAttempt = 0;
471
+ (WebSocketTransport as any).mockImplementation(function (this: any) {
472
+ this.connect = vi.fn().mockImplementation(() => {
473
+ connectAttempt++;
474
+ // First 2 attempts fail (retries=2 exhausted), then succeed on next sendData
475
+ if (connectAttempt <= 2) {
476
+ return Promise.reject(new Error("Connection failed"));
477
+ }
478
+ return Promise.resolve(undefined);
479
+ });
480
+ this.close = vi.fn();
481
+ this.sendData = vi.fn().mockResolvedValue({ result: "success" });
482
+ this.subscribe = vi.fn();
483
+ this.unsubscribe = vi.fn();
484
+ });
485
+
486
+ const transport = new LazyWebsocketTransport({
487
+ getWsUrl: mockGetWsUrl,
488
+ waitForReady: mockWaitForReady,
489
+ showError: mockShowError,
490
+ retries: 2,
491
+ retryDelayMs: 10,
492
+ });
493
+
494
+ const onReconnect = vi.fn().mockResolvedValue(undefined);
495
+ transport.onReconnect = onReconnect;
496
+
497
+ // Initial connect fails (all retries exhausted)
498
+ await expect(transport.connect()).rejects.toThrow("Connection failed");
499
+ expect(onReconnect).not.toHaveBeenCalled();
500
+
501
+ // Now sendData reconnects successfully
502
+ const data: any = { method: "test", params: [] };
503
+ await transport.sendData(data, 5000);
504
+
505
+ expect(onReconnect).toHaveBeenCalledTimes(1);
506
+ });
507
+
508
+ it("should propagate onReconnect rejection and allow retry", async () => {
509
+ const transport = new LazyWebsocketTransport({
510
+ getWsUrl: mockGetWsUrl,
511
+ waitForReady: mockWaitForReady,
512
+ showError: mockShowError,
513
+ });
514
+
515
+ const reconnectError = new Error("Re-initialization failed");
516
+ const onReconnect = vi.fn().mockRejectedValueOnce(reconnectError);
517
+ transport.onReconnect = onReconnect;
518
+
519
+ await transport.connect();
520
+ transport.close();
521
+
522
+ const data: any = { method: "test", params: [] };
523
+ await expect(transport.sendData(data, 5000)).rejects.toThrow(
524
+ "Re-initialization failed",
525
+ );
526
+ expect(onReconnect).toHaveBeenCalledTimes(1);
527
+
528
+ // needsReInitialization should still be true, so a subsequent retry
529
+ // will attempt onReconnect again
530
+ onReconnect.mockResolvedValueOnce(undefined);
531
+ await transport.sendData(data, 5000);
532
+ expect(onReconnect).toHaveBeenCalledTimes(2);
533
+ });
534
+ });
535
+
410
536
  describe("close", () => {
411
537
  it("should close delegate and clear it", async () => {
412
538
  const transport = new LazyWebsocketTransport({
@@ -37,13 +37,20 @@ export const createWSTransport = once(() => {
37
37
  export const getCopilotClient = once(() => {
38
38
  const userConfig = store.get(resolvedMarimoConfigAtom);
39
39
  const copilotSettings = userConfig.ai?.github?.copilot_settings ?? {};
40
+ const transport = createWSTransport();
40
41
 
41
- return new CopilotLanguageServerClient({
42
+ const client = new CopilotLanguageServerClient({
42
43
  rootUri: FILE_URI,
43
44
  workspaceFolders: null,
44
- transport: createWSTransport(),
45
+ transport,
45
46
  copilotSettings,
46
47
  });
48
+
49
+ // Re-run the LSP initialize handshake when the transport reconnects
50
+ // after a close or connection failure.
51
+ transport.onReconnect = () => client.reInitialize();
52
+
53
+ return client;
47
54
  });
48
55
 
49
56
  export function copilotServer() {
@@ -27,7 +27,7 @@ export function getOtherCellsCode(otherCode: string) {
27
27
  return code;
28
28
  })
29
29
  .filter(Boolean)
30
- .sort((a, b) => {
30
+ .toSorted((a, b) => {
31
31
  if (a.startsWith("import") && !b.startsWith("import")) {
32
32
  return -1;
33
33
  }
@@ -86,6 +86,17 @@ export class CopilotLanguageServerClient extends LanguageServerClient {
86
86
  });
87
87
  }
88
88
 
89
+ /**
90
+ * Re-run the LSP initialize handshake and send configuration.
91
+ * Called by the transport's onReconnect callback after reconnecting.
92
+ */
93
+ async reInitialize(): Promise<void> {
94
+ logger.log("#reInitialize: Re-initializing LSP connection");
95
+ this.initializePromise = this.initialize();
96
+ await this.initializePromise;
97
+ await this.sendConfiguration();
98
+ }
99
+
89
100
  private async sendConfiguration() {
90
101
  const settings = this.copilotSettings;
91
102
  // Skip if no settings are provided
@@ -110,7 +121,7 @@ export class CopilotLanguageServerClient extends LanguageServerClient {
110
121
  ).request(method, params);
111
122
  }
112
123
 
113
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
124
+ // oxlint-disable-next-line typescript/no-explicit-any
114
125
  override async notify(method: any, params: any): Promise<any> {
115
126
  logger.debug("#notify", method, params);
116
127
  return super.notify(method, params);
@@ -36,7 +36,8 @@ export interface LazyWebsocketTransportOptions {
36
36
  retryDelayMs?: number;
37
37
 
38
38
  /**
39
- * Maximum timeout for sendData operations in milliseconds.
39
+ * Default timeout for sendData operations in milliseconds.
40
+ * Used when the caller does not provide an explicit timeout.
40
41
  * @default 5000
41
42
  */
42
43
  maxTimeoutMs?: number;
@@ -60,6 +61,13 @@ export class LazyWebsocketTransport extends Transport {
60
61
  private delegate: WebSocketTransport | undefined;
61
62
  private pendingSubscriptions: Subscription[] = [];
62
63
  private readonly options: Required<LazyWebsocketTransportOptions>;
64
+ private needsReInitialization = false;
65
+
66
+ /**
67
+ * Callback invoked after the transport reconnects following a close or connection failure.
68
+ * Used by the LSP client to re-run the initialize handshake on the new connection.
69
+ */
70
+ onReconnect?: () => Promise<void>;
63
71
 
64
72
  constructor(options: LazyWebsocketTransportOptions) {
65
73
  super();
@@ -157,11 +165,11 @@ export class LazyWebsocketTransport extends Transport {
157
165
  );
158
166
  if (attempt === this.options.retries) {
159
167
  this.delegate = undefined;
168
+ this.needsReInitialization = true;
160
169
  // Show error toast on final retry
161
170
  this.options.showError(
162
171
  "GitHub Copilot Connection Error",
163
- "Failed to connect to GitHub Copilot. Please check your settings and try again.\n\n" +
164
- prettyError(error),
172
+ `Failed to connect to GitHub Copilot. Please check your settings and try again.\n\n${prettyError(error)}`,
165
173
  );
166
174
  throw error;
167
175
  }
@@ -183,6 +191,7 @@ export class LazyWebsocketTransport extends Transport {
183
191
  override close(): void {
184
192
  this.delegate?.close();
185
193
  this.delegate = undefined;
194
+ this.needsReInitialization = true;
186
195
  }
187
196
 
188
197
  override async sendData(
@@ -200,8 +209,28 @@ export class LazyWebsocketTransport extends Transport {
200
209
  Logger.error("Copilot#sendData: Failed to reconnect transport", error);
201
210
  throw new Error(
202
211
  "Unable to connect to GitHub Copilot. Please check your settings and try again.",
212
+ { cause: error },
203
213
  );
204
214
  }
215
+
216
+ // Re-run LSP initialization handshake after reconnecting
217
+ if (this.needsReInitialization && this.onReconnect) {
218
+ Logger.log(
219
+ "Copilot#sendData: Re-initializing LSP after reconnection...",
220
+ );
221
+ try {
222
+ await this.onReconnect();
223
+ this.needsReInitialization = false;
224
+ } catch (error) {
225
+ // Close the uninitialized connection so the next attempt starts fresh
226
+ this.close();
227
+ Logger.error(
228
+ "Copilot#sendData: LSP re-initialization after reconnection failed",
229
+ error,
230
+ );
231
+ throw error;
232
+ }
233
+ }
205
234
  }
206
235
 
207
236
  // After reconnection, delegate should be initialized
@@ -211,11 +240,8 @@ export class LazyWebsocketTransport extends Transport {
211
240
  );
212
241
  }
213
242
 
214
- // Clamp timeout to maxTimeoutMs
215
- timeout = Math.min(
216
- timeout ?? this.options.maxTimeoutMs,
217
- this.options.maxTimeoutMs,
218
- );
243
+ // Use maxTimeoutMs as default when no timeout is provided
244
+ timeout = timeout ?? this.options.maxTimeoutMs;
219
245
  return this.delegate.sendData(data, timeout);
220
246
  }
221
247
  }
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-empty-interface */
2
+ /* oxlint-disable typescript/no-empty-object-type */
3
3
 
4
4
  export interface GitHubCopilotSignInInitiateResult {
5
5
  verificationUri: string; // https://github.com/login/device
@@ -15,7 +15,7 @@ import { Facet } from "@codemirror/state";
15
15
  export function singleFacet<T>() {
16
16
  return Facet.define<T, T>({
17
17
  combine: (values) => {
18
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
18
+ // oxlint-disable-next-line typescript/no-non-null-assertion
19
19
  return values.find((v) => v !== undefined)!;
20
20
  },
21
21
  });
@@ -1722,9 +1722,9 @@ describe("tablesCompletionSource", () => {
1722
1722
  };
1723
1723
 
1724
1724
  const getCompletion = (extensions: Extension[]) => {
1725
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
1725
+ // oxlint-disable-next-line typescript/no-explicit-any
1726
1726
  const ext = extensions.find((ext) => (ext as any).facet === undefined);
1727
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
1727
+ // oxlint-disable-next-line typescript/no-explicit-any
1728
1728
  return (ext as any)?.value?.override?.[0];
1729
1729
  };
1730
1730
 
@@ -2140,7 +2140,7 @@ describe("tablesCompletionSource", () => {
2140
2140
  ...mockStore.get(dataSourceConnectionsAtom),
2141
2141
  connectionsMap: new Map([
2142
2142
  [TEST_ENGINE, newConnection],
2143
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
2143
+ // oxlint-disable-next-line typescript/no-explicit-any
2144
2144
  ]) as any,
2145
2145
  latestEngineSelected: TEST_ENGINE,
2146
2146
  });
@@ -2153,7 +2153,7 @@ describe("tablesCompletionSource", () => {
2153
2153
  mockStore.set(dataSourceConnectionsAtom, {
2154
2154
  connectionsMap: new Map([
2155
2155
  [TEST_ENGINE, mockConnection],
2156
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
2156
+ // oxlint-disable-next-line typescript/no-explicit-any
2157
2157
  ]) as any,
2158
2158
  latestEngineSelected: TEST_ENGINE,
2159
2159
  });
@@ -38,9 +38,7 @@ export const MARKDOWN_INITIAL_HIDE_CODE = true;
38
38
  /**
39
39
  * Language adapter for Markdown.
40
40
  */
41
- export class MarkdownLanguageAdapter
42
- implements LanguageAdapter<MarkdownLanguageAdapterMetadata>
43
- {
41
+ export class MarkdownLanguageAdapter implements LanguageAdapter<MarkdownLanguageAdapterMetadata> {
44
42
  private parser = new MarkdownParser();
45
43
 
46
44
  readonly type = "markdown";
@@ -45,6 +45,7 @@ import type { LanguageAdapter } from "../types";
45
45
 
46
46
  const pylspClient = once((lspConfig: LSPConfig) => {
47
47
  // Create a mutable reference for the resync callback
48
+ // oxlint-disable-next-line prefer-const -- reassigned after closure capture
48
49
  let resyncCallback: (() => Promise<void>) | undefined;
49
50
 
50
51
  const transport = createTransport("pylsp", async () => {
@@ -151,6 +152,7 @@ const pylspClient = once((lspConfig: LSPConfig) => {
151
152
  });
152
153
 
153
154
  const tyLspClient = once((_: LSPConfig) => {
155
+ // oxlint-disable-next-line prefer-const -- reassigned after closure capture
154
156
  let resyncCallback: (() => Promise<void>) | undefined;
155
157
 
156
158
  const transport = createTransport("ty", async () => {
@@ -181,6 +183,7 @@ const tyLspClient = once((_: LSPConfig) => {
181
183
 
182
184
  const pyreflyClient = once(
183
185
  (lspConfig: LSPConfig & { diagnostics: DiagnosticsConfig }) => {
186
+ // oxlint-disable-next-line prefer-const -- reassigned after closure capture
184
187
  let resyncCallback: (() => Promise<void>) | undefined;
185
188
 
186
189
  const transport = createTransport("pyrefly", async () => {
@@ -218,6 +221,7 @@ const pyreflyClient = once(
218
221
  );
219
222
 
220
223
  const pyrightClient = once((_: LSPConfig) => {
224
+ // oxlint-disable-next-line prefer-const -- reassigned after closure capture
221
225
  let resyncCallback: (() => Promise<void>) | undefined;
222
226
 
223
227
  const transport = createTransport("basedpyright", async () => {
@@ -76,7 +76,7 @@ export class CompletionBuilder {
76
76
  * Set a value at a nested path, creating intermediate objects as needed
77
77
  */
78
78
  private setAt(path: string[], value: SQLNamespace): void {
79
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
79
+ // oxlint-disable-next-line typescript/no-explicit-any
80
80
  let current: any = this.schema;
81
81
  for (const key of path.slice(0, -1)) {
82
82
  if (!current[key]) {
@@ -91,13 +91,11 @@ export function customKeywordCompletionSource(): CompletionSource {
91
91
 
92
92
  // e.g. lazily load keyword docs
93
93
  const getKeywordDocs = once(async (): Promise<Record<string, unknown>> => {
94
- const keywords = await import(
95
- "@marimo-team/codemirror-sql/data/common-keywords.json"
96
- );
94
+ const keywords =
95
+ await import("@marimo-team/codemirror-sql/data/common-keywords.json");
97
96
  // Include DuckDB for now, but we can remove this once we have a better way to handle dialect-specific keywords
98
- const duckdbKeywords = await import(
99
- "@marimo-team/codemirror-sql/data/duckdb-keywords.json"
100
- );
97
+ const duckdbKeywords =
98
+ await import("@marimo-team/codemirror-sql/data/duckdb-keywords.json");
101
99
  return {
102
100
  ...keywords.default.keywords,
103
101
  ...duckdbKeywords.default.keywords,
@@ -77,9 +77,7 @@ function getLatestEngine(): ConnectionName {
77
77
  /**
78
78
  * Language adapter for SQL.
79
79
  */
80
- export class SQLLanguageAdapter
81
- implements LanguageAdapter<SQLLanguageAdapterMetadata>
82
- {
80
+ export class SQLLanguageAdapter implements LanguageAdapter<SQLLanguageAdapterMetadata> {
83
81
  private parser = new SQLParser();
84
82
  readonly type = "sql";
85
83
  sqlModeEnabled: boolean;
@@ -5,7 +5,7 @@ import type { EditorView } from "@codemirror/view";
5
5
  /**
6
6
  * Metadata for language adapters
7
7
  */
8
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
8
+ // oxlint-disable-next-line typescript/no-explicit-any
9
9
  export type LanguageMetadata = Record<string, any>;
10
10
 
11
11
  /**
@@ -1,6 +1,9 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
- import type { SelectTriggerProps } from "@radix-ui/react-select";
3
+ import type { Select as SelectPrimitive } from "radix-ui";
4
+
5
+ type SelectTriggerProps = SelectPrimitive.SelectTriggerProps;
6
+
4
7
  import { useAtomValue } from "jotai";
5
8
  import {
6
9
  AlertCircle,
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* oxlint-disable typescript/no-explicit-any */
3
3
 
4
4
  import type { Extension } from "@codemirror/state";
5
5
  import type { CellId } from "@/core/cells/ids";
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* oxlint-disable typescript/no-explicit-any */
3
3
 
4
4
  import { EditorView } from "@codemirror/view";
5
5
  import {
@@ -815,7 +815,7 @@ export class NotebookLanguageServerClient implements ILanguageServerClient {
815
815
  ...diag,
816
816
  range: lens.reverseRange(diag.range, cellId),
817
817
  };
818
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
818
+ // oxlint-disable-next-line typescript/no-non-null-assertion
819
819
  diagnosticsByCellId.get(cellId)!.push(cellDiag);
820
820
  break; // Exit inner loop once we find the matching cell
821
821
  }
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* oxlint-disable typescript/no-explicit-any */
3
3
  import { EditorView } from "@codemirror/view";
4
4
  import { afterEach, beforeEach, describe, expect, it } from "vitest";
5
5
  import { dndBundle } from "../dnd";