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

Commit 714e862

Browse files
committed
chore: resolve merge conflicts with main
- Resolved conflict in src/core/prompts/system.ts to keep MCP section removal - Resolved conflict in src/core/prompts/__tests__/add-custom-instructions.spec.ts to remove MCP server creation test
2 parents 492233b + f9a3a17 commit 714e862

195 files changed

Lines changed: 4377 additions & 5488 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: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,49 @@
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+
23+
## [3.42.0] - 2026-01-22
24+
25+
![3.42.0 Release - ChatGPT Usage Tracking](/releases/3.42.0-release.png)
26+
27+
- Added UI to track your ChatGPT usage limits in the OpenAI Codex provider (PR #10813 by @hannesrudolph)
28+
- Removed deprecated Claude Code provider (PR #10883 by @daniel-lxs)
29+
- Streamlined codebase by removing legacy XML tool calling functionality (#10848 by @hannesrudolph, PR #10841 by @hannesrudolph)
30+
- Standardize model selectors across all providers: Improved consistency of model selection UI (#10650 by @hannesrudolph, PR #10294 by @hannesrudolph)
31+
- Enable prompt caching for Cerebras zai-glm-4.7 model (#10601 by @jahanson, PR #10670 by @app/roomote)
32+
- Add Kimi K2 thinking model to VertexAI provider (#9268 by @diwakar-s-maurya, PR #9269 by @app/roomote)
33+
- Warn users when too many MCP tools are enabled (PR #10772 by @app/roomote)
34+
- Migrate context condensing prompt to customSupportPrompts (PR #10881 by @hannesrudolph)
35+
- Unify export path logic and default to Downloads folder (PR #10882 by @hannesrudolph)
36+
- Performance improvements for webview state synchronization (PR #10842 by @hannesrudolph)
37+
- Fix: Handle mode selector empty state on workspace switch (#10660 by @hannesrudolph, PR #9674 by @app/roomote)
38+
- Fix: Resolve race condition in context condensing prompt input (PR #10876 by @hannesrudolph)
39+
- Fix: Prevent double emission of text/reasoning in OpenAI native and codex handlers (PR #10888 by @hannesrudolph)
40+
- Fix: Prevent task abortion when resuming via IPC/bridge (PR #10892 by @cte)
41+
- Fix: Enforce file restrictions for all editing tools (PR #10896 by @app/roomote)
42+
- Fix: Remove custom condensing model option (PR #10901 by @hannesrudolph)
43+
- Unify user content tags to <user_message> for consistent prompt formatting (#10658 by @hannesrudolph, PR #10723 by @app/roomote)
44+
- Clarify linked SKILL.md file handling in prompts (PR #10907 by @hannesrudolph)
45+
- Fix: Padding on Roo Code Cloud teaser (PR #10889 by @app/roomote)
46+
347
## [3.41.3] - 2026-01-18
448

549
- 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:

apps/web-roo-code/src/components/slack/slack-thread-demo.tsx

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -181,15 +181,15 @@ export function SlackThreadDemo({ className }: SlackThreadDemoProps): JSX.Elemen
181181
avatarClassName: "bg-[#2B2D31] text-[#F8F8F9] ring-1 ring-white/10",
182182
kind: "human",
183183
body: (
184-
<div className="space-x-2">
185-
<FakeLink className="no-underline hover:text-violet-200">@Roomote</FakeLink>
186-
<span>let&apos;s create the plan to deliver this</span>
187-
</div>
184+
<span>
185+
<FakeLink className="no-underline hover:text-violet-200">@Roomote</FakeLink> let&apos;s create
186+
the plan to deliver this
187+
</span>
188188
),
189189
},
190190
{
191191
id: "m5",
192-
author: "Roomote (Roo Code)",
192+
author: "Roomote",
193193
timeLabel: "Monday at 3:09 PM",
194194
avatarText: "R",
195195
avatarClassName: "bg-violet-500/20 text-violet-200 ring-1 ring-violet-500/30",
@@ -215,7 +215,7 @@ export function SlackThreadDemo({ className }: SlackThreadDemoProps): JSX.Elemen
215215
},
216216
{
217217
id: "m6",
218-
author: "Roomote (Roo Code)",
218+
author: "Roomote",
219219
timeLabel: "Monday at 3:10 PM",
220220
avatarText: "R",
221221
avatarClassName: "bg-violet-500/20 text-violet-200 ring-1 ring-violet-500/30",
@@ -229,7 +229,7 @@ export function SlackThreadDemo({ className }: SlackThreadDemoProps): JSX.Elemen
229229
},
230230
{
231231
id: "m7",
232-
author: "Roomote (Roo Code)",
232+
author: "Roomote",
233233
timeLabel: "Monday at 3:12 PM",
234234
avatarText: "R",
235235
avatarClassName: "bg-violet-500/20 text-violet-200 ring-1 ring-violet-500/30",
@@ -260,7 +260,7 @@ export function SlackThreadDemo({ className }: SlackThreadDemoProps): JSX.Elemen
260260
},
261261
{
262262
id: "m8",
263-
author: "Roomote (Roo Code)",
263+
author: "Roomote",
264264
timeLabel: "Monday at 3:16 PM",
265265
avatarText: "R",
266266
avatarClassName: "bg-violet-500/20 text-violet-200 ring-1 ring-violet-500/30",
@@ -311,14 +311,14 @@ export function SlackThreadDemo({ className }: SlackThreadDemoProps): JSX.Elemen
311311
kind: "human",
312312
body: (
313313
<div className="space-x-2">
314-
<FakeLink className="no-underline hover:text-violet-200">@Roomote (Roo Code)</FakeLink>
314+
<FakeLink className="no-underline hover:text-violet-200">@Roomote</FakeLink>
315315
<span>this looks great, let&apos;s use Coderoo to build this</span>
316316
</div>
317317
),
318318
},
319319
{
320320
id: "m10",
321-
author: "Roomote (Roo Code)",
321+
author: "Roomote",
322322
timeLabel: "Monday at 3:23 PM",
323323
avatarText: "R",
324324
avatarClassName: "bg-violet-500/20 text-violet-200 ring-1 ring-violet-500/30",

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/__tests__/worktree-include.spec.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -265,30 +265,28 @@ describe("WorktreeIncludeService", () => {
265265
expect(result).toContain("node_modules")
266266
})
267267

268-
it("should call progress callback with size-based progress", async () => {
268+
it("should call progress callback with bytesCopied progress", async () => {
269269
// Set up files to copy
270270
await fs.writeFile(path.join(sourceDir, ".worktreeinclude"), "node_modules\n.env.local")
271271
await fs.writeFile(path.join(sourceDir, ".gitignore"), "node_modules\n.env.local")
272272
await fs.mkdir(path.join(sourceDir, "node_modules"), { recursive: true })
273273
await fs.writeFile(path.join(sourceDir, "node_modules", "test.txt"), "test")
274274
await fs.writeFile(path.join(sourceDir, ".env.local"), "LOCAL_VAR=value")
275275

276-
const progressCalls: Array<{ bytesCopied: number; totalBytes: number; itemName: string }> = []
277-
const onProgress = vi.fn((progress: { bytesCopied: number; totalBytes: number; itemName: string }) => {
276+
const progressCalls: Array<{ bytesCopied: number; itemName: string }> = []
277+
const onProgress = vi.fn((progress: { bytesCopied: number; itemName: string }) => {
278278
progressCalls.push({ ...progress })
279279
})
280280

281281
await service.copyWorktreeIncludeFiles(sourceDir, targetDir, onProgress)
282282

283-
// Should be called multiple times (initial + after each copy + during polling)
283+
// Should be called multiple times (initial + after each copy)
284284
expect(onProgress).toHaveBeenCalled()
285285

286-
// All calls should have totalBytes > 0 (since we have files)
287-
expect(progressCalls.every((p) => p.totalBytes > 0)).toBe(true)
288-
289-
// Final call should have bytesCopied === totalBytes (complete)
286+
// bytesCopied should increase over time
287+
expect(progressCalls.length).toBeGreaterThan(0)
290288
const finalCall = progressCalls[progressCalls.length - 1]
291-
expect(finalCall?.bytesCopied).toBe(finalCall?.totalBytes)
289+
expect(finalCall?.bytesCopied).toBeGreaterThan(0)
292290

293291
// Each call should have an item name
294292
expect(progressCalls.every((p) => typeof p.itemName === "string")).toBe(true)

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-include.ts

Lines changed: 21 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,12 @@ import ignore, { type Ignore } from "ignore"
1515
import type { WorktreeIncludeStatus } from "./types.js"
1616

1717
/**
18-
* Progress info for size-based copy tracking.
18+
* Progress info for copy tracking.
19+
* Shows activity without trying to predict total size (which is inaccurate).
1920
*/
2021
export interface CopyProgress {
2122
/** Current bytes copied */
2223
bytesCopied: number
23-
/** Total bytes to copy */
24-
totalBytes: number
2524
/** Name of current item being copied */
2625
itemName: string
2726
}
@@ -164,61 +163,50 @@ export class WorktreeIncludeService {
164163
return []
165164
}
166165

167-
// Calculate total size of all items to copy (for accurate progress)
168-
const itemSizes = await Promise.all(
169-
itemsToCopy.map(async (item) => {
170-
const sourcePath = path.join(sourceDir, item)
171-
const size = await this.getPathSize(sourcePath)
172-
return { item, size }
173-
}),
174-
)
175-
176-
const totalBytes = itemSizes.reduce((sum, { size }) => sum + size, 0)
177166
let bytesCopied = 0
178167

179168
// Report initial progress
180-
if (onProgress && totalBytes > 0) {
181-
onProgress({ bytesCopied: 0, totalBytes, itemName: itemsToCopy[0]! })
169+
if (onProgress && itemsToCopy.length > 0) {
170+
onProgress({ bytesCopied: 0, itemName: itemsToCopy[0]! })
182171
}
183172

184-
// Copy the items with size-based progress tracking
173+
// Copy the items with progress tracking (no total size calculation)
185174
const copiedItems: string[] = []
186-
for (const { item, size } of itemSizes) {
175+
for (const item of itemsToCopy) {
187176
const sourcePath = path.join(sourceDir, item)
188177
const targetPath = path.join(targetDir, item)
189178

190179
try {
191180
const stats = await fs.stat(sourcePath)
192181

193182
if (stats.isDirectory()) {
194-
// Use native cp for directories with progress polling
195-
await this.copyDirectoryWithProgress(
183+
// Copy directory with progress tracking
184+
bytesCopied = await this.copyDirectoryWithProgress(
196185
sourcePath,
197186
targetPath,
198187
item,
199188
bytesCopied,
200-
totalBytes,
201189
onProgress,
202190
)
203191
} else {
204192
// Report progress before copying
205-
onProgress?.({ bytesCopied, totalBytes, itemName: item })
193+
onProgress?.({ bytesCopied, itemName: item })
206194

207195
// Ensure parent directory exists
208196
await fs.mkdir(path.dirname(targetPath), { recursive: true })
209197
await fs.copyFile(sourcePath, targetPath)
198+
199+
// Update bytes copied
200+
bytesCopied += this.getSizeOnDisk(stats)
210201
}
211202

212-
bytesCopied += size
213203
copiedItems.push(item)
214204

215205
// Report progress after copying
216-
onProgress?.({ bytesCopied, totalBytes, itemName: item })
206+
onProgress?.({ bytesCopied, itemName: item })
217207
} catch (error) {
218208
// Log but don't fail on individual copy errors
219209
console.error(`Failed to copy ${item}:`, error)
220-
// Still count the size as "processed" to avoid progress getting stuck
221-
bytesCopied += size
222210
}
223211
}
224212

@@ -302,22 +290,21 @@ export class WorktreeIncludeService {
302290
}
303291

304292
/**
305-
* Copy directory with progress polling.
293+
* Copy directory with progress polling using native cp command.
306294
* Starts native copy and polls target directory size to report progress.
295+
* Returns the updated bytesCopied count.
307296
*/
308297
private async copyDirectoryWithProgress(
309298
source: string,
310299
target: string,
311300
itemName: string,
312301
bytesCopiedBefore: number,
313-
totalBytes: number,
314302
onProgress?: CopyProgressCallback,
315-
): Promise<void> {
303+
): Promise<number> {
316304
// Ensure parent directory exists
317305
await fs.mkdir(path.dirname(target), { recursive: true })
318306

319307
const isWindows = process.platform === "win32"
320-
const expectedSize = await this.getPathSize(source)
321308

322309
// Start the copy process
323310
const copyPromise = new Promise<void>((resolve, reject) => {
@@ -361,8 +348,7 @@ export class WorktreeIncludeService {
361348
const totalCopied = bytesCopiedBefore + currentSize
362349

363350
onProgress?.({
364-
bytesCopied: Math.min(totalCopied, bytesCopiedBefore + expectedSize),
365-
totalBytes,
351+
bytesCopied: totalCopied,
366352
itemName,
367353
})
368354

@@ -380,6 +366,10 @@ export class WorktreeIncludeService {
380366
// Wait for final poll iteration to complete
381367
await pollPromise.catch(() => {})
382368
}
369+
370+
// Get the final size of the copied directory
371+
const finalSize = await this.getPathSize(target)
372+
return bytesCopiedBefore + finalSize
383373
}
384374

385375
/**

0 commit comments

Comments
 (0)