* fix(desktop): dedupe chat_queued_prompt_start emitted for the same prompt PendingPromptService.drain() emits a pending_prompts snapshot (head removed) and a pending_prompt_submitted event back-to-back for the same prompt. The sidecar translated both into chat_queued_prompt_start, so the webview rendered the user's message twice until the chat was re-hydrated from history. Track the last announced prompt id per live session and emit the start chunk once. * fix(desktop): re-key optimistic user bubble when the runtime queues the prompt The send path renders an optimistic user bubble for prompts dispatched while the session is idle, keyed by a random id. When the runtime routes that prompt through its pending queue (e.g. during session startup), the queued-prompt-start event appended a second bubble under queued_user_<promptId> — the same message rendered twice until the chat was re-hydrated from history. Re-key the trailing optimistic bubble to the event's id instead of appending. * fix(desktop): re-key only outstanding optimistic bubbles on queued prompt start Review follow-up: matching by content alone could swallow a new queued prompt that repeats the text of a message left at the transcript tail by an earlier cancelled/failed turn. Track in-flight optimistic bubble ids explicitly (registered on optimistic append; cleared on re-key, turn end, error, and history hydration) and only re-key those.
Cline SDK Examples
Learn how to build with the Cline SDK through working examples, ordered from simple to complex.
SDK Skill
If you use a coding agent (Claude Code, Codex, Cline, etc.), install the Cline SDK skill to give your agent context on the SDK's APIs and best practices to help you build with the Cline SDK.
npx skills add cline/sdk-skill
Prompt it to scaffold agents, create custom tools, wire up plugins, configure providers, and more.
Getting started
All examples live in this directory. Each is a standalone project with its own package.json and README. To run any example:
cd apps/examples/<example-name>
bun install
bun run build:sdk
export CLINE_API_KEY="cline_..."
bun dev
Requires Node.js 22+.
Examples
Beginner
| Example | Description | Concepts |
|---|---|---|
| quickstart | Send one prompt, stream the response. ~15 lines of code. | Agent, subscribe, run() |
| cli-agent | Interactive terminal chat with a shell tool. | createTool, multi-turn run()/continue(), streaming |
| cline-core-cli-agent | Interactive terminal chat powered by ClineCore. | ClineCore.create(), cline.start(), cline.send(), built-in tools, streaming |
Intermediate
| Example | Description | Concepts |
|---|---|---|
| code-review-bot | AI code reviewer that reads git diffs and produces structured comments. | Multiple tools, completesRun lifecycle, systemPrompt, zod schemas |
| multi-agent | Web app that fans out to three specialist agents in parallel, streams results via SSE, then synthesizes a unified answer. | Concurrent agents, Promise.all, per-agent subscribe(), SSE streaming, agent composition |
Advanced
| Example | Description | Concepts |
|---|---|---|
| desktop-app | Full Tauri + Next.js desktop app for running and inspecting chat sessions. | Sidecar runtime, websocket transport, session persistence |
| menubar | macOS menu bar app with Tauri. | Native app integration, compact UI |
| vscode | VS Code extension with chat panel. | Extension API, webview, workspace context |
SDK packages
When building your own app, install the public SDK package:
npm add @cline/sdk
@cline/sdk re-exports everything from @cline/core. You only need @cline/agents or @cline/llms if you want lower-level control over the agent runtime or model gateway directly.
Learn more
- SDK package docs
- Architecture guide
- Plugin examples - extend the Cline SDK and CLI with custom tools and event hooks
- Hook examples - lifecycle hooks for logging, blocking, and injection for Cline SDK and CLI