返回 DeepSeek-Reasonix
bridgeMockSessionNavigation.ts
根目录 / desktop / frontend / src / lib / bridgeMockSessionNavigation.ts
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
29 lines TYPESCRIPT