@marimo-team/islands 0.22.1-dev9 → 0.22.2

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
@@ -33,108 +33,107 @@ beforeAll(() => {
33
33
  });
34
34
 
35
35
  describe("Cell data attributes", () => {
36
- it.each([
37
- "edit",
38
- "read",
39
- "present",
40
- ])("should render cell with data-cell-id and data-cell-name in %s mode", (mode) => {
41
- const { store, wrapper } = createTestWrapper();
42
- const cid = cellId("test");
43
- const cellName = "test_cell";
36
+ it.each(["edit", "read", "present"])(
37
+ "should render cell with data-cell-id and data-cell-name in %s mode",
38
+ (mode) => {
39
+ const { store, wrapper } = createTestWrapper();
40
+ const cid = cellId("test");
41
+ const cellName = "test_cell";
44
42
 
45
- const userConfig: UserConfig = {
46
- display: {
47
- cell_output: "below",
48
- code_editor_font_size: 14,
49
- dataframes: "rich",
50
- default_table_page_size: 10,
51
- default_table_max_columns: 10,
52
- default_width: "normal",
53
- theme: "light",
54
- reference_highlighting: false,
55
- },
56
- keymap: { preset: "default" },
57
- completion: {
58
- activate_on_typing: true,
59
- signature_hint_on_typing: false,
60
- copilot: false,
61
- },
62
- formatting: { line_length: 88 },
63
- package_management: { manager: "pip" },
64
- runtime: {
65
- auto_instantiate: false,
66
- default_sql_output: "native",
67
- auto_reload: "off",
68
- on_cell_change: "lazy",
69
- watcher_on_save: "lazy",
70
- reactive_tests: true,
71
- output_max_bytes: 1_000_000,
72
- std_stream_max_bytes: 1_000_000,
73
- pythonpath: [],
74
- dotenv: [".env"],
75
- },
76
- server: {
77
- browser: "default",
78
- follow_symlink: false,
79
- },
80
- save: { autosave: "off", autosave_delay: 1000, format_on_save: false },
81
- ai: {},
82
- } as UserConfig;
43
+ const userConfig: UserConfig = {
44
+ display: {
45
+ cell_output: "below",
46
+ code_editor_font_size: 14,
47
+ dataframes: "rich",
48
+ default_table_page_size: 10,
49
+ default_table_max_columns: 10,
50
+ default_width: "normal",
51
+ theme: "light",
52
+ reference_highlighting: false,
53
+ },
54
+ keymap: { preset: "default" },
55
+ completion: {
56
+ activate_on_typing: true,
57
+ signature_hint_on_typing: false,
58
+ copilot: false,
59
+ },
60
+ formatting: { line_length: 88 },
61
+ package_management: { manager: "pip" },
62
+ runtime: {
63
+ auto_instantiate: false,
64
+ default_sql_output: "native",
65
+ auto_reload: "off",
66
+ on_cell_change: "lazy",
67
+ watcher_on_save: "lazy",
68
+ reactive_tests: true,
69
+ output_max_bytes: 1_000_000,
70
+ std_stream_max_bytes: 1_000_000,
71
+ pythonpath: [],
72
+ dotenv: [".env"],
73
+ },
74
+ server: {
75
+ browser: "default",
76
+ follow_symlink: false,
77
+ },
78
+ save: { autosave: "off", autosave_delay: 1000, format_on_save: false },
79
+ ai: {},
80
+ } as UserConfig;
83
81
 
84
- const notebook = MockNotebook.notebookState({
85
- cellData: {
86
- [cid]: {
87
- code: "",
88
- name: cellName,
89
- edited: false,
90
- serializedEditorState: null,
91
- config: {
92
- disabled: false,
93
- hide_code: false,
94
- column: null,
82
+ const notebook = MockNotebook.notebookState({
83
+ cellData: {
84
+ [cid]: {
85
+ code: "",
86
+ name: cellName,
87
+ edited: false,
88
+ serializedEditorState: null,
89
+ config: {
90
+ disabled: false,
91
+ hide_code: false,
92
+ column: null,
93
+ },
95
94
  },
96
95
  },
97
- },
98
- });
96
+ });
99
97
 
100
- notebook.cellRuntime[cid] = createCellRuntimeState({
101
- status: "idle",
102
- output: null,
103
- consoleOutputs: [],
104
- interrupted: false,
105
- errored: false,
106
- stopped: false,
107
- staleInputs: false,
108
- runStartTimestamp: null,
109
- lastRunStartTimestamp: null,
110
- runElapsedTimeMs: null,
111
- debuggerActive: false,
112
- outline: null,
113
- });
98
+ notebook.cellRuntime[cid] = createCellRuntimeState({
99
+ status: "idle",
100
+ output: null,
101
+ consoleOutputs: [],
102
+ interrupted: false,
103
+ errored: false,
104
+ stopped: false,
105
+ staleInputs: false,
106
+ runStartTimestamp: null,
107
+ lastRunStartTimestamp: null,
108
+ runElapsedTimeMs: null,
109
+ debuggerActive: false,
110
+ outline: null,
111
+ });
114
112
 
115
- store.set(notebookAtom, notebook);
113
+ store.set(notebookAtom, notebook);
116
114
 
117
- const { container } = render(
118
- <TooltipProvider>
119
- <Cell
120
- cellId={cid}
121
- mode={mode as AppMode}
122
- canDelete={true}
123
- userConfig={userConfig}
124
- isCollapsed={false}
125
- collapseCount={0}
126
- canMoveX={false}
127
- theme="light"
128
- showPlaceholder={false}
129
- />
130
- </TooltipProvider>,
131
- { wrapper },
132
- );
115
+ const { container } = render(
116
+ <TooltipProvider>
117
+ <Cell
118
+ cellId={cid}
119
+ mode={mode as AppMode}
120
+ canDelete={true}
121
+ userConfig={userConfig}
122
+ isCollapsed={false}
123
+ collapseCount={0}
124
+ canMoveX={false}
125
+ theme="light"
126
+ showPlaceholder={false}
127
+ />
128
+ </TooltipProvider>,
129
+ { wrapper },
130
+ );
133
131
 
134
- const cellElement = container.querySelector(`[data-cell-id="${cid}"]`);
135
- expect(cellElement).toBeTruthy();
136
- expect(cellElement?.getAttribute("data-cell-name")).toBe(cellName);
137
- });
132
+ const cellElement = container.querySelector(`[data-cell-id="${cid}"]`);
133
+ expect(cellElement).toBeTruthy();
134
+ expect(cellElement?.getAttribute("data-cell-name")).toBe(cellName);
135
+ },
136
+ );
138
137
  });
139
138
 
140
139
  describe("Output data attributes", () => {
@@ -176,7 +176,7 @@ describe("DynamicFavicon", () => {
176
176
  const { rerender } = render(<DynamicFavicon isRunning={true} />);
177
177
  rerender(<DynamicFavicon isRunning={false} />);
178
178
 
179
- // eslint-disable-next-line @typescript-eslint/unbound-method
179
+ // oxlint-disable-next-line typescript/unbound-method
180
180
  expect(Notification.requestPermission).toHaveBeenCalled();
181
181
  });
182
182
  });
@@ -14,8 +14,10 @@ import { useOnMount } from "@/hooks/useLifecycle";
14
14
  import { cn } from "@/utils/cn";
15
15
  import { Events } from "@/utils/events";
16
16
 
17
- interface Props
18
- extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "onChange"> {
17
+ interface Props extends Omit<
18
+ React.InputHTMLAttributes<HTMLInputElement>,
19
+ "onChange"
20
+ > {
19
21
  value: string;
20
22
  onChange: (newName: string) => void;
21
23
  placeholder?: string;
@@ -0,0 +1,179 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import { CheckIcon, CopyIcon } from "lucide-react";
4
+ import React, { useEffect, useState } from "react";
5
+ import { Button } from "@/components/ui/button";
6
+ import {
7
+ DialogContent,
8
+ DialogDescription,
9
+ DialogFooter,
10
+ DialogHeader,
11
+ DialogTitle,
12
+ } from "@/components/ui/dialog";
13
+ import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
14
+ import { copyToClipboard } from "@/utils/copy";
15
+ import { Events } from "@/utils/events";
16
+ import { Tooltip } from "@/components/ui/tooltip";
17
+ import { assertNever } from "@/utils/assertNever";
18
+ import { asRemoteURL, useRuntimeManager } from "@/core/runtime/config";
19
+
20
+ type AgentTab = "claude" | "codex" | "opencode";
21
+
22
+ function getMarimoCommand(): string {
23
+ return import.meta.env.DEV ? "uv run marimo" : "uvx marimo@latest";
24
+ }
25
+
26
+ function getPromptCommand(
27
+ agent: AgentTab,
28
+ url: string,
29
+ withToken: boolean,
30
+ ): string {
31
+ const tokenFlag = withToken ? " --with-token" : "";
32
+ const base = `${getMarimoCommand()} pair prompt --url '${url}'${tokenFlag}`;
33
+ switch (agent) {
34
+ case "claude":
35
+ return `claude "$(${base} --claude)"`;
36
+ case "codex":
37
+ return `codex "$(${base} --codex)"`;
38
+ case "opencode":
39
+ return `opencode "$(${base} --opencode)"`;
40
+ default:
41
+ assertNever(agent);
42
+ }
43
+ }
44
+
45
+ function maskToken(token: string): string {
46
+ if (token.length <= 4) {
47
+ return "****";
48
+ }
49
+ return `${"*".repeat(Math.min(token.length - 4, 8))}${token.slice(-4)}`;
50
+ }
51
+
52
+ const SKILL_INSTALL = "npx skills add marimo-team/marimo-pair";
53
+
54
+ function useAuthToken(): string | null {
55
+ const [token, setToken] = useState<string | null>(null);
56
+ useEffect(() => {
57
+ fetch(asRemoteURL("/auth/token").href, { credentials: "include" })
58
+ .then((res) =>
59
+ res.ok ? (res.json() as Promise<{ token: string | null }>) : null,
60
+ )
61
+ .then((data) => setToken(data?.token ?? null))
62
+ .catch(() => setToken(null));
63
+ }, []);
64
+ return token;
65
+ }
66
+
67
+ export const PairWithAgentModal: React.FC<{
68
+ onClose: () => void;
69
+ }> = ({ onClose }) => {
70
+ const [activeTab, setActiveTab] = useState<AgentTab>("claude");
71
+ const runtimeManager = useRuntimeManager();
72
+ const authToken = useAuthToken();
73
+ const hasToken = Boolean(authToken);
74
+ const remoteUrl = runtimeManager.httpURL.toString();
75
+ const promptCommand = getPromptCommand(activeTab, remoteUrl, hasToken);
76
+
77
+ return (
78
+ <DialogContent className="sm:max-w-lg">
79
+ <DialogHeader>
80
+ <DialogTitle>Pair with an agent</DialogTitle>
81
+ <DialogDescription>
82
+ Use an AI coding agent to pair-program on this notebook.{" "}
83
+ <a
84
+ href="https://links.marimo.app/marimo-pair"
85
+ target="_blank"
86
+ rel="noopener noreferrer"
87
+ className="underline"
88
+ >
89
+ Learn more
90
+ </a>
91
+ .
92
+ </DialogDescription>
93
+ </DialogHeader>
94
+
95
+ <div className="flex flex-col gap-4 py-2">
96
+ <div className="flex flex-col gap-2">
97
+ <span className="text-sm font-medium">1. Install the skill</span>
98
+ <CommandBlock command={SKILL_INSTALL} />
99
+ </div>
100
+
101
+ <div className="flex flex-col gap-2">
102
+ <span className="text-sm font-medium">2. Run in your terminal</span>
103
+ <Tabs
104
+ value={activeTab}
105
+ onValueChange={(v) => setActiveTab(v as AgentTab)}
106
+ >
107
+ <TabsList className="w-full">
108
+ <TabsTrigger value="claude" className="flex-1">
109
+ Claude
110
+ </TabsTrigger>
111
+ <TabsTrigger value="codex" className="flex-1">
112
+ Codex
113
+ </TabsTrigger>
114
+ <TabsTrigger value="opencode" className="flex-1">
115
+ OpenCode
116
+ </TabsTrigger>
117
+ </TabsList>
118
+
119
+ <TabsContent value="claude" className="mt-3">
120
+ <CommandBlock command={promptCommand} />
121
+ </TabsContent>
122
+ <TabsContent value="codex" className="mt-3">
123
+ <CommandBlock command={promptCommand} />
124
+ </TabsContent>
125
+ <TabsContent value="opencode" className="mt-3">
126
+ <CommandBlock command={promptCommand} />
127
+ </TabsContent>
128
+ </Tabs>
129
+ </div>
130
+
131
+ {hasToken && authToken && (
132
+ <div className="flex flex-col gap-2">
133
+ <span className="text-sm font-medium">
134
+ 3. Paste when prompted for token
135
+ </span>
136
+ <CommandBlock command={authToken} display={maskToken(authToken)} />
137
+ </div>
138
+ )}
139
+ </div>
140
+
141
+ <DialogFooter>
142
+ <Button variant="secondary" onClick={onClose}>
143
+ Close
144
+ </Button>
145
+ </DialogFooter>
146
+ </DialogContent>
147
+ );
148
+ };
149
+
150
+ const CommandBlock: React.FC<{ command: string; display?: string }> = ({
151
+ command,
152
+ display,
153
+ }) => {
154
+ const [copied, setCopied] = useState(false);
155
+
156
+ const copy = Events.stopPropagation(async (e) => {
157
+ e.preventDefault();
158
+ await copyToClipboard(command);
159
+ setCopied(true);
160
+ setTimeout(() => setCopied(false), 2000);
161
+ });
162
+
163
+ return (
164
+ <div className="flex items-center gap-2 rounded-md bg-muted px-3 py-2 font-mono text-xs">
165
+ <code className="flex-1 select-all break-words">
166
+ {display ?? command}
167
+ </code>
168
+ <Tooltip content="Copied!" open={copied}>
169
+ <Button onClick={copy} size="xs" variant="ghost">
170
+ {copied ? (
171
+ <CheckIcon size={14} strokeWidth={1.5} />
172
+ ) : (
173
+ <CopyIcon size={14} strokeWidth={1.5} />
174
+ )}
175
+ </Button>
176
+ </Tooltip>
177
+ </div>
178
+ );
179
+ };
@@ -65,8 +65,10 @@ import { useSplitCellCallback } from "../cell/useSplitCell";
65
65
  import { NameCellInput } from "./name-cell-input";
66
66
  import type { ActionButton } from "./types";
67
67
 
68
- export interface CellActionButtonProps
69
- extends Pick<CellData, "name" | "config"> {
68
+ export interface CellActionButtonProps extends Pick<
69
+ CellData,
70
+ "name" | "config"
71
+ > {
70
72
  cellId: CellId;
71
73
  status: RuntimeState;
72
74
  hasOutput: boolean;
@@ -36,6 +36,7 @@ import {
36
36
  PresentationIcon,
37
37
  SettingsIcon,
38
38
  Share2Icon,
39
+ SparklesIcon,
39
40
  Undo2Icon,
40
41
  XCircleIcon,
41
42
  YoutubeIcon,
@@ -45,6 +46,7 @@ import { settingDialogAtom } from "@/components/app-config/state";
45
46
  import { MarkdownIcon } from "@/components/editor/cell/code/icons";
46
47
  import { useImperativeModal } from "@/components/modal/ImperativeModal";
47
48
  import { renderShortcut } from "@/components/shortcuts/renderShortcut";
49
+ import { PairWithAgentModal } from "@/components/editor/actions/pair-with-agent-modal";
48
50
  import { ShareStaticNotebookModal } from "@/components/static-html/share-modal";
49
51
  import { toast } from "@/components/ui/use-toast";
50
52
  import {
@@ -343,6 +345,14 @@ export function useNotebookActions() {
343
345
  ],
344
346
  },
345
347
 
348
+ {
349
+ icon: <SparklesIcon size={14} strokeWidth={1.5} />,
350
+ label: "Pair with an agent",
351
+ handle: async () => {
352
+ openModal(<PairWithAgentModal onClose={closeModal} />);
353
+ },
354
+ },
355
+
346
356
  {
347
357
  icon: <Share2Icon size={14} strokeWidth={1.5} />,
348
358
  label: "Share",
@@ -122,7 +122,7 @@ export const AddCellWithAI: React.FC<{
122
122
  transport: new StreamingChunkTransport(
123
123
  {
124
124
  api: runtimeManager.getAiURL("completion").toString(),
125
- headers: runtimeManager.headers(),
125
+ headers: () => runtimeManager.headers(),
126
126
  prepareSendMessagesRequest: async (options) => {
127
127
  const completionBody = await buildCompletionRequestBody(
128
128
  options.messages,
@@ -136,6 +136,7 @@ export const AddCellWithAI: React.FC<{
136
136
  };
137
137
 
138
138
  return {
139
+ api: runtimeManager.getAiURL("completion").toString(),
139
140
  body: body,
140
141
  };
141
142
  },
@@ -156,7 +156,7 @@ export const AiCompletionEditor: React.FC<Props> = ({
156
156
  // Use complete to pass the prompt directly, else input might be empty
157
157
  complete(initialPrompt);
158
158
  }
159
- // eslint-disable-next-line react-hooks/exhaustive-deps
159
+ // oxlint-disable-next-line react-hooks/exhaustive-deps
160
160
  }, [triggerImmediately]);
161
161
 
162
162
  // Focus the input
@@ -31,7 +31,7 @@ export const AppContainer: React.FC<PropsWithChildren<Props>> = ({
31
31
  <StatusOverlay connection={connection} isRunning={isRunning} />
32
32
  <PyodideLoader>
33
33
  <WrappedWithSidebar>
34
- {/** biome-ignore lint/correctness/useUniqueElementIds: ID is used by other components to grab the DOM element */}
34
+ {/** oxlint-ignore-next-line -- ID is used by other components to grab the DOM element */}
35
35
  <div
36
36
  id="App"
37
37
  data-config-width={width}
@@ -16,11 +16,10 @@ import "./cell-status.css";
16
16
  import { formatDistanceToNow } from "date-fns";
17
17
  import { Time } from "@/utils/time";
18
18
 
19
- export interface CellStatusComponentProps
20
- extends Pick<
21
- CellRuntimeState,
22
- "status" | "runStartTimestamp" | "interrupted" | "lastRunStartTimestamp"
23
- > {
19
+ export interface CellStatusComponentProps extends Pick<
20
+ CellRuntimeState,
21
+ "status" | "runStartTimestamp" | "interrupted" | "lastRunStartTimestamp"
22
+ > {
24
23
  editing: boolean;
25
24
  edited: boolean;
26
25
  disabled: boolean;
@@ -34,8 +34,10 @@ import {
34
34
  useCellActionButtons,
35
35
  } from "../actions/useCellActionButton";
36
36
 
37
- interface Props
38
- extends Pick<CellActionButtonProps, "cellId" | "getEditorView"> {
37
+ interface Props extends Pick<
38
+ CellActionButtonProps,
39
+ "cellId" | "getEditorView"
40
+ > {
39
41
  children: React.ReactNode;
40
42
  }
41
43
 
@@ -47,7 +47,8 @@ import { useSplitCellCallback } from "../useSplitCell";
47
47
  import { LanguageToggles } from "./language-toggle";
48
48
 
49
49
  export interface CellEditorProps
50
- extends Pick<CellRuntimeState, "status">,
50
+ extends
51
+ Pick<CellRuntimeState, "status">,
51
52
  Pick<CellData, "id" | "code" | "serializedEditorState" | "config"> {
52
53
  runCell: () => void;
53
54
  theme: Theme;
@@ -185,7 +186,7 @@ const CellEditorInternal = ({
185
186
  deleteCell: handleDelete,
186
187
  saveNotebook: saveOrNameNotebook,
187
188
  createManyBelow: (cells) => {
188
- for (const code of [...cells].reverse()) {
189
+ for (const code of cells.toReversed()) {
189
190
  cellActions.createNewCell({
190
191
  code,
191
192
  before: false,
@@ -27,7 +27,8 @@ const toolbarItemVariants = cva(
27
27
  );
28
28
 
29
29
  interface ToolbarItemProps
30
- extends VariantProps<typeof toolbarItemVariants>,
30
+ extends
31
+ VariantProps<typeof toolbarItemVariants>,
31
32
  React.HTMLAttributes<HTMLButtonElement> {
32
33
  tooltip: React.ReactNode;
33
34
  disabled?: boolean;
@@ -1,6 +1,9 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
- import { Slot } from "@radix-ui/react-slot";
3
+ import { Slot as SlotPrimitive } from "radix-ui";
4
+
5
+ const Slot = SlotPrimitive.Slot;
6
+
4
7
  import React, { type PropsWithChildren } from "react";
5
8
  import { useImperativeModal } from "@/components/modal/ImperativeModal";
6
9
  import { Button } from "@/components/ui/button";
@@ -1,6 +1,9 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
- import { Slot } from "@radix-ui/react-slot";
3
+ import { Slot as SlotPrimitive } from "radix-ui";
4
+
5
+ const Slot = SlotPrimitive.Slot;
6
+
4
7
  import React, { type PropsWithChildren } from "react";
5
8
  import { useImperativeModal } from "@/components/modal/ImperativeModal";
6
9
  import {
@@ -101,7 +101,7 @@ export const ContextAwarePanel: React.FC = () => {
101
101
  const renderBody = () => {
102
102
  return (
103
103
  <div className="pb-7 mb-4 h-full overflow-auto">
104
- <div className="p-3 border-b flex justify-between items-center">
104
+ <div className="px-3 py-2 border-b flex justify-between items-center">
105
105
  {renderModeToggle()}
106
106
  <Slot name={SlotNames.CONTEXT_AWARE_PANEL_HEADER} />
107
107
  <Button
@@ -18,6 +18,7 @@ export const PanelEmptyState = ({
18
18
  <div className="mx-6 my-6 flex flex-col gap-2">
19
19
  <div className="flex flex-row gap-2 items-center">
20
20
  {icon &&
21
+ // oxlint-disable-next-line react/no-clone-element
21
22
  React.cloneElement(icon, {
22
23
  className: "text-accent-foreground flex-shrink-0",
23
24
  })}
@@ -7,7 +7,6 @@ import React, { useCallback, useMemo } from "react";
7
7
  import useResizeObserver from "use-resize-observer";
8
8
  import { StorageInspector } from "@/components/storage/storage-inspector";
9
9
  import { Accordion } from "@/components/ui/accordion";
10
- import { getFeatureFlag } from "@/core/config/feature-flag";
11
10
  import { storageNamespacesAtom } from "@/core/storage/state";
12
11
  import { cn } from "@/utils/cn";
13
12
  import { jotaiJsonStorage } from "@/utils/storage/jotai";
@@ -103,15 +102,6 @@ const FileExplorerPanel: React.FC = () => {
103
102
  bothOpen ? availableContent - storageMaxHeight : availableContent,
104
103
  );
105
104
 
106
- const storageInspectorEnabled = getFeatureFlag("storage_inspector");
107
- if (!storageInspectorEnabled) {
108
- return (
109
- <div ref={panelRef} className="h-full overflow-auto">
110
- <FileExplorerComponent height={panelHeight} />
111
- </div>
112
- );
113
- }
114
-
115
105
  return (
116
106
  <div ref={panelRef} className="h-full overflow-auto">
117
107
  <Accordion
@@ -125,7 +125,7 @@ const SnippetViewer: React.FC<{ snippet: Snippet; onClose: () => void }> = ({
125
125
 
126
126
  const handleInsertSnippet = () => {
127
127
  // Add below last focused cell in reverse order
128
- for (const section of [...snippet.sections].reverse()) {
128
+ for (const section of snippet.sections.toReversed()) {
129
129
  if (section.code) {
130
130
  createNewCell({
131
131
  code: section.code,
@@ -25,7 +25,7 @@ import type { ListSecretKeysResponse } from "@/core/network/types";
25
25
 
26
26
  // dotenv providers should be at the top
27
27
  export function sortProviders(providers: ListSecretKeysResponse["keys"]) {
28
- return providers.sort((a, b) => {
28
+ return providers.toSorted((a, b) => {
29
29
  if (a.provider === "env") {
30
30
  return 1;
31
31
  }
@@ -14,7 +14,10 @@ import {
14
14
  import { Footer } from "./footer";
15
15
  import { Sidebar } from "./sidebar";
16
16
  import "./app-chrome.css";
17
- import { TooltipProvider } from "@radix-ui/react-tooltip";
17
+ import { Tooltip } from "radix-ui";
18
+
19
+ const TooltipProvider = Tooltip.Provider;
20
+
18
21
  import { useAtom, useAtomValue } from "jotai";
19
22
  import { XIcon } from "lucide-react";
20
23
  import useEvent from "react-use-event-hook";