github cline/cline sdk/sdk/v0.0.83
SDK v0.0.83

latest releases: desktop-v0.0.28, v4.1.18, cli-v3.0.62...
12 hours ago
  • Hub-managed Agent Plugins. Packages under ~/.agents/plugins/* on the hub host are discovered and validated from their root plugin.json; valid skills under skills/ are exposed through the skills tool as plugin-name:skill-name, and stdio, Streamable HTTP, and legacy SSE servers from mcp.json are started without touching cline_mcp_settings.json. Workspace .agents/plugins directories are deliberately not scanned, so opening a repo cannot implicitly start repo-controlled MCP servers; extra roots require an explicit agentPluginPaths. Enablement lives in hub settings keyed by manifest name and publishes settings.changed, so clients no longer need their own loader or enablement store. Two bugs fixed along the way: settings.toggle({type: "skills"}) wrote a disabled key into a plugin skill's SKILL.md frontmatter, which the strict Agent Skills parser then rejected so the skill silently vanished until hand-edited; and InMemoryMcpManager.dispose() aborted on the first disconnect() rejection, leaking every remaining server's process
  • A model turn that dies mid-stream with a transient provider error is now retried up to 3 times with exponential backoff instead of failing the whole run — a single forwarded 429 previously aborted the run outright. Retryability is read from the AI SDK's typed signals, and a turn is never retried once it has streamed any text, reasoning, media, or tool call, so nothing is duplicated. Model calls also now allow 5 SDK-level retries for request-start 429/5xx/network failures, up from 2
  • Streaming is no longer throttled by hook forwarding. The hub proxied every runtime event to client-contributed onEvent hooks as a capability round trip carrying the full session snapshot, with the agent loop awaiting it — so each streamed token cost a few hundred KB of serialization, a persisted row, and a blocking IPC hop. Per-chunk text, reasoning, and tool-update deltas are no longer forwarded to remote onEvent hooks; every other event still reaches hooks unchanged. The hub event log also moved to synchronous = NORMAL, dropping one fsync per appended delta
  • Checkpoints no longer re-hash unchanged untracked files on every turn. Each turn built a throwaway git index, so git re-read every untracked file before each model call — with multi-GB untracked data in the workspace this blocked every message for seconds to minutes. A persistent per-session snapshot index lets git's stat cache skip unchanged files, so from the second turn a snapshot costs about one git process. Snapshot contents are byte-identical to before. A corrupt index now heals with one rebuild-and-retry that also clears a stale index.lock, where previously a git process killed mid-add degraded that session to HEAD-only checkpoints permanently
  • run_commands no longer hangs when a command backgrounds a child. The executor settled on the child's close event, which waits for the stdio pipes to drain; a backgrounded process (cmd &, nohup) holds the inherited write-ends open, so a finished command hung until the timeout killed the whole process tree. It now also settles on exit after a one-second grace period, reporting the exit code and the output collected so far
  • apply_patch "Add File" against a path that already exists is now rejected instead of silently overwriting it. Only UPDATE and DELETE targets were pre-loaded, so the parser's "File already exists" guard never saw ADD targets and the patch destroyed the file's contents with no error and no diff of what was lost
  • Nested PowerShell invocations are now unwrapped instead of being double-parsed. Command text is fed to PowerShell through a stdin bootstrap that the outer shell parses as PowerShell source, so a command written as powershell -Command "... $_ ..." had its argument interpolated before the nested shell ran — pipelines using $_ emitted one error per enumerated item, an error flood that looked like a hang, while the child still exited 0. Unwrapping is applied only when it is semantics-preserving: same PowerShell edition, -NoProfile, and an entirely quoted -Command tail; everything else passes through byte-identical
  • The run_commands tool description now names the actual PowerShell edition in use — Windows PowerShell (powershell.exe) versus PowerShell (pwsh.exe) or PowerShell (pwsh) — quotes its guidance against the resolved executable, and tells the model to write commands directly rather than wrapping them in another -Command or /c invocation. It also no longer claims "in Windows environment" when pwsh is the configured shell on macOS or Linux
  • No file index is built when the workspace root is the home directory or a filesystem root. Running from $HOME and typing an @ mention listed every file under home and re-ranked the whole index on each keystroke, driving the process to many GB of RSS until it was OOM-killed. Paths are canonicalized first so symlinked or differently-cased spellings still hit the guard
  • Credential fields are now stripped of Unicode control and format characters and surrounding whitespace before being saved. A key pasted with an invisible character (BOM, zero-width space, bidi mark) was stored corrupted and the provider returned a 401 indistinguishable from a genuinely wrong key, while masked rendering hid the corruption
  • The editor tool's error for a null old_text now names the file, says whether the parameter was null or omitted, and spells out the recovery. Models that fill optional parameters with null hit a terse "required" message and re-sent the identical call until the loop detector hard-stopped the run
  • Provider-native web search is now enabled by default in non-yolo sessions on supported provider/model combinations, instead of requiring tools.web_search.enabled = true. An explicit false still opts out, and the settings loader fails closed: web search stays disabled when a global settings file exists but cannot be read or parsed
  • Session history no longer hides root sessions behind their children. The list over-fetched a fixed window of rows and filtered out subagent and team-task children client-side; since children sort after the root that spawned them, one session with more children than the window hid itself and every older root. Listing now widens until the requested page fills, and the backends filter child rows in SQL
  • Schedules no longer stall each other. The cron runner awaited the whole claimed batch, so one long agent turn blocked dispatch of every other schedule; dispatch is now decoupled from execution, and per-schedule and global parallelism are enforced inside the SQLite claim transaction so multiple connections cannot exceed a schedule's limit. Locally active claims are renewed each tick, so work resumed after system sleep is not reclaimed and started twice, and terminal status is written before the markdown report so a failed report write cannot replay a completed turn
  • Recurring schedules created without a timezone now persist the host's local IANA timezone rather than an implicit default, and the scheduling tool prompts tell the model to omit the timezone instead of guessing
  • Automation event acceptance is now atomic. The event log row was committed before specs were matched and runs materialized, so a failure mid-fan-out left the event permanently deduplicated and impossible to redeliver, and other connections could observe partially materialized runs. Acceptance now runs in one write transaction, and failures roll back and propagate to the caller for redelivery
  • New RemoteEnvironmentService runs sessions on an SSH host while the client stays local. connect() inspects the remote host, uploads a self-contained helper binary to ~/.cline/remote/, starts a loopback-bound Hub there, and opens an SSH tunnel to it; the returned endpoint and token are passed to ClineCore.create({ backendMode: "remote" }), after which tools, sessions, and persistence all execute remotely. SSH runs with BatchMode=yes and StrictHostKeyChecking=yes, so the host key must already be known and password authentication is not supported; profiles are stored at mode 0600 and hold identity-file paths only, never secrets. Remote targets are Linux and macOS on x64/arm64, and embedders must supply a helper binary cross-compiled for the target. This is an SDK building block — no CLI command or desktop UI is wired to it yet, and it is inert unless an embedder constructs the service
  • A session started without an explicit systemPrompt now gets a default Cline prompt built on the execution host, rather than running with none. Callers that pass their own prompt are unaffected
  • Hub daemons can now be started with connector management disabled, so an SSH-spawned Hub does not adopt or restart the account's Slack and Telegram connectors. Locally started hubs are unaffected
  • Hub clients can now authenticate a remote connection with HTTP headers via a resolveConnectionHeaders() resolver, re-resolved on every reconnect so short-lived credentials can refresh. It is mutually exclusive with the local hub-token subprotocol. NodeHubClient.connect() was also reworked so concurrent calls share one in-flight promise and a stale registration or connect timeout can no longer clobber a newer attempt
  • A hub running the same core version as the client no longer prompts to update. Two artifacts of the same release cut from different commits never share a build fingerprint, so anyone with both the desktop app and the CLI installed got a "Cline Hub was updated" dialog on every launch whose "Update and restart" looped on "no app update available". Genuinely different core releases still prompt
  • Sessions seeded with history (forks, checkpoint restores) now persist their live idle status instead of defaulting to "running", which left a restored session showing as busy forever
  • Sessions imported from Claude Code, Codex, or opencode now summarize the foreign history on first resume rather than replaying tool calls the current agent cannot make. The summary is persisted so it runs once, the canonical transcript is left intact, and a failed attempt falls back to the raw history. Imported sessions also record an import origin that is stamped on their telemetry, and resuming a session no longer overwrites stored import or automation provenance with a default "user" origin
  • Session import source directories now resolve correctly on Windows profiles where USERPROFILE disagrees with what Node reports, and honor CLAUDE_CONFIG_DIR, CODEX_HOME, and XDG_DATA_HOME
  • Cline Pass and free models now report zero cost. The backend reports upstream market cost on those responses and it was passed straight through, so subscription and free usage showed dollar figures for requests that are not billed per token
  • Offline clients now fall back to generated Recommended, Free, and Subscribed model lists built at release time. The fallback was a hand-maintained literal of six models with an empty Cline Pass tier, so when the recommended-models endpoint was unreachable, subscribers got no subscribed tier at all
  • Langfuse tracing is now limited to the Cline and Cline Pass providers. The provider argument was ignored, so in Langfuse-configured environments prompts and responses from third-party and BYOK providers were exported too
  • OpenCode Go models are now routed to the right wire protocol. One base URL serves several protocols, but every model was sent over the OpenAI chat-completions adapter, so Anthropic-protocol and OpenAI Responses models on that endpoint failed or misbehaved. Requests also now carry the sticky session header and a Cline user agent
  • Claude Code and OpenCode are now declared local-auth providers with a named local CLI, so hosts route them to a local-CLI readiness screen instead of demanding an API key they never read — previously the workaround was storing a dummy key, and the desktop app rendered an OAuth button for OpenCode that did nothing
  • The OpenAI Codex (ChatGPT subscription) model list no longer gets overwritten with the full OpenAI API catalog by hosts that query provider models, which also lost the Codex context caps. The Codex backend's 400K/272K/128K budget is now clamped onto every Codex model rather than just one, so newer models no longer inherit the API catalog's 1M limits and produce over-long requests and wrong context math. Retired ChatGPT-account models were dropped from eligibility and the default moved to gpt-5.6-terra
  • Live model catalogs now refresh for every shared-catalog provider, not just Cline and Cline Pass — other providers' lists were whatever was bundled at build time, so newly published models never appeared without a package update. The catalog fetch and the model-source fetch are both bounded by timeouts, so a hung models endpoint can no longer stall the provider list indefinitely
  • Providers are now reported as configured based on the provider their credentials are stored under. Cline Pass signs in as Cline and never writes its own entry, so a new Cline Pass user saw only one configured provider despite one sign-in configuring both. The "(free)" suffix now also applies to free-tier models whose ids come from upstream rather than Cline's own namespace
  • @cline/ui gains a shared Switch built on a native checkbox, and SearchCombobox keeps section headers visible while searching and can refresh its options each time it opens. Migrators should note the Switch has no data-state/asChild hooks and tests must read the native checked property rather than aria-checked
  • Cline Pass now defaults to a subscribed-tier model. Its provider list mixes subscribed (cline-pass/*) and free models, and the default was simply the first entry in a release-date-ordered list, so it drifted onto whichever free model had shipped most recently — a subscriber who never picked a model was put on the free tier rather than the one they pay for. The default is now restricted to cline-pass/* ids
  • Refreshed the model catalog. Adds four providers (Infer by Flow7, Melious, NaN, and Wallaby) and takes the bundled catalog from 5,788 to 6,079 models. This is a wide refresh: the resolved default model changes for 44 providers, most of them landing on DeepSeek V4.1 Flash — among them Hugging Face, Fireworks, Requesty, Nebius, Cortecs, CrossModel, DigitalOcean, Eden AI, and OpenCode Go. Gemini and Vertex now resolve to Gemini 3.8 Flash, GitHub Copilot and Vivgrid to GPT-6 Astra, and NVIDIA to GLM 5.3 Flash. If you use any provider without pinning a model, expect a different default

Full Changelog: sdk/sdk/v0.0.82...sdk/sdk/v0.0.83

Don't miss a new cline release

NewReleases is sending notifications on new releases.