* 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.
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.
- 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
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.
Previously the animated robot only became static when the user scrolled.
Now it also becomes static when clicking or dragging, giving users more
ways to dismiss the animation. Renamed onScroll to onInteraction to
reflect the broader scope.
* fix: use vscode.env.openExternal for auth in remote environments
Fixes#5109
The OAuth authentication flow was broken in VS Code Server and remote
environments because the code used the npm 'open' package directly, which
tries to launch a browser on the server itself (which has no display).
This change routes browser URL opening through VS Code's native
vscode.env.openExternal() API via the HostBridge pattern, which properly
forwards URLs to the user's local machine in remote environments.
Changes:
- Added openExternal RPC to proto/host/env.proto
- Created VS Code handler using vscode.env.openExternal()
- Updated src/utils/env.ts to use HostProvider.env.openExternal()
- Added openExternal to CLI CliEnvServiceClient (uses npm 'open')
- Added openExternal to CLI ACPEnvServiceClient (uses npm 'open')
Related issues: #5394, #2152, #7971
* chore: add changeset for vscode server auth fix
* refactor: extract shared openUrlInBrowser utility for CLI
- this was breaking the publish npm workflow when we try to run npm
publish from the dist-standalone folder (dist-standalone doesn't have
the esbuilt.ts file)
- we don't need this script anyway because we use the npm-main.yaml
workflow to publish the cli
Co-authored-by: Max Paulus 🥪 <max@cline.bot>
* fix(cli): prevent hang when spawned without TTY
When the CLI is spawned as a child process without a TTY (e.g., from
spawn() in smoke tests or CI), process.stdin.isTTY is false even when
nothing is piped to stdin. This caused readStdinIfPiped() to wait up
to 5 minutes for input that would never arrive.
Fix by using fs.fstatSync(0) to check if stdin is actually a FIFO
(pipe) or file before waiting. This correctly handles:
- Spawned processes without TTY → returns immediately
- Actual piped input (echo "x" | cline) → waits and reads
- stdin from /dev/null → returns immediately
* chore: add changeset
* test(cli): add tests for stdin type detection
applyProviderConfig is async and for Cline/OpenRouter providers it
awaits fetching model data before setting state. When switching to
an already-configured provider (Cline, OCA), the call wasn't awaited,
so refreshModelIds() ran before the model ID was set in state,
causing the model to not update to the default.
- Added applyBedrockConfig to provider-config.ts for AWS Bedrock setup
- AuthView saveConfiguration now uses applyProviderConfig/applyBedrockConfig
- SettingsPanelContent handleBedrockComplete now uses applyBedrockConfig
- Removed duplicate Bedrock config building code from both components
- Cleaned up unused imports
# Conflicts:
# cli/src/components/SettingsPanelContent.tsx
applyProviderConfig calls flushPendingState internally, so any state
set after it needs its own flush. Added explicit flush after setting
welcomeViewCompleted in OCA and OpenAI Codex auth success handlers.
Simplifies OCA, Cline, and OpenAI Codex auth success handlers in
AuthView to use the shared applyProviderConfig utility instead of
manually constructing provider config objects.
This removes duplicated logic around mode-specific provider keys
and model ID keys that applyProviderConfig already handles.
* feat: add authentication support to oca provider in CLI
This change integrates the OcaAuthService into the AuthView component. It adds a new 'oca_auth' step to the authentication flow, allowing users to select 'oca' as a provider and initiate the authentication request via OcaAuthService.
* fix(cli): add subscription to OCA auth status updates
The OCA auth flow was missing the subscription mechanism to know when
browser auth completes. Without this, the CLI would spin indefinitely
after opening the browser.
Added a useEffect that subscribes to OcaAuthService.subscribeToAuthStatusUpdate
when in oca_auth step. When auth succeeds (user.uid present), saves the
provider config and transitions to success.
* fix(cli): add OCA auth support to SettingsPanelContent
AuthView only handles onboarding. Users also need to be able to switch
to OCA provider from the settings panel after initial setup.
Added:
- handleOcaLogin callback to start OAuth flow
- useEffect subscription to OCA auth status updates
- Case in handleProviderSelect for "oca" provider
- Escape key handling to cancel OCA auth
- UI for "Waiting for OCA sign-in..." state
- isWaitingForOcaAuth to input disabled check
* refactor(cli): extract OCA auth logic into useOcaAuth hook
Reduces code duplication between AuthView and SettingsPanelContent by
extracting the OCA auth subscription and state management into a
reusable hook.
The hook handles:
- Starting the OAuth flow (initialize + createAuthRequest)
- Subscribing to auth status updates
- Tracking waiting state
- Calling onSuccess callback when auth completes
- Exposing isAuthenticated for checking existing sessions
Both components now use the hook with their own onSuccess handlers
for component-specific state updates.
---------
Co-authored-by: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com>
* chore: add CLI type checking and caching to ci workflow
- Added a new cache step for CLI dependencies in the GitHub Actions test workflow to improve build performance.
- Included a step to install CLI dependencies using `npm ci`.
- Updated the `ci:check-all` script in `package.json` to include CLI type checking.
- Added a `cli:typecheck` script to handle type checking within the CLI directory.
* Fix type and import issues for cli
* Includes CI tests in test workflow
* use npx npm-run-all
* update ci:check-all
* ci: skip npm ci steps on cache hit in test workflow
Update the test workflow to conditionally run npm installation steps only when a cache hit is not found. This optimization reduces CI execution time by avoiding redundant dependency installations when the node_modules are already restored from cache.
* ci: update cache keys and add dependency verification in test workflow
Updated the cache keys for root, webview-ui, cli, and testing-platform dependencies by adding a version prefix (v1). This ensures a clean cache state and helps avoid potential corruption or mismatch issues.
Additionally, added a verification step in the test job to log cache hit status and check for the presence of key dependencies like biome and globby. This helps diagnose issues where the cache might be restored but dependencies are not correctly available for subsequent steps.
* update Verify and fix root dependencies
* fix type check script
* add isSettingsKey check
* update settingskey set
* apply feedback
* npx
* feat: flashing dot for streaming chat messages in CI (#9054)
Introduce an ink-spinner to the DotRow component to provide visual feedback when messages are being streamed. This improves the CLI user experience by clearly indicating that a tool call or message is currently in progress.
- Add `flashing` prop to `DotRow` component
- Replace static dot with `toggle8` spinner when `flashing` is true
- Update `ChatMessage` to pass `flashing` state based on `isStreaming` and `partial` message properties
Co-authored-by: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com>
* ci: simplify dependency caching using built-in npm cache
Replace manual actions/cache steps with setup-node's built-in npm caching feature across all workflow jobs. This change:
- Removes redundant cache action steps for root, webview-ui, cli, and testing-platform dependencies
- Uses setup-node's native `cache: 'npm'` option with `cache-dependency-path` to handle multiple package-lock.json files
- Eliminates conditional installation steps based on cache hits
- Reduces workflow complexity and maintenance overhead while maintaining caching functionality
The built-in caching provides the same performance benefits with less configuration and better integration with the Node.js setup action.
---------
Co-authored-by: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com>
* feat: add API key support for Cline provider
Add support for authenticating with Cline provider using an API key as an alternative to account-based authentication. This change allows users to configure Cline with either a direct API key or through the existing account authentication flow.
Changes:
- Add `clineApiKey` option to ClineHandler and pass through API configuration
- Update authentication check to accept either API key or account ID
- Modify provider configuration detection to check both auth methods
- Remove automatic Cline auth flow trigger on provider selection
- Add `clineApiKey` to provider-to-API-key mapping for proper key management
This provides more flexibility in authentication methods while maintaining backward compatibility with existing account-based authentication.
* promise all
---------
Co-authored-by: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com>
When navigating to subpages within the Settings panel (model picker,
provider picker, language picker, etc.), the Panel header now shows
"Esc to go back" instead of "Esc to close" and hides the arrow key
navigation hint since tabs cannot be switched while in a subpage.
The CLI was reading organization data from authService.getUserOrganizations()
which returns cached data. This caused org switches to not persist across
CLI restarts.
Now uses accountService.fetchUserOrganizationsRPC() to fetch fresh data
from /api/v1/users/me, matching how the webview's getUserOrganizations
RPC works.
Ink's useInput hook parses Home/End keys but doesn't expose them
(sets input='' and doesn't add key.home/key.end to the key object).
Changes:
- Add useHomeEndKeys hook to intercept Home/End from raw stdin
- Create shared keyboard.ts constants for escape sequences
- Remove dead Home/End code from useTextInput (was never firing)
- Add numbered priority documentation to ChatView's useInput handler
The markdown parser splits 'toggle to **Act mode**' into separate chunks,
so the previous regex requiring 'to Act Mode' as a complete phrase would
fail to match when Act mode was inside bold/italic formatting.
* fix(cli): support auto-updates for nightly versions
Previously, the auto-update logic only checked npm's "latest" tag,
so users on nightly builds (2.0.0-nightly.X) would never receive
nightly updates. The update commands also hardcoded @latest.
Changes:
- Detect nightly versions by checking for "-nightly." in version string
- Query npm "nightly" tag when current version is a nightly build
- Use @nightly in update commands for nightly users
- Fix compareVersions() to properly parse and compare nightly timestamps
(previously it would produce NaN when parsing "2.0.0-nightly.X")
* fix: tighten nightly version regex to require valid semver format