Skip to content

Commit c5fc8d9

Browse files
Rewrite the no-account copy, and point Claude at its integrations docs
The four sentences now put every sign-in route and the reload into one "or" list, ranked as the buttons rank them, and give the docs their own trailing sentence. Claude's docs URL moves to the third-party integrations page, which is what "other ways to set up Claude" actually means: Console, Bedrock, Vertex, Foundry, Teams and Enterprise. "Set up" is the verb, two words, as the rest of the string already had it. Both agents' URL constants still described the workbench as labelling a button. It has been a link since docs stopped being an action. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent 198313b commit c5fc8d9

5 files changed

Lines changed: 18 additions & 19 deletions

File tree

src/vs/platform/agentHost/node/claude/claudeAgent.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ import { IAgentHostOTelService } from '../../common/otel/agentHostOTelService.js
6868

6969
const USER_AGENT_PREFIX = 'vscode_claude_code';
7070

71-
/** Where a user goes to establish Claude credentials; the workbench labels the button. */
72-
const CLAUDE_SETUP_DOCS_URL = 'https://docs.claude.com/en/docs/claude-code/setup';
71+
/** Where a user goes to establish Claude credentials; the workbench labels the link. */
72+
const CLAUDE_SETUP_DOCS_URL = 'https://code.claude.com/docs/en/third-party-integrations';
7373

7474
/**
7575
* Returns true if `m` is a Claude-family model that should be advertised

src/vs/platform/agentHost/node/codex/codexAgent.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ const CODEX_THINKING_LEVEL_KEY = 'thinkingLevel';
175175
*/
176176
const USER_AGENT_PREFIX = 'vscode_codex';
177177

178-
/** Where a user finishes setting Codex up outside the app; the workbench labels the button. */
178+
/** Where a user finishes setting Codex up outside the app; the workbench labels the link. */
179179
const CODEX_SETUP_DOCS_URL = 'https://learn.chatgpt.com/codex/auth';
180180

181181
/**

src/vs/platform/agentHost/test/node/claudeAgent.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6092,7 +6092,7 @@ suite('ClaudeAgent — agent SDK setup channel', () => {
60926092
assert.deepStrictEqual(readSetup(ctx), {
60936093
agent: 'claude',
60946094
download: 'ready',
6095-
setupDocsUrl: 'https://docs.claude.com/en/docs/claude-code/setup',
6095+
setupDocsUrl: 'https://code.claude.com/docs/en/third-party-integrations',
60966096
// No in-app sign-in: every Claude credential is established outside the
60976097
// app, so the banner can only point at the docs.
60986098
signInProviderName: undefined,

src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostSdkSetupNotification.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,9 @@ function setupMarkdown(value: string): MarkdownString {
9393
/**
9494
* The "no account" second line: one whole sentence per combination of routes,
9595
* never assembled from localized fragments, because clause order is not stable
96-
* across languages. The GitHub clause is unconditional and leads: it is the
97-
* primary button, and reaching models through our Copilot proxy is workbench
98-
* knowledge rather than something an agent could declare. Reload and docs trail
99-
* the sign-in routes, ranked as the copy's only links rather than buttons.
96+
* across languages. The routes share one "or" list, ranked as the buttons rank
97+
* them and led by the unconditional GitHub clause: reaching models through our
98+
* Copilot proxy is workbench knowledge, not something an agent declares.
10099
*/
101100
function noAccountDescription(setup: IAgentSdkSetupInfo, displayName: string): IMarkdownString {
102101
// Both nouns are the host's, and this string is trusted for two commands, so
@@ -110,15 +109,15 @@ function noAccountDescription(setup: IAgentSdkSetupInfo, displayName: string): I
110109
const reload = createCommandUri(AGENT_SDK_SETUP_RELOAD_COMMAND_ID, setup.agent).toString();
111110
const docs = setup.setupDocsUrl ? createCommandUri(AGENT_SDK_SETUP_OPEN_DOCS_COMMAND_ID, setup.agent).toString() : undefined;
112111
if (provider && docs) {
113-
return setupMarkdown(localize('agentHost.sdkSetup.noAccountDescription.all', "Sign in to GitHub to use GitHub Copilot models, or sign in to {2} to use your {2} subscription. If you already set up {0} elsewhere, [reload {0} configuration]({1}). [Learn more]({3}) about other ways to set up {0}.", name, reload, provider, docs));
112+
return setupMarkdown(localize('agentHost.sdkSetup.noAccountDescription.all', "Sign in to GitHub to use GitHub Copilot models, sign in to {2} to use your {2} subscription, or [reload the configuration]({1}) if you have set up {0} elsewhere. For other ways to set up {0}, [learn more]({3}) on their docs.", name, reload, provider, docs));
114113
}
115114
if (provider) {
116-
return setupMarkdown(localize('agentHost.sdkSetup.noAccountDescription.signIn', "Sign in to GitHub to use GitHub Copilot models, or sign in to {2} to use your {2} subscription. If you already set up {0} elsewhere, [reload {0} configuration]({1}).", name, reload, provider));
115+
return setupMarkdown(localize('agentHost.sdkSetup.noAccountDescription.signIn', "Sign in to GitHub to use GitHub Copilot models, sign in to {2} to use your {2} subscription, or [reload the configuration]({1}) if you have set up {0} elsewhere.", name, reload, provider));
117116
}
118117
if (docs) {
119-
return setupMarkdown(localize('agentHost.sdkSetup.noAccountDescription.docs', "Sign in to GitHub to use GitHub Copilot models. If you already set up {0} elsewhere, [reload {0} configuration]({1}). [Learn more]({2}) about other ways to set up {0}.", name, reload, docs));
118+
return setupMarkdown(localize('agentHost.sdkSetup.noAccountDescription.docs', "Sign in to GitHub to use GitHub Copilot models or [reload the configuration]({1}) if you have set up {0} elsewhere. For other ways to set up {0}, [learn more]({2}) on their docs.", name, reload, docs));
120119
}
121-
return setupMarkdown(localize('agentHost.sdkSetup.noAccountDescription', "Sign in to GitHub to use GitHub Copilot models. If you already set up {0} elsewhere, [reload {0} configuration]({1}).", name, reload));
120+
return setupMarkdown(localize('agentHost.sdkSetup.noAccountDescription', "Sign in to GitHub to use GitHub Copilot models or [reload the configuration]({1}) if you have set up {0} elsewhere.", name, reload));
122121
}
123122

124123
/**

src/vs/workbench/contrib/chat/test/browser/agentSessions/agentHostSdkSetupNotification.test.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -128,21 +128,21 @@ suite('Agent SDK setup banner', () => {
128128
const gitHub = 'Sign in to GitHub to use GitHub Copilot models';
129129
// Unconditional: setup finished in a terminal has no completion signal, so
130130
// every agent needs the "look again" route whatever else it declares.
131-
const reload = `If you already set up Claude elsewhere, [reload Claude configuration](command:${AGENT_SDK_SETUP_RELOAD_COMMAND_ID}?%255B%2522claude%2522%255D).`;
131+
const reload = `[reload the configuration](command:${AGENT_SDK_SETUP_RELOAD_COMMAND_ID}?%255B%2522claude%2522%255D) if you have set up Claude elsewhere.`;
132132
// The agent id, like every button carries — the command resolves the URL
133133
// from the agent's own declaration rather than trusting the banner's copy.
134-
const docs = `[Learn more](command:${AGENT_SDK_SETUP_OPEN_DOCS_COMMAND_ID}?%255B%2522claude%2522%255D) about other ways to set up Claude.`;
134+
const docs = `For other ways to set up Claude, [learn more](command:${AGENT_SDK_SETUP_OPEN_DOCS_COMMAND_ID}?%255B%2522claude%2522%255D) on their docs.`;
135135

136136
assert.deepStrictEqual({
137137
gitHubOnly: noAccount({}),
138138
docs: noAccount({ setupDocsUrl: 'https://example.test/claude' }),
139139
signIn: noAccount({ signInProviderName: 'ChatGPT' }),
140140
both: noAccount({ setupDocsUrl: 'https://example.test/claude', signInProviderName: 'ChatGPT' }),
141141
}, {
142-
gitHubOnly: `${gitHub}. ${reload}`,
143-
docs: `${gitHub}. ${reload} ${docs}`,
144-
signIn: `${gitHub}, or sign in to ChatGPT to use your ChatGPT subscription. ${reload}`,
145-
both: `${gitHub}, or sign in to ChatGPT to use your ChatGPT subscription. ${reload} ${docs}`,
142+
gitHubOnly: `${gitHub} or ${reload}`,
143+
docs: `${gitHub} or ${reload} ${docs}`,
144+
signIn: `${gitHub}, sign in to ChatGPT to use your ChatGPT subscription, or ${reload}`,
145+
both: `${gitHub}, sign in to ChatGPT to use your ChatGPT subscription, or ${reload} ${docs}`,
146146
});
147147
});
148148

@@ -158,7 +158,7 @@ suite('Agent SDK setup banner', () => {
158158
const name = 'Claude \\[x\\]\\(command:evil\\)';
159159

160160
assert.strictEqual(typeof description === 'string' ? description : description?.value,
161-
`Sign in to GitHub to use GitHub Copilot models, or sign in to Chat\\[G\\]PT to use your Chat\\[G\\]PT subscription. If you already set up ${name} elsewhere, [reload ${name} configuration](command:${AGENT_SDK_SETUP_RELOAD_COMMAND_ID}?%255B%2522claude%2522%255D). [Learn more](command:${AGENT_SDK_SETUP_OPEN_DOCS_COMMAND_ID}?%255B%2522claude%2522%255D) about other ways to set up ${name}.`);
161+
`Sign in to GitHub to use GitHub Copilot models, sign in to Chat\\[G\\]PT to use your Chat\\[G\\]PT subscription, or [reload the configuration](command:${AGENT_SDK_SETUP_RELOAD_COMMAND_ID}?%255B%2522claude%2522%255D) if you have set up ${name} elsewhere. For other ways to set up ${name}, [learn more](command:${AGENT_SDK_SETUP_OPEN_DOCS_COMMAND_ID}?%255B%2522claude%2522%255D) on their docs.`);
162162
});
163163

164164
test('the copy is trusted for its own two commands alone, so its links render and reach nothing else', () => {

0 commit comments

Comments
 (0)