@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
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
PackageIcon,
|
|
14
14
|
} from "lucide-react";
|
|
15
15
|
import React, { useId, useRef } from "react";
|
|
16
|
+
import { useLocale } from "react-aria";
|
|
16
17
|
import { useForm } from "react-hook-form";
|
|
17
18
|
import { Button } from "@/components/ui/button";
|
|
18
19
|
import { Checkbox } from "@/components/ui/checkbox";
|
|
@@ -108,6 +109,7 @@ export const activeUserConfigCategoryAtom = atom<SettingCategoryId>(
|
|
|
108
109
|
);
|
|
109
110
|
|
|
110
111
|
const FORM_DEBOUNCE = 100; // ms;
|
|
112
|
+
const LOCALE_SYSTEM_VALUE = "__system__";
|
|
111
113
|
|
|
112
114
|
export const UserConfigForm: React.FC = () => {
|
|
113
115
|
const [config, setConfig] = useUserConfig();
|
|
@@ -118,6 +120,7 @@ export const UserConfigForm: React.FC = () => {
|
|
|
118
120
|
);
|
|
119
121
|
const capabilities = useAtomValue(capabilitiesAtom);
|
|
120
122
|
const marimoVersion = useAtomValue(marimoVersionAtom);
|
|
123
|
+
const { locale } = useLocale();
|
|
121
124
|
const { saveUserConfig } = useRequestClient();
|
|
122
125
|
|
|
123
126
|
// Create form
|
|
@@ -746,6 +749,47 @@ export const UserConfigForm: React.FC = () => {
|
|
|
746
749
|
</FormItem>
|
|
747
750
|
)}
|
|
748
751
|
/>
|
|
752
|
+
<FormField
|
|
753
|
+
control={form.control}
|
|
754
|
+
name="display.locale"
|
|
755
|
+
render={({ field }) => (
|
|
756
|
+
<div className="flex flex-col space-y-1">
|
|
757
|
+
<FormItem className={formItemClasses}>
|
|
758
|
+
<FormLabel>Locale</FormLabel>
|
|
759
|
+
<FormControl>
|
|
760
|
+
<NativeSelect
|
|
761
|
+
data-testid="locale-select"
|
|
762
|
+
onChange={(e) => {
|
|
763
|
+
if (e.target.value === LOCALE_SYSTEM_VALUE) {
|
|
764
|
+
field.onChange(undefined);
|
|
765
|
+
} else {
|
|
766
|
+
field.onChange(e.target.value);
|
|
767
|
+
}
|
|
768
|
+
}}
|
|
769
|
+
value={field.value || LOCALE_SYSTEM_VALUE}
|
|
770
|
+
disabled={field.disabled}
|
|
771
|
+
className="inline-flex mr-2"
|
|
772
|
+
>
|
|
773
|
+
<option value={LOCALE_SYSTEM_VALUE}>System</option>
|
|
774
|
+
{navigator.languages.map((option) => (
|
|
775
|
+
<option value={option} key={option}>
|
|
776
|
+
{option}
|
|
777
|
+
</option>
|
|
778
|
+
))}
|
|
779
|
+
</NativeSelect>
|
|
780
|
+
</FormControl>
|
|
781
|
+
<FormMessage />
|
|
782
|
+
<IsOverridden userConfig={config} name="display.locale" />
|
|
783
|
+
</FormItem>
|
|
784
|
+
|
|
785
|
+
<FormDescription>
|
|
786
|
+
The locale to use for the notebook. If your desired locale
|
|
787
|
+
is not listed, you can change it manually via{" "}
|
|
788
|
+
<Kbd className="inline">marimo config show</Kbd>.
|
|
789
|
+
</FormDescription>
|
|
790
|
+
</div>
|
|
791
|
+
)}
|
|
792
|
+
/>
|
|
749
793
|
<FormField
|
|
750
794
|
control={form.control}
|
|
751
795
|
name="display.reference_highlighting"
|
|
@@ -1283,6 +1327,38 @@ export const UserConfigForm: React.FC = () => {
|
|
|
1283
1327
|
</div>
|
|
1284
1328
|
)}
|
|
1285
1329
|
/>
|
|
1330
|
+
<FormField
|
|
1331
|
+
control={form.control}
|
|
1332
|
+
name="experimental.external_agents"
|
|
1333
|
+
render={({ field }) => (
|
|
1334
|
+
<div className="flex flex-col gap-y-1">
|
|
1335
|
+
<FormItem className={formItemClasses}>
|
|
1336
|
+
<FormLabel className="font-normal">
|
|
1337
|
+
External Agents
|
|
1338
|
+
</FormLabel>
|
|
1339
|
+
<FormControl>
|
|
1340
|
+
<Checkbox
|
|
1341
|
+
data-testid="external-agents-checkbox"
|
|
1342
|
+
checked={field.value === true}
|
|
1343
|
+
onCheckedChange={field.onChange}
|
|
1344
|
+
/>
|
|
1345
|
+
</FormControl>
|
|
1346
|
+
</FormItem>
|
|
1347
|
+
<IsOverridden
|
|
1348
|
+
userConfig={config}
|
|
1349
|
+
name="experimental.external_agents"
|
|
1350
|
+
/>
|
|
1351
|
+
<FormDescription>
|
|
1352
|
+
Enable experimental external agents such as Claude Code and
|
|
1353
|
+
Gemini CLI. Learn more in the{" "}
|
|
1354
|
+
<ExternalLink href="https://docs.marimo.io/guides/editor_features/agents/">
|
|
1355
|
+
docs
|
|
1356
|
+
</ExternalLink>
|
|
1357
|
+
.
|
|
1358
|
+
</FormDescription>
|
|
1359
|
+
</div>
|
|
1360
|
+
)}
|
|
1361
|
+
/>
|
|
1286
1362
|
</SettingGroup>
|
|
1287
1363
|
);
|
|
1288
1364
|
}
|
|
@@ -1333,8 +1409,9 @@ export const UserConfigForm: React.FC = () => {
|
|
|
1333
1409
|
</TabsTrigger>
|
|
1334
1410
|
))}
|
|
1335
1411
|
|
|
1336
|
-
<div className="p-2 text-xs text-muted-foreground self-start">
|
|
1412
|
+
<div className="p-2 text-xs text-muted-foreground self-start flex flex-col gap-1">
|
|
1337
1413
|
<span>Version: {marimoVersion}</span>
|
|
1414
|
+
<span>Locale: {locale}</span>
|
|
1338
1415
|
</div>
|
|
1339
1416
|
|
|
1340
1417
|
<div className="flex-1" />
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
exports[`getAgentPrompt > should generate complete agent prompt with default filename 1`] = `
|
|
4
4
|
"
|
|
5
5
|
I am currently editing a marimo notebook.
|
|
6
|
-
You can read or write to the notebook at
|
|
6
|
+
You can read or write to the notebook at test-notebook.py
|
|
7
7
|
|
|
8
8
|
If you make edits to the notebook, only edit the contents inside the function decorator with @app.cell.
|
|
9
9
|
marimo will automatically handle adding the parameters and return statement of the function. For example,
|
|
@@ -11,7 +11,7 @@ exports[`getAgentPrompt > should generate complete agent prompt with default fil
|
|
|
11
11
|
|
|
12
12
|
\`\`\`
|
|
13
13
|
@app.cell
|
|
14
|
-
def
|
|
14
|
+
def _():
|
|
15
15
|
<your code here>
|
|
16
16
|
return
|
|
17
17
|
\`\`\`
|
|
@@ -37,6 +37,7 @@ exports[`getAgentPrompt > should generate complete agent prompt with default fil
|
|
|
37
37
|
7. The last expression in a cell is automatically displayed, just like in Jupyter notebooks.
|
|
38
38
|
8. Don't include comments in markdown cells
|
|
39
39
|
9. Don't include comments in SQL cells
|
|
40
|
+
10. Never define anything using \`global\`.
|
|
40
41
|
|
|
41
42
|
## Reactivity
|
|
42
43
|
|
|
@@ -46,11 +47,12 @@ exports[`getAgentPrompt > should generate complete agent prompt with default fil
|
|
|
46
47
|
- UI elements trigger updates when their values change without explicit callbacks
|
|
47
48
|
- UI element values are accessed through \`.value\` attribute
|
|
48
49
|
- You cannot access a UI element's value in the same cell where it's defined
|
|
50
|
+
- Cells prefixed with an underscore (e.g. _my_var) are local to the cell and cannot be accessed by other cells
|
|
49
51
|
|
|
50
52
|
## Best Practices
|
|
51
53
|
|
|
52
54
|
<data_handling>
|
|
53
|
-
- Use
|
|
55
|
+
- Use polars for data manipulation
|
|
54
56
|
- Implement proper data validation
|
|
55
57
|
- Handle missing values appropriately
|
|
56
58
|
- Use efficient data structures
|
|
@@ -60,7 +62,7 @@ exports[`getAgentPrompt > should generate complete agent prompt with default fil
|
|
|
60
62
|
<visualization>
|
|
61
63
|
- For matplotlib: use plt.gca() as the last expression instead of plt.show()
|
|
62
64
|
- For plotly: return the figure object directly
|
|
63
|
-
- For altair: return the chart object directly
|
|
65
|
+
- For altair: return the chart object directly. Add tooltips where appropriate. You can pass polars dataframes directly to altair.
|
|
64
66
|
- Include proper labels, titles, and color schemes
|
|
65
67
|
- Make visualizations interactive where appropriate
|
|
66
68
|
</visualization>
|
|
@@ -74,7 +76,7 @@ exports[`getAgentPrompt > should generate complete agent prompt with default fil
|
|
|
74
76
|
</ui_elements>
|
|
75
77
|
|
|
76
78
|
<sql>
|
|
77
|
-
- When writing duckdb, prefer using marimo's SQL cells, which start with
|
|
79
|
+
- When writing duckdb, prefer using marimo's SQL cells, which start with df = mo.sql(f"""<your query>""") for DuckDB, or df = mo.sql(f"""<your query>""", engine=engine) for other SQL engines.
|
|
78
80
|
- See the SQL with duckdb example for an example on how to do this
|
|
79
81
|
- Don't add comments in cells that use mo.sql()
|
|
80
82
|
- Consider using \`vega_datasets\` for common example datasets
|
|
@@ -115,40 +117,63 @@ exports[`getAgentPrompt > should generate complete agent prompt with default fil
|
|
|
115
117
|
|
|
116
118
|
- \`mo.md(text)\` - display markdown
|
|
117
119
|
- \`mo.stop(predicate, output=None)\` - stop execution conditionally
|
|
120
|
+
- \`mo.output.append(value)\` - append to the output when it is not the last expression
|
|
121
|
+
- \`mo.output.replace(value)\` - replace the output when it is not the last expression
|
|
118
122
|
- \`mo.Html(html)\` - display HTML
|
|
119
123
|
- \`mo.image(image)\` - display an image
|
|
120
124
|
- \`mo.hstack(elements)\` - stack elements horizontally
|
|
121
125
|
- \`mo.vstack(elements)\` - stack elements vertically
|
|
122
126
|
- \`mo.tabs(elements)\` - create a tabbed interface
|
|
123
127
|
|
|
128
|
+
|
|
129
|
+
|
|
124
130
|
## Examples
|
|
125
131
|
|
|
132
|
+
<example title="Markdown ccell">
|
|
133
|
+
|
|
134
|
+
@app.cell
|
|
135
|
+
def _():
|
|
136
|
+
mo.md("""
|
|
137
|
+
# Hello world
|
|
138
|
+
This is a _markdown_ **cell**.
|
|
139
|
+
""")
|
|
140
|
+
return
|
|
141
|
+
|
|
142
|
+
</example>
|
|
143
|
+
|
|
126
144
|
<example title="Basic UI with reactivity">
|
|
127
145
|
|
|
128
146
|
@app.cell
|
|
129
|
-
def
|
|
147
|
+
def _():
|
|
130
148
|
import marimo as mo
|
|
131
|
-
import
|
|
149
|
+
import altair as alt
|
|
150
|
+
import polars as pl
|
|
132
151
|
import numpy as np
|
|
133
152
|
return
|
|
134
153
|
|
|
135
154
|
@app.cell
|
|
136
|
-
def
|
|
155
|
+
def _():
|
|
137
156
|
n_points = mo.ui.slider(10, 100, value=50, label="Number of points")
|
|
138
157
|
n_points
|
|
139
158
|
return
|
|
140
159
|
|
|
141
160
|
@app.cell
|
|
142
|
-
def
|
|
161
|
+
def _():
|
|
143
162
|
x = np.random.rand(n_points.value)
|
|
144
163
|
y = np.random.rand(n_points.value)
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
164
|
+
|
|
165
|
+
df = pl.DataFrame({"x": x, "y": y})
|
|
166
|
+
|
|
167
|
+
chart = alt.Chart(df).mark_circle(opacity=0.7).encode(
|
|
168
|
+
x=alt.X('x', title='X axis'),
|
|
169
|
+
y=alt.Y('y', title='Y axis')
|
|
170
|
+
).properties(
|
|
171
|
+
title=f"Scatter plot with {n_points.value} points",
|
|
172
|
+
width=400,
|
|
173
|
+
height=300
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
chart
|
|
152
177
|
return
|
|
153
178
|
|
|
154
179
|
</example>
|
|
@@ -156,15 +181,15 @@ exports[`getAgentPrompt > should generate complete agent prompt with default fil
|
|
|
156
181
|
<example title="Data explorer">
|
|
157
182
|
|
|
158
183
|
@app.cell
|
|
159
|
-
def
|
|
184
|
+
def _():
|
|
160
185
|
import marimo as mo
|
|
161
|
-
import
|
|
186
|
+
import polars as pl
|
|
162
187
|
from vega_datasets import data
|
|
163
188
|
return
|
|
164
189
|
|
|
165
190
|
@app.cell
|
|
166
|
-
def
|
|
167
|
-
cars_df = data.cars()
|
|
191
|
+
def _():
|
|
192
|
+
cars_df = pl.DataFrame(data.cars())
|
|
168
193
|
mo.ui.data_explorer(cars_df)
|
|
169
194
|
return
|
|
170
195
|
|
|
@@ -173,51 +198,66 @@ exports[`getAgentPrompt > should generate complete agent prompt with default fil
|
|
|
173
198
|
<example title="Multiple UI elements">
|
|
174
199
|
|
|
175
200
|
@app.cell
|
|
176
|
-
def
|
|
201
|
+
def _():
|
|
177
202
|
import marimo as mo
|
|
178
|
-
import
|
|
179
|
-
import
|
|
180
|
-
import seaborn as sns
|
|
203
|
+
import polars as pl
|
|
204
|
+
import altair as alt
|
|
181
205
|
return
|
|
182
206
|
|
|
183
207
|
@app.cell
|
|
184
|
-
def
|
|
185
|
-
iris =
|
|
208
|
+
def _():
|
|
209
|
+
iris = pl.read_csv("hf://datasets/scikit-learn/iris/Iris.csv")
|
|
186
210
|
return
|
|
187
211
|
|
|
188
212
|
@app.cell
|
|
189
|
-
def
|
|
213
|
+
def _():
|
|
190
214
|
species_selector = mo.ui.dropdown(
|
|
191
|
-
options=["All"] + iris["
|
|
215
|
+
options=["All"] + iris["Species"].unique().to_list(),
|
|
192
216
|
value="All",
|
|
193
|
-
label="Species"
|
|
217
|
+
label="Species",
|
|
194
218
|
)
|
|
195
219
|
x_feature = mo.ui.dropdown(
|
|
196
|
-
options=iris.
|
|
197
|
-
value="
|
|
198
|
-
label="X Feature"
|
|
220
|
+
options=iris.select(pl.col(pl.Float64, pl.Int64)).columns,
|
|
221
|
+
value="SepalLengthCm",
|
|
222
|
+
label="X Feature",
|
|
199
223
|
)
|
|
200
224
|
y_feature = mo.ui.dropdown(
|
|
201
|
-
options=iris.
|
|
202
|
-
value="
|
|
203
|
-
label="Y Feature"
|
|
225
|
+
options=iris.select(pl.col(pl.Float64, pl.Int64)).columns,
|
|
226
|
+
value="SepalWidthCm",
|
|
227
|
+
label="Y Feature",
|
|
204
228
|
)
|
|
205
229
|
mo.hstack([species_selector, x_feature, y_feature])
|
|
206
230
|
return
|
|
207
231
|
|
|
208
232
|
@app.cell
|
|
209
|
-
def
|
|
210
|
-
filtered_data = iris if species_selector.value == "All" else iris
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
233
|
+
def _():
|
|
234
|
+
filtered_data = iris if species_selector.value == "All" else iris.filter(pl.col("Species") == species_selector.value)
|
|
235
|
+
|
|
236
|
+
chart = alt.Chart(filtered_data).mark_circle().encode(
|
|
237
|
+
x=alt.X(x_feature.value, title=x_feature.value),
|
|
238
|
+
y=alt.Y(y_feature.value, title=y_feature.value),
|
|
239
|
+
color='Species'
|
|
240
|
+
).properties(
|
|
241
|
+
title=f"{y_feature.value} vs {x_feature.value}",
|
|
242
|
+
width=500,
|
|
243
|
+
height=400
|
|
218
244
|
)
|
|
219
|
-
|
|
220
|
-
|
|
245
|
+
|
|
246
|
+
chart
|
|
247
|
+
return
|
|
248
|
+
|
|
249
|
+
</example>
|
|
250
|
+
|
|
251
|
+
<example title="Conditional Outputs">
|
|
252
|
+
|
|
253
|
+
@app.cell
|
|
254
|
+
def _():
|
|
255
|
+
mo.stop(not data.value, mo.md("No data to display"))
|
|
256
|
+
|
|
257
|
+
if mode.value == "scatter":
|
|
258
|
+
mo.output.replace(render_scatter(data.value))
|
|
259
|
+
else:
|
|
260
|
+
mo.output.replace(render_bar_chart(data.value))
|
|
221
261
|
return
|
|
222
262
|
|
|
223
263
|
</example>
|
|
@@ -225,31 +265,38 @@ exports[`getAgentPrompt > should generate complete agent prompt with default fil
|
|
|
225
265
|
<example title="Interactive chart with Altair">
|
|
226
266
|
|
|
227
267
|
@app.cell
|
|
228
|
-
def
|
|
268
|
+
def _():
|
|
229
269
|
import marimo as mo
|
|
230
270
|
import altair as alt
|
|
231
|
-
import
|
|
271
|
+
import polars as pl
|
|
232
272
|
return
|
|
233
273
|
|
|
234
274
|
@app.cell
|
|
235
|
-
def
|
|
275
|
+
def _():
|
|
236
276
|
# Load dataset
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
277
|
+
weather = pl.read_csv("https://raw.githubusercontent.com/vega/vega-datasets/refs/heads/main/data/weather.csv")
|
|
278
|
+
weather_dates = weather.with_columns(
|
|
279
|
+
pl.col("date").str.strptime(pl.Date, format="%Y-%m-%d")
|
|
280
|
+
)
|
|
281
|
+
_chart = (
|
|
282
|
+
alt.Chart(weather_dates)
|
|
283
|
+
.mark_point()
|
|
284
|
+
.encode(
|
|
285
|
+
x="date:T",
|
|
286
|
+
y="temp_max",
|
|
287
|
+
color="location",
|
|
288
|
+
)
|
|
242
289
|
)
|
|
243
290
|
return
|
|
244
291
|
|
|
245
292
|
@app.cell
|
|
246
|
-
def
|
|
293
|
+
def _():
|
|
247
294
|
chart = mo.ui.altair_chart(_chart)
|
|
248
295
|
chart
|
|
249
296
|
return
|
|
250
297
|
|
|
251
298
|
@app.cell
|
|
252
|
-
def
|
|
299
|
+
def _():
|
|
253
300
|
# Display the selection
|
|
254
301
|
chart.value
|
|
255
302
|
return
|
|
@@ -259,19 +306,19 @@ exports[`getAgentPrompt > should generate complete agent prompt with default fil
|
|
|
259
306
|
<example title="Run Button Example">
|
|
260
307
|
|
|
261
308
|
@app.cell
|
|
262
|
-
def
|
|
309
|
+
def _():
|
|
263
310
|
import marimo as mo
|
|
264
311
|
return
|
|
265
312
|
|
|
266
313
|
@app.cell
|
|
267
|
-
def
|
|
314
|
+
def _():
|
|
268
315
|
first_button = mo.ui.run_button(label="Option 1")
|
|
269
316
|
second_button = mo.ui.run_button(label="Option 2")
|
|
270
317
|
[first_button, second_button]
|
|
271
318
|
return
|
|
272
319
|
|
|
273
320
|
@app.cell
|
|
274
|
-
def
|
|
321
|
+
def _():
|
|
275
322
|
if first_button.value:
|
|
276
323
|
print("You chose option 1!")
|
|
277
324
|
elif second_button.value:
|
|
@@ -285,19 +332,23 @@ exports[`getAgentPrompt > should generate complete agent prompt with default fil
|
|
|
285
332
|
<example title="SQL with duckdb">
|
|
286
333
|
|
|
287
334
|
@app.cell
|
|
288
|
-
def
|
|
335
|
+
def _():
|
|
289
336
|
import marimo as mo
|
|
290
|
-
|
|
337
|
+
import polars as pl
|
|
291
338
|
return
|
|
292
339
|
|
|
293
340
|
@app.cell
|
|
294
|
-
def
|
|
295
|
-
|
|
341
|
+
def _():
|
|
342
|
+
weather = pl.read_csv('https://raw.githubusercontent.com/vega/vega-datasets/refs/heads/main/data/weather.csv')
|
|
296
343
|
return
|
|
297
344
|
|
|
298
345
|
@app.cell
|
|
299
|
-
def
|
|
300
|
-
|
|
346
|
+
def _():
|
|
347
|
+
seattle_weather_df = mo.sql(
|
|
348
|
+
f"""
|
|
349
|
+
SELECT * FROM weather WHERE location = 'Seattle';
|
|
350
|
+
"""
|
|
351
|
+
)
|
|
301
352
|
return
|
|
302
353
|
|
|
303
354
|
</example>"
|