@marimo-team/islands 0.23.17-dev9 → 0.24.1-dev0

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 (633) hide show
  1. package/dist/{ConnectedDataExplorerComponent-f9vLjQiF.js → ConnectedDataExplorerComponent-BUC1MrsF.js} +24 -24
  2. package/dist/{ErrorBoundary-DhLqwSWA.js → ErrorBoundary-BniTEhHn.js} +7 -7
  3. package/dist/{ImageComparisonComponent-C3y7L3eJ.js → ImageComparisonComponent-B7b8DcJI.js} +42 -31
  4. package/dist/{Plot-YQOuVIei.js → Plot-eTseCFf_.js} +4 -4
  5. package/dist/_initCloneObject-DNUst5Cg.js +91 -0
  6. package/dist/abnfDiagram-N423BO3Z-DA4j92-C.js +112 -0
  7. package/dist/{any-language-editor-DifE-fl7.js → any-language-editor-LHl8ZmVN.js} +26 -26
  8. package/dist/apl-Cwo7GIH7.js +4 -0
  9. package/dist/{arc-CTIpFoOn.js → arc-9nABupDE.js} +2 -2
  10. package/dist/architecture-TIHT7OUA-DxLlkuAK.js +5 -0
  11. package/dist/{architectureDiagram-VXUJARFQ-DXwkyAaM.js → architectureDiagram-T3A2C74G-BBlBK1Oh.js} +327 -214
  12. package/dist/{arrays-sEtDRoG4.js → arrays-C56grfjL.js} +1 -1
  13. package/dist/asciiarmor-jrfEZ3j_.js +4 -0
  14. package/dist/asn1-BNEiJ4nQ.js +4 -0
  15. package/dist/assets/__vite-browser-external-DUz7vvG0.js +1 -0
  16. package/dist/assets/{worker-CDEKsBgX.js → worker-Cl1KJG2_.js} +2 -2
  17. package/dist/blockDiagram-VBNYF7ZC-Datz1WNn.js +3284 -0
  18. package/dist/brainfuck-BCunvTbd.js +4 -0
  19. package/dist/{button-BSm8IXRU.js → button-Dr2uAwhT.js} +9 -7
  20. package/dist/{c4Diagram-YG6GDRKO-B6dZC_oU.js → c4Diagram-5PPSVZJV-DTIsibpE.js} +165 -162
  21. package/dist/{capabilities-C6OQ5YBO.js → capabilities-BilXeZ7p.js} +2 -2
  22. package/dist/{channel-BN070S0F.js → channel-CuV_jmG4.js} +1 -1
  23. package/dist/chat-ui-o-tATfmW.js +8619 -0
  24. package/dist/{check-DP7U0H0G.js → check-58HHfHKy.js} +1 -1
  25. package/dist/chunk-2GRJ4B5K-DRayWnnu.js +68 -0
  26. package/dist/{chunk-QZHKN3VN-Dym5BS7y.js → chunk-2Q5K7J3B-BSLyFOHa.js} +1 -1
  27. package/dist/chunk-3NCLNEKW-BPlp8K7N.js +11 -0
  28. package/dist/chunk-4I5QYGJK-CYJC3pkC.js +260 -0
  29. package/dist/chunk-5FCAYU7R-C3cMIeyz.js +24 -0
  30. package/dist/{chunk-5FQGJX7Z-B9WoXK1R.js → chunk-5FQGJX7Z-BRZ_XYUw.js} +6 -6
  31. package/dist/chunk-5HE753X5-D2jFCVXb.js +34 -0
  32. package/dist/chunk-5JV3BV7I-B7tzprBU.js +50 -0
  33. package/dist/{chunk-DI55MBZ5-D4Y8yV8B.js → chunk-5RXB4S5H-DcCPfb0q.js} +373 -327
  34. package/dist/chunk-5TONJI2A-LRqbgPte.js +59 -0
  35. package/dist/{chunk-FMBD7UC4-quJmebXa.js → chunk-5VM5RSS4-ChXEBudA.js} +1 -1
  36. package/dist/chunk-6Q2QTUOP-zcnb3OaV.js +503 -0
  37. package/dist/{chunk-HN2XXSSU-Bv0QkeMr.js → chunk-7BUUIJ7U-CkIbJNZo.js} +32 -25
  38. package/dist/chunk-7Z6QIM7H-1j-x7ddW.js +606 -0
  39. package/dist/{chunk-FRFDVMJY-BHBqN-vD.js → chunk-BIQX33UG-B-BYk6sM.js} +3 -3
  40. package/dist/chunk-Bfp04NdC.js +25 -0
  41. package/dist/chunk-CQNSW5MT-DBXDKSOU.js +34 -0
  42. package/dist/{chunk-4F5CHEZ2-VlodlEGo.js → chunk-CYSBUYHQ-Cv-vKQV-.js} +1 -1
  43. package/dist/{chunk-SJTYNZTY-DnXoKWpW.js → chunk-EMLP6XTP-DCtMkXLF.js} +1 -1
  44. package/dist/{chunk-B4BG7PRW-B_z2FEHm.js → chunk-GF5L2VYU-esTxzELH.js} +878 -636
  45. package/dist/chunk-I66GZJ75-9xAsFrdW.js +3744 -0
  46. package/dist/chunk-J7OUQ5F2-CbNBTlFM.js +81 -0
  47. package/dist/chunk-JG7HCLWE-CZIm6axg.js +59 -0
  48. package/dist/{flowDiagram-NV44I4VS-BRhSg-ro.js → chunk-JQJVKLGR-ZALkKVji.js} +1019 -1001
  49. package/dist/{chunk-4BX2VUAB-iU5lQTDI.js → chunk-JWPE2WC7-C_Daz-Oc.js} +1 -1
  50. package/dist/{chunk-QN33PNHL-DPBNNzpR.js → chunk-KBJHAD2P-B7m9DztL.js} +3 -2
  51. package/dist/chunk-KEIR6QF5-aP6TmWQ-.js +21095 -0
  52. package/dist/{chunk-UMXZTB3W-D1uHz8MN.js → chunk-MOZMSUNE-BQi-ggQx.js} +7 -4
  53. package/dist/{chunk-S3R3BYOJ-BdgLc8AM.js → chunk-NSK5VX7P-BmmoJBbx.js} +320 -29
  54. package/dist/chunk-OSBZ3O6U-BcrmpSY_.js +22 -0
  55. package/dist/{chunk-TQ3KTPDO-CsDx6v37.js → chunk-QBLGF6JB-BACuPUWb.js} +3 -3
  56. package/dist/chunk-QR6OTTB3-C4L1dLRd.js +3762 -0
  57. package/dist/{chunk-B2363JML-zL3VngtH.js → chunk-R7FJI6CG-BYAXJpIb.js} +3 -3
  58. package/dist/chunk-RYQCIY6F-poA0Ugpr.js +243 -0
  59. package/dist/chunk-U6XO7XAA-I8tCjTeT.js +60 -0
  60. package/dist/chunk-UBXNYLIW-C8LueN5Q.js +34 -0
  61. package/dist/{chunk-ATLVNIR6-qFiszptQ.js → chunk-W5SLKNZC-DK-_KuKT.js} +2 -2
  62. package/dist/{chunk-JA3XYJ7Z-CY4CRbV5.js → chunk-WRU74C26-DLgw-V0j.js} +262 -451
  63. package/dist/chunk-XXDRQBXY-Dzcp3rUR.js +9 -0
  64. package/dist/chunk-Y2CYZVJY-DX3DSigL.js +13 -0
  65. package/dist/{chunk-PL6DKKU2-CAHKc95s.js → chunk-YOTPTUD7-C8qfgaz5.js} +5 -5
  66. package/dist/{chunk-MI3HLSF2-HGWI-8Pg.js → chunk-ZIRB5QZD-_JX1DzEJ.js} +12 -8
  67. package/dist/classDiagram-JCYQIIEL-D8A6ZyXv.js +32 -0
  68. package/dist/classDiagram-v2-OCEON4UE-DIdYl-t3.js +32 -0
  69. package/dist/{click-outside-container-BSIeYt4y.js → click-outside-container-BZNsAj09.js} +2 -2
  70. package/dist/{clike-7lgyEYRk.js → clike-CWndBX_M.js} +1 -1
  71. package/dist/clojure-2X0Rfij9.js +4 -0
  72. package/dist/cmake-DEwzCy9U.js +4 -0
  73. package/dist/cobol-Ck4eCoAB.js +4 -0
  74. package/dist/{code-block-37QAKDTI-MSxEjskJ.js → code-block-37QAKDTI-B4pWe5MI.js} +4 -4
  75. package/dist/coffeescript-bB1IDwhg.js +4 -0
  76. package/dist/{common-C3f0slQQ.js → common-CDI91x0c.js} +797 -804
  77. package/dist/commonlisp-BDYrVBNC.js +4 -0
  78. package/dist/{compiler-runtime-CEbnTgxf.js → compiler-runtime-DsR6imPN.js} +2 -2
  79. package/dist/{copy-DNq8q3zw.js → copy-C7ZKMKox.js} +5 -5
  80. package/dist/{cose-bilkent-S5V4N54A-BYj0aL7z.js → cose-bilkent-JH36ORCC-D6iQzSi6.js} +6 -5
  81. package/dist/crystal-BSoiVUiH.js +4 -0
  82. package/dist/css-w1h9i21f.js +4 -0
  83. package/dist/cynefin-VYW2F7L2-DnZOHyNF.js +5 -0
  84. package/dist/cynefinDiagram-MW4NZA55-B1GNPS2u.js +367 -0
  85. package/dist/cypher-B4xzuKGP.js +4 -0
  86. package/dist/{cytoscape.esm-Dr8XzXWK.js → cytoscape.esm-BPa26Dup.js} +393 -334
  87. package/dist/d-D50Bz34p.js +4 -0
  88. package/dist/{dagre-By_QsQgc.js → dagre-ThTNj8pe.js} +60 -45
  89. package/dist/dagre-VZM6K2ZE-DEs5dfXA.js +343 -0
  90. package/dist/{data-grid-overlay-editor-BWRG2b_o.js → data-grid-overlay-editor-Ci7TXVf5.js} +5 -5
  91. package/dist/{debounce-BOD3DbfP.js → debounce-D784bpms.js} +2 -2
  92. package/dist/{defaultLocale-BpsHxBd7.js → defaultLocale-CMezyvMc.js} +26 -26
  93. package/dist/diagram-7IWD3JNH-Bdk1_wJO.js +321 -0
  94. package/dist/diagram-B4RE2ZJO-Be9eYLJ0.js +464 -0
  95. package/dist/{diagram-S2PKOQOG-CGh4OMEV.js → diagram-LBJQPF4R-BNSnzxFw.js} +26 -18
  96. package/dist/{diagram-PSM6KHXK-D4ftnaua.js → diagram-Q27KOJAE-NPRzyGtd.js} +68 -63
  97. package/dist/diagram-UB23O5K3-Dogz4itg.js +236 -0
  98. package/dist/diff-BMdzfXq-.js +4 -0
  99. package/dist/{dist-BTdrwBWP.js → dist-72nb8Uag.js} +3 -3
  100. package/dist/{dist-CV79CsQ0.js → dist-9PC5KxMl.js} +2 -2
  101. package/dist/{dist-BOMbzyb3.js → dist-Awj73yUw.js} +3 -3
  102. package/dist/{dist-w_gWE5Wf.js → dist-B0Ctcrt9.js} +1 -1
  103. package/dist/{dist-BO5HRiTf.js → dist-B1Donbpk.js} +2 -2
  104. package/dist/dist-BC6wzWNb.js +5 -0
  105. package/dist/{dist-De-GlSAs.js → dist-BJ2IUa0l.js} +15 -9
  106. package/dist/dist-BMd_RcOy.js +5 -0
  107. package/dist/dist-BZEWjN6r.js +5 -0
  108. package/dist/{dist-BP39XM8u.js → dist-B_K4AAkc.js} +1 -1
  109. package/dist/dist-BeuGjR3n.js +6 -0
  110. package/dist/dist-BfDQCUe6.js +5 -0
  111. package/dist/dist-BhNblTOV.js +8 -0
  112. package/dist/{dist-BPF0gTRZ.js → dist-C0ifRfXi.js} +1 -1
  113. package/dist/{dist-pqIwD8VD.js → dist-C3mEki35.js} +2 -2
  114. package/dist/{dist-LpLXa9Lb.js → dist-CNfV2vDI.js} +2 -2
  115. package/dist/{dist-DviUBLUp.js → dist-COcQ5Vyc.js} +4 -4
  116. package/dist/dist-CRCm4Fuo.js +5 -0
  117. package/dist/{dist-4lVIWUT3.js → dist-CSZpLb9d.js} +1 -1
  118. package/dist/{dist-BIEt-mlF.js → dist-CWswQBvu.js} +1 -1
  119. package/dist/{dist-D3bdsa1d.js → dist-CXYro_Nw.js} +4 -4
  120. package/dist/{dist-CRmSjkLP.js → dist-Ckfsc8C3.js} +2 -2
  121. package/dist/{dist-CSlJrrAw.js → dist-Cyq6Pxtv.js} +1 -1
  122. package/dist/{dist-JGehap7K.js → dist-D-BWPyoX.js} +5 -5
  123. package/dist/{dist-BCX980mU.js → dist-D-YB6j-O.js} +2 -2
  124. package/dist/{dist-DgjbnqTg.js → dist-D1vYHETp.js} +2 -2
  125. package/dist/{dist-BpeiYpG2.js → dist-D9-ePb6D.js} +2 -2
  126. package/dist/dist-DBPEbGkd.js +8 -0
  127. package/dist/{dist-C2_4pjuS.js → dist-DC409ROm.js} +1 -1
  128. package/dist/{dist-BdqCKQ1O.js → dist-DJRUd9aM.js} +2 -2
  129. package/dist/{dist-DaXJPX8F.js → dist-DLvxZEAK.js} +2 -2
  130. package/dist/dist-DSsl8IAI.js +5 -0
  131. package/dist/{dist-3NCqaWjt.js → dist-D_ulymry.js} +2 -2
  132. package/dist/{dist-DZwp8lro.js → dist-DgY27bJ4.js} +3 -3
  133. package/dist/{dist-BwhXBwMd.js → dist-DiwVZiK7.js} +1 -1
  134. package/dist/{dist-DwqBJ014.js → dist-DnYHhW6c.js} +2 -2
  135. package/dist/dist-Dx0kkrek.js +5 -0
  136. package/dist/{dist-DsoKosxi.js → dist-HaLHv0k5.js} +2 -3
  137. package/dist/dist-NKA1TU8a.js +6 -0
  138. package/dist/dist-ZFcsIdHj.js +8 -0
  139. package/dist/{dist-C18MUWTj.js → dist-iZ8-rtUy.js} +2 -2
  140. package/dist/{dist-DIlxLFXG.js → dist-j30bBjjN.js} +15 -15
  141. package/dist/{dist-SXNmlE8A.js → dist-kOCFEa1U.js} +3 -3
  142. package/dist/{dist-CFSb_Frm.js → dist-sxRUVPmt.js} +1 -1
  143. package/dist/dist-uA2RbGmY.js +5 -0
  144. package/dist/{dist-B2jmQKKx.js → dist-xVU82Nq7.js} +2 -2
  145. package/dist/dist-zSCo-xCB.js +8 -0
  146. package/dist/{dockerfile-B82Pkz_V.js → dockerfile-DImRFUlA.js} +1 -1
  147. package/dist/dtd-B9dCT0pu.js +4 -0
  148. package/dist/dylan-DLghDyuR.js +4 -0
  149. package/dist/ebnfDiagram-BXEA7PRR-CqRWkG7L.js +129 -0
  150. package/dist/ecl-w0qdPHDB.js +4 -0
  151. package/dist/eiffel-C5AWRCNP.js +4 -0
  152. package/dist/elm-CT8FZrOm.js +4 -0
  153. package/dist/{erDiagram-Q2GNP2WA-BcKAHFqF.js → erDiagram-JOGREHBK-BZMJX-Au.js} +568 -436
  154. package/dist/erlang-DPD-9M5g.js +4 -0
  155. package/dist/{error-banner-B_GQfxxD.js → error-banner-BwCLtmkH.js} +6 -6
  156. package/dist/{esm-CuQHjs36.js → esm-BJ4n0NUT.js} +1 -1
  157. package/dist/{esm-DKOv6P2M.js → esm-Dusmf6uu.js} +105 -105
  158. package/dist/{esm-DzZVaNH4.js → esm-QLUgkqzZ.js} +6 -6
  159. package/dist/eventmodeling-45OFAUF4-D8Kbnsr6.js +5 -0
  160. package/dist/{extends-w2_S44bV.js → extends-iFBneQO_.js} +9 -9
  161. package/dist/{factor-Bq2mGIHt.js → factor-BonZgUGg.js} +1 -1
  162. package/dist/factor-rFfeJu3r.js +4 -0
  163. package/dist/flowDiagram-UKHOOZJN-DqIE8_b3.js +21 -0
  164. package/dist/{formats-Dwq1THhr.js → formats-HSfYlcA8.js} +7 -7
  165. package/dist/forth-C-3AyQx4.js +4 -0
  166. package/dist/fortran-BSN9TeT7.js +4 -0
  167. package/dist/ganttDiagram-PKOTCBZU-Bc9puoXb.js +2207 -0
  168. package/dist/gas-DwmuvQpB.js +4 -0
  169. package/dist/gherkin-gmCjL-Sn.js +4 -0
  170. package/dist/{gitGraph-G5XIXVHT-BjTx0kww.js → gitGraph-TEB2WS4Q-DVzLmQHc.js} +2 -3
  171. package/dist/gitGraphDiagram-DS77QQ5N-CqKr-Dfg.js +766 -0
  172. package/dist/{glide-data-editor-B9K6-MJe.js → glide-data-editor-BI2i_IEE.js} +18 -18
  173. package/dist/graphlib-DMVIRZap.js +614 -0
  174. package/dist/groovy-DCjvesOy.js +4 -0
  175. package/dist/hasIn-synBnXn4.js +119 -0
  176. package/dist/haskell-C1p0D9L8.js +4 -0
  177. package/dist/haxe-q-fgv0zr.js +5 -0
  178. package/dist/{html-to-image-CZ1kLKkq.js → html-to-image-BOiFHx3u.js} +7535 -3056
  179. package/dist/idl-Bmg4bsnK.js +4 -0
  180. package/dist/{info-VBDWY6EO-CA67FznA.js → info-DKCQHKI2-BxOTqQHM.js} +2 -3
  181. package/dist/infoDiagram-6WML65LV-B869X2KY.js +37 -0
  182. package/dist/{input-C5K4VBvB.js → input-BRE2a7Ay.js} +13 -13
  183. package/dist/{_baseFor-4jw-lnCC.js → isArrayLikeObject-CBUaLibE.js} +96 -29
  184. package/dist/{isEmpty-CJJMn-QP.js → isEmpty-CgME6WRV.js} +15 -15
  185. package/dist/{isSymbol-CoUCgMCM.js → isSymbol-Ch3GYg4S.js} +1 -1
  186. package/dist/ishikawaDiagram-WSZJBQD7-BrOMFBYy.js +731 -0
  187. package/dist/javascript-BY5QZ-eN.js +4 -0
  188. package/dist/{journeyDiagram-XKPGCS4Q-DEal0aT1.js → journeyDiagram-NVQOT4AX-CTwHlsTm.js} +124 -123
  189. package/dist/{jsx-runtime-DebpN0FN.js → jsx-runtime-Dp_oQwaf.js} +1 -1
  190. package/dist/julia-DbR1YalK.js +4 -0
  191. package/dist/{kanban-definition-3W4ZIXB7-Dl90wENN.js → kanban-definition-27J2QSJJ-CKowzO9_.js} +51 -45
  192. package/dist/{katex-C4t-BmrK.js → katex-Ci33kJVq.js} +1 -1
  193. package/dist/{katex-Bld7b-fk.js → katex-Dp22h6yO.js} +2871 -3002
  194. package/dist/{label-DjoYwqmj.js → label-CMh2d8pJ.js} +6 -6
  195. package/dist/{line-C43FIPBd.js → line-Bc27KE1D.js} +3 -3
  196. package/dist/{linear-H_vsH9ao.js → linear-6pDlrp1I.js} +4 -4
  197. package/dist/livescript-BDUooIeL.js +4 -0
  198. package/dist/{loader-DX-IDS7n.js → loader-DTnbNSVZ.js} +11 -11
  199. package/dist/lua-CswAWSkH.js +4 -0
  200. package/dist/main.js +747 -752
  201. package/dist/map-BQ_Xp80D.js +137 -0
  202. package/dist/mathematica-Bw7v11B5.js +4 -0
  203. package/dist/mbox-j35IMz1j.js +4 -0
  204. package/dist/merge-CDbSrd9f.js +69 -0
  205. package/dist/mermaid-4DMBBIKO-BZSpTmcx.js +6 -0
  206. package/dist/mermaid-DpAz2sTy.js +1265 -0
  207. package/dist/mermaid-parser.core-BQzz3_BI.js +87 -0
  208. package/dist/{mhchem-EGhUZR1V.js → mhchem-BDHjke3h.js} +1 -1
  209. package/dist/{micromark-factory-space-CwHmg6iz.js → micromark-factory-space-Cr4NxAt3.js} +1 -1
  210. package/dist/{mindmap-definition-VGOIOE7T-CCDupjWW.js → mindmap-definition-FAOFIHXS-CTsi-HFj.js} +126 -80
  211. package/dist/mirc-Ba_RHVXO.js +4 -0
  212. package/dist/mllike-DbTP2dPp.js +6 -0
  213. package/dist/modelica-lpT3V1X6.js +4 -0
  214. package/dist/mscgen-BN4ZSJMx.js +6 -0
  215. package/dist/mumps-uI5g1A0g.js +4 -0
  216. package/dist/{node-sql-parser-v1Vi-Fft.js → node-sql-parser-BaLGWQe1.js} +1 -1
  217. package/dist/{now-Ch98bJO_.js → now-sFWt-GLC.js} +2 -2
  218. package/dist/{nsis-i9_sgigf.js → nsis-C68fFq_o.js} +1 -1
  219. package/dist/nsis-Df56GiRg.js +4 -0
  220. package/dist/ntriples-B3LWuG7W.js +4 -0
  221. package/dist/{number-overlay-editor-Ck_mc_gT.js → number-overlay-editor-CeBHRJvI.js} +3 -3
  222. package/dist/octave-CovfQgOx.js +4 -0
  223. package/dist/{once-B60G2fuJ.js → once-Boutk_9X.js} +1 -1
  224. package/dist/{ordinal-Bkv2-veX.js → ordinal-Bdajf2BE.js} +1 -1
  225. package/dist/oz-DQQAvVFb.js +4 -0
  226. package/dist/{packet-DYOGHKS2-Bkgofxf3.js → packet-7NZHBO7P-BG8whXXH.js} +2 -3
  227. package/dist/pascal-xz94P9sf.js +4 -0
  228. package/dist/pegDiagram-VL7TDLO6-CNpT8Sqz.js +124 -0
  229. package/dist/perl-aEWKE-1n.js +4 -0
  230. package/dist/pick-CaEWivSF.js +47 -0
  231. package/dist/{pie-VRWISCQL-B1AMhN_7.js → pie-RZYD4A2V-Cc_QhFbT.js} +2 -3
  232. package/dist/pieDiagram-7S7Q4E2Y-Ct8jRpe_.js +219 -0
  233. package/dist/pig-DB6DOZl7.js +4 -0
  234. package/dist/powershell-DM5saUx1.js +4 -0
  235. package/dist/{precisionRound-CnHPY_5v.js → precisionRound-BOoJTbDj.js} +1 -1
  236. package/dist/{process-output-bVfbcx5_.js → process-output-HrsM52f8.js} +7 -7
  237. package/dist/properties-BGjYQuGo.js +4 -0
  238. package/dist/protobuf-BPpEyPud.js +4 -0
  239. package/dist/{pug-BhE2JRSg.js → pug-DFPPZ3LA.js} +1 -1
  240. package/dist/pug-uJzB88ft.js +4 -0
  241. package/dist/puppet-oIm2d_Lg.js +4 -0
  242. package/dist/{purify.es-EnR5yhgI.js → purify.es-DR5PNXwx.js} +160 -155
  243. package/dist/python-WE57eUzD.js +4 -0
  244. package/dist/q-CR8xPodo.js +4 -0
  245. package/dist/{quadrantDiagram-AYHSOK5B-BqDB9tUC.js → quadrantDiagram-CIZ2JOQS-B5n_xFcF.js} +429 -401
  246. package/dist/r-CJdmQZNj.js +4 -0
  247. package/dist/{radar-ZZBFDIW7-C2b7A32s.js → radar-I7S5WNFK-OhUkecXA.js} +2 -3
  248. package/dist/railroad-3IZDKUUU-1CmOpo1B.js +5 -0
  249. package/dist/railroad-abnf-AHOZXSZD-DmH4lsDS.js +5 -0
  250. package/dist/railroad-ebnf-EBAXGLYW-CzK0md4e.js +5 -0
  251. package/dist/railroad-peg-LSFZ7HO6-DOklooKz.js +5 -0
  252. package/dist/railroadDiagram-AXF67PYL-BbUWbtf8.js +100 -0
  253. package/dist/{react-DA-nE2FX.js → react-DhGsCS90.js} +1 -1
  254. package/dist/{react-dom-BTJzcVJ9.js → react-dom-CmENFV8Q.js} +2 -2
  255. package/dist/{react-vega-BazDALhI.js → react-vega-zyfTF9SY.js} +8036 -4796
  256. package/dist/{requirementDiagram-UZGBJVZJ-KbVt8SPH.js → requirementDiagram-LRYGKXZP-CpoDmKSf.js} +137 -105
  257. package/dist/{reveal-component-CbOaZYQI.js → reveal-component-jN-3ZqwN.js} +27 -28
  258. package/dist/rough.esm-lGyFQ0B-.js +1363 -0
  259. package/dist/rpm-Cm5K4RH9.js +5 -0
  260. package/dist/ruby-ArsuTozQ.js +4 -0
  261. package/dist/sankeyDiagram-W5VNT64P-D82rYiAG.js +942 -0
  262. package/dist/sas-DShligrE.js +4 -0
  263. package/dist/scheme-kDLirQL7.js +4 -0
  264. package/dist/sequenceDiagram-SI44F4Z6-DgVKU1s5.js +4281 -0
  265. package/dist/shell-CVQuWP_N.js +4 -0
  266. package/dist/sieve-BW-ePwnq.js +4 -0
  267. package/dist/sizeCapture-X5ZJPWSS-BQgxHTji.js +48 -0
  268. package/dist/smalltalk-DI4aAXxY.js +4 -0
  269. package/dist/sparql-B2sp0oiz.js +4 -0
  270. package/dist/{spec-CQKL_D3i.js → spec-BL1GSUUF.js} +4 -4
  271. package/dist/{src-DV3ha_nA.js → src-BwVZVGyf.js} +13 -22
  272. package/dist/{stateDiagram-FKZM4ZOC-ByOvQf2n.js → stateDiagram-OKZ733FA-Cc9BchXz.js} +61 -58
  273. package/dist/stateDiagram-v2-UEYNNEHI-Dd4Tuw6F.js +32 -0
  274. package/dist/{step-BqHnkgWE.js → step-BqVgkWtk.js} +1 -1
  275. package/dist/stex-D2rme5UG.js +4 -0
  276. package/dist/{strings-DIy9NAmg.js → strings-DMLVGXRo.js} +305 -305
  277. package/dist/style.css +1 -1
  278. package/dist/stylus-xxO-85eO.js +4 -0
  279. package/dist/swift-Ctg533nZ.js +4 -0
  280. package/dist/swimlanes-SLNWSIFB-BHvhO5uv.js +5564 -0
  281. package/dist/swimlanesDiagram-ULZ7WXOC-aI_zgQ8O.js +33 -0
  282. package/dist/{swiper-component-CEdAYjb7.js → swiper-component-Cx0cRWLk.js} +6 -6
  283. package/dist/tcl-phm9c5Nd.js +4 -0
  284. package/dist/textile-CphjAg90.js +4 -0
  285. package/dist/{time-Bb4A7I6a.js → time-DAJu9fnj.js} +4 -4
  286. package/dist/timeline-definition-Z64GVDOM-BAHuDYyA.js +1107 -0
  287. package/dist/{timer-BpI_FKSA.js → timer-aIIabkbI.js} +1 -1
  288. package/dist/{toDate-CqhBWjvO.js → toDate-BGM7kFtQ.js} +6 -6
  289. package/dist/toml-BUuMK772.js +4 -0
  290. package/dist/{tooltip-f-qR0iUx.js → tooltip-BtUxZT5h.js} +7 -7
  291. package/dist/treeView-QDETBFTQ-DsLN_c8p.js +5 -0
  292. package/dist/{treemap-GDKQZRPO-SDux0AV8.js → treemap-6X3UGDF4-K1bi3LJm.js} +2 -3
  293. package/dist/troff-lCtc05A3.js +4 -0
  294. package/dist/ttcn-CcykzBcW.js +4 -0
  295. package/dist/ttcn-cfg-C-XYdqpE.js +4 -0
  296. package/dist/turtle-CpfVZs8G.js +4 -0
  297. package/dist/{types-DicH9Oi0.js → types-DT8UHI5w.js} +1 -1
  298. package/dist/{use-vega-container-remeasure-DGNrIQSk.js → use-vega-container-remeasure-B7OD7yUY.js} +3 -3
  299. package/dist/{useAsyncData-CYOQb1EW.js → useAsyncData-CDcbh-Qv.js} +5 -5
  300. package/dist/{useDateFormatter-Bt2qr_XS.js → useDateFormatter-B_vTzxpm.js} +4 -4
  301. package/dist/{useDeepCompareMemoize-CSHQeQEI.js → useDeepCompareMemoize-Bj6QvwiG.js} +3 -3
  302. package/dist/{useIframeCapabilities-kA09ykNq.js → useIframeCapabilities-CxuXXwjj.js} +4 -4
  303. package/dist/{useLifecycle-CMJGqBaY.js → useLifecycle-Bw4wRj_O.js} +7 -7
  304. package/dist/{useTheme-DYfby65G.js → useTheme-BzEXeAR5.js} +8 -7
  305. package/dist/vb-VOIzXwm9.js +4 -0
  306. package/dist/vbscript-D0WfcnVk.js +4 -0
  307. package/dist/{vega-component-C7nO5zcf.js → vega-component-CJug-VdR.js} +24 -24
  308. package/dist/{vega-embed-container-DAQAMjiO.js → vega-embed-container-BRjjqRGz.js} +9 -9
  309. package/dist/{vega-loader.browser-DmpxCJqx.js → vega-loader.browser-CGb-2Kwi.js} +106 -113
  310. package/dist/velocity-CCrc5n-0.js +4 -0
  311. package/dist/vennDiagram-T6HMQDX7-CTyzMewS.js +1913 -0
  312. package/dist/verilog-BLFhaDBH.js +4 -0
  313. package/dist/vhdl-DjuqPE9b.js +4 -0
  314. package/dist/wardley-OPB4EBWU-CP99MvU1.js +5 -0
  315. package/dist/wardleyDiagram-T6FBY63Y-vcno_rbk.js +669 -0
  316. package/dist/webidl-Cc7RrfeK.js +4 -0
  317. package/dist/xquery-BiCRLnNG.js +4 -0
  318. package/dist/{xychartDiagram-PRI3JC2R-BSkNxYNw.js → xychartDiagram-ELKLHX3M-DyFDERhM.js} +417 -353
  319. package/dist/yacas-CWcjav-O.js +4 -0
  320. package/dist/z80-DpYS2lE7.js +4 -0
  321. package/dist/{zod-BUcyXSdR.js → zod-BFY2SnzC.js} +42 -43
  322. package/package.json +7 -7
  323. package/src/__mocks__/requests.ts +5 -0
  324. package/src/components/ai/ai-model-dropdown.tsx +2 -2
  325. package/src/components/app-config/user-config-form.tsx +26 -0
  326. package/src/components/chat/__tests__/capabilities-popover.test.tsx +38 -0
  327. package/src/components/chat/__tests__/chat-abort.test.ts +51 -0
  328. package/src/components/chat/__tests__/use-chat-controller-id.test.tsx +39 -0
  329. package/src/components/chat/capabilities-popover.tsx +68 -0
  330. package/src/components/chat/chat-abort.ts +44 -0
  331. package/src/components/chat/chat-display.tsx +17 -0
  332. package/src/components/chat/chat-panel.tsx +107 -50
  333. package/src/components/chat/chat-utils.ts +1 -1
  334. package/src/components/chat/use-chat-controller-id.ts +24 -0
  335. package/src/components/data-table/charts/__tests__/schemas.test.ts +35 -0
  336. package/src/components/data-table/charts/schemas.ts +5 -2
  337. package/src/components/datasets/__tests__/icons.test.ts +21 -0
  338. package/src/components/datasets/icons.tsx +10 -0
  339. package/src/components/datasources/__tests__/components.test.tsx +29 -0
  340. package/src/components/datasources/components.tsx +8 -3
  341. package/src/components/editor/actions/export-dialog/__tests__/export-dialog.test.tsx +35 -0
  342. package/src/components/editor/actions/export-dialog/__tests__/state.test.ts +61 -0
  343. package/src/components/editor/actions/export-dialog/export-command.ts +4 -9
  344. package/src/components/editor/actions/export-dialog/format-notice.tsx +28 -0
  345. package/src/components/editor/actions/export-dialog/state.ts +23 -5
  346. package/src/components/editor/actions/export-dialog/use-export-dialog.ts +3 -13
  347. package/src/components/editor/actions/useConfigActions.tsx +24 -0
  348. package/src/components/editor/ai/add-cell-with-ai.tsx +2 -2
  349. package/src/components/editor/ai/ai-completion-editor.tsx +2 -2
  350. package/src/components/editor/chrome/panels/outline/__tests__/useActiveOutline.test.ts +26 -0
  351. package/src/components/editor/chrome/wrapper/useOpenAiAssistant.ts +2 -2
  352. package/src/components/editor/code/__tests__/readonly-python-code.test.tsx +114 -2
  353. package/src/core/__tests__/mode.test.ts +85 -0
  354. package/src/core/ai/__tests__/config.test.tsx +96 -0
  355. package/src/core/ai/config.ts +16 -22
  356. package/src/core/ai/constants.ts +7 -0
  357. package/src/core/ai/staged-cells.ts +3 -0
  358. package/src/core/ai/state.ts +10 -0
  359. package/src/core/codemirror/__tests__/setup.test.ts +1 -1
  360. package/src/core/codemirror/cm.ts +2 -2
  361. package/src/core/codemirror/code-lens/__tests__/extension.test.ts +85 -6
  362. package/src/core/codemirror/code-lens/extension.ts +144 -47
  363. package/src/core/codemirror/find-replace/search-highlight.ts +8 -3
  364. package/src/core/codemirror/language/languages/sql/__tests__/renderers.test.tsx +44 -0
  365. package/src/core/codemirror/language/languages/sql/renderers.tsx +3 -3
  366. package/src/core/codemirror/theme/__tests__/light.test.ts +59 -123
  367. package/src/core/codemirror/theme/dark.ts +6 -5
  368. package/src/core/codemirror/theme/light.ts +6 -4
  369. package/src/core/config/__tests__/config-schema.test.ts +2 -0
  370. package/src/core/config/config-schema.ts +1 -0
  371. package/src/core/config/feature-flag.tsx +0 -2
  372. package/src/core/dom/outline.ts +25 -2
  373. package/src/core/hotkeys/hotkeys.ts +2 -0
  374. package/src/core/mode.ts +11 -9
  375. package/src/core/network/__tests__/api.test.ts +132 -17
  376. package/src/core/network/__tests__/export-filename.test.ts +43 -0
  377. package/src/core/network/__tests__/requests-lazy.test.ts +1 -0
  378. package/src/core/network/api.ts +47 -12
  379. package/src/core/network/export-filename.ts +37 -0
  380. package/src/core/network/markdown-export.ts +19 -0
  381. package/src/core/network/requests-network.ts +29 -5
  382. package/src/core/network/types.ts +4 -0
  383. package/src/css/app/codemirror.css +11 -7
  384. package/src/css/globals.css +8 -0
  385. package/src/plugins/impl/DataEditorPlugin.tsx +2 -9
  386. package/src/plugins/impl/__tests__/DataEditorPlugin.test.ts +18 -0
  387. package/src/plugins/impl/chat/chat-ui.tsx +51 -3
  388. package/src/plugins/impl/data-frames/__tests__/schema.test.ts +30 -0
  389. package/src/plugins/impl/data-frames/schema.ts +4 -1
  390. package/src/plugins/impl/image-comparison/ImageComparisonComponent.tsx +20 -1
  391. package/src/plugins/impl/image-comparison/__tests__/ImageComparisonComponent.test.tsx +58 -0
  392. package/src/stories/theme.stories.tsx +71 -1
  393. package/dist/_baseUniq-B_2Hw7zG.js +0 -380
  394. package/dist/apl-e1B5LPEL.js +0 -4
  395. package/dist/architecture-7HQA4BMR-DHUrQjL4.js +0 -6
  396. package/dist/asciiarmor-B-gwgesP.js +0 -4
  397. package/dist/asn1-DF2ckRB4.js +0 -4
  398. package/dist/assets/__vite-browser-external-DltVXDv7.js +0 -1
  399. package/dist/blockDiagram-VD42YOAC-CIOjvxeD.js +0 -3131
  400. package/dist/brainfuck-4G-7_gq_.js +0 -4
  401. package/dist/chat-ui-DsZJj75A.js +0 -8369
  402. package/dist/chunk-55IACEB6-7h71GwyW.js +0 -8
  403. package/dist/chunk-ABZYJK2D-BxBDji1u.js +0 -2438
  404. package/dist/chunk-BNovOVIE.js +0 -28
  405. package/dist/chunk-CVBHYZKI-CwazXVlJ.js +0 -13
  406. package/dist/chunk-DR5Q36YT-5Yp2GWwR.js +0 -137
  407. package/dist/chunk-EXTU4WIE-BQPBhApE.js +0 -10
  408. package/dist/chunk-JZLCHNYA-DWIR9m5O.js +0 -4901
  409. package/dist/chunk-N4CR4FBY-Bw2HcMNc.js +0 -65
  410. package/dist/chunk-QXUST7PY-DtC2t9Mk.js +0 -498
  411. package/dist/chunk-TCCFYFTB-DPWJa9zL.js +0 -13948
  412. package/dist/chunk-TZMSLE5B-BzSHcq-K.js +0 -63
  413. package/dist/classDiagram-2ON5EDUG-BiQPjMNY.js +0 -30
  414. package/dist/classDiagram-v2-WZHVMYZB-YHdR8fqM.js +0 -30
  415. package/dist/clojure-CUybM11R.js +0 -4
  416. package/dist/clone-Q4Fqwn6q.js +0 -9
  417. package/dist/cmake-BPjGcuDL.js +0 -4
  418. package/dist/cobol-BETk_nb6.js +0 -4
  419. package/dist/coffeescript-CManZxXL.js +0 -4
  420. package/dist/commonlisp-DWkn7GW8.js +0 -4
  421. package/dist/crystal-CCbg5EUH.js +0 -4
  422. package/dist/css-By8eo-XS.js +0 -4
  423. package/dist/cypher-DwfHg3nP.js +0 -4
  424. package/dist/d-Brs1wNbw.js +0 -4
  425. package/dist/dagre-6UL2VRFP-DpYjBqQs.js +0 -296
  426. package/dist/diagram-QEK2KX5R-DVlUOgs1.js +0 -228
  427. package/dist/diff-DJIRmJ1g.js +0 -4
  428. package/dist/dist-5o9uz19x.js +0 -5
  429. package/dist/dist-BpDH0DEP.js +0 -5
  430. package/dist/dist-BpXhbQXO.js +0 -8
  431. package/dist/dist-ByadAk_L.js +0 -5
  432. package/dist/dist-CK0g7JvP.js +0 -8
  433. package/dist/dist-CfzCtiq2.js +0 -5
  434. package/dist/dist-D8JtVFrW.js +0 -8
  435. package/dist/dist-DK2Oocpu.js +0 -6
  436. package/dist/dist-DnSu977r.js +0 -5
  437. package/dist/dist-UmxJm6sW.js +0 -8
  438. package/dist/dist-aYSBQSyM.js +0 -5
  439. package/dist/dist-kkZ1Ztlh.js +0 -6
  440. package/dist/dist-ngPczwNi.js +0 -5
  441. package/dist/dist-wQRyxyTV.js +0 -5
  442. package/dist/dtd-Dyiazv4N.js +0 -4
  443. package/dist/dylan-D8Fcw7NA.js +0 -4
  444. package/dist/ecl-CjKp8Vii.js +0 -4
  445. package/dist/eiffel-K9ViOX5r.js +0 -4
  446. package/dist/elm-B5NVtRco.js +0 -4
  447. package/dist/erlang-BnLzgk7R.js +0 -4
  448. package/dist/factor-C7f9Jz5R.js +0 -4
  449. package/dist/flatten-Bbw7g6-K.js +0 -8
  450. package/dist/forth-rGM8jLao.js +0 -4
  451. package/dist/fortran-B3acSe0i.js +0 -4
  452. package/dist/ganttDiagram-JELNMOA3-CXXCN7LN.js +0 -2170
  453. package/dist/gas-Bb1Vmv_N.js +0 -4
  454. package/dist/gherkin-C9Lyidgd.js +0 -4
  455. package/dist/gitGraphDiagram-V2S2FVAM-BOlkMSqK.js +0 -652
  456. package/dist/graphlib-Ns7y5crs.js +0 -359
  457. package/dist/groovy-DQk6XcGH.js +0 -4
  458. package/dist/hasIn-Deg7jl_j.js +0 -108
  459. package/dist/haskell-mV0Vw9gv.js +0 -4
  460. package/dist/haxe-DqxN89zH.js +0 -5
  461. package/dist/idl-ya8W561J.js +0 -4
  462. package/dist/infoDiagram-HS3SLOUP-D3TyKnL_.js +0 -30
  463. package/dist/javascript-CgqgptVu.js +0 -4
  464. package/dist/julia-CFQ-HusI.js +0 -4
  465. package/dist/livescript-D__3TmDo.js +0 -4
  466. package/dist/lua-Bytcgj_W.js +0 -4
  467. package/dist/main-B1Jo_8pC.js +0 -4321
  468. package/dist/mathematica-DJhvVKvl.js +0 -4
  469. package/dist/mbox-IGHPCjfR.js +0 -4
  470. package/dist/memoize-BOtf2yFf.js +0 -17
  471. package/dist/merge-Be1CqGnU.js +0 -222
  472. package/dist/mermaid-4DMBBIKO-FXbOziy9.js +0 -6
  473. package/dist/mermaid-hv6IckVw.js +0 -1100
  474. package/dist/mermaid-parser.core-DoivvxPd.js +0 -54
  475. package/dist/min-Dtgc8txR.js +0 -38
  476. package/dist/mirc-tcwvVugm.js +0 -4
  477. package/dist/mllike-Dx91i62r.js +0 -6
  478. package/dist/modelica-_SRt-yU5.js +0 -4
  479. package/dist/mscgen-GZrGS9gt.js +0 -6
  480. package/dist/mumps-Cv3ygyod.js +0 -4
  481. package/dist/nsis-BU7GeGbI.js +0 -4
  482. package/dist/ntriples-CL-FCYXb.js +0 -4
  483. package/dist/octave-Dc6_3DIu.js +0 -4
  484. package/dist/oz-DpUAJCXf.js +0 -4
  485. package/dist/pascal-B17mncXs.js +0 -4
  486. package/dist/perl-BTpK97q9.js +0 -4
  487. package/dist/pick-D1Qo8s2C.js +0 -43
  488. package/dist/pieDiagram-ADFJNKIX-JvXG_6hk.js +0 -170
  489. package/dist/pig-CFb638Ap.js +0 -4
  490. package/dist/powershell-Cxo-_2A5.js +0 -4
  491. package/dist/properties-BPgT1xTB.js +0 -4
  492. package/dist/protobuf-BgHBaIIK.js +0 -4
  493. package/dist/pug-25-oS0SG.js +0 -4
  494. package/dist/puppet-DarIr20S.js +0 -4
  495. package/dist/python-BqmOsBsi.js +0 -4
  496. package/dist/q-D3QJCTup.js +0 -4
  497. package/dist/r-Cz_yBX4z.js +0 -4
  498. package/dist/rpm-DGOtYwAI.js +0 -5
  499. package/dist/ruby-DBZu4rPc.js +0 -4
  500. package/dist/sankeyDiagram-TZEHDZUN-DgkF38jx.js +0 -892
  501. package/dist/sas-Dd1D9qTq.js +0 -4
  502. package/dist/scheme-BmDjvTHX.js +0 -4
  503. package/dist/sequenceDiagram-WL72ISMW-BDmx9n95.js +0 -3652
  504. package/dist/shell-BL8zFSaj.js +0 -4
  505. package/dist/sieve-BAx2WqUP.js +0 -4
  506. package/dist/smalltalk-CYRzF7VV.js +0 -4
  507. package/dist/sparql-YWaDRO4A.js +0 -4
  508. package/dist/stateDiagram-v2-4FDKWEC3-C3xqeavR.js +0 -29
  509. package/dist/stex-B5O-env2.js +0 -4
  510. package/dist/stylus-lYsyLFc1.js +0 -4
  511. package/dist/swift-ClQz9z1n.js +0 -4
  512. package/dist/tcl-B3jhsfqY.js +0 -4
  513. package/dist/textile-Cb1Dw7Aq.js +0 -4
  514. package/dist/timeline-definition-IT6M3QCI-CkD_trIn.js +0 -856
  515. package/dist/toml-nHZhetdO.js +0 -4
  516. package/dist/troff-DuJAGWKH.js +0 -4
  517. package/dist/ttcn-BxrcwP21.js +0 -4
  518. package/dist/ttcn-cfg-BAg_9dcc.js +0 -4
  519. package/dist/turtle-zCq949as.js +0 -4
  520. package/dist/vb-De5hElus.js +0 -4
  521. package/dist/vbscript-Cypcpv4F.js +0 -4
  522. package/dist/velocity-Di7l-yhe.js +0 -4
  523. package/dist/verilog-Bzi-S3g2.js +0 -4
  524. package/dist/vhdl-B0ZZITaW.js +0 -4
  525. package/dist/webidl-0sviiRcN.js +0 -4
  526. package/dist/xquery-B4qMVWaB.js +0 -4
  527. package/dist/yacas-Jt25Fuv8.js +0 -4
  528. package/dist/z80-CrcbYzmp.js +0 -4
  529. /package/dist/{apl-99A7dLQe.js → apl-CMUKiT2b.js} +0 -0
  530. /package/dist/{array-O78LT16Y.js → array-CEIRxyh3.js} +0 -0
  531. /package/dist/{asciiarmor-DLEhpFDx.js → asciiarmor-C_r6K6db.js} +0 -0
  532. /package/dist/{asn1-CMrcTsT4.js → asn1-DnlnCQTu.js} +0 -0
  533. /package/dist/{asterisk-CqykImq7.js → asterisk-DaVJJDnV.js} +0 -0
  534. /package/dist/{brainfuck-ChPt5yBe.js → brainfuck-CtQoQVkV.js} +0 -0
  535. /package/dist/{clike-CE0fXfM_.js → clike-CIAs0ABt.js} +0 -0
  536. /package/dist/{clojure-QkBEMU-g.js → clojure-C6tKQYjD.js} +0 -0
  537. /package/dist/{cmake-CU1jX7Mo.js → cmake-D-nfcg14.js} +0 -0
  538. /package/dist/{cobol-DMOKzzky.js → cobol-DYTC58p9.js} +0 -0
  539. /package/dist/{coffeescript-DjnjLyfk.js → coffeescript-DctDWA58.js} +0 -0
  540. /package/dist/{colors-DmiH1bIH.js → colors-DR_aHfmQ.js} +0 -0
  541. /package/dist/{common-keywords-D3nPJNQP.js → common-keywords-FBrXPTcz.js} +0 -0
  542. /package/dist/{commonlisp-CYd9iOSe.js → commonlisp-BmvTqU5y.js} +0 -0
  543. /package/dist/{crystal-Dy55yoYG.js → crystal-BPIK2UMa.js} +0 -0
  544. /package/dist/{css-CNU8w3HJ.js → css-CDo_Lwzn.js} +0 -0
  545. /package/dist/{cypher-q47DGzK7.js → cypher-KztbD63v.js} +0 -0
  546. /package/dist/{d-jEkaLvxX.js → d-HXBWOoe9.js} +0 -0
  547. /package/dist/{defaultLocale-DoeErsX2.js → defaultLocale-DMZFeDB8.js} +0 -0
  548. /package/dist/{diff-vb2-unFN.js → diff-B9rWZH0m.js} +0 -0
  549. /package/dist/{dtd-C9kR-bXa.js → dtd-LtAMP5y8.js} +0 -0
  550. /package/dist/{duckdb-keywords-B6HYCMOT.js → duckdb-keywords-CvJhR_Yd.js} +0 -0
  551. /package/dist/{dylan-BLckrK-V.js → dylan-DXMK92pf.js} +0 -0
  552. /package/dist/{ebnf-Cnp3L9jg.js → ebnf-2D4Ctp3y.js} +0 -0
  553. /package/dist/{ecl-CEsf6XVg.js → ecl-Dqq8ser2.js} +0 -0
  554. /package/dist/{eiffel-2KGZNzx6.js → eiffel-ChExWBDx.js} +0 -0
  555. /package/dist/{elm-D2s3K5wF.js → elm-BMBz2xbZ.js} +0 -0
  556. /package/dist/{emotion-is-prop-valid.esm-DdVSF4FD.js → emotion-is-prop-valid.esm-_z-EwK5u.js} +0 -0
  557. /package/dist/{erlang-0PMFOndk.js → erlang-CGSDzg9P.js} +0 -0
  558. /package/dist/{fcl-D9nccAWI.js → fcl-Ccj8Z5Xd.js} +0 -0
  559. /package/dist/{forth-DG89iUsu.js → forth-vTkfR0aY.js} +0 -0
  560. /package/dist/{fortran-ytKsAVvu.js → fortran-CF4LAVFn.js} +0 -0
  561. /package/dist/{gas-Cg2Fm0N2.js → gas-mMFbQ2x4.js} +0 -0
  562. /package/dist/{gherkin-B87FEnZ-.js → gherkin-DLS1q0XM.js} +0 -0
  563. /package/dist/{groovy-Dcs08AWD.js → groovy-Zt6CNPxV.js} +0 -0
  564. /package/dist/{haskell-cwkOuhx6.js → haskell-kVOgzpVy.js} +0 -0
  565. /package/dist/{haxe-DWEo4q10.js → haxe-Bo21F6gc.js} +0 -0
  566. /package/dist/{http-B8jdG64J.js → http-_DVAYWoR.js} +0 -0
  567. /package/dist/{idl-WWQwDcRV.js → idl-B865GSM-.js} +0 -0
  568. /package/dist/{init-DNBbYZd_.js → init-TaqZJsBY.js} +0 -0
  569. /package/dist/{invariant-wRzNXIsJ.js → invariant-hOqqBz8A.js} +0 -0
  570. /package/dist/{javascript-BeR74dxD.js → javascript-CSLuHpxZ.js} +0 -0
  571. /package/dist/{julia-UlvCUYGL.js → julia-BCOLeQif.js} +0 -0
  572. /package/dist/{livescript-GPmFcmYV.js → livescript-DqUzLZFs.js} +0 -0
  573. /package/dist/{lua-DYoT_0zM.js → lua-D0ciLwkO.js} +0 -0
  574. /package/dist/{math-CBNc2Ib0.js → math-CTnb-N1W.js} +0 -0
  575. /package/dist/{mathematica-DSFIQlbG.js → mathematica-DujD1RDf.js} +0 -0
  576. /package/dist/{mbox-ej8lFMdL.js → mbox-8OkSQMDn.js} +0 -0
  577. /package/dist/{mirc-CAdIdvHQ.js → mirc-D47x8yRQ.js} +0 -0
  578. /package/dist/{mllike-CjTB1lHF.js → mllike-Dcfw-g6D.js} +0 -0
  579. /package/dist/{modelica-BB68FYMa.js → modelica-BHtr9gKR.js} +0 -0
  580. /package/dist/{mscgen-BkbzgGGI.js → mscgen-uZedQc_A.js} +0 -0
  581. /package/dist/{mumps-Cu-28E9F.js → mumps-Bc9QS1-K.js} +0 -0
  582. /package/dist/{nginx-C1ofKPst.js → nginx-DasThI7R.js} +0 -0
  583. /package/dist/{ntriples-D9cQiZxZ.js → ntriples-Clpn9Mrg.js} +0 -0
  584. /package/dist/{objects-De59twF-.js → objects-UzwQd5gx.js} +0 -0
  585. /package/dist/{octave-BvtAnPX0.js → octave-DA2esRWi.js} +0 -0
  586. /package/dist/{oz-COaVHk2E.js → oz-D8i-brWx.js} +0 -0
  587. /package/dist/{pascal-BFpqVD2x.js → pascal-Dt1a0CeN.js} +0 -0
  588. /package/dist/{path-DwWbhZFI.js → path-7gr7eZmp.js} +0 -0
  589. /package/dist/{perl-DaiORxHP.js → perl-CXy9EfRp.js} +0 -0
  590. /package/dist/{pig-DFzRhmsF.js → pig-DnXnrjQg.js} +0 -0
  591. /package/dist/{powershell-BG2LQNKN.js → powershell-BYE6u-Qk.js} +0 -0
  592. /package/dist/{properties-CqJJR5QY.js → properties-DlhyusaK.js} +0 -0
  593. /package/dist/{protobuf-WwDYV1yY.js → protobuf-DoMSrsPi.js} +0 -0
  594. /package/dist/{puppet-QNY3w_uN.js → puppet-DGi4idFA.js} +0 -0
  595. /package/dist/{python-4QrQ3Ugi.js → python-CYhALYh0.js} +0 -0
  596. /package/dist/{q-DhwXuxE2.js → q-Cs_qWJkU.js} +0 -0
  597. /package/dist/{r-Df-nkR25.js → r-DWJSQl1c.js} +0 -0
  598. /package/dist/{range-BOiA8qqU.js → range-Bieq5MNc.js} +0 -0
  599. /package/dist/{rpm-Cokue07s.js → rpm-DIip1m0n.js} +0 -0
  600. /package/dist/{ruby-DrYcL3qF.js → ruby-NgZGoa7Q.js} +0 -0
  601. /package/dist/{sas-CoiPirA5.js → sas-DEKzCzM2.js} +0 -0
  602. /package/dist/{scheme-CwFLjzHv.js → scheme-CBrGar2n.js} +0 -0
  603. /package/dist/{semaphore-C8rmHdhj.js → semaphore-P832H4YT.js} +0 -0
  604. /package/dist/{shell-BFV-R24I.js → shell-D7XFPOM_.js} +0 -0
  605. /package/dist/{sieve-CxwXF5T9.js → sieve-BOxOVQ18.js} +0 -0
  606. /package/dist/{simple-mode-DTaJtKPt.js → simple-mode-D-FXBgPn.js} +0 -0
  607. /package/dist/{smalltalk-QivVOCtX.js → smalltalk-DYK-HkUK.js} +0 -0
  608. /package/dist/{solr-BLvysN-c.js → solr-RZ9uTl59.js} +0 -0
  609. /package/dist/{sparql-nKsFk8j7.js → sparql-CU1uk9Py.js} +0 -0
  610. /package/dist/{spreadsheet-BWc8C2FT.js → spreadsheet-BNNUNXA2.js} +0 -0
  611. /package/dist/{sql-CWfUjlV1.js → sql-B4x8IkwU.js} +0 -0
  612. /package/dist/{stex-DtMAhV4-.js → stex-DIvyJfNO.js} +0 -0
  613. /package/dist/{stylus-BLKQAycn.js → stylus-BokZhKWB.js} +0 -0
  614. /package/dist/{swift-CJoKqiKj.js → swift-TlA42tbT.js} +0 -0
  615. /package/dist/{tcl-YTeYFNUc.js → tcl-C-m7N_9k.js} +0 -0
  616. /package/dist/{textile-C6rKQqMQ.js → textile-BWOWG894.js} +0 -0
  617. /package/dist/{tiddlywiki-ZXwTHGNT.js → tiddlywiki-DI0mF2WJ.js} +0 -0
  618. /package/dist/{tiki-C628O_u4.js → tiki-2HU6XLLn.js} +0 -0
  619. /package/dist/{toml-DxlPGbRy.js → toml-GapOS-6U.js} +0 -0
  620. /package/dist/{treemap-DY3NBr79.js → treemap-CQJ0bIDy.js} +0 -0
  621. /package/dist/{troff-DFCfH7Ku.js → troff-ChPXSGgg.js} +0 -0
  622. /package/dist/{ttcn-DAW-ERVP.js → ttcn-CGf_ktUb.js} +0 -0
  623. /package/dist/{ttcn-cfg-CpJ8b7EN.js → ttcn-cfg-E0kw_vEm.js} +0 -0
  624. /package/dist/{turtle-BneV2f8L.js → turtle-DDIYttZr.js} +0 -0
  625. /package/dist/{vb-D973Vxxh.js → vb-DsGz8YA-.js} +0 -0
  626. /package/dist/{vbscript-Dckaq3YO.js → vbscript-BfQcpKZn.js} +0 -0
  627. /package/dist/{velocity-DKty-GUC.js → velocity-BMi53hPb.js} +0 -0
  628. /package/dist/{verilog-aNaK_biA.js → verilog-B_WDxmCB.js} +0 -0
  629. /package/dist/{vhdl-CQuehnQy.js → vhdl-C52-TT0z.js} +0 -0
  630. /package/dist/{webidl-Bhg8vaMr.js → webidl-Cnphjlul.js} +0 -0
  631. /package/dist/{xquery-D2q16GaM.js → xquery-X_kWyOft.js} +0 -0
  632. /package/dist/{yacas-DHGOHnNa.js → yacas-Dpp9zAZ5.js} +0 -0
  633. /package/dist/{z80-BPhTmO22.js → z80-BZLZAthF.js} +0 -0
@@ -6,7 +6,6 @@ import { storePrompt } from "@marimo-team/codemirror-ai";
6
6
  import type { ReactCodeMirrorRef } from "@uiw/react-codemirror";
7
7
  import {
8
8
  type ChatAddToolApproveResponseFunction,
9
- DefaultChatTransport,
10
9
  type FileUIPart,
11
10
  safeValidateUIMessages,
12
11
  type TextUIPart,
@@ -37,13 +36,15 @@ import {
37
36
  SelectTrigger,
38
37
  } from "@/components/ui/select";
39
38
  import { replaceMessagesInChat } from "@/core/ai/chat-utils";
40
- import { useModelChange } from "@/core/ai/config";
39
+ import { useAIConfigActions } from "@/core/ai/config";
40
+ import { AI_SDK_UI_THROTTLE_MS } from "@/core/ai/constants";
41
41
  import { AiModelId } from "@/core/ai/ids/ids";
42
42
  import { useStagedAICellsActions } from "@/core/ai/staged-cells";
43
43
  import {
44
44
  activeChatAtom,
45
45
  type Chat,
46
46
  type ChatId,
47
+ chatOptionsAtom,
47
48
  chatStateAtom,
48
49
  pendingAiPromptAtom,
49
50
  } from "@/core/ai/state";
@@ -71,6 +72,7 @@ import {
71
72
  isContextAttachment,
72
73
  resolveChatContext,
73
74
  } from "../editor/ai/completion-utils";
75
+ import { StreamingChunkTransport } from "../editor/ai/transport/chat-transport";
74
76
  import { PanelEmptyState } from "../editor/chrome/panels/empty-state";
75
77
  import { CopyClipboardIcon } from "../icons/copy-icon";
76
78
  import { useImperativeModal } from "../modal/ImperativeModal";
@@ -83,8 +85,14 @@ import {
83
85
  FileAttachmentPill,
84
86
  SendButton,
85
87
  } from "./chat-components";
88
+ import {
89
+ describeChatAbortReason,
90
+ getAbortReasonFromChunk,
91
+ resolveChatAbortReason,
92
+ } from "./chat-abort";
86
93
  import { renderUIMessage } from "./chat-display";
87
94
  import { ChatHistoryPopover } from "./chat-history-popover";
95
+ import { CapabilitiesPopover } from "./capabilities-popover";
88
96
  import {
89
97
  type ChatMessagePart,
90
98
  convertToFileUIPart,
@@ -102,6 +110,7 @@ import {
102
110
  import { getCodes } from "@/core/codemirror/copilot/getCodes";
103
111
  import { focusInputAndMoveToEnd } from "@/core/codemirror/utils";
104
112
  import ScrollToBottomButton from "./acp/scroll-to-bottom-button";
113
+ import { useChatControllerId } from "./use-chat-controller-id";
105
114
 
106
115
  // Default mode for the AI
107
116
  const DEFAULT_MODE = "manual";
@@ -292,7 +301,7 @@ const ChatInputFooter: React.FC<ChatInputFooterProps> = memo(
292
301
  const currentModel = ai?.models?.chat_model || DEFAULT_AI_MODEL;
293
302
  const currentProvider = AiModelId.parse(currentModel).providerId;
294
303
 
295
- const { saveModeChange } = useModelChange();
304
+ const { saveModeChange } = useAIConfigActions();
296
305
 
297
306
  const modeOptions: {
298
307
  value: CopilotMode;
@@ -320,8 +329,9 @@ const ChatInputFooter: React.FC<ChatInputFooterProps> = memo(
320
329
  },
321
330
  {
322
331
  value: "code_mode",
323
- label: "Code Mode (experimental)",
324
- subtitle: "AI with access to the notebook's kernel. Use with caution.",
332
+ label: "Code Mode (beta)",
333
+ subtitle:
334
+ "AI with access to the notebook's kernel. Potentially destructive.",
325
335
  Icon: CodeIcon,
326
336
  },
327
337
  ];
@@ -335,12 +345,12 @@ const ChatInputFooter: React.FC<ChatInputFooterProps> = memo(
335
345
 
336
346
  return (
337
347
  <TooltipProvider>
338
- <div className="px-3 py-2 border-t border-border/20 flex flex-row flex-wrap items-center justify-between gap-1">
339
- <div className="flex items-center gap-2">
348
+ <div className="px-3 py-2 border-t border-border/20 flex flex-wrap items-center gap-1">
349
+ <div className="flex flex-wrap items-center gap-1">
340
350
  <Select value={currentMode} onValueChange={saveModeChange}>
341
- <SelectTrigger className="h-6 text-xs border-border shadow-none! ring-0! bg-muted hover:bg-muted/30 py-0 px-2 gap-1.5">
351
+ <SelectTrigger className="h-6 text-xs border-border shadow-none! ring-0! bg-muted hover:bg-muted/30 py-0 px-2 gap-1.5 shrink-0">
342
352
  {CurrentModeIcon && <CurrentModeIcon className="h-3 w-3" />}
343
- <span>{CurrentModeLabel}</span>
353
+ <span className="text-nowrap">{CurrentModeLabel}</span>
344
354
  </SelectTrigger>
345
355
  <SelectContent>
346
356
  <SelectGroup>
@@ -371,13 +381,14 @@ const ChatInputFooter: React.FC<ChatInputFooterProps> = memo(
371
381
  </Select>
372
382
  <AIModelDropdown
373
383
  placeholder="Model"
374
- triggerClassName="h-6 text-xs shadow-none! ring-0! bg-muted hover:bg-muted/30 rounded-sm"
384
+ triggerClassName="h-6 text-xs shadow-none! ring-0! bg-muted hover:bg-muted/30 rounded-sm max-w-[200px]"
375
385
  iconSize="small"
376
386
  showAddCustomModelDocs={true}
377
387
  forRole="chat"
378
388
  />
389
+ <CapabilitiesPopover />
379
390
  </div>
380
- <div className="flex flex-row">
391
+ <div className="flex flex-row ml-auto">
381
392
  <AddContextButton
382
393
  handleAddContext={onAddContext}
383
394
  isLoading={isLoading}
@@ -439,8 +450,8 @@ const ChatInput: React.FC<ChatInputProps> = memo(
439
450
  });
440
451
 
441
452
  return (
442
- <div className="relative shrink-0 min-h-[80px] flex flex-col border-t">
443
- <div className={cn("px-2 py-3 flex-1", inputClassName)}>
453
+ <div className="relative shrink-0 flex flex-col border-t">
454
+ <div className={cn("px-2 py-1.5", inputClassName)}>
444
455
  <PromptInput
445
456
  className="max-h-[400px]"
446
457
  inputRef={inputRef}
@@ -533,11 +544,19 @@ const ChatPanelBody = () => {
533
544
  const newMessageInputRef = useRef<ReactCodeMirrorRef>(null);
534
545
  const scrollContainerRef = useRef<HTMLDivElement>(null);
535
546
  const fileInputRef = useRef<HTMLInputElement>(null);
547
+ const lastAbortReasonRef = useRef<string | null>(null);
548
+ const [abortNotice, setAbortNotice] = useState<string | null>(null);
549
+ const clearAbortState = useEvent(() => {
550
+ lastAbortReasonRef.current = null;
551
+ setAbortNotice(null);
552
+ });
536
553
  const runtimeManager = useRuntimeManager();
537
554
  const { invokeAiTool, sendRun } = useRequestClient();
538
555
  const { openModal, closeModal } = useImperativeModal();
539
556
 
540
557
  const activeChatId = activeChat?.id;
558
+ const { chatControllerId, renewDraftChatId } =
559
+ useChatControllerId(activeChatId);
541
560
  const store = useStore();
542
561
 
543
562
  const { addStagedCell } = useStagedAICellsActions();
@@ -561,46 +580,56 @@ const ChatPanelBody = () => {
561
580
  addToolApprovalResponse,
562
581
  id: chatId,
563
582
  } = useChat({
564
- id: activeChatId,
583
+ id: chatControllerId,
584
+ throttle: AI_SDK_UI_THROTTLE_MS,
565
585
  sendAutomaticallyWhen: ({ messages }) => hasPendingToolCalls(messages),
566
586
  messages: activeChat?.messages || [], // initial messages
567
- transport: new DefaultChatTransport({
568
- api: runtimeManager.getAiURL("chat").toString(),
569
- headers: () => runtimeManager.headers(),
570
- prepareSendMessagesRequest: async (options) => {
571
- // Canary: flag outgoing messages that don't match the AI SDK's own
572
- // schema. The server-side sanitizer in `_pydantic_ai_utils.py` corrects these before validation;
573
- // this log surfaces drift early without affecting the request.
574
- const validation = await safeValidateUIMessages({
575
- messages: options.messages,
576
- });
577
- if (!validation.success) {
578
- Logger.debug(
579
- "Outgoing chat messages failed AI SDK schema validation",
580
- validation.error,
581
- );
582
- }
587
+ transport: new StreamingChunkTransport(
588
+ {
589
+ api: runtimeManager.getAiURL("chat").toString(),
590
+ headers: () => runtimeManager.headers(),
591
+ prepareSendMessagesRequest: async (options) => {
592
+ // Canary: flag outgoing messages that don't match the AI SDK's own
593
+ // schema. The server-side sanitizer in `_pydantic_ai_utils.py` corrects these before validation;
594
+ // this log surfaces drift early without affecting the request.
595
+ const validation = await safeValidateUIMessages({
596
+ messages: options.messages,
597
+ });
598
+ if (!validation.success) {
599
+ Logger.debug(
600
+ "Outgoing chat messages failed AI SDK schema validation",
601
+ validation.error,
602
+ );
603
+ }
583
604
 
584
- const completionBody = {
585
- uiMessages: options.messages,
586
- includeOtherCode: getCodes(""),
587
- };
588
-
589
- // Call this here to ensure the value is not stale
590
- const chatMode = store.get(aiAtom)?.mode || DEFAULT_MODE;
591
- const tools = FRONTEND_TOOL_REGISTRY.getToolSchemas(chatMode);
592
-
593
- return {
594
- api: runtimeManager.getAiURL("chat").toString(),
595
- body: {
596
- tools,
597
- ...options,
598
- ...completionBody,
599
- },
600
- };
605
+ const completionBody = {
606
+ uiMessages: options.messages,
607
+ includeOtherCode: getCodes(""),
608
+ options: store.get(chatOptionsAtom),
609
+ };
610
+
611
+ // Call this here to ensure the value is not stale
612
+ const chatMode = store.get(aiAtom)?.mode || DEFAULT_MODE;
613
+ const tools = FRONTEND_TOOL_REGISTRY.getToolSchemas(chatMode);
614
+
615
+ return {
616
+ api: runtimeManager.getAiURL("chat").toString(),
617
+ body: {
618
+ tools,
619
+ ...options,
620
+ ...completionBody,
621
+ },
622
+ };
623
+ },
624
+ },
625
+ (chunk) => {
626
+ const abortReason = getAbortReasonFromChunk(chunk);
627
+ if (abortReason !== undefined) {
628
+ lastAbortReasonRef.current = abortReason;
629
+ }
601
630
  },
602
- }),
603
- onFinish: ({ messages, isError, isAbort }) => {
631
+ ),
632
+ onFinish: ({ messages, isError, isAbort, finishReason }) => {
604
633
  setChatState((prev) => {
605
634
  return replaceMessagesInChat({
606
635
  chatState: prev,
@@ -608,6 +637,22 @@ const ChatPanelBody = () => {
608
637
  messages: messages,
609
638
  });
610
639
  });
640
+
641
+ if (isAbort) {
642
+ const reason = resolveChatAbortReason({
643
+ isAbort: true,
644
+ streamReason: lastAbortReasonRef.current,
645
+ });
646
+ clearAbortState();
647
+ if (reason != null) {
648
+ const description = describeChatAbortReason(reason);
649
+ Logger.debug("Chat stream aborted", { reason, finishReason });
650
+ setAbortNotice(description);
651
+ }
652
+ } else {
653
+ clearAbortState();
654
+ }
655
+
611
656
  tryFlushQueuedMessages(messages, { isError, isAbort });
612
657
  },
613
658
  onToolCall: async ({ toolCall }) => {
@@ -628,6 +673,7 @@ const ChatPanelBody = () => {
628
673
  });
629
674
 
630
675
  const sendUserMessage = useEvent((parts: ChatMessagePart[]) => {
676
+ clearAbortState();
631
677
  sendMessage({ role: "user", parts });
632
678
  });
633
679
 
@@ -701,7 +747,8 @@ const ChatPanelBody = () => {
701
747
  useEffect(() => {
702
748
  setIsScrolledToBottom(true);
703
749
  clearQueuedMessages();
704
- }, [activeChatId, clearQueuedMessages]);
750
+ clearAbortState();
751
+ }, [activeChatId, clearQueuedMessages, clearAbortState]);
705
752
 
706
753
  useEffect(() => {
707
754
  if (!isScrolledToBottom) {
@@ -772,6 +819,7 @@ const ChatPanelBody = () => {
772
819
  );
773
820
 
774
821
  const handleNewChat = useEvent(() => {
822
+ renewDraftChatId();
775
823
  setActiveChat(null);
776
824
  setInput("");
777
825
  setNewThreadInput("");
@@ -833,6 +881,7 @@ const ChatPanelBody = () => {
833
881
  );
834
882
 
835
883
  const handleReload = () => {
884
+ clearAbortState();
836
885
  regenerate();
837
886
  };
838
887
 
@@ -987,6 +1036,14 @@ const ChatPanelBody = () => {
987
1036
  </Button>
988
1037
  </div>
989
1038
  )}
1039
+
1040
+ {abortNotice && !isLoading && !error && (
1041
+ <div className="flex justify-center py-2">
1042
+ <span className="text-xs text-muted-foreground">
1043
+ {abortNotice}
1044
+ </span>
1045
+ </div>
1046
+ )}
990
1047
  </div>
991
1048
 
992
1049
  <ScrollToBottomButton
@@ -291,7 +291,7 @@ export function shouldFlushQueue(opts: {
291
291
  export function useMessageQueue() {
292
292
  const [messages, setMessages] = useState<QueuedUserMessage[]>([]);
293
293
  // Mirror the queue in a ref so `flushNext` reads the latest value even when
294
- // invoked from a callback (e.g. `onFinish`) captured on an earlier render.
294
+ // invoked from a callback (e.g. `onFinish`) in the same tick as `enqueue`.
295
295
  const messagesRef = useRef<QueuedUserMessage[]>([]);
296
296
  const hasQueuedRef = useRef(false);
297
297
  messagesRef.current = messages;
@@ -0,0 +1,24 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import { useState } from "react";
4
+ import useEvent from "react-use-event-hook";
5
+ import type { ChatId } from "@/core/ai/state";
6
+ import { generateUUID } from "@/utils/uuid";
7
+
8
+ function generateChatId(): ChatId {
9
+ return generateUUID() as ChatId;
10
+ }
11
+
12
+ /**
13
+ * Keep an ID for an unsaved chat so `useChat` can distinguish it from the
14
+ * previously active chat. Empty chats are not added to chat history.
15
+ */
16
+ export function useChatControllerId(activeChatId?: ChatId) {
17
+ const [draftChatId, setDraftChatId] = useState(generateChatId);
18
+ const renewDraftChatId = useEvent(() => setDraftChatId(generateChatId()));
19
+
20
+ return {
21
+ chatControllerId: activeChatId ?? draftChatId,
22
+ renewDraftChatId,
23
+ };
24
+ }
@@ -0,0 +1,35 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import { describe, expect, it } from "vitest";
4
+ import { ChartSchema } from "../schemas";
5
+
6
+ describe("ChartSchema", () => {
7
+ it("keeps a known axis column type", () => {
8
+ const result = ChartSchema.parse({
9
+ general: { xColumn: { field: "count", type: "integer" } },
10
+ });
11
+
12
+ expect(result.general?.xColumn?.type).toBe("integer");
13
+ });
14
+
15
+ it("normalizes an unrecognized axis column type", () => {
16
+ const result = ChartSchema.parse({
17
+ general: { xColumn: { field: "geom", type: "geometry" } },
18
+ });
19
+
20
+ expect(result.general?.xColumn?.type).toBe("unknown");
21
+ });
22
+
23
+ it("normalizes an unrecognized tooltip field type", () => {
24
+ const result = ChartSchema.parse({
25
+ tooltips: {
26
+ auto: false,
27
+ fields: [{ field: "geom", type: "geometry" }],
28
+ },
29
+ });
30
+
31
+ expect(result.tooltips?.fields).toEqual([
32
+ { field: "geom", type: "unknown" },
33
+ ]);
34
+ });
35
+ });
@@ -28,7 +28,10 @@ export const BinSchema = z.object({
28
28
 
29
29
  const BaseColumnSchema = z.object({
30
30
  field: z.string().optional(),
31
- type: z.enum([...DATA_TYPES, EMPTY_VALUE]).optional(),
31
+ type: z
32
+ .enum([...DATA_TYPES, EMPTY_VALUE])
33
+ .catch("unknown")
34
+ .optional(),
32
35
  selectedDataType: z.enum([...SELECTABLE_DATA_TYPES, EMPTY_VALUE]).optional(),
33
36
  sort: z.enum(SORT_TYPES).default("ascending").optional(),
34
37
  timeUnit: z.enum(TIME_UNITS).optional(),
@@ -102,7 +105,7 @@ export const ChartSchema = z.object({
102
105
  fields: z.array(
103
106
  z.object({
104
107
  field: z.string(),
105
- type: z.enum(DATA_TYPES),
108
+ type: z.enum(DATA_TYPES).catch("unknown"),
106
109
  }),
107
110
  ),
108
111
  })
@@ -0,0 +1,21 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import { describe, expect, it } from "vitest";
4
+ import type { DataType } from "@/core/kernel/messages";
5
+ import { DATA_TYPE_ICON, resolveDataType } from "../icons";
6
+
7
+ describe("resolveDataType", () => {
8
+ it("passes through every mapped data type", () => {
9
+ for (const dataType of Object.keys(DATA_TYPE_ICON)) {
10
+ expect(resolveDataType(dataType as DataType)).toBe(dataType);
11
+ }
12
+ });
13
+
14
+ it("resolves unmapped data types to unknown", () => {
15
+ expect(resolveDataType("geometry" as DataType)).toBe("unknown");
16
+ });
17
+
18
+ it("resolves data types shadowing Object.prototype keys to unknown", () => {
19
+ expect(resolveDataType("toString" as DataType)).toBe("unknown");
20
+ });
21
+ });
@@ -30,6 +30,16 @@ export const DATA_TYPE_ICON: Record<DataType | SelectableDataType, LucideIcon> =
30
30
  unknown: CurlyBracesIcon,
31
31
  };
32
32
 
33
+ /**
34
+ * A newer backend can send a data type this frontend does not know. Resolve
35
+ * those to `unknown` before indexing icon or color maps.
36
+ */
37
+ export function resolveDataType(
38
+ dataType: DataType | SelectableDataType,
39
+ ): DataType | SelectableDataType {
40
+ return Object.hasOwn(DATA_TYPE_ICON, dataType) ? dataType : "unknown";
41
+ }
42
+
33
43
  export function getDataTypeColor(
34
44
  dataType: DataType | SelectableDataType,
35
45
  ): string {
@@ -0,0 +1,29 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import { render } from "@testing-library/react";
4
+ import { describe, expect, it, vi } from "vitest";
5
+ import type { DataType } from "@/core/kernel/messages";
6
+ import { Logger } from "@/utils/Logger";
7
+ import { ColumnName } from "../components";
8
+
9
+ describe("ColumnName", () => {
10
+ it("renders the unknown icon for unrecognized data types", () => {
11
+ const warn = vi.spyOn(Logger, "warn").mockImplementation(() => {});
12
+
13
+ try {
14
+ const unrecognized = render(
15
+ <ColumnName columnName="geom" dataType={"geometry" as DataType} />,
16
+ );
17
+ const unknown = render(
18
+ <ColumnName columnName="geom" dataType="unknown" />,
19
+ );
20
+
21
+ expect(unrecognized.container.innerHTML).toEqual(
22
+ unknown.container.innerHTML,
23
+ );
24
+ expect(warn).not.toHaveBeenCalled();
25
+ } finally {
26
+ warn.mockRestore();
27
+ }
28
+ });
29
+ });
@@ -5,7 +5,11 @@ import type { CSSProperties } from "react";
5
5
  import { TreeChevron } from "@/components/editor/file-tree/tree-actions";
6
6
  import type { DataType } from "@/core/kernel/messages";
7
7
  import { cn } from "@/utils/cn";
8
- import { DATA_TYPE_ICON, getDataTypeColor } from "../datasets/icons";
8
+ import {
9
+ DATA_TYPE_ICON,
10
+ getDataTypeColor,
11
+ resolveDataType,
12
+ } from "../datasets/icons";
9
13
 
10
14
  export const RotatingChevron: React.FC<{ isExpanded: boolean }> = ({
11
15
  isExpanded,
@@ -101,8 +105,9 @@ export const ColumnName = ({
101
105
  columnName: React.ReactNode;
102
106
  dataType: DataType;
103
107
  }) => {
104
- const Icon = DATA_TYPE_ICON[dataType];
105
- const color = getDataTypeColor(dataType);
108
+ const resolvedDataType = resolveDataType(dataType);
109
+ const Icon = DATA_TYPE_ICON[resolvedDataType];
110
+ const color = getDataTypeColor(resolvedDataType);
106
111
 
107
112
  return (
108
113
  <div className="flex flex-row items-center gap-1.5">
@@ -259,6 +259,7 @@ describe("ExportDialog", () => {
259
259
  format: "pdf",
260
260
  dependenciesAvailable: false,
261
261
  missingPackages: ["nbconvert[webpdf]"],
262
+ missingSetup: [],
262
263
  },
263
264
  ],
264
265
  }),
@@ -275,6 +276,40 @@ describe("ExportDialog", () => {
275
276
  expect(screen.getByTestId("export-format-pdf")).toBeVisible();
276
277
  });
277
278
 
279
+ it("explains missing Playwright Chromium setup", async () => {
280
+ store.set(
281
+ requestClientAtom,
282
+ MockRequestClient.create({
283
+ getExportAvailability: vi.fn().mockResolvedValue({
284
+ source: "server",
285
+ formats: [
286
+ {
287
+ format: "pdf",
288
+ dependenciesAvailable: false,
289
+ missingPackages: [],
290
+ missingSetup: [
291
+ {
292
+ name: "playwright-chromium",
293
+ command: "uv run playwright install chromium",
294
+ },
295
+ ],
296
+ },
297
+ ],
298
+ }),
299
+ }),
300
+ );
301
+
302
+ renderDialog("pdf");
303
+
304
+ expect(
305
+ await screen.findByText("PDF export requires Playwright Chromium."),
306
+ ).toBeVisible();
307
+ expect(
308
+ screen.getByText("uv run playwright install chromium"),
309
+ ).toBeVisible();
310
+ expect(screen.getByTestId("export-submit")).toBeDisabled();
311
+ });
312
+
278
313
  it("announces requirement checks as status updates", () => {
279
314
  store.set(
280
315
  requestClientAtom,
@@ -19,11 +19,13 @@ const AVAILABLE: ExportAvailabilityResponse = {
19
19
  format: "ipynb",
20
20
  dependenciesAvailable: true,
21
21
  missingPackages: [],
22
+ missingSetup: [],
22
23
  },
23
24
  {
24
25
  format: "pdf",
25
26
  dependenciesAvailable: true,
26
27
  missingPackages: [],
28
+ missingSetup: [],
27
29
  },
28
30
  ],
29
31
  };
@@ -188,6 +190,7 @@ describe("getExportFormatStatus", () => {
188
190
  format: "pdf",
189
191
  dependenciesAvailable: false,
190
192
  missingPackages: ["nbconvert[webpdf]"],
193
+ missingSetup: [],
191
194
  },
192
195
  ],
193
196
  },
@@ -202,6 +205,64 @@ describe("getExportFormatStatus", () => {
202
205
  });
203
206
  });
204
207
 
208
+ it("reports missing server setup", () => {
209
+ expect(
210
+ status("pdf", {
211
+ availability: {
212
+ status: "success",
213
+ data: {
214
+ source: "server",
215
+ formats: [
216
+ {
217
+ format: "pdf",
218
+ dependenciesAvailable: false,
219
+ missingPackages: [],
220
+ missingSetup: [
221
+ {
222
+ name: "playwright-chromium",
223
+ command: "uv run playwright install chromium",
224
+ },
225
+ ],
226
+ },
227
+ ],
228
+ },
229
+ },
230
+ }),
231
+ ).toEqual({
232
+ available: false,
233
+ reason: {
234
+ type: "missing-setup",
235
+ requirements: [
236
+ {
237
+ name: "playwright-chromium",
238
+ command: "uv run playwright install chromium",
239
+ },
240
+ ],
241
+ },
242
+ });
243
+ });
244
+
245
+ it("fails open when an unavailable format has no requirements", () => {
246
+ expect(
247
+ status("pdf", {
248
+ availability: {
249
+ status: "success",
250
+ data: {
251
+ source: "server",
252
+ formats: [
253
+ {
254
+ format: "pdf",
255
+ dependenciesAvailable: false,
256
+ missingPackages: [],
257
+ missingSetup: [],
258
+ },
259
+ ],
260
+ },
261
+ },
262
+ }),
263
+ ).toEqual({ available: true, availabilityCheckFailed: true });
264
+ });
265
+
205
266
  it.each([
206
267
  ["html", true, undefined],
207
268
  ["markdown", true, undefined],
@@ -1,18 +1,13 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
+ import {
4
+ MARKDOWN_EXTENSIONS,
5
+ MARKDOWN_SUFFIXES,
6
+ } from "@/core/network/markdown-export";
3
7
  import { Filenames } from "@/utils/filenames";
4
8
  import { shellQuote } from "@/utils/shell";
5
9
  import type { ExportFormat, ExportOptions, MarkdownFlavor } from "./state";
6
10
 
7
- const MARKDOWN_EXTENSIONS: Record<MarkdownFlavor, string> = {
8
- pymdown: "md",
9
- qmd: "qmd",
10
- mystmd: "myst.md",
11
- mdx: "mdx",
12
- };
13
-
14
- const MARKDOWN_SUFFIXES = [".myst.md", ".markdown", ".qmd", ".mdx", ".md"];
15
-
16
11
  function inferMarkdownFlavor(filename: string): MarkdownFlavor {
17
12
  if (filename.endsWith(".myst.md")) {
18
13
  return "mystmd";