@marimo-team/islands 0.25.3-dev3 → 0.25.3-dev301

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 (1029) hide show
  1. package/dist/{ConnectedDataExplorerComponent-CNSxdKyJ.js → ConnectedDataExplorerComponent-X-_Gsw0B.js} +153 -177
  2. package/dist/{ErrorBoundary-iHE9DnZC.js → ErrorBoundary-D2XuUNty.js} +79 -85
  3. package/dist/{ImageComparisonComponent-uU8FSKZE.js → ImageComparisonComponent-DgvSuY9B.js} +20 -20
  4. package/dist/{Plot-DdYOe1UK.js → Plot-Bfd0pJea.js} +2474 -3107
  5. package/dist/_baseSet-Bd5zh2yg.js +327 -0
  6. package/dist/{abnfDiagram-VCTEODGH-DQDjNXt3.js → abnfDiagram-VCTEODGH-B8nNWmL7.js} +5 -5
  7. package/dist/any-language-editor-DhAtCzlx.js +75 -0
  8. package/dist/{apl-GEW9-ZP1.js → apl-stFrI2NB.js} +1 -1
  9. package/dist/{arc-7ra3iNdN.js → arc-4W6H62B5.js} +1 -1
  10. package/dist/architecture-7GRP2DOG-GlkXha5_.js +2 -0
  11. package/dist/{architectureDiagram-5GKGNRK7-Nmls7Wxn.js → architectureDiagram-5GKGNRK7-DcfTzRDz.js} +48 -64
  12. package/dist/{arrays-CN1djC4k.js → arrays-DoQ-AILx.js} +15 -27
  13. package/dist/{asciiarmor-BWNxzkG7.js → asciiarmor-DHwFuaIC.js} +1 -1
  14. package/dist/{asn1-Bcn2QutK.js → asn1-KIH4fwAq.js} +1 -1
  15. package/dist/assertNever-De6m1Aro.js +507 -0
  16. package/dist/assets/__vite-browser-external-BzfoKXxV.js +1 -0
  17. package/dist/assets/worker-DVG30pr3.js +171 -0
  18. package/dist/{blockDiagram-I7D4REHJ-Cg25UrxT.js → blockDiagram-I7D4REHJ-B4cvqWJn.js} +28 -39
  19. package/dist/{brainfuck-BQCYDheZ.js → brainfuck-UPAij4U9.js} +1 -1
  20. package/dist/{button-CvjkwdSk.js → button-BuSV-mLI.js} +64 -64
  21. package/dist/{c4Diagram-7LVT6UL2-BxFgrnNV.js → c4Diagram-7LVT6UL2-k-4SLDdM.js} +8 -8
  22. package/dist/{capabilities-CQ5IjhzL.js → capabilities-BiN90k7v.js} +2 -2
  23. package/dist/{channel-CPObtJXj.js → channel-CuTaWMxU.js} +1 -1
  24. package/dist/{chat-ui-BDpymeoe.js → chat-ui-CtbON6Zl.js} +1712 -1440
  25. package/dist/{check-EDwSwP89.js → check-C7fmwkwt.js} +1 -1
  26. package/dist/{chunk-4HAMMTFA-D4eFPyFh.js → chunk-4HAMMTFA-Bk_5S_m9.js} +6 -6
  27. package/dist/{chunk-75Z2AOVW-D7gxIs2Q.js → chunk-75Z2AOVW-9jQIEAxd.js} +4 -4
  28. package/dist/{chunk-DU6HZSFF-BwiyaNpg.js → chunk-DU6HZSFF-B20LZ-hE.js} +14 -22
  29. package/dist/{chunk-F27PBJKO-ufseIn5y.js → chunk-F27PBJKO-YjRXlNkT.js} +3 -3
  30. package/dist/{chunk-FOHPRMQF-BpYR8RqP.js → chunk-FOHPRMQF-ezmr_yWy.js} +49 -58
  31. package/dist/{chunk-GMAD6QVW-BhaJx0X3.js → chunk-GMAD6QVW-DokpSFdf.js} +16 -75
  32. package/dist/{chunk-GVQU2GXP-Cwbt-lF0.js → chunk-GVQU2GXP-DGvySV5W.js} +3 -3
  33. package/dist/{chunk-IMKFNOWR-CoIFEo-1.js → chunk-IMKFNOWR-BHJ3ZxAy.js} +8 -8
  34. package/dist/{chunk-L3NEJ4N5-n-zgIVSy.js → chunk-L3NEJ4N5-D9-ekjZc.js} +6 -6
  35. package/dist/{chunk-OSK3NFVY-DXa-Cxbn.js → chunk-OSK3NFVY-p7meGiY-.js} +8 -8
  36. package/dist/{chunk-P2QGCYS3-B_Zd3-X0.js → chunk-P2QGCYS3-74rxrEwb.js} +1 -1
  37. package/dist/{chunk-POPQ4Y6H-hYOXbYH_.js → chunk-POPQ4Y6H-EOTPk9Tj.js} +2 -2
  38. package/dist/{chunk-PWAF6VOD-CQw5qATZ.js → chunk-PWAF6VOD-oT_Qd2OU.js} +2 -2
  39. package/dist/{chunk-SHT3W25Y-lHiGx3ZC.js → chunk-SHT3W25Y-CkOPJgVC.js} +10 -10
  40. package/dist/{chunk-SVP7TREG-BvsHIrY_.js → chunk-SVP7TREG-rDd35EZ7.js} +3 -3
  41. package/dist/{chunk-TICWLB2K-BC8YIm_n.js → chunk-TICWLB2K-uKdr5PNy.js} +10 -10
  42. package/dist/{chunk-XXDRQBXY-Dnl5VBqG.js → chunk-XXDRQBXY-BM-YIt-_.js} +1 -1
  43. package/dist/{chunk-YOKDWASO-DPZk8vhS.js → chunk-YOKDWASO-KxncHymC.js} +171 -396
  44. package/dist/classDiagram-ZZMXUADV-DctWoMRF.js +30 -0
  45. package/dist/classDiagram-v2-VYDZK3BY-DyanDjSq.js +30 -0
  46. package/dist/{clike-CxK9W55Z.js → clike-xU8sCVU1.js} +2 -6
  47. package/dist/{clojure-Dzcvwpxk.js → clojure-psoSEo36.js} +1 -1
  48. package/dist/{cmake-DYr-71zp.js → cmake-DDHBwlE7.js} +1 -1
  49. package/dist/{cobol-DC3g37Kq.js → cobol-C4qjDcIq.js} +1 -1
  50. package/dist/code-visibility-Y0zfGGT1.js +131 -0
  51. package/dist/{coffeescript-C-eFwH5N.js → coffeescript-D6UgrGgo.js} +1 -1
  52. package/dist/{common-BrBUdtPy.js → common-B_rBSwAA.js} +10980 -10178
  53. package/dist/{commonlisp-CyaNXrJR.js → commonlisp-B0ChVjnu.js} +1 -1
  54. package/dist/{compiler-runtime-CldRdSsv.js → compiler-runtime-DNezxW8I.js} +2 -2
  55. package/dist/{toDate-BNJf01u1.js → config-C4oddKcw.js} +107 -177
  56. package/dist/{copy-icon-Ft7t9bqz.js → copy-icon-CVrC6aa6.js} +21 -22
  57. package/dist/{cose-bilkent-JH36ORCC-_LyRKVqm.js → cose-bilkent-JH36ORCC-B_Oz4vMP.js} +58 -71
  58. package/dist/createReducer-DzlYBqjn.js +67 -0
  59. package/dist/{crystal-ih5ax5tQ.js → crystal-DZsc9Ue0.js} +1 -1
  60. package/dist/{css-CN_wP7_R.js → css-DkYRnQ9U.js} +1 -1
  61. package/dist/{cubic-OaEBhQPK.js → cubic-CA80xY_e.js} +6 -7
  62. package/dist/cynefin-OW5HDTMX-0-HehVvH.js +2 -0
  63. package/dist/{cynefinDiagram-5FMLGOSQ-CgWra7wt.js → cynefinDiagram-5FMLGOSQ-uEhVcLHR.js} +5 -5
  64. package/dist/{cypher-CqGRcmZo.js → cypher-CpWPqgvy.js} +1 -1
  65. package/dist/{cytoscape.esm-jJhXJpLB.js → cytoscape.esm-BbeMznK5.js} +411 -512
  66. package/dist/{d-Cj0sOW2z.js → d-Bx2ggfYO.js} +1 -1
  67. package/dist/{dagre-BGSfXNEb.js → dagre-CpjuekF1.js} +550 -700
  68. package/dist/{dagre-GXQ25YYZ-CFZ8-35c.js → dagre-GXQ25YYZ-B_NBKhOr.js} +14 -16
  69. package/dist/{data-grid-overlay-editor-Ch2SgmvG.js → data-grid-overlay-editor-04SWN9ol.js} +8 -8
  70. package/dist/{data-grid-types-BH_r7g7l.js → data-grid-types-CSElxhxo.js} +2 -2
  71. package/dist/{debounce-C3jyATpc.js → debounce-DrhhziJv.js} +2 -2
  72. package/dist/{diagram-S7CK7UJ4-lCNQrW7d.js → diagram-S7CK7UJ4-BQr1iw91.js} +7 -15
  73. package/dist/{diagram-UQ7AKVKN-CQPQ6pP_.js → diagram-UQ7AKVKN-DsAjdQ2j.js} +5 -5
  74. package/dist/{diagram-VSXAHHWV-BJWcVVJY.js → diagram-VSXAHHWV-CodTjaL3.js} +6 -6
  75. package/dist/{diagram-VX7I27RA-Cf3b0llz.js → diagram-VX7I27RA-0VAUrHmz.js} +7 -7
  76. package/dist/{diagram-Z3DM3KII-Bt4QLrpn.js → diagram-Z3DM3KII-C1aEuADo.js} +5 -5
  77. package/dist/{dialog-CEBFZNyc.js → dialog-U3stKkkL.js} +35 -35
  78. package/dist/{diff-B_hUkiat.js → diff-DNXaJS8v.js} +1 -1
  79. package/dist/{dist-D6d86eNJ.js → dist-B-Id1kt3.js} +48 -47
  80. package/dist/{dist-DiDibOYr.js → dist-BDw9g6PC.js} +152 -151
  81. package/dist/{dist-diIx5qJW.js → dist-B_EswY8r.js} +33 -32
  82. package/dist/{dist-DoE4XJBC.js → dist-B_xgcU0N.js} +9800 -10654
  83. package/dist/{dist-CLdpGQVr.js → dist-BcGGwW1q.js} +119 -121
  84. package/dist/dist-BdZQUzPS.js +850 -0
  85. package/dist/{dist-CN_BeG2I.js → dist-Bj8s59mu.js} +59 -58
  86. package/dist/{dist-CkTTIdBe.js → dist-C3dYgyiI.js} +337 -337
  87. package/dist/{dist-PXYI_yuP.js → dist-C6ttp2Iy.js} +24 -23
  88. package/dist/{dist-DUAh96QY.js → dist-CB9MzCXv.js} +1 -1
  89. package/dist/{dist-CSbh1PNP.js → dist-CCYz0qJ2.js} +24 -23
  90. package/dist/{dist-BMQf5zIS.js → dist-CDjivQ67.js} +124 -123
  91. package/dist/{dist-D-wwqlzJ.js → dist-CNT4u03u.js} +159 -158
  92. package/dist/{dist-F8Ep36rk.js → dist-DVVzH9mP.js} +60 -59
  93. package/dist/{dist-OR1OnN-y.js → dist-DlniJvh2.js} +32 -31
  94. package/dist/{dist-CSJ0MDRw.js → dist-Dq-hanx8.js} +57 -56
  95. package/dist/{dist-DpBpA_n1.js → dist-Du4PgaYp.js} +5 -5
  96. package/dist/{dist-C8fAKSH1.js → dist-FakvNY2e.js} +54 -53
  97. package/dist/{dist-BuaRHxOc.js → dist-K-qmZv0f.js} +45 -44
  98. package/dist/{dist-Cg7gzw-a.js → dist-NPImE_g9.js} +79 -78
  99. package/dist/{dist-CN8zI-XC.js → dist-PKX4HaX5.js} +239 -239
  100. package/dist/{dist-CrSP_H1M.js → dist-U4WlxEDL.js} +243 -243
  101. package/dist/{dist-BK4Oj99o.js → dist-UKKHsqHo.js} +19 -18
  102. package/dist/{dist-Bvs24R_E.js → dist-VRN9rDqa.js} +32 -31
  103. package/dist/{dist-BorMD-uX.js → dist-f1h5p-fp.js} +76 -75
  104. package/dist/{dist-BLfKmR-l.js → dist-h8Te4SvD.js} +17 -16
  105. package/dist/{dist-DBtSl3sf.js → dist-ymIUQ4tH.js} +48 -50
  106. package/dist/{dropdown-menu-CP_qCYHC.js → dropdown-menu-BMtxnyHc.js} +2798 -1494
  107. package/dist/{dtd-B8FGSWWe.js → dtd-D1YZQCVT.js} +1 -1
  108. package/dist/{dylan-DbIBYIrw.js → dylan-CxbG-PUm.js} +2 -2
  109. package/dist/{ebnfDiagram-PWID7BFC-D3NAyPFY.js → ebnfDiagram-PWID7BFC-oBie_-vi.js} +5 -5
  110. package/dist/{ecl-DBmkdWAd.js → ecl-DIXH6vul.js} +1 -1
  111. package/dist/{eiffel-CcWSDDzK.js → eiffel-D0de-eQr.js} +1 -1
  112. package/dist/{elm-MC-b8a6C.js → elm-DrQrn4VD.js} +1 -1
  113. package/dist/{erDiagram-RLTQ6QDP-Tlu09_Nm.js → erDiagram-RLTQ6QDP-DtWDCiaw.js} +14 -14
  114. package/dist/{erlang-AdO1-xtV.js → erlang-2KpKpfC7.js} +1 -1
  115. package/dist/{error-banner-Da600cwz.js → error-banner-CfIck83X.js} +94 -89
  116. package/dist/error-entries-CjsQY6ym.js +2581 -0
  117. package/dist/{esm-G4Fhsgng.js → esm-BUoz9Vvv.js} +4 -4
  118. package/dist/{esm-AMFssoNp.js → esm-BvhFNYzM.js} +333 -333
  119. package/dist/{esm-D2gTsXEV.js → esm-wKplZtOX.js} +580 -581
  120. package/dist/eventmodeling-NTZA5JFV-DoBvB4Lj.js +2 -0
  121. package/dist/{factor-Ys-13HOP.js → factor-Bwu3ZGOk.js} +1 -1
  122. package/dist/{feedback-button-DxXNcC6q.js → feedback-button-DoriP8b7.js} +116 -126
  123. package/dist/flowDiagram-HODETNUW-EXK7bg_t.js +15 -0
  124. package/dist/{formats-BGh2thRc.js → formats-G0-mQsFy.js} +9 -9
  125. package/dist/{forth-DiMuIXFe.js → forth-DYatDpr6.js} +2 -3
  126. package/dist/{fortran-hkrF2eM4.js → fortran-n8mcQPkL.js} +1 -1
  127. package/dist/{ganttDiagram-EL5Y4UJY-BQT16JSc.js → ganttDiagram-EL5Y4UJY-DyUab7aO.js} +17 -17
  128. package/dist/{gas-DlhqN9k8.js → gas-BUZOHBVw.js} +1 -1
  129. package/dist/{gherkin-0SlhEZ3t.js → gherkin-CrSjX26K.js} +1 -1
  130. package/dist/gitGraph-4MIJSDKK-Ch7kj-d2.js +2 -0
  131. package/dist/{gitGraphDiagram-WWUBYQGX-D5nSIzdE.js → gitGraphDiagram-WWUBYQGX-BPeDECwG.js} +4 -4
  132. package/dist/{glide-data-editor-BQ7uKbeo.js → glide-data-editor-BU_jOTDv.js} +6663 -2919
  133. package/dist/{glide-utils-DJyqh0EM.js → glide-utils-BkcGyXLQ.js} +109 -78
  134. package/dist/{globals-DSavh2ZB.js → globals-DziKJCFY.js} +3 -3
  135. package/dist/{graphlib-BmY_CCV9.js → graphlib-nlwT3Wvy.js} +177 -220
  136. package/dist/{groovy-YhcTMyvX.js → groovy-IgGNjeU9.js} +1 -1
  137. package/dist/hasIn-C20JsQ2m.js +28 -0
  138. package/dist/{haskell-CodLxrtT.js → haskell-Bs1k3a9s.js} +1 -1
  139. package/dist/{haxe-CiRWNFkH.js → haxe-CQ8Yb3XF.js} +1 -1
  140. package/dist/{highlighted-body-KPVGNVTW-zwjq21tf.js → highlighted-body-KPVGNVTW-XbLtWlYz.js} +5 -5
  141. package/dist/{cells-C8iCYvLU.js → html-to-image-CIm3PqDi.js} +26098 -26387
  142. package/dist/{idl-DZgBq75I.js → idl-DjnxoAWx.js} +1 -1
  143. package/dist/info-A6RAGUB7-DCz_Egh9.js +2 -0
  144. package/dist/{infoDiagram-27XIBGKW-XrDxhr0x.js → infoDiagram-27XIBGKW-N4ajFTXv.js} +4 -4
  145. package/dist/isArrayLikeObject-B-HXCsex.js +626 -0
  146. package/dist/isEmpty-CdX7MTE1.js +14 -0
  147. package/dist/{ishikawaDiagram-5VMMS53U-CD1muzov.js → ishikawaDiagram-5VMMS53U-Bb2itmv5.js} +5 -7
  148. package/dist/{javascript-BfNytHiM.js → javascript-BQtCoAFy.js} +2 -2
  149. package/dist/{journeyDiagram-3NMN7TZE-BaLqn-dZ.js → journeyDiagram-3NMN7TZE-D7hcb3Vx.js} +4 -4
  150. package/dist/{jsx-runtime-3BD1kT0s.js → jsx-runtime-6ZiU38At.js} +1 -1
  151. package/dist/{julia--tLIAG7q.js → julia-BfgtHJE5.js} +1 -1
  152. package/dist/{kanban-definition-UXKFOSKX-Dg9W142_.js → kanban-definition-UXKFOSKX-DWfkIEDX.js} +10 -10
  153. package/dist/{katex-BIdZGsyO.js → katex-BmPSeP5t.js} +15 -24
  154. package/dist/linear-BhKepphY.js +251 -0
  155. package/dist/{livescript-CVPfYnY_.js → livescript-gIdRPKtg.js} +1 -1
  156. package/dist/{loader-BQOfjTIJ.js → loader-BIlwkY0d.js} +12 -12
  157. package/dist/{lua-4Fa-T-qq.js → lua-CxFpWvnv.js} +2 -2
  158. package/dist/main.js +10300 -8421
  159. package/dist/{mathematica-CtYAy6GG.js → mathematica-QSveeEoW.js} +1 -1
  160. package/dist/{mbox-D0w9Ah1C.js → mbox-2JtaCPNT.js} +1 -1
  161. package/dist/{mermaid-CiAXjLpA.js → mermaid-BEBd0PHi.js} +170 -176
  162. package/dist/mermaid-HWGCJPDP-_lKUMvTM.js +1 -0
  163. package/dist/{mermaid-parser.core-DxuSfYwJ.js → mermaid-parser.core-DtOnl7m4.js} +19 -25
  164. package/dist/{mhchem-CdWPJK6g.js → mhchem-CjWbCsjZ.js} +1 -1
  165. package/dist/{micromark-factory-space-DGxAzmw8.js → micromark-factory-space-C5soVmaM.js} +1 -1
  166. package/dist/{mindmap-definition-YA3MSWOX-DgCidgYJ.js → mindmap-definition-YA3MSWOX-CmGSiRxU.js} +13 -13
  167. package/dist/{mirc-De9aSAZM.js → mirc-BqD6ade4.js} +1 -1
  168. package/dist/{mllike-BbugeaY_.js → mllike-CT0hgEOO.js} +1 -1
  169. package/dist/{modelica-BjJwWw1F.js → modelica-DKKebcvq.js} +1 -1
  170. package/dist/{mscgen-DwiRH5ma.js → mscgen-BJCCsWjR.js} +1 -1
  171. package/dist/{mumps--plbDM9o.js → mumps-DVQAXZkU.js} +1 -1
  172. package/dist/{nginx-C4Df7REc.js → nginx-AP4LH2NN.js} +1 -1
  173. package/dist/{node-sql-parser-BiZOJ-FS.js → node-sql-parser-C9dndbfr.js} +7184 -7195
  174. package/dist/{now-jM8-M7IR.js → now-BKZCLE5P.js} +12 -13
  175. package/dist/{nsis-fiiOqLc3.js → nsis-Cah9xkdT.js} +1 -1
  176. package/dist/{ntriples-jV77I4k8.js → ntriples-CQoaLOV6.js} +2 -2
  177. package/dist/{number-overlay-editor-D6kYaqh5.js → number-overlay-editor-BaZBWVbO.js} +16 -21
  178. package/dist/{objects-CzUgoMIF.js → objects-DCmMvZtn.js} +1 -3
  179. package/dist/{octave-Cztd01tF.js → octave-CeDj2bTn.js} +1 -1
  180. package/dist/{once-BtE-wKRL.js → once-NnpX_HnX.js} +1 -1
  181. package/dist/{oz-Bl8o3BDl.js → oz-BksQrg3k.js} +1 -1
  182. package/dist/packet-AYTQ26CC-DEMHgLPq.js +2 -0
  183. package/dist/{pascal-BO5JqysR.js → pascal-BKL17mpl.js} +1 -1
  184. package/dist/{pegDiagram-XKGWAZYB-coOYYKB6.js → pegDiagram-XKGWAZYB-dXflGNi0.js} +5 -5
  185. package/dist/pencil-BGy5pfXo.js +10 -0
  186. package/dist/{perl-Drlh9s6m.js → perl-CacqJ-Ss.js} +1 -1
  187. package/dist/pick-DgpAbcwP.js +35 -0
  188. package/dist/pie-WAS4IAKB-DMjTEeHd.js +2 -0
  189. package/dist/{pieDiagram-E7YTZNPT-BnXTc3bj.js → pieDiagram-E7YTZNPT-Bl9G_NNa.js} +7 -7
  190. package/dist/{pig-BWGR8wZw.js → pig-CXSGZ_K9.js} +1 -1
  191. package/dist/{powershell-DT99xlz_.js → powershell-DY_yIxBM.js} +3 -6
  192. package/dist/precisionRound-DhAzeRcm.js +49 -0
  193. package/dist/{process-output-e4jj9Ijt.js → process-output-DAVapIAQ.js} +6 -6
  194. package/dist/{properties-Q-rkxld0.js → properties-Om0IDE07.js} +1 -1
  195. package/dist/{protobuf-DKyWZbs7.js → protobuf-B8nxxb4Q.js} +1 -1
  196. package/dist/{pug-42ZJUbEC.js → pug-lkUBPvVS.js} +3 -7
  197. package/dist/{puppet-B4UozHhh.js → puppet-DMkXsi4d.js} +1 -1
  198. package/dist/purify.es-DmnrIjg4.js +877 -0
  199. package/dist/{python-DREjAV__.js → python-JQVycMgr.js} +1 -1
  200. package/dist/{q-Bi63IpBO.js → q-DqE__nNB.js} +1 -1
  201. package/dist/{quadrantDiagram-AXDQQJYC-Ccw0xMjN.js → quadrantDiagram-AXDQQJYC-DLJJzlPi.js} +3 -3
  202. package/dist/{r-DSwXWKMR.js → r-Cbliap7Q.js} +1 -1
  203. package/dist/radar-RG4KPBEZ-9PwdCvai.js +2 -0
  204. package/dist/railroad-74A4TZTK-8N9kF5jl.js +2 -0
  205. package/dist/railroad-abnf-HS5TGJTU-Sg6YmzlR.js +2 -0
  206. package/dist/railroad-ebnf-LZEXJU2U-CYwp2Oee.js +2 -0
  207. package/dist/railroad-peg-WCYAUIDC-BfDkAuQ3.js +2 -0
  208. package/dist/{railroadDiagram-O6MQD6OU-B28-u83n.js → railroadDiagram-O6MQD6OU-Dg7GUHj4.js} +5 -5
  209. package/dist/{react-sHtZdjeP.js → react-CHbZqgBF.js} +1 -1
  210. package/dist/{react-dom-DUmH0GXv.js → react-dom-DhWGW7e0.js} +3 -3
  211. package/dist/{react-vega-BED0DjiB.js → react-vega-DVr24mNk.js} +13653 -13722
  212. package/dist/{requirementDiagram-BXWQKSXE-CdYCTMu0.js → requirementDiagram-BXWQKSXE-JNZB3XKK.js} +13 -13
  213. package/dist/{reveal-component-BTBfJ3ju.js → reveal-component-vRQ0ZbEq.js} +1171 -1284
  214. package/dist/{rolldown-runtime-Cb76FRpK.js → rolldown-runtime-BPCzCO3I.js} +1 -1
  215. package/dist/{rpm-DPb1DeKM.js → rpm-DmT_LNpE.js} +1 -1
  216. package/dist/{ruby-U7fZA4DP.js → ruby-BHVZTtLW.js} +1 -1
  217. package/dist/{sankeyDiagram-P5KCCOFB-ELvOcnZH.js → sankeyDiagram-P5KCCOFB-Bd7wvmbF.js} +2 -2
  218. package/dist/{sas-CLk1JpTn.js → sas-CrG5N1he.js} +1 -1
  219. package/dist/{scheme-CT-2k2Tl.js → scheme-BHUnz-IB.js} +1 -1
  220. package/dist/select-Ba_tMQWZ.js +1200 -0
  221. package/dist/{semaphore-89jsoHtS.js → semaphore-8KhQouXt.js} +4 -5
  222. package/dist/{sequenceDiagram-WJ2MYXX4-CM3aRAe_.js → sequenceDiagram-WJ2MYXX4-DekbwWOI.js} +6 -6
  223. package/dist/{shell-BLO7fcsk.js → shell-C5IBmRU5.js} +1 -1
  224. package/dist/{sieve-nG3C7WNH.js → sieve-BzCnt_E6.js} +2 -2
  225. package/dist/{sizeCapture-INFHLROL-Dx5SpkQF.js → sizeCapture-INFHLROL-DBeZ20mI.js} +1 -1
  226. package/dist/{smalltalk-BROcZybA.js → smalltalk-DQFAQul3.js} +1 -1
  227. package/dist/{solr-mVltHNc5.js → solr-BiapYPCk.js} +1 -1
  228. package/dist/{sparql-Cv1Ksr4v.js → sparql-BcUKO1is.js} +1 -1
  229. package/dist/{spec-BwarBpUJ.js → spec-CN3OxHz7.js} +42 -12
  230. package/dist/{src-CA_m4ONl.js → src-D5uZaZib.js} +8 -14
  231. package/dist/{stateDiagram-D77RDMKH-DOZUMVj8.js → stateDiagram-D77RDMKH-COzvSaN-.js} +18 -18
  232. package/dist/stateDiagram-v2-MP3YSRHH-rCvxZ0L8.js +30 -0
  233. package/dist/static-state-BJdfR8Bn.js +68 -0
  234. package/dist/{stex-Btf3omL8.js → stex-CQ_aCGTF.js} +1 -1
  235. package/dist/style.css +1 -1
  236. package/dist/{stylus-Dt4VvLXL.js → stylus-D4gHF5lg.js} +1 -1
  237. package/dist/{swift-DHsn_CVI.js → swift-CnvIBnbt.js} +1 -1
  238. package/dist/{swimlanes-42K2YHIH-BkSppxp8.js → swimlanes-42K2YHIH-DX2mMlXc.js} +37 -59
  239. package/dist/swimlanesDiagram-VR7AAH4N-DswSPZ5e.js +30 -0
  240. package/dist/{swiper-component-DKntyn8p.js → swiper-component-FBPvIqLf.js} +45 -78
  241. package/dist/{tcl-CV0OLBOl.js → tcl-DkOjjZYO.js} +1 -1
  242. package/dist/{textile-D320oKVM.js → textile-DgzBVSEW.js} +1 -1
  243. package/dist/{tiki-BF2aDPlB.js → tiki-MighF8A_.js} +1 -1
  244. package/dist/{time-BieKwdYS.js → time-Cc-G3e31.js} +19 -19
  245. package/dist/{timeline-definition-24CTP7MA-CaMQayqK.js → timeline-definition-24CTP7MA-DAT9AlwV.js} +5 -5
  246. package/dist/toast-BRd_eTIj.js +491 -0
  247. package/dist/{toml-CaUN7UHo.js → toml-B0B7UAba.js} +1 -1
  248. package/dist/{tooltip-BO1REbqs.js → tooltip-CHvXUQVs.js} +332 -308
  249. package/dist/treeView-Q6P3EWNA-BQywp0E1.js +2 -0
  250. package/dist/treemap-WGGIJYW6-P2ZJnldw.js +2 -0
  251. package/dist/{troff-DQUFcClZ.js → troff-B4IRX71y.js} +1 -1
  252. package/dist/{ttcn-CQL1duJS.js → ttcn-B4tpvdJD.js} +1 -1
  253. package/dist/{ttcn-cfg-BMmEFJPu.js → ttcn-cfg-pfE-1FV8.js} +1 -1
  254. package/dist/{turtle-C3esgsRr.js → turtle-Bc97ufp6.js} +1 -1
  255. package/dist/use-restore-focus-Ckq0jQzc.js +7534 -0
  256. package/dist/{use-vega-container-remeasure-Bz4PZMtt.js → use-vega-container-remeasure-DFBTESqc.js} +4 -8
  257. package/dist/{useAsyncData-Deh5kszT.js → useAsyncData-DMBliR6D.js} +21 -20
  258. package/dist/{useDateFormatter-D8XruNGG.js → useDateFormatter-CIPe17AG.js} +4 -4
  259. package/dist/{useDeepCompareMemoize-DXwzRINI.js → useDeepCompareMemoize-Kg-7A4b-.js} +3 -3
  260. package/dist/useEvent-xDnF2X04.js +19 -0
  261. package/dist/{useIframeCapabilities-DBETvvPl.js → useIframeCapabilities--px_wpZL.js} +2 -2
  262. package/dist/useLifecycle-BKVRcyGu.js +112 -0
  263. package/dist/{vb-RK1eDXRl.js → vb-C5kpOY_q.js} +1 -1
  264. package/dist/{vbscript-BCOeM0de.js → vbscript-Ck0hgOg5.js} +1 -1
  265. package/dist/{vega-component-DG29TAB7.js → vega-component-C23pVuni.js} +167 -172
  266. package/dist/{vega-embed-container-BNHE18G9.js → vega-embed-container-DAT8OHp9.js} +7 -7
  267. package/dist/{vega-loader.browser-DNST6uVf.js → vega-loader.browser-Cnf7IHA8.js} +331 -543
  268. package/dist/{velocity-CZKOFbOI.js → velocity-2Doc6dgJ.js} +1 -1
  269. package/dist/{vennDiagram-4TSXK5OY-CF8pfaK3.js → vennDiagram-4TSXK5OY-E7CMtY2M.js} +4 -4
  270. package/dist/{verilog-DqQTzVn8.js → verilog-CmZmYe4R.js} +2 -2
  271. package/dist/{vhdl-vQr2bfmi.js → vhdl-esMnUHZm.js} +1 -1
  272. package/dist/wardley-WFR3VGLG-CIBJ6O2G.js +2 -0
  273. package/dist/{wardleyDiagram-VM6X3IG4-dGPu39d-.js → wardleyDiagram-VM6X3IG4-BjtOazpV.js} +5 -5
  274. package/dist/{webidl-DzX7N40e.js → webidl-G_RlXG7G.js} +1 -1
  275. package/dist/{xquery-Cw_Q_hGR.js → xquery-IUQpMoMl.js} +1 -1
  276. package/dist/{xychartDiagram-S5SC5T6Z-CP6-9q56.js → xychartDiagram-S5SC5T6Z-DC09jtph.js} +8 -8
  277. package/dist/{yacas-DiC4jJBE.js → yacas-ObL0t2h9.js} +1 -1
  278. package/dist/{z80-CUOQDEJO.js → z80-jyuJhy0k.js} +1 -1
  279. package/package.json +18 -21
  280. package/src/__mocks__/document.tsx +63 -0
  281. package/src/__mocks__/executions.ts +197 -0
  282. package/src/__mocks__/notebook.ts +3 -7
  283. package/src/__mocks__/partial.ts +26 -0
  284. package/src/__mocks__/requests.ts +1 -4
  285. package/src/__tests__/CellStatus.test.tsx +25 -26
  286. package/src/__tests__/fixtures/{pair-preview.ts → pair-config.ts} +4 -3
  287. package/src/__tests__/main.test.tsx +24 -1
  288. package/src/__tests__/module-entry.test.ts +44 -0
  289. package/src/__tests__/mount.test.ts +9 -9
  290. package/src/__tests__/{host-imports.test.ts → replica-imports.test.ts} +12 -11
  291. package/src/components/ai/__tests__/ai-model-dropdown.test.tsx +63 -0
  292. package/src/components/ai/ai-model-dropdown.tsx +11 -6
  293. package/src/components/app-config/__tests__/state.test.tsx +50 -0
  294. package/src/components/app-config/ai-config.tsx +156 -150
  295. package/src/components/app-config/app-config-button.tsx +6 -5
  296. package/src/components/app-config/app-config-form.tsx +5 -9
  297. package/src/components/app-config/common.tsx +7 -9
  298. package/src/components/app-config/data-form.tsx +112 -113
  299. package/src/components/app-config/mcp-config.tsx +30 -53
  300. package/src/components/app-config/user-config-form.css +91 -0
  301. package/src/components/app-config/user-config-form.tsx +266 -349
  302. package/src/components/chat/__tests__/capabilities-popover.test.tsx +0 -1
  303. package/src/components/chat/__tests__/chat-display.test.tsx +196 -0
  304. package/src/components/chat/__tests__/chat-markdown.test.tsx +43 -0
  305. package/src/components/chat/__tests__/chat-utils.test.ts +93 -1
  306. package/src/components/chat/__tests__/message-queue.test.tsx +17 -0
  307. package/src/components/chat/__tests__/notebook-access-selector.test.tsx +64 -0
  308. package/src/components/chat/__tests__/turn-timing.test.ts +84 -0
  309. package/src/components/chat/__tests__/use-assistant-turn.test.ts +95 -0
  310. package/src/components/chat/__tests__/user-message.test.tsx +27 -0
  311. package/src/components/chat/acp/__tests__/agent-panel-initialization.test.tsx +1 -1
  312. package/src/components/chat/acp/__tests__/agent-panel.test.tsx +22 -17
  313. package/src/components/chat/acp/__tests__/session-tabs.test.tsx +43 -0
  314. package/src/components/chat/acp/__tests__/state.test.ts +2 -2
  315. package/src/components/chat/acp/agent-panel.tsx +6 -3
  316. package/src/components/chat/acp/blocks.tsx +13 -12
  317. package/src/components/chat/acp/common.tsx +4 -5
  318. package/src/components/chat/acp/model-selector.tsx +1 -1
  319. package/src/components/chat/acp/session-tabs.tsx +8 -3
  320. package/src/components/chat/agent-activity.tsx +132 -0
  321. package/src/components/chat/capabilities-popover.tsx +2 -11
  322. package/src/components/chat/chat-components.tsx +9 -4
  323. package/src/components/chat/chat-display.tsx +131 -57
  324. package/src/components/chat/chat-history-popover.tsx +6 -1
  325. package/src/components/chat/chat-markdown.tsx +15 -0
  326. package/src/components/chat/chat-panel.tsx +216 -294
  327. package/src/components/chat/chat-typography.css +108 -0
  328. package/src/components/chat/chat-utils.ts +24 -35
  329. package/src/components/chat/notebook-access-selector.stories.tsx +22 -0
  330. package/src/components/chat/notebook-access-selector.tsx +100 -0
  331. package/src/components/chat/tool-call/__tests__/tool-labels.test.ts +76 -0
  332. package/src/components/chat/tool-call/__tests__/tool-step.test.tsx +57 -0
  333. package/src/components/chat/tool-call/shared.ts +6 -0
  334. package/src/components/chat/tool-call/tool-call-view.tsx +22 -76
  335. package/src/components/chat/tool-call/tool-labels.ts +172 -0
  336. package/src/components/chat/tool-call/tool-result.tsx +1 -1
  337. package/src/components/chat/tool-call/tool-step.tsx +145 -0
  338. package/src/components/chat/turn-timing.ts +73 -0
  339. package/src/components/chat/use-assistant-turn.ts +65 -0
  340. package/src/components/chat/use-chat-generation.ts +20 -0
  341. package/src/components/chat/user-message.tsx +145 -0
  342. package/src/components/data-table/TableBottomBar.tsx +4 -1
  343. package/src/components/data-table/TableTopBar.tsx +2 -0
  344. package/src/components/data-table/__tests__/chart-spec-model.test.ts +195 -195
  345. package/src/components/data-table/__tests__/column-explorer.test.tsx +27 -1
  346. package/src/components/data-table/__tests__/columns.test.tsx +105 -0
  347. package/src/components/data-table/__tests__/context-menu-interaction.test.tsx +130 -0
  348. package/src/components/data-table/__tests__/context-menu.test.ts +176 -0
  349. package/src/components/data-table/__tests__/data-table.test.tsx +1 -0
  350. package/src/components/data-table/__tests__/date-filter-inputs.test.tsx +24 -1
  351. package/src/components/data-table/__tests__/date-popover.test.tsx +72 -0
  352. package/src/components/data-table/__tests__/export-actions.test.tsx +434 -6
  353. package/src/components/data-table/__tests__/keyboard-selection.test.tsx +188 -0
  354. package/src/components/data-table/__tests__/pagination.test.tsx +28 -1
  355. package/src/components/data-table/__tests__/search-highlight.test.tsx +109 -0
  356. package/src/components/data-table/__tests__/url-detector.test.tsx +74 -0
  357. package/src/components/data-table/cell-selection/feature.ts +2 -2
  358. package/src/components/data-table/cell-selection/types.ts +2 -2
  359. package/src/components/data-table/charts/__tests__/chart-panel.test.tsx +74 -1
  360. package/src/components/data-table/charts/__tests__/spec-snapshot.test.ts +20 -20
  361. package/src/components/data-table/charts/__tests__/spec.test.ts +78 -52
  362. package/src/components/data-table/charts/__tests__/storage.test.ts +4 -1
  363. package/src/components/data-table/charts/chart-spec/spec.ts +68 -43
  364. package/src/components/data-table/charts/charts.tsx +40 -30
  365. package/src/components/data-table/charts/storage.ts +16 -5
  366. package/src/components/data-table/column-explorer-panel/column-explorer.tsx +1 -1
  367. package/src/components/data-table/column-formatting/types.ts +1 -2
  368. package/src/components/data-table/column-summary/chart-spec-model.tsx +23 -16
  369. package/src/components/data-table/column-summary/column-summary.tsx +2 -4
  370. package/src/components/data-table/column-visibility-dropdown.tsx +8 -13
  371. package/src/components/data-table/columns.tsx +45 -46
  372. package/src/components/data-table/context-menu.tsx +161 -46
  373. package/src/components/data-table/data-table.tsx +17 -1
  374. package/src/components/data-table/date-filter-inputs.tsx +15 -42
  375. package/src/components/data-table/date-popover.tsx +6 -4
  376. package/src/components/data-table/export-actions.tsx +267 -163
  377. package/src/components/data-table/pagination.tsx +44 -33
  378. package/src/components/data-table/range-focus/atoms.ts +4 -6
  379. package/src/components/data-table/range-focus/use-cell-range-selection.ts +65 -38
  380. package/src/components/data-table/range-focus/use-scroll-into-view.ts +21 -2
  381. package/src/components/data-table/renderers.tsx +16 -7
  382. package/src/components/data-table/row-viewer-panel/__tests__/row-viewer.test.tsx +24 -1
  383. package/src/components/data-table/row-viewer-panel/row-viewer.tsx +4 -4
  384. package/src/components/data-table/schemas.ts +14 -36
  385. package/src/components/data-table/search-highlight.tsx +79 -0
  386. package/src/components/data-table/types.ts +1 -0
  387. package/src/components/data-table/url-detector.tsx +49 -9
  388. package/src/components/data-table/utils.ts +18 -0
  389. package/src/components/datasources/__tests__/column-actions.test.tsx +97 -0
  390. package/src/components/datasources/__tests__/column-preview.test.tsx +96 -5
  391. package/src/components/datasources/__tests__/datasources-interactions.test.tsx +181 -0
  392. package/src/components/datasources/__tests__/table-list.test.tsx +118 -0
  393. package/src/components/datasources/__tests__/utils.test.ts +57 -6
  394. package/src/components/datasources/column-preview.tsx +17 -12
  395. package/src/components/datasources/datasources.tsx +56 -43
  396. package/src/components/datasources/utils.ts +32 -23
  397. package/src/components/debugger/debugger-code.tsx +5 -0
  398. package/src/components/dependency-graph/custom-node.tsx +1 -1
  399. package/src/components/dependency-graph/dependency-graph-tree.tsx +8 -8
  400. package/src/components/dependency-graph/elements.ts +24 -21
  401. package/src/components/dependency-graph/minimap-content.tsx +15 -20
  402. package/src/components/dependency-graph/panels.tsx +4 -2
  403. package/src/components/dependency-graph/utils/__tests__/layout.test.ts +18 -11
  404. package/src/components/editor/Output.tsx +9 -2
  405. package/src/components/editor/SortableCell.tsx +1 -3
  406. package/src/components/editor/__tests__/Output.test.tsx +50 -32
  407. package/src/components/editor/__tests__/agent-toast.test.tsx +58 -0
  408. package/src/components/editor/__tests__/data-attributes.test.tsx +28 -23
  409. package/src/components/editor/__tests__/dynamic-favicon.test.tsx +111 -18
  410. package/src/components/editor/__tests__/output-persistence.test.tsx +28 -9
  411. package/src/components/editor/__tests__/package-alert.test.tsx +22 -1
  412. package/src/components/editor/actions/__tests__/name-cell-input.test.tsx +69 -0
  413. package/src/components/editor/actions/__tests__/pair-with-agent-commands.test.ts +69 -260
  414. package/src/components/editor/actions/__tests__/pair-with-agent-modal.test.tsx +222 -43
  415. package/src/components/editor/actions/__tests__/pair-with-agent.test.tsx +6 -24
  416. package/src/components/editor/actions/__tests__/useCellActionButton.test.tsx +131 -0
  417. package/src/components/editor/actions/name-cell-input.tsx +4 -3
  418. package/src/components/editor/actions/pair-with-agent-commands.ts +48 -54
  419. package/src/components/editor/actions/pair-with-agent-modal.tsx +102 -43
  420. package/src/components/editor/actions/pair-with-agent.tsx +16 -39
  421. package/src/components/editor/actions/useCellActionButton.tsx +47 -35
  422. package/src/components/editor/actions/useConfigActions.tsx +3 -4
  423. package/src/components/editor/actions/useNotebookActions.tsx +25 -29
  424. package/src/components/editor/actions/useRestartKernel.tsx +1 -1
  425. package/src/components/editor/actions/useSetCodeVisibility.ts +11 -12
  426. package/src/components/editor/actions/useSetOutputsExpanded.ts +14 -19
  427. package/src/components/editor/agent-toast.ts +15 -0
  428. package/src/components/editor/ai/ai-completion-editor.tsx +2 -1
  429. package/src/components/editor/ai/completion-handlers.tsx +0 -37
  430. package/src/components/editor/ai/prompt-input.tsx +189 -0
  431. package/src/components/editor/alerts/__tests__/connection-notice.test.tsx +1 -1
  432. package/src/components/editor/alerts/connection-notice.tsx +1 -1
  433. package/src/components/editor/alerts/startup-logs-alert.tsx +1 -0
  434. package/src/components/editor/alerts/stdin-blocking-alert.tsx +4 -2
  435. package/src/components/editor/app-container.tsx +1 -1
  436. package/src/components/editor/boundary/__tests__/ErrorBoundary.test.tsx +1 -1
  437. package/src/components/editor/cell/CellStatus.tsx +28 -23
  438. package/src/components/editor/cell/CreateCellButton.tsx +15 -21
  439. package/src/components/editor/cell/DeleteButton.tsx +3 -2
  440. package/src/components/editor/cell/RunButton.tsx +18 -8
  441. package/src/components/editor/cell/StagedAICell.tsx +52 -137
  442. package/src/components/editor/cell/StopButton.tsx +2 -2
  443. package/src/components/editor/cell/__tests__/useRunCells.test.tsx +169 -0
  444. package/src/components/editor/cell/__tests__/useShouldShowInterrupt.test.ts +39 -0
  445. package/src/components/editor/cell/cell-actions.tsx +12 -1
  446. package/src/components/editor/cell/cell-context-menu.tsx +4 -1
  447. package/src/components/editor/cell/code/__tests__/language-toggle.test.tsx +54 -0
  448. package/src/components/editor/cell/code/cell-editor.tsx +65 -169
  449. package/src/components/editor/cell/code/language-toggle.tsx +8 -7
  450. package/src/components/editor/cell/collapse.tsx +16 -6
  451. package/src/components/editor/cell/useAddCell.ts +4 -8
  452. package/src/components/editor/cell/useDeleteCell.tsx +10 -36
  453. package/src/components/editor/cell/useRunCells.ts +49 -8
  454. package/src/components/editor/cell/useShouldShowInterrupt.ts +2 -12
  455. package/src/components/editor/cell/useSplitCell.tsx +10 -6
  456. package/src/components/editor/chrome/components/__tests__/feedback-button.test.tsx +1 -1
  457. package/src/components/editor/chrome/components/feedback-button.tsx +2 -8
  458. package/src/components/editor/chrome/panels/__tests__/packages-panel.test.tsx +31 -2
  459. package/src/components/editor/chrome/panels/__tests__/runtime-details.test.tsx +1 -1
  460. package/src/components/editor/chrome/panels/__tests__/sandbox-recovery.test.tsx +1 -1
  461. package/src/components/editor/chrome/panels/cache-panel.tsx +1 -0
  462. package/src/components/editor/chrome/panels/dependency-graph-panel.tsx +1 -1
  463. package/src/components/editor/chrome/panels/error-panel.tsx +1 -0
  464. package/src/components/editor/chrome/panels/logs-panel.tsx +2 -1
  465. package/src/components/editor/chrome/panels/outline/__tests__/outline-keyboard.test.tsx +84 -0
  466. package/src/components/editor/chrome/panels/outline/floating-outline.tsx +39 -14
  467. package/src/components/editor/chrome/panels/outline/useActiveOutline.tsx +3 -2
  468. package/src/components/editor/chrome/panels/packages-panel.tsx +4 -7
  469. package/src/components/editor/chrome/panels/panel-header.tsx +13 -0
  470. package/src/components/editor/chrome/panels/secrets-panel.tsx +1 -0
  471. package/src/components/editor/chrome/panels/session-panel.tsx +1 -1
  472. package/src/components/editor/chrome/panels/snippets-panel.tsx +10 -12
  473. package/src/components/editor/chrome/panels/variable-panel.tsx +1 -5
  474. package/src/components/editor/chrome/types.ts +1 -1
  475. package/src/components/editor/chrome/wrapper/__tests__/attachment-status.test.tsx +364 -0
  476. package/src/components/editor/chrome/wrapper/__tests__/document-sync-status.test.tsx +92 -0
  477. package/src/components/editor/chrome/wrapper/__tests__/pending-ai-cells.test.tsx +265 -37
  478. package/src/components/editor/chrome/wrapper/__tests__/useAskAiAboutCell.test.tsx +58 -0
  479. package/src/components/editor/chrome/wrapper/app-chrome.tsx +91 -74
  480. package/src/components/editor/chrome/wrapper/footer-item.tsx +32 -24
  481. package/src/components/editor/chrome/wrapper/footer-items/attachment-status.tsx +237 -0
  482. package/src/components/editor/chrome/wrapper/footer-items/backend-status.tsx +1 -1
  483. package/src/components/editor/chrome/wrapper/footer-items/document-sync-status.tsx +54 -0
  484. package/src/components/editor/chrome/wrapper/footer-items/lsp-status.tsx +1 -1
  485. package/src/components/editor/chrome/wrapper/footer-items/machine-stats.tsx +1 -1
  486. package/src/components/editor/chrome/wrapper/footer-items/runtime-settings.tsx +1 -7
  487. package/src/components/editor/chrome/wrapper/footer.tsx +4 -2
  488. package/src/components/editor/chrome/wrapper/minimap-state.ts +1 -1
  489. package/src/components/editor/chrome/wrapper/pending-ai-cells.tsx +143 -72
  490. package/src/components/editor/chrome/wrapper/pending-ai-changes-badge.tsx +25 -0
  491. package/src/components/editor/chrome/wrapper/sidebar.tsx +8 -4
  492. package/src/components/editor/chrome/wrapper/storage.ts +1 -1
  493. package/src/components/editor/chrome/wrapper/useAskAiAboutCell.ts +36 -0
  494. package/src/components/editor/columns/__tests__/cell-column.test.tsx +1 -1
  495. package/src/components/editor/columns/cell-column.tsx +1 -1
  496. package/src/components/editor/columns/sortable-column.tsx +2 -2
  497. package/src/components/editor/connections/components.tsx +5 -10
  498. package/src/components/editor/controls/Controls.tsx +4 -4
  499. package/src/components/editor/controls/__tests__/command-palette.test.tsx +53 -0
  500. package/src/components/editor/controls/__tests__/keyboard-shortcuts.test.tsx +61 -0
  501. package/src/components/editor/controls/__tests__/notebook-menu-dropdown.test.tsx +10 -4
  502. package/src/components/editor/controls/command-palette.tsx +22 -10
  503. package/src/components/editor/controls/keyboard-shortcuts.tsx +14 -5
  504. package/src/components/editor/documentation.css +34 -11
  505. package/src/components/editor/dynamic-favicon.tsx +21 -40
  506. package/src/components/editor/errors/__tests__/send-error-report-button.test.tsx +541 -0
  507. package/src/components/editor/errors/auto-fix.tsx +4 -8
  508. package/src/components/editor/errors/send-error-report-button.tsx +66 -0
  509. package/src/components/editor/file-tree/__tests__/file-explorer-interactions.test.tsx +6 -0
  510. package/src/components/editor/file-tree/__tests__/file-explorer-navigation.test.tsx +47 -0
  511. package/src/components/editor/file-tree/__tests__/use-file-search.test.tsx +91 -0
  512. package/src/components/editor/file-tree/file-explorer.tsx +48 -15
  513. package/src/components/editor/file-tree/file-name-input.tsx +1 -0
  514. package/src/components/editor/file-tree/file-viewer.tsx +4 -2
  515. package/src/components/editor/file-tree/use-file-search.ts +35 -21
  516. package/src/components/editor/header/__tests__/filename-form.test.tsx +1 -4
  517. package/src/components/editor/header/__tests__/status.test.tsx +5 -3
  518. package/src/components/editor/header/app-header.tsx +1 -1
  519. package/src/components/editor/header/filename-form.tsx +1 -1
  520. package/src/components/editor/header/status.tsx +44 -22
  521. package/src/components/editor/links/__tests__/cell-link.test.tsx +148 -0
  522. package/src/components/editor/links/cell-link-list.tsx +1 -1
  523. package/src/components/editor/links/cell-link.tsx +21 -11
  524. package/src/components/editor/navigation/__tests__/clipboard.test.ts +60 -38
  525. package/src/components/editor/navigation/__tests__/navigation.test.ts +108 -85
  526. package/src/components/editor/navigation/__tests__/selection.test.ts +43 -21
  527. package/src/components/editor/navigation/clipboard.ts +17 -14
  528. package/src/components/editor/navigation/focus-utils.ts +23 -4
  529. package/src/components/editor/navigation/multi-cell-action-toolbar.tsx +17 -33
  530. package/src/components/editor/navigation/navigation.ts +74 -72
  531. package/src/components/editor/navigation/selection.ts +30 -29
  532. package/src/components/editor/notebook-banner.tsx +1 -0
  533. package/src/components/editor/notebook-cell.tsx +126 -152
  534. package/src/components/editor/output/MarimoErrorOutput.tsx +60 -7
  535. package/src/components/editor/output/MarimoTracebackOutput.tsx +54 -37
  536. package/src/components/editor/output/Outputs.css +8 -0
  537. package/src/components/editor/output/VideoOutput.tsx +6 -0
  538. package/src/components/editor/output/__tests__/VideoOutput.test.tsx +131 -0
  539. package/src/components/editor/output/__tests__/ansi-reduce.test.ts +18 -0
  540. package/src/components/editor/output/__tests__/traceback.test.tsx +27 -1
  541. package/src/components/editor/output/ansi-reduce.ts +36 -17
  542. package/src/components/editor/output/console/ConsoleOutput.tsx +19 -25
  543. package/src/components/editor/output/console/__tests__/ConsoleOutput.test.tsx +125 -69
  544. package/src/components/editor/package-alert.tsx +14 -7
  545. package/src/components/editor/renderers/__tests__/add-cell-buttons.test.tsx +18 -0
  546. package/src/components/editor/renderers/cell-array.tsx +32 -100
  547. package/src/components/editor/renderers/grid-layout/__tests__/grid-layout.test.tsx +75 -0
  548. package/src/components/editor/renderers/grid-layout/grid-layout.tsx +28 -22
  549. package/src/components/editor/renderers/slides-layout/__tests__/plugin.test.ts +0 -4
  550. package/src/components/editor/renderers/slides-layout/slides-layout.tsx +1 -1
  551. package/src/components/editor/renderers/vertical-layout/__tests__/useFocusFirstEditor.test.ts +4 -4
  552. package/src/components/editor/renderers/vertical-layout/sidebar/toggle.tsx +7 -1
  553. package/src/components/editor/renderers/vertical-layout/useFocusFirstEditor.ts +1 -1
  554. package/src/components/editor/renderers/vertical-layout/vertical-layout.tsx +19 -37
  555. package/src/components/editor/stdin-blocking-alert.tsx +4 -2
  556. package/src/components/home/components.tsx +17 -31
  557. package/src/components/icons/__tests__/large-spinner.test.tsx +39 -0
  558. package/src/components/icons/large-spinner.tsx +3 -14
  559. package/src/components/icons/spinner.tsx +1 -1
  560. package/src/components/markdown/__tests__/markdown-renderer.test.tsx +32 -2
  561. package/src/components/markdown/markdown-renderer.tsx +43 -28
  562. package/src/components/mcp/mcp-status-indicator.tsx +18 -14
  563. package/src/components/pages/__tests__/home-page.test.tsx +116 -0
  564. package/src/components/pages/edit-page.tsx +19 -17
  565. package/src/components/pages/home-page.tsx +164 -91
  566. package/src/components/scratchpad/scratchpad.test.tsx +89 -0
  567. package/src/components/scratchpad/scratchpad.tsx +47 -33
  568. package/src/components/scratchpad/state.ts +7 -0
  569. package/src/components/slides/__tests__/minimap-actions.test.tsx +22 -29
  570. package/src/components/slides/__tests__/minimap.test.ts +38 -19
  571. package/src/components/slides/__tests__/slide-scroll-hint.test.tsx +37 -0
  572. package/src/components/slides/minimap.tsx +22 -14
  573. package/src/components/slides/reveal-component.tsx +73 -36
  574. package/src/components/slides/reveal-slides.css +5 -4
  575. package/src/components/slides/slide-cell-view.tsx +37 -34
  576. package/src/components/slides/slide-form.tsx +1 -0
  577. package/src/components/slides/slide-scroll-hint.tsx +3 -1
  578. package/src/components/slides/slide.tsx +3 -4
  579. package/src/components/sort/SortableCellsProvider.tsx +8 -25
  580. package/src/components/tracing/tracing-keyboard.test.tsx +85 -0
  581. package/src/components/tracing/tracing.tsx +46 -42
  582. package/src/components/ui/__tests__/draggable-popover.test.tsx +24 -0
  583. package/src/components/ui/__tests__/fullscreen.test.tsx +44 -2
  584. package/src/components/ui/__tests__/range-slider.test.tsx +165 -0
  585. package/src/components/ui/alert-dialog.tsx +1 -1
  586. package/src/components/ui/draggable-popover.tsx +24 -2
  587. package/src/components/ui/fullscreen.tsx +25 -1
  588. package/src/components/ui/range-slider.tsx +22 -9
  589. package/src/components/ui/toast.tsx +1 -1
  590. package/src/core/MarimoApp.tsx +3 -1
  591. package/src/core/ai/__tests__/staged-cells.test.ts +89 -608
  592. package/src/core/ai/context/context.ts +2 -0
  593. package/src/core/ai/context/providers/__tests__/cell-output.test.ts +8 -12
  594. package/src/core/ai/context/providers/__tests__/cell.test.ts +49 -0
  595. package/src/core/ai/context/providers/cell-output.ts +2 -2
  596. package/src/core/ai/context/providers/cell.ts +54 -0
  597. package/src/core/ai/context/providers/datasource.ts +6 -2
  598. package/src/core/ai/staged-cells.ts +56 -323
  599. package/src/core/ai/state.ts +3 -0
  600. package/src/core/ai/tools/__tests__/edit-notebook-tool.test.ts +40 -88
  601. package/src/core/ai/tools/__tests__/registry.test.ts +17 -0
  602. package/src/core/ai/tools/base.ts +18 -15
  603. package/src/core/ai/tools/edit-notebook-tool.ts +86 -80
  604. package/src/core/ai/tools/registry.ts +13 -10
  605. package/src/core/ai/tools/sample-tool.ts +6 -7
  606. package/src/core/cells/__tests__/__snapshots__/cells.test.ts.snap +4 -529
  607. package/src/core/cells/__tests__/actions.test.ts +623 -35
  608. package/src/core/cells/__tests__/add-missing-import.test.ts +7 -8
  609. package/src/core/cells/__tests__/arrange.test.ts +432 -0
  610. package/src/core/cells/__tests__/cell.test.ts +148 -150
  611. package/src/core/cells/__tests__/cells.test.ts +408 -2891
  612. package/src/core/cells/__tests__/collapseConsoleOutputs.test.ts +54 -0
  613. package/src/core/cells/__tests__/document.test.ts +158 -0
  614. package/src/core/cells/__tests__/editor.test.ts +57 -0
  615. package/src/core/cells/__tests__/error-report.test.ts +139 -0
  616. package/src/core/cells/__tests__/flush-document.test.ts +40 -0
  617. package/src/core/cells/__tests__/harness.ts +106 -0
  618. package/src/core/cells/__tests__/layout.test.ts +176 -0
  619. package/src/core/cells/__tests__/logs.test.ts +0 -13
  620. package/src/core/cells/__tests__/notebook-outline.test.ts +122 -0
  621. package/src/core/cells/__tests__/outputs.test.tsx +71 -53
  622. package/src/core/cells/__tests__/pending-delete-service.test.tsx +11 -20
  623. package/src/core/cells/__tests__/session.test.ts +594 -210
  624. package/src/core/cells/__tests__/utils.test.ts +135 -337
  625. package/src/core/cells/actions.ts +677 -6
  626. package/src/core/cells/add-missing-import.ts +47 -43
  627. package/src/core/cells/arrange.ts +529 -0
  628. package/src/core/cells/cell.ts +78 -146
  629. package/src/core/cells/cells.ts +109 -1460
  630. package/src/core/cells/columns.ts +38 -0
  631. package/src/core/cells/document.ts +167 -0
  632. package/src/core/cells/edit.ts +30 -0
  633. package/src/core/cells/editor.ts +82 -0
  634. package/src/core/cells/error-report.ts +63 -0
  635. package/src/core/cells/focus.ts +27 -6
  636. package/src/core/cells/layout.ts +221 -0
  637. package/src/core/cells/outputs.ts +12 -28
  638. package/src/core/cells/pending-delete-service.ts +8 -14
  639. package/src/core/cells/scrollCellIntoView.ts +6 -0
  640. package/src/core/cells/session.ts +184 -59
  641. package/src/core/cells/types.ts +21 -51
  642. package/src/core/cells/utils.ts +85 -87
  643. package/src/core/codemirror/__tests__/format.test.ts +0 -34
  644. package/src/core/codemirror/__tests__/setup.test.ts +61 -29
  645. package/src/core/codemirror/ai/__tests__/resources.test.ts +117 -0
  646. package/src/core/codemirror/ai/resources.ts +1 -1
  647. package/src/core/codemirror/cells/__tests__/extensions.test.ts +2 -6
  648. package/src/core/codemirror/cells/extensions.ts +18 -30
  649. package/src/core/codemirror/cells/state.ts +2 -6
  650. package/src/core/codemirror/cm.ts +5 -1
  651. package/src/core/codemirror/config/types.ts +1 -1
  652. package/src/core/codemirror/copilot/__tests__/getCodes.test.ts +6 -7
  653. package/src/core/codemirror/copilot/getCodes.ts +2 -2
  654. package/src/core/codemirror/format.ts +6 -23
  655. package/src/core/codemirror/keymaps/vim.ts +4 -8
  656. package/src/core/codemirror/language/__tests__/sql.test.ts +22 -20
  657. package/src/core/codemirror/language/__tests__/utils.test.ts +187 -15
  658. package/src/core/codemirror/language/cell-code.ts +114 -0
  659. package/src/core/codemirror/language/extension.ts +52 -35
  660. package/src/core/codemirror/language/languages/markdown.ts +8 -6
  661. package/src/core/codemirror/language/languages/python.ts +19 -13
  662. package/src/core/codemirror/language/languages/sql/sql.ts +16 -24
  663. package/src/core/codemirror/language/panel/panel.tsx +1 -0
  664. package/src/core/codemirror/language/types.ts +7 -7
  665. package/src/core/codemirror/language/utils.ts +9 -39
  666. package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +1 -2
  667. package/src/core/codemirror/lsp/notebook-lsp.ts +6 -5
  668. package/src/core/codemirror/lsp/utils.ts +1 -1
  669. package/src/core/codemirror/misc/__tests__/paste.test.ts +3 -1
  670. package/src/core/codemirror/misc/paste.ts +1 -1
  671. package/src/core/codemirror/placeholder/__tests__/extensions.test.ts +75 -0
  672. package/src/core/codemirror/placeholder/extensions.ts +80 -19
  673. package/src/core/codemirror/readonly/__tests__/extension.test.ts +1 -1
  674. package/src/core/codemirror/readonly/extension.ts +2 -2
  675. package/src/core/codemirror/utils.ts +1 -0
  676. package/src/core/config/__tests__/app-config.test.ts +64 -0
  677. package/src/core/config/__tests__/config-schema.test.ts +56 -6
  678. package/src/core/config/config-schema.ts +17 -4
  679. package/src/core/config/config.ts +65 -20
  680. package/src/core/config/feature-flag.tsx +0 -2
  681. package/src/core/config/pair.ts +5 -3
  682. package/src/core/datasets/__tests__/data-source-discovery.test.ts +5 -5
  683. package/src/core/datasets/data-source-discovery.ts +4 -6
  684. package/src/core/documentation/doc-lookup.ts +1 -1
  685. package/src/core/dom/outline.ts +4 -1
  686. package/src/core/edit-app.tsx +22 -28
  687. package/src/core/errors/__tests__/error-entries.test.ts +40 -1
  688. package/src/core/errors/error-entries.ts +6 -4
  689. package/src/core/executions/__tests__/atoms.test.ts +98 -0
  690. package/src/core/executions/__tests__/freshness.test.ts +482 -0
  691. package/src/core/executions/__tests__/hooks.test.tsx +151 -0
  692. package/src/core/executions/__tests__/output.test.ts +266 -0
  693. package/src/core/executions/__tests__/select.test.ts +268 -0
  694. package/src/core/executions/atoms.ts +263 -0
  695. package/src/core/executions/freshness.ts +171 -0
  696. package/src/core/executions/hooks.ts +86 -0
  697. package/src/core/executions/index.ts +48 -0
  698. package/src/core/executions/output.ts +242 -0
  699. package/src/core/executions/select.ts +175 -0
  700. package/src/core/export/__tests__/hooks.test.ts +0 -5
  701. package/src/core/export/hooks.ts +1 -1
  702. package/src/core/export/layout.ts +2 -2
  703. package/src/core/hotkeys/actions.ts +2 -4
  704. package/src/core/hotkeys/hotkeys.ts +2 -1
  705. package/src/core/islands/__tests__/bootstrap.test.ts +69 -17
  706. package/src/core/islands/__tests__/bridge.test.ts +85 -27
  707. package/src/core/islands/bootstrap.ts +49 -54
  708. package/src/core/islands/bridge.ts +84 -25
  709. package/src/core/islands/components/__tests__/IslandControls.test.tsx +7 -5
  710. package/src/core/islands/components/__tests__/web-components.test.tsx +63 -0
  711. package/src/core/islands/components/output-wrapper.tsx +5 -5
  712. package/src/core/islands/components/web-components.tsx +12 -1
  713. package/src/core/islands/worker/__tests__/controller.test.ts +62 -4
  714. package/src/core/islands/worker/controller.ts +4 -10
  715. package/src/core/islands/worker/worker.tsx +33 -33
  716. package/src/core/kernel/__tests__/RuntimeState.test.ts +1 -1
  717. package/src/core/kernel/__tests__/handlers.test.ts +7 -157
  718. package/src/core/kernel/handlers.ts +13 -79
  719. package/src/core/kernel/state.ts +0 -15
  720. package/src/core/lifecycle/render-policy.ts +12 -26
  721. package/src/core/meta/__tests__/code-visibility.test.tsx +78 -70
  722. package/src/core/meta/code-visibility.ts +18 -9
  723. package/src/core/network/__tests__/connection.test.ts +1 -1
  724. package/src/core/network/__tests__/requests-lazy.test.ts +6 -8
  725. package/src/core/network/connection-notice.ts +1 -1
  726. package/src/core/network/connection.ts +5 -3
  727. package/src/core/network/requests-lazy.ts +5 -8
  728. package/src/core/network/requests-network.ts +5 -31
  729. package/src/core/network/requests-static.ts +1 -4
  730. package/src/core/network/requests-toasting.tsx +1 -4
  731. package/src/core/network/types.ts +6 -14
  732. package/src/core/network/useConnectionNotice.ts +8 -2
  733. package/src/core/notebook/__tests__/operations.test.ts +51 -0
  734. package/src/core/notebook/attachments.ts +38 -0
  735. package/src/core/notebook/document/__tests__/codemirror.test.ts +759 -0
  736. package/src/core/notebook/document/__tests__/draft.test.ts +363 -0
  737. package/src/core/notebook/document/__tests__/fixtures.ts +92 -0
  738. package/src/core/notebook/document/__tests__/hooks.test.tsx +391 -0
  739. package/src/core/notebook/document/__tests__/lifecycle-scenarios.test.ts +61 -0
  740. package/src/core/notebook/document/__tests__/model.test.ts +247 -0
  741. package/src/core/notebook/document/__tests__/protocol-fixtures.ts +38 -0
  742. package/src/core/notebook/document/__tests__/recovery-scenarios.test.ts +230 -0
  743. package/src/core/notebook/document/__tests__/scenario-fixture.ts +43 -0
  744. package/src/core/notebook/document/__tests__/scenarios.test.ts +205 -0
  745. package/src/core/notebook/document/__tests__/state.test.ts +459 -0
  746. package/src/core/notebook/document/__tests__/submission.test.ts +203 -0
  747. package/src/core/notebook/document/__tests__/test-host.test.ts +92 -0
  748. package/src/core/notebook/document/__tests__/test-host.ts +247 -0
  749. package/src/core/notebook/document/__tests__/test-notebook.ts +149 -0
  750. package/src/core/notebook/document/__tests__/user.ts +61 -0
  751. package/src/core/notebook/document/codemirror.ts +216 -0
  752. package/src/core/notebook/document/draft.ts +502 -0
  753. package/src/core/notebook/document/hooks.tsx +118 -0
  754. package/src/core/notebook/document/index.ts +24 -0
  755. package/src/core/notebook/document/model.ts +102 -0
  756. package/src/core/notebook/document/select.ts +41 -0
  757. package/src/core/notebook/document/state.ts +378 -0
  758. package/src/core/notebook/document/sync.ts +369 -0
  759. package/src/core/notebook/index.ts +19 -0
  760. package/src/core/notebook/operations.ts +30 -0
  761. package/src/core/notebook/replica/AGENTS.md +11 -0
  762. package/src/core/notebook/replica/__tests__/attachments.test.ts +56 -0
  763. package/src/core/notebook/replica/__tests__/document.test.ts +126 -0
  764. package/src/core/notebook/replica/__tests__/executions.test.ts +200 -0
  765. package/src/core/notebook/replica/__tests__/fixtures.ts +79 -0
  766. package/src/core/notebook/replica/__tests__/replica.test.ts +559 -0
  767. package/src/core/notebook/replica/__tests__/results.test.ts +193 -0
  768. package/src/core/notebook/replica/__tests__/runtime.test.ts +78 -0
  769. package/src/core/notebook/replica/backend.ts +19 -0
  770. package/src/core/{websocket/types.ts → notebook/replica/connection.ts} +10 -15
  771. package/src/core/notebook/replica/index.ts +20 -0
  772. package/src/core/notebook/replica/replica.ts +336 -0
  773. package/src/core/notebook/replica/resources/attachments.ts +22 -0
  774. package/src/core/notebook/replica/resources/document.ts +101 -0
  775. package/src/core/notebook/replica/resources/executions.ts +157 -0
  776. package/src/core/notebook/replica/resources/results.ts +48 -0
  777. package/src/core/notebook/replica/resources/runtime.ts +14 -0
  778. package/src/core/packages/__tests__/useSandboxController.test.tsx +1 -1
  779. package/src/core/packages/useSandboxController.ts +1 -1
  780. package/src/core/run-app.tsx +49 -51
  781. package/src/core/runtime/__tests__/adapter.test.ts +4 -4
  782. package/src/core/runtime/__tests__/createWsUrl.test.ts +77 -7
  783. package/src/core/runtime/__tests__/runtime.test.ts +33 -31
  784. package/src/core/runtime/adapter.ts +5 -5
  785. package/src/core/runtime/config.ts +2 -2
  786. package/src/core/runtime/runtime.ts +33 -32
  787. package/src/core/saving/__tests__/document.test.tsx +123 -0
  788. package/src/core/saving/__tests__/state.test.ts +111 -0
  789. package/src/core/saving/__tests__/useAutoSave.test.tsx +67 -0
  790. package/src/core/saving/document.ts +33 -0
  791. package/src/core/saving/filename.ts +1 -1
  792. package/src/core/saving/save-component.tsx +39 -60
  793. package/src/core/saving/state.ts +38 -39
  794. package/src/core/saving/useAutoSave.ts +17 -53
  795. package/src/core/session/__tests__/backend.test.ts +236 -0
  796. package/src/core/session/__tests__/useNotebookReplica.hook.test.tsx +186 -0
  797. package/src/core/{websocket/__tests__/useMarimoKernelConnection.hook.test.tsx → session/__tests__/useNotebookSession.hook.test.tsx} +282 -183
  798. package/src/core/session/active-notebook.ts +28 -0
  799. package/src/core/session/backend.ts +123 -0
  800. package/src/core/session/embedded.ts +7 -0
  801. package/src/core/session/types.ts +17 -0
  802. package/src/core/session/useNotebookReplica.ts +74 -0
  803. package/src/core/{websocket/useMarimoKernelConnection.tsx → session/useNotebookSession.tsx} +123 -276
  804. package/src/core/state/__tests__/jotai.test.tsx +108 -0
  805. package/src/core/state/jotai.ts +1 -1
  806. package/src/core/static/__tests__/files.test.ts +38 -10
  807. package/src/core/static/files.ts +2 -0
  808. package/src/core/{websocket/__tests__/useMarimoKernelConnection.test.ts → transports/__tests__/connection-state.test.ts} +16 -30
  809. package/src/core/transports/__tests__/server.test.ts +408 -0
  810. package/src/core/transports/__tests__/static.test.ts +340 -0
  811. package/src/core/transports/__tests__/wasm.test.ts +166 -0
  812. package/src/core/transports/connection-state.ts +63 -0
  813. package/src/core/transports/server.ts +152 -0
  814. package/src/core/transports/static.ts +173 -0
  815. package/src/core/transports/wasm.ts +97 -0
  816. package/src/core/vscode/__tests__/vscode-bindings.test.ts +125 -0
  817. package/src/core/vscode/vscode-bindings.ts +14 -2
  818. package/src/core/wasm/__tests__/bridge.test.ts +210 -64
  819. package/src/core/wasm/__tests__/worker.test.ts +188 -0
  820. package/src/core/wasm/bridge.ts +120 -73
  821. package/src/core/wasm/rpc.ts +15 -3
  822. package/src/core/wasm/store.ts +3 -3
  823. package/src/core/wasm/worker/bootstrap.ts +55 -51
  824. package/src/core/wasm/worker/getMarimoWheel.ts +1 -1
  825. package/src/core/wasm/worker/save-worker.ts +9 -10
  826. package/src/core/wasm/worker/types.ts +30 -18
  827. package/src/core/wasm/worker/worker.ts +118 -72
  828. package/src/css/app/Cell.css +7 -36
  829. package/src/css/app/codemirror.css +1 -1
  830. package/src/css/common.css +1 -1
  831. package/src/css/globals.css +72 -24
  832. package/src/hooks/__tests__/useAsyncData.test.tsx +148 -0
  833. package/src/hooks/__tests__/useDebounce.test.tsx +51 -0
  834. package/src/hooks/__tests__/useDeepCompareMemoize.test.tsx +39 -0
  835. package/src/hooks/__tests__/useDelayElapsed.test.tsx +28 -0
  836. package/src/hooks/__tests__/useInternalStateWithSync.test.tsx +20 -0
  837. package/src/hooks/__tests__/useScript.test.tsx +77 -0
  838. package/src/hooks/__tests__/useStateForKey.test.tsx +257 -0
  839. package/src/hooks/useAsyncData.ts +3 -3
  840. package/src/hooks/useDataSourceDiscovery.ts +6 -4
  841. package/src/hooks/useDebounce.ts +6 -10
  842. package/src/hooks/useDeepCompareMemoize.ts +1 -1
  843. package/src/hooks/useDelayElapsed.ts +14 -10
  844. package/src/hooks/useElapsedTime.ts +3 -3
  845. package/src/hooks/useEventListener.ts +1 -2
  846. package/src/hooks/useInputHistory.ts +4 -7
  847. package/src/hooks/useInternalStateWithSync.ts +6 -6
  848. package/src/hooks/useResizeObserver.ts +4 -7
  849. package/src/hooks/useScript.ts +67 -70
  850. package/src/hooks/useStateForKey.ts +93 -0
  851. package/src/mount.tsx +23 -14
  852. package/src/plugins/__tests__/plugin-object-schemas.test.ts +104 -0
  853. package/src/plugins/core/RenderHTML.tsx +3 -5
  854. package/src/plugins/core/__test__/PluginSlot.test.tsx +202 -0
  855. package/src/plugins/core/__test__/RenderHTML-copy.test.tsx +60 -0
  856. package/src/plugins/core/__test__/registerReactComponent.test.ts +45 -0
  857. package/src/plugins/core/__test__/sanitize.test.ts +8 -0
  858. package/src/plugins/core/registerReactComponent.tsx +29 -29
  859. package/src/plugins/core/sanitize-html.ts +6 -0
  860. package/src/plugins/impl/CodeEditorPlugin.tsx +1 -1
  861. package/src/plugins/impl/DataEditorPlugin.tsx +34 -13
  862. package/src/plugins/impl/DataTablePlugin.tsx +69 -37
  863. package/src/plugins/impl/DropdownPlugin.tsx +2 -6
  864. package/src/plugins/impl/FileBrowserPlugin.tsx +4 -16
  865. package/src/plugins/impl/FormPlugin.tsx +1 -1
  866. package/src/plugins/impl/RangeSliderPlugin.tsx +16 -2
  867. package/src/plugins/impl/RefreshPlugin.tsx +1 -0
  868. package/src/plugins/impl/SliderPlugin.tsx +6 -8
  869. package/src/plugins/impl/__tests__/DataEditorPlugin.test.ts +93 -4
  870. package/src/plugins/impl/__tests__/DataTablePlugin.test.tsx +471 -1
  871. package/src/plugins/impl/__tests__/FileBrowserPlugin.test.tsx +45 -0
  872. package/src/plugins/impl/__tests__/RangeSliderPlugin.test.tsx +109 -0
  873. package/src/plugins/impl/__tests__/SliderPlugin.test.tsx +24 -3
  874. package/src/plugins/impl/anywidget/__tests__/registry.test.ts +153 -0
  875. package/src/plugins/impl/anywidget/__tests__/widget-binding.test.ts +241 -2
  876. package/src/plugins/impl/anywidget/model.ts +3 -1
  877. package/src/plugins/impl/anywidget/registry.ts +18 -14
  878. package/src/plugins/impl/anywidget/runtime.ts +21 -9
  879. package/src/plugins/impl/anywidget/widget-binding.ts +160 -82
  880. package/src/plugins/impl/chat/__tests__/chat-prompts.test.tsx +93 -0
  881. package/src/plugins/impl/chat/chat-ui.tsx +17 -15
  882. package/src/plugins/impl/code/any-language-editor.tsx +2 -2
  883. package/src/plugins/impl/common/error-banner.tsx +5 -3
  884. package/src/plugins/impl/data-editor/__tests__/column-types.test.ts +42 -0
  885. package/src/plugins/impl/data-editor/__tests__/editor-state.test.ts +52 -1
  886. package/src/plugins/impl/data-editor/__tests__/glide-data-editor.test.tsx +120 -4
  887. package/src/plugins/impl/data-editor/__tests__/glide-utils.test.ts +116 -0
  888. package/src/plugins/impl/data-editor/column-types.ts +55 -0
  889. package/src/plugins/impl/data-editor/editor-state.ts +18 -2
  890. package/src/plugins/impl/data-editor/glide-data-editor.tsx +74 -12
  891. package/src/plugins/impl/data-editor/glide-utils.ts +39 -38
  892. package/src/plugins/impl/data-editor/types.ts +5 -0
  893. package/src/plugins/impl/data-explorer/ConnectedDataExplorerComponent.tsx +1 -1
  894. package/src/plugins/impl/data-explorer/components/column-summary.tsx +4 -2
  895. package/src/plugins/impl/data-explorer/state/reducer.ts +1 -1
  896. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +1 -2
  897. package/src/plugins/impl/data-frames/__tests__/sidebar.test.tsx +160 -0
  898. package/src/plugins/impl/data-frames/forms/__tests__/__snapshots__/form.test.tsx.snap +66 -66
  899. package/src/plugins/impl/data-frames/panel.tsx +44 -16
  900. package/src/plugins/impl/mpl-interactive/MplInteractivePlugin.tsx +5 -3
  901. package/src/plugins/impl/panel/PanelPlugin.tsx +16 -17
  902. package/src/plugins/impl/panel/__tests__/utils.test.ts +39 -1
  903. package/src/plugins/impl/panel/utils.ts +17 -0
  904. package/src/plugins/impl/plotly/PlotlyPlugin.tsx +2 -5
  905. package/src/plugins/impl/plotly/selection.ts +25 -19
  906. package/src/plugins/impl/vega/VegaPlugin.tsx +2 -3
  907. package/src/plugins/impl/vega/make-selectable.ts +4 -7
  908. package/src/plugins/layout/DownloadPlugin.tsx +7 -11
  909. package/src/plugins/layout/LazyPlugin.tsx +7 -4
  910. package/src/plugins/layout/RoutesPlugin.tsx +1 -1
  911. package/src/plugins/layout/__test__/DownloadPlugin.test.tsx +205 -0
  912. package/src/plugins/layout/__tests__/LazyPlugin.test.tsx +98 -0
  913. package/src/stories/__tests__/editor-story.test.tsx +33 -0
  914. package/src/stories/button.stories.tsx +1 -0
  915. package/src/stories/cell-status.stories.tsx +29 -24
  916. package/src/stories/cell.stories.tsx +46 -46
  917. package/src/stories/data-table.stories.tsx +31 -0
  918. package/src/stories/editor.stories.tsx +24 -17
  919. package/src/stories/form-wrapper.stories.tsx +2 -2
  920. package/src/stories/layout/vertical/one-column.stories.tsx +28 -42
  921. package/src/stories/runtime-story.tsx +23 -17
  922. package/src/stories/select.stories.tsx +2 -2
  923. package/src/stories/switchable-multi-select.stories.tsx +1 -1
  924. package/src/theme/__tests__/islands-theme.test.tsx +276 -0
  925. package/src/theme/namespace.tsx +4 -3
  926. package/src/theme/useTheme.ts +71 -41
  927. package/src/utils/__tests__/arrays.test.ts +35 -0
  928. package/src/utils/__tests__/batch-requests.test.ts +3 -3
  929. package/src/utils/__tests__/{createReducer.test.ts → createReducer.test.tsx} +127 -1
  930. package/src/utils/__tests__/dates.test.ts +116 -0
  931. package/src/utils/__tests__/download.test.tsx +183 -23
  932. package/src/utils/__tests__/numbers.test.ts +105 -1
  933. package/src/utils/__tests__/objects.test.ts +21 -0
  934. package/src/utils/arrays.ts +11 -2
  935. package/src/utils/blob.ts +1 -1
  936. package/src/utils/createReducer.ts +115 -79
  937. package/src/utils/dates.ts +94 -0
  938. package/src/utils/download.ts +67 -6
  939. package/src/utils/maps.ts +0 -3
  940. package/src/utils/numbers.ts +79 -18
  941. package/src/utils/objects.ts +4 -9
  942. package/src/utils/once.ts +19 -19
  943. package/src/utils/time.ts +10 -0
  944. package/src/utils/tracer.ts +9 -5
  945. package/src/utils/zod-utils.ts +1 -3
  946. package/dist/_baseMerge-BiGRwuqv.js +0 -165
  947. package/dist/any-language-editor-B9REGlD9.js +0 -76
  948. package/dist/architecture-7GRP2DOG-BWLylgiA.js +0 -3
  949. package/dist/assets/__vite-browser-external-BXYkiFsk.js +0 -1
  950. package/dist/assets/worker-HPY9fbhz.js +0 -114
  951. package/dist/classDiagram-ZZMXUADV-Bt98lkkv.js +0 -30
  952. package/dist/classDiagram-v2-VYDZK3BY-D9bfbcC3.js +0 -30
  953. package/dist/code-visibility-BCpXa0Xh.js +0 -138
  954. package/dist/cynefin-OW5HDTMX-obq-i80l.js +0 -3
  955. package/dist/error-entries-CzoYkIQZ.js +0 -56
  956. package/dist/eventmodeling-NTZA5JFV-D7nP7Uyu.js +0 -3
  957. package/dist/flowDiagram-HODETNUW-CAYbpJmV.js +0 -16
  958. package/dist/gitGraph-4MIJSDKK-Dy9uQXGh.js +0 -3
  959. package/dist/hasIn-o2Us0uVx.js +0 -132
  960. package/dist/html-to-image-CZY1pIZH.js +0 -3251
  961. package/dist/info-A6RAGUB7-DKoayiHY.js +0 -3
  962. package/dist/isArrayLikeObject-BZl-15ir.js +0 -450
  963. package/dist/isEmpty-BSZ1LaUo.js +0 -35
  964. package/dist/isSymbol-kQcfYbNX.js +0 -8
  965. package/dist/label-BDKF3Afc.js +0 -281
  966. package/dist/linear-Cnaq3Tfb.js +0 -204
  967. package/dist/mermaid-HWGCJPDP-ByCsZnYF.js +0 -2
  968. package/dist/packet-AYTQ26CC-Yw7ajchJ.js +0 -3
  969. package/dist/pick-CJeoxYOS.js +0 -51
  970. package/dist/pie-WAS4IAKB-BKdKOAkL.js +0 -3
  971. package/dist/precisionRound-DMIVQrt2.js +0 -97
  972. package/dist/purify.es-DMv5zIkJ.js +0 -866
  973. package/dist/radar-RG4KPBEZ-ScR_D_Ts.js +0 -3
  974. package/dist/railroad-74A4TZTK-DQvPSdo5.js +0 -3
  975. package/dist/railroad-abnf-HS5TGJTU-CsJQG2O8.js +0 -3
  976. package/dist/railroad-ebnf-LZEXJU2U-BgEobkSn.js +0 -3
  977. package/dist/railroad-peg-WCYAUIDC-DjLAjofI.js +0 -3
  978. package/dist/select-BButFi-d.js +0 -1344
  979. package/dist/stateDiagram-v2-MP3YSRHH-CISYxma6.js +0 -30
  980. package/dist/swimlanesDiagram-VR7AAH4N-c8G5pGxC.js +0 -30
  981. package/dist/toast-B9UMEi8u.js +0 -1830
  982. package/dist/treeView-Q6P3EWNA-DuRV97YF.js +0 -3
  983. package/dist/treemap-WGGIJYW6-AsLq-uwC.js +0 -3
  984. package/dist/use-restore-focus-BEM7sFWl.js +0 -6369
  985. package/dist/useLifecycle-j7D9uD1o.js +0 -169
  986. package/dist/useTheme-CRnjkku0.js +0 -904
  987. package/dist/wardley-WFR3VGLG-Na-tFhQJ.js +0 -3
  988. package/src/components/chat/reasoning-accordion.tsx +0 -61
  989. package/src/components/chat/tool-call/tool-error-card.tsx +0 -81
  990. package/src/components/chat/tool-call/tool-history-row.tsx +0 -174
  991. package/src/components/editor/ai/__tests__/staged-cell-submission.test.ts +0 -106
  992. package/src/components/editor/ai/add-cell-with-ai.tsx +0 -506
  993. package/src/components/editor/ai/staged-cell-submission.ts +0 -46
  994. package/src/components/editor/cell/__tests__/StagedAICell.test.tsx +0 -64
  995. package/src/components/editor/cell/code/__tests__/rtc-editor-config.test.ts +0 -50
  996. package/src/components/editor/chrome/wrapper/footer-items/rtc-status.tsx +0 -65
  997. package/src/components/editor/navigation/__tests__/state.test.ts +0 -81
  998. package/src/components/editor/navigation/state.ts +0 -65
  999. package/src/components/icons/loading-ellipsis.tsx +0 -46
  1000. package/src/core/ai/tools/__tests__/run-cells-tool.test.ts +0 -656
  1001. package/src/core/ai/tools/run-cells-tool.ts +0 -303
  1002. package/src/core/cells/__tests__/apply-transaction.test.ts +0 -991
  1003. package/src/core/cells/__tests__/document-changes.test.ts +0 -1140
  1004. package/src/core/cells/__tests__/document-roundtrip.test.ts +0 -392
  1005. package/src/core/cells/document-changes.ts +0 -944
  1006. package/src/core/codemirror/rtc/extension.ts +0 -453
  1007. package/src/core/codemirror/rtc/loro/__tests__/sync.test.ts +0 -52
  1008. package/src/core/codemirror/rtc/loro/awareness.ts +0 -531
  1009. package/src/core/codemirror/rtc/loro/colors.ts +0 -38
  1010. package/src/core/codemirror/rtc/loro/sync.ts +0 -168
  1011. package/src/core/host/AGENTS.md +0 -6
  1012. package/src/core/host/__tests__/protocol.test.ts +0 -214
  1013. package/src/core/host/protocol.ts +0 -1943
  1014. package/src/core/rtc/state.ts +0 -34
  1015. package/src/core/state/__tests__/jotai.test.ts +0 -25
  1016. package/src/core/wasm/worker/message-buffer.ts +0 -33
  1017. package/src/core/websocket/__tests__/useWebSocket.test.ts +0 -49
  1018. package/src/core/websocket/transports/__tests__/basic.test.ts +0 -275
  1019. package/src/core/websocket/transports/__tests__/sse.test.ts +0 -338
  1020. package/src/core/websocket/transports/__tests__/transport.test.ts +0 -308
  1021. package/src/core/websocket/transports/__tests__/ws.test.ts +0 -125
  1022. package/src/core/websocket/transports/basic.ts +0 -102
  1023. package/src/core/websocket/transports/sse.ts +0 -308
  1024. package/src/core/websocket/transports/transport.ts +0 -61
  1025. package/src/core/websocket/transports/ws.ts +0 -98
  1026. package/src/core/websocket/useWebSocket.tsx +0 -88
  1027. package/src/utils/__tests__/id-tree.test.ts +0 -2145
  1028. package/src/utils/id-tree.tsx +0 -1134
  1029. /package/src/core/{websocket → session}/connection-utils.ts +0 -0
@@ -1,51 +1,42 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
- import { historyField } from "@codemirror/commands";
4
- import { dequal as isEqual } from "dequal";
3
+ import type * as Protocol from "@marimo-team/client/protocol";
5
4
  import { type Atom, atom, useAtom, useAtomValue } from "jotai";
6
5
  import { atomFamily, selectAtom, splitAtom } from "jotai/utils";
7
6
  import { createRef, type ReducerWithoutAction } from "react";
8
7
  import type { CellHandle } from "@/components/editor/notebook-cell";
9
- import type { CollapsibleTree } from "@/utils/id-tree";
8
+ import type { EditableDocument, Placement } from "@/core/notebook/document";
10
9
  import {
11
- type CellColumnId,
12
- type CellIndex,
13
- MultiColumn,
14
- } from "@/utils/id-tree";
10
+ cellExecutionInputsAtom,
11
+ cellExecutionView,
12
+ cellFreshnessAtom,
13
+ withdrawCells,
14
+ } from "@/core/executions";
15
+ import type { CellColumnId } from "./layout";
15
16
  import { invariant } from "@/utils/invariant";
16
17
  import { Logger } from "@/utils/Logger";
17
- import { clamp } from "@/utils/math";
18
18
  import { Objects } from "@/utils/objects";
19
19
  import { extractAllTracebackInfo, type TracebackInfo } from "@/utils/traceback";
20
20
  import { createReducerAndAtoms } from "../../utils/createReducer";
21
21
  import { foldAllBulk, unfoldAllBulk } from "../codemirror/editing/commands";
22
22
  import { editorMountScheduler } from "../codemirror/editor-mount-scheduler";
23
- import {
24
- splitEditor,
25
- updateEditorCodeFromPython,
26
- } from "../codemirror/language/utils";
27
23
  import type { SerializedEditorState } from "../codemirror/types";
28
- import { findCollapseRange, mergeOutlines } from "../dom/outline";
24
+ import { mergeOutlines } from "../dom/outline";
29
25
  import type { CellMessage } from "../kernel/messages";
30
26
  import { isErrorMime } from "../mime";
31
- import type { CellConfig } from "../network/types";
32
- import { canUseRtc, isRtcEnabled } from "../rtc/state";
33
27
  import { createDeepEqualAtom, store } from "../state/jotai";
34
28
  import { isWasm } from "../wasm/utils";
35
- import { prepareCellForExecution, transitionCell } from "./cell";
36
- import { documentTransactionMiddleware } from "./document-changes";
37
- import { CellId, SCRATCH_CELL_ID, SETUP_CELL_ID } from "./ids";
29
+ import { transitionCell } from "./cell";
30
+ import { applyDocument } from "./document";
31
+ import { isCodeHidden, shownHiddenCodeAtom } from "./editor";
32
+ import { type CellId, SCRATCH_CELL_ID } from "./ids";
38
33
  import { type CellLog, getCellLogsForMessage } from "./logs";
39
- import {
40
- focusAndScrollCellIntoView,
41
- scrollToBottom,
42
- scrollToTop,
43
- } from "./scrollCellIntoView";
34
+ import type { Outline } from "./outline";
35
+ import { focusAndScrollCellIntoView } from "./scrollCellIntoView";
44
36
  import {
45
37
  type CellData,
46
38
  type CellRuntimeState,
47
39
  createCell,
48
- createCellConfig,
49
40
  createCellRuntimeState,
50
41
  } from "./types";
51
42
  import {
@@ -53,22 +44,24 @@ import {
53
44
  disabledCellIds,
54
45
  enabledCellIds,
55
46
  getUndoLabel,
56
- notebookIsRunning,
57
47
  notebookNeedsRun,
58
- notebookQueueOrRunningCount,
59
48
  } from "./utils";
60
49
 
50
+ /** A deleted cell as it was, with where it went in the document. */
51
+ export interface DeletedCell {
52
+ cell: Protocol.CellInput;
53
+ placement: Placement;
54
+ /** The editor's state at deletion, so undo brings its history back. */
55
+ serializedEditorState: SerializedEditorState | null;
56
+ }
57
+
61
58
  /**
62
- * History entry for undoing a cell deletion.
59
+ * History entry for undoing one deletion, of one or more cells.
63
60
  */
64
61
  export interface UndoDeleteEntry {
65
62
  type: "delete";
66
- name: string;
67
- serializedEditorState: SerializedEditorState;
68
- column: CellColumnId;
69
- index: CellIndex;
70
- isSetupCell: boolean;
71
- config: CellConfig;
63
+ /** In document order. Each cell is placed after the one before it. */
64
+ cells: DeletedCell[];
72
65
  }
73
66
 
74
67
  /**
@@ -77,7 +70,7 @@ export interface UndoDeleteEntry {
77
70
  export interface UndoMoveEntry {
78
71
  type: "move";
79
72
  cellIds: CellId[];
80
- placements: Array<{ columnId: CellColumnId; index: CellIndex }>;
73
+ placements: Array<{ columnId: CellColumnId; index: number }>;
81
74
  }
82
75
 
83
76
  export type HistoryEntry = UndoDeleteEntry | UndoMoveEntry;
@@ -89,7 +82,8 @@ export interface NotebookState {
89
82
  /**
90
83
  * Order of cells on the page.
91
84
  */
92
- cellIds: MultiColumn<CellId>;
85
+ /** The cells in document order. */
86
+ cellIds: CellId[];
93
87
  /**
94
88
  * Map of cells to their view state
95
89
  */
@@ -116,12 +110,6 @@ export interface NotebookState {
116
110
  * Logs of all cell messages
117
111
  */
118
112
  cellLogs: CellLog[];
119
- /**
120
- * Set of cells that have been created that are initialized with `hide_code`.
121
- *
122
- * These start temporarily open until their first blur event.
123
- */
124
- untouchedNewCells: Set<CellId>;
125
113
  }
126
114
 
127
115
  function withScratchCell(notebookState: NotebookState): NotebookState {
@@ -153,781 +141,40 @@ function withScratchCell(notebookState: NotebookState): NotebookState {
153
141
  */
154
142
  export function initialNotebookState(): NotebookState {
155
143
  return withScratchCell({
156
- cellIds: MultiColumn.from([]),
144
+ cellIds: [],
157
145
  cellData: {},
158
146
  cellRuntime: {},
159
147
  cellHandles: {},
160
148
  history: [],
161
149
  scrollKey: null,
162
150
  cellLogs: [],
163
- untouchedNewCells: new Set<CellId>(),
164
151
  });
165
152
  }
166
153
 
167
- /** The target cell ID to create a new cell relative to. Can be:
168
- * - A CellId string for an existing cell
169
- * - "__end__" to append at the end of the first column
170
- * - {type: "__end__", columnId} to append at the end of a specific column
171
- */
172
- export type CellPosition =
173
- | CellId
174
- | "__end__"
175
- | { type: "__end__"; columnId: CellColumnId };
176
-
177
- export interface CreateNewCellAction {
178
- cellId: CellPosition;
179
- /** Whether to insert before (true) or after (false) the target cell */
180
- before: boolean;
181
- /** Initial code content for the new cell */
182
- code?: string;
183
- /** Optional name for the new cell */
184
- name?: string;
185
- /** Optional cell configuration */
186
- config?: CellConfig;
187
- /** The last executed code for the new cell */
188
- lastCodeRun?: string;
189
- /** Timestamp of the last execution */
190
- lastExecutionTime?: number;
191
- /** Optional custom ID for the new cell. Auto-generated if not provided */
192
- newCellId?: CellId;
193
- /** Whether to focus the new cell after creation */
194
- autoFocus?: boolean;
195
- /** If true, skip creation if code already exists */
196
- skipIfCodeExists?: boolean;
197
- /** Hide the code in the new cell. This will be initially shown until the cell is blurred for the first time. */
198
- hideCode?: boolean;
199
- }
200
-
201
154
  /**
202
155
  * Actions and reducer for the notebook state.
203
156
  */
204
157
  const {
205
158
  reducer,
206
- addMiddleware,
207
159
  createActions,
208
160
  useActions,
209
161
  valueAtom: notebookAtom,
210
162
  } = createReducerAndAtoms(initialNotebookState, {
211
- createNewCell: (state, action: CreateNewCellAction) => {
212
- const {
213
- cellId,
214
- before,
215
- code,
216
- name,
217
- config,
218
- lastCodeRun = null,
219
- lastExecutionTime = null,
220
- autoFocus = true,
221
- skipIfCodeExists = false,
222
- hideCode = undefined,
223
- } = action;
224
-
225
- let columnId: CellColumnId;
226
- let cellIndex: number;
227
-
228
- // If skipIfCodeExists is true, check if the code already exists in the notebook
229
- if (skipIfCodeExists) {
230
- for (const cellId of state.cellIds.inOrderIds) {
231
- if (state.cellData[cellId]?.code === code) {
232
- return state;
233
- }
234
- }
235
- }
236
-
237
- if (cellId === "__end__") {
238
- const column = state.cellIds.atOrThrow(0);
239
- columnId = column.id;
240
- cellIndex = column.length;
241
- } else if (typeof cellId === "string") {
242
- const column = state.cellIds.findWithId(cellId);
243
- columnId = column.id;
244
- cellIndex = column.topLevelIds.indexOf(cellId);
245
- } else if (cellId.type === "__end__") {
246
- const column =
247
- state.cellIds.get(cellId.columnId) || state.cellIds.atOrThrow(0);
248
- columnId = column.id;
249
- cellIndex = column.length;
250
- } else {
251
- throw new Error("Invalid cellId");
252
- }
253
-
254
- const newCellId = action.newCellId || CellId.create();
255
- const insertionIndex = before ? cellIndex : cellIndex + 1;
256
-
257
- return {
258
- ...state,
259
- cellIds: state.cellIds.insertId(newCellId, columnId, insertionIndex),
260
- cellData: {
261
- ...state.cellData,
262
- [newCellId]: createCell({
263
- id: newCellId,
264
- code,
265
- name,
266
- lastCodeRun,
267
- config: createCellConfig({
268
- ...config,
269
- ...(hideCode != null && { hide_code: hideCode }),
270
- }),
271
- lastExecutionTime,
272
- edited: Boolean(code) && code !== lastCodeRun,
273
- }),
274
- },
275
- cellRuntime: {
276
- ...state.cellRuntime,
277
- [newCellId]: createCellRuntimeState(),
278
- },
279
- cellHandles: {
280
- ...state.cellHandles,
281
- [newCellId]: createRef(),
282
- },
283
- scrollKey: autoFocus ? newCellId : null,
284
- untouchedNewCells:
285
- hideCode && autoFocus
286
- ? new Set([...state.untouchedNewCells, newCellId])
287
- : state.untouchedNewCells,
288
- };
289
- },
290
- moveCell: (
291
- state,
292
- action: {
293
- cellId: CellId;
294
- before?: boolean;
295
- direction?: "left" | "right";
296
- },
297
- ) => {
298
- const { cellId, before, direction } = action;
299
-
300
- if (before !== undefined && direction !== undefined) {
301
- Logger.warn(
302
- "Both before and direction specified for moveCell. Ignoring one.",
303
- );
304
- }
305
-
306
- // Handle left/right movement
307
- if (direction) {
308
- const fromColumn = state.cellIds.findWithId(cellId);
309
- const fromColumnIndex = state.cellIds.indexOf(fromColumn);
310
- const toColumnIndex =
311
- direction === "left" ? fromColumnIndex - 1 : fromColumnIndex + 1;
312
- const toColumn = state.cellIds.at(toColumnIndex);
313
-
314
- // If no column to move to, return unchanged state
315
- if (!toColumn) {
316
- return state;
317
- }
318
-
319
- return {
320
- ...state,
321
- cellIds: state.cellIds.moveAcrossColumns(
322
- fromColumn.id,
323
- cellId,
324
- toColumn.id,
325
- undefined,
326
- ),
327
- scrollKey: cellId,
328
- };
329
- }
330
-
331
- // Handle up/down movement
332
- const column = state.cellIds.findWithId(cellId);
333
- const cellIndex = column.indexOfOrThrow(cellId);
334
-
335
- if (before && cellIndex === 0) {
336
- return {
337
- ...state,
338
- cellIds: state.cellIds.moveWithinColumn(column.id, cellIndex, 0),
339
- scrollKey: cellId,
340
- };
341
- }
342
- if (!before && cellIndex === column.length - 1) {
343
- return {
344
- ...state,
345
- cellIds: state.cellIds.moveWithinColumn(
346
- column.id,
347
- cellIndex,
348
- column.length - 1,
349
- ),
350
- scrollKey: cellId,
351
- };
352
- }
353
-
354
- return before
355
- ? {
356
- ...state,
357
- cellIds: state.cellIds.moveWithinColumn(
358
- column.id,
359
- cellIndex,
360
- cellIndex - 1,
361
- ),
362
- scrollKey: cellId,
363
- }
364
- : {
365
- ...state,
366
- cellIds: state.cellIds.moveWithinColumn(
367
- column.id,
368
- cellIndex,
369
- cellIndex + 1,
370
- ),
371
- scrollKey: cellId,
372
- };
373
- },
374
- moveCellToIndex: (
375
- state,
376
- action: {
377
- cellId: CellId;
378
- columnId: CellColumnId;
379
- index: number;
380
- },
381
- ) => {
382
- const { cellId, columnId, index } = action;
383
- const fromColumn = state.cellIds.findWithId(cellId);
384
- const fromIndex = fromColumn.indexOfOrThrow(cellId);
385
-
386
- const destinationColumn = state.cellIds.get(columnId);
387
- if (!destinationColumn) {
388
- return state;
389
- }
390
-
391
- const clampedIndex = Math.max(0, Math.min(index, destinationColumn.length));
392
- const adjustedIndex =
393
- fromColumn.id === columnId && fromIndex < clampedIndex
394
- ? clampedIndex - 1
395
- : clampedIndex;
396
-
397
- if (fromColumn.id === columnId && fromIndex === adjustedIndex) {
398
- return state;
399
- }
400
-
401
- const withoutCell = state.cellIds.deleteById(cellId);
402
- const updatedColumn = withoutCell.get(columnId);
403
- if (!updatedColumn) {
404
- return state;
405
- }
406
-
407
- return {
408
- ...state,
409
- cellIds: withoutCell.insertId(
410
- cellId,
411
- columnId,
412
- Math.max(0, Math.min(adjustedIndex, updatedColumn.length)),
413
- ),
414
- scrollKey: null,
415
- };
416
- },
417
- dropCellOverCell: (state, action: { cellId: CellId; overCellId: CellId }) => {
418
- const { cellId, overCellId } = action;
419
-
420
- const fromColumn = state.cellIds.findWithId(cellId);
421
- const toColumn = state.cellIds.findWithId(overCellId);
422
-
423
- const fromIndex = fromColumn.indexOfOrThrow(cellId);
424
- const toIndex = toColumn.indexOfOrThrow(overCellId);
425
-
426
- if (fromColumn.id === toColumn.id) {
427
- if (fromIndex === toIndex) {
428
- return state;
429
- }
430
- return {
431
- ...state,
432
- cellIds: state.cellIds.moveWithinColumn(
433
- fromColumn.id,
434
- fromIndex,
435
- toIndex,
436
- ),
437
- scrollKey: null,
438
- };
439
- }
440
-
441
- return {
442
- ...state,
443
- cellIds: state.cellIds.moveAcrossColumns(
444
- fromColumn.id,
445
- cellId,
446
- toColumn.id,
447
- overCellId,
448
- ),
449
- scrollKey: null,
450
- };
451
- },
452
- moveCellsRelativeTo: (
453
- state,
454
- action: {
455
- cellIds: CellId[];
456
- targetCellId: CellId;
457
- position: "before" | "after";
458
- previousPlacements?: Array<{ columnId: CellColumnId; index: CellIndex }>;
459
- },
460
- ) => {
461
- const { cellIds, targetCellId, position, previousPlacements } = action;
462
- if (cellIds.length === 0) {
463
- return state;
464
- }
465
- const newCellIds = state.cellIds.moveCellsRelativeTo(
466
- cellIds,
467
- targetCellId,
468
- position,
469
- );
470
- // Only record undo when caller provided full before-state
471
- const canUndoMove =
472
- previousPlacements && previousPlacements.length === cellIds.length;
473
- const history = canUndoMove
474
- ? [
475
- ...state.history,
476
- { type: "move" as const, cellIds, placements: previousPlacements },
477
- ]
478
- : state.history;
479
- return {
480
- ...state,
481
- cellIds: newCellIds,
482
- history,
483
- scrollKey: null,
484
- };
485
- },
486
- dropCellOverColumn: (
487
- state,
488
- action: { cellId: CellId; columnId: CellColumnId },
489
- ) => {
490
- const { cellId, columnId } = action;
491
- const fromColumn = state.cellIds.findWithId(cellId);
492
-
493
- return {
494
- ...state,
495
- cellIds: state.cellIds.moveAcrossColumns(
496
- fromColumn.id,
497
- cellId,
498
- columnId,
499
- undefined,
500
- ),
501
- };
502
- },
503
- dropOverNewColumn: (state, action: { cellId: CellId }) => {
504
- const { cellId } = action;
505
- return {
506
- ...state,
507
- cellIds: state.cellIds.moveToNewColumn(cellId),
508
- };
509
- },
510
- moveColumn: (
511
- state,
512
- action: {
513
- column: CellColumnId;
514
- overColumn: CellColumnId | "_left_" | "_right_";
515
- },
516
- ) => {
517
- if (action.column === action.overColumn) {
518
- return state;
519
- }
520
- return {
521
- ...state,
522
- cellIds: state.cellIds.moveColumn(action.column, action.overColumn),
523
- };
524
- },
525
- focusCell: (
526
- state,
527
- action: { cellId: CellId; where: "before" | "after" | "exact" },
528
- ) => {
529
- const column = state.cellIds.findWithId(action.cellId);
530
- if (column.length === 0) {
531
- return state;
532
- }
533
-
534
- const { cellId, where } = action;
535
- const index = column.indexOfOrThrow(cellId);
536
-
537
- let focusIndex: number;
538
- if (where === "before") {
539
- focusIndex = clamp(index - 1, 0, column.length - 1);
540
- } else if (where === "after") {
541
- focusIndex = clamp(index + 1, 0, column.length - 1);
542
- } else {
543
- focusIndex = index;
544
- }
545
- const focusCellId = column.atOrThrow(focusIndex);
546
- // can scroll immediately, without setting scrollKey in state, because
547
- // CellArray won't need to re-render
548
- focusAndScrollCellIntoView({
549
- cellId: focusCellId,
550
- cell: state.cellHandles[focusCellId],
551
- isCodeHidden: isCellCodeHidden(state, focusCellId),
552
- codeFocus: where === "after" ? "top" : "bottom",
553
- variableName: undefined,
554
- });
555
- return state;
556
- },
557
- focusTopCell: (state) => {
558
- // TODO: focus the existing column, not the first column
559
- const column = state.cellIds.getColumns().at(0);
560
- if (column === undefined || column.length === 0) {
561
- return state;
562
- }
563
-
564
- const cellId = column.first();
565
- focusAndScrollCellIntoView({
566
- cellId: cellId,
567
- cell: state.cellHandles[cellId],
568
- isCodeHidden: isCellCodeHidden(state, cellId),
569
- codeFocus: undefined,
570
- variableName: undefined,
571
- });
572
- scrollToTop();
573
- return state;
574
- },
575
- focusBottomCell: (state) => {
576
- // TODO: focus the existing column, not the last column
577
- const column = state.cellIds.getColumns().at(-1);
578
- if (column === undefined || column.length === 0) {
579
- return state;
580
- }
581
-
582
- const cellId = column.last();
583
- focusAndScrollCellIntoView({
584
- cellId: cellId,
585
- cell: state.cellHandles[cellId],
586
- isCodeHidden: isCellCodeHidden(state, cellId),
587
- codeFocus: undefined,
588
- variableName: undefined,
589
- });
590
- scrollToBottom();
591
- return state;
592
- },
593
- sendToTop: (state, action: { cellId: CellId; scroll?: boolean }) => {
594
- const column = state.cellIds.findWithId(action.cellId);
595
- if (column.length === 0) {
596
- return state;
597
- }
598
-
599
- const { cellId, scroll = true } = action;
600
- const cellIndex = column.indexOfOrThrow(cellId);
601
- if (cellIndex === 0) {
602
- return state;
603
- }
604
-
605
- return {
606
- ...state,
607
- cellIds: state.cellIds.moveWithinColumn(column.id, cellIndex, 0),
608
- scrollKey: scroll ? cellId : null,
609
- };
610
- },
611
- sendToBottom: (state, action: { cellId: CellId; scroll?: boolean }) => {
612
- const column = state.cellIds.findWithId(action.cellId);
613
- if (column.length === 0) {
614
- return state;
615
- }
616
-
617
- const { cellId, scroll = true } = action;
618
- const cellIndex = column.indexOfOrThrow(cellId);
619
- const newIndex = column.length - 1;
620
-
621
- if (cellIndex === newIndex) {
622
- return state;
623
- }
624
-
625
- return {
626
- ...state,
627
- cellIds: state.cellIds.moveWithinColumn(column.id, cellIndex, newIndex),
628
- scrollKey: scroll ? cellId : null,
629
- };
630
- },
631
- addColumn: (state, action: { columnId: CellColumnId }) => {
632
- // Add column and new cell
633
- const newCellId = CellId.create();
634
- return {
635
- ...state,
636
- cellIds: state.cellIds.addColumn(action.columnId, [newCellId]),
637
- cellData: {
638
- ...state.cellData,
639
- [newCellId]: createCell({
640
- id: newCellId,
641
- }),
642
- },
643
- cellRuntime: {
644
- ...state.cellRuntime,
645
- [newCellId]: createCellRuntimeState(),
646
- },
647
- cellHandles: {
648
- ...state.cellHandles,
649
- [newCellId]: createRef(),
650
- },
651
- scrollKey: newCellId,
652
- };
653
- },
654
- addColumnBreakpoint: (state, action: { cellId: CellId }) => {
655
- const { cellId } = action;
656
- if (state.cellIds.getColumns()[0].inOrderIds[0] === cellId) {
657
- return state;
658
- }
659
- return {
660
- ...state,
661
- cellIds: state.cellIds.insertBreakpoint(cellId),
662
- };
663
- },
664
- deleteColumn: (state, action: { columnId: CellColumnId }) => {
665
- // Move all cells in the column to the previous column
666
- const { columnId } = action;
667
- return {
668
- ...state,
669
- cellIds: state.cellIds.delete(columnId),
670
- };
671
- },
672
- mergeAllColumns: (state) => {
673
- return {
674
- ...state,
675
- cellIds: state.cellIds.mergeAllColumns(),
676
- };
677
- },
678
- compactColumns: (state) => {
679
- return {
680
- ...state,
681
- cellIds: state.cellIds.compact(),
682
- };
683
- },
684
- deleteCell: (state, action: { cellId: CellId }) => {
685
- const cellId = action.cellId;
686
-
687
- // Can't delete the last cell, across all columns
688
- if (state.cellIds.hasOnlyOneId()) {
689
- return state;
690
- }
691
-
692
- let column: CollapsibleTree<CellId>;
693
- try {
694
- column = state.cellIds.findWithId(cellId);
695
- } catch (error) {
696
- // Expected for kernel-only cells or out-of-order transactions.
697
- Logger.warn("Skipping delete for missing cellId", {
698
- cellId,
699
- error,
700
- });
701
- return state;
702
- }
703
-
704
- const cellIndex = column.indexOfOrThrow(cellId);
705
- const focusIndex = cellIndex === 0 ? 1 : cellIndex - 1;
706
- let scrollKey: CellId | null = null;
707
- if (column.length > 1) {
708
- scrollKey = column.atOrThrow(focusIndex);
709
- }
710
-
711
- const editorView = state.cellHandles[cellId].current?.editorView;
712
- const serializedEditorState = editorView?.state.toJSON({
713
- history: historyField,
714
- });
715
- if (serializedEditorState) {
716
- serializedEditorState.doc = state.cellData[cellId].code;
717
- }
718
-
719
- // release the granular atom(s) created for this cell
720
- releaseCellAtoms(cellId);
721
- const prevData = state.cellData[cellId];
722
- return {
723
- ...state,
724
- cellIds: state.cellIds.deleteById(cellId),
725
- history: [
726
- ...state.history,
727
- {
728
- type: "delete",
729
- name: prevData.name,
730
- serializedEditorState: serializedEditorState,
731
- column: column.id,
732
- index: cellIndex,
733
- isSetupCell: cellId === SETUP_CELL_ID,
734
- config: prevData.config,
735
- },
736
- ],
737
- scrollKey: scrollKey,
738
- };
739
- },
740
- undoDeleteCell: (state) => {
741
- if (state.history.length === 0) {
742
- return state;
743
- }
744
-
745
- const last = state.history[state.history.length - 1];
746
-
747
- if (last.type === "move") {
748
- const { cellIds, placements } = last;
749
- if (
750
- cellIds.length === 0 ||
751
- placements.length !== cellIds.length ||
752
- cellIds.some((id) => !state.cellData[id])
753
- ) {
754
- return { ...state, history: state.history.slice(0, -1) };
755
- }
756
- const toRestore = cellIds.map((id, i) => ({
757
- id,
758
- columnId: placements[i].columnId,
759
- index: placements[i].index,
760
- }));
761
- return {
762
- ...state,
763
- cellIds: state.cellIds.placeCells(toRestore),
764
- history: state.history.slice(0, -1),
765
- scrollKey: cellIds[0] ?? null,
766
- };
767
- }
768
-
769
- const {
770
- name,
771
- serializedEditorState = { doc: "" },
772
- column,
773
- index,
774
- isSetupCell,
775
- config,
776
- } = last;
777
-
778
- const cellId = isSetupCell ? SETUP_CELL_ID : CellId.create();
779
- const undoCell = createCell({
780
- id: cellId,
781
- name,
782
- code: serializedEditorState.doc,
783
- edited: serializedEditorState.doc.trim().length > 0,
784
- serializedEditorState,
785
- config,
786
- });
787
-
788
- return {
789
- ...state,
790
- cellIds: state.cellIds.insertId(cellId, column, index),
791
- cellData: {
792
- ...state.cellData,
793
- [cellId]: undoCell,
794
- },
795
- cellRuntime: {
796
- ...state.cellRuntime,
797
- [cellId]: createCellRuntimeState(),
798
- },
799
- cellHandles: {
800
- ...state.cellHandles,
801
- [cellId]: createRef(),
802
- },
803
- history: state.history.slice(0, -1),
804
- // Scroll to the newly created cell
805
- scrollKey: cellId,
806
- };
807
- },
808
- clearSerializedEditorState: (state, action: { cellId: CellId }) => {
809
- const { cellId } = action;
810
- return updateCellData({
811
- state,
812
- cellId,
813
- cellReducer: (cell) => {
814
- return {
815
- ...cell,
816
- serializedEditorState: null,
817
- };
818
- },
819
- });
820
- },
821
- updateCellCode: (
822
- state,
823
- action: {
824
- cellId: CellId;
825
- code: string;
826
- /**
827
- * Whether or not the update is a formatting change,
828
- * if so, the 'edited' state will be handled differently.
829
- */
830
- formattingChange: boolean;
831
- },
832
- ) => {
833
- const { cellId, code, formattingChange } = action;
834
- if (!state.cellData[cellId]) {
835
- return state;
836
- }
837
-
838
- return updateCellData({
839
- state,
840
- cellId,
841
- cellReducer: (cell) => {
842
- // Formatting-only change means we can re-use the last code run
843
- // if it was not previously edited. And we don't change the edited state.
844
- return formattingChange
845
- ? {
846
- ...cell,
847
- code: code,
848
- lastCodeRun: cell.edited ? cell.lastCodeRun : code,
849
- }
850
- : {
851
- ...cell,
852
- code: code,
853
- edited: code.trim() !== cell.lastCodeRun,
854
- };
855
- },
856
- });
857
- },
858
- updateCellName: (state, action: { cellId: CellId; name: string }) => {
859
- const { cellId, name } = action;
860
- return updateCellData({
861
- state,
862
- cellId,
863
- cellReducer: (cell) => {
864
- return {
865
- ...cell,
866
- name: name,
867
- };
868
- },
869
- });
870
- },
871
- updateCellConfig: (
872
- state,
873
- action: { cellId: CellId; config: Partial<CellConfig> },
874
- ) => {
875
- const { cellId, config } = action;
876
- return updateCellData({
877
- state,
878
- cellId,
879
- cellReducer: (cell) => {
880
- return {
881
- ...cell,
882
- config: createCellConfig({ ...cell.config, ...config }),
883
- };
884
- },
885
- });
886
- },
887
- prepareForRun: (state, action: { cellId: CellId }) => {
888
- const newState = updateCellRuntimeState({
163
+ prepareForRun: (state, action: { cellId: CellId }) =>
164
+ updateCellRuntimeState({
889
165
  state,
890
166
  cellId: action.cellId,
891
- cellReducer: (cell) => {
892
- return prepareCellForExecution(cell);
893
- },
894
- });
895
- return updateCellData({
896
- state: newState,
897
- cellId: action.cellId,
898
- cellReducer: (cell) => {
899
- return {
900
- ...cell,
901
- edited: false,
902
- lastCodeRun: cell.code.trim(),
903
- };
904
- },
905
- });
906
- },
167
+ cellReducer: (cell) => ({ ...cell, debuggerActive: false }),
168
+ }),
907
169
  handleCellMessage: (state, message: CellMessage) => {
908
170
  const cellId = message.cell_id;
909
- let nextState = updateCellRuntimeState({
171
+ const nextState = updateCellRuntimeState({
910
172
  state,
911
173
  cellId,
912
174
  cellReducer: (cell) => {
913
175
  return transitionCell(cell, message);
914
176
  },
915
177
  });
916
- // When a cell is queued for execution, snapshot the current code
917
- // as lastCodeRun. This clears staleness for cells executed by the
918
- // kernel (e.g. via code_mode). If the user edits during execution,
919
- // code !== lastCodeRun keeps the cell stale.
920
- if (message.status === "queued") {
921
- nextState = updateCellData({
922
- state: nextState,
923
- cellId,
924
- cellReducer: (cell) => ({
925
- ...cell,
926
- lastCodeRun: cell.code.trim(),
927
- edited: false,
928
- }),
929
- });
930
- }
931
178
  return {
932
179
  ...nextState,
933
180
  cellLogs: [...nextState.cellLogs, ...getCellLogsForMessage(message)],
@@ -939,158 +186,14 @@ const {
939
186
  cellLogs: [...state.cellLogs, ...action.logs],
940
187
  };
941
188
  },
942
- setCellIds: (state, action: { cellIds: CellId[] }) => {
943
- const isTheSame = isEqual(state.cellIds.inOrderIds, action.cellIds);
944
- if (isTheSame) {
945
- return state;
946
- }
947
-
948
- // Create new cell data and runtime states for the new cell IDs
949
- const nextCellData = { ...state.cellData };
950
- const nextCellRuntime = { ...state.cellRuntime };
951
- const nextCellHandles = { ...state.cellHandles };
952
-
953
- for (const cellId of action.cellIds) {
954
- if (!(cellId in state.cellData)) {
955
- nextCellData[cellId] = createCell({ id: cellId });
956
- }
957
- if (!(cellId in state.cellRuntime)) {
958
- nextCellRuntime[cellId] = createCellRuntimeState();
959
- }
960
- if (!(cellId in state.cellHandles)) {
961
- nextCellHandles[cellId] = createRef();
962
- }
963
- }
964
-
965
- return {
966
- ...state,
967
- cellIds: MultiColumn.fromWithPreviousShape(action.cellIds, state.cellIds),
968
- cellData: nextCellData,
969
- cellRuntime: nextCellRuntime,
970
- cellHandles: nextCellHandles,
971
- };
972
- },
973
- /**
974
- * Rebuild the MultiColumn tree using each cell's `config.column` value.
975
- *
976
- * Used after a transaction whose `set-config` changes updated cells'
977
- * column metadata without physically moving them in the tree. Cells with
978
- * `config.column == null` inherit the column of the previous cell in the
979
- * given order (see `MultiColumn.fromIdsAndColumns`), which lets the server
980
- * send column changes only at column boundaries.
981
- */
982
- rebuildCellColumns: (state, action: { cellIds: CellId[] }) => {
983
- const newCellIds = MultiColumn.fromIdsAndColumns(
984
- action.cellIds.map((id) => [
985
- id,
986
- state.cellData[id]?.config.column ?? null,
987
- ]),
988
- );
989
- return { ...state, cellIds: newCellIds };
990
- },
991
- setCellCodes: (
992
- state,
993
- action: {
994
- codes: string[];
995
- ids: CellId[];
996
- codeIsStale: boolean;
997
- names?: string[];
998
- configs?: CellConfig[];
999
- },
1000
- ) => {
1001
- invariant(
1002
- action.codes.length === action.ids.length,
1003
- "Expected codes and ids to have the same length",
1004
- );
1005
-
1006
- let nextState = { ...state };
1007
-
1008
- const cellReducer = ({
1009
- cell,
1010
- code,
1011
- cellId,
1012
- name,
1013
- config,
1014
- }: {
1015
- cell: CellData | undefined;
1016
- code: string;
1017
- cellId: CellId;
1018
- name?: string;
1019
- config?: CellConfig;
1020
- }) => {
1021
- if (!cell) {
1022
- return createCell({
1023
- id: cellId,
1024
- code,
1025
- name: name,
1026
- config: config,
1027
- lastCodeRun: action.codeIsStale ? null : code,
1028
- edited: action.codeIsStale && code.trim().length > 0,
1029
- });
1030
- }
1031
-
1032
- // If code is stale, we don't promote it to lastCodeRun
1033
- const lastCodeRun = action.codeIsStale ? cell.lastCodeRun : code;
1034
-
1035
- // Mark as edited if the code has changed
1036
- const edited = lastCodeRun
1037
- ? lastCodeRun.trim() !== code.trim()
1038
- : Boolean(code);
1039
-
1040
- // No change
1041
- if (cell.code.trim() === code.trim()) {
1042
- return {
1043
- ...cell,
1044
- code: code,
1045
- edited,
1046
- lastCodeRun,
1047
- ...(name !== undefined && { name }),
1048
- ...(config !== undefined && { config }),
1049
- };
1050
- }
1051
-
1052
- // Update codemirror if mounted. RTC-backed cells sync via Loro; others
1053
- // (e.g. scratchpad) still need an explicit editor update.
1054
- if (!isRtcEnabled() || !canUseRtc(cellId)) {
1055
- const cellHandle = nextState.cellHandles[cellId].current;
1056
- if (cellHandle?.editorViewOrNull) {
1057
- updateEditorCodeFromPython(cellHandle.editorViewOrNull, code);
1058
- }
189
+ /** Follow the host document's cells and order. */
190
+ reconcileDocument: (state, document: EditableDocument) => {
191
+ const nextState = applyDocument(state, document);
192
+ for (const cellId of state.cellIds) {
193
+ if (!(cellId in nextState.cellData)) {
194
+ releaseCellAtoms(cellId);
1059
195
  }
1060
-
1061
- return {
1062
- ...cell,
1063
- code: code,
1064
- edited,
1065
- lastCodeRun,
1066
- ...(name !== undefined && { name }),
1067
- ...(config !== undefined && { config }),
1068
- };
1069
- };
1070
-
1071
- for (let i = 0; i < action.ids.length; i++) {
1072
- const cellId = action.ids[i];
1073
- const code = action.codes[i];
1074
- if (cellId === undefined || code === undefined) {
1075
- continue;
1076
- }
1077
- const name = action.names?.[i];
1078
- const config = action.configs?.[i];
1079
- nextState = {
1080
- ...nextState,
1081
- cellData: {
1082
- ...nextState.cellData,
1083
- [cellId]: cellReducer({
1084
- cell: nextState.cellData[cellId],
1085
- code,
1086
- cellId,
1087
- name,
1088
- config,
1089
- }),
1090
- },
1091
- };
1092
196
  }
1093
-
1094
197
  return nextState;
1095
198
  },
1096
199
  setStdinResponse: (
@@ -1114,167 +217,34 @@ const {
1114
217
  mimetype: stdinOutput.mimetype,
1115
218
  data: stdinOutput.data,
1116
219
  timestamp: stdinOutput.timestamp,
220
+ id: stdinOutput.id,
1117
221
  // An empty response resolves the prompt without retaining the secret.
1118
222
  response: stdinOutput.mimetype === "text/password" ? "" : response,
1119
223
  };
1120
224
 
1121
225
  return {
1122
226
  ...cell,
1123
- interrupted: false,
1124
227
  consoleOutputs,
1125
228
  };
1126
229
  },
1127
230
  });
1128
231
  },
1129
- setCells: (state, cells: CellData[]) => {
1130
- const cellData = Object.fromEntries(cells.map((cell) => [cell.id, cell]));
1131
-
1132
- // WASM has no server-side SessionView to replay outputs, so the
1133
- // snapshot hydrated by notebookStateFromSession is the only source.
1134
- const preserveSnapshot = isWasm();
1135
- const runtimeFor = (cellId: CellId): CellRuntimeState => {
1136
- if (!preserveSnapshot) {
1137
- return createCellRuntimeState();
1138
- }
1139
- const prev = state.cellRuntime[cellId];
1140
- const hasSnapshot =
1141
- prev && (prev.output != null || prev.consoleOutputs.length > 0);
1142
- return hasSnapshot ? prev : createCellRuntimeState();
1143
- };
1144
- const cellRuntime = Object.fromEntries(
1145
- cells.map((cell) => [cell.id, runtimeFor(cell.id)]),
1146
- );
1147
-
1148
- return withScratchCell({
1149
- ...state,
1150
- cellIds: MultiColumn.fromIdsAndColumns(
1151
- cells.map((cell) => [cell.id, cell.config.column]),
1152
- ),
1153
- cellData: cellData,
1154
- cellRuntime: cellRuntime,
1155
- cellHandles: Object.fromEntries(
1156
- cells.map((cell) => [cell.id, createRef()]),
1157
- ),
1158
- });
1159
- },
1160
232
  /**
1161
- * Move focus to next cell
1162
- *
1163
- * Creates a new cell if the current cell is the last one in the array.
1164
- *
1165
- * If needed, scrolls newly created or focused cell into view.
1166
- *
1167
- * Replicates Shift+Enter functionality of Jupyter
233
+ * Start each cell's runtime over for a new kernel. WASM keeps the outputs
234
+ * its mount-time snapshot gave it.
1168
235
  */
1169
- moveToNextCell: (
1170
- state,
1171
- action: { cellId: CellId; before: boolean; noCreate?: boolean },
1172
- ) => {
1173
- const { cellId, before, noCreate = false } = action;
1174
-
1175
- // Can't move focus of scratch cell
1176
- if (cellId === SCRATCH_CELL_ID) {
1177
- return state;
1178
- }
1179
-
1180
- const column = state.cellIds.findWithId(cellId);
1181
- const index = column.indexOfOrThrow(cellId);
1182
- const nextCellIndex = before ? index - 1 : index + 1;
1183
-
1184
- const isPastLastCell = nextCellIndex === column.length;
1185
- const isBeforeFirstCell = nextCellIndex === -1;
1186
-
1187
- // Create a new cell at the end and set scrollKey to focus it
1188
- if (isPastLastCell && !noCreate) {
1189
- const newCellId = CellId.create();
1190
- return {
1191
- ...state,
1192
- cellIds: state.cellIds.insertId(newCellId, column.id, nextCellIndex),
1193
- cellData: {
1194
- ...state.cellData,
1195
- [newCellId]: createCell({ id: newCellId }),
1196
- },
1197
- cellRuntime: {
1198
- ...state.cellRuntime,
1199
- [newCellId]: createCellRuntimeState(),
1200
- },
1201
- cellHandles: {
1202
- ...state.cellHandles,
1203
- [newCellId]: createRef(),
1204
- },
1205
- scrollKey: newCellId,
1206
- };
1207
- }
1208
-
1209
- if (isBeforeFirstCell && !noCreate) {
1210
- const newCellId = CellId.create();
1211
- return {
1212
- ...state,
1213
- cellIds: state.cellIds.insertId(newCellId, column.id, 0),
1214
- cellData: {
1215
- ...state.cellData,
1216
- [newCellId]: createCell({ id: newCellId }),
1217
- },
1218
- cellRuntime: {
1219
- ...state.cellRuntime,
1220
- [newCellId]: createCellRuntimeState(),
1221
- },
1222
- cellHandles: {
1223
- ...state.cellHandles,
1224
- [newCellId]: createRef(),
1225
- },
1226
- scrollKey: newCellId,
1227
- };
1228
- }
1229
-
1230
- if ((isPastLastCell || isBeforeFirstCell) && noCreate) {
1231
- // Trying to move past the last cell or before the first cell
1232
- // with noCreate=true - do nothing
1233
- return state;
1234
- }
1235
-
1236
- if (nextCellIndex >= 0 && nextCellIndex < column.length) {
1237
- // Move to valid cell within bounds
1238
- const nextCellId = column.atOrThrow(nextCellIndex);
1239
- // Just focus, no state change
1240
- focusAndScrollCellIntoView({
1241
- cellId: nextCellId,
1242
- cell: state.cellHandles[nextCellId],
1243
- isCodeHidden: isCellCodeHidden(state, nextCellId),
1244
- codeFocus: before ? "bottom" : "top",
1245
- variableName: undefined,
1246
- });
1247
- }
1248
-
1249
- return state;
1250
- },
1251
- markTouched: (state, action: { cellId: CellId }) => {
1252
- const { cellId } = action;
1253
-
1254
- if (state.untouchedNewCells.has(cellId)) {
1255
- const nextUntouchedNewCells = new Set(state.untouchedNewCells);
1256
- nextUntouchedNewCells.delete(cellId);
1257
- return {
1258
- ...state,
1259
- untouchedNewCells: nextUntouchedNewCells,
1260
- };
1261
- }
1262
-
1263
- return state;
1264
- },
1265
- markUntouched: (state, action: { cellId: CellId }) => {
1266
- const { cellId } = action;
1267
-
1268
- if (!state.untouchedNewCells.has(cellId)) {
1269
- const nextUntouchedNewCells = new Set(state.untouchedNewCells);
1270
- nextUntouchedNewCells.add(cellId);
1271
- return {
1272
- ...state,
1273
- untouchedNewCells: nextUntouchedNewCells,
1274
- };
236
+ resetCellRuntimes: (state) => {
237
+ const preserveSnapshot = isWasm();
238
+ const cellRuntime = { ...state.cellRuntime };
239
+ for (const cellId of [...state.cellIds, SCRATCH_CELL_ID]) {
240
+ const previous = state.cellRuntime[cellId];
241
+ const hasSnapshot =
242
+ preserveSnapshot &&
243
+ previous !== undefined &&
244
+ (previous.output != null || previous.consoleOutputs.length > 0);
245
+ cellRuntime[cellId] = hasSnapshot ? previous : createCellRuntimeState();
1275
246
  }
1276
-
1277
- return state;
247
+ return { ...state, cellRuntime };
1278
248
  },
1279
249
  scrollToTarget: (state) => {
1280
250
  // Scroll to the specified cell and clear the scroll key.
@@ -1283,16 +253,15 @@ const {
1283
253
  return state;
1284
254
  }
1285
255
 
1286
- const column = state.cellIds.findWithId(scrollKey);
1287
- const index = column.indexOfOrThrow(scrollKey);
1288
-
1289
- const cellId =
1290
- index === column.length - 1 ? column.last() : column.atOrThrow(index);
1291
-
256
+ const cellId = scrollKey;
1292
257
  focusAndScrollCellIntoView({
1293
258
  cellId: cellId,
1294
259
  cell: state.cellHandles[cellId],
1295
- isCodeHidden: isCellCodeHidden(state, cellId),
260
+ isCodeHidden: isCodeHidden(
261
+ state.cellData[cellId]?.config.hide_code,
262
+ store.get(shownHiddenCodeAtom),
263
+ cellId,
264
+ ),
1296
265
  codeFocus: undefined,
1297
266
  variableName: undefined,
1298
267
  });
@@ -1322,201 +291,6 @@ const {
1322
291
  cellLogs: [],
1323
292
  };
1324
293
  },
1325
- collapseCell: (state, action: { cellId: CellId }) => {
1326
- const { cellId } = action;
1327
- const column = state.cellIds.findWithId(cellId);
1328
-
1329
- // Get all the top-level outlines
1330
- const outlines = column.topLevelIds.map((id) => {
1331
- const cell = state.cellRuntime[id];
1332
- return cell.outline;
1333
- });
1334
-
1335
- // Find the start/end of the collapsed range
1336
- const startIndex = column.indexOfOrThrow(cellId);
1337
- const range = findCollapseRange(startIndex, outlines);
1338
- if (!range) {
1339
- return state;
1340
- }
1341
- const endCellId = column.atOrThrow(range[1]);
1342
-
1343
- return {
1344
- ...state,
1345
- // Collapse the range
1346
- cellIds: state.cellIds.transformWithCellId(cellId, (column) =>
1347
- column.collapse(cellId, endCellId),
1348
- ),
1349
- scrollKey: cellId,
1350
- };
1351
- },
1352
- expandCell: (state, action: { cellId: CellId }) => {
1353
- const { cellId } = action;
1354
- return {
1355
- ...state,
1356
- cellIds: state.cellIds.transformWithCellId(cellId, (column) =>
1357
- column.expand(cellId),
1358
- ),
1359
- scrollKey: cellId,
1360
- };
1361
- },
1362
- collapseAllCells: (state) => {
1363
- return {
1364
- ...state,
1365
- cellIds: state.cellIds.transformAll((column) => {
1366
- // Get all the top-level outlines
1367
- const outlines = column.topLevelIds.map((id) => {
1368
- const cell = state.cellRuntime[id];
1369
- return cell.outline;
1370
- });
1371
-
1372
- // Find the start/end of the collapsed ranges
1373
- const nodes = [...column.nodes];
1374
- const visibleEndByOriginalEnd = new Map<CellIndex, CellIndex>();
1375
- const reversedCollapseRanges = [];
1376
-
1377
- // Iterate in reverse order (bottom-up) to process children first
1378
- let i = nodes.length - 1;
1379
- while (i >= 0) {
1380
- const range = findCollapseRange(i, outlines);
1381
- if (range) {
1382
- const startIndex = i;
1383
- const originalEnd = range[1];
1384
- const endIndex =
1385
- visibleEndByOriginalEnd.get(originalEnd) ?? originalEnd;
1386
-
1387
- // After this section collapses, its heading represents this
1388
- // endpoint for any enclosing section that shares it.
1389
- visibleEndByOriginalEnd.set(originalEnd, startIndex);
1390
-
1391
- // Add the range to the list of ranges
1392
- const cellId = column.atOrThrow(startIndex);
1393
- const until = column.atOrThrow(endIndex);
1394
- reversedCollapseRanges.push({ id: cellId, until });
1395
- } else {
1396
- reversedCollapseRanges.push(null);
1397
- }
1398
- i--;
1399
- }
1400
-
1401
- const collapseRanges = reversedCollapseRanges.toReversed();
1402
- return column.collapseAll(collapseRanges);
1403
- }),
1404
- };
1405
- },
1406
- expandAllCells: (state) => {
1407
- return {
1408
- ...state,
1409
- cellIds: state.cellIds.transformAll((column) => column.expandAll()),
1410
- };
1411
- },
1412
- showCellIfHidden: (state, action: { cellId: CellId }) => {
1413
- const { cellId } = action;
1414
- const column = state.cellIds.findWithId(cellId);
1415
- const prev = column;
1416
- const result = column.findAndExpandDeep(cellId);
1417
-
1418
- if (result.equals(prev)) {
1419
- return state;
1420
- }
1421
-
1422
- return {
1423
- ...state,
1424
- cellIds: state.cellIds.transformWithCellId(cellId, () => result),
1425
- };
1426
- },
1427
- splitCell: (state, action: { cellId: CellId }) => {
1428
- const { cellId } = action;
1429
- const column = state.cellIds.findWithId(cellId);
1430
- const index = column.indexOfOrThrow(cellId);
1431
- const cell = state.cellData[cellId];
1432
- const cellHandle = state.cellHandles[cellId].current;
1433
-
1434
- if (cellHandle?.editorView == null) {
1435
- return state;
1436
- }
1437
-
1438
- const { beforeCursorCode, afterCursorCode } = splitEditor(
1439
- cellHandle.editorView,
1440
- );
1441
-
1442
- updateEditorCodeFromPython(cellHandle.editorView, beforeCursorCode);
1443
-
1444
- const newCellId = CellId.create();
1445
-
1446
- return {
1447
- ...state,
1448
- cellIds: state.cellIds.insertId(newCellId, column.id, index + 1),
1449
- cellData: {
1450
- ...state.cellData,
1451
- [cellId]: {
1452
- ...cell,
1453
- code: beforeCursorCode,
1454
- edited:
1455
- Boolean(beforeCursorCode) &&
1456
- beforeCursorCode.trim() !== cell.lastCodeRun?.trim(),
1457
- },
1458
- [newCellId]: createCell({
1459
- id: newCellId,
1460
- code: afterCursorCode,
1461
- edited: Boolean(afterCursorCode),
1462
- }),
1463
- },
1464
- cellRuntime: {
1465
- ...state.cellRuntime,
1466
- [cellId]: {
1467
- ...state.cellRuntime[cellId],
1468
- output: null,
1469
- consoleOutputs: [],
1470
- },
1471
- [newCellId]: createCellRuntimeState(),
1472
- },
1473
- cellHandles: {
1474
- ...state.cellHandles,
1475
- [newCellId]: createRef(),
1476
- },
1477
- scrollKey: newCellId,
1478
- };
1479
- },
1480
- undoSplitCell: (state, action: { cellId: CellId; snapshot: string }) => {
1481
- const { cellId, snapshot } = action;
1482
-
1483
- const cell = state.cellData[cellId];
1484
- const cellHandle = state.cellHandles[cellId].current;
1485
-
1486
- if (cellHandle?.editorView == null) {
1487
- return state;
1488
- }
1489
-
1490
- updateEditorCodeFromPython(cellHandle.editorView, snapshot);
1491
-
1492
- return {
1493
- ...state,
1494
- cellIds: state.cellIds.transformWithCellId(cellId, (column) => {
1495
- const newCellIndex = column.indexOfOrThrow(cellId) + 1;
1496
- return column.deleteAtIndex(newCellIndex);
1497
- }),
1498
- cellData: {
1499
- ...state.cellData,
1500
- [cellId]: {
1501
- ...cell,
1502
- code: snapshot,
1503
- edited:
1504
- Boolean(snapshot) && snapshot?.trim() !== cell.lastCodeRun?.trim(),
1505
- },
1506
- },
1507
- cellRuntime: {
1508
- ...state.cellRuntime,
1509
- [cellId]: {
1510
- ...state.cellRuntime[cellId],
1511
- output: null,
1512
- consoleOutputs: [],
1513
- },
1514
- },
1515
- cellHandles: {
1516
- ...state.cellHandles,
1517
- },
1518
- };
1519
- },
1520
294
  clearCellOutput: (state, action: { cellId: CellId }) => {
1521
295
  const { cellId } = action;
1522
296
  return updateCellRuntimeState({
@@ -1545,7 +319,7 @@ const {
1545
319
  },
1546
320
  clearAllCellOutputs: (state) => {
1547
321
  const newCellRuntime = { ...state.cellRuntime };
1548
- for (const cellId of state.cellIds.inOrderIds) {
322
+ for (const cellId of state.cellIds) {
1549
323
  newCellRuntime[cellId] = {
1550
324
  ...newCellRuntime[cellId],
1551
325
  output: null,
@@ -1557,58 +331,8 @@ const {
1557
331
  cellRuntime: newCellRuntime,
1558
332
  };
1559
333
  },
1560
- addSetupCellIfDoesntExist: (state, action: { code?: string }) => {
1561
- const { code } = action;
1562
-
1563
- if (state.cellIds.setupCellExists()) {
1564
- // Just focus on the existing setup cell
1565
- return {
1566
- ...state,
1567
- scrollKey: SETUP_CELL_ID,
1568
- };
1569
- }
1570
-
1571
- return {
1572
- ...state,
1573
- cellIds: state.cellIds.insertId(
1574
- SETUP_CELL_ID,
1575
- state.cellIds.atOrThrow(0).id,
1576
- 0,
1577
- ),
1578
- cellData: {
1579
- ...state.cellData,
1580
- [SETUP_CELL_ID]: createCell({
1581
- id: SETUP_CELL_ID,
1582
- name: SETUP_CELL_ID,
1583
- code,
1584
- edited: Boolean(code),
1585
- }),
1586
- },
1587
- cellRuntime: {
1588
- ...state.cellRuntime,
1589
- [SETUP_CELL_ID]: createCellRuntimeState(),
1590
- },
1591
- cellHandles: {
1592
- ...state.cellHandles,
1593
- [SETUP_CELL_ID]: createRef(),
1594
- },
1595
- scrollKey: SETUP_CELL_ID,
1596
- };
1597
- },
1598
334
  });
1599
335
 
1600
- // We apply the middleware here (rather than inline in createReducerAndAtoms)
1601
- // so that the document transaction middleware can import CellActions and
1602
- // strictly type the dispatched actions without creating a circular dependency.
1603
- addMiddleware(documentTransactionMiddleware);
1604
-
1605
- function isCellCodeHidden(state: NotebookState, cellId: CellId): boolean {
1606
- return (
1607
- Boolean(state.cellData[cellId].config.hide_code) &&
1608
- !state.untouchedNewCells.has(cellId)
1609
- );
1610
- }
1611
-
1612
336
  // Helper function to update a cell in the array
1613
337
  function updateCellRuntimeState({
1614
338
  state,
@@ -1633,68 +357,6 @@ function updateCellRuntimeState({
1633
357
  };
1634
358
  }
1635
359
 
1636
- function updateCellData({
1637
- state,
1638
- cellId,
1639
- cellReducer,
1640
- }: {
1641
- state: NotebookState;
1642
- cellId: CellId;
1643
- cellReducer: ReducerWithoutAction<CellData>;
1644
- }) {
1645
- if (!(cellId in state.cellData)) {
1646
- Logger.warn(`Cell ${cellId} not found in state`);
1647
- return state;
1648
- }
1649
-
1650
- return {
1651
- ...state,
1652
- cellData: {
1653
- ...state.cellData,
1654
- [cellId]: cellReducer(state.cellData[cellId]),
1655
- },
1656
- };
1657
- }
1658
-
1659
- export function getCellConfigs(state: NotebookState): CellConfig[] {
1660
- const cells = state.cellData;
1661
-
1662
- // We set to null by default to prevent inconsistencies between undefined & null
1663
- const defaultCellConfig: Partial<CellConfig> = { column: null };
1664
-
1665
- // Handle the case where there's only one column
1666
- // We don't want to set the column config
1667
- const hasMultipleColumns = state.cellIds.getColumns().length > 1;
1668
- if (!hasMultipleColumns) {
1669
- return state.cellIds.getColumns().flatMap((column) => {
1670
- return column.inOrderIds.map((cellId) => {
1671
- return {
1672
- ...cells[cellId].config,
1673
- ...defaultCellConfig,
1674
- };
1675
- });
1676
- });
1677
- }
1678
-
1679
- return state.cellIds.getColumns().flatMap((column, columnIndex) => {
1680
- return column.inOrderIds.map((cellId, cellIndex) => {
1681
- const config: Partial<CellConfig> = { ...defaultCellConfig };
1682
-
1683
- // Only set the column index for the first cell in the column
1684
- if (cellIndex === 0) {
1685
- config.column = columnIndex;
1686
- }
1687
-
1688
- const newConfig = {
1689
- ...cells[cellId].config,
1690
- ...config,
1691
- };
1692
-
1693
- return newConfig;
1694
- });
1695
- });
1696
- }
1697
-
1698
360
  export {
1699
361
  createActions as createNotebookActions,
1700
362
  reducer as notebookReducer,
@@ -1712,9 +374,7 @@ export const addLogs = imperativeActions.addLogs;
1712
374
 
1713
375
  export const cellIdsAtom = atom((get) => get(notebookAtom).cellIds);
1714
376
 
1715
- export const hasOnlyOneCellAtom = atom((get) =>
1716
- get(cellIdsAtom).hasOnlyOneId(),
1717
- );
377
+ export const hasOnlyOneCellAtom = atom((get) => get(cellIdsAtom).length === 1);
1718
378
 
1719
379
  export const hasDisabledCellsAtom = atom(
1720
380
  (get) => disabledCellIds(get(notebookAtom)).length > 0,
@@ -1728,11 +388,17 @@ export const canUndoDeletesAtom = atom((get) =>
1728
388
 
1729
389
  export const undoLabelAtom = atom((get) => getUndoLabel(get(notebookAtom)));
1730
390
 
1731
- export const needsRunAtom = atom((get) => notebookNeedsRun(get(notebookAtom)));
391
+ export const needsRunAtom = atom((get) =>
392
+ notebookNeedsRun(
393
+ get(notebookAtom),
394
+ get(cellExecutionInputsAtom),
395
+ get(cellFreshnessAtom),
396
+ ),
397
+ );
1732
398
 
1733
399
  export const cellErrorsAtom = atom((get) => {
1734
400
  const { cellIds, cellRuntime, cellData } = get(notebookAtom);
1735
- const errors = cellIds.inOrderIds
401
+ const errors = cellIds
1736
402
  .map((cellId) => {
1737
403
  const cell = cellRuntime[cellId];
1738
404
  const { name } = cellData[cellId];
@@ -1760,11 +426,28 @@ export const cellErrorsAtom = atom((get) => {
1760
426
  return errors;
1761
427
  });
1762
428
 
429
+ /**
430
+ * The outline of each cell whose output has a heading. Compared by value, so
431
+ * readers are left alone by the runtime messages that change no heading.
432
+ */
433
+ export const cellOutlinesAtom = createDeepEqualAtom(
434
+ atom((get) => {
435
+ const outlines: Partial<Record<CellId, Outline>> = {};
436
+ for (const [id, runtime] of Objects.entries(
437
+ get(notebookAtom).cellRuntime,
438
+ )) {
439
+ if (runtime.outline !== null && runtime.outline.items.length > 0) {
440
+ outlines[id] = runtime.outline;
441
+ }
442
+ }
443
+ return outlines;
444
+ }),
445
+ );
446
+
1763
447
  export const notebookOutline = atom((get) => {
1764
- const { cellIds, cellRuntime } = get(notebookAtom);
1765
- const outlines = cellIds.inOrderIds.map(
1766
- (cellId) => cellRuntime[cellId].outline,
1767
- );
448
+ const cellIds = get(cellIdsAtom);
449
+ const cellRuntime = get(cellsRuntimeAtom);
450
+ const outlines = cellIds.map((cellId) => cellRuntime[cellId].outline);
1768
451
  return mergeOutlines(outlines);
1769
452
  });
1770
453
 
@@ -1774,7 +457,7 @@ export const cellIdToNamesMap = createDeepEqualAtom(
1774
457
  atom((get) => {
1775
458
  const { cellIds, cellData } = get(notebookAtom);
1776
459
  const names: Record<CellId, string | undefined> = Objects.fromEntries(
1777
- cellIds.inOrderIds.map((cellId) => [cellId, cellData[cellId]?.name]),
460
+ cellIds.map((cellId) => [cellId, cellData[cellId]?.name]),
1778
461
  );
1779
462
  return names;
1780
463
  }),
@@ -1831,41 +514,19 @@ export const getCells = () => store.get(notebookAtom).cellIds;
1831
514
  */
1832
515
  export const getCellNames = () => {
1833
516
  const { cellIds, cellData } = store.get(notebookAtom);
1834
- return cellIds.inOrderIds.map((id) => cellData[id]?.name).filter(Boolean);
517
+ return cellIds.map((id) => cellData[id]?.name).filter(Boolean);
1835
518
  };
1836
519
 
1837
520
  const cellDataAtoms = splitAtom(
1838
521
  selectAtom(notebookAtom, (cells) =>
1839
- cells.cellIds.inOrderIds.map((id) => cells.cellData[id]),
522
+ cells.cellIds.map((id) => cells.cellData[id]),
1840
523
  ),
1841
524
  );
1842
525
  export const useCellDataAtoms = () => useAtom(cellDataAtoms);
1843
526
 
1844
527
  export const cellsRuntimeAtom = atom((get) => get(notebookAtom).cellRuntime);
1845
528
 
1846
- export const notebookIsRunningAtom = atom((get) =>
1847
- notebookIsRunning(get(notebookAtom)),
1848
- );
1849
- export const onlyScratchpadIsRunningAtom = atom((get) => {
1850
- const { cellRuntime } = get(notebookAtom);
1851
- return Object.entries(cellRuntime).every(
1852
- ([id, rt]) => rt.status !== "running" || id === SCRATCH_CELL_ID,
1853
- );
1854
- });
1855
- export const notebookQueuedOrRunningCountAtom = atom((get) =>
1856
- notebookQueueOrRunningCount(get(notebookAtom)),
1857
- );
1858
-
1859
- export const numColumnsAtom = atom(
1860
- (get) => get(notebookAtom).cellIds.colLength,
1861
- );
1862
- export const hasCellsAtom = atom(
1863
- (get) => get(notebookAtom).cellIds.idLength > 0,
1864
- );
1865
- export const columnIdsAtom = atom((get) =>
1866
- get(notebookAtom).cellIds.getColumnIds(),
1867
- );
1868
-
529
+ export const hasCellsAtom = atom((get) => get(notebookAtom).cellIds.length > 0);
1869
530
  export const cellDataAtom = atomFamily((cellId: CellId) =>
1870
531
  atom((get) => get(notebookAtom).cellData[cellId]),
1871
532
  );
@@ -1889,6 +550,7 @@ export function releaseCellAtoms(cellId: CellId) {
1889
550
  cellDataAtom.remove(cellId);
1890
551
  cellRuntimeAtom.remove(cellId);
1891
552
  cellHandleAtom.remove(cellId);
553
+ withdrawCells(store, [cellId]);
1892
554
  }
1893
555
 
1894
556
  /** Subscribes to reactive updates of the cell's data. */
@@ -1906,7 +568,7 @@ export const useCellHandle = (cellId: CellId) =>
1906
568
  */
1907
569
  export const getAllEditorViews = () => {
1908
570
  const { cellIds, cellHandles } = store.get(notebookAtom);
1909
- return cellIds.inOrderIds
571
+ return cellIds
1910
572
  .map((cellId) => cellHandles[cellId]?.current?.editorViewOrNull)
1911
573
  .filter(Boolean);
1912
574
  };
@@ -1930,16 +592,10 @@ export function flattenTopLevelNotebookCells(
1930
592
  state: NotebookState,
1931
593
  ): (CellData & CellRuntimeState)[] {
1932
594
  const { cellIds, cellData, cellRuntime } = state;
1933
- return cellIds.getColumns().flatMap((column) =>
1934
- column.topLevelIds.map((cellId) => ({
1935
- ...cellData[cellId],
1936
- ...cellRuntime[cellId],
1937
- })),
1938
- );
1939
- }
1940
-
1941
- export function createUntouchedCellAtom(cellId: CellId): Atom<boolean> {
1942
- return atom((get) => get(notebookAtom).untouchedNewCells.has(cellId));
595
+ return cellIds.map((cellId) => ({
596
+ ...cellData[cellId],
597
+ ...cellRuntime[cellId],
598
+ }));
1943
599
  }
1944
600
 
1945
601
  export function createTracebackInfoAtom(
@@ -1955,7 +611,8 @@ export function createTracebackInfoAtom(
1955
611
  return undefined;
1956
612
  }
1957
613
 
1958
- if (data.status === "queued" || data.status === "running") {
614
+ const { status } = cellExecutionView(get(cellExecutionInputsAtom), cellId);
615
+ if (status === "queued" || status === "running") {
1959
616
  return undefined;
1960
617
  }
1961
618
 
@@ -2001,20 +658,13 @@ export function createTracebackInfoAtom(
2001
658
  });
2002
659
  }
2003
660
 
2004
- /**
2005
- * Use this hook to dispatch cell actions. This hook will not cause a re-render
2006
- * when cells change.
2007
- */
2008
- export function useCellActions(
2009
- options: { skipMiddleware?: boolean } = {},
2010
- ): CellActions {
2011
- return useActions(options);
661
+ /** The reducer's actions. Components use `useCellActions` from `./actions`. */
662
+ export function useReducerActions(): ReducerCellActions {
663
+ return useActions();
2012
664
  }
2013
665
 
2014
- /**
2015
- * Map of cell actions
2016
- */
2017
- export type CellActions = ReturnType<typeof createActions>;
666
+ /** The actions the reducer still handles. */
667
+ export type ReducerCellActions = ReturnType<typeof createActions>;
2018
668
 
2019
669
  /**
2020
670
  * This is exported for testing purposes only.
@@ -2023,7 +673,6 @@ export const exportedForTesting = {
2023
673
  reducer,
2024
674
  createActions,
2025
675
  initialNotebookState,
2026
- isCellCodeHidden,
2027
676
  // Export atom families for testing cleanup
2028
677
  cellDataAtom,
2029
678
  cellRuntimeAtom,