Skip to content

Commit 7d5a21c

Browse files
committed
Merge branch 'main' of https://github.com/RooCodeInc/Roo-Code into feature-diff-view-improve
2 parents 588fae7 + 8dbd8c4 commit 7d5a21c

File tree

120 files changed

+1759
-235
lines changed

Some content is hidden

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

120 files changed

+1759
-235
lines changed

CHANGELOG.md

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,39 @@
11
# Roo Code Changelog
22

3-
## 3.28.5
3+
## [3.28.7] - 2025-09-23
44

5-
### Patch Changes
5+
![3.28.7 Release - Hidden Thinking](/releases/3.28.7-release.png)
66

7-
- - Add an announcement for Supernova (thanks @mrubens!)
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!)
837

938
## [3.28.4] - 2025-09-19
1039

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",

packages/cloud/src/CloudService.ts

Lines changed: 16 additions & 0 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,
@@ -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: 45 additions & 2 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

@@ -469,6 +471,42 @@ export class WebAuthService extends EventEmitter<AuthServiceEvents> implements A
469471
return this.credentials?.organizationId || null
470472
}
471473

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+
472510
private async clerkSignIn(ticket: string): Promise<AuthCredentials> {
473511
const formData = new URLSearchParams()
474512
formData.append("strategy", "ticket")
@@ -653,9 +691,14 @@ export class WebAuthService extends EventEmitter<AuthServiceEvents> implements A
653691
}
654692

655693
private async clerkGetOrganizationMemberships(): Promise<CloudOrganizationMembership[]> {
694+
if (!this.credentials) {
695+
this.log("[auth] Cannot get organization memberships: missing credentials")
696+
return []
697+
}
698+
656699
const response = await fetch(`${getClerkBaseUrl()}/v1/me/organization_memberships`, {
657700
headers: {
658-
Authorization: `Bearer ${this.credentials!.clientToken}`,
701+
Authorization: `Bearer ${this.credentials.clientToken}`,
659702
"User-Agent": this.userAgent(),
660703
},
661704
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

packages/types/src/cloud.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@ export interface AuthService extends EventEmitter<AuthServiceEvents> {
242242
login(landingPageSlug?: string): Promise<void>
243243
logout(): Promise<void>
244244
handleCallback(code: string | null, state: string | null, organizationId?: string | null): Promise<void>
245+
switchOrganization(organizationId: string | null): Promise<void>
245246

246247
// State methods
247248
getState(): AuthState
@@ -253,6 +254,9 @@ export interface AuthService extends EventEmitter<AuthServiceEvents> {
253254
getSessionToken(): string | undefined
254255
getUserInfo(): CloudUserInfo | null
255256
getStoredOrganizationId(): string | null
257+
258+
// Organization management
259+
getOrganizationMemberships(): Promise<CloudOrganizationMembership[]>
256260
}
257261

258262
/**

packages/types/src/global-settings.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ export const globalSettingsSchema = z.object({
147147
enhancementApiConfigId: z.string().optional(),
148148
includeTaskHistoryInEnhance: z.boolean().optional(),
149149
historyPreviewCollapsed: z.boolean().optional(),
150+
reasoningBlockCollapsed: z.boolean().optional(),
150151
profileThresholds: z.record(z.string(), z.number()).optional(),
151152
hasOpenedModeSelector: z.boolean().optional(),
152153
lastModeExportPath: z.string().optional(),

0 commit comments

Comments
 (0)