The CLI's applyProviderConfig() was reading model info from a disk
cache (controller.readOpenRouterModels) instead of fetching from
the provider API. In headless/Docker environments (e.g., terminal-bench)
the cache doesn't exist, so model info was never set. Both handlers
then fell back to openRouterDefaultModelInfo with maxTokens: 8192,
causing write_to_file truncation on large outputs.
Changes:
- Replace controller.readOpenRouterModels() (disk cache) with
refreshOpenRouterModels() (fetches from API, with cache fallback)
- Add vercel-ai-gateway to the model info fetch path using
refreshVercelAiGatewayModels()
Relates to #7998
Co-authored-by: Cursor <cursoragent@cursor.com>
* sdk lib
* improve cline sdk api surface
- better api design and messages
* fix some types, fix session id retrieval, improve wording
* hide controller from sdk surface completely
---------
Co-authored-by: Max Paulus 🥪 <max@cline.bot>
* Release V3.67.0
Bump version from 3.66.0 to 3.67.0 in package.json and
package-lock.json. Add changelog entry for v3.67.0 covering new
features (subagent skills, AgentConfigLoader, Responses API, websocket
preconnect, CLI /q command), bug fixes (reasoning delta crash, OpenAI
tool ID, auth checks, Gemini 3.1 Pro), and other changes. Update
WhatsNewItems fallback banners to reflect current promotions.
* Fixing stuff
* feat(cli): fetch featured models from backend with local fallback
- Add async getFeaturedModelsForCline() to fetch models via controller
- Load featured models dynamically in AuthView with useEffect
- Update FeaturedModelPicker to accept featuredModels as optional prop
- Refactor helper functions to accept models parameter for flexibility
- Keep local hardcoded models as fallback when backend fetch fails
* Fixing stuff
* Fixing stuff
* Fixing stuff
- added a method to StateManager, setSessionOverride, which overrides
state settings while the statemanager lives in memory
Co-authored-by: Max Paulus 🥪 <max@cline.bot>
* fix(models): keep Sonnet 4.5 as default
* chore(changeset): add release note for Sonnet 4.5 default
* fix(models): remove Sonnet 4.6 from curated model lists
* fix(models): restore Sonnet 4.6 in web recommended list
* feat(cli): add /skills slash command for managing skills
- Add /skills to CLI_ONLY_COMMANDS in slashCommands.ts
- Create SkillsPanelContent component with:
- Display global and workspace skills with toggle indicators
- Enter to use skill (inserts @path into input)
- Space to toggle skill enabled/disabled
- Selectable marketplace link to skills.sh
- Keyboard navigation with arrow keys and vim keys
- Wire up panel in ChatView.tsx
- Add comprehensive tests for keyboard interactions
* refactor(cli): use static skill controller imports
* fix(cli): add React import to skills panel test
* fix(cli): suppress required React import lint in skills test
* fix(cli): harden /skills panel interactions
Revert optimistic skill toggle state when persistence fails, and surface a fallback URL when opening the marketplace fails. Also tighten and extend tests to verify exact marketplace URL handling and rollback behavior.
Co-authored-by: Cursor <cursoragent@cursor.com>
---------
Co-authored-by: Cursor <cursoragent@cursor.com>
* feat: add Sonnet 5 support and make it default across surfaces
* feat: surface Sonnet 5 as free while keeping Sonnet 4.5 defaults
* fix: rename Sonnet 5 support to Sonnet 4.6 across providers and UI
* fix: allow duplicate onboarding model ids across free and frontier
* chore: update Sonnet 4.6 banner to limited-time free messaging
* fix: align Bedrock Sonnet 4.6 model ids with AWS format
* feat: update whats new promo to Sonnet 4.6 free offer
* chore: update Sonnet 4.6 promo copy and timing
Updating CHANGELOG.md format
update changelog
update banner and bump version
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* feat: add z-ai/glm-5 to free models list
Include Z.AI's GLM 5 in the free model whitelist for zero-cost usage
and update the model picker UI to display the free label.
* Adding thinking
* Adding thinking
* Adding thinking
* changeset version bump
* v3.62.0 Release Notes
- Banners now display immediately when opening the extension instead of requiring user interaction first
- Resolved 17 security vulnerabilities including high-severity DoS issues in dependencies (body-parser, axios, qs, tar, and others)
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: github-actions <github-actions@github.com>
- Fixes for Minimax model family
- Fixes for Response chaining for OpenAI's Responses API
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
- Add `name` property to minimax, kat-coder-pro, and trinity-large-preview
models that were previously missing it
- Move type annotation from `as FeaturedModel[]` casts to the variable
declaration for proper type checking at assignment time
- Add test to verify all featured models include a display name
* increases banner cache duration to 24 hours so we make one api calls per day per user; implements a circuit breaker that stops retrying after 3 consecutive failures
* add new tests
* Clear banner cache when auth status changes
* revert 5898bc6e0e
* Fixing circuit breaker
* fix: reset circuitBreakerOpenedAt on failed half-open recovery
Previously, circuitBreakerOpenedAt was only set when consecutiveFailures
reached exactly MAX_CONSECUTIVE_FAILURES. This meant that after a failed
half-open recovery attempt, the timestamp wasn't updated, causing the
circuit breaker to immediately enter half-open state again on the next call.
Now circuitBreakerOpenedAt is updated on every failure once the circuit
breaker is tripped, ensuring proper timeout between recovery attempts.
* refactor: BannerService initialization and cache management
- Move BannerService initialization from common.ts to AuthService (which is initialized in controller)
- Re-initialize BannerService after auth state updates to ensure user context
- Add HostRegistryInfo to centralize host/platform information collection
- Improve rate limiting with exponential backoff (5min → 15min → 30min)
- Refactor error handling to better distinguish between rate limits and server errors
- Remove temporary disabled banner fetching comments
This change ensures banners are only fetched when user authentication is
available and implements more robust rate limiting to prevent API hammering.
The banner service now properly tracks user context and respects server
rate limits with progressive backoff delays.
* refactor(banner): simplify banner service initialization and usage
- Remove `getBanners()` wrapper method from Controller class
- Call `BannerService.get().getActiveBanners()` directly in Controller
- Change `BannerService.initialize()` to synchronous, returns instance immediately
- Make banner fetching non-blocking by moving to background
- Remove unused `BannerCardData` import from Controller
- Update tests to handle asynchronous background fetching with timeouts
- Clean up AuthService banner service initialization comment
This change simplifies the banner service API by removing unnecessary abstraction layers and making initialization non-blocking. The service now fetches banners in the background rather than blocking on initialization, improving application startup performance.
* clean up
* apply feedback
* un-skip unit test
* mock
* mock env
* clean up and add debounce fetch
* log fetch time
* revert
* feature flag: remote-banners
* fix loop in authService on auth update
Co-authored-by: Tomás Barreiro <BarreiroT@users.noreply.github.com>
* Fix tests
* small fixes
* use .? for banner
* moves initializeDistinctId to StateManager
* initializeDistinctId
* use v2 endpoint
---------
Co-authored-by: Zhongying Qiao <cryptoque@users.noreply.github.com>
Co-authored-by: Arafatkatze <arafat.da.khan@gmail.com>
Co-authored-by: Tomás Barreiro <BarreiroT@users.noreply.github.com>
Co-authored-by: Tomás Barreiro <52393857+BarreiroT@users.noreply.github.com>
Co-authored-by: BarreiroT <tomasmbarreiroi@gmail.com>
Apply suggestions from code review
Co-authored-by: Max Paulus 🥪 <max@cline.bot>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* changeset version bump
* Updating CHANGELOG.md format
* changeset version bump
* Updating CHANGELOG.md format
* Eve manually updating the banner and the release version
* Manually update the changelog
* Fix GLM 5 model ID in banner
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: github-actions <github-actions@github.com>
Co-authored-by: cline-test <132302818+candieduniverse@users.noreply.github.com>
* feat: checkpoint subagent tool workflow and approval UX
* feat: support subagent tool execution without native tool calls
* fix: expose use_subagents when native tool calling is disabled
* fix: stabilize subagent command UX and suppress nested command rows
* chore: tune subagent prompt guidance for context-heavy exploration
* fix: align subagent row spacing with chat row conventions
* fix: keep cancelled subagent state during immediate resume
* feat: implement subagent message rendering for approval prompts and progress updates
* feat: enhance SubagentRunner with tool use ID resolution and fallback handling
* fix: stabilize subagent cline requests with ulid and initial workspace metadata
* refactor: unify subagent chat row rendering
* feat: surface subagent costs in task metrics and status rows
* fix: refine cli subagent tree alignment and wrapping
* fix: refine subagent streaming rows in cli and webview
* fix: ensure unique act mode hint keys in CLI chat
* feat: add subagents settings toggle wiring across webview and cli
* fix(webview): stream subagent stats per prompt while constructing prompts
* fix: remove duplicate subagentsEnabled declaration after rebase
* chore: restore package lockfiles to main
* fix: harden task history usage parsing and clean prompt separators
* chore: refine subagent response formatting guidance
* feat: collapse subagent prompts with show more
* feat: show latest subagent tool call in status rows
* fix: fall back to non-native mode for subagents when native tools are unavailable
* fix: retry empty subagent responses before failing
* fix(subagents): require attempt_completion and dedupe tool result formatting
* feat(subagents): polish prompt guidance and webview status row
* add more shortcuts to help output
* Apply suggestions from code review
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---------
Co-authored-by: Max Paulus 🥪 <max@cline.bot>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* 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.