import type { WorkspaceTabTarget } from "@/stores/workspace-tabs-store"; export function normalizeWorkspaceTabTarget( value: WorkspaceTabTarget | null | undefined, ): WorkspaceTabTarget | null { if (!value || typeof value !== "object" || typeof value.kind !== "string") { return null; } if (value.kind === "draft") { const draftId = trimNonEmpty(value.draftId); return draftId ? { kind: "draft", draftId } : null; } if (value.kind === "agent") { const agentId = trimNonEmpty(value.agentId); return agentId ? { kind: "agent", agentId } : null; } if (value.kind === "terminal") { const terminalId = trimNonEmpty(value.terminalId); return terminalId ? { kind: "terminal", terminalId } : null; } if (value.kind === "file") { const path = trimNonEmpty(value.path); return path ? { kind: "file", path: path.replace(/\\/g, "/") } : null; } if (value.kind === "setup") { const workspaceId = trimNonEmpty(value.workspaceId); return workspaceId ? { kind: "setup", workspaceId } : null; } return null; } export function workspaceTabTargetsEqual( left: WorkspaceTabTarget, right: WorkspaceTabTarget, ): boolean { if (left.kind !== right.kind) { return false; } if (left.kind === "draft" && right.kind === "draft") { return left.draftId === right.draftId; } if (left.kind === "agent" && right.kind === "agent") { return left.agentId === right.agentId; } if (left.kind === "terminal" && right.kind === "terminal") { return left.terminalId === right.terminalId; } if (left.kind === "file" && right.kind === "file") { return left.path === right.path; } if (left.kind === "setup" && right.kind === "setup") { return left.workspaceId === right.workspaceId; } return false; } export function buildDeterministicWorkspaceTabId(target: WorkspaceTabTarget): string { if (target.kind === "draft") { return target.draftId; } if (target.kind === "agent") { return `agent_${target.agentId}`; } if (target.kind === "terminal") { return `terminal_${target.terminalId}`; } if (target.kind === "setup") { return `setup_${target.workspaceId}`; } return `file_${target.path}`; } function trimNonEmpty(value: string | null | undefined): string | null { if (typeof value !== "string") { return null; } const trimmed = value.trim(); return trimmed.length > 0 ? trimmed : null; }