diff --git a/packages/app/src/workspace-pins/launch.tsx b/packages/app/src/workspace-pins/launch.tsx index f4e369bf5..2bdd561ba 100644 --- a/packages/app/src/workspace-pins/launch.tsx +++ b/packages/app/src/workspace-pins/launch.tsx @@ -7,9 +7,14 @@ import { resolveTerminalProfiles, } from "@getpaseo/protocol/terminal-profiles"; import { getProviderIcon } from "@/components/provider-icons"; +import { getIsElectron } from "@/constants/platform"; import { useDaemonConfig } from "@/hooks/use-daemon-config"; import type { Theme } from "@/styles/theme"; -import { pinnedTargetKey, type PinnedTabTarget } from "@/workspace-pins/target"; +import { + isPinnedTargetAvailable, + pinnedTargetKey, + type PinnedTabTarget, +} from "@/workspace-pins/target"; import { usePinnedTargetsStore } from "@/workspace-pins/store"; export interface ResolvedPin { @@ -64,6 +69,9 @@ export function usePinnedLaunchers({ serverId, onLaunch }: UsePinnedLaunchersInp return useMemo(() => { const resolved: ResolvedPin[] = []; for (const target of pinned) { + if (!isPinnedTargetAvailable(target, { isElectron: getIsElectron() })) { + continue; + } if (target.kind === "draft") { resolved.push({ key: pinnedTargetKey(target), diff --git a/packages/app/src/workspace-pins/target.test.ts b/packages/app/src/workspace-pins/target.test.ts index d9d5b11d6..6e9c39ded 100644 --- a/packages/app/src/workspace-pins/target.test.ts +++ b/packages/app/src/workspace-pins/target.test.ts @@ -1,5 +1,29 @@ import { describe, expect, it } from "vitest"; -import { isTargetPinned, pinnedTargetKey, togglePinnedTarget } from "./target"; +import { + isPinnedTargetAvailable, + isTargetPinned, + pinnedTargetKey, + togglePinnedTarget, +} from "./target"; + +describe("isPinnedTargetAvailable", () => { + it("only offers browser targets in Electron", () => { + const browser = { kind: "browser" } as const; + + expect(isPinnedTargetAvailable(browser, { isElectron: true })).toBe(true); + expect(isPinnedTargetAvailable(browser, { isElectron: false })).toBe(false); + }); + + it("offers cross-platform targets outside Electron", () => { + const environment = { isElectron: false }; + + expect(isPinnedTargetAvailable({ kind: "draft" }, environment)).toBe(true); + expect(isPinnedTargetAvailable({ kind: "terminal" }, environment)).toBe(true); + expect(isPinnedTargetAvailable({ kind: "profile", profileId: "claude" }, environment)).toBe( + true, + ); + }); +}); describe("pinnedTargetKey", () => { it("uses the bare kind as the key for non-profile targets", () => { diff --git a/packages/app/src/workspace-pins/target.ts b/packages/app/src/workspace-pins/target.ts index 2593c985e..6330f8302 100644 --- a/packages/app/src/workspace-pins/target.ts +++ b/packages/app/src/workspace-pins/target.ts @@ -4,6 +4,13 @@ export type PinnedTabTarget = | { kind: "browser" } | { kind: "profile"; profileId: string }; +export function isPinnedTargetAvailable( + target: PinnedTabTarget, + environment: { isElectron: boolean }, +): boolean { + return target.kind !== "browser" || environment.isElectron; +} + export function pinnedTargetKey(target: PinnedTabTarget): string { if (target.kind === "profile") { return `profile:${target.profileId}`;