Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/test/browser/componentFixtures/sessions/agentSessionsViewer.fixture.ts
13405 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { URI } from '../../../../../base/common/uri.js';
7
import { Codicon } from '../../../../../base/common/codicons.js';
8
import { MarkdownString } from '../../../../../base/common/htmlContent.js';
9
import { mock } from '../../../../../base/test/common/mock.js';
10
import { FuzzyScore } from '../../../../../base/common/filters.js';
11
import { ITreeNode } from '../../../../../base/browser/ui/tree/tree.js';
12
import { observableValue } from '../../../../../base/common/observable.js';
13
import { Event } from '../../../../../base/common/event.js';
14
import { IMarkdownRendererService, MarkdownRendererService } from '../../../../../platform/markdown/browser/markdownRenderer.js';
15
import { IProductService } from '../../../../../platform/product/common/productService.js';
16
import { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';
17
import { TestConfigurationService } from '../../../../../platform/configuration/test/common/testConfigurationService.js';
18
import { EditorMarkdownCodeBlockRenderer } from '../../../../../editor/browser/widget/markdownRenderer/browser/editorMarkdownCodeBlockRenderer.js';
19
import { AgentSessionRenderer, AgentSessionSectionRenderer, IAgentSessionRendererOptions } from '../../../../contrib/chat/browser/agentSessions/agentSessionsViewer.js';
20
import { IChatSessionsService } from '../../../../contrib/chat/common/chatSessionsService.js';
21
import { AgentSessionStatus, IAgentSession, AgentSessionSection, IAgentSessionSection } from '../../../../contrib/chat/browser/agentSessions/agentSessionsModel.js';
22
import { AgentSessionProviders } from '../../../../contrib/chat/browser/agentSessions/agentSessions.js';
23
import { AgentSessionApprovalModel, IAgentSessionApprovalInfo } from '../../../../contrib/chat/browser/agentSessions/agentSessionApprovalModel.js';
24
import { HoverPosition } from '../../../../../base/browser/ui/hover/hoverWidget.js';
25
import { ComponentFixtureContext, createEditorServices, defineComponentFixture, defineThemedFixtureGroup, registerWorkbenchServices } from '../fixtureUtils.js';
26
27
import '../../../../contrib/chat/browser/agentSessions/media/agentsessionsviewer.css';
28
29
// ============================================================================
30
// Mock helpers
31
// ============================================================================
32
33
function createMockSession(overrides: Partial<IAgentSession> & { label: string; status: AgentSessionStatus; providerType: string }): IAgentSession {
34
const now = Date.now();
35
return new class extends mock<IAgentSession>() {
36
override readonly resource = overrides.resource ?? URI.parse(`vscode-chat-session://${overrides.providerType}/session-${Math.random().toString(36).slice(2)}`);
37
override readonly label = overrides.label;
38
override readonly status = overrides.status;
39
override readonly providerType = overrides.providerType;
40
override readonly providerLabel = overrides.providerLabel ?? overrides.providerType;
41
override readonly icon = overrides.icon ?? Codicon.vm;
42
override readonly badge = overrides.badge;
43
override readonly description = overrides.description;
44
override readonly tooltip = overrides.tooltip;
45
override readonly changes = overrides.changes;
46
override readonly timing = overrides.timing ?? {
47
created: now - 60 * 60 * 1000,
48
lastRequestStarted: undefined,
49
lastRequestEnded: undefined,
50
};
51
override isArchived(): boolean { return overrides.isArchived?.() ?? false; }
52
override setArchived(): void { }
53
override isPinned(): boolean { return overrides.isPinned?.() ?? false; }
54
override setPinned(): void { }
55
override isRead(): boolean { return overrides.isRead?.() ?? true; }
56
override isMarkedUnread(): boolean { return false; }
57
override setRead(): void { }
58
}();
59
}
60
61
function wrapAsTreeNode<T>(element: T): ITreeNode<T, FuzzyScore> {
62
return {
63
element,
64
children: [],
65
depth: 0,
66
visibleChildrenCount: 0,
67
visibleChildIndex: 0,
68
collapsible: false,
69
collapsed: false,
70
visible: true,
71
filterData: undefined,
72
};
73
}
74
75
const rendererOptions: IAgentSessionRendererOptions = {
76
disableHover: true,
77
getHoverPosition: () => HoverPosition.BELOW,
78
};
79
80
// ============================================================================
81
// Render helpers
82
// ============================================================================
83
84
function createMockApprovalModel(sessionResource: URI, info: IAgentSessionApprovalInfo): AgentSessionApprovalModel {
85
const obs = observableValue<IAgentSessionApprovalInfo | undefined>('mockApproval', info);
86
return new class extends mock<AgentSessionApprovalModel>() {
87
override getApproval(resource: URI) {
88
if (resource.toString() === sessionResource.toString()) {
89
return obs;
90
}
91
return observableValue<IAgentSessionApprovalInfo | undefined>('mockApproval.empty', undefined);
92
}
93
}();
94
}
95
96
function renderSessionItem(ctx: ComponentFixtureContext, session: IAgentSession, approvalModel?: AgentSessionApprovalModel): void {
97
const { container, disposableStore } = ctx;
98
99
const instantiationService = createEditorServices(disposableStore, {
100
colorTheme: ctx.theme,
101
additionalServices: (reg) => {
102
registerWorkbenchServices(reg);
103
reg.define(IMarkdownRendererService, MarkdownRendererService);
104
reg.defineInstance(IProductService, new class extends mock<IProductService>() {
105
override readonly urlProtocol = 'vscode';
106
}());
107
reg.defineInstance(IChatSessionsService, new class extends mock<IChatSessionsService>() {
108
override readonly onDidChangeItemsProviders = Event.None;
109
override readonly onDidChangeSessionItems = Event.None;
110
override readonly onDidChangeAvailability = Event.None;
111
override readonly onDidChangeInProgress = Event.None;
112
override async resolveChatSessionItem() { return undefined; }
113
}());
114
},
115
});
116
117
const configService = instantiationService.get(IConfigurationService) as TestConfigurationService;
118
configService.setUserConfiguration('editor', { fontFamily: 'monospace' });
119
const markdownRendererService = instantiationService.get(IMarkdownRendererService);
120
markdownRendererService.setDefaultCodeBlockRenderer(instantiationService.createInstance(EditorMarkdownCodeBlockRenderer));
121
122
const renderer = disposableStore.add(
123
instantiationService.createInstance(AgentSessionRenderer, rendererOptions, approvalModel ?? undefined, observableValue<URI | undefined>('activeSessionResource', undefined))
124
);
125
126
container.style.width = '350px';
127
container.style.height = 'auto';
128
container.style.backgroundColor = 'var(--vscode-sideBar-background)';
129
container.classList.add('agent-sessions-viewer');
130
131
const listRow = document.createElement('div');
132
listRow.classList.add('monaco-list-row');
133
listRow.style.position = 'relative';
134
container.appendChild(listRow);
135
136
const template = renderer.renderTemplate(listRow);
137
renderer.renderElement(wrapAsTreeNode(session), 0, template);
138
}
139
140
function renderSectionItem(ctx: ComponentFixtureContext, section: IAgentSessionSection): void {
141
const { container, disposableStore } = ctx;
142
143
const instantiationService = createEditorServices(disposableStore, {
144
colorTheme: ctx.theme,
145
additionalServices: (reg) => {
146
registerWorkbenchServices(reg);
147
},
148
});
149
150
const renderer = instantiationService.createInstance(AgentSessionSectionRenderer, {});
151
152
container.style.width = '350px';
153
container.style.height = 'auto';
154
container.style.backgroundColor = 'var(--vscode-sideBar-background)';
155
container.classList.add('agent-sessions-viewer');
156
157
const listRow = document.createElement('div');
158
listRow.classList.add('monaco-list-row');
159
listRow.style.position = 'relative';
160
container.appendChild(listRow);
161
162
const template = renderer.renderTemplate(listRow);
163
renderer.renderElement(wrapAsTreeNode(section), 0, template);
164
}
165
166
// ============================================================================
167
// Fixtures
168
// ============================================================================
169
170
const now = Date.now();
171
172
export default defineThemedFixtureGroup({
173
174
// --- Status variants ---
175
176
CompletedRead: defineComponentFixture({
177
render: (ctx) => renderSessionItem(ctx, createMockSession({
178
label: 'Refactor auth middleware',
179
status: AgentSessionStatus.Completed,
180
providerType: AgentSessionProviders.Local,
181
timing: {
182
created: now - 2 * 60 * 60 * 1000,
183
lastRequestStarted: now - 2 * 60 * 60 * 1000,
184
lastRequestEnded: now - 2 * 60 * 60 * 1000 + 45 * 1000,
185
},
186
})),
187
}),
188
189
CompletedUnread: defineComponentFixture({
190
render: (ctx) => renderSessionItem(ctx, createMockSession({
191
label: 'Add unit tests for parser',
192
status: AgentSessionStatus.Completed,
193
providerType: AgentSessionProviders.Local,
194
isRead: () => false,
195
timing: {
196
created: now - 30 * 60 * 1000,
197
lastRequestStarted: now - 30 * 60 * 1000,
198
lastRequestEnded: now - 25 * 60 * 1000,
199
},
200
})),
201
}),
202
203
InProgress: defineComponentFixture({
204
render: (ctx) => renderSessionItem(ctx, createMockSession({
205
label: 'Implement dark mode toggle',
206
status: AgentSessionStatus.InProgress,
207
providerType: AgentSessionProviders.Local,
208
timing: {
209
created: now - 5 * 60 * 1000,
210
lastRequestStarted: now - 2 * 60 * 1000,
211
lastRequestEnded: undefined,
212
},
213
})),
214
}),
215
216
NeedsInput: defineComponentFixture({
217
render: (ctx) => renderSessionItem(ctx, createMockSession({
218
label: 'Fix CI pipeline configuration',
219
status: AgentSessionStatus.NeedsInput,
220
providerType: AgentSessionProviders.Local,
221
isRead: () => false,
222
timing: {
223
created: now - 10 * 60 * 1000,
224
lastRequestStarted: now - 8 * 60 * 1000,
225
lastRequestEnded: undefined,
226
},
227
})),
228
}),
229
230
FailedWithDuration: defineComponentFixture({
231
render: (ctx) => renderSessionItem(ctx, createMockSession({
232
label: 'Deploy staging environment',
233
status: AgentSessionStatus.Failed,
234
providerType: AgentSessionProviders.Local,
235
timing: {
236
created: now - 60 * 60 * 1000,
237
lastRequestStarted: now - 60 * 60 * 1000,
238
lastRequestEnded: now - 60 * 60 * 1000 + 3 * 60 * 1000,
239
},
240
})),
241
}),
242
243
FailedWithoutDuration: defineComponentFixture({
244
render: (ctx) => renderSessionItem(ctx, createMockSession({
245
label: 'Migrate database schema',
246
status: AgentSessionStatus.Failed,
247
providerType: AgentSessionProviders.Local,
248
timing: {
249
created: now - 3 * 60 * 60 * 1000,
250
lastRequestStarted: undefined,
251
lastRequestEnded: undefined,
252
},
253
})),
254
}),
255
256
// --- Content variants ---
257
258
WithDiffChanges: defineComponentFixture({
259
render: (ctx) => renderSessionItem(ctx, createMockSession({
260
label: 'Refactor settings page',
261
status: AgentSessionStatus.Completed,
262
providerType: AgentSessionProviders.Local,
263
changes: { files: 5, insertions: 142, deletions: 87 },
264
timing: {
265
created: now - 45 * 60 * 1000,
266
lastRequestStarted: now - 45 * 60 * 1000,
267
lastRequestEnded: now - 40 * 60 * 1000,
268
},
269
})),
270
}),
271
272
WithFileChangesList: defineComponentFixture({
273
render: (ctx) => renderSessionItem(ctx, createMockSession({
274
label: 'Update API endpoints',
275
status: AgentSessionStatus.Completed,
276
providerType: AgentSessionProviders.Background,
277
icon: Codicon.worktree,
278
changes: [
279
{ modifiedUri: URI.file('/src/api/routes.ts'), insertions: 25, deletions: 10 },
280
{ modifiedUri: URI.file('/src/api/handlers.ts'), insertions: 50, deletions: 30 },
281
{ modifiedUri: URI.file('/tests/api.test.ts'), insertions: 40, deletions: 5 },
282
],
283
timing: {
284
created: now - 2 * 60 * 60 * 1000,
285
lastRequestStarted: now - 2 * 60 * 60 * 1000,
286
lastRequestEnded: now - 90 * 60 * 1000,
287
},
288
})),
289
}),
290
291
WithBadge: defineComponentFixture({
292
render: (ctx) => renderSessionItem(ctx, createMockSession({
293
label: 'Optimize build pipeline',
294
status: AgentSessionStatus.Completed,
295
providerType: AgentSessionProviders.Local,
296
badge: 'PR #1234',
297
timing: {
298
created: now - 4 * 60 * 60 * 1000,
299
lastRequestStarted: now - 4 * 60 * 60 * 1000,
300
lastRequestEnded: now - 3.5 * 60 * 60 * 1000,
301
},
302
})),
303
}),
304
305
WithMarkdownBadge: defineComponentFixture({
306
render: (ctx) => renderSessionItem(ctx, createMockSession({
307
label: 'Review security patches',
308
status: AgentSessionStatus.Completed,
309
providerType: AgentSessionProviders.Cloud,
310
icon: Codicon.cloud,
311
badge: new MarkdownString('$(shield) Secure'),
312
timing: {
313
created: now - 6 * 60 * 60 * 1000,
314
lastRequestStarted: now - 6 * 60 * 60 * 1000,
315
lastRequestEnded: now - 5.5 * 60 * 60 * 1000,
316
},
317
})),
318
}),
319
320
WithDescription: defineComponentFixture({
321
render: (ctx) => renderSessionItem(ctx, createMockSession({
322
label: 'Upgrade dependencies',
323
status: AgentSessionStatus.Completed,
324
providerType: AgentSessionProviders.Local,
325
description: 'Updated 12 packages to latest versions',
326
timing: {
327
created: now - 24 * 60 * 60 * 1000,
328
lastRequestStarted: now - 24 * 60 * 60 * 1000,
329
lastRequestEnded: now - 23.5 * 60 * 60 * 1000,
330
},
331
})),
332
}),
333
334
WithMarkdownDescription: defineComponentFixture({
335
render: (ctx) => renderSessionItem(ctx, createMockSession({
336
label: 'Fix accessibility issues',
337
status: AgentSessionStatus.Completed,
338
providerType: AgentSessionProviders.Local,
339
description: new MarkdownString('$(check) All WCAG checks passed'),
340
timing: {
341
created: now - 48 * 60 * 60 * 1000,
342
lastRequestStarted: now - 48 * 60 * 60 * 1000,
343
lastRequestEnded: now - 47 * 60 * 60 * 1000,
344
},
345
})),
346
}),
347
348
WithBadgeAndDiff: defineComponentFixture({
349
render: (ctx) => renderSessionItem(ctx, createMockSession({
350
label: 'Implement search feature',
351
status: AgentSessionStatus.Completed,
352
providerType: AgentSessionProviders.Local,
353
badge: 'draft',
354
changes: { files: 8, insertions: 320, deletions: 45 },
355
timing: {
356
created: now - 3 * 60 * 60 * 1000,
357
lastRequestStarted: now - 3 * 60 * 60 * 1000,
358
lastRequestEnded: now - 2.5 * 60 * 60 * 1000,
359
},
360
})),
361
}),
362
363
// --- State variants ---
364
365
Archived: defineComponentFixture({
366
render: (ctx) => renderSessionItem(ctx, createMockSession({
367
label: 'Old migration script',
368
status: AgentSessionStatus.Completed,
369
providerType: AgentSessionProviders.Local,
370
isArchived: () => true,
371
timing: {
372
created: now - 7 * 24 * 60 * 60 * 1000,
373
lastRequestStarted: now - 7 * 24 * 60 * 60 * 1000,
374
lastRequestEnded: now - 7 * 24 * 60 * 60 * 1000 + 10 * 60 * 1000,
375
},
376
})),
377
}),
378
379
ArchivedUnread: defineComponentFixture({
380
render: (ctx) => renderSessionItem(ctx, createMockSession({
381
label: 'Archived unread task',
382
status: AgentSessionStatus.Completed,
383
providerType: AgentSessionProviders.Local,
384
isArchived: () => true,
385
isRead: () => false,
386
timing: {
387
created: now - 5 * 24 * 60 * 60 * 1000,
388
lastRequestStarted: now - 5 * 24 * 60 * 60 * 1000,
389
lastRequestEnded: now - 5 * 24 * 60 * 60 * 1000 + 5 * 60 * 1000,
390
},
391
})),
392
}),
393
394
// --- Provider-type variants ---
395
396
CloudProvider: defineComponentFixture({
397
render: (ctx) => renderSessionItem(ctx, createMockSession({
398
label: 'Generate API documentation',
399
status: AgentSessionStatus.Completed,
400
providerType: AgentSessionProviders.Cloud,
401
icon: Codicon.cloud,
402
timing: {
403
created: now - 90 * 60 * 1000,
404
lastRequestStarted: now - 90 * 60 * 1000,
405
lastRequestEnded: now - 80 * 60 * 1000,
406
},
407
})),
408
}),
409
410
BackgroundProvider: defineComponentFixture({
411
render: (ctx) => renderSessionItem(ctx, createMockSession({
412
label: 'Run linter across codebase',
413
status: AgentSessionStatus.Completed,
414
providerType: AgentSessionProviders.Background,
415
icon: Codicon.worktree,
416
timing: {
417
created: now - 120 * 60 * 1000,
418
lastRequestStarted: now - 120 * 60 * 1000,
419
lastRequestEnded: now - 110 * 60 * 1000,
420
},
421
})),
422
}),
423
424
ClaudeProvider: defineComponentFixture({
425
render: (ctx) => renderSessionItem(ctx, createMockSession({
426
label: 'Analyze code complexity',
427
status: AgentSessionStatus.Completed,
428
providerType: AgentSessionProviders.Claude,
429
icon: Codicon.claude,
430
timing: {
431
created: now - 150 * 60 * 1000,
432
lastRequestStarted: now - 150 * 60 * 1000,
433
lastRequestEnded: now - 140 * 60 * 1000,
434
},
435
})),
436
}),
437
438
CloudProviderInProgress: defineComponentFixture({
439
render: (ctx) => renderSessionItem(ctx, createMockSession({
440
label: 'Build integration tests',
441
status: AgentSessionStatus.InProgress,
442
providerType: AgentSessionProviders.Cloud,
443
icon: Codicon.cloud,
444
isRead: () => false,
445
timing: {
446
created: now - 10 * 60 * 1000,
447
lastRequestStarted: now - 3 * 60 * 1000,
448
lastRequestEnded: undefined,
449
},
450
})),
451
}),
452
453
// --- In-progress with description override ---
454
455
InProgressWithDescription: defineComponentFixture({
456
render: (ctx) => renderSessionItem(ctx, createMockSession({
457
label: 'Scaffold new microservice',
458
status: AgentSessionStatus.InProgress,
459
providerType: AgentSessionProviders.Background,
460
icon: Codicon.worktree,
461
description: 'Installing dependencies...',
462
timing: {
463
created: now - 5 * 60 * 1000,
464
lastRequestStarted: now - 60 * 1000,
465
lastRequestEnded: undefined,
466
},
467
})),
468
}),
469
470
// --- Section headers ---
471
472
SectionToday: defineComponentFixture({
473
render: (ctx) => renderSectionItem(ctx, {
474
section: AgentSessionSection.Today,
475
label: 'Today',
476
sessions: [],
477
}),
478
}),
479
480
SectionYesterday: defineComponentFixture({
481
render: (ctx) => renderSectionItem(ctx, {
482
section: AgentSessionSection.Yesterday,
483
label: 'Yesterday',
484
sessions: [],
485
}),
486
}),
487
488
SectionLastWeek: defineComponentFixture({
489
render: (ctx) => renderSectionItem(ctx, {
490
section: AgentSessionSection.Week,
491
label: 'Last 7 days',
492
sessions: [],
493
}),
494
}),
495
496
SectionOlder: defineComponentFixture({
497
render: (ctx) => renderSectionItem(ctx, {
498
section: AgentSessionSection.Older,
499
label: 'Older',
500
sessions: [],
501
}),
502
}),
503
504
SectionArchived: defineComponentFixture({
505
render: (ctx) => renderSectionItem(ctx, {
506
section: AgentSessionSection.Archived,
507
label: 'Archived',
508
sessions: [],
509
}),
510
}),
511
512
SectionMore: defineComponentFixture({
513
render: (ctx) => renderSectionItem(ctx, {
514
section: AgentSessionSection.More,
515
label: 'More',
516
sessions: [],
517
}),
518
}),
519
520
// --- Approval row variants ---
521
522
ApprovalRowJson: defineComponentFixture({
523
render: (ctx) => {
524
const resource = URI.parse('vscode-chat-session://local/approval-json');
525
const approvalModel = createMockApprovalModel(resource, {
526
label: '{ "action": "deleteFile", "path": "/src/old-module.ts" }',
527
languageId: 'json',
528
since: new Date(),
529
confirm: () => { },
530
});
531
renderSessionItem(ctx, createMockSession({
532
resource,
533
label: 'Clean up deprecated modules',
534
status: AgentSessionStatus.InProgress,
535
providerType: AgentSessionProviders.Local,
536
timing: {
537
created: now - 5 * 60 * 1000,
538
lastRequestStarted: now - 2 * 60 * 1000,
539
lastRequestEnded: undefined,
540
},
541
}), approvalModel);
542
},
543
}),
544
545
ApprovalRowBash: defineComponentFixture({
546
render: (ctx) => {
547
const resource = URI.parse('vscode-chat-session://local/approval-bash');
548
const approvalModel = createMockApprovalModel(resource, {
549
label: 'npm install --save express@latest',
550
languageId: 'sh',
551
since: new Date(),
552
confirm: () => { },
553
});
554
renderSessionItem(ctx, createMockSession({
555
resource,
556
label: 'Update server dependencies',
557
status: AgentSessionStatus.InProgress,
558
providerType: AgentSessionProviders.Local,
559
timing: {
560
created: now - 3 * 60 * 1000,
561
lastRequestStarted: now - 60 * 1000,
562
lastRequestEnded: undefined,
563
},
564
}), approvalModel);
565
},
566
}),
567
568
ApprovalRowPowerShell: defineComponentFixture({
569
render: (ctx) => {
570
const resource = URI.parse('vscode-chat-session://local/approval-powershell');
571
const approvalModel = createMockApprovalModel(resource, {
572
label: 'Start-Job -ScriptBlock { Set-Location \'c:\\some\\path\'; npm install } | Out-Null',
573
languageId: 'pwsh',
574
since: new Date(),
575
confirm: () => { },
576
});
577
renderSessionItem(ctx, createMockSession({
578
resource,
579
label: 'Clean up old log files',
580
status: AgentSessionStatus.InProgress,
581
providerType: AgentSessionProviders.Local,
582
timing: {
583
created: now - 4 * 60 * 1000,
584
lastRequestStarted: now - 2 * 60 * 1000,
585
lastRequestEnded: undefined,
586
},
587
}), approvalModel);
588
},
589
}),
590
591
ApprovalRowLongLabel: defineComponentFixture({
592
render: (ctx) => {
593
const resource = URI.parse('vscode-chat-session://local/approval-long');
594
const approvalModel = createMockApprovalModel(resource, {
595
label: 'rm -rf node_modules && npm cache clean --force && npm install --legacy-peer-deps --ignore-scripts',
596
languageId: 'sh',
597
since: new Date(),
598
confirm: () => { },
599
});
600
renderSessionItem(ctx, createMockSession({
601
resource,
602
label: 'Reset and reinstall all dependencies',
603
status: AgentSessionStatus.NeedsInput,
604
providerType: AgentSessionProviders.Cloud,
605
icon: Codicon.cloud,
606
isRead: () => false,
607
timing: {
608
created: now - 10 * 60 * 1000,
609
lastRequestStarted: now - 5 * 60 * 1000,
610
lastRequestEnded: undefined,
611
},
612
}), approvalModel);
613
},
614
}),
615
616
ApprovalRow1Line: defineComponentFixture({
617
render: (ctx) => {
618
const resource = URI.parse('vscode-chat-session://local/approval-1line');
619
const approvalModel = createMockApprovalModel(resource, {
620
label: 'npm install --save express@latest',
621
languageId: 'sh',
622
since: new Date(),
623
confirm: () => { },
624
});
625
renderSessionItem(ctx, createMockSession({
626
resource,
627
label: 'Install express',
628
status: AgentSessionStatus.InProgress,
629
providerType: AgentSessionProviders.Local,
630
timing: {
631
created: now - 3 * 60 * 1000,
632
lastRequestStarted: now - 60 * 1000,
633
lastRequestEnded: undefined,
634
},
635
}), approvalModel);
636
},
637
}),
638
639
ApprovalRow2Lines: defineComponentFixture({
640
render: (ctx) => {
641
const resource = URI.parse('vscode-chat-session://local/approval-2lines');
642
const approvalModel = createMockApprovalModel(resource, {
643
label: 'cd /workspace/project\nnpm install',
644
languageId: 'sh',
645
since: new Date(),
646
confirm: () => { },
647
});
648
renderSessionItem(ctx, createMockSession({
649
resource,
650
label: 'Setup project dependencies',
651
status: AgentSessionStatus.InProgress,
652
providerType: AgentSessionProviders.Local,
653
timing: {
654
created: now - 3 * 60 * 1000,
655
lastRequestStarted: now - 60 * 1000,
656
lastRequestEnded: undefined,
657
},
658
}), approvalModel);
659
},
660
}),
661
662
ApprovalRow3Lines: defineComponentFixture({
663
render: (ctx) => {
664
const resource = URI.parse('vscode-chat-session://local/approval-3lines');
665
const approvalModel = createMockApprovalModel(resource, {
666
label: 'cd /workspace/project\nnpm install\nnpm run build',
667
languageId: 'sh',
668
since: new Date(),
669
confirm: () => { },
670
});
671
renderSessionItem(ctx, createMockSession({
672
resource,
673
label: 'Build the project',
674
status: AgentSessionStatus.InProgress,
675
providerType: AgentSessionProviders.Local,
676
timing: {
677
created: now - 2 * 60 * 1000,
678
lastRequestStarted: now - 60 * 1000,
679
lastRequestEnded: undefined,
680
},
681
}), approvalModel);
682
},
683
}),
684
685
ApprovalRow4Lines: defineComponentFixture({
686
render: (ctx) => {
687
const resource = URI.parse('vscode-chat-session://local/approval-4lines');
688
const approvalModel = createMockApprovalModel(resource, {
689
label: 'cd /workspace/project\nnpm install\nnpm run build\nnpm run test -- --coverage',
690
languageId: 'sh',
691
since: new Date(),
692
confirm: () => { },
693
});
694
renderSessionItem(ctx, createMockSession({
695
resource,
696
label: 'Build and test project',
697
status: AgentSessionStatus.InProgress,
698
providerType: AgentSessionProviders.Local,
699
timing: {
700
created: now - 2 * 60 * 1000,
701
lastRequestStarted: now - 60 * 1000,
702
lastRequestEnded: undefined,
703
},
704
}), approvalModel);
705
},
706
}),
707
708
ApprovalRow3LongLines: defineComponentFixture({
709
render: (ctx) => {
710
const resource = URI.parse('vscode-chat-session://local/approval-3longlines');
711
const approvalModel = createMockApprovalModel(resource, {
712
label: 'RUSTFLAGS="-C target-cpu=native -C opt-level=3" cargo build --release --target x86_64-unknown-linux-gnu\nfind ./target/release -name "*.so" -exec strip --strip-unneeded {} \\; && tar czf release-bundle.tar.gz -C target/release .\ncurl -X POST https://deploy.internal.example.com/api/v2/artifacts/upload --header "Authorization: Bearer $DEPLOY_TOKEN" --form "[email protected]"',
713
languageId: 'sh',
714
since: new Date(),
715
confirm: () => { },
716
});
717
renderSessionItem(ctx, createMockSession({
718
resource,
719
label: 'Build and deploy native release',
720
status: AgentSessionStatus.InProgress,
721
providerType: AgentSessionProviders.Local,
722
timing: {
723
created: now - 2 * 60 * 1000,
724
lastRequestStarted: now - 60 * 1000,
725
lastRequestEnded: undefined,
726
},
727
}), approvalModel);
728
},
729
}),
730
});
731
732