* 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>
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>
- 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>
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(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