diff --git a/CHANGELOG.md b/CHANGELOG.md index f07f13fb..d1607d81 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ - Update `/openDevContainer` to support all dev container features when hostPath and configFile are provided. +- Fix opening a workspace restores the VS Code session (files, tabs, context) + of the selected agent. ## [v1.9.2](https://github.com/coder/vscode-coder/releases/tag/v1.9.2) 2025-06-25 diff --git a/src/commands.ts b/src/commands.ts index d6734376..51965be6 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -436,12 +436,15 @@ export class Commands { if (!baseUrl) { throw new Error("You are not logged in"); } + if (treeItem.primaryAgentName === undefined) { + return; + } await openWorkspace( baseUrl, treeItem.workspaceOwner, treeItem.workspaceName, - treeItem.workspaceAgent, - treeItem.workspaceFolderPath, + treeItem.primaryAgentName, + treeItem.primaryAgentFolderPath, true, ); } else { @@ -524,6 +527,8 @@ export class Commands { let folderPath: string | undefined; let openRecent: boolean | undefined; + let workspace: Workspace | undefined; + const baseUrl = this.restClient.getAxiosInstance().defaults.baseURL; if (!baseUrl) { throw new Error("You are not logged in"); @@ -570,7 +575,7 @@ export class Commands { }); }); quickPick.show(); - const workspace = await new Promise((resolve) => { + workspace = await new Promise((resolve) => { quickPick.onDidHide(() => { resolve(undefined); }); @@ -589,20 +594,31 @@ export class Commands { } workspaceOwner = workspace.owner_name; workspaceName = workspace.name; + } else { + workspaceOwner = args[0] as string; + workspaceName = args[1] as string; + workspaceAgent = args[2] as string | undefined; + folderPath = args[3] as string | undefined; + openRecent = args[4] as boolean | undefined; + } + + if (!workspaceAgent) { + if (workspace === undefined) { + workspace = await this.restClient.getWorkspaceByOwnerAndName( + workspaceOwner, + workspaceName, + ); + } const agent = await this.maybeAskAgent(workspace); if (!agent) { // User declined to pick an agent. return; } - folderPath = agent.expanded_directory; + if (!folderPath) { + folderPath = agent.expanded_directory; + } workspaceAgent = agent.name; - } else { - workspaceOwner = args[0] as string; - workspaceName = args[1] as string; - workspaceAgent = args[2] as string | undefined; - folderPath = args[3] as string | undefined; - openRecent = args[4] as boolean | undefined; } await openWorkspace( @@ -677,7 +693,7 @@ async function openWorkspace( baseUrl: string, workspaceOwner: string, workspaceName: string, - workspaceAgent: string | undefined, + workspaceAgent: string, folderPath: string | undefined, openRecent: boolean | undefined, ) { diff --git a/src/workspacesProvider.ts b/src/workspacesProvider.ts index a77b31ad..b8a16fef 100644 --- a/src/workspacesProvider.ts +++ b/src/workspacesProvider.ts @@ -436,8 +436,8 @@ export class OpenableTreeItem extends vscode.TreeItem { public readonly workspaceOwner: string, public readonly workspaceName: string, - public readonly workspaceAgent: string | undefined, - public readonly workspaceFolderPath: string | undefined, + public readonly primaryAgentName: string | undefined, + public readonly primaryAgentFolderPath: string | undefined, contextValue: CoderOpenableTreeItemType, ) { @@ -476,7 +476,7 @@ class AgentTreeItem extends OpenableTreeItem { } } -export class WorkspaceTreeItem extends OpenableTreeItem { +class WorkspaceTreeItem extends OpenableTreeItem { public appStatus: { name: string; url?: string; @@ -509,7 +509,7 @@ export class WorkspaceTreeItem extends OpenableTreeItem { : vscode.TreeItemCollapsibleState.Expanded, workspace.owner_name, workspace.name, - undefined, + agents[0]?.name, agents[0]?.expanded_directory, agents.length > 1 ? "coderWorkspaceMultipleAgents"