Commit graph

162 commits

Author SHA1 Message Date
Matt Rubens
0fe55b9403
fix: update API handler when toolProtocol changes (#9599) 2025-11-25 23:54:12 -05:00
Daniel
05f35735f0
feat: enable multiple native tool calls per turn with failure guardrails (#9273) 2025-11-25 20:21:13 -05:00
Daniel
311940b085
fix: preserve tool_use blocks in summary message during condensing with native tools (#9582) 2025-11-25 13:17:26 -05:00
Daniel
774b492eff
fix: preserve dynamic MCP tool names in native mode API history (#9559) 2025-11-25 13:16:34 -05:00
Daniel
0327f12751
feat: implement streaming for native tool calls (#9542) 2025-11-24 23:12:39 -05:00
Daniel
3ac5bec3fc
fix: ensure XML parser state matches tool protocol on config update (#9535) 2025-11-24 10:01:29 -05:00
Daniel
b531075626
fix: support reasoning_details format for Gemini 3 models (#9506) 2025-11-24 00:47:25 -05:00
Matt Rubens
1558df65b5
Track cloud synced messages (#9518) 2025-11-23 13:17:26 -05:00
Daniel
1dd223d240
fix: Make cancel button immediately responsive during streaming (#9448) 2025-11-21 17:34:17 -05:00
Hannes Rudolph
ee93530076
Browser Use 2.0 (#8941)
Co-authored-by: roomote[bot] <219738659+roomote[bot]@users.noreply.github.com>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
2025-11-21 17:26:15 -05:00
Daniel
5c5a893b50
Fix preserveReasoning flag to control API reasoning inclusion (#9453)
* 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
2025-11-20 20:31:49 -05:00
Daniel
7715158d51
Store reasoning in conversation history for all providers (#9451) 2025-11-20 19:59:53 -05:00
Daniel
97cdc41937
fix: prevent duplicate environment_details when resuming cancelled tasks (#9442)
- 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
2025-11-20 17:03:02 -05:00
Daniel
0851769450
Improve read_file tool description with examples (#9422)
* 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.
2025-11-20 07:21:48 -05:00
Daniel
5260123689
perf: reduce excessive getModel() calls & implement disk cache fallback (#9410) 2025-11-19 23:13:39 -05:00
Daniel
0d72471956
fix: ensure no XML parsing when protocol is native (#9371)
* fix: ensure no XML parsing when protocol is native

* refactor: remove redundant non-null assertions
2025-11-18 18:30:57 -05:00
Daniel
f5d3ac0e23
fix: sync parser state with profile/model changes (#9355) 2025-11-18 09:44:16 -05:00
Hannes Rudolph
f7c2e8d164
Improve Google Gemini defaults, temperature, and cost reporting (#9327) 2025-11-17 23:38:38 -07:00
Matt Rubens
dbaaef756e
Remove experimental setting for native tool calls (#9333) 2025-11-17 23:37:36 -05:00
Daniel
fc19e7620b
fix: preserve tool blocks for native protocol in conversation history (#9319) 2025-11-17 14:07:17 -05:00
Matt Rubens
3e0bd0ea55
Move the native tool call toggle to experimental settings (#9297)
Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
Co-authored-by: daniel-lxs <ricciodaniel98@gmail.com>
2025-11-17 09:41:30 -05:00
Daniel
744f4bd4c8
feat: implement dynamic tool protocol resolution with proper precedence hierarchy (#9286)
Co-authored-by: Roo Code <roomote@roocode.com>
2025-11-15 14:35:04 -05:00
Matt Rubens
4e316e0de8
Fix duplicate import (#9281) 2025-11-15 09:08:48 -05:00
Daniel
375351616d
fix: format tool responses for native protocol (#9270)
* 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
2025-11-14 22:43:56 -05:00
Daniel
0a305310e5
refactor: centralize toolProtocol configuration checks (#9279)
* 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
2025-11-14 20:24:40 -05:00
Daniel
b2f204f123
Disable XML parser for native tool protocol (#9277) 2025-11-14 19:53:22 -05:00
Daniel
93c6d97017
Fix duplicate tool blocks causing 'tool has already been used' error (#9275) 2025-11-14 19:37:40 -05:00
Hannes Rudolph
4a9ff8f4ef
[FIX] Fix OpenAI Native handling of encrypted reasoning blocks to prevent error when condensing (#9263) 2025-11-14 12:54:15 -05:00
Matt Rubens
ee64f44d2b
Revert "refactor(task): switch to <feedback> wrapper to prevent focus drift after context-management event (condense/truncate)" (#9261) 2025-11-14 00:43:45 -05:00
Daniel
d139eff9fc
fix: prevent consecutive user messages on streaming retry (#9249) 2025-11-13 22:31:26 -05:00
Daniel
258830967a
fix: Filter native tools by mode restrictions (#9246)
* 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.
2025-11-13 20:50:57 -05:00
Hannes Rudolph
aaab2bf4d4
refactor(task): switch to <feedback> wrapper to prevent focus drift after context-management event (condense/truncate) (#9237)
* 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
2025-11-13 20:02:57 -05:00
Daniel
5069ce92a0
fix: change tool_choice from required to auto for native protocol (#9242) 2025-11-13 15:16:15 -05:00
Daniel
237c324fcd
fix: resolve 400 error with native tools on OpenRouter (#9238) 2025-11-13 15:10:38 -05:00
Matt Rubens
d270ea1983
Consistently use Package.name for better support of the nightly app (#9240) 2025-11-13 15:07:14 -05:00
Daniel
5e6e601b0a
Add native tool call support (#9159)
Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com>
2025-11-13 12:48:35 -05:00
Hannes Rudolph
bb6cac4980
rename: sliding-window -> context-management; truncateConversationIfNeeded -> manageContext (#9206) 2025-11-12 22:16:25 -05:00
Hannes Rudolph
0fdbd392e8
Migrate conversation continuity to plugin-side encrypted reasoning items (Responses API) (#9203)
* 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
2025-11-12 19:50:24 -05:00
Chris Estreich
6e6341346e
Move auto-approval from ChatView to Task (#9157) 2025-11-10 17:01:50 -08:00
Daniel
e8ac3bf359
Gate XML out when native tool protocol is ON (#9107) 2025-11-10 14:59:15 -05:00
Daniel
4cd5c9022e
fix: prevent command_output ask from blocking in cloud/headless environments (#9152) 2025-11-10 11:47:26 -05:00
Daniel
d631aa643c
fix(task): auto-retry on empty assistant response (#9076) (#9083) 2025-11-06 16:15:31 -05:00
Matt Rubens
77971a5e8f
Revert "fix: prevent UI flicker and enable resumption after task cancellation" (#9032) 2025-11-04 15:29:14 -05:00
Daniel
58edc71672
fix: prevent UI flicker and enable resumption after task cancellation (#8986) 2025-11-03 15:40:39 -05:00
Daniel
ce88b0272a
feat: add preserveReasoning flag to include reasoning in API history (#8934) 2025-11-03 10:38:39 -05:00
Matt Rubens
416fa5727e
Fix cost and token tracking between provider styles (#8954) 2025-10-31 15:14:29 -04:00
roomote[bot]
b284eddf40
fix: prevent infinite loop when canceling during auto-retry (#8902)
* fix: prevent infinite loop when canceling during auto-retry

- Add abort check after backoffAndAnnounce in first-chunk retry logic
- Add abort check after backoffAndAnnounce in mid-stream retry logic
- Properly handle task abortion to break retry loops

Fixes #8901

* docs: add critical comments explaining abort checks

- Document the importance of abort checks after backoff
- Explain how these checks prevent infinite loops
- Add context for future maintainability

---------

Co-authored-by: Roo Code <roomote@roocode.com>
2025-10-30 19:12:30 -04:00
Daniel
be119bcc5a
Add exponential backoff for mid-stream retry failures (#8888)
* Add exponential backoff for mid-stream retry failures

- Extend StackItem with retryAttempt counter
- Extract shared backoffAndAnnounce helper for consistent retry UX
- Apply exponential backoff to mid-stream failures when auto-approval enabled
- Add debug throw for testing mid-stream retry path

* Add abort check in retry countdown loop

Allows early exit from exponential backoff if task is cancelled during delay
2025-10-28 12:55:13 -04:00
Christiaan Arnoldus
c232057e54
Use monotonic clock for rate limiting (#8456) 2025-10-27 17:01:54 -04:00
roomote[bot]
13d20bbe8b
fix: process queued messages after context condensing completes (#8478)
Co-authored-by: Roo Code <roomote@roocode.com>
2025-10-27 16:57:34 -04:00