mirror of
https://github.com/cline/cline.git
synced 2026-10-25 18:33:44 +08:00
bee/desktop-cli-install
4
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
12a4c6bfe2 |
feat(core): load plugins in the hub process and surface plugin errors (#14957)
* feat(core): load plugins in the hub process and surface plugin errors
Plugins now load in-process through one registry per process instead of a
node/bun subprocess. The compiled CLI and the hub it starts no longer need a
runtime on PATH, and plugins can use the Bun global under the Bun-built hub.
The subprocess sandbox stays available with CLINE_PLUGIN_MODE=sandbox.
The registry wraps import, setup, every hook, tool, and command call with
timeouts and error capture, and tracks loading/ready/degraded/failed/disabled
per plugin with the last error's phase, message, stack, and counts. A failing
plugin no longer silently drops its tools:
- session.create takes a `plugins` policy shaped like toolPolicies, and its
reply and session.created event carry `pluginIssues`
- failures after start (setup and hooks run on the first turn) reach each
affected session as a status notice
- the hub answers plugins.list/status/reload and broadcasts
plugin.status_changed; `cline hub plugins [--reload]` wraps them
- the daemon marks a plugin failed instead of shutting down when an uncaught
error's stack points into it
- the CLI prints a warning naming the plugin and error, and
`cline config tools --json` lists failed plugins as plugin_failure entries
Setup and tool contexts gain cwd and emitEvent; __clinePluginHost keeps
working as a shim. Compiled binaries fall back to jiti/static when babel is
not on disk next to them.
* fix(core): give each session its own copy of every plugin module
Plugins written for the per-session sandbox keep state at module level. The
cline-monitor plugin, for example, builds one plugin object per import and
throws "Create a separate monitor plugin handle for each session" on a second
setup(). Sharing one imported copy across hub sessions broke it on the
second session.
The registry now hands each session its own copy: the first session claims
the copy imported at startup, and later ones re-evaluate the module while
reusing jiti's transform cache (about 180ms for cline-monitor instead of
2.8s with no cache).
A setup() failure now costs only the session it happened in: other sessions
keep their copies, the next session tries again, and a successful setup
returns the status to ready. Import failures, attributed uncaught errors, and
repeated hook/tool failures still turn the plugin off for every session.
* docs(sdk): document the plugin hooks that exist and how hook failures behave
The Hook Stages list (snake_case stages such as tool_call_before) and the
Hook Policies table (mode, retries, queueLimit, maxConcurrency) described no
code: plugin hooks are the seven runtime hooks, and there is no per-hook
policy object. Replace both with the real hooks, what each can return, and
how hookErrorMode and the 3-second hook timeout apply.
* fix(core): report failed plugins as failed in settings
Settings marked a plugin "failed" only when the plugin tool report had no
entry for it. The report now lists failed plugins with their state, so they
showed as "available" (desktop Extensions page and other core settings
hosts). Use the reported state, and fill loadError with the failing phase
and message so the reason is visible.
Also tell only the calling session about a per-session setup failure;
other sessions' copies still work. Keep the hub log line's own message
instead of letting the plugin error text overwrite it.
* fix(core): address plugin registry review findings
Reload and generations: each session copy records the generation (import)
it came from. A reload starts a new generation without invalidating older
copies, so running sessions keep working. Failures and blocking are counted
per generation, so a broken reload cannot turn off copies that still work,
and an old copy's failures cannot change the current status. A stray error
attributed by stack turns off every live generation, since a stack cannot
tell copies of one file apart.
Sandbox mode: the hub daemon no longer preloads plugins in sandbox mode,
and tool listing and MCP settings sync inspect plugins through the sandbox.
The session plugin policy now applies in sandbox mode: paths whose file
name the policy turns off never reach the sandbox, and plugins matched only
by their exported name are dropped after import.
Calls: commands, rule content, and message builders go through the same
guarded path as hooks and tools (timeout, error capture, failure count), and
calls into a copy that is turned off, failed setup, or whose session ended
are refused. A failing rule contributes no text and a failing message
builder leaves messages unchanged.
Cleanup: ctx.onDispose registers per-session cleanup. Timers a copy creates
while its own code runs, including at import, are tracked and cleared when
the session releases the copy; host callbacks given to plugins run outside
that scope so host timers are never cleared with them. Release runs on
session stop and dispose, and now also when building the session runtime
fails. The automation-events example uses ctx.onDispose.
Registrations: automation event types are validated while setup runs. If
the host still rejects a registration on commit, the copy's setup is
recorded as failed and the error is rethrown so the partial registrations
are discarded.
Also: forward importTimeoutMs, hookTimeoutMs, and contributionTimeoutMs to
the in-process registry per session; key the plugin tool inspection cache on
registry status; keep the module copy imported by preload for the first
session; report settings-disabled plugins a session would use as issues
with reason "settings".
* fix(core): keep this bindings and route import-time plugin events
- Timer tracking forwards the runtime's this (the timer handle in Node and
Bun) to plugin callbacks.
- Plugin methods keep their receiver: rule content, message builders,
command handlers, and setup() are called on their own objects, including
setup() in the existing in-process loader.
- Each plugin copy owns one async scope from import onward. Claiming the
copy for a session fills in that scope's session id and event callback,
so events emitted by work the module started at import reach the session.
- Each generation tracks its own health, so an older copy's first failure
after a reload is reported to its sessions even though the status shows
the reloaded generation.
* fix(core): bind plugin changes to sessions started afterwards
Plugins are bound to a session when it starts; added, edited, or reloaded
plugins reach only sessions started afterwards. Change detection used the
entry file's mtime and size, which missed edits to files the entry imports
(common for package plugins) and same-size edits within one clock tick, so
the next new session could claim a stale preloaded copy.
Detect changes with a content fingerprint of the entry file and every file
it reaches through relative static imports, for the registry, the plugin
tool inspection cache, and the plugin command service. Add a bootstrap test
that a session started before a plugin is added or changed keeps its
original tools even when its setup runs afterwards, and a registry test for
a change outside the entry file.
* fix(core): include side-effect imports in plugin change fingerprints
The fingerprint only followed `from`, `import()`, and `require()`
specifiers, so a fix to a file the entry imports only for side effects
(`import "./setup.js"`) left the fingerprint unchanged and new sessions kept
getting the failed entry.
Scan statement-level side-effect imports for the fingerprint only. They are
kept out of the dependency preflight, where a loose match on text inside a
string (`'run import "x" first'`) would reject a valid plugin.
* fix(core): retry failed plugin imports on a backoff
Change detection follows static and side-effect relative imports, but a
broken import can also be fixed where no fingerprint sees it: a dynamically
imported file, a file behind a block comment, or a dependency installed in
node_modules. Such plugins stayed failed until an explicit reload.
Retry a plugin whose import failed when a session starts, at most every 30
seconds, even if no change was detected. A broken plugin costs at most one
extra import attempt per 30 seconds, bounded by the import timeout.
Replace the SHA-1 fingerprint with a non-cryptographic checksum; it only has
to notice edits to plugin source.
* feat(desktop): show plugin failures in the chat
Plugin failures reached the desktop webview only as core logs written to the
devtools console. Show them as status lines in the chat:
- session start returns `pluginWarnings` for plugins the session asked for
but could not load, and the webview adds one status line per warning
- plugin notices that arrive later on the session stream (setup and hooks
run on the first turn) carry `metadata.pluginIssue`; the webview adds
those as status lines too, while other core logs stay out of the
transcript
* fix(desktop): keep plugin warnings when saved history reloads
Finishing a turn replaces the live transcript with saved history, which
never contains plugin warnings (they come from the start reply and stream
notices), so the explanation of a missing plugin disappeared after the first
turn. Carry the session's live plugin-warning lines into canonical history
at their original position by time.
* refactor(core): simplify the in-process plugin registry (#14999)
* refactor(core): simplify the plugin registry
Drop the pieces added in review rounds that cost more than they buy:
- Global timer tracking. It monkeypatched setTimeout/setInterval/
setImmediate and their clear* counterparts on globalThis for the whole
host process (the hub, the CLI, and the shared VS Code extension host),
and attributed timers by async scope, so a host callback invoked from
inside a plugin call had its timers cancelled when the session released
its plugin copy. Plugins stop what they start in ctx.onDispose, which
stays.
- Plugin generations and per-generation health. Blocking and consecutive
failures are counted per plugin again; a re-import (reload or source
change) resets them. Running sessions keep their copies callable unless
the plugin is turned off, so a broken reload fails closed for them.
- Automatic retry of failed imports on a 30 s backoff, and the side-effect
import scan in the change fingerprint. plugins.reload covers changes the
fingerprint cannot see.
- The duplicated registerAutomationEventType validation; the commit
try/catch already records a host-rejected registration as a setup
failure.
* refactor(core): do not apply the session plugin policy in sandbox mode
The sandbox is an opt-in escape hatch and the per-session policy is new;
filtering sandbox results by file-derived and exported names added two
passes nobody needs yet. The policy is documented as in-process only.
* revert(desktop): drop the live plugin-warning merge into saved history
Reverts
|
||
|
|
31ee8eb744 |
feat(cli): install plugins from file URLs (#10945)
* feat(cli): install plugins from file URLs * fix(cli): harden remote plugin installs * docs: document plugin file URL installs * docs: simplify plugin file URL wording * docs: trim CLI plugin example |
||
|
|
acca9186f1 | docs: clarify plugin SDK peer dependency (#10823) | ||
|
|
0b0ca9b1fa |
docs: add SDK documentation (#10350)
* docs: add comprehensive SDK documentation as top-level tab Adds 27 new documentation pages for the Cline SDK (@clinebot/core, @clinebot/agents, @clinebot/llms, @clinebot/shared) organized into a dedicated "SDK" tab in the Mintlify docs navigation. Structure: - Getting Started: overview, quickstart, examples - Core Concepts: agents, sessions, tools, streaming/events, extensions, hooks, providers/models - Guides: building an agent, custom tools, writing extensions, permission handling, scheduled agents, multi-agent teams, connectors, production - Architecture: layered stack overview, hub-spoke RPC, package reference - API Reference: ClineCore, Agent, Gateway, Tools API, Events, Types - CLI: commands, configuration, connector setup Removes the old single-page SDK overview (cline-sdk/overview.md) that documented the previous ACP-based ClineAgent API, and removes its reference from the Cline CLI navigation group. * docs: fix SDK docs review feedback - Change "desktop app" to "JetBrains plugin" in overview (not released yet) - Rename "Providers & Models" to "Model Providers" - Rename "Streaming & Events" to "Streaming Events" - Remove duplicate cli/connectors.mdx (guides/connectors.mdx covers everything) * docs: add wizard commands, Discord connector, and platform credential details * feat(docs): create CLI tab with new feature pages and updated reference - Add CLI as its own top-level tab in docs navigation - Remove CLI group from Docs tab and SDK tab - Delete SDK CLI pages (content moved to CLI tab) - Add new feature pages: connectors, scheduling, MCP servers, agent teams - Rewrite cli-reference.mdx with all new commands (connect, mcp, schedule, rpc, checkpoint, doctor) and new flags (reasoning-effort, thinking, sandbox, teams, spawn, tool-enable/disable, autoapprove) - Update configuration.mdx with new directory structure, env vars (CLINE_DATA_DIR, CLINE_RPC_ADDRESS, CLINE_SESSION_BACKEND_MODE, CLINE_SANDBOX), and MCP wizard reference * docs: rename Docs tab to Extension and reorder tabs Tab order: Extension, CLI, SDK, Kanban, Enterprise, API, Learn * docs: simplify SDK install to single @clinebot/core package @clinebot/core re-exports from agents, llms, and shared, so users only need one install and one import source. Updated all getting-started, quickstart, examples, and guide pages to import from @clinebot/core. Concept and reference pages keep individual package imports since they document those specific packages. * docs: use @clinebot/sdk as the primary install and import path @clinebot/sdk is an alias for @clinebot/core that re-exports from all packages. All user-facing pages (overview, quickstart, examples, guides) now show npm install @clinebot/sdk and import from @clinebot/sdk. Architecture and reference pages keep individual package names since they document the internal package structure. * docs: rename Extension tab to Cline * docs: fix packages page and merge duplicate imports * fix: use getting-started page in CLI tab nav and remove conflicting redirect * docs: rename CLI Getting Started page title to Overview * docs: rename cline-cli/ to cli/ and cline-sdk/ to sdk/ Shorter, cleaner URL paths. Updated all internal links across every doc page and added 44 redirects for old paths so existing URLs don't break. * docs: update hub-spoke architecture from gRPC/RPC to WebSockets - Rewrite hub-spoke.mdx: WebSocket protocol, capability brokerage, spoke workers, session participants, hub daemon discovery - Replace all RPC/gRPC/sidecar references with hub/WebSocket across all SDK and CLI docs - Backend modes: local/hub/remote/auto (was local/rpc/auto) - Hub command replaces rpc command (cline hub start/stop/status/ensure) - Default port 25463 (was 4317), log file hub-daemon.log - Remove @clinebot/rpc and @clinebot/scheduler from architecture docs (functionality absorbed into @clinebot/core) - Update ClineCore reference to remove rpc options - Add capability brokerage and session participant concepts * docs: add Ecosystem page to SDK tab * docs: move Ecosystem page after Guides and fix opening sentence * docs: rename extensions to plugins across all SDK and CLI docs - Rename AgentExtension to AgentPlugin in all code examples - Rename ExtensionAPI to PluginAPI - Rename extensions.mdx to plugins.mdx, writing-extensions.mdx to writing-plugins.mdx - Rename all variable names (databaseExtension -> databasePlugin, etc.) - Rename config field from extensions to plugins - Update all prose, section headers, and cross-links - Add redirects for old paths * clean up attempt 1 * remove deprecated features * part 1 of large provider changes * a large pass on workflows * cli ref updates * config rewrite * more concise instsallation and model selection * provider reorg cont * update providers * one step further cleaning up * kanban finishing clean up * wip... * another big cleanup - remove the CLI tabgroup * sdk tighten up pt1 * more sdk doc tightening * making more progress * doc update based on bee latest branch * nit update on codepaths * remove learn section * docs: add plugin install command documentation Document the new clite plugin install command across CLI reference, customization plugins page, SDK plugins concept page, and the writing plugins guide. Cover all three source types (npm, git, local), the package.json manifest format with cline.plugins field, host-provided dependency handling, auto-detection logic, and the install directory structure. Reference cline/typescript-lsp-plugin as a concrete install example. * docs: deduplicate plugin install docs Trim redundant plugin install content from CLI reference, SDK plugins concept page, and writing-plugins guide. Each now links to the customization/plugins page as the single source of truth for manifest format, install commands, and directory layout. * further simplify the doc * further clean up * mark warnings * docs: rename @clinebot to @cline and clite to cline SDK packages moved to the @cline npm org. Update all docs references to use @cline/sdk, @cline/agents, @cline/core, @cline/shared, @cline/llms and the cline CLI binary name. * docs: streamline SDK docs with example references (#10617) * docs: streamline SDK docs with example references and @cline/sdk imports Replace large standalone code blobs in SDK docs with references to working examples in the SDK repository. Users can now clone and run real code instead of copy-pasting from docs. - Update all imports from @cline/agents, @cline/core, @cline/shared to @cline/sdk (the public-facing package) - Fix model IDs from claude-sonnet-4-6 to claude-sonnet-4-20250514 - Quickstart: trim duplicate code patterns, add cards linking to cli-agent, code-review-bot, multi-agent, desktop-app examples - Overview: add examples table with difficulty progression, update install instructions to use @cline/sdk - Building an Agent: rewrite as a walkthrough of the code-review-bot example rather than inline code blobs across 4 separate files - Creating Custom Tools: rewrite to use createTool with zod, add completion tools section, reference working examples - Tools: show createTool with zod as primary pattern - Events: reference multi-agent example for streaming UI pattern - Architecture: update install to @cline/sdk * fix: use claude-sonnet-4-6 model ID across all SDK docs * remove connector page from sdk * small reordering * clean up sdk app and plugin examples --------- Co-authored-by: Renee Huang <renee@cline.bot> * remove features/connectors * doc revisions * fix references after folder change * docs: fix SDK review feedback after rebase * docs: address Greptile SDK review feedback * docs: move TUI page under CLI nav * docs: restore TUI page placement --------- Co-authored-by: Renee Huang <renee@cline.bot> Co-authored-by: John Simone <john@cline.bot> Co-authored-by: Arafatkatze <arafat.da.khan@gmail.com> |