| 1 | import type { SessionRef } from "../generated/desktopContract.generated"; |
| 2 | import type { ProjectNode, TabMeta } from "./types"; |
| 3 | |
| 4 | const children = (node: ProjectNode): ProjectNode[] => Array.isArray(node.children) ? node.children : []; |
| 5 | const sessionIdForNode = (node: ProjectNode) => (node.session?.sessionId || node.topicId || node.key || "mock-session").replace(/[^a-zA-Z0-9._-]/g, "-"); |
| 6 | const workspaceIdForNode = (node: ProjectNode) => node.kind === "global_folder" ? "global" : `project-${(node.root || node.key).replace(/[^a-zA-Z0-9._-]/g, "-")}`; |
| 7 | |
| 8 | /** Mirror the desktop SessionRef contract: resolve by id and rebind one existing tab in place. */ |
| 9 | export function rebindMockSessionTab( |
| 10 | ref: SessionRef, |
| 11 | tab: TabMeta | undefined, |
| 12 | tree: ProjectNode[], |
| 13 | globalWorkspaceRoot: string, |
| 14 | isRunning: (topicId: string) => boolean, |
| 15 | ): TabMeta { |
| 16 | if (!tab) throw new Error("mock workspace is not ready"); |
| 17 | const parent = tree.find((candidate) => children(candidate).some((node) => sessionIdForNode(node) === ref.sessionId)); |
| 18 | const node = parent && children(parent).find((candidate) => sessionIdForNode(candidate) === ref.sessionId); |
| 19 | if (!parent || !node?.topicId) throw new Error(`mock session not found: ${ref.sessionId}`); |
| 20 | const scope = parent.kind === "global_folder" ? "global" : "project"; |
| 21 | const workspaceRoot = parent.root || (scope === "global" ? globalWorkspaceRoot : ""); |
| 22 | return { |
| 23 | ...tab, scope, workspaceRoot, workspaceId: workspaceIdForNode(parent), workspaceName: parent.label, workspacePath: workspaceRoot, |
| 24 | topicId: node.topicId, topicTitle: node.label.replace(/^●\s*/, ""), sessionPath: node.sessionPath || `/mock/sessions/${node.topicId}.jsonl`, |
| 25 | sessionId: ref.sessionId, session: ref, projectColor: node.projectColor || parent.projectColor, |
| 26 | ready: true, running: isRunning(node.topicId), active: true, cwd: workspaceRoot, |
| 27 | }; |
| 28 | } |
| 29 |