Skip to content

Commit 30237b4

Browse files
authored
Send a real ChatRequest to provideNewChatSessionItem (microsoft#264089)
* Send a real ChatRequest to provideNewChatSessionItem Fix microsoft#264076 This is a bit wrong. Because a ChatRequest has a toolInvocationToken tied to a particular chat session, but the real vscode chat session doesn't exist yet! * this
1 parent f1a5fb0 commit 30237b4

File tree

9 files changed

+69
-44
lines changed

9 files changed

+69
-44
lines changed

src/vs/workbench/api/browser/mainThreadChatSessions.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { Emitter } from '../../../base/common/event.js';
99
import { IMarkdownString, MarkdownString } from '../../../base/common/htmlContent.js';
1010
import { Disposable, DisposableMap, DisposableStore, IDisposable } from '../../../base/common/lifecycle.js';
1111
import { revive } from '../../../base/common/marshalling.js';
12-
import { IObservable, observableValue, autorun } from '../../../base/common/observable.js';
12+
import { autorun, IObservable, observableValue } from '../../../base/common/observable.js';
1313
import { localize } from '../../../nls.js';
1414
import { IDialogService } from '../../../platform/dialogs/common/dialogs.js';
1515
import { ILogService } from '../../../platform/log/common/log.js';
@@ -365,7 +365,7 @@ export class MainThreadChatSessions extends Disposable implements MainThreadChat
365365
return [];
366366
}
367367

368-
private async _provideNewChatSessionItem(handle: number, options: { prompt?: string; history?: any[]; metadata?: any }, token: CancellationToken): Promise<IChatSessionItem> {
368+
private async _provideNewChatSessionItem(handle: number, options: { request: IChatAgentRequest; prompt?: string; history?: any[]; metadata?: any }, token: CancellationToken): Promise<IChatSessionItem> {
369369
try {
370370
const chatSessionItem = await this._proxy.$provideNewChatSessionItem(handle, options, token);
371371
if (!chatSessionItem) {

src/vs/workbench/api/common/extHost.protocol.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ import { IChatAgentMetadata, IChatAgentRequest, IChatAgentResult, UserSelectedTo
5858
import { ICodeMapperRequest, ICodeMapperResult } from '../../contrib/chat/common/chatCodeMapperService.js';
5959
import { IChatRelatedFile, IChatRelatedFileProviderMetadata as IChatRelatedFilesProviderMetadata, IChatRequestDraft } from '../../contrib/chat/common/chatEditingService.js';
6060
import { IChatProgressHistoryResponseContent } from '../../contrib/chat/common/chatModel.js';
61-
import { IChatContentInlineReference, IChatFollowup, IChatNotebookEdit, IChatProgress, IChatTask, IChatTaskDto, IChatUserActionEvent, IChatVoteAction, ChatResponseClearToPreviousToolInvocationReason } from '../../contrib/chat/common/chatService.js';
61+
import { ChatResponseClearToPreviousToolInvocationReason, IChatContentInlineReference, IChatFollowup, IChatNotebookEdit, IChatProgress, IChatTask, IChatTaskDto, IChatUserActionEvent, IChatVoteAction } from '../../contrib/chat/common/chatService.js';
6262
import { IChatSessionItem } from '../../contrib/chat/common/chatSessionsService.js';
6363
import { IChatRequestVariableValue } from '../../contrib/chat/common/chatVariables.js';
6464
import { ChatAgentLocation } from '../../contrib/chat/common/constants.js';
@@ -3167,7 +3167,7 @@ export interface MainThreadChatSessionsShape extends IDisposable {
31673167

31683168
export interface ExtHostChatSessionsShape {
31693169
$provideChatSessionItems(providerHandle: number, token: CancellationToken): Promise<Dto<IChatSessionItem>[]>;
3170-
$provideNewChatSessionItem(providerHandle: number, options: { prompt?: string; history?: any[]; metadata?: any }, token: CancellationToken): Promise<Dto<IChatSessionItem>>;
3170+
$provideNewChatSessionItem(providerHandle: number, options: { request: IChatAgentRequest; prompt?: string; history?: any[]; metadata?: any }, token: CancellationToken): Promise<Dto<IChatSessionItem>>;
31713171

31723172
$provideChatSessionContent(providerHandle: number, sessionId: string, token: CancellationToken): Promise<ChatSessionDto>;
31733173
$interruptChatSessionActiveResponse(providerHandle: number, sessionId: string, requestId: string): Promise<void>;

src/vs/workbench/api/common/extHostChatSessions.ts

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,17 @@ import { MarshalledId } from '../../../base/common/marshallingIds.js';
1111
import { IExtensionDescription } from '../../../platform/extensions/common/extensions.js';
1212
import { ILogService } from '../../../platform/log/common/log.js';
1313
import { IChatAgentRequest, IChatAgentResult } from '../../contrib/chat/common/chatAgents.js';
14-
import { IChatSessionItem, ChatSessionStatus } from '../../contrib/chat/common/chatSessionsService.js';
14+
import { ChatSessionStatus, IChatSessionItem } from '../../contrib/chat/common/chatSessionsService.js';
1515
import { ChatAgentLocation } from '../../contrib/chat/common/constants.js';
1616
import { Proxied } from '../../services/extensions/common/proxyIdentifier.js';
1717
import { ChatSessionDto, ExtHostChatSessionsShape, IChatAgentProgressShape, MainContext, MainThreadChatSessionsShape } from './extHost.protocol.js';
1818
import { ChatAgentResponseStream } from './extHostChatAgents2.js';
1919
import { CommandsConverter, ExtHostCommands } from './extHostCommands.js';
20+
import { ExtHostLanguageModels } from './extHostLanguageModels.js';
2021
import { IExtHostRpcService } from './extHostRpcService.js';
2122
import * as typeConvert from './extHostTypeConverters.js';
2223
import * as extHostTypes from './extHostTypes.js';
23-
import { ExtHostLanguageModels } from './extHostLanguageModels.js';
24+
import { revive } from '../../../base/common/marshalling.js';
2425

2526
class ExtHostChatSession {
2627
private _stream: ChatAgentResponseStream;
@@ -163,14 +164,31 @@ export class ExtHostChatSessions extends Disposable implements ExtHostChatSessio
163164
};
164165
}
165166

166-
async $provideNewChatSessionItem(handle: number, options: { prompt?: string; history: any[]; metadata?: any }, token: CancellationToken): Promise<IChatSessionItem> {
167+
async $provideNewChatSessionItem(handle: number, options: { request: IChatAgentRequest; prompt?: string; history: any[]; metadata?: any }, token: CancellationToken): Promise<IChatSessionItem> {
167168
const entry = this._chatSessionItemProviders.get(handle);
168169
if (!entry || !entry.provider.provideNewChatSessionItem) {
169170
throw new Error(`No provider registered for handle ${handle} or provider does not support creating sessions`);
170171
}
171172

172173
try {
173-
const chatSessionItem = await entry.provider.provideNewChatSessionItem(options, token);
174+
const model = await this.getModelForRequest(options.request, entry.extension);
175+
const vscodeRequest = typeConvert.ChatAgentRequest.to(
176+
revive(options.request),
177+
undefined,
178+
model,
179+
[],
180+
new Map(),
181+
entry.extension,
182+
this._logService);
183+
184+
const vscodeOptions = {
185+
request: vscodeRequest,
186+
prompt: options.prompt,
187+
history: options.history,
188+
metadata: options.metadata
189+
};
190+
191+
const chatSessionItem = await entry.provider.provideNewChatSessionItem(vscodeOptions, token);
174192
if (!chatSessionItem || !chatSessionItem.id) {
175193
throw new Error('Provider did not create session');
176194
}

src/vs/workbench/api/test/browser/mainThreadChatSessions.test.ts

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,26 @@ import * as sinon from 'sinon';
88
import { CancellationToken } from '../../../../base/common/cancellation.js';
99
import { DisposableStore } from '../../../../base/common/lifecycle.js';
1010
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';
11+
import { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';
12+
import { TestConfigurationService } from '../../../../platform/configuration/test/common/testConfigurationService.js';
13+
import { ContextKeyService } from '../../../../platform/contextkey/browser/contextKeyService.js';
14+
import { IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';
1115
import { IDialogService } from '../../../../platform/dialogs/common/dialogs.js';
1216
import { TestInstantiationService } from '../../../../platform/instantiation/test/common/instantiationServiceMock.js';
1317
import { ILogService, NullLogService } from '../../../../platform/log/common/log.js';
14-
import { MainThreadChatSessions, ObservableChatSession } from '../../browser/mainThreadChatSessions.js';
15-
import { ExtHostChatSessionsShape, IChatProgressDto } from '../../common/extHost.protocol.js';
16-
import { IExtHostContext } from '../../../services/extensions/common/extHostCustomers.js';
17-
import { ExtensionHostKind } from '../../../services/extensions/common/extensionHostKind.js';
18+
import { ChatSessionsService } from '../../../contrib/chat/browser/chatSessions.contribution.js';
19+
import { IChatAgentRequest } from '../../../contrib/chat/common/chatAgents.js';
1820
import { IChatProgress } from '../../../contrib/chat/common/chatService.js';
1921
import { IChatSessionItem, IChatSessionsService } from '../../../contrib/chat/common/chatSessionsService.js';
22+
import { ChatAgentLocation } from '../../../contrib/chat/common/constants.js';
2023
import { IEditorService } from '../../../services/editor/common/editorService.js';
24+
import { IExtHostContext } from '../../../services/extensions/common/extHostCustomers.js';
25+
import { ExtensionHostKind } from '../../../services/extensions/common/extensionHostKind.js';
26+
import { IExtensionService } from '../../../services/extensions/common/extensions.js';
2127
import { IViewsService } from '../../../services/views/common/viewsService.js';
2228
import { mock, TestExtensionService } from '../../../test/common/workbenchTestServices.js';
23-
import { ChatSessionsService } from '../../../contrib/chat/browser/chatSessions.contribution.js';
24-
import { IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';
25-
import { ContextKeyService } from '../../../../platform/contextkey/browser/contextKeyService.js';
26-
import { TestConfigurationService } from '../../../../platform/configuration/test/common/testConfigurationService.js';
27-
import { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';
28-
import { IExtensionService } from '../../../services/extensions/common/extensions.js';
29+
import { MainThreadChatSessions, ObservableChatSession } from '../../browser/mainThreadChatSessions.js';
30+
import { ExtHostChatSessionsShape, IChatProgressDto } from '../../common/extHost.protocol.js';
2931

3032
suite('ObservableChatSession', function () {
3133
let disposables: DisposableStore;
@@ -372,8 +374,19 @@ suite('MainThreadChatSessions', function () {
372374
test('provideNewChatSessionItem creates a new chat session', async function () {
373375
mainThread.$registerChatSessionItemProvider(1, 'test-type');
374376

377+
// Create a mock IChatAgentRequest
378+
const mockRequest: IChatAgentRequest = {
379+
sessionId: 'test-session',
380+
requestId: 'test-request',
381+
agentId: 'test-agent',
382+
message: 'my prompt',
383+
location: ChatAgentLocation.Panel,
384+
variables: { variables: [] }
385+
};
386+
375387
// Valid
376388
const chatSessionItem = await chatSessionsService.provideNewChatSessionItem('test-type', {
389+
request: mockRequest,
377390
prompt: 'my prompt',
378391
metadata: {}
379392
}, CancellationToken.None);
@@ -383,6 +396,7 @@ suite('MainThreadChatSessions', function () {
383396
// Invalid session type should throw
384397
await assert.rejects(
385398
chatSessionsService.provideNewChatSessionItem('invalid-type', {
399+
request: mockRequest,
386400
prompt: 'my prompt',
387401
metadata: {}
388402
}, CancellationToken.None)

src/vs/workbench/contrib/chat/browser/actions/chatExecuteActions.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,14 @@ export class CreateRemoteAgentJobAction extends Action2 {
583583
type,
584584
{
585585
prompt: userPrompt,
586+
request: {
587+
agentId: '',
588+
location: ChatAgentLocation.Panel,
589+
message: userPrompt,
590+
requestId: '',
591+
sessionId: '',
592+
variables: { variables: [] },
593+
},
586594
metadata: {
587595
summary,
588596
source: 'chatExecuteActions',

src/vs/workbench/contrib/chat/browser/chatSessions.contribution.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -495,11 +495,12 @@ export class ChatSessionsService extends Disposable implements IChatSessionsServ
495495
/**
496496
* Creates a new chat session by delegating to the appropriate provider
497497
* @param chatSessionType The type of chat session provider to use
498-
* @param options Options for the new session
498+
* @param options Options for the new session including the request
499499
* @param token A cancellation token
500500
* @returns A session ID for the newly created session
501501
*/
502502
public async provideNewChatSessionItem(chatSessionType: string, options: {
503+
request: IChatAgentRequest;
503504
prompt?: string;
504505
history?: any[];
505506
metadata?: any;
@@ -630,6 +631,7 @@ class CodingAgentChatImplementation extends Disposable implements IChatAgentImpl
630631
const chatSessionItem = await this.chatSessionService.provideNewChatSessionItem(
631632
this.chatSession.type,
632633
{
634+
request,
633635
prompt: request.message,
634636
history,
635637
},

src/vs/workbench/contrib/chat/browser/chatWidget.ts

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1783,26 +1783,6 @@ export class ChatWidget extends Disposable implements IChatWidget {
17831783
return;
17841784
}
17851785

1786-
// Handle coding agent prefix enforcement
1787-
if (this._lockedToCodingAgent && this._codingAgentPrefix) {
1788-
if (query) {
1789-
// For programmatic input, ensure the prefix is added
1790-
if (!query.query.startsWith(this._codingAgentPrefix)) {
1791-
query.query = this._codingAgentPrefix + this.removeExistingAgentPrefix(query.query);
1792-
}
1793-
} else {
1794-
// For user input, update the editor value if needed
1795-
const currentValue = this.getInput();
1796-
if (!currentValue.length) {
1797-
return;
1798-
}
1799-
if (!currentValue.startsWith(this._codingAgentPrefix)) {
1800-
const newValue = this._codingAgentPrefix + this.removeExistingAgentPrefix(currentValue);
1801-
this.input.inputEditor.setValue(newValue);
1802-
}
1803-
}
1804-
}
1805-
18061786
if (!query && this.input.generating) {
18071787
// if the user submits the input and generation finishes quickly, just submit it for them
18081788
const generatingAutoSubmitWindow = 500;
@@ -1892,6 +1872,7 @@ export class ChatWidget extends Disposable implements IChatWidget {
18921872
noCommandDetection: options?.noCommandDetection,
18931873
...this.getModeRequestOptions(),
18941874
modeInfo: this.input.currentModeInfo,
1875+
agentId: this._lockedAgentId
18951876
});
18961877

18971878
if (result) {
@@ -2198,11 +2179,6 @@ export class ChatWidget extends Disposable implements IChatWidget {
21982179
return readFileTool;
21992180
}
22002181

2201-
private removeExistingAgentPrefix(text: string): string {
2202-
// Remove any existing agent prefix (e.g., @agent) from the beginning
2203-
return text.replace(/^@\w+\s*/, '');
2204-
}
2205-
22062182
delegateScrollFromMouseWheelEvent(browserEvent: IMouseWheelEvent): void {
22072183
this.tree.delegateScrollFromMouseWheelEvent(browserEvent);
22082184
}

src/vs/workbench/contrib/chat/common/chatSessionsService.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ export interface IChatSessionItemProvider {
7575
readonly onDidChangeChatSessionItems: Event<void>;
7676
provideChatSessionItems(token: CancellationToken): Promise<IChatSessionItem[]>;
7777
provideNewChatSessionItem?(options: {
78+
request: IChatAgentRequest;
7879
prompt?: string;
7980
history?: any[];
8081
metadata?: any;
@@ -98,6 +99,7 @@ export interface IChatSessionsService {
9899
canResolveItemProvider(chatSessionType: string): Promise<boolean>;
99100
getAllChatSessionItemProviders(): IChatSessionItemProvider[];
100101
provideNewChatSessionItem(chatSessionType: string, options: {
102+
request: IChatAgentRequest;
101103
prompt?: string;
102104
history?: any[];
103105
metadata?: any;

src/vscode-dts/vscode.proposed.chatSessionsProvider.d.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ declare module 'vscode' {
4141
* @returns Metadata for the chat session
4242
*/
4343
provideNewChatSessionItem?(options: {
44+
/**
45+
* The chat request that initiated the session creation
46+
*/
47+
readonly request: ChatRequest;
48+
4449
/**
4550
* Initial prompt to initiate the session
4651
*/

0 commit comments

Comments
 (0)