Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
3205ca3
Layout modal editor with position & during drag updates (#314555)
kycutler May 5, 2026
f8b01a9
sessions: remove Home button from customizations view header (#314291)
joshspicer May 5, 2026
35ff8f3
sessions: remove theme step from welcome flow and update title (#314551)
sandy081 May 5, 2026
1622b23
chat: gate aiCustomization sync event subscriptions when itemProvider…
joshspicer May 5, 2026
4830d72
agentHost: initial scaffolding out for completions
connor4312 May 5, 2026
c25f7a7
Add Cmd+Shift+A keybinding to switch between VS Code and Agents windo…
sandy081 May 5, 2026
b6a00bc
Fix image preview root for `git:` files
mjbvz May 5, 2026
dbdeef4
Enable markdown image context menu in custom editors too
mjbvz May 5, 2026
7efafec
Disable doubleClickToSwitchToEditor and markEditorSelection by default
mjbvz May 5, 2026
f20ea1c
Merge pull request #314581 from mjbvz/dev/mjbvz/pleased-catfish
mjbvz May 5, 2026
e342779
Allow agents window to be restored on restart (#314580)
sandy081 May 5, 2026
d926cd7
Merge pull request #314585 from microsoft/dev/mjbvz/xeric-swallow
mjbvz May 5, 2026
c7bc16d
Fix UBB detection (#314584)
pwang347 May 6, 2026
be340b1
Introduce proposed `agentsWindow` configuration extension point (#314…
sandy081 May 6, 2026
ec46e33
Fix stale BYOK models in model picker after API key removal (#314577)
vijayupadya May 6, 2026
b884b25
sessions: enable Search Editor and Problems panel in Agents window (#…
sandy081 May 6, 2026
e4e037b
Merge pull request #314574 from microsoft/connor4312/ah-initial-compl…
connor4312 May 6, 2026
d2f4a23
Merge pull request #314588 from microsoft/dev/mjbvz/yodelling-fowl
mjbvz May 6, 2026
5d6fc55
Open Workspace In Agents Window: select folder in new chat view (#314…
sandy081 May 6, 2026
724775b
Skip passing folder URI to agents window for non-file schemes (#314607)
sandy081 May 6, 2026
48f0cac
sessions: add command to open events.jsonl for active Copilot CLI AH …
roblourens May 6, 2026
154bccc
Remember previously selected session type and isolation mode (#314609)
sandy081 May 6, 2026
8851152
Simplify sign-in state for chat status dashboard (#314611)
pwang347 May 6, 2026
88fa3d9
agent test: warm tokenizer in beforeAll to fix summarization test fla…
roblourens May 6, 2026
89fc639
Close mobile sidebar drawer when creating a new session (#314572)
osortega May 6, 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
60 changes: 49 additions & 11 deletions extensions/copilot/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@
"l10n": "./l10n",
"enabledApiProposals": [
"agentSessionsWorkspace",
"agentsWindowConfiguration",
"chatDebug",
"chatHooks",
"extensionsAny",
Expand Down Expand Up @@ -3137,7 +3138,13 @@
"additionalProperties": {
"type": "boolean"
},
"markdownDescription": "Enable or disable auto triggering of Copilot completions for specified [languages](https://code.visualstudio.com/docs/languages/identifiers). You can still trigger suggestions manually using `Alt + \\`"
"markdownDescription": "Enable or disable auto triggering of Copilot completions for specified [languages](https://code.visualstudio.com/docs/languages/identifiers). You can still trigger suggestions manually using `Alt + \\`",
"agentsWindow": {
"default": {
"markdown": true,
"plaintext": true
}
}
},
"github.copilot.selectedCompletionModel": {
"type": "string",
Expand Down Expand Up @@ -3306,7 +3313,10 @@
"markdownDescription": "%github.copilot.config.githubMcpServer.enabled%",
"tags": [
"experimental"
]
],
"agentsWindow": {
"default": true
}
},
"github.copilot.chat.githubMcpServer.toolsets": {
"type": "array",
Expand Down Expand Up @@ -3652,7 +3662,10 @@
"experimental",
"onExP"
],
"markdownDescription": "%github.copilot.chat.languageContext.typescript.enabled%"
"markdownDescription": "%github.copilot.chat.languageContext.typescript.enabled%",
"agentsWindow": {
"default": true
}
},
"github.copilot.chat.languageContext.typescript.items": {
"type": "string",
Expand Down Expand Up @@ -4648,23 +4661,32 @@
"tags": [
"advanced",
"experimental"
]
],
"agentsWindow": {
"default": true
}
},
"github.copilot.chat.cli.branchSupport.enabled": {
"type": "boolean",
"default": false,
"markdownDescription": "%github.copilot.config.cli.branchSupport.enabled%",
"tags": [
"advanced"
]
],
"agentsWindow": {
"default": true
}
},
"github.copilot.chat.cli.showExternalSessions": {
"type": "boolean",
"default": true,
"markdownDescription": "%github.copilot.config.cli.showExternalSessions%",
"tags": [
"advanced"
]
],
"agentsWindow": {
"default": false
}
},
"github.copilot.chat.cli.planExitMode.enabled": {
"type": "boolean",
Expand Down Expand Up @@ -4704,7 +4726,10 @@
"markdownDescription": "%github.copilot.config.cli.lazyLoadSessionItem.enabled%",
"tags": [
"advanced"
]
],
"agentsWindow": {
"default": false
}
},
"github.copilot.chat.cli.aiGenerateBranchNames.enabled": {
"type": "boolean",
Expand All @@ -4728,7 +4753,10 @@
"markdownDescription": "%github.copilot.config.cli.isolationOption.enabled%",
"tags": [
"advanced"
]
],
"agentsWindow": {
"default": true
}
},
"github.copilot.chat.cli.autoCommit.enabled": {
"type": "boolean",
Expand All @@ -4737,15 +4765,22 @@
"tags": [
"advanced",
"experimental"
]
],
"agentsWindow": {
"default": false
}
},
"github.copilot.chat.cli.sessionController.enabled": {
"type": "boolean",
"default": true,
"markdownDescription": "%github.copilot.config.cli.sessionController.enabled%",
"tags": [
"advanced"
]
],
"agentsWindow": {
"default": false,
"readOnly": true
}
},
"github.copilot.chat.cli.thinkingEffort.enabled": {
"type": "boolean",
Expand Down Expand Up @@ -4777,7 +4812,10 @@
"markdownDescription": "%github.copilot.config.cli.remote.enabled%",
"tags": [
"advanced"
]
],
"agentsWindow": {
"default": false
}
},
"github.copilot.chat.searchSubagent.enabled": {
"type": "boolean",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import { PromptRenderer } from '../../base/promptRenderer';
import { AgentPrompt, AgentPromptProps } from '../agentPrompt';
import { PromptRegistry } from '../promptRegistry';
import { ISessionTranscriptService, NullSessionTranscriptService } from '../../../../../platform/chat/common/sessionTranscriptService';
import { ITokenizerProvider } from '../../../../../platform/tokenizer/node/tokenizer';
import { appendTranscriptHintToSummary, ConversationHistorySummarizationPrompt, extractSummary, stripToolSearchMessages, SummarizedConversationHistory, SummarizedConversationHistoryMetadata, SummarizedConversationHistoryPropsBuilder } from '../summarizedConversationHistory';

suite('Agent Summarization', () => {
Expand All @@ -40,7 +41,7 @@ suite('Agent Summarization', () => {

let conversation: Conversation;

beforeAll(() => {
beforeAll(async () => {
const testDoc = createTextDocumentData(fileTsUri, 'line 1\nline 2\n\nline 4\nline 5', 'ts').document;

const services = createExtensionUnitTestingServices();
Expand All @@ -57,6 +58,12 @@ suite('Agent Summarization', () => {
accessor.get(IConfigurationService).setConfig(ConfigKey.CodeGenerationInstructions, [{
text: 'This is a test custom instruction file',
} satisfies CodeGenerationTextInstruction]);

// Warm up the tokenizer once so per-test timing is predictable. The first
// tokenizer use parses a ~3.6MB BPE file which can take seconds on slow CI
// machines and would otherwise be charged to whichever test runs first.
const endpoint = accessor.get(IInstantiationService).createInstance(MockEndpoint, undefined);
await accessor.get(ITokenizerProvider).acquireTokenizer(endpoint).tokenLength('warmup');
});

beforeEach(() => {
Expand Down
27 changes: 22 additions & 5 deletions extensions/git/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"aiKey": "0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255",
"enabledApiProposals": [
"agentSessionsWorkspace",
"agentsWindowConfiguration",
"canonicalUriProvider",
"contribEditSessions",
"contribEditorContentMenu",
Expand Down Expand Up @@ -3321,7 +3322,10 @@
"git.autorefresh": {
"type": "boolean",
"description": "%config.autorefresh%",
"default": true
"default": true,
"agentsWindow": {
"default": true
}
},
"git.autofetch": {
"type": [
Expand All @@ -3338,7 +3342,10 @@
"default": false,
"tags": [
"usesOnlineServices"
]
],
"agentsWindow": {
"default": true
}
},
"git.autofetchPeriod": {
"type": "number",
Expand Down Expand Up @@ -3397,7 +3404,10 @@
"type": "boolean",
"description": "%config.branchRandomNameEnable%",
"default": false,
"scope": "resource"
"scope": "resource",
"agentsWindow": {
"default": true
}
},
"git.branchRandomName.dictionary": {
"type": "array",
Expand Down Expand Up @@ -3695,7 +3705,10 @@
"type": "boolean",
"scope": "resource",
"default": false,
"description": "%config.detectWorktrees%"
"description": "%config.detectWorktrees%",
"agentsWindow": {
"default": false
}
},
"git.detectWorktreesLimit": {
"type": "number",
Expand Down Expand Up @@ -3771,7 +3784,11 @@
"type": "boolean",
"description": "%config.showProgress%",
"default": true,
"scope": "resource"
"scope": "resource",
"agentsWindow": {
"default": false,
"readOnly": true
}
},
"git.rebaseWhenSync": {
"type": "boolean",
Expand Down
8 changes: 4 additions & 4 deletions extensions/markdown-language-features/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -215,11 +215,11 @@
"webview/context": [
{
"command": "_markdown.copyImage",
"when": "webviewId == 'markdown.preview' && (webviewSection == 'image' || webviewSection == 'localImage')"
"when": "(webviewId == 'markdown.preview' || webviewId == 'vscode.markdown.preview.editor') && (webviewSection == 'image' || webviewSection == 'localImage')"
},
{
"command": "_markdown.openImage",
"when": "webviewId == 'markdown.preview' && webviewSection == 'localImage'"
"when": "(webviewId == 'markdown.preview' || webviewId == 'vscode.markdown.preview.editor') && webviewSection == 'localImage'"
}
],
"editor/title": [
Expand Down Expand Up @@ -741,7 +741,7 @@
},
"markdown.preview.markEditorSelection": {
"type": "boolean",
"default": true,
"default": false,
"description": "%markdown.preview.markEditorSelection.desc%",
"scope": "resource"
},
Expand All @@ -753,7 +753,7 @@
},
"markdown.preview.doubleClickToSwitchToEditor": {
"type": "boolean",
"default": true,
"default": false,
"description": "%markdown.preview.doubleClickToSwitchToEditor.desc%",
"scope": "resource"
},
Expand Down
4 changes: 3 additions & 1 deletion extensions/media-preview/src/mediaPreview.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,13 @@ export abstract class MediaPreview extends Disposable {
) {
super();

const resourceRoot = Utils.dirname(_resource).with({ query: '', fragment: '' });

_webviewEditor.webview.options = {
enableScripts: true,
enableForms: false,
localResourceRoots: [
Utils.dirname(_resource),
resourceRoot,
extensionRoot,
]
};
Expand Down
1 change: 1 addition & 0 deletions src/vs/base/common/defaultAccount.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ export interface IEntitlementsData extends ILegacyQuotaSnapshotData {
readonly limited_user_reset_date?: string; // for Copilot Free
readonly quota_reset_date?: string; // for all other Copilot SKUs
readonly quota_reset_date_utc?: string; // for all other Copilot SKUs (includes time)
readonly token_based_billing?: boolean;
readonly quota_snapshots?: {
chat?: IQuotaSnapshotData;
completions?: IQuotaSnapshotData;
Expand Down
16 changes: 11 additions & 5 deletions src/vs/editor/common/config/editorConfigurationSchema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,8 @@ const editorConfiguration: IConfigurationNode = {
'diffEditor.renderSideBySide': {
type: 'boolean',
default: diffEditorDefaultOptions.renderSideBySide,
description: nls.localize('sideBySide', "Controls whether the diff editor shows the diff side by side or inline.")
description: nls.localize('sideBySide', "Controls whether the diff editor shows the diff side by side or inline."),
agentsWindow: { default: true },
},
'diffEditor.renderSideBySideInlineBreakpoint': {
type: 'number',
Expand All @@ -217,17 +218,20 @@ const editorConfiguration: IConfigurationNode = {
'diffEditor.useInlineViewWhenSpaceIsLimited': {
type: 'boolean',
default: diffEditorDefaultOptions.useInlineViewWhenSpaceIsLimited,
description: nls.localize('useInlineViewWhenSpaceIsLimited', "If enabled and the editor width is too small, the inline view is used.")
description: nls.localize('useInlineViewWhenSpaceIsLimited', "If enabled and the editor width is too small, the inline view is used."),
agentsWindow: { default: true },
},
'diffEditor.renderMarginRevertIcon': {
type: 'boolean',
default: diffEditorDefaultOptions.renderMarginRevertIcon,
description: nls.localize('renderMarginRevertIcon', "When enabled, the diff editor shows arrows in its glyph margin to revert changes.")
description: nls.localize('renderMarginRevertIcon', "When enabled, the diff editor shows arrows in its glyph margin to revert changes."),
agentsWindow: { default: false },
},
'diffEditor.renderGutterMenu': {
type: 'boolean',
default: diffEditorDefaultOptions.renderGutterMenu,
description: nls.localize('renderGutterMenu', "When enabled, the diff editor shows a special gutter for revert and stage actions.")
description: nls.localize('renderGutterMenu', "When enabled, the diff editor shows a special gutter for revert and stage actions."),
agentsWindow: { default: false },
},
'diffEditor.ignoreTrimWhitespace': {
type: 'boolean',
Expand All @@ -237,7 +241,8 @@ const editorConfiguration: IConfigurationNode = {
'diffEditor.renderIndicators': {
type: 'boolean',
default: diffEditorDefaultOptions.renderIndicators,
description: nls.localize('renderIndicators', "Controls whether the diff editor shows +/- indicators for added/removed changes.")
description: nls.localize('renderIndicators', "Controls whether the diff editor shows +/- indicators for added/removed changes."),
agentsWindow: { default: false },
},
'diffEditor.codeLens': {
type: 'boolean',
Expand Down Expand Up @@ -267,6 +272,7 @@ const editorConfiguration: IConfigurationNode = {
type: 'boolean',
default: diffEditorDefaultOptions.hideUnchangedRegions.enabled,
markdownDescription: nls.localize('hideUnchangedRegions.enabled', "Controls whether the diff editor shows unchanged regions."),
agentsWindow: { default: true },
},
'diffEditor.hideUnchangedRegions.revealLineCount': {
type: 'integer',
Expand Down
3 changes: 2 additions & 1 deletion src/vs/platform/agentHost/browser/nullAgentHostService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { constObservable, IObservable } from '../../../base/common/observable.js
import { URI } from '../../../base/common/uri.js';
import type { IAgentCreateSessionConfig, IAgentHostInspectInfo, IAgentHostService, IAgentHostSocketInfo, IAgentResolveSessionConfigParams, IAgentSessionConfigCompletionsParams, IAgentSessionMetadata, AuthenticateParams, AuthenticateResult } from '../common/agentService.js';
import type { IAgentSubscription } from '../common/state/agentSubscription.js';
import type { CreateTerminalParams, ResolveSessionConfigResult, SessionConfigCompletionsResult } from '../common/state/protocol/commands.js';
import type { CompletionsParams, CompletionsResult, CreateTerminalParams, ResolveSessionConfigResult, SessionConfigCompletionsResult } from '../common/state/protocol/commands.js';
import type { ActionEnvelope, INotification, IRootConfigChangedAction, SessionAction, TerminalAction } from '../common/state/sessionActions.js';
import type { ResourceCopyParams, ResourceCopyResult, ResourceDeleteParams, ResourceDeleteResult, ResourceListResult, ResourceMoveParams, ResourceMoveResult, ResourceReadResult, ResourceWriteParams, ResourceWriteResult } from '../common/state/sessionProtocol.js';
import type { ComponentToState, RootState, StateComponents } from '../common/state/sessionState.js';
Expand Down Expand Up @@ -44,6 +44,7 @@ export class NullAgentHostService implements IAgentHostService {
async createSession(_config?: IAgentCreateSessionConfig): Promise<URI> { return notSupported(); }
async resolveSessionConfig(_params: IAgentResolveSessionConfigParams): Promise<ResolveSessionConfigResult> { return notSupported(); }
async sessionConfigCompletions(_params: IAgentSessionConfigCompletionsParams): Promise<SessionConfigCompletionsResult> { return notSupported(); }
async completions(_params: CompletionsParams): Promise<CompletionsResult> { return { items: [] }; }
async startWebSocketServer(): Promise<IAgentHostSocketInfo> { return notSupported(); }
async getInspectInfo(_tryEnable: boolean): Promise<IAgentHostInspectInfo | undefined> { return undefined; }
async disposeSession(_session: URI): Promise<void> { }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import { PROTOCOL_VERSION } from '../common/state/protocol/version/registry.js';
import { isJsonRpcNotification, isJsonRpcRequest, isJsonRpcResponse, ProtocolError, type ProtocolMessage, type IStateSnapshot } from '../common/state/sessionProtocol.js';
import { isClientTransport, type IProtocolTransport } from '../common/state/sessionTransport.js';
import { AhpErrorCodes } from '../common/state/protocol/errors.js';
import { ContentEncoding, ResourceRequestParams, type CreateTerminalParams, type ResolveSessionConfigResult, type SessionConfigCompletionsResult } from '../common/state/protocol/commands.js';
import { ContentEncoding, ResourceRequestParams, type CompletionsParams, type CompletionsResult, type CreateTerminalParams, type ResolveSessionConfigResult, type SessionConfigCompletionsResult } from '../common/state/protocol/commands.js';
import { decodeBase64, encodeBase64, VSBuffer } from '../../../base/common/buffer.js';

const AHP_CLIENT_CONNECTION_CLOSED = -32000;
Expand Down Expand Up @@ -249,6 +249,10 @@ export class RemoteAgentHostProtocolClient extends Disposable implements IAgentC
});
}

async completions(params: CompletionsParams): Promise<CompletionsResult> {
return this._sendRequest('completions', params);
}

/**
* Authenticate with the remote agent host using a specific scheme.
*/
Expand Down
Loading
Loading