184
185
async invoke(invocation: IToolInvocation, _countTokens: CountTokensCallback, progress: ToolProgress, token: CancellationToken): Promise<IToolResult> {
187
>
const parameters = invocation.parameters as IAskQuestionsParams;
188
>
const { questions } = parameters;
189
>
this.logService.trace(`[AskQuestionsTool] Invoking with ${questions?.length ?? 0} question(s)`);
190
>
191
>
if (!questions || questions.length === 0) {
192
throw new Error(localize('askQuestionsTool.noQuestions', 'No questions provided. The questions array must contain at least one question.'));
193
}
195
>
const chatSessionResource = invocation.context?.sessionResource;
196
>
const chatRequestId = invocation.chatRequestId;
197
>
const { request, sessionResource } = this.getRequest(chatSessionResource, chatRequestId);
198
>
199
>
if (!sessionResource || !request) {
200
this.logService.warn('[AskQuestionsTool] Missing chat context; marking all questions as skipped.');
201
return this.createSkippedResult(questions);
202
}
204
>
// In autopilot mode or when auto-reply is enabled, the user is not available —
205
>
// auto-respond instead of blocking. Still append a completed carousel so the
206
>
// user can see what was skipped.
207
>
const resolveId = invocation.chatStreamToolCallId ?? invocation.callId;
208
>
if (request.modeInfo?.permissionLevel === ChatPermissionLevel.Autopilot || this.configService.getValue<boolean>(ChatConfiguration.AutoReply)) {
209
const reason = request.modeInfo?.permissionLevel === ChatPermissionLevel.Autopilot ? 'Autopilot mode' : 'Auto-reply enabled';
210
this.logService.info(`[AskQuestionsTool] ${reason}: auto-responding to questions`);