返回 DeepSeek-Reasonix
sessionOrganization.ts
根目录 / desktop / frontend / src / lib / sessionOrganization.ts
1 import type { SessionOrganizationMutation, SessionOrganizationSnapshot, SessionOrganizationWorkspace, SessionSelector } from "../generated/desktopContract.generated";
2 import type { ProjectNode, ProjectTreeOrganizationBindings } from "./types";
3
4 export function projectNodeSelector(node: ProjectNode): SessionSelector {
5 const remote = node.remoteSession;
6 if (remote) return remote.sessionId ? { ref: { hostId: remote.hostId, sessionId: remote.sessionId } }
7 : { source: { hostId: remote.hostId, path: remote.path || remote.name } };
8 return { ref: node.session, source: node.source, sessionPath: node.sessionPath };
9 }
10
11 export async function mutateSessionOrganization(bindings: ProjectTreeOrganizationBindings, workspace: SessionOrganizationWorkspace,
12 mutation: SessionOrganizationMutation): Promise<SessionOrganizationSnapshot> {
13 if (!bindings.GetSessionOrganization || !bindings.UpdateSessionOrganization) throw new Error("Session organization is unavailable. Upgrade the desktop service.");
14 let snapshot = await bindings.GetSessionOrganization(workspace);
15 for (let attempt = 0; attempt < 3; attempt++) {
16 snapshot = await bindings.UpdateSessionOrganization(workspace, snapshot.revision, mutation);
17 if (snapshot.applied) return snapshot;
18 }
19 throw new Error("Session organization changed in another window. Please retry.");
20 }
21
21 lines TYPESCRIPT