- cline agent was emitting dupe completion_result messages b/c of a
nuance to the partial message logic in the message-state.ts file. This
logic fixes that, and also improves public types
* fix: stop infinite getLatestMcpServers RPC loop when opening MCP servers panel
The ServersToggleModal useEffect had setMcpServers in its dependency array,
but the context provided an unstable inline wrapper around the useState setter,
creating a new function reference on every render. This caused the effect to
re-fire on every context re-render while the modal was visible, producing 14+
RPC calls in ~15ms.
- Remove setMcpServers from useEffect deps in ServersToggleModal (the effect
should only fire when visibility changes)
- Replace inline arrow wrappers in ExtensionStateContext with direct references
to the stable useState setters (setMcpServers, setRequestyModels,
setHuggingFaceModels, setMcpMarketplaceCatalog)
* address review feedback: add setMcpServers back to deps, use property shorthand
- Add setMcpServers back to useEffect deps in ServersToggleModal now that the
context passes the stable useState setter directly (per Copilot review)
- Remove eslint-disable comment since it's no longer needed
- Use property shorthand for setGroqModels and setBasetenModels in context value
* initial doc changes
* rm general api endpoint
* Add API documentation section with endpoint reference pages
- Add new API docs: overview, getting-started, authentication, models,
chat-completions, errors, and SDK examples
- Update api/reference.mdx with expanded endpoint documentation
- Update enterprise-solutions/api-reference.mdx with improvements
- Update docs.json with new API section navigation entries
---------
Co-authored-by: Juan Pablo <juan@cline.bot>
Co-authored-by: Tony Loehr <turingxo@gmail.com>
* fix: prevent Chinese filename escaping in diff view
Use Uri.parse() instead of Uri.from() for the diff view URI to prevent
non-ASCII characters (e.g. Chinese) in filenames from being
percent-encoded. This is consistent with how other diff URIs are created
in openMultiFileDiff.ts and VscodeCommentReviewController.ts.
Uri.from() encodes the path component, turning Chinese characters into
percent-encoded sequences like %E7%A0%94..., which causes the diff view
to display escaped filenames and fail to open properly.
* fix: encode URI-reserved delimiters in filename before Uri.parse
Encode %, #, and ? in the filename before passing to Uri.parse() to
prevent them from being interpreted as URI delimiters. This handles
edge cases where filenames contain these characters (valid on macOS/Linux)
while preserving non-ASCII characters like Chinese.
* feat(hooks): add Windows hook execution via PowerShell
* chore(changeset): add release note for Windows hooks
* Get hooks working on Windows
Remove changeset file (we no longer use changeset files)
feat(hooks): support Windows PowerShell hook resolution and management
feat(hooks): complete windows powershell hook support and tests
Detect linux-style hooks only on macOS and linux and detect PowerShell-style hooks only on Windows
Fixes for failing unit tests on Windows in CI
Fix failing unit tests on Windows in CI
Fix unit tests for hooks on Windows
Be clear about .ps1 file extension for hooks in PowerShell vs. bash/binary for linux-style hooks
Remove separate test suite step
Reapply hooks-specific test suite
Fix failing hooks tests
* Harden Windows hook PowerShell runtime and test coverage
* test: centralize hook test env and platform overrides
---------
Co-authored-by: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com>
When OCA token refresh fails with 400 invalid_grant or 401, legacy secrets
ocaAccessToken and ocaTokenSet (from older Cline versions) were left in VS
Code's secret storage. clearAuth() only cleared ocaApiKey and ocaRefreshToken,
causing every subsequent re-auth attempt to fail in a loop requiring manual
SQLite deletion to recover.
Fix:
- Add ocaAccessToken and ocaTokenSet to SecretKeys in state-keys.ts
- Update OcaAuthProvider.clearAuth() to clear all 4 OCA secrets
Fixes#9567
* fix: resolve 'Could not find the file context' error in Explain Changes
Both handleCommentReply() in explainChangesShared.ts and the onCommentStart
callback in explainChanges.ts were using a strict absolutePath-only match
when looking up files in changedFiles. If the VS Code comment controller
returns a path in a different format (relative vs absolute, different
separators on Windows), the lookup would silently fail and show
'Error: Could not find the file context'.
Add relativePath as a fallback in both lookup sites, making them
consistent with the already-correct logic in streamAIExplanationComments.
Fixes#9382
* Refactor to use parseInt instead of Number.parseInt
* Adding 1m
* fix: wire cline model proto fields for api config
* fix: wire cline picker to shared recommended model logic
* fix: address Cline model picker parity and startup model-info sync
* remove OpenRouter preset model ID support
* rename Cline endpoint feature flag
* Fixing stuff
* Fixing stuff
* Fixing stuff
* refactor: gate cline models endpoint behind feature flag
- Update refreshClineModels to use the EXTENSION_CLINE_MODELS_ENDPOINT feature flag instead of a hardcoded boolean, allowing controlled rollouts of the endpoint source.
- Remove recommended/free models fallback logic, featured model cards, and the initialTab property from OpenRouterModelPicker to simplify the UI component.
* fix: use JSON_SCHEMA for yaml.load to prevent unsafe deserialization
Add { schema: yaml.JSON_SCHEMA } to both yaml.load() calls to reject
custom YAML tags (e.g. !!js/function) that could enable code execution
from untrusted .clinerules or skills files.
Add security tests verifying custom tags are rejected.
* add changeset
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>
The "Generate Commit Message" feature was using all changes instead of
only staged changes. Now prioritizes staged changes via getGitDiffStagedFirst(),
falling back to all changes only when nothing is staged.
Closes#5749
Co-authored-by: Raushan Singh <raushrak@Raushans-MacBook-Air.local>
* fix: update stale maxTokens values for Claude 3.7+ models
Every Claude model from 3.7 Sonnet onward had maxTokens set to 8192
in the static model definitions. These values were correct for Claude
3.5 and earlier, but Anthropic has significantly increased output
limits for newer models:
- Claude Opus 4.6: 128K (was 8192, 15.6x too low)
- Claude 3.7 Sonnet: 128K (was 8192, 15.6x too low)
- Claude Sonnet 4.6/4.5/4, Haiku 4.5, Opus 4.5: 64K (was 8192)
- Claude Opus 4, Opus 4.1: 32K (was 8192)
These static definitions are the source of truth for Anthropic direct,
Bedrock, Vertex, and SAP AI Core providers. With the old values, any
write_to_file call exceeding 8192 output tokens would be silently
truncated, producing a missing 'content' parameter error.
Values verified against Anthropic docs, AWS Bedrock docs, Google
Vertex AI docs, and the Vercel AI Gateway API.
Relates to #7998
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix: update openRouterDefaultModelInfo.maxTokens to 64K
This fallback ModelInfo (representing claude-sonnet-4.5) is used
when dynamic model info isn't available — notably by the Cline and
Vercel providers in the CLI when the model cache is empty (e.g.,
fresh Docker containers in terminal-bench).
Co-authored-by: Cursor <cursoragent@cursor.com>
---------
Co-authored-by: Cursor <cursoragent@cursor.com>
The OpenRouter stream transform had a 30-line switch statement that
hardcoded max_tokens=8192 for every Claude model. This was written when
8192 was the actual max output for Claude, but modern Claude models
support much higher limits (e.g. 128K for Sonnet 4.6, 64K for others).
OpenRouter's API already reports the correct max_completion_tokens per
model, and model.info.maxTokens reflects this (128000 for Sonnet 4.6).
The hardcoded switch was silently overriding the dynamic value.
This caused write_to_file failures on OpenRouter (and the Cline
provider, which shares this code path) whenever the tool call content
exceeded 8192 output tokens. The response was truncated
(finish_reason: "length"), producing incomplete JSON that lost the
content parameter.
Runtime evidence:
- Before: max_tokens=8192 sent, completion_tokens=8192 (ceiling),
finish_reason="length", write_to_file content missing
- After: max_tokens=128000 sent, completion_tokens=9824 (needed more
than 8192), finish_reason="tool_calls", write_to_file succeeded
Fixes#7998
Co-authored-by: Cursor <cursoragent@cursor.com>
* feat: add MiniMax M2.5 model to MiniMax provider
- Add MiniMax-M2.5 to minimaxModels with 192K context, 128K max tokens,
prompt caching, and reasoning/thinking support
- Update minimaxDefaultModelId to MiniMax-M2.5
- Add minimax/minimax-m2.5 to OpenRouter prompt caching switch
Closes#9391
* fix: add temperature: 1 to MiniMax M2.5 for reasoning support
* docs: update MiniMax provider docs with M2.5 model
* feat: wire up thinking/reasoning support for MiniMax M2.5
- Pass thinkingBudgetTokens from factory to MinimaxHandler
- Use thinking param in API call when reasoning is enabled
- Disable temperature and forced tool_choice when thinking is on
- Add ThinkingBudgetSlider to MiniMaxProvider UI for M2.5
* Add MiniMax-M2.5-highspeed
* Add thinking for highspeed
* Refactor thinking logic
---------
Co-authored-by: BarreiroT <tomasmbarreiroi@gmail.com>
Co-authored-by: Tomás Barreiro <52393857+BarreiroT@users.noreply.github.com>
- Update model ID and name from gpt-5.2-codex to gpt-5.3-codex
- Change tag from "HOT" to "NEW" for the updated model
- Add What's New banner entry promoting Codex 5.3 availability
This commit ensures that internal placeholder tools, specifically `focus_chain`, are filtered out from the final list of native tools exposed to the LLM.
- Added a test case in `PromptRegistry.test.ts` to verify `focus_chain` is excluded from native tools output.
- Updated snapshot files for various models (OpenAI GPT-5, Vertex Gemini 3, etc.) to reflect the removal of the `focus_chain` tool definition.
Fixes false positives in getReadablePath() when directories share a prefix
(e.g., /home/user/project matching /home/user/project-backup). The existing
isLocatedInPath() function correctly handles path boundaries using path.relative().
Closes#8761
Co-authored-by: Raushan Singh <raushrak@Raushans-MacBook-Air.local>
* 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>
* chore: replace baseUrl with explicit relative paths in tsconfig files
Remove `baseUrl: "."` from tsconfig configurations and update all path aliases to use explicit relative paths (e.g., `./src/*` instead of `src/*`). This makes path resolution more explicit and avoids potential ambiguity in module resolution across the main project and webview-ui configurations.
* update package-lock.json
* 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
* refactor: consolidate subagent request usage tracking into state object
Replace scattered per-request token tracking variables with a structured
`SubagentUsageState` interface containing `currentRequest` and
`lastRequest` states. This improves code organization by grouping related
token metrics (input, output, cache write/read, total tokens, cost) into
a cohesive `SubagentRequestUsageState` object, reducing variable sprawl
and making the usage lifecycle (current → last) more explicit.
* feat(subagent): add support for skills and optional modelId in agent config
- Update `AgentBaseConfigSchema` and `AgentConfigFrontmatterSchema` to include an optional `skills` field and make `modelId` optional.
- Implement `parseSkills` and `normalizeSkillName` in `AgentConfigLoader` to handle skill parsing from YAML frontmatter.
- Update `SubagentBuilder` to provide access to configured skills.
- Modify `SubagentRunner` to filter available skills based on the agent's configuration, falling back to all available skills if none are specified.
- Update host retrieval to use `HostRegistryInfo` instead of `HostProvider`.
This allows subagents to be restricted to specific skills and provides more flexibility in model configuration.
* update unit test
* 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
* refactor: centralize tool handler registration and filter by allowed tools
- Create centralized toolHandlersMap for all tool handler instantiation
- Add registerToolHandlers method to register only allowed tools from config
- Filter subagent tools to only include allowed tools from allowedTools config
- Remove scattered tool handler registration logic in favor of single source of truth
- Improve maintainability by consolidating tool handler creation in one place
This refactoring ensures subagents only have access to explicitly allowed tools
and makes the tool registration process more maintainable and consistent.
It also improves separation of concerns by having the coordinator manage all tool handler registration, while the executor focuses on orchestration. The allowedTools parameter enables runtime filtering of available tools for different contexts.
Also update PromptRegistry to load synchronous and simplify variant lookup
- Convert async load() to synchronous, called in constructor as both loadVariants and loadComponents are not async functions
- Remove health check logic and loaded state tracking
- Extract getVariant() method with proper generic fallback
- Add getComponents() accessor and simplify component loading
- Convert variant/component loaders from async to synchronous
- Remove unnecessary await calls throughout the codebase
- Add PromptRegistry tests for variant resolution and components
* fix test
* feat: add AgentConfigLoader for file-based agent configs
Add AgentConfigLoader singleton to manage agent configurations loaded from
YAML files in the agents directory. Supports hot-reloading via file watcher,
validates config schema with Zod, and integrates with extension lifecycle
(StateManager initialization and tearDown disposal).
* add tests
* add missing export
* update tests
* feat(tools): implement dynamic tool registration for subagents
Updates the tool system to support dynamically registered subagents as individual tools.
- Modifies `ClineToolSet` to generate specific tool definitions for configured subagents via `AgentConfigLoader`.
- Updates `parseAssistantMessageV2` to use `getToolUseNames()` instead of a static list, enabling the parser to recognize dynamic tool tags.
- Replaces the generic `USE_SUBAGENTS` tool with specific subagent instances when available in the system prompt context.
* update config path and refine tool descriptions
- Relocate the subagent configuration directory from `~/.cline/data/agents` to `~/Documents/Cline/Agents` to improve user accessibility.
- Update subagent tool descriptions and parameter instructions in the system prompt to be more descriptive and helpful for the model.
* revert unrelated changes
* revert unrelated changes
* update unit test
* fix: await AgentConfigLoader initialization before StateManager completes
Ensure agent configs are fully loaded during StateManager initialization
by awaiting the `ready()` promise. Previously, `AgentConfigLoader` was
instantiated without waiting for the initial load to complete, causing
potential race conditions where configs might not be available when
needed.
- Add `initialLoadPromise` field to track the async initial load
- Expose a `ready()` method to allow callers to await initialization
- Await `AgentConfigLoader.getInstance().ready()` in StateManager
* set previousRequestTotalTokens
* Made messages api changes
* Made changes
* Added changes
* Made maxTokens point to the right thing
* Removed deprecated max_tokens field
* Reverted the change
* Making an additional change to not cause any issues with chat completions
* reverting changes so we can make them in the backend
* Added changeset
* Fixed changes based on AI comments