Skip to content

Commit a9ab507

Browse files
Shaaheen Peyvanclaude
andcommitted
Resolve merge conflict in WebviewMessage.ts
Merged fileChanges/baseline properties from feature branch with upsellId/list/organizationId properties from main branch. Removed duplicate upsellId property. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]>
2 parents e2dc694 + 205f3e4 commit a9ab507

File tree

129 files changed

+2134
-803
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

129 files changed

+2134
-803
lines changed

CHANGELOG.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,40 @@
11
# Roo Code Changelog
22

3+
## [3.28.7] - 2025-09-23
4+
5+
![3.28.7 Release - Hidden Thinking](/releases/3.28.7-release.png)
6+
7+
- UX: Collapse thinking blocks by default with UI settings to always show them (thanks @brunobergher!)
8+
- Fix: Resolve checkpoint restore popover positioning issue (#8219 by @NaccOll, PR by @app/roomote)
9+
- Add cloud account switcher functionality (thanks @mrubens!)
10+
- Add support for zai-org/GLM-4.5-turbo model in Chutes provider (#8155 by @mugnimaestra, PR by @app/roomote)
11+
12+
## [3.28.6] - 2025-09-23
13+
14+
![3.28.6 Release - Kangaroo studying ancient codex](/releases/3.28.6-release.png)
15+
16+
- Feat: Add GPT-5-Codex model (thanks @daniel-lxs!)
17+
- Feat: Add keyboard shortcut for toggling auto-approve (Cmd/Ctrl+Alt+A) (thanks @brunobergher!)
18+
- Fix: Improve reasoning block formatting for better readability (thanks @daniel-lxs!)
19+
- Fix: Respect Ollama Modelfile num_ctx configuration (#7797 by @hannesrudolph, PR by @app/roomote)
20+
- Fix: Prevent checkpoint text from wrapping in non-English languages (#8206 by @NaccOll, PR by @app/roomote)
21+
- Remove language selection and word wrap toggle from CodeBlock (thanks @mrubens!)
22+
- Feat: Add package.nls.json checking to find-missing-translations script (thanks @app/roomote!)
23+
- Fix: Bare metal evals fixes (thanks @cte!)
24+
- Fix: Follow-up questions should trigger the "interactive" state (thanks @cte!)
25+
26+
## [3.28.5] - 2025-09-20
27+
28+
![3.28.5 Release - Kangaroo staying hydrated](/releases/3.28.5-release.png)
29+
30+
- Fix: Resolve duplicate rehydrate during reasoning; centralize rehydrate and preserve cancel metadata (#8153 by @hannesrudolph, PR by @hannesrudolph)
31+
- Add an announcement for Supernova (thanks @mrubens!)
32+
- Wrap code blocks by default for improved readability (thanks @mrubens!)
33+
- Fix: Support dash prefix in parseMarkdownChecklist for todo lists (#8054 by @NaccOll, PR by app/roomote)
34+
- Fix: Apply tiered pricing for Gemini models via Vertex AI (#8017 by @ikumi3, PR by app/roomote)
35+
- Update SambaNova models to latest versions (thanks @snova-jorgep!)
36+
- Update privacy policy to allow occasional emails (thanks @jdilla1277!)
37+
338
## [3.28.4] - 2025-09-19
439

540
![3.28.4 Release - Supernova Discovery](/releases/3.28.4-release.png)

apps/web-evals/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"scripts": {
66
"lint": "next lint --max-warnings 0",
77
"check-types": "tsc -b",
8-
"dev": "scripts/check-services.sh && next dev",
8+
"dev": "scripts/check-services.sh && next dev -p 3446",
99
"format": "prettier --write src",
1010
"build": "next build",
1111
"start": "next start",
428 KB
Loading

apps/web-roo-code/src/lib/seo.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@ const SITE_URL = process.env.NEXT_PUBLIC_SITE_URL ?? "https://roocode.com"
33
export const SEO = {
44
url: SITE_URL,
55
name: "Roo Code",
6-
title: "Roo Code – Your AI-Powered Dev Team in VS Code",
6+
title: "Roo Code – Your AI-Powered Dev Team in VS Code and Beyond",
77
description:
88
"Roo Code puts an entire AI dev team right in your editor, outpacing closed tools with deep project-wide context, multi-step agentic coding, and unmatched developer-centric flexibility.",
99
locale: "en_US",
1010
ogImage: {
11-
url: "/android-chrome-512x512.png",
12-
width: 512,
13-
height: 512,
14-
alt: "Roo Code Logo",
11+
url: "/opengraph.png",
12+
width: 1200,
13+
height: 600,
14+
alt: "Roo Code",
1515
},
1616
keywords: [
1717
"Roo Code",

packages/cloud/src/CloudService.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import type {
88
AuthService,
99
SettingsService,
1010
CloudUserInfo,
11+
CloudOrganizationMembership,
1112
OrganizationAllowList,
1213
OrganizationSettings,
1314
ShareVisibility,
@@ -170,9 +171,9 @@ export class CloudService extends EventEmitter<CloudServiceEvents> implements Di
170171

171172
// AuthService
172173

173-
public async login(): Promise<void> {
174+
public async login(landingPageSlug?: string): Promise<void> {
174175
this.ensureInitialized()
175-
return this.authService!.login()
176+
return this.authService!.login(landingPageSlug)
176177
}
177178

178179
public async logout(): Promise<void> {
@@ -242,6 +243,21 @@ export class CloudService extends EventEmitter<CloudServiceEvents> implements Di
242243
return this.authService!.handleCallback(code, state, organizationId)
243244
}
244245

246+
public async switchOrganization(organizationId: string | null): Promise<void> {
247+
this.ensureInitialized()
248+
249+
// Perform the organization switch
250+
// StaticTokenAuthService will throw an error if organization switching is not supported
251+
await this.authService!.switchOrganization(organizationId)
252+
}
253+
254+
public async getOrganizationMemberships(): Promise<CloudOrganizationMembership[]> {
255+
this.ensureInitialized()
256+
257+
// StaticTokenAuthService will throw an error if organization memberships are not supported
258+
return await this.authService!.getOrganizationMemberships()
259+
}
260+
245261
// SettingsService
246262

247263
public getAllowList(): OrganizationAllowList {

packages/cloud/src/StaticTokenAuthService.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,14 @@ export class StaticTokenAuthService extends EventEmitter<AuthServiceEvents> impl
6363
throw new Error("Authentication methods are disabled in StaticTokenAuthService")
6464
}
6565

66+
public async switchOrganization(_organizationId: string | null): Promise<void> {
67+
throw new Error("Authentication methods are disabled in StaticTokenAuthService")
68+
}
69+
70+
public async getOrganizationMemberships(): Promise<import("@roo-code/types").CloudOrganizationMembership[]> {
71+
throw new Error("Authentication methods are disabled in StaticTokenAuthService")
72+
}
73+
6674
public getState(): AuthState {
6775
return this.state
6876
}

packages/cloud/src/WebAuthService.ts

Lines changed: 57 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,8 @@ export class WebAuthService extends EventEmitter<AuthServiceEvents> implements A
141141
if (
142142
this.credentials === null ||
143143
this.credentials.clientToken !== credentials.clientToken ||
144-
this.credentials.sessionId !== credentials.sessionId
144+
this.credentials.sessionId !== credentials.sessionId ||
145+
this.credentials.organizationId !== credentials.organizationId
145146
) {
146147
this.transitionToAttemptingSession(credentials)
147148
}
@@ -174,6 +175,7 @@ export class WebAuthService extends EventEmitter<AuthServiceEvents> implements A
174175

175176
this.changeState("attempting-session")
176177

178+
this.timer.stop()
177179
this.timer.start()
178180
}
179181

@@ -248,8 +250,10 @@ export class WebAuthService extends EventEmitter<AuthServiceEvents> implements A
248250
*
249251
* This method initiates the authentication flow by generating a state parameter
250252
* and opening the browser to the authorization URL.
253+
*
254+
* @param landingPageSlug Optional slug of a specific landing page (e.g., "supernova", "special-offer", etc.)
251255
*/
252-
public async login(): Promise<void> {
256+
public async login(landingPageSlug?: string): Promise<void> {
253257
try {
254258
const vscode = await importVscode()
255259

@@ -267,11 +271,17 @@ export class WebAuthService extends EventEmitter<AuthServiceEvents> implements A
267271
state,
268272
auth_redirect: `${vscode.env.uriScheme}://${publisher}.${name}`,
269273
})
270-
const url = `${getRooCodeApiUrl()}/extension/sign-in?${params.toString()}`
274+
275+
// Use landing page URL if slug is provided, otherwise use default sign-in URL
276+
const url = landingPageSlug
277+
? `${getRooCodeApiUrl()}/l/${landingPageSlug}?${params.toString()}`
278+
: `${getRooCodeApiUrl()}/extension/sign-in?${params.toString()}`
279+
271280
await vscode.env.openExternal(vscode.Uri.parse(url))
272281
} catch (error) {
273-
this.log(`[auth] Error initiating Roo Code Cloud auth: ${error}`)
274-
throw new Error(`Failed to initiate Roo Code Cloud authentication: ${error}`)
282+
const context = landingPageSlug ? ` (landing page: ${landingPageSlug})` : ""
283+
this.log(`[auth] Error initiating Roo Code Cloud auth${context}: ${error}`)
284+
throw new Error(`Failed to initiate Roo Code Cloud authentication${context}: ${error}`)
275285
}
276286
}
277287

@@ -461,6 +471,42 @@ export class WebAuthService extends EventEmitter<AuthServiceEvents> implements A
461471
return this.credentials?.organizationId || null
462472
}
463473

474+
/**
475+
* Switch to a different organization context
476+
* @param organizationId The organization ID to switch to, or null for personal account
477+
*/
478+
public async switchOrganization(organizationId: string | null): Promise<void> {
479+
if (!this.credentials) {
480+
throw new Error("Cannot switch organization: not authenticated")
481+
}
482+
483+
// Update the stored credentials with the new organization ID
484+
const updatedCredentials: AuthCredentials = {
485+
...this.credentials,
486+
organizationId: organizationId,
487+
}
488+
489+
// Store the updated credentials, handleCredentialsChange will handle the update
490+
await this.storeCredentials(updatedCredentials)
491+
}
492+
493+
/**
494+
* Get all organization memberships for the current user
495+
* @returns Array of organization memberships
496+
*/
497+
public async getOrganizationMemberships(): Promise<CloudOrganizationMembership[]> {
498+
if (!this.credentials) {
499+
return []
500+
}
501+
502+
try {
503+
return await this.clerkGetOrganizationMemberships()
504+
} catch (error) {
505+
this.log(`[auth] Failed to get organization memberships: ${error}`)
506+
return []
507+
}
508+
}
509+
464510
private async clerkSignIn(ticket: string): Promise<AuthCredentials> {
465511
const formData = new URLSearchParams()
466512
formData.append("strategy", "ticket")
@@ -645,9 +691,14 @@ export class WebAuthService extends EventEmitter<AuthServiceEvents> implements A
645691
}
646692

647693
private async clerkGetOrganizationMemberships(): Promise<CloudOrganizationMembership[]> {
694+
if (!this.credentials) {
695+
this.log("[auth] Cannot get organization memberships: missing credentials")
696+
return []
697+
}
698+
648699
const response = await fetch(`${getClerkBaseUrl()}/v1/me/organization_memberships`, {
649700
headers: {
650-
Authorization: `Bearer ${this.credentials!.clientToken}`,
701+
Authorization: `Bearer ${this.credentials.clientToken}`,
651702
"User-Agent": this.userAgent(),
652703
},
653704
signal: AbortSignal.timeout(10000),

packages/evals/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ By default, the evals system uses the following ports:
9595

9696
- **PostgreSQL**: 5433 (external) → 5432 (internal)
9797
- **Redis**: 6380 (external) → 6379 (internal)
98-
- **Web Service**: 3446 (external) → 3000 (internal)
98+
- **Web Service**: 3446 (external) → 3446 (internal)
9999

100100
These ports are configured to avoid conflicts with other services that might be running on the standard PostgreSQL (5432) and Redis (6379) ports.
101101

packages/evals/docker-compose.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ services:
5252
context: ../../
5353
dockerfile: packages/evals/Dockerfile.web
5454
ports:
55-
- "${EVALS_WEB_PORT:-3446}:3000"
55+
- "${EVALS_WEB_PORT:-3446}:3446"
5656
environment:
5757
- HOST_EXECUTION_METHOD=docker
5858
volumes:

packages/evals/scripts/setup.sh

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ build_extension() {
1212
echo "🔨 Building the Roo Code extension..."
1313
pnpm -w vsix -- --out ../bin/roo-code-$(git rev-parse --short HEAD).vsix || exit 1
1414
code --install-extension ../../bin/roo-code-$(git rev-parse --short HEAD).vsix || exit 1
15-
cd evals
1615
}
1716

1817
check_docker_services() {
@@ -377,7 +376,7 @@ fi
377376

378377
echo -e "\n🚀 You're ready to rock and roll! \n"
379378

380-
if ! nc -z localhost 3000; then
379+
if ! nc -z localhost 3446; then
381380
read -p "🌐 Would you like to start the evals web app? (Y/n): " start_evals
382381

383382
if [[ "$start_evals" =~ ^[Yy]|^$ ]]; then
@@ -386,5 +385,5 @@ if ! nc -z localhost 3000; then
386385
echo "💡 You can start it anytime with 'pnpm --filter @roo-code/web-evals dev'."
387386
fi
388387
else
389-
echo "👟 The evals web app is running at http://localhost:3000 (or http://localhost:3446 if using Docker)"
388+
echo "👟 The evals web app is running at http://localhost:3446"
390389
fi

0 commit comments

Comments
 (0)