@@ -158,7 +158,7 @@ export class WorkspaceProvider implements vscode.TreeDataProvider<vscode.TreeIte
158
158
// Fetch AI tasks for the workspace
159
159
try {
160
160
// Create a dummy emitter for logs
161
- const emitter = new vscode . EventEmitter < string > ( )
161
+ const _emitter = new vscode . EventEmitter < string > ( )
162
162
} catch ( error ) {
163
163
// Log the error but continue - we don't want to fail the whole tree if AI tasks fail
164
164
this . storage . writeToCoderOutputChannel (
@@ -236,18 +236,33 @@ export class WorkspaceProvider implements vscode.TreeDataProvider<vscode.TreeIte
236
236
if ( watcher ?. error ) {
237
237
return Promise . resolve ( [ new ErrorTreeItem ( watcher . error ) ] )
238
238
}
239
-
239
+
240
240
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
+
247
251
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
+
250
262
return Promise . resolve ( items )
263
+ } else if ( element instanceof SectionTreeItem ) {
264
+ // Return the children of the section
265
+ return Promise . resolve ( element . children )
251
266
}
252
267
253
268
return Promise . resolve ( [ ] )
@@ -298,6 +313,19 @@ function monitorMetadata(agentId: WorkspaceAgent["id"], restClient: Api): AgentW
298
313
return watcher
299
314
}
300
315
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
+
301
329
class ErrorTreeItem extends vscode . TreeItem {
302
330
constructor ( error :unknown ) {
303
331
super ( "Failed to query metadata: " + errToStr ( error , "no error provided" ) , vscode . TreeItemCollapsibleState . None )
@@ -382,13 +410,13 @@ class AgentTreeItem extends OpenableTreeItem {
382
410
)
383
411
384
412
if ( agent . task_waiting_for_user_input ) {
385
- this . label = "🙋 " + this . label ;
413
+ this . label = "🙋 " + this . label
386
414
}
387
415
}
388
416
}
389
417
390
418
export class WorkspaceTreeItem extends OpenableTreeItem {
391
- public aiTasks :{ waiting :boolean , tasks :WorkspaceAgentTask [ ] } [ ] = [ ]
419
+ public aiTasks :{ waiting :boolean ; tasks :WorkspaceAgentTask [ ] } [ ] = [ ]
392
420
393
421
constructor (
394
422
public readonly workspace :Workspace ,