From 30b6e9007c38b936c87f14d7ead30d6c85322d2f Mon Sep 17 00:00:00 2001 From: Kiet <31864905+Kitenite@users.noreply.github.com> Date: Thu, 5 Feb 2026 19:29:18 -0800 Subject: [PATCH] Revert "Revert xterm.js v6.0.0 upgrade back to v5.5.0 (#1226)" This reverts commit f58e64f5591d25302f0f3cff52599c58830d42b0. --- apps/desktop/electron.vite.config.ts | 6 +- apps/desktop/package.json | 22 +++-- apps/desktop/src/renderer/globals.css | 15 ++-- .../ScrollToBottomButton.tsx | 8 +- .../TabsContent/Terminal/config.ts | 2 - .../TabsContent/Terminal/helpers.ts | 87 +++++++++---------- .../ContentView/TabsContent/Terminal/utils.ts | 15 +--- .../RightSidebar/FilesView/types.ts | 9 -- bun.lock | 56 +++++------- 9 files changed, 87 insertions(+), 133 deletions(-) diff --git a/apps/desktop/electron.vite.config.ts b/apps/desktop/electron.vite.config.ts index c1ac67d819a..912e8a51f34 100644 --- a/apps/desktop/electron.vite.config.ts +++ b/apps/desktop/electron.vite.config.ts @@ -89,7 +89,11 @@ export default defineConfig({ }, }, resolve: { - alias: {}, + alias: { + // @xterm/headless 6.0.0 has a packaging bug: `module` field points to + // non-existent `lib/xterm.mjs`. Force Vite to use the CJS entry instead. + "@xterm/headless": "@xterm/headless/lib-headless/xterm-headless.js", + }, }, }, diff --git a/apps/desktop/package.json b/apps/desktop/package.json index a83e4f2ebd7..2df89ee95b4 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -96,18 +96,16 @@ "@trpc/server": "^11.7.1", "@types/express": "^5.0.5", "@vercel/blob": "^2.0.0", - "@xterm/addon-canvas": "^0.7.0", - "@xterm/addon-clipboard": "^0.1.0", - "@xterm/addon-fit": "^0.10.0", - "@xterm/addon-image": "^0.8.0", - "@xterm/addon-ligatures": "^0.9.0", - "@xterm/addon-search": "^0.15.0", - "@xterm/addon-serialize": "^0.13.0", - "@xterm/addon-unicode11": "^0.8.0", - "@xterm/addon-web-links": "^0.11.0", - "@xterm/addon-webgl": "^0.18.0", - "@xterm/headless": "^5.5.0", - "@xterm/xterm": "^5.5.0", + "@xterm/addon-clipboard": "0.3.0-beta.109", + "@xterm/addon-fit": "0.12.0-beta.109", + "@xterm/addon-image": "0.10.0-beta.109", + "@xterm/addon-ligatures": "0.11.0-beta.109", + "@xterm/addon-search": "0.17.0-beta.109", + "@xterm/addon-serialize": "0.15.0-beta.109", + "@xterm/addon-unicode11": "0.10.0-beta.109", + "@xterm/addon-webgl": "0.20.0-beta.109", + "@xterm/headless": "6.1.0-beta.109", + "@xterm/xterm": "6.1.0-beta.109", "better-auth": "1.4.17", "better-sqlite3": "12.6.2", "bindings": "^1.5.0", diff --git a/apps/desktop/src/renderer/globals.css b/apps/desktop/src/renderer/globals.css index de432d40ee5..db9135ed702 100644 --- a/apps/desktop/src/renderer/globals.css +++ b/apps/desktop/src/renderer/globals.css @@ -167,19 +167,14 @@ min-height: 100vh; } - /* Ensure xterm terminal fills container height */ - .xterm { + /* xterm 6.0.0+ requires explicit sizing due to VS Code scrollbar integration */ + .xterm, + .xterm .xterm-scrollable-element, + .xterm .xterm-viewport, + .xterm .xterm-screen { height: 100%; width: 100%; } - - .xterm-screen { - height: 100%; - width: 100%; - } - - /* Style links in terminal (like iTerm) */ - /* xterm uses underline-5 (dashed) for links on hover */ .xterm .xterm-rows a { color: inherit; cursor: pointer; diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/ScrollToBottomButton/ScrollToBottomButton.tsx b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/ScrollToBottomButton/ScrollToBottomButton.tsx index be0e1399d4b..2b38f6c5a16 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/ScrollToBottomButton/ScrollToBottomButton.tsx +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/ScrollToBottomButton/ScrollToBottomButton.tsx @@ -28,15 +28,11 @@ export function ScrollToBottomButton({ terminal }: ScrollToBottomButtonProps) { checkScrollPosition(); const writeDisposable = terminal.onWriteParsed(checkScrollPosition); - const viewport = terminal.element?.querySelector(".xterm-viewport"); - - if (viewport) { - viewport.addEventListener("scroll", checkScrollPosition); - } + const scrollDisposable = terminal.onScroll(checkScrollPosition); return () => { writeDisposable.dispose(); - viewport?.removeEventListener("scroll", checkScrollPosition); + scrollDisposable.dispose(); }; }, [terminal, checkScrollPosition]); diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/config.ts b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/config.ts index 6d3135d9d7a..33bb8cdc195 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/config.ts +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/config.ts @@ -42,8 +42,6 @@ export const TERMINAL_OPTIONS: ITerminalOptions = { macOptionIsMeta: false, cursorStyle: "block", cursorInactiveStyle: "outline", - fastScrollModifier: "alt", - fastScrollSensitivity: 5, screenReaderMode: false, }; diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/helpers.ts b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/helpers.ts index 9a1c966411a..e7b43725a6e 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/helpers.ts +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/helpers.ts @@ -1,5 +1,4 @@ import { toast } from "@superset/ui/sonner"; -import { CanvasAddon } from "@xterm/addon-canvas"; import { ClipboardAddon } from "@xterm/addon-clipboard"; import { FitAddon } from "@xterm/addon-fit"; import { ImageAddon } from "@xterm/addon-image"; @@ -61,33 +60,48 @@ export function getDefaultTerminalBg(): string { /** * Load GPU-accelerated renderer with automatic fallback. - * Tries WebGL first, falls back to Canvas if WebGL fails. + * Tries WebGL first, falls back to DOM if WebGL fails. + * This follows VS Code's approach: WebGL → DOM (canvas addon removed in xterm.js 6.0). */ export type TerminalRenderer = { - kind: "webgl" | "canvas" | "dom"; + kind: "webgl" | "dom"; dispose: () => void; clearTextureAtlas?: () => void; }; type PreferredRenderer = TerminalRenderer["kind"] | "auto"; +// Track WebGL failures globally to avoid repeated initialization attempts (VS Code pattern) +let suggestedRendererType: TerminalRenderer["kind"] | undefined; + function getPreferredRenderer(): PreferredRenderer { + // If WebGL previously failed, don't try again + if (suggestedRendererType === "dom") { + return "dom"; + } + try { const stored = localStorage.getItem("terminal-renderer"); - if (stored === "webgl" || stored === "canvas" || stored === "dom") { + if (stored === "webgl" || stored === "dom") { return stored; } + if (stored === "canvas") { + // Canvas renderer was removed in xterm.js 6.0; fall back to DOM. + try { + localStorage.setItem("terminal-renderer", "dom"); + } catch { + // ignore storage errors + } + return "dom"; + } } catch { // ignore } - // Default: avoid xterm-webgl on macOS. We've seen repeated corruption/glitching - // when terminals are hidden/shown or switched between panes. - return navigator.userAgent.includes("Macintosh") ? "canvas" : "webgl"; + return "auto"; } function loadRenderer(xterm: XTerm): TerminalRenderer { - let renderer: WebglAddon | CanvasAddon | null = null; let webglAddon: WebglAddon | null = null; let kind: TerminalRenderer["kind"] = "dom"; @@ -97,54 +111,35 @@ function loadRenderer(xterm: XTerm): TerminalRenderer { return { kind: "dom", dispose: () => {}, clearTextureAtlas: undefined }; } - const tryLoadCanvas = () => { - try { - renderer = new CanvasAddon(); - xterm.loadAddon(renderer); - kind = "canvas"; - } catch { - // Canvas fallback failed, use default renderer - } - }; - - if (preferred === "canvas") { - tryLoadCanvas(); - return { - kind, - dispose: () => renderer?.dispose(), - clearTextureAtlas: undefined, - }; - } - try { webglAddon = new WebglAddon(); webglAddon.onContextLoss(() => { + console.warn( + "[Terminal] WebGL context lost, falling back to DOM renderer", + ); webglAddon?.dispose(); webglAddon = null; - try { - renderer = new CanvasAddon(); - xterm.loadAddon(renderer); - kind = "canvas"; - // Force refresh after context loss recovery - xterm.refresh(0, xterm.rows - 1); - } catch { - // Canvas fallback failed, use default renderer - renderer = null; - kind = "dom"; - } + kind = "dom"; + // Force refresh after context loss + xterm.refresh(0, xterm.rows - 1); }); xterm.loadAddon(webglAddon); - renderer = webglAddon; kind = "webgl"; - } catch { - tryLoadCanvas(); + } catch (e) { + console.warn( + "[Terminal] WebGL could not be loaded, falling back to DOM renderer", + e, + ); + suggestedRendererType = "dom"; + webglAddon = null; + kind = "dom"; } return { kind, - dispose: () => renderer?.dispose(), + dispose: () => webglAddon?.dispose(), clearTextureAtlas: webglAddon ? () => { try { @@ -216,11 +211,11 @@ export function createTerminalInstance( // Defer GPU renderer loading to next animation frame. // xterm.open() schedules a setTimeout for Viewport.syncScrollArea which expects - // the renderer to be ready. Loading WebGL/Canvas immediately after open() can - // cause a race condition where the setTimeout fires during addon initialization, - // when _renderer is temporarily undefined (old renderer disposed, new not yet set). + // the renderer to be ready. Loading WebGL immediately after open() can cause a + // race condition where the setTimeout fires during addon initialization, when + // _renderer is temporarily undefined (old renderer disposed, new not yet set). // Deferring to rAF ensures xterm's internal setTimeout completes first with the - // default DOM renderer, then we safely swap to WebGL/Canvas. + // default DOM renderer, then we safely swap to WebGL. rafId = requestAnimationFrame(() => { rafId = null; if (isDisposed) return; diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/utils.ts b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/utils.ts index 95a10d2ea48..e397d2296ff 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/utils.ts +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/utils.ts @@ -5,17 +5,6 @@ export function shellEscapePaths(paths: string[]): string { return quote(paths); } -export function scrollToBottom( - terminal: Terminal, - behavior: ScrollBehavior = "instant", -): void { - const viewport = terminal.element?.querySelector(".xterm-viewport"); - if (viewport) { - viewport.scrollTo({ - top: viewport.scrollHeight, - behavior, - }); - } else { - terminal.scrollToBottom(); - } +export function scrollToBottom(terminal: Terminal): void { + terminal.scrollToBottom(); } diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/RightSidebar/FilesView/types.ts b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/RightSidebar/FilesView/types.ts index 29922892179..6bb41fcd8f9 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/RightSidebar/FilesView/types.ts +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/RightSidebar/FilesView/types.ts @@ -1,10 +1 @@ -import type { FileTreeNode } from "shared/file-tree-types"; - -export type OnFileOpen = (node: FileTreeNode) => void; - export type NewItemMode = "file" | "folder" | null; - -export interface TreeActionResult { - success: boolean; - error?: string; -} diff --git a/bun.lock b/bun.lock index ec277ce7d42..afd5885c364 100644 --- a/bun.lock +++ b/bun.lock @@ -194,18 +194,16 @@ "@trpc/server": "^11.7.1", "@types/express": "^5.0.5", "@vercel/blob": "^2.0.0", - "@xterm/addon-canvas": "^0.7.0", - "@xterm/addon-clipboard": "^0.1.0", - "@xterm/addon-fit": "^0.10.0", - "@xterm/addon-image": "^0.8.0", - "@xterm/addon-ligatures": "^0.9.0", - "@xterm/addon-search": "^0.15.0", - "@xterm/addon-serialize": "^0.13.0", - "@xterm/addon-unicode11": "^0.8.0", - "@xterm/addon-web-links": "^0.11.0", - "@xterm/addon-webgl": "^0.18.0", - "@xterm/headless": "^5.5.0", - "@xterm/xterm": "^5.5.0", + "@xterm/addon-clipboard": "0.3.0-beta.109", + "@xterm/addon-fit": "0.12.0-beta.109", + "@xterm/addon-image": "0.10.0-beta.109", + "@xterm/addon-ligatures": "0.11.0-beta.109", + "@xterm/addon-search": "0.17.0-beta.109", + "@xterm/addon-serialize": "0.15.0-beta.109", + "@xterm/addon-unicode11": "0.10.0-beta.109", + "@xterm/addon-webgl": "0.20.0-beta.109", + "@xterm/headless": "6.1.0-beta.109", + "@xterm/xterm": "6.1.0-beta.109", "better-auth": "1.4.17", "better-sqlite3": "12.6.2", "bindings": "^1.5.0", @@ -2409,29 +2407,25 @@ "@xmldom/xmldom": ["@xmldom/xmldom@0.8.11", "", {}, "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw=="], - "@xterm/addon-canvas": ["@xterm/addon-canvas@0.7.0", "", { "peerDependencies": { "@xterm/xterm": "^5.0.0" } }, "sha512-LF5LYcfvefJuJ7QotNRdRSPc9YASAVDeoT5uyXS/nZshZXjYplGXRECBGiznwvhNL2I8bq1Lf5MzRwstsYQ2Iw=="], + "@xterm/addon-clipboard": ["@xterm/addon-clipboard@0.3.0-beta.109", "", { "dependencies": { "js-base64": "^3.7.5" }, "peerDependencies": { "@xterm/xterm": "^6.1.0-beta.109" } }, "sha512-iaKd86bsBYG2PgF6gAiYUPHxFW/LX8ERJfMBCiASQo9C7U/gPJgoiGEZikydf3AllnQFHku+4Kdf7lia6ci6tA=="], - "@xterm/addon-clipboard": ["@xterm/addon-clipboard@0.1.0", "", { "dependencies": { "js-base64": "^3.7.5" }, "peerDependencies": { "@xterm/xterm": "^5.4.0" } }, "sha512-zdoM7p53T5sv/HbRTyp4hY0kKmEQ3MZvAvEtiXqNIHc/JdpqwByCtsTaQF5DX2n4hYdXRPO4P/eOS0QEhX1nPw=="], + "@xterm/addon-fit": ["@xterm/addon-fit@0.12.0-beta.109", "", { "peerDependencies": { "@xterm/xterm": "^6.1.0-beta.109" } }, "sha512-mb+3dOxGKxIEbyHA10fmefI1CuYIljHANWJgKo2bUd73IJyQXp55L4q/yGzB574FP6bnEV0NvNoRwo9iSBy7ZQ=="], - "@xterm/addon-fit": ["@xterm/addon-fit@0.10.0", "", { "peerDependencies": { "@xterm/xterm": "^5.0.0" } }, "sha512-UFYkDm4HUahf2lnEyHvio51TNGiLK66mqP2JoATy7hRZeXaGMRDr00JiSF7m63vR5WKATF605yEggJKsw0JpMQ=="], + "@xterm/addon-image": ["@xterm/addon-image@0.10.0-beta.109", "", { "peerDependencies": { "@xterm/xterm": "^6.1.0-beta.109" } }, "sha512-O5A4tkxiT4D5yz+brgLlLR2he7NDVmLK+rl1e53nhaUXABHZUEonqqKMq3OPRc+/PeuEU6CH4dq+v49Pwmgfpw=="], - "@xterm/addon-image": ["@xterm/addon-image@0.8.0", "", { "peerDependencies": { "@xterm/xterm": "^5.2.0" } }, "sha512-b/dqpFn3jUad2pUP5UpF4scPIh0WdxRQL/1qyiahGfUI85XZTCXo0py9G6AcOR2QYUw8eJ8EowGspT7BQcgw6A=="], + "@xterm/addon-ligatures": ["@xterm/addon-ligatures@0.11.0-beta.109", "", { "dependencies": { "lru-cache": "^6.0.0", "opentype.js": "^0.8.0" }, "peerDependencies": { "@xterm/xterm": "^6.1.0-beta.109" } }, "sha512-nGiw2sAyGEeF72+92EHlwa3J8MOamuFVTTv7PYpJMZi75ejn1OtRF+/cWelBaHx4/aQr1nXsfsJPXu+g8FQrSg=="], - "@xterm/addon-ligatures": ["@xterm/addon-ligatures@0.9.0", "", { "dependencies": { "font-finder": "^1.1.0", "font-ligatures": "^1.4.1" }, "peerDependencies": { "@xterm/xterm": "^5.0.0" } }, "sha512-zVV1AHV1SIm/rdzR5VDPyg+qUnR1SjH4H75iXiB7r6YDa1yEHIqc/EwnUIwz+yeeZozkh8hjbH80L7luEgtxtQ=="], + "@xterm/addon-search": ["@xterm/addon-search@0.17.0-beta.109", "", { "peerDependencies": { "@xterm/xterm": "^6.1.0-beta.109" } }, "sha512-RQ1bMQIWOXJ3rOEiTLidxjTnpHgFhgIj2a45W6VKo3c+ILBNcC5x/tUlcM+BgnyT62aMNgmGRUIlW5qv7aTxRA=="], - "@xterm/addon-search": ["@xterm/addon-search@0.15.0", "", { "peerDependencies": { "@xterm/xterm": "^5.0.0" } }, "sha512-ZBZKLQ+EuKE83CqCmSSz5y1tx+aNOCUaA7dm6emgOX+8J9H1FWXZyrKfzjwzV+V14TV3xToz1goIeRhXBS5qjg=="], + "@xterm/addon-serialize": ["@xterm/addon-serialize@0.15.0-beta.109", "", { "peerDependencies": { "@xterm/xterm": "^6.1.0-beta.109" } }, "sha512-qUY7mnGX7BnbfvgFirdUAUDIJyHPN+2U849w4Z8yLO9Q9t0eLcufHlwbXeVAOnNwM3pSI3Ohz5vXsWhmJrfSrQ=="], - "@xterm/addon-serialize": ["@xterm/addon-serialize@0.13.0", "", { "peerDependencies": { "@xterm/xterm": "^5.0.0" } }, "sha512-kGs8o6LWAmN1l2NpMp01/YkpxbmO4UrfWybeGu79Khw5K9+Krp7XhXbBTOTc3GJRRhd6EmILjpR8k5+odY39YQ=="], + "@xterm/addon-unicode11": ["@xterm/addon-unicode11@0.10.0-beta.109", "", { "peerDependencies": { "@xterm/xterm": "^6.1.0-beta.109" } }, "sha512-M++pTg4rF7OW7OhrY52m80pB2DRU8/bhmd4rIRlNWeuWlNmLOljjA5a7HrjNCV+PUBnK+6/BRIhO1Rt6uWFNvA=="], - "@xterm/addon-unicode11": ["@xterm/addon-unicode11@0.8.0", "", { "peerDependencies": { "@xterm/xterm": "^5.0.0" } }, "sha512-LxinXu8SC4OmVa6FhgwsVCBZbr8WoSGzBl2+vqe8WcQ6hb1r6Gj9P99qTNdPiFPh4Ceiu2pC8xukZ6+2nnh49Q=="], + "@xterm/addon-webgl": ["@xterm/addon-webgl@0.20.0-beta.109", "", { "peerDependencies": { "@xterm/xterm": "^6.1.0-beta.110" } }, "sha512-MF0JoA3CPiKjwIc1R5fA3wBf44aqLPgy6KdtA8VnmYY9HenuGG4hqdyQ4Xf3Z0pNYfy+ZmLUvR0QaMWdQTcJOQ=="], - "@xterm/addon-web-links": ["@xterm/addon-web-links@0.11.0", "", { "peerDependencies": { "@xterm/xterm": "^5.0.0" } }, "sha512-nIHQ38pQI+a5kXnRaTgwqSHnX7KE6+4SVoceompgHL26unAxdfP6IPqUTSYPQgSwM56hsElfoNrrW5V7BUED/Q=="], + "@xterm/headless": ["@xterm/headless@6.1.0-beta.109", "", {}, "sha512-oESLjJpJ5JsSyZpj10JJKYDPm+irdKAKogp6XKkks2RxU8YfH+pr99gR3kPi6ppz+MPmEqDh4bejMhXEe4/twQ=="], - "@xterm/addon-webgl": ["@xterm/addon-webgl@0.18.0", "", { "peerDependencies": { "@xterm/xterm": "^5.0.0" } }, "sha512-xCnfMBTI+/HKPdRnSOHaJDRqEpq2Ugy8LEj9GiY4J3zJObo3joylIFaMvzBwbYRg8zLtkO0KQaStCeSfoaI2/w=="], - - "@xterm/headless": ["@xterm/headless@5.5.0", "", {}, "sha512-5xXB7kdQlFBP82ViMJTwwEc3gKCLGKR/eoxQm4zge7GPBl86tCdI0IdPJjoKd8mUSFXz5V7i/25sfsEkP4j46g=="], - - "@xterm/xterm": ["@xterm/xterm@5.5.0", "", {}, "sha512-hqJHYaQb5OptNunnyAnkHyM8aCjZ1MEIDTQu1iIbbTD/xops91NB5yq1ZK/dC2JDbVWtF23zUtl9JE2NqwT87A=="], + "@xterm/xterm": ["@xterm/xterm@6.1.0-beta.109", "", {}, "sha512-3MioB2ZPzf4Wli4W7rZNCvpSakCf/7FktoNqxrckKfeusTMtbFUgH1MZKVZ5yAy3DCv0ASOzDTGM0ELZDO7XWA=="], "@xtuc/ieee754": ["@xtuc/ieee754@1.2.0", "", {}, "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="], @@ -3259,10 +3253,6 @@ "follow-redirects": ["follow-redirects@1.15.11", "", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="], - "font-finder": ["font-finder@1.1.0", "", { "dependencies": { "get-system-fonts": "^2.0.0", "promise-stream-reader": "^1.0.1" } }, "sha512-wpCL2uIbi6GurJbU7ZlQ3nGd61Ho+dSU6U83/xJT5UPFfN35EeCW/rOtS+5k+IuEZu2SYmHzDIPL9eA5tSYRAw=="], - - "font-ligatures": ["font-ligatures@1.4.1", "", { "dependencies": { "font-finder": "^1.0.3", "lru-cache": "^6.0.0", "opentype.js": "^0.8.0" } }, "sha512-7W6zlfyhvCqShZ5ReUWqmSd9vBaUudW0Hxis+tqUjtHhsPU+L3Grf8mcZAtCiXHTzorhwdRTId2WeH/88gdFkw=="], - "fontfaceobserver": ["fontfaceobserver@2.3.0", "", {}, "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg=="], "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], @@ -3325,8 +3315,6 @@ "get-stream": ["get-stream@9.0.1", "", { "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" } }, "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA=="], - "get-system-fonts": ["get-system-fonts@2.0.2", "", {}, "sha512-zzlgaYnHMIEgHRrfC7x0Qp0Ylhw/sHpM6MHXeVBTYIsvGf5GpbnClB+Q6rAPdn+0gd2oZZIo6Tj3EaWrt4VhDQ=="], - "get-tsconfig": ["get-tsconfig@4.13.1", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-EoY1N2xCn44xU6750Sx7OjOIT59FkmstNc3X6y5xpz7D5cBtZRe/3pSlTkDJgqsOk3WwZPkWfonhhUJfttQo3w=="], "getenv": ["getenv@2.0.0", "", {}, "sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ=="], @@ -4263,8 +4251,6 @@ "promise-retry": ["promise-retry@2.0.1", "", { "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" } }, "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g=="], - "promise-stream-reader": ["promise-stream-reader@1.0.1", "", {}, "sha512-Tnxit5trUjBAqqZCGWwjyxhmgMN4hGrtpW3Oc/tRI4bpm/O2+ej72BB08l6JBnGQgVDGCLvHFGjGgQS6vzhwXg=="], - "promise-worker-transferable": ["promise-worker-transferable@1.0.4", "", { "dependencies": { "is-promise": "^2.1.0", "lie": "^3.0.2" } }, "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw=="], "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="], @@ -5459,6 +5445,8 @@ "@vue/compiler-core/entities": ["entities@7.0.1", "", {}, "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA=="], + "@xterm/addon-webgl/@xterm/xterm": ["@xterm/xterm@6.1.0-beta.145", "", {}, "sha512-+/JYfFZePPLllxjkmKMuV+gKKzbC5vMdUkoQAB0hes5/gjclU3V73TMO7UC9Br1+JOnjZVdED1U/b8cJ2pV9MQ=="], + "@xyflow/react/zustand": ["zustand@4.5.7", "", { "dependencies": { "use-sync-external-store": "^1.2.2" }, "peerDependencies": { "@types/react": ">=16.8", "immer": ">=9.0.6", "react": ">=16.8" }, "optionalPeers": ["@types/react", "immer", "react"] }, "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw=="], "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],