* Remove pricing/enterprise and Roo Code for pages
* Remove cloud team and router pages
* Refine homepage hero and CTA sections
* nav
* more footer
* Fix knip by removing orphaned web files
feat(bedrock): add Cohere Embed v4 model and improve credential handling
- Add cohere.embed-v4:0 (1536-dim) to Bedrock embedding model profiles
- Add v4-specific request format (embedding_types: ["float"]) and response
parsing (embeddings.float[0]) in BedrockEmbedder
- Replace fromEnv() with fromNodeProviderChain() for default credential
chain when no AWS profile is specified, supporting SSO, IMDS, ECS, and
other credential sources with built-in memoization
- Add unit tests for Cohere v4 request/response handling, credential
provider selection, and v3 regression coverage
Fixes#11823
feat(cli): add create-with-session-id support
rename public task id flag to --create-with-session-id
validate session ids as UUIDs for create/resume and stdin start.taskId
add integration coverage for create+resume loading correct session
* Allow selecting a specific shell
Add --terminal-shell CLI flag to specify which shell ExecaTerminalProcess
uses for inline command execution. The shell path is validated at the CLI
layer and passed through the standard settings mechanism (BaseTerminal
static getter/setter), matching how all other CLI terminal settings flow
through the system.
* test(cli): make shell path access test cross-platform
In CLI runtime, stdin harnesses expect command lifetime to be governed
solely by commandExecutionTimeout (user setting), not model-provided
background timeouts. Extract resolveAgentTimeoutMs() and return 0 when
ROO_CLI_RUNTIME=1.
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
feat(cli): support images in stdin stream start and message commands
Add optional `images` field (array of base64 data URIs) to the `start` and
`message` CLI stdin stream commands, allowing callers to attach images to
prompts. The images are validated, forwarded through the extension host, and
included in queued messages.
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Propagate the command exit code through the JSON event emitter so CLI
consumers can distinguish between successful and failed command
executions without parsing output text.
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
fix: forward task configuration through stdin-prompt-stream protocol
The stdin-prompt-stream `start` command only accepted `prompt` — any
`configuration` passed via the cloud worker's StartNewTask was silently
dropped. This meant custom modes (e.g. `ask-artifacts`), disabled tools,
and other task-level settings never reached the extension when running
via the CLI harness.
Changes:
- Add optional `configuration` field to the `start` stdin command
- Parse and forward it in `runStdinStreamMode`
- Thread it through `ExtensionHost.runTask` → `newTask` webview message
→ `ClineProvider.createTask` (which already calls `setValues`)
- Add `taskConfiguration` field to `WebviewMessage` type
Backward-compatible: older CLIs ignore the extra field; older workers
that don't send `configuration` trigger no change in behavior.
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: cte <cestreich@gmail.com>
* fix(cli): streaming deltas, task ID propagation, cancel recovery, and misc fixes
- Stream tool_use ask messages (command, tool, mcp) as structured deltas
instead of full snapshots in json-event-emitter
- Generate task ID upfront and propagate through runTask/createTask so
currentTaskId is available in extension state immediately
- Wait for resumable state after cancel before processing follow-up
messages to prevent race conditions in stdin-stream
- Add ROO_CODE_DISABLE_TELEMETRY=1 env var to disable cloud telemetry
- Provide valid empty JSON Schema for custom tools without parameters
to fix strict-mode API validation
- Skip paths outside cwd in RooProtectedController to avoid RangeError
- Silently handle abort during exponential backoff retry countdown
- Enable customTools experiment in extension host
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: add start() to TaskStub in single-open-invariant test
The ClineProvider.createTask change to call task.start() after
addClineToStack requires the test's TaskStub mock to have this method.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
When the CLI is configured with the Roo provider, proactively fetch
and warm the model list during activation so that model information
is available before the first prompt is sent. The warmup has a 10s
timeout and failures are logged only in debug mode so they never
block normal operation.
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* changeset version bump
* Revise CHANGELOG for recent version updates
Updated changelog for versions 3.50.4 to 3.48.0, including new features, fixes, and improvements.
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>
* feat: add MiniMax M2.5 model and set as default
* fix: update MiniMax M2.5 contextWindow to 204_800
* Delete .changeset/add-minimax-m25.md
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>
* feat: restore Unbound as a provider
* Adds translations
* fix: add unbound to ClineProvider test expectations
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Pass --template="" to git init and strip GIT_TEMPLATE_DIR from the
environment so system/user git hooks and other template files never
get copied into the shadow repository used for checkpoints.
Co-authored-by: Roo Code <roomote@roocode.com>
* fix(bedrock): enable prompt caching for custom ARN and default to ON
- Set supportsPromptCache to true for custom-arn model info in useSelectedModel.ts
- Change awsUsePromptCache default from false to true using nullish coalescing
- Add tests for custom-arn prompt caching support
Closes#10846
* fix(bedrock): align backend awsUsePromptCache default with UI (?? true)
The backend treated undefined awsUsePromptCache as falsy (OFF) while the
UI checkbox defaulted to true via nullish coalescing. This caused the UI
to show prompt caching as ON but the backend to keep it OFF for new users.
Apply the same ?? true default in the backend so both sides agree.
---------
Co-authored-by: Roo Code <roomote@roocode.com>
* feat: add visual feedback to copy button in task actions
The copy button now shows a checkmark for 2 seconds after copying to provide visual feedback.
Fixes#11401
* fix: change Check icon import name in TaskActions and update test
- Fix Check icon import name from Check to CheckIcon for consistency in TaskActions.tsx
- Add test to verify check icon is shown when showCopyFeedback is true
- Mock useCopyToClipboard hook in TaskActions.spec.tsx to test copy button functionality
This change resolves the import inconsistency and adds a test to ensure the copy button correctly shows a check icon after successful copy.
* feat: show aggregated +/− line counts in FileChangesPanel header
* feat(FileChangesPanel): show merged diff relative to final file state
* fix(webview): restrict readFileContent to paths inside the workspace
* fix: add workspace-boundary validation to readFileContent to prevent path traversal
* fix(tests): mock isPathOutsideWorkspace in readFileContent spec
* fix(tests): mock isPathOutsideWorkspace in readFileContent spec
* fix: use path.resolve/path.sep in readFileContent test mock for cross-platform compatibility
The isPathOutsideWorkspace mock used hardcoded Unix-style path comparisons
(/mock/workspace with forward slashes), which fails on Windows where
path.resolve() produces paths with drive letters (C:\mock\workspace\...).
Replace manual string normalization with path.resolve() and path.sep so the
mock behaves correctly on both Windows and Unix.
---------
Co-authored-by: Roo Code <roomote@roocode.com>
* feat: disable apply_diff and enable edit tool for Vertex and Gemini providers
* feat: disable apply_diff and enable edit tool for Anthropic provider
* feat: disable apply_diff and enable edit tool for Anthropic Vertex provider
* fix: remove out-of-scope Anthropic/Anthropic-Vertex changes
The PR scope is Gemini and Vertex providers only. Reverting the
Anthropic and Anthropic-Vertex tool preference changes that were
not part of the stated scope.
---------
Co-authored-by: Roo Code <roomote@roocode.com>
feat: add `timeout` parameter to `execute_command` tool
Allow the agent to specify a per-command timeout in seconds. When
exceeded, the command continues running in the background (like clicking
"Run in Background") and the output collected so far is returned,
rather than aborting. This is useful for long-running processes like dev
servers or file watchers that may never exit on their own.
The agent timeout runs independently of the user-configured abort
timeout — the user timeout remains active as a safety net even after
the agent moves on.
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* feat: remove Roomote Control from extension
Remove all Roomote Control (remote control) functionality:
- Remove BridgeOrchestrator and entire bridge directory from @roo-code/cloud
- Remove remoteControlEnabled, featureRoomoteControlEnabled from extension state
- Remove extensionBridgeEnabled from CloudUserInfo and user settings
- Remove roomoteControlEnabled from organization/user feature schemas
- Remove enableBridge from Task and ClineProvider
- Remove remote control toggle from CloudView UI
- Remove remoteControlEnabled message handler
- Remove extension bridge disconnect on logout/deactivate
- Update CloudTaskButton to show for all logged-in users
- Remove remote control translation strings from all locales
- Update all related tests
CLO-765
* fix: remove dead getOrganizationMetadata and unused socket.io-client dep
* Readmes
* Readmes
* Types
* fix: remove leftover Roomote Control references from locale READMEs and stale BridgeOrchestrator mock
* Removes cloudtaskbutton
* fix: remove orphaned qrcode packages and dead openInCloud translation keys
* pnpmlock
* Revert these
* Revert these
* Revert these
* Remove socket.io
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Bruno Bergher <bruno@roocode.com>
Co-authored-by: cte <cestreich@gmail.com>
Changed the settings search results to be the same width as the search input. This ensures the results dropdown does not overflow outside of the parent panel.
* chore: remove integration test files
* chore: remove integration test job from CI workflow
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Hannes Rudolph <hrudolph@gmail.com>
* feat(cli): add NDJSON stdin protocol, list subcommands, and modularize run.ts
Overhaul the stdin prompt stream from raw text lines to a structured NDJSON
command protocol (start/message/cancel/ping/shutdown) with requestId
correlation, ack/done/error lifecycle events, and queue telemetry. Add list
subcommands (commands, modes, models) for programmatic discovery. Extract
stdin stream logic from run.ts into stdin-stream.ts and add shared isRecord
guard utility. Includes unit tests for all new modules.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(core): fix Task.ts bug affecting CLI operation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add per-task file-based history store for cross-instance safety
Implement TaskHistoryStore service that stores each task's HistoryItem
as an individual JSON file in its existing task directory. This prevents
silent data loss when multiple VS Code windows write to the shared
globalState taskHistory array concurrently.
Key changes:
- New TaskHistoryStore class with per-task file writes via safeWriteJson
- Index file (_index.json) for fast startup reads
- Reconciliation logic to detect and fix drift between instances
- fs.watch for cross-instance reactivity
- Debounced index writes (2s window) for streaming performance
- Migration from globalState on first startup
- Write-through to globalState during transition period
- Fallback lookups from globalState for backward compatibility
Files created:
- src/core/task-persistence/TaskHistoryStore.ts
- src/core/task-persistence/__tests__/TaskHistoryStore.spec.ts
- src/core/task-persistence/__tests__/TaskHistoryStore.crossInstance.spec.ts
Files modified:
- src/shared/globalFileNames.ts (added historyItem, historyIndex)
- src/core/task-persistence/index.ts (export TaskHistoryStore)
- src/core/webview/ClineProvider.ts (integrate store, remove write lock)
- Test files updated for new store-based approach
* fix: address review feedback - reconcile lock, init promise, write-through serialization
- reconcile() now runs through withLock() to prevent interleaving with
upsert/delete at async boundaries
- Added initialized promise so callers can await store readiness before
reading (getStateToPostToWebview now awaits it)
- Write-through to globalState now happens inside the store lock via
onWrite callback, preventing concurrent call races on the transition
period fallback
- Removed separate updateGlobalState("taskHistory") calls from
ClineProvider since the onWrite callback handles it serialized
* fix: add TaskHistoryStore to task-persistence mock in Task.persistence.spec.ts
The test mocks task-persistence with an explicit factory that was
missing the new TaskHistoryStore export, causing all 9 tests to fail
with "No TaskHistoryStore export is defined on the mock".
* perf: debounce globalState write-through to avoid full-array writes on every mutation
Instead of writing the entire HistoryItem[] array to globalState on
every upsert/delete (expensive with 5000+ tasks), the write-through
is now debounced with a 5-second window. Per-task file writes remain
immediate (~200 bytes each). The globalState is flushed on dispose
to ensure no data loss on shutdown.
This makes the hot path during streaming (token count updates) write
only the per-task file, not the full array.
---------
Co-authored-by: Roo Code <roomote@roocode.com>
* fix(chat): stabilize rehydration scroll-to-bottom convergence
* fix(chat): preserve user escape hatch during initial settle
* refactor(chat): reduce scroll fix PR scope and remove debug plumbing
* fix(chat): redesign rehydration scroll lifecycle
* refactor(chat): extract scroll lifecycle into useScrollLifecycle hook
- Extract ~400 lines of scroll lifecycle logic from ChatView.tsx into
a dedicated useScrollLifecycle hook, reducing ChatView scroll-related
refs from ~17 to 0 and making the logic testable in isolation.
- Reduce INITIAL_LOAD_SETTLE_HARD_CAP_MS from 10s to 5s. If rehydration
takes longer, there is likely a rendering performance issue worth
investigating separately.
- Document the scrollToIndex reversal: PR #6780 removed scrollToIndex
due to jitter from stale numeric indices. The "LAST" constant used
here resolves at call time, avoiding that issue.
- All 6 existing scroll regression tests pass unchanged.
* fix(chat): harden scroll lifecycle pointer intent and settle phase fallback
* test(chat): stabilize ChatView scroll debug repro flake
* refactor(chat): simplify hydration scroll lifecycle
* fix(chat): start existing task at latest message bottom
---------
Co-authored-by: Roo Code <roomote@roocode.com>
* feat: add per-workspace indexing opt-in and stop/cancel control
- Add codeIndexWorkspaceEnabled flag in workspaceState (default: false)
- Thread AbortController/AbortSignal through orchestrator → scanner
- Add Stop Indexing button and Stopping state to UI
- Fix handleSettingsChange() to abort active scan when disabling toggle
- Add translations for all 18 locales
* fix: correct abort handling in indexing scanner and orchestrator
- Re-throw AbortError in scanner's file processing catch block to prevent
abort signals from being silently swallowed as file errors
- Reorder stopWatcher() before setSystemState() in orchestrator abort
catch path to ensure watcher cleanup before state transition
- Update scanner test to assert AbortError propagation on mid-scan abort
* fix: optimize workspace check ordering, translate new i18n keys, fix abort handling
- Move workspace-enabled check before _recreateServices() in initialize()
to avoid creating Qdrant/embedder connections for disabled workspaces
- Translate new i18n keys (indexingStopped, indexingStoppedPartial, stopping,
stopIndexingButton, stoppingButton, workspaceToggleLabel,
workspaceDisabledMessage) in all 17 non-English locales
- Re-throw AbortError in scanner catch block to prevent silent swallowing
- Reorder stopWatcher() before setSystemState() in orchestrator abort path
- Update scanner test to assert AbortError propagation on mid-scan abort
- Fix recoverFromError test for workspace-enabled check ordering
* fix: per-folder enablement key, abort-safe dispose and back-pressure, translate i18n
Addresses 0xMink review feedback:
- Store workspace enablement keyed by folder path to support multi-root
workspaces (codeIndexWorkspaceEnabled:<path> instead of single boolean)
- Add test proving folder A enabled does not enable folder B
- dispose() now calls stopIndexing() to abort orphaned scans on folder removal
- Scanner back-pressure loop checks abort signal to avoid spin-waiting
- Move workspace-enabled check before _recreateServices() in initialize()
- Translate new i18n keys in all 17 non-English locales
- Fix abort handling in orchestrator and scanner catch blocks
* fix: flush debounced cache writes on abort to preserve indexing progress
* feat: add global auto-enable default for backward-compatible workspace indexing
* fix: stop/start indexer when auto-enable default changes effective state
* fix: URI-keyed enablement, throw AbortError in back-pressure, stopWatcher on early-return
* fix: iterate all managers when auto-enable default changes in multi-root workspaces
---------
Co-authored-by: James Mtendamema <jmtendamema@geologicai.com>
* Add file changes panel per conversation
Closes#11493
* Add unit tests for file changes and consolidate specs in src/__tests__
Closes#11493
* fix(chat): only show approved file diffs in conversation panel
Replace the incorrect Sonnet 4.6 Bedrock ID with the AWS-supported
model ID in the model registry and Bedrock capability lists.
Remove references to the deprecated dated ID and update Bedrock
tests to validate the corrected Sonnet 4.6 identifier.
* fix: await MCP server initialization before returning McpHub instance
MCP tools were unavailable on the first task turn when started via IPC
because McpHub's constructor fired initializeGlobalMcpServers() and
initializeProjectMcpServers() without awaiting them. getInstance()
returned a hub with servers still in "connecting" state.
Store the combined initialization promise and expose waitUntilReady(),
then await it in McpServerManager.getInstance() so the hub is only
returned after all servers have connected or timed out.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix: assign McpHub instance only after waitUntilReady() resolves
Closes race condition where concurrent callers of getInstance() could
receive a hub that has not finished initialization. The hub is now
created in a local variable and only assigned to this.instance after
waitUntilReady() completes.
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Roo Code <roomote@roocode.com>
* changeset version bump
* fix: update changelog-config to support multi-line entries and restore full v3.48.0 CHANGELOG
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Hannes Rudolph <hrudolph@gmail.com>
Update 1M context locale copy for Claude 4 models
Refresh 1M context beta descriptions so locale text matches
current model support in Anthropic, Bedrock, and Vertex.
Use a shorter model scope string to keep UI copy readable and
easier to maintain while staying accurate.
* Add Anthropic Claude Sonnet 4.6 support across providers
Add model definitions and capability flags for Anthropic, Bedrock,
Vertex, OpenRouter, and Vercel AI Gateway.
Update Anthropic handler and UI model selection logic to support Claude
Sonnet 4.6 1M context behavior and tier pricing.
Add focused tests for provider handlers, fetchers, and selected-model
hooks.
Keep Bedrock UI tier pricing parity as-is because this is a
pre-existing issue for Opus 4.6 and will be handled separately.
Reference:
- https://www.anthropic.com/news/claude-sonnet-4-6
- https://platform.claude.com/docs/en/about-claude/models/overview#latest-models-comparison
* Delete .changeset/soft-carpets-hunt.md
---------
Co-authored-by: Hannes Rudolph <hrudolph@gmail.com>
* feat(web): add blog section with 4 initial posts
Implements MKT-66 through MKT-74:
Content Layer (MKT-67):
- Markdown files in src/content/blog with Zod-validated frontmatter
- Pacific Time scheduling evaluated at request-time (no deploy needed)
- gray-matter for parsing, react-markdown + remark-gfm for rendering
Blog Pages (MKT-68, MKT-69):
- Index page at /blog with dynamic SSR
- Post page at /blog/[slug] with dynamic SSR
- Breadcrumb navigation and prev/next post navigation
SEO (MKT-70):
- Full OpenGraph and Twitter card metadata
- Schema.org JSON-LD (Article, BreadcrumbList, CollectionPage)
- Canonical URLs pointing to roocode.com/blog
Analytics (MKT-74):
- PostHog blog_post_viewed and blog_index_viewed events
- Referrer tracking for attribution
Navigation (MKT-72):
- Updated nav-bar and footer to link to internal /blog
- Blog link in Resources dropdown
Sitemap (MKT-71):
- Dynamic blog paths with PT scheduling check
Initial Posts:
- PRDs Are Becoming Artifacts of the Past (Jan 12)
- Code Review Got Faster, Not Easier (Jan 19)
- Vibe Coders Build and Rebuild (Jan 26)
- Async Agents Change the Speed vs Quality Calculus (Feb 2)
* fix(test): update HistoryPreview tests to match refactored component
The HistoryPreview component was refactored to use useGroupedTasks and
TaskGroupItem instead of rendering TaskItem directly. This updates the
test file to properly mock the new dependencies:
- Mock useGroupedTasks hook to provide grouped task data
- Mock TaskGroupItem instead of TaskItem
- Update assertions to test for task groups instead of individual tasks
* feat(blog): add Vercel-inspired patterns and Tone of Voice alignment
- Add reading time display to blog posts
- Create BlogPostCTA component with 4 variants (default, extension, cloud, enterprise)
- Add zebra striping to tables in blog posts
- Add CTA to blog landing and paginated pages
- Remove 'Posted' prefix from dates
- Update blog description: 'How teams use agents to iterate, review, and ship PRs with proof'
- Add BlogPostList and BlogPagination components
- Add 100+ new blog posts from content pipeline
* feat(blog): add source badges for podcast content (Office Hours, After Hours, Roo Cast)
- Add BlogSource type to types.ts
- Export BlogSource from blog index
- Add SourceBadge component to BlogPostList with colored badges
- Each podcast has distinct color: blue (Office Hours), purple (After Hours), emerald (Roo Cast)
* feat(blog): add source field to all blog posts (Roo Cast, Office Hours, After Hours)
- Add add-blog-sources.ts script to build title→source mapping
- Updated 122 blog posts with correct podcast sources
- Sources: Roo Cast (52), Office Hours (62), After Hours (8)
* feat(blog): add source badges with consistent styling
- Add source field to Zod validation schema
- Source badges use same styling as tag badges (rounded, greyscale)
- Badges display on /blog landing page for Office Hours, After Hours, Roo Cast
* feat(blog): improve schema.org structured data for SEO
- Change @type from Article to BlogPosting (more specific)
- Add image property using OG image URL
- Add wordCount for AEO optimization
* feat(blog): timestamped YouTube quotes + attribution polish
* chore(blog): update 'Series A team' to 'Series A - C team' and fix 'Tovin' to 'Tovan'
- Changed 22 instances of 'Series A team' to 'Series A - C team' across 20 blog posts
- Changed 12 instances of 'Tovin' to 'Tovan' across 4 blog posts
This broadens the messaging to better represent teams that Roo Code serves (Series A through C).
* ci: retry CI after timeout
* blog: featured posts + copy edits
* blog: remove draft posts from web content
* fix(blog): loop HTML tag stripping to prevent incomplete sanitization
The single-pass .replace(/<[^>]+>/g, "") in calculateReadingTime() was
flagged by CodeQL as vulnerable to incomplete multi-character sanitization.
Input like "<scr<script>ipt>" would still contain "<script" after one pass.
Added a stripHtmlTags() helper that loops the replacement until stable,
plus a final pass to remove any remaining angle brackets.
* fix(blog): replace iterative HTML tag stripping with single-pass angle bracket removal
The CodeQL scanner flagged the iterative stripHtmlTags function for
incomplete multi-character sanitization. The regex /<[^>]+>/g only
matches complete tags, so partial fragments like <script (without a
closing >) could survive intermediate loop iterations.
Since this function is only used for word counting in
calculateReadingTime, replace the multi-step approach with a simple
single-pass removal of all < and > characters. This eliminates the
incomplete sanitization pattern entirely.
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Michael Preuss <michael@roocode.com>
Added strict validation for the `follow_up` parameter to
check for presence and type (Array). Added test cases
covering missing, null, and invalid type scenarios.
Refactored parameter error handling into a helper method to reduce
duplication.
* Add stdin stream mode for the cli
* fix: clear jsonEmitter state between tasks in stdin-prompt-stream mode
* fix: use consistent user role for prompt echo partials in stream-json mode
---------
Co-authored-by: Roo Code <roomote@roocode.com>
* fix: correct Bedrock model ID for Claude Opus 4.6 (#11232)
Remove the :0 suffix from the Claude Opus 4.6 model ID to match
the correct AWS Bedrock model identifier.
The model ID was "anthropic.claude-opus-4-6-v1:0" but should be
"anthropic.claude-opus-4-6-v1" per AWS Bedrock documentation.
Fixes#11231
Co-authored-by: Roo Code <roomote@roocode.com>
* fix: guard against empty-string baseURL in provider constructors (#11233)
When the 'custom base URL' checkbox is unchecked in the UI, the setting
is set to '' (empty string). Providers that passed this directly to their
SDK constructors caused 'Failed to parse URL' errors because the SDK
treated '' as a valid but broken base URL override.
- gemini.ts: use || undefined (was passing raw option)
- openai-native.ts: use || undefined (was passing raw option)
- openai.ts: change ?? to || for fallback default
- deepseek.ts: change ?? to || for fallback default
- moonshot.ts: change ?? to || for fallback default
Adds test coverage for Gemini and OpenAI Native constructors verifying
empty-string baseURL is coerced to undefined.
* fix: make defaultTemperature required in getModelParams to prevent silent temperature overrides (#11218)
* fix: DeepSeek temperature defaulting to 0 instead of 0.3
Pass defaultTemperature: DEEP_SEEK_DEFAULT_TEMPERATURE to getModelParams() in
DeepSeekHandler.getModel() to ensure the correct default temperature (0.3)
is used when no user configuration is provided.
Closes#11194
* refactor: make defaultTemperature required in getModelParams
Make the defaultTemperature parameter required in getModelParams() instead
of defaulting to 0. This prevents providers with their own non-zero default
temperature (like DeepSeek's 0.3) from being silently overridden by the
implicit 0 default.
Every provider now explicitly declares its temperature default, making the
temperature resolution chain clear:
user setting → model default → provider default
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
* feat: batch consecutive tool calls in chat UI with shared utility (#11245)
* feat: group consecutive list_files tool calls into single UI block
Consolidate consecutive listFilesTopLevel/listFilesRecursive ask messages
into a single 'Roo wants to view multiple directories' block, matching the
existing read_file batching pattern.
* chore: add missing translation keys for all locales
* refactor: consolidate duplicate listFiles batch-handling blocks in ChatRow
Merge the separate listFilesTopLevel and listFilesRecursive case blocks
into a single combined case with shared batch-detection logic, selecting
the icon and translation key based on the tool type. This removes the
duplicated isBatchDirRequest check and BatchListFilesPermission render.
* feat: batch consecutive file-edit tool calls into single UI block
Add edit-file batching in ChatView groupedMessages that consolidates
consecutive editedExistingFile, appliedDiff, newFileCreated,
insertContent, and searchAndReplace asks into a single BatchDiffApproval
block. Move batchDiffs detection in ChatRow above the switch statement
so it applies to any file-edit tool type.
* refactor: extract batchConsecutive utility, fix batch UI issues
- Extract generic batchConsecutive() utility from 3 identical while-loops
- Fix React key collisions in BatchListFilesPermission, BatchFilePermission, BatchDiffApproval
- Normalize language prop to "shellsession" (was "shell-session" for top-level)
- Remove unused _batchedMessages property from synthetic messages
- Remove dead didViewMultipleDirectories i18n key from all 18 locale files
- Add batch button text for listFilesTopLevel/listFilesRecursive
- Add batchConsecutive utility tests (6 cases)
* fix: audit improvements for batch tool-call UI
- Make batchConsecutive() generic instead of ClineMessage-specific
- Add batch-aware button text for edit-file batches ("Save All"/"Deny All")
- Add dedicated list-batch/edit-batch i18n keys (stop reusing read-batch)
- Add JSON.parse defense-in-depth in all three synthesizers
- Fix mixed list_files batch icon to default to FolderTree
- Add 6 missing test cases (all-match, immutability, spy, single-dir)
* chore: minor type cleanup (out-of-scope housekeeping)
- Trim unused recursive/isOutsideWorkspace from DirPermissionItem interface
- Remove 4 pre-existing `as any` casts in ChatView.tsx:
- window cast → precise inline type
- checkpoint bracket access → removed unnecessary casts
- condensing message → `as ClineMessage`
- debounce cancel → `.clear()` (correct API)
- Update BatchListFilesPermission test data to match trimmed interface
* i18n: add list-batch and edit-batch translations for all locales
* feat: add IPC query handlers for commands, modes, and models (#11279)
Add GetCommands, GetModes, and GetModels to the IPC protocol so external
clients can fetch slash commands, available modes, and Roo provider models
without going through the internal webview message channel.
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add lock toggle to pin API config across all modes in workspace (#11295)
* feat: add lock toggle to pin API config across all modes in workspace
Add a lock/unlock toggle inside the API config selector popover (next to
the settings gear) that, when enabled, applies the selected API
configuration to all modes in the current workspace.
- Add lockApiConfigAcrossModes to ExtensionState and WebviewMessage types
- Store setting in workspaceState (per-workspace, not global)
- When locked, activateProviderProfile sets config for all modes
- Lock icon in ApiConfigSelector popover bottom bar next to gear
- Full i18n: English + 17 locale translations (all mention workspace scope)
- 9 new tests: 2 ClineProvider, 2 handler, 5 UI (77 total pass)
* refactor: replace write-fan-out with read-time override for lock API config
The original lock implementation used setModeConfig() fan-out to write the
locked config to ALL modes globally. Since the lock flag lives in workspace-
scoped workspaceState but modeApiConfigs are in global secrets, this caused
cross-workspace data destruction.
Replaced with read-time guards:
- handleModeSwitch: early return when lock is on (skip per-mode config load)
- createTaskWithHistoryItem: skip mode-based config restoration under lock
- activateProviderProfile: removed fan-out block
- lockApiConfigAcrossModes handler: simplified to flag + state post only
- Fixed pre-existing workspaceState mock gap in ClineProvider.spec.ts and
ClineProvider.sticky-profile.spec.ts
* fix: validate Gemini thinkingLevel against model capabilities and handle empty streams (#11303)
* fix: validate Gemini thinkingLevel against model capabilities and handle empty streams
getGeminiReasoning() now validates the selected effort against the model's
supportsReasoningEffort array before sending it as thinkingLevel. When a
stale settings value (e.g. 'medium' from a different model) is not in the
supported set, it falls back to the model's default reasoningEffort.
GeminiHandler.createMessage() now tracks whether any text content was
yielded during streaming and handles NoOutputGeneratedError gracefully
instead of surfacing the cryptic 'No output generated' error.
* fix: guard thinkingLevel fallback against 'none' effort and add i18n TODO
The array validation fallback in getGeminiReasoning() now only triggers
when the selected effort IS a valid Gemini thinking level but not in
the model's supported set. Values like 'none' (explicit no-reasoning
signal) are no longer overridden by the model default.
Also adds a TODO for moving the empty-stream message to i18n.
* fix: track tool_call_start in hasContent to avoid false empty-stream warning
Tool-only responses (no text) are valid content. Without this,
agentic tool-call responses would incorrectly trigger the empty
response warning message.
* chore(cli): prepare release v0.0.53 (#11425)
* feat: add GLM-5 model support to Z.ai provider (#11440)
* chore: regenerate pnpm-lock.yaml
* fix: resolve type errors and remove AI SDK test contamination
* docs: update progress.txt with rebuilt Batch 2 status
---------
Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com>
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
Co-authored-by: Chris Estreich <cestreich@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* fix: add image content support to MCP tool responses (#10874)
Co-authored-by: Roo Code <roomote@roocode.com>
* fix: transform tool blocks to text before condensing (EXT-624) (#10975)
* refactor(read_file): Codex-inspired read_file refactor EXT-617 (#10981)
* feat: allow import settings in initial welcome screen (#10994)
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>
* fix(code-index): remove deprecated text-embedding-004 and migrate to gemini-embedding-001 (#11038)
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Hannes Rudolph <hrudolph@gmail.com>
* chore: treat extension .env as optional (#11116)
* fix: sanitize tool_use_id in tool_result blocks to match API history (#11131)
Tool IDs from providers like Gemini/OpenRouter contain special characters
(e.g., 'functions.read_file:0') that are sanitized when saving tool_use
blocks to API history. However, tool_result blocks were using the original
unsanitized IDs, causing ToolResultIdMismatchError.
This fix ensures tool_result blocks use sanitizeToolUseId() to match the
sanitized tool_use IDs in conversation history.
Fixes EXT-711
* fix: queue messages during command execution instead of losing them (#11140)
* IPC fixes for task cancellation and queued messages (#11162)
* feat: add support for AGENTS.local.md personal override files (#11183)
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com>
* fix(cli): resolve race condition causing provider switch during mode changes (#11205)
When using slash commands with `mode:` frontmatter (e.g., `/cli-release`
with `mode: code`), the CLI would fail with "Could not resolve
authentication method" from the Anthropic SDK, even when using a
non-Anthropic provider like `--provider roo`.
Root cause: In `markWebviewReady()`, the `webviewDidLaunch` message was
sent before `updateSettings`, creating a race condition. The
`webviewDidLaunch` handler's "first-time init" sync would read
`getState()` before CLI-provided settings were applied to the context
proxy. Since `getState()` defaults `apiProvider` to "anthropic" when
unset, this default was saved to the provider profile. When a slash
command triggered `handleModeSwitch()`, it found this corrupted profile
with `apiProvider: "anthropic"` (but no API key) and activated it,
overwriting the CLI's working roo provider configuration.
Fix:
1. Reorder `markWebviewReady()` to send `updateSettings` before
`webviewDidLaunch`, ensuring the context proxy has CLI-provided
values when the initialization handler runs.
2. Guard the first-time init sync with `checkExistKey(apiConfiguration)`
to prevent saving a profile with only the default "anthropic"
fallback and no actual API keys configured.
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* chore: remove dead toolFormat code from getEnvironmentDetails (#11207)
Remove the toolFormat constant and <tool_format> line from environment
details output. Native tool calling is now the only supported protocol,
making this code unnecessary.
Fixes#11206
Co-authored-by: Roo Code <roomote@roocode.com>
* feat: extract translation and merge resolver modes into reusable skills (#11215)
* feat: extract translation and merge resolver modes into reusable skills
- Add roo-translation skill with comprehensive i18n guidelines
- Add roo-conflict-resolution skill for intelligent merge conflict resolution
- Add /roo-translate slash command as shortcut for translation skill
- Add /roo-resolve-conflicts slash command as shortcut for conflict resolution skill
The existing translate and merge-resolver modes are preserved. These new skills
and commands provide reusable access to the same functionality.
Closes CLO-722
* feat: add guidances directory with translator guidance file
- Add .roo/guidances/roo-translator.md for brand voice, tone, and word choice guidance
- Update roo-translation skill to reference the guidance file
The guidance file serves as a placeholder for translation style guidelines
that will be interpolated at runtime.
* fix: rename guidances directory to guidance (singular)
* fix: remove language-specific section from translator guidance
The guidance file should focus on brand voice, tone, and word choice only.
* fix: remove language-specific guidelines section from skill file
* Update .roo/skills/roo-translation/SKILL.md
Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com>
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Bruno Bergher <bruno@roocode.com>
Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com>
* feat: add Claude Opus 4.6 support across all providers (#11224)
* feat: add Claude Opus 4.6 support across all providers
Add Claude Opus 4.6 (claude-opus-4-6) model definitions and 1M context
support across Anthropic, Bedrock, Vertex AI, OpenRouter, and Vercel AI
Gateway providers.
- Anthropic: 128K max output, /5 pricing, 1M context tiers
- Bedrock: anthropic.claude-opus-4-6-v1:0 with 1M context + global inference
- Vertex: claude-opus-4-6 with 1M context tiers
- OpenRouter: prompt caching + reasoning budget sets
- Vercel AI Gateway: Opus 4.5 and 4.6 added to capability sets
- UI: 1M context checkbox for Opus 4.6 on all providers
- i18n: Updated 1M context descriptions across 18 locales
Also adds Opus 4.5 to Vercel AI Gateway (previously missing) and
OpenRouter maxTokens overrides for Opus 4.5/4.6.
Closes#11223
* fix: apply tier pricing when 1M context is enabled on Bedrock
When awsBedrock1MContext is enabled for tiered models like Opus 4.6,
also apply the 1M tier pricing (inputPrice, outputPrice, cache prices)
instead of only updating contextWindow. This ensures cost calculations
and UI display use the correct >200K rates.
* feat: add gpt-5.3-codex model to OpenAI Codex provider (#11225)
feat: add gpt-5.3-codex model and make it default for OpenAI Codex provider
Co-authored-by: Roo Code <roomote@roocode.com>
* fix: prevent parent task state loss during orchestrator delegation (#11281)
* fix: make removeClineFromStack() delegation-aware to prevent orphaned parent tasks (#11302)
* fix: make removeClineFromStack() delegation-aware to prevent orphaned parent tasks
When a delegated child task is removed via removeClineFromStack() (e.g., Clear
Task, navigate to history, start new task), the parent task was left orphaned
in "delegated" status with a stale awaitingChildId. This made the parent
unresumable without manual history repair.
This fix captures parentTaskId and childTaskId before abort/dispose, then
repairs the parent metadata (status -> active, clear awaitingChildId) when
the popped task is a delegated child and awaitingChildId matches.
Parent lookup + updateTaskHistory are wrapped in try/catch so failures are
non-fatal (logged but do not block the pop).
Closes#11301
* fix: add skipDelegationRepair opt-out to removeClineFromStack() for nested delegation
---------
Co-authored-by: Roo Code <roomote@roocode.com>
* fix(reliability): prevent webview postMessage crashes and make dispose idempotent (#11313)
* fix(reliability): prevent webview postMessage crashes and make dispose idempotent
Closes: #11311
1. postMessageToWebview() now catches rejections from
webview.postMessage() so that messages sent after the webview is
disposed do not surface as unhandled promise rejections.
2. dispose() is guarded by a _disposed flag so that repeated calls
(e.g. during rapid extension deactivation) are no-ops.
3. CloudService mock in ClineProvider.spec.ts updated to include
off() — a pre-existing gap exposed by the new dispose test.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: add early _disposed check in postMessageToWebview
Skip the postMessage call entirely when the provider is already disposed,
avoiding unnecessary try/catch execution. Added test coverage for this path.
* chore: trigger CI
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
* fix: resolve race condition in new_task delegation that loses parent task history (#11331)
* fix: resolve race condition in new_task delegation that loses parent task history
When delegateParentAndOpenChild creates a child task via createTask(), the
Task constructor fires startTask() as a fire-and-forget async call. The child
immediately begins its task loop and eventually calls saveClineMessages() →
updateTaskHistory(), which reads globalState, modifies it, and writes back.
Meanwhile, delegateParentAndOpenChild persists the parent's delegation
metadata (status: 'delegated', delegatedToId, awaitingChildId, childIds) via
a separate updateTaskHistory() call AFTER createTask() returns.
These two concurrent read-modify-write operations on globalState race: the
last writer wins, overwriting the other's changes. When the child's write
lands last, the parent's delegation fields are lost, making the parent task
unresumable when the child finishes.
Fix: create the child task with startTask: false, persist the parent's
delegation metadata first, then manually call child.start(). This ensures
the parent metadata is safely in globalState before the child begins writing.
* docs: clarify Task.start() only handles new tasks, not history resume
* fix: serialize taskHistory writes and fix delegation status overwrite race (#11335)
Add a promise-chain mutex (withTaskHistoryLock) to serialize all
read-modify-write operations on taskHistory, preventing concurrent
interleaving from silently dropping entries.
Reorder reopenParentFromDelegation to close the child instance
before marking it completed, so the abort path's stale 'active'
status write no longer overwrites the 'completed' state.
Covered by new tests: RPD-04/05/06, UTH-02/04, and a full mutex
concurrency suite.
* Fix task resumption in the API module (#11369)
* chore: clean up repo-facing mode rules (#11410)
* fix: add maxReadFileLine to ExtensionState type for webview compatibility
---------
Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com>
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Daniel <57051444+daniel-lxs@users.noreply.github.com>
Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>
Co-authored-by: Chris Estreich <cestreich@gmail.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Bruno Bergher <bruno@roocode.com>
Co-authored-by: 0xMink <dennis@dennismink.com>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
* fix: cancel backend auto-approval timeout when auto-approve is toggled off mid-countdown (#11439)
Co-authored-by: Sannidhya <sann@Sannidhyas-MacBook-Pro.local>
* fix: prevent chat history loss during cloud/settings navigation (#11371) (#11372)
Co-authored-by: Sannidhya <sann@Sannidhyas-MacBook-Pro.local>
* fix: preserve pasted images in chatbox during chat activity (#11375)
Co-authored-by: Roo Code <roomote@roocode.com>
* fix: resolve chat scroll anchoring and task-switch scroll race condit… (#11385)
* fix: avoid zsh process-substitution false positives in assignments (#11365)
* fix(editor): make tab close best-effort in DiffViewProvider.open (#11363)
* fix(checkpoints): canonicalize core.worktree comparison to prevent Windows path mismatch failures (#11346)
* fix: prevent double notification sound playback (#11283)
* fix: prevent false unsaved changes prompt with OpenAI Compatible headers (#8230) (#11334)
fix: prevent false unsaved changes prompt with OpenAI Compatible headers
Mark automatic header syncs in ApiOptions and OpenAICompatible as
non-user actions (isUserAction: false) and enhance SettingsView change
detection to skip automatic syncs with semantically equal values.
Root cause: two components (ApiOptions and OpenAICompatible) manage
openAiHeaders state and automatically sync it back on mount/remount.
These syncs were treated as user changes, triggering a false dirty state.
Co-authored-by: Robert McIntyre <robertjmcintyre@users.noreply.github.com>
* fix: remove noisy console.warn logs from NativeToolCallParser (#11264)
Remove two console.warn messages that fire excessively when loading tasks
from history:
- 'Attempting to finalize unknown tool call' in finalizeStreamingToolCall()
- 'Received chunk for unknown tool call' in processStreamingChunk()
The defensive null-return behavior is preserved; only the log output is removed.
* refactor: remove footgun prompting (file-based system prompt override) (#11387)
* refactor: delete orphaned per-provider caching transform files (#11388)
* feat: add disabledTools setting to globally disable native tools (#11277)
* feat: add disabledTools setting to globally disable native tools
Add a disabledTools field to GlobalSettings that allows disabling specific
native tools by name. This enables cloud agents to be configured with
restricted tool access.
Schema:
- Add disabledTools: z.array(toolNamesSchema).optional() to globalSettingsSchema
- Add disabledTools to organizationDefaultSettingsSchema.pick()
- Add disabledTools to ExtensionState Pick type
Prompt generation (tool filtering):
- Add disabledTools to BuildToolsOptions interface
- Pass disabledTools through filterSettings to filterNativeToolsForMode()
- Remove disabled tools from allowedToolNames set in filterNativeToolsForMode()
Execution-time validation (safety net):
- Extract disabledTools from state in presentAssistantMessage
- Convert disabledTools to toolRequirements format for validateToolUse()
Wiring:
- Add disabledTools to ClineProvider getState() and getStateToPostToWebview()
- Pass disabledTools to all buildNativeToolsArrayWithRestrictions() call sites
EXT-778
* fix: check toolRequirements before ALWAYS_AVAILABLE_TOOLS
Moves the toolRequirements check before the ALWAYS_AVAILABLE_TOOLS
early-return in isToolAllowedForMode(). This ensures disabledTools
can block always-available tools (switch_mode, new_task, etc.) at
execution time, making the validation layer consistent with the
filtering layer.
* feat: add support for .agents/skills directory (#11181)
* feat: add support for .agents/skills directory
This change adds support for discovering skills from the .agents/skills
directory, following the Agent Skills convention for sharing skills
across different AI coding tools.
Priority order (later entries override earlier ones):
1. Global ~/.agents/skills (shared across AI coding tools, lowest priority)
2. Project .agents/skills
3. Global ~/.roo/skills (Roo-specific)
4. Project .roo/skills (highest priority)
Changes:
- Add getGlobalAgentsDirectory() and getProjectAgentsDirectoryForCwd()
functions to roo-config
- Update SkillsManager.getSkillsDirectories() to include .agents/skills
- Update SkillsManager.setupFileWatchers() to watch .agents/skills
- Add tests for new functionality
* fix: clarify skill priority comment to match actual behavior
* fix: clarify skill priority comment to explain Map.set replacement mechanism
---------
Co-authored-by: Roo Code <roomote@roocode.com>
* feat(history): render nested subtasks as recursive tree (#11299)
* feat(history): render nested subtasks as recursive tree
* fix(lockfile): resolve missing ai-sdk provider entry
* fix: address review feedback — dedupe countAll, increase SubtaskRow max-h
- HistoryView: replace local countAll with imported countAllSubtasks from types.ts
- SubtaskRow: increase nested children max-h from 500px to 2000px to match TaskGroupItem
* perf(refactor): consolidate getState calls in resolveWebviewView (#11320)
* perf(refactor): consolidate getState calls in resolveWebviewView
Replace three separate this.getState().then() calls with a single
await this.getState() and destructuring. This avoids running the
full getState() method (CloudService calls, ContextProxy reads, etc.)
three times during webview view resolution.
* fix: keep getState consolidation non-blocking to avoid delaying webview render
---------
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
* fix: harden command auto-approval against inline JS false positives (#11382)
* feat: rename search_and_replace tool to edit and unify edit-family UI (#11296)
* Revert "refactor: delete orphaned per-provider caching transform files (#11388)"
This reverts commit 13a45b0361.
* chore: regenerate built-in-skills.ts with updated formatting
* fix: add missing maxReadFileLine property to test baseState
The ExtensionState type now requires maxReadFileLine property (added in commit 63e3f769a).
Update the test to include this property with the default value of -1 (unlimited reading).
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
* feat: add pnpm serve command for code-server development (#10964)
Co-authored-by: Roo Code <roomote@roocode.com>
* chore: remove Feature Request from issue template options (#11141)
Co-authored-by: Roo Code <roomote@roocode.com>
* refactor(docs-extractor): simplify mode to focus on raw fact extraction (#11129)
* Add cli support for linux (#11167)
* fix: replace heredocs with echo statements in cli-release workflow (#11168)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* Drop MacOS-13 cli support (#11169)
* fix(cli): correct example in install script (#11170)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* feat: add Kimi K2.5 model to Fireworks provider (#11177)
* feat(cli): improve dev experience and roo provider API key support (#11203)
- Allow --api-key and ROO_API_KEY env var for the roo provider instead of
requiring cloud auth token
- Switch dev/start scripts to use tsx for running directly from source
without building first
- Fix path resolution (version.ts, extension.ts, extension-host.ts) to
work from both source and bundled locations
- Disable debug log file (~/.roo/cli-debug.log) unless --debug is passed
- Update README with complete env var table and dev workflow docs
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* Roo Code CLI v0.0.50 (#11204)
* Roo Code CLI v0.0.50
* docs(cli): add --exit-on-error to changelog
---------
Co-authored-by: Roo Code <roomote@roocode.com>
* feat(cli): update default model from Opus 4.5 to Opus 4.6 (#11273)
Co-authored-by: Roo Code <roomote@roocode.com>
* feat(web): replace Roomote Control with Linear Integration in cloud features grid (#11280)
Co-authored-by: Roo Code <roomote@roocode.com>
* Add linux-arm64 for the roo cli (#11314)
* chore: clean up repo-facing mode rules (#11410)
* Make CLI auto-approve by default with require-approval opt-in (#11424)
Co-authored-by: Roo Code <roomote@roocode.com>
* Add new code owners to CODEOWNERS file
* Update next.js (#11108)
* feat(web): Replace bespoke navigation menu with shadcn navigation menu (#11117)
Co-authored-by: Roo Code <roomote@roocode.com>
---------
Co-authored-by: SannidhyaSah <sah_sannidhya@outlook.com>
Co-authored-by: Sannidhya <sann@Sannidhyas-MacBook-Pro.local>
Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com>
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Hannes Rudolph <hrudolph@gmail.com>
Co-authored-by: 0xMink <dennis@dennismink.com>
Co-authored-by: Robert McIntyre <robertjmcintyre@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>
Co-authored-by: Chris Estreich <cestreich@gmail.com>
Revert to pre-AI-SDK state (commit 67e568f6b)
This commit reverts the codebase to the state before AI SDK migration work began.
Target commit: 67e568f6b - refactor: replace fetch_instructions with skill tool and built-in skills (#10913)
Date: January 29, 2026
This removes approximately 152 commits of AI SDK migration work.
A follow-up PR will add back bug fixes and features that are unrelated to AI SDK.
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
* feat: extract translation and merge resolver modes into reusable skills
- Add roo-translation skill with comprehensive i18n guidelines
- Add roo-conflict-resolution skill for intelligent merge conflict resolution
- Add /roo-translate slash command as shortcut for translation skill
- Add /roo-resolve-conflicts slash command as shortcut for conflict resolution skill
The existing translate and merge-resolver modes are preserved. These new skills
and commands provide reusable access to the same functionality.
Closes CLO-722
* feat: add guidances directory with translator guidance file
- Add .roo/guidances/roo-translator.md for brand voice, tone, and word choice guidance
- Update roo-translation skill to reference the guidance file
The guidance file serves as a placeholder for translation style guidelines
that will be interpolated at runtime.
* fix: rename guidances directory to guidance (singular)
* fix: remove language-specific section from translator guidance
The guidance file should focus on brand voice, tone, and word choice only.
* fix: remove language-specific guidelines section from skill file
* Update .roo/skills/roo-translation/SKILL.md
Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com>
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Bruno Bergher <bruno@roocode.com>
Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com>
* fix: race conditions in subtask delegation system
Comprehensive fix for race conditions and error handling gaps in the subtask
delegation system. Addresses multiple failure modes that could leave parent
tasks permanently stuck in 'delegated' status, causing nested subtasks to hang.
Key fixes:
- Remove initialStatus from taskMetadata rebuild (eliminates status overwrites)
- Persist delegation metadata to per-task files (resolves globalState eviction)
- Add delegationInProgress mutex guard (prevents concurrent delegation ops)
- TOCTOU race fixes with fresh re-reads before writes
- Abort-aware pWaitFor predicate (prevents false 60s timeout on user input)
- Remove silent .catch(() => {}) — all errors now logged unless task is aborting
- Single-attempt delegation with parent repair on failure (no retry band-aids)
- Cancel debouncedEmitTokenUsage in dispose() (prevents zombie callbacks)
- new_task isolation truncation for parallel tool calls
* fix: write all 6 delegation fields in every saveDelegationMeta call site
* fix: align delegation tests with single-attempt implementation (no retry)
* feat: migrate LiteLLM provider to AI SDK (@ai-sdk/openai-compatible)
- Replace raw OpenAI SDK (RouterProvider) with Vercel AI SDK's
createOpenAICompatible via OpenAICompatibleHandler base class
- Retain dynamic model fetching from LiteLLM server via /v1/model/info
- Use centralized getModelMaxOutputTokens() to cap output tokens at 20%
of context window, preventing overflow errors
- Remove LiteLLM-specific workarounds (Gemini thought signature injection,
prompt cache control headers) now handled by the proxy or AI SDK
- Rewrite tests to mock AI SDK (streamText, generateText) instead of
raw OpenAI SDK
* fix: call fetchModel() in completePrompt() before execution
Addresses review feedback - completePrompt() now fetches models
before executing to ensure correct model info for token limits,
matching the behavior of createMessage().
* fix: make removeClineFromStack() delegation-aware to prevent orphaned parent tasks
When a delegated child task is removed via removeClineFromStack() (e.g., Clear
Task, navigate to history, start new task), the parent task was left orphaned
in "delegated" status with a stale awaitingChildId. This made the parent
unresumable without manual history repair.
This fix captures parentTaskId and childTaskId before abort/dispose, then
repairs the parent metadata (status -> active, clear awaitingChildId) when
the popped task is a delegated child and awaitingChildId matches.
Parent lookup + updateTaskHistory are wrapped in try/catch so failures are
non-fatal (logged but do not block the pop).
Closes#11301
* fix: add skipDelegationRepair opt-out to removeClineFromStack() for nested delegation
---------
Co-authored-by: Roo Code <roomote@roocode.com>
* refactor: migrate LM Studio provider to Vercel AI SDK
Migrate LmStudioHandler from raw OpenAI SDK to Vercel AI SDK via
OpenAICompatibleHandler base class.
Changes:
- Extend OpenAICompatibleHandler instead of BaseProvider
- Use createOpenAICompatible from @ai-sdk/openai-compatible
- Use streamText/generateText from ai package
- Add extractReasoningMiddleware for <think> tag extraction parity
- Pass draft_model via providerOptions for speculative decoding
- Remove unused getLmStudioModels function (active version in fetchers/)
- Update all tests to mock AI SDK instead of OpenAI SDK
* fix: wrap completePrompt with handleAiSdkError for consistent error handling
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Replace @anthropic-ai/vertex-sdk with @ai-sdk/google-vertex/anthropic,
using streamText/generateText from the Vercel AI SDK for consistent
provider behavior.
Changes:
- Use createVertexAnthropic from @ai-sdk/google-vertex/anthropic
- Use streamText/generateText instead of direct Anthropic API calls
- Add AI SDK transform utilities for message/tool conversion
- Handle cache control via AI SDK providerOptions
- Handle thinking/reasoning via providerOptions.anthropic.thinking
- Add thought signature and redacted thinking block tracking
- Set isAiSdkProvider() to return true
- Remove unused deps: @anthropic-ai/vertex-sdk, google-auth-library
- Rewrite tests to mock AI SDK instead of @anthropic-ai/vertex-sdk
* Latest main branch snapshot from API
* feat: add dedicated Azure OpenAI provider using @ai-sdk/azure package
* feat: add Azure provider UI component and translations
* feat: add Azure provider translations for all locales
* chore: add missing Azure placeholder translations
* Delete .changeset/azure-ai-sdk-migration.md
* fix: add Azure provider validation for onboarding workflow
- Add azureApiKey to SECRET_STATE_KEYS for proper configuration detection
- Add Azure validation case in validateModelsAndKeysProvided
- Add validation translations for azureResourceName and azureDeploymentName across all 18 locales
This fixes the issue where the Finish button does nothing when setting up Azure provider in the onboarding workflow.
* feat(azure): add model metadata, model picker, rename to Azure AI Foundry
- Add static model metadata for 29 Azure models (from models.dev)
with Roo-specific flags (reasoning, tools, verbosity) matching
openAiNativeModels
- Add model picker dropdown to Azure provider settings for model
capability detection (context window, max tokens, pricing)
- Rename provider label from 'Azure OpenAI' to 'Azure AI Foundry'
across all 18 locales
- Make API key optional (supports Azure managed identity / Entra ID)
- Update default API version from 2024-08-01-preview to 2025-04-01-preview
- Fix maxOutputTokens validation (filter invalid values <= 0)
- Handler separates deployment name (API calls) from model ID
(capability lookup) with azureDefaultModelInfo (gpt-4o) fallback
- Remove unhelpful 'Get Azure AI Foundry Access' button
- Prevent stale model IDs from other providers carrying over
- Suppress validation errors on fresh provider selection
* fix(azure): add missing isAiSdkProvider() override for reasoning block preservation
* Azure Fixes for Hannes
* Quick Fix for Respones API Only (for Hannes)
* fix: use explicit azureOpenAiDefaultApiVersion fallback when apiVersion is empty
Addresses review feedback: the UI placeholder shows '2025-04-01-preview' via
azureOpenAiDefaultApiVersion, so the handler should use the same constant as
fallback instead of silently deferring to the SDK's internal default.
* fix: remove stale Cerebras references (retired provider)
* fix: add missing retiredProviderMessage translations for all locales
* fix: do not map promptCacheMissTokens to cacheWriteTokens for Azure
Azure uses OpenAI-compatible caching which does not report cache write
tokens separately. promptCacheMissTokens represents tokens NOT found in
cache (processed from scratch), not tokens written to cache. This aligns
the Azure handler with the OpenAI native handler behavior.
---------
Co-authored-by: Hannes Rudolph <hrudolph@gmail.com>
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>
* feat: migrate OpenAI Native provider to @ai-sdk/openai
Replace the raw OpenAI SDK (openai) usage in OpenAiNativeHandler with
@ai-sdk/openai and AI SDK's streamText/generateText, following the same
pattern used by other migrated providers (Groq, xAI, Fireworks, etc.).
Key changes:
- Use createOpenAI from @ai-sdk/openai with provider.responses() for
the Responses API
- Use streamText/generateText from ai for streaming and completions
- Pass OpenAI-specific features via providerOptions.openai (store,
reasoningEffort, reasoningSummary, textVerbosity, serviceTier,
promptCacheRetention, parallelToolCalls, include)
- Capture responseId, serviceTier, and encrypted reasoning content
from providerMetadata after streaming
- Preserve getEncryptedContent() and getResponseId() for Task.ts
- Preserve service tier pricing adjustment in cost calculation
- Mark as isAiSdkProvider: true
- Eliminate ~1100 lines of manual SSE parsing, raw fetch fallback,
and event handling code
- Rewrite all 3 test files to use AI SDK mocking pattern
* fix: remove non-existent cacheWriteTokens from providerMetadata
The OpenAI Responses API does not report cache write tokens separately.
Remove the reference to providerMetadata?.openai?.cacheWriteTokens which
does not exist in the @ai-sdk/openai provider metadata schema.
* fix: filter standalone encrypted reasoning items from messages
Task.ts buildCleanConversationHistory injects standalone reasoning items
with { type: 'reasoning', encrypted_content: '...' } into the messages
array. These have no 'role' property and would be silently dropped by
convertToAiSdkMessages. Filter them explicitly to prevent confusion.
Note: Encrypted reasoning content round-tripping for stateless continuity
is a known limitation of the AI SDK migration. The @ai-sdk/openai
provider does not support injecting raw Responses API reasoning items.
Plain-text reasoning round-tripping works correctly via isAiSdkProvider().
* fix: restore reasoning round-trip for OpenAI Responses API via AI SDK
- Strip plain-text reasoning blocks from assistant messages before
convertToAiSdkMessages() to eliminate 'Non-OpenAI reasoning parts'
warnings from @ai-sdk/openai Responses provider
- Re-inject encrypted reasoning items as AI SDK reasoning parts with
providerOptions.openai.itemId and reasoningEncryptedContent, restoring
reasoning continuity that was silently broken after the migration
- Restructure createMessage() into a 5-step pipeline:
collect → filter → strip → convert → inject
- Add 21 new tests for both plain-text stripping and encrypted
reasoning injection
---------
Co-authored-by: Hannes Rudolph <hrudolph@gmail.com>
* fix: resolve race condition in new_task delegation that loses parent task history
When delegateParentAndOpenChild creates a child task via createTask(), the
Task constructor fires startTask() as a fire-and-forget async call. The child
immediately begins its task loop and eventually calls saveClineMessages() →
updateTaskHistory(), which reads globalState, modifies it, and writes back.
Meanwhile, delegateParentAndOpenChild persists the parent's delegation
metadata (status: 'delegated', delegatedToId, awaitingChildId, childIds) via
a separate updateTaskHistory() call AFTER createTask() returns.
These two concurrent read-modify-write operations on globalState race: the
last writer wins, overwriting the other's changes. When the child's write
lands last, the parent's delegation fields are lost, making the parent task
unresumable when the child finishes.
Fix: create the child task with startTask: false, persist the parent's
delegation metadata first, then manually call child.start(). This ensures
the parent metadata is safely in globalState before the child begins writing.
* docs: clarify Task.start() only handles new tasks, not history resume
* fix(reliability): prevent webview postMessage crashes and make dispose idempotent
Closes: #11311
1. postMessageToWebview() now catches rejections from
webview.postMessage() so that messages sent after the webview is
disposed do not surface as unhandled promise rejections.
2. dispose() is guarded by a _disposed flag so that repeated calls
(e.g. during rapid extension deactivation) are no-ops.
3. CloudService mock in ClineProvider.spec.ts updated to include
off() — a pre-existing gap exposed by the new dispose test.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: add early _disposed check in postMessageToWebview
Skip the postMessage call entirely when the provider is already disposed,
avoiding unnecessary try/catch execution. Added test coverage for this path.
* chore: trigger CI
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
Add a promise-chain mutex (withTaskHistoryLock) to serialize all
read-modify-write operations on taskHistory, preventing concurrent
interleaving from silently dropping entries.
Reorder reopenParentFromDelegation to close the child instance
before marking it completed, so the abort path's stale 'active'
status write no longer overwrites the 'completed' state.
Covered by new tests: RPD-04/05/06, UTH-02/04, and a full mutex
concurrency suite.
fix: prevent false unsaved changes prompt with OpenAI Compatible headers
Mark automatic header syncs in ApiOptions and OpenAICompatible as
non-user actions (isUserAction: false) and enhance SettingsView change
detection to skip automatic syncs with semantically equal values.
Root cause: two components (ApiOptions and OpenAICompatible) manage
openAiHeaders state and automatically sync it back on mount/remount.
These syncs were treated as user changes, triggering a false dirty state.
Co-authored-by: Robert McIntyre <robertjmcintyre@users.noreply.github.com>
* refactor: migrate Anthropic provider to @ai-sdk/anthropic
Replace the raw @anthropic-ai/sdk implementation with @ai-sdk/anthropic
(Vercel AI SDK) for consistency with other providers (Bedrock, DeepSeek,
Mistral, etc.).
Changes:
- Replace Anthropic() client with createAnthropic() from @ai-sdk/anthropic
- Replace manual stream parsing with streamText() + processAiSdkStreamPart()
- Replace client.messages.create() with generateText() for completePrompt()
- Use convertToAiSdkMessages() and convertToolsForAiSdk() for format conversion
- Handle prompt caching via AI SDK providerOptions (cacheControl on messages)
- Handle extended thinking via providerOptions.anthropic.thinking
- Add getThoughtSignature() and getRedactedThinkingBlocks() for thinking
signature round-tripping (matching Bedrock pattern, improves on original
which had a TODO for this)
- Add isAiSdkProvider() returning true
- Update tests to mock @ai-sdk/anthropic and ai instead of raw SDK
* fix: address PR review - remove apiKey fallback and use system+systemProviderOptions pattern
* refactor: remove 9 low-usage providers (Phase 0)
Remove Cerebras, Chutes, DeepInfra, Doubao, Featherless, Groq,
Hugging Face, IO Intelligence, and Unbound providers from the codebase.
Each provider removal includes: handler, tests, model definitions,
type schemas, UI settings components, fetchers, i18n references,
and all wiring in shared registration/config files.
- Delete 42 provider-specific files (handlers, tests, fetchers, UI components)
- Remove @ai-sdk/cerebras and @ai-sdk/groq npm dependencies
- Clean provider references from 68 shared files across src/, packages/types/,
webview-ui/, and apps/cli/
- Remove ~490 dead i18n translation keys across 36 locale files
- Add docs/ai-sdk-migration-guide.md with updated migration status
- All TypeScript checks pass, 6505 tests pass with 0 failures
* feat: show retired-provider message for removed provider profiles
Preserve API profiles that reference removed providers instead of
silently stripping their apiProvider. When a user selects a profile
configured for a retired provider, the settings UI now shows an
empathetic message explaining the removal instead of the provider
configuration form.
- Add retiredProviderNames array and isRetiredProvider() helper to
packages/types/src/provider-settings.ts
- Update ProviderSettingsManager sanitization to preserve retired
providers (only strip truly unknown values)
- Update ContextProxy sanitization to preserve retired providers
- Render retired-provider message in ApiOptions.tsx when selected
provider is in the retired list
- Add tests for sanitization, ContextProxy, and UI behavior
* feat: add retired-provider warning banner in chat view
* Revert "feat: add retired-provider warning banner in chat view"
This reverts commit dd593e1056.
* feat: show retired-provider message as inline chat response
* fix: show retired provider warning on home screen
Move WarningRow outside {task && ...} conditional so it renders
regardless of task state. Preserve user input on retired provider
intercept so text isn't lost when switching providers.
- Move showRetiredProviderWarning WarningRow to unconditional render
area near ProfileViolationWarning
- Remove setInputValue/setSelectedImages clearing from retired
provider early return in handleSendMessage
- Delete unused RetiredProviderWarning.tsx (dead code)
* fix: address PR review — passthrough retired-provider fields and i18n strings
- Use passthrough() in saveConfig() and load() so legacy provider-specific
fields (e.g. groqApiKey, deepInfraModelId) are preserved instead of
silently stripped by strict Zod parse()
- Move hardcoded English strings in ApiOptions.tsx and ChatView.tsx to
i18n translation keys (settings:providers.retiredProviderMessage,
chat:retiredProvider.{title,message,openSettings})
- Update tests to assert legacy provider-specific fields survive
save and load round-trips
* i18n: add retired-provider translations for all 17 locales
Translate providers.retiredProviderMessage (settings) and
retiredProvider.{title,message,openSettings} (chat) into ca, de, es,
fr, hi, id, it, ja, ko, nl, pl, pt-BR, ru, tr, vi, zh-CN, zh-TW.
* test: update ApiOptions retired-provider test to expect i18n key
* feat: group consecutive list_files tool calls into single UI block
Consolidate consecutive listFilesTopLevel/listFilesRecursive ask messages
into a single 'Roo wants to view multiple directories' block, matching the
existing read_file batching pattern.
* chore: add missing translation keys for all locales
* refactor: consolidate duplicate listFiles batch-handling blocks in ChatRow
Merge the separate listFilesTopLevel and listFilesRecursive case blocks
into a single combined case with shared batch-detection logic, selecting
the icon and translation key based on the tool type. This removes the
duplicated isBatchDirRequest check and BatchListFilesPermission render.
* feat: batch consecutive file-edit tool calls into single UI block
Add edit-file batching in ChatView groupedMessages that consolidates
consecutive editedExistingFile, appliedDiff, newFileCreated,
insertContent, and searchAndReplace asks into a single BatchDiffApproval
block. Move batchDiffs detection in ChatRow above the switch statement
so it applies to any file-edit tool type.
* refactor: extract batchConsecutive utility, fix batch UI issues
- Extract generic batchConsecutive() utility from 3 identical while-loops
- Fix React key collisions in BatchListFilesPermission, BatchFilePermission, BatchDiffApproval
- Normalize language prop to "shellsession" (was "shell-session" for top-level)
- Remove unused _batchedMessages property from synthetic messages
- Remove dead didViewMultipleDirectories i18n key from all 18 locale files
- Add batch button text for listFilesTopLevel/listFilesRecursive
- Add batchConsecutive utility tests (6 cases)
* fix: audit improvements for batch tool-call UI
- Make batchConsecutive() generic instead of ClineMessage-specific
- Add batch-aware button text for edit-file batches ("Save All"/"Deny All")
- Add dedicated list-batch/edit-batch i18n keys (stop reusing read-batch)
- Add JSON.parse defense-in-depth in all three synthesizers
- Fix mixed list_files batch icon to default to FolderTree
- Add 6 missing test cases (all-match, immutability, spy, single-dir)
* chore: minor type cleanup (out-of-scope housekeeping)
- Trim unused recursive/isOutsideWorkspace from DirPermissionItem interface
- Remove 4 pre-existing `as any` casts in ChatView.tsx:
- window cast → precise inline type
- checkpoint bracket access → removed unnecessary casts
- condensing message → `as ClineMessage`
- debounce cancel → `.clear()` (correct API)
- Update BatchListFilesPermission test data to match trimmed interface
* i18n: add list-batch and edit-batch translations for all locales
* feat: add task header highlight setting for visual status indication
Add a 'Task Header Highlight' toggle under Settings > UI that colors the
task header based on its current state:
- Green (--vscode-charts-green) when task completes (completion_result)
- Yellow (--vscode-charts-yellow) when user attention is needed (follow-up
questions, tool approvals, etc.)
The highlight is skipped for subtasks and partial/streaming messages,
matching the same defensive logic used by sound notifications.
CSS classes with !important and --vscode-foreground variable overrides
ensure all child text, icons, SVGs, and the context progress bar use
appropriate contrasting colors.
Includes tests (37 passing) and translations for all 18 locales.
* fix: address review feedback - accessibility contrast and deduplicated logic
- Replace theme-dependent --vscode-charts-green/yellow backgrounds with
hardcoded colors (#15803d, #ca8a04) that guarantee WCAG AA 4.5:1 contrast
- Extract shared lastRelevantMessage useMemo to deduplicate findLastIndex
filtering between isTaskComplete and highlightClass
* perf(refactor): consolidate getState calls in resolveWebviewView
Replace three separate this.getState().then() calls with a single
await this.getState() and destructuring. This avoids running the
full getState() method (CloudService calls, ContextProxy reads, etc.)
three times during webview view resolution.
* fix: keep getState consolidation non-blocking to avoid delaying webview render
---------
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
* chore(cli): prepare release v0.0.52
* Update CHANGELOG for build cleanup and Linux support
Removed unused dependency from build configuration and added Linux support.
* fix: validate Gemini thinkingLevel against model capabilities and handle empty streams
getGeminiReasoning() now validates the selected effort against the model's
supportsReasoningEffort array before sending it as thinkingLevel. When a
stale settings value (e.g. 'medium' from a different model) is not in the
supported set, it falls back to the model's default reasoningEffort.
GeminiHandler.createMessage() now tracks whether any text content was
yielded during streaming and handles NoOutputGeneratedError gracefully
instead of surfacing the cryptic 'No output generated' error.
* fix: guard thinkingLevel fallback against 'none' effort and add i18n TODO
The array validation fallback in getGeminiReasoning() now only triggers
when the selected effort IS a valid Gemini thinking level but not in
the model's supported set. Values like 'none' (explicit no-reasoning
signal) are no longer overridden by the model default.
Also adds a TODO for moving the empty-stream message to i18n.
* fix: track tool_call_start in hasContent to avoid false empty-stream warning
Tool-only responses (no text) are valid content. Without this,
agentic tool-call responses would incorrectly trigger the empty
response warning message.
* feat(history): render nested subtasks as recursive tree
* fix(lockfile): resolve missing ai-sdk provider entry
* fix: address review feedback — dedupe countAll, increase SubtaskRow max-h
- HistoryView: replace local countAll with imported countAllSubtasks from types.ts
- SubtaskRow: increase nested children max-h from 500px to 2000px to match TaskGroupItem
* feat: add lock toggle to pin API config across all modes in workspace
Add a lock/unlock toggle inside the API config selector popover (next to
the settings gear) that, when enabled, applies the selected API
configuration to all modes in the current workspace.
- Add lockApiConfigAcrossModes to ExtensionState and WebviewMessage types
- Store setting in workspaceState (per-workspace, not global)
- When locked, activateProviderProfile sets config for all modes
- Lock icon in ApiConfigSelector popover bottom bar next to gear
- Full i18n: English + 17 locale translations (all mention workspace scope)
- 9 new tests: 2 ClineProvider, 2 handler, 5 UI (77 total pass)
* refactor: replace write-fan-out with read-time override for lock API config
The original lock implementation used setModeConfig() fan-out to write the
locked config to ALL modes globally. Since the lock flag lives in workspace-
scoped workspaceState but modeApiConfigs are in global secrets, this caused
cross-workspace data destruction.
Replaced with read-time guards:
- handleModeSwitch: early return when lock is on (skip per-mode config load)
- createTaskWithHistoryItem: skip mode-based config restoration under lock
- activateProviderProfile: removed fan-out block
- lockApiConfigAcrossModes handler: simplified to flag + state post only
- Fixed pre-existing workspaceState mock gap in ClineProvider.spec.ts and
ClineProvider.sticky-profile.spec.ts
* refactor: migrate baseten provider to AI SDK
* refactor(baseten): migrate to native @ai-sdk/baseten package
Replace OpenAICompatibleHandler with dedicated @ai-sdk/baseten package,
following the same pattern used by other native AI SDK providers (groq,
deepseek, etc.). This uses createBaseten() for provider initialization
and extends BaseProvider directly instead of the generic OpenAI-compatible
handler.
Add GetCommands, GetModes, and GetModels to the IPC protocol so external
clients can fetch slash commands, available modes, and Roo provider models
without going through the internal webview message channel.
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add disabledTools setting to globally disable native tools
Add a disabledTools field to GlobalSettings that allows disabling specific
native tools by name. This enables cloud agents to be configured with
restricted tool access.
Schema:
- Add disabledTools: z.array(toolNamesSchema).optional() to globalSettingsSchema
- Add disabledTools to organizationDefaultSettingsSchema.pick()
- Add disabledTools to ExtensionState Pick type
Prompt generation (tool filtering):
- Add disabledTools to BuildToolsOptions interface
- Pass disabledTools through filterSettings to filterNativeToolsForMode()
- Remove disabled tools from allowedToolNames set in filterNativeToolsForMode()
Execution-time validation (safety net):
- Extract disabledTools from state in presentAssistantMessage
- Convert disabledTools to toolRequirements format for validateToolUse()
Wiring:
- Add disabledTools to ClineProvider getState() and getStateToPostToWebview()
- Pass disabledTools to all buildNativeToolsArrayWithRestrictions() call sites
EXT-778
* fix: check toolRequirements before ALWAYS_AVAILABLE_TOOLS
Moves the toolRequirements check before the ALWAYS_AVAILABLE_TOOLS
early-return in isToolAllowedForMode(). This ensures disabledTools
can block always-available tools (switch_mode, new_task, etc.) at
execution time, making the validation layer consistent with the
filtering layer.
* feat: migrate Bedrock provider to AI SDK
Replace the raw AWS SDK (@aws-sdk/client-bedrock-runtime) Bedrock handler
with the Vercel AI SDK (@ai-sdk/amazon-bedrock). Reduces provider from
1,633 lines to 575 lines (65% reduction).
Key changes:
- Use streamText()/generateText() instead of ConverseStreamCommand/ConverseCommand
- Use createAmazonBedrock() with native auth (access key, secret, session,
profile via credentialProvider, API key, VPC endpoint as baseURL)
- Reasoning config via providerOptions.bedrock.reasoningConfig
- Anthropic beta headers via providerOptions.bedrock.anthropicBeta
- Thinking signature captured from providerMetadata.bedrock.signature
on reasoning-delta stream events
- Thinking signature round-tripped via providerOptions.bedrock.signature
on reasoning parts in convertToAiSdkMessages()
- Redacted thinking captured from providerMetadata.bedrock.redactedData
- isAiSdkProvider() returns true for reasoning block preservation
- Keep: getModel, ARN parsing, cross-region inference, cost calculation,
service tier pricing, 1M context beta
Tests: 83 tests skipped (mock old AWS SDK internals, need rewrite for
AI SDK mocking). 106 tests pass. 0 tests fail.
* fix: address review feedback for Bedrock AI SDK migration
- Wire usePromptCache into AI SDK via providerOptions.bedrock.cachePoint
on system prompt and last two user messages
- Remove debug logger.info that fires on every stream event with
providerMetadata
- Tighten isThrottlingError to match 'rate limit' instead of broad
'rate'/'limit' substrings that false-positive on context length errors
- Use shared handleAiSdkError utility for consistent error handling
with status code preservation for retry logic
* fix: bedrock AI SDK migration - fix usage metrics, rewrite tests, remove dead code
- Fix reasoningTokens always 0 (usage.details?.reasoningTokens → usage.reasoningTokens)
- Fix cacheReadInputTokens always 0 (read from usage.inputTokenDetails instead of providerMetadata)
- Fix invokedModelId not extracted for prompt router cost calculation
- Rewrite all 6 skipped bedrock test suites for AI SDK mocking pattern (140 tests pass)
- Remove dead code: bedrock-converse-format.ts, cache-strategy/ (6 files, ~2700 lines)
* chore: remove dead @anthropic-ai/bedrock-sdk dep and stale AWS SDK mocks
* chore: update pnpm-lock.yaml after removing @anthropic-ai/bedrock-sdk
* fix: compute cache point indices from original Anthropic messages before AI SDK conversion
The previous approach naively targeted the last 2 user messages in the
post-conversion AI SDK array, but convertToAiSdkMessages() splits user
messages containing tool_results into separate tool + user messages,
causing cache points to land on the wrong messages (tiny text fragments
instead of the intended meaty user turns).
Now we identify the last 2 user messages in the original Anthropic
message array (matching the Anthropic provider's caching strategy) and
build a parallel-walk mapping to apply cachePoint to the correct
corresponding AI SDK message.
* perf: optimize prompt caching with 3-point message strategy + anchor for 20-block window
Previous approach only cached the last 2 user messages (using 2 of 4
available cache checkpoints for messages). This left significant cache
savings on the table for longer conversations.
New strategy uses up to 3 message cache points (+ 1 system = 4 total):
- Last user message: write to cache for next request
- Second-to-last user message: read from cache for current request
- Anchor message at ~1/3 position: ensures the 20-block lookback window
from the second-to-last breakpoint hits a stable cache entry, covering
all assistant/tool messages in the middle of the conversation
Also extracted the parallel-walk mapping logic into a reusable
applyCachePointsToAiSdkMessages() helper method.
Industry benchmarks show 70-95% token cache rates are achievable;
this change should significantly improve our 39% baseline for longer
multi-turn conversations.
* chore: remove stale bedrock-sdk external, fix arnInfo property name, remove unused exports
---------
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
* fix: DeepSeek temperature defaulting to 0 instead of 0.3
Pass defaultTemperature: DEEP_SEEK_DEFAULT_TEMPERATURE to getModelParams() in
DeepSeekHandler.getModel() to ensure the correct default temperature (0.3)
is used when no user configuration is provided.
Closes#11194
* refactor: make defaultTemperature required in getModelParams
Make the defaultTemperature parameter required in getModelParams() instead
of defaulting to 0. This prevents providers with their own non-zero default
temperature (like DeepSeek's 0.3) from being silently overridden by the
implicit 0 default.
Every provider now explicitly declares its temperature default, making the
temperature resolution chain clear:
user setting → model default → provider default
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
* refactor: migrate featherless provider to AI SDK
* fix: merge consecutive same-role messages in featherless R1 path
convertToAiSdkMessages does not merge consecutive same-role messages
like convertToR1Format did. When the system prompt is prepended as a
user message and the conversation already starts with a user message,
DeepSeek R1 can reject the request.
Add mergeConsecutiveSameRoleMessages helper that collapses adjacent
Anthropic messages sharing the same role before AI SDK conversion.
Includes a test that verifies no two successive messages share a role.
Migrates the IO Intelligence provider from legacy BaseOpenAiCompatibleProvider
(direct openai SDK) to OpenAICompatibleHandler (Vercel AI SDK).
- Extends OpenAICompatibleHandler instead of BaseOpenAiCompatibleProvider
- Uses getModelParams for model parameter resolution
- Updates tests to mock ai module's streamText/generateText
Remove two console.warn messages that fire excessively when loading tasks
from history:
- 'Attempting to finalize unknown tool call' in finalizeStreamingToolCall()
- 'Received chunk for unknown tool call' in processStreamingChunk()
The defensive null-return behavior is preserved; only the log output is removed.
* changeset version bump
* Update CHANGELOG for version 3.47.3
Updated version number and removed redundant patch changes for 3.47.3.
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>
Remove the "Enable URL context" and "Enable Grounding with Google search"
checkboxes from Gemini and Vertex provider settings, along with:
- enableUrlContext and enableGrounding fields from provider settings schemas
- URL context and Google Search tool injection in completePrompt methods
- Associated translation keys from all 18 locale files
- Related test cases updated to reflect the removal
- simplifySettings prop removed from Gemini and Vertex components
(it was only used for the removed checkboxes in those components)
Co-authored-by: Roo Code <roomote@roocode.com>
* changeset version bump
* Update CHANGELOG for version 3.47.2
Updated version number and added patch changes for 3.47.2.
* Update CHANGELOG for version 3.47.1
Updated changelog for version 3.47.1 with fixes and cleanup.
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>
* fix: capture and round-trip thinking signature for Bedrock Claude models
Bedrock handler streams reasoning text from Claude's extended thinking but
never captures the cryptographic signature. This causes 400 errors on
multi-turn conversations with tool use: 'Expected thinking or
redacted_thinking, but found tool_use'.
Changes:
- bedrock.ts: Capture reasoningContent.signature from Converse API stream
deltas, implement getThoughtSignature() so Task.ts stores it as a proper
thinking content block
- bedrock-converse-format.ts: Convert thinking blocks to Bedrock's
reasoningContent format with signature, skip reasoning/redacted_thinking/
thoughtSignature blocks that aren't valid for the API
* fix: add redacted_thinking round-trip, fix interface types, add tests
Address PR review feedback:
- Update ContentBlockDeltaEvent interface to include signature and
redactedContent fields (removes type assertions)
- Add 6 tests for thinking/reasoning block conversions in
bedrock-converse-format.ts
Also add redacted_thinking round-trip support:
- bedrock.ts: Capture redactedContent from stream deltas, base64 encode,
expose via getRedactedThinkingBlocks()
- Task.ts: Insert redacted_thinking blocks after thinking block in
assistant messages
- bedrock-converse-format.ts: Convert redacted_thinking blocks back to
reasoningContent.redactedContent (base64 → Uint8Array)
PR #11180 migrated Gemini/Vertex providers to the AI SDK and deleted
gemini-format.ts which contained the working thought signature round-trip
logic (originally added in PR #10590). This broke all Gemini 3 tool use
with a 400 error: 'Function call is missing a thought_signature'.
Changes:
- Gemini/Vertex handlers: capture thoughtSignature from providerMetadata
on tool-call stream events, expose via getThoughtSignature()
- convertToAiSdkMessages(): extract thoughtSignature content blocks from
history, attach as providerOptions on first tool-call part (per Gemini 3
parallel call rules)
- Add 3 tests verifying thought signature round-trip behavior
* feat: add support for .agents/skills directory
This change adds support for discovering skills from the .agents/skills
directory, following the Agent Skills convention for sharing skills
across different AI coding tools.
Priority order (later entries override earlier ones):
1. Global ~/.agents/skills (shared across AI coding tools, lowest priority)
2. Project .agents/skills
3. Global ~/.roo/skills (Roo-specific)
4. Project .roo/skills (highest priority)
Changes:
- Add getGlobalAgentsDirectory() and getProjectAgentsDirectoryForCwd()
functions to roo-config
- Update SkillsManager.getSkillsDirectories() to include .agents/skills
- Update SkillsManager.setupFileWatchers() to watch .agents/skills
- Add tests for new functionality
* fix: clarify skill priority comment to match actual behavior
* fix: clarify skill priority comment to explain Map.set replacement mechanism
---------
Co-authored-by: Roo Code <roomote@roocode.com>
* changeset version bump
* Update CHANGELOG for version 3.47.1
Updated changelog for version 3.47.1 with patch changes.
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: John Richmond <5629+jr@users.noreply.github.com>
When the 'custom base URL' checkbox is unchecked in the UI, the setting
is set to '' (empty string). Providers that passed this directly to their
SDK constructors caused 'Failed to parse URL' errors because the SDK
treated '' as a valid but broken base URL override.
- gemini.ts: use || undefined (was passing raw option)
- openai-native.ts: use || undefined (was passing raw option)
- openai.ts: change ?? to || for fallback default
- deepseek.ts: change ?? to || for fallback default
- moonshot.ts: change ?? to || for fallback default
Adds test coverage for Gemini and OpenAI Native constructors verifying
empty-string baseURL is coerced to undefined.
Remove the :0 suffix from the Claude Opus 4.6 model ID to match
the correct AWS Bedrock model identifier.
The model ID was "anthropic.claude-opus-4-6-v1:0" but should be
"anthropic.claude-opus-4-6-v1" per AWS Bedrock documentation.
Fixes#11231
Co-authored-by: Roo Code <roomote@roocode.com>
Remove three functions from appendEnvironmentDetails.ts that were
defined and tested but never imported or called in production code:
- stripAppendedEnvironmentDetails (exported, 0 call sites)
- stripEnvDetailsFromText (private helper)
- stripEnvDetailsFromToolResult (private helper)
Also removes the corresponding describe block (7 tests) from the
spec file. The remaining 19 tests pass.
* changeset version bump
* Update CHANGELOG for version 3.47.0 release
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>
* refactor(task): append environment details into existing blocks
Add appendEnvironmentDetails() helper that merges environment details
into the last text block or tool_result instead of adding a standalone
trailing text block.
This avoids message shapes that can break interleaved-thinking models
like DeepSeek reasoner, which expect specific message structures.
Changes:
- Add appendEnvironmentDetails() and removeEnvironmentDetailsBlocks() helpers
- Update Task.resumeAfterDelegation() to use the helper
- Update Task.recursivelyMakeClineRequests() to use the helper
- Add comprehensive unit tests (26 test cases)
* fix: use named import for Anthropic SDK to match codebase convention
Remove the toolFormat constant and <tool_format> line from environment
details output. Native tool calling is now the only supported protocol,
making this code unnecessary.
Fixes#11206
Co-authored-by: Roo Code <roomote@roocode.com>
* feat: add Claude Opus 4.6 support across all providers
Add Claude Opus 4.6 (claude-opus-4-6) model definitions and 1M context
support across Anthropic, Bedrock, Vertex AI, OpenRouter, and Vercel AI
Gateway providers.
- Anthropic: 128K max output, /5 pricing, 1M context tiers
- Bedrock: anthropic.claude-opus-4-6-v1:0 with 1M context + global inference
- Vertex: claude-opus-4-6 with 1M context tiers
- OpenRouter: prompt caching + reasoning budget sets
- Vercel AI Gateway: Opus 4.5 and 4.6 added to capability sets
- UI: 1M context checkbox for Opus 4.6 on all providers
- i18n: Updated 1M context descriptions across 18 locales
Also adds Opus 4.5 to Vercel AI Gateway (previously missing) and
OpenRouter maxTokens overrides for Opus 4.5/4.6.
Closes#11223
* fix: apply tier pricing when 1M context is enabled on Bedrock
When awsBedrock1MContext is enabled for tiered models like Opus 4.6,
also apply the 1M tier pricing (inputPrice, outputPrice, cache prices)
instead of only updating contextWindow. This ensures cost calculations
and UI display use the correct >200K rates.
* fix(ai-sdk): preserve reasoning parts in message conversion
* fix(ai-sdk): convert message-level reasoning_content to reasoning part
* fix(task): remove invalid openai-compatible from reasoning allowlist
* feat: add isAiSdkProvider() method for dynamic AI SDK provider detection
- Add isAiSdkProvider() method to ApiHandler interface
- Default implementation in BaseProvider returns false
- Override to return true in 11 AI SDK providers:
deepseek, fireworks, mistral, groq, xai, cerebras,
sambanova, huggingface, gemini, vertex, openai-compatible
- Update Task.ts to use dynamic detection instead of hardcoded Set
- Add method to FakeAIHandler and update test mocks
* fix: handle reasoning parts in flattenAiSdkMessagesToStringContent
- Strip reasoning parts when flattening messages for string-only models
- Allow flattening when message contains only text and reasoning parts
- Add tests for reasoning part handling in string-only model contexts
This addresses the review feedback about ensuring flattenAiSdkMessagesToStringContent
works correctly when reasoning parts are present (e.g., SambaNova DeepSeek).
---------
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
* fix(ai-sdk): preserve reasoning parts in message conversion
* fix(ai-sdk): convert message-level reasoning_content to reasoning part
* fix(task): remove invalid openai-compatible from reasoning allowlist
When using slash commands with `mode:` frontmatter (e.g., `/cli-release`
with `mode: code`), the CLI would fail with "Could not resolve
authentication method" from the Anthropic SDK, even when using a
non-Anthropic provider like `--provider roo`.
Root cause: In `markWebviewReady()`, the `webviewDidLaunch` message was
sent before `updateSettings`, creating a race condition. The
`webviewDidLaunch` handler's "first-time init" sync would read
`getState()` before CLI-provided settings were applied to the context
proxy. Since `getState()` defaults `apiProvider` to "anthropic" when
unset, this default was saved to the provider profile. When a slash
command triggered `handleModeSwitch()`, it found this corrupted profile
with `apiProvider: "anthropic"` (but no API key) and activated it,
overwriting the CLI's working roo provider configuration.
Fix:
1. Reorder `markWebviewReady()` to send `updateSettings` before
`webviewDidLaunch`, ensuring the context proxy has CLI-provided
values when the initialization handler runs.
2. Guard the first-time init sync with `checkExistKey(apiConfiguration)`
to prevent saving a profile with only the default "anthropic"
fallback and no actual API keys configured.
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* feat: migrate Gemini and Vertex providers to AI SDK
- Migrate GeminiHandler from @google/genai to @ai-sdk/google
- Create standalone VertexHandler using @ai-sdk/google-vertex
- Use shared AI SDK utilities (streamText, generateText, convertToAiSdkMessages)
- Support thinkingConfig via providerOptions.google.thinkingConfig
- Support Google Search and URL Context grounding tools
- Preserve cost calculation with tiered pricing
- Remove gemini-format.ts (AI SDK handles message conversion)
EXT-643
* fix: remove unused import and implement allowedFunctionNames tool filtering
- Remove unused handleAiSdkError import from gemini.ts
- Implement tool filtering based on allowedFunctionNames in both
GeminiHandler and VertexHandler createMessage methods
- Filter tools before converting to AI SDK format to restrict
model access to only allowed functions
- Allow --api-key and ROO_API_KEY env var for the roo provider instead of
requiring cloud auth token
- Switch dev/start scripts to use tsx for running directly from source
without building first
- Fix path resolution (version.ts, extension.ts, extension-host.ts) to
work from both source and bundled locations
- Disable debug log file (~/.roo/cli-debug.log) unless --debug is passed
- Update README with complete env var table and dev workflow docs
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Tool IDs from providers like Gemini/OpenRouter contain special characters
(e.g., 'functions.read_file:0') that are sanitized when saving tool_use
blocks to API history. However, tool_result blocks were using the original
unsanitized IDs, causing ToolResultIdMismatchError.
This fix ensures tool_result blocks use sanitizeToolUseId() to match the
sanitized tool_use IDs in conversation history.
Fixes EXT-711
* feat(condense): add smart code folding with tree-sitter signatures
At context condensation time, use tree-sitter to generate folded code
signatures (function definitions, class declarations) for files read
during the conversation. Each file is included as its own <system-reminder>
block in the condensed summary, preserving structural awareness without
consuming excessive tokens.
- Add getFilesReadByRoo() method to FileContextTracker
- Create generateFoldedFileContext() using tree-sitter parsing
- Update summarizeConversation() to accept array of file sections
- Each file gets its own content block in the summary message
- Add comprehensive test coverage (12 tests)
* fix: skip tree-sitter error strings in folded file context
- Add isTreeSitterErrorString helper to detect error messages
- Skip files that return error strings instead of embedding them
- Add test for error string handling
* refactor: move generateFoldedFileContext() inside summarizeConversation()
- Update summarizeConversation() to accept filesReadByRoo, cwd, rooIgnoreController instead of pre-generated sections
- Move folded file context generation inside summarizeConversation() (lines 319-339)
- Update ContextManagementOptions type and manageContext() to pass new parameters
- Remove generateFoldedFileContext from Task.ts imports - folding now handled internally
- Update all tests to use new parameter signature
- Reduces Task.ts complexity by moving folding logic to summarization module
* fix: prioritize most recently read files in folded context
Files are now sorted by roo_read_date descending before folded context
generation, so if the character budget runs out, the most relevant
(recently read) files are included and older files are skipped.
* refactor: improve code quality in condense module
- Convert summarizeConversation to use options object instead of 11 positional params
- Extract duplicated getFilesReadByRoo error handling into helper method
- Remove unnecessary re-export of generateFoldedFileContext
- Update all test files to use new options object pattern
* fix: address roomote feedback - batch error logging and early budget exit
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
fix: prevent false validation error for local Ollama models
The validation logic was checking against an empty router models object
that was initialized but never populated for Ollama. This caused false
validation errors even when models existed locally.
Now only validates against router models if they actually contain data,
preventing the false error when using local Ollama models.
Fixes ROO-581
Co-authored-by: Roo Code <roomote@roocode.com>
- Modified VsCodeLmHandler.internalCountTokens() to create temporary cancellation tokens when needed
- Token counting now works both during and outside of active requests
- Added 4 new tests to verify the fix and prevent regression
- Resolves issue where VS Code LM API users experienced context overflow errors
* Taskheader
* Subtask messages
* View subtask
* subtasks in history items
* i18n
* Table
* Lighter visuals
* bug
* fix: Align tests with implementation behavior
* refactor: extract CircularProgress component from TaskHeader
- Created reusable CircularProgress component for displaying percentage as a ring
- Moved inline SVG calculation from TaskHeader.tsx to dedicated component
- Added comprehensive tests for CircularProgress component (14 tests)
- Component supports customizable size, strokeWidth, and className
- Includes proper accessibility attributes (progressbar role, aria-valuenow)
* chore: update StandardTooltip default delay to 600ms
As mentioned in the PR description, increased the tooltip delay to 600ms
for less intrusive tooltips. The delay is still configurable via the
delay prop for components that need a different value.
---------
Co-authored-by: Roo Code <roomote@roocode.com>
- Remove getToolDescription() method from MultiSearchReplaceDiffStrategy
- Remove getToolDescription() from DiffStrategy interface
- Remove unused ToolDescription type from shared/tools.ts
- Remove unused eslint-disable directive
- Update test mocks to remove getToolDescription references
- Remove getToolDescription tests from multi-search-replace.spec.ts
Native tools are now defined in src/core/prompts/tools/native-tools/ using
the OpenAI function format. The removed code was dead since XML-style tool
calling was replaced with native tool calling.
* fix: convert orphaned tool_results to text blocks after condensing
When condensing occurs after assistant sends tool_uses but before user responds,
the tool_use blocks get condensed away. User messages containing tool_results that
reference condensed tool_use_ids become orphaned and get filtered out by
getEffectiveApiHistory, causing user feedback to be lost.
This fix enhances the existing check in addToApiConversationHistory to detect when
the previous effective message is not an assistant and converts any tool_result
blocks to text blocks, preventing them from being filtered as orphans.
The conversion happens at the latest possible moment (message insertion) because:
- Tool results are created before we know if condensing will occur
- We need actual effective history state to make the decision
- This is the last checkpoint before orphan filtering happens
* Only include environment details in summary for automatic condensing
For automatic condensing (during attemptApiRequest), environment details
are included in the summary because the API request is already in progress
and the next user message won't have fresh environment details injected.
For manual condensing (via condenseContext button), environment details
are NOT included because fresh details will be injected on the very next
turn via getEnvironmentDetails() in recursivelyMakeClineRequests().
This uses the existing isAutomaticTrigger flag to differentiate behavior.
---------
Co-authored-by: Hannes Rudolph <hrudolph@gmail.com>
* chore: remove MULTI_FILE_APPLY_DIFF experiment
Remove the 'Enable concurrent file edits' experimental feature that
allowed editing multiple files in a single apply_diff call.
- Remove multiFileApplyDiff from experiment types and config
- Delete MultiFileSearchReplaceDiffStrategy class and tests
- Delete MultiApplyDiffTool wrapper and tests
- Remove experiment-specific code paths in Task.ts, generateSystemPrompt.ts, and presentAssistantMessage.ts
- Remove special handling in ExperimentalSettings.tsx
- Remove translations from all 18 locale files
The existing MultiSearchReplaceDiffStrategy continues to handle
multiple SEARCH/REPLACE blocks within a single file.
* fix: remove unused EXPERIMENT_IDS/experiments import from Task.ts
Addresses review feedback: removes the unused imports from
src/core/task/Task.ts that were left over after removing the
MULTI_FILE_APPLY_DIFF experiment routing code.
- Remove powerSteering from experimentIds array and schema in packages/types
- Remove POWER_STEERING from EXPERIMENT_IDS and experimentConfigsMap
- Remove power steering conditional block from getEnvironmentDetails
- Remove POWER_STEERING entry from all 18 locale settings.json files
- Update related test files to remove power steering references
* Fix EXT-553: Remove percentage-based progress tracking for worktree file copying
- Removed totalBytes from CopyProgress interface
- Removed Math.min() clamping that caused stuck-at-100% issue
- Changed UI from progress bar to spinner with activity indicator
- Shows 'item — X MB copied' instead of percentage
- Updated all 18 locale files
- Uses native cp with polling (no new dependencies)
* fix: translate copyingProgress text in all 17 non-English locale files
---------
Co-authored-by: Roo Code <roomote@roocode.com>
* fix(condense): remove custom condensing model option
Remove the ability to specify a different model/API configuration for
condensing conversations. Modern conversations include provider-specific
data (tool calls, reasoning blocks, thought signatures) that only the
originating model can properly understand and summarize.
Changes:
- Remove condensingApiHandler parameter from summarizeConversation()
- Remove condensingApiConfigId from context management and Task
- Remove API config dropdown for CONDENSE in settings UI
- Update telemetry to remove usedCustomApiHandler parameter
- Update related tests
Users can still customize the CONDENSE prompt text; only model selection
is removed.
* fix: remove condensingApiConfigId from types and test fixtures
---------
Co-authored-by: Roo Code <roomote@roocode.com>
* fix: handle mode selector empty state on workspace switch
When switching between VS Code workspaces, if the current mode from
workspace A is not available in workspace B, the mode selector would
show an empty string. This fix adds fallback logic to automatically
switch to the default "code" mode when the current mode is not found
in the available modes list.
Changes:
- Import defaultModeSlug from @roo/modes
- Add fallback logic in selectedMode useMemo to detect when current
mode is not available and automatically switch to default mode
- Add tests to verify the fallback behavior works correctly
- Export defaultModeSlug in test mock for consistent behavior
* fix: prevent infinite loop by moving fallback notification to useEffect
* fix: prevent infinite loop by using ref to track notified invalid mode
* refactor: clean up comments in ModeSelector fallback logic
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
copy: update /slack page messaging
- Update trial CTA to 'Start a free 14 day Team trial'
- Replace 'humans' with 'your team' in value props subtitle
- Shorten value prop titles for consistent one-line display
- Improve Thread-aware and Open to all descriptions
* feat: warn users when too many MCP tools are enabled
- Add WarningRow component for displaying generic warnings with icon, title, message, and optional docs link
- Add TooManyToolsWarning component that shows when users have more than 40 MCP tools enabled
- Add MAX_MCP_TOOLS_THRESHOLD constant (40)
- Add i18n translations for the warning message
- Integrate warning into ChatView to display after task header
- Add comprehensive tests for both components
Closes ROO-542
* Moves constant to the right place
* Move it to the backend
* i18n
* Add actionlink that takes you to MCP settings in this case
* Add to MCP settings too
* Bump max tools up to 60 since github itself has 50+
* DRY
* Fix test
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Bruno Bergher <bruno@roocode.com>
Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>
* feat: add debug mode toggle to settings
* Update About component with debug mode description
* i18n: add debug mode strings to settings locales
* Update debug mode description in all locales
* fix: post state to webview after debugSetting update
This addresses the review feedback that the debugSetting handler was not
posting updated state back to the webview, which could cause the UI to
stay stale until another state refresh occurred.
* fix: clarify debug mode description to specify task header location
Updated debugMode.description across all 18 locales to clarify that
debug buttons appear in the task header, per review feedback.
* fix: remove redundant postStateToWebview call after debug setting update
* Update src/core/webview/webviewMessageHandler.ts
Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com>
---------
Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com>
The kangaroo logo on the welcome screen had a visual glitch where it would instantly jump to the top position when hovering, instead of smoothly starting the bounce from its resting position.
Changes:
- Added custom smooth-bounce keyframe animation in index.css that explicitly starts from translateY(0)
- Updated RooHero component to use hover state tracking with the new animation
- Removed Tailwind's animate-bounce class which was causing the glitch
The animation now smoothly bounces from the resting position without any jarring visual jumps.
* fix: make command chaining examples shell-aware for Windows compatibility
Addresses Issue #10352 where Roo Code generates Unix-style command
chaining (&&) even on Windows systems using PowerShell or cmd.exe.
Changes:
- Add getCommandChainOperator() to detect the user shell and return
the appropriate command chaining syntax:
- Unix shells (bash, zsh, etc.): &&
- PowerShell: ;
- cmd.exe: &
- Update getRulesSection() to use shell-specific chaining in examples
- Add informative note for non-Unix shells about different syntaxes
- Add comprehensive tests for shell detection and command chaining
* feat: add Unix utility guidance for Windows shells
Addresses feedback from issue #10352 about sed and other Unix-specific
utilities being suggested on Windows. The system prompt now includes
guidance for PowerShell and cmd.exe users to use native alternatives:
PowerShell:
- Select-String instead of grep
- Get-Content instead of cat
- Remove-Item instead of rm
- Copy-Item instead of cp
- Move-Item instead of mv
- -replace operator or [regex] instead of sed
cmd.exe:
- type instead of cat
- del instead of rm
- copy instead of cp
- move instead of mv
- find/findstr instead of grep
* Apply suggestion from @roomote[bot]
Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com>
* fix: use && for cmd.exe to preserve conditional execution semantics
- Update getCommandChainOperator() to return && for cmd.exe (already done)
- Update getCommandChainNote() to document && instead of & for cmd.exe
- Update JSDoc to reflect cmd.exe uses && for conditional execution
- Update tests to expect && for cmd.exe
cmd.exe supports && for conditional execution (run next command only if
previous succeeds), which provides the same semantics as Unix shells.
* fix: update PowerShell note to use && for cmd.exe reference
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Hannes Rudolph <hrudolph@gmail.com>
Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com>
* feat: filter @ mention file search results using .rooignore
- Modify searchFiles case in webviewMessageHandler.ts to filter results using RooIgnoreController
- Use existing RooIgnoreController from current task if available, otherwise create a temporary one
- Respect showRooIgnoredFiles setting to allow users to toggle this behavior
- Add comprehensive test coverage for the new filtering behavior
Fixes#10169
* fix: dispose temporary RooIgnoreController to prevent resource leak
Addresses Rooviewer feedback: the temporary RooIgnoreController created
when no task exists was never disposed, causing file watchers to accumulate.
Changes:
- Track temporary controller separately with tempController variable
- Wrap filtering logic in try/finally block
- Call dispose() in finally block to ensure cleanup
- Add test cases to verify dispose is called for temp controllers
- Verify task's controller is NOT disposed (only temp ones)
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Hannes Rudolph <hrudolph@gmail.com>
* feat(web-evals): remember last Roo model selection
* fix(web-evals): reset model selections on provider switch and fix lint warning
- Add useEffect to reset model selections when switching between providers
This prevents OpenRouter model IDs from persisting when switching to Roo,
which was causing Roo's stored selection to be overwritten with wrong IDs
- Remove unused 'executionMethod' from onSubmit dependency array to fix
react-hooks/exhaustive-deps warning
* fix(web-evals): add missing executionMethod to test cases
* fix(web-evals): harden localStorage + keep provider selections
fix: add type check for lastMessage.text before calling startsWith
Fixes#10430
The TTS useEffect was calling .startsWith() on lastMessage.text after only
checking if it was truthy. If text was a non-string truthy value (array,
object, or number), this would crash with "Q.text.startsWith is not a function".
Changed the truthy check to an explicit type check: typeof lastMessage.text === "string"
Co-authored-by: Roo Code <roomote@roocode.com>
* feat: add optional mode field to slash command front matter
- Add mode field to Command interface
- Update command parsing to extract mode from frontmatter
- Modify RunSlashCommandTool to automatically switch mode when specified
- Add comprehensive tests for mode field parsing and switching
- Update existing tests to include mode field
* Make it work for manual slash commands too
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>
* Add support for skills
* fix: use type-only import for ClineProvider and relative paths in skills section
---------
Co-authored-by: Roo Code <roomote@roocode.com>
- Delete simpleReadFileTool.ts file
- Delete simple-read-file.ts prompt description file
- Delete single-file-read-models.ts types file
- Remove imports and usage from presentAssistantMessage.ts
- Remove imports and usage from prompts/tools/index.ts
- Remove export from packages/types/src/index.ts
This removes all traces of the legacy single-file read tool implementation that was used for specific models. All models now use the standard read_file tool.
Co-authored-by: Roo Code <roomote@roocode.com>
Implements grace retry error handling for 'no assistant messages' API
errors, following the same pattern as PR #10196 for 'no tools used'.
- Add consecutiveNoAssistantMessagesCount counter to Task.ts
- First failure: silent retry (grace retry)
- After 2+ consecutive failures: show MODEL_NO_ASSISTANT_MESSAGES error
- Add UI handling in ChatRow.tsx with ErrorRow component
- Add localized strings to all 18 locale files
- Add comprehensive tests for the grace retry behavior
- Normalize file content to LF after reading to ensure consistent matching
- Normalize search/replace strings to handle CRLF from model output
- Add comprehensive CRLF normalization tests for both tools
- Consistent with existing edit_file tool behavior
* fix: move array-specific properties into anyOf variant in normalizeToolSchema
Fixes read_file tool schema rejection with GPT-5-mini which requires
items property to be inside the { type: 'array' } variant when using
anyOf for nullable arrays.
Resolves ROO-262
* refactor: extract array-specific properties constant and helper function
* feat(types): add defaultToolProtocol: native to providers
- Added supportsNativeTools: true and defaultToolProtocol: native to all chutes models
- Added defaultToolProtocol: native to moonshot models (already had supportsNativeTools)
- Added defaultToolProtocol: native to litellm default model (already had supportsNativeTools)
- Added defaultToolProtocol: native to minimax models (already had supportsNativeTools)
This enables native tool calling by default for these providers, reducing
the number of users falling back to XML tool protocol unnecessarily.
* fix(litellm): merge only native tool defaults with router models
Only merges supportsNativeTools and defaultToolProtocol from litellmDefaultModelInfo,
not prices or other model-specific info that could be incorrect for different models.
Adds userAgentAppId configuration to the BedrockRuntimeClient in the
code indexing embedder, matching the implementation pattern already
used in the main Bedrock API provider.
This enables proper user agent identification in CloudTrail AWS requests
when using Bedrock for code indexing embeddings.
Fixes#10165
Co-authored-by: Roo Code <roomote@roocode.com>
* feat: add metadata to error details dialog
- Prepends extension version, provider, model, and repository info to error details
- Helps users provide better bug reports with context
- Uses useExtensionState and useSelectedModel hooks for data
* Tweaks
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Bruno Bergher <bruno@roocode.com>
* feat: add WorkspaceTaskVisibility type and workspaceTaskVisibility property to OrganizationCloudSettings
* refactor: create workspaceTaskVisibilitySchema and derive WorkspaceTaskVisibility type from it
---------
Co-authored-by: Roo Code <roomote@roocode.com>
OpenRouter wraps upstream provider errors in a generic message but includes
the actual error in metadata.raw. This change:
- Adds OpenRouterErrorResponse interface for proper typing
- Creates handleStreamingError() helper for DRY error handling
- Extracts metadata.raw for actionable error messages in PostHog
- Includes nested error structure so getErrorMessage() can extract raw message
Before: PostHog receives '400 Provider returned error' (generic)
After: PostHog receives 'Model xyz not found' (actionable)
This enables proper error tracking and debugging via PostHog telemetry.
* feat: add error details modal with on-demand display
- Add errorDetails prop to ErrorRow component
- Show Info icon on hover in error header when errorDetails is provided
- Display detailed error message in modal dialog on Info icon click
- Add Copy to Clipboard button in error details modal
- Update generic error case to show localized message with details on demand
- Add i18n translations for error details UI
* UI Tweaks
* Properly handles error details
* i18n
* Lighter visual treatment for errors
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Bruno Bergher <bruno@roocode.com>
* Add a way to save screenshots from the browser tool
* fix: use cross-platform paths in BrowserSession screenshot tests
* fix: validate screenshot paths to prevent filesystem escape
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Adds a new search_replace tool that performs a single search and replace
operation on a file, requiring the old_string to uniquely identify the
target text with 3-5 lines of context.
Parameters:
- file_path: Path to file (relative or absolute)
- old_string: Text to find (must be unique in file)
- new_string: Replacement text (must differ from old_string)
* fix: add Kimi, MiniMax, and Qwen model configurations for Bedrock
- Add moonshot.kimi-k2-thinking with 32K max tokens and 256K context
- Add minimax.minimax-m2 with 16K max tokens and 230K context
- Add qwen.qwen3-next-80b-a3b with 8K max tokens and 262K context
- Add qwen.qwen3-coder-480b-a35b-v1:0 with 8K max tokens and 262K context
All models configured with native tool support and appropriate pricing.
Fixes#9902
* fix: add preserveReasoning flag and update Kimi K2 context window
- Added preserveReasoning: true to moonshot.kimi-k2-thinking model
- Added preserveReasoning: true to minimax.minimax-m2 model
- Updated Kimi K2 context window from 256_000 to 262_144
These changes ensure:
1. Reasoning traces are properly preserved for both models
2. Roo correctly recognizes task completion
3. Tool calls within reasoning traces are handled appropriately
4. Context window matches AWS Console specification
* fix: update MiniMax M2 context window to 196_608 for Bedrock
Based on AWS CLI testing, the actual context window limit for MiniMax M2
on Bedrock is 196,608 tokens, not 230,000 as initially configured.
* Update packages/types/src/providers/bedrock.ts
Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com>
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>
Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com>
* Removes Pro, restructures pricing page
* Solves provider/credits
* Update apps/web-roo-code/src/app/pricing/page.tsx
Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com>
* Updates agent landing pages to not mention a trial that doesn't exist
* Updates agent-specific landing pages to reflect new home and trial
* Indicate the agent landing page the user came from
* Clean up the carousel
---------
Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com>
* refactor: remove TabHeader and onDone callback from CloudView
- Removed TabHeader component from CloudView as it is no longer needed
- Removed onDone prop from CloudView component definition and usage
- Updated all test files to reflect the removal of onDone prop
- Kept Button import that was accidentally removed initially
* Updates upsell copy to reflect today's product
* Update webview-ui/src/components/cloud/CloudView.tsx
Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
* Update webview-ui/src/i18n/locales/ko/cloud.json
Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
* Update webview-ui/src/i18n/locales/zh-CN/cloud.json
Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
* Test fixes
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Bruno Bergher <bruno@roocode.com>
Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
When tools are called in parallel (e.g., update_todo_list + new_task),
the tool results accumulate in userMessageContent but aren't saved to
API history until all tools complete. When new_task triggers delegation,
the parent is disposed before these pending results are saved, causing
400 errors when the parent resumes (missing tool_result for tool_use).
This fix:
- Adds flushPendingToolResultsToHistory() method in Task.ts that saves
pending userMessageContent to API history
- Calls this method in delegateParentAndOpenChild() before disposing the
parent task
- Safe for both native/XML protocols and sequential/parallel execution
(returns early if there's nothing to flush)
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>
Co-authored-by: Roo Code <roomote@roocode.com>
- Import resolveToolProtocol and TOOL_PROTOCOL from @roo-code/types
- Add tools and tool_choice to completion params when native protocol is enabled
- Handle tool_call_partial chunks in streaming response
- Add comprehensive tests for native tool support
Add supportsNativeTools: true to DeepSeek and Doubao model definitions,
enabling native OpenAI-compatible tool calling for these providers.
Both providers already extend OpenAiHandler which has built-in support
for native tools, so this change is all that's needed to enable the feature.
* feat: add model-specific tool customization via excludedTools and includedTools
- Add excludedTools and includedTools to ModelInfo schema
- Implement applyModelToolCustomization helper to filter tools based on model config
- Integrate model tool filtering into filterNativeToolsForMode for native protocol
- Add comprehensive tests for tool customization functionality
- Wire up modelInfo through buildNativeToolsArray and Task.ts
This allows providers to override which native tools are available on a per-model basis via MODEL_DEFAULTS, enabling better control over tool selection for models with specific needs.
* feat: add customTools for opt-in only tools
- Add customTools array to ToolGroupConfig for defining opt-in only tools
- Update getToolsForMode() to exclude customTools from default tool set
- Modify applyModelToolCustomization() to include customTools only via includedTools
- Add tests for customTools functionality
- Add comprehensive documentation with usage examples
customTools allows defining tools that are NOT available by default,
even when a mode includes their group. These tools are only available
when explicitly included via a model's includedTools configuration.
This enables:
- Gradual rollout of experimental tools
- Model-specific specialized capabilities
- Safe experimentation without affecting default tool sets
* Add assertions for customTools tests per review feedback
* test: add tests for including customTools via includedTools
* Update src/core/prompts/tools/__tests__/filter-tools-for-mode.spec.ts
Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
---------
Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
The pendingNewTaskToolCallId was being set AFTER startSubtask() returned.
However, startSubtask() contains a 500ms delay during which the subtask
could complete. If the subtask completed during this window, completeSubtask()
would be called before pendingNewTaskToolCallId was set, causing it to
fall through to the XML protocol path and add a text message instead of
a proper tool_result block, breaking the API conversation structure.
This fix moves the pendingNewTaskToolCallId assignment to happen BEFORE
calling startSubtask(), ensuring the ID is set before the subtask starts.
If the subtask creation fails, the pending ID is cleared.
* feat: add AWS Bedrock support for codebase indexing
- Add bedrock as a new EmbedderProvider type
- Add AWS Bedrock embedding model profiles (titan-embed-text models)
- Create BedrockEmbedder class with support for Titan and Cohere models
- Add Bedrock configuration support to config manager and interfaces
- Update service factory to create BedrockEmbedder instances
- Add comprehensive tests for BedrockEmbedder
- Add localization strings for Bedrock support
Closes#8658
* fix: add missing bedrockOptions to loadConfiguration return type
* Fix various issues that the original PR missed.
* Remove debug logs
* Rename AWS Bedrock -> Amazon Bedrock
* Remove some 'as any's
* Revert README changes
* Add translations
* More translations
* Remove leftover code from a debugging session.
* fix: add bedrock to codebaseIndexModelsSchema and update brace-expansion override
- Add bedrock provider to codebaseIndexModelsSchema type definition to fix empty model dropdown in UI
- Update pnpm override for brace-expansion from '>=2.0.2' to '^2.0.2' to resolve ESM/CommonJS compatibility issues
* Improvements to AWS Bedrock embeddings support
- Enhanced bedrock.ts embedder implementation
- Added comprehensive test coverage in bedrock.spec.ts
- Updated config-manager.ts for better Bedrock configuration handling
- Improved service-factory.ts integration
- Updated embeddingModels.ts with Bedrock models
- Enhanced CodeIndexPopover.tsx UI for Bedrock options
- Added auto-populate test for CodeIndexPopover
- Updated pnpm-lock.yaml dependencies
* Restore openrouter config
* Remove debug log
* Fix config-manager.spec.ts unit test.
* Add translations for "optional"
* Revert unnecessary change related to open ia embedder
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>
Co-authored-by: Smartsheet-JB-Brown <jb.brown@smartsheet.com>
Added claude-opus-4-5-20251101 to the cache control switch statements
to enable prompt caching, matching the behavior of other Claude models.
Fixes#9567
Co-authored-by: Roo Code <roomote@roocode.com>
* feat: store reasoning in conversation history for all providers
* refactor: address review feedback
- Move comments inside else block
- Combine reasoning checks into single if block
- Make comments more concise
* refactor: make comments more concise
* Fix preserveReasoning flag to control API reasoning inclusion
Changes:
1. Removed hardcoded <think> tag logic in streaming
- Previously hardcoded reasoning into assistant message text
- Now passes reasoning to addToApiConversationHistory as parameter
2. Updated buildCleanConversationHistory to respect preserveReasoning flag
- When preserveReasoning: true → reasoning block included in API requests
- When preserveReasoning: false/undefined → reasoning stripped from API
- Reasoning stored in history for all cases
3. Added temporary debug logs to base-openai-compatible-provider.ts
- Shows preserveReasoning flag value
- Logs reasoning blocks in incoming messages
- Logs <think> tags in converted messages sent to API
* Fix: Use api.getModel() directly instead of cachedStreamingModel
Addresses review comment: cachedStreamingModel is set during streaming but
buildCleanConversationHistory is called before streaming starts. Using the
cached value could cause stale model info when switching models between requests.
Now directly uses this.api.getModel().info.preserveReasoning to ensure we
always check the current model's flag, not a potentially stale cached value.
* Clean up comments in Task.ts
Removed outdated comment regarding model's preserveReasoning flag.
* fix: remove unnecessary reasoningBlock variable in task reasoning logic
- Filter out complete environment_details blocks before appending fresh ones
- Check for both opening and closing tags to ensure we're matching complete blocks
- Prevents stale environment data from being kept during task resume
- Add tests to verify deduplication logic and edge cases
* Improve read_file tool description with examples
- Add explicit JSON structure documentation
- Include three concrete examples (single file, with line ranges, multiple files)
- Clarify that 'path' is required and 'line_ranges' is optional
- Better explain line range format (1-based inclusive)
This addresses agent confusion by providing clear examples similar to the XML tool definition.
* Make read_file tool dynamic based on partialReadsEnabled setting
- Convert read_file from static export to createReadFileTool() factory function
- Add getNativeTools() function that accepts partialReadsEnabled parameter
- Create buildNativeToolsArray() helper to encapsulate tool building logic
- Update Task.ts to build native tools dynamically using maxReadFileLine setting
- When partialReadsEnabled is false, line_ranges parameter is excluded from schema
- Examples and descriptions adjust based on whether line ranges are supported
This matches the behavior of the XML tool definition which dynamically adjusts
its documentation based on settings, reducing confusion for agents.
* Add a RCC credit balance display
* Replace the provider docs with the balance when logged in
* PR feedback
---------
Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>
* fix: Include nativeArgs in tool repetition detection
Fixes false positive 'stuck in a loop' error for native protocol tools
like read_file that store parameters in nativeArgs instead of params.
Previously, the ToolRepetitionDetector only compared the params object,
which was empty for native protocol tools. This caused all read_file
calls to appear identical, triggering false loop detection even when
reading different files.
Changes:
- Updated serializeToolUse() to include nativeArgs in comparison
- Added comprehensive tests for native protocol scenarios
- Maintains backward compatibility with XML protocol tools
Closes: Issue reported in Discord about read_file loop detection
* Try to use safe-stable-stringify in the tool repetition detector
---------
Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>
* Add native tool calling support to OpenAI-compatible
* Fix OpenAI strict mode schema validation by adding converter methods to BaseProvider
- Add convertToolsForOpenAI() and convertToolSchemaForOpenAI() methods to BaseProvider
- These methods ensure all properties are in required array and convert nullable types
- Remove line_ranges from required array in read_file tool (converter handles it)
- Update OpenAiHandler and BaseOpenAiCompatibleProvider to use helper methods
- Eliminates code duplication across multiple tool usage sites
- Fixes: OpenAI completion error: 400 Invalid schema for function 'read_file'
---------
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
* fix: format tool responses for native protocol
- Add toolResultFormatting utilities for protocol detection
- ReadFileTool now builds both XML and native formats
- Native format returns clean, readable text without XML tags
- Legacy conversation history conversion is protocol-aware
- All tests passing (55 total)
* refactor: use isNativeProtocol from @roo-code/types
Remove duplicate implementation and import from types package instead
* refactor: centralize toolProtocol configuration checks
- Created src/utils/toolProtocol.ts with getToolProtocolFromSettings() utility
- Replaced all direct vscode.workspace.getConfiguration() calls with centralized utility
- Updated 6 files to use the new utility function
- All tests pass and TypeScript compilation succeeds
* refactor: use isNativeProtocol function from types package
When read_file encountered errors (e.g., file not found), it would call
handleError() which internally calls pushToolResult(), then continue to
call pushToolResult() again with the final XML. In native protocol mode,
this created two tool_result blocks with the same tool_call_id, causing
400 errors on subsequent API calls.
This fix replaces handleError() with task.say() for error notifications.
The agent still receives error details through the XML in the single
final pushToolResult() call.
This change works for both protocols:
- Native: Only one tool_result per tool_call_id (fixes duplicate issue)
- XML: Only one text block with complete XML (cleaner than before)
Agent visibility preserved: Errors are included in the XML response
sent to the agent via pushToolResult().
Tests: All 44 tests passing. Updated test to verify say() is called.
The OpenAI tool schema required both 'path' and 'line_ranges' in FileEntry,
but the TypeScript type definition marks lineRanges as optional. This caused
the AI to fail when trying to read files without specifying line_ranges.
Changes:
- Updated read_file tool schema to only require 'path' parameter
- line_ranges remains available but optional, matching TypeScript types
- Aligns with implementation which treats lineRanges as optional throughout
Fixes issue where read_file tool kept failing with missing parameters.
fix(webview-ui): make Share button popover work by forwarding ref in LucideIconButton
- Convert LucideIconButton to forwardRef so Radix PopoverTrigger(asChild) receives a focusable element
- Enables Share popover and shareCurrentTask flow
- Verified with ShareButton/TaskActions Vitest suites
* fix: filter native tools by mode restrictions
Native tools are now filtered based on mode restrictions before being sent to the API, matching the behavior of XML tools. Previously, all native tools were sent to the API regardless of mode, causing the model to attempt using disallowed tools.
Changes:
- Created filterNativeToolsForMode() and filterMcpToolsForMode() utility functions
- Extracted filtering logic from Task.ts into dedicated module
- Applied same filtering approach used for XML tools in system prompt
- Added comprehensive test coverage (10 tests)
Impact:
- Model only sees tools allowed by current mode
- No more failed tool attempts due to mode restrictions
- Consistent behavior between XML and Native protocols
- Better UX with appropriate tool suggestions per mode
* refactor: eliminate repetitive tool checking using group-based approach
- Add getAvailableToolsInGroup() helper to check tools by group instead of individually
- Refactor filterNativeToolsForMode() to reuse getToolsForMode() instead of duplicating logic
- Simplify capabilities.ts by using group-based checks (60% reduction)
- Refactor rules.ts to use group helper (56% reduction)
- Remove debug console.log statements
- Update tests and snapshots
Benefits:
- Eliminates code duplication
- Leverages existing TOOL_GROUPS structure
- More maintainable - new tools in groups work automatically
- All tests passing (26/26)
* fix: add fallback to default mode when mode config not found
Ensures the agent always has functional tools even if:
- A custom mode is deleted while tasks still reference it
- Mode configuration becomes corrupted
- An invalid mode slug is provided
Without this fallback, the agent would have zero tools (not even
ask_followup_question or attempt_completion), completely breaking it.
* refactor(task): wrap initial user message in <feedback> instead of <task> to prevent focus drift after context-management
Rationale: After a successful context-management event, framing the next user block as feedback reduces model focus drift. Mentions parsing already supports <feedback>, and tool flows (attemptCompletion, responses) are aligned. No change to loop/persistence.
* refactor(mentions): drop <task> parsing; standardize on <feedback>; update tests
openai-native: include reasoning.encrypted_content only when reasoningEffort is set; prevent Responses API error on non-reasoning models. types: remove supportsVerbosity from gpt-5-chat-latest to avoid invalid verbosity error. Fixes#9225
* Migrate conversation continuity to plugin-side encrypted reasoning items (Responses API)
Summary
We moved continuity off OpenAI servers and now maintain conversation state locally by persisting and replaying encrypted reasoning items. Requests are stateless (store=false) while retaining the performance/caching benefits of the Responses API.
Why
This aligns with how Roo manages context and simplifies our Responses API implementation while keeping all the benefits of continuity, caching, and latency improvements.
What changed
- All OpenAI models now use the Responses API; system instructions are passed via the top-level instructions field; requests include store=false and include=["reasoning.encrypted_content"].
- We persist encrypted reasoning items (type: "reasoning", encrypted_content, optional id) into API history and replay them on subsequent turns.
- Reasoning summaries default to summary: "auto" when supported; text.verbosity only when supported.
- Atomic persistence via safeWriteJson.
Removed
- previous_response_id flows, suppressPreviousResponseId/skipPrevResponseIdOnce, persistGpt5Metadata(), and GPT‑5 response ID metadata in UI messages.
Kept
- taskId and mode metadata for cross-provider features.
Result
- ZDR-friendly, stateless continuity with equal or better performance and a simpler codepath.
* fix(webview): remove unused metadata prop from ReasoningBlock render
* Responses API: retain response id for troubleshooting (not continuity)
Continuity is stateless via encrypted reasoning items that we persist and replay. We now capture the top-level response id in OpenAiNativeHandler and persist the assistant message id into api_conversation_history.json solely for debugging/correlation with provider logs; it is not used for continuity or control flow.
Also: silence request-body debug logging to avoid leaking prompts.
* remove DEPRECATED tests
* chore: remove unused Task types file to satisfy knip CI
* fix(task): properly type cleanConversationHistory and createMessage args in Task to address Dan's review
- Updated variant A content to match variant B messaging
- Both variants now show the same improved copy focused on catching meaningful bugs
- Emphasizes depth over token-saving and repository-aware analysis
Co-authored-by: Roo Code <roomote@roocode.com>
- Updated variant A content to match variant B messaging
- Both variants now show the same improved copy focused on catching meaningful bugs
- Emphasizes depth over token-saving and repository-aware analysis
Co-authored-by: Roo Code <roomote@roocode.com>
* feat: add Google Tag Manager to marketing website using Next.js Script component
* refactor: remove Google Ads implementation in favor of Tag Manager
* fix: wrap GTM script in consent-checking client component for GDPR compliance
---------
Co-authored-by: Roo Code <roomote@roocode.com>
* changeset version bump
* Revise CHANGELOG for version 3.30.2
Updated changelog for version 3.30.2 with new features and fixes.
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>
Aligns claude-opus-4-1-20250805 max token limit with claude-opus-4-20250514,
both models now supporting 32K output tokens (overridable to 8K when
enableReasoningEffort is false).
Fixes#9045
Co-authored-by: Roo Code <roomote@roocode.com>
* fix: keep pinned models fixed at top of scrollable list
- Separated pinned and unpinned configs into different containers
- Pinned configs now stay fixed at the top
- Only unpinned configs are scrollable
- Added tests to verify the fixed behavior
Fixes#8812
* fix: resolve sticky header visual artifact in ApiConfigSelector
- Changed sticky header background from bg-vscode-editorWidget-background to bg-vscode-dropdown-background to match popover container
- Moved separator logic into sticky container as conditional bottom border to prevent scroll artifacts
- Updated tests to match new separator structure
- All 21 tests passing
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
- Add PathTooltip component that wraps StandardTooltip with proper styling
- Use maxWidth='min(300px,100vw)' via inline style to override defaults
- Apply '[text-wrap:wrap]' class to override text-balance behavior
- Add formatPathTooltip helper for consistent path content formatting
- Update CodeAccordian, ChatRow, and BatchFilePermission to use PathTooltip
- Centralizes tooltip behavior and reduces duplication
Supersedes PR #8797.
* fix: eliminate UI flicker during task cancellation
- Modify ClineProvider.createTaskWithHistoryItem() to detect when rehydrating current task
- Implement in-place task replacement to avoid empty stack state that causes UI flicker
- Add comprehensive unit tests for flicker-free cancel behavior
- Maintain backward compatibility and proper event listener cleanup
Fixes the jarring navigation to home view when cancelling tasks
* fix: ensure proper garbage collection of old task during flicker-free rehydration
- Call abortTask(true) on old task before replacement to stop processes and mark as abandoned
- This ensures proper cleanup and prevents memory leaks during task cancellation
- Add test verification for abortTask cleanup
* feat: implement Google Consent Mode v2 with cookieless pings
- Add consent defaults before gtag.js loads (required for Consent Mode v2)
- Enable cookieless pings with url_passthrough for Google Ads
- Implement consent update logic for all consent categories
- Support both granted and denied consent states
- Maintain backward compatibility with existing consent manager
* fix: remove shouldLoad from useEffect dependency array to prevent re-initialization loop
---------
Co-authored-by: Roo Code <roomote@roocode.com>
* feat: add OpenRouter embedding provider support
Implement comprehensive OpenRouter embedding provider support for codebase indexing with the following features:
- New OpenRouterEmbedder class with full API compatibility
- Support for OpenRouter's OpenAI-compatible embedding endpoint
- Rate limiting and retry logic with exponential backoff
- Base64 embedding handling to bypass OpenAI package limitations
- Global rate limit state management across embedder instances
- Configuration updates for API key storage and provider selection
- UI integration for OpenRouter provider settings
- Comprehensive test suite with mocking
- Model dimension support for OpenRouter's embedding models
This adds OpenRouter as the 7th supported embedding provider alongside OpenAI, Ollama, OpenAI-compatible, Gemini, Mistral, and Vercel AI Gateway.
* Add translation key
* Fix mutex double release bug
* Add translations
* Add more translations
* Fix failing tests
* code-index(openrouter): fix HTTP-Referer header to RooCodeInc/Roo-Code; i18n: add and wire OpenRouter Code Index strings; test: assert default headers in embedder
---------
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
* feat: convert Chutes to dynamic/router provider
- Add chutes to dynamicProviders array in provider-settings
- Add chutes entry to dynamicProviderExtras in api.ts
- Create fetcher function for Chutes models API
- Convert ChutesHandler to extend RouterProvider
- Update tests to work with dynamic provider setup
- Export chutesDefaultModelInfo for RouterProvider constructor
* fix: address security and code quality issues from review
- Fix potential API key leakage in error logging
- Add temperature support check before setting temperature
- Improve code consistency with RouterProvider patterns
* fix: add chutes to routerModels initialization
- Fix TypeScript error in webviewMessageHandler
- Ensure chutes is included in RouterName Record type
* Fixes
* Support reasoning
* Fix tests
* Remove reasoning checkbox
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>
* feat: improve @ file search for large projects
- Increase default file limit from 5,000 to 10,000 (configurable up to 500,000)
- Respect VSCode search settings (useIgnoreFiles, useGlobalIgnoreFiles, useParentIgnoreFiles)
- Add 'maximumIndexedFilesForFileSearch' configuration setting
- Add tests for new functionality
Conservative default of 10k keeps memory usage low while still providing 2x
improvement. Users with large projects can opt-in to higher limits (up to 500k).
This is a simplified alternative to PR #5723 that solves the same problem
without the complexity of caching. Ripgrep is already fast enough for
10k+ files, and the benefit of caching doesn't justify 2,200+ lines of
additional code and maintenance burden.
Fixes#5721
* fix: add missing translations for maximumIndexedFilesForFileSearch setting
* test: improve file-search tests to verify configuration behavior
- Update McpView.tsx to use "logs" tab ID instead of "errors"
- Rename translation key from tabs.errors to tabs.logs in all locales
- Change empty state message from "No errors found" to "No logs yet"
This better reflects that the tab shows all server messages (info, warnings, errors), not just errors.
Fixes#8893
Co-authored-by: Roo Code <roomote@roocode.com>
* feat: add zai-glm-4.6 model and update gpt-oss-120b for Cerebras
- Add zai-glm-4.6 with 128K context window and 40K max tokens
- Set zai-glm-4.6 as default Cerebras model
- Update gpt-oss-120b to 128K context and 40K max tokens
* feat: add zai-glm-4.6 model to Cerebras provider
- Add zai-glm-4.6 with 128K context window and 40K max tokens
- Set zai-glm-4.6 as default Cerebras model
- Model provides ~2000 tokens/s for general-purpose tasks
* add [SOON TO BE DEPRECATED] warning for Q3C
* chore: set gpt-oss-120b as default Cerebras model
* Fix cerebras test: update expected default model to gpt-oss-120b
* Apply suggestion from @mrubens
Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>
---------
Co-authored-by: kevint-cerebras <kevin.taylor@cerebras.net>
Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>
* fix: prevent MCP server restart when toggling tool permissions
Add isProgrammaticUpdate flag to distinguish between programmatic config
updates and user-initiated file changes. Skip file watcher processing
during programmatic updates to prevent unnecessary server restarts.
* fix(mcp): prevent server reconnection when toggling disabled state
Fixed bug where MCP servers would reconnect instead of staying disabled when toggled off. The issue was that toggleServerDisabled() used stale in-memory config instead of reading the fresh config from disk after writing the disabled flag.
Changes:
Added readServerConfigFromFile() helper to read and validate server config from disk
Updated disable path to read fresh config before calling connectToServer()
Updated enable path to read fresh config before calling connectToServer()
This ensures the disabled: true flag is properly read, causing connectToServer() to create a disabled placeholder connection instead of actually connecting the server.
+ refactor(mcp): use safeWriteJson for atomic config writes
Replace JSON.stringify + fs.writeFile with safeWriteJson in McpHub.ts
to prevent data corruption through atomic writes with file locking.
* fix(mcp): prevent race condition in isProgrammaticUpdate flag
Replace multiple independent reset timers with a single timer that gets
cleared and rescheduled on each programmatic config update. This prevents
the flag from being reset prematurely when multiple rapid updates occur,
which could cause unwanted server restarts during the file watcher's
debounce period.
+ fix(mcp): ensure isProgrammaticUpdate flag cleanup with try-finally
Wrap safeWriteJson() calls in try-finally blocks to guarantee the
isProgrammaticUpdate flag is always reset, even if the write operation
fails. This prevents the flag from being stuck at true indefinitely,
which would cause subsequent user-initiated config changes to be
silently ignored.
* feat: update Gemini models with latest 09-2025 versions
- Add gemini-flash-latest and gemini-flash-lite-latest models
- Add gemini-2.5-flash-preview-09-2025 and gemini-2.5-flash-lite-preview-09-2025
- Reorganize models list with most recent versions at the top
- Maintain all existing models for backward compatibility
Fixes#8485
* fix: restore missing maxThinkingTokens and supportsReasoningBudget for gemini-2.5-pro-preview-03-25
Backward compatibility regression fix - these properties were accidentally
removed during reorganization and are required to preserve existing
reasoning-budget controls for users pinned to this model version.
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
* feat: Add supportsReasoning property for Z.ai GLM binary thinking mode
- Add supportsReasoning to ModelInfo schema for binary reasoning models
- Update GLM-4.5 and GLM-4.6 models to use supportsReasoning: true
- Implement thinking parameter support in ZAiHandler for Deep Thinking API
- Update ThinkingBudget component to show simple toggle for supportsReasoning models
- Add comprehensive tests for binary reasoning functionality
Closes#8465
* refactor: rename supportsReasoning to supportsReasoningBinary for clarity
- Rename supportsReasoning -> supportsReasoningBinary in model schema
- Update Z.AI GLM model configurations to use supportsReasoningBinary
- Update Z.AI provider logic in createStream and completePrompt methods
- Update ThinkingBudget UI component and tests
- Update all test comments and expectations
This change improves naming clarity by distinguishing between:
- supportsReasoningBinary: Simple on/off reasoning toggle
- supportsReasoningBudget: Advanced reasoning with token budget controls
- supportsReasoningEffort: Advanced reasoning with effort levels
* Use monotonic clock for rate limiting
* Fix LiteLLM test failures after merge
- Remove supportsComputerUse from LiteLLM implementation as it's no longer part of ModelInfo interface
- Update test expectations to include cacheWritesPrice and cacheReadsPrice fields
- Fix test for max_output_tokens preference functionality
---------
Co-authored-by: Christiaan Arnoldus <christiaan.arnoldus@outlook.com>
* changeset version bump
* Update CHANGELOG for version 3.29.1 release
Updated version number and added release notes for 3.29.1.
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>
- Add responsive breakpoint at 300px for compact view
- Icon correctly reflects state (X when off, ✓ when on) at all screen sizes
- Show abbreviated labels on very narrow screens (< 300px)
- Add triggerLabelOffShort translation key to all locales
Fixes issues from PR #8152:
- Icon always showing checkmark on narrow screens
- Breakpoint activating too early (was 400px)
- Incorrect Tailwind class ordering
* feat(zai): add GLM-4.5-X, AirX, Flash; sync with Z.ai docs; keep canonical api line keys
* feat(zai): add GLM-4.5V vision model (supportsImages, pricing, 16K max output); add tests
* feat(types,zai): sync Z.AI international model map and tests
- Update pricing, context window, and capabilities for:
glm-4.5-x, glm-4.5-airx, glm-4.5-flash, glm-4.5v, glm-4.6
- Add glm-4-32b-0414-128k
- Align tests with new model specs
* fix(zai): align handler generics with expanded model ids to satisfy CI compile step
* chore(zai): remove tier pricing blocks for Z.ai models
* fix(zai): simplify names in zaiApiLineConfigs for clarity
* chore(zai): set default temperature to 0.6
---------
Co-authored-by: Roo Code <roomote@roocode.com>
chore(gpt5): stop persisting instructions/reasoning_summary in UI message metadata
Problem: ui_messages.json was getting bloated with unused or duplicated content (system 'instructions' and 'reasoning_summary') that we do not read back. Root cause: earlier OpenAI Responses API implementation persisted these fields to per-message metadata; however, 'instructions' are already sent as top-level request instructions and 'reasoning_summary' is surfaced live via streaming events. Neither field is consumed from storage. Changes: (1) Task.persistGpt5Metadata now stores only previous_response_id; (2) removed instructions and reasoning_summary from types; (3) updated Zod schema; (4) persistence layer writes messages as-is (no sanitizer); (5) tests green. Impact: smaller ui_messages.json, no runtime behavior change for requests. Migration: old metadata fields will be ignored by schema.
* Adds mention of Cloud agents to /pricing
* Credit pricing FAQ
* Skeleton of a /cloud page and more pricing page tweaks
* Lint
* Update apps/web-roo-code/src/app/cloud/page.tsx
Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com>
* Code review
* Updates copy to new credit system
* Moves Terms of Service to be backed by a markdown file, easier to read/edit/diff
* Updated ToS
* Twerm copy tweaks
* Cloud screenshot and style adjustments
* Style tweaks
* Styles
---------
Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com>
* fix(editor): prevent file editing issues when git diff views are open
Add scheme checks to ensure only file:// URIs are matched when finding editors,
avoiding issues with git diffs and other schemes. Includes error logging for
failed editor lookups.
* Remove the warnings
* fix(editor): enforce file:// scheme in editor lookups to prevent git diff issues
---------
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
* changeset version bump
* Revise changelog for version 3.28.12
Updated version number and consolidated patch notes.
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>
Fixes#8371 - Updates the model ID from anthropic.claude-4.5-sonnet-v1:0
to anthropic.claude-sonnet-4-5-20250929-v1:0 to match AWS Bedrock naming convention
Co-authored-by: Roo Code <roomote@roocode.com>
* feat: add telemetry tracking to DismissibleUpsell component
- Added UPSELL_DISMISSED and UPSELL_CLICKED events to TelemetryEventName enum
- Updated DismissibleUpsell component to track clicks and dismissals with telemetry
- Added telemetry tests to DismissibleUpsell test suite
- Events include upsellId in the payload for tracking specific upsells
* refactor(webview): make handleDismiss synchronous in DismissibleUpsell
test(webview): add scenario where dismissOnClick=true without onClick tracks only UPSELL_DISMISSED; update tests; all tests passing locally
---------
Co-authored-by: Roo Code <roomote@roocode.com>
* fix: apply tiered pricing for Gemini models via Vertex AI
- Modified calculateCost method to handle models where cacheReadsPrice is only defined in tiers
- Added comprehensive tests for Vertex AI tiered pricing calculation
- Fixes issue where local cost calculation always showed highest tier rates
Fixes#8017
* Delete src/api/providers/__tests__/vertex-tiered-pricing.spec.ts
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Daniel <57051444+daniel-lxs@users.noreply.github.com>
* Updating the privacy policy to allow us to send onboarding and occasional marketing emails.
* docs: Clarified unsubscribe behavior and updated the Last Updated date
* docs: update Last Updated date in Privacy Policy page
- Updated regex pattern to support optional dash prefix (e.g., "- [ ] Task")
- Added comprehensive test coverage for both formats
- Fixes issue where todo lists with dash prefixes were not being parsed correctly
Fixes#8054
Co-authored-by: Roo Code <roomote@roocode.com>
* fix: transform keybindings command references in nightly build
The keybindings section was not being transformed during the nightly build process, causing command+y keybinding to reference the wrong command name (roo-cline.addToContext instead of roo-code-nightly.addToContext).
- Added keybindings schema to types.ts
- Updated generatePackageJson to transform keybindings command references
- This ensures keybindings work correctly in the nightly build
* fix: only include keybindings in output when they exist
Updated generatePackageJson to conditionally add keybindings to avoid including undefined values in the generated package.json. Fixed eslint-disable comment placement.
---------
Co-authored-by: Roo Code <roomote@roocode.com>
feat: add organizationFeaturesSchema with roomoteControlEnabled
- Add organizationFeaturesSchema with optional roomoteControlEnabled boolean
- Integrate features property into organizationSettingsSchema as optional
- Add comprehensive tests for new schema validation
- Maintain backward compatibility with existing organization settings
Co-authored-by: Roo Code <roomote@roocode.com>
* docs: overhaul README for clarity and impact
* fix: update badge links and styles in README for improved visibility
* docs(README): stronger CTAs for Discord/Reddit; restore Modes/Roles incl. cloud agents
* docs(readme): add support CTA; refine modes section; clarify custom modes wording
- add centered help/links CTA under badges: [README.md](README.md:8-10)
- expand feature list to explicitly include modes: [README.md](README.md:45)
- rename section header “Modes and Roles” → “Modes”: [README.md](README.md:52)
- update wording to “Custom Modes: build specialized modes for your team or workflow”: [README.md](README.md:60)
* docs: implement @jdilla1277 suggestions for English README
- Updated header to "Your AI-Powered Dev Team, Right in Your Editor" (removed Cline reference)
- Changed line 44 to "Generate Code from natural language descriptions and specs" for better SEO
- Removed "not the other way around" phrase from line 54
- Replaced "Cloud Agents" with "Roomote Control" on line 61
As requested by @hannesrudolph, these changes are only applied to the English README.
* docs: clarify Roomote Control description and update related links in README
* Reworked the contributor list. Made translastion corrections.
---------
Co-authored-by: Roo Code <roomote@roocode.com>
* feat(cloud): Add telemetry retry queue for network resilience
- Implement RetryQueue class with workspace-scoped persistence
- Queue failed telemetry events for automatic retry
- Retry events every 60 seconds with fresh auth tokens
- FIFO eviction when queue reaches 100 events
- Persist queue across VS Code restarts
This ensures telemetry data isn't lost during network failures or temporary server issues.
Migrated from RooCodeInc/Roo-Code-Cloud#744
* fix: address PR review feedback for retry queue
- Fix retry order to use consistent FIFO processing
- Add retry limit enforcement with max retries check
- Add configurable request timeout (default 30s)
- Add comprehensive tests for retryAll() method
- Add request-max-retries-exceeded event
- Fix timeout test to avoid timing issues
* fix: resolve TypeScript errors in RetryQueue tests
* fix(cloud): Address PR feedback for telemetry retry queue
- Handle HTTP error status codes (500s, 401/403, 429) as failures that trigger retry
- Remove queuing of backfill operations since they're user-initiated
- Fix race condition in concurrent retry processing with isProcessing flag
- Add specialized retry logic for 429 with Retry-After header support
- Clean up unnecessary comments
- Add comprehensive tests for new status code handling
- Add temporary debug logs with emojis for testing
* refactor: address PR feedback for telemetry retry queue
- Remove unused X-Organization-Id header from auth header provider
- Simplify enqueue() API by removing operation parameter
- Fix error retry logic: only retry 5xx, 429, and network failures
- Stop retrying 4xx client errors (400, 401, 403, 404, 422)
- Implement queue-wide pause for 429 rate limiting
- Add auth state management integration:
- Pause queue when not in active-session
- Clear queue on logout or user change
- Preserve queue when same user logs back in
- Remove debug comments
- Fix ESLint no-case-declarations error with proper block scope
- Update tests for all new behaviors
* First pass at separate upsell dialog
* Revert PR #7188 - Restore temperature parameter to fix TabbyApi/ExLlamaV2 crashes (#7594)
* fix: reduce CodeBlock button z-index to prevent overlap with popovers (#7783)
Fixes#7703 - CodeBlock language dropdown and copy button were appearing above popovers due to z-index: 100. Reduced to z-index: 40 to maintain proper layering hierarchy while keeping buttons functional.
* Make ollama models info transport work like lmstudio (#7679)
* feat: add click-to-edit, ESC-to-cancel, and fix padding consistency for chat messages (#7790)
* feat: add click-to-edit, ESC-to-cancel, and fix padding consistency
- Enable click-to-edit for past messages by making message text clickable
- Add ESC key handler to cancel edit mode in ChatTextArea
- Fix padding consistency between past and queued message editors
- Adjust right padding for edit mode to accommodate cancel button
Fixes#7788
* fix: adjust padding and layout for ChatTextArea in edit mode
* refactor: replace hardcoded pr-[72px] with standard Tailwind pr-20 class
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Hannes Rudolph <hrudolph@gmail.com>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
* Let people paste in the auth redirect url (#7805)
Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com>
Co-authored-by: Bruno Bergher <me@brunobergher.com>
* fix: resolve chat message edit/delete duplication issues (#7793)
* fix: add GIT_EDITOR env var to merge-resolver mode for non-interactive rebase (#7819)
* UI: Render reasoning as plain italic (match <thinking>) (#7752)
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Hannes Rudolph <hrudolph@gmail.com>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
* Add taskSyncEnabled to userSettingsConfigSchema (#7827)
feat: add taskSyncEnabled to userSettingsConfigSchema
Co-authored-by: Roo Code <roomote@roocode.com>
* Release: v1.75.0 (#7829)
chore: bump version to v1.75.0
* fix: prevent negative cost values and improve label visibility in evals chart (#7830)
Co-authored-by: Roo Code <roomote@roocode.com>
* Fix Groq context window display (#7839)
* feat: add DismissibleUpsell component for dismissible messages
- Created DismissibleUpsell component with variant support (banner/default)
- Added dismissedUpsells to GlobalState for persistence
- Implemented message handlers for dismissing and retrieving dismissed upsells
- Added comprehensive tests for the component
- Uses VSCode extension globalState for persistent storage
* fix: Apply PR feedback for DismissibleUpsell component
- Changed from className to separate 'id' and 'className' props for better semantics
- Added i18n support for accessibility labels (aria-label and title)
- Fixed memory leak by adding mounted flag to prevent state updates after unmount
- Fixed race condition by sending dismiss message before hiding component
- Fixed inefficient array operations in webviewMessageHandler
- Added comprehensive test coverage for edge cases including:
- Multiple rapid dismissals
- Component unmounting during async operations
- Invalid/malformed message handling
- Proper message sending before unmount
- Added null checks for message data to handle edge cases gracefully
* New Cloud upsell dialog in task share and cloud view, shared component
* Properly working DismissibleUpsell
* Working upsell for long-running tasks
* CTA in AutoApproveMenu
* Home page CTA
* Fixes the autoapprove upsell and some tests
* Visual and copy fixes
* Test fix
* Translations
* Stray className attribute
* Cloud view fixes in a left-aligned layout
* Removes unnecessary test
* Less flaky tests
* Fixes sharebutton behavior and updates associated tests
* Update webview-ui/src/i18n/locales/it/cloud.json
Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
* Fix dismissed flicker
* Fix long task upsell
---------
Co-authored-by: Daniel <57051444+daniel-lxs@users.noreply.github.com>
Co-authored-by: ItsOnlyBinary <ItsOnlyBinary@users.noreply.github.com>
Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com>
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Hannes Rudolph <hrudolph@gmail.com>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>
Co-authored-by: John Richmond <5629+jr@users.noreply.github.com>
Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
* feat: separate Task Sync and Roomote Control settings
- Add new taskSyncEnabled setting to control task content syncing
- Keep remoteControlEnabled for Roomote Control functionality
- Task Sync controls whether task content is sent to cloud
- Roomote Control controls whether cloud can send instructions back
- Roomote Control now depends on Task Sync being enabled
- Usage metrics (tokens, cost) always reported regardless of settings
- Update UI with two separate toggles and clear descriptions
- Add info text explaining usage metrics are always reported
* feat: add missing translations for Task Sync and Roomote Control settings
- Added taskSync, taskSyncDescription, remoteControlRequiresTaskSync, and usageMetricsAlwaysReported keys to all non-English cloud.json files
- Updated cloudBenefit keys to match English structure
- Ensured all languages have consistent translation keys for the new Task Sync and Roomote Control features
* Cloud: cleanup taskSyncEnabled additions
* fix: correct indentation localization files
---------
Co-authored-by: Roo Code <roomote@roocode.com>
* feat: add click-to-edit, ESC-to-cancel, and fix padding consistency
- Enable click-to-edit for past messages by making message text clickable
- Add ESC key handler to cancel edit mode in ChatTextArea
- Fix padding consistency between past and queued message editors
- Adjust right padding for edit mode to accommodate cancel button
Fixes#7788
* fix: adjust padding and layout for ChatTextArea in edit mode
* refactor: replace hardcoded pr-[72px] with standard Tailwind pr-20 class
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Hannes Rudolph <hrudolph@gmail.com>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
Fixes#7703 - CodeBlock language dropdown and copy button were appearing above popovers due to z-index: 100. Reduced to z-index: 40 to maintain proper layering hierarchy while keeping buttons functional.
* feat(checkpoints): create checkpoint on user message send
* fix(checkpoints): suppress implicit user-message checkpoint row; keep current checkpoint updated without a chat row
* Fix checkpoint suppression for user messages
- Propagate suppressMessage flag through event chain properly
- Update ChatView to check checkpoint metadata for suppressMessage flag
- Ensure checkpoint messages are created but not rendered when suppressed
- Fix bug where checkpointSave(false) should have been checkpointSave(true)
* fix: only create checkpoint on user message when files have changed
- Changed allowEmpty from true to false in checkpointSave call
- Checkpoints will now only be created when there are actual file changes
- This avoids creating empty commits in the shadow git repository
* test: update checkpoint test to include suppressMessage parameter
- Fixed test expectation to match the new function signature
- saveCheckpoint now expects both allowEmpty and suppressMessage parameters
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Hannes Rudolph <hrudolph@gmail.com>
Co-authored-by: Daniel Riccio <ricciodaniel98@gmail.com>
* fix: handle array paths from VSCode terminal profiles
- Updated terminal profile interfaces to support string | string[] for path property
- Added normalizeShellPath helper to safely extract first element from array paths
- Modified isShellAllowed to handle both string and array inputs
- Updated getWindowsShellFromVSCode, getMacShellFromVSCode, and getLinuxShellFromVSCode to use normalizeShellPath
- Added comprehensive tests for array path handling
Fixes#7695
* feat: add validateShellPath export for robust shell validation
- Created validateShellPath as a public API for shell path validation
- Refactored internal validation logic into isShellAllowedInternal
- Added comprehensive test coverage for all edge cases
- Maintains backward compatibility with deprecated isShellAllowed
- Handles arrays, strings, null, undefined, and nested arrays gracefully
* Simplify roomote's work a little
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: John Richmond <5629+jr@users.noreply.github.com>
* fix: improve WelcomeView styling and readability
- Reduced excessive padding from p-16 to p-6
- Removed excessive bold text throughout
- Made provider cards more compact with smaller icons (32x32px)
- Increased introduction text size from text-sm to text-base for better visibility
- Centered the main greeting title
- Improved visual hierarchy with proper text sizing and spacing
- Added subtle borders and improved color contrast
* fix: remove undefined color class from incentive text
Removed the text-vscode-warningForeground class as it wasn't defined in index.css. The incentive text now uses default color which looks good.
Fixes issue where isWriteProtected was incorrectly passed as the partial flag
to task.ask(), causing "Current ask promise was ignored (#1)" error.
Both tools now use the askApproval wrapper function which correctly handles
the parameter ordering, passing undefined for progressStatus and isWriteProtected
as the fourth parameter.
Fixes#7648
Co-authored-by: Roo Code <roomote@roocode.com>
* fix: preserve scroll position when switching tabs in settings
* ui(settings): restore scroll synchronously to prevent flicker; dx(ui): name TabContent for clearer DevTools
---------
Co-authored-by: Daniel Riccio <ricciodaniel98@gmail.com>
* fix: add cache reporting support for OpenAI-Native provider
- Add normalizeUsage method to properly extract cache tokens from Responses API
- Support both detailed token shapes (input_tokens_details) and legacy fields
- Calculate cache read/write tokens with proper fallbacks
- Include reasoning tokens when available in output_tokens_details
- Ensure accurate cost calculation using uncached input tokens
This fixes the issue where caching information was not being reported
when using the OpenAI-Native provider with the Responses API.
* fix: improve cache token normalization and add comprehensive tests
- Add fallback to derive total input tokens from details when totals are missing
- Remove unused convertToOpenAiMessages import
- Add comment explaining cost calculation alignment with Gemini provider
- Add comprehensive test coverage for normalizeUsage method covering:
- Detailed token shapes with cached/miss tokens
- Legacy field names and SSE-only events
- Edge cases including missing totals with details-only
- Cost calculation with uncached input tokens
* fix: address PR review comments
- Remove incorrect fallback to missFromDetails for cache write tokens
- Fix cost calculation to pass total input tokens (calculateApiCostOpenAI handles subtraction)
- Improve readability by extracting cache detail checks to intermediate variables
- Remove redundant ?? undefined
- Update tests to reflect correct behavior (miss tokens are not cache writes)
- Add clarifying comments about cache miss vs cache write tokens
* feat: add Ollama API key support for Turbo mode
- Add ollamaApiKey field to ProviderSettings schema
- Add ollamaApiKey to SECRET_STATE_KEYS for secure storage
- Update Ollama and NativeOllama providers to use API key for authentication
- Add UI field for Ollama API key (shown when custom base URL is provided)
- Add test coverage for API key functionality
This enables users to use Ollama Turbo with datacenter-grade hardware by providing an API key for authenticated Ollama instances or cloud services.
* fix: use VSCodeTextField for Ollama API key field
Remove non-existent ApiKeyField import and use standard VSCodeTextField with password type, matching other provider implementations
* Add missing translation keys for Ollama API key support
- Add providers.ollama.apiKey and providers.ollama.apiKeyHelp to all 18 language files
- Support for authenticated Ollama instances and cloud services
- Relates to PR #7425
* refactor: improve type safety for Ollama client configuration
- Replace 'any' type with proper OllamaOptions (Config) type
- Import Config type from ollama package for better type checking
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Daniel Riccio <ricciodaniel98@gmail.com>
* feat: optimize memory usage for image handling in webview
- Replace base64 image data with webview URIs to reduce memory footprint
- Add proper resource roots to webview for workspace file access
- Implement convertToWebviewUri method for safe file-to-URI conversion
- Update ImageViewer to handle both webview URIs and file paths separately
- Add image message type for proper image rendering in chat
- Improve error handling and display for failed image loads
- Add comprehensive tests for ImageViewer component
- Format display paths as relative for better readability
This change significantly reduces memory usage by avoiding base64 encoding
of images and instead using VSCode's webview URI system for direct file
access. Images are now loaded on-demand from disk rather than being held
in memory as base64 strings.
* fix: address PR review comments
- Use safeJsonParse instead of JSON.parse in ChatRow.tsx
- Add type definition for parsed image info
- Add more specific error types in ClineProvider.ts
- Add comprehensive JSDoc comments to ImageBlock.tsx
- Improve error handling and type safety
* fix: address MrUbens' review comments
- Remove hardcoded 'rc1' pattern in formatDisplayPath, use generic workspace detection
- Internationalize 'No image data' text using i18n system
* chore: remove useless comment
* chore(i18n): add image.noData to all locales to fix translation check
* test: update ImageViewer.spec to align with i18n key and flexible path formatting
- Use CloudService.getUserSettings() for remoteControlEnabled instead of global state
- Update CloudService.updateUserSettings when toggling remote control
- Add BridgeOrchestrator.connectOrDisconnect handling in settings update handler
- Remove dependency on contentProxy/globalSettings for remote control state
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: John Richmond <5629+jr@users.noreply.github.com>
By default, all of the tests run in silent mode with monkey-patched the console logging so no console logging will ever appear in test output.
This confuses the agent- sometimes it will add console logging to help it debug things, and it won't see the logs that it expects.
Adds src/utils/vitest-verbosity.ts to handle verbosity resolution and console logging.
Modifies src/vitest.config.ts and webview-ui/vitest.config.ts to integrate the new verbosity control.
Removes manual console suppression from src/vitest.setup.ts and webview-ui/vitest.setup.ts as it's now handled dynamically.
Co-authored-by: Chris Hasson <noreply@example.com>
- Modified ToolRepetitionDetector to skip repetition detection for browser_action scroll_down and scroll_up actions
- Added isBrowserScrollAction() helper method to identify scroll actions
- Added comprehensive tests for the new behavior
- Fixes issue where multiple scroll actions were incorrectly flagged as being stuck in a loop
Resolves: https://github.com/RooCodeInc/Roo-Code/discussions/7470
Co-authored-by: Roo Code <roomote@roocode.com>
* fix: change default showRooIgnoredFiles to false to hide ignored files
- Changed default value from true to false across all files
- Updated tests to reflect the new default behavior
- This prevents ignored files from appearing in environment details
Fixes#7368
* fix: update tests to match new showRooIgnoredFiles default
* fix: update test expectation to match new showRooIgnoredFiles default value
The PR changed the default value of showRooIgnoredFiles from true to false,
so the test needs to expect false instead of true when calling formatFilesList.
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
- Added condition in getApiProtocol to return 'anthropic' for vercel-ai-gateway when modelId starts with 'anthropic/'
- Added tests for Vercel AI Gateway provider protocol detection
This ensures proper token counting for Anthropic models accessed through Vercel AI Gateway, as Anthropic and OpenAI count tokens differently (Anthropic excludes cache tokens from input count, OpenAI includes them).
* feat: update /init command to focus only on non-obvious discoveries
- Emphasize that only non-obvious information discovered by reading files should be included
- Update all mode-specific examples to show truly non-obvious rules
- Add CRITICAL section explaining what qualifies as non-obvious
- Exclude standard patterns and framework defaults
- Focus on gotchas, hidden requirements, and counterintuitive patterns
* fix: ensure /init command checks for and updates existing AGENTS.md files
- Check for existing AGENTS.md in root directory
- Check for existing AGENTS.md in all .roo/rules-*/ directories
- Read and improve existing files rather than replacing them
- Update discovery phase to explicitly look for these files
* refactor: clean up /init command to properly handle existing AGENTS.md files
- Consolidate all AGENTS.md path checking into step 1 with CRITICAL emphasis
- Add explicit instructions for deep dive improvement of existing files
- Remove redundant mentions throughout the workflow
- Emphasize iterating and enhancing existing files, not just appending
- Add clear guidance on cleaning up outdated info and reorganizing
- Make discovery phase the single source of truth for file checking
* fix: strengthen /init command to aggressively remove obvious information
- Add explicit instructions to DELETE obvious information first
- Emphasize that files should get SHORTER, not longer
- Use stronger language: CRITICALLY EVALUATE, AGGRESSIVELY DELETE
- Make clear that standard practices must be removed even if previously included
- Add success metric: files should be more concise and valuable
- Goal is to fix the tendency to just append instead of clean up
* fix: ensure .roo directory is created in project root, not system root
CRITICAL FIX: Paths were being interpreted as absolute, causing .roo to be created at system root
- Clarify all paths are relative to PROJECT/WORKSPACE root
- Add explicit warnings that .roo must be in project root, not system root
- Update example to show proper project structure
- Add IMPORTANT notes throughout emphasizing relative paths
- Fix prevents accidental creation of /.roo at system level
* test: update built-in-commands test to match new init command content
- Replace 'mode-specific rule directories' with 'non-obvious'
- Replace 'analysis_workflow' with 'discovered by reading files'
- Tests now align with the new focus on non-obvious discoveries
* docs(privacy): add proxy-mode exception when Roo Code is selected as provider; no storage, transit-only; update dates
* Apply suggestion from @jdilla1277
* Apply suggestion from @jdilla1277
changed name to roo code cloud
* Apply suggestion from @jdilla1277
updated provider to Roo Code Cloud
* fix: resolve newTaskRequireTodos setting not working correctly
- Use dynamic Package.name instead of hardcoded namespace values
- Show todos parameter as optional/required based on setting value
- Remove hardcoded new_task example from shared tool use section
- Update tests to use Package.name pattern
The setting now works correctly for both regular and nightly builds
without requiring hardcoded namespace values.
* test: update snapshots after removing hardcoded new_task example
The snapshots needed updating because the hardcoded new_task example
was removed from the shared tool use section
* fix: remove namespace prefix from newTaskRequireTodos setting
The setting name should not include the namespace prefix in package.json
as VSCode automatically adds the extension's namespace. This was preventing
the setting from appearing in the VSCode settings UI.
* fix: restore prefixed setting id roo-cline.newTaskRequireTodos for Settings UI visibility
* docs(newTaskTool): explain dynamic Package.name config namespace\n\ntest(newTaskTool): verify config uses Package.name variant (roo-code-nightly)
* refactor: simplify new-task prompt generation
- Replace complex template literals with two complete prompt constants
- Remove nested ternary operators for better readability
- Hide todos parameter completely when disabled (not shown as optional)
- Update tests to reflect new behavior
- Reduce code from 105 to 66 lines for better maintainability
* test: update snapshots after removing optional todos parameter
The todos parameter is now conditionally required based on the newTaskRequireTodos setting, so the snapshots needed to be updated to reflect the new tool documentation format.
---------
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
* fix: handle Mistral thinking content as reasoning chunks
- Add TypeScript interfaces for Mistral content types (text and thinking)
- Update createMessage to yield reasoning chunks for thinking content
- Update completePrompt to filter out thinking content in non-streaming mode
- Add comprehensive tests for reasoning content handling
- Follow the pattern used by other providers (Anthropic, OpenAI, Gemini, etc.)
Fixes#6842
* fix: resolve TypeScript type issue in completePrompt method
* fix: handle Mistral thinking content chunks in streaming responses
- Added ContentChunkWithThinking type helper to handle thinking chunks
- Properly converts thinking content to reasoning chunks in streaming
- Filters out thinking content in non-streaming completePrompt responses
- Confirmed that Mistral API does send thinking chunks with type 'thinking'
- Works with Mistral SDK v1.9.18
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
* feat: add documentation links for global custom instructions in UI
- Updated translation strings to include links to global rules documentation
- Added VSCodeLink components in ModesView to render clickable documentation links
- Helps users discover global custom instructions feature as suggested in GitHub discussion #7111
* fix: address PR feedback - update all language files and improve documentation links
- Added <0> placeholders to all 17 non-English translation files for global rules links
- Updated documentation anchors to use #global-rules-directory and #setting-up-global-rules
- Added aria-label attributes to all VSCodeLink components for better accessibility
- Improved UTM campaign parameter naming for clearer tracking
---------
Co-authored-by: Roo Code <roomote@roocode.com>
When a subtask completes and the parent task resumes, set skipPrevResponseIdOnce = true
to ensure the next API call sends the full conversation including the subtask result.
This fixes the issue where GPT-5 would only receive the new message without the subtask
result context when using previous_response_id.
Fixes#7251
- Remove assistantMessageParser from experiment definitions in packages/types
- Remove ASSISTANT_MESSAGE_PARSER from shared experiments configuration
- Update Task.ts to always initialize and use AssistantMessageParser
- Remove conditional logic that checked for experiment flag
- Remove unused parseAssistantMessage import
- Update test files to remove assistantMessageParser references
- All tests passing successfully
Co-authored-by: Roo Code <roomote@roocode.com>
* fix: update DeepSeek models context window to 128k
- Updated deepseek-chat and deepseek-reasoner models from 64k to 128k context window
- Updated corresponding test expectations
- Aligns with DeepSeek API documentation at https://api-docs.deepseek.com/quick_start/pricing/Fixes#7268
* feat: update deepseek-reasoner maxTokens to 64K based on official documentation
* fix: use default maxTokens values instead of maximum for DeepSeek models
- deepseek-chat: 4096 (4K default) instead of 8192 (8K max)
- deepseek-reasoner: 32768 (32K default) instead of 65536 (64K max)
- Updated tests to match new default values
- Updated description to clarify default vs max output tokens
* fix: use maximum output tokens for both DeepSeek models
- deepseek-chat: 8192 (8K max)
- deepseek-reasoner: 65536 (64K max)
- Updated tests to match maximum values
- Updated description to reflect 64K max output
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
* feat: enable grounding features for Vertex AI
- Add enableUrlContext and enableGrounding options to vertexSchema in provider-settings.ts
- Update Vertex.tsx UI component to include URL context and grounding checkboxes
- Add comprehensive tests for the new grounding features in Vertex.spec.tsx
- Reuse existing localization strings from Gemini provider
Fixes#6776
* fix: address review feedback - hide grounding features in welcome view and only show for Gemini models
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
* feat: add optional todos parameter to new_task tool with experimental setting (#6329)
- Add optional todos parameter to new_task tool for hierarchical task planning
- Implement experimental setting to optionally require todos parameter
- Add clean state-based UI rendering to avoid spurious messages
- Export and reuse parseMarkdownChecklist function
- Add comprehensive test coverage for both optional and required modes
- Maintain full backward compatibility (todos optional by default)
* fix: update new_task tool example to include todos parameter
- Updated the example in tool-use.ts to show the todos parameter
- This prevents AI confusion about whether todos is a valid parameter
- The example now demonstrates the complete tool usage pattern
* fix: make new_task tool definition dynamic based on experimental setting
- Tool description now changes based on newTaskRequireTodos setting
- When disabled: shows todos as (optional)
- When enabled: shows todos as (required) with no mention of configuration
- Added tests to verify dynamic behavior
- Ensures AI models get unambiguous instructions based on current settings
* fix: add translations for newTaskRequireTodos experimental setting
- Added translations for all 17 supported languages
- Ensures consistent UI experience across all locales
* test: update snapshots for new_task tool example with todos parameter
- Updated 13 snapshot files to reflect the new tool-use example
- All tests now pass with the updated example format
* Update src/core/tools/newTaskTool.ts
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* fix: address PR review comments
- Replace any[] with TodoItem[] type in ExtensionStateContext.tsx for better type safety
- Remove redundant initialTodos parameter from startTask call in Task.ts (todos already set in constructor)
- Improve code clarity in newTaskTool.ts by checking provider reference early and reusing state
# Conflicts:
# src/core/task/Task.ts
# webview-ui/src/context/ExtensionStateContext.tsx
* fix: revert order of operations in startTask to fix integration test timeout
The change in order of operations (calling say() before postStateToWebview()) was causing the XML content file test to timeout. Reverting to the original order fixes the issue.
* fix: hide todos parameter from new_task tool prompt when experiment is disabled
- Modified getNewTaskDescription to completely omit todos parameter when experiment is off
- Updated tests to verify todos parameter is not shown at all when disabled
- Ensures tool prompt remains unchanged when experimental setting is disabled
- Maintains backward compatibility while providing cleaner prompt interface
* fix: update snapshots for new_task tool todos parameter
- Updated snapshots in add-custom-instructions.spec.ts
- Updated snapshots in system-prompt.spec.ts
- All tests now passing with the new todos parameter documentation
* feat: move newTaskRequireTodos from experimental to VSCode settings
- Added newTaskRequireTodos as a VSCode configuration property in src/package.json
- Added description in src/package.nls.json
- Updated newTaskTool.ts to read from VSCode configuration instead of experiments
- Removed NEW_TASK_REQUIRE_TODOS from experimental settings in src/shared/experiments.ts
- Removed newTaskRequireTodos from packages/types/src/experiment.ts
- Updated tests to use VSCode configuration mocking instead of experiments
- Removed references from experiments test file
- Maintains backward compatibility (defaults to false)
* fix: make new_task tool description dynamically reflect VSCode setting
- Updated new-task.ts to check args.settings instead of args.experiments
- Added newTaskRequireTodos to SystemPromptSettings interface
- Pass newTaskRequireTodos setting through Task.ts and generateSystemPrompt.ts
- Updated all related tests to use settings instead of experiments
- Fixed TypeScript errors in test files by adding newTaskRequireTodos property
This ensures the tool description correctly shows todos parameter as required/optional
based on the VSCode setting value, fixing the issue where Roo would try to use
new_task without the todos parameter when it was required.
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Merge Resolver <merge-resolver@roo-code.com>
Co-authored-by: Roo Code <roomote@roocode.com>
- Show VSCode warning when users under MDM policy try to leave AccountView without auth
- Add showMdmAuthRequiredNotification message type to WebviewMessage interface
- Implement handler in webviewMessageHandler to display localized warning
- Add 'Your organization requires authentication' translation in all 17 languages
- Fix translation key path to use common:mdm.info.organization_requires_auth
* fix: handle null/undefined token values in ContextCondenseRow to prevent UI crash
- Added null/undefined checks for prevContextTokens, newContextTokens, and cost
- Default to 0 when values are null or undefined
- Added comprehensive test coverage for edge cases
- Fixes#6914
* Delete webview-ui/src/components/chat/__tests__/ContextCondenseRow.spec.tsx
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Daniel <57051444+daniel-lxs@users.noreply.github.com>
* feat: add "Installed" filter to Roo Marketplace
- Added installed boolean filter to ViewState interface
- Implemented UI checkbox for "Show installed only" filter
- Updated filterItems method to filter by installation status
- Added translation strings for the new filter
- Updated tests to include the new filter property
Fixes#7004
* fix: add missing translations for "Installed" filter in marketplace
- Added "filters.installed.label" and "filters.installed.description" keys
- Updated all backend marketplace.json files (src/i18n/locales/*/marketplace.json)
- Updated all frontend marketplace.json files (webview-ui/src/i18n/locales/*/marketplace.json)
- All translation checks now pass successfully
* fix: improve code quality for installed filter feature
- Replace plain HTML checkbox with UI library Checkbox component for consistency
- Add proper TypeScript typing for installedMetadata (MarketplaceInstalledMetadata)
- Optimize filterItems method to avoid unnecessary object copying
- Remove dead code for subcomponent filtering
* refactor: improve installed filter UI and functionality
- Replace checkbox with dropdown for better UX
- Place dropdown inline with search field for better layout
- Add three filter options: All Items, Installed Only, Not Installed
- Update filter logic to handle all three states
- Improve translation labels to clarify it's a filter
- Optimize filterItems method for better performance
- Add proper TypeScript types throughout
* fix: ensure both filter dropdowns have matching height
- Set both Select and Button components to h-7 for visual consistency
- Installation status dropdown and tags dropdown now have identical height
- Improved visual alignment for better UX
* chore: remove redundant useEffect in MarketplaceListView to prevent re-render loop; rely on state manager handleMessage sync
* i18n: update tri-state Installed filter translations across all locales
- Replace checkbox-based installed keys with dropdown keys:
{ label, all, installed, notInstalled }
- Updated both frontend and backend marketplace.json files for all non-English locales
- Ensures translation completeness for CI check
* i18n: change Installed option text to 'Installed' (remove 'Only') across all locales (frontend + backend)
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
* fix: omit temperature parameter when not explicitly set for OpenAI Compatible providers
- Modified OpenAiHandler to only include temperature when modelTemperature is defined
- Modified BaseOpenAiCompatibleProvider to only include temperature when modelTemperature is defined
- Added tests to verify temperature is omitted when undefined
- Updated existing tests to explicitly set temperature where needed
This allows backend services (LiteLLM, vLLM) to use their configured default temperatures
instead of being forced to use temperature=0 when "Use custom temperature" is unchecked.
Fixes#7187
* test: update tests to match new temperature handling behavior
- Remove temperature parameter expectations from provider tests
- Tests now expect temperature to be omitted when not explicitly set
- Aligns with PR #7188 changes to fix OpenAI Compatible provider behavior
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
* feat: enable loading Roo modes from multiple files in .roo/roo_modes directory
- Add support for loading modes from .roo/roo_modes directory (both global and project)
- Implement proper precedence: project .roo/roo_modes > .roomodes > global .roo/roo_modes > settings
- Update file watchers to monitor .roo/roo_modes directories
- Preserve original source file when updating modes
- Add comprehensive tests for the new functionality
Fixes#7202
* refactor: rename .roo/roo_modes to .roo/modes for cleaner directory structure
- Changed ROO_MODES_DIR constant from "roo_modes" to "modes"
- Updated all references in CustomModesManager.ts
- Updated all test descriptions and mocks in CustomModesManager.spec.ts
- All tests passing successfully
* fix: normalize sourceFile paths to use forward slashes in exported YAML
- Fixes Windows test failure where backslashes in sourceFile paths were causing test assertions to fail
- Ensures cross-platform compatibility by normalizing all paths to use forward slashes in YAML exports
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
Fixes first-time initialization issue with Z AI and Doubao providers
where the API keys were not recognized as valid secret keys, causing
the configuration to fail during initial setup.
Fixes#7082
Co-authored-by: Roo Code <roomote@roocode.com>
* fix: prevent duplicate LM Studio models with case-insensitive deduplication
- Keep both listDownloadedModels and listLoaded APIs to support JIT loading
- Implement case-insensitive deduplication to prevent duplicates
- When duplicates are found, prefer loaded model data for accurate runtime info
- Add test coverage for deduplication logic
- Addresses feedback about LM Studio's JIT Model Loading feature (v0.3.5+)
Fixes#6954
* fix: correct deduplication logic to prefer loaded models
- When a loaded model ID is found in any downloaded model key (case-insensitive)
- Remove the downloaded model and replace with the loaded model
- This ensures loaded models with runtime info take precedence
- Updated tests to verify the correct deduplication behavior
* fix: improve deduplication logic and add comprehensive test coverage
- Enhanced deduplication to use path segment matching instead of simple substring
- Prevents false positives like 'llama' matching 'codellama'
- Added comprehensive test cases for edge cases and multiple scenarios
- Maintains support for JIT Model Loading feature
* feat: add support for OpenAI gpt-5-chat-latest model
- Added gpt-5-chat-latest model configuration to openAiNativeModels
- Updated OpenAiNativeHandler to recognize gpt-5-chat-latest as a Responses API model
- Added comprehensive tests for the new model
- Model is optimized for conversational AI and non-reasoning tasks
Fixes#7057
* fix: remove redundant condition and unnecessary test file
- Remove redundant gpt-5-chat-latest check in isResponsesApiModel since startsWith('gpt-5') already covers it
- Remove unnecessary dedicated test file for gpt-5-chat-latest
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
* fix: add type check before calling .match() on diffItem.content
Fixes#6905 - Error during diff application "v.content.match is not a function"
- Added type check to ensure diffItem.content is a string before calling .match()
- Added comprehensive tests for handling non-string content values
- Prevents runtime errors when content is null, undefined, or other non-string types
* fix: validate content type earlier in diff parsing
- Move type check to where content is first extracted from XML
- Remove redundant check since content is now guaranteed to be string
- Add test for early content validation
* chore: remove comments
* fix: add TelemetryService mock to multiApplyDiffTool tests
* fix: add captureDiffApplicationError to TelemetryService mock
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
Co-authored-by: Daniel <57051444+daniel-lxs@users.noreply.github.com>
* fix: enable save button for provider dropdown and checkbox changes
The save button wasn't enabling when users changed provider settings like
dropdowns and checkboxes because setApiConfigurationField was treating all
changes from undefined to a defined value as 'initial sync' and not marking
the form as dirty.
Added an optional isUserAction parameter (defaults to true) to distinguish:
- User actions (should enable save button) - the default
- Automatic initialization (shouldn't enable save button) - pass false
This fixes the issue where changing provider dropdowns, checkboxes with
default values, and other settings wouldn't enable the save button.
* fix: remove incorrect isUserAction=false from apiModelId sync
The useEffect that syncs apiModelId with selectedModelId was incorrectly
passing isUserAction=false, which prevented the save button from enabling
when users selected a different model. Since this effect responds to all
selectedModelId changes (including user selections), it should use the
default isUserAction=true behavior.
* test: fix ThinkingBudget test to expect isUserAction parameter
The test now correctly expects setApiConfigurationField to be called
with three arguments including the isUserAction=false parameter for
automatic thinking token adjustments.
* fix: prevent XML entity decoding in diff tools
- Add parseXmlForDiff function with processEntities: false to preserve exact content
- Update multiApplyDiffTool to use parseXmlForDiff instead of parseXml
- Add comprehensive tests for entity handling in parseXmlForDiff
This fixes the issue where fast-xml-parser was decoding HTML entities like &
causing mismatches in diff tools when comparing against original file content.
Fixes#7107
* refactor: eliminate code duplication between parseXml and parseXmlForDiff
- Refactored parseXml to accept optional ParseXmlOptions parameter
- parseXmlForDiff now delegates to parseXml with processEntities: false
- Added explanatory comment in multiApplyDiffTool.ts about why parseXmlForDiff is used
- Improved JSDoc documentation with specific use cases for parseXmlForDiff
This maintains backward compatibility while eliminating code duplication.
parseXml continues to be used for general XML parsing (file reads, follow-up questions),
while parseXmlForDiff is specifically for diff operations where entity processing must be disabled.
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
Previously, when users initiated context condensing and switched to another task before completion, the 'condensing context' indicator would persist on the new task.
This fix ensures the condensing state is properly reset in the task switching effect, preventing the indicator from appearing incorrectly on different tasks.
- Removed array slicing logic that limited messages to 500
- This eliminates array index shifting that caused Virtuoso to lose scroll position
- Virtuoso is designed to efficiently handle large lists through virtualization
- Fixes the scrollbar jumping issue reported in #7063 and #7052
Co-authored-by: Roo Code <roomote@roocode.com>
Fixes#6756
When ripgrep encounters file access errors (e.g., permission denied), it would cause the search_files tool to return empty results. Adding the --no-messages flag suppresses these error messages while still showing pattern syntax errors, allowing the search to continue and return valid results from accessible files.
Co-authored-by: Roo Code <roomote@roocode.com>
* fix: make search_files path parameter optional and clarify tool descriptions
- Made path parameter optional in search_files tool (defaults to workspace root)
- Updated search_files description with clearer examples
- Improved codebase_search description to clarify when to use path parameter
- Updated test snapshots to reflect the changes
This addresses confusion where LLMs were unnecessarily specifying paths when searching from project root
* revert: remove search_files changes, keep only codebase_search improvements
- Reverted all changes to src/core/prompts/tools/search-files.ts
- Reverted all changes to src/core/tools/searchFilesTool.ts
- Updated test snapshots to reflect the reverted search_files tool
- Kept the codebase_search tool description improvements as intended
* Update codebase-search.ts
Simplify codebase_search tool documentation
- Condensed description to eliminate repetitive explanations about user wording
- Reduced from 2 examples to 1 comprehensive example showing optional path usage
- Streamlined parameter descriptions to remove redundancy
- Maintained all critical requirements (English queries, semantic search, path optionality)
- Reduced documentation size by ~40% while preserving clarity
* fix: add workspace directory context to codebase_search path parameter
- Added ToolArgs import and parameter to getCodebaseSearchDescription function
- Updated path parameter description to include '(relative to the current workspace directory ${args.cwd})'
- Updated index.ts to pass args to getCodebaseSearchDescription
- Maintains consistency with other tool descriptions like list_files and search_files
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Hannes Rudolph <hrudolph@gmail.com>
* fix: add explicit max_output_tokens for GPT-5 Responses API
- Added max_output_tokens parameter to GPT-5 request body using model.maxTokens
- This prevents GPT-5 from defaulting to very large token limits (e.g., 120k)
- Updated tests to expect max_output_tokens in GPT-5 request bodies
- Fixed test for handling unhandled stream events by properly mocking SDK fallback
* fix: add missing translations for reasoningEffort.minimal in Indonesian and Dutch locales
* fix: correct GPT-5 response ID persistence and usage
- Renamed metadata field from 'previous_response_id' to 'response_id' for clarity
- Fixed logic to correctly use the response_id from the previous message as previous_response_id for the next request
- This resolves the 'Previous response with id not found' errors that occurred after multiple turns in the same session
* feat: add robust error handling for GPT-5 previous_response_id failures
- Automatically retry without previous_response_id when it's not found (400 error)
- Clear stored lastResponseId to prevent reusing stale IDs
- Handle errors in both SDK and SSE fallback paths
- Log warnings when retrying to help with debugging
* fix: handle GPT-5 response ID race condition with nano model
- Add promise-based synchronization for response ID persistence
- Wait for pending response ID from previous request before using it
- Resolve promise when response ID is received or cleared
- Add 100ms timeout to avoid blocking too long on ID resolution
- Properly clean up resolver on errors to prevent memory leaks
This fixes the race condition where fast nano model responses could cause
the next request to be initiated before the response ID was fully persisted.
* fix: address PR review comments for GPT-5 implementation
- Extract usage normalization helper to reduce duplication
- Suppress conversation continuity for first message (but respect explicit metadata)
- Deduplicate response ID resolver logic
- Remove dead enableGpt5ReasoningSummary option references
- DRY up GPT-5 event/usage handling with normalizeGpt5Usage helper
- Centralize default GPT-5 reasoning effort using model info
- Fix Indonesian locale minimal string misplacement
- Add clarifying comments for Developer prefix usage
- Add TODO for future verbosity UI capability gating
- Fix failing test in reasoning.spec.ts
* fix(openai-native): address Roomote inline feedback\n\n- Delegate standard GPT-5 SSE event types to shared processor to reduce duplication\n- Add JSDoc for response ID accessors\n- Standardize key error messages for GPT-5 Responses API fallback\n- Extract persistGpt5Metadata() in Task to simplify metadata writes\n- Add malformed JSON SSE parsing test\n
* fix(openai-native,gpt5): correct usage cost calc (use calculateApiCostOpenAI incl. cache); enforce 'skip once' continuity via suppressPreviousResponseId; dedupe responseId resolver on SSE 400; feat: gate reasoning.summary by enableGpt5ReasoningSummary; centralize default reasoning effort; types/ui: add ModelInfo.supportsVerbosity and gate Verbosity UI by capability; refactor: avoid duplicate usage emission in SSE done/completed
* fix(gpt5): default enableGpt5ReasoningSummary=true to preserve tests and expected behavior
* fix(gpt5): canonicalize GPT-5 metadata key to previous_response_id and align enableGpt5ReasoningSummary default docs
* fix(openai-native): remove review artifact comments and guard GPT-5 in completePrompt
* Revert "fix: prevent unnecessary MCP server refresh on settings save (#6772) (#6779)"
This reverts commit 8d05bc179b.
* fix(mcp): Revert changes causing startup issues and temporarily disable notifications
- Reverted PR #6779 which prevented unnecessary MCP server refreshes but caused startup failures
- Temporarily disabled MCP notification popups as a stopgap solution
- Added TODO comments explaining the temporary nature of disabled notifications
- This allows MCP servers to function properly while a more robust solution is developed
* test(mcp): restore mcpEnabled toggle coverage to verify delegation to McpHub
* refactor(mcp): remove info notifications during refresh; rely on UI indicator
* feat: add GPT-5 model support
- Added GPT-5 models (gpt-5-2025-08-07, gpt-5-mini-2025-08-07, gpt-5-nano-2025-08-07)
- Added nectarine-alpha-new-reasoning-effort-2025-07-25 experimental model
- Set gpt-5-2025-08-07 as default OpenAI Native model
- Implemented GPT-5 specific handling with streaming and reasoning effort support
* fix: remove hardcoded temperature from GPT-5 handler
- Updated handleGPT5Message to use configurable temperature
- Now uses this.options.modelTemperature ?? OPENAI_NATIVE_DEFAULT_TEMPERATURE
- Maintains consistency with other model handlers
* feat: add reasoning effort support for all OpenAI models
* fix: update test to expect new default model gpt-5-2025-08-07
* feat: increase GPT-5 models context window to 400,000
- Updated context window from 256,000 to 400,000 for gpt-5-2025-08-07
- Updated context window from 256,000 to 400,000 for gpt-5-mini-2025-08-07
- Updated context window from 256,000 to 400,000 for gpt-5-nano-2025-08-07
- Updated context window from 256,000 to 400,000 for nectarine-alpha-new-reasoning-effort-2025-07-25
As requested by @daniel-lxs in PR #6819
* revert: remove GPT-5 models, keep only nectarine experimental model
- Removed gpt-5-2025-08-07, gpt-5-mini-2025-08-07, gpt-5-nano-2025-08-07
- Kept nectarine-alpha-new-reasoning-effort-2025-07-25 experimental model
- Reverted default model back to gpt-4o
- Updated tests and changeset accordingly
* feat: add GPT-5 models with updated context windows
- Added gpt-5-2025-08-07, gpt-5-mini-2025-08-07, gpt-5-nano-2025-08-07 models
- All GPT-5 models configured with 400,000 context window
- Updated nectarine model context window to 256,000
- All models configured with reasoning effort support
- Set gpt-5-2025-08-07 as default OpenAI Native model
- Added GPT-5 model handling in openai-native.ts
- Updated tests to reflect new default model
* fix: restore reasoning effort support for o1 series models
- Added supportsReasoningEffort: true to o1, o1-preview, and o1-mini models
- This restores the ability to use reasoning effort parameters with these models
- The existing code in openai-native.ts already handles reasoning effort correctly
* Revert "fix: restore reasoning effort support for o1 series models"
This reverts commit 7251237ae8.
* fix: restore reasoning effort support for o3 and o4 models
- Added supportsReasoningEffort: true to o3, o3-high, o3-low models
- Added supportsReasoningEffort: true to o4-mini, o4-mini-high, o4-mini-low models
- Added supportsReasoningEffort: true to o3-mini, o3-mini-high, o3-mini-low models
- These models have both supportsReasoningEffort and reasoningEffort properties
* Revert "fix: restore reasoning effort support for o3 and o4 models"
This reverts commit a75a2b8a69.
* fix: restore reasoning effort support for o3 and o4 models
- Added supportsReasoningEffort: true to o3, o3-high, o3-low models
- Added supportsReasoningEffort: true to o4-mini, o4-mini-high, o4-mini-low models
- Added supportsReasoningEffort: true to o3-mini, o3-mini-high, o3-mini-low models
* fix: adjust reasoning effort support for o3/o4 models
- Keep supportsReasoningEffort only for base o3, o4-mini, and o3-mini models
- Remove supportsReasoningEffort from -high and -low variants
- Position supportsReasoningEffort right before reasoningEffort property
* fix: remove nectarine experimental model
- Removed nectarine-alpha-new-reasoning-effort-2025-07-25 from openai.ts
- Removed nectarine handling from openai-native.ts (renamed to handleGpt5Message)
- Removed associated changeset file
- Keep GPT-5 models with developer role handling
* feat: implement full GPT-5 support with verbosity and minimal reasoning
- Add all three GPT-5 models with accurate pricing (.25/0 for gpt-5, /bin/sh.25/ for mini, /bin/sh.05//bin/sh.40 for nano)
- Implement verbosity control (low/medium/high) that passes through to API
- Add minimal reasoning effort support for fastest response times
- GPT-5 models use developer role instead of system role
- Set gpt-5-2025-08-07 as default OpenAI Native model
- Add Responses API infrastructure for future migration
- Update tests to verify all GPT-5 features
- All 27 tests passing
Note: UI controls for verbosity still need to be added in a follow-up PR
* feat: add verbosity setting for GPT-5 models
- Add VerbosityLevel type definition to model types
- Add verbosity field to ProviderSettings schema
- Create Verbosity UI component for settings
- Add verbosity labels to all localization files
- Integrate verbosity handling in model parameters transformation
- Update OpenAI native handler to support verbosity for GPT-5
- Add comprehensive tests for verbosity setting
- Update existing GPT-5 tests to use verbosity from settings
* Delete .roorules
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: hannesrudolph <hrudolph@gmail.com>
Co-authored-by: Daniel Riccio <ricciodaniel98@gmail.com>
Co-authored-by: Daniel <57051444+daniel-lxs@users.noreply.github.com>
* fix: add missing MCP error translation keys
- Added refresh_after_disable translation key
- Added refresh_after_enable translation key
- Added disconnect_servers_partial translation key
- Updated all 18 locale files with the missing keys
- Fixes the "errors.refresh_after_disable" display issue in MCP server management
* fix: remove fallback English strings from MCP error translations
As requested by @mrubens, removed the || operator and fallback English strings from:
- t("mcp:errors.disconnect_servers_partial")
- t("mcp:errors.refresh_after_disable")
- t("mcp:errors.refresh_after_enable")
The translation system will now rely solely on the localized strings without fallbacks.
* fix: translate MCP error messages to all locales
- Translated "refresh_after_disable" error message
- Translated "refresh_after_enable" error message
- Translated "disconnect_servers_partial" error message with count placeholder
- All 17 non-English locales now have proper translations instead of English text
---------
Co-authored-by: Roo Code <roomote@roocode.com>
* feat: add GLM-4.5 and OpenAI gpt-oss models to Fireworks provider
- Added GLM-4.5 (355B/32B active) and GLM-4.5-Air (106B/12B active) models from Z.ai
- Added gpt-oss-20b and gpt-oss-120b models from OpenAI
- All models configured with 128K context window
- Added comprehensive test coverage for all new models
Fixes#6753
* fix: update GLM-4.5 model IDs to use p instead of hyphen
- Changed glm-4-5 to glm-4p5
- Changed glm-4-5-air to glm-4p5-air
- Updated corresponding test cases
---------
Co-authored-by: Roo Code <roomote@roocode.com>
* feat: focus chat input when clicking plus button in extension menu
- Added focusInput action after chatButtonClicked in plusButtonClicked handler
- This ensures the text area in ChatView gets focused when users click the + button
- Improves user experience by allowing immediate typing after creating new chat
* fix: replace unreliable setTimeout with sequential message passing
- Removed setTimeout with hardcoded 100ms delay
- Now sending focusInput action immediately after chatButtonClicked
- This ensures proper sequencing without arbitrary timing delays
- More reliable approach that doesn't depend on timing assumptions
---------
Co-authored-by: Roo Code <roomote@roocode.com>
* fix: handle current directory path "." correctly in codebase_search tool
- Fix path filtering logic in QdrantVectorStore.search() to properly handle current directory representations
- When directoryPrefix is ".", "./", "", or similar, set filter to undefined to search entire workspace
- Add comprehensive tests covering various current directory path formats including cross-platform support
- Resolves issue where codebase_search with path="." returned no results
Fixes#6514
* fix: normalize directory prefix handling in Qdrant vector store
* fix: normalize paths starting with './' and fix OS-dependency issue
- Use forward slash for splitting after toPosix() conversion
- Remove leading './' from paths like './src' to normalize them to 'src'
- Update test expectations to match correct behavior
* refactor: use path.posix.normalize instead of custom toPosix method
- Replaced directoryPrefix.toPosix() with path.posix.normalize()
- Added proper handling of backslashes before normalization
- Updated test mock to include posix.normalize method
- All tests passing (381 tests in code-index service)
* refactor: address review comments - improve path normalization
- Keep check for './' after normalization as path.posix.normalize('./') returns './'
- Use actual Node.js path.posix implementation in tests instead of custom mock
- Apply path.posix.normalize to cleanedPrefix for consistency
All 381 code-index tests pass
* fix: apply path.posix.normalize when cleaning prefix to avoid redundant normalization
Addresses review comment from @mrubens to normalize the path at line 385 instead of normalizing twice
* fix: correct current directory detection logic
The issue was that the condition checked for an empty string after normalization,
but path.posix.normalize('') actually returns '.', not ''. This caused the
current directory check to fail when an empty string was passed.
Removed the redundant empty string check since normalize('') returns '.' which
is already handled by the first condition.
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Daniel Riccio <ricciodaniel98@gmail.com>
Co-authored-by: hannesrudolph <hrudolph@gmail.com>
* fix: recover from error state when Qdrant becomes available
- Add recoverFromError method to CodeIndexManager to clear error state and reset internal services
- Update startIndexing handler to check for error state and recover before initialization
- Add comprehensive tests for error recovery functionality
Fixes#6660
* fix: address PR review comments for code indexing error recovery
- Add race condition protection for multiple rapid clicks on Start Indexing button
- Add error handling for setSystemState in recoverFromError method
- Enhance JSDoc documentation for recoverFromError method
- Add test cases for recoverFromError idempotency and error handling
* refactor: move error recovery logic into startIndexing method
- Moved error recovery from webviewMessageHandler into CodeIndexManager.startIndexing()
- This ensures error recovery happens whenever indexing is started, not just from UI
- Added race condition prevention flag within CodeIndexManager
- Simplified webviewMessageHandler by removing error state checking
- The startIndexing method now automatically recovers from error state before proceeding
* fix: remove await from startIndexing calls and update JSDoc
- startIndexing should never be awaited as it's a long-running background process
- Added JSDoc warning to never await this method
- Updated webviewMessageHandler to not await startIndexing calls
* fix: use platform-agnostic paths in code-index manager tests for Windows compatibility
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Daniel Riccio <ricciodaniel98@gmail.com>
* Reorganizes the task header for cleanliness and in preparation for Cloud link
* More task ehader visual tweaks
* Translations for new task header
* Fixes TaskHeader color
* Removes stray string
* Fixes tests
* Iterates on visual details
* More visual tweaks
* Missing localization call
* Fixes tests
---------
Co-authored-by: Bruno Bergher <me@brunobergher.comexport>
* feat: Implement code indexing support multi-folder workspaces similar to task history
* fix: add missing mock for onDidChangeActiveTextEditor in tests
* fix: prevent MCP server creation when setting is disabled
- Modified getFetchInstructionsDescription to conditionally include create_mcp_server task
- Updated getToolDescriptionsForMode to pass enableMcpServerCreation parameter
- Added tests to verify the conditional behavior
- Updated snapshot test to reflect the new expected behavior
Fixes#6607
* fix: address review comments - add JSDoc, null test, and clarify default behavior
---------
Co-authored-by: Roo Code <roomote@roocode.com>
* fix: prevent empty mode names from being saved (fixes#5766)
- Add frontend validation in ModesView to prevent empty names from being saved
- Add onBlur handler to restore original name if field is left empty
- Add backend validation in CustomModesManager.updateCustomMode using modeConfigSchema
- Provide user feedback when validation fails
- Trim whitespace from mode names before validation
This prevents YAML parsing errors caused by empty mode name fields.
* fix: improve UX by allowing users to empty mode name field
- Remove restriction that prevented users from emptying the name field
- Remove onBlur handler that automatically restored original name
- Allow backend validation to handle empty names and show appropriate errors
- Users can now type freely but invalid saves are prevented by backend validation
Addresses feedback from @daniel-lxs in PR #5767
* fix: allow emptying mode name field but prevent saving when invalid
- Modified onBlur handler to check if name is empty before saving
- If empty, revert to original name instead of saving empty value
- This provides better UX as requested in PR review
* fix: add proper JSON formatting to source map writes for Windows compatibility
---------
Co-authored-by: Roo Code <roomote@roocode.com>
* feat: Before requesting, ensure checkpoint is initialized
* Generate a checkpoint before modifying the code
* refactor: streamline checkpoint handling and enhance getCheckpoints method
* Blocked waiting for checkpoint initialization timing to change
* cancel checkpoint restore limit
* fix: ensure checkpoint service is undefined on initialization error and improve checkpoint diff handling
* refactor: simplify checkpoint service initialization and cleanup unused variables in CheckpointMenu
* fix: prevent race condition in checkpoint service initialization
- Only assign service to cline.checkpointService after successful initialization
- Add proper cleanup on initialization failure
- Prevents service from being in inconsistent state if Git check fails
* fix: remove checkpoint save from presentAssistantMessage for update_todo_list case
---------
Co-authored-by: Daniel Riccio <ricciodaniel98@gmail.com>
* feat: conditionally include reminder section based on todo list configuration
* feat: add tests for REMINDERS section based on todoListEnabled configuration
Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
Co-authored-by: Daniel <57051444+daniel-lxs@users.noreply.github.com>
Co-authored-by: Daniel Riccio <ricciodaniel98@gmail.com>
* feat: add symlink support for AGENTS.md file loading
- Add safeReadFileFollowingSymlinks function to handle symlink resolution
- Update loadAgentRulesFile to use the new symlink-aware function
- Add comprehensive tests for both symlink and regular file scenarios
- Ensures AGENTS.md can be a symlink pointing to actual rules file
* refactor: use existing symlink resolution pattern for AGENTS.md
- Extracted resolveSymlinkPath function to handle symlink resolution
- Removed duplicate safeReadFileFollowingSymlinks function
- Updated loadAgentRulesFile to use resolveSymlinkPath + safeReadFile
- Updated tests to match new implementation
- Maintains same functionality while reusing existing patterns
* fix: simplify symlink resolution for AGENTS.md to fix Windows compatibility
- Remove duplicate resolveSymlinkPath function as suggested by @mrubens
- Use simpler inline symlink resolution in loadAgentRulesFile
- Update tests to match simplified implementation
- This should fix the failing Windows unit tests while maintaining functionality
* refactor: use existing resolveSymLink function for AGENTS.md symlink support
- Remove duplicate inline symlink resolution logic
- Reuse existing resolveSymLink function with MAX_DEPTH protection
- Adapt loadAgentRulesFile to work with resolveSymLink's fileInfo interface
- Fix test to properly mock fs.stat for resolved symlink targets
- All tests pass (36/36)
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Daniel Riccio <ricciodaniel98@gmail.com>
- Update mammoth from ^1.8.0 to ^1.9.1
- Add pnpm override to force bluebird >=3.7.2 (was 3.4.7)
- Fixes PendingMigrationError: navigator is now a global in nodejs
- Resolves extension crashes in VS Code nightly builds
Fixes#6356
Co-authored-by: Roo Code <roomote@roocode.com>
- Added organizationSettingsVersion to ExtensionState type
- Modified ClineProvider to include version in state sent to webview
- Updated CloudService callback to trigger marketplace refresh on settings change
- Added logic to MarketplaceView to detect version changes and request data refresh
- Added comprehensive tests for the new functionality
This ensures marketplace items (MCPs and modes) stay in sync when organization settings are updated in the cloud.
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: John Richmond <5629+jr@users.noreply.github.com>
feat: remove "(prev Roo Cline)" from extension title in all languages
- Updated all package.nls.*.json files to remove "(prev Roo Cline)" references from extension display names
- Updated all localized README.md files to remove "(prev Roo Cline)" references from titles
- Updated main README.md to remove "(prev Roo Cline)" reference from title
- Affects 18 language files and 18 README files across all supported locales
Co-authored-by: Roo Code <roomote@roocode.com>
feat: increase Claude Code default max output tokens from 8k to 16k
- Changed CLAUDE_CODE_DEFAULT_MAX_OUTPUT_TOKENS from 8000 to 16000
- Users can still lower it to 8k via environment variable if needed
- Addresses issue #6125 regarding output token limits
Co-authored-by: Roo Code <roomote@roocode.com>
- Add todo list initialization and tracking throughout the review workflow
- Replace all MCP GitHub server calls with gh CLI commands
- Fix duplicate step numbering issue
- Update best practices and common mistakes documentation
- Add notes about GitHub CLI limitations for inline comments
* feat: add prompt caching support for LiteLLM (#5791)
- Add litellmUsePromptCache configuration option to provider settings
- Implement cache control headers in LiteLLM handler when enabled
- Add UI checkbox for enabling prompt caching (only shown for supported models)
- Track cache read/write tokens in usage data
- Add comprehensive test for prompt caching functionality
- Reuse existing translation keys for consistency across languages
This allows LiteLLM users to benefit from prompt caching with supported models
like Claude 3.7, reducing costs and improving response times.
* fix: improve LiteLLM prompt caching to work for multi-turn conversations
- Convert system message to structured format with cache_control
- Handle both string and array content types for user messages
- Apply cache_control to content items, not just message level
- Update tests to match new message structure
This ensures prompt caching works correctly for all messages in a conversation,
not just the initial system prompt and first user message.
* fix: resolve TypeScript linter error for cache_control property
Use type assertion to handle cache_control property that's not in OpenAI types
* feat: Adding more settings and control over Gemini
- with topP, topK, maxOutputTokens
- allow users to enable URL context and Grounding Research
* feat: Adding parameter titles and descriptions + translation to all languages
* feat: adding more translations
* feat: adding `contextLimit` implementation from `maxContextWindow` PR + working with profile-specific thresholding
* feat: max value for context limit to model's limit + converting description and titles to settings for translation purposes
* feat: all languages translated
* feat: changing profile-specific threshold in context management setting will also change in Gemini context management
- sync between Context Management Settting <-> Gemini Context Management with regards to thresholding
* feat: max value of maxOutputTokens is model's maxTokens + adding more tests
* feat: improve unit tests and adding `data-testid` to slider and checkbox components
* fix: small changes in geminiContextManagement descriptions + minor fix
* fix: Switching from "Gemini Context Management" to "Token Management
- better naming and correct purpose
* fix: input field showed NaN -> annoying UX
* fix: Removing redundant "tokens" after the "set context limit"'s checkbox + removing the lengthy description
* fix: Changing the translation to be consistent with the english one
* fix: more translations
* fix: translations
* fix: removing contextLimit and token management related code
- due to the decision in: https://github.com/RooCodeInc/Roo-Code/issues/3717
* fix: removing `contextLimit` test and removing token management in translations
* fix: changing from `Advanced Features` to `Tools` to be consistent with Gemini docs/AI studio
* fix: adding `try-catch` block for `generateContentStream`
* feat: Include citations + improved type safety
* feat: adding citation for streams (generateContextStream)
* fix: set default values for `topP`, `topK` and `maxOutputTokens`
* fix: changing UI/UX according to the review/feedback from `daniel-lxs`
* fix: updating the `Gemini.spec.tsx` unit test
- testing when it is hidden
- testing when users click on the collapsible trigger and model configuration appears
* fix: more changes from the feedback/review from `daniel-lxs`
* fix: adding sources at the end of the stream to preserve
* fix: change the description for grounding with google search and url context
* fix: adding translations
* fix: removing redundant extra translations - a mistake made by the agent
* fix: remove duplicate translation keys in geminiSections and geminiParameters
- Fixed duplicate keys in 13 localization files (es, fr, hi, id, it, ja, ko, nl, pl, pt-BR, ru, tr, vi)
- Removed second occurrence of geminiSections and geminiParameters keys
- Kept first occurrence which contains more comprehensive descriptions
- All JSON files validated for syntax correctness
- Translation completeness verified with missing translations script
Resolves duplicate key issue identified in PR #4895
* fix: delete topK, topP and maxOutputTokens from Gemini
* fix: deleting topK, topP and maxOutputTokens from translations/locales
* fix: adjust spacing between labels and descriptions + sentence casing
* fix: adding maxOutputTokens back and removing unknown type
* fix: internalizing error Gemini error message
* fix: updating tests in Gemini and Vertex to adjust to the new error logging
* fix: address PR review feedback for Gemini tools feature
- Fix Hindi translation grammatical error in settings.json
- Internationalize 'Sources:' string and error messages in gemini.ts
- Add comprehensive error scenario tests to gemini-handler.spec.ts
- Remove unused currentModelId prop from Gemini component
- Update all locale files with new translation keys
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>
Co-authored-by: Daniel Riccio <ricciodaniel98@gmail.com>
* feat: Add support for message queueing
* fix: address PR review feedback for message queueing feature
- Restore original ChatView tests from main branch
- Fix broken test by updating ChatTextArea mock
- Add comprehensive tests for message queueing (simplified due to mocking constraints)
- Fix race condition using useRef and setTimeout in queue processing
- Extract QueuedMessage interface to shared types.ts file
- Replace inline styles with Tailwind classes in QueuedMessages
- Add i18n support for 'Queued Messages:' text
- Add keyboard navigation for removing queued messages
- Add JSDoc for fromQueue parameter in handleSendMessage
* refactor: move QueuedMessage interface to packages/types
- Move QueuedMessage interface from local types.ts to packages/types/src/message.ts
- Update imports in ChatView.tsx and QueuedMessages.tsx to use @roo-code/types
- Remove local types.ts file to follow codebase conventions
* fix: add id field when creating queued messages
- Generate unique id using timestamp when adding messages to queue
- Fixes TypeScript error after moving QueuedMessage interface
* Stop disabling sending
* Translations
* Fix tests
* Improved styling
* Remove unused string
* Test cleanup
* fix: address message queueing issues
- Fix race condition in queue processing by re-checking queue state inside setTimeout
- Add error handling for queue operations with retry mechanism
- Replace array index with stable message.id for React keys in QueuedMessages
- Generate more unique IDs using timestamp + random component
* feat: add inline editing for queued messages
- Add ability to edit queued messages by clicking on them
- Support Enter to save and Escape to cancel edits
- Add textarea that auto-resizes based on content
- Add hover effect to indicate messages are editable
- Add translation for click to edit tooltip
* feat: add scrollbar and fix height for queued messages
- Add max-height of 300px with scrollbar to queue container
- Add flex-shrink-0 to prevent message items from being squished
- Ensure consistent height for message items when multiple messages are queued
* feat: add translations for queued message edit tooltip
- Add 'queuedMessages.clickToEdit' translation key to all 18 language files
- Provides localized tooltip text for the click-to-edit functionality
* fix: improve message queue processing reliability
- Fix race condition by removing nested setState and setTimeout
- Add retry limit (3 attempts) to prevent infinite loops
- Add proper cleanup on component unmount
- Clear queue when starting new task
- Prevent queue processing during API errors
- Fix ESLint warnings for React hooks dependencies
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Daniel Riccio <ricciodaniel98@gmail.com>
Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>
* feat: add Issue Fixer Orchestrator mode
* The `list_files` tool with `recursive: true` was returning empty results when targeting directories that start with a dot (e.g., `.roo-memory`). This happened because the recursive mode was applying a blanket exclusion pattern `!**/.*//**` that excluded all files inside any hidden directory, even when the user explicitly requested to list that directory.
- `src/services/glob/list-files.ts`
- **Modified `buildRecursiveArgs()`**: Removed the problematic `!**/.*//**` exclusion pattern for hidden directories in recursive mode
- **Enhanced `listFilteredDirectories()`**: Added `isTargetDir` parameter to distinguish between explicitly targeted directories and discovered subdirectories
- **Updated `shouldIncludeDirectory()`**: Always include explicitly targeted directories (even if hidden), while still applying ignore rules to subdirectories found during traversal
- **Before**: `list_files` with `path: ".roo-memory"` and `recursive: true` → Empty results
- **After**: `list_files` with `path: ".roo-memory"` and `recursive: true` → Returns directory contents
- **Preserved**: Hidden subdirectories discovered during traversal are still filtered out
This maintains consistency with `.gitignore` and `.rooignore` mechanisms while ensuring explicitly targeted directories are always processed.
Fixes#2992
* Update src/services/glob/list-files.ts
Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
* fix: list_files recursive mode now works correctly for hidden directories
- Fixed ripgrep exclusion pattern from `!**/.*//**` to `!**/.*/**`
- Hidden directories (like .git/) now appear in recursive listings but their contents are excluded
- Contents of hidden directories are only shown when explicitly targeting that directory
- Prevents context window overflow from massive hidden directories like .git/
- Maintains consistent behavior: show directory exists, avoid flooding with contents
Fixes#2992
* fix(glob): show top-level hidden directories in list_files
- Modified list-files.ts to show hidden directories at top level
- Added test coverage for hidden directory visibility behavior
- Maintains existing functionality while fixing the .roo directory issue
Addresses PR #5176 feedback with simplified implementation
* fix(glob): include top-level files when recursively listing ignored directories
- Fix issue where files at root level of directories in DIRS_TO_IGNORE were excluded
- Add explicit include patterns (* and **/*) when targeting ignored directories
- Modify exclusion pattern to use !*/dir/** instead of !**/dir/** for target directory
- Add comprehensive test case for .roo/temp scenario
Fixes#5176
* fix(list-files): improve handling of explicitly targeted ignored directories
- Fixed issue where recursive listing would skip files in explicitly targeted directories that are in DIRS_TO_IGNORE
- When targeting a directory like 'temp' that's in the ignore list, we now skip adding exclusion patterns for it
- This ensures all files in the target directory are listed while still preventing recursion into nested directories with the same ignored name
- Also fixed path resolution to convert relative paths from ripgrep to absolute paths
* fix(tests): add missing mocks for list-files tests
* refactor: improve list-files implementation
- Remove redundant path resolution in listFilesWithRipgrep
- Convert CRITICAL_IGNORE_PATTERNS to Set for better performance
- Standardize error message format across all console.warn calls
* fix: update tests to handle cross-platform path resolution
---------
Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
Co-authored-by: Daniel Riccio <ricciodaniel98@gmail.com>
- Replace broken command URI with onClick handler that posts message
- Command URIs don't work in webview context, must use postMessage
- Restores original working implementation from PR #5798
- Directs to autoApprove section where command permissions are configured
The bug was introduced in commit 77bc9e6f when the tooltip was updated
to use command URI instead of the working onClick pattern.
refactor: move HuggingFace models API to providers/fetchers
- Moved getHuggingFaceModels functionality from src/api/huggingface-models.ts to src/api/providers/fetchers/huggingface.ts
- Added getHuggingFaceModelsWithMetadata function to maintain the same API interface
- Updated import in webviewMessageHandler.ts to use the new location
- Deleted the now redundant src/api/huggingface-models.ts file
This consolidates all HuggingFace-related API logic into a single location within the providers/fetchers directory structure.
* fix: add error message when no workspace folder is open for code indexing
- Add 'Indexing requires an open workspace folder' error message in orchestrator.ts
- Replace hardcoded error string with translatable message using i18n
- Add translations for the error message in all 18 supported languages
- Ensures proper error handling when users attempt code indexing without a workspace
* fix: add workspace folder checks for code indexing operations
- Add null checks for codeIndexManager in webviewMessageHandler
- Show translated error message when no workspace folder is open
- Prevents crashes when users try to use indexing features without a workspace
- Uses existing translation key from orchestrator
* Update src/i18n/locales/ca/embeddings.json
Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
---------
Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
* add more details
* format details better
* fix tests
* fix: address PR #6190 review feedback
- Move huggingface-models.ts to src/api/providers/fetchers/huggingface.ts
- Remove 'any' types and add proper TypeScript interfaces
- Add missing i18n keys and translations for all languages
- Replace magic numbers with named constants
- Add JSDoc documentation for HuggingFaceModel interface
- Improve error handling in API endpoint
- Update model capabilities display to match other providers
- Remove tool calling display (not used)
- Add comprehensive test coverage for new UI features
* fix: preserve HuggingFace provider details in model response
- Store raw HuggingFace models in cache to preserve provider information
- Export getCachedRawHuggingFaceModels to retrieve full model data
- Update huggingface-models.ts to return cached raw models when available
- Include provider name in model descriptions
- Always add provider-specific variants to show all available providers
- Remove console.log statements from fetcher
---------
Co-authored-by: Daniel Riccio <ricciodaniel98@gmail.com>
fix: add Hugging Face API key to SECRET_STATE_KEYS and fix validation
- Added huggingFaceApiKey to SECRET_STATE_KEYS array to ensure it's properly handled as a secret
- Fixed validateModelsAndKeysProvided to check for huggingFaceModelId when validating Hugging Face provider
- This fixes the issue where the welcome view wouldn't transition to chat view after configuring Hugging Face
* feat: add Issue Fixer Orchestrator mode
* fix: persist logo theme state on page navigation and refresh
- Add mounted state to prevent hydration mismatch
- Use theme as fallback when resolvedTheme is not available
- Ensure logo matches the persisted theme on initial page load
Fixes issue where logo would revert to dark version after page refresh
even when light theme was selected
* basic hugging face provider
* fetch hf models and providers
* save provider to config
* Update translations
---------
Co-authored-by: Thomas G. Lopes <26071571+TGlide@users.noreply.github.com>
* docs: clarify when to use update_todo_list tool
Added 'complicated' to the condition for when to use the update_todo_list tool,
making it clearer that the tool should be used for tasks that are either
complicated OR involve multiple steps.
* fix: update vscode mock and snapshots for update_todo_list tool changes
- Add missing RelativePattern export to vscode mock
- Fix onDidChangeWorkspaceFolders function in workspace mock
- Update test snapshots to reflect new "complicated" text in update_todo_list tool documentation
- Build tree-sitter WASM files to fix parsing tests
Fixes failing CI tests related to PR #5926 documentation changes.
* Delete package-lock.json
* revert: remove unrelated changes to src/__mocks__/vscode.js
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Daniel <57051444+daniel-lxs@users.noreply.github.com>
* feat: add jump icon for newly created files
- Add jump icon to newFileCreated tool case in ChatRow.tsx
- Matches existing pattern from readFile case for consistent UX
- Allows users to quickly open newly created files
- Fixes issue #5736
* fix: remove duplicate file path display in newFileCreated case
- Removed redundant ToolUseBlock that was showing file path twice
- Added onJumpToFile prop to CodeAccordian component to support jump icon
- Jump icon now appears in CodeAccordian header for newFileCreated files
- Maintains consistent UX with existing file operations while avoiding duplication
Fixes feedback from @daniel-lxs about duplicate elements being shown
* fix: address PR feedback for jump icon on new files
- Fix openFile message to use correct path format with './' prefix
- Remove duplicate chevron icon when jump icon is present
- Add aria-label for accessibility
- Fix styling: use mr-1 to match progressStatus icon
- Remove redundant margin style from jump icon
---------
Co-authored-by: Roo Code <roo@roocode.com>
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Daniel Riccio <ricciodaniel98@gmail.com>
InvalidClientTokenError indicates an unrecoverable state for
the session, so we need to be more exact about triggering it. A recent
Clerk outage resulted in a lot of 429 responses which should really cause
inactive-session, not a full clear to logged-out.
* fix: sort symlinked rules files alphabetically
- Add alphabetical sorting to readTextFilesFromDirectory function
- Sort by basename of filename (case-insensitive) for consistent order
- Fixes issue where symlinked rules were read in random order
- Add test case to verify alphabetical sorting behavior
Fixes#4131
* chore: remove solution-indicating comment per PR feedback
* fix: sort symlinks by their symlink names, not target names
- Modified readTextFilesFromDirectory to store both original symlink path and resolved target path
- Updated resolveDirectoryEntry and resolveSymLink to track both paths
- Sort files by original path (symlink name) but read content from resolved path
- Added test to verify symlinks are sorted by their names, not their target names
- This ensures consistent alphabetical ordering when using symlinks in rules directories
---------
Co-authored-by: Roo Code <roomote@roocode.com>
When running vitest without the run parameter, it enters watch mode and waits for user input (like pressing q to quit), causing tests to hang in the terminal.
This change updates the documentation to specify using npx vitest run instead of just npx vitest to ensure tests run to completion without requiring user interaction.
Signed-off-by: Eric Wheeler <roo-code@z.ewheeler.org>
Co-authored-by: Eric Wheeler <roo-code@z.ewheeler.org>
* feat: auto-omit MCP content when no servers are configured
- Modify system prompt generation to detect when no MCP servers are defined
- Only include MCP sections when mode has mcp group AND servers exist
- Pass undefined mcpHub to capabilities and tools when no servers available
- Reduces system prompt verbosity when MCP functionality is not in use
* fix: add missing Uri and RelativePattern exports to VSCode mocks
- Added Uri and RelativePattern exports to global VSCode mock in __mocks__/vscode.js
- Fixed McpHub.spec.ts VSCode mock to include Uri and RelativePattern
- Fixed Task.spec.ts VSCode mock to include Uri and RelativePattern with proper TypeScript typing
- Resolves unhandled rejection errors in unit tests caused by missing VSCode API mocks
* fix: add proper TypeScript typing for RelativePattern in McpHub test mock
* fix: resolve unit test failures in PR #5889
- Fix VSCode mock onDidChangeWorkspaceFolders to accept callback parameter
- Update MCP test mocks to properly test auto-omit functionality
- Update test snapshots to reflect new MCP content omission behavior
- All core functionality tests now passing
* chore: remove package-lock.json as project uses npm
* fix: remove unrelated mock changes from PR
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Daniel Riccio <ricciodaniel98@gmail.com>
* feat: add configurable timeout for evals (5-10 min)
- Add timeout field to CreateRun schema with min 5, max 10, default 5
- Add timeout slider UI component to /runs/new page
- Update database schema to include timeout column in runs table
- Create migration to add timeout column with default value of 5
- Update runTask.ts to use configurable timeout from run settings
- Pass timeout parameter through the createRun action
* fix: remove unused EVALS_TIMEOUT import
* fix: add timeout field to createRun calls in copyRun test
- Added timeout: 5 to both createRun calls in copyRun.spec.ts
- This fixes the test failure caused by the new required timeout field in the runs schema
- The timeout field was added in the configurable timeout feature but the test was not updated
* fix: use configurable timeout for Redis key expiration in registerRunner
- Updated registerRunner function to accept timeoutSeconds parameter
- Modified call in runTask.ts to pass configurable timeout instead of hardcoded EVALS_TIMEOUT
- Removed unused EVALS_TIMEOUT import from redis.ts
- Ensures Redis keys remain valid for the entire duration of task execution (up to 10 minutes)
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: hannesrudolph <hrudolph@gmail.com>
* feat: add Issue Fixer Orchestrator mode
* fix: allow export task history while API is active (#5324)
- Add exportAlwaysEnabled prop to TaskActions component
- Export button remains enabled when exportAlwaysEnabled is true
- Other action buttons still respect buttonsDisabled state
- Add tests to verify the new behavior
This fixes the regression where users couldn't export task history
during API operations, which is a common debugging workflow.
* fix: simplify export button to always be enabled
The export functionality is not impacted by the model streaming state,
so the button should always be enabled. Removed the unnecessary
exportAlwaysEnabled prop and simplified the implementation.
- Remove exportAlwaysEnabled prop from TaskActions
- Remove disabled attribute from export button entirely
- Update TaskHeader to remove exportAlwaysEnabled prop usage
- Update tests to reflect that export is always enabled
* fix: enable export, share, and copy buttons during API operations
- Export, share, and copy buttons now remain enabled when API is active
- Delete button still respects buttonsDisabled state for safety
- Removed unnecessary exportAlwaysEnabled prop
- Updated tests to reflect new behavior
---------
Co-authored-by: Daniel Riccio <ricciodaniel98@gmail.com>
* fix: add character limit to prevent terminal output context explosion
- Enhanced truncateOutput function to accept character limits alongside line limits
- Character limits take priority over line limits to prevent context window explosion
- Added terminalOutputCharacterLimit setting (default: 100,000 characters)
- Updated all terminal output processing to use both limits
- Added comprehensive tests for character limit functionality
Fixes#5775
* feat: add terminal output character limit setting to UI
- Add character limit slider to Terminal Settings UI (default: 50,000)
- Update ExtensionStateContext to manage character limit state
- Add validation for positive character limit values
- Add English translation and translations for all 17 supported languages
- Connect UI to backend through proper message handling
- Character limit takes precedence over line limit to prevent memory issues
* fix: update test expectations for character limit edge cases
- Fix multi-byte character test to account for JavaScript's string length behavior
- Fix newline content test to match actual slice behavior
- Tests now correctly validate the truncateOutput function's character limit handling
---------
Co-authored-by: Roo Code <roomote@roocode.com>
Co-authored-by: Daniel Riccio <ricciodaniel98@gmail.com>
* feat: add Mistral embedding provider with OpenAI Compatible Wrapper
- Implement MistralEmbedder class using OpenAI-compatible API
- Add comprehensive unit tests with 100% coverage
- Update type definitions for Mistral provider support
- Integrate Mistral option in UI components and configuration
- Add internationalization support for Mistral provider
- Fix API key storage and retrieval for embedding providers
- Update service factory to support Mistral embeddings
- Add proper error handling and validation
This implementation allows users to use Mistral's embedding models
through the existing OpenAI-compatible wrapper approach, providing
a seamless integration experience.
* feat: add Mistral embedding provider support
- Implement MistralEmbedder class with API integration
- Add Mistral models to embedding model configurations
- Update UI to include Mistral provider option
- Add comprehensive unit tests for Mistral embedder
- Update type definitions and interfaces
- Add internationalization support for Mistral provider
* fix: add missing translations for Mistral embedding provider
* fix: address PR review feedback - improve translations and add clarifying comment
feat: add batch limiting to code indexer to control memory usage
- Add MAX_PENDING_BATCHES constant (20) to limit concurrent batches
- Implement backpressure mechanism to pause file parsing when limit reached
- Prevent memory overflow during large codebase indexing
* feat: add global rate limiting for OpenAI-compatible embeddings
- Implement shared rate limit state across all embedder instances
- Add exponential backoff (5s base, up to 5 minutes max)
- Track consecutive rate limit errors with auto-reset after 60s
- Add thread-safe mutex for concurrent access
- Remove verbose logging to prevent log flooding during retries
- Add comprehensive test coverage for rate limiting behavior
This prevents multiple parallel batches from overwhelming APIs with
restrictive rate limits by coordinating delays globally.
* fix: restore original logging while keeping rate limit logging silent
- Restored all original console.warn and console.error calls that were inadvertently removed
- Only the rate limit retry warning remains silent (no console output)
- Fixed test expectation to use correct error variable
- All existing logging behavior is preserved
* feat: add configurable delay for Go diagnostics to prevent premature error reporting
- Add diagnosticsDelayMs setting (default: 2000ms) to allow linters time to process
- Add diagnosticsEnabled setting to optionally disable diagnostic checking entirely
- Update DiffViewProvider.saveChanges() to use configurable delay before checking diagnostics
- Update all tool files (writeToFile, searchAndReplace, insertContent, applyDiff, multiApplyDiff) to pass diagnostic settings
- Add comprehensive tests for new diagnostic functionality
- Fixes issue where Go diagnostics errors were submitted to LLM before linter could clean up unused imports
Resolves#5859
* fix: add missing TypeScript type definitions for diagnostic settings
- Add diagnosticsDelayMs and diagnosticsEnabled to globalSettingsSchema
- Include properties in ExtensionState Pick type
- Add default values to EVALS_SETTINGS
- Fix VSCode mock to include DiagnosticSeverity for tests
- Resolves compilation errors in ClineProvider and webviewMessageHandler
* fix: update test mocks to support diagnostic settings in tool tests
- Add providerRef mock to insertContentTool and writeToFileTool tests
- Update mocks to include diagnosticsEnabled and diagnosticsDelayMs settings
- Fix test expectations to match new implementation with diagnostic configuration
- Resolves failing unit tests for insertContentTool.spec.ts and writeToFileTool.spec.ts
* fix: remove package-lock.json file (project uses pnpm)
* refactor: use existing writeDelayMs instead of diagnosticsDelayMs
- Remove diagnosticsDelayMs setting in favor of existing writeDelayMs
- Add min(0) validation for writeDelayMs in global settings schema
- Add error handling around delay function calls in DiffViewProvider
- Create DEFAULT_WRITE_DELAY_MS constant (1000ms) to replace repeated defaults
- Update all tool files to pass writeDelayMs instead of diagnosticsDelayMs
- Remove diagnosticsDelayMs from webview message handlers and types
- Update test files to use writeDelayMs instead of diagnosticsDelayMs
This refactoring consolidates diagnostic delay functionality to use the
existing writeDelayMs setting as requested in PR feedback.
* fix: resolve failing unit tests and TypeScript compilation errors
- Fix DiffViewProvider test to expect correct default delay (1000ms instead of 2000ms)
- Fix TypeScript type errors in ClineProvider test mock state object
- Correct terminalPowershellCounter and terminalZdotdir types to boolean
- Fix pinnedApiConfigs type from array to Record<string, boolean>
* fix: remove unrelated changes from ClineProvider.spec.ts
- Removed extensive unrelated property additions to mock state
- Kept only diagnosticsEnabled property which is related to Go diagnostics delay feature
- Removed unused DEFAULT_WRITE_DELAY_MS import
- Restored original structure and organization of mock state object
This addresses the feedback to remove unrelated changes while preserving
the necessary diagnostic functionality for the Go diagnostics delay feature.
* refactor: move DEFAULT_WRITE_DELAY_MS to packages/types/src/global-settings.ts
- Move DEFAULT_WRITE_DELAY_MS constant from src/shared/constants.ts to packages/types/src/global-settings.ts
- Update all import statements in affected files to use @roo-code/types
- Delete src/shared/constants.ts file as it is no longer needed
- Files updated:
- src/integrations/editor/DiffViewProvider.ts
- src/core/webview/ClineProvider.ts
- src/core/tools/multiApplyDiffTool.ts
- src/core/tools/applyDiffTool.ts
- src/core/tools/searchAndReplaceTool.ts
- src/core/tools/insertContentTool.ts
- src/core/tools/writeToFileTool.ts
---------
Co-authored-by: Roo Code <roomote@roocode.com>
* fix: detect Claude models by name for API protocol selection
- Modified getApiProtocol to accept modelId parameter
- Added check for 'claude' in model name (case-insensitive)
- Updated Task.ts to pass model ID to getApiProtocol
- Added comprehensive tests for the new logic
Fixes#5830
* fix: limit Claude model detection to vertex and bedrock providers only
- Modified getApiProtocol to only detect Claude models by name when provider is vertex or bedrock
- Added comprehensive unit tests for getApiProtocol function as requested in PR review
- This ensures Claude models are only auto-detected for providers that need it
* improved chat row first pass
* big UI improvements
* working functionality
* tests working
* ok finally tests working for real!
* translations
* add back hidden flag
* remove option to skip notif
* fixed image issue
* ui fix
* put back edit flag
* oops test fix
* reduce margins
* code review
fix: remove invalid skip-checkout parameter from GitHub Actions workflows
- Removed skip-checkout parameter from nightly-publish.yml
- Removed skip-checkout parameter from marketplace-publish.yml
- Removed skip-checkout parameter from changeset-release.yml
The setup-node-pnpm action only accepts: node-version, pnpm-version, skip-install, and install-args.
The skip-checkout parameter was causing warnings in workflow runs.
Fixes#5674
* feat: add Cmd+Shift+. keyboard shortcut for previous mode switching
- Add switchToPreviousMode function that cycles backwards through modes array
- Update handleKeyDown to detect Cmd+Shift+. keyboard combination
- Update modeShortcutText to display both next and previous mode shortcuts
- Add forPreviousMode translation key to all 18 language files
- Implements backwards mode cycling using modulo arithmetic for proper array wrapping
Fixes#5692
* fix: correct keyboard shortcut detection for Cmd+Shift+. (previous mode)
When Shift is pressed with the period key, event.key becomes ">" instead of ".".
Fixed line 1576 to check for event.key === ">" for proper Cmd+Shift+. detection.
Fixes keyboard shortcut issue reported in PR comment.
* fix: use event.code for cross-platform keyboard shortcut compatibility
- Replace event.key checks with event.code === "Period" for both shortcuts
- Fixes keyboard layout compatibility issue where Shift+Period produces different characters on non-US layouts
- Consolidates both shortcuts into a single conditional block for better maintainability
- Addresses feedback from @daniel-lxs in PR #5695
Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>
Co-authored-by: Daniel Riccio <ricciodaniel98@gmail.com>
Co-authored-by: Daniel <57051444+daniel-lxs@users.noreply.github.com>
Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
Co-authored-by: Daniel Riccio <ricciodaniel98@gmail.com>
Co-authored-by: Daniel <57051444+daniel-lxs@users.noreply.github.com>
* feat: add navigation link to history tab in HistoryPreview
- Add 'View all history' link at bottom of history preview
- Include internationalization support with new translation key
- Use consistent styling with VSCode theme colors
- Navigate to history tab using switchTab message format
* feat: add viewAllHistory translation to all language files
* Tweaks and translations
* Fix test
---------
Co-authored-by: Matt Rubens <mrubens@users.noreply.github.com>
The test 'Should request MCP filesystem directory_tree tool and complete successfully' has been timing out after 45s in CI. Disabling it temporarily to unblock the test suite while we investigate the root cause.
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Daniel <57051444+daniel-lxs@users.noreply.github.com>
Co-authored-by: Daniel Riccio <ricciodaniel98@gmail.com>
fix(embeddings): translate error messages before sending to UI
- Import t() function from i18n module
- Wrap error messages with t() translation function in _initializeEmbedder()
- Ensures proper localization of error messages in the UI
- Falls back to original message if no translation exists
* fix: use decodeURIComponent in openFile
* feat: add error handling for decodeURIComponent and tests
- Added try-catch block around decodeURIComponent to handle invalid escape sequences
- Falls back to original path if decoding fails
- Added comprehensive unit tests for the openFile function
- Tests cover invalid URI encoding, valid encoding, and various edge cases
* fix: update test to handle dynamic workspace paths in CI
* fix: handle Windows path separators in open-file tests
---------
Co-authored-by: Vivek Soni <vivex@Viveks-MacBook-Air-2.local>
Co-authored-by: Daniel Riccio <ricciodaniel98@gmail.com>
- Remove: Roo Code Cloud and eval infrastructure from the extension, CLI, workflows, and package surfaces so the release is focused on the standalone extension (PR #12328 by @mrubens)
- Remove: All telemetry collection and analytics plumbing across the extension, website, shared types, provider flows, and related tests (PR #12324 by @mrubens)
- Remove: MDM and organization membership enforcement, including host wiring, webview state, user-facing messages, and locale strings (PR #12323 by @mrubens)
- Remove: The MCP marketplace, marketplace services, webview marketplace UI, package contributions, and related localized copy (PR #12326 by @mrubens)
- Update: Extension-facing support, diagnostics, and announcement content for the final Roo Code release, including GitHub help paths and links to Roomote, ZooCode, and Cline (PR #12341 by @brunobergher)
- Add: A cleaned docs app with GitHub Pages deployment support (PR #12344 by @brunobergher)
- Fix: Configure the docs GitHub Pages base URL so deployed assets and canonical paths load correctly under the repository Pages path (PR #12370 by @mrubens)
- Update: Point docs links in the root README, localized READMEs, and web app copy to the current GitHub Pages docs URL (PR #12371 by @mrubens)
- Remove: Stale `roocode.github.io` docs references, including the old CNAME and outdated docs README and robots.txt URLs (PR #12372 by @mrubens)
- Update: The website to focus almost entirely on the Roo Code extension and remove cloud, team, enterprise, provider, pricing, Slack, and Linear product pages (PR #12180 by @brunobergher)
- Remove: Contributor, community, social channel, and tutorial references from README files, docs, website copy, issue templates, and workflows (PR #12347 by @brunobergher)
description:Report a specific problem that needs solving in Roo Code
labels:["proposal","enhancement"]
name:Enhancement Request
description:Propose an improvement in plain language focused on user benefit
labels:["enhancement"]
title:"[ENHANCEMENT] "
body:
- type:markdown
attributes:
value:|
**Thankyou for submitting a feature request for Roo Code!**
This template helps you describe problems that need solving. Focus on the problem - the Roo team will work to design solutions unless you want to contribute the implementation yourself.
**Qualityover speed:** We prefer detailed, clear problem descriptions over quick ones. Vague requests often get closed or require multiple rounds of clarification, which wastes everyone's time.
**Beforesubmitting:**
- Search existing [Issues](https://github.com/RooCodeInc/Roo-Code/issues) and [Discussions](https://github.com/RooCodeInc/Roo-Code/discussions) to avoid duplicates
- For general ideas, use [GitHub Discussions](https://github.com/RooCodeInc/Roo-Code/discussions/categories/feature-requests) instead of this template.
- type:markdown
attributes:
value:|
## ❌ Common mistakes that lead to request rejection:
- **Vagueproblem descriptions:** "UI is bad" -> Should be: "Submit button is invisible on dark theme"
- **Missinguser impact:** "This would be cool" -> Should explain who benefits and how
- **Nospecific context:** Describe exactly when and how the problem occurs
Thank you for helping improve Roo Code!
Please focus on the problem and the desired behavior in plain language.
- type:textarea
id:problem-description
id:problem
attributes:
label:What specific problem does this solve?
description:|
**Beconcrete and detailed.** Explain the problem from a user's perspective.
✅ **Good examples (specific, clear impact):**
- "When running large tasks, users wait 5+ minutes because tasks execute sequentially instead of in parallel, blocking productivity"
- "AI can only read one file per request, forcing users to make multiple requests for multi-file projects, increasing wait time from 30s to 5+ minutes"
- "Dark theme users can't see the submit button because it uses white text on light grey background"
❌ **Poor examples (vague, unclear impact):**
- "The UI looks weird"-> What specifically looks weird? On which screen? What's the impact?
- "System prompt is not good"-> What's wrong with it? What behaviour does it cause? What should it do instead?
- "Performance could be better"-> Where? How slow is it currently? What's the user impact?
**Yourproblem description should answer:**
- Who is affected? (all users, specific user types, etc.)
- When does this happen? (specific scenarios/steps)
- What's the current behaviour vs expected behaviour?
- What's the impact? (time wasted, errors caused, etc.)
placeholder:Be specific about the problem, who it affects, and the impact. Avoid generic statements like "it's slow" or "it's confusing."
label:Problem (one or two sentences)
description:What problem are users facing?
placeholder:e.g., "Users often click Copy Run by mistake and duplicate runs unintentionally."
validations:
required:true
- type:textarea
id:context
attributes:
label:Context (who is affected and when)
description:Who encounters this and in what situation?
placeholder:e.g., "Happens when browsing the Runs list; most visible for new users."
validations:
required:true
- type:textarea
id:additional-context
id:desired
attributes:
label:Additional context (optional)
description:Mockups, screenshots, links, user quotes, or other relevant information that supports your proposal.
label:Desired behavior (conceptual, not technical)
description:Describe what should happen in simple terms.
placeholder:e.g., "Ask for confirmation before copying a run."
validations:
required:true
- type:textarea
id:roo-code-tasks
id:constraints
attributes:
label:Roo Code Task Links (Optional)
description:|
If you used Roo Code to explore this feature request or develop solutions, share the public task links here.
This helps maintainers understand the context and any exploration you've done.
Example:https://app.roocode.com/share/task-id
placeholder:Paste your Roo Code share links here, one per line
label:Constraints / preferences (optional)
description:Any considerations like performance, accessibility, or UX expectations.
placeholder:e.g., "Keep it quick and unobtrusive; keyboard accessible."
- type:checkboxes
id:checklist
@ -74,128 +50,42 @@ body:
options:
- label:I've searched existing Issues and Discussions for duplicates
required:true
- label:This describes a specific problem with clear impact and context
- label:This describes a specific problem with clear context and impact
required:true
- type:textarea
id:roo-code-tasks
attributes:
label:Roo Code Task Links (optional)
description:If you explored this with Roo Code, share public task links for context.
placeholder:Paste your Roo Code share links here, one per line
**🎯Just reporting a problem?** You can click "Submit new issue" right now! The sections below are only needed if you want to contribute a solution via pull request.
**⚠️Only continue if you want to:**
- Propose a specific solution design
- Implement the feature yourself via pull request
- Provide technical analysis to help with implementation
**Forcontributors who continue:**
- A maintainer (especially @hannesrudolph) will review this proposal. **Do not start implementation until approved and assigned.** We're a small team with limited resources, so every code addition needs careful consideration. We're always happy to receive clear, actionable proposals though!
- Join [Discord](https://discord.gg/roocode) and DM **Hannes Rudolph** (`hrudolph`) for guidance on implementation
- Check our [Roadmap](https://github.com/orgs/RooCodeInc/projects/1/views/1?query=sort%3Aupdated-desc+is%3Aopen&filterQuery=is%3Aissue%2Copen%2Cclosed+label%3A%22feature+request%22+status%3A%22Issue+%5BUnassigned%5D%22%2C%22Issue+%5BIn+Progress%5D%22) to see open feature requests ready to be implemented or currently being worked on
- type:checkboxes
id:willingness-to-contribute
attributes:
label:Interested in implementing this?
description:|
**Important:**If you check "Yes" below, the technical sections become REQUIRED.
We need detailed technical analysis from contributors to ensure quality implementation.
options:
- label:Yes,I'd like to help implement this feature
required:false
- type:checkboxes
id:implementation-approval
attributes:
label:Implementation requirements
options:
- label:I understand this needs approval before implementation begins
required:false
- type:textarea
id:proposed-solution
attributes:
label:How should this be solved? (REQUIRED if contributing, optional otherwise)
description:|
**Ifyou want to implement this feature, this section is REQUIRED.**
**Describeyour solution in detail.** Explain not just what to build, but how it should work.
✅ **Good examples:**
- "Add parallel task execution: Allow up to 3 tasks to run simultaneously with a queue system for additional tasks. Show progress for each active task in the UI."
- "Enable multi-file AI processing: Modify the request handler to accept multiple files in a single request and process them together, reducing round trips."
- "Fix button contrast: Change submit button to use primary colour on dark theme (white text on blue background) instead of current grey."
❌ **Poor examples:**
- "Make it faster"-> How? What specific changes?
- "Improve the UI"-> Which part? What specific improvements?
- "Fix the prompt"-> What should the new prompt do differently?
**Yoursolution should explain:**
- What exactly will change?
- How will users interact with it?
- What will the new behaviour look like?
placeholder:Describe the specific changes and how they will work. Include user interaction details if relevant.
Optional:You can stop here if you're just proposing the improvement.
- type:textarea
id:acceptance-criteria
attributes:
label:How will we know it works? (Acceptance Criteria - REQUIRED if contributing, optional otherwise)
description:|
**Ifyou want to implement this feature, this section is REQUIRED.**
**Thisis crucial - don't skip it.** Define what "working" looks like with specific, testable criteria.
**Formatsuggestion:**
```
Given [context/situation]
label:Acceptance criteria (optional)
description:Define what “working” looks like with specific, testable outcomes.
placeholder:|
Given [context]
When [user action]
Then [expected result]
And [additional expectations]
But [what should NOT happen]
```
**Example:**
```
Given I have 5 large tasks to run
When I start all of them
Then they execute in parallel (max 3 at once, can be configured)
And I see progress for each active task
And queued tasks show "waiting" status
But the UI doesn't freeze or become unresponsive
```
placeholder:|
Define specific, testable criteria. What should users be able to do? What should happen? What should NOT happen?
Use the Given/When/Then format above or your own clear structure.
- type:textarea
id:technical-considerations
id:proposed-solution
attributes:
label:Technical considerations (REQUIRED if contributing, optional otherwise)
description:|
**Ifyou want to implement this feature, this section is REQUIRED.**
Share technical insights that could help planning:
- Implementation approach or architecture changes
- Performance implications
- Compatibility concerns
- Systems that might be affected
- Potential blockers you can foresee
placeholder:e.g., "Will need to refactor task manager", "Could impact memory usage on large files", "Requires a large portion of code to be rewritten"
label:Proposed approach (optional)
description:If you have an idea, describe it briefly in plain language.
- type:textarea
id:trade-offs-and-risks
id:risks
attributes:
label:Trade-offs and risks (REQUIRED if contributing, optional otherwise)
description:|
**Ifyou want to implement this feature, this section is REQUIRED.**
What could go wrong or what alternatives did you consider?
- Alternative approaches and why you chose this one
const comment = commentIdentifier + '\n🚀 **Preview deployed!**\n\nYour changes have been deployed to Vercel:\n\n**Preview URL:** ' + deploymentUrl + '\n\nThis preview will be updated automatically when you push new commits to this PR.';
description: "Create a new release of the Roo Code extension"
argument-hint: patch | minor | major
mode: code
---
1. Identify the SHA corresponding to the most recent release using GitHub CLI: `gh release view --json tagName,targetCommitish,publishedAt`
2. Analyze changes since the last release using: `gh pr list --state merged --base main --json number,title,author,url,mergedAt,closingIssuesReferences --limit 1000 -q '[.[] | select(.mergedAt > "TIMESTAMP") | {number, title, author: .author.login, url, mergedAt, issues: .closingIssuesReferences}] | sort_by(.number)'`
3. For each PR with linked issues, fetch the issue details to get the issue reporter: `gh issue view ISSUE_NUMBER --json number,author -q '{number, reporter: .author.login}'`
4. Summarize the changes. If the user did not specify, ask them whether this should be a major, minor, or patch release.
5. Create a changeset in .changeset/v[version].md instead of directly modifying package.json. The format is:
```
---
"roo-cline": patch|minor|major
---
[list of changes]
```
- Always include contributor attribution and the PR number: use "(PR #<prNumber> by @username)".
- For PRs that close issues, include both the issue number and the PR number and authors: "- Fix: Description (#123 by @reporter, PR #456 by @contributor)"
- For PRs without linked issues, include the PR number and author: "- Add support for feature (PR #456 by @contributor)"
- Provide brief descriptions of each item to explain the change
- Order the list from most important to least important
- Example formats:
- With issue: "- Fix: Resolve memory leak in extension (#456 by @issueReporter, PR #789 by @prAuthor)"
- Without issue: "- Add support for Gemini 2.5 Pro caching (PR #789 by @contributor)"
- CRITICAL: Include EVERY SINGLE PR in the changeset - don't assume you know which ones are important. Count the total PRs to verify completeness and cross-reference the list to ensure nothing is missed.
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: ``
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)
- Ask the user to confirm that the English version looks good to them before proceeding
- Use the new_task tool to create a subtask in `translate` mode with detailed instructions of which content needs to be translated into all supported languages (The READMEs as well as the translation strings)
8. Create a new branch for the release preparation: `git checkout -b release/v[version]`
9. Commit and push the changeset file and any documentation updates to the repository: `git add . && git commit -m "chore: add changeset for v[version]" && git push origin release/v[version]`
10. Create a pull request for the release: `gh pr create --title "Release v[version]" --body "Release preparation for v[version]. This PR includes the changeset and any necessary documentation updates." --base main --head release/v[version]`
11. The GitHub Actions workflow will automatically:
- Create a version bump PR when changesets are merged to main
- Update the CHANGELOG.md with proper formatting
- Publish the release when the version bump PR is merged
description: "Resolve merge conflicts intelligently using git history analysis"
argument-hint: "#PR-number"
mode: merge-resolver
---
Resolve merge conflicts for a specific pull request by analyzing git history, commit messages, and code changes to make intelligent resolution decisions.
## Quick Start
1. **Provide a PR number** (e.g., `#123` or just `123`)
2. The workflow will automatically:
- Fetch PR information (title, description, branches)
- Checkout the PR branch
- Rebase onto the target branch to reveal conflicts
description: "Translate and localize strings in the Roo Code extension"
argument-hint: "[language-code or 'all'] [string-key or file-path]"
mode: translate
---
Perform translation and localization tasks for the Roo Code extension. This command activates the translation workflow with comprehensive i18n guidelines.
## Quick Start
1. **Identify the translation scope:**
- If a specific language code is provided (e.g., `de`, `zh-CN`), focus on that language
- If `all` is specified, translate to all supported languages
- If a string key is provided, locate and translate that specific string
- If a file path is provided, work with that translation file
When debugging the CLI, `console.log` will break the TUI (Terminal User Interface). Use file-based logging to capture debug output without interfering with the application's display.
## File-Based Logging Strategy
1. **Write logs to a temporary file instead of console**:
- Create a log file at a known location, e.g., `/tmp/roo-cli-debug.log`
- Use `fs.appendFileSync()` to write timestamped log entries
- Example logging utility:
```typescript
import fs from "fs"
const DEBUG_LOG = "/tmp/roo-cli-debug.log"
function debugLog(message: string, data?: unknown) {
- Code where `JWT_SECRET` is read (e.g., `process.env.JWT_SECRET`)
- Logic that fails if the secret is missing
- Default values or error handling related to the secret
</expected_findings>
</step>
<stepnumber="3">
<description>Formulate and provide feedback in chat</description>
<tool_use><![CDATA[
<attempt_completion>
<result>
I have reviewed the documentation section provided for the `JWT_SECRET` setting. Here are my recommendations for improvement:
**Overall Assessment**: The current draft is critically inaccurate and could lead to security vulnerabilities if followed.
**Recommendations for Improvement**:
* **Critical Inaccuracy**:
* The documentation states that `JWT_SECRET` is optional. However, the application will fail to start if it is not provided. It is a **required** setting for the application to function securely.
* **Suggestion**: "The `JWT_SECRET` is a **required** environment variable used to sign and verify JSON Web Tokens. The application will not run without it."
This feedback can be copied and pasted for your documentation team.
</result>
</attempt_completion>
]]></tool_use>
<note>No file is written. The feedback is provided directly to the user in the chat interface.</note>
</step>
</workflow>
</example>
<best_practices>
<practicename="comprehensive_coverage">
<description>Ensure all aspects are documented</description>
<checklist>
<item>Technical implementation details</item>
<item>Business logic and rules</item>
<item>User workflows and journeys</item>
<item>API specifications</item>
<item>Configuration options</item>
<item>Security measures</item>
<item>Performance characteristics</item>
<item>Error handling</item>
<item>Testing strategies</item>
<item>Deployment procedures</item>
</checklist>
</practice>
<practicename="multi_audience_writing">
<description>Tailor content for different readers</description>
<audiences>
<audiencetype="end_users">
Focus on how-to guides and troubleshooting
</audience>
<audiencetype="developers">
Include code examples and technical details
</audience>
<audiencetype="administrators">
Emphasize configuration and maintenance
</audience>
<audiencetype="stakeholders">
Highlight business value and metrics
</audience>
</audiences>
</practice>
<practicename="maintainable_documentation">
<description>Create documentation that's easy to update</description>
<guidelines>
<guideline>Use clear section headers</guideline>
<guideline>Include version information</guideline>
1. **Parse URL**: Extract the `owner`, `repo`, and `issue_number`.
2. **Create Task Directory**: Create a dedicated directory to store all context for this task. Use a unique identifier for the directory name, like the task ID. For example: `.roo/temp/issue-fixer-orchestrator/[TASK_ID]/`.
Launch a subtask in `architect` mode to perform a detailed analysis of the issue and the codebase. The subtask will be responsible for identifying affected files and creating an implementation plan.
The context file `.roo/temp/issue-fixer-orchestrator/[TASK_ID]/issue_context.json` will be the input for this subtask. The subtask should write its findings (the implementation plan) to a new file: `.roo/temp/issue-fixer-orchestrator/[TASK_ID]/implementation_plan.md`.
<new_task>
<mode>architect</mode>
<message>
**Task: Analyze Issue and Create Implementation Plan**
You are an expert software architect. Your task is to analyze the provided GitHub issue and the current codebase to create a detailed implementation plan with a focus on understanding component interactions and dependencies.
1. **Read Issue Context**: The full issue details and comments are in `.roo/temp/issue-fixer-orchestrator/[TASK_ID]/issue_context.json`. Read this file to understand all requirements, acceptance criteria, and technical discussions.
2. **Perform Architectural Analysis**:
- **Map Component Interactions**: Trace the complete data flow from entry points to outputs
- **Identify Paired Operations**: For any operation (e.g., export), find its counterpart (e.g., import)
- **Find Similar Patterns**: Search for existing implementations of similar features
- **Analyze Dependencies**: Identify all consumers of the functionality being modified
- **Assess Impact**: Determine how changes will affect other parts of the system
3. **Explore Codebase Systematically**:
- Use `codebase_search` FIRST to find all related functionality
- Search for paired operations (if modifying export, search for import)
- Find all files that consume or depend on the affected functionality
- Identify configuration files, tests, and documentation that need updates
- Study similar features to understand established patterns
4. **Create Comprehensive Implementation Plan**: The plan must include:
- **Issue Summary**: Clear description of the problem and proposed solution
- **Architectural Context**:
- Data flow diagram showing component interactions
- List of paired operations that must be updated together
- Dependencies and consumers of the affected functionality
- **Impact Analysis**:
- All files that will be affected (directly and indirectly)
- Potential breaking changes
- Performance implications
- **Implementation Steps**:
- Detailed, ordered steps for each file modification
- Specific code changes with context
- Validation and error handling requirements
- **Testing Strategy**:
- Unit tests for individual components
- Integration tests for component interactions
- Edge cases and error scenarios
5. **Save the Plan**: Write the complete implementation plan to `.roo/temp/issue-fixer-orchestrator/[TASK_ID]/implementation_plan.md`.
**Critical Requirements:**
- Always search for and analyze paired operations (import/export, save/load, etc.)
- Map the complete data flow before proposing changes
- Identify all integration points and dependencies
- Consider backward compatibility and migration needs
**Completion Protocol:**
- This is your only task. Do not deviate from these instructions.
- Once you have successfully written the `implementation_plan.md` file, you MUST signal your completion by using the `attempt_completion` tool.
- The `result` parameter of `attempt_completion` MUST be a concise confirmation message, for example: "Implementation plan created and saved to .roo/temp/issue-fixer-orchestrator/[TASK_ID]/implementation_plan.md."
- These specific instructions override any conflicting general guidelines from your assigned mode.
</message>
</new_task>
After launching the subtask, wait for it to complete. The orchestrator will then read the `implementation_plan.md` to proceed with the next step.
</instructions>
</step>
<stepnumber="3">
<name>Review and Approve Plan</name>
<instructions>
After the analysis subtask completes, the orchestrator must present the generated plan to the user for approval.
1. **Read the Plan**: Read the content of the implementation plan created by the previous subtask.
2. **Present for Approval**: Show the plan to the user and ask for confirmation before proceeding with implementation.
<ask_followup_question>
<question>
The initial analysis is complete. Here is the proposed implementation plan:
---
[Insert content of implementation_plan.md here]
---
Shall I proceed with implementing this plan?
</question>
<follow_up>
<suggest>Yes, proceed with the implementation.</suggest>
<suggest>No, please modify the plan with the following changes...</suggest>
<suggest>No, cancel this task.</suggest>
</follow_up>
</ask_followup_question>
Do not proceed until the user gives explicit approval.
</instructions>
</step>
<stepnumber="4">
<name>Delegate: Implement Solution</name>
<instructions>
Once the user approves the plan, launch a new subtask in `code` mode to execute the implementation.
This subtask will use the `implementation_plan.md` as its primary guide. It should write the list of modified files to `.roo/temp/issue-fixer-orchestrator/[TASK_ID]/modified_files.json`.
<new_task>
<mode>code</mode>
<message>
**Task: Implement Code Changes Based on Plan**
You are an expert software developer. Your task is to implement the code changes with full awareness of system interactions and dependencies.
1. **Read the Plan**: The implementation plan is located at `.roo/temp/issue-fixer-orchestrator/[TASK_ID]/implementation_plan.md`. Pay special attention to:
- The architectural context section
- Component interaction diagrams
- Identified dependencies and related operations
- Impact analysis
2. **Validate Understanding**: Before coding, ensure you understand:
- How data flows through the system
- All related operations that must be updated together
- Dependencies that could be affected
- Integration points with other components
3. **Implement Holistically**:
- **Update Related Operations Together**: If modifying one operation, update all related operations
- **Maintain Consistency**: Ensure data structures, validation, and error handling are consistent
- **Consider Side Effects**: Account for how changes propagate through the system
- **Follow Existing Patterns**: Use established patterns from similar features
4. **Implement Tests**:
- Write tests that verify component interactions
- Test related operations together
- Include edge cases and error scenarios
- Verify data consistency across operations
5. **Track Modified Files**: As you modify or create files, keep a running list.
6. **Save Modified Files List**: After all changes are implemented and tested, save the list of all file paths you created or modified to `.roo/temp/issue-fixer-orchestrator/[TASK_ID]/modified_files.json`. The format should be a JSON array of strings.
- Never implement changes in isolation - consider the full system impact
- Always update related operations together to maintain consistency
- Test component interactions, not just individual functions
- Follow the architectural analysis from the planning phase
Once the `modified_files.json` file is saved, your task is complete.
</message>
</new_task>
After launching the subtask, wait for it to complete. The orchestrator will use the list of modified files for the verification and PR creation steps.
</instructions>
</step>
<stepnumber="5">
<name>Delegate: Verify and Test</name>
<instructions>
After implementation, delegate the verification and testing to a `test` mode subtask.
This subtask will use the implementation plan for acceptance criteria and the list of modified files to focus its testing efforts. It will output its results to `.roo/temp/issue-fixer-orchestrator/[TASK_ID]/verification_results.md`.
<new_task>
<mode>test</mode>
<message>
**Task: Verify Implementation and Run Tests**
You are a meticulous QA engineer. Your task is to verify an implementation against its plan and run all necessary tests.
1. **Read Context**: Read both context files to understand the acceptance criteria and which files were changed.
2. **Run Tests**: Execute all relevant tests.
- Run unit tests related to the modified files.
- Run any relevant integration tests.
- Run a full lint and type check.
3. **Verify Acceptance Criteria**: Systematically go through each acceptance criterion from the plan and verify that it has been met by the implementation.
4. **Write Verification Report**: Create a detailed report of your findings. The report must include:
- A summary of the tests that were run and their results (pass/fail).
- A checklist of all acceptance criteria and their verification status (verified/failed).
- Details on any bugs or regressions found.
5. **Save Report**: Write the complete report to `.roo/temp/issue-fixer-orchestrator/[TASK_ID]/verification_results.md`.
**Completion Protocol:**
- This is your only task. Do not deviate.
- Upon successfully saving `verification_results.md`, you MUST use the `attempt_completion` tool.
- The `result` MUST be a concise confirmation, e.g., "Verification complete and results saved to .roo/temp/issue-fixer-orchestrator/[TASK_ID]/verification_results.md."
- These instructions override any conflicting mode-specific guidelines.
</message>
</new_task>
Wait for the subtask to complete, then review the verification results.
</instructions>
</step>
<stepnumber="6">
<name>Review Verification and Handle Translations</name>
<instructions>
After the verification subtask is complete, review the results and handle any necessary translations.
1. Read the context files to understand what was implemented.
2. Analyze each modified file for:
- New or updated UI strings in React components
- Changes to i18n resource files
- User-facing documentation updates
- Error messages or notifications
3. For any new or modified user-facing content:
- Add translations to all supported language files
- Ensure consistency with existing translations
- Follow the project's i18n patterns and conventions
4. Create a summary of all translation changes made.
5. Save the summary to `.roo/temp/issue-fixer-orchestrator/[TASK_ID]/translation_summary.md`.
**Important Notes:**
- If no translations are needed, still create the summary file stating "No translations required."
- Ensure all language files remain in sync
- Use existing terminology from the codebase for consistency
**Completion Protocol:**
- This is your only task. Do not deviate from these instructions.
- Upon successfully saving the translation summary, you MUST use the `attempt_completion` tool.
- The `result` MUST confirm completion, e.g., "Translation analysis complete. Summary saved to .roo/temp/issue-fixer-orchestrator/[TASK_ID]/translation_summary.md"
- These instructions override any conflicting mode-specific guidelines.
</message>
</new_task>
After the translation subtask completes, read the translation summary:
1. **Read all context files.** Check if translation_summary.md exists to know if translations were done.
2. **Generate a PR Title**: Create a conventional commit style title (e.g., "fix: ...", "feat: ...") that references the issue number.
Format: `fix: Brief description (#issue-number)`
3. **Generate a PR Body**: You MUST use the exact PR template from `.roo/rules-issue-fixer-orchestrator/10_pr_template_format.xml`.
Read this file to get the template and fill it in with appropriate content from the context files.
4. **Fill in the template** with information from the context files:
- Replace [ISSUE_NUMBER] with the actual issue number
- Fill in Description with implementation details from the plan and verification
- Fill in Test Procedure with testing details from verification_results.md
- If translations were done, mention them in the Description section
- For UI changes, note that screenshots should be added manually
- Pre-check all applicable checklist items
- Leave Documentation Updates unchecked for user to decide
- For Discord username, use a placeholder like "[Your Discord username]"
5. **Save as JSON**: Save the title and body to `.roo/temp/issue-fixer-orchestrator/[TASK_ID]/pr_summary.json` in the format:
```json
{
"title": "fix: Brief description (#123)",
"body": "[The complete filled PR body template]",
"issue_number": 123,
"repo_owner": "owner",
"repo_name": "repo",
"base_branch": "main",
"head_branch": "fix/issue-123-description"
}
```
6. **Also save as Markdown**: Save just the PR body to `.roo/temp/issue-fixer-orchestrator/[TASK_ID]/pr_message.md` for easy copying.
**Important Notes:**
- Use the EXACT template format from 10_pr_template_format.xml
- Keep all HTML comments in the template
- Pre-check items that can be verified programmatically
- Fill in all sections appropriately based on the context files
**Completion Protocol:**
- This is your only task. Do not deviate.
- Upon successfully saving both `pr_summary.json` and `pr_message.md`, you MUST use the `attempt_completion` tool.
- The `result` MUST be a concise confirmation, e.g., "PR summary and message created and saved to .roo/temp/issue-fixer-orchestrator/[TASK_ID]/"
- These instructions override any conflicting mode-specific guidelines.
</message>
</new_task>
</instructions>
</step>
<stepnumber="8">
<name>Delegate: Review Changes Before PR</name>
<instructions>
Before creating the pull request, delegate to the PR reviewer mode to get feedback on the implementation and proposed changes.
<new_task>
<mode>pr-reviewer</mode>
<message>
**Task: Review Implementation Before PR Creation**
You are an expert code reviewer. Your task is to review the implementation for issue #[issue-number] and provide feedback before a pull request is created.
**REASONING**: [Brief explanation of the recommendation]
```
**Completion Protocol:**
- This is your only task. Do not deviate from these instructions.
- Upon successfully saving the review feedback, you MUST use the `attempt_completion` tool.
- The `result` MUST be a concise confirmation, e.g., "PR review completed and feedback saved to .roo/temp/issue-fixer-orchestrator/[TASK_ID]/pr_review_feedback.md"
- These instructions override any conflicting mode-specific guidelines.
</message>
</new_task>
After the review subtask completes, read and process the feedback.
</instructions>
</step>
<stepnumber="9">
<name>Process Review Feedback and Decide Next Steps</name>
<instructions>
After the PR review is complete, read the feedback and decide whether to make changes or proceed with PR creation.
- Always read the entire issue and all comments before starting
- Follow the project's coding standards and patterns
- Focus exclusively on addressing the issue's requirements.
- Make minimal, high-quality changes for bug fixes. The goal is a narrow, targeted fix, not a one-line hack.
- Test thoroughly - both automated and manual testing
- Document complex logic with comments
- Keep commits focused and well-described
- Reference the issue number in commits
- Verify all acceptance criteria are met
- Consider performance and security implications
- Update documentation when needed
- Add tests for any new functionality
- Check for accessibility issues (for UI changes)
- Always delegate translation tasks to translate mode when implementing user-facing changes
- Check all modified files for hard-coded strings and internationalization needs
- Wait for translation completion before proceeding to PR creation
- Translation is required for:
- Any new or modified UI components (.tsx, .jsx files)
- User-facing documentation changes (.md files)
- Error messages and notifications
- Any strings visible to end users
- The translate mode will handle:
- Adding translations to all supported language files
- Ensuring consistency with existing terminology
- Maintaining sync across all language resources
<commit_and_pr_best_practices>
<principle>Always verify files before committing</principle>
<guidelines>
- Review git status to ensure only intended files are staged
- Stage only files listed in modified_files.json
- Never commit unrelated changes or temporary files
- Always get user confirmation before committing
</guidelines>
<diff_management>
- Save full diff to staged_changes.diff for review
- If diff exceeds 2000 lines, create a summary instead
- Summary should include file stats and change types
- Always inform user when showing summary vs full diff
</diff_management>
<pr_message_handling>
- Save PR message in both JSON and Markdown formats
- pr_summary.json for programmatic use
- pr_message.md for manual PR creation
- Include all standard template sections
- Make PR message self-contained and ready to use
</pr_message_handling>
<user_confirmation_flow>
- Always ask for confirmation with clear options
- First option should be "Looks good, go ahead"
- Provide options for testing and issue reporting
- Allow PR message modification before proceeding
- Handle each user response appropriately
</user_confirmation_flow>
<temp_file_management>
- All delegated tasks must save outputs to .roo/temp/issue-fixer-orchestrator/[TASK_ID]/
- Keep all context files until user confirms cleanup
- Offer cleanup option after PR creation
- Never delete files without user permission
</temp_file_management>
</commit_and_pr_best_practices>
<codebase_exploration_guidelines>
<principle>Always use `codebase_search` FIRST to understand the codebase structure and find all related files before using other tools like `read_file`.</principle>
Paired operations must maintain consistency. Changes to one without the other leads to data corruption, import failures, or broken functionality.
</rationale>
</paired_operations_principle>
<critical_note>
Always read multiple related files together to understand the full context. Never assume a change is isolated - trace its impact through the entire system.
<syntax>gh run list --repo [owner]/[repo] --limit 5</syntax>
<example>
<execute_command>
<command>gh run list --repo octocat/hello-world --limit 5</command>
</execute_command>
</example>
</command>
</workflow_helpers>
<error_handling>
<scenarioname="not_authenticated">
<error>gh: Not authenticated. Run 'gh auth login' to authenticate.</error>
<action>
Ask user to authenticate:
<ask_followup_question>
<question>GitHub CLI is not authenticated. Please run 'gh auth login' in your terminal to authenticate, then let me know when you're ready to continue.</question>
A comprehensive PR description is critical. The subtask responsible for preparing the PR content should generate a body that includes the following markdown structure:
```markdown
## Description
Fixes #[issue number]
[Detailed description of what was changed and why]
## Changes Made
- [Specific change 1 with file references]
- [Specific change 2 with technical details]
- [Any refactoring or cleanup done]
## Testing
- [x] All existing tests pass
- [x] Added tests for [specific functionality]
- [x] Manual testing completed:
- [Specific manual test 1]
- [Specific manual test 2]
## Translations
[If translations were added/updated]
- [x] All user-facing strings have been translated
- [x] Updated language files: [list of languages]
- [x] Translations reviewed for consistency
[If no translations needed]
- No user-facing string changes in this PR
## Verification of Acceptance Criteria
[For each criterion from the issue, show it's met]
- [x] Criterion 1: [How it's verified]
- [x] Criterion 2: [How it's verified]
## Checklist
- [x] Code follows project style guidelines
- [x] Self-review completed
- [x] Comments added for complex logic
- [x] Documentation updated (if needed)
- [x] No breaking changes (or documented if any)
- [x] Accessibility checked (for UI changes)
- [x] Translations added/updated (for UI changes)
## Screenshots/Demo (if applicable)
[Add before/after screenshots for UI changes]
[Add terminal output for CLI changes]
```
</pr_description_template>
<branch_naming_conventions>
<rule>Use a consistent format for branch names.</rule>
The issue-fixer-orchestrator mode must ensure all user-facing content is properly translated before creating a pull request. This is achieved by delegating translation tasks to the specialized translate mode.
</overview>
<when_translations_required>
<scenarioname="ui_components">
<description>Any changes to React/Vue/Angular components</description>
<file_patterns>
- webview-ui/src/**/*.tsx
- webview-ui/src/**/*.jsx
- src/**/*.tsx (if contains UI elements)
</file_patterns>
<what_to_check>
- New text strings in JSX
- Updated button labels, tooltips, or placeholders
<command>gh api repos/[owner]/[repo]/issues/[issue-number] --jq '{number,title,body,state,labels,assignees,milestone,createdAt:.created_at,updatedAt:.updated_at,closedAt:.closed_at,author:.user.login}'</command>
</execute_command>
If the command fails with an authentication error (e.g., "gh: Not authenticated" or "HTTP 401"), ask the user to authenticate:
<command>gh api repos/[owner]/[repo]/issues/[issue-number]/comments --paginate --jq '.[].body'</command>
</execute_command>
Also check for:
@ -191,7 +191,6 @@
Use appropriate tools:
- apply_diff for targeted changes
- write_to_file for new files
- search_and_replace for systematic updates
After each significant change, run relevant tests:
- execute_command to run test suites
@ -273,6 +272,13 @@
- [Note any technical terms or constraints]
Please ensure all translations maintain consistency with existing terminology and follow the project's localization guidelines.</message>
<todos>
[ ] Identify all user-facing strings that need translation
[ ] Update i18n JSON files for all supported languages
[ ] Translate any markdown documentation files
[ ] Verify translations maintain consistency with existing terminology
[ ] Test translations in the application context
</todos>
</new_task>
Wait for the translation task to complete before proceeding to testing.
@ -478,7 +484,7 @@
3. Inform the user of the successful creation
<execute_command>
<command>gh issue comment [original issue number] --repo [owner]/[repo] --body "PR #[new PR number] has been created to address this issue: [PR URL]"</command>
<command>gh issue comment [original issue number] --repo [owner]/[repo] --body "PR #[new PR number] has been created to address this issue"</command>
<syntax>gh api repos/[owner]/[repo]/issues/[issue-number] --jq '{number,title,body,state,labels,assignees,milestone,createdAt:.created_at,updatedAt:.updated_at,closedAt:.closed_at,author:.user.login}'</syntax>
<command>gh api repos/octocat/hello-world/issues/123 --jq '{number,title,body,state,labels,assignees,milestone,createdAt:.created_at,updatedAt:.updated_at,closedAt:.closed_at,author:.user.login}'</command>
</execute_command>
</example>
</command>
<commandname="gh_issue_comments">
<purpose>Get additional context and requirements from issue comments</purpose>
<purpose>Get additional context and requirements from issue comments.</purpose>
<when>Always use after viewing issue to see full discussion</when>
This mode investigates GitHub issues to find the probable root cause and suggest a theoretical solution. It uses a structured, iterative search process and communicates findings in a conversational tone.
</mode_overview>
<initialization_steps>
<stepnumber="1">
<action>Understand the user's request</action>
<details>
The user will provide a GitHub issue URL or number. Your first step is to fetch the issue details using the `gh` CLI.
Based on the issue details, create a todo list to track the investigation.
</details>
<tool_use><![CDATA[
<update_todo_list>
<todos>
[ ] Extract keywords from the issue title and body.
[ ] Perform initial codebase search with keywords.
[ ] Analyze search results and form a hypothesis.
[ ] Attempt to disprove the hypothesis.
[ ] Formulate a theoretical solution.
[ ] Draft a comment for the user.
</todos>
</update_todo_list>
]]></tool_use>
</step>
</initialization_steps>
<main_workflow>
<phasename="investigation">
<description>
Systematically search the codebase to identify the root cause. This is an iterative process.
</description>
<steps>
<step>
<title>Extract Keywords</title>
<description>Identify key terms, function names, error messages, and concepts from the issue title, body, and comments.</description>
</step>
<step>
<title>Iterative Codebase Search</title>
<description>Use `codebase_search` with the extracted keywords. Start broad and then narrow down your search based on the results. Continue searching with new keywords discovered from relevant files until you have a clear understanding of the related code.</description>
<tool_use>
<command>codebase_search</command>
</tool_use>
</step>
<step>
<title>Form a Hypothesis</title>
<description>Based on the search results, form a hypothesis about the probable cause of the issue. Document this hypothesis.</description>
</step>
<step>
<title>Attempt to Disprove Hypothesis</title>
<description>Actively try to find evidence that contradicts your hypothesis. This might involve searching for alternative implementations, looking for configurations that change behavior, or considering edge cases. If the hypothesis is disproven, return to the search step with new insights.</description>
</step>
</steps>
</phase>
<phasename="solution">
<description>Formulate a solution and prepare to communicate it.</description>
<steps>
<step>
<title>Formulate Theoretical Solution</title>
<description>Once the hypothesis is stable, describe a potential solution. Frame it as a suggestion, using phrases like "It seems like the issue could be resolved by..." or "A possible fix would be to...".</description>
</step>
<step>
<title>Draft Comment</title>
<description>Draft a comment for the GitHub issue that explains your findings and suggested solution in a conversational, human-like tone. Start the comment with "Hey @roomote-agent,".</description>
</step>
</steps>
</phase>
<phasename="user_confirmation">
<description>Ask the user for confirmation before posting any comments.</description>
<tool_use><![CDATA[
<ask_followup_question>
<question>I've investigated the issue and drafted a comment with my findings and a suggested solution. Would you like me to post it to the GitHub issue?</question>
<follow_up>
<suggest>Yes, please post the comment to the issue.</suggest>
<suggest>Show me the draft comment first.</suggest>
<suggest>No, do not post the comment.</suggest>
</follow_up>
</ask_followup_question>
]]></tool_use>
</phase>
</main_workflow>
<completion_criteria>
<criterion>A probable cause has been identified and validated.</criterion>
<criterion>A theoretical solution has been proposed.</criterion>
<criterion>The user has decided whether to post a comment on the issue.</criterion>
<description>Follow the workflow steps precisely. Do not skip the hypothesis validation step. A rigorous process leads to more accurate conclusions.</description>
<rationale>Skipping steps can lead to incorrect assumptions and wasted effort. The goal is to be confident in the proposed solution.</rationale>
</principle>
<principlepriority="high">
<name>Embrace Iteration</name>
<description>The investigation is not linear. Be prepared to go back to the search phase multiple times as you uncover new information. Each search should build on the last.</description>
<rationale>Complex issues rarely have a single, obvious cause. Iterative searching helps peel back layers and reveal the true root of the problem.</rationale>
</principle>
<principlepriority="medium">
<name>Think like a Skeptic</name>
<description>Your primary goal when you have a hypothesis is to try and break it. Actively look for evidence that you are wrong. This makes your final conclusion much stronger.</description>
<rationale>Confirmation bias is a common pitfall. By trying to disprove your own theories, you ensure a more objective and reliable investigation.</rationale>
</principle>
</general_principles>
<code_conventions>
<conventioncategory="searching">
<rule>Start with broad keywords from the issue, then narrow down your search using specific function names, variable names, or file paths discovered in the initial results.</rule>
<bad>Searching for a generic term like "error" without context.</bad>
</examples>
</convention>
</code_conventions>
<common_pitfalls>
<pitfall>
<description>Jumping to conclusions after the first search.</description>
<why_problematic>The first set of results might be misleading or only part of the story.</why_problematic>
<correct_approach>Always perform multiple rounds of searches, and always try to disprove your initial hypothesis.</correct_approach>
</pitfall>
<pitfall>
<description>Forgetting to use the todo list.</description>
<why_problematic>The todo list is essential for tracking the complex, multi-step investigation process. Without it, you can lose track of your progress and findings.</why_problematic>
<correct_approach>Update the todo list after each major step in the workflow.</correct_approach>
</pitfall>
</common_pitfalls>
<quality_checklist>
<categoryname="investigation">
<item>Have I extracted all relevant keywords from the issue?</item>
<item>Have I performed at least two rounds of codebase searches?</item>
<item>Have I genuinely tried to disprove my hypothesis?</item>
</category>
<categoryname="solution">
<item>Is the proposed solution theoretical and not stated as a definitive fact?</item>
<item>Is the explanation clear and easy to understand?</item>
</category>
<categoryname="communication">
<item>Does the draft comment sound conversational and human?</item>
<item>Does the draft comment start with "Hey @roomote-agent,"?</item>
<item>Have I avoided technical jargon where possible?</item>
<item>Is the tone helpful and not condescending?</item>
<usage>For investigating bug reports where something is broken.</usage>
<template>
<workflow>
<step>1. Identify the exact error message from the issue.</step>
<step>2. Search for the error message in the codebase using `codebase_search`.</step>
<step>3. Analyze the code that throws the error to understand the context.</step>
<step>4. Trace the execution path backward from the error to find where the problem originates.</step>
<step>5. Form a hypothesis about the incorrect logic or state.</step>
<step>6. Try to disprove the hypothesis by checking for alternative paths or configurations.</step>
<step>7. Propose a code change to correct the logic.</step>
</workflow>
</template>
</pattern>
<patternname="unexpected_behavior_investigation">
<usage>For investigating issues where the system works but not as expected.</usage>
<template>
<workflow>
<step>1. Identify the feature or component exhibiting the unexpected behavior.</step>
<step>2. Use `codebase_search` to find the main implementation files for that feature.</step>
<step>3. Read the relevant code to understand the intended logic.</step>
<step>4. Form a hypothesis about which part of the logic is producing the unexpected result.</step>
<step>5. Look for related code, configurations, or data that might influence the behavior in an unexpected way.</step>
<step>6. Try to disprove the hypothesis. For example, if you think a configuration flag is the cause, check where it's used and if it could be set differently.</step>
<step>7. Suggest a change to the logic or configuration to align it with the expected behavior.</step>
</workflow>
</template>
</pattern>
<patternname="performance_issue_investigation">
<usage>For investigating issues related to slowness or high resource usage.</usage>
<template>
<workflow>
<step>1. Identify the specific action or process that is slow.</step>
<step>2. Use `codebase_search` to find the code responsible for that action.</step>
<step>3. Look for common performance anti-patterns: loops with expensive operations, redundant database queries, inefficient algorithms, etc.</step>
<step>4. Form a hypothesis about the performance bottleneck.</step>
<step>5. Try to disprove the hypothesis. Could another part of the system be contributing to the slowness?</step>
<step>6. Propose a more efficient implementation, such as caching, batching operations, or using a better algorithm.</step>
<expected_outcome>Get the title "Login fails silently" and body "Users with valid credentials are not able to log in. The page just refreshes without any error message."</expected_outcome>
</step>
<stepnumber="2">
<description>Create the initial investigation plan.</description>
<tool_use><![CDATA[
<update_todo_list>
<todos>
[x] Extract keywords from the issue title and body.
[-] Perform initial codebase search with keywords.
[ ] Analyze search results and form a hypothesis.
[ ] Attempt to disprove the hypothesis.
[ ] Formulate a theoretical solution.
[ ] Draft a comment for the user.
</todos>
</update_todo_list>
]]></tool_use>
</step>
<stepnumber="3">
<description>Perform initial codebase search using keywords "login", "authentication", "silent fail".</description>
<analysis>The search results point to `src/auth/login.ts` as a highly relevant file.</analysis>
</step>
<stepnumber="4">
<description>Read the contents of the relevant file.</description>
<tool_use><![CDATA[
<read_file>
<path>src/auth/login.ts</path>
</read_file>
]]></tool_use>
<analysis>
The file contains a `try...catch` block in the `handleLogin` function. The `catch` block is empty, which explains the silent failure. This is the likely cause. Hypothesis: The login process is failing inside the try block, but the error is swallowed by the empty catch block.
</analysis>
</step>
<stepnumber="5">
<description>Attempt to disprove the hypothesis by looking for other error handling mechanisms.</description>
<analysis>No global error handling middleware seems to be in use that would override this local empty catch block. The hypothesis stands.</analysis>
</step>
<stepnumber="6">
<description>Formulate a solution and draft a comment.</description>
<draft>
"Hey @roomote-agent, I took a look at this issue and it seems like the problem is in the `handleLogin` function in `src/auth/login.ts`. There's an empty `try...catch` block that is likely catching the login error and preventing any message from being shown to the user.
A good first step to fixing this would be to add some logging to the `catch` block to see what error is actually happening. Then, we should probably implement proper error feedback to the user on the login page. This should solve the issue of the silent failure."
</draft>
</step>
<stepnumber="7">
<description>Ask the user for confirmation before posting the comment.</description>
<tool_use><![CDATA[
<ask_followup_question>
<question>I've investigated the issue and drafted a comment with my findings and a suggested solution. Would you like me to post it to the GitHub issue?</question>
<follow_up>
<suggest>Yes, please post the comment to the issue.</suggest>
<suggest>Show me the draft comment first.</suggest>
<suggest>No, do not post the comment.</suggest>
</follow_up>
</ask_followup_question>
]]></tool_use>
</step>
</workflow>
<key_takeaways>
<takeaway>Empty catch blocks are a strong indicator of silent failures.</takeaway>
<takeaway>Always try to disprove a hypothesis by looking for conflicting code patterns.</takeaway>
If Step 2's combined detection output includes IS_MONOREPO and ROOTS, mark this step complete and proceed to Step 4. Otherwise, use the manual process below.
Identify whether this is a monorepo and record the search root(s).
1) List top-level entries:
<list_files>
<path>.</path>
<recursive>false</recursive>
</list_files>
2) Monorepo indicators:
- package.json with "workspaces"
- lerna.json, pnpm-workspace.yaml, rush.json
- Top-level directories like apps/, packages/, services/, libs/
If monorepo is detected:
- Discover package roots by locating package.json files under these directories
- Prefer scoping searches to the package most aligned with the user's description
[ ] Clarify missing details (repro or desired outcome)
[ ] Classify type (Bug | Enhancement)
[ ] Assemble Issue Body
[ ] Review and submit (Submit now | Submit now and assign to me)
</todos>
</update_todo_list>
</instructions>
</step>
<stepnumber="5">
<name>Clarify Missing Details (Guided by Findings)</name>
<instructions>
Ask minimal, targeted questions grounded by what you found in code.
For Bug reports:
<ask_followup_question>
<question>I’m verifying the behavior around [feature/component inferred from code]. Could you provide a minimal reproduction and quick impact details?</question>
<follow_up>
<suggest>Repro format: 1) Environment/setup 2) Steps 3) Expected 4) Actual 5) Variations (only if you tried them)</suggest>
<suggest>Impact: Who is affected and how often does this happen?</suggest>
<suggest>Cost: Approximate time or outcome cost per occurrence (optional)</suggest>
</follow_up>
</ask_followup_question>
For Enhancements:
<ask_followup_question>
<question>To capture the improvement well, what is the user goal and value in plain language?</question>
<follow_up>
<suggest>State the user goal and when it occurs</suggest>
<suggest>Describe the desired behavior conceptually (no code)</suggest>
<suggest>Value: Who benefits and what improves (speed, clarity, fewer errors, conversions)?</suggest>
</follow_up>
</ask_followup_question>
Discrepancies:
- If you found contradictions between description and code, present concrete, plain-language examples (no code) and ask for confirmation.
Loop-back:
- After receiving any answer, return to Step 4 (Discovery) with the new information and repeat as needed.
[x] Clarify missing details (repro or desired outcome)
[-] Classify type (Bug | Enhancement)
[ ] Assemble Issue Body
[ ] Review and submit (Submit now | Submit now and assign to me)
</todos>
</update_todo_list>
</instructions>
</step>
<stepnumber="7">
<name>Assemble Issue Body</name>
<instructions>
Build a concise, non-technical issue body. Omit empty sections entirely.
Format:
```
## Type
Bug | Enhancement
## Problem / Value
[One or two sentences that capture the problem and why it matters in plain language]
## Context
[Who is affected and when it happens]
[Enhancement: desired behavior conceptually, in the user's words]
[Bug: current observed behavior in plain language]
## Reproduction (Bug only, if available)
1) Steps (each action/command)
2) Expected result
3) Actual result
4) Variations tried (include only if the user explicitly provided them)
## Constraints/Preferences
[Performance, accessibility, UX, or other considerations]
```
Rules:
- Keep non-technical; do NOT include code paths, line numbers, stack traces, or diffs.
- Ground the wording in verified behavior, but keep implementation details internal.
- Sourcing: Do not infer or fabricate reproduction details or “Variations tried.” Include them only if explicitly provided by the user; otherwise omit the line.
- Quoting fidelity: If the user lists “Variations tried,” include them faithfully (verbatim or clearly paraphrased without adding new items).
- Value framing: Ensure the “Problem / Value” explains why it matters (impact on users or outcomes) in plain language.
- Title: Produce a concise Title (≤ 80 chars) prefixed with [BUG] or [ENHANCEMENT]; when helpful, append a brief value phrase in parentheses, e.g., “(blocks new runs)”.
Iteration note:
- If new info arrives after drafting, loop back to Step 4, then update this draft accordingly.
- Loop back to Step 4 (Discovery) if new information affects context
- Re-assemble in Step 7
- Rerun this step and present the updated issue details
On success: Capture the created issue URL from stdout and complete:
<attempt_completion>
<result>
Created issue: [URL]
</result>
</attempt_completion>
On failure: Present the error succinctly and offer to retry after fixing gh setup (installation/auth). Provide the computed Title and Body inline so the user can submit manually if needed.
[x] Clarify missing details (repro or desired outcome)
[x] Classify type (Bug | Enhancement)
[x] Assemble Issue Body
[x] Review and submit (Submit now | Submit now and assign to me)
</todos>
</update_todo_list>
</instructions>
</step>
</steps>
<completion_criteria>
<criterion>Repository detection (git repo present and origin remote configured) is performed before any submission.</criterion>
<criterion>Issue is submitted via gh after choosing "Submit now" or "Submit now and assign to me", and the created issue URL is returned.</criterion>
<criterion>When "Submit now and assign to me" is chosen, the issue is assigned to the current GitHub user using --assignee "@me" (or gh issue edit fallback).</criterion>
<criterion>Submission uses Title and Body only and specifies --repo [OWNER_REPO] discovered in Step 2; no temporary files or file paths are used.</criterion>
<criterion>Language is plain and user-centric; no technical artifacts included in the issue body.</criterion>
<criterion>Content grounded by repeated codebase exploration cycles as needed.</criterion>
<criterion>Early-stop/escalate-once applied per iteration; unlimited iterations across the conversation.</criterion>
<criterion>The merged step offers "Submit now" or "Submit now and assign to me"; any other response is treated as a change request and the step is shown again with the full current issue details.</criterion>
<label>What specific problem does this solve?</label>
<description>
**Be concrete and detailed.** Explain the problem from a user's perspective.
✅ **Good examples (specific, clear impact):**
- "When running large tasks, users wait 5+ minutes because tasks execute sequentially instead of in parallel, blocking productivity"
- "AI can only read one file per request, forcing users to make multiple requests for multi-file projects, increasing wait time from 30s to 5+ minutes"
- "Dark theme users can't see the submit button because it uses white text on light grey background"
❌ **Poor examples (vague, unclear impact):**
- "The UI looks weird" -> What specifically looks weird? On which screen? What's the impact?
- "System prompt is not good" -> What's wrong with it? What behaviour does it cause? What should it do instead?
- "Performance could be better" -> Where? How slow is it currently? What's the user impact?
**Your problem description should answer:**
- Who is affected? (all users, specific user types, etc.)
- When does this happen? (specific scenarios/steps)
- What's the current behaviour vs expected behaviour?
- What's the impact? (time wasted, errors caused, etc.)
</description>
<placeholder>Be specific about the problem, who it affects, and the impact. Avoid generic statements like "it's slow" or "it's confusing."</placeholder>
<label>How should this be solved? (REQUIRED if contributing, optional otherwise)</label>
<description>
**If you want to implement this feature, this section is REQUIRED.**
**Describe your solution in detail.** Explain not just what to build, but how it should work.
✅ **Good examples:**
- "Add parallel task execution: Allow up to 3 tasks to run simultaneously with a queue system for additional tasks. Show progress for each active task in the UI."
- "Enable multi-file AI processing: Modify the request handler to accept multiple files in a single request and process them together, reducing round trips."
- "Fix button contrast: Change submit button to use primary colour on dark theme (white text on blue background) instead of current grey."
❌ **Poor examples:**
- "Make it faster" -> How? What specific changes?
- "Improve the UI" -> Which part? What specific improvements?
- "Fix the prompt" -> What should the new prompt do differently?
**Your solution should explain:**
- What exactly will change?
- How will users interact with it?
- What will the new behaviour look like?
</description>
<placeholder>Describe the specific changes and how they will work. Include user interaction details if relevant.</placeholder>
<label>Technical considerations (REQUIRED if contributing, optional otherwise)</label>
<description>
**If you want to implement this feature, this section is REQUIRED.**
Share technical insights that could help planning:
- Implementation approach or architecture changes
- Performance implications
- Compatibility concerns
- Systems that might be affected
- Potential blockers you can foresee
</description>
<placeholder>e.g., "Will need to refactor task manager", "Could impact memory usage on large files", "Requires a large portion of code to be rewritten"</placeholder>
<placeholder>e.g., "Alternative: use library X but it is 500KB larger", "Risk: might slow older devices", "Breaking: changes API response format"</placeholder>
</field>
</contributor_fields>
</feature_request_template>
<template_changes_summary>
<changetype="focus_shift">
Template now focuses on problem reporting first, with solution contribution as optional
</change>
<changetype="required_fields">
Only problem description and context are required for basic submission
</change>
<changetype="contributor_section">
Technical fields (solution, acceptance criteria, etc.) are only required if user wants to contribute
</change>
<changetype="clear_exit_point">
Users can submit after describing the problem without technical details
</change>
<changetype="guidance_separation">
Implementation guidance moved to contributor section only
- Focus on helping users describe problems clearly, not solutions
- The Roo team will design solutions unless the user explicitly wants to contribute
- Don't push users to provide technical details they may not have
- Make it easy for non-technical users to report issues effectively
</problem_reporting_focus>
<general_practices>
- Always search for existing similar issues before creating a new one
- Search GitHub Discussions (especially feature-requests category) for related topics
- Include specific version numbers and environment details
- Use code blocks with syntax highlighting for code snippets
- Make titles descriptive but concise (e.g., "Dark theme: Submit button invisible due to white-on-grey text")
- For bugs, always test if the issue is reproducible
- Include screenshots or mockups when relevant (ask user to provide)
- Link to related issues or PRs if found during exploration
- Add "Closes #[number]" for discussions that would be fully addressed by the issue
- Add "Related to #[number]" for partially related discussions
</general_practices>
<contributor_specific>
- Only explore codebase if user wants to contribute
- Reference specific files and line numbers from codebase exploration
- Ensure technical proposals align with project architecture
- Include implementation steps and technical analysis
- Provide clear acceptance criteria in Given/When/Then format
- Consider trade-offs and alternative approaches
</contributor_specific>
<mode_scope>
This mode assembles a template-free issue body grounded by codebase exploration and can submit it via GitHub CLI after explicit confirmation.
Submission uses Title and Body only and targets the detected repository after the merged Review and Submit step.
</mode_scope>
<mode_behavior>
- Treat the user's FIRST message as the issue description; do not ask if they want to create an issue.
- Start with repository detection (verify git repo; resolve OWNER/REPO from origin), then determine repository structure (monorepo/standard).
- After detection, begin codebase discovery scoped to the repository root or the selected package (in monorepos).
- Keep final output non-technical; implementation details remain internal.
</mode_behavior>
<value_framing>
<principles>
- Always pair the problem with user-facing value: who is impacted, when it occurs, and why it matters.
- Keep value non-technical (clarity, time saved, fewer errors, better UX, improved accessibility, reduced confusion).
</principles>
<lightweight_impact_options>
- Severity: Blocker | High | Medium | Low (optional)
- Reach: Few | Some | Many (optional)
</lightweight_impact_options>
</value_framing>
<sourcing_and_provenance>
<direct_from_user_only>
- Reproduction steps
- Variations tried
- Environment details
</direct_from_user_only>
<inference_allowed_with_care>
- Problem/Value statement (plain-language synthesis from user wording)
- Context (who/when) based on user input; keep code-based signals internal
</inference_allowed_with_care>
<hallucination_guards>
- Never fabricate “Variations tried.” If not provided, omit.
- If critical details are missing, ask targeted questions; otherwise proceed with omissions.
</hallucination_guards>
</sourcing_and_provenance>
<cli_submission>
<confirmation>
Use a single merged "Review and Submit" step with options:
- Submit now
- Submit now and assign to me
Any other response is treated as a change request and the step is rerun after applying edits.
</confirmation>
<repo_detection>
Submission requires repository detection (git present, origin configured). Capture normalized OWNER/REPO (e.g., owner/repo) and store as [OWNER_REPO] for submission.
</repo_detection>
<target_repo>
Always specify the target using --repo "[OWNER_REPO]" to avoid ambiguity and ensure the correct repository is used.
</target_repo>
<assignment>
When "Submit now and assign to me" is chosen, create using: --assignee "@me".
If creation with --assignee fails (e.g., permissions), create the issue without an assignee and immediately run:
Use --body with robust quoting (for example: --body "$(printf '%s\n' "[ISSUE_BODY]")") or a heredoc; do not create temporary files or reference file paths. Always include --repo "[OWNER_REPO]" and echo the resulting issue URL.
In execute_command calls, output only the command string; never include XML tags, CDATA markers, code fences, or backticks in the command payload.
</command_safety>
<error_handling>
On gh errors (installation/auth), present the error and offer to retry after fixing gh setup. Surface the computed Title and Body inline
so the user can submit manually if needed.
</error_handling>
</cli_submission>
<codebase_exploration>
<principles>
- Use semantic search first to find relevant areas.
- Refine with targeted regex for exact strings (errors, component names, flags).
- Read key files to verify behavior; keep evidence internal.
- Early-stop when hits converge (~70%) or you can name the exact feature/component.
- Escalate-once if signals conflict; run one refined batch, then proceed.
- At each review stage, present the full current issue details (Title + Body) in a markdown code block.
- Offer "Submit now" or "Submit now and assign to me" suggestions; treat any other response as a change request and rerun the step after applying edits.
</review_stage_presentation>
<autonomy_and_budgets>
- Tool preambles: restate goal briefly, outline a short plan, narrate progress succinctly, summarize final delta.
- One-tool-per-message: await results before continuing.
- Discovery budget: default max 3 searches before escalate-once; stop when sufficient.
- Early-stop: when top hits converge or target is identifiable.
- Verbosity: low narrative; detail appears only in structured outputs.
</autonomy_and_budgets>
<communication_guidelines>
- Be supportive and encouraging to problem reporters
- Don't overwhelm users with technical questions upfront
- Clearly indicate when technical sections are optional
- Guide contributors through the additional requirements
- Make the "submit now" option clear for problem reporters
- Be direct and concise; avoid jargon in the final issue body.
- Keep questions optional and easy to answer with suggested options.
- Skipping repository detection (git + origin) before discovery or submission
- Not validating repository context before gh commands
</mode_initialization_mistakes>
<scope_mistakes>
- Submitting without explicit user confirmation ("Submit now")
- Targeting the wrong repository by relying on current directory defaults; always pass --repo OWNER/REPO detected in Step 2
- Performing PR prep, complexity estimates, or technical scoping
</scope_mistakes>
<submission_mistakes>
<mistake_block>
<mistake>Splitting final review and submission into multiple steps</mistake>
<impact>Creates redundant prompts and inconsistent state; leads to janky UX</impact>
<correct_approach>Use a single merged "Review and Submit" step offering only: Submit now, Submit now and assign to me; treat any other response as a change request</correct_approach>
</mistake_block>
<mistake_block>
<mistake>Not offering "Submit now and assign to me"</mistake>
<correct_approach>Provide the assignment option and use gh issue create --assignee "@me"; if that fails, immediately run gh issue edit <issue-url-or-number> --add-assignee "@me"</correct_approach>
</mistake_block>
<mistake_block>
<mistake>Using temporary files or --body-file for issue body submission</mistake>
<impact>Introduces filesystem dependencies and leaks paths; contradicts single-command policy</impact>
<correct_approach>Use inline --body with robust quoting, e.g., --body "$(printf '%s\n' "[ISSUE_BODY]")"; do not reference any file paths</correct_approach>
</mistake_block>
<mistake_block>
<mistake>Omitting --repo or relying on current directory defaults</mistake>
<impact>May submit to the wrong repository in multi-repo or worktree contexts</impact>
<correct_approach>Always pass --repo [OWNER_REPO] detected in Step 2</correct_approach>
</mistake_block>
<mistake_block>
<mistake>Attempting submission without prior repository detection</mistake>
<impact>Commands may target the wrong repo or fail</impact>
<correct_approach>Detect git repo and ensure origin is configured before any gh commands</correct_approach>
</mistake_block>
</submission_mistakes>
<sourcing_mistakes>
<mistake_block>
<mistake>Inventing or inferring “Variations tried” when the user didn’t provide any</mistake>
<impact>Misleads triage and wastes time reproducing non-existent attempts</impact>
<correct_approach>Omit the “Variations tried” line entirely unless explicitly provided; if needed, ask a targeted question first</correct_approach>
</mistake_block>
<mistake_block>
<mistake>Framing only the problem without the value/impact</mistake>
<impact>Makes prioritization harder; obscures who benefits and why it matters</impact>
<correct_approach>Pair the problem with a plain-language value statement (who, when, why it matters)</correct_approach>
</mistake_block>
<mistake_block>
<mistake>Overstating impact without user signal</mistake>
<impact>Damages credibility and misguides prioritization</impact>
<correct_approach>Use conservative, plain language; if unsure, omit severity/reach or ask a single targeted question</correct_approach>
</mistake_block>
</sourcing_mistakes>
<problem_reporting_mistakes>
- Vague descriptions like "doesn't work" or "broken"
- Missing reproduction steps for bugs
- Feature requests without clear problem statements
- Not explaining the impact on users
- Forgetting to specify when/how the problem occurs
- Using wrong labels or no labels
- Titles that don't summarize the issue
- Not checking for duplicates
- Vague descriptions like "doesn't work" without who/when impact
Examples of assembling template-free issue prompts grounded by codebase exploration, with optional CLI submission after explicit confirmation.
Repository detection precedes submission; review and submission occur in a single merged step offering "Submit now" or "Submit now and assign to me". Any other response is treated as a change request.
</overview>
<examplename="bug_dark_theme_button_invisible">
<user_input>
In dark theme the Submit button is almost invisible on the New Run page.
If a change request is provided, collect the requested edits, update the draft (re-run discovery if new info affects context), then rerun this merged step.
<policy>Issues are template-free (Title + Body only).</policy>
<policy>Repository detection (git + origin → OWNER/REPO) occurs before submission and is passed explicitly via --repo [OWNER_REPO].</policy>
<policy>Never use --body-file or temporary files; submit with inline --body only (no file paths).</policy>
<policy>Review and submission happen in one merged step offering "Submit now" or "Submit now and assign to me"; any other response is treated as a change request.</policy>
<policy>All discovery is internal; keep final output plain-language.</policy>
<command>GIT_EDITOR=true git rebase --continue</command>
</execute_command>
]]></tool_use>
<expected_output><![CDATA[
[detached HEAD def789] Fix memory leak in data processor
2 files changed, 12 insertions(+), 2 deletions(-)
Successfully rebased and updated refs/heads/fix/memory-leak.
]]></expected_output>
</step>
<stepnumber="9">
<description>Final validation</description>
<tool_use><![CDATA[
<execute_command>
<command>git status</command>
</execute_command>
]]></tool_use>
<expected_output><![CDATA[
On branch fix/memory-leak
Your branch is ahead of 'origin/fix/memory-leak' by 1 commit.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
]]></expected_output>
<tool_use><![CDATA[
<execute_command>
<command>git diff origin/main --stat</command>
</execute_command>
]]></tool_use>
<expected_output><![CDATA[
src/data/processor.ts | 8 ++++++--
src/data/processor.test.ts | 4 ++--
2 files changed, 8 insertions(+), 4 deletions(-)
]]></expected_output>
</step>
</workflow>
<completion><![CDATA[
<attempt_completion>
<result>
Successfully resolved merge conflicts for PR #123 "Fix memory leak in data processor".
Resolution Summary:
- src/data/processor.ts: Combined the async/await refactor with the memory leak fix by preserving listener tracking and cleanup logic within the refactored async method
- src/data/processor.test.ts: Updated tests to work with the async implementation while maintaining memory leak test coverage
Both the feature refactor and the critical bugfix have been preserved in the resolution. The rebase has been completed successfully and the branch is ready to be pushed.
</result>
</attempt_completion>
]]></completion>
<key_takeaways>
<takeaway>Always checkout PR with --force and rebase to reveal conflicts</takeaway>
<takeaway>Fetch PR context to understand the intent of changes</takeaway>
<takeaway>Use git blame and commit messages to understand the history</takeaway>
<takeaway>Combine non-conflicting improvements when possible</takeaway>
<takeaway>Prioritize bugfixes while accommodating refactors</takeaway>
<takeaway>Use GIT_EDITOR=true to ensure non-interactive rebase operations</takeaway>
<takeaway>Complete the rebase process with GIT_EDITOR=true git rebase --continue</takeaway>
<takeaway>Validate that both sets of changes work together</takeaway>
<name>Delegate: Comprehensive Requirements and PR Analysis</name>
<instructions>
Launch a subtask in `architect` mode to perform a detailed analysis of the PR, its underlying requirements, and all issues that need to be addressed.
The context files in `.roo/temp/pr-fixer-orchestrator/[TASK_ID]/` will be the input for this subtask.
The subtask should write its findings to: `.roo/temp/pr-fixer-orchestrator/[TASK_ID]/pr_analysis_report.md`.
<new_task>
<mode>architect</mode>
<message>
**Task: Analyze Pull Request Requirements and Create Comprehensive Fix Plan**
You are an expert software architect. Your task is to analyze a pull request, understand its underlying requirements, and create a comprehensive plan to address all issues.
1. **Read PR Context**: The PR details are in:
- `.roo/temp/pr-fixer-orchestrator/[TASK_ID]/pr_context.json` - Full PR metadata
- `.roo/temp/pr-fixer-orchestrator/[TASK_ID]/full_merge_diff.txt` OR `.roo/temp/pr-fixer-orchestrator/[TASK_ID]/merge_diff_summary.txt` - Diff information
2. **Understand the PR's Purpose**:
- Extract the feature or bug being addressed from PR title, body, and linked issues
- Identify the acceptance criteria (from PR description or linked issue)
- Understand the intended functionality and expected behavior
- Note any design decisions or architectural choices made
3. **Perform Architectural Analysis**:
- **Map Component Interactions**: Trace the complete data flow for the PR's changes
- **Identify Paired Operations**: For any operation (e.g., export), find its counterpart (e.g., import)
- **Find Similar Patterns**: Search for existing implementations of similar features
- **Analyze Dependencies**: Identify all consumers of the functionality being modified
- **Assess Impact**: Determine how changes affect other parts of the system
4. **Explore Codebase Systematically**:
- Use `codebase_search` FIRST to understand the feature area
- Search for related functionality that might be affected
- Find all files that consume or depend on the changed functionality
- Identify configuration files, tests, and documentation that need updates
- Study similar features to understand established patterns
5. **Analyze Review Feedback**:
- Categorize review comments by type (bug, enhancement, style, etc.)
- Identify which comments are actionable vs informational
- Prioritize changes based on reviewer authority and importance
- Note any conflicting feedback that needs clarification
6. **Investigate Failing Tests**:
- For each failing check, determine the root cause
- Use `gh run view --log-failed` to get detailed error logs
- Identify if failures are due to code issues, flaky tests, or environment problems
- Determine which files need modification to fix test failures
7. **Assess Merge Conflicts**:
- Analyze the merge_conflicts.txt file
- Identify which files have conflicts
- Determine the complexity of conflict resolution
- Plan the rebase/merge strategy
8. **Create Comprehensive Fix Plan**: The plan must include:
- **PR Purpose Summary**: Clear description of what the PR is trying to achieve
- **Requirements Analysis**:
- Original requirements from issue or PR description
- Acceptance criteria that must be met
- Any missing functionality that needs to be added
- **Architectural Context**:
- Data flow diagram showing component interactions
- List of paired operations that must be updated together
- Dependencies and consumers of the affected functionality
- **Issue Summary**: Clear categorization of all issues found
- **Priority Order**: Which issues to tackle first and why
- **Review Feedback Analysis**:
- List of all actionable review comments
- Specific code changes required for each
- Any clarifications needed from reviewers
- **Test Failure Resolution**:
- Root cause of each failing test
- Files and changes needed to fix
- Any test updates required
- **Conflict Resolution Strategy**:
- Whether to rebase or merge
- Order of operations for conflict resolution
- Risk assessment of conflicts
- **Implementation Steps**:
- Detailed, ordered steps for fixing all issues
- Specific commands and file modifications
- Validation steps after each change
- **Risk Assessment**:
- Potential side effects of changes
- Areas requiring extra testing
- Backward compatibility concerns
9. **Save the Analysis**: Write the complete analysis to `.roo/temp/pr-fixer-orchestrator/[TASK_ID]/pr_analysis_report.md`.
**Critical Requirements:**
- Always understand the PR's underlying purpose before analyzing issues
- Be thorough in analyzing all aspects of the PR
- Consider the interaction between different fixes
- Provide specific, actionable steps
- Include exact commands where applicable
- **IMPORTANT**: Save your analysis to the specified file in .roo/temp/pr-fixer-orchestrator/[TASK_ID]/
**Completion Protocol:**
- This is your only task. Do not deviate from these instructions.
- Once you have successfully written the analysis report, you MUST signal completion by using the `attempt_completion` tool.
- The `result` parameter MUST be: "PR analysis complete and saved to .roo/temp/pr-fixer-orchestrator/[TASK_ID]/pr_analysis_report.md"
</message>
</new_task>
After launching the subtask, wait for it to complete. The orchestrator will then read the analysis report to proceed.
</instructions>
</step>
<stepnumber="4">
<name>Review Analysis and Get User Approval</name>
<instructions>
After the analysis subtask completes, present the findings to the user for approval.
Before pushing changes, have the PR reviewer mode review all changes to ensure quality.
<new_task>
<mode>pr-reviewer</mode>
<message>
**Task: Review PR Fix Implementation**
You are reviewing the fixes applied to PR #[pr_number]. Your task is to ensure all changes are high quality and properly address the original feedback.
**Context Files:**
- Original PR Analysis: `.roo/temp/pr-fixer-orchestrator/[TASK_ID]/pr_analysis_report.md`
<description>The orchestrator coordinates but doesn't implement. Use specialized modes for analysis, coding, testing, and review.</description>
<rationale>Each mode has specific expertise and permissions optimized for their tasks.</rationale>
</principle>
<principlepriority="critical">
<name>Maintain Context Between Steps</name>
<description>Use temporary files in .roo/temp/pr-fixer-orchestrator/[TASK_ID]/ to pass context between subtasks. ALL delegated tasks must save outputs to this directory.</description>
<rationale>Subtasks run in isolation and need explicit context sharing. Files saved elsewhere will be inaccessible to subsequent steps.</rationale>
</principle>
<principlepriority="critical">
<name>Get User Approval Before Committing</name>
<description>ALWAYS present changes and get explicit user approval before committing. Show modified files, summarize changes, and ask for confirmation.</description>
<rationale>Users must maintain control over what gets committed to their PR. Unexpected changes can break functionality or introduce unwanted modifications.</rationale>
</principle>
<principlepriority="critical">
<name>Understand Requirements First</name>
<description>Always analyze the PR's underlying purpose and requirements before fixing issues.</description>
<rationale>Fixing review comments without understanding the feature can lead to incomplete or incorrect solutions.</rationale>
</principle>
<principlepriority="high">
<name>Handle Large Diffs Gracefully</name>
<description>Check diff size before processing. If over 2000 lines, create a summary instead of including the full diff.</description>
<rationale>Large diffs can overwhelm context windows and make analysis difficult. Summaries maintain clarity.</rationale>
</principle>
</orchestration_principles>
<pr_fixing_guidelines>
- Always understand the PR's purpose and requirements first
- Analyze before implementing - understand all issues comprehensively
- Address review feedback with the same priority as the reviewer's authority
- Fix root causes of test failures, not just symptoms
- Ensure all original PR requirements are met, not just review comments
- Resolve conflicts carefully, understanding both sides of changes
- Validate all changes before committing to avoid breaking the PR further
- NEVER use `git add -A` - always stage specific files intentionally
- Get user approval before committing any changes
- Keep commits focused and well-described
- Always check if PR is from a fork to push to correct remote
- Monitor CI/CD checks in real-time after pushing
- Consider translation needs for any user-facing changes
- Document what was changed and why in the PR update message
- Use the EXACT PR template format specified in 6_pr_template_format.xml
</pr_fixing_guidelines>
<git_operation_best_practices>
<practicecategory="conflict_resolution">
<name>Non-Interactive Rebasing</name>
<description>Always use GIT_EDITOR=true for automated rebase operations</description>
<example>GIT_EDITOR=true git rebase origin/main</example>
</practice>
<practicecategory="remote_handling">
<name>Fork-Aware Pushing</name>
<description>Always check isCrossRepository before pushing</description>
<steps>
- Check if PR is from fork using gh pr view --json isCrossRepository
- Add fork remote if needed
- Push to correct remote (origin vs fork)
</steps>
</practice>
<practicecategory="safe_pushing">
<name>Force with Lease</name>
<description>Use --force-with-lease for safer force pushing</description>
<fallback>If it fails, fetch and use --force</fallback>
</practice>
<practicecategory="staging_files">
<name>Selective File Staging</name>
<description>Always stage files individually, never use git add -A</description>
<steps>
- Review all modified files with git status
- Stage only files that were intentionally modified
- Use git add [specific-file] for each file
- Double-check staged files with git diff --cached
</steps>
<rationale>Prevents accidentally committing temporary files, debug logs, or unintended changes</rationale>
</practice>
<practicecategory="diff_management">
<name>Large Diff Handling</name>
<description>Check diff size before including in context files</description>
<steps>
- Save diff to file and check line count with wc -l
- If over 2000 lines, create a summary instead
- Include file counts, insertion/deletion stats
- List most significantly changed files
</steps>
</practice>
</git_operation_best_practices>
<subtask_delegation_patterns>
<patternname="analysis_delegation">
<to_mode>architect</to_mode>
<purpose>Comprehensive analysis and planning</purpose>
<provides>Detailed reports and implementation plans</provides>
<output_requirement>MUST save all outputs to .roo/temp/pr-fixer-orchestrator/[TASK_ID]/</output_requirement>
</pattern>
<patternname="implementation_delegation">
<to_mode>code</to_mode>
<purpose>Executing code changes and fixes</purpose>
<provides>Implemented solutions and change summaries</provides>
<output_requirement>MUST save changes_implemented.md to .roo/temp/pr-fixer-orchestrator/[TASK_ID]/</output_requirement>
</pattern>
<patternname="validation_delegation">
<to_mode>test</to_mode>
<purpose>Testing and validating changes</purpose>
<provides>Test results and validation reports</provides>
<output_requirement>MUST save validation_report.md to .roo/temp/pr-fixer-orchestrator/[TASK_ID]/</output_requirement>
</pattern>
<patternname="review_delegation">
<to_mode>pr-reviewer</to_mode>
<purpose>Final quality review before submission</purpose>
<provides>Quality assessment and recommendations</provides>
<output_requirement>MUST save final_review.md to .roo/temp/pr-fixer-orchestrator/[TASK_ID]/</output_requirement>
</pattern>
<patternname="translation_delegation">
<to_mode>translate</to_mode>
<purpose>Updating translations for UI changes</purpose>
<provides>Synchronized translations across languages</provides>
<output_requirement>MUST save translation_summary.md to .roo/temp/pr-fixer-orchestrator/[TASK_ID]/</output_requirement>
</pattern>
</subtask_delegation_patterns>
<error_handling>
<scenarioname="auth_failure">
<error>GitHub CLI authentication error</error>
<action>Prompt user to run 'gh auth login'</action>
</scenario>
<scenarioname="no_linked_issue">
<error>No linked issue found</error>
<action>Extract requirements from PR description and comments</action>
</scenario>
<scenarioname="push_failure">
<error>Force-with-lease push fails</error>
<action>Fetch latest and retry with --force</action>
</scenario>
<scenarioname="large_diff">
<error>Diff exceeds 2000 lines</error>
<action>Create summary with stats instead of full diff</action>
</scenario>
<scenarioname="missing_context_files">
<error>Expected context files not found in temp directory</error>
<action>Check if delegated task saved to correct location, re-run if needed</action>
</scenario>
</error_handling>
<user_interaction_guidelines>
<guidelinepriority="critical">
<name>Pre-Commit Approval</name>
<description>Always get explicit user approval before committing changes</description>
<implementation>
- Show list of modified files
- Summarize key changes made
- Present clear approval options
- Wait for user confirmation
</implementation>
</guideline>
<guidelinepriority="high">
<name>Clear Communication</name>
<description>Present information clearly and concisely</description>
<!-- Every PR MUST be linked to an approved issue. -->
Closes: #456
### Roo Code Task Context (Optional)
<!--
If you used Roo Code to help create this PR, you can share public task links here.
This helps reviewers understand your development process and provides additional context.
Example: https://app.roocode.com/share/task-id
-->
_No Roo Code task context for this PR._
### Description
<!--
Briefly summarize the changes in this PR and how they address the linked issue.
The issue should cover the "what" and "why"; this section should focus on:
- The "how": key implementation details, design choices, or trade-offs made.
- Anything specific reviewers should pay attention to in this PR.
-->
This PR addresses the review feedback and fixes identified issues for #789.
**Key Changes:**
- Fixed TypeScript type errors in the API handler by adding proper type annotations
- Improved error handling in the authentication flow to handle edge cases
- Refactored complex functions for better testability and maintainability
- Added missing user role management functionality
- Resolved merge conflicts with the latest main branch
**Review Comments Addressed:**
- Added timeout handling with exponential backoff for network requests
- Refactored large functions into smaller, testable units
- Added comprehensive TypeScript interfaces for API responses
- Improved error messages for better debugging
**Test Failures Fixed:**
- Updated email validation tests to match new validation rules
- Fixed mock server responses in integration tests
- Added missing test coverage for new functionality
### Test Procedure
<!--
Detail the steps to test your changes. This helps reviewers verify your work.
- How did you test this specific implementation? (e.g., unit tests, manual testing steps)
- How can reviewers reproduce your tests or verify the fix/feature?
- Include relevant testing environment details if applicable.
-->
**Testing performed:**
1. Ran all unit tests locally: `npm test`
2. Ran integration tests: `npm run test:integration`
3. Manual testing steps:
- Created new user with various role types
- Tested authentication flow with invalid credentials
- Verified timeout handling with slow network simulation
**To verify these changes:**
1. Check out this branch
2. Run `npm install && npm test`
3. Start the dev server with `npm run dev`
4. Test the authentication flow at http://localhost:3000/login
**Test Environment:**
- Node.js version: 18.17.0
- OS: Windows 11
- Browser: Chrome 120
### Pre-Submission Checklist
<!-- Go through this checklist before marking your PR as ready for review. -->
- [x] **Issue Linked**: This PR is linked to an approved GitHub Issue (see "Related GitHub Issue" above).
- [x] **Scope**: My changes are focused on the linked issue (one major feature/fix per PR).
- [x] **Self-Review**: I have performed a thorough self-review of my code.
- [x] **Testing**: New and/or updated tests have been added to cover my changes (if applicable).
- [x] **Documentation Impact**: I have considered if my changes require documentation updates (see "Documentation Updates" section below).
- [x] **Contribution Guidelines**: I have read and agree to the [Contributor Guidelines](/CONTRIBUTING.md).
### Screenshots / Videos
<!--
For UI changes, please provide before-and-after screenshots or a short video of the *actual results*.
This greatly helps in understanding the visual impact of your changes.
-->
_No UI changes in this PR._
### Documentation Updates
<!--
Does this PR necessitate updates to user-facing documentation?
- [ ] No documentation updates are required.
- [ ] Yes, documentation updates are required. (Please describe what needs to be updated or link to a PR in the docs repository).
-->
- [x] No documentation updates are required.
### Additional Notes
<!-- Add any other context, questions, or information for reviewers here. -->
All review feedback has been addressed. The main architectural change was refactoring the authentication service to use dependency injection, which improves testability.
**Files Modified:**
```
src/api/handler.ts - Added type annotations, improved error handling
src/services/auth.service.ts - Refactored for dependency injection
src/services/user.service.ts - Added role management functionality
src/types/api.types.ts - New TypeScript interfaces
This mode is designed to help resolve issues in existing pull requests. It analyzes PR feedback from GitHub, checks for failing tests and merge conflicts, gathers context, and guides the user toward a solution.
This mode is designed to help resolve issues in existing pull requests. It analyzes PR feedback from GitHub, checks for failing tests and merge conflicts, gathers context, and guides the user toward a solution. All GitHub operations are performed using the GitHub CLI.
<description>Analyze the gathered information to identify the core problems.</description>
<steps>
<step>Summarize review comments and requested changes.</step>
<step>Identify the root cause of failing tests by analyzing logs.</step>
<step>Determine if merge conflicts exist.</step>
<step>Summarize review comments and requested changes from gh pr view output.</step>
<step>Identify the root cause of failing tests by analyzing workflow logs with 'gh run view'.</step>
<step>Determine if merge conflicts exist from mergeable status.</step>
</steps>
</phase>
@ -41,13 +41,16 @@
<phasename="implementation">
<description>Execute the user's chosen course of action.</description>
<steps>
<step>Check out the PR branch locally using 'gh pr checkout --force'.</step>
<step>Determine if the PR is from a fork by checking 'gh pr view --json isCrossRepository'.</step>
<step>Check out the PR branch locally using 'gh pr checkout [PR_NUMBER] --repo [owner]/[repo] --force'.</step>
<step>Determine if the PR is from a fork by checking 'gh pr view [PR_NUMBER] --repo [owner]/[repo] --json isCrossRepository'.</step>
<step>Apply code changes based on review feedback using file editing tools.</step>
<step>Fix failing tests by modifying test files or source code as needed.</step>
<step>For conflict resolution: Use GIT_EDITOR=true for non-interactive rebases, then resolve conflicts via file editing.</step>
<step>For conflict resolution: Delegate to merge-resolver mode using new_task with the PR number.</step>
<step>If changes affect user-facing content (i18n files, UI components, announcements), delegate translation updates using the new_task tool with translate mode.</step>
<step>Commit changes using git commands.</step>
<step>Review modified files with 'git status --porcelain' to ensure no temporary files are included.</step>
<step>Stage files selectively using 'git add -u' (for modified tracked files) or 'git add <specific-files>' (for new files).</step>
<step>Verify staged files with 'git diff --cached --name-only' before committing.</step>
<step>Commit changes using git commands with descriptive messages.</step>
<step>Push changes to the correct remote (origin for same-repo PRs, fork remote for cross-repo PRs) using 'git push --force-with-lease'.</step>
</steps>
</phase>
@ -55,10 +58,10 @@
<phasename="validation">
<description>Verify that the pushed changes resolve the issues.</description>
<steps>
<step>Use 'gh pr checks --watch' to monitor check status in real-time until all checks complete.</step>
<step>If needed, check specific workflow runs with 'gh run list --pr' for detailed CI/CD pipeline status.</step>
<step>Use 'gh pr checks [PR_NUMBER] --repo [owner]/[repo] --watch' to monitor check status in real-time until all checks complete.</step>
<step>If needed, check specific workflow runs with 'gh run list --pr [PR_NUMBER] --repo [owner]/[repo]' for detailed CI/CD pipeline status.</step>
<step>Verify that all translation updates (if any) have been completed and committed.</step>
<step>Confirm PR is ready for review by checking mergeable state with 'gh pr view --json'.</step>
<step>Confirm PR is ready for review by checking mergeable state with 'gh pr view [PR_NUMBER] --repo [owner]/[repo] --json mergeable,mergeStateStatus'.</step>
<bad>Always push to origin without checking PR source</bad>
</example>
</principle>
<principlepriority="high">
<name>Safe File Staging</name>
<description>Always review files before staging to avoid committing temporary files, build artifacts, or system files. Use selective git commands that respect .gitignore.</description>
<rationale>Committing unwanted files can expose sensitive data, clutter the repository, and cause CI/CD failures.</rationale>
<example>
<scenario>Staging files for commit</scenario>
<good>Use 'git add -u' to stage only modified tracked files, or explicitly list files to add</good>
<bad>Use 'git add .' which stages everything including temp files</bad>
</example>
<checklist>
<item>Review git status before staging</item>
<item>Check for temporary files (.swp, .DS_Store, *.tmp)</item>
<item>Verify .gitignore is properly configured</item>
</checklist>
</principle>
</general_principles>
<code_conventions>
<conventioncategory="merge_conflicts">
<rule>How to correctly escape conflict markers when using apply_diff.</rule>
<rule>Delegate merge conflict resolution to the merge-resolver mode.</rule>
<template>
When removing merge conflict markers from files, you must **escape** them in your `SEARCH` section by prepending a backslash (`\`) at the beginning of the line. This prevents the system from mistaking them for actual diff syntax.
When merge conflicts are detected, do not attempt to resolve them manually. Instead, use the new_task tool to create a task for the merge-resolver mode:
**Correct Format Example:**
```
<<<<<<< SEARCH
content before
\<<<<<<< HEAD<--Notethebackslashhere
content after
=======
replacement content
>>>>>>> REPLACE
```xml
<new_task>
<mode>merge-resolver</mode>
<message>#[PR_NUMBER]</message>
</new_task>
```
Without escaping, the system confuses your content with real diff markers.
The merge-resolver mode will:
- Checkout the PR branch
- Perform the rebase
- Intelligently resolve conflicts based on commit history and intent
- Push the resolved changes
- Return control back to pr-fixer mode
You may include multiple diff blocks in a single request, but if any of the following markers appear within your `SEARCH` or `REPLACE` content, they must be escaped:
```
\<<<<<<< SEARCH
\=======
\>>>>>>> REPLACE
```
Only these three need to be escaped when used in content.
This ensures consistent and intelligent conflict resolution across all PRs.
<practice>Always determine the correct remote before pushing (origin vs fork).</practice>
</best_practices>
<remote_handling>
<step>Check if PR is from a fork: 'gh pr view <pr_number> --json isCrossRepository'</step>
<step>Check if PR is from a fork: 'gh pr view [PR_NUMBER] --repo [owner]/[repo] --json isCrossRepository'</step>
<step>If isCrossRepository is true, add fork remote if needed</step>
<step>Push to appropriate remote: 'git push --force-with-lease <remote><branch>'</step>
<step>Push to appropriate remote: 'git push --force-with-lease [remote] [branch]'</step>
</remote_handling>
<conflict_resolution>
<step>Use 'GIT_EDITOR=true git rebase main' to start rebase</step>
<step>If conflicts occur, edit files to resolve them</step>
<step>Use 'git add .' and 'git rebase --continue' to proceed</step>
<step>Delegate to merge-resolver mode using new_task</step>
<step>Provide the PR number (e.g., "#123") as the message</step>
<step>The merge-resolver mode will handle all conflict resolution automatically</step>
</conflict_resolution>
</tool>
<toolname="gh pr checks">
<best_practices>
<practice>Use --watch flag to monitor checks in real-time: 'gh pr checks <pr_number> --watch'</practice>
<practice>For one-time status checks, use --json flag: 'gh pr checks <pr_number> --json state,conclusion,name'</practice>
<practice>Use --watch flag to monitor checks in real-time: 'gh pr checks [PR_NUMBER] --repo [owner]/[repo] --watch'</practice>
<practice>For one-time status checks, use --json flag: 'gh pr checks [PR_NUMBER] --repo [owner]/[repo] --json state,conclusion,name'</practice>
<practice>The --watch flag automatically updates the display as check statuses change.</practice>
<practice>Use 'gh run list --pr <pr_number>' to get detailed workflow status if needed.</practice>
<practice>Use 'gh run list --pr [PR_NUMBER] --repo [owner]/[repo]' to get detailed workflow status if needed.</practice>
</best_practices>
</tool>
@ -111,8 +114,43 @@ Files modified:
- webview-ui/src/components/settings/ApiSettings.tsx: Updated button text from "Save" to "Save Configuration"
Please ensure all supported languages (ca, de, es, fr, hi, id, it, ja, ko, nl, pl, pt-BR, ru, tr, vi, zh-CN, zh-TW) are updated with appropriate translations for these changes.</message>
</new_task>
]]></example_usage>
</tool>
<toolname="new_task (mode: merge-resolver)">
<best_practices>
<practice>Use when PR has merge conflicts that need to be resolved.</practice>
<practice>Simply provide the PR number (e.g., "#123") as the message.</practice>
<practice>The merge-resolver mode will handle checkout, rebase, conflict resolution, and pushing.</practice>
<practice>Wait for merge-resolver to complete before continuing with other PR fixes.</practice>
</best_practices>
<when_to_use>
<trigger>When gh pr view shows mergeable: false or mergeStateStatus: CONFLICTING</trigger>
<trigger>When git rebase fails with conflicts</trigger>
<trigger>When git status shows unmerged paths</trigger>