@marimo-team/islands 0.25.3-dev17 → 0.25.3-dev173

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 (549) hide show
  1. package/dist/{ConnectedDataExplorerComponent-CNMliVzw.js → ConnectedDataExplorerComponent-Le_OBfmt.js} +21 -19
  2. package/dist/{ErrorBoundary-jaGao4LA.js → ErrorBoundary-wT3f3iJ1.js} +19 -19
  3. package/dist/{abnfDiagram-VCTEODGH-D-Ez91gV.js → abnfDiagram-VCTEODGH-Tf1ghyQQ.js} +2 -2
  4. package/dist/any-language-editor-B92WMzoC.js +75 -0
  5. package/dist/{architectureDiagram-5GKGNRK7-CTpcNtO8.js → architectureDiagram-5GKGNRK7-xlnbTG0T.js} +1 -1
  6. package/dist/{arrays-CN1djC4k.js → arrays-R6JsImiT.js} +8 -0
  7. package/dist/assets/__vite-browser-external-DVeFf2e7.js +1 -0
  8. package/dist/assets/worker-C1pfNBsx.js +113 -0
  9. package/dist/{button-CvjkwdSk.js → button-BQRdqQi1.js} +199 -192
  10. package/dist/{capabilities-CQ5IjhzL.js → capabilities-CI4xUPsp.js} +2 -2
  11. package/dist/{chat-ui-DaHynk8g.js → chat-ui-CuORr6fL.js} +1142 -1141
  12. package/dist/{check-EDwSwP89.js → check-C9Mp9eCK.js} +1 -1
  13. package/dist/{chunk-IMKFNOWR-DGxi-zeo.js → chunk-IMKFNOWR-Cmd4a5jy.js} +1 -1
  14. package/dist/{chunk-SHT3W25Y-CV9J3rAB.js → chunk-SHT3W25Y-mSNp-WpO.js} +1 -1
  15. package/dist/{chunk-SVP7TREG-BL-9Fqgg.js → chunk-SVP7TREG-CWC49D8X.js} +1 -1
  16. package/dist/{chunk-TICWLB2K-Cu_XMjDM.js → chunk-TICWLB2K-De9FINtG.js} +1 -1
  17. package/dist/{chunk-YOKDWASO-DPZk8vhS.js → chunk-YOKDWASO-DKplTrBY.js} +20 -20
  18. package/dist/{classDiagram-ZZMXUADV-BXXV13Hq.js → classDiagram-ZZMXUADV-DweTkYdp.js} +2 -2
  19. package/dist/{classDiagram-v2-VYDZK3BY-B7FXJ1Cp.js → classDiagram-v2-VYDZK3BY-A6MR2TiE.js} +2 -2
  20. package/dist/{code-visibility-Bub8tnaA.js → code-visibility-ZReaeMaF.js} +25 -25
  21. package/dist/{common-CdT0nyN1.js → common-DCevHg1m.js} +6917 -6738
  22. package/dist/{copy-icon-Ft7t9bqz.js → copy-icon-De584pZ4.js} +3 -3
  23. package/dist/{cynefinDiagram-5FMLGOSQ-CH96rwba.js → cynefinDiagram-5FMLGOSQ-BSvo5le-.js} +1 -1
  24. package/dist/{dagre-GXQ25YYZ-BD3PmpFY.js → dagre-GXQ25YYZ-tXRQslO6.js} +1 -1
  25. package/dist/{data-grid-overlay-editor-Dbcss6_2.js → data-grid-overlay-editor-CTC-bJus.js} +5 -5
  26. package/dist/{data-grid-types-BH_r7g7l.js → data-grid-types-0PJ-9N5n.js} +1 -1
  27. package/dist/{diagram-S7CK7UJ4-BsSJJldB.js → diagram-S7CK7UJ4-r3t5VtwI.js} +1 -1
  28. package/dist/{diagram-UQ7AKVKN-muQtNZc4.js → diagram-UQ7AKVKN-qgbC8YnT.js} +1 -1
  29. package/dist/{diagram-VX7I27RA-CdhuZAqR.js → diagram-VX7I27RA-CiHxEwtp.js} +1 -1
  30. package/dist/{diagram-Z3DM3KII-BD8mXjOj.js → diagram-Z3DM3KII-D95u15Ev.js} +1 -1
  31. package/dist/{dialog-CEBFZNyc.js → dialog-DVRfQuhD.js} +25 -25
  32. package/dist/{dist-DpBpA_n1.js → dist-Lm-D-Vr6.js} +3 -3
  33. package/dist/{dropdown-menu-CP_qCYHC.js → dropdown-menu-DCMbbQ35.js} +1481 -1433
  34. package/dist/{ebnfDiagram-PWID7BFC-BIN1sweE.js → ebnfDiagram-PWID7BFC-P7e4bryK.js} +2 -2
  35. package/dist/{erDiagram-RLTQ6QDP-Ctp5cfoN.js → erDiagram-RLTQ6QDP-CUHZcmRj.js} +1 -1
  36. package/dist/{error-banner-D-WCIiMt.js → error-banner-DxJ3s8YO.js} +86 -86
  37. package/dist/{error-entries-Bv6bZPF3.js → error-entries-CmWMEsY_.js} +5756 -5643
  38. package/dist/{feedback-button-B3Wrnsf_.js → feedback-button-DwXkmewo.js} +35 -35
  39. package/dist/{flowDiagram-HODETNUW-3EfLrlFb.js → flowDiagram-HODETNUW-BGZ95AzI.js} +2 -2
  40. package/dist/{formats-27CW_UP4.js → formats-DI7HEVv7.js} +3 -3
  41. package/dist/{ganttDiagram-EL5Y4UJY-BQT16JSc.js → ganttDiagram-EL5Y4UJY-Dh_4cBJZ.js} +2 -2
  42. package/dist/{glide-data-editor-BDYKJdqK.js → glide-data-editor-BlmcP-lw.js} +370 -368
  43. package/dist/{glide-utils-DJyqh0EM.js → glide-utils-D98laidb.js} +16 -16
  44. package/dist/{globals-DGTE1S0_.js → globals-BdRitZ4p.js} +3 -3
  45. package/dist/{highlighted-body-KPVGNVTW-zwjq21tf.js → highlighted-body-KPVGNVTW-3Ziwfz-V.js} +2 -2
  46. package/dist/{html-to-image-Bf8QMGi4.js → html-to-image-bpiQh7ND.js} +639 -602
  47. package/dist/{infoDiagram-27XIBGKW-DipQoHxl.js → infoDiagram-27XIBGKW-BF0YX70D.js} +1 -1
  48. package/dist/{ishikawaDiagram-5VMMS53U-DgFMjSGz.js → ishikawaDiagram-5VMMS53U-_itsAAn-.js} +1 -1
  49. package/dist/{kanban-definition-UXKFOSKX-w1ACVjgl.js → kanban-definition-UXKFOSKX-VNW2Beqh.js} +1 -1
  50. package/dist/{label-BDKF3Afc.js → label-Qvw1E97W.js} +3 -3
  51. package/dist/{linear-Cnaq3Tfb.js → linear-DWERh7eI.js} +121 -73
  52. package/dist/{loader-BQOfjTIJ.js → loader-DOVB0Syl.js} +12 -12
  53. package/dist/main.js +9672 -7674
  54. package/dist/{mermaid-CHo49Yv-.js → mermaid-CZ6FrClS.js} +38 -38
  55. package/dist/mermaid-HWGCJPDP-Du3-HPQA.js +2 -0
  56. package/dist/{mindmap-definition-YA3MSWOX-CrT0KSfX.js → mindmap-definition-YA3MSWOX-DR4ripvd.js} +1 -1
  57. package/dist/{number-overlay-editor-S8UJY0i5.js → number-overlay-editor-DQG-hFHT.js} +3 -3
  58. package/dist/{objects-CzUgoMIF.js → objects-DCmMvZtn.js} +1 -3
  59. package/dist/{once-BtE-wKRL.js → once-eG8Vmvjd.js} +1 -1
  60. package/dist/{pegDiagram-XKGWAZYB-BqvywNJA.js → pegDiagram-XKGWAZYB-CFr3XlGl.js} +2 -2
  61. package/dist/{pieDiagram-E7YTZNPT-BfxJ_XCc.js → pieDiagram-E7YTZNPT-j91XYSLY.js} +1 -1
  62. package/dist/precisionRound-DhAzeRcm.js +49 -0
  63. package/dist/{process-output-BZg56CCb.js → process-output-BzloOI7F.js} +4 -4
  64. package/dist/{quadrantDiagram-AXDQQJYC-Ccw0xMjN.js → quadrantDiagram-AXDQQJYC-Blrm7V7_.js} +1 -1
  65. package/dist/{railroadDiagram-O6MQD6OU-8vFLVTPu.js → railroadDiagram-O6MQD6OU-Cd47ZV9E.js} +2 -2
  66. package/dist/{react-vega-BED0DjiB.js → react-vega-C4T9Rb_w.js} +12284 -12270
  67. package/dist/{requirementDiagram-BXWQKSXE-a_MxGvxe.js → requirementDiagram-BXWQKSXE-eJH6gLtX.js} +1 -1
  68. package/dist/{reveal-component-De4Pvf4V.js → reveal-component-D3r3vSTK.js} +14 -14
  69. package/dist/{select-BButFi-d.js → select-2KOiReNY.js} +536 -457
  70. package/dist/{sequenceDiagram-WJ2MYXX4-CXFMnxGh.js → sequenceDiagram-WJ2MYXX4-DdfFEIrm.js} +1 -1
  71. package/dist/{spec-BwarBpUJ.js → spec-h69nC3SI.js} +41 -11
  72. package/dist/{stateDiagram-D77RDMKH-DQeA_CwI.js → stateDiagram-D77RDMKH-DkjDvip8.js} +2 -2
  73. package/dist/{stateDiagram-v2-MP3YSRHH-BxxQucm1.js → stateDiagram-v2-MP3YSRHH-DBHACnOo.js} +2 -2
  74. package/dist/style.css +1 -1
  75. package/dist/{swimlanes-42K2YHIH-Do6L-cYg.js → swimlanes-42K2YHIH-ogImlOmp.js} +1 -1
  76. package/dist/{swimlanesDiagram-VR7AAH4N-DUzPvSVU.js → swimlanesDiagram-VR7AAH4N-D6x-zsci.js} +2 -2
  77. package/dist/{swiper-component-DKntyn8p.js → swiper-component-BkCm-kLg.js} +2 -2
  78. package/dist/{time-BieKwdYS.js → time-BaMbJs4z.js} +18 -18
  79. package/dist/{timeline-definition-24CTP7MA-D3c46WM5.js → timeline-definition-24CTP7MA-DQpLtsHD.js} +1 -1
  80. package/dist/{toDate-UtiwmnH2.js → toDate-CDzoofJo.js} +37 -36
  81. package/dist/{toast-B9UMEi8u.js → toast-B5t9o6s_.js} +219 -201
  82. package/dist/{tooltip-BO1REbqs.js → tooltip-s4zZxwKe.js} +325 -301
  83. package/dist/{use-restore-focus-BEM7sFWl.js → use-restore-focus-BgDTd2tc.js} +1482 -1433
  84. package/dist/{useAsyncData-Deh5kszT.js → useAsyncData-Bn8SxUqM.js} +15 -14
  85. package/dist/{useDateFormatter-D8XruNGG.js → useDateFormatter-D3Tkfzej.js} +2 -2
  86. package/dist/{useDeepCompareMemoize-DXwzRINI.js → useDeepCompareMemoize-CC2tnPCk.js} +1 -1
  87. package/dist/{useIframeCapabilities-DBETvvPl.js → useIframeCapabilities-CSdWn6NP.js} +1 -1
  88. package/dist/{useLifecycle-j7D9uD1o.js → useLifecycle-BJlxHqWa.js} +28 -25
  89. package/dist/{useTheme-CRnjkku0.js → useTheme-DMfQYmlG.js} +301 -297
  90. package/dist/{vega-component-BeF9dfyO.js → vega-component-CovWHi60.js} +148 -148
  91. package/dist/{vega-embed-container-BNHE18G9.js → vega-embed-container--LYZqguO.js} +2 -2
  92. package/dist/{vega-loader.browser-DNST6uVf.js → vega-loader.browser-B9Pz0EGP.js} +298 -507
  93. package/dist/{vennDiagram-4TSXK5OY-BSZD8JcZ.js → vennDiagram-4TSXK5OY-BD-SL_vq.js} +1 -1
  94. package/dist/{wardleyDiagram-VM6X3IG4-48cUWkfA.js → wardleyDiagram-VM6X3IG4-BDgJV4ah.js} +1 -1
  95. package/dist/{xychartDiagram-S5SC5T6Z-CswYgYeu.js → xychartDiagram-S5SC5T6Z-1hIHN6Rl.js} +2 -2
  96. package/package.json +16 -16
  97. package/src/__mocks__/requests.ts +0 -1
  98. package/src/__tests__/module-entry.test.ts +44 -0
  99. package/src/__tests__/mount.test.ts +1 -21
  100. package/src/__tests__/{host-imports.test.ts → replica-imports.test.ts} +12 -11
  101. package/src/components/ai/__tests__/ai-model-dropdown.test.tsx +63 -0
  102. package/src/components/ai/ai-model-dropdown.tsx +11 -6
  103. package/src/components/app-config/ai-config.tsx +7 -2
  104. package/src/components/app-config/user-config-form.tsx +35 -0
  105. package/src/components/chat/__tests__/message-queue.test.tsx +17 -0
  106. package/src/components/chat/acp/__tests__/session-tabs.test.tsx +43 -0
  107. package/src/components/chat/acp/__tests__/state.test.ts +2 -2
  108. package/src/components/chat/acp/blocks.tsx +3 -2
  109. package/src/components/chat/acp/session-tabs.tsx +8 -3
  110. package/src/components/chat/chat-components.tsx +2 -0
  111. package/src/components/chat/chat-panel.tsx +9 -8
  112. package/src/components/chat/chat-utils.ts +4 -8
  113. package/src/components/data-table/TableBottomBar.tsx +4 -1
  114. package/src/components/data-table/TableTopBar.tsx +2 -0
  115. package/src/components/data-table/__tests__/chart-spec-model.test.ts +195 -195
  116. package/src/components/data-table/__tests__/column-explorer.test.tsx +27 -1
  117. package/src/components/data-table/__tests__/columns.test.tsx +105 -0
  118. package/src/components/data-table/__tests__/context-menu-interaction.test.tsx +130 -0
  119. package/src/components/data-table/__tests__/data-table.test.tsx +1 -0
  120. package/src/components/data-table/__tests__/date-popover.test.tsx +72 -0
  121. package/src/components/data-table/__tests__/export-actions.test.tsx +105 -0
  122. package/src/components/data-table/__tests__/keyboard-selection.test.tsx +188 -0
  123. package/src/components/data-table/__tests__/pagination.test.tsx +28 -1
  124. package/src/components/data-table/__tests__/search-highlight.test.tsx +109 -0
  125. package/src/components/data-table/__tests__/url-detector.test.tsx +74 -0
  126. package/src/components/data-table/cell-selection/feature.ts +2 -2
  127. package/src/components/data-table/cell-selection/types.ts +2 -2
  128. package/src/components/data-table/charts/__tests__/chart-panel.test.tsx +74 -1
  129. package/src/components/data-table/charts/__tests__/spec-snapshot.test.ts +20 -20
  130. package/src/components/data-table/charts/__tests__/spec.test.ts +78 -52
  131. package/src/components/data-table/charts/__tests__/storage.test.ts +4 -1
  132. package/src/components/data-table/charts/chart-spec/spec.ts +68 -43
  133. package/src/components/data-table/charts/charts.tsx +40 -30
  134. package/src/components/data-table/charts/storage.ts +16 -5
  135. package/src/components/data-table/column-explorer-panel/column-explorer.tsx +1 -1
  136. package/src/components/data-table/column-summary/chart-spec-model.tsx +23 -16
  137. package/src/components/data-table/column-summary/column-summary.tsx +2 -4
  138. package/src/components/data-table/column-visibility-dropdown.tsx +8 -13
  139. package/src/components/data-table/columns.tsx +45 -46
  140. package/src/components/data-table/context-menu.tsx +36 -20
  141. package/src/components/data-table/data-table.tsx +17 -1
  142. package/src/components/data-table/date-popover.tsx +6 -4
  143. package/src/components/data-table/export-actions.tsx +76 -48
  144. package/src/components/data-table/pagination.tsx +44 -33
  145. package/src/components/data-table/range-focus/atoms.ts +4 -6
  146. package/src/components/data-table/range-focus/use-cell-range-selection.ts +65 -38
  147. package/src/components/data-table/range-focus/use-scroll-into-view.ts +21 -2
  148. package/src/components/data-table/renderers.tsx +16 -7
  149. package/src/components/data-table/row-viewer-panel/__tests__/row-viewer.test.tsx +24 -1
  150. package/src/components/data-table/row-viewer-panel/row-viewer.tsx +4 -4
  151. package/src/components/data-table/search-highlight.tsx +79 -0
  152. package/src/components/data-table/types.ts +1 -0
  153. package/src/components/data-table/url-detector.tsx +49 -9
  154. package/src/components/datasources/__tests__/column-actions.test.tsx +97 -0
  155. package/src/components/datasources/__tests__/column-preview.test.tsx +98 -5
  156. package/src/components/datasources/__tests__/datasources-interactions.test.tsx +181 -0
  157. package/src/components/datasources/__tests__/table-list.test.tsx +118 -0
  158. package/src/components/datasources/__tests__/utils.test.ts +57 -6
  159. package/src/components/datasources/column-preview.tsx +13 -4
  160. package/src/components/datasources/datasources.tsx +51 -39
  161. package/src/components/datasources/utils.ts +32 -23
  162. package/src/components/debugger/debugger-code.tsx +5 -0
  163. package/src/components/dependency-graph/dependency-graph-tree.tsx +8 -8
  164. package/src/components/dependency-graph/elements.ts +24 -21
  165. package/src/components/dependency-graph/panels.tsx +2 -1
  166. package/src/components/dependency-graph/utils/__tests__/layout.test.ts +18 -11
  167. package/src/components/editor/SortableCell.tsx +1 -3
  168. package/src/{core/attachments/__tests__/toast.test.tsx → components/editor/__tests__/agent-toast.test.tsx} +1 -1
  169. package/src/components/editor/__tests__/data-attributes.test.tsx +6 -2
  170. package/src/components/editor/__tests__/dynamic-favicon.test.tsx +111 -18
  171. package/src/components/editor/__tests__/package-alert.test.tsx +22 -1
  172. package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +24 -0
  173. package/src/components/editor/actions/pair-with-agent-modal.tsx +18 -15
  174. package/src/components/editor/actions/useRestartKernel.tsx +1 -1
  175. package/src/components/editor/ai/add-cell-with-ai.tsx +3 -3
  176. package/src/components/editor/ai/ai-completion-editor.tsx +1 -0
  177. package/src/components/editor/alerts/__tests__/connection-notice.test.tsx +1 -1
  178. package/src/components/editor/alerts/connection-notice.tsx +1 -1
  179. package/src/components/editor/alerts/startup-logs-alert.tsx +1 -0
  180. package/src/components/editor/app-container.tsx +1 -1
  181. package/src/components/editor/boundary/__tests__/ErrorBoundary.test.tsx +1 -1
  182. package/src/components/editor/cell/CreateCellButton.tsx +10 -12
  183. package/src/components/editor/cell/DeleteButton.tsx +3 -2
  184. package/src/components/editor/cell/RunButton.tsx +2 -2
  185. package/src/components/editor/cell/StagedAICell.tsx +10 -2
  186. package/src/components/editor/cell/StopButton.tsx +2 -2
  187. package/src/components/editor/cell/__tests__/useShouldShowInterrupt.test.ts +39 -0
  188. package/src/components/editor/cell/code/__tests__/language-toggle.test.tsx +54 -0
  189. package/src/components/editor/cell/code/cell-editor.tsx +9 -16
  190. package/src/components/editor/cell/code/language-toggle.tsx +8 -7
  191. package/src/components/editor/cell/collapse.tsx +5 -3
  192. package/src/components/editor/cell/useShouldShowInterrupt.ts +2 -12
  193. package/src/components/editor/chrome/components/__tests__/feedback-button.test.tsx +1 -1
  194. package/src/components/editor/chrome/components/feedback-button.tsx +1 -1
  195. package/src/components/editor/chrome/panels/__tests__/packages-panel.test.tsx +31 -2
  196. package/src/components/editor/chrome/panels/__tests__/runtime-details.test.tsx +1 -1
  197. package/src/components/editor/chrome/panels/__tests__/sandbox-recovery.test.tsx +1 -1
  198. package/src/components/editor/chrome/panels/cache-panel.tsx +1 -0
  199. package/src/components/editor/chrome/panels/outline/__tests__/outline-keyboard.test.tsx +84 -0
  200. package/src/components/editor/chrome/panels/outline/floating-outline.tsx +39 -14
  201. package/src/components/editor/chrome/panels/outline/useActiveOutline.tsx +3 -2
  202. package/src/components/editor/chrome/panels/packages-panel.tsx +4 -7
  203. package/src/components/editor/chrome/panels/secrets-panel.tsx +1 -0
  204. package/src/components/editor/chrome/panels/snippets-panel.tsx +5 -1
  205. package/src/components/editor/chrome/wrapper/__tests__/attachment-status.test.tsx +9 -18
  206. package/src/components/editor/chrome/wrapper/__tests__/document-sync-status.test.tsx +92 -0
  207. package/src/components/editor/chrome/wrapper/__tests__/pending-ai-cells.test.tsx +58 -1
  208. package/src/components/editor/chrome/wrapper/footer-items/attachment-status.tsx +4 -4
  209. package/src/components/editor/chrome/wrapper/footer-items/backend-status.tsx +1 -1
  210. package/src/components/editor/chrome/wrapper/footer-items/document-sync-status.tsx +54 -0
  211. package/src/components/editor/chrome/wrapper/footer-items/lsp-status.tsx +1 -1
  212. package/src/components/editor/chrome/wrapper/footer-items/machine-stats.tsx +1 -1
  213. package/src/components/editor/chrome/wrapper/footer-items/runtime-settings.tsx +1 -7
  214. package/src/components/editor/chrome/wrapper/footer.tsx +2 -0
  215. package/src/components/editor/chrome/wrapper/pending-ai-cells.tsx +12 -2
  216. package/src/components/editor/chrome/wrapper/storage.ts +1 -1
  217. package/src/components/editor/connections/components.tsx +1 -1
  218. package/src/components/editor/controls/Controls.tsx +2 -2
  219. package/src/components/editor/controls/__tests__/command-palette.test.tsx +53 -0
  220. package/src/components/editor/controls/__tests__/keyboard-shortcuts.test.tsx +61 -0
  221. package/src/components/editor/controls/__tests__/notebook-menu-dropdown.test.tsx +1 -1
  222. package/src/components/editor/controls/command-palette.tsx +22 -10
  223. package/src/components/editor/controls/keyboard-shortcuts.tsx +14 -5
  224. package/src/components/editor/dynamic-favicon.tsx +21 -40
  225. package/src/components/editor/errors/__tests__/send-error-report-button.test.tsx +9 -23
  226. package/src/components/editor/errors/send-error-report-button.tsx +3 -6
  227. package/src/components/editor/file-tree/__tests__/file-explorer-interactions.test.tsx +6 -0
  228. package/src/components/editor/file-tree/__tests__/file-explorer-navigation.test.tsx +47 -0
  229. package/src/components/editor/file-tree/__tests__/use-file-search.test.tsx +91 -0
  230. package/src/components/editor/file-tree/file-explorer.tsx +45 -8
  231. package/src/components/editor/file-tree/file-name-input.tsx +1 -0
  232. package/src/components/editor/file-tree/file-viewer.tsx +4 -2
  233. package/src/components/editor/file-tree/use-file-search.ts +35 -21
  234. package/src/components/editor/header/__tests__/status.test.tsx +5 -3
  235. package/src/components/editor/header/app-header.tsx +1 -1
  236. package/src/components/editor/header/status.tsx +40 -20
  237. package/src/components/editor/links/__tests__/cell-link.test.tsx +146 -0
  238. package/src/components/editor/links/cell-link.tsx +14 -5
  239. package/src/components/editor/navigation/focus-utils.ts +4 -4
  240. package/src/components/editor/notebook-banner.tsx +1 -0
  241. package/src/components/editor/notebook-cell.tsx +12 -3
  242. package/src/components/editor/output/MarimoErrorOutput.tsx +2 -1
  243. package/src/components/editor/output/MarimoTracebackOutput.tsx +19 -17
  244. package/src/components/editor/output/Outputs.css +8 -0
  245. package/src/components/editor/output/__tests__/traceback.test.tsx +27 -1
  246. package/src/components/editor/output/ansi-reduce.ts +33 -20
  247. package/src/components/editor/output/console/ConsoleOutput.tsx +19 -25
  248. package/src/components/editor/package-alert.tsx +14 -7
  249. package/src/components/editor/renderers/grid-layout/grid-layout.tsx +12 -6
  250. package/src/components/editor/renderers/vertical-layout/sidebar/toggle.tsx +7 -1
  251. package/src/components/home/components.tsx +17 -31
  252. package/src/components/icons/__tests__/large-spinner.test.tsx +39 -0
  253. package/src/components/icons/large-spinner.tsx +3 -14
  254. package/src/components/icons/spinner.tsx +1 -1
  255. package/src/components/mcp/mcp-status-indicator.tsx +1 -1
  256. package/src/components/pages/__tests__/home-page.test.tsx +116 -0
  257. package/src/components/pages/home-page.tsx +164 -91
  258. package/src/components/scratchpad/scratchpad.test.tsx +95 -0
  259. package/src/components/scratchpad/scratchpad.tsx +16 -3
  260. package/src/components/slides/reveal-component.tsx +4 -2
  261. package/src/components/slides/slide-cell-view.tsx +1 -1
  262. package/src/components/slides/slide-form.tsx +1 -0
  263. package/src/components/tracing/tracing-keyboard.test.tsx +85 -0
  264. package/src/components/tracing/tracing.tsx +45 -41
  265. package/src/components/ui/__tests__/draggable-popover.test.tsx +24 -0
  266. package/src/components/ui/__tests__/range-slider.test.tsx +165 -0
  267. package/src/components/ui/alert-dialog.tsx +1 -1
  268. package/src/components/ui/draggable-popover.tsx +24 -2
  269. package/src/components/ui/range-slider.tsx +22 -9
  270. package/src/core/ai/__tests__/staged-cells.test.ts +8 -5
  271. package/src/core/ai/context/providers/datasource.ts +6 -2
  272. package/src/core/ai/staged-cells.ts +7 -2
  273. package/src/core/ai/tools/__tests__/edit-notebook-tool.test.ts +3 -15
  274. package/src/core/ai/tools/base.ts +16 -7
  275. package/src/core/ai/tools/edit-notebook-tool.ts +61 -48
  276. package/src/core/ai/tools/registry.ts +13 -8
  277. package/src/core/ai/tools/sample-tool.ts +6 -7
  278. package/src/core/cells/__tests__/__snapshots__/cells.test.ts.snap +4 -0
  279. package/src/core/cells/__tests__/cell.test.ts +39 -0
  280. package/src/core/cells/__tests__/cells.test.ts +83 -346
  281. package/src/core/cells/__tests__/collapseConsoleOutputs.test.ts +54 -0
  282. package/src/core/cells/__tests__/document.test.ts +444 -0
  283. package/src/core/cells/__tests__/flush-document.test.ts +40 -0
  284. package/src/core/cells/__tests__/notebook-outline.test.ts +108 -0
  285. package/src/core/cells/__tests__/session.test.ts +117 -36
  286. package/src/core/cells/__tests__/with-document-save.test.ts +67 -0
  287. package/src/core/cells/cell.ts +14 -3
  288. package/src/core/cells/cells.ts +65 -190
  289. package/src/core/cells/columns.ts +38 -0
  290. package/src/core/cells/document.ts +389 -0
  291. package/src/core/cells/pending-delete-service.ts +2 -6
  292. package/src/core/cells/session.ts +1 -1
  293. package/src/core/cells/types.ts +22 -1
  294. package/src/core/codemirror/__tests__/setup.test.ts +29 -29
  295. package/src/core/codemirror/ai/__tests__/resources.test.ts +117 -0
  296. package/src/core/codemirror/ai/resources.ts +1 -1
  297. package/src/core/codemirror/cells/__tests__/extensions.test.ts +42 -1
  298. package/src/core/codemirror/cells/extensions.ts +21 -3
  299. package/src/core/codemirror/format.ts +6 -5
  300. package/src/core/codemirror/keymaps/vim.ts +2 -6
  301. package/src/core/codemirror/language/__tests__/sql.test.ts +22 -20
  302. package/src/core/codemirror/language/__tests__/utils.test.ts +187 -15
  303. package/src/core/codemirror/language/cell-code.ts +114 -0
  304. package/src/core/codemirror/language/extension.ts +52 -35
  305. package/src/core/codemirror/language/languages/markdown.ts +8 -6
  306. package/src/core/codemirror/language/languages/python.ts +16 -10
  307. package/src/core/codemirror/language/languages/sql/sql.ts +16 -24
  308. package/src/core/codemirror/language/panel/panel.tsx +1 -0
  309. package/src/core/codemirror/language/types.ts +7 -7
  310. package/src/core/codemirror/language/utils.ts +9 -39
  311. package/src/core/codemirror/lsp/notebook-lsp.ts +6 -5
  312. package/src/core/codemirror/readonly/__tests__/extension.test.ts +1 -1
  313. package/src/core/codemirror/readonly/extension.ts +2 -2
  314. package/src/core/codemirror/rtc/extension.ts +24 -13
  315. package/src/core/codemirror/rtc/loro/awareness.ts +34 -19
  316. package/src/core/codemirror/rtc/loro/sync.ts +1 -0
  317. package/src/core/codemirror/utils.ts +1 -0
  318. package/src/core/config/__tests__/config-schema.test.ts +5 -3
  319. package/src/core/config/config-schema.ts +3 -0
  320. package/src/core/datasets/__tests__/data-source-discovery.test.ts +5 -5
  321. package/src/core/datasets/data-source-discovery.ts +4 -6
  322. package/src/core/edit-app.tsx +13 -9
  323. package/src/core/errors/error-entries.ts +3 -0
  324. package/src/core/export/hooks.ts +1 -1
  325. package/src/core/export/layout.ts +2 -2
  326. package/src/core/hotkeys/actions.ts +2 -4
  327. package/src/core/islands/__tests__/bootstrap.test.ts +73 -43
  328. package/src/core/islands/__tests__/bridge.test.ts +72 -25
  329. package/src/core/islands/bootstrap.ts +46 -53
  330. package/src/core/islands/bridge.ts +74 -21
  331. package/src/core/islands/components/__tests__/IslandControls.test.tsx +7 -5
  332. package/src/core/islands/worker/__tests__/controller.test.ts +62 -4
  333. package/src/core/islands/worker/controller.ts +4 -10
  334. package/src/core/islands/worker/worker.tsx +33 -33
  335. package/src/core/kernel/__tests__/RuntimeState.test.ts +1 -1
  336. package/src/core/kernel/__tests__/handlers.test.ts +7 -153
  337. package/src/core/kernel/handlers.ts +18 -59
  338. package/src/core/network/__tests__/connection.test.ts +1 -1
  339. package/src/core/network/connection-notice.ts +1 -1
  340. package/src/core/network/connection.ts +5 -3
  341. package/src/core/network/requests-lazy.ts +1 -2
  342. package/src/core/network/requests-network.ts +0 -9
  343. package/src/core/network/requests-static.ts +0 -1
  344. package/src/core/network/requests-toasting.tsx +0 -1
  345. package/src/core/network/types.ts +0 -5
  346. package/src/core/network/useConnectionNotice.ts +8 -2
  347. package/src/core/notebook/attachments.ts +38 -0
  348. package/src/core/notebook/document/__tests__/codemirror.test.ts +547 -0
  349. package/src/core/notebook/document/__tests__/draft.test.ts +322 -0
  350. package/src/core/notebook/document/__tests__/fixtures.ts +92 -0
  351. package/src/core/notebook/document/__tests__/hold.test.ts +88 -0
  352. package/src/core/notebook/document/__tests__/hooks.test.tsx +391 -0
  353. package/src/core/notebook/document/__tests__/lifecycle-scenarios.test.ts +61 -0
  354. package/src/core/notebook/document/__tests__/model.test.ts +247 -0
  355. package/src/core/notebook/document/__tests__/protocol-fixtures.ts +38 -0
  356. package/src/core/notebook/document/__tests__/recovery-scenarios.test.ts +230 -0
  357. package/src/core/notebook/document/__tests__/scenario-fixture.ts +43 -0
  358. package/src/core/notebook/document/__tests__/scenarios.test.ts +205 -0
  359. package/src/core/notebook/document/__tests__/state.test.ts +438 -0
  360. package/src/core/notebook/document/__tests__/submission.test.ts +203 -0
  361. package/src/core/notebook/document/__tests__/test-host.test.ts +92 -0
  362. package/src/core/notebook/document/__tests__/test-host.ts +247 -0
  363. package/src/core/notebook/document/__tests__/test-notebook.ts +149 -0
  364. package/src/core/notebook/document/__tests__/user.ts +61 -0
  365. package/src/core/notebook/document/codemirror.ts +216 -0
  366. package/src/core/notebook/document/draft.ts +472 -0
  367. package/src/core/notebook/document/hooks.tsx +118 -0
  368. package/src/core/notebook/document/index.ts +23 -0
  369. package/src/core/notebook/document/model.ts +105 -0
  370. package/src/core/notebook/document/select.ts +41 -0
  371. package/src/core/notebook/document/state.ts +374 -0
  372. package/src/core/notebook/document/sync.ts +418 -0
  373. package/src/core/notebook/index.ts +18 -0
  374. package/src/core/notebook/replica/AGENTS.md +11 -0
  375. package/src/core/notebook/replica/__tests__/attachments.test.ts +56 -0
  376. package/src/core/notebook/replica/__tests__/document.test.ts +126 -0
  377. package/src/core/notebook/replica/__tests__/fixtures.ts +79 -0
  378. package/src/core/notebook/replica/__tests__/replica.test.ts +550 -0
  379. package/src/core/notebook/replica/backend.ts +19 -0
  380. package/src/core/notebook/replica/connection.ts +42 -0
  381. package/src/core/notebook/replica/index.ts +13 -0
  382. package/src/core/notebook/replica/replica.ts +286 -0
  383. package/src/core/notebook/replica/resources/attachments.ts +22 -0
  384. package/src/core/notebook/replica/resources/document.ts +101 -0
  385. package/src/core/packages/__tests__/useSandboxController.test.tsx +1 -1
  386. package/src/core/packages/useSandboxController.ts +1 -1
  387. package/src/core/run-app.tsx +48 -51
  388. package/src/core/runtime/__tests__/adapter.test.ts +1 -1
  389. package/src/core/runtime/__tests__/createWsUrl.test.ts +77 -7
  390. package/src/core/runtime/__tests__/runtime.test.ts +32 -58
  391. package/src/core/runtime/adapter.ts +1 -1
  392. package/src/core/runtime/config.ts +2 -2
  393. package/src/core/runtime/runtime.ts +38 -42
  394. package/src/core/runtime/types.ts +0 -2
  395. package/src/core/saving/filename.ts +1 -1
  396. package/src/core/saving/save-component.tsx +10 -4
  397. package/src/core/saving/useAutoSave.ts +1 -1
  398. package/src/core/session/__tests__/backend.test.ts +235 -0
  399. package/src/core/session/__tests__/useNotebookReplica.hook.test.tsx +183 -0
  400. package/src/core/session/__tests__/useNotebookSession.hook.test.tsx +663 -0
  401. package/src/core/session/active-notebook.ts +11 -0
  402. package/src/core/session/backend.ts +125 -0
  403. package/src/core/{websocket → session}/types.ts +2 -2
  404. package/src/core/session/useNotebookReplica.ts +72 -0
  405. package/src/core/{websocket → session}/useNotebookSession.tsx +70 -68
  406. package/src/core/state/__tests__/jotai.test.tsx +108 -0
  407. package/src/core/state/jotai.ts +1 -1
  408. package/src/core/static/__tests__/files.test.ts +38 -10
  409. package/src/core/static/files.ts +2 -0
  410. package/src/core/{websocket → transports}/__tests__/connection-state.test.ts +1 -13
  411. package/src/core/transports/__tests__/server.test.ts +408 -0
  412. package/src/core/transports/__tests__/static.test.ts +175 -0
  413. package/src/core/transports/__tests__/wasm.test.ts +166 -0
  414. package/src/core/{websocket → transports}/connection-state.ts +9 -16
  415. package/src/core/transports/server.ts +152 -0
  416. package/src/core/transports/static.ts +84 -0
  417. package/src/core/transports/wasm.ts +97 -0
  418. package/src/core/wasm/__tests__/bridge.test.ts +213 -50
  419. package/src/core/wasm/__tests__/worker.test.ts +187 -0
  420. package/src/core/wasm/bridge.ts +75 -53
  421. package/src/core/wasm/rpc.ts +15 -3
  422. package/src/core/wasm/store.ts +3 -3
  423. package/src/core/wasm/worker/bootstrap.ts +55 -51
  424. package/src/core/wasm/worker/getMarimoWheel.ts +1 -1
  425. package/src/core/wasm/worker/save-worker.ts +9 -10
  426. package/src/core/wasm/worker/types.ts +29 -18
  427. package/src/core/wasm/worker/worker.ts +88 -44
  428. package/src/css/globals.css +10 -0
  429. package/src/hooks/__tests__/useAsyncData.test.tsx +148 -0
  430. package/src/hooks/__tests__/useDebounce.test.tsx +51 -0
  431. package/src/hooks/__tests__/useDeepCompareMemoize.test.tsx +39 -0
  432. package/src/hooks/__tests__/useDelayElapsed.test.tsx +28 -0
  433. package/src/hooks/__tests__/useInternalStateWithSync.test.tsx +20 -0
  434. package/src/hooks/__tests__/useScript.test.tsx +77 -0
  435. package/src/hooks/__tests__/useStateForKey.test.tsx +257 -0
  436. package/src/hooks/useAsyncData.ts +3 -3
  437. package/src/hooks/useDataSourceDiscovery.ts +6 -4
  438. package/src/hooks/useDebounce.ts +6 -10
  439. package/src/hooks/useDeepCompareMemoize.ts +1 -1
  440. package/src/hooks/useDelayElapsed.ts +14 -10
  441. package/src/hooks/useElapsedTime.ts +3 -3
  442. package/src/hooks/useEventListener.ts +1 -2
  443. package/src/hooks/useInputHistory.ts +4 -7
  444. package/src/hooks/useInternalStateWithSync.ts +6 -6
  445. package/src/hooks/useResizeObserver.ts +4 -7
  446. package/src/hooks/useScript.ts +67 -70
  447. package/src/hooks/useStateForKey.ts +93 -0
  448. package/src/mount.tsx +1 -5
  449. package/src/plugins/__tests__/plugin-object-schemas.test.ts +104 -0
  450. package/src/plugins/core/registerReactComponent.tsx +1 -1
  451. package/src/plugins/impl/CodeEditorPlugin.tsx +1 -1
  452. package/src/plugins/impl/DataEditorPlugin.tsx +1 -1
  453. package/src/plugins/impl/DataTablePlugin.tsx +69 -37
  454. package/src/plugins/impl/DropdownPlugin.tsx +2 -6
  455. package/src/plugins/impl/FileBrowserPlugin.tsx +4 -16
  456. package/src/plugins/impl/FormPlugin.tsx +1 -1
  457. package/src/plugins/impl/RangeSliderPlugin.tsx +16 -2
  458. package/src/plugins/impl/RefreshPlugin.tsx +1 -0
  459. package/src/plugins/impl/SliderPlugin.tsx +6 -8
  460. package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +387 -1
  461. package/src/plugins/impl/__tests__/FileBrowserPlugin.test.tsx +45 -0
  462. package/src/plugins/impl/__tests__/RangeSliderPlugin.test.tsx +109 -0
  463. package/src/plugins/impl/__tests__/SliderPlugin.test.tsx +24 -3
  464. package/src/plugins/impl/anywidget/__tests__/registry.test.ts +153 -0
  465. package/src/plugins/impl/anywidget/__tests__/widget-binding.test.ts +241 -2
  466. package/src/plugins/impl/anywidget/model.ts +3 -1
  467. package/src/plugins/impl/anywidget/registry.ts +18 -14
  468. package/src/plugins/impl/anywidget/runtime.ts +21 -9
  469. package/src/plugins/impl/anywidget/widget-binding.ts +160 -82
  470. package/src/plugins/impl/chat/__tests__/chat-prompts.test.tsx +93 -0
  471. package/src/plugins/impl/chat/chat-ui.tsx +14 -11
  472. package/src/plugins/impl/code/any-language-editor.tsx +2 -2
  473. package/src/plugins/impl/data-editor/glide-data-editor.tsx +8 -5
  474. package/src/plugins/impl/data-editor/glide-utils.ts +3 -1
  475. package/src/plugins/impl/data-explorer/ConnectedDataExplorerComponent.tsx +1 -1
  476. package/src/plugins/impl/data-explorer/components/column-summary.tsx +4 -2
  477. package/src/plugins/impl/data-explorer/state/reducer.ts +1 -1
  478. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +1 -2
  479. package/src/plugins/impl/data-frames/__tests__/sidebar.test.tsx +160 -0
  480. package/src/plugins/impl/data-frames/forms/__tests__/__snapshots__/form.test.tsx.snap +66 -66
  481. package/src/plugins/impl/data-frames/panel.tsx +43 -16
  482. package/src/plugins/impl/mpl-interactive/MplInteractivePlugin.tsx +5 -3
  483. package/src/plugins/impl/panel/PanelPlugin.tsx +16 -17
  484. package/src/plugins/impl/panel/__tests__/utils.test.ts +39 -1
  485. package/src/plugins/impl/panel/utils.ts +17 -0
  486. package/src/plugins/impl/plotly/PlotlyPlugin.tsx +2 -5
  487. package/src/plugins/impl/plotly/selection.ts +25 -19
  488. package/src/plugins/impl/vega/VegaPlugin.tsx +2 -3
  489. package/src/plugins/impl/vega/make-selectable.ts +4 -7
  490. package/src/plugins/layout/RoutesPlugin.tsx +1 -1
  491. package/src/stories/__tests__/editor-story.test.tsx +33 -0
  492. package/src/stories/button.stories.tsx +1 -0
  493. package/src/stories/cell.stories.tsx +1 -1
  494. package/src/stories/data-table.stories.tsx +31 -0
  495. package/src/stories/editor.stories.tsx +24 -17
  496. package/src/stories/form-wrapper.stories.tsx +2 -2
  497. package/src/stories/layout/vertical/one-column.stories.tsx +1 -1
  498. package/src/stories/runtime-story.tsx +1 -1
  499. package/src/stories/select.stories.tsx +2 -2
  500. package/src/stories/switchable-multi-select.stories.tsx +1 -1
  501. package/src/utils/__tests__/arrays.test.ts +35 -0
  502. package/src/utils/__tests__/batch-requests.test.ts +3 -3
  503. package/src/utils/__tests__/{createReducer.test.ts → createReducer.test.tsx} +29 -0
  504. package/src/utils/__tests__/numbers.test.ts +105 -1
  505. package/src/utils/__tests__/objects.test.ts +21 -0
  506. package/src/utils/arrays.ts +11 -2
  507. package/src/utils/blob.ts +1 -1
  508. package/src/utils/createReducer.ts +53 -26
  509. package/src/utils/maps.ts +0 -3
  510. package/src/utils/numbers.ts +79 -18
  511. package/src/utils/objects.ts +4 -9
  512. package/src/utils/once.ts +19 -19
  513. package/src/utils/tracer.ts +9 -5
  514. package/src/utils/zod-utils.ts +1 -3
  515. package/dist/any-language-editor-DZ_YTVus.js +0 -76
  516. package/dist/assets/__vite-browser-external-BXYkiFsk.js +0 -1
  517. package/dist/assets/worker-HPY9fbhz.js +0 -114
  518. package/dist/mermaid-HWGCJPDP-ByCsZnYF.js +0 -2
  519. package/dist/precisionRound-DMIVQrt2.js +0 -97
  520. package/src/core/attachments/state.ts +0 -21
  521. package/src/core/cells/__tests__/apply-transaction.test.ts +0 -991
  522. package/src/core/cells/__tests__/document-changes.test.ts +0 -1140
  523. package/src/core/cells/__tests__/document-roundtrip.test.ts +0 -392
  524. package/src/core/cells/document-changes.ts +0 -944
  525. package/src/core/host/AGENTS.md +0 -6
  526. package/src/core/host/__tests__/events.test.ts +0 -46
  527. package/src/core/host/__tests__/notebook-client.test.ts +0 -191
  528. package/src/core/host/__tests__/protocol.test.ts +0 -214
  529. package/src/core/host/connection.ts +0 -81
  530. package/src/core/host/events.ts +0 -60
  531. package/src/core/host/notebook-client.ts +0 -226
  532. package/src/core/host/protocol.ts +0 -1943
  533. package/src/core/state/__tests__/jotai.test.ts +0 -25
  534. package/src/core/wasm/worker/message-buffer.ts +0 -33
  535. package/src/core/websocket/__tests__/createConnectionTransport.test.ts +0 -49
  536. package/src/core/websocket/__tests__/useNotebookClient.hook.test.tsx +0 -140
  537. package/src/core/websocket/__tests__/useNotebookSession.hook.test.tsx +0 -883
  538. package/src/core/websocket/transports/__tests__/basic.test.ts +0 -275
  539. package/src/core/websocket/transports/__tests__/sse.test.ts +0 -335
  540. package/src/core/websocket/transports/__tests__/transport.test.ts +0 -308
  541. package/src/core/websocket/transports/__tests__/ws.test.ts +0 -125
  542. package/src/core/websocket/transports/basic.ts +0 -102
  543. package/src/core/websocket/transports/create.ts +0 -31
  544. package/src/core/websocket/transports/sse.ts +0 -308
  545. package/src/core/websocket/transports/transport.ts +0 -50
  546. package/src/core/websocket/transports/ws.ts +0 -98
  547. package/src/core/websocket/useNotebookClient.ts +0 -80
  548. /package/src/{core/attachments/toast.ts → components/editor/agent-toast.ts} +0 -0
  549. /package/src/core/{websocket → session}/connection-utils.ts +0 -0
@@ -13,7 +13,7 @@ import {
13
13
  VisibilityToggleButton,
14
14
  } from "@/components/editor/file-tree/tree-actions";
15
15
  import { CopyClipboardIcon } from "@/components/icons/copy-icon";
16
- import { Button } from "@/components/ui/button";
16
+ import { Button, buttonVariants } from "@/components/ui/button";
17
17
  import { Command, CommandInput, CommandItem } from "@/components/ui/command";
18
18
  import { Tooltip } from "@/components/ui/tooltip";
19
19
  import { maybeAddMarimoImport } from "@/core/cells/add-missing-import";
@@ -78,6 +78,7 @@ import {
78
78
  areChildSchemasResolved,
79
79
  areSchemasResolved,
80
80
  areTablesResolved,
81
+ fullyQualifiedTableName,
81
82
  isSchemaless,
82
83
  schemaSubtreeMatchesSearch,
83
84
  shouldExpandDatabaseForSearch,
@@ -284,6 +285,7 @@ export const DataSources: React.FC = () => {
284
285
  {hasSearch && (
285
286
  <button
286
287
  type="button"
288
+ aria-label="Clear table search"
287
289
  className="float-right border-b px-2 m-0 h-full hover:bg-accent hover:text-accent-foreground"
288
290
  onClick={() => setSearchValue("")}
289
291
  >
@@ -636,7 +638,7 @@ const SchemaNode: React.FC<SchemaNodeProps> = (props) => {
636
638
  const [prevSearchValue, setPrevSearchValue] = React.useState(searchValue);
637
639
  const [prevExpandForSearch, setPrevExpandForSearch] =
638
640
  React.useState(expandForSearch);
639
- const uniqueValue = `${databaseName}:${schemaPath.join(".")}`;
641
+ const uniqueValue = JSON.stringify(["schema", databaseName, ...schemaPath]);
640
642
  const childSchemas = schema.child_schemas ?? [];
641
643
 
642
644
  // Re-sync when the query changes or when newly resolved data turns this
@@ -702,7 +704,40 @@ const SchemaNode: React.FC<SchemaNodeProps> = (props) => {
702
704
  );
703
705
  };
704
706
 
705
- const TableList: React.FC<{
707
+ // Kept outside the component because the React Compiler does not yet
708
+ // support try/finally inside component bodies.
709
+ async function loadTableList(
710
+ sqlTableContext: SQLTableContext,
711
+ addTableList: ReturnType<typeof useDataSourceActions>["addTableList"],
712
+ setLoading: (loading: boolean) => void,
713
+ ) {
714
+ setLoading(true);
715
+ try {
716
+ const { engine, database, schema, schemaPath } = sqlTableContext;
717
+ const previewTableList = await PreviewSQLTableList.request({
718
+ engine: engine,
719
+ database: database,
720
+ schema: schema,
721
+ schemaPath: schemaPath ?? [],
722
+ });
723
+
724
+ if (!previewTableList?.tables) {
725
+ throw new Error("No tables available");
726
+ }
727
+
728
+ addTableList({
729
+ tables: previewTableList.tables,
730
+ sqlTableContext: sqlTableContext,
731
+ });
732
+ } finally {
733
+ setLoading(false);
734
+ }
735
+ }
736
+
737
+ /**
738
+ * This is exported for testing purposes only.
739
+ */
740
+ export const TableList: React.FC<{
706
741
  tables: DataTable[];
707
742
  sqlTableContext?: SQLTableContext;
708
743
  searchValue?: string;
@@ -731,26 +766,7 @@ const TableList: React.FC<{
731
766
  // resets tablesResolved to false).
732
767
  const { isPending, error } = useAsyncData(async () => {
733
768
  if (!tablesResolved && sqlTableContext) {
734
- setTablesLoading(true);
735
-
736
- const { engine, database, schema, schemaPath } = sqlTableContext;
737
- const previewTableList = await PreviewSQLTableList.request({
738
- engine: engine,
739
- database: database,
740
- schema: schema,
741
- schemaPath: schemaPath ?? [],
742
- });
743
-
744
- if (!previewTableList?.tables) {
745
- setTablesLoading(false);
746
- throw new Error("No tables available");
747
- }
748
-
749
- addTableList({
750
- tables: previewTableList.tables,
751
- sqlTableContext: sqlTableContext,
752
- });
753
- setTablesLoading(false);
769
+ await loadTableList(sqlTableContext, addTableList, setTablesLoading);
754
770
  }
755
771
  }, [tablesResolved, sqlTableContext]);
756
772
 
@@ -964,6 +980,7 @@ const DatasetTableItem: React.FC<{
964
980
  {renderRowsByColumns()}
965
981
  <Tooltip content="Add table to notebook" delayDuration={400}>
966
982
  <Button
983
+ aria-label={`Add table ${table.name} to notebook`}
967
984
  className="group-hover:inline-flex hidden"
968
985
  variant="text"
969
986
  size="icon"
@@ -1054,19 +1071,16 @@ const DatasetColumnItem: React.FC<{
1054
1071
  {isIndexed &&
1055
1072
  renderItemSubtext({ tooltipContent: "Indexed", content: "IDX" })}
1056
1073
  </div>
1057
- <Tooltip content="Copy column name" delayDuration={400}>
1058
- <Button
1059
- variant="text"
1060
- size="icon"
1061
- className="group-hover:opacity-100 opacity-0 hover:bg-muted text-muted-foreground hover:text-foreground"
1062
- >
1063
- <CopyClipboardIcon
1064
- tooltip={false}
1065
- value={column.name}
1066
- className="h-3 w-3"
1067
- />
1068
- </Button>
1069
- </Tooltip>
1074
+ <CopyClipboardIcon
1075
+ tooltip="Copy column name"
1076
+ value={column.name}
1077
+ ariaLabel={`Copy column name ${column.name}`}
1078
+ className="h-3 w-3"
1079
+ buttonClassName={cn(
1080
+ buttonVariants({ variant: "text", size: "icon" }),
1081
+ "group-hover:opacity-100 opacity-0 hover:bg-muted text-muted-foreground hover:text-foreground",
1082
+ )}
1083
+ />
1070
1084
  <span className="text-xs text-muted-foreground">
1071
1085
  {column.external_type}
1072
1086
  </span>
@@ -1082,9 +1096,7 @@ const DatasetColumnItem: React.FC<{
1082
1096
  column={column}
1083
1097
  onAddColumnChart={handleAddColumn}
1084
1098
  preview={columnsPreviews.get(
1085
- sqlTableContext
1086
- ? `${sqlTableContext.database}.${sqlTableContext.schema}.${table.name}:${column.name}`
1087
- : `${table.name}:${column.name}`,
1099
+ `${fullyQualifiedTableName(sqlTableContext, table.name)}:${column.name}`,
1088
1100
  )}
1089
1101
  sqlTableContext={sqlTableContext}
1090
1102
  />
@@ -13,26 +13,29 @@ import type {
13
13
  import { logNever } from "@/utils/assertNever";
14
14
  import type { ColumnHeaderStatsKey } from "../data-table/types";
15
15
 
16
- /**
17
- * Stable id for a table node in the datasources tree.
18
- *
19
- * schemaPath already includes the leaf schema for nested namespaces, so use it
20
- * when present and fall back to the flat schema name otherwise (avoids
21
- * duplicating the leaf, e.g. `top.nested.nested.table`).
22
- */
16
+ function tablePath(context: SQLTableContext, tableName: string): string[] {
17
+ const segments = context.schemaPath?.length
18
+ ? context.schemaPath
19
+ : [context.schema];
20
+ return [context.database, ...segments.filter(Boolean), tableName];
21
+ }
22
+
23
23
  export function tableUniqueId(
24
- sqlTableContext: SQLTableContext | undefined,
24
+ context: SQLTableContext | undefined,
25
25
  tableName: string,
26
26
  ): string {
27
- if (!sqlTableContext) {
28
- return tableName;
29
- }
30
- const segments = (
31
- sqlTableContext.schemaPath?.length
32
- ? sqlTableContext.schemaPath
33
- : [sqlTableContext.schema]
34
- ).filter(Boolean);
35
- return [sqlTableContext.database, ...segments, tableName].join(".");
27
+ return context ? JSON.stringify(tablePath(context, tableName)) : tableName;
28
+ }
29
+
30
+ export function fullyQualifiedTableName(
31
+ context: SQLTableContext | undefined,
32
+ tableName: string,
33
+ ): string {
34
+ return context
35
+ ? getFormatter(context.dialect).formatTablePath(
36
+ tablePath(context, tableName),
37
+ )
38
+ : tableName;
36
39
  }
37
40
 
38
41
  // Some databases have no schemas, so we don't show it (eg. Clickhouse)
@@ -114,6 +117,10 @@ const defaultFormatter: SqlCodeFormatter = {
114
117
  `SELECT ${columnName} FROM ${tableName} LIMIT 100`,
115
118
  };
116
119
 
120
+ function quoteIdentifier(identifier: string): string {
121
+ return `"${identifier.replaceAll('"', '""')}"`;
122
+ }
123
+
117
124
  function getFormatter(dialect: string): SqlCodeFormatter {
118
125
  dialect = dialect.toLowerCase();
119
126
  if (!isKnownDialect(dialect)) {
@@ -146,9 +153,9 @@ function getFormatter(dialect: string): SqlCodeFormatter {
146
153
  // Quote column and table names to avoid raising errors on weird characters
147
154
  return {
148
155
  formatTablePath: (tablePath: string[]) =>
149
- tablePath.map((part) => `"${part}"`).join("."),
156
+ tablePath.map(quoteIdentifier).join("."),
150
157
  formatSelectClause: (columnName: string, tableName: string) =>
151
- `SELECT ${columnName === "*" ? "*" : `"${columnName}"`} FROM ${tableName} LIMIT 100`,
158
+ `SELECT ${columnName === "*" ? "*" : quoteIdentifier(columnName)} FROM ${tableName} LIMIT 100`,
152
159
  };
153
160
  case "db2":
154
161
  case "db2i":
@@ -194,6 +201,7 @@ export function sqlCode({
194
201
  engine,
195
202
  schema,
196
203
  defaultSchema,
204
+ schemaPath,
197
205
  defaultDatabase,
198
206
  database,
199
207
  dialect,
@@ -207,12 +215,13 @@ export function sqlCode({
207
215
  }
208
216
  } else {
209
217
  // Include schema if it's not the default schema
210
- if (schema !== defaultSchema) {
211
- tablePath.unshift(schema);
218
+ const path = schemaPath?.length ? schemaPath : [schema];
219
+ if (path.length > 1 || path[0] !== defaultSchema) {
220
+ tablePath.unshift(...path);
212
221
  }
213
222
 
214
- // Include database if it's not the default database
215
- if (database !== defaultDatabase) {
223
+ // Nested schema names can also be attached catalog names.
224
+ if (path.length > 1 || database !== defaultDatabase) {
216
225
  tablePath.unshift(database);
217
226
  }
218
227
  }
@@ -162,6 +162,7 @@ export const DebuggerControls: React.FC<{
162
162
  <div className="flex">
163
163
  <Tooltip content="Next line">
164
164
  <Button
165
+ aria-label="Next line"
165
166
  variant="text"
166
167
  size="icon"
167
168
  data-testid="debugger-next-button"
@@ -173,6 +174,7 @@ export const DebuggerControls: React.FC<{
173
174
  </Tooltip>
174
175
  <Tooltip content="Continue execution">
175
176
  <Button
177
+ aria-label="Continue execution"
176
178
  variant="text"
177
179
  size="icon"
178
180
  data-testid="debugger-continue-button"
@@ -187,6 +189,7 @@ export const DebuggerControls: React.FC<{
187
189
  </Tooltip>
188
190
  <Tooltip content="Print stack trace">
189
191
  <Button
192
+ aria-label="Print stack trace"
190
193
  variant="text"
191
194
  size="icon"
192
195
  data-testid="debugger-stack-button"
@@ -198,6 +201,7 @@ export const DebuggerControls: React.FC<{
198
201
  </Tooltip>
199
202
  <Tooltip content="Help">
200
203
  <Button
204
+ aria-label="Debugger help"
201
205
  variant="text"
202
206
  size="icon"
203
207
  data-testid="debugger-help-button"
@@ -210,6 +214,7 @@ export const DebuggerControls: React.FC<{
210
214
  {onClear && (
211
215
  <Tooltip content="Quit and clear">
212
216
  <Button
217
+ aria-label="Quit and clear debugger"
213
218
  variant="text"
214
219
  size="icon"
215
220
  data-testid="debugger-clear-button"
@@ -85,13 +85,13 @@ export const DependencyGraphTree: React.FC<PropsWithChildren<Props>> = ({
85
85
 
86
86
  // oxlint-disable-next-line react/hook-use-state
87
87
  const [initial] = useState(() => {
88
- const elements = elementsBuilder.createElements(
88
+ const elements = elementsBuilder.createElements({
89
89
  cellIds,
90
90
  cellAtoms,
91
91
  variables,
92
- settings.hidePureMarkdown,
93
- settings.hideReusableFunctions,
94
- );
92
+ hidePureMarkdown: settings.hidePureMarkdown,
93
+ hideReusableFunctions: settings.hideReusableFunctions,
94
+ });
95
95
  return layoutElements({
96
96
  nodes: withExpansion(elements.nodes, expandedIds),
97
97
  edges: elements.edges,
@@ -163,13 +163,13 @@ export const DependencyGraphTree: React.FC<PropsWithChildren<Props>> = ({
163
163
 
164
164
  // Rebuild + re-layout when the graph inputs or the expand/collapse set change.
165
165
  useEffect(() => {
166
- const elements = elementsBuilder.createElements(
166
+ const elements = elementsBuilder.createElements({
167
167
  cellIds,
168
168
  cellAtoms,
169
169
  variables,
170
- settings.hidePureMarkdown,
171
- settings.hideReusableFunctions,
172
- );
170
+ hidePureMarkdown: settings.hidePureMarkdown,
171
+ hideReusableFunctions: settings.hideReusableFunctions,
172
+ });
173
173
  syncChanges({
174
174
  nodes: withExpansion(elements.nodes, expandedIds),
175
175
  edges: elements.edges,
@@ -42,6 +42,14 @@ export interface NodeData {
42
42
  }
43
43
  export type CustomNodeProps = NodeProps<NodeData>;
44
44
 
45
+ interface CreateElementsOptions {
46
+ cellIds: CellId[];
47
+ cellAtoms: Atom<CellData>[];
48
+ variables: Variables;
49
+ hidePureMarkdown: boolean;
50
+ hideReusableFunctions: boolean;
51
+ }
52
+
45
53
  const LINE_HEIGHT = 11; // matches TinyCode.css
46
54
 
47
55
  export function getNodeHeight(linesOfCode: number) {
@@ -176,13 +184,10 @@ export function computeDefsByCell(
176
184
  }
177
185
 
178
186
  interface ElementsBuilder {
179
- createElements: (
180
- cellIds: CellId[],
181
- cellAtoms: Atom<CellData>[],
182
- variables: Variables,
183
- hidePureMarkdown: boolean,
184
- hideReusableFunctions: boolean,
185
- ) => { nodes: Node<NodeData>[]; edges: Edge[] };
187
+ createElements: (options: CreateElementsOptions) => {
188
+ nodes: Node<NodeData>[];
189
+ edges: Edge[];
190
+ };
186
191
  }
187
192
 
188
193
  export class VerticalElementsBuilder implements ElementsBuilder {
@@ -225,13 +230,11 @@ export class VerticalElementsBuilder implements ElementsBuilder {
225
230
  };
226
231
  }
227
232
 
228
- public createElements(
229
- cellIds: CellId[],
230
- cellAtoms: Atom<CellData>[],
231
- variables: Variables,
232
- _hidePureMarkdown: boolean,
233
- _hideReusableFunctions: boolean,
234
- ) {
233
+ public createElements({
234
+ cellIds,
235
+ cellAtoms,
236
+ variables,
237
+ }: CreateElementsOptions) {
235
238
  let prevY = 0;
236
239
  const nodes: Node<NodeData>[] = [];
237
240
  const edges: Edge[] = [];
@@ -311,13 +314,13 @@ export class TreeElementsBuilder implements ElementsBuilder {
311
314
  };
312
315
  }
313
316
 
314
- public createElements(
315
- cellIds: CellId[],
316
- cellAtoms: Atom<CellData>[],
317
- variables: Variables,
318
- hidePureMarkdown: boolean,
319
- hideReusableFunctions: boolean,
320
- ) {
317
+ public createElements({
318
+ cellIds,
319
+ cellAtoms,
320
+ variables,
321
+ hidePureMarkdown,
322
+ hideReusableFunctions,
323
+ }: CreateElementsOptions) {
321
324
  const nodes: Node<NodeData>[] = [];
322
325
 
323
326
  const cellRuntime = getNotebook().cellRuntime;
@@ -216,11 +216,12 @@ export const GraphSelectionPanel: React.FC<{
216
216
  </Button>
217
217
  </Tooltip>
218
218
  <ConnectionCellActionsDropdown cellId={selection.id}>
219
- <Button variant="ghost" size="icon">
219
+ <Button aria-label="Cell actions" variant="ghost" size="icon">
220
220
  <MoreVerticalIcon className="w-4 h-4" />
221
221
  </Button>
222
222
  </ConnectionCellActionsDropdown>
223
223
  <Button
224
+ aria-label="Close cell details"
224
225
  variant="text"
225
226
  size="icon"
226
227
  onClick={() => {
@@ -7,10 +7,12 @@ import { boundingBox, placeIslands } from "../layout";
7
7
 
8
8
  function node(
9
9
  id: string,
10
- x: number,
11
- y: number,
12
- width: number,
13
- height: number,
10
+ {
11
+ x,
12
+ y,
13
+ width,
14
+ height,
15
+ }: { x: number; y: number; width: number; height: number },
14
16
  ): Node<NodeData> {
15
17
  return {
16
18
  id,
@@ -28,8 +30,8 @@ describe("boundingBox", () => {
28
30
 
29
31
  it("spans position + size across nodes", () => {
30
32
  const box = boundingBox([
31
- node("a", 0, 0, 50, 50),
32
- node("b", 10, 20, 100, 40),
33
+ node("a", { x: 0, y: 0, width: 50, height: 50 }),
34
+ node("b", { x: 10, y: 20, width: 100, height: 40 }),
33
35
  ]);
34
36
  expect(box).toEqual({ minX: 0, minY: 0, maxX: 110, maxY: 60 });
35
37
  });
@@ -52,12 +54,17 @@ describe("boundingBox", () => {
52
54
 
53
55
  describe("placeIslands", () => {
54
56
  it("returns nothing when there are no islands", () => {
55
- expect(placeIslands([], [node("a", 0, 0, 100, 100)])).toEqual([]);
57
+ expect(
58
+ placeIslands([], [node("a", { x: 0, y: 0, width: 100, height: 100 })]),
59
+ ).toEqual([]);
56
60
  });
57
61
 
58
62
  it("stacks islands in a column to the right of the placed graph", () => {
59
- const placed = [node("main", 0, 0, 200, 300)];
60
- const islands = [node("i0", 0, 0, 90, 40), node("i1", 0, 0, 90, 40)];
63
+ const placed = [node("main", { x: 0, y: 0, width: 200, height: 300 })];
64
+ const islands = [
65
+ node("i0", { x: 0, y: 0, width: 90, height: 40 }),
66
+ node("i1", { x: 0, y: 0, width: 90, height: 40 }),
67
+ ];
61
68
  const result = placeIslands(islands, placed);
62
69
  // startX = maxX(200) + margin(40) = 240; startY = minY(0).
63
70
  expect(result[0].position).toEqual({ x: 240, y: 0 });
@@ -66,9 +73,9 @@ describe("placeIslands", () => {
66
73
  });
67
74
 
68
75
  it("wraps into a new column when the column gets too tall", () => {
69
- const placed = [node("main", 0, 0, 200, 300)];
76
+ const placed = [node("main", { x: 0, y: 0, width: 200, height: 300 })];
70
77
  const islands = Array.from({ length: 10 }, (_, i) =>
71
- node(`i${i}`, 0, 0, 90, 40),
78
+ node(`i${i}`, { x: 0, y: 0, width: 90, height: 40 }),
72
79
  );
73
80
  const result = placeIslands(islands, placed);
74
81
  const firstColumnX = result[0].position.x;
@@ -71,7 +71,6 @@ export const SortableCell = React.forwardRef(
71
71
  return (
72
72
  <SortableCellInternal
73
73
  ref={ref}
74
- cellId={cellId}
75
74
  canMoveX={canMoveX}
76
75
  {...props}
77
76
  attributes={attributes}
@@ -86,7 +85,7 @@ export const SortableCell = React.forwardRef(
86
85
  );
87
86
  SortableCell.displayName = "SortableCell";
88
87
 
89
- interface SortableCellInternalProps extends Props {
88
+ interface SortableCellInternalProps extends Omit<Props, "cellId"> {
90
89
  children: React.ReactNode;
91
90
  attributes: DraggableAttributes;
92
91
  listeners: SyntheticListenerMap | undefined;
@@ -99,7 +98,6 @@ interface SortableCellInternalProps extends Props {
99
98
  const SortableCellInternal = React.forwardRef(
100
99
  (
101
100
  {
102
- cellId,
103
101
  canMoveX,
104
102
  children,
105
103
  attributes,
@@ -5,7 +5,7 @@ import { act, render, renderHook } from "@testing-library/react";
5
5
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
6
6
  import { Toaster } from "@/components/ui/toaster";
7
7
  import { clearToasts, toast, useToast } from "@/components/ui/use-toast";
8
- import { agentToast } from "../toast";
8
+ import { agentToast } from "../agent-toast";
9
9
 
10
10
  describe("agent notifications", () => {
11
11
  beforeEach(() => {
@@ -57,7 +57,7 @@ describe("Cell data attributes", () => {
57
57
  signature_hint_on_typing: false,
58
58
  copilot: false,
59
59
  },
60
- formatting: { line_length: 88 },
60
+ formatting: { line_length: 88, infer_types: "off" },
61
61
  package_management: { manager: "pip" },
62
62
  runtime: {
63
63
  auto_instantiate: false,
@@ -75,7 +75,11 @@ describe("Cell data attributes", () => {
75
75
  browser: "default",
76
76
  follow_symlink: false,
77
77
  },
78
- save: { autosave: "off", autosave_delay: 1000, format_on_save: false },
78
+ save: {
79
+ autosave: "off",
80
+ autosave_delay: 1000,
81
+ format_on_save: false,
82
+ },
79
83
  ai: {},
80
84
  } as UserConfig;
81
85