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

Commit 50376bc

Browse files
committed
Merge remote-tracking branch 'origin/main' into bb/worktrees-ux
2 parents 204b8cc + 84f7409 commit 50376bc

206 files changed

Lines changed: 3790 additions & 5199 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: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,25 @@
11
# Roo Code Changelog
22

3+
## [3.43.0] - 2026-01-23
4+
5+
![3.43.0 Release - Intelligent Context Condensation](/releases/3.43.0-release.png)
6+
7+
- Intelligent Context Condensation v2: New context condensation system that intelligently summarizes conversation history when approaching context limits, preserving important information while reducing token usage (PR #10873 by @hannesrudolph)
8+
- Improved context condensation with environment details, accurate token counts, and lazy evaluation for better performance (PR #10920 by @hannesrudolph)
9+
- Move condense prompt editor to Context Management tab for better discoverability and organization (PR #10909 by @hannesrudolph)
10+
- Update Z.AI models with new variants and pricing (#10859 by @ErdemGKSL, PR #10860 by @ErdemGKSL)
11+
- Add pnpm install:vsix:nightly command for easier nightly build installation (PR #10912 by @hannesrudolph)
12+
- Fix: Convert orphaned tool_results to text blocks after condensing to prevent API errors (PR #10927 by @daniel-lxs)
13+
- Fix: Auto-migrate v1 condensing prompt and handle invalid providers on import (PR #10931 by @hannesrudolph)
14+
- Fix: Use json-stream-stringify for pretty-printing MCP config files to prevent memory issues with large configs (#9862 by @Michaelzag, PR #9864 by @Michaelzag)
15+
- Fix: Correct Gemini 3 pricing for Flash and Pro models (#10432 by @rossdonald, PR #10487 by @roomote)
16+
- Fix: Skip thoughtSignature blocks during markdown export for cleaner output (#10199 by @rossdonald, PR #10932 by @rossdonald)
17+
- Fix: Duplicate model display for OpenAI Codex provider (PR #10930 by @roomote)
18+
- Remove diffEnabled and fuzzyMatchThreshold settings as they are no longer needed (#10648 by @hannesrudolph, PR #10298 by @hannesrudolph)
19+
- Remove MULTI_FILE_APPLY_DIFF experiment (PR #10925 by @hannesrudolph)
20+
- Remove POWER_STEERING experimental feature (PR #10926 by @hannesrudolph)
21+
- Remove legacy XML tool calling code (getToolDescription) for cleaner codebase (PR #10929 by @hannesrudolph)
22+
323
## [3.42.0] - 2026-01-22
424

525
![3.42.0 Release - ChatGPT Usage Tracking](/releases/3.42.0-release.png)

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/global-settings.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,6 @@ export const globalSettingsSchema = z.object({
162162
diagnosticsEnabled: z.boolean().optional(),
163163

164164
rateLimitSeconds: z.number().optional(),
165-
diffEnabled: z.boolean().optional(),
166-
fuzzyMatchThreshold: z.number().optional(),
167165
experiments: experimentsSchema.optional(),
168166

169167
codebaseIndexModels: codebaseIndexModelsSchema.optional(),
@@ -349,9 +347,6 @@ export const EVALS_SETTINGS: RooCodeSettings = {
349347

350348
diagnosticsEnabled: true,
351349

352-
diffEnabled: true,
353-
fuzzyMatchThreshold: 1,
354-
355350
enableCheckpoints: false,
356351

357352
rateLimitSeconds: 0,

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": {

0 commit comments

Comments
 (0)