Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
3729346
Make sure we still set isInitialized when git is disabled
mjbvz Apr 29, 2026
5072222
Clarify async vs sync mode guidance for run_in_terminal (#313388)
meganrogge Apr 30, 2026
b1276e2
Don't try watching readonly file systems
mjbvz Apr 30, 2026
4a09cdb
Catch and log error during reconcileDbFiles
mjbvz Apr 30, 2026
6e3863e
Update call
mjbvz Apr 30, 2026
df29bd2
Merge pull request #313381 from mjbvz/dev/mjbvz/double-blackbird
mjbvz Apr 30, 2026
73991f0
Fix model selection logic in SessionModelPicker to handle empty model…
DonJayamanne Apr 30, 2026
492c092
Don't display chat messages quota for UBB (#313327)
pwang347 Apr 30, 2026
3fb88f8
Include uri when computing external ingest checkpoint
mjbvz Apr 30, 2026
276f8cd
Also update tests
mjbvz Apr 30, 2026
858f913
Update extensions/copilot/src/platform/workspaceChunkSearch/node/code…
mjbvz Apr 30, 2026
daa5e2c
Merge pull request #313400 from mjbvz/dev/mjbvz/vivacious-iguana
mjbvz Apr 30, 2026
87676da
Merge pull request #313401 from mjbvz/dev/mjbvz/comprehensive-marmoset
mjbvz Apr 30, 2026
82d6660
Fix forced sandbox issue (#313409)
jruales Apr 30, 2026
498fb0e
Fix overage URL (#313404)
pwang347 Apr 30, 2026
3b2b5e0
Update GitHub Copilot npm and permission handling (#313364)
DonJayamanne Apr 30, 2026
24da6b8
Update chat status dashboard based on feedback (#313367)
pwang347 Apr 30, 2026
c7dadb4
Clean up agent host worktrees on session archive (#313393)
roblourens Apr 30, 2026
8eaab1c
Fix spurious exit-130 cascade, idle SIGINT, nohup over-wrap, and miss…
meganrogge Apr 30, 2026
7b9366d
Make it easy to switch current md doc between preview and edit mode
mjbvz Apr 30, 2026
7e4091c
Merge pull request #313406 from mjbvz/dev/mjbvz/horrible-whippet
mjbvz Apr 30, 2026
dca631c
Align more markdown settings strings
mjbvz Apr 30, 2026
8d1dcfa
Applying network filter only for fetch web tool in sandbox mode (#313…
dileepyavan Apr 30, 2026
3ec0c23
Grammar
mjbvz Apr 30, 2026
cc71115
Merge pull request #313428 from mjbvz/dev/mjbvz/robust-bovid
mjbvz Apr 30, 2026
978ee5b
Fixes extension editor readmes in modals
mjbvz Apr 30, 2026
fb37dd4
View usage button logic fix (#313432)
pwang347 Apr 30, 2026
6cacf81
Agents welcome: theme selection step (#313333)
sandy081 Apr 30, 2026
b0f253e
sessions - fix quick open to work (#313434)
bpasero Apr 30, 2026
75a8e67
Respond to update state changes to update the menu bar (#313435)
dmitrivMS Apr 30, 2026
cd91361
Merge pull request #313436 from mjbvz/dev/mjbvz/only-termite
mjbvz Apr 30, 2026
cf0d8c6
Merge branch 'main' into dev/mjbvz/adverse-kiwi
mjbvz Apr 30, 2026
4c7f8d0
Sanity test fixes (#313421)
dmitrivMS Apr 30, 2026
1cd6969
Hide Update, Sign-In and Open in Agents title bar items in Zen mode (…
dmitrivMS Apr 30, 2026
cdd1c54
Merge pull request #313433 from mjbvz/dev/mjbvz/adverse-kiwi
mjbvz Apr 30, 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
2 changes: 1 addition & 1 deletion extensions/copilot/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,7 @@ Object.assign(product, {
'publicCodeMatchesUrl': 'https://aka.ms/github-copilot-match-public-code',
'manageSettingsUrl': 'https://aka.ms/github-copilot-settings',
'managePlanUrl': 'https://aka.ms/github-copilot-manage-plan',
'manageAdditionalSpendUrl': 'https://aka.ms/github-copilot-manage-overage',
'manageOverageUrl': 'https://aka.ms/github-copilot-manage-overage',
'upgradePlanUrl': 'https://aka.ms/github-copilot-upgrade-plan',
'signUpUrl': 'https://aka.ms/github-sign-up',
'provider': {
Expand Down
56 changes: 28 additions & 28 deletions extensions/copilot/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion extensions/copilot/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6544,7 +6544,7 @@
"@anthropic-ai/claude-agent-sdk": "0.2.112",
"@anthropic-ai/sdk": "^0.82.0",
"@github/blackbird-external-ingest-utils": "^0.3.0",
"@github/copilot": "1.0.34",
"@github/copilot": "^1.0.39",
"@google/genai": "^1.22.0",
"@humanwhocodes/gitignore-to-minimatch": "1.0.2",
"@microsoft/tiktokenizer": "^1.0.10",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -160,14 +160,14 @@ export class ChatInputNotificationContribution extends Disposable {
notification.message = vscode.l10n.t('Monthly Limit Reached');
notification.description = vscode.l10n.t("You've made the most of Copilot. Sign in to keep going.");
notification.actions = [
{ label: vscode.l10n.t('View Usage'), commandId: 'workbench.action.chat.upgradePlan' },
{ label: vscode.l10n.t('View Usage'), commandId: 'workbench.action.chat.openCopilotStatus' },
{ label: vscode.l10n.t('Sign In'), commandId: 'workbench.action.chat.triggerSetup' },
];
} else {
notification.message = vscode.l10n.t('Monthly Limit Reached');
notification.description = vscode.l10n.t("You've made the most of Copilot Free. Upgrade to keep going.");
notification.actions = [
{ label: vscode.l10n.t('View Usage'), commandId: 'workbench.action.chat.upgradePlan' },
{ label: vscode.l10n.t('View Usage'), commandId: 'workbench.action.chat.openCopilotStatus' },
{ label: vscode.l10n.t('Upgrade'), commandId: 'workbench.action.chat.upgradePlan' },
];
}
Expand All @@ -187,7 +187,7 @@ export class ChatInputNotificationContribution extends Disposable {
notification.message = vscode.l10n.t('Monthly Limit at {0}%', warning.percentUsed);
notification.description = vscode.l10n.t("You're getting the most out of Copilot \u2014 upgrade to keep going.");
notification.actions = [
{ label: vscode.l10n.t('View Usage'), commandId: 'workbench.action.chat.upgradePlan' },
{ label: vscode.l10n.t('View Usage'), commandId: 'workbench.action.chat.openCopilotStatus' },
{ label: vscode.l10n.t('Upgrade'), commandId: 'workbench.action.chat.upgradePlan' },
];

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import { createServiceIdentifier } from '../../../../util/common/services';
import { Emitter, Event } from '../../../../util/vs/base/common/event';
import { Lazy } from '../../../../util/vs/base/common/lazy';
import { Disposable } from '../../../../util/vs/base/common/lifecycle';
import { ResourceSet } from '../../../../util/vs/base/common/map';
import { basename } from '../../../../util/vs/base/common/resources';
import { URI } from '../../../../util/vs/base/common/uri';
import { IInstantiationService } from '../../../../util/vs/platform/instantiation/common/instantiation';
Expand Down Expand Up @@ -382,10 +383,13 @@ export class CopilotCLIAgents extends Disposable implements ICopilotCLIAgents {

async getAgentsImpl(): Promise<readonly CLIAgentInfo[]> {
const merged = new Map<string, CLIAgentInfo>();
const knownAgents = new ResourceSet();
for (const agent of await this.getSDKAgents()) {
const sourceUri = agent.path ? URI.file(agent.path) : URI.from({ scheme: 'copilotcli', path: `/agents/${agent.name}` });
knownAgents.add(sourceUri);
merged.set(agent.name.toLowerCase(), {
agent: this.cloneAgent(agent),
sourceUri: URI.from({ scheme: 'copilotcli', path: `/agents/${agent.name}` }),
sourceUri,
});
}
for (const customAgent of await this.promptsService.getCustomAgents(CancellationToken.None)) {
Expand All @@ -397,6 +401,9 @@ export class CopilotCLIAgents extends Disposable implements ICopilotCLIAgents {
if (customAgent.uri.path.toLowerCase().endsWith('.chatmode.md')) {
continue;
}
if (knownAgents.has(customAgent.uri)) {
continue;
}
const info = this.toCustomAgent(customAgent);
if (!info) {
continue;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -685,7 +685,7 @@ export class CopilotCLISession extends DisposableStore implements ICopilotCLISes
// Auto-approve all requests when the permission level allows it.
if (this._permissionLevel === 'autoApprove' || this._permissionLevel === 'autopilot') {
this.logService.trace(`[CopilotCLISession] Auto Approving ${permissionRequest.kind} request (permission level: ${this._permissionLevel})`);
this._sdkSession.respondToPermission(requestId, { kind: 'approved' });
this._sdkSession.respondToPermission(requestId, { kind: 'approve-once' });
return;
}

Expand Down Expand Up @@ -730,7 +730,7 @@ export class CopilotCLISession extends DisposableStore implements ICopilotCLISes
let response: PermissionRequestResult;
if (this._permissionLevel === 'autoApprove' || this._permissionLevel === 'autopilot') {
this.logService.trace(`[CopilotCLISession] Auto Approving ${permissionRequest.kind} request (permission level: ${this._permissionLevel})`);
response = { kind: 'approved' };
response = { kind: 'approve-once' };
} else if (this._mcState) {
const permissionResolutionTokenSource = new CancellationTokenSource(token);
try {
Expand Down Expand Up @@ -1846,7 +1846,7 @@ export class CopilotCLISession extends DisposableStore implements ICopilotCLISes
logService.warn(`[CopilotCLISession] No pending MC permission request found for prompt ${promptId}`);
break;
}
pendingRequest.resolve(responseData?.approved ? { kind: 'approved' } : { kind: 'denied-interactively-by-user' });
pendingRequest.resolve(responseData?.approved ? { kind: 'approve-once' } : { kind: 'denied-interactively-by-user' });
break;
}
case 'user_message':
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1235,6 +1235,7 @@ export class CopilotCLISessionService extends Disposable implements ICopilotCLIS
}

private createCopilotSession(sdkSession: Session, workspaceInfo: IWorkspaceInfo, agentName: string | undefined, sessionManager: internal.LocalSessionManager): RefCountedSession {
sdkSession.setPermissionsRequired(true);
const session = this.instantiationService.createInstance(CopilotCLISession, workspaceInfo, agentName, sdkSession, []);
this._debugFileLogger.startSession(session.sessionId).catch(err => {
this.logService.error('[CopilotCLISession] Failed to start debug log session', err);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,30 +66,30 @@ export async function handleReadPermission(
const file = Uri.file(permissionRequest.path);

if (imageSupport.isTrustedImage(file)) {
return { kind: 'approved' };
return { kind: 'approve-once' };
}

if (isFileFromSessionWorkspace(file, workspaceInfo)) {
logService.trace(`[CopilotCLISession] Auto Approving request to read file in session workspace ${permissionRequest.path}`);
return { kind: 'approved' };
return { kind: 'approve-once' };
}

if (workspaceService.getWorkspaceFolder(file)) {
logService.trace(`[CopilotCLISession] Auto Approving request to read workspace file ${permissionRequest.path}`);
return { kind: 'approved' };
return { kind: 'approve-once' };
}

// Auto-approve reads of internal session resources (e.g. plan.md).
const sessionDir = Uri.joinPath(Uri.file(getCopilotCLISessionStateDir()), sessionId);
if (extUriBiasedIgnorePathCase.isEqualOrParent(file, sessionDir)) {
logService.trace(`[CopilotCLISession] Auto Approving request to read Copilot CLI session resource ${permissionRequest.path}`);
return { kind: 'approved' };
return { kind: 'approve-once' };
}

// Auto-approve if the file was explicitly attached by the user.
if (attachments.some(attachment => attachment.type === 'file' && isEqual(Uri.file(attachment.path), file))) {
logService.trace(`[CopilotCLISession] Auto Approving request to read attached file ${permissionRequest.path}`);
return { kind: 'approved' };
return { kind: 'approve-once' };
}

const toolParams: CoreConfirmationToolParams = {
Expand Down Expand Up @@ -149,15 +149,15 @@ export async function handleWritePermission(
if (autoApprove) {
logService.trace(`[CopilotCLISession] Auto Approving request ${editFile.fsPath}`);
await trackEditIfNeeded(editTracker, toolCall, editFile, stream, logService);
return { kind: 'approved' };
return { kind: 'approve-once' };
}
}

// Auto-approve writes to internal session resources (e.g. plan.md).
const sessionDir = Uri.joinPath(Uri.file(getCopilotCLISessionStateDir()), sessionId);
if (editFile && extUriBiasedIgnorePathCase.isEqualOrParent(editFile, sessionDir)) {
logService.trace(`[CopilotCLISession] Auto Approving request to write to Copilot CLI session resource ${editFile.fsPath}`);
return { kind: 'approved' };
return { kind: 'approve-once' };
}

// Fall back to interactive confirmation. If approved, track the edit.
Expand All @@ -174,10 +174,10 @@ export async function handleWritePermission(
if (editFile) {
await trackEditIfNeeded(editTracker, toolCall, editFile, stream, logService);
}
return { kind: 'approved' };
return { kind: 'approve-once' };
}
const result = await invokeConfirmationTool(toolParams, toolParentCallId, toolsService, toolInvocationToken, logService, token);
if (result.kind === 'approved' && editFile) {
if (result.kind === 'approve-once' && editFile) {
await trackEditIfNeeded(editTracker, toolCall, editFile, stream, logService);
}
return result;
Expand Down Expand Up @@ -282,7 +282,7 @@ async function invokeConfirmationTool(
const result = await toolsService.invokeTool(tool, { input, toolInvocationToken, subAgentInvocationId: toolParentCallId }, token);
const firstResultPart = result.content.at(0);
if (firstResultPart instanceof LanguageModelTextPart && typeof firstResultPart.value === 'string' && firstResultPart.value.toLowerCase() === 'yes') {
return { kind: 'approved' };
return { kind: 'approve-once' };
}
} catch (error) {
logService.error(error, `[CopilotCLISession] Permission request error`);
Expand Down
Loading
Loading