Skip to content

Commit c7001d5

Browse files
committed
separate metadata and tasks
1 parent b2f6bb8 commit c7001d5

File tree

2 files changed

+41
-13
lines changed

2 files changed

+41
-13
lines changed

src/api.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { AxiosInstance } from "axios"
22
import { spawn } from "child_process"
33
import { Api } from "coder/site/src/api/api"
4-
import { ProvisionerJobLog, Workspace, WorkspaceAgent, WorkspaceAgentTask } from "coder/site/src/api/typesGenerated"
4+
import { ProvisionerJobLog, Workspace } from "coder/site/src/api/typesGenerated"
55
import { FetchLikeInit } from "eventsource"
66
import fs from "fs/promises"
77
import { ProxyAgent } from "proxy-agent"

src/workspacesProvider.ts

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ export class WorkspaceProvider implements vscode.TreeDataProvider<vscode.TreeIte
158158
// Fetch AI tasks for the workspace
159159
try {
160160
// Create a dummy emitter for logs
161-
const emitter = new vscode.EventEmitter<string>()
161+
const _emitter = new vscode.EventEmitter<string>()
162162
} catch (error) {
163163
// Log the error but continue - we don't want to fail the whole tree if AI tasks fail
164164
this.storage.writeToCoderOutputChannel(
@@ -236,18 +236,33 @@ export class WorkspaceProvider implements vscode.TreeDataProvider<vscode.TreeIte
236236
if (watcher?.error) {
237237
return Promise.resolve([new ErrorTreeItem(watcher.error)])
238238
}
239-
239+
240240
const items: vscode.TreeItem[] = []
241-
242-
// Add AI tasks first, if the agent has any associated tasks
243-
const agentTasks = element.agent.tasks.map((task) => new AITaskTreeItem(task))
244-
items.push(...agentTasks)
245-
246-
// Add agent metadata
241+
242+
// Add AI tasks section with collapsible header
243+
if (element.agent.tasks.length > 0) {
244+
const aiTasksSection = new SectionTreeItem(
245+
"AI Tasks",
246+
element.agent.tasks.map((task) => new AITaskTreeItem(task)),
247+
)
248+
items.push(aiTasksSection)
249+
}
250+
247251
const savedMetadata = watcher?.metadata || []
248-
items.push(...savedMetadata.map((metadata) => new AgentMetadataTreeItem(metadata)))
249-
252+
253+
// Add agent metadata section with collapsible header
254+
if (savedMetadata.length > 0) {
255+
const metadataSection = new SectionTreeItem(
256+
"Agent Metadata",
257+
savedMetadata.map((metadata) => new AgentMetadataTreeItem(metadata)),
258+
)
259+
items.push(metadataSection)
260+
}
261+
250262
return Promise.resolve(items)
263+
} else if (element instanceof SectionTreeItem) {
264+
// Return the children of the section
265+
return Promise.resolve(element.children)
251266
}
252267

253268
return Promise.resolve([])
@@ -298,6 +313,19 @@ function monitorMetadata(agentId: WorkspaceAgent["id"], restClient: Api): AgentW
298313
return watcher
299314
}
300315

316+
/**
317+
* A tree item that represents a collapsible section with child items
318+
*/
319+
class SectionTreeItem extends vscode.TreeItem {
320+
constructor(
321+
label: string,
322+
public readonly children: vscode.TreeItem[],
323+
) {
324+
super(label, vscode.TreeItemCollapsibleState.Expanded)
325+
this.contextValue = "coderSectionHeader"
326+
}
327+
}
328+
301329
class ErrorTreeItem extends vscode.TreeItem {
302330
constructor(error: unknown) {
303331
super("Failed to query metadata: " + errToStr(error, "no error provided"), vscode.TreeItemCollapsibleState.None)
@@ -382,13 +410,13 @@ class AgentTreeItem extends OpenableTreeItem {
382410
)
383411

384412
if (agent.task_waiting_for_user_input) {
385-
this.label = "🙋 " + this.label;
413+
this.label = "🙋 " + this.label
386414
}
387415
}
388416
}
389417

390418
export class WorkspaceTreeItem extends OpenableTreeItem {
391-
public aiTasks: {waiting: boolean, tasks: WorkspaceAgentTask[]}[] = []
419+
public aiTasks: { waiting: boolean; tasks: WorkspaceAgentTask[] }[] = []
392420

393421
constructor(
394422
public readonly workspace: Workspace,

0 commit comments

Comments
 (0)