Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
a79c3d0
Follow symlinks in rooignore checks (#7405)
mrubens Aug 26, 2025
572fa50
Sonic -> Grok Code Fast (#7426)
mrubens Aug 26, 2025
f9921ff
chore: add changeset for v3.26.0 (#7428)
mrubens Aug 26, 2025
7c91e4f
Changeset version bump (#7429)
github-actions[bot] Aug 26, 2025
934bfd0
feat: Add Vercel AI Gateway provider integration (#7396)
joshualipman123 Aug 26, 2025
11c454f
feat: Enable on-disk storage for Qdrant vectors and HNSW index (#7182)
daniel-lxs Aug 26, 2025
ff1f4f0
fix: use anthropic protocol for token counting when using anthropic m…
daniel-lxs Aug 27, 2025
3528f51
fix: remove duplicate cache display in task header (#7443)
mrubens Aug 27, 2025
f02a2bb
Random chat text area cleanup (#7436)
cte Aug 27, 2025
02f551c
Update @roo-code/cloud to enable roomote control for cloud agents (#7…
cte Aug 27, 2025
c479678
Always set remoteControlEnabled to true for cloud agents (#7448)
cte Aug 27, 2025
46b6fdd
chore: add changeset for v3.26.1 (#7459)
mrubens Aug 27, 2025
faf5734
feat: show model ID in API configuration dropdown (#7423)
daniel-lxs Aug 27, 2025
33a8573
feat: update tooltip component to match native VSCode tooltip shadow …
roomote-v0[bot] Aug 27, 2025
1ad2129
Add support for Vercel embeddings (#7445)
mrubens Aug 27, 2025
94f3b2a
Remove dot before model display (#7461)
mrubens Aug 27, 2025
68e4629
Update contributors list (#7109)
github-actions[bot] Aug 27, 2025
bf9e447
Update 3.26.1 changeset (#7463)
mrubens Aug 27, 2025
d23bc01
Changeset version bump (#7460)
github-actions[bot] Aug 27, 2025
0f6079a
Add type for RooCodeEventName.TaskSpawned (#7465)
mrubens Aug 27, 2025
3cb489d
fix: hide .rooignore'd files from environment details by default (#7369)
roomote-v0[bot] Aug 27, 2025
d4a16f4
fix: exclude browser scroll actions from repetition detection (#7471)
roomote-v0[bot] Aug 28, 2025
2204457
Fix GPT-5 Responses API issues with condensing and image support (#7067)
daniel-lxs Aug 28, 2025
d1122ea
Bump cloud to 0.25.0 (#7475)
mrubens Aug 28, 2025
2092fb1
feat: add image generation tool with OpenRouter integration (#7474)
daniel-lxs Aug 28, 2025
548d3b4
Make the default image filename more generic (#7479)
mrubens Aug 28, 2025
43597b3
Release v3.26.2 (#7490)
mrubens Aug 28, 2025
bea0684
Support free imagegen (#7493)
mrubens Aug 28, 2025
8e66607
feat: update OpenRouter API to support input/output modalities and fi…
daniel-lxs Aug 28, 2025
6ef9dbd
Add padding to image model picker (#7494)
mrubens Aug 28, 2025
622da63
fix: prevent dirty state on initial mount in ImageGenerationSettings …
daniel-lxs Aug 28, 2025
8840902
Changeset version bump (#7491)
github-actions[bot] Aug 28, 2025
aee531a
Show console logging in vitests when the --no-silent flag is set (#7467)
hassoncs Aug 28, 2025
cd9e92f
Move @roo-code/cloud to the Roo-Code repo (#7503)
cte Aug 28, 2025
1e4c46f
Refactor the extension bridge (#7515)
cte Aug 29, 2025
1d46bd1
Implement deferred task subscriptions (#7517)
cte Aug 29, 2025
b22a618
feat: add optional input image parameter to image generation tool (#7…
roomote-v0[bot] Aug 29, 2025
01458f1
feat: sync extension bridge settings with cloud (#7535)
roomote-v0[bot] Aug 29, 2025
c3d84d2
refactor: flatten image generation settings structure (#7536)
daniel-lxs Aug 29, 2025
63e40d2
chore: add changeset for v3.26.3 (#7541)
mrubens Aug 29, 2025
a1f9b7d
Changeset version bump (#7542)
github-actions[bot] Aug 29, 2025
20929b0
Mode and provider profile selector (#7545)
cte Aug 29, 2025
0e95f93
Putting the Roo in Roo-leases (#7546)
mrubens Aug 30, 2025
c7d7ad8
Fix evals (#7547)
cte Aug 30, 2025
88bb813
Merge remote-tracking branch 'upstream/main' into roo-to-main
mini2s Aug 30, 2025
47f594f
fix: special tokens should not break task processing (#7540)
pwilkin Aug 30, 2025
4557000
Merge remote-tracking branch 'upstream/main' into roo-to-main
mini2s Aug 30, 2025
958df13
Merge remote-tracking branch 'upstream/main' into roo-to-main
mini2s Aug 30, 2025
c9ff380
docs: update PR template branding from Roo Code to Costrict
mini2s Aug 30, 2025
fad219e
feat: optimize memory usage for image handling in webview (#7556)
daniel-lxs Aug 30, 2025
f5e0525
feat: rename Account tab to Cloud tab (#7558)
roomote-v0[bot] Aug 30, 2025
63b71d8
feat: add Ollama API key support for Turbo mode (#7425)
roomote-v0[bot] Aug 30, 2025
5746dfc
Merge branch 'main' of github.com:zgsm-ai/costrict into roo-to-main
mini2s Aug 31, 2025
e0bd19d
Merge remote-tracking branch 'upstream/main' into roo-to-main
mini2s Aug 31, 2025
c970274
Disconnect extension bridge on logout (#7563)
mrubens Sep 1, 2025
97cfb96
Fix claudeCode.notFound translation key (#7571)
chrarnoldus Sep 1, 2025
00d26ee
v3.26.4 (#7579)
mrubens Sep 1, 2025
5092cdf
Update contributors list (#7462)
github-actions[bot] Sep 1, 2025
ae8a639
Changeset version bump (#7580)
github-actions[bot] Sep 1, 2025
fe2b612
feat: add configurable embedding batch size for code indexing (#7464)
roomote-v0[bot] Sep 2, 2025
2e59347
Shows a pill with the base Roo Code Cloud URL when not pointing to pr…
brunobergher Sep 2, 2025
d396555
Merge branch 'main' of github.com:zgsm-ai/costrict into roo-to-main
mini2s Sep 2, 2025
23fcc30
Merge remote-tracking branch 'upstream/main' into roo-to-main
mini2s Sep 2, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .roo/commands/release.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ argument-hint: patch | minor | major
6. If the generate_image tool is available, create a release image at `releases/[version]-release.png`
- The image should feature a realistic-looking kangaroo doing something human-like that relates to the main highlight of the release
- Pass `releases/template.png` as the reference image for aspect ratio and kangaroo style
- Add the generated image to .changeset/v[version].md before the list of changes with format: `![X.Y.Z Release - Description](releases/X.Y.Z-release.png)`
- Add the generated image to .changeset/v[version].md before the list of changes with format: `![X.Y.Z Release - Description](/releases/X.Y.Z-release.png)`
7. If a major or minor release:
- Ask the user what the three most important areas to highlight are in the release
- Update the English version relevant announcement files and documentation (webview-ui/src/components/chat/Announcement.tsx, README.md, and the `latestAnnouncementId` in src/core/webview/ClineProvider.ts)
Expand Down
82 changes: 41 additions & 41 deletions locales/es/README.md

Large diffs are not rendered by default.

82 changes: 41 additions & 41 deletions locales/zh-CN/README.md

Large diffs are not rendered by default.

82 changes: 41 additions & 41 deletions locales/zh-TW/README.md

Large diffs are not rendered by default.

8 changes: 7 additions & 1 deletion packages/cloud/src/bridge/BridgeOrchestrator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,13 +61,19 @@ export class BridgeOrchestrator {
public static async connectOrDisconnect(
userInfo: CloudUserInfo | null,
remoteControlEnabled: boolean | undefined,
options: BridgeOrchestratorOptions,
options?: BridgeOrchestratorOptions,
): Promise<void> {
const isEnabled = BridgeOrchestrator.isEnabled(userInfo, remoteControlEnabled)
const instance = BridgeOrchestrator.instance

if (isEnabled) {
if (!instance) {
if (!options) {
console.error(
`[BridgeOrchestrator#connectOrDisconnect] Cannot connect: options are required for connection`,
)
return
}
try {
console.log(`[BridgeOrchestrator#connectOrDisconnect] Connecting...`)
BridgeOrchestrator.instance = new BridgeOrchestrator(options)
Expand Down
Binary file added releases/3.26.4-release.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
27 changes: 24 additions & 3 deletions src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ try {
console.warn("Failed to load environment variables:", e)
}

// import type { CloudUserInfo } from "@roo-code/types"
// import type { CloudUserInfo, AuthState } from "@roo-code/types"
// import { CloudService, BridgeOrchestrator } from "@roo-code/cloud"
import { TelemetryService, PostHogTelemetryClient } from "@roo-code/telemetry"

Expand Down Expand Up @@ -56,7 +56,7 @@ let outputChannel: vscode.OutputChannel
let extensionContext: vscode.ExtensionContext
// let cloudService: CloudService | undefined

// let authStateChangedHandler: (() => void) | undefined
// let authStateChangedHandler: ((data: { state: AuthState; previousState: AuthState }) => Promise<void>) | undefined
// let settingsUpdatedHandler: (() => void) | undefined
// let userInfoHandler: ((data: { userInfo: CloudUserInfo }) => Promise<void>) | undefined

Expand Down Expand Up @@ -129,7 +129,28 @@ export async function activate(context: vscode.ExtensionContext) {

// // Initialize Roo Code Cloud service.
// const postStateListener = () => ClineProvider.getVisibleInstance()?.postStateToWebview()
// authStateChangedHandler = postStateListener

// authStateChangedHandler = async (data: { state: AuthState; previousState: AuthState }) => {
// postStateListener()

// // Check if user has logged out
// if (data.state === "logged-out") {
// try {
// // Disconnect the bridge when user logs out
// // When userInfo is null and remoteControlEnabled is false, BridgeOrchestrator
// // will disconnect. The options parameter is not needed for disconnection.
// await BridgeOrchestrator.connectOrDisconnect(null, false)

// cloudLogger("[CloudService] BridgeOrchestrator disconnected on logout")
// } catch (error) {
// cloudLogger(
// `[CloudService] Failed to disconnect BridgeOrchestrator on logout: ${
// error instanceof Error ? error.message : String(error)
// }`,
// )
// }
// }
// }

// settingsUpdatedHandler = async () => {
// const userInfo = CloudService.instance.getUserInfo()
Expand Down
2 changes: 1 addition & 1 deletion src/integrations/claude-code/run.ts
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ function attemptParseChunk(data: string): ClaudeCodeMessage | null {
* Creates a user-friendly error message for Claude Code ENOENT errors
*/
function createClaudeCodeNotFoundError(claudePath: string, originalError: Error): Error {
const errorMessage = t("errors.claudeCode.notFound", {
const errorMessage = t("common:errors.claudeCode.notFound", {
claudePath,
installationUrl: CLAUDE_CODE_INSTALLATION_URL,
originalError: originalError.message,
Expand Down
7 changes: 7 additions & 0 deletions src/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -648,6 +648,13 @@
"type": "boolean",
"default": false,
"description": "%settings.newTaskRequireTodos.description%"
},
"roo-cline.codeIndex.embeddingBatchSize": {
"type": "number",
"default": 60,
"minimum": 1,
"maximum": 200,
"description": "%settings.codeIndex.embeddingBatchSize.description%"
}
}
},
Expand Down
3 changes: 2 additions & 1 deletion src/package.nls.json
Original file line number Diff line number Diff line change
Expand Up @@ -67,5 +67,6 @@
"settings.apiRequestTimeout.description": "Maximum time in seconds to wait for API responses (0 = no timeout, 1-3600s, default: 600s). Higher values are recommended for local providers like LM Studio and Ollama that may need more processing time.",
"settings.apiResponseRenderMode.description": "API response rendering speed mode (fast = minimal delay, medium = balanced, slow = maximum compatibility). Higher values provide better compatibility but may feel less responsive.",
"settings.autoCommit.description": "Automatically commit current changed files after accepting AI model changes",
"settings.newTaskRequireTodos.description": "Require todos parameter when creating new tasks with the new_task tool"
"settings.newTaskRequireTodos.description": "Require todos parameter when creating new tasks with the new_task tool",
"settings.codeIndex.embeddingBatchSize.description": "The batch size for embedding operations during code indexing. Adjust this based on your API provider's limits. Default is 60."
}
3 changes: 2 additions & 1 deletion src/package.nls.zh-CN.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion src/package.nls.zh-TW.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

21 changes: 19 additions & 2 deletions src/services/code-index/processors/file-watcher.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import { isPathInIgnoredDirectory } from "../../glob/ignore-utils"
import { TelemetryService } from "@roo-code/telemetry"
import { TelemetryEventName } from "@roo-code/types"
import { sanitizeErrorMessage } from "../shared/validation-helpers"
import { Package } from "../../../shared/package"

/**
* Implementation of the file watcher interface
Expand All @@ -38,6 +39,7 @@ export class FileWatcher implements IFileWatcher {
private batchProcessDebounceTimer?: NodeJS.Timeout
private readonly BATCH_DEBOUNCE_DELAY_MS = 500
private readonly FILE_PROCESSING_CONCURRENCY_LIMIT = 10
private readonly batchSegmentThreshold: number

private readonly _onDidStartBatchProcessing = new vscode.EventEmitter<string[]>()
private readonly _onBatchProgressUpdate = new vscode.EventEmitter<{
Expand Down Expand Up @@ -78,11 +80,26 @@ export class FileWatcher implements IFileWatcher {
private vectorStore?: IVectorStore,
ignoreInstance?: Ignore,
ignoreController?: RooIgnoreController,
batchSegmentThreshold?: number,
) {
this.ignoreController = ignoreController || new RooIgnoreController(workspacePath)
if (ignoreInstance) {
this.ignoreInstance = ignoreInstance
}
// Get the configurable batch size from VSCode settings, fallback to default
// If not provided in constructor, try to get from VSCode settings
if (batchSegmentThreshold !== undefined) {
this.batchSegmentThreshold = batchSegmentThreshold
} else {
try {
this.batchSegmentThreshold = vscode.workspace
.getConfiguration(Package.name)
.get<number>("codeIndex.embeddingBatchSize", BATCH_SEGMENT_THRESHOLD)
} catch {
// In test environment, vscode.workspace might not be available
this.batchSegmentThreshold = BATCH_SEGMENT_THRESHOLD
}
}
}

/**
Expand Down Expand Up @@ -341,8 +358,8 @@ export class FileWatcher implements IFileWatcher {
): Promise<Error | undefined> {
if (pointsForBatchUpsert.length > 0 && this.vectorStore && !overallBatchError) {
try {
for (let i = 0; i < pointsForBatchUpsert.length; i += BATCH_SEGMENT_THRESHOLD) {
const batch = pointsForBatchUpsert.slice(i, i + BATCH_SEGMENT_THRESHOLD)
for (let i = 0; i < pointsForBatchUpsert.length; i += this.batchSegmentThreshold) {
const batch = pointsForBatchUpsert.slice(i, i + this.batchSegmentThreshold)
let retryCount = 0
let upsertError: Error | undefined

Expand Down
23 changes: 21 additions & 2 deletions src/services/code-index/processors/scanner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,34 @@ import { isPathInIgnoredDirectory } from "../../glob/ignore-utils"
import { TelemetryService } from "@roo-code/telemetry"
import { TelemetryEventName } from "@roo-code/types"
import { sanitizeErrorMessage } from "../shared/validation-helpers"
import { Package } from "../../../shared/package"

export class DirectoryScanner implements IDirectoryScanner {
private readonly batchSegmentThreshold: number

constructor(
private readonly embedder: IEmbedder,
private readonly qdrantClient: IVectorStore,
private readonly codeParser: ICodeParser,
private readonly cacheManager: CacheManager,
private readonly ignoreInstance: Ignore,
) {}
batchSegmentThreshold?: number,
) {
// Get the configurable batch size from VSCode settings, fallback to default
// If not provided in constructor, try to get from VSCode settings
if (batchSegmentThreshold !== undefined) {
this.batchSegmentThreshold = batchSegmentThreshold
} else {
try {
this.batchSegmentThreshold = vscode.workspace
.getConfiguration(Package.name)
.get<number>("codeIndex.embeddingBatchSize", BATCH_SEGMENT_THRESHOLD)
} catch {
// In test environment, vscode.workspace might not be available
this.batchSegmentThreshold = BATCH_SEGMENT_THRESHOLD
}
}
}

/**
* Recursively scans a directory for code blocks in supported files.
Expand Down Expand Up @@ -153,7 +172,7 @@ export class DirectoryScanner implements IDirectoryScanner {
addedBlocksFromFile = true

// Check if batch threshold is met
if (currentBatchBlocks.length >= BATCH_SEGMENT_THRESHOLD) {
if (currentBatchBlocks.length >= this.batchSegmentThreshold) {
// Wait if we've reached the maximum pending batches
while (pendingBatchCount >= MAX_PENDING_BATCHES) {
// Wait for at least one batch to complete
Expand Down
25 changes: 24 additions & 1 deletion src/services/code-index/service-factory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ import { Ignore } from "ignore"
import { t } from "../../i18n"
import { TelemetryService } from "@roo-code/telemetry"
import { TelemetryEventName } from "@roo-code/types"
import { Package } from "../../shared/package"
import { BATCH_SEGMENT_THRESHOLD } from "./constants"

/**
* Factory class responsible for creating and configuring code indexing service dependencies.
Expand Down Expand Up @@ -156,7 +158,17 @@ export class CodeIndexServiceFactory {
parser: ICodeParser,
ignoreInstance: Ignore,
): DirectoryScanner {
return new DirectoryScanner(embedder, vectorStore, parser, this.cacheManager, ignoreInstance)
// Get the configurable batch size from VSCode settings
let batchSize: number
try {
batchSize = vscode.workspace
.getConfiguration(Package.name)
.get<number>("codeIndex.embeddingBatchSize", BATCH_SEGMENT_THRESHOLD)
} catch {
// In test environment, vscode.workspace might not be available
batchSize = BATCH_SEGMENT_THRESHOLD
}
return new DirectoryScanner(embedder, vectorStore, parser, this.cacheManager, ignoreInstance, batchSize)
}

/**
Expand All @@ -170,6 +182,16 @@ export class CodeIndexServiceFactory {
ignoreInstance: Ignore,
rooIgnoreController?: RooIgnoreController,
): IFileWatcher {
// Get the configurable batch size from VSCode settings
let batchSize: number
try {
batchSize = vscode.workspace
.getConfiguration(Package.name)
.get<number>("codeIndex.embeddingBatchSize", BATCH_SEGMENT_THRESHOLD)
} catch {
// In test environment, vscode.workspace might not be available
batchSize = BATCH_SEGMENT_THRESHOLD
}
return new FileWatcher(
this.workspacePath,
context,
Expand All @@ -178,6 +200,7 @@ export class CodeIndexServiceFactory {
vectorStore,
ignoreInstance,
rooIgnoreController,
batchSize,
)
}

Expand Down
1 change: 0 additions & 1 deletion webview-ui/src/components/chat/ChatTextArea.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -774,7 +774,6 @@ export const ChatTextArea = forwardRef<HTMLTextAreaElement, ChatTextAreaProps>(
)

highlightLayerRef.current.innerHTML = processedText
console.log("processedText")

// Custom replacement for commands - only highlight valid ones
processedText = processedText.replace(commandRegexGlobal, (match, commandName) => {
Expand Down
23 changes: 22 additions & 1 deletion webview-ui/src/components/cloud/CloudView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ import { ToggleSwitch } from "@/components/ui/toggle-switch"

import { History, PiggyBank, SquareArrowOutUpRightIcon } from "lucide-react"

// Define the production URL constant locally to avoid importing from cloud package in tests
const PRODUCTION_ROO_CODE_API_URL = "https://app.roocode.com"

type CloudViewProps = {
userInfo: CloudUserInfo | null
isAuthenticated: boolean
Expand Down Expand Up @@ -56,10 +59,16 @@ export const CloudView = ({ userInfo, isAuthenticated, cloudApiUrl, onDone }: Cl
// Send telemetry for cloud website visit
// NOTE: Using ACCOUNT_* telemetry events for backward compatibility with analytics
telemetryClient.capture(TelemetryEventName.ACCOUNT_CONNECT_CLICKED)
const cloudUrl = cloudApiUrl || "https://app.roocode.com"
const cloudUrl = cloudApiUrl || PRODUCTION_ROO_CODE_API_URL
vscode.postMessage({ type: "openExternal", url: cloudUrl })
}

const handleOpenCloudUrl = () => {
if (cloudApiUrl) {
vscode.postMessage({ type: "openExternal", url: cloudApiUrl })
}
}

const handleRemoteControlToggle = () => {
const newValue = !remoteControlEnabled
setRemoteControlEnabled(newValue)
Expand Down Expand Up @@ -186,6 +195,18 @@ export const CloudView = ({ userInfo, isAuthenticated, cloudApiUrl, onDone }: Cl
</div>
</>
)}
{cloudApiUrl && cloudApiUrl !== PRODUCTION_ROO_CODE_API_URL && (
<div className="mt-6 flex justify-center">
<div className="inline-flex items-center px-3 py-1 gap-1 rounded-full bg-vscode-badge-background/50 text-vscode-badge-foreground text-xs">
<span className="text-vscode-foreground/75">{t("cloud:cloudUrlPillLabel")}: </span>
<button
onClick={handleOpenCloudUrl}
className="text-vscode-textLink-foreground hover:text-vscode-textLink-activeForeground underline cursor-pointer bg-transparent border-none p-0">
{cloudApiUrl}
</button>
</div>
</div>
)}
</div>
)
}
Loading
Loading