Skip to content

Commit 285ced2

Browse files
committed
Merge remote-tracking branch 'origin/main' into feature/collapse-thinking-blocks
2 parents 59c0c22 + 0682629 commit 285ced2

Some content is hidden

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

41 files changed

+601
-50
lines changed

CHANGELOG.md

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,30 @@
11
# Roo Code Changelog
22

3-
## 3.28.5
4-
5-
### Patch Changes
6-
7-
- - Add an announcement for Supernova (thanks @mrubens!)
3+
## [3.28.6] - 2025-09-23
4+
5+
![3.28.6 Release - Kangaroo studying ancient codex](/releases/3.28.6-release.png)
6+
7+
- Feat: Add GPT-5-Codex model (thanks @daniel-lxs!)
8+
- Feat: Add keyboard shortcut for toggling auto-approve (Cmd/Ctrl+Alt+A) (thanks @brunobergher!)
9+
- Fix: Improve reasoning block formatting for better readability (thanks @daniel-lxs!)
10+
- Fix: Respect Ollama Modelfile num_ctx configuration (#7797 by @hannesrudolph, PR by @app/roomote)
11+
- Fix: Prevent checkpoint text from wrapping in non-English languages (#8206 by @NaccOll, PR by @app/roomote)
12+
- Remove language selection and word wrap toggle from CodeBlock (thanks @mrubens!)
13+
- Feat: Add package.nls.json checking to find-missing-translations script (thanks @app/roomote!)
14+
- Fix: Bare metal evals fixes (thanks @cte!)
15+
- Fix: Follow-up questions should trigger the "interactive" state (thanks @cte!)
16+
17+
## [3.28.5] - 2025-09-20
18+
19+
![3.28.5 Release - Kangaroo staying hydrated](/releases/3.28.5-release.png)
20+
21+
- Fix: Resolve duplicate rehydrate during reasoning; centralize rehydrate and preserve cancel metadata (#8153 by @hannesrudolph, PR by @hannesrudolph)
22+
- Add an announcement for Supernova (thanks @mrubens!)
23+
- Wrap code blocks by default for improved readability (thanks @mrubens!)
24+
- Fix: Support dash prefix in parseMarkdownChecklist for todo lists (#8054 by @NaccOll, PR by app/roomote)
25+
- Fix: Apply tiered pricing for Gemini models via Vertex AI (#8017 by @ikumi3, PR by app/roomote)
26+
- Update SambaNova models to latest versions (thanks @snova-jorgep!)
27+
- Update privacy policy to allow occasional emails (thanks @jdilla1277!)
828

929
## [3.28.4] - 2025-09-19
1030

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/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/message.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ export function isResumableAsk(ask: ClineAsk): ask is ResumableAsk {
8989
*/
9090

9191
export const interactiveAsks = [
92+
"followup",
9293
"command",
9394
"tool",
9495
"browser_action_launch",

packages/types/src/providers/chutes.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export type ChutesModelId =
2929
| "tngtech/DeepSeek-R1T-Chimera"
3030
| "zai-org/GLM-4.5-Air"
3131
| "zai-org/GLM-4.5-FP8"
32+
| "zai-org/GLM-4.5-turbo"
3233
| "moonshotai/Kimi-K2-Instruct-75k"
3334
| "moonshotai/Kimi-K2-Instruct-0905"
3435
| "Qwen/Qwen3-235B-A22B-Thinking-2507"
@@ -274,6 +275,15 @@ export const chutesModels = {
274275
description:
275276
"GLM-4.5-FP8 model with 128k token context window, optimized for agent-based applications with MoE architecture.",
276277
},
278+
"zai-org/GLM-4.5-turbo": {
279+
maxTokens: 32768,
280+
contextWindow: 131072,
281+
supportsImages: false,
282+
supportsPromptCache: false,
283+
inputPrice: 1,
284+
outputPrice: 3,
285+
description: "GLM-4.5-turbo model with 128K token context window, optimized for fast inference.",
286+
},
277287
"Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8": {
278288
maxTokens: 32768,
279289
contextWindow: 262144,

packages/types/src/providers/openai.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,20 @@ export const openAiNativeModels = {
7070
supportsTemperature: false,
7171
tiers: [{ name: "flex", contextWindow: 400000, inputPrice: 0.025, outputPrice: 0.2, cacheReadsPrice: 0.0025 }],
7272
},
73+
"gpt-5-codex": {
74+
maxTokens: 128000,
75+
contextWindow: 400000,
76+
supportsImages: true,
77+
supportsPromptCache: true,
78+
supportsReasoningEffort: true,
79+
reasoningEffort: "medium",
80+
inputPrice: 1.25,
81+
outputPrice: 10.0,
82+
cacheReadsPrice: 0.13,
83+
description: "GPT-5-Codex: A version of GPT-5 optimized for agentic coding in Codex",
84+
supportsVerbosity: true,
85+
supportsTemperature: false,
86+
},
7387
"gpt-4.1": {
7488
maxTokens: 32_768,
7589
contextWindow: 1_047_576,

releases/3.28.5-release.png

1.16 MB
Loading

releases/3.28.6-release.png

2 MB
Loading

0 commit comments

Comments
 (0)