From b00da6f941e7cacf6553789902e7b7d6bc3b5194 Mon Sep 17 00:00:00 2001 From: Osvaldo Ortega Date: Tue, 20 Jan 2026 16:18:53 -0800 Subject: [PATCH 1/6] Privacy footer for agents welcome page --- .../browser/agentSessionsWelcome.ts | 46 +++++++++++++++++++ .../browser/media/agentSessionsWelcome.css | 22 +++++++++ 2 files changed, 68 insertions(+) diff --git a/src/vs/workbench/contrib/welcomeAgentSessions/browser/agentSessionsWelcome.ts b/src/vs/workbench/contrib/welcomeAgentSessions/browser/agentSessionsWelcome.ts index e437e7144ef..9c4b78fa776 100644 --- a/src/vs/workbench/contrib/welcomeAgentSessions/browser/agentSessionsWelcome.ts +++ b/src/vs/workbench/contrib/welcomeAgentSessions/browser/agentSessionsWelcome.ts @@ -40,6 +40,7 @@ import { AgentSessionsWelcomeEditorOptions, AgentSessionsWelcomeInput } from './ import { IChatService } from '../../chat/common/chatService/chatService.js'; import { IChatModel } from '../../chat/common/model/chatModel.js'; import { ISessionTypePickerDelegate } from '../../chat/browser/chat.js'; +import { IChatEntitlementService } from '../../../services/chat/common/chatEntitlementService.js'; import { AgentSessionsControl, IAgentSessionsControlOptions } from '../../chat/browser/agentSessions/agentSessionsControl.js'; import { IAgentSessionsFilter } from '../../chat/browser/agentSessions/agentSessionsViewer.js'; import { HoverPosition } from '../../../../base/browser/ui/hover/hoverWidget.js'; @@ -79,6 +80,7 @@ export class AgentSessionsWelcomePage extends EditorPane { @IProductService private readonly productService: IProductService, @IWalkthroughsService private readonly walkthroughsService: IWalkthroughsService, @IChatService private readonly chatService: IChatService, + @IChatEntitlementService private readonly chatEntitlementService: IChatEntitlementService, ) { super(AgentSessionsWelcomePage.ID, group, telemetryService, themeService, storageService); @@ -349,7 +351,51 @@ export class AgentSessionsWelcomePage extends EditorPane { } } + private buildPrivacyNotice(container: HTMLElement): void { + // TOS/Privacy notice for users who are not signed in - reusing walkthrough card design + if (!this.chatEntitlementService.anonymous) { + return; + } + + const providers = this.productService.defaultChatAgent?.provider; + if (!providers || !this.productService.defaultChatAgent?.termsStatementUrl || !this.productService.defaultChatAgent?.privacyStatementUrl) { + return; + } + + const tosCard = append(container, $('.agentSessionsWelcome-walkthroughCard.agentSessionsWelcome-tosCard')); + + // Icon + const iconContainer = append(tosCard, $('.agentSessionsWelcome-walkthroughCard-icon')); + iconContainer.appendChild(renderIcon(Codicon.commentDiscussion)); + + // Content + const content = append(tosCard, $('.agentSessionsWelcome-walkthroughCard-content')); + const title = append(content, $('.agentSessionsWelcome-walkthroughCard-title')); + title.textContent = localize('tosTitle', "AI Feature Trial is Active"); + + const desc = append(content, $('.agentSessionsWelcome-walkthroughCard-description')); + desc.textContent = localize( + { key: 'tosDescription', comment: ['{Locked="]"}'] }, + "By continuing, you agree to {0}'s ", + providers.default.name + ); + const termsLink = append(desc, $('a.agentSessionsWelcome-tosLink')); + termsLink.textContent = localize('terms', "Terms"); + termsLink.href = this.productService.defaultChatAgent.termsStatementUrl; + termsLink.target = '_blank'; + desc.appendChild(document.createTextNode(localize('and', " and "))); + const privacyLink = append(desc, $('a.agentSessionsWelcome-tosLink')); + privacyLink.textContent = localize('privacyStatement', "Privacy statement"); + privacyLink.href = this.productService.defaultChatAgent.privacyStatementUrl; + privacyLink.target = '_blank'; + desc.appendChild(document.createTextNode('.')); + } + private buildFooter(container: HTMLElement): void { + + // Privacy notice + this.buildPrivacyNotice(container); + // Learning link const learningLink = append(container, $('button.agentSessionsWelcome-footerLink')); learningLink.appendChild(renderIcon(Codicon.mortarBoard)); diff --git a/src/vs/workbench/contrib/welcomeAgentSessions/browser/media/agentSessionsWelcome.css b/src/vs/workbench/contrib/welcomeAgentSessions/browser/media/agentSessionsWelcome.css index 35d56a9feab..2309a4ba97d 100644 --- a/src/vs/workbench/contrib/welcomeAgentSessions/browser/media/agentSessionsWelcome.css +++ b/src/vs/workbench/contrib/welcomeAgentSessions/browser/media/agentSessionsWelcome.css @@ -358,3 +358,25 @@ width: 16px; height: 16px; } + +/* TOS/Privacy card - extends walkthrough card with TOS-specific overrides */ +.agentSessionsWelcome-tosCard { + width: 100%; + max-width: 800px; + margin-bottom: 16px; + box-sizing: border-box; + cursor: default; +} + +.agentSessionsWelcome-tosCard:hover { + background-color: var(--vscode-welcomePage-tileBackground); +} + +.agentSessionsWelcome-tosLink { + color: var(--vscode-textLink-foreground); + text-decoration: none; +} + +.agentSessionsWelcome-tosLink:hover { + text-decoration: underline; +} From 4a8af5d7f90ad49e7416fd3a7ceb0f1fa014997e Mon Sep 17 00:00:00 2001 From: Osvaldo Ortega <48293249+osortega@users.noreply.github.com> Date: Tue, 20 Jan 2026 16:36:28 -0800 Subject: [PATCH 2/6] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../welcomeAgentSessions/browser/agentSessionsWelcome.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/welcomeAgentSessions/browser/agentSessionsWelcome.ts b/src/vs/workbench/contrib/welcomeAgentSessions/browser/agentSessionsWelcome.ts index 9c4b78fa776..4c4ff736417 100644 --- a/src/vs/workbench/contrib/welcomeAgentSessions/browser/agentSessionsWelcome.ts +++ b/src/vs/workbench/contrib/welcomeAgentSessions/browser/agentSessionsWelcome.ts @@ -358,7 +358,7 @@ export class AgentSessionsWelcomePage extends EditorPane { } const providers = this.productService.defaultChatAgent?.provider; - if (!providers || !this.productService.defaultChatAgent?.termsStatementUrl || !this.productService.defaultChatAgent?.privacyStatementUrl) { + if (!providers || !providers.default || !this.productService.defaultChatAgent?.termsStatementUrl || !this.productService.defaultChatAgent?.privacyStatementUrl) { return; } From 29ddeaa23f47798133495047574b0dad45ed72ba Mon Sep 17 00:00:00 2001 From: Osvaldo Ortega <48293249+osortega@users.noreply.github.com> Date: Tue, 20 Jan 2026 16:36:49 -0800 Subject: [PATCH 3/6] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../welcomeAgentSessions/browser/agentSessionsWelcome.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/vs/workbench/contrib/welcomeAgentSessions/browser/agentSessionsWelcome.ts b/src/vs/workbench/contrib/welcomeAgentSessions/browser/agentSessionsWelcome.ts index 4c4ff736417..53ff33b49a7 100644 --- a/src/vs/workbench/contrib/welcomeAgentSessions/browser/agentSessionsWelcome.ts +++ b/src/vs/workbench/contrib/welcomeAgentSessions/browser/agentSessionsWelcome.ts @@ -383,11 +383,13 @@ export class AgentSessionsWelcomePage extends EditorPane { termsLink.textContent = localize('terms', "Terms"); termsLink.href = this.productService.defaultChatAgent.termsStatementUrl; termsLink.target = '_blank'; + termsLink.rel = 'noopener'; desc.appendChild(document.createTextNode(localize('and', " and "))); const privacyLink = append(desc, $('a.agentSessionsWelcome-tosLink')); privacyLink.textContent = localize('privacyStatement', "Privacy statement"); privacyLink.href = this.productService.defaultChatAgent.privacyStatementUrl; privacyLink.target = '_blank'; + privacyLink.rel = 'noopener'; desc.appendChild(document.createTextNode('.')); } From b6768f08a61e61c851764d2aacf681e0d98b1215 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 21 Jan 2026 00:43:57 +0000 Subject: [PATCH 4/6] Initial plan From c6d89825e84d2f7a8c189d31f8f0b4326e4b5c69 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 21 Jan 2026 00:50:42 +0000 Subject: [PATCH 5/6] Use MarkdownString for localization with links following VS Code patterns Co-authored-by: osortega <48293249+osortega@users.noreply.github.com> --- .../browser/agentSessionsWelcome.ts | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/src/vs/workbench/contrib/welcomeAgentSessions/browser/agentSessionsWelcome.ts b/src/vs/workbench/contrib/welcomeAgentSessions/browser/agentSessionsWelcome.ts index 53ff33b49a7..392494ace5d 100644 --- a/src/vs/workbench/contrib/welcomeAgentSessions/browser/agentSessionsWelcome.ts +++ b/src/vs/workbench/contrib/welcomeAgentSessions/browser/agentSessionsWelcome.ts @@ -45,6 +45,8 @@ import { AgentSessionsControl, IAgentSessionsControlOptions } from '../../chat/b import { IAgentSessionsFilter } from '../../chat/browser/agentSessions/agentSessionsViewer.js'; import { HoverPosition } from '../../../../base/browser/ui/hover/hoverWidget.js'; import { IResolvedWalkthrough, IWalkthroughsService } from '../../welcomeGettingStarted/browser/gettingStartedService.js'; +import { IMarkdownRendererService } from '../../../../platform/markdown/browser/markdownRenderer.js'; +import { MarkdownString } from '../../../../base/common/htmlContent.js'; const configurationKey = 'workbench.startupEditor'; const MAX_SESSIONS = 6; @@ -81,6 +83,7 @@ export class AgentSessionsWelcomePage extends EditorPane { @IWalkthroughsService private readonly walkthroughsService: IWalkthroughsService, @IChatService private readonly chatService: IChatService, @IChatEntitlementService private readonly chatEntitlementService: IChatEntitlementService, + @IMarkdownRendererService private readonly markdownRendererService: IMarkdownRendererService, ) { super(AgentSessionsWelcomePage.ID, group, telemetryService, themeService, storageService); @@ -374,23 +377,19 @@ export class AgentSessionsWelcomePage extends EditorPane { title.textContent = localize('tosTitle', "AI Feature Trial is Active"); const desc = append(content, $('.agentSessionsWelcome-walkthroughCard-description')); - desc.textContent = localize( - { key: 'tosDescription', comment: ['{Locked="]"}'] }, - "By continuing, you agree to {0}'s ", - providers.default.name + const descriptionMarkdown = new MarkdownString( + localize( + { key: 'tosDescription', comment: ['{Locked="]({2})"}', '{Locked="]({3})"}'] }, + "By continuing, you agree to {0}'s [Terms]({2}) and [Privacy Statement]({3}).", + providers.default.name, + providers.default.name, + this.productService.defaultChatAgent.termsStatementUrl, + this.productService.defaultChatAgent.privacyStatementUrl + ), + { isTrusted: true } ); - const termsLink = append(desc, $('a.agentSessionsWelcome-tosLink')); - termsLink.textContent = localize('terms', "Terms"); - termsLink.href = this.productService.defaultChatAgent.termsStatementUrl; - termsLink.target = '_blank'; - termsLink.rel = 'noopener'; - desc.appendChild(document.createTextNode(localize('and', " and "))); - const privacyLink = append(desc, $('a.agentSessionsWelcome-tosLink')); - privacyLink.textContent = localize('privacyStatement', "Privacy statement"); - privacyLink.href = this.productService.defaultChatAgent.privacyStatementUrl; - privacyLink.target = '_blank'; - privacyLink.rel = 'noopener'; - desc.appendChild(document.createTextNode('.')); + const renderedMarkdown = this.markdownRendererService.render(descriptionMarkdown); + desc.appendChild(renderedMarkdown.element); } private buildFooter(container: HTMLElement): void { From 1d088083e213687fcdb2f161fd5b2ed1d75a0c92 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 21 Jan 2026 00:55:03 +0000 Subject: [PATCH 6/6] Remove duplicate provider name parameter Co-authored-by: osortega <48293249+osortega@users.noreply.github.com> --- .../welcomeAgentSessions/browser/agentSessionsWelcome.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/welcomeAgentSessions/browser/agentSessionsWelcome.ts b/src/vs/workbench/contrib/welcomeAgentSessions/browser/agentSessionsWelcome.ts index 392494ace5d..a94e8202194 100644 --- a/src/vs/workbench/contrib/welcomeAgentSessions/browser/agentSessionsWelcome.ts +++ b/src/vs/workbench/contrib/welcomeAgentSessions/browser/agentSessionsWelcome.ts @@ -379,9 +379,8 @@ export class AgentSessionsWelcomePage extends EditorPane { const desc = append(content, $('.agentSessionsWelcome-walkthroughCard-description')); const descriptionMarkdown = new MarkdownString( localize( - { key: 'tosDescription', comment: ['{Locked="]({2})"}', '{Locked="]({3})"}'] }, - "By continuing, you agree to {0}'s [Terms]({2}) and [Privacy Statement]({3}).", - providers.default.name, + { key: 'tosDescription', comment: ['{Locked="]({1})"}', '{Locked="]({2})"}'] }, + "By continuing, you agree to {0}'s [Terms]({1}) and [Privacy Statement]({2}).", providers.default.name, this.productService.defaultChatAgent.termsStatementUrl, this.productService.defaultChatAgent.privacyStatementUrl