@marimo-team/islands 0.24.3-dev9 → 0.25.1-dev1

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 (440) hide show
  1. package/dist/{ConnectedDataExplorerComponent-C9OF_75w.js → ConnectedDataExplorerComponent-KVhjDMSe.js} +1066 -1066
  2. package/dist/ErrorBoundary-pXXIvlr3.js +200 -0
  3. package/dist/{ImageComparisonComponent-2a9TMMm2.js → ImageComparisonComponent-Dlm5aWnH.js} +4 -4
  4. package/dist/{Plot-C-9MQeGP.js → Plot-CTyjbQDT.js} +21032 -20666
  5. package/dist/_baseMerge-BiGRwuqv.js +165 -0
  6. package/dist/{abnfDiagram-N423BO3Z-CQKwzX8t.js → abnfDiagram-VCTEODGH-CpN0FRda.js} +17 -18
  7. package/dist/{any-language-editor-DmQ7dyCx.js → any-language-editor-CycIVIeP.js} +17 -17
  8. package/dist/arc-7ra3iNdN.js +81 -0
  9. package/dist/architecture-7GRP2DOG-BWLylgiA.js +3 -0
  10. package/dist/{architectureDiagram-T3A2C74G-CncrDpfa.js → architectureDiagram-5GKGNRK7-DDyj5SRB.js} +25 -25
  11. package/dist/assets/__vite-browser-external-C9iR87Zl.js +1 -0
  12. package/dist/assets/worker-D7hWi02M.js +109 -0
  13. package/dist/blockDiagram-I7D4REHJ-BbXEXJRu.js +1922 -0
  14. package/dist/{button-CKBkqR9J.js → button-DdXAm8iz.js} +5 -5
  15. package/dist/{c4Diagram-5PPSVZJV-DarUk3Yq.js → c4Diagram-7LVT6UL2-DcLsbQmR.js} +696 -668
  16. package/dist/{capabilities-CMBBJTcc.js → capabilities-B3ce_GNu.js} +1 -1
  17. package/dist/{html-to-image-BtFMe_Nq.js → cells-DYIkSxs6.js} +6757 -10137
  18. package/dist/{channel-CyiYUzJv.js → channel-B5XnTarr.js} +1 -1
  19. package/dist/chat-ui-BXj3uYjy.js +5786 -0
  20. package/dist/{check-CHig47QV.js → check-B7cIK6gb.js} +1 -1
  21. package/dist/{chunk-2Q5K7J3B-BMuJl2jB.js → chunk-2Q5K7J3B-BMkUkeuy.js} +2 -2
  22. package/dist/chunk-4HAMMTFA-D2qv8E0X.js +4188 -0
  23. package/dist/{chunk-5VM5RSS4-Bcq0ftdy.js → chunk-5VM5RSS4-DKsmPCL6.js} +2 -2
  24. package/dist/{chunk-NSK5VX7P-CDTMcJB0.js → chunk-75Z2AOVW-5_HsvXwr.js} +23 -23
  25. package/dist/{chunk-I66GZJ75-BqyTCAPf.js → chunk-DU6HZSFF-BUgAHvnM.js} +21 -4
  26. package/dist/{chunk-2GRJ4B5K-DgO8Qudq.js → chunk-F27PBJKO-DHmYWZXr.js} +4 -4
  27. package/dist/{chunk-KEIR6QF5-C4KX3XYh.js → chunk-FOHPRMQF-BpYR8RqP.js} +4 -4
  28. package/dist/{chunk-WRU74C26-BpWsbiDK.js → chunk-GMAD6QVW-Czynz8aA.js} +486 -258
  29. package/dist/chunk-GVQU2GXP-yQEdulRS.js +37 -0
  30. package/dist/{chunk-5RXB4S5H-tLNUVDdO.js → chunk-IMKFNOWR-BfwTebD0.js} +11 -11
  31. package/dist/{chunk-JWPE2WC7-BJwjGUnF.js → chunk-JWPE2WC7-DJvv1t8U.js} +2 -2
  32. package/dist/chunk-L3NEJ4N5-DwRWnDDK.js +245 -0
  33. package/dist/{chunk-7Z6QIM7H-Dc18hFxH.js → chunk-OSK3NFVY-BBKU_Ign.js} +222 -144
  34. package/dist/{chunk-W5SLKNZC-DLnvpEtV.js → chunk-P2QGCYS3-C0iGU29N.js} +20 -20
  35. package/dist/{chunk-KBJHAD2P-BuqWqkcW.js → chunk-POPQ4Y6H-BCbS3Ozc.js} +4 -4
  36. package/dist/{chunk-4I5QYGJK-DpytHuZQ.js → chunk-PWAF6VOD-CTFCL0jI.js} +4 -4
  37. package/dist/{chunk-JQJVKLGR-CgqCwe8E.js → chunk-SHT3W25Y-BspJEJ5H.js} +109 -63
  38. package/dist/{chunk-6Q2QTUOP-DmTcEBMn.js → chunk-SVP7TREG-DX3rFNTe.js} +5 -5
  39. package/dist/{chunk-GF5L2VYU-B0wgCQgS.js → chunk-TICWLB2K-fVF7Uujg.js} +13 -13
  40. package/dist/{chunk-XXDRQBXY-D73H4IN0.js → chunk-XXDRQBXY-Dnl5VBqG.js} +3 -3
  41. package/dist/{chunk-Y2CYZVJY-DoegUj_e.js → chunk-Y2CYZVJY-DKKS1VyV.js} +1 -1
  42. package/dist/{chunk-5FQGJX7Z-B85XCPv6.js → chunk-YOKDWASO-DrWbKnxA.js} +6925 -5460
  43. package/dist/classDiagram-ZZMXUADV-Fe-V14Sc.js +30 -0
  44. package/dist/classDiagram-v2-VYDZK3BY-xTDg7lOs.js +30 -0
  45. package/dist/code-visibility-BC_yF09p.js +138 -0
  46. package/dist/{common-Cv-4hMa0.js → common-Dv227ygK.js} +8838 -12645
  47. package/dist/{compiler-runtime-CAH9RLw2.js → compiler-runtime-Cj8ZWiNS.js} +2 -2
  48. package/dist/copy-icon-CLdENY__.js +190 -0
  49. package/dist/{cose-bilkent-JH36ORCC-FUWHkXFX.js → cose-bilkent-JH36ORCC-_LyRKVqm.js} +2 -2
  50. package/dist/cubic-OaEBhQPK.js +1404 -0
  51. package/dist/cynefin-OW5HDTMX-obq-i80l.js +3 -0
  52. package/dist/{cynefinDiagram-MW4NZA55-BXSFK93J.js → cynefinDiagram-5FMLGOSQ-CFQrqzSX.js} +10 -10
  53. package/dist/{dagre-CGyalH38.js → dagre-BGSfXNEb.js} +678 -537
  54. package/dist/dagre-GXQ25YYZ-xHNAUTyG.js +425 -0
  55. package/dist/{data-grid-overlay-editor-DZM4BAaI.js → data-grid-overlay-editor-B-I2K7z3.js} +8 -9
  56. package/dist/{data-grid-types-BnZwWG8z.js → data-grid-types-BucVmDDp.js} +1 -1
  57. package/dist/{defaultLocale-DKaU_opG.js → defaultLocale-JI_lnoCe.js} +1 -1
  58. package/dist/{diagram-7IWD3JNH-BjfzDNvj.js → diagram-S7CK7UJ4-Bt1rPbAx.js} +40 -39
  59. package/dist/{diagram-UB23O5K3-DDg-7wLA.js → diagram-UQ7AKVKN-D1sq5FoZ.js} +10 -10
  60. package/dist/{diagram-B4RE2ZJO-CKccR9eE.js → diagram-VSXAHHWV-BKpmG23x.js} +10 -10
  61. package/dist/{diagram-Q27KOJAE-Zhz01ss7.js → diagram-VX7I27RA-BMwGFVD6.js} +21 -21
  62. package/dist/{diagram-LBJQPF4R-CJ-bOruh.js → diagram-Z3DM3KII--KLDR9Pl.js} +10 -10
  63. package/dist/dialog-CgNq6y9-.js +94 -0
  64. package/dist/{dist-dAqZAPcF.js → dist-1HDa70oE.js} +3 -3
  65. package/dist/{dist-Re9sOPOx.js → dist-9x1ZRe-e.js} +2 -2
  66. package/dist/{dist-DEeLqRlU.js → dist-B1vYLK28.js} +1 -1
  67. package/dist/{dist-C5Bn52W4.js → dist-B8D7McG3.js} +3 -3
  68. package/dist/{dist-_XvgytiS.js → dist-BHCHt1NI.js} +1 -1
  69. package/dist/{dist-CRjAdnqF.js → dist-BRxfaJgs.js} +3 -3
  70. package/dist/{dist-Byj2bV8o.js → dist-BVGtK7Ht.js} +1 -1
  71. package/dist/{dist-BIN5LKyE.js → dist-BaHjhkpZ.js} +2 -2
  72. package/dist/{dist-DVFbIwc5.js → dist-BtKIs9N-.js} +1 -1
  73. package/dist/{dist-BrQGcfQ9.js → dist-C2KzV-vf.js} +2 -2
  74. package/dist/{dist-DJFiGP2k.js → dist-C2wDlYdD.js} +2 -2
  75. package/dist/{dist-BVRM2y1P.js → dist-C8xMLVYi.js} +2 -2
  76. package/dist/dist-CMh_W4y4.js +538 -0
  77. package/dist/{extends-BPB6_lTK.js → dist-CO1AwwG_.js} +516 -561
  78. package/dist/{dist-BzN60Z2s.js → dist-CPGxfVGX.js} +1 -1
  79. package/dist/{dist-C7v-9nUK.js → dist-Cm3iAFMD.js} +3 -3
  80. package/dist/{dist-CGAxEiaM.js → dist-Cs2FijYk.js} +2 -2
  81. package/dist/{dist-hXd65f0_.js → dist-D1PpnuZB.js} +1 -1
  82. package/dist/{dist-VdvbxG72.js → dist-DHOTQar0.js} +1 -1
  83. package/dist/{dist-DcgzXCfy.js → dist-DPcEtqmG.js} +2 -2
  84. package/dist/{dist-D4Z_qdP4.js → dist-Df0wKI0F.js} +1 -1
  85. package/dist/{dist-qhLI-SHd.js → dist-DszxuxS1.js} +2 -2
  86. package/dist/{dist-BEmkrGoQ.js → dist-Kxgjxakw.js} +1 -1
  87. package/dist/{dist-BbSMhhD2.js → dist-KzZ7WELx.js} +2 -2
  88. package/dist/{dist-jWUab2d1.js → dist-lA1Cttkb.js} +1 -1
  89. package/dist/dropdown-menu-CZgjYSAh.js +4502 -0
  90. package/dist/{ebnfDiagram-BXEA7PRR-Dm75pCAS.js → ebnfDiagram-PWID7BFC-WnG4cvSQ.js} +17 -18
  91. package/dist/{erDiagram-JOGREHBK-rVDG3VSQ.js → erDiagram-RLTQ6QDP-DhzKiYHc.js} +1037 -798
  92. package/dist/error-banner-B94dcDmP.js +391 -0
  93. package/dist/error-entries-C0NsUqXl.js +56 -0
  94. package/dist/{esm-CR1nhb1c.js → esm-BElI3qKH.js} +22 -22
  95. package/dist/{esm-C1d0g6Bv.js → esm-G4Fhsgng.js} +51 -37
  96. package/dist/{esm-CesmlDrs.js → esm-h8f7-1CJ.js} +423 -423
  97. package/dist/eventmodeling-NTZA5JFV-D7nP7Uyu.js +3 -0
  98. package/dist/feedback-button-D2hUXe09.js +380 -0
  99. package/dist/flowDiagram-HODETNUW-6dMdB8pR.js +16 -0
  100. package/dist/{formats-CslNOKy0.js → formats-BR5iGb4s.js} +8 -8
  101. package/dist/{ganttDiagram-PKOTCBZU-9D-LXF6P.js → ganttDiagram-EL5Y4UJY-DbzEBLbl.js} +15 -15
  102. package/dist/gitGraph-4MIJSDKK-Dy9uQXGh.js +3 -0
  103. package/dist/{gitGraphDiagram-DS77QQ5N-BfpsXTLf.js → gitGraphDiagram-WWUBYQGX-BMf0iKi1.js} +10 -10
  104. package/dist/{glide-data-editor-sPZ8fUFn.js → glide-data-editor-B851uguN.js} +2143 -1910
  105. package/dist/{glide-utils-NShAPPtn.js → glide-utils-B3rUT5PI.js} +15 -15
  106. package/dist/globals-CmijFoIU.js +19 -0
  107. package/dist/highlighted-body-KPVGNVTW-Ad3MKZ18.js +38 -0
  108. package/dist/html-to-image-CeYYvQNb.js +3272 -0
  109. package/dist/info-A6RAGUB7-DKoayiHY.js +3 -0
  110. package/dist/{infoDiagram-6WML65LV-DqCTXHVy.js → infoDiagram-27XIBGKW-BagtCX_5.js} +7 -7
  111. package/dist/{ishikawaDiagram-WSZJBQD7-BCUYmZ1v.js → ishikawaDiagram-5VMMS53U-DByDehYy.js} +8 -8
  112. package/dist/{journeyDiagram-NVQOT4AX-BXB6M4zN.js → journeyDiagram-3NMN7TZE-D2LcKDUO.js} +8 -8
  113. package/dist/{jsx-runtime-CpoKNRgu.js → jsx-runtime-DgDPJV9S.js} +1 -1
  114. package/dist/{kanban-definition-27J2QSJJ-CGRhrDUX.js → kanban-definition-UXKFOSKX-BxwkbBI_.js} +29 -29
  115. package/dist/katex-DFBiSucW.js +21840 -0
  116. package/dist/{label-lwzzBHUW.js → label-BJ49YTvk.js} +6 -6
  117. package/dist/{linear-D5r_1YqD.js → linear-Cnaq3Tfb.js} +4 -4
  118. package/dist/{loader-VZ__bv4g.js → loader-D2W4oM-3.js} +15 -15
  119. package/dist/main.js +8113 -13475
  120. package/dist/mermaid-DPNuhemn.js +3084 -0
  121. package/dist/mermaid-HWGCJPDP-DYCzSILp.js +2 -0
  122. package/dist/mermaid-parser.core-DxuSfYwJ.js +638 -0
  123. package/dist/{mhchem-BjwrxcV-.js → mhchem-DWCF06w9.js} +1 -1
  124. package/dist/{micromark-factory-space-DruVGzeG.js → micromark-factory-space-DGxAzmw8.js} +2 -2
  125. package/dist/{mindmap-definition-FAOFIHXS-C9gRhzZq.js → mindmap-definition-YA3MSWOX-Cgvojw3y.js} +17 -17
  126. package/dist/{node-sql-parser-DesT1xNw.js → node-sql-parser-BiZOJ-FS.js} +0 -3
  127. package/dist/{number-overlay-editor-De2CabLL.js → number-overlay-editor-BtdoxWiD.js} +5 -5
  128. package/dist/objectWithoutPropertiesLoose-BRDcTsfB.js +23 -0
  129. package/dist/packet-AYTQ26CC-Yw7ajchJ.js +3 -0
  130. package/dist/{pegDiagram-VL7TDLO6-Df9IUjMD.js → pegDiagram-XKGWAZYB-DahHhYyN.js} +19 -20
  131. package/dist/{pick-SnHlmIBN.js → pick-CJeoxYOS.js} +1 -1
  132. package/dist/pie-WAS4IAKB-BKdKOAkL.js +3 -0
  133. package/dist/{pieDiagram-7S7Q4E2Y-BmRzQ8ZP.js → pieDiagram-E7YTZNPT-CCtX0oCK.js} +29 -31
  134. package/dist/{process-output-CPy0YKUe.js → process-output-BCTjlyuH.js} +7 -6
  135. package/dist/purify.es-DgKyQviY.js +805 -0
  136. package/dist/{quadrantDiagram-CIZ2JOQS-wFBvWcxS.js → quadrantDiagram-AXDQQJYC-DftINo6g.js} +5 -5
  137. package/dist/radar-RG4KPBEZ-ScR_D_Ts.js +3 -0
  138. package/dist/railroad-74A4TZTK-DQvPSdo5.js +3 -0
  139. package/dist/railroad-abnf-HS5TGJTU-CsJQG2O8.js +3 -0
  140. package/dist/railroad-ebnf-LZEXJU2U-BgEobkSn.js +3 -0
  141. package/dist/railroad-peg-WCYAUIDC-DjLAjofI.js +3 -0
  142. package/dist/{railroadDiagram-AXF67PYL-DxbIatiN.js → railroadDiagram-O6MQD6OU-Du5NsPUb.js} +17 -18
  143. package/dist/{react-dom-C94wmq5w.js → react-dom-BUgJ-ab_.js} +3 -3
  144. package/dist/{react-DMWcHin-.js → react-ofJbxM4x.js} +2 -2
  145. package/dist/{react-vega-DSD5aT7_.js → react-vega-5AcMW8gG.js} +10012 -9369
  146. package/dist/{requirementDiagram-LRYGKXZP-X_x-Y713.js → requirementDiagram-BXWQKSXE-0pmmxL6_.js} +20 -19
  147. package/dist/{reveal-component-CVsYlb9J.js → reveal-component-DQq7NUGJ.js} +1303 -1237
  148. package/dist/{sankeyDiagram-W5VNT64P-BYJALbbm.js → sankeyDiagram-P5KCCOFB-CDKR5TJH.js} +4 -4
  149. package/dist/{select-3qHpFKF9.js → select-C6plhmZr.js} +317 -562
  150. package/dist/{sequenceDiagram-SI44F4Z6-BiPBe3Sv.js → sequenceDiagram-WJ2MYXX4-DB-ChWwU.js} +11 -11
  151. package/dist/{sizeCapture-X5ZJPWSS-BKLDeh5H.js → sizeCapture-INFHLROL-Dx5SpkQF.js} +2 -2
  152. package/dist/{spec-CutWdqo3.js → spec-CAYwFeV6.js} +4 -4
  153. package/dist/{src-C31ngt98.js → src-CA_m4ONl.js} +298 -303
  154. package/dist/{stateDiagram-OKZ733FA-B7QyNBxH.js → stateDiagram-D77RDMKH-orN6AwMx.js} +19 -20
  155. package/dist/stateDiagram-v2-MP3YSRHH-o05_rJN8.js +30 -0
  156. package/dist/style.css +2 -2
  157. package/dist/{swimlanes-SLNWSIFB-B4f8VP3b.js → swimlanes-42K2YHIH-BkSDcqDT.js} +1501 -1591
  158. package/dist/swimlanesDiagram-VR7AAH4N-D_nFQfRc.js +30 -0
  159. package/dist/{swiper-component-C90YjhaV.js → swiper-component-IOUowglM.js} +39 -26
  160. package/dist/{time-aWGfjN8x.js → time-BieKwdYS.js} +42 -42
  161. package/dist/{timeline-definition-Z64GVDOM-Dacq_5lr.js → timeline-definition-24CTP7MA-BuqJUIRZ.js} +7 -7
  162. package/dist/{toDate-CpXBeDq0.js → toDate-WXg1yLcI.js} +7 -7
  163. package/dist/toast-DvY70eFX.js +1834 -0
  164. package/dist/tooltip-qB8NlSqV.js +1742 -0
  165. package/dist/treeView-Q6P3EWNA-DuRV97YF.js +3 -0
  166. package/dist/treemap-WGGIJYW6-AsLq-uwC.js +3 -0
  167. package/dist/use-restore-focus-D5D9xEjZ.js +5946 -0
  168. package/dist/{use-vega-container-remeasure-DUW4tRxq.js → use-vega-container-remeasure-4DwJbPWu.js} +2 -2
  169. package/dist/{useAsyncData-CH6-CgJF.js → useAsyncData-BD6AStMt.js} +3 -3
  170. package/dist/{useDateFormatter-Cp9Jdxls.js → useDateFormatter-BRTPsUK7.js} +8 -8
  171. package/dist/{useDeepCompareMemoize-JC87C_jO.js → useDeepCompareMemoize-D_HNdyvI.js} +2 -2
  172. package/dist/{useIframeCapabilities-De3C-9b4.js → useIframeCapabilities-CVtNkI3Y.js} +2 -2
  173. package/dist/{useLifecycle-B4RGlyf0.js → useLifecycle-DPgiiwwU.js} +6 -6
  174. package/dist/useNumberFormatter-BfDpa21j.js +251 -0
  175. package/dist/useTheme-DzXmYZ5V.js +904 -0
  176. package/dist/{vega-component-ovBXgp91.js → vega-component-D0QXopU8.js} +34 -34
  177. package/dist/{vega-embed-container-TJ5z5dZw.js → vega-embed-container-CbnTccZi.js} +6 -6
  178. package/dist/vega-loader.browser-D95WfUcj.js +1139 -0
  179. package/dist/{vennDiagram-T6HMQDX7-D-Rcq3Iu.js → vennDiagram-4TSXK5OY-CTUlJ2PK.js} +9 -9
  180. package/dist/wardley-WFR3VGLG-Na-tFhQJ.js +3 -0
  181. package/dist/{wardleyDiagram-T6FBY63Y-Z-Og7_Wd.js → wardleyDiagram-VM6X3IG4-3evLUb0M.js} +10 -10
  182. package/dist/{xychartDiagram-ELKLHX3M-BDJ2dITA.js → xychartDiagram-S5SC5T6Z-DL2E3K8-.js} +248 -139
  183. package/package.json +54 -57
  184. package/src/__mocks__/notebook.ts +1 -0
  185. package/src/__mocks__/requests.ts +7 -0
  186. package/src/__tests__/__snapshots__/CellStatus.test.tsx.snap +12 -12
  187. package/src/__tests__/fixtures/pair-preview.ts +19 -0
  188. package/src/__tests__/mount.test.ts +18 -0
  189. package/src/components/app-config/optional-features.tsx +6 -0
  190. package/src/components/chat/acp/__tests__/agent-panel-initialization.test.tsx +394 -0
  191. package/src/components/chat/acp/__tests__/agent-panel.test.tsx +272 -0
  192. package/src/components/chat/acp/__tests__/state.test.ts +2 -2
  193. package/src/components/chat/acp/agent-panel.tsx +115 -74
  194. package/src/components/chat/acp/state.ts +1 -1
  195. package/src/components/data-table/__tests__/filters.test.ts +21 -21
  196. package/src/components/data-table/charts/__tests__/spec.test.ts +5 -10
  197. package/src/components/data-table/column-explorer-panel/column-explorer.tsx +2 -6
  198. package/src/components/data-table/column-summary/chart-spec-model.tsx +1 -1
  199. package/src/components/data-table/columns.tsx +64 -67
  200. package/src/components/editor/RecoveryButton.tsx +1 -0
  201. package/src/components/editor/__tests__/dynamic-favicon.test.tsx +36 -2
  202. package/src/components/editor/actions/__tests__/pair-with-agent-commands.test.ts +115 -0
  203. package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +218 -0
  204. package/src/components/editor/actions/pair-with-agent-commands.ts +46 -9
  205. package/src/components/editor/actions/pair-with-agent-modal.tsx +49 -23
  206. package/src/components/editor/ai/add-cell-with-ai.tsx +1 -0
  207. package/src/components/editor/ai/ai-completion-editor.tsx +3 -1
  208. package/src/components/editor/alerts/__tests__/connection-notice.test.tsx +186 -0
  209. package/src/components/editor/alerts/__tests__/startup-progress.test.tsx +185 -0
  210. package/src/components/editor/alerts/connecting-alert.tsx +1 -66
  211. package/src/components/editor/alerts/connection-notice.tsx +186 -0
  212. package/src/components/editor/alerts/startup-output.tsx +173 -0
  213. package/src/components/editor/alerts/startup-progress.tsx +204 -0
  214. package/src/components/editor/app-container.tsx +9 -3
  215. package/src/components/editor/boundary/ErrorBoundary.tsx +38 -16
  216. package/src/components/editor/boundary/__tests__/ErrorBoundary.test.tsx +311 -0
  217. package/src/components/editor/cell/__tests__/toolbar.test.tsx +73 -0
  218. package/src/components/editor/cell/code/__tests__/rtc-editor-config.test.ts +50 -0
  219. package/src/components/editor/cell/code/cell-editor.tsx +41 -42
  220. package/src/components/editor/cell/toolbar.tsx +11 -0
  221. package/src/components/editor/chrome/components/__tests__/feedback-button.test.tsx +94 -0
  222. package/src/components/editor/chrome/components/feedback-button.tsx +63 -42
  223. package/src/components/editor/chrome/panels/__tests__/packages-panel.test.tsx +164 -8
  224. package/src/components/editor/chrome/panels/__tests__/sandbox-details.test.tsx +358 -0
  225. package/src/components/editor/chrome/panels/__tests__/sandbox-recovery.test.tsx +168 -0
  226. package/src/components/editor/chrome/panels/packages-panel.tsx +113 -175
  227. package/src/components/editor/chrome/panels/sandbox-controller.tsx +106 -0
  228. package/src/components/editor/chrome/panels/sandbox-details-state.ts +38 -0
  229. package/src/components/editor/chrome/panels/sandbox-panel.tsx +230 -0
  230. package/src/components/editor/chrome/panels/sandbox-toggle.tsx +52 -0
  231. package/src/components/editor/chrome/wrapper/app-chrome.tsx +7 -0
  232. package/src/components/editor/chrome/wrapper/footer-items/backend-status.tsx +3 -1
  233. package/src/components/editor/code/__tests__/readonly-diff.test.tsx +65 -0
  234. package/src/components/editor/code/readonly-diff.tsx +1 -1
  235. package/src/components/editor/connections/database/__tests__/__snapshots__/as-code.test.ts.snap +98 -98
  236. package/src/components/editor/connections/database/__tests__/as-code.test.ts +11 -5
  237. package/src/components/editor/dynamic-favicon.tsx +17 -10
  238. package/src/components/editor/file-tree/__tests__/file-explorer-navigation.test.tsx +13 -11
  239. package/src/components/editor/file-tree/__tests__/tree-actions.test.tsx +54 -0
  240. package/src/components/editor/file-tree/tree-actions.tsx +11 -14
  241. package/src/components/editor/header/__tests__/status.test.tsx +8 -20
  242. package/src/components/editor/header/filename-input.tsx +2 -0
  243. package/src/components/editor/header/status.tsx +5 -3
  244. package/src/components/editor/navigation/clipboard.ts +1 -0
  245. package/src/components/editor/notebook-cell.tsx +4 -2
  246. package/src/components/editor/output/JsonOutput.tsx +182 -632
  247. package/src/components/editor/output/Outputs.css +49 -17
  248. package/src/components/editor/output/__tests__/JsonOutput-interactions.test.tsx +254 -0
  249. package/src/components/editor/output/__tests__/JsonOutput-mimetype.test.tsx +41 -46
  250. package/src/components/editor/output/__tests__/{json-output.test.ts → json-output-formatting.test.ts} +113 -75
  251. package/src/components/editor/output/__tests__/json-output-pagination.test.ts +252 -0
  252. package/src/components/editor/output/json-output/formatting.ts +167 -0
  253. package/src/components/editor/output/json-output/pagination.ts +155 -0
  254. package/src/components/editor/output/json-output/renderers.tsx +196 -0
  255. package/src/components/editor/output/json-output/themes.ts +52 -0
  256. package/src/components/editor/package-alert.tsx +112 -66
  257. package/src/components/editor/renderers/cell-array.tsx +1 -5
  258. package/src/components/editor/renderers/slides-layout/__tests__/plugin.test.ts +3 -7
  259. package/src/components/slides/slide-form.tsx +1 -0
  260. package/src/components/slides/slide-notes-editor.tsx +1 -0
  261. package/src/components/tracing/tracing-spec.ts +1 -1
  262. package/src/components/ui/__tests__/badge.test.ts +6 -4
  263. package/src/components/ui/use-toast.ts +8 -0
  264. package/src/core/MarimoApp.tsx +0 -2
  265. package/src/core/ai/context/providers/__tests__/error.test.ts +16 -22
  266. package/src/core/alerts/__tests__/environment.test.ts +183 -0
  267. package/src/core/alerts/__tests__/state.test.tsx +240 -0
  268. package/src/core/alerts/environment.ts +57 -0
  269. package/src/core/alerts/state.ts +155 -99
  270. package/src/core/cells/__tests__/__snapshots__/cells.test.ts.snap +296 -259
  271. package/src/core/cells/__tests__/apply-transaction.test.ts +34 -0
  272. package/src/core/cells/__tests__/cell.test.ts +61 -0
  273. package/src/core/cells/__tests__/cells.test.ts +182 -37
  274. package/src/core/cells/__tests__/document-changes.test.ts +39 -1
  275. package/src/core/cells/__tests__/outputs.test.tsx +117 -0
  276. package/src/core/cells/__tests__/pending-delete-service.test.tsx +4 -3
  277. package/src/core/cells/__tests__/session.test.ts +7 -0
  278. package/src/core/cells/cell.ts +9 -1
  279. package/src/core/cells/cells.ts +13 -18
  280. package/src/core/cells/document-changes.ts +11 -1
  281. package/src/core/cells/outputs.ts +66 -9
  282. package/src/core/cells/pending-delete-service.ts +12 -16
  283. package/src/core/cells/session.ts +2 -0
  284. package/src/core/cells/types.ts +2 -0
  285. package/src/core/codemirror/find-replace/__tests__/navigate.test.ts +8 -16
  286. package/src/core/codemirror/language/__tests__/sql.test.ts +70 -2
  287. package/src/core/codemirror/language/embedded/__tests__/embedded-python.test.ts +4 -8
  288. package/src/core/codemirror/language/languages/sql/sql.ts +16 -1
  289. package/src/core/codemirror/rtc/extension.ts +5 -2
  290. package/src/core/config/pair.ts +19 -0
  291. package/src/core/datasets/__tests__/data-source.test.ts +2 -0
  292. package/src/core/datasets/data-source-connections.ts +15 -10
  293. package/src/core/edit-app.tsx +8 -5
  294. package/src/core/errors/state.ts +1 -2
  295. package/src/core/export/__tests__/hooks.test.ts +1 -6
  296. package/src/core/islands/bootstrap.ts +3 -1
  297. package/src/core/islands/bridge.ts +3 -0
  298. package/src/core/islands/worker-factory.ts +2 -12
  299. package/src/core/kernel/messages.ts +2 -2
  300. package/src/core/network/__tests__/requests-network.test.ts +4 -3
  301. package/src/core/network/connection-notice.ts +117 -0
  302. package/src/core/network/connection.ts +19 -0
  303. package/src/core/network/requests-lazy.ts +3 -0
  304. package/src/core/network/requests-network.ts +12 -0
  305. package/src/core/network/requests-static.ts +3 -0
  306. package/src/core/network/requests-toasting.tsx +3 -0
  307. package/src/core/network/resolve.ts +2 -1
  308. package/src/core/network/types.ts +7 -0
  309. package/src/core/network/useConnectionNotice.ts +53 -0
  310. package/src/core/packages/__tests__/usePackageAction.test.tsx +129 -0
  311. package/src/core/packages/__tests__/useSandboxController.test.tsx +246 -0
  312. package/src/core/packages/package-data.ts +35 -0
  313. package/src/core/packages/sandbox-state.ts +67 -0
  314. package/src/core/packages/toast-components.tsx +11 -0
  315. package/src/core/packages/useInstallPackage.ts +1 -1
  316. package/src/core/packages/usePackageAction.ts +51 -0
  317. package/src/core/packages/usePackageDependencies.ts +22 -0
  318. package/src/core/packages/useSandboxController.ts +208 -0
  319. package/src/core/run-app.tsx +2 -0
  320. package/src/core/static/__tests__/files.test.ts +12 -30
  321. package/src/core/wasm/__tests__/bootstrap.test.ts +63 -0
  322. package/src/core/wasm/__tests__/bridge.test.ts +13 -4
  323. package/src/core/wasm/__tests__/fs.test.ts +22 -0
  324. package/src/core/wasm/__tests__/runtime-config.test.ts +65 -0
  325. package/src/core/wasm/bridge.ts +35 -23
  326. package/src/core/wasm/rpc.ts +2 -0
  327. package/src/core/wasm/runtime-config.ts +31 -0
  328. package/src/core/wasm/worker/bootstrap.ts +21 -11
  329. package/src/core/wasm/worker/constants.ts +1 -0
  330. package/src/core/wasm/worker/fs.ts +4 -0
  331. package/src/core/wasm/worker/getController.ts +3 -1
  332. package/src/core/wasm/worker/save-worker.ts +10 -9
  333. package/src/core/wasm/worker/types.ts +6 -4
  334. package/src/core/wasm/worker/worker.ts +9 -9
  335. package/src/core/websocket/__tests__/useMarimoKernelConnection.hook.test.tsx +404 -3
  336. package/src/core/websocket/__tests__/useMarimoKernelConnection.test.ts +8 -6
  337. package/src/core/websocket/transports/transport.ts +1 -1
  338. package/src/core/websocket/transports/ws.ts +1 -1
  339. package/src/core/websocket/types.ts +11 -1
  340. package/src/core/websocket/useMarimoKernelConnection.tsx +63 -16
  341. package/src/hooks/useDebounce.ts +2 -0
  342. package/src/mount.tsx +3 -0
  343. package/src/plugins/core/BadPlugin.tsx +3 -14
  344. package/src/plugins/core/RenderHTML.tsx +22 -2
  345. package/src/plugins/core/__test__/RenderHTML.test.ts +187 -0
  346. package/src/plugins/core/registerReactComponent.tsx +0 -1
  347. package/src/plugins/impl/FileBrowserPlugin.tsx +10 -4
  348. package/src/plugins/impl/FormPlugin.tsx +2 -0
  349. package/src/plugins/impl/MatrixPlugin.tsx +2 -0
  350. package/src/plugins/impl/RangeSliderPlugin.tsx +2 -0
  351. package/src/plugins/impl/SliderPlugin.tsx +2 -0
  352. package/src/plugins/impl/__tests__/FileBrowserPlugin.test.tsx +50 -1
  353. package/src/plugins/impl/data-editor/__tests__/glide-data-editor.test.tsx +23 -18
  354. package/src/plugins/impl/data-frames/panel.tsx +1 -0
  355. package/src/plugins/impl/image-comparison/ImageComparisonComponent.tsx +1 -1
  356. package/src/plugins/impl/image-comparison/__tests__/ImageComparisonComponent.test.tsx +15 -0
  357. package/src/plugins/impl/vega/__tests__/make-selectable.test.ts +42 -48
  358. package/src/plugins/layout/AccordionPlugin.tsx +7 -2
  359. package/src/plugins/layout/JsonOutputPlugin.tsx +7 -10
  360. package/src/plugins/layout/__test__/AccordionPlugin.test.tsx +66 -0
  361. package/src/stories/sandbox.stories.tsx +488 -0
  362. package/src/utils/__tests__/path.test.ts +6 -5
  363. package/src/utils/__tests__/worker.test.ts +81 -0
  364. package/src/utils/worker.ts +22 -0
  365. package/dist/ErrorBoundary-CR-ZQN_c.js +0 -125
  366. package/dist/_baseMerge-Dv8bBloN.js +0 -73
  367. package/dist/_initCloneObject---vediN2.js +0 -95
  368. package/dist/arc-DOVLrCPd.js +0 -82
  369. package/dist/architecture-TIHT7OUA-MiJpPpQW.js +0 -3
  370. package/dist/array-CApNbSU9.js +0 -6
  371. package/dist/assets/__vite-browser-external-BdKGjRZ4.js +0 -1
  372. package/dist/assets/worker-DlIBfp9S.js +0 -98
  373. package/dist/blockDiagram-VBNYF7ZC-Bc--I65C.js +0 -3158
  374. package/dist/chat-ui-BSwr409J.js +0 -8455
  375. package/dist/chunk-3NCLNEKW-BIp_lB_4.js +0 -14
  376. package/dist/chunk-5FCAYU7R-C_HO9A1J.js +0 -23
  377. package/dist/chunk-5HE753X5-Bixm_MV-.js +0 -38
  378. package/dist/chunk-5JV3BV7I-CH5J3iZY.js +0 -54
  379. package/dist/chunk-5TONJI2A-DG6gDiSS.js +0 -62
  380. package/dist/chunk-7BUUIJ7U-5afmIPeo.js +0 -82
  381. package/dist/chunk-BIQX33UG-7TMBUf89.js +0 -23
  382. package/dist/chunk-CQNSW5MT-Cnqqsxt-.js +0 -38
  383. package/dist/chunk-CYSBUYHQ-BAbymFHR.js +0 -23
  384. package/dist/chunk-EMLP6XTP-Bsz-QL77.js +0 -23
  385. package/dist/chunk-J7OUQ5F2-CM_meqZH.js +0 -57
  386. package/dist/chunk-JG7HCLWE-DUnCDgPk.js +0 -62
  387. package/dist/chunk-MOZMSUNE-BG6IHvzT.js +0 -35
  388. package/dist/chunk-OSBZ3O6U-CYwj_bvR.js +0 -23
  389. package/dist/chunk-QBLGF6JB-B4vJ4j8J.js +0 -23
  390. package/dist/chunk-QR6OTTB3-D4wH2ldi.js +0 -3738
  391. package/dist/chunk-R7FJI6CG-Blf8FcmZ.js +0 -64
  392. package/dist/chunk-RYQCIY6F-BWbIlBIH.js +0 -241
  393. package/dist/chunk-U6XO7XAA-COw445DS.js +0 -63
  394. package/dist/chunk-UBXNYLIW-BHigVU4H.js +0 -32
  395. package/dist/chunk-YOTPTUD7-Dn044Q_d.js +0 -30
  396. package/dist/chunk-ZIRB5QZD-BR4TMfOa.js +0 -1153
  397. package/dist/classDiagram-JCYQIIEL-DmXSLxe_.js +0 -30
  398. package/dist/classDiagram-v2-OCEON4UE-CooqVexA.js +0 -30
  399. package/dist/click-outside-container-D_URcm3D.js +0 -167
  400. package/dist/code-block-37QAKDTI-CQrzBOr-.js +0 -107
  401. package/dist/copy-CD7S58CY.js +0 -141
  402. package/dist/cynefin-VYW2F7L2-CeHAxOEX.js +0 -3
  403. package/dist/dagre-VZM6K2ZE-CJggWPTJ.js +0 -328
  404. package/dist/dist-3_o3T78I.js +0 -1360
  405. package/dist/dist-ABQjhuek.js +0 -64
  406. package/dist/dist-CO5R6VMi.js +0 -538
  407. package/dist/dropdown-menu-DhCfcscX.js +0 -5858
  408. package/dist/emotion-is-prop-valid.esm-M57VsT8j.js +0 -14
  409. package/dist/error-banner-CsXbEEjo.js +0 -611
  410. package/dist/eventmodeling-45OFAUF4-B_lWZ-Pd.js +0 -3
  411. package/dist/flowDiagram-UKHOOZJN-g1AmrZzM.js +0 -17
  412. package/dist/gitGraph-TEB2WS4Q-Dj-eXUph.js +0 -3
  413. package/dist/info-DKCQHKI2-Bhb-pe2e.js +0 -3
  414. package/dist/line-CuKjIQa1.js +0 -34
  415. package/dist/map-BJpOfPlL.js +0 -149
  416. package/dist/math-BXtKgYah.js +0 -10
  417. package/dist/mermaid-4DMBBIKO-Ddp9TgNp.js +0 -2
  418. package/dist/mermaid-Bi23Ibnw.js +0 -1173
  419. package/dist/mermaid-parser.core-Din9FvSi.js +0 -99
  420. package/dist/packet-7NZHBO7P-fbkIIyKE.js +0 -3
  421. package/dist/path-BNHuHZP8.js +0 -87
  422. package/dist/pie-RZYD4A2V-CLRIsxY1.js +0 -3
  423. package/dist/purify.es-CB-YO1Hn.js +0 -774
  424. package/dist/radar-I7S5WNFK-BGzCbgXu.js +0 -3
  425. package/dist/railroad-3IZDKUUU-CvQIIcuU.js +0 -3
  426. package/dist/railroad-abnf-AHOZXSZD-CMwtlNtu.js +0 -3
  427. package/dist/railroad-ebnf-EBAXGLYW-n1QUOAsh.js +0 -3
  428. package/dist/railroad-peg-LSFZ7HO6-PjnrpmCs.js +0 -3
  429. package/dist/schemas-DzK6U94N.js +0 -6057
  430. package/dist/stateDiagram-v2-UEYNNEHI-BTRUs8Il.js +0 -30
  431. package/dist/step-CKczO72Q.js +0 -670
  432. package/dist/swimlanesDiagram-ULZ7WXOC-NBmgBl9G.js +0 -31
  433. package/dist/timer-DpDyj9G0.js +0 -596
  434. package/dist/tooltip-Dt77sBeT.js +0 -390
  435. package/dist/treeView-QDETBFTQ-DU8LwHuf.js +0 -3
  436. package/dist/treemap-6X3UGDF4-DUk4-k_O.js +0 -3
  437. package/dist/useTheme-CVJ0UOf2.js +0 -841
  438. package/dist/vega-loader.browser-DEggZzni.js +0 -1083
  439. package/dist/wardley-OPB4EBWU-Db-AaGas.js +0 -3
  440. package/src/components/editor/output/EmotionCacheProvider.tsx +0 -32
@@ -718,13 +718,28 @@ const AgentPanel: React.FC = () => {
718
718
  clearNotifications,
719
719
  } = acpClient;
720
720
 
721
+ const isConnected = connectionState.status === "connected";
722
+ const [initializedConnection, setInitializedConnection] = useState<{
723
+ agent: NonNullable<typeof agent>;
724
+ wsUrl: string;
725
+ } | null>(null);
726
+ const isAgentReady =
727
+ isConnected &&
728
+ agent !== null &&
729
+ initializedConnection?.agent === agent &&
730
+ initializedConnection.wsUrl === wsUrl;
731
+
721
732
  useEffect(() => {
722
- if (!agent) {
733
+ setInitializedConnection(null);
734
+ setActiveSessionId(null);
735
+ if (!agent || !isConnected) {
723
736
  return;
724
737
  }
738
+ let cancelled = false;
739
+ setError(null);
725
740
 
726
- const initAndAuth = async () => {
727
- const response = await agent.initialize({
741
+ const initialize = async () => {
742
+ await agent.initialize({
728
743
  protocolVersion: 1,
729
744
  clientCapabilities: {
730
745
  fs: {
@@ -734,23 +749,26 @@ const AgentPanel: React.FC = () => {
734
749
  },
735
750
  });
736
751
 
737
- // We try to authenticate with the agent if it supports it.
738
- // The user must then restart the session
739
- const authMethods = response?.authMethods;
740
- if (authMethods && authMethods.length > 0) {
741
- await agent.authenticate({ methodId: authMethods[0].id });
752
+ // Agents use credentials from their CLI login. Advertised auth methods
753
+ // describe login options, not whether authentication is required.
754
+ if (!cancelled) {
755
+ setInitializedConnection({ agent, wsUrl });
742
756
  }
743
757
  };
744
758
 
745
- initAndAuth().catch((error) => {
746
- logger.error("Failed to initialize/authenticate agent", { error });
759
+ initialize().catch((error) => {
760
+ if (!cancelled) {
761
+ logger.error("Failed to initialize agent", { error });
762
+ setError(error instanceof Error ? error : String(error));
763
+ }
747
764
  });
748
- }, [agent]);
765
+ return () => {
766
+ cancelled = true;
767
+ };
768
+ }, [agent, isConnected, wsUrl, setActiveSessionId]);
749
769
 
750
770
  // Auto-connect to agent when we have an active session, but only once per session
751
771
  useEffect(() => {
752
- setActiveSessionId(null);
753
-
754
772
  if (wsUrl === NO_WS_SET) {
755
773
  return;
756
774
  }
@@ -770,7 +788,7 @@ const AgentPanel: React.FC = () => {
770
788
  }, [wsUrl]);
771
789
 
772
790
  const handleNewSession = useEvent(async () => {
773
- if (!agent) {
791
+ if (!agent || !isAgentReady) {
774
792
  return;
775
793
  }
776
794
 
@@ -814,7 +832,7 @@ const AgentPanel: React.FC = () => {
814
832
 
815
833
  const handleResumeSession = useEvent(
816
834
  async (previousSessionId: ExternalAgentSessionId) => {
817
- if (!agent) {
835
+ if (!agent || !isAgentReady) {
818
836
  return;
819
837
  }
820
838
  logger.debug("Resuming agent session", {
@@ -825,6 +843,8 @@ const AgentPanel: React.FC = () => {
825
843
  }
826
844
  creatingOrResumingSession.current = true;
827
845
  try {
846
+ // Loading replays the agent's history through session notifications.
847
+ clearNotifications(previousSessionId);
828
848
  const loadedSession = await agent.loadSession({
829
849
  sessionId: previousSessionId,
830
850
  cwd: getCwd(),
@@ -848,12 +868,19 @@ const AgentPanel: React.FC = () => {
848
868
  },
849
869
  );
850
870
 
851
- // Create or resume a session when successfully connected
852
- const isConnected = connectionState.status === "connected";
871
+ const handleRestartSession = useEvent(async () => {
872
+ setError(null);
873
+ try {
874
+ await handleNewSession();
875
+ } catch (error) {
876
+ setError(error instanceof Error ? error : String(error));
877
+ }
878
+ });
879
+
880
+ // Create or resume a session once initialization finishes.
853
881
  const tabLastActiveSessionId = selectedTab?.externalAgentSessionId;
854
882
  useEffect(() => {
855
- // No need to do anything if we're not connected, don't have an agent, or don't have a selected tab
856
- if (!isConnected || !selectedTab || !agent) {
883
+ if (!isAgentReady || !selectedTab || !agent) {
857
884
  return;
858
885
  }
859
886
 
@@ -893,12 +920,24 @@ const AgentPanel: React.FC = () => {
893
920
 
894
921
  createOrResumeSession();
895
922
  // oxlint-disable-next-line react-hooks/exhaustive-deps
896
- }, [isConnected, agent, tabLastActiveSessionId, activeSessionId]);
923
+ }, [isAgentReady, agent, tabLastActiveSessionId, activeSessionId]);
897
924
 
898
925
  // Handler for prompt submission
899
926
  const handlePromptSubmit = useEvent(
900
927
  async (_e: KeyboardEvent | undefined, prompt: string) => {
901
- if (!activeSessionId || !agent || isLoading) {
928
+ if (!activeSessionId || !agent || !isAgentReady || isLoading) {
929
+ return;
930
+ }
931
+
932
+ let absoluteFilename: string;
933
+ try {
934
+ absoluteFilename = getAbsoluteFilename();
935
+ } catch {
936
+ toast({
937
+ title: "Notebook must be named",
938
+ description: "Please name the notebook to use the agent",
939
+ variant: "danger",
940
+ });
902
941
  return;
903
942
  }
904
943
 
@@ -914,62 +953,51 @@ const AgentPanel: React.FC = () => {
914
953
  setSessionState((prev) => updateSessionTitle(prev, prompt));
915
954
  }
916
955
 
917
- let absoluteFilename: string;
918
956
  try {
919
- absoluteFilename = getAbsoluteFilename();
920
- } catch {
921
- toast({
922
- title: "Notebook must be named",
923
- description: "Please name the notebook to use the agent",
924
- variant: "danger",
925
- });
926
- return;
927
- }
928
-
929
- const promptBlocks: ContentBlock[] = [{ type: "text", text: prompt }];
957
+ const promptBlocks: ContentBlock[] = [{ type: "text", text: prompt }];
930
958
 
931
- // Parse context from the prompt
932
- const { contextBlocks, attachmentBlocks } =
933
- await parseContextFromPrompt(prompt);
934
- promptBlocks.push(...contextBlocks, ...attachmentBlocks);
959
+ // Parse context from the prompt
960
+ const { contextBlocks, attachmentBlocks } =
961
+ await parseContextFromPrompt(prompt);
962
+ promptBlocks.push(...contextBlocks, ...attachmentBlocks);
935
963
 
936
- // Add manually uploaded files as resource links
937
- if (files && files.length > 0) {
938
- const fileResourceLinks = await convertFilesToResourceLinks(files);
939
- promptBlocks.push(...fileResourceLinks);
940
- }
964
+ // Add manually uploaded files as resource links
965
+ if (files && files.length > 0) {
966
+ const fileResourceLinks = await convertFilesToResourceLinks(files);
967
+ promptBlocks.push(...fileResourceLinks);
968
+ }
941
969
 
942
- const hasGivenRules = notifications.some(
943
- (notification) =>
944
- notification.type === "session_notification" &&
945
- notification.data.update.sessionUpdate === "user_message_chunk",
946
- );
947
- if (!hasGivenRules) {
948
- promptBlocks.push(
949
- {
950
- type: "resource_link",
951
- uri: absoluteFilename,
952
- mimeType: "text/x-python",
953
- name: absoluteFilename,
954
- },
955
- {
956
- type: "resource",
957
- resource: {
958
- uri: "marimo_rules.md",
959
- mimeType: "text/plain",
960
- text: getAgentPrompt(absoluteFilename),
961
- },
962
- },
970
+ const hasGivenRules = notifications.some(
971
+ (notification) =>
972
+ notification.type === "session_notification" &&
973
+ notification.data.update.sessionUpdate === "user_message_chunk",
963
974
  );
964
- }
975
+ if (!hasGivenRules) {
976
+ promptBlocks.push(
977
+ {
978
+ type: "resource_link",
979
+ uri: absoluteFilename,
980
+ mimeType: "text/x-python",
981
+ name: absoluteFilename,
982
+ },
983
+ {
984
+ type: "resource",
985
+ resource: {
986
+ uri: "marimo_rules.md",
987
+ mimeType: "text/plain",
988
+ text: getAgentPrompt(absoluteFilename),
989
+ },
990
+ },
991
+ );
992
+ }
965
993
 
966
- try {
967
994
  await agent.prompt({
968
995
  sessionId: activeSessionId,
969
996
  prompt: promptBlocks,
970
997
  });
971
998
  } catch (error) {
972
999
  logger.error("Failed to send prompt", { error });
1000
+ setError(error instanceof Error ? error : String(error));
973
1001
  } finally {
974
1002
  setIsLoading(false);
975
1003
  }
@@ -982,7 +1010,7 @@ const AgentPanel: React.FC = () => {
982
1010
  !activeSessionId ||
983
1011
  !agent ||
984
1012
  isLoading ||
985
- connectionState.status !== "connected" ||
1013
+ !isAgentReady ||
986
1014
  !pendingPrompt
987
1015
  ) {
988
1016
  return;
@@ -998,7 +1026,7 @@ const AgentPanel: React.FC = () => {
998
1026
  activeSessionId,
999
1027
  agent,
1000
1028
  isLoading,
1001
- connectionState.status,
1029
+ isAgentReady,
1002
1030
  pendingPrompt,
1003
1031
  setPendingPrompt,
1004
1032
  handlePromptSubmit,
@@ -1018,7 +1046,10 @@ const AgentPanel: React.FC = () => {
1018
1046
  logger.debug("Manual connect requested", {
1019
1047
  currentStatus: connectionState.status,
1020
1048
  });
1021
- connect();
1049
+ setError(null);
1050
+ void connect().catch((error) => {
1051
+ setError(error instanceof Error ? error : String(error));
1052
+ });
1022
1053
  });
1023
1054
 
1024
1055
  // Handler for manual disconnect
@@ -1111,14 +1142,22 @@ const AgentPanel: React.FC = () => {
1111
1142
  className="w-3/4 mx-auto mt-10"
1112
1143
  error={displayError}
1113
1144
  action={
1114
- isAuthError ? (
1145
+ !isAgentReady ? (
1115
1146
  <Button
1116
1147
  variant="linkDestructive"
1117
1148
  size="sm"
1118
1149
  onClick={() => {
1119
- setError(null);
1120
- handleNewSession();
1150
+ disconnect();
1151
+ handleManualConnect();
1121
1152
  }}
1153
+ >
1154
+ Retry connection
1155
+ </Button>
1156
+ ) : isAuthError ? (
1157
+ <Button
1158
+ variant="linkDestructive"
1159
+ size="sm"
1160
+ onClick={handleRestartSession}
1122
1161
  >
1123
1162
  Restart session
1124
1163
  </Button>
@@ -1152,14 +1191,16 @@ const AgentPanel: React.FC = () => {
1152
1191
  }
1153
1192
 
1154
1193
  const isLoadingSession =
1155
- tabLastActiveSessionId == null && connectionState.status === "connected";
1194
+ isConnected && (!isAgentReady || tabLastActiveSessionId == null);
1156
1195
  if (isLoadingSession) {
1157
1196
  return (
1158
1197
  <DelayMount milliseconds={delay}>
1159
1198
  <div className="flex items-center justify-center h-full min-h-[200px] flex-col">
1160
1199
  <Spinner size="medium" className="text-primary" />
1161
1200
  <span className="text-sm text-muted-foreground">
1162
- Creating a new session...
1201
+ {isAgentReady
1202
+ ? "Creating a new session..."
1203
+ : "Initializing agent..."}
1163
1204
  </span>
1164
1205
  </div>
1165
1206
  </DelayMount>
@@ -1231,7 +1272,7 @@ const AgentPanel: React.FC = () => {
1231
1272
  currentAgentId={selectedTab?.agentId}
1232
1273
  onConnect={handleManualConnect}
1233
1274
  onDisconnect={handleManualDisconnect}
1234
- onRestartThread={handleNewSession}
1275
+ onRestartThread={isAgentReady ? handleRestartSession : undefined}
1235
1276
  hasActiveSession={true}
1236
1277
  shouldShowConnectionControl={wsUrl !== NO_WS_SET}
1237
1278
  />
@@ -257,7 +257,7 @@ interface AgentConfig {
257
257
  const AGENT_CONFIG: Record<ExternalAgentId, AgentConfig> = {
258
258
  claude: {
259
259
  port: 3017,
260
- command: "npx @zed-industries/claude-code-acp",
260
+ command: "npx @agentclientprotocol/claude-agent-acp",
261
261
  sessionSupport: "single",
262
262
  },
263
263
  gemini: {
@@ -368,11 +368,10 @@ describe("schema validation", () => {
368
368
  operator: ">=",
369
369
  value: 18,
370
370
  });
371
- expect(result.success).toBe(true);
372
- if (result.success) {
373
- expect(result.data.type).toBe("condition");
374
- expect(result.data.negate).toBe(false);
375
- }
371
+ expect(result).toMatchObject({
372
+ success: true,
373
+ data: { type: "condition", negate: false },
374
+ });
376
375
  });
377
376
 
378
377
  it("FilterConditionSchema defaults type and negate", () => {
@@ -381,11 +380,10 @@ describe("schema validation", () => {
381
380
  operator: "==",
382
381
  value: 5,
383
382
  });
384
- expect(result.success).toBe(true);
385
- if (result.success) {
386
- expect(result.data.type).toBe("condition");
387
- expect(result.data.negate).toBe(false);
388
- }
383
+ expect(result).toMatchObject({
384
+ success: true,
385
+ data: { type: "condition", negate: false },
386
+ });
389
387
  });
390
388
 
391
389
  it("FilterConditionSchema accepts negate=true", () => {
@@ -395,10 +393,10 @@ describe("schema validation", () => {
395
393
  value: 5,
396
394
  negate: true,
397
395
  });
398
- expect(result.success).toBe(true);
399
- if (result.success) {
400
- expect(result.data.negate).toBe(true);
401
- }
396
+ expect(result).toMatchObject({
397
+ success: true,
398
+ data: { negate: true },
399
+ });
402
400
  });
403
401
 
404
402
  it("FilterGroupSchema accepts valid group", () => {
@@ -440,12 +438,14 @@ describe("schema validation", () => {
440
438
 
441
439
  it("FilterGroupSchema defaults fields", () => {
442
440
  const result = FilterGroupSchema.safeParse({});
443
- expect(result.success).toBe(true);
444
- if (result.success) {
445
- expect(result.data.type).toBe("group");
446
- expect(result.data.operator).toBe("and");
447
- expect(result.data.children).toEqual([]);
448
- expect(result.data.negate).toBe(false);
449
- }
441
+ expect(result).toMatchObject({
442
+ success: true,
443
+ data: {
444
+ type: "group",
445
+ operator: "and",
446
+ children: [],
447
+ negate: false,
448
+ },
449
+ });
450
450
  });
451
451
  });
@@ -169,16 +169,11 @@ describe("getAxisEncoding", () => {
169
169
 
170
170
  const expectedAggregate = (result as { aggregate?: string }).aggregate;
171
171
 
172
- // For aggregations that are not valid for string data types, we should return undefined
173
- if (
174
- agg === NONE_VALUE ||
175
- agg === BIN_AGGREGATION ||
176
- !STRING_AGGREGATION_FNS.includes(agg)
177
- ) {
178
- expect(expectedAggregate).toBeUndefined();
179
- } else if (STRING_AGGREGATION_FNS.includes(agg)) {
180
- expect(expectedAggregate).toEqual(agg);
181
- }
172
+ const isStringAggregation =
173
+ agg !== NONE_VALUE &&
174
+ agg !== BIN_AGGREGATION &&
175
+ STRING_AGGREGATION_FNS.includes(agg);
176
+ expect(expectedAggregate).toBe(isStringAggregation ? agg : undefined);
182
177
  }
183
178
  });
184
179
 
@@ -10,7 +10,7 @@ import {
10
10
  EyeIcon,
11
11
  EyeOffIcon,
12
12
  } from "lucide-react";
13
- import { useMemo, useState } from "react";
13
+ import { useState } from "react";
14
14
  import { useLocale } from "react-aria";
15
15
  import {
16
16
  AddDataframeChart,
@@ -98,11 +98,7 @@ export function ColumnExplorerPanel<TData>({
98
98
  hiddenColumns: hiddenColumnCount,
99
99
  } = getColumnCountForDisplay(table, totalColumns);
100
100
  const { visible: visibleColumnCount } = getUserColumnVisibilityCounts(table);
101
- const columnVisibility = table.getState().columnVisibility;
102
- const showOnlyColumnState = useMemo(
103
- () => getShowOnlyColumnState(table),
104
- [table, columnVisibility],
105
- );
101
+ const showOnlyColumnState = getShowOnlyColumnState(table);
106
102
 
107
103
  const { rowsAndColumns, hiddenSuffix } = prettifyRowColumnCount({
108
104
  numRows: totalRows,
@@ -573,7 +573,7 @@ export class ColumnChartSpecModel<T> {
573
573
  };
574
574
  }
575
575
  case "boolean": {
576
- if (!stats?.true || !stats?.false) {
576
+ if (stats?.true == null || stats?.false == null) {
577
577
  return getLegacyBooleanSpec(column, base, MAX_BAR_HEIGHT);
578
578
  }
579
579
 
@@ -20,7 +20,6 @@ import { Maps } from "@/utils/maps";
20
20
  import { maxFractionalDigits } from "@/utils/numbers";
21
21
  import { Objects } from "@/utils/objects";
22
22
  import { parseContent } from "@/utils/url-parser";
23
- import { EmotionCacheProvider } from "../editor/output/EmotionCacheProvider";
24
23
  import { JsonOutput } from "../editor/output/JsonOutput";
25
24
  import { CopyClipboardIcon } from "../icons/copy-icon";
26
25
  import { Button } from "../ui/button";
@@ -412,76 +411,74 @@ const PopoutColumn = ({
412
411
  : rawStringValue;
413
412
 
414
413
  return (
415
- <EmotionCacheProvider container={null}>
416
- <Popover>
417
- <PopoverTrigger
418
- ref={triggerRef}
419
- className={cn(cellStyles, "max-w-fit outline-hidden")}
420
- onClick={selectCell}
421
- onMouseDown={(e) => {
422
- // Prevent cell underneath from being selected
423
- e.stopPropagation();
424
- }}
425
- >
426
- <span
427
- className={cn(
428
- "cursor-pointer hover:text-link",
429
- wrapped && COLUMN_WRAPPING_STYLES,
430
- )}
431
- title={rawStringValue}
432
- >
433
- {edges ? <WhitespaceMarkers value={edges.leading} /> : null}
434
- {displayText}
435
- {edges ? <WhitespaceMarkers value={edges.trailing} /> : null}
436
- </span>
437
- </PopoverTrigger>
438
- <PopoverContent
414
+ <Popover>
415
+ <PopoverTrigger
416
+ ref={triggerRef}
417
+ className={cn(cellStyles, "max-w-fit outline-hidden")}
418
+ onClick={selectCell}
419
+ onMouseDown={(e) => {
420
+ // Prevent cell underneath from being selected
421
+ e.stopPropagation();
422
+ }}
423
+ >
424
+ <span
439
425
  className={cn(
440
- contentClassName,
441
- scrollable && "flex flex-col overflow-hidden",
426
+ "cursor-pointer hover:text-link",
427
+ wrapped && COLUMN_WRAPPING_STYLES,
442
428
  )}
443
- align="start"
444
- alignOffset={10}
445
- onInteractOutside={(event) => {
446
- // Radix sees the shadow host as the target. Resolve the original
447
- // target so pointer-down does not dismiss before click toggles.
448
- const target = Events.composedTarget(event.detail.originalEvent);
449
- if (triggerRef.current?.contains(target)) {
450
- event.preventDefault();
451
- }
452
- }}
429
+ title={rawStringValue}
453
430
  >
454
- <div
455
- className={cn(
456
- "flex -mt-3 -mr-2",
457
- scrollable ? "shrink-0 justify-end" : "float-right",
458
- )}
459
- >
460
- <CopyClipboardIcon
461
- value={rawStringValue}
462
- className="size-3 hover:text-link"
463
- buttonClassName="flex size-5 items-center justify-center"
464
- tooltip={false}
465
- />
466
- <PopoverClose asChild={true}>
467
- <Button
468
- variant="link"
469
- size="xs"
470
- className={cn("size-5 p-0", !buttonText && "ml-1.5 mr-1")}
471
- aria-label="Close"
472
- >
473
- {buttonText ?? "Close"}
474
- </Button>
475
- </PopoverClose>
476
- </div>
477
- {scrollable ? (
478
- <div className="min-h-0 overflow-auto">{children}</div>
479
- ) : (
480
- children
431
+ {edges ? <WhitespaceMarkers value={edges.leading} /> : null}
432
+ {displayText}
433
+ {edges ? <WhitespaceMarkers value={edges.trailing} /> : null}
434
+ </span>
435
+ </PopoverTrigger>
436
+ <PopoverContent
437
+ className={cn(
438
+ contentClassName,
439
+ scrollable && "flex flex-col overflow-hidden",
440
+ )}
441
+ align="start"
442
+ alignOffset={10}
443
+ onInteractOutside={(event) => {
444
+ // Radix sees the shadow host as the target. Resolve the original
445
+ // target so pointer-down does not dismiss before click toggles.
446
+ const target = Events.composedTarget(event.detail.originalEvent);
447
+ if (triggerRef.current?.contains(target)) {
448
+ event.preventDefault();
449
+ }
450
+ }}
451
+ >
452
+ <div
453
+ className={cn(
454
+ "flex -mt-3 -mr-2",
455
+ scrollable ? "shrink-0 justify-end" : "float-right",
481
456
  )}
482
- </PopoverContent>
483
- </Popover>
484
- </EmotionCacheProvider>
457
+ >
458
+ <CopyClipboardIcon
459
+ value={rawStringValue}
460
+ className="size-3 hover:text-link"
461
+ buttonClassName="flex size-5 items-center justify-center"
462
+ tooltip={false}
463
+ />
464
+ <PopoverClose asChild={true}>
465
+ <Button
466
+ variant="link"
467
+ size="xs"
468
+ className={cn("size-5 p-0", !buttonText && "ml-1.5 mr-1")}
469
+ aria-label="Close"
470
+ >
471
+ {buttonText ?? "Close"}
472
+ </Button>
473
+ </PopoverClose>
474
+ </div>
475
+ {scrollable ? (
476
+ <div className="min-h-0 overflow-auto">{children}</div>
477
+ ) : (
478
+ children
479
+ )}
480
+ </PopoverContent>
481
+ </Popover>
485
482
  );
486
483
  };
487
484
 
@@ -60,6 +60,7 @@ const RecoveryModal = (props: {
60
60
  // NB: we use markdown class to have sane styling for list, paragraph
61
61
  return (
62
62
  <DialogContent className="w-fit">
63
+ {/* oxlint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- Handle Escape from any control within the recovery form. */}
63
64
  <form
64
65
  onSubmit={(e) => {
65
66
  e.preventDefault();