From 3ca6a2c7e7b4fa14af8166da39da421ee3ae60ca Mon Sep 17 00:00:00 2001 From: Kiet Ho Date: Fri, 27 Mar 2026 22:16:23 -0700 Subject: [PATCH 1/2] desktop: make chat work in skip env mode --- apps/desktop/BUILDING.md | 4 +- .../desktop/src/renderer/lib/dev-chat.test.ts | 43 +++++++++++++ apps/desktop/src/renderer/lib/dev-chat.ts | 64 +++++++++++++++++++ .../ChatPaneInterface.tsx | 8 ++- .../utils/uploadFiles/uploadFiles.ts | 13 +++- .../useWorkspaceChatController.ts | 31 ++++++++- .../ChatPaneInterface/ChatPaneInterface.tsx | 8 ++- .../utils/uploadFiles/uploadFiles.ts | 13 +++- .../useChatPaneController.ts | 42 ++++++++++-- 9 files changed, 211 insertions(+), 15 deletions(-) create mode 100644 apps/desktop/src/renderer/lib/dev-chat.test.ts create mode 100644 apps/desktop/src/renderer/lib/dev-chat.ts diff --git a/apps/desktop/BUILDING.md b/apps/desktop/BUILDING.md index 74347999166..8c03ba9eb56 100644 --- a/apps/desktop/BUILDING.md +++ b/apps/desktop/BUILDING.md @@ -6,7 +6,7 @@ Run the dev server without env validation or auth: SKIP_ENV_VALIDATION=1 bun run dev ``` -This skips environment variable validation and the sign-in screen, useful for local development without credentials. +This skips environment variable validation and the sign-in screen. Desktop chat also falls back to local-only session bootstrap in this mode, so you can test chat/streaming without the cloud API as long as you have local model credentials configured. # Release @@ -36,4 +36,4 @@ ls -la release/*.AppImage ls -la release/*-linux.yml ``` -If both files exist, packaging produced the Linux artifact + updater metadata that `electron-updater` expects. \ No newline at end of file +If both files exist, packaging produced the Linux artifact + updater metadata that `electron-updater` expects. diff --git a/apps/desktop/src/renderer/lib/dev-chat.test.ts b/apps/desktop/src/renderer/lib/dev-chat.test.ts new file mode 100644 index 00000000000..7e4fce03190 --- /dev/null +++ b/apps/desktop/src/renderer/lib/dev-chat.test.ts @@ -0,0 +1,43 @@ +import { describe, expect, it } from "bun:test"; +import { + DEV_CHAT_MODELS, + getDesktopChatModelOptions, + isDesktopChatSessionReady, + resolveDesktopChatOrganizationId, +} from "./dev-chat"; + +describe("dev chat helpers", () => { + it("uses the mock organization in dev mode", () => { + expect(resolveDesktopChatOrganizationId(null, true)).toBe("mock-org-id"); + expect(resolveDesktopChatOrganizationId("org-123", true)).toBe( + "mock-org-id", + ); + }); + + it("keeps the real organization outside dev mode", () => { + expect(resolveDesktopChatOrganizationId("org-123", false)).toBe("org-123"); + expect(resolveDesktopChatOrganizationId(null, false)).toBeNull(); + }); + + it("treats local session ids as ready in dev mode", () => { + expect( + isDesktopChatSessionReady({ + sessionId: "session-123", + hasPersistedSession: false, + skipEnvValidation: true, + }), + ).toBe(true); + expect( + isDesktopChatSessionReady({ + sessionId: null, + hasPersistedSession: false, + skipEnvValidation: true, + }), + ).toBe(false); + }); + + it("returns the fallback model list only in dev mode", () => { + expect(getDesktopChatModelOptions(true)).toEqual(DEV_CHAT_MODELS); + expect(getDesktopChatModelOptions(false)).toEqual([]); + }); +}); diff --git a/apps/desktop/src/renderer/lib/dev-chat.ts b/apps/desktop/src/renderer/lib/dev-chat.ts new file mode 100644 index 00000000000..446cc61b603 --- /dev/null +++ b/apps/desktop/src/renderer/lib/dev-chat.ts @@ -0,0 +1,64 @@ +import type { ModelOption } from "renderer/components/Chat/ChatInterface/types"; +import { env } from "renderer/env.renderer"; +import { MOCK_ORG_ID } from "shared/constants"; + +export const DEV_CHAT_MODELS: ModelOption[] = [ + { + id: "anthropic/claude-opus-4-6", + name: "Opus 4.6", + provider: "Anthropic", + }, + { + id: "anthropic/claude-sonnet-4-6", + name: "Sonnet 4.6", + provider: "Anthropic", + }, + { + id: "anthropic/claude-haiku-4-5", + name: "Haiku 4.5", + provider: "Anthropic", + }, + { + id: "openai/gpt-5.4", + name: "GPT-5.4", + provider: "OpenAI", + }, + { + id: "openai/gpt-5.3-codex", + name: "GPT-5.3 Codex", + provider: "OpenAI", + }, +]; + +export function isDesktopChatDevMode( + skipEnvValidation = env.SKIP_ENV_VALIDATION, +): boolean { + return skipEnvValidation; +} + +export function resolveDesktopChatOrganizationId( + activeOrganizationId: string | null | undefined, + skipEnvValidation = env.SKIP_ENV_VALIDATION, +): string | null { + if (skipEnvValidation) return MOCK_ORG_ID; + return activeOrganizationId ?? null; +} + +export function isDesktopChatSessionReady({ + sessionId, + hasPersistedSession, + skipEnvValidation = env.SKIP_ENV_VALIDATION, +}: { + sessionId: string | null; + hasPersistedSession: boolean; + skipEnvValidation?: boolean; +}): boolean { + if (skipEnvValidation) return Boolean(sessionId); + return hasPersistedSession; +} + +export function getDesktopChatModelOptions( + skipEnvValidation = env.SKIP_ENV_VALIDATION, +): ModelOption[] { + return skipEnvValidation ? DEV_CHAT_MODELS : []; +} diff --git a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/WorkspaceChat/components/WorkspaceChatInterface/ChatPaneInterface.tsx b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/WorkspaceChat/components/WorkspaceChatInterface/ChatPaneInterface.tsx index 39b63b9e716..71cdbc232cf 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/WorkspaceChat/components/WorkspaceChatInterface/ChatPaneInterface.tsx +++ b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/WorkspaceChat/components/WorkspaceChatInterface/ChatPaneInterface.tsx @@ -15,6 +15,10 @@ import type { PermissionMode, } from "renderer/components/Chat/ChatInterface/types"; import { apiTrpcClient } from "renderer/lib/api-trpc-client"; +import { + getDesktopChatModelOptions, + isDesktopChatDevMode, +} from "renderer/lib/dev-chat"; import { posthog } from "renderer/lib/posthog"; import { useChatPreferencesStore } from "renderer/stores/chat-preferences"; import { @@ -128,12 +132,14 @@ function useAvailableModels(): { models: ModelOption[]; defaultModel: ModelOption | null; } { + const localModels = getDesktopChatModelOptions(); const { data } = useQuery({ queryKey: ["chat", "models"], queryFn: () => apiTrpcClient.chat.getModels.query(), + enabled: !isDesktopChatDevMode(), staleTime: Number.POSITIVE_INFINITY, }); - const models = data?.models ?? []; + const models = localModels.length > 0 ? localModels : (data?.models ?? []); return { models, defaultModel: models[0] ?? null }; } diff --git a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/WorkspaceChat/components/WorkspaceChatInterface/utils/uploadFiles/uploadFiles.ts b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/WorkspaceChat/components/WorkspaceChatInterface/utils/uploadFiles/uploadFiles.ts index db22f211ec7..e0009a7e9ba 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/WorkspaceChat/components/WorkspaceChatInterface/utils/uploadFiles/uploadFiles.ts +++ b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/WorkspaceChat/components/WorkspaceChatInterface/utils/uploadFiles/uploadFiles.ts @@ -1,5 +1,6 @@ import type { FileUIPart } from "ai"; import { apiTrpcClient } from "renderer/lib/api-trpc-client"; +import { isDesktopChatDevMode } from "renderer/lib/dev-chat"; async function getHttpErrorDetail(response: Response): Promise { const errorBody = await response @@ -45,12 +46,22 @@ async function uploadFile( if (signal?.aborted) { throw new DOMException("The operation was aborted", "AbortError"); } + const fileData = await blobToDataUrl(blob); + + if (isDesktopChatDevMode()) { + return { + type: "file", + url: fileData, + mediaType: file.mediaType, + filename, + }; + } const result = await apiTrpcClient.chat.uploadAttachment.mutate({ sessionId, filename, mediaType: file.mediaType, - fileData: await blobToDataUrl(blob), + fileData, }); return { type: "file", ...result }; } diff --git a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/WorkspaceChat/hooks/useWorkspaceChatController/useWorkspaceChatController.ts b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/WorkspaceChat/hooks/useWorkspaceChatController/useWorkspaceChatController.ts index 155d9bd9801..50c0bc0ac13 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/WorkspaceChat/hooks/useWorkspaceChatController/useWorkspaceChatController.ts +++ b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/WorkspaceChat/hooks/useWorkspaceChatController/useWorkspaceChatController.ts @@ -4,6 +4,10 @@ import { useLiveQuery } from "@tanstack/react-db"; import { useCallback, useMemo } from "react"; import { apiTrpcClient } from "renderer/lib/api-trpc-client"; import { authClient } from "renderer/lib/auth-client"; +import { + isDesktopChatDevMode, + resolveDesktopChatOrganizationId, +} from "renderer/lib/dev-chat"; import { posthog } from "renderer/lib/posthog"; import { useCollections } from "renderer/routes/_authenticated/providers/CollectionsProvider"; @@ -37,6 +41,7 @@ async function createSessionRecord(input: { sessionId: string; v2WorkspaceId: string; }): Promise { + if (isDesktopChatDevMode()) return; await apiTrpcClient.chat.createSession.mutate({ sessionId: input.sessionId, v2WorkspaceId: input.v2WorkspaceId, @@ -44,6 +49,7 @@ async function createSessionRecord(input: { } async function deleteSessionRecord(sessionId: string): Promise { + if (isDesktopChatDevMode()) return; const result = await apiTrpcClient.chat.deleteSession.mutate({ sessionId, }); @@ -62,7 +68,9 @@ export function useWorkspaceChatController({ workspaceId: string; }) { const { data: session } = authClient.useSession(); - const organizationId = session?.session?.activeOrganizationId ?? null; + const organizationId = resolveDesktopChatOrganizationId( + session?.session?.activeOrganizationId, + ); const collections = useCollections(); const { data: workspace } = workspaceTrpc.workspace.get.useQuery( @@ -141,8 +149,25 @@ export function useWorkspaceChatController({ }, [onSessionIdChange, organizationId, sessionId, sessions, workspaceId]); const sessionItems = useMemo( - () => sessions.map((item) => toSessionSelectorItem(item)), - [sessions], + () => { + const nextItems = sessions.map((item) => toSessionSelectorItem(item)); + if ( + !isDesktopChatDevMode() || + !sessionId || + nextItems.some((item) => item.sessionId === sessionId) + ) { + return nextItems; + } + return [ + { + sessionId, + title: "", + updatedAt: new Date(), + }, + ...nextItems, + ]; + }, + [sessionId, sessions], ); return { diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ChatPane/ChatPaneInterface/ChatPaneInterface.tsx b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ChatPane/ChatPaneInterface/ChatPaneInterface.tsx index bd3547c6fb7..6e8610d7873 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ChatPane/ChatPaneInterface/ChatPaneInterface.tsx +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ChatPane/ChatPaneInterface/ChatPaneInterface.tsx @@ -22,6 +22,10 @@ import type { PermissionMode, } from "renderer/components/Chat/ChatInterface/types"; import { apiTrpcClient } from "renderer/lib/api-trpc-client"; +import { + getDesktopChatModelOptions, + isDesktopChatDevMode, +} from "renderer/lib/dev-chat"; import { posthog } from "renderer/lib/posthog"; import { useChatPreferencesStore } from "renderer/stores/chat-preferences"; import { useTabsStore } from "renderer/stores/tabs/store"; @@ -128,12 +132,14 @@ function useAvailableModels(): { models: ModelOption[]; defaultModel: ModelOption | null; } { + const localModels = getDesktopChatModelOptions(); const { data } = useQuery({ queryKey: ["chat", "models"], queryFn: () => apiTrpcClient.chat.getModels.query(), + enabled: !isDesktopChatDevMode(), staleTime: Number.POSITIVE_INFINITY, }); - const models = data?.models ?? []; + const models = localModels.length > 0 ? localModels : (data?.models ?? []); return { models, defaultModel: models[0] ?? null }; } diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ChatPane/ChatPaneInterface/utils/uploadFiles/uploadFiles.ts b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ChatPane/ChatPaneInterface/utils/uploadFiles/uploadFiles.ts index db22f211ec7..e0009a7e9ba 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ChatPane/ChatPaneInterface/utils/uploadFiles/uploadFiles.ts +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ChatPane/ChatPaneInterface/utils/uploadFiles/uploadFiles.ts @@ -1,5 +1,6 @@ import type { FileUIPart } from "ai"; import { apiTrpcClient } from "renderer/lib/api-trpc-client"; +import { isDesktopChatDevMode } from "renderer/lib/dev-chat"; async function getHttpErrorDetail(response: Response): Promise { const errorBody = await response @@ -45,12 +46,22 @@ async function uploadFile( if (signal?.aborted) { throw new DOMException("The operation was aborted", "AbortError"); } + const fileData = await blobToDataUrl(blob); + + if (isDesktopChatDevMode()) { + return { + type: "file", + url: fileData, + mediaType: file.mediaType, + filename, + }; + } const result = await apiTrpcClient.chat.uploadAttachment.mutate({ sessionId, filename, mediaType: file.mediaType, - fileData: await blobToDataUrl(blob), + fileData, }); return { type: "file", ...result }; } diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ChatPane/hooks/useChatPaneController/useChatPaneController.ts b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ChatPane/hooks/useChatPaneController/useChatPaneController.ts index c87b9107508..c06afbcfc63 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ChatPane/hooks/useChatPaneController/useChatPaneController.ts +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ChatPane/hooks/useChatPaneController/useChatPaneController.ts @@ -6,6 +6,11 @@ import type { StartFreshSessionResult } from "renderer/components/Chat/ChatInter import { env } from "renderer/env.renderer"; import { apiTrpcClient } from "renderer/lib/api-trpc-client"; import { authClient, getAuthToken } from "renderer/lib/auth-client"; +import { + isDesktopChatDevMode, + isDesktopChatSessionReady, + resolveDesktopChatOrganizationId, +} from "renderer/lib/dev-chat"; import { electronTrpc } from "renderer/lib/electron-trpc"; import { posthog } from "renderer/lib/posthog"; import { useCollections } from "renderer/routes/_authenticated/providers/CollectionsProvider"; @@ -80,6 +85,7 @@ async function createSessionRecord(input: { organizationId: string; workspaceId: string; }): Promise { + if (isDesktopChatDevMode()) return; const token = getAuthToken(); const response = await fetch(`${apiUrl}/api/chat/${input.sessionId}`, { method: "PUT", @@ -106,6 +112,7 @@ async function createSessionRecord(input: { } async function deleteSessionRecord(sessionId: string): Promise { + if (isDesktopChatDevMode()) return; const token = getAuthToken(); const response = await fetch(`${apiUrl}/api/chat/${sessionId}/stream`, { method: "DELETE", @@ -131,7 +138,9 @@ export function useChatPaneController({ const launchConfig = pane?.chat?.launchConfig ?? null; const needsLegacySessionBootstrap = sessionId === null; const { data: session } = authClient.useSession(); - const organizationId = session?.session?.activeOrganizationId ?? null; + const organizationId = resolveDesktopChatOrganizationId( + session?.session?.activeOrganizationId, + ); const collections = useCollections(); const legacySessionBootstrapRef = useRef(false); const ensuredRef = useRef(null); @@ -154,6 +163,7 @@ export function useChatPaneController({ ); useEffect(() => { + if (isDesktopChatDevMode()) return; if (existsRemotely) return; if (!workspace?.project || !organizationId) return; if (ensuredRef.current === workspaceId) return; @@ -213,9 +223,12 @@ export function useChatPaneController({ ); return scopedOrUnscoped.length > 0 ? scopedOrUnscoped : allSessions; }, [allSessions, workspaceId]); - const hasCurrentSessionRecord = Boolean( - sessionId && sessions.some((item) => item.id === sessionId), - ); + const hasCurrentSessionRecord = isDesktopChatSessionReady({ + sessionId, + hasPersistedSession: Boolean( + sessionId && sessions.some((item) => item.id === sessionId), + ), + }); const [isSessionInitializing, setIsSessionInitializing] = useState(false); const hasCurrentSessionRecordRef = useRef(hasCurrentSessionRecord); const sessionInitScopeRef = useRef(null); @@ -430,8 +443,25 @@ export function useChatPaneController({ }, [handleNewChat, needsLegacySessionBootstrap, organizationId]); const sessionItems = useMemo( - () => sessions.map((item) => toSessionSelectorItem(item)), - [sessions], + () => { + const nextItems = sessions.map((item) => toSessionSelectorItem(item)); + if ( + !isDesktopChatDevMode() || + !sessionId || + nextItems.some((item) => item.sessionId === sessionId) + ) { + return nextItems; + } + return [ + { + sessionId, + title: "", + updatedAt: new Date(), + }, + ...nextItems, + ]; + }, + [sessionId, sessions], ); const consumeLaunchConfig = useCallback(() => { From 9bcb5e69fb94b56ae250a7d8fe515433273595ff Mon Sep 17 00:00:00 2001 From: Kiet Ho Date: Sat, 28 Mar 2026 12:31:06 -0700 Subject: [PATCH 2/2] lint --- .../useWorkspaceChatController.ts | 39 +++++++++---------- .../useChatPaneController.ts | 39 +++++++++---------- bun.lock | 8 +--- 3 files changed, 37 insertions(+), 49 deletions(-) diff --git a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/WorkspaceChat/hooks/useWorkspaceChatController/useWorkspaceChatController.ts b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/WorkspaceChat/hooks/useWorkspaceChatController/useWorkspaceChatController.ts index 50c0bc0ac13..8282debbfe8 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/WorkspaceChat/hooks/useWorkspaceChatController/useWorkspaceChatController.ts +++ b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/WorkspaceChat/hooks/useWorkspaceChatController/useWorkspaceChatController.ts @@ -148,27 +148,24 @@ export function useWorkspaceChatController({ return nextSessionId; }, [onSessionIdChange, organizationId, sessionId, sessions, workspaceId]); - const sessionItems = useMemo( - () => { - const nextItems = sessions.map((item) => toSessionSelectorItem(item)); - if ( - !isDesktopChatDevMode() || - !sessionId || - nextItems.some((item) => item.sessionId === sessionId) - ) { - return nextItems; - } - return [ - { - sessionId, - title: "", - updatedAt: new Date(), - }, - ...nextItems, - ]; - }, - [sessionId, sessions], - ); + const sessionItems = useMemo(() => { + const nextItems = sessions.map((item) => toSessionSelectorItem(item)); + if ( + !isDesktopChatDevMode() || + !sessionId || + nextItems.some((item) => item.sessionId === sessionId) + ) { + return nextItems; + } + return [ + { + sessionId, + title: "", + updatedAt: new Date(), + }, + ...nextItems, + ]; + }, [sessionId, sessions]); return { sessionId, diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ChatPane/hooks/useChatPaneController/useChatPaneController.ts b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ChatPane/hooks/useChatPaneController/useChatPaneController.ts index c06afbcfc63..65cdd891823 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ChatPane/hooks/useChatPaneController/useChatPaneController.ts +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/TabView/ChatPane/hooks/useChatPaneController/useChatPaneController.ts @@ -442,27 +442,24 @@ export function useChatPaneController({ }); }, [handleNewChat, needsLegacySessionBootstrap, organizationId]); - const sessionItems = useMemo( - () => { - const nextItems = sessions.map((item) => toSessionSelectorItem(item)); - if ( - !isDesktopChatDevMode() || - !sessionId || - nextItems.some((item) => item.sessionId === sessionId) - ) { - return nextItems; - } - return [ - { - sessionId, - title: "", - updatedAt: new Date(), - }, - ...nextItems, - ]; - }, - [sessionId, sessions], - ); + const sessionItems = useMemo(() => { + const nextItems = sessions.map((item) => toSessionSelectorItem(item)); + if ( + !isDesktopChatDevMode() || + !sessionId || + nextItems.some((item) => item.sessionId === sessionId) + ) { + return nextItems; + } + return [ + { + sessionId, + title: "", + updatedAt: new Date(), + }, + ...nextItems, + ]; + }, [sessionId, sessions]); const consumeLaunchConfig = useCallback(() => { setChatLaunchConfig(paneId, null); diff --git a/bun.lock b/bun.lock index 5a792dc7516..6e11476d3c4 100644 --- a/bun.lock +++ b/bun.lock @@ -110,7 +110,7 @@ }, "apps/desktop": { "name": "@superset/desktop", - "version": "1.4.0", + "version": "1.4.3", "dependencies": { "@ai-sdk/anthropic": "^3.0.43", "@ai-sdk/openai": "3.0.36", @@ -779,10 +779,6 @@ "react": "19.2.0", }, }, - "packages/scripts": { - "name": "@superset/scripts", - "version": "0.1.0", - }, "packages/shared": { "name": "@superset/shared", "version": "0.1.0", @@ -2342,8 +2338,6 @@ "@superset/pane-layout": ["@superset/pane-layout@workspace:packages/pane-layout"], - "@superset/scripts": ["@superset/scripts@workspace:packages/scripts"], - "@superset/shared": ["@superset/shared@workspace:packages/shared"], "@superset/trpc": ["@superset/trpc@workspace:packages/trpc"],