Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
967ee28
fix: replace typescript.tsdk.desc with new js/ts.tsdk.path
thernstig May 8, 2026
781806c
Potential fix for pull request finding
thernstig May 8, 2026
c045dd8
fix: keep typescript.tsdk.desc as source of truth
thernstig May 9, 2026
b9a45e9
feat(bg-todo): collapse ToolCategory to substantive/excluded and rewo…
vritant24 May 11, 2026
c63c25a
test(bg-todo): update tests for substantive tool classification and n…
vritant24 May 11, 2026
c5d2575
feat: raise background todo agent invocation thresholds
vritant24 May 11, 2026
85eb14d
fix: correct background todo agent prompt behaviour
vritant24 May 11, 2026
04b35e3
Merge branch 'main' into agents/todo-agent-optimization-suggestions
vritant24 May 11, 2026
cf0419a
fix comment
vritant24 May 11, 2026
2d81833
test(bg-todo): align policy tests with raised invocation thresholds
vritant24 May 11, 2026
e62fe60
fix: reorder terminal disposal to prevent xterm addon error (fixes #3…
vs-code-engineering[bot] May 11, 2026
c039600
ensuer bg todo agent isn't invoked on subagent runs
vritant24 May 11, 2026
7bc0665
Merge branch 'main' into agents/todo-agent-optimization-suggestions
vritant24 May 11, 2026
2c1c769
Ship stable symbol tool descriptions (#315686)
kevin-m-kent May 11, 2026
b3e73b5
Merge branch 'main' into agents/todo-agent-optimization-suggestions
vritant24 May 11, 2026
ef7c6a1
Improve CLI quota message (#315797)
lramos15 May 11, 2026
cd73d8b
cli: enable upgrades on proxied websocket client connection (#315802)
connor4312 May 11, 2026
c6cb635
extract ExtensionPromptFileService (#315815)
aeschli May 11, 2026
cb383df
agents: add keyboard-interactive SSH auth fallback (#315590)
roblourens May 11, 2026
dc347ca
exponentially backoff todo agent on no ops
vritant24 May 11, 2026
56d7412
Add GPT-5.5 prompt experiment flags (#315603)
dileepyavan May 11, 2026
6b0c41b
Remove Copilot Memory (CAPI) feature (#315813)
bhavyaus May 11, 2026
73119e4
chat: disable agents window actions when agent mode is disabled (#315…
sandy081 May 11, 2026
cc75c85
Merge pull request #315727 from microsoft/agents/todo-agent-optimizat…
vritant24 May 11, 2026
a9c1502
agentHost: derive active-session count from authoritative session sta…
connor4312 May 11, 2026
c1be36e
chat: group model picker by (vendor, groupName) for BYOK setups
vritant24 May 11, 2026
bbdd3d3
chat: cover BYOK multi-group bucketing in chatModelPicker tests
vritant24 May 11, 2026
3a25d6c
remove provider names
vritant24 May 11, 2026
0d2131b
Agents - extract checkpoint information from metadata (#315860)
lszomoru May 11, 2026
5a43ad6
Merge pull request #315861 from microsoft/dev/vritant24/mocelPickerVe…
vritant24 May 11, 2026
10a499b
Responses API: translate terminal events into typed completions
zhichli May 11, 2026
46441fd
Add agent host xterm/headless (#315407)
anthonykim1 May 11, 2026
0105b3f
Fix button text (#315874)
lramos15 May 11, 2026
cf21e20
Remove github.copilot.chat.tools.memory.enabled setting (#315879)
bhavyaus May 11, 2026
06542e1
Merge pull request #315737 from microsoft/fix/terminal-addon-dispose-…
bryanchen-d May 11, 2026
ba66f87
agent host: drive subagent cleanup from SDK completion events (#315880)
connor4312 May 11, 2026
e9a8ace
Browser: handle keyboard shortcuts from devtools (#315883)
kycutler May 11, 2026
830b948
Merge pull request #315268 from thernstig/jsts-tsdk-path
mjbvz May 11, 2026
acdf223
agent host: handle elicitation requests from copilot SDK (#315882)
connor4312 May 11, 2026
cc1934d
Responses API: propagate response.error + Azure-spec'd copyright fall…
zhichli May 11, 2026
d8dd020
Forward RFC 8707 resource indicator through auth provider (#314784)
TylerLeonhardt May 11, 2026
ba053f0
Responses API tests: use single-quoted string to satisfy lint rule
zhichli May 11, 2026
4566b63
Remove github.copilot.chat.responsesApi.toolSearchTool.enabled settin…
bhavyaus May 11, 2026
e565d7d
Merge pull request #315873 from microsoft/zhichli/fixrapi
zhichli May 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion cli/src/commands/serve_web.rs
Original file line number Diff line number Diff line change
Expand Up @@ -348,7 +348,9 @@ async fn forward_ws_req_to_server(
Err(e) => return response::connection_err(e),
};

tokio::spawn(connection);
// `.with_upgrades()` is required so that `hyper::upgrade::on` can later
// take over the connection for websocket traffic.
tokio::spawn(connection.with_upgrades());

let mut proxied_req = Request::builder().uri(req.uri());
for (k, v) in req.headers() {
Expand Down
54 changes: 19 additions & 35 deletions extensions/copilot/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -1162,8 +1162,7 @@
"displayName": "Memory",
"toolReferenceName": "memory",
"userDescription": "Manage persistent memory across conversations",
"when": "config.github.copilot.chat.tools.memory.enabled",
"modelDescription": "Manage a persistent memory system with three scopes for storing notes and information across conversations.\n\nMemory is organized under /memories/ with three tiers:\n- `/memories/` — User memory: persistent notes that survive across all workspaces and conversations. Store preferences, patterns, and general insights here.\n- `/memories/session/` — Session memory: notes scoped to the current conversation. Store task-specific context and in-progress notes here. Cleared after the conversation ends.\n- `/memories/repo/` — Repository memory: repository-scoped facts stored via Copilot. Only the `create` command is supported for this path.\n\nIMPORTANT: Before creating new memory files, first view the /memories/ directory to understand what already exists. This helps avoid duplicates and maintain organized notes.\n\nCommands:\n- `view`: View contents of a file or list directory contents. Can be used on files or directories (e.g., \"/memories/\" to see all top-level items).\n- `create`: Create a new file at the specified path with the given content. Fails if the file already exists.\n- `str_replace`: Replace an exact string in a file with a new string. The old_str must appear exactly once in the file.\n- `insert`: Insert text at a specific line number in a file. Line 0 inserts at the beginning.\n- `delete`: Delete a file or directory (and all its contents).\n- `rename`: Rename or move a file or directory from path to new_path. Cannot rename across scopes.",
"modelDescription": "Manage a persistent memory system with three scopes for storing notes and information across conversations.\n\nMemory is organized under /memories/ with three tiers:\n- `/memories/` — User memory: persistent notes that survive across all workspaces and conversations. Store preferences, patterns, and general insights here.\n- `/memories/session/` — Session memory: notes scoped to the current conversation. Store task-specific context and in-progress notes here. Cleared after the conversation ends.\n- `/memories/repo/` — Repository memory: repository-scoped notes stored locally in the workspace. Store codebase conventions, build commands, project structure facts, and verified practices here.\n\nIMPORTANT: Before creating new memory files, first view the /memories/ directory to understand what already exists. This helps avoid duplicates and maintain organized notes.\n\nCommands:\n- `view`: View contents of a file or list directory contents. Can be used on files or directories (e.g., \"/memories/\" to see all top-level items).\n- `create`: Create a new file at the specified path with the given content. Fails if the file already exists.\n- `str_replace`: Replace an exact string in a file with a new string. The old_str must appear exactly once in the file.\n- `insert`: Insert text at a specific line number in a file. Line 0 inserts at the beginning.\n- `delete`: Delete a file or directory (and all its contents).\n- `rename`: Rename or move a file or directory from path to new_path. Cannot rename across scopes.",
"inputSchema": {
"type": "object",
"properties": {
Expand Down Expand Up @@ -3282,22 +3281,6 @@
],
"markdownDescription": "%github.copilot.config.codesearch.enabled%"
},
"github.copilot.chat.copilotMemory.enabled": {
"type": "boolean",
"default": false,
"markdownDescription": "%github.copilot.config.copilotMemory.enabled%",
"tags": [
"preview"
]
},
"github.copilot.chat.tools.memory.enabled": {
"type": "boolean",
"default": true,
"markdownDescription": "%github.copilot.config.tools.memory.enabled%",
"tags": [
"preview"
]
},
"github.copilot.chat.tools.viewImage.enabled": {
"type": "boolean",
"default": true,
Expand Down Expand Up @@ -3842,15 +3825,6 @@
"onExp"
]
},
"github.copilot.chat.responsesApi.toolSearchTool.enabled": {
"type": "boolean",
"default": false,
"markdownDescription": "%github.copilot.config.responsesApi.toolSearchTool.enabled%",
"tags": [
"experimental",
"onExp"
]
},
"github.copilot.chat.updated53CodexPrompt.enabled": {
"type": "boolean",
"default": true,
Expand Down Expand Up @@ -3905,6 +3879,24 @@
"onExp"
]
},
"github.copilot.chat.gpt55EconomicalSearchAndEdit.enabled": {
"type": "boolean",
"default": false,
"markdownDescription": "%github.copilot.config.gpt55EconomicalSearchAndEdit.enabled%",
"tags": [
"experimental",
"onExp"
]
},
"github.copilot.chat.gpt55LargePromptSections.enabled": {
"type": "boolean",
"default": false,
"markdownDescription": "%github.copilot.config.gpt55LargePromptSections.enabled%",
"tags": [
"experimental",
"onExp"
]
},
"github.copilot.chat.anthropic.tools.websearch.enabled": {
"type": "boolean",
"default": false,
Expand Down Expand Up @@ -5523,14 +5515,6 @@
"command": "github.copilot.nes.captureExpected.submit",
"when": "github.copilot.inlineEditsEnabled"
},
{
"command": "github.copilot.chat.tools.memory.showMemories",
"when": "config.github.copilot.chat.tools.memory.enabled"
},
{
"command": "github.copilot.chat.tools.memory.clearMemories",
"when": "config.github.copilot.chat.tools.memory.enabled"
},
{
"command": "github.copilot.sessions.commit",
"when": "false"
Expand Down
5 changes: 2 additions & 3 deletions extensions/copilot/package.nls.json
Original file line number Diff line number Diff line change
Expand Up @@ -343,13 +343,14 @@
"github.copilot.config.responsesApiReasoningSummary": "Sets the reasoning summary style used for the Responses API. Requires `#github.copilot.chat.useResponsesApi#`.",
"github.copilot.config.responsesApiContextManagement.enabled": "Enables context management for the Responses API. Requires `#github.copilot.chat.useResponsesApi#`.",
"github.copilot.config.responsesApi.promptCacheKey.enabled": "Enables prompt cache key being set for the Responses API.",
"github.copilot.config.responsesApi.toolSearchTool.enabled": "Enable tool search for OpenAI Responses API models. When enabled, tools are dynamically discovered and loaded on-demand using embeddings-based search, reducing context window usage when many tools are available.",
"github.copilot.config.updated53CodexPrompt.enabled": "Enables the updated prompt for gpt-5.3-codex model.",
"github.copilot.config.claude47OpusPrompt.enabled": "Enables the updated system prompt tuned for the Claude Opus 4.7 model.",
"github.copilot.config.gpt54ConcisePrompt.enabled": "Enables the concise prompt experiment for gpt-5.4 model.",
"github.copilot.config.gpt54LargePrompt.enabled": "Enables the large prompt experiment for gpt-5.4 model.",
"github.copilot.config.gpt55GetChangedFilesTool.enabled": "Enables the Get Changed Files tool for gpt-5.5 models.",
"github.copilot.config.gpt55ReadFileTool.enabled": "Enables the Read File tool for gpt-5.5 models.",
"github.copilot.config.gpt55EconomicalSearchAndEdit.enabled": "Enables economical search and edit instructions for gpt-5.5 models.",
"github.copilot.config.gpt55LargePromptSections.enabled": "Enables additional gpt-5.4 large prompt sections for gpt-5.5 models.",
"github.copilot.config.anthropic.tools.websearch.enabled": "Enable Anthropic's native web search tool for BYOK Claude models. When enabled, allows Claude to search the web for current information. \n\n**Note**: This is an experimental feature only available for BYOK Anthropic Claude models.",
"github.copilot.config.anthropic.tools.websearch.maxUses": "Maximum number of web searches allowed per request. Valid range is 1 to 20. Prevents excessive API calls within a single interaction. If Claude exceeds this limit, the response returns an error.",
"github.copilot.config.anthropic.tools.websearch.allowedDomains": "List of domains to restrict web search results to (e.g., `[\"example.com\", \"docs.example.com\"]`). Domains should not include the HTTP/HTTPS scheme. Subdomains are automatically included. Cannot be used together with `#github.copilot.chat.anthropic.tools.websearch.blockedDomains#`; configuring both will cause web search requests to fail.",
Expand Down Expand Up @@ -422,8 +423,6 @@
"github.copilot.config.cli.remote.enabled": "Enable the /remote command for Copilot CLI sessions, allowing you to view and steer from GitHub.com and the GitHub mobile app.",
"github.copilot.config.backgroundAgent.enabled": "Enable the Copilot CLI. When disabled, the Copilot CLI will not be available in 'Continue In' context menus.",
"github.copilot.config.cloudAgent.enabled": "Enable the Cloud Agent. When disabled, the Cloud Agent will not be available in 'Continue In' context menus.",
"github.copilot.config.copilotMemory.enabled": "Enable agentic memory for GitHub Copilot. When enabled, Copilot can store repository-scoped facts about your codebase conventions, structure, and preferences remotely on GitHub, and recall them in future conversations to provide more contextually relevant assistance. [Learn more](https://docs.github.com/en/copilot/how-tos/use-copilot-agents/copilot-memory).",
"github.copilot.config.tools.memory.enabled": "Enable the memory tool to let the agent save and recall notes during a conversation. Memories are stored locally in VS Code storage — user-scoped memories persist across workspaces and sessions, while session-scoped memories are cleared when the conversation ends.",
"github.copilot.config.gpt5AlternativePatch": "Enable GPT-5 alternative patch format.",
"github.copilot.config.inlineEdits.triggerOnEditorChangeAfterSeconds": "Trigger inline edits after editor has been idle for this many seconds.",
"github.copilot.config.inlineEdits.nextCursorPrediction.displayLine": "Display predicted cursor line for next edit suggestions.",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import { CustomDataPartMimeTypes } from '../../../platform/endpoint/common/endpo
import { modelSupportsToolSearch } from '../../../platform/endpoint/common/chatModelCapabilities';
import { buildToolInputSchema } from '../../../platform/endpoint/node/messagesApi';
import { ILogService } from '../../../platform/log/common/logService';
import { ContextManagementResponse, CUSTOM_TOOL_SEARCH_NAME, getContextManagementFromConfig, isAnthropicContextEditingEnabled, isAnthropicMemoryToolEnabled } from '../../../platform/networking/common/anthropic';
import { ContextManagementResponse, CUSTOM_TOOL_SEARCH_NAME, getContextManagementFromConfig, isAnthropicContextEditingEnabled, modelSupportsMemory } from '../../../platform/networking/common/anthropic';
import { IToolDeferralService } from '../../../platform/networking/common/toolDeferralService';
import { IResponseDelta, OpenAiFunctionTool } from '../../../platform/networking/common/fetch';
import { APIUsage } from '../../../platform/networking/common/openai';
Expand Down Expand Up @@ -140,7 +140,7 @@ export class AnthropicLMProvider extends AbstractLanguageModelChatProvider {
},
});

const memoryToolEnabled = isAnthropicMemoryToolEnabled(model.id, this._configurationService, this._experimentationService);
const memoryToolEnabled = modelSupportsMemory(model.id);

// Requires the client-side tool_search tool in the request: without it, defer-loaded tools can't be retrieved.
// If the user disables tool_search in the tool picker, it won't be present here and tool search is skipped.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import { truncate } from '../../../../util/vs/base/common/strings';
import { ThemeIcon } from '../../../../util/vs/base/common/themables';
import { IInstantiationService } from '../../../../util/vs/platform/instantiation/common/instantiation';
import { ChatResponseMarkdownPart, ChatResponseThinkingProgressPart, ChatSessionStatus, ChatToolInvocationPart, EventEmitter, MarkdownString, Uri } from '../../../../vscodeTypes';
import { getQuotaMessageForPlan } from '../../../../platform/chat/common/commonTypes';
import { IToolsService } from '../../../tools/common/toolsService';
import { IChatSessionMetadataStore } from '../../common/chatSessionMetadataStore';
import { ExternalEditTracker } from '../../common/externalEditTracker';
Expand Down Expand Up @@ -57,6 +58,13 @@ export type CopilotCLICommand = 'compact' | 'plan' | 'fleet' | 'remote';
*/
export const copilotCLICommands: readonly CopilotCLICommand[] = ['compact', 'plan', 'fleet', 'remote'] as const;

export class CopilotCLIQuotaExceededError extends Error {
constructor(message: string) {
super(message);
this.name = 'CopilotCLIQuotaExceededError';
}
}

/**
* Shared Mission Control state keyed by SDK session ID.
* CopilotCLISession instances are recreated per request, so MC state
Expand Down Expand Up @@ -1056,6 +1064,7 @@ export class CopilotCLISession extends DisposableStore implements ICopilotCLISes
const toolCalls = new Map<string, ToolCall>();
const editTracker = new ExternalEditTracker();
let sdkRequestId: string | undefined;
let isQuotaError = false;
const toolIdEditMap = new Map<string, Promise<string | undefined>>();
const remoteMode = isMissionControlCommandSource(input.source) ? this._mcState?.mcMode : undefined;
const effectivePermissionLevel = remoteMode ? (remoteMode === 'autopilot' ? 'autopilot' : undefined) : this._permissionLevel;
Expand Down Expand Up @@ -1406,7 +1415,12 @@ export class CopilotCLISession extends DisposableStore implements ICopilotCLISes
disposables.add(toDisposable(this._sdkSession.on('session.error', (event) => {
flushPendingInvocationMessages();
this.logService.error(`[CopilotCLISession]CopilotCLI error: (${event.data.errorType}), ${event.data.message}`);
requestStream?.markdown(l10n.t('\n\nError: ({0}) {1}', event.data.errorType, event.data.message));

if (event.data.errorType === 'quota' || event.data.statusCode === 402) {
isQuotaError = true;
} else {
requestStream?.markdown(l10n.t('\n\nError: ({0}) {1}', event.data.errorType, event.data.message));
}

const errorMarkdown = [`# Error Details`, `Type: ${event.data.errorType}`, `Message: ${event.data.message}`, `## Stack`, event.data.stack || ''].join('\n');
this._requestLogger.addEntry({
Expand Down Expand Up @@ -1460,6 +1474,15 @@ export class CopilotCLISession extends DisposableStore implements ICopilotCLISes
if (!token.isCancellationRequested) {
await this.sendRequestInternal(input, attachments, false, logStartTime);
}
if (isQuotaError) {
this._chatQuotaService.clearQuota();
let plan: string | undefined;
try {
const copilotToken = await this._authenticationService.getCopilotToken();
plan = copilotToken.copilotPlan;
} catch { /* token unavailable */ }
throw new CopilotCLIQuotaExceededError(getQuotaMessageForPlan(plan));
}
this.logService.trace(`[CopilotCLISession] Invoking session (completed) ${this.sessionId}`);
const resolvedToolIdEditMap: Record<string, string> = {};
await Promise.all(Array.from(toolIdEditMap.entries()).map(async ([toolId, editFilePromise]) => {
Expand Down Expand Up @@ -1487,18 +1510,32 @@ export class CopilotCLISession extends DisposableStore implements ICopilotCLISes
// Log the completed conversation
this._logConversation(prompt, assistantMessageChunks.join(''), modelId || '', attachments, logStartTime, 'Completed');
} catch (error) {
if (error instanceof CopilotCLIQuotaExceededError) {
throw error;
}
if (isQuotaError) {
this._chatQuotaService.clearQuota();
let plan: string | undefined;
try {
const copilotToken = await this._authenticationService.getCopilotToken();
plan = copilotToken.copilotPlan;
} catch { /* token unavailable */ }
throw new CopilotCLIQuotaExceededError(getQuotaMessageForPlan(plan));
}
this._status = ChatSessionStatus.Failed;
this._statusChange.fire(this._status);
this.logService.error(`[CopilotCLISession] Invoking session (error) ${this.sessionId}`, error);
requestStream?.markdown(l10n.t('\n\nError: {0}', error instanceof Error ? error.message : String(error)));

invokeAgentSpan.setStatus(SpanStatusCode.ERROR, error instanceof Error ? error.message : String(error));
const errorMessage = error instanceof Error ? error.message : String(error);
requestStream?.markdown(l10n.t('\n\nError: {0}', errorMessage));

invokeAgentSpan.setStatus(SpanStatusCode.ERROR, errorMessage);
if (error instanceof Error) {
invokeAgentSpan.recordException(error);
}

// Log the failed conversation
this._logConversation(prompt, assistantMessageChunks.join(''), modelId || '', attachments, logStartTime, 'Failed', error instanceof Error ? error.message : String(error));
this._logConversation(prompt, assistantMessageChunks.join(''), modelId || '', attachments, logStartTime, 'Failed', errorMessage);
} finally {
cancelCancellationAbort?.();
// End the invoke_agent wrapper span
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ import { SessionIdForCLI } from '../copilotcli/common/utils';
import { getCopilotCLISessionDir } from '../copilotcli/node/cliHelpers';
import { ICopilotCLIModels, ICopilotCLISDK } from '../copilotcli/node/copilotCli';
import { CopilotCLIPromptResolver } from '../copilotcli/node/copilotcliPromptResolver';
import { builtinSlashSCommands, CopilotCLICommand, copilotCLICommands, ICopilotCLISession } from '../copilotcli/node/copilotcliSession';
import { builtinSlashSCommands, CopilotCLICommand, copilotCLICommands, CopilotCLIQuotaExceededError, ICopilotCLISession } from '../copilotcli/node/copilotcliSession';
import { ICopilotCLISessionItem, ICopilotCLISessionService } from '../copilotcli/node/copilotcliSessionService';
import { buildMcpServerMappings } from '../copilotcli/node/mcpHandler';
import { ICopilotCLISessionTracker } from '../copilotcli/vscode-node/copilotCLISessionTracker';
Expand Down Expand Up @@ -885,6 +885,9 @@ export class CopilotCLIChatSessionParticipant extends Disposable {
if (isCancellationError(ex)) {
return {};
}
if (ex instanceof CopilotCLIQuotaExceededError) {
return { errorDetails: { message: ex.message, isQuotaExceeded: true } };
}
throw ex;
} finally {
this._chatQuotaService.resetTurnCredits(request.id);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ import { IChatDelegationSummaryService } from '../copilotcli/common/delegationSu
import { getCopilotCLISessionDir } from '../copilotcli/node/cliHelpers';
import { COPILOT_CLI_REASONING_EFFORT_PROPERTY, ICopilotCLIAgents, ICopilotCLIModels, ICopilotCLISDK, isWelcomeView } from '../copilotcli/node/copilotCli';
import { CopilotCLIPromptResolver } from '../copilotcli/node/copilotcliPromptResolver';
import { builtinSlashSCommands, CopilotCLICommand, copilotCLICommands, ICopilotCLISession } from '../copilotcli/node/copilotcliSession';
import { builtinSlashSCommands, CopilotCLICommand, copilotCLICommands, CopilotCLIQuotaExceededError, ICopilotCLISession } from '../copilotcli/node/copilotcliSession';
import { ICopilotCLISessionItem, ICopilotCLISessionService } from '../copilotcli/node/copilotcliSessionService';
import { buildMcpServerMappings } from '../copilotcli/node/mcpHandler';
import { ICopilotCLISessionTracker } from '../copilotcli/vscode-node/copilotCLISessionTracker';
Expand Down Expand Up @@ -1578,6 +1578,9 @@ export class CopilotCLIChatSessionParticipant extends Disposable {
if (isCancellationError(ex)) {
return {};
}
if (ex instanceof CopilotCLIQuotaExceededError) {
return { errorDetails: { message: ex.message, isQuotaExceeded: true } };
}
throw ex;
}
finally {
Expand Down
Loading
Loading