Skip to content
This repository was archived by the owner on May 15, 2026. It is now read-only.

Commit 8d81bdb

Browse files
committed
Merge origin/main into release/v3.43.0 - resolve conflicts keeping v3.43.0 release content
1 parent 0a9ace0 commit 8d81bdb

144 files changed

Lines changed: 3267 additions & 4672 deletions

File tree

Some content is hidden

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

CHANGELOG.md

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

3+
## [3.42.0] - 2026-01-22
4+
5+
![3.42.0 Release - ChatGPT Usage Tracking](/releases/3.42.0-release.png)
6+
7+
- Added UI to track your ChatGPT usage limits in the OpenAI Codex provider (PR #10813 by @hannesrudolph)
8+
- Removed deprecated Claude Code provider (PR #10883 by @daniel-lxs)
9+
- Streamlined codebase by removing legacy XML tool calling functionality (#10848 by @hannesrudolph, PR #10841 by @hannesrudolph)
10+
- Standardize model selectors across all providers: Improved consistency of model selection UI (#10650 by @hannesrudolph, PR #10294 by @hannesrudolph)
11+
- Enable prompt caching for Cerebras zai-glm-4.7 model (#10601 by @jahanson, PR #10670 by @app/roomote)
12+
- Add Kimi K2 thinking model to VertexAI provider (#9268 by @diwakar-s-maurya, PR #9269 by @app/roomote)
13+
- Warn users when too many MCP tools are enabled (PR #10772 by @app/roomote)
14+
- Migrate context condensing prompt to customSupportPrompts (PR #10881 by @hannesrudolph)
15+
- Unify export path logic and default to Downloads folder (PR #10882 by @hannesrudolph)
16+
- Performance improvements for webview state synchronization (PR #10842 by @hannesrudolph)
17+
- Fix: Handle mode selector empty state on workspace switch (#10660 by @hannesrudolph, PR #9674 by @app/roomote)
18+
- Fix: Resolve race condition in context condensing prompt input (PR #10876 by @hannesrudolph)
19+
- Fix: Prevent double emission of text/reasoning in OpenAI native and codex handlers (PR #10888 by @hannesrudolph)
20+
- Fix: Prevent task abortion when resuming via IPC/bridge (PR #10892 by @cte)
21+
- Fix: Enforce file restrictions for all editing tools (PR #10896 by @app/roomote)
22+
- Fix: Remove custom condensing model option (PR #10901 by @hannesrudolph)
23+
- Unify user content tags to <user_message> for consistent prompt formatting (#10658 by @hannesrudolph, PR #10723 by @app/roomote)
24+
- Clarify linked SKILL.md file handling in prompts (PR #10907 by @hannesrudolph)
25+
- Fix: Padding on Roo Code Cloud teaser (PR #10889 by @app/roomote)
26+
327
## [3.41.3] - 2026-01-18
428

529
- Fix: Thinking block word-breaking to prevent horizontal scroll in the chat UI (PR #10806 by @roomote)

apps/cli/README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ By default, the CLI prompts for approval before executing actions:
7171
```bash
7272
export OPENROUTER_API_KEY=sk-or-v1-...
7373

74-
roo ~/Documents/my-project -P "What is this project?"
74+
roo "What is this project?" -w ~/Documents/my-project
7575
```
7676

7777
You can also run without a prompt and enter it interactively in TUI mode:
@@ -92,7 +92,7 @@ In interactive mode:
9292
For automation and scripts, use `-y` to auto-approve all actions:
9393

9494
```bash
95-
roo ~/Documents/my-project -y -P "Refactor the utils.ts file"
95+
roo "Refactor the utils.ts file" -y -w ~/Documents/my-project
9696
```
9797

9898
In non-interactive mode:
@@ -149,8 +149,8 @@ Tokens are valid for 90 days. The CLI will prompt you to re-authenticate when yo
149149

150150
| Option | Description | Default |
151151
| --------------------------------- | --------------------------------------------------------------------------------------- | ----------------------------- |
152-
| `[workspace]` | Workspace path to operate in (positional argument) | Current directory |
153-
| `-P, --prompt <prompt>` | The prompt/task to execute (optional in TUI mode) | None |
152+
| `[prompt]` | Your prompt (positional argument, optional) | None |
153+
| `-w, --workspace <path>` | Workspace path to operate in | Current directory |
154154
| `-e, --extension <path>` | Path to the extension bundle directory | Auto-detected |
155155
| `-d, --debug` | Enable debug output (includes detailed debug information, prompts, paths, etc) | `false` |
156156
| `-x, --exit-on-complete` | Exit the process when task completes (useful for testing) | `false` |
@@ -249,7 +249,7 @@ pnpm lint
249249
To create a new release, execute the /cli-release slash command:
250250

251251
```bash
252-
roo ~/Documents/Roo-Code -P "/cli-release" -y
252+
roo "/cli-release" -w ~/Documents/Roo-Code -y
253253
```
254254

255255
The workflow will:

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
"vsix:nightly": "turbo vsix:nightly --log-order grouped --output-logs new-only",
2121
"clean": "turbo clean --log-order grouped --output-logs new-only && rimraf dist out bin .vite-port .turbo",
2222
"install:vsix": "pnpm install --frozen-lockfile && pnpm clean && pnpm vsix && node scripts/install-vsix.js",
23+
"install:vsix:nightly": "pnpm install --frozen-lockfile && pnpm clean && pnpm vsix:nightly && node scripts/install-vsix.js --nightly",
2324
"changeset:version": "cp CHANGELOG.md src/CHANGELOG.md && changeset version && cp -vf src/CHANGELOG.md .",
2425
"knip": "knip --include files",
2526
"evals": "dotenvx run -f packages/evals/.env.development packages/evals/.env.local -- docker compose -f packages/evals/docker-compose.yml --profile server --profile runner up --build --scale runner=0",

packages/core/src/worktree/types.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ export type {
99
WorktreeResult,
1010
BranchInfo,
1111
CreateWorktreeOptions,
12-
MergeWorktreeOptions,
13-
MergeWorktreeResult,
1412
WorktreeIncludeStatus,
1513
WorktreeListResponse,
1614
WorktreeDefaultsResponse,

packages/core/src/worktree/worktree-service.ts

Lines changed: 1 addition & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,7 @@ import { exec, execFile } from "child_process"
99
import * as path from "path"
1010
import { promisify } from "util"
1111

12-
import type {
13-
BranchInfo,
14-
CreateWorktreeOptions,
15-
MergeWorktreeOptions,
16-
MergeWorktreeResult,
17-
Worktree,
18-
WorktreeResult,
19-
} from "./types.js"
12+
import type { BranchInfo, CreateWorktreeOptions, Worktree, WorktreeResult } from "./types.js"
2013

2114
const execAsync = promisify(exec)
2215
const execFileAsync = promisify(execFile)
@@ -233,128 +226,6 @@ export class WorktreeService {
233226
}
234227
}
235228

236-
/**
237-
* Merge a worktree branch into target branch
238-
*/
239-
async mergeWorktree(cwd: string, options: MergeWorktreeOptions): Promise<MergeWorktreeResult> {
240-
const { worktreePath, targetBranch, deleteAfterMerge } = options
241-
242-
try {
243-
// Get the worktree info to find its branch
244-
const worktrees = await this.listWorktrees(cwd)
245-
const worktree = worktrees.find((wt) => this.normalizePath(wt.path) === this.normalizePath(worktreePath))
246-
247-
if (!worktree) {
248-
return {
249-
success: false,
250-
message: "Worktree not found",
251-
hasConflicts: false,
252-
conflictingFiles: [],
253-
}
254-
}
255-
256-
const sourceBranch = worktree.branch
257-
if (!sourceBranch) {
258-
return {
259-
success: false,
260-
message: "Worktree has detached HEAD - cannot merge",
261-
hasConflicts: false,
262-
conflictingFiles: [],
263-
}
264-
}
265-
266-
// Find the worktree that has the target branch checked out
267-
const targetWorktree = worktrees.find((wt) => wt.branch === targetBranch)
268-
const mergeCwd = targetWorktree ? targetWorktree.path : cwd
269-
270-
// Check for uncommitted changes in source worktree
271-
try {
272-
const { stdout: statusOutput } = await execAsync("git status --porcelain", { cwd: worktreePath })
273-
if (statusOutput.trim()) {
274-
return {
275-
success: false,
276-
message: "Source worktree has uncommitted changes. Please commit or stash them first.",
277-
hasConflicts: false,
278-
conflictingFiles: [],
279-
sourceBranch,
280-
targetBranch,
281-
}
282-
}
283-
} catch {
284-
// Continue if status check fails
285-
}
286-
287-
// Ensure we're on the target branch
288-
await execFileAsync("git", ["checkout", targetBranch], { cwd: mergeCwd })
289-
290-
// Attempt the merge
291-
try {
292-
await execFileAsync("git", ["merge", sourceBranch, "--no-edit"], { cwd: mergeCwd })
293-
294-
// Merge succeeded
295-
if (deleteAfterMerge) {
296-
await this.deleteWorktree(cwd, worktreePath, false)
297-
}
298-
299-
return {
300-
success: true,
301-
message: `Successfully merged ${sourceBranch} into ${targetBranch}`,
302-
hasConflicts: false,
303-
conflictingFiles: [],
304-
sourceBranch,
305-
targetBranch,
306-
}
307-
} catch (mergeError) {
308-
// Check for merge conflicts
309-
try {
310-
const { stdout: conflictOutput } = await execAsync("git diff --name-only --diff-filter=U", {
311-
cwd: mergeCwd,
312-
})
313-
const conflictingFiles = conflictOutput.trim().split("\n").filter(Boolean)
314-
315-
// Abort the merge to leave repo in clean state
316-
await execAsync("git merge --abort", { cwd: mergeCwd })
317-
318-
return {
319-
success: false,
320-
message: `Merge conflicts detected in ${conflictingFiles.length} file(s)`,
321-
hasConflicts: true,
322-
conflictingFiles,
323-
sourceBranch,
324-
targetBranch,
325-
}
326-
} catch {
327-
// If we can't get conflicts, just report the error
328-
const errorMessage = mergeError instanceof Error ? mergeError.message : String(mergeError)
329-
330-
// Try to abort any in-progress merge
331-
try {
332-
await execAsync("git merge --abort", { cwd: mergeCwd })
333-
} catch {
334-
// Ignore abort errors
335-
}
336-
337-
return {
338-
success: false,
339-
message: `Merge failed: ${errorMessage}`,
340-
hasConflicts: false,
341-
conflictingFiles: [],
342-
sourceBranch,
343-
targetBranch,
344-
}
345-
}
346-
}
347-
} catch (error) {
348-
const errorMessage = error instanceof Error ? error.message : String(error)
349-
return {
350-
success: false,
351-
message: `Merge failed: ${errorMessage}`,
352-
hasConflicts: false,
353-
conflictingFiles: [],
354-
}
355-
}
356-
}
357-
358229
/**
359230
* Checkout a branch in the current worktree
360231
*/

packages/types/src/cloud.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,6 @@ export type OrganizationAllowList = z.infer<typeof organizationAllowListSchema>
9494
export const organizationDefaultSettingsSchema = globalSettingsSchema
9595
.pick({
9696
enableCheckpoints: true,
97-
fuzzyMatchThreshold: true,
9897
maxOpenTabsContext: true,
9998
maxReadFileLine: true,
10099
maxWorkspaceFiles: true,

packages/types/src/experiment.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import type { Keys, Equals, AssertEqual } from "./type-fu.js"
88

99
export const experimentIds = [
1010
"powerSteering",
11-
"multiFileApplyDiff",
1211
"preventFocusDisruption",
1312
"imageGeneration",
1413
"runSlashCommand",
@@ -26,7 +25,6 @@ export type ExperimentId = z.infer<typeof experimentIdsSchema>
2625

2726
export const experimentsSchema = z.object({
2827
powerSteering: z.boolean().optional(),
29-
multiFileApplyDiff: z.boolean().optional(),
3028
preventFocusDisruption: z.boolean().optional(),
3129
imageGeneration: z.boolean().optional(),
3230
runSlashCommand: z.boolean().optional(),

packages/types/src/provider-settings.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,9 +168,7 @@ export type ProviderSettingsEntry = z.infer<typeof providerSettingsEntrySchema>
168168

169169
const baseProviderSettingsSchema = z.object({
170170
includeMaxTokens: z.boolean().optional(),
171-
diffEnabled: z.boolean().optional(),
172171
todoListEnabled: z.boolean().optional(),
173-
fuzzyMatchThreshold: z.number().optional(),
174172
modelTemperature: z.number().nullish(),
175173
rateLimitSeconds: z.number().optional(),
176174
consecutiveMistakeLimit: z.number().min(0).optional(),

packages/types/src/providers/gemini.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,19 @@ export const geminiModels = {
1818
defaultTemperature: 1,
1919
inputPrice: 4.0,
2020
outputPrice: 18.0,
21+
cacheReadsPrice: 0.4,
2122
tiers: [
2223
{
2324
contextWindow: 200_000,
2425
inputPrice: 2.0,
2526
outputPrice: 12.0,
27+
cacheReadsPrice: 0.2,
2628
},
2729
{
2830
contextWindow: Infinity,
2931
inputPrice: 4.0,
3032
outputPrice: 18.0,
33+
cacheReadsPrice: 0.4,
3134
},
3235
],
3336
},
@@ -41,10 +44,9 @@ export const geminiModels = {
4144

4245
supportsTemperature: true,
4346
defaultTemperature: 1,
44-
inputPrice: 0.3,
45-
outputPrice: 2.5,
46-
cacheReadsPrice: 0.075,
47-
cacheWritesPrice: 1.0,
47+
inputPrice: 0.5,
48+
outputPrice: 3.0,
49+
cacheReadsPrice: 0.05,
4850
},
4951
// 2.5 Pro models
5052
"gemini-2.5-pro": {

packages/types/src/providers/vertex.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,19 @@ export const vertexModels = {
1818
defaultTemperature: 1,
1919
inputPrice: 4.0,
2020
outputPrice: 18.0,
21+
cacheReadsPrice: 0.4,
2122
tiers: [
2223
{
2324
contextWindow: 200_000,
2425
inputPrice: 2.0,
2526
outputPrice: 12.0,
27+
cacheReadsPrice: 0.2,
2628
},
2729
{
2830
contextWindow: Infinity,
2931
inputPrice: 4.0,
3032
outputPrice: 18.0,
33+
cacheReadsPrice: 0.4,
3134
},
3235
],
3336
},
@@ -41,10 +44,9 @@ export const vertexModels = {
4144

4245
supportsTemperature: true,
4346
defaultTemperature: 1,
44-
inputPrice: 0.3,
45-
outputPrice: 2.5,
46-
cacheReadsPrice: 0.075,
47-
cacheWritesPrice: 1.0,
47+
inputPrice: 0.5,
48+
outputPrice: 3.0,
49+
cacheReadsPrice: 0.05,
4850
},
4951
"gemini-2.5-flash-preview-05-20:thinking": {
5052
maxTokens: 65_535,

0 commit comments

Comments
 (0)