@marimo-team/frontend 0.15.4 → 0.16.0-dev96986
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.
- package/dist/assets/ConnectedDataExplorerComponent-CNLoZkWr.js +19 -0
- package/dist/assets/{ImageComparisonComponent-CEXMKKA4.js → ImageComparisonComponent-SX7fDaTK.js} +1 -1
- package/dist/assets/{VegaLite-Bt14Ds9k.js → VegaLite-MJUW3b7C.js} +6 -6
- package/dist/assets/_baseEach-9_logFrf.js +1 -0
- package/dist/assets/_baseMap-NzEbKt5c.js +1 -0
- package/dist/assets/_baseUniq-C5LFcyNC.js +1 -0
- package/dist/assets/_createAggregator-ZRm2b6Zm.js +1 -0
- package/dist/assets/agent-panel-BBd11wNX.js +287 -0
- package/dist/assets/agent-panel-D92Mfy1i.css +1 -0
- package/dist/assets/{any-language-editor-DiwNT6zp.js → any-language-editor-DwAaEQfS.js} +1 -1
- package/dist/assets/architectureDiagram-W76B3OCA-BJmVXUoW.js +36 -0
- package/dist/assets/{between-horizontal-start-FyewyCGn.js → between-horizontal-start-KiwU-a3C.js} +1 -1
- package/dist/assets/{blockDiagram-QIGZ2CNN-BrOkAf_c.js → blockDiagram-QIGZ2CNN-DzxZjE7B.js} +1 -1
- package/dist/assets/{c4Diagram-FPNF74CW-BHPzDxE2.js → c4Diagram-FPNF74CW-DjmldG_J.js} +5 -5
- package/dist/assets/channel-DHcKBVM4.js +1 -0
- package/dist/assets/chat-panel-DgJZr0eS.js +3 -0
- package/dist/assets/{chunk-4BX2VUAB-DLxaCNYh.js → chunk-4BX2VUAB-EUTQThiZ.js} +1 -1
- package/dist/assets/{chunk-55IACEB6-DdzvO3HR.js → chunk-55IACEB6-DZAiDJxy.js} +1 -1
- package/dist/assets/{chunk-FMBD7UC4-R5o-nSiG.js → chunk-FMBD7UC4-Bd0Czs-J.js} +1 -1
- package/dist/assets/{chunk-K7UQS3LO-DxaMrGgG.js → chunk-K7UQS3LO-DEKMIknX.js} +1 -1
- package/dist/assets/{chunk-QN33PNHL-DqS9-FYm.js → chunk-QN33PNHL-E0jwHU_n.js} +1 -1
- package/dist/assets/{chunk-QZHKN3VN-BZ-TzajS.js → chunk-QZHKN3VN-BzaIHJbq.js} +1 -1
- package/dist/assets/{chunk-TVAH2DTR-BsgP2dyv.js → chunk-TVAH2DTR-CZFYvqnm.js} +1 -1
- package/dist/assets/{chunk-TZMSLE5B-D-h3ahXI.js → chunk-TZMSLE5B-BNqnFjtv.js} +1 -1
- package/dist/assets/{circle-play-CQtRZ-rT.js → circle-play-D3J_mYrF.js} +1 -1
- package/dist/assets/classDiagram-KNZD7YFC-D-xwLnlX.js +1 -0
- package/dist/assets/classDiagram-v2-RKCZMP56-D-xwLnlX.js +1 -0
- package/dist/assets/{clear-button-BY6Z_ViL.js → clear-button-ifzRuAR3.js} +1 -1
- package/dist/assets/clone-CSxIll62.js +1 -0
- package/dist/assets/command-palette-D2fdVSET.js +1 -0
- package/dist/assets/common-Ku-cF_2J.js +1 -0
- package/dist/assets/{compile-Ct_jzdKr.js → compile-BgZlHW1c.js} +1 -1
- package/dist/assets/cose-bilkent-S5V4N54A-CVM83SqK.js +1 -0
- package/dist/assets/dagre-5GWH7T2D-ouQPkxT3.js +4 -0
- package/dist/assets/{data-grid-overlay-editor-BN_wulc3.js → data-grid-overlay-editor-B47j5GJJ.js} +1 -1
- package/dist/assets/datasources-panel-Bt41Zir-.js +1 -0
- package/dist/assets/{dependency-graph-panel-BOmSCZf7.js → dependency-graph-panel-CZC_B7pK.js} +4 -4
- package/dist/assets/diagram-N5W7TBWH-CQ817ZdR.js +24 -0
- package/dist/assets/diagram-QEK2KX5R-DOK_psUO.js +43 -0
- package/dist/assets/diagram-S2PKOQOG-CVljmOW8.js +24 -0
- package/dist/assets/{documentation-panel-BxjJO_Gw.js → documentation-panel-C7yIvGg1.js} +1 -1
- package/dist/assets/edit-page-CyTMQV2u.js +129 -0
- package/dist/assets/{ellipsis-vertical-UHbmjI2n.js → ellipsis-vertical-C7FjlUsY.js} +1 -1
- package/dist/assets/{empty-state-BIBXzY_0.js → empty-state-DIOGM_CU.js} +1 -1
- package/dist/assets/{erDiagram-AWTI2OKA-E84mAle_.js → erDiagram-AWTI2OKA-DYu8cEdc.js} +1 -1
- package/dist/assets/{error-panel-MEvQ6K7h.js → error-panel-Ddb8RkFG.js} +1 -1
- package/dist/assets/file-explorer-panel-Oy9DbyFP.js +1 -0
- package/dist/assets/{flowDiagram-PVAE7QVJ-DfbIRSAW.js → flowDiagram-PVAE7QVJ-CmvW5iTb.js} +1 -1
- package/dist/assets/{ganttDiagram-OWAHRB6G-DR4HZ1z_.js → ganttDiagram-OWAHRB6G-BaKQlCaT.js} +4 -4
- package/dist/assets/gitGraphDiagram-NY62KEGX-CWO24eP6.js +65 -0
- package/dist/assets/{glide-data-editor-nNmo1lPq.js → glide-data-editor-CNDLEJ9a.js} +11 -11
- package/dist/assets/graph-BZKTtxsc.js +1 -0
- package/dist/assets/home-page-Bvwppn9N.js +9 -0
- package/dist/assets/{index-VPWqq2Pg.js → index-0XOUPdwT.js} +1 -1
- package/dist/assets/{index-uacyUula.js → index-BH7f3aiU.js} +1 -1
- package/dist/assets/{index-Dt9UWeWn.js → index-BJVyzkx5.js} +1 -1
- package/dist/assets/{index-BAH034Ue.js → index-B_d_JZGI.js} +1 -1
- package/dist/assets/{index-CB2pnVQG.js → index-BgXbBA39.js} +1 -1
- package/dist/assets/{index-B8llrTSo.js → index-Brf2DwUM.js} +1 -1
- package/dist/assets/{index-BLu5CX6z.js → index-CXrWwFX6.js} +1 -1
- package/dist/assets/{index-DyLSuOH1.js → index-CZaurnA9.js} +1 -1
- package/dist/assets/{index-BFSnz7iM.js → index-CerjupfZ.js} +1 -1
- package/dist/assets/{index-B7yXbrLa.js → index-D-tZfElD.js} +1 -1
- package/dist/assets/{index-c6If577Q.js → index-D3PqGupX.js} +1 -1
- package/dist/assets/{index-CSgxTUzD.js → index-DCkzth56.js} +1 -1
- package/dist/assets/{index-DWOaniGT.js → index-DFrGFNW1.js} +1 -1
- package/dist/assets/{index-CPN7TRA1.js → index-DZhOPkOB.js} +1 -1
- package/dist/assets/index-DadI618h.css +1 -0
- package/dist/assets/{index-DqzMPAC8.js → index-DkntzpX4.js} +2 -2
- package/dist/assets/{index-B1_GXGaP.js → index-DmgwT3sx.js} +1 -1
- package/dist/assets/index-PmY0x4Zd.js +578 -0
- package/dist/assets/{index-Bq516OmX.js → index-WXJFkQHg.js} +1 -1
- package/dist/assets/{index-DSU75csX.js → index-qE8lHQ-N.js} +1 -1
- package/dist/assets/{index-DMomwMcN.js → index-zrSUQXha.js} +1 -1
- package/dist/assets/infoDiagram-STP46IZ2-CAuVVehw.js +2 -0
- package/dist/assets/isEmpty-D1t7Gran.js +1 -0
- package/dist/assets/{journeyDiagram-BIP6EPQ6-BBiFyygf.js → journeyDiagram-BIP6EPQ6-D4Rp6H_h.js} +1 -1
- package/dist/assets/{kanban-definition-6OIFK2YF-DhgA6Nt6.js → kanban-definition-6OIFK2YF-DFt9DftA.js} +4 -4
- package/dist/assets/layout-D8WXi2_g.js +1 -0
- package/dist/assets/linear-BwY8e5hA.js +1 -0
- package/dist/assets/links-4B6ldZ5P.js +7 -0
- package/dist/assets/{logs-panel-B9SmTZAW.js → logs-panel-Dxiyt7dO.js} +1 -1
- package/dist/assets/{agent-panel-DpQ6muj-.css → markdown-renderer-ClyzDMmG.css} +1 -1
- package/dist/assets/markdown-renderer-VDu-NBKB.js +263 -0
- package/dist/assets/mermaid-B-O-Puyi.js +1 -0
- package/dist/assets/{mermaid.core-4nVOEVX3.js → mermaid.core-BFFCqfOn.js} +41 -41
- package/dist/assets/min-DtVSfYKl.js +1 -0
- package/dist/assets/{mindmap-definition-Q6HEUPPD-CVLQNn1q.js → mindmap-definition-Q6HEUPPD-kyvIY8Dg.js} +2 -2
- package/dist/assets/{number-overlay-editor-CzRzXLcd.js → number-overlay-editor-GjLB2UK4.js} +1 -1
- package/dist/assets/outline-panel-CMJjOoN7.js +1 -0
- package/dist/assets/packages-panel-nfXB-bKW.js +1 -0
- package/dist/assets/{pieDiagram-ADFJNKIX-C5IQ5DBZ.js → pieDiagram-ADFJNKIX-D8JFQcWR.js} +3 -3
- package/dist/assets/{quadrantDiagram-LMRXKWRM-CFXFnQxx.js → quadrantDiagram-LMRXKWRM-Nf8GzxXG.js} +1 -1
- package/dist/assets/{react-plotly-mzdv02_Y.js → react-plotly-CnW9p7ZA.js} +1 -1
- package/dist/assets/{requirementDiagram-4UW4RH46-D9bPC89T.js → requirementDiagram-4UW4RH46-CCUxF8BZ.js} +1 -1
- package/dist/assets/run-page-Bl4p3AbZ.js +1 -0
- package/dist/assets/sankeyDiagram-GR3RE2ED-Sr8kDwP1.js +10 -0
- package/dist/assets/scratchpad-panel-Ja1Mu-W3.js +1 -0
- package/dist/assets/secrets-panel-B-3fcSyP.js +1 -0
- package/dist/assets/{sequenceDiagram-C3RYC4MD-6N7_hY4k.js → sequenceDiagram-C3RYC4MD-CBJ152Q3.js} +4 -4
- package/dist/assets/{slides-component-DMjQomc3.css → slides-component-C-LoGC1U.css} +1 -1
- package/dist/assets/{slides-component-EcjC8sDK.js → slides-component-DGtsVP5o.js} +1 -1
- package/dist/assets/snippets-panel-ClNnwKBM.js +1 -0
- package/dist/assets/sortBy-D47H6Vyl.js +1 -0
- package/dist/assets/state-B_RCHTH5.js +1 -0
- package/dist/assets/stateDiagram-KXAO66HF-BlBFSAZr.js +1 -0
- package/dist/assets/stateDiagram-v2-UMBNRL4Z-DbA-iToo.js +1 -0
- package/dist/assets/storage-BNcWOH3-.js +26 -0
- package/dist/assets/terminal-CATzv5Hd.js +10 -0
- package/dist/assets/time-CsYqILfB.js +1 -0
- package/dist/assets/{timeline-definition-XQNQX7LJ-BEaynAiY.js → timeline-definition-XQNQX7LJ-CGrhjuAs.js} +1 -1
- package/dist/assets/tracing-DUbJtOyq.js +2 -0
- package/dist/assets/{tracing-panel-BmuHLPrY.js → tracing-panel-DmzqPUtc.js} +2 -2
- package/dist/assets/{trash-UBqfK4mR.js → trash-rxdjLzkf.js} +1 -1
- package/dist/assets/{tree-XiEycetl.js → tree-C2Ul1h1C.js} +1 -1
- package/dist/assets/{treemap-75Q7IDZK-CnuVFbBG.js → treemap-75Q7IDZK-N9hyUpyj.js} +20 -20
- package/dist/assets/{ts-tags-CloPe9IY.js → ts-tags-DxCDHihD.js} +1 -1
- package/dist/assets/variable-panel-BbgupOdG.js +1 -0
- package/dist/assets/{vega-component-DsTH4tuX.js → vega-component-CR_MHOBT.js} +1 -1
- package/dist/assets/worker-fHbtoWvT.js +1 -0
- package/dist/assets/{xychartDiagram-6GGTOJPD-Dcz3O-A3.js → xychartDiagram-6GGTOJPD-jdLZsMb2.js} +1 -1
- package/dist/index.html +2 -2
- package/package.json +10 -5
- package/src/__tests__/mocks.ts +43 -0
- package/src/components/app-config/user-config-form.tsx +78 -1
- package/src/components/chat/acp/__tests__/__snapshots__/prompt.test.ts.snap +116 -65
- package/src/components/chat/acp/__tests__/atoms.test.ts +1 -1
- package/src/components/chat/acp/__tests__/context-utils.test.ts +222 -0
- package/src/components/chat/acp/__tests__/prompt.test.ts +1 -1
- package/src/components/chat/acp/__tests__/state.test.ts +38 -42
- package/src/components/chat/acp/agent-docs.tsx +33 -6
- package/src/components/chat/acp/agent-panel.css +0 -18
- package/src/components/chat/acp/agent-panel.tsx +394 -72
- package/src/components/chat/acp/agent-selector.tsx +7 -1
- package/src/components/chat/acp/blocks.tsx +40 -10
- package/src/components/chat/acp/common.tsx +10 -2
- package/src/components/chat/acp/context-utils.ts +127 -0
- package/src/components/chat/acp/prompt.ts +96 -53
- package/src/components/chat/acp/state.ts +1 -1
- package/src/components/chat/acp/types.ts +8 -0
- package/src/components/chat/chat-panel.tsx +28 -89
- package/src/components/chat/chat-utils.ts +127 -1
- package/src/components/chat/markdown-renderer.css +39 -0
- package/src/components/chat/markdown-renderer.tsx +12 -47
- package/src/components/chat/tool-call-accordion.tsx +148 -26
- package/src/components/data-table/SearchBar.tsx +8 -7
- package/src/components/data-table/__tests__/column_formatting.test.ts +50 -35
- package/src/components/data-table/__tests__/data-table.test.tsx +39 -1
- package/src/components/data-table/cell-hover-template/feature.ts +14 -0
- package/src/components/data-table/cell-hover-template/types.ts +11 -0
- package/src/components/data-table/charts/components/form-fields.tsx +41 -37
- package/src/components/data-table/charts/forms/common-chart.tsx +2 -2
- package/src/components/data-table/column-explorer-panel/column-explorer.tsx +5 -2
- package/src/components/data-table/column-formatting/feature.ts +62 -29
- package/src/components/data-table/column-formatting/types.ts +1 -0
- package/src/components/data-table/column-header.tsx +3 -1
- package/src/components/data-table/column-summary/chart-spec-model.tsx +24 -7
- package/src/components/data-table/column-summary/column-summary.tsx +18 -9
- package/src/components/data-table/columns.tsx +42 -18
- package/src/components/data-table/data-table.tsx +10 -2
- package/src/components/data-table/date-popover.tsx +85 -75
- package/src/components/data-table/filter-pills.tsx +14 -9
- package/src/components/data-table/header-items.tsx +5 -1
- package/src/components/data-table/pagination.tsx +20 -13
- package/src/components/data-table/renderers.tsx +28 -0
- package/src/components/data-table/row-viewer-panel/row-viewer.tsx +10 -8
- package/src/components/datasources/column-preview.tsx +6 -2
- package/src/components/datasources/datasources.tsx +8 -12
- package/src/components/editor/Cell.tsx +6 -0
- package/src/components/editor/actions/name-cell-input.tsx +6 -1
- package/src/components/editor/actions/useCellActionButton.tsx +3 -1
- package/src/components/editor/ai/__tests__/completion-utils.test.ts +178 -1
- package/src/components/editor/ai/add-cell-with-ai.tsx +68 -66
- package/src/components/editor/ai/ai-completion-editor.tsx +29 -26
- package/src/components/editor/ai/completion-handlers.tsx +44 -6
- package/src/components/editor/ai/completion-utils.ts +92 -0
- package/src/components/editor/ai/transport/chat-transport.tsx +39 -0
- package/src/components/editor/cell/CellStatus.tsx +23 -20
- package/src/components/editor/cell/CreateCellButton.tsx +3 -4
- package/src/components/editor/cell/StagedAICell.tsx +51 -0
- package/src/components/editor/cell/cell-actions.tsx +2 -1
- package/src/components/editor/cell/code/language-toggle.tsx +3 -4
- package/src/components/editor/chrome/wrapper/footer-items/machine-stats.tsx +39 -28
- package/src/components/editor/controls/notebook-menu-dropdown.tsx +4 -2
- package/src/components/editor/file-tree/requesting-tree.tsx +14 -8
- package/src/components/editor/renderers/CellArray.tsx +3 -4
- package/src/components/editor/renderers/slides-layout/slides-layout.tsx +3 -3
- package/src/components/editor/renderers/slides-layout/types.ts +1 -0
- package/src/components/pages/home-page.tsx +4 -1
- package/src/components/slides/slides-component.tsx +1 -1
- package/src/components/slides/slides.css +6 -0
- package/src/components/terminal/__tests__/state.test.ts +207 -0
- package/src/components/terminal/hooks.ts +41 -0
- package/src/components/terminal/state.ts +75 -0
- package/src/components/terminal/terminal.tsx +334 -13
- package/src/components/terminal/theme.tsx +57 -0
- package/src/components/tracing/tracing-spec.ts +5 -4
- package/src/components/ui/range-slider.tsx +4 -2
- package/src/components/ui/slider.tsx +3 -1
- package/src/components/variables/variables-table.tsx +3 -0
- package/src/core/MarimoApp.tsx +9 -6
- package/src/core/ai/__tests__/staged-cells.test.ts +356 -0
- package/src/core/ai/context/__tests__/registry.test.ts +6 -4
- package/src/core/ai/context/providers/cell-output.ts +3 -2
- package/src/core/ai/context/providers/error.ts +3 -1
- package/src/core/ai/context/providers/file.ts +7 -2
- package/src/core/ai/context/providers/tables.ts +3 -2
- package/src/core/ai/context/providers/variable.ts +6 -4
- package/src/core/ai/staged-cells.ts +208 -0
- package/src/core/cells/cells.ts +1 -1
- package/src/core/cells/logs.ts +1 -1
- package/src/core/codemirror/find-replace/search-highlight.ts +3 -1
- package/src/core/codemirror/language/LanguageAdapters.ts +9 -3
- package/src/core/codemirror/lsp/federated-lsp.ts +1 -1
- package/src/core/codemirror/lsp/notebook-lsp.ts +8 -2
- package/src/core/codemirror/readonly/__tests__/extension.test.ts +1 -1
- package/src/core/codemirror/rtc/loro/awareness.ts +52 -17
- package/src/core/codemirror/rtc/loro/sync.ts +12 -4
- package/src/core/config/config-schema.ts +1 -0
- package/src/core/config/config.ts +4 -0
- package/src/core/hotkeys/hotkeys.ts +8 -4
- package/src/core/i18n/__tests__/locale-provider.test.tsx +176 -0
- package/src/core/i18n/locale-provider.tsx +35 -0
- package/src/core/i18n/with-locale.tsx +12 -0
- package/src/core/islands/components/web-components.tsx +13 -10
- package/src/core/islands/main.ts +2 -2
- package/src/core/kernel/RuntimeState.ts +4 -1
- package/src/core/kernel/messages.ts +8 -12
- package/src/core/network/DeferredRequestRegistry.ts +16 -4
- package/src/core/runtime/runtime.ts +5 -4
- package/src/core/saving/__tests__/filename.test.ts +37 -0
- package/src/core/static/__tests__/download-html.test.ts +43 -1
- package/src/core/wasm/bridge.ts +5 -1
- package/src/core/wasm/store.ts +4 -1
- package/src/core/wasm/worker/message-buffer.ts +3 -2
- package/src/core/websocket/types.ts +22 -16
- package/src/core/websocket/useMarimoWebSocket.tsx +2 -2
- package/src/css/app/Cell.css +11 -0
- package/src/hooks/useFormatting.ts +97 -0
- package/src/hooks/useTimer.ts +8 -5
- package/src/plugins/core/RenderHTML.tsx +36 -2
- package/src/plugins/core/__test__/RenderHTML.test.ts +72 -0
- package/src/plugins/core/registerReactComponent.tsx +44 -10
- package/src/plugins/impl/DataTablePlugin.tsx +4 -0
- package/src/plugins/impl/FileBrowserPlugin.tsx +8 -2
- package/src/plugins/impl/RangeSliderPlugin.tsx +5 -3
- package/src/plugins/impl/SliderPlugin.tsx +3 -1
- package/src/plugins/impl/anywidget/model.ts +16 -5
- package/src/plugins/impl/data-editor/types.ts +7 -5
- package/src/plugins/impl/data-explorer/components/column-summary.tsx +20 -13
- package/src/plugins/impl/panel/utils.ts +6 -4
- package/src/plugins/layout/OutlinePlugin.tsx +69 -0
- package/src/plugins/layout/StatPlugin.tsx +4 -1
- package/src/plugins/plugins.ts +2 -0
- package/src/stories/cell.stories.tsx +1 -1
- package/src/stories/layout/vertical/one-column.stories.tsx +1 -1
- package/src/utils/__tests__/cell-urls.test.ts +29 -0
- package/src/utils/__tests__/dates.test.ts +45 -24
- package/src/utils/__tests__/filenames.test.ts +18 -0
- package/src/utils/__tests__/numbers.test.ts +42 -30
- package/src/utils/__tests__/once.test.ts +187 -0
- package/src/utils/__tests__/path.test.ts +38 -0
- package/src/utils/__tests__/urls.test.ts +56 -1
- package/src/utils/dates.ts +15 -10
- package/src/utils/edit-distance.ts +8 -6
- package/src/utils/errors.ts +9 -0
- package/src/utils/id-tree.tsx +21 -10
- package/src/utils/localStorage.ts +13 -4
- package/src/utils/numbers.ts +11 -11
- package/src/utils/once.ts +32 -0
- package/src/utils/paths.ts +4 -1
- package/src/utils/pluralize.ts +12 -5
- package/src/utils/python-poet/poet.ts +30 -15
- package/src/utils/time.ts +5 -1
- package/dist/assets/ConnectedDataExplorerComponent-Cn5-l2X1.js +0 -19
- package/dist/assets/_baseEach-C1FLm7WW.js +0 -1
- package/dist/assets/_baseMap-DBVArUYD.js +0 -1
- package/dist/assets/_baseUniq-Dk7ZPJ3N.js +0 -1
- package/dist/assets/_createAggregator-Bn38fDd3.js +0 -1
- package/dist/assets/agent-panel-COUYnuIK.js +0 -475
- package/dist/assets/architectureDiagram-W76B3OCA-DBzWQKKu.js +0 -36
- package/dist/assets/channel-CjhbjOv4.js +0 -1
- package/dist/assets/chat-panel-BPXKoTnZ.js +0 -7
- package/dist/assets/chat-panel-Brrs_eeH.css +0 -1
- package/dist/assets/classDiagram-KNZD7YFC-DHs5cFzy.js +0 -1
- package/dist/assets/classDiagram-v2-RKCZMP56-DHs5cFzy.js +0 -1
- package/dist/assets/clone-DM1YNjEn.js +0 -1
- package/dist/assets/command-palette-S0bzQp7v.js +0 -1
- package/dist/assets/common-B8U9k2Ly.js +0 -1
- package/dist/assets/cose-bilkent-S5V4N54A-wz1Sfx7j.js +0 -1
- package/dist/assets/dagre-5GWH7T2D-BfpcVBgq.js +0 -4
- package/dist/assets/datasources-panel-DfuURLJw.js +0 -1
- package/dist/assets/diagram-N5W7TBWH-Bf0oqqQh.js +0 -24
- package/dist/assets/diagram-QEK2KX5R-ZTc3qikh.js +0 -43
- package/dist/assets/diagram-S2PKOQOG-tLScBy7Z.js +0 -24
- package/dist/assets/edit-page-DJ8kJZ9w.js +0 -129
- package/dist/assets/file-explorer-panel-CzNUJ63G.js +0 -1
- package/dist/assets/gitGraphDiagram-NY62KEGX-C1t6QtVa.js +0 -65
- package/dist/assets/graph-CssCVWIq.js +0 -1
- package/dist/assets/home-page-9eW6qida.js +0 -9
- package/dist/assets/index-CknhX2Vy.css +0 -1
- package/dist/assets/index-DcCIe7np.js +0 -28
- package/dist/assets/index-OC46250R.js +0 -570
- package/dist/assets/infoDiagram-STP46IZ2-CwiAoz9f.js +0 -2
- package/dist/assets/layout-DpQrxGW-.js +0 -1
- package/dist/assets/linear-NsreOeBF.js +0 -1
- package/dist/assets/links-CbvGxbsJ.js +0 -7
- package/dist/assets/mermaid-DSt0r6IQ.js +0 -1
- package/dist/assets/min-D259kI3t.js +0 -1
- package/dist/assets/outline-panel-uvsS-YEQ.js +0 -1
- package/dist/assets/packages-panel-xMz9W2hW.js +0 -1
- package/dist/assets/run-page-Bb68qdhQ.js +0 -1
- package/dist/assets/sankeyDiagram-GR3RE2ED-BSJOau8E.js +0 -10
- package/dist/assets/scratchpad-panel-BF4BO-U4.js +0 -1
- package/dist/assets/secrets-panel-CdIX44dQ.js +0 -1
- package/dist/assets/snippets-panel-Dco9h0rb.js +0 -1
- package/dist/assets/sortBy-aLGA-PGK.js +0 -1
- package/dist/assets/stateDiagram-KXAO66HF-Bd68WT3b.js +0 -1
- package/dist/assets/stateDiagram-v2-UMBNRL4Z-BXz_GSwb.js +0 -1
- package/dist/assets/storage-CGlP4lCF.js +0 -26
- package/dist/assets/terminal-CxkHubcu.js +0 -9
- package/dist/assets/time-D2nr1UgQ.js +0 -1
- package/dist/assets/tracing-kTqHxa7q.js +0 -2
- package/dist/assets/variable-panel-noTnH-AQ.js +0 -1
- package/dist/assets/worker-X5rxzQGQ.js +0 -1
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import { describe, expect, it } from "vitest";
|
|
4
|
+
import { exportedForTesting } from "../state";
|
|
5
|
+
|
|
6
|
+
const { reducer, initialState } = exportedForTesting;
|
|
7
|
+
|
|
8
|
+
describe("terminal state", () => {
|
|
9
|
+
describe("initialState", () => {
|
|
10
|
+
it("should return initial state with empty pendingCommands and isReady false", () => {
|
|
11
|
+
const state = initialState();
|
|
12
|
+
expect(state).toEqual({
|
|
13
|
+
pendingCommands: [],
|
|
14
|
+
isReady: false,
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
describe("reducer", () => {
|
|
20
|
+
it("should add a command to pendingCommands", () => {
|
|
21
|
+
const state = initialState();
|
|
22
|
+
const text = "ls -la";
|
|
23
|
+
|
|
24
|
+
const newState = reducer(state, { type: "addCommand", payload: text });
|
|
25
|
+
|
|
26
|
+
expect(newState.pendingCommands).toHaveLength(1);
|
|
27
|
+
expect(newState.pendingCommands[0]).toMatchObject({
|
|
28
|
+
text: "ls -la",
|
|
29
|
+
timestamp: expect.any(Number),
|
|
30
|
+
});
|
|
31
|
+
expect(newState.pendingCommands[0].id).toBeDefined();
|
|
32
|
+
expect(newState.isReady).toBe(false);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it("should add multiple commands to pendingCommands", () => {
|
|
36
|
+
const state = initialState();
|
|
37
|
+
|
|
38
|
+
let newState = reducer(state, { type: "addCommand", payload: "ls -la" });
|
|
39
|
+
newState = reducer(newState, { type: "addCommand", payload: "cd /home" });
|
|
40
|
+
newState = reducer(newState, { type: "addCommand", payload: "pwd" });
|
|
41
|
+
|
|
42
|
+
expect(newState.pendingCommands).toHaveLength(3);
|
|
43
|
+
expect(newState.pendingCommands[0].text).toBe("ls -la");
|
|
44
|
+
expect(newState.pendingCommands[1].text).toBe("cd /home");
|
|
45
|
+
expect(newState.pendingCommands[2].text).toBe("pwd");
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it("should remove a command by id", () => {
|
|
49
|
+
const state = initialState();
|
|
50
|
+
|
|
51
|
+
let newState = reducer(state, { type: "addCommand", payload: "ls -la" });
|
|
52
|
+
newState = reducer(newState, { type: "addCommand", payload: "cd /home" });
|
|
53
|
+
newState = reducer(newState, { type: "addCommand", payload: "pwd" });
|
|
54
|
+
|
|
55
|
+
const commandToRemove = newState.pendingCommands[1];
|
|
56
|
+
newState = reducer(newState, {
|
|
57
|
+
type: "removeCommand",
|
|
58
|
+
payload: commandToRemove.id,
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
expect(newState.pendingCommands).toHaveLength(2);
|
|
62
|
+
expect(newState.pendingCommands[0].text).toBe("ls -la");
|
|
63
|
+
expect(newState.pendingCommands[1].text).toBe("pwd");
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it("should not remove anything if command id does not exist", () => {
|
|
67
|
+
const state = initialState();
|
|
68
|
+
|
|
69
|
+
let newState = reducer(state, { type: "addCommand", payload: "ls -la" });
|
|
70
|
+
newState = reducer(newState, { type: "addCommand", payload: "cd /home" });
|
|
71
|
+
|
|
72
|
+
const originalLength = newState.pendingCommands.length;
|
|
73
|
+
newState = reducer(newState, {
|
|
74
|
+
type: "removeCommand",
|
|
75
|
+
payload: "non-existent-id",
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
expect(newState.pendingCommands).toHaveLength(originalLength);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
it("should set isReady to true", () => {
|
|
82
|
+
const state = initialState();
|
|
83
|
+
|
|
84
|
+
const newState = reducer(state, { type: "setReady", payload: true });
|
|
85
|
+
|
|
86
|
+
expect(newState.isReady).toBe(true);
|
|
87
|
+
expect(newState.pendingCommands).toEqual([]);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it("should set isReady to false", () => {
|
|
91
|
+
const state = { ...initialState(), isReady: true };
|
|
92
|
+
|
|
93
|
+
const newState = reducer(state, { type: "setReady", payload: false });
|
|
94
|
+
|
|
95
|
+
expect(newState.isReady).toBe(false);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it("should clear all pending commands", () => {
|
|
99
|
+
const state = initialState();
|
|
100
|
+
|
|
101
|
+
let newState = reducer(state, { type: "addCommand", payload: "ls -la" });
|
|
102
|
+
newState = reducer(newState, { type: "addCommand", payload: "cd /home" });
|
|
103
|
+
newState = reducer(newState, { type: "addCommand", payload: "pwd" });
|
|
104
|
+
|
|
105
|
+
expect(newState.pendingCommands).toHaveLength(3);
|
|
106
|
+
|
|
107
|
+
newState = reducer(newState, {
|
|
108
|
+
type: "clearCommands",
|
|
109
|
+
payload: undefined,
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
expect(newState.pendingCommands).toHaveLength(0);
|
|
113
|
+
expect(newState.isReady).toBe(false);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it("should preserve other state when adding commands", () => {
|
|
117
|
+
const state = { ...initialState(), isReady: true };
|
|
118
|
+
|
|
119
|
+
const newState = reducer(state, {
|
|
120
|
+
type: "addCommand",
|
|
121
|
+
payload: "ls -la",
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
expect(newState.isReady).toBe(true);
|
|
125
|
+
expect(newState.pendingCommands).toHaveLength(1);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it("should preserve other state when removing commands", () => {
|
|
129
|
+
const state = { ...initialState(), isReady: true };
|
|
130
|
+
|
|
131
|
+
let newState = reducer(state, { type: "addCommand", payload: "ls -la" });
|
|
132
|
+
newState = reducer(newState, {
|
|
133
|
+
type: "removeCommand",
|
|
134
|
+
payload: newState.pendingCommands[0].id,
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
expect(newState.isReady).toBe(true);
|
|
138
|
+
expect(newState.pendingCommands).toHaveLength(0);
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
it("should preserve other state when setting ready", () => {
|
|
142
|
+
const state = initialState();
|
|
143
|
+
|
|
144
|
+
let newState = reducer(state, { type: "addCommand", payload: "ls -la" });
|
|
145
|
+
newState = reducer(newState, { type: "addCommand", payload: "cd /home" });
|
|
146
|
+
newState = reducer(newState, { type: "setReady", payload: true });
|
|
147
|
+
|
|
148
|
+
expect(newState.isReady).toBe(true);
|
|
149
|
+
expect(newState.pendingCommands).toHaveLength(2);
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
it("should preserve other state when clearing commands", () => {
|
|
153
|
+
const state = { ...initialState(), isReady: true };
|
|
154
|
+
|
|
155
|
+
let newState = reducer(state, { type: "addCommand", payload: "ls -la" });
|
|
156
|
+
newState = reducer(newState, {
|
|
157
|
+
type: "clearCommands",
|
|
158
|
+
payload: undefined,
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
expect(newState.isReady).toBe(true);
|
|
162
|
+
expect(newState.pendingCommands).toHaveLength(0);
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
describe("command properties", () => {
|
|
167
|
+
it("should generate unique ids for commands", () => {
|
|
168
|
+
const state = initialState();
|
|
169
|
+
|
|
170
|
+
let newState = reducer(state, {
|
|
171
|
+
type: "addCommand",
|
|
172
|
+
payload: "command1",
|
|
173
|
+
});
|
|
174
|
+
newState = reducer(newState, { type: "addCommand", payload: "command2" });
|
|
175
|
+
|
|
176
|
+
const ids = newState.pendingCommands.map((cmd) => cmd.id);
|
|
177
|
+
expect(ids[0]).not.toBe(ids[1]);
|
|
178
|
+
expect(ids[0]).toBeDefined();
|
|
179
|
+
expect(ids[1]).toBeDefined();
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
it("should set timestamp when adding commands", () => {
|
|
183
|
+
const state = initialState();
|
|
184
|
+
const beforeTime = Date.now();
|
|
185
|
+
|
|
186
|
+
const newState = reducer(state, {
|
|
187
|
+
type: "addCommand",
|
|
188
|
+
payload: "ls -la",
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
const afterTime = Date.now();
|
|
192
|
+
const command = newState.pendingCommands[0];
|
|
193
|
+
|
|
194
|
+
expect(command.timestamp).toBeGreaterThanOrEqual(beforeTime);
|
|
195
|
+
expect(command.timestamp).toBeLessThanOrEqual(afterTime);
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
it("should preserve text when adding commands", () => {
|
|
199
|
+
const state = initialState();
|
|
200
|
+
const text = "echo 'Hello World'";
|
|
201
|
+
|
|
202
|
+
const newState = reducer(state, { type: "addCommand", payload: text });
|
|
203
|
+
|
|
204
|
+
expect(newState.pendingCommands[0].text).toBe(text);
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
});
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import { useChromeActions } from "../editor/chrome/state";
|
|
4
|
+
import { useTerminalActions } from "./state";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Hook for sending commands to the terminal programmatically.
|
|
8
|
+
* This will:
|
|
9
|
+
* 1. Open the terminal if it's not already open
|
|
10
|
+
* 2. Wait for the terminal to be connected
|
|
11
|
+
* 3. Send the command text to the terminal
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```tsx
|
|
15
|
+
* function CopyButton({ command }: { command: string }) {
|
|
16
|
+
* const { sendCommand } = useTerminalCommands();
|
|
17
|
+
*
|
|
18
|
+
* return (
|
|
19
|
+
* <button onClick={() => sendCommand(command)}>
|
|
20
|
+
* Copy to Terminal
|
|
21
|
+
* </button>
|
|
22
|
+
* );
|
|
23
|
+
* }
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export function useTerminalCommands() {
|
|
27
|
+
const { addCommand } = useTerminalActions();
|
|
28
|
+
const { setIsTerminalOpen } = useChromeActions();
|
|
29
|
+
|
|
30
|
+
const sendCommand = (text: string) => {
|
|
31
|
+
// First, ensure the terminal is open
|
|
32
|
+
setIsTerminalOpen(true);
|
|
33
|
+
|
|
34
|
+
// Add the command to the queue
|
|
35
|
+
addCommand(text);
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
return {
|
|
39
|
+
sendCommand,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/* Copyright 2024 Marimo. All rights reserved. */
|
|
2
|
+
|
|
3
|
+
import { useAtomValue } from "jotai";
|
|
4
|
+
import { createReducerAndAtoms } from "@/utils/createReducer";
|
|
5
|
+
import { generateUUID } from "@/utils/uuid";
|
|
6
|
+
|
|
7
|
+
export interface TerminalCommand {
|
|
8
|
+
id: string;
|
|
9
|
+
text: string;
|
|
10
|
+
timestamp: number;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface TerminalState {
|
|
14
|
+
pendingCommands: TerminalCommand[];
|
|
15
|
+
isReady: boolean;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function initialState(): TerminalState {
|
|
19
|
+
return {
|
|
20
|
+
pendingCommands: [],
|
|
21
|
+
isReady: false,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const {
|
|
26
|
+
reducer,
|
|
27
|
+
createActions,
|
|
28
|
+
valueAtom: terminalStateAtom,
|
|
29
|
+
useActions,
|
|
30
|
+
} = createReducerAndAtoms(initialState, {
|
|
31
|
+
addCommand: (state, text: string) => {
|
|
32
|
+
const command: TerminalCommand = {
|
|
33
|
+
id: generateUUID(),
|
|
34
|
+
text,
|
|
35
|
+
timestamp: Date.now(),
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
return {
|
|
39
|
+
...state,
|
|
40
|
+
pendingCommands: [...state.pendingCommands, command],
|
|
41
|
+
};
|
|
42
|
+
},
|
|
43
|
+
removeCommand: (state, commandId: string) => ({
|
|
44
|
+
...state,
|
|
45
|
+
pendingCommands: state.pendingCommands.filter(
|
|
46
|
+
(cmd) => cmd.id !== commandId,
|
|
47
|
+
),
|
|
48
|
+
}),
|
|
49
|
+
setReady: (state, isReady: boolean) => ({
|
|
50
|
+
...state,
|
|
51
|
+
isReady,
|
|
52
|
+
}),
|
|
53
|
+
clearCommands: (state) => ({
|
|
54
|
+
...state,
|
|
55
|
+
pendingCommands: [],
|
|
56
|
+
}),
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* React hook to get the terminal state.
|
|
61
|
+
*/
|
|
62
|
+
export const useTerminalState = () => useAtomValue(terminalStateAtom);
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* React hook to get the terminal actions.
|
|
66
|
+
*/
|
|
67
|
+
export function useTerminalActions() {
|
|
68
|
+
return useActions();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export const exportedForTesting = {
|
|
72
|
+
reducer,
|
|
73
|
+
createActions,
|
|
74
|
+
initialState,
|
|
75
|
+
};
|