@marimo-team/frontend 0.22.1-dev34 → 0.22.1-dev39

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 (239) hide show
  1. package/dist/assets/{CellStatus-DKyVv7Zj.js → CellStatus-Cf0Jlrcs.js} +1 -1
  2. package/dist/assets/{ConnectedDataExplorerComponent-BUc9LHJJ.js → ConnectedDataExplorerComponent-DUxaLoL7.js} +1 -1
  3. package/dist/assets/{JsonOutput-D1i8P1dG.js → JsonOutput-IpD2GLtO.js} +2 -2
  4. package/dist/assets/{MarimoErrorOutput-RmM7djc-.js → MarimoErrorOutput-dTNCLY-Q.js} +1 -1
  5. package/dist/assets/{Plot-C7NE7pEx.js → Plot-BAM1jEAz.js} +72 -72
  6. package/dist/assets/{RenderHTML-Bmn77an6.js → RenderHTML-C5GEp4ca.js} +1 -1
  7. package/dist/assets/{add-cell-with-ai-RyZ9Xe2b.js → add-cell-with-ai-C0J3LyiV.js} +1 -1
  8. package/dist/assets/{add-connection-dialog-ogwy8tvS.js → add-connection-dialog-C42PDYI7.js} +1 -1
  9. package/dist/assets/{agent-panel-BHLkHj7k.js → agent-panel-CH-jHjEl.js} +1 -1
  10. package/dist/assets/{ai-model-dropdown-Dnf-CxbP.js → ai-model-dropdown-D14GiszF.js} +1 -1
  11. package/dist/assets/{app-config-button-D1Z_xsvC.js → app-config-button-v-557oRb.js} +1 -1
  12. package/dist/assets/{cell-editor-_GDTh-4a.js → cell-editor-Dd6UaL1A.js} +2 -2
  13. package/dist/assets/{cell-link-D4UrIH9w.js → cell-link-Cimoe3Fv.js} +1 -1
  14. package/dist/assets/{cells-ArUhhHls.js → cells-CcsG9Aum.js} +1 -1
  15. package/dist/assets/{chat-display-YmFjOXkV.js → chat-display-hfpeXiYe.js} +1 -1
  16. package/dist/assets/{chat-panel-B76rxYTh.js → chat-panel-DxT370nA.js} +1 -1
  17. package/dist/assets/{chat-ui-BitNq1z6.js → chat-ui-Dv4y0-td.js} +1 -1
  18. package/dist/assets/{column-preview-NDhbeu0E.js → column-preview-ZSErTRFA.js} +1 -1
  19. package/dist/assets/{command-palette-uJxkhle4.js → command-palette-CjF_cblG.js} +1 -1
  20. package/dist/assets/{common-CRBlPqv5.js → common-BZK7spst.js} +1 -1
  21. package/dist/assets/{components-DwGcJvMB.js → components-D2OlyENc.js} +1 -1
  22. package/dist/assets/{components-BfHGr__b.js → components-DpxyscxU.js} +1 -1
  23. package/dist/assets/{datasource-D9e37ifa.js → datasource-D9nfSxKS.js} +1 -1
  24. package/dist/assets/{dependency-graph-panel-BBmN-Vc7.js → dependency-graph-panel-5MbMtFss.js} +1 -1
  25. package/dist/assets/{documentation-panel-Dm2xtsTq.js → documentation-panel-DPdXS3YO.js} +1 -1
  26. package/dist/assets/{download-7EtMZf2Y.js → download-BFQaUFKI.js} +1 -1
  27. package/dist/assets/{edit-page-Cr_DnrkM.js → edit-page-CMd8_Psc.js} +4 -4
  28. package/dist/assets/{error-panel-C3-vTzaH.js → error-panel-DV8jpRsf.js} +1 -1
  29. package/dist/assets/{file-explorer-panel-g9KppC7Y.js → file-explorer-panel-Dr_ZNDk3.js} +1 -1
  30. package/dist/assets/{file-icons-JXAG6vK-.js → file-icons-DSJsG_mI.js} +1 -1
  31. package/dist/assets/{floating-outline-B6Qyid7Q.js → floating-outline-Cfa1ESSb.js} +1 -1
  32. package/dist/assets/{focus-DCN0oEe0.js → focus-C5u0JQUq.js} +1 -1
  33. package/dist/assets/{form-BVnQnVQ2.js → form-3ZUGKch9.js} +1 -1
  34. package/dist/assets/glide-data-editor-a3qLDl-r.js +132 -0
  35. package/dist/assets/{home-page-Bg02jazh.js → home-page-BrqppCUS.js} +1 -1
  36. package/dist/assets/{hooks-zQJ9iU_R.js → hooks-CHE17GG1.js} +1 -1
  37. package/dist/assets/{html-to-image-C5XSE7QT.js → html-to-image-BRbQwG7G.js} +1 -1
  38. package/dist/assets/{index-BaQAJwyb.css → index-BkdonYlq.css} +1 -1
  39. package/dist/assets/index-Bt8G6SSE.js +42 -0
  40. package/dist/assets/{kiosk-mode-CriCUOI1.js → kiosk-mode-Cu86-jaD.js} +1 -1
  41. package/dist/assets/{layout-Cudicm29.js → layout-B-lTkLKA.js} +1 -1
  42. package/dist/assets/{logs-panel-CoWO9c8s.js → logs-panel-CNVgwoHO.js} +1 -1
  43. package/dist/assets/{markdown-renderer-CyUc0f8D.js → markdown-renderer-B91NzmVT.js} +1 -1
  44. package/dist/assets/{name-cell-input-DeM6upjB.js → name-cell-input-hsV_b1Op.js} +1 -1
  45. package/dist/assets/{outline-panel-C4P3wA7Z.js → outline-panel-C3jvSnZF.js} +1 -1
  46. package/dist/assets/{packages-panel-DnrjjQDF.js → packages-panel-0_Z5vM7i.js} +1 -1
  47. package/dist/assets/{panels-BCRqI88j.js → panels-uc8QhzpO.js} +1 -1
  48. package/dist/assets/{process-output-e_aMblRk.js → process-output-CsvKn_Mr.js} +1 -1
  49. package/dist/assets/{readonly-python-code-CVgh88Tn.js → readonly-python-code-oFCRG7Wt.js} +1 -1
  50. package/dist/assets/{run-page-C-ySBXLo.js → run-page-DKCqiq_f.js} +1 -1
  51. package/dist/assets/{scratchpad-panel-C5Pogi1P.js → scratchpad-panel-ChHLgDv_.js} +1 -1
  52. package/dist/assets/{session-panel-DEsnZWks.js → session-panel-CPKKt31q.js} +1 -1
  53. package/dist/assets/{snippets-panel-DQgE3W8I.js → snippets-panel-CDqEDwpY.js} +1 -1
  54. package/dist/assets/{spec-CBbUxOvL.js → spec-CFx2bitO.js} +1 -1
  55. package/dist/assets/{state-pGNeffyB.js → state-BBVlYaRC.js} +1 -1
  56. package/dist/assets/{state-CV8Wy3e4.js → state-C93JW11U.js} +1 -1
  57. package/dist/assets/{textarea-DqzNK0s9.js → textarea-DJEKmYtw.js} +1 -1
  58. package/dist/assets/{tracing-BUFVOmZw.js → tracing-CLWi5jD3.js} +1 -1
  59. package/dist/assets/{tracing-panel-BsLloPWd.js → tracing-panel-ksnvVrMH.js} +2 -2
  60. package/dist/assets/{useAddCell-cC7JUC0q.js → useAddCell-mJ1PkF-E.js} +1 -1
  61. package/dist/assets/{useCellActionButton-BiYBXHfb.js → useCellActionButton-4HWj1rt3.js} +1 -1
  62. package/dist/assets/{useDeleteCell-D2p4Dz0U.js → useDeleteCell-B0OAS0ly.js} +1 -1
  63. package/dist/assets/{useDependencyPanelTab-c5-eXlcr.js → useDependencyPanelTab-BuZ0fgAR.js} +1 -1
  64. package/dist/assets/useLifecycle-N3bfh_O1.js +1 -0
  65. package/dist/assets/useNotebookActions-DuHUqtII.js +1 -0
  66. package/dist/assets/{useRunCells-DgBY-vh9.js → useRunCells-Du76UV1R.js} +1 -1
  67. package/dist/assets/{useSplitCell-SS0kKwVk.js → useSplitCell-CeL7eJq1.js} +1 -1
  68. package/dist/index.html +25 -25
  69. package/package.json +1 -1
  70. package/src/__mocks__/common.ts +4 -4
  71. package/src/components/chat/acp/agent-panel.tsx +2 -2
  72. package/src/components/data-table/__tests__/columns.test.tsx +7 -7
  73. package/src/components/data-table/cell-hover-template/types.ts +1 -1
  74. package/src/components/data-table/cell-hover-text/types.ts +1 -1
  75. package/src/components/data-table/cell-selection/__tests__/feature.test.ts +1 -1
  76. package/src/components/data-table/cell-selection/types.ts +1 -1
  77. package/src/components/data-table/cell-styling/types.ts +1 -1
  78. package/src/components/data-table/charts/chart-spec/altair-generator.ts +2 -2
  79. package/src/components/data-table/column-formatting/types.ts +2 -2
  80. package/src/components/data-table/column-summary/legacy-chart-spec.ts +1 -1
  81. package/src/components/data-table/column-wrapping/types.ts +1 -1
  82. package/src/components/data-table/copy-column/types.ts +1 -1
  83. package/src/components/data-table/data-table.tsx +12 -12
  84. package/src/components/data-table/focus-row/types.ts +1 -1
  85. package/src/components/data-table/loading-table.tsx +1 -1
  86. package/src/components/data-table/range-focus/__tests__/atoms.test.ts +2 -2
  87. package/src/components/data-table/range-focus/atoms.ts +2 -2
  88. package/src/components/dependency-graph/dependency-graph-tree.tsx +1 -1
  89. package/src/components/editor/__tests__/dynamic-favicon.test.tsx +1 -1
  90. package/src/components/editor/actions/pair-with-agent-modal.tsx +142 -0
  91. package/src/components/editor/actions/useNotebookActions.tsx +10 -0
  92. package/src/components/editor/ai/ai-completion-editor.tsx +1 -1
  93. package/src/components/editor/app-container.tsx +1 -1
  94. package/src/components/editor/chrome/panels/empty-state.tsx +1 -0
  95. package/src/components/editor/controls/keyboard-shortcuts.tsx +1 -1
  96. package/src/components/editor/navigation/__tests__/navigation.test.ts +1 -1
  97. package/src/components/editor/navigation/navigation.ts +1 -1
  98. package/src/components/editor/notebook-cell.tsx +1 -1
  99. package/src/components/editor/output/JsonOutput.tsx +4 -4
  100. package/src/components/editor/output/ansi-reduce.ts +2 -2
  101. package/src/components/editor/output/console/ConsoleOutput.tsx +1 -1
  102. package/src/components/editor/renderers/cells-renderer.tsx +1 -1
  103. package/src/components/editor/renderers/grid-layout/grid-layout.tsx +1 -1
  104. package/src/components/editor/renderers/plugins.ts +1 -1
  105. package/src/components/editor/renderers/slides-layout/types.ts +2 -2
  106. package/src/components/editor/renderers/vertical-layout/__tests__/useFocusFirstEditor.test.ts +2 -2
  107. package/src/components/editor/renderers/vertical-layout/__tests__/vertical-layout.test.ts +1 -1
  108. package/src/components/find-replace/find-replace.tsx +3 -1
  109. package/src/components/forms/form.tsx +1 -1
  110. package/src/components/forms/options.ts +1 -1
  111. package/src/components/static-html/static-banner.tsx +2 -2
  112. package/src/components/terminal/terminal.tsx +4 -4
  113. package/src/components/ui/button.tsx +1 -1
  114. package/src/components/ui/command.tsx +1 -1
  115. package/src/core/ai/context/providers/__tests__/datasource.test.ts +1 -1
  116. package/src/core/ai/context/providers/__tests__/error.test.ts +1 -1
  117. package/src/core/ai/context/providers/__tests__/variable.test.ts +1 -1
  118. package/src/core/ai/context/registry.ts +2 -2
  119. package/src/core/ai/tools/registry.ts +1 -1
  120. package/src/core/cells/__tests__/cells.test.ts +2 -2
  121. package/src/core/cells/__tests__/scrollCellIntoView.test.ts +1 -1
  122. package/src/core/cells/__tests__/session.test.ts +1 -1
  123. package/src/core/cells/__tests__/utils.test.ts +1 -1
  124. package/src/core/cells/cells.ts +1 -1
  125. package/src/core/cells/ids.ts +1 -1
  126. package/src/core/codemirror/ai/request.ts +1 -1
  127. package/src/core/codemirror/copilot/__tests__/language-server.test.ts +1 -1
  128. package/src/core/codemirror/copilot/__tests__/transport.test.ts +1 -1
  129. package/src/core/codemirror/copilot/language-server.ts +1 -1
  130. package/src/core/codemirror/copilot/types.ts +1 -1
  131. package/src/core/codemirror/facet.ts +1 -1
  132. package/src/core/codemirror/language/__tests__/sql.test.ts +4 -4
  133. package/src/core/codemirror/language/languages/sql/completion-builder.ts +1 -1
  134. package/src/core/codemirror/language/metadata.ts +1 -1
  135. package/src/core/codemirror/language/types.ts +1 -1
  136. package/src/core/codemirror/lsp/__tests__/notebook-lsp.test.ts +1 -1
  137. package/src/core/codemirror/lsp/notebook-lsp.ts +1 -1
  138. package/src/core/codemirror/misc/__tests__/dnd.test.ts +1 -1
  139. package/src/core/codemirror/rtc/loro/awareness.ts +1 -1
  140. package/src/core/config/feature-flag.tsx +1 -1
  141. package/src/core/dom/outline.ts +1 -1
  142. package/src/core/export/__tests__/hooks.test.ts +1 -1
  143. package/src/core/hotkeys/__tests__/hotkeys.test.ts +1 -1
  144. package/src/core/hotkeys/shortcuts.ts +1 -1
  145. package/src/core/islands/__tests__/bridge.test.ts +2 -2
  146. package/src/core/islands/bridge.ts +2 -2
  147. package/src/core/islands/components/output-wrapper.tsx +1 -1
  148. package/src/core/islands/parse.ts +1 -1
  149. package/src/core/lsp/__tests__/transport.test.ts +1 -1
  150. package/src/core/network/DeferredRequestRegistry.ts +1 -1
  151. package/src/core/network/__tests__/requests-network.test.ts +1 -1
  152. package/src/core/network/api.ts +2 -2
  153. package/src/core/network/requests-lazy.ts +1 -1
  154. package/src/core/network/requests-toasting.tsx +1 -1
  155. package/src/core/static/files.ts +1 -1
  156. package/src/core/vscode/vscode-bindings.ts +1 -1
  157. package/src/core/wasm/bridge.ts +3 -3
  158. package/src/core/wasm/worker/tracer.ts +1 -1
  159. package/src/core/websocket/useWebSocket.tsx +2 -2
  160. package/src/css/globals.css +37 -61
  161. package/src/custom.d.ts +1 -1
  162. package/src/hooks/__tests__/useDuplicateShortcuts.test.ts +2 -2
  163. package/src/hooks/debug.ts +3 -3
  164. package/src/hooks/useDebounce.ts +1 -1
  165. package/src/hooks/useEventListener.ts +1 -1
  166. package/src/hooks/useHotkey.ts +1 -1
  167. package/src/hooks/useLifecycle.ts +2 -2
  168. package/src/hooks/useNonce.ts +1 -1
  169. package/src/hooks/useResizeObserver.ts +2 -2
  170. package/src/main.tsx +1 -1
  171. package/src/plugins/core/RenderHTML.tsx +3 -3
  172. package/src/plugins/core/__test__/registerReactComponent.test.ts +1 -1
  173. package/src/plugins/core/registerReactComponent.tsx +4 -4
  174. package/src/plugins/core/rpc.ts +1 -1
  175. package/src/plugins/impl/DataTablePlugin.tsx +1 -1
  176. package/src/plugins/impl/FileBrowserPlugin.tsx +1 -1
  177. package/src/plugins/impl/FormPlugin.tsx +1 -1
  178. package/src/plugins/impl/__tests__/MatrixPlugin.test.tsx +1 -1
  179. package/src/plugins/impl/anywidget/AnyWidgetPlugin.tsx +1 -1
  180. package/src/plugins/impl/anywidget/model.ts +1 -1
  181. package/src/plugins/impl/anywidget/types.ts +2 -2
  182. package/src/plugins/impl/anywidget/widget-binding.ts +1 -1
  183. package/src/plugins/impl/chat/ChatPlugin.tsx +1 -1
  184. package/src/plugins/impl/chat/chat-ui.tsx +1 -1
  185. package/src/plugins/impl/data-editor/glide-data-editor.tsx +1 -1
  186. package/src/plugins/impl/data-explorer/ConnectedDataExplorerComponent.tsx +2 -2
  187. package/src/plugins/impl/data-explorer/components/query-form.tsx +1 -1
  188. package/src/plugins/impl/data-explorer/functions/function.ts +1 -1
  189. package/src/plugins/impl/data-explorer/queries/types.ts +1 -1
  190. package/src/plugins/impl/data-frames/DataFramePlugin.tsx +1 -1
  191. package/src/plugins/impl/data-frames/forms/renderers.tsx +1 -1
  192. package/src/plugins/impl/data-frames/utils/operators.ts +1 -1
  193. package/src/plugins/impl/matplotlib/MatplotlibPlugin.tsx +1 -1
  194. package/src/plugins/impl/mpl-interactive/MplInteractivePlugin.tsx +1 -1
  195. package/src/plugins/impl/panel/PanelPlugin.tsx +2 -2
  196. package/src/plugins/impl/plotly/Plot.tsx +3 -3
  197. package/src/plugins/impl/plotly/PlotlyPlugin.tsx +62 -44
  198. package/src/plugins/impl/plotly/__tests__/PlotlyPlugin.test.tsx +114 -0
  199. package/src/plugins/impl/plotly/__tests__/selection.test.ts +158 -196
  200. package/src/plugins/impl/plotly/selection.ts +274 -56
  201. package/src/plugins/impl/vega/batched.ts +1 -1
  202. package/src/plugins/impl/vega/make-selectable.ts +1 -1
  203. package/src/plugins/impl/vega/types.ts +1 -1
  204. package/src/plugins/layout/DownloadPlugin.tsx +1 -1
  205. package/src/plugins/layout/LazyPlugin.tsx +1 -1
  206. package/src/plugins/layout/RoutesPlugin.tsx +1 -1
  207. package/src/plugins/layout/mermaid/mermaid.tsx +1 -1
  208. package/src/plugins/plugins.ts +1 -1
  209. package/src/stories/data-explorer.stories.tsx +1 -1
  210. package/src/stories/dataframe.stories.tsx +1 -1
  211. package/src/stories/editor.stories.tsx +1 -1
  212. package/src/stories/select.stories.tsx +1 -1
  213. package/src/stories/switchable-multi-select.stories.tsx +1 -1
  214. package/src/utils/Logger.ts +1 -1
  215. package/src/utils/__tests__/arrays.test.ts +1 -1
  216. package/src/utils/__tests__/blob.test.ts +1 -1
  217. package/src/utils/__tests__/dates.test.ts +1 -1
  218. package/src/utils/__tests__/errors.test.ts +1 -1
  219. package/src/utils/__tests__/objects.test.ts +3 -3
  220. package/src/utils/__tests__/waitForWs.test.ts +1 -1
  221. package/src/utils/arrays.ts +1 -1
  222. package/src/utils/assertNever.ts +1 -1
  223. package/src/utils/batch-requests.ts +2 -2
  224. package/src/utils/createReducer.ts +2 -2
  225. package/src/utils/id-tree.tsx +2 -2
  226. package/src/utils/idle.ts +1 -1
  227. package/src/utils/invariant.ts +1 -2
  228. package/src/utils/maps.ts +1 -1
  229. package/src/utils/math.ts +0 -1
  230. package/src/utils/multi-map.ts +1 -1
  231. package/src/utils/objects.ts +1 -1
  232. package/src/utils/once.ts +2 -2
  233. package/src/utils/staticImplements.ts +1 -1
  234. package/src/utils/storage/jotai.ts +1 -1
  235. package/src/utils/tracer.ts +2 -2
  236. package/dist/assets/glide-data-editor-CDqunAkw.js +0 -132
  237. package/dist/assets/index-KI45dku7.js +0 -35
  238. package/dist/assets/useLifecycle-D202VvPd.js +0 -1
  239. package/dist/assets/useNotebookActions-Bb4xxjuJ.js +0 -1
@@ -0,0 +1,142 @@
1
+ /* Copyright 2026 Marimo. All rights reserved. */
2
+
3
+ import { useAtomValue } from "jotai";
4
+ import { CheckIcon, CopyIcon } from "lucide-react";
5
+ import React, { useState } from "react";
6
+ import { Button } from "@/components/ui/button";
7
+ import {
8
+ DialogContent,
9
+ DialogDescription,
10
+ DialogFooter,
11
+ DialogHeader,
12
+ DialogTitle,
13
+ } from "@/components/ui/dialog";
14
+ import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
15
+ import { runtimeConfigAtom } from "@/core/runtime/config";
16
+ import { copyToClipboard } from "@/utils/copy";
17
+ import { Events } from "@/utils/events";
18
+ import { Tooltip } from "@/components/ui/tooltip";
19
+ import type { RuntimeConfig } from "@/core/runtime/types";
20
+
21
+ type AgentTab = "claude" | "codex" | "opencode";
22
+
23
+ function buildRemoteUrl(config: RuntimeConfig) {
24
+ const url = new URL(config.url);
25
+ if (config.authToken) {
26
+ url.searchParams.set("auth", config.authToken);
27
+ }
28
+ return url.toString();
29
+ }
30
+
31
+ function getPromptCommand(agent: AgentTab, remoteUrl: string): string {
32
+ const command = import.meta.env.DEV ? "uv run marimo" : "uvx marimo@latest";
33
+ const base = `${command} pair prompt --url '${remoteUrl}'`;
34
+ switch (agent) {
35
+ case "claude":
36
+ return `claude "$(${base} --claude)"`;
37
+ case "codex":
38
+ return `codex "$(${base} --codex)"`;
39
+ case "opencode":
40
+ return `opencode "$(${base} --opencode)"`;
41
+ }
42
+ }
43
+
44
+ const SKILL_INSTALL = "npx skills add marimo-team/marimo-pair";
45
+
46
+ export const PairWithAgentModal: React.FC<{
47
+ onClose: () => void;
48
+ }> = ({ onClose }) => {
49
+ const [activeTab, setActiveTab] = useState<AgentTab>("claude");
50
+ const runtimeConfig = useAtomValue(runtimeConfigAtom);
51
+ const remoteUrl = buildRemoteUrl(runtimeConfig);
52
+ const promptCommand = getPromptCommand(activeTab, remoteUrl);
53
+
54
+ return (
55
+ <DialogContent className="sm:max-w-lg">
56
+ <DialogHeader>
57
+ <DialogTitle>Pair with an agent</DialogTitle>
58
+ <DialogDescription>
59
+ Use an AI coding agent to pair-program on this notebook.{" "}
60
+ <a
61
+ href="https://links.marimo.app/marimo-pair"
62
+ target="_blank"
63
+ rel="noopener noreferrer"
64
+ className="underline"
65
+ >
66
+ Learn more
67
+ </a>
68
+ .
69
+ </DialogDescription>
70
+ </DialogHeader>
71
+
72
+ <div className="flex flex-col gap-4 py-2">
73
+ <div className="flex flex-col gap-2">
74
+ <span className="text-sm font-medium">1. Install the skill</span>
75
+ <CommandBlock command={SKILL_INSTALL} />
76
+ </div>
77
+
78
+ <div className="flex flex-col gap-2">
79
+ <span className="text-sm font-medium">2. Run in your terminal</span>
80
+ <Tabs
81
+ value={activeTab}
82
+ onValueChange={(v) => setActiveTab(v as AgentTab)}
83
+ >
84
+ <TabsList className="w-full">
85
+ <TabsTrigger value="claude" className="flex-1">
86
+ Claude
87
+ </TabsTrigger>
88
+ <TabsTrigger value="codex" className="flex-1">
89
+ Codex
90
+ </TabsTrigger>
91
+ <TabsTrigger value="opencode" className="flex-1">
92
+ OpenCode
93
+ </TabsTrigger>
94
+ </TabsList>
95
+
96
+ <TabsContent value="claude" className="mt-3">
97
+ <CommandBlock command={promptCommand} />
98
+ </TabsContent>
99
+ <TabsContent value="codex" className="mt-3">
100
+ <CommandBlock command={promptCommand} />
101
+ </TabsContent>
102
+ <TabsContent value="opencode" className="mt-3">
103
+ <CommandBlock command={promptCommand} />
104
+ </TabsContent>
105
+ </Tabs>
106
+ </div>
107
+ </div>
108
+
109
+ <DialogFooter>
110
+ <Button variant="secondary" onClick={onClose}>
111
+ Close
112
+ </Button>
113
+ </DialogFooter>
114
+ </DialogContent>
115
+ );
116
+ };
117
+
118
+ const CommandBlock: React.FC<{ command: string }> = ({ command }) => {
119
+ const [copied, setCopied] = useState(false);
120
+
121
+ const copy = Events.stopPropagation(async (e) => {
122
+ e.preventDefault();
123
+ await copyToClipboard(command);
124
+ setCopied(true);
125
+ setTimeout(() => setCopied(false), 2000);
126
+ });
127
+
128
+ return (
129
+ <div className="flex items-center gap-2 rounded-md bg-muted px-3 py-2 font-mono text-xs">
130
+ <code className="flex-1 select-all break-words">{command}</code>
131
+ <Tooltip content="Copied!" open={copied}>
132
+ <Button onClick={copy} size="xs" variant="ghost">
133
+ {copied ? (
134
+ <CheckIcon size={14} strokeWidth={1.5} />
135
+ ) : (
136
+ <CopyIcon size={14} strokeWidth={1.5} />
137
+ )}
138
+ </Button>
139
+ </Tooltip>
140
+ </div>
141
+ );
142
+ };
@@ -36,6 +36,7 @@ import {
36
36
  PresentationIcon,
37
37
  SettingsIcon,
38
38
  Share2Icon,
39
+ SparklesIcon,
39
40
  Undo2Icon,
40
41
  XCircleIcon,
41
42
  YoutubeIcon,
@@ -45,6 +46,7 @@ import { settingDialogAtom } from "@/components/app-config/state";
45
46
  import { MarkdownIcon } from "@/components/editor/cell/code/icons";
46
47
  import { useImperativeModal } from "@/components/modal/ImperativeModal";
47
48
  import { renderShortcut } from "@/components/shortcuts/renderShortcut";
49
+ import { PairWithAgentModal } from "@/components/editor/actions/pair-with-agent-modal";
48
50
  import { ShareStaticNotebookModal } from "@/components/static-html/share-modal";
49
51
  import { toast } from "@/components/ui/use-toast";
50
52
  import {
@@ -343,6 +345,14 @@ export function useNotebookActions() {
343
345
  ],
344
346
  },
345
347
 
348
+ {
349
+ icon: <SparklesIcon size={14} strokeWidth={1.5} />,
350
+ label: "Pair with an agent",
351
+ handle: async () => {
352
+ openModal(<PairWithAgentModal onClose={closeModal} />);
353
+ },
354
+ },
355
+
346
356
  {
347
357
  icon: <Share2Icon size={14} strokeWidth={1.5} />,
348
358
  label: "Share",
@@ -156,7 +156,7 @@ export const AiCompletionEditor: React.FC<Props> = ({
156
156
  // Use complete to pass the prompt directly, else input might be empty
157
157
  complete(initialPrompt);
158
158
  }
159
- // eslint-disable-next-line react-hooks/exhaustive-deps
159
+ // oxlint-disable-next-line react-hooks/exhaustive-deps
160
160
  }, [triggerImmediately]);
161
161
 
162
162
  // Focus the input
@@ -31,7 +31,7 @@ export const AppContainer: React.FC<PropsWithChildren<Props>> = ({
31
31
  <StatusOverlay connection={connection} isRunning={isRunning} />
32
32
  <PyodideLoader>
33
33
  <WrappedWithSidebar>
34
- {/** biome-ignore lint/correctness/useUniqueElementIds: ID is used by other components to grab the DOM element */}
34
+ {/** oxlint-ignore-next-line -- ID is used by other components to grab the DOM element */}
35
35
  <div
36
36
  id="App"
37
37
  data-config-width={width}
@@ -18,6 +18,7 @@ export const PanelEmptyState = ({
18
18
  <div className="mx-6 my-6 flex flex-col gap-2">
19
19
  <div className="flex flex-row gap-2 items-center">
20
20
  {icon &&
21
+ // oxlint-disable-next-line react/no-clone-element
21
22
  React.cloneElement(icon, {
22
23
  className: "text-accent-foreground flex-shrink-0",
23
24
  })}
@@ -90,7 +90,7 @@ export const KeyboardShortcuts: React.FC = () => {
90
90
  },
91
91
  };
92
92
 
93
- // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
93
+ // oxlint-disable-next-line typescript/no-dynamic-delete
94
94
  delete newConfig.keymap.overrides[editingShortcut];
95
95
 
96
96
  setEditingShortcut(null);
@@ -134,7 +134,7 @@ const mockRequestClient = MockRequestClient.create();
134
134
  // Helper to setup selection
135
135
  const setupSelection = () => {
136
136
  const { reducer, cellSelectionAtom } = selectionTesting;
137
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
137
+ // oxlint-disable-next-line typescript/no-explicit-any
138
138
  const dispatch = (action: any) => {
139
139
  store.set(cellSelectionAtom, (prev: CellSelectionState) =>
140
140
  reducer(prev, action),
@@ -614,7 +614,7 @@ export function useCellNavigationProps(
614
614
  if (isShortcutPressed(shortcut as HotkeyAction, evt)) {
615
615
  // If the handler is a function, it's a single-cell handler
616
616
  // and we only operate on the currently focused cell.
617
- if (handler instanceof Function) {
617
+ if (typeof handler === "function") {
618
618
  const success = handler(cellId);
619
619
  if (success) {
620
620
  evt.preventDefault();
@@ -704,7 +704,7 @@ const EditableCellComponent = ({
704
704
  <a
705
705
  href="https://links.marimo.app/reusable-definitions"
706
706
  target="_blank"
707
- rel="noopener"
707
+ rel="noreferrer"
708
708
  >
709
709
  <SquareFunctionIcon
710
710
  size={16}
@@ -46,7 +46,7 @@ interface Props {
46
46
  valueTypes?: "json" | "python";
47
47
  }
48
48
 
49
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
49
+ // oxlint-disable-next-line typescript/no-explicit-any
50
50
  const CopyButton: React.FC<DataItemProps<any>> = ({ value }) => {
51
51
  const skipCopy =
52
52
  typeof value === "string" &&
@@ -83,13 +83,13 @@ const CopyButton: React.FC<DataItemProps<any>> = ({ value }) => {
83
83
  );
84
84
  };
85
85
 
86
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
86
+ // oxlint-disable-next-line typescript/no-explicit-any
87
87
  const JSONCopyButton: React.FC<DataItemProps<any>> = (props) => {
88
88
  // if
89
89
  return <CopyButton {...props} value={JSON.stringify(props.value, null, 2)} />;
90
90
  };
91
91
 
92
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
92
+ // oxlint-disable-next-line typescript/no-explicit-any
93
93
  const PyCopyButton: React.FC<DataItemProps<any>> = (props) => {
94
94
  return <CopyButton {...props} value={getCopyValue(props.value)} />;
95
95
  };
@@ -233,7 +233,7 @@ const LEAF_RENDERERS: Record<string, LeafRenderer> = {
233
233
  },
234
234
  };
235
235
 
236
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
236
+ // oxlint-disable-next-line typescript/no-explicit-any
237
237
  const MIME_TYPES: DataType<any>[] = Object.entries(LEAF_RENDERERS).map(
238
238
  ([leafType, render]) => ({
239
239
  is: (value) => typeof value === "string" && value.startsWith(leafType),
@@ -13,7 +13,7 @@ export interface Cursor {
13
13
  export class TerminalBuffer {
14
14
  private lines: string[] = [""];
15
15
  private cursor: Cursor = { row: 0, col: 0 };
16
- // biome-ignore lint/suspicious/noControlCharactersInRegex: Needed for ANSI parsing
16
+ // oxlint-ignore-next-line no-control-regex -- Needed for ANSI escape sequence parsing
17
17
  private static readonly ESCAPE_REGEX = /\u001B\[([0-9;]*)([A-DJKH])/u;
18
18
 
19
19
  /** Ensure the internal lines array is large enough. */
@@ -185,7 +185,7 @@ export class TerminalBuffer {
185
185
  */
186
186
  export class AnsiParser {
187
187
  // Matches both CSI sequences (ESC[...letter) and other escape sequences like character set selection (ESC(B)
188
- // biome-ignore lint/suspicious/noControlCharactersInRegex: Needed for ANSI parsing
188
+ // oxlint-ignore-next-line no-control-regex -- Needed for ANSI parsing
189
189
  private ESC_REGEX = /\u001B(?:\[[0-9;]*[A-Za-z]|\([0-9A-Za-z])/gu;
190
190
 
191
191
  parse(input: string): { type: "text" | "escape"; value: string }[] {
@@ -234,7 +234,7 @@ const ConsoleOutputInternal = (props: Props): React.ReactNode => {
234
234
  data-testid="console-output-area"
235
235
  ref={ref}
236
236
  {...selectAllProps}
237
- // biome-ignore lint/a11y/noNoninteractiveTabindex: Needed to capture keypress events
237
+ // oxlint-ignore-next-line jsx-a11y/no-noninteractive-tabindex -- Needed to capture keypress events
238
238
  tabIndex={0}
239
239
  className={cn(
240
240
  "console-output-area overflow-hidden rounded-b-lg flex flex-col-reverse w-full gap-1 focus:outline-hidden",
@@ -69,7 +69,7 @@ CellsRenderer.displayName = "CellsRenderer";
69
69
  interface PluginCellRendererProps extends PropsWithChildren<Props> {
70
70
  appConfig: AppConfig;
71
71
  mode: AppMode;
72
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
72
+ // oxlint-disable-next-line typescript/no-explicit-any
73
73
  plugin: ICellRendererPlugin<any, any>;
74
74
  layoutData: Partial<Record<LayoutType, LayoutData>>;
75
75
  finalLayout: LayoutType;
@@ -329,7 +329,7 @@ export const GridLayoutRenderer: React.FC<Props> = ({
329
329
  <div
330
330
  key={cell.id}
331
331
  draggable={true}
332
- // eslint-disable-next-line react/no-unknown-property
332
+ // oxlint-disable-next-line react/no-unknown-property
333
333
  unselectable="on"
334
334
  data-cell-id={cell.id}
335
335
  // Firefox requires some kind of initialization which we can do by adding this attribute
@@ -7,7 +7,7 @@ import type { ICellRendererPlugin, LayoutType } from "./types";
7
7
  import { VerticalLayoutPlugin } from "./vertical-layout/vertical-layout";
8
8
 
9
9
  // If more renderers are added, we may want to consider lazy loading them.
10
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
10
+ // oxlint-disable-next-line typescript/no-explicit-any
11
11
  export const cellRendererPlugins: ICellRendererPlugin<any, any>[] = [
12
12
  GridLayoutPlugin,
13
13
  SlidesLayoutPlugin,
@@ -1,11 +1,11 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-empty-interface */
2
+ /* oxlint-disable typescript/no-empty-object-type */
3
3
 
4
4
  /**
5
5
  * The serialized form of a slides layout.
6
6
  * This must be backwards-compatible as it is stored on the user's disk.
7
7
  */
8
- // eslint-disable-next-line @typescript-eslint/consistent-type-definitions
8
+ // oxlint-disable-next-line typescript/consistent-type-definitions
9
9
  export type SerializedSlidesLayout = {};
10
10
 
11
11
  export interface SlidesLayout extends SerializedSlidesLayout {
@@ -110,9 +110,9 @@ describe("useFocusFirstEditor", () => {
110
110
  expect(querySelectorSpy).toHaveBeenCalledWith(
111
111
  '[data-cell-name="testCell"]',
112
112
  );
113
- // eslint-disable-next-line @typescript-eslint/unbound-method
113
+ // oxlint-disable-next-line typescript/unbound-method
114
114
  expect(mockElement.scrollIntoView).toHaveBeenCalled();
115
- // eslint-disable-next-line @typescript-eslint/unbound-method
115
+ // oxlint-disable-next-line typescript/unbound-method
116
116
  expect(mockElement.focus).toHaveBeenCalled();
117
117
  expect(mockEditor.focus).toHaveBeenCalled();
118
118
 
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* oxlint-disable typescript/no-explicit-any */
3
3
  import { describe, expect, it } from "vitest";
4
4
  import type { OutputMessage } from "@/core/kernel/messages";
5
5
  import { groupCellsByColumn, shouldHideCode } from "../vertical-layout";
@@ -221,7 +221,9 @@ export const FindReplace: React.FC = () => {
221
221
  variant="outline"
222
222
  className="h-6 text-xs"
223
223
  onClick={() => {
224
- replaceNext() && resetMatches();
224
+ if (replaceNext()) {
225
+ resetMatches();
226
+ }
225
227
  }}
226
228
  disabled={state.findText === ""}
227
229
  >
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* oxlint-disable typescript/no-explicit-any */
3
3
 
4
4
  import { PlusIcon, RefreshCcw, Trash2Icon } from "lucide-react";
5
5
  import React from "react";
@@ -35,7 +35,7 @@ export interface FieldOptions {
35
35
  optionRegex?: string;
36
36
  }
37
37
 
38
- // eslint-disable-next-line @typescript-eslint/no-redeclare
38
+ // oxlint-disable-next-line typescript/no-redeclare
39
39
  export const FieldOptions = {
40
40
  of(options: FieldOptions): string {
41
41
  return JSON.stringify(options);
@@ -1,6 +1,6 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable react/jsx-no-comment-textnodes */
3
- /* eslint-disable react/jsx-no-target-blank */
2
+ /* oxlint-disable react/jsx-no-comment-textnodes */
3
+ /* oxlint-disable react/jsx-no-target-blank */
4
4
 
5
5
  import { useAtomValue } from "jotai";
6
6
  import { CopyIcon, DownloadIcon } from "lucide-react";
@@ -143,7 +143,7 @@ const TerminalComponent: React.FC<TerminalComponentProps> = ({
143
143
  const terminalRef = useRef<HTMLDivElement>(null);
144
144
  const wsRef = useRef<WebSocket | null>(null);
145
145
 
146
- // eslint-disable-next-line react/hook-use-state
146
+ // oxlint-disable-next-line react/hook-use-state
147
147
  const [{ terminal, fitAddon, searchAddon }] = useState(() => {
148
148
  // Create a new terminal instance
149
149
  const term = new Terminal({
@@ -300,7 +300,7 @@ const TerminalComponent: React.FC<TerminalComponentProps> = ({
300
300
  return () => {
301
301
  // noop
302
302
  };
303
- // eslint-disable-next-line react-hooks/exhaustive-deps
303
+ // oxlint-disable-next-line react-hooks/exhaustive-deps
304
304
  }, [initialized]);
305
305
 
306
306
  // Process pending commands when terminal is ready
@@ -335,7 +335,7 @@ const TerminalComponent: React.FC<TerminalComponentProps> = ({
335
335
  }
336
336
 
337
337
  return;
338
- // eslint-disable-next-line react-hooks/exhaustive-deps
338
+ // oxlint-disable-next-line react-hooks/exhaustive-deps
339
339
  }, [visible]);
340
340
 
341
341
  // On mount
@@ -373,7 +373,7 @@ const TerminalComponent: React.FC<TerminalComponentProps> = ({
373
373
  return () => {
374
374
  abortController.abort();
375
375
  };
376
- // eslint-disable-next-line react-hooks/exhaustive-deps
376
+ // oxlint-disable-next-line react-hooks/exhaustive-deps
377
377
  }, []);
378
378
 
379
379
  return (
@@ -108,7 +108,7 @@ const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
108
108
 
109
109
  React.useImperativeHandle(
110
110
  ref,
111
- // eslint-disable-next-line @typescript-eslint/non-nullable-type-assertion-style
111
+ // oxlint-disable-next-line typescript/non-nullable-type-assertion-style
112
112
  () => buttonRef.current as HTMLButtonElement,
113
113
  );
114
114
 
@@ -61,7 +61,7 @@ const CommandInput = React.forwardRef<
61
61
  >(({ className, icon, rootClassName, ...props }, ref) => (
62
62
  <div
63
63
  className={cn("flex items-center border-b px-3", rootClassName)}
64
- // eslint-disable-next-line react/no-unknown-property
64
+ // oxlint-disable-next-line react/no-unknown-property
65
65
  cmdk-input-wrapper=""
66
66
  >
67
67
  {icon === null ? null : (
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* oxlint-disable typescript/no-explicit-any */
3
3
 
4
4
  import { beforeEach, describe, expect, it } from "vitest";
5
5
  import { cellId, variableName } from "@/__tests__/branded";
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* oxlint-disable typescript/no-explicit-any */
3
3
 
4
4
  import { createStore } from "jotai";
5
5
  import { beforeEach, describe, expect, it } from "vitest";
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* oxlint-disable typescript/no-explicit-any */
3
3
 
4
4
  import { describe, expect, it, vi } from "vitest";
5
5
  import { cellId, variableName } from "@/__tests__/branded";
@@ -98,7 +98,7 @@ export abstract class AIContextProvider<
98
98
  * Registry for managing different AI context providers
99
99
  */
100
100
  export class AIContextRegistry<T extends AIContextItem> {
101
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
101
+ // oxlint-disable-next-line typescript/no-explicit-any
102
102
  private providers = new Set<AIContextProvider<any>>();
103
103
 
104
104
  /**
@@ -106,7 +106,7 @@ export class AIContextRegistry<T extends AIContextItem> {
106
106
  */
107
107
  register<U extends AIContextItem>(
108
108
  provider: AIContextProvider<U>,
109
- // eslint-disable-next-line @typescript-eslint/prefer-return-this-type
109
+ // oxlint-disable-next-line typescript/prefer-return-this-type
110
110
  ): AIContextRegistry<U | T> {
111
111
  this.providers.add(provider);
112
112
  return this;
@@ -14,7 +14,7 @@ import { formatToolDescription } from "./utils";
14
14
 
15
15
  export type AnyZodObject = ZodObject<z.ZodRawShape>;
16
16
 
17
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
+ // oxlint-disable-next-line typescript/no-explicit-any
18
18
  type StoredTool = AiTool<any, any>;
19
19
 
20
20
  interface InvokeResult<TName> {
@@ -45,7 +45,7 @@ vi.mock("@/core/codemirror/editing/commands", () => ({
45
45
  vi.mock("../scrollCellIntoView", async (importOriginal) => {
46
46
  const actual = await importOriginal();
47
47
  return {
48
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
48
+ // oxlint-disable-next-line typescript/no-explicit-any
49
49
  ...(actual as any),
50
50
  scrollToTop: vi.fn(),
51
51
  scrollToBottom: vi.fn(),
@@ -1023,7 +1023,7 @@ describe("cell reducer", () => {
1023
1023
  });
1024
1024
  cell = cells[0];
1025
1025
  expect(cell.status).toBe("idle");
1026
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
1026
+ // oxlint-disable-next-line typescript/no-explicit-any no-unsafe-optional-chaining
1027
1027
  expect((cell.output?.data as any)[0].msg).toBe(
1028
1028
  "This cell wasn't run because an ancestor was stopped with `mo.stop`: ",
1029
1029
  );
@@ -40,7 +40,7 @@ describe("scrollCellIntoView", () => {
40
40
 
41
41
  it("should scroll active line when editor has focus", () => {
42
42
  const mockEditor = { hasFocus: true };
43
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
43
+ // oxlint-disable-next-line typescript/no-explicit-any
44
44
  mockGetCellEditorView.mockReturnValue(mockEditor as any);
45
45
 
46
46
  scrollCellIntoView(cid);
@@ -1,7 +1,7 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
2
 
3
3
  import type * as api from "@marimo-team/marimo-api";
4
- /* eslint-disable @typescript-eslint/no-explicit-any */
4
+ /* oxlint-disable typescript/no-explicit-any */
5
5
  import { beforeEach, describe, expect, it, vi } from "vitest";
6
6
  import { Mocks } from "@/__mocks__/common";
7
7
  import { cellId } from "@/__tests__/branded";
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* oxlint-disable typescript/no-explicit-any */
3
3
  import { describe, expect, it } from "vitest";
4
4
  import {
5
5
  getCellConfigs,
@@ -80,7 +80,7 @@ export interface NotebookState {
80
80
  */
81
81
  history: {
82
82
  name: string;
83
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
83
+ // oxlint-disable-next-line typescript/no-explicit-any
84
84
  serializedEditorState: any;
85
85
  column: CellColumnId;
86
86
  index: CellIndex;
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-redeclare */
2
+ /* oxlint-disable typescript/no-redeclare */
3
3
 
4
4
  import type { components } from "@marimo-team/marimo-api";
5
5
  import { OBJECT_ID_ATTR } from "@/core/dom/ui-element-constants";
@@ -53,7 +53,7 @@ ${opts.codeAfter}
53
53
  }
54
54
 
55
55
  let result = "";
56
- // eslint-disable-next-line no-constant-condition
56
+ // oxlint-disable-next-line no-constant-condition
57
57
  while (true) {
58
58
  const { done, value } = await reader.read();
59
59
  if (done) {
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* oxlint-disable typescript/no-explicit-any */
3
3
 
4
4
  import { Transport } from "@open-rpc/client-js/build/transports/Transport";
5
5
  import { beforeEach, describe, expect, it, vi } from "vitest";
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* oxlint-disable typescript/no-explicit-any */
3
3
 
4
4
  import { WebSocketTransport } from "@open-rpc/client-js";
5
5
  import { beforeEach, describe, expect, it, vi } from "vitest";
@@ -121,7 +121,7 @@ export class CopilotLanguageServerClient extends LanguageServerClient {
121
121
  ).request(method, params);
122
122
  }
123
123
 
124
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
124
+ // oxlint-disable-next-line typescript/no-explicit-any
125
125
  override async notify(method: any, params: any): Promise<any> {
126
126
  logger.debug("#notify", method, params);
127
127
  return super.notify(method, params);
@@ -1,5 +1,5 @@
1
1
  /* Copyright 2026 Marimo. All rights reserved. */
2
- /* eslint-disable @typescript-eslint/no-empty-interface */
2
+ /* oxlint-disable typescript/no-empty-object-type */
3
3
 
4
4
  export interface GitHubCopilotSignInInitiateResult {
5
5
  verificationUri: string; // https://github.com/login/device