@marimo-team/frontend 0.16.4 → 0.16.5

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 (408) hide show
  1. package/dist/assets/{CellStatus-CEVFBnyt.js → CellStatus-BJRDATxe.js} +1 -1
  2. package/dist/assets/{ConnectedDataExplorerComponent-5izWKQVQ.js → ConnectedDataExplorerComponent-Cs4pQOKx.js} +1 -1
  3. package/dist/assets/{ImperativeModal-DujtmdOO.js → ImperativeModal-BG5LTpV0.js} +1 -1
  4. package/dist/assets/{JsonOutput-E2xVojk5.js → JsonOutput-BID8Oos7.js} +1 -1
  5. package/dist/assets/{LazyAnyLanguageCodeMirror-DHH4zj72.js → LazyAnyLanguageCodeMirror-RkzkO2YV.js} +2 -2
  6. package/dist/assets/MarimoErrorOutput-Lft73Wnl.js +6 -0
  7. package/dist/assets/{RenderHTML-BCi_V67U.js → RenderHTML-BoDLdBq-.js} +1 -1
  8. package/dist/assets/{VisuallyHidden-DvpnK2wO.js → VisuallyHidden-BiHw-PIc.js} +1 -1
  9. package/dist/assets/{accordion-C3CAEPwC.js → accordion-A41ffd5P.js} +1 -1
  10. package/dist/assets/{activity-BCW0BU81.js → activity-BhLNCNHF.js} +1 -1
  11. package/dist/assets/add-cell-with-ai-CxM_YKzf.js +36 -0
  12. package/dist/assets/{add-database-form-DSnHGqMe.js → add-database-form-Br1fMkMI.js} +1 -1
  13. package/dist/assets/{add-missing-import-Cwedhjm5.js → add-missing-import-CfRgNApn.js} +1 -1
  14. package/dist/assets/agent-panel-7ocujO8C.js +287 -0
  15. package/dist/assets/ai-model-dropdown-DSUVFIso.js +2 -0
  16. package/dist/assets/{alert-dialog-M1dUQe7C.js → alert-dialog-BO8sf-73.js} +1 -1
  17. package/dist/assets/{ansi_up-ZmFuCItK.js → ansi_up-D_b0GS7N.js} +1 -1
  18. package/dist/assets/{any-language-editor-BqGBgxZE.js → any-language-editor-edee1A1P.js} +1 -1
  19. package/dist/assets/app-config-button-Bg_CEfls.js +1 -0
  20. package/dist/assets/{architecture-O4VJ6CD3-CbkBEQri.js → architecture-O4VJ6CD3-CIYFBxkI.js} +1 -1
  21. package/dist/assets/{architectureDiagram-W76B3OCA-di95lJcF.js → architectureDiagram-W76B3OCA-CXqAkVTy.js} +1 -1
  22. package/dist/assets/{arrow-left-DQ-94PlS.js → arrow-left-D97p491f.js} +1 -1
  23. package/dist/assets/{between-horizontal-start-CotWLlFt.js → between-horizontal-start-DWTOsiF_.js} +1 -1
  24. package/dist/assets/{blockDiagram-QIGZ2CNN-ClcJSQFf.js → blockDiagram-QIGZ2CNN-DhYrUig_.js} +1 -1
  25. package/dist/assets/{c4Diagram-FPNF74CW-Cq2vxSdy.js → c4Diagram-FPNF74CW-Bj1S_Fyy.js} +1 -1
  26. package/dist/assets/{cell-actions-C5S4W3g_.js → cell-actions-hNx4EMmZ.js} +1 -1
  27. package/dist/assets/{cell-editor-X6EY7GQl.js → cell-editor-JimG_bBz.js} +13 -13
  28. package/dist/assets/cell-link-_kF38gGF.js +1 -0
  29. package/dist/assets/{cells-B4cnsYe_.js → cells-Dd1FatlG.js} +54 -54
  30. package/dist/assets/channel-Bil_pUlM.js +1 -0
  31. package/dist/assets/{chart-no-axes-column-DrG7h8mS.js → chart-no-axes-column-DmR44Tbq.js} +1 -1
  32. package/dist/assets/{chat-components-DXkntpg4.js → chat-components-OoNU4tLf.js} +3 -3
  33. package/dist/assets/chat-panel-DatwRFif.js +3 -0
  34. package/dist/assets/check-C5PVLNkJ.js +1 -0
  35. package/dist/assets/{chevron-right-Caf5yL5B.js → chevron-right-BDEhimQq.js} +1 -1
  36. package/dist/assets/{chunk-3AY6CYHV-BFFUJATX.js → chunk-3AY6CYHV-CBq2x1Nc.js} +1 -1
  37. package/dist/assets/{chunk-4KMFLZZN-D8J8fzqf.js → chunk-4KMFLZZN-DEMg9QYp.js} +1 -1
  38. package/dist/assets/{chunk-6OXUPJBA-Clo7-gS4.js → chunk-6OXUPJBA-CjFdZBrY.js} +2 -2
  39. package/dist/assets/{chunk-ABZYJK2D-DjRcbxmx.js → chunk-ABZYJK2D-eZsthrBr.js} +1 -1
  40. package/dist/assets/{chunk-BN7GFLIU-DvomLhVN.js → chunk-BN7GFLIU-ez-vZ7uD.js} +1 -1
  41. package/dist/assets/{chunk-CXMOBAN2-GhUPxuLT.js → chunk-CXMOBAN2-DxbPW6zT.js} +1 -1
  42. package/dist/assets/{chunk-EXTU4WIE-97Zvkznr.js → chunk-EXTU4WIE-C8Y_P6y8.js} +1 -1
  43. package/dist/assets/{chunk-JA3XYJ7Z-Mvfz9vG6.js → chunk-JA3XYJ7Z-pR89xWsn.js} +1 -1
  44. package/dist/assets/{chunk-JEIROHC2-Cp1tR_z8.js → chunk-JEIROHC2-2-ucCTVJ.js} +1 -1
  45. package/dist/assets/{chunk-K7UQS3LO-BbFs0Y5e.js → chunk-K7UQS3LO-Bz3bjON2.js} +1 -1
  46. package/dist/assets/{chunk-KMC2YHZD-Buiqyl2g.js → chunk-KMC2YHZD-BvMr39QE.js} +1 -1
  47. package/dist/assets/{chunk-QN33PNHL-dhs223oU.js → chunk-QN33PNHL-DgF0LOHR.js} +1 -1
  48. package/dist/assets/{chunk-QYVHNE3D-DA_jYaIp.js → chunk-QYVHNE3D-BxN3DJBX.js} +1 -1
  49. package/dist/assets/{chunk-S3R3BYOJ-DO68jEIo.js → chunk-S3R3BYOJ-Dy72CLbv.js} +1 -1
  50. package/dist/assets/{chunk-T44TD3VJ-Ww2OhwR5.js → chunk-T44TD3VJ-BfMjD4hS.js} +1 -1
  51. package/dist/assets/{chunk-TVAH2DTR-j2EljfwG.js → chunk-TVAH2DTR-CKnRAcjo.js} +1 -1
  52. package/dist/assets/{chunk-TZMSLE5B-DYFKU4Pb.js → chunk-TZMSLE5B-DdgcuCwZ.js} +1 -1
  53. package/dist/assets/{chunk-WFRQ32O7-k2LaZwie.js → chunk-WFRQ32O7-CHVQx4E8.js} +1 -1
  54. package/dist/assets/{chunk-WFWHJNB7-h5yM_3qQ.js → chunk-WFWHJNB7-B095GDsj.js} +1 -1
  55. package/dist/assets/{chunk-XRWGC2XP-C9Mh6qts.js → chunk-XRWGC2XP-C9u0mhR4.js} +1 -1
  56. package/dist/assets/{circle-play-Cktn64O2.js → circle-play-BnvyuDgL.js} +1 -1
  57. package/dist/assets/{circle-plus-CR5IX63e.js → circle-plus-CfdbDkkn.js} +1 -1
  58. package/dist/assets/{circle-x-t3DIkXqJ.js → circle-x-BsVcxKkV.js} +1 -1
  59. package/dist/assets/classDiagram-KNZD7YFC-CjqRV-TB.js +1 -0
  60. package/dist/assets/classDiagram-v2-RKCZMP56-CGekJfCg.js +1 -0
  61. package/dist/assets/client-RNr6mM1Y.js +2 -0
  62. package/dist/assets/{clipboard-paste-CCXUHJEo.js → clipboard-paste-CYFMW3x7.js} +1 -1
  63. package/dist/assets/column-preview-2H8pwalb.js +2 -0
  64. package/dist/assets/{columns-BBxos2iF.js → columns-qXe5bccO.js} +7 -7
  65. package/dist/assets/{command-CMralWVx.js → command-BZVf1cJP.js} +1 -1
  66. package/dist/assets/command-palette-CYMxp9xF.js +1 -0
  67. package/dist/assets/{common-CGhyb0HV.js → common-DW3bNKWY.js} +1 -1
  68. package/dist/assets/{config-DiCy6eC0.js → config-DXGmIv9f.js} +1 -1
  69. package/dist/assets/{copy-DAVB02c8.js → copy-6mpL4BeI.js} +1 -1
  70. package/dist/assets/{copy-icon-GGPHJWJ0.js → copy-icon-6ICckC-p.js} +1 -1
  71. package/dist/assets/{dagre-5GWH7T2D-B1wEBSrx.js → dagre-5GWH7T2D-hVCok2au.js} +1 -1
  72. package/dist/assets/{data-grid-overlay-editor-Drp4I0tg.js → data-grid-overlay-editor-BwcAr1JM.js} +1 -1
  73. package/dist/assets/datasources-panel-BvrtAadm.js +1 -0
  74. package/dist/assets/{dates-grtSI02N.js → dates-Au76svwW.js} +1 -1
  75. package/dist/assets/dependency-graph-panel-F9AD_whb.js +4 -0
  76. package/dist/assets/{diagram-N5W7TBWH-D0MGIq61.js → diagram-N5W7TBWH-C26XpepA.js} +1 -1
  77. package/dist/assets/{diagram-QEK2KX5R-DU6geLeA.js → diagram-QEK2KX5R-yrTR8I_L.js} +1 -1
  78. package/dist/assets/{diagram-S2PKOQOG-BNhY4Z1-.js → diagram-S2PKOQOG-BnrvSrEb.js} +1 -1
  79. package/dist/assets/{dialog-B7icy1Vb.js → dialog-CR68_CUl.js} +1 -1
  80. package/dist/assets/{dist-BNjtn4W8.js → dist--01dzFeG.js} +1 -1
  81. package/dist/assets/{dist-BagyUivg.js → dist--UHY1FN-.js} +1 -1
  82. package/dist/assets/{dist-5Gm6w_15.js → dist-6vTAXnMq.js} +1 -1
  83. package/dist/assets/{dist-DTazGMur.js → dist-B6CCfKkp.js} +1 -1
  84. package/dist/assets/dist-BAqgWgpM.js +1 -0
  85. package/dist/assets/{dist-BaApG_tl.js → dist-BUe_o-3o.js} +1 -1
  86. package/dist/assets/{dist-BpAb8rGb.js → dist-BnTbfmCK.js} +1 -1
  87. package/dist/assets/dist-C-4GTx-T.js +1 -0
  88. package/dist/assets/{dist-C0ek66tJ.js → dist-C1lnVyyK.js} +1 -1
  89. package/dist/assets/{dist-DGiVfc7V.js → dist-CbsJnssA.js} +1 -1
  90. package/dist/assets/{dist-DV-8bxFo.js → dist-CjoeBoZ9.js} +1 -1
  91. package/dist/assets/{dist-D5QvSsL_.js → dist-CsC8ZokE.js} +1 -1
  92. package/dist/assets/{dist-C69eWtaQ.js → dist-CyqTsfyg.js} +1 -1
  93. package/dist/assets/dist-D-ZYdf69.js +1 -0
  94. package/dist/assets/dist-D3B_GqVR.js +1 -0
  95. package/dist/assets/{dist-BME02X12.js → dist-DFJwMM7Z.js} +1 -1
  96. package/dist/assets/dist-Db9UVaw9.js +1 -0
  97. package/dist/assets/{dist-BPr57Wxb.js → dist-DhXqYYeD.js} +1 -1
  98. package/dist/assets/{dist-CL0hPMY6.js → dist-Dm8m1boP.js} +1 -1
  99. package/dist/assets/{dist-B0vg88Aq.js → dist-DvDyxv8b.js} +1 -1
  100. package/dist/assets/{dist-Bzn1Zd0x.js → dist-DzUKODTF.js} +1 -1
  101. package/dist/assets/dist-LmEq3o4w.js +1 -0
  102. package/dist/assets/dist-Z_cK0cSh.js +1 -0
  103. package/dist/assets/dist-biP83Yvc.js +1 -0
  104. package/dist/assets/dist-dJ4FqqTe.js +1 -0
  105. package/dist/assets/{documentation-panel-D4iq1tSm.js → documentation-panel-DYKAf6Sg.js} +1 -1
  106. package/dist/assets/{dom-4KyFHEbl.js → dom-CT3dAMQW.js} +1 -1
  107. package/dist/assets/{download-C4Fyu6kU.js → download-B4_BX7gi.js} +1 -1
  108. package/dist/assets/{download-qt61TbgC.js → download-BB5Iexmn.js} +1 -1
  109. package/dist/assets/{dropdown-menu-Bp1vhqcS.js → dropdown-menu-CJDB1PNI.js} +1 -1
  110. package/dist/assets/edit-page-BK3Irdme.js +12 -0
  111. package/dist/assets/{ellipsis-DVXWk8Lc.js → ellipsis-CJtiw1k3.js} +1 -1
  112. package/dist/assets/{ellipsis-vertical-DfpheMuY.js → ellipsis-vertical-DK--y082.js} +1 -1
  113. package/dist/assets/{en-US-B2g9dciI.js → en-US-CjWuOpsV.js} +1 -1
  114. package/dist/assets/{erDiagram-AWTI2OKA-DxxWZrYD.js → erDiagram-AWTI2OKA-9EqwLrlG.js} +1 -1
  115. package/dist/assets/{error-banner-ARu6PiHL.js → error-banner-BGjnZePp.js} +1 -1
  116. package/dist/assets/error-panel-CrkbkIF_.js +1 -0
  117. package/dist/assets/{es-C0Ih1AxE.js → es-C-CWIA-E.js} +1 -1
  118. package/dist/assets/{esm-BR7TuyMc.js → esm-7XxuulnL.js} +1 -1
  119. package/dist/assets/{esm-Cb-iIF_w.js → esm-B39og2OG.js} +1 -1
  120. package/dist/assets/{esm-BIF8NHm8.js → esm-BBn_y9Ew.js} +1 -1
  121. package/dist/assets/esm-DjUQOOJ2.js +1 -0
  122. package/dist/assets/{eye-off-BEVibdMQ.js → eye-off-9UMe_Y7D.js} +1 -1
  123. package/dist/assets/field-D6g5A_wf.js +1 -0
  124. package/dist/assets/{file-DqkkCGhs.js → file-BENStGHx.js} +1 -1
  125. package/dist/assets/file-explorer-panel-Cgv3WjVh.js +1 -0
  126. package/dist/assets/{file-plus-2-BCmZgbYs.js → file-plus-2-CloHhbsF.js} +1 -1
  127. package/dist/assets/{file-text-DNmaotaP.js → file-text-Lr1kJd4E.js} +1 -1
  128. package/dist/assets/{file-video-camera-C5lALvNf.js → file-video-camera-CfnyBQQe.js} +1 -1
  129. package/dist/assets/filename-B5Yo1bOu.js +1 -0
  130. package/dist/assets/{floating-outline-Cjas_exC.js → floating-outline-DZnSnZfg.js} +1 -1
  131. package/dist/assets/{flowDiagram-PVAE7QVJ-DlTZtqcN.js → flowDiagram-PVAE7QVJ-iOj6Qgu-.js} +1 -1
  132. package/dist/assets/{focus-OWoLlKnm.js → focus-Bnk25hTp.js} +1 -1
  133. package/dist/assets/{form-xOqp67zT.js → form-BGZvwlog.js} +1 -1
  134. package/dist/assets/{form--nX5W3gQ.js → form-DyKYT1WR.js} +1 -1
  135. package/dist/assets/{formats-C8bbggqj.js → formats-CWdWXhfT.js} +1 -1
  136. package/dist/assets/{fullscreen-BFmvQx5m.js → fullscreen-DTPr3iBY.js} +1 -1
  137. package/dist/assets/{ganttDiagram-OWAHRB6G-BEPmawB5.js → ganttDiagram-OWAHRB6G-BWbXeAXa.js} +1 -1
  138. package/dist/assets/{gitGraph-ZV4HHKMB-DsmmnKI3.js → gitGraph-ZV4HHKMB-BpeeuO4L.js} +1 -1
  139. package/dist/assets/{gitGraphDiagram-NY62KEGX-DfTKmX9v.js → gitGraphDiagram-NY62KEGX-BX3O-mzY.js} +1 -1
  140. package/dist/assets/{glide-data-editor-CzDe-oK3.js → glide-data-editor-C45ArX7n.js} +4 -4
  141. package/dist/assets/globals-BFoVgbHf.js +1 -0
  142. package/dist/assets/{globe-CgG1jfYF.js → globe-CPrVx8HM.js} +1 -1
  143. package/dist/assets/home-page-DhT6cm6c.js +4 -0
  144. package/dist/assets/{image-DXGqie4b.js → image-DTv0Ic6H.js} +1 -1
  145. package/dist/assets/{index-DtggTI4O.js → index-29P5xX8u.js} +11 -11
  146. package/dist/assets/index-Optxbl37.css +2 -0
  147. package/dist/assets/{info-63CPKGFF-BVRAJzgS.js → info-63CPKGFF-Czr08O9A.js} +1 -1
  148. package/dist/assets/{infoDiagram-STP46IZ2-CcEqfhrj.js → infoDiagram-STP46IZ2-C1JX9JfB.js} +1 -1
  149. package/dist/assets/input-C1RzjWSK.js +7 -0
  150. package/dist/assets/{isValid-gOtpcPxn.js → isValid-o3nZVu8e.js} +1 -1
  151. package/dist/assets/{journeyDiagram-BIP6EPQ6-CfxDuLls.js → journeyDiagram-BIP6EPQ6-CC2JvTQD.js} +1 -1
  152. package/dist/assets/{kanban-definition-6OIFK2YF-BwopERfW.js → kanban-definition-6OIFK2YF-3qAhCi66.js} +1 -1
  153. package/dist/assets/{key-BuxNhFKW.js → key-D4QiH_7H.js} +1 -1
  154. package/dist/assets/{kiosk-mode--OX2RHZj.js → kiosk-mode-Dy2WnuWt.js} +1 -1
  155. package/dist/assets/{label-COeaBwl_.js → label-BEUjZsdo.js} +1 -1
  156. package/dist/assets/{layout-CKoMTVJt.js → layout-C6K0XXFK.js} +3 -3
  157. package/dist/assets/{linear-BI0LBATm.js → linear-nWRf49aw.js} +1 -1
  158. package/dist/assets/{link-DSY8ADga.js → link-CDOxp9sn.js} +1 -1
  159. package/dist/assets/links-D-L0rzz9.js +1 -0
  160. package/dist/assets/{list-filter-D2Wx3thV.js → list-filter-CRC72QPW.js} +1 -1
  161. package/dist/assets/{loader-CPDA0quD.js → loader-CgbiPC_T.js} +1 -1
  162. package/dist/assets/logs-panel-BB-6orqg.js +1 -0
  163. package/dist/assets/{maps-CxCIYhRT.js → maps-DaQbs_UR.js} +1 -1
  164. package/dist/assets/{menu-items-COILZQ4q.js → menu-items-Bo6Dyd_Q.js} +1 -1
  165. package/dist/assets/{mermaid-oqJ6vLFm.js → mermaid-Bqzxmx0C.js} +1 -1
  166. package/dist/assets/{mermaid-parser.core-8414a7OP.js → mermaid-parser.core-CwRCqiGJ.js} +2 -2
  167. package/dist/assets/{mermaid.core-CKfX2q8j.js → mermaid.core-C4o4vdkw.js} +3 -3
  168. package/dist/assets/mermaid.core-DjncFP_O.js +1 -0
  169. package/dist/assets/{mindmap-definition-Q6HEUPPD-nadsjaMC.js → mindmap-definition-Q6HEUPPD-pLcSm-bI.js} +1 -1
  170. package/dist/assets/{mode-CBh2Ag_Y.js → mode-DQPKc-Hp.js} +1 -1
  171. package/dist/assets/{name-cell-input-CAG50xh2.js → name-cell-input-DQd65hJw.js} +1 -1
  172. package/dist/assets/{number-overlay-editor-CbWBjwI1.js → number-overlay-editor-Ce_FEpnn.js} +1 -1
  173. package/dist/assets/once-8ZDiGGtA.js +1 -0
  174. package/dist/assets/outline-panel-BJDiYH61.js +1 -0
  175. package/dist/assets/packages-panel-D_VswrEd.js +1 -0
  176. package/dist/assets/{packet-HUATNLJX-BJ_b_gYi.js → packet-HUATNLJX-C5NsAS_7.js} +1 -1
  177. package/dist/assets/{pie-WTHONI2E-CS2JfH5S.js → pie-WTHONI2E-BCNGQ0_9.js} +1 -1
  178. package/dist/assets/{pieDiagram-ADFJNKIX-DP_lAtPz.js → pieDiagram-ADFJNKIX-CUCBn1VN.js} +1 -1
  179. package/dist/assets/plug-DrNpofTj.js +1 -0
  180. package/dist/assets/{plus-C1zexBxS.js → plus-d2HNOuZI.js} +1 -1
  181. package/dist/assets/{popover-CLp_lH16.js → popover-DW0D4l0O.js} +1 -1
  182. package/dist/assets/{precisionRound-CR2cxaaR.js → precisionRound-TxjBk8nN.js} +1 -1
  183. package/dist/assets/{quadrantDiagram-LMRXKWRM-gzT_-w3S.js → quadrantDiagram-LMRXKWRM-C6DXTSnZ.js} +1 -1
  184. package/dist/assets/{radar-NJJJXTRR-ChMDxgqR.js → radar-NJJJXTRR-Cck-wBOB.js} +1 -1
  185. package/dist/assets/{react-plotly-DUuIpNDT.js → react-plotly-x7-8ig7L.js} +1 -1
  186. package/dist/assets/{readonly-python-code-DMLMHG1v.js → readonly-python-code-Cb7Ak_Dy.js} +1 -1
  187. package/dist/assets/{refresh-ccw-lUiAEOAx.js → refresh-ccw-CCJeTTJO.js} +1 -1
  188. package/dist/assets/{refresh-cw-CSv3xyYY.js → refresh-cw-B_tmnHav.js} +1 -1
  189. package/dist/assets/{renderShortcut-DMYtt-ju.js → renderShortcut-C9_NT6sD.js} +1 -1
  190. package/dist/assets/{request-registry-4Bq310sk.js → request-registry-D4PD0fDJ.js} +1 -1
  191. package/dist/assets/{requirementDiagram-4UW4RH46-aavD0qQF.js → requirementDiagram-4UW4RH46-Bj7w3axz.js} +1 -1
  192. package/dist/assets/run-page-D9jntYU0.js +1 -0
  193. package/dist/assets/{runs-CItfCHkl.js → runs-BWcKkv9g.js} +1 -1
  194. package/dist/assets/{sankeyDiagram-GR3RE2ED-r95m_h3N.js → sankeyDiagram-GR3RE2ED-DCmlCkUu.js} +1 -1
  195. package/dist/assets/{save-Bg0tsaXV.js → save-CVcbYdvl.js} +1 -1
  196. package/dist/assets/scratchpad-panel-BUGlPLwQ.js +1 -0
  197. package/dist/assets/{scroll-text-SAt1GCBr.js → scroll-text-CN-2fr92.js} +1 -1
  198. package/dist/assets/secrets-panel-DGPyMcTb.js +1 -0
  199. package/dist/assets/{select-CMG6DC3j.js → select-DKRTzlUU.js} +1 -1
  200. package/dist/assets/{send-ePQN2mpH.js → send-DRRBOpzT.js} +1 -1
  201. package/dist/assets/{sequenceDiagram-C3RYC4MD-C4GqHIgf.js → sequenceDiagram-C3RYC4MD-CtIOF8jj.js} +1 -1
  202. package/dist/assets/{settings-TIv8aSog.js → settings-6ySBJQ7Y.js} +1 -1
  203. package/dist/assets/{share-CUbi0XlA.js → share-Dcl7D_tA.js} +1 -1
  204. package/dist/assets/snippets-panel-CKi40HiX.js +1 -0
  205. package/dist/assets/{spinner-CxlO4-GJ.js → spinner-BhnfQOEl.js} +1 -1
  206. package/dist/assets/{square-uM1ci7iL.js → square-DKPXnMmD.js} +1 -1
  207. package/dist/assets/{square-function-OflPQrBg.js → square-function-DBJINsmk.js} +1 -1
  208. package/dist/assets/{square-terminal-DZAwMMdQ.js → square-terminal-DoFRZ-M6.js} +1 -1
  209. package/dist/assets/{src-BOK-SWX4.js → src-KuQao6GK.js} +1 -1
  210. package/dist/assets/state-B37sZn4X.js +1 -0
  211. package/dist/assets/{state-COfuW2QS.js → state-CEmS5WFQ.js} +1 -1
  212. package/dist/assets/state-jvUYiWCG.js +1 -0
  213. package/dist/assets/{stateDiagram-KXAO66HF-CdN43FzO.js → stateDiagram-KXAO66HF-DwZscOce.js} +1 -1
  214. package/dist/assets/stateDiagram-v2-UMBNRL4Z-D5XUGcJP.js +1 -0
  215. package/dist/assets/stex-C7nwqmPk.js +1 -0
  216. package/dist/assets/storage-CaQ7kwuv.js +1 -0
  217. package/dist/assets/{switch-BKaPFRvh.js → switch-B5bMMWJn.js} +1 -1
  218. package/dist/assets/{tabs-C8HicIPZ.js → tabs-8ThyQfYh.js} +1 -1
  219. package/dist/assets/{terminal-Cnm8ANjQ.js → terminal-CPdYItDn.js} +1 -1
  220. package/dist/assets/{text-search-DpMeajoz.js → text-search-iEvFn29l.js} +1 -1
  221. package/dist/assets/{textarea-DhU2DWSB.js → textarea-B-_OthMe.js} +1 -1
  222. package/dist/assets/{time-Dzg4b75Q.js → time-BkIHCvH2.js} +1 -1
  223. package/dist/assets/{timeline-definition-XQNQX7LJ-D48ppGT8.js → timeline-definition-XQNQX7LJ-BGsZ09p6.js} +1 -1
  224. package/dist/assets/{toDate-BartytS4.js → toDate-Daj1hQSF.js} +1 -1
  225. package/dist/assets/{toggle-BLLoLiay.js → toggle-BpFqu8FB.js} +1 -1
  226. package/dist/assets/{tooltip-BjoMzmCN.js → tooltip-ULHbIsj9.js} +1 -1
  227. package/dist/assets/tracing-UKZUjbDB.js +2 -0
  228. package/dist/assets/tracing-panel-CuDItRLt.js +2 -0
  229. package/dist/assets/{trash-2-GOPu47oc.js → trash-2-3UJSaMKF.js} +1 -1
  230. package/dist/assets/{trash-BpVsWH8l.js → trash-CYX7fe5Y.js} +1 -1
  231. package/dist/assets/{tree-qyAlDlFy.js → tree-3z9r1N_5.js} +1 -1
  232. package/dist/assets/{treemap-75Q7IDZK-B4o24kyC.js → treemap-75Q7IDZK-MX1Hmq0m.js} +1 -1
  233. package/dist/assets/{type-C9leWRlU.js → type-kF6pOJbH.js} +1 -1
  234. package/dist/assets/{types-BBD3GQ0S.js → types-DQDL7dro.js} +1 -1
  235. package/dist/assets/{types-DEwRoAG0.js → types-DyTIgBnH.js} +1 -1
  236. package/dist/assets/{useAddCell-DJhNA_O5.js → useAddCell-Dq3HqYz1.js} +1 -1
  237. package/dist/assets/{useAsyncData-BEqqunls.js → useAsyncData-D9GA9BWg.js} +1 -1
  238. package/dist/assets/{useBoolean-DnggoYme.js → useBoolean-CSR3XjhE.js} +1 -1
  239. package/dist/assets/{useCellActionButton-B_a4Sv2X.js → useCellActionButton-BAG0Vvnt.js} +1 -1
  240. package/dist/assets/{useDateFormatter-DjmrLzxH.js → useDateFormatter-DrFLqO1D.js} +1 -1
  241. package/dist/assets/{useDebounce-9_rqRiHk.js → useDebounce-_ztZiL0I.js} +1 -1
  242. package/dist/assets/{useDeepCompareMemoize-DIhr42Iz.js → useDeepCompareMemoize-BsZY8i2r.js} +1 -1
  243. package/dist/assets/{useDeleteCell-DVNOLjwN.js → useDeleteCell-CJaipocw.js} +1 -1
  244. package/dist/assets/useHotkey-DkiyGPLs.js +1 -0
  245. package/dist/assets/{useInstallPackage-CTHO3tj3.js → useInstallPackage-DoKAq17E.js} +1 -1
  246. package/dist/assets/useNotebookActions-CQd8IgyR.js +1 -0
  247. package/dist/assets/useSplitCell-Dodncnp8.js +1 -0
  248. package/dist/assets/{useTheme-C5JyqXTm.js → useTheme-oPMxEKRc.js} +1 -1
  249. package/dist/assets/{utilities.esm-DbqS7Pjb.js → utilities.esm-DcV_e-D3.js} +1 -1
  250. package/dist/assets/utils-DBmmAf_K.js +1 -0
  251. package/dist/assets/variable-panel-BCihDsBL.js +1 -0
  252. package/dist/assets/{vega-component-D1ZJxK-L.js → vega-component-CWMEFM7y.js} +1 -1
  253. package/dist/assets/{vega-loader.browser.module-Jwd7L8Ye.js → vega-loader.browser.module-BkWiTok0.js} +1 -1
  254. package/dist/assets/{with-selector-CXhuorCH.js → with-selector-BmLsipPw.js} +1 -1
  255. package/dist/assets/{workflow-Covue_dW.js → workflow-DA01FBLw.js} +1 -1
  256. package/dist/assets/{wrench-DNJq8NCj.js → wrench-B2m2X1sb.js} +1 -1
  257. package/dist/assets/{write-secret-modal-qe46KOIw.js → write-secret-modal-Dx9oubag.js} +1 -1
  258. package/dist/assets/{xychartDiagram-6GGTOJPD-DK41sZTI.js → xychartDiagram-6GGTOJPD-D-i5LTeX.js} +1 -1
  259. package/dist/assets/{youtube-0-RiaVkr.js → youtube-Bl4NeyvA.js} +1 -1
  260. package/dist/index.html +155 -155
  261. package/package.json +1 -1
  262. package/src/__tests__/chat-history.test.ts +123 -0
  263. package/src/components/app-config/ai-config.tsx +23 -0
  264. package/src/components/app-config/mcp-config.tsx +42 -2
  265. package/src/components/app-config/user-config-form.tsx +0 -24
  266. package/src/components/chat/acp/__tests__/context-utils.test.ts +1 -1
  267. package/src/components/chat/acp/agent-panel.tsx +1 -1
  268. package/src/components/chat/acp/blocks.tsx +46 -53
  269. package/src/components/chat/acp/common.tsx +1 -1
  270. package/src/components/chat/acp/context-utils.ts +1 -1
  271. package/src/components/chat/acp/session-tabs.tsx +1 -1
  272. package/src/components/chat/chat-history-popover.tsx +125 -0
  273. package/src/components/chat/chat-history-utils.ts +69 -0
  274. package/src/components/chat/chat-panel.tsx +9 -57
  275. package/src/components/editor/__tests__/data-attributes.test.tsx +1 -1
  276. package/src/components/editor/actions/useNotebookActions.tsx +2 -4
  277. package/src/components/editor/ai/__tests__/completion-utils.test.ts +23 -31
  278. package/src/components/editor/cell/CreateCellButton.tsx +14 -2
  279. package/src/components/editor/cell/code/cell-editor.tsx +1 -0
  280. package/src/components/editor/database/schemas.ts +2 -10
  281. package/src/components/editor/{Cell.tsx → notebook-cell.tsx} +5 -1
  282. package/src/components/editor/output/MarimoErrorOutput.tsx +4 -34
  283. package/src/components/editor/renderers/{CellArray.tsx → cell-array.tsx} +1 -1
  284. package/src/components/forms/__tests__/form-utils.test.ts +2 -2
  285. package/src/components/mcp/hooks.ts +48 -0
  286. package/src/components/mcp/mcp-status-indicator.tsx +144 -0
  287. package/src/components/ui/number-field.tsx +4 -1
  288. package/src/core/ai/context/providers/__tests__/__snapshots__/tables.test.ts.snap +13 -19
  289. package/src/core/ai/context/providers/__tests__/cell-output.test.ts +0 -1
  290. package/src/core/ai/context/providers/__tests__/datasource.test.ts +5 -6
  291. package/src/core/ai/context/providers/__tests__/error.test.ts +24 -15
  292. package/src/core/ai/context/providers/cell-output.ts +5 -5
  293. package/src/core/ai/context/providers/common.ts +13 -4
  294. package/src/core/ai/context/providers/datasource.ts +31 -20
  295. package/src/core/ai/context/providers/error.ts +3 -4
  296. package/src/core/ai/context/providers/file.ts +2 -2
  297. package/src/core/ai/context/providers/tables.ts +36 -8
  298. package/src/core/ai/context/providers/variable.ts +2 -3
  299. package/src/core/cells/__tests__/cells.test.ts +6 -6
  300. package/src/core/cells/cells.ts +12 -13
  301. package/src/core/cells/scrollCellIntoView.ts +1 -1
  302. package/src/core/codemirror/__tests__/setup.test.ts +1 -0
  303. package/src/core/codemirror/cm.ts +3 -2
  304. package/src/core/config/__tests__/config-schema.test.ts +2 -0
  305. package/src/core/config/config-schema.ts +2 -0
  306. package/src/core/config/feature-flag.tsx +0 -2
  307. package/src/core/edit-app.tsx +1 -1
  308. package/src/core/network/CachingRequestRegistry.ts +2 -2
  309. package/src/stories/cell.stories.tsx +1 -1
  310. package/src/stories/layout/vertical/one-column.stories.tsx +1 -1
  311. package/src/utils/numbers.ts +24 -1
  312. package/dist/assets/MarimoErrorOutput-CUb4AQdT.js +0 -6
  313. package/dist/assets/add-cell-with-ai-DCyfgnLI.js +0 -36
  314. package/dist/assets/agent-panel-B_MMb9mo.js +0 -287
  315. package/dist/assets/ai-model-dropdown-Dk9Kz_pz.js +0 -2
  316. package/dist/assets/api-DBBaApVO.js +0 -1
  317. package/dist/assets/app-config-button-Cbw9b5rl.js +0 -1
  318. package/dist/assets/cell-link-woRE950-.js +0 -1
  319. package/dist/assets/channel-D-YgrD6I.js +0 -1
  320. package/dist/assets/chat-panel-DLphumiN.js +0 -3
  321. package/dist/assets/check-hL6-9SZK.js +0 -1
  322. package/dist/assets/circle-check-big-C7DGeh12.js +0 -1
  323. package/dist/assets/classDiagram-KNZD7YFC-yzXw7kFX.js +0 -1
  324. package/dist/assets/classDiagram-v2-RKCZMP56-Co2zbBi0.js +0 -1
  325. package/dist/assets/client-CA946N69.js +0 -2
  326. package/dist/assets/column-preview-BT14RHNM.js +0 -2
  327. package/dist/assets/command-palette-qYrNUNjA.js +0 -1
  328. package/dist/assets/datasources-panel-2YJ76Lq8.js +0 -1
  329. package/dist/assets/dependency-graph-panel-CnzvmPdT.js +0 -4
  330. package/dist/assets/dist-BtRvVXgu.js +0 -1
  331. package/dist/assets/dist-CAZ5kHnb.js +0 -1
  332. package/dist/assets/dist-CN8IvtVY.js +0 -1
  333. package/dist/assets/dist-Cw007UHk.js +0 -1
  334. package/dist/assets/dist-DEfSR7VW.js +0 -1
  335. package/dist/assets/dist-DSbiMNpu.js +0 -1
  336. package/dist/assets/dist-DeIZvG9x.js +0 -1
  337. package/dist/assets/dist-DyZWkD0n.js +0 -1
  338. package/dist/assets/dist-hfODPqg9.js +0 -1
  339. package/dist/assets/edit-page-Bt_YqRld.js +0 -12
  340. package/dist/assets/error-panel-dvBEznKE.js +0 -1
  341. package/dist/assets/esm-hOS9Yf3s.js +0 -1
  342. package/dist/assets/field-Ota1KKvP.js +0 -1
  343. package/dist/assets/file-explorer-panel-Pa89UfV1.js +0 -1
  344. package/dist/assets/filename-BYm5Do9U.js +0 -1
  345. package/dist/assets/home-page-B3bIZC6F.js +0 -4
  346. package/dist/assets/index-BQd14tU4.css +0 -2
  347. package/dist/assets/input-Dm-m3XYB.js +0 -7
  348. package/dist/assets/links-CQoApRoA.js +0 -1
  349. package/dist/assets/logs-panel-R50NxjC7.js +0 -1
  350. package/dist/assets/mermaid.core-BjBlUxCx.js +0 -1
  351. package/dist/assets/numbers-DtHKLeOn.js +0 -1
  352. package/dist/assets/outline-panel-CB2kV_p5.js +0 -1
  353. package/dist/assets/packages-panel-BpFuUbAr.js +0 -1
  354. package/dist/assets/run-page-ClDuCh42.js +0 -1
  355. package/dist/assets/scratchpad-panel-BRljth0m.js +0 -1
  356. package/dist/assets/secrets-panel-CQON2dfx.js +0 -1
  357. package/dist/assets/snippets-panel-C0OdhmTA.js +0 -1
  358. package/dist/assets/state-DaDgAzck.js +0 -1
  359. package/dist/assets/state-Do6Fn2Io.js +0 -1
  360. package/dist/assets/stateDiagram-v2-UMBNRL4Z-Bi0DZGHg.js +0 -1
  361. package/dist/assets/stex-CbLDtSMU.js +0 -1
  362. package/dist/assets/storage-DFOl3UlZ.js +0 -1
  363. package/dist/assets/tracing-k1M6Upka.js +0 -2
  364. package/dist/assets/tracing-panel-CyG4yTCu.js +0 -2
  365. package/dist/assets/useHotkey-CJ5v8JMM.js +0 -1
  366. package/dist/assets/useNotebookActions-BB-5-4dL.js +0 -1
  367. package/dist/assets/useSplitCell-Cy53n7mS.js +0 -1
  368. package/dist/assets/utils-CfnN8i3Y.js +0 -1
  369. package/dist/assets/variable-panel-Dd_6lOoR.js +0 -1
  370. /package/dist/assets/{Deferred-BIEvCvJC.js → Deferred-Mppm0cvJ.js} +0 -0
  371. /package/dist/assets/{alert-B2-Y1fzf.js → alert-hjKHAeOD.js} +0 -0
  372. /package/dist/assets/{badge-D5b5ze0K.js → badge-DJuT6BaT.js} +0 -0
  373. /package/dist/assets/{blob-DFrnsWYL.js → blob-CTPcPiam.js} +0 -0
  374. /package/dist/assets/{connection-Cb7zku0y.js → connection-D2GvycR9.js} +0 -0
  375. /package/dist/assets/{copy-BiKQh0sU.js → copy-CkZsxeON.js} +0 -0
  376. /package/dist/assets/{createLucideIcon-Be9UM2Pe.js → createLucideIcon-QLW8E4z5.js} +0 -0
  377. /package/dist/assets/{createReducer-BaSP2BKE.js → createReducer-CFr1RdS2.js} +0 -0
  378. /package/dist/assets/{defaultLocale-DU4zdxes.js → defaultLocale-C6TNIE_k.js} +0 -0
  379. /package/dist/assets/{defaultLocale-BCtmQtCj.js → defaultLocale-DPsgYaXf.js} +0 -0
  380. /package/dist/assets/{dist-DIuPmJ5w.js → dist-Bz53xjA5.js} +0 -0
  381. /package/dist/assets/{dist-BhR4qmIv.js → dist-DcASoeRZ.js} +0 -0
  382. /package/dist/assets/{dist-BMAXVGJe.js → dist-Dlusp3mb.js} +0 -0
  383. /package/dist/assets/{documentation-BZROoSma.js → documentation-B7z6bB-t.js} +0 -0
  384. /package/dist/assets/{emotion-is-prop-valid.esm-plUNooLR.js → emotion-is-prop-valid.esm-BbphD4LX.js} +0 -0
  385. /package/dist/assets/{errors-qtuExmE-.js → errors-_3XAtRr3.js} +0 -0
  386. /package/dist/assets/{es-Hxx5X1vH.js → es-BVCqnQhJ.js} +0 -0
  387. /package/dist/assets/{extends--r5KbeWh.js → extends-Bwhapo2B.js} +0 -0
  388. /package/dist/assets/{fast-deep-equal-DT2Tke28.js → fast-deep-equal-BdzBWnNx.js} +0 -0
  389. /package/dist/assets/{icons-BUUt9FMo.js → icons-CLD-J5J3.js} +0 -0
  390. /package/dist/assets/{kbd-DItNvBdP.js → kbd-BQFiWIjd.js} +0 -0
  391. /package/dist/assets/{main-Co0CqoDt.js → main-CfqcqCNp.js} +0 -0
  392. /package/dist/assets/{marked.esm-BVjBUuHx.js → marked.esm-C_54K2ke.js} +0 -0
  393. /package/dist/assets/{namespace-BstGchRe.js → namespace-CnoeT75h.js} +0 -0
  394. /package/dist/assets/{objectWithoutPropertiesLoose-CGYpiDu4.js → objectWithoutPropertiesLoose-CDpgRi8_.js} +0 -0
  395. /package/dist/assets/{ordinal-DO1z0TEs.js → ordinal-CHS6rGcb.js} +0 -0
  396. /package/dist/assets/{preload-helper-CxnU7XTI.js → preload-helper-DImqtvgl.js} +0 -0
  397. /package/dist/assets/{prop-types-Bv8iPqhZ.js → prop-types-CHKlDUlJ.js} +0 -0
  398. /package/dist/assets/{range-CJAH1fu_.js → range-BPiwmiGf.js} +0 -0
  399. /package/dist/assets/{shim-Bk8nzKPV.js → shim-CWt9rDBn.js} +0 -0
  400. /package/dist/assets/{stex-CETff8Y9.js → stex-BrOrfhKB.js} +0 -0
  401. /package/dist/assets/{strings-1yw0WVap.js → strings-DYBy5ejj.js} +0 -0
  402. /package/dist/assets/{tslib.es6-DItc8Tbq.js → tslib.es6-dlz5WbC8.js} +0 -0
  403. /package/dist/assets/{use-toast-C07-frN_.js → use-toast-D6NNsC80.js} +0 -0
  404. /package/dist/assets/{useEvent-BIiDVnhT.js → useEvent-BOb1a9d1.js} +0 -0
  405. /package/dist/assets/{useLifecycle-Bnvt0QrQ.js → useLifecycle-BfeAlD80.js} +0 -0
  406. /package/dist/assets/{useNonce-Cw4ZAbgi.js → useNonce-BbWkd3B4.js} +0 -0
  407. /package/dist/assets/{useNumberFormatter-DYIEUCTe.js → useNumberFormatter-D21brJ0f.js} +0 -0
  408. /package/dist/assets/{uuid-BWz20PcF.js → uuid-4lb_EYpq.js} +0 -0
@@ -9,7 +9,6 @@ import { useAtom, useAtomValue, useSetAtom } from "jotai";
9
9
  import {
10
10
  AtSignIcon,
11
11
  BotMessageSquareIcon,
12
- ClockIcon,
13
12
  Loader2,
14
13
  PaperclipIcon,
15
14
  PlusIcon,
@@ -17,16 +16,9 @@ import {
17
16
  SettingsIcon,
18
17
  SquareIcon,
19
18
  } from "lucide-react";
20
- import { memo, useEffect, useMemo, useRef, useState } from "react";
21
- import { useLocale } from "react-aria";
19
+ import { memo, useEffect, useRef, useState } from "react";
22
20
  import useEvent from "react-use-event-hook";
23
21
  import { Button } from "@/components/ui/button";
24
- import {
25
- Popover,
26
- PopoverContent,
27
- PopoverTrigger,
28
- } from "@/components/ui/popover";
29
- import { ScrollArea } from "@/components/ui/scroll-area";
30
22
  import {
31
23
  Select,
32
24
  SelectContent,
@@ -52,8 +44,8 @@ import { useRequestClient } from "@/core/network/requests";
52
44
  import { useRuntimeManager } from "@/core/runtime/config";
53
45
  import { ErrorBanner } from "@/plugins/impl/common/error-banner";
54
46
  import { cn } from "@/utils/cn";
55
- import { timeAgo } from "@/utils/dates";
56
47
  import { Logger } from "@/utils/Logger";
48
+
57
49
  import { AIModelDropdown } from "../ai/ai-model-dropdown";
58
50
  import { useOpenSettingsToTab } from "../app-config/state";
59
51
  import { PromptInput } from "../editor/ai/add-cell-with-ai";
@@ -63,10 +55,12 @@ import {
63
55
  } from "../editor/ai/completion-utils";
64
56
  import { PanelEmptyState } from "../editor/chrome/panels/empty-state";
65
57
  import { CopyClipboardIcon } from "../icons/copy-icon";
58
+ import { MCPStatusIndicator } from "../mcp/mcp-status-indicator";
66
59
  import { Input } from "../ui/input";
67
60
  import { Tooltip, TooltipProvider } from "../ui/tooltip";
68
61
  import { toast } from "../ui/use-toast";
69
62
  import { AttachmentRenderer, FileAttachmentPill } from "./chat-components";
63
+ import { ChatHistoryPopover } from "./chat-history-popover";
70
64
  import {
71
65
  buildCompletionRequestBody,
72
66
  convertToFileUIPart,
@@ -104,13 +98,6 @@ const ChatHeader: React.FC<ChatHeaderProps> = ({
104
98
  setActiveChat,
105
99
  }) => {
106
100
  const { handleClick } = useOpenSettingsToTab();
107
- const chatState = useAtomValue(chatStateAtom);
108
- const { locale } = useLocale();
109
- const chats = useMemo(() => {
110
- return [...chatState.chats.values()].sort(
111
- (a, b) => b.updatedAt - a.updatedAt,
112
- );
113
- }, [chatState.chats]);
114
101
 
115
102
  return (
116
103
  <div className="flex border-b px-2 py-1 justify-between shrink-0 items-center">
@@ -120,6 +107,7 @@ const ChatHeader: React.FC<ChatHeaderProps> = ({
120
107
  </Button>
121
108
  </Tooltip>
122
109
  <div className="flex items-center gap-2">
110
+ <MCPStatusIndicator />
123
111
  <Tooltip content="AI Settings">
124
112
  <Button
125
113
  variant="text"
@@ -130,46 +118,10 @@ const ChatHeader: React.FC<ChatHeaderProps> = ({
130
118
  <SettingsIcon className="h-4 w-4" />
131
119
  </Button>
132
120
  </Tooltip>
133
- <Popover>
134
- <Tooltip content="Previous chats">
135
- <PopoverTrigger asChild={true}>
136
- <Button variant="text" size="icon">
137
- <ClockIcon className="h-4 w-4" />
138
- </Button>
139
- </PopoverTrigger>
140
- </Tooltip>
141
- <PopoverContent className="w-[520px] p-0" align="start" side="right">
142
- <ScrollArea className="h-[500px] p-4">
143
- <div className="space-y-4">
144
- {chats.length === 0 && (
145
- <PanelEmptyState
146
- title="No chats yet"
147
- description="Start a new chat to get started"
148
- icon={<BotMessageSquareIcon />}
149
- />
150
- )}
151
- {chats.map((chat) => (
152
- <button
153
- key={chat.id}
154
- className={cn(
155
- "w-full p-3 rounded-md cursor-pointer hover:bg-accent text-left",
156
- chat.id === activeChatId && "bg-accent",
157
- )}
158
- onClick={() => {
159
- setActiveChat(chat.id);
160
- }}
161
- type="button"
162
- >
163
- <div className="font-medium">{chat.title}</div>
164
- <div className="text-sm text-muted-foreground">
165
- {timeAgo(chat.updatedAt, locale)}
166
- </div>
167
- </button>
168
- ))}
169
- </div>
170
- </ScrollArea>
171
- </PopoverContent>
172
- </Popover>
121
+ <ChatHistoryPopover
122
+ activeChatId={activeChatId}
123
+ setActiveChat={setActiveChat}
124
+ />
173
125
  </div>
174
126
  </div>
175
127
  );
@@ -12,7 +12,7 @@ import type { UserConfig } from "@/core/config/config-schema";
12
12
  import type { OutputMessage } from "@/core/kernel/messages";
13
13
  import type { AppMode } from "@/core/mode";
14
14
  import { requestClientAtom } from "@/core/network/requests";
15
- import { Cell } from "../Cell";
15
+ import { Cell } from "../notebook-cell";
16
16
  import { OutputArea } from "../Output";
17
17
 
18
18
  function createTestWrapper() {
@@ -102,7 +102,7 @@ export function useNotebookActions() {
102
102
  updateCellConfig,
103
103
  undoDeleteCell,
104
104
  clearAllCellOutputs,
105
- upsertSetupCell,
105
+ addSetupCellIfDoesntExist,
106
106
  collapseAllCells,
107
107
  expandAllCells,
108
108
  } = useCellActions();
@@ -401,9 +401,7 @@ export function useNotebookActions() {
401
401
  icon: <DiamondPlusIcon size={14} strokeWidth={1.5} />,
402
402
  label: "Add setup cell",
403
403
  handle: () => {
404
- upsertSetupCell({
405
- code: "# Initialization code that runs before all other cells",
406
- });
404
+ addSetupCellIfDoesntExist({});
407
405
  },
408
406
  },
409
407
  {
@@ -55,15 +55,13 @@ describe("getAICompletionBody", () => {
55
55
  expect(result).toMatchInlineSnapshot(`
56
56
  {
57
57
  "context": {
58
- "plainText": "<data name="dataset1" source="unknown">
59
- Columns:
60
- - col1: number
61
- - col2: string</data>
62
-
63
- <data name="dataset2" source="unknown">
64
- Columns:
65
- - col3: boolean
66
- - col4: date</data>",
58
+ "plainText": "<data name="dataset1" source="unknown">Columns:
59
+ col1 (number)
60
+ col2 (string)</data>
61
+
62
+ <data name="dataset2" source="unknown">Columns:
63
+ col3 (boolean)
64
+ col4 (date)</data>",
67
65
  "schema": [],
68
66
  "variables": [],
69
67
  },
@@ -108,10 +106,9 @@ describe("getAICompletionBody", () => {
108
106
  expect(result).toMatchInlineSnapshot(`
109
107
  {
110
108
  "context": {
111
- "plainText": "<data name="existingDataset" source="unknown">
112
- Columns:
113
- - col1: number
114
- - col2: string</data>",
109
+ "plainText": "<data name="existingDataset" source="unknown">Columns:
110
+ col1 (number)
111
+ col2 (string)</data>",
115
112
  "schema": [],
116
113
  "variables": [],
117
114
  },
@@ -144,14 +141,12 @@ describe("getAICompletionBody", () => {
144
141
  expect(result).toMatchInlineSnapshot(`
145
142
  {
146
143
  "context": {
147
- "plainText": "<data name="dataset.with.dots" source="unknown">
148
- Columns:
149
- - col1: number
150
- - col2: string</data>
151
-
152
- <data name="regular_dataset" source="unknown">
153
- Columns:
154
- - col3: boolean</data>",
144
+ "plainText": "<data name="dataset.with.dots" source="unknown">Columns:
145
+ col1 (number)
146
+ col2 (string)</data>
147
+
148
+ <data name="regular_dataset" source="unknown">Columns:
149
+ col3 (boolean)</data>",
155
150
  "schema": [],
156
151
  "variables": [],
157
152
  },
@@ -198,9 +193,8 @@ describe("getAICompletionBody", () => {
198
193
  expect(result).toMatchInlineSnapshot(`
199
194
  {
200
195
  "context": {
201
- "plainText": "<data name="table1" source="unknown">
202
- Columns:
203
- - col1: number</data>",
196
+ "plainText": "<data name="table1" source="unknown">Columns:
197
+ col1 (number)</data>",
204
198
  "schema": [],
205
199
  "variables": [],
206
200
  },
@@ -276,10 +270,9 @@ describe("getAICompletionBody", () => {
276
270
  expect(result).toMatchInlineSnapshot(`
277
271
  {
278
272
  "context": {
279
- "plainText": "<data name="dataset1" source="unknown">
280
- Columns:
281
- - col1: number
282
- - col2: string</data>
273
+ "plainText": "<data name="dataset1" source="unknown">Columns:
274
+ col1 (number)
275
+ col2 (string)</data>
283
276
 
284
277
  <variable name="var1" dataType="string">"string value"</variable>",
285
278
  "schema": [],
@@ -346,9 +339,8 @@ describe("getAICompletionBody", () => {
346
339
  expect(result).toMatchInlineSnapshot(`
347
340
  {
348
341
  "context": {
349
- "plainText": "<data name="conflict" source="unknown">
350
- Columns:
351
- - col1: number</data>",
342
+ "plainText": "<data name="conflict" source="unknown">Columns:
343
+ col1 (number)</data>",
352
344
  "schema": [],
353
345
  "variables": [],
354
346
  },
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2024 Marimo. All rights reserved. */
2
- import { DatabaseIcon, PlusIcon } from "lucide-react";
2
+ import { DatabaseIcon, DiamondPlusIcon, PlusIcon } from "lucide-react";
3
3
  import { Button } from "@/components/editor/inputs/Inputs";
4
4
  import {
5
5
  ContextMenu,
@@ -69,7 +69,7 @@ const CreateCellButtonContextMenu = (props: {
69
69
  children: React.ReactNode;
70
70
  }) => {
71
71
  const { children, onClick } = props;
72
- const { createNewCell } = useCellActions();
72
+ const { createNewCell, addSetupCellIfDoesntExist } = useCellActions();
73
73
 
74
74
  if (!onClick) {
75
75
  return children;
@@ -125,6 +125,18 @@ const CreateCellButtonContextMenu = (props: {
125
125
  </div>
126
126
  SQL cell
127
127
  </ContextMenuItem>
128
+ <ContextMenuItem
129
+ key="setup"
130
+ onSelect={(evt) => {
131
+ evt.stopPropagation();
132
+ addSetupCellIfDoesntExist({});
133
+ }}
134
+ >
135
+ <div className="mr-3 text-muted-foreground">
136
+ <DiamondPlusIcon size={13} strokeWidth={1.5} />
137
+ </div>
138
+ Setup cell
139
+ </ContextMenuItem>
128
140
  </ContextMenuContent>
129
141
  </ContextMenu>
130
142
  );
@@ -187,6 +187,7 @@ const CellEditorInternal = ({
187
187
  hotkeys: new OverridingHotkeyProvider(userConfig.keymap.overrides ?? {}),
188
188
  diagnosticsConfig: userConfig.diagnostics,
189
189
  displayConfig: userConfig.display,
190
+ inlineAiTooltip: userConfig.ai?.inline_tooltip ?? false,
190
191
  });
191
192
 
192
193
  extensions.push(
@@ -18,11 +18,7 @@ function passwordField() {
18
18
 
19
19
  function tokenField(label?: string, required?: boolean) {
20
20
  let field: z.ZodString | z.ZodOptional<z.ZodString> = z.string();
21
- if (required) {
22
- field = field.nonempty();
23
- } else {
24
- field = field.optional();
25
- }
21
+ field = required ? field.nonempty() : field.optional();
26
22
 
27
23
  field = field.describe(
28
24
  FieldOptions.of({
@@ -50,11 +46,7 @@ function warehouseNameField() {
50
46
 
51
47
  function uriField(label?: string, required?: boolean) {
52
48
  let field: z.ZodString | z.ZodOptional<z.ZodString> = z.string();
53
- if (required) {
54
- field = field.nonempty();
55
- } else {
56
- field = field.optional();
57
- }
49
+ field = required ? field.nonempty() : field.optional();
58
50
 
59
51
  return field.describe(
60
52
  FieldOptions.of({ label: label || "URI", optionRegex: ".*uri.*" }),
@@ -1051,12 +1051,16 @@ const SetupCellComponent = ({
1051
1051
  data-status={cellRuntime.status}
1052
1052
  ref={cellRef}
1053
1053
  {...mergeProps(navigationProps, {
1054
- className,
1054
+ className: cn(
1055
+ className,
1056
+ "focus:ring-1 focus:ring-(--blue-7) focus:ring-offset-0",
1057
+ ),
1055
1058
  onBlur: closeCompletionHandler,
1056
1059
  onKeyDown: resumeCompletionHandler,
1057
1060
  })}
1058
1061
  {...cellDomProps(cellId, cellData.name)}
1059
1062
  title={renderCellTitle()}
1063
+ tabIndex={-1}
1060
1064
  data-setup-cell={true}
1061
1065
  >
1062
1066
  <div className={cn("tray")} data-hidden={!isCellCodeShown}>
@@ -1,10 +1,6 @@
1
1
  /* Copyright 2024 Marimo. All rights reserved. */
2
2
 
3
- import {
4
- InfoIcon,
5
- NotebookPenIcon,
6
- SquareArrowOutUpRightIcon,
7
- } from "lucide-react";
3
+ import { NotebookPenIcon, SquareArrowOutUpRightIcon } from "lucide-react";
8
4
  import { Fragment, type JSX } from "react";
9
5
  import {
10
6
  Accordion,
@@ -499,37 +495,11 @@ export const MarimoErrorOutput = ({
499
495
  messages.push(
500
496
  <div key="sql-errors">
501
497
  {sqlErrors.map((error, idx) => {
502
- const line =
503
- error.sql_line == null ? null : Math.trunc(error?.sql_line) + 1;
504
- const col =
505
- error.sql_col == null ? null : Math.trunc(error?.sql_col) + 1;
506
498
  return (
507
499
  <div key={`sql-error-${idx}`} className="space-y-2 mt-2">
508
- <p className="text-muted-foreground font-medium">{error.msg}</p>
509
- {error.hint && (
510
- <div className="flex items-start gap-2">
511
- <InfoIcon
512
- size={11}
513
- className="text-muted-foreground mt-1 flex-shrink-0"
514
- />
515
- <p className="whitespace-pre-wrap text-sm text-muted-foreground">
516
- {error.hint}
517
- </p>
518
- </div>
519
- )}
520
- {error.sql_statement && (
521
- <pre
522
- lang="sql"
523
- className="text-xs bg-muted/80 rounded whitespace-pre-wrap p-3.5"
524
- >
525
- {error.sql_statement.trim()}
526
- </pre>
527
- )}
528
- {line !== null && col !== null && (
529
- <p className="text-xs text-muted-foreground">
530
- Error at line {line}, column {col}
531
- </p>
532
- )}
500
+ <p className="text-muted-foreground whitespace-pre-wrap">
501
+ {error.msg}
502
+ </p>
533
503
  </div>
534
504
  );
535
505
  })}
@@ -14,7 +14,7 @@ import {
14
14
  } from "lucide-react";
15
15
  import { useEffect } from "react";
16
16
  import { StartupLogsAlert } from "@/components/editor/alerts/startup-logs-alert";
17
- import { Cell } from "@/components/editor/Cell";
17
+ import { Cell } from "@/components/editor/notebook-cell";
18
18
  import { PackageAlert } from "@/components/editor/package-alert";
19
19
  import { SortableCellsProvider } from "@/components/sort/SortableCellsProvider";
20
20
  import { Button } from "@/components/ui/button";
@@ -191,7 +191,7 @@ describe("getDefaults", () => {
191
191
  });
192
192
  const result = getDefaults(schema) as { map: Map<string, number> };
193
193
  expect(result.map instanceof Map).toBe(true);
194
- expect(Array.from(result.map.entries())).toEqual([["a", 1]]);
194
+ expect([...result.map.entries()]).toEqual([["a", 1]]);
195
195
  });
196
196
 
197
197
  it("should handle ZodSet with default", () => {
@@ -200,7 +200,7 @@ describe("getDefaults", () => {
200
200
  });
201
201
  const result = getDefaults(schema) as { set: Set<string> };
202
202
  expect(result.set instanceof Set).toBe(true);
203
- expect(Array.from(result.set)).toEqual(["a", "b"]);
203
+ expect([...result.set]).toEqual(["a", "b"]);
204
204
  });
205
205
 
206
206
  it("should handle deeply nested defaults", () => {
@@ -0,0 +1,48 @@
1
+ /* Copyright 2024 Marimo. All rights reserved. */
2
+
3
+ import type { components } from "@marimo-team/marimo-api";
4
+ import { useState } from "react";
5
+ import { API } from "@/core/network/api";
6
+ import { useAsyncData } from "@/hooks/useAsyncData";
7
+ import { toast } from "../ui/use-toast";
8
+
9
+ export type MCPStatus = components["schemas"]["MCPStatusResponse"];
10
+ export type MCPRefreshResponse = components["schemas"]["MCPRefreshResponse"];
11
+
12
+ /**
13
+ * Hook to fetch MCP server status
14
+ */
15
+ export function useMCPStatus() {
16
+ return useAsyncData<MCPStatus>(async () => {
17
+ return API.get<MCPStatus>("/ai/mcp/status");
18
+ }, []);
19
+ }
20
+
21
+ /**
22
+ * Hook to refresh MCP server configuration
23
+ */
24
+ export function useMCPRefresh() {
25
+ const [isRefreshing, setIsRefreshing] = useState(false);
26
+
27
+ const refresh = async () => {
28
+ setIsRefreshing(true);
29
+ try {
30
+ await API.post<object, MCPRefreshResponse>("/ai/mcp/refresh", {});
31
+ toast({
32
+ title: "MCP refreshed",
33
+ description: "MCP server configuration has been refreshed successfully",
34
+ });
35
+ } catch (error) {
36
+ toast({
37
+ title: "Refresh failed",
38
+ description:
39
+ error instanceof Error ? error.message : "Failed to refresh MCP",
40
+ variant: "danger",
41
+ });
42
+ } finally {
43
+ setIsRefreshing(false);
44
+ }
45
+ };
46
+
47
+ return { refresh, isRefreshing };
48
+ }
@@ -0,0 +1,144 @@
1
+ /* Copyright 2024 Marimo. All rights reserved. */
2
+
3
+ import { Loader2, PlugIcon, RefreshCwIcon } from "lucide-react";
4
+ import { API } from "@/core/network/api";
5
+ import { cn } from "@/utils/cn";
6
+ import { Button } from "../ui/button";
7
+ import { Popover, PopoverContent, PopoverTrigger } from "../ui/popover";
8
+ import { Tooltip } from "../ui/tooltip";
9
+ import { toast } from "../ui/use-toast";
10
+ import { useMCPStatus } from "./hooks";
11
+
12
+ /**
13
+ * MCP Status indicator component
14
+ * Shows a small icon with status color and a popover with detailed information
15
+ */
16
+ export const MCPStatusIndicator: React.FC = () => {
17
+ const { data: status, refetch, isFetching } = useMCPStatus();
18
+
19
+ const handleRefresh = async () => {
20
+ try {
21
+ await API.post<object, { success: boolean }>("/ai/mcp/refresh", {});
22
+ toast({
23
+ title: "MCP refreshed",
24
+ description: "MCP server configuration has been refreshed",
25
+ });
26
+ refetch();
27
+ } catch (error) {
28
+ toast({
29
+ title: "Refresh failed",
30
+ description:
31
+ error instanceof Error ? error.message : "Failed to refresh MCP",
32
+ variant: "danger",
33
+ });
34
+ }
35
+ };
36
+
37
+ const servers = status?.servers || {};
38
+ const hasServers = Object.keys(servers).length > 0;
39
+
40
+ return (
41
+ <Popover>
42
+ <Tooltip content="MCP Status">
43
+ <PopoverTrigger asChild={true}>
44
+ <Button variant="text" size="icon">
45
+ <PlugIcon
46
+ className={cn(
47
+ "h-4 w-4",
48
+ status?.status === "ok" && "text-green-500",
49
+ status?.status === "partial" && "text-yellow-500",
50
+ status?.status === "error" && hasServers && "text-red-500",
51
+ )}
52
+ />
53
+ </Button>
54
+ </PopoverTrigger>
55
+ </Tooltip>
56
+ <PopoverContent className="w-[320px]" align="start" side="right">
57
+ <div className="space-y-3">
58
+ <div className="flex items-center justify-between">
59
+ <h4 className="font-medium text-sm">MCP Server Status</h4>
60
+ <Button
61
+ variant="ghost"
62
+ size="xs"
63
+ onClick={handleRefresh}
64
+ disabled={isFetching}
65
+ >
66
+ {isFetching ? (
67
+ <Loader2 className="h-3 w-3 animate-spin" />
68
+ ) : (
69
+ <RefreshCwIcon className="h-3 w-3" />
70
+ )}
71
+ </Button>
72
+ </div>
73
+ {status && (
74
+ <div className="text-xs space-y-2">
75
+ {hasServers && (
76
+ <div className="flex justify-between items-center">
77
+ <span className="text-muted-foreground">Overall:</span>
78
+ <McpStatusText status={status.status} />
79
+ </div>
80
+ )}
81
+ {status.error && (
82
+ <div className="text-xs text-red-500 bg-red-50 dark:bg-red-950/20 p-2 rounded">
83
+ {status.error}
84
+ </div>
85
+ )}
86
+ {hasServers && (
87
+ <div className="space-y-1">
88
+ <div className="text-muted-foreground font-medium">
89
+ Servers:
90
+ </div>
91
+ {Object.entries(servers).map(([name, serverStatus]) => (
92
+ <div
93
+ key={name}
94
+ className="flex justify-between items-center pl-2"
95
+ >
96
+ <span className="text-muted-foreground truncate max-w-[180px]">
97
+ {name}
98
+ </span>
99
+ <McpStatusText status={serverStatus} />
100
+ </div>
101
+ ))}
102
+ </div>
103
+ )}
104
+ {!hasServers && (
105
+ <div className="text-muted-foreground text-center py-2">
106
+ No MCP servers configured. <br /> Configure under{" "}
107
+ <b>Settings &gt; AI &gt; MCP</b>
108
+ </div>
109
+ )}
110
+ </div>
111
+ )}
112
+ </div>
113
+ </PopoverContent>
114
+ </Popover>
115
+ );
116
+ };
117
+
118
+ export const McpStatusText: React.FC<{
119
+ status:
120
+ | "ok"
121
+ | "partial"
122
+ | "error"
123
+ | "failed"
124
+ | "disconnected"
125
+ | "pending"
126
+ | "connected";
127
+ }> = ({ status }) => {
128
+ return (
129
+ <span
130
+ className={cn(
131
+ "text-xs font-medium",
132
+ status === "ok" && "text-green-500",
133
+ status === "partial" && "text-yellow-500",
134
+ status === "error" && "text-red-500",
135
+ status === "failed" && "text-red-500",
136
+ status === "disconnected" && "text-gray-500",
137
+ status === "pending" && "text-yellow-500",
138
+ status === "connected" && "text-green-500",
139
+ )}
140
+ >
141
+ {status}
142
+ </span>
143
+ );
144
+ };
@@ -7,8 +7,10 @@ import {
7
7
  Button,
8
8
  type ButtonProps,
9
9
  Input as RACInput,
10
+ useLocale,
10
11
  } from "react-aria-components";
11
12
  import { cn } from "@/utils/cn";
13
+ import { maxFractionalDigits } from "@/utils/numbers";
12
14
 
13
15
  export interface NumberFieldProps extends AriaNumberFieldProps {
14
16
  placeholder?: string;
@@ -17,12 +19,13 @@ export interface NumberFieldProps extends AriaNumberFieldProps {
17
19
 
18
20
  export const NumberField = React.forwardRef<HTMLInputElement, NumberFieldProps>(
19
21
  ({ placeholder, variant = "default", ...props }, ref) => {
22
+ const { locale } = useLocale();
20
23
  return (
21
24
  <AriaNumberField
22
25
  {...props}
23
26
  formatOptions={{
24
27
  minimumFractionDigits: 0,
25
- maximumFractionDigits: 100,
28
+ maximumFractionDigits: maxFractionalDigits(locale),
26
29
  }}
27
30
  >
28
31
  <div