* fix: use vscode.env.asExternalUri for web OAuth callbacks
In VS Code Web (Codespaces, code serve-web), OAuth callbacks using
http://127.0.0.1:PORT break because the extension host runs remotely.
Changes:
- getCallbackUrl now accepts a path parameter
- Desktop: uses vscode://extension-id/path directly
- Web (UIKind.Web): uses vscode.env.asExternalUri() for web-reachable URL
- Updated all callers (/auth, /openrouter, /hicap, /requesty, MCP) to
pass path and use URL+searchParams for proper encoding
- Added regression test asserting web callback URL is not 127.0.0.1
- AuthHandler (localhost HTTP) now only used by CLI/standalone mode
* fix: use URL.searchParams for proper callback URL encoding
Callers were using template literal interpolation to embed callback URLs
into query strings, which breaks when the URL contains special characters
(e.g. from asExternalUri with query params). Use URL+searchParams.set()
which automatically encodes values.
* chore: revert unrelated whitespace change in account.proto
* revert: remove non-essential URL encoding changes in auth callers
Keep only the core fix (getCallbackUrl path parameter + asExternalUri for web).
Revert the URL+searchParams encoding improvement to minimize diff.
* fix: URL-encode callback_url in auth callers, add encoding test
In VS Code Web, callback URLs from asExternalUri can contain their own
query params (?tkn=...&extra=...). String-interpolating them into
callback_url= causes everything after the first & to be parsed as
top-level params, truncating the callback URL.
Use URL + searchParams.set() in openrouter, hicap, and requesty callers.
Replace tautology test with deterministic round-trip encoding assertions.
* feat(tools): add auto-approval support for attempt_completion commands
- Add auto-approval logic for bash commands in AttemptCompletionHandler
- Show commands as 'say' instead of 'ask' when auto-approved
- Display notification prompting user approval when manual approval needed
- Add 30-second timeout notification for long-running auto-approved commands
- Fix Logger import path from @/shared to @shared
* Send to cline provider
* feat(bedrock): Create agent implementation plan for supporting parallel tool calling.
* Add Bedrock tool calling support
* Improve Bedrock tool calling test guidance
* Add Bedrock CLI parallel tool calling test script
* fix: add ALLOW_AWS_DEFAULT_CHAIN support to live integration test script
* chore: add changeset for Bedrock parallel tool calling
* feat(bedrock): enable native parallel tool calling for Bedrock provider
- Add 'bedrock' to isNextGenModelProvider() so native tool calling is enabled
- Add 'bedrock' to getNativeConverter() to use Anthropic-format tool specs (input_schema)
- Fix empty tool description validation error in mapClineToolsToBedrockToolConfig
(Bedrock requires description length >= 1)
- Update CLI test to use Sonnet 4.5 (Haiku too small for native tool calling)
- Add <invoke> XML detection to CLI test to catch XML fallback
Verified: conversation history shows 3 native tool_use blocks in a single
assistant response with 3 matching tool_result blocks — true parallel
tool calling via Bedrock Converse API.
* docs: mark all phases complete in bedrock parallel tool calling implementation plan
* chore: switch test scripts default model to Haiku 4.5 (cheaper for testing)
* feat: enhance CLI verification suite with 3 test cases (single, parallel, round-trip)
* Remove bedrock parallel tool calling implementation plan doc.
* refactor: simplify to single CLI verification script for bedrock parallel tool calling
Remove the handler-level test script (test-bedrock-tool-calling.ts) and consolidate
into a single focused CLI test that proves parallel tool calling works end-to-end:
- Spawns Cline CLI with Bedrock config
- Asks it to read 3 files
- Verifies ≥2 parallel native tool calls (not XML fallback)
- Task completion proves tool result round-trip works
* refactor(bedrock): improve type safety and code quality for parallel tool calling
- Add typed interfaces (ToolUseStart, ToolUseDelta) for Bedrock stream
events instead of relying on `as any` casts
- Extend ContentBlockStart and ContentBlockDelta interfaces with toolUse
fields so stream parsing uses typed property access
- Remove dead `inputBuffer` field from activeToolCalls Map (was tracked
but never read — tool input deltas are yielded immediately)
- Add JSDoc to mapClineToolsToBedrockToolConfig explaining its purpose
and return semantics
- Document why createDeepseekMessage intentionally ignores the tools
parameter (DeepSeek R1 uses InvokeModel, not Converse API)
* refactor(scripts): improve test script readability and resource cleanup
- Add try/finally with cleanupDirs() to remove temp workspace and config
dirs after each run (previously accumulated in $TMPDIR)
- Extract named constants for CLI_TIMEOUT_SECONDS and HEARTBEAT_INTERVAL_MS
- Add CliResult interface for the runCli return type
- Rename cryptic variables: hb → heartbeatInterval, c → chunk, p/d → filePath/data
- Add JSDoc to parseReadFilePaths and hasXmlFallback
- Add explanatory comments to empty catch blocks
- Log stderr on non-zero exit code for easier debugging
- Extract createTestWorkspace() to separate workspace setup from main flow
- Add section separator comments for visual structure
* test(bedrock): add missing edge-case tests and remove dead describe block
- Add tests for mapClineToolsToBedrockToolConfig edge cases:
undefined/empty input returns undefined, tools without input_schema
are silently dropped
- Add test for formatMessagesForConverseAPI with array tool_result
content (multi-block text responses)
- Add test for tool_result is_error → status:'error' mapping
- Remove empty 'reasoning content handling (deprecated)' describe block
35 tests passing (was 31).
* test(bedrock): add integration-level tests covering E2E script gaps
Add 'native tool calling integration' test suite that validates the
concerns previously only covered by the live E2E CLI script:
- Bedrock + Claude 4 is recognized as native tool calling eligible
(catches silent regression if Bedrock is removed from
isNextGenModelProvider or Claude 4 from isNextGenModelFamily)
- Bedrock + Claude 3.x correctly does NOT qualify (pre-4.0 guard)
- Native tool calling disabled when user setting is off
- createAnthropicMessage passes toolConfig to ConverseStreamCommand
(catches the tool spec not reaching the API)
- Full multi-turn tool call round-trip formatting (tool_use in
assistant → tool_result in user → reformatted for next API call)
40 tests passing (was 35).
* Remove functional verification script before code review
The diff editor e2e test flakes consistently on Windows CI because the
40s test timeout is too tight. The test does signin, message send,
history verification, then a second message send before the diff
assertion -- on slow Windows runners this setup alone can eat most of
the budget. Bumping to 60s gives enough headroom.
Add Terminal-Bench-proven rules as items 5 and 6 in the double-check
re-verification checklist, so they're enforced at completion
verification time rather than in the system prompt.
* feat: add double-check completion experimental feature
When enabled, the first attempt_completion call in a task is rejected
with a tool error that instructs the model to re-verify its work
against the original task requirements. The rejection includes the
initial task text for context. The second call proceeds normally.
This is opt-in (default off) and available via:
- Settings > Features > Experimental > Double-Check Completion
- CLI flag: --double-check-completion
- CLI TUI settings panel toggle
Adds completionAttemptCount to TaskState, plumbs the setting through
TaskConfig/ToolExecutor following existing patterns, and includes
9 unit tests.
* chore: add cli:run script for quick CLI testing
* fix: increase task preview to 8000 chars, revert unintended regex change
* fix: preserve existing proto field numbers
The auto-generator renumbered open_ai_headers (175->177) and
openai_codex_oauth_credentials (46->48), and dropped the reserved 146
comment. Restore original field numbers to avoid breaking wire-format
compatibility.
* fix: remove partial completion_result message on double-check rejection
During streaming, handlePartialBlock shows the completion_result in
the chat view. When we reject the first attempt, we need to clean up
that partial message so the user doesn't see a stale completion that
was actually rejected.
* refactor: switch from counter to boolean toggle for double-check
Use a boolean pending flag instead of a counter so that every
attempt_completion gets double-checked, not just the first one in
a task. The flag toggles: reject (set pending), accept (clear pending),
so if the model does more work and tries to complete again later, it
gets double-checked again.
* fix(prompt): add output precision and threshold iteration rules
Two concise rules proven effective via Terminal-Bench testing:
1. Output precision: produce exactly what's specified, no extra columns/fields/debug output
2. Threshold iteration: verify results meet numerical criteria before completing
Tested on 6 targeted Terminal-Bench tasks (job 2026-02-07__16-15-00):
- log-summary-date-ranges: FAIL→PASS (output precision rule eliminated extra columns)
- dna-insert: FAIL→PASS (iterate rule helped agent meet Tm threshold)
A third rule (no-cleanup) was tested and deliberately excluded: it failed to
prevent self-sabotage on configure-git-webserver despite STRICTLY FORBIDDEN
language, and caused a side-effect on polyglot-c-py by preventing legitimate
build artifact cleanup. The cleanup behavior is too deeply trained to override
via prompt rules alone.
* test: update prompt snapshots for new rules
* fix(cli): route PostHog networking through shared fetch
* remove unnecessary `as RequestInit` casts from PostHog fetch wrappers
PostHogFetchOptions is a structural subset of RequestInit, so the cast
is unnecessary. Also removes a stale comment about shared client support
in PostHogErrorProvider.
The --thinking flag now accepts an optional number argument to set a
custom thinking budget instead of always using the 1024 default.
cline "prompt" --thinking # 1024 tokens (default)
cline "prompt" --thinking 8000 # 8000 tokens
Invalid values get a warning and fall back to 1024.
* feat: move reasoning effort to model config and update model selection UX
* refactor: dedupe reasoning effort handling and drop lockfile churn
* refactor: default reasoning effort to low
* refactor(cli): sync mode-scoped thinking and reasoning writes
* fix: centralize reasoning effort normalization and avoid implicit openai effort
* fix: restore proto field number for codex credentials and reserve removed fields
- Keep openai_codex_oauth_credentials at field 46 (was incorrectly
changed to 47)
- Add reserved 146 in Settings for removed openai_reasoning_effort
- Add reserved 15 in UpdateSettingsRequest for removed openai_reasoning_effort
- Remove stale openai_reasoning_effort field from UpdateSettingsRequest
* fix: map medium reasoning effort to LOW for Gemini models
Gemini API only accepts LOW and HIGH thinking levels. MEDIUM exists in
the SDK enum but is rejected at the API level. Map medium to LOW and
update the default fallback accordingly.
Introduces a mechanism to save system prompts and task metadata to disk for debugging and analysis purposes.
- Added `writePromptMetadataArtifacts` to the `Task` class.
- Feature is enabled via the `CLINE_WRITE_PROMPT_ARTIFACTS` environment variable.
- Artifacts are saved to `.cline-prompt-artifacts` or a custom path defined by `CLINE_PROMPT_ARTIFACT_DIR`.
- Writes both a JSON manifest (containing task ID, model info, and timestamp) and the raw system prompt for every API request.
* fix: use vscode.env.asExternalUri for auth callback URLs in VS Code Web
The OAuth callback redirect was broken in VS Code Web (code serve-web)
environments because the callback URL used a raw vscode:// URI scheme,
which the OS would route to the local desktop VS Code app instead of
the web instance.
This change wraps both getCallbackUrl() and getIdeRedirectUri() with
vscode.env.asExternalUri() which properly transforms URIs based on the
environment:
- Desktop VS Code: unchanged (vscode://...)
- VS Code Remote SSH: adds remote authority for proper routing
- VS Code Web: transforms to HTTPS URL that routes through the web server
Fixes#5109 (remaining callback redirect issue)
Related: #2152
* fix: use HTTP-based auth callback for VS Code Web mode
In VS Code Web (code serve-web), vscode:// URIs redirect to the desktop
app instead of staying in the browser. This change uses AuthHandler
(local HTTP server) for the auth callback in web mode, matching how
CLI/standalone already handles auth.
- getCallbackUrl: use AuthHandler when UIKind.Web
- getIdeRedirectUri: return empty in web mode to avoid vscode:// redirect
* fix: add fallback for openExternal RPC for JetBrains compatibility
The openExternal host bridge RPC is not implemented in the JetBrains
plugin, causing sign-in to fail silently. This adds a fallback to the
'open' npm package when the host RPC fails with UNIMPLEMENTED.
Fixes#9164, #9137, #9138
The chat streaming UI refactor removed the loading indicator that
previously showed when an API request was in progress. This left users
staring at a frozen UI during the latency between sending a message
and receiving the first streamed content.
Changes:
- Add "Thinking..." shimmer in the Virtuoso Footer as the sole loading
indicator, covering both pre-api_req_started (backend processing) and
post-api_req_started (waiting for model response) states
- Filter out api_req_started messages that have no visible content
(no error/cancel). These rows rendered as invisible padding since
the PR removed the old API request accordion UI. Reasoning messages
already render as their own standalone ChatRows.
- Thread footerActive flag to MessageRenderer so the last message skips
pb-2.5 when the Footer is showing, keeping spacing consistent with
the pt-2.5 on every ChatRow
- Add stdinIsTTY check to shouldUsePlainTextMode() - Ink requires raw mode on stdin
- Only error on empty stdin when no prompt is provided (allows: cline 'prompt' < /dev/null)
- Fixes crash in GitHub Actions and other CI environments
- Cline CLI 2.0 now available. Install with `npm install -g cline`
- Anthopic Opus 4.6
- Minimax-2.1 and Kimi-k2.5 now available for free for a limited time promo
- Codex-5.3 through OpenAI Codex provider
- Fix read file tool to support reading large files
- Fix decimal input crash in OpenAI Compatible price fields (#8129)
- Fix build complete handlers when updating the api config
- Fixed missing provider from list
- Fixed Favorite Icon / Star from getting clipped in the task history view
- Make skills always enabled and remove feature toggle setting
Co-authored-by: Arafatkatze <arafat.da.khan@gmail.com>
* feat: add GPT-5.3 Codex model for ChatGPT subscription users
OpenAI released GPT-5.3 Codex today. Adding it to the OpenAI Codex
provider (ChatGPT Plus/Pro subscription) model list and setting it
as the new default.
Changes:
- Add gpt-5.3-codex to openAiCodexModels with same specs as 5.2
- Update default model to gpt-5.3-codex
- Update featured models in CLI and webview OpenRouter picker
* revert: remove gpt-5.3-codex from OpenRouter featured models
GPT-5.3 Codex is only available via ChatGPT subscription, not through
the OpenAI API or OpenRouter. Reverting featured model changes.
* feat: add Claude Opus 4.6 model support with 1M context window
Adds support for Claude Opus 4.6, Anthropic's latest model with:
- 200K base context window with optional 1M context variant
- Tiered pricing for >200K context (2x input/output pricing)
- Extended thinking/reasoning support
- Prompt caching support
Changes:
- Added model definitions for Anthropic, Bedrock, and Vertex providers
- Added OpenRouter 1M variant support
- Updated thinking models lists across all provider UIs
- Added context window switcher for Opus 4.6
- Updated JP cross-region inference models list
* feat: update featured model to Opus 4.6 in model picker
* chore: add changeset for Claude Opus 4.6
* fix: correct Opus 4.6 model IDs (no date suffix)
---------
Co-authored-by: Robin Newhouse <robin@cline.bot>
Use refs instead of state values in useInput callback to avoid stale
closures. Also manually update textInputRef before calling setCursorPos
so the bounds check uses the correct new text length.
ChatView was returning empty string when the model ID key didn't exist
in state, causing first-time CLI users to see a blank model name. Added
fallback to getProviderDefaultModelId() to match WelcomeView's behavior.