Files
2026-07-13 12:52:40 +08:00

206 lines
6.2 KiB
Plaintext

---
title: "ClineCore"
sidebarTitle: "ClineCore"
description: "The full Cline harness: built-in tools, sessions, approvals, scheduling, and hub support."
---
`ClineCore` is the full Cline harness as a programmable runtime. It gives you everything Cline ships out of the box: built-in tools for files, shell, search, and web; session persistence and message history; tool approval callbacks; local, hub, and remote backends; scheduling and automation APIs; and plugin support.
Under the hood, `ClineCore` uses the `Agent` class from `@cline/agents`. You can use `Agent` directly if you want to skip the harness and wire everything yourself: your own tools, your own persistence, your own lifecycle.
## When to use which
| Need | Use |
|------|-----|
| Sessions, persistence, message history | `ClineCore` |
| Built-in tools for files, shell, search, web fetch | `ClineCore` |
| Hub/remote runtime | `ClineCore` |
| Scheduling or event automation | `ClineCore` |
| Multi-agent teams | `ClineCore` |
| Browser-compatible or lightweight in-process agent | `Agent` |
| Custom tools only, no built-ins | `Agent` |
| Full control over persistence and lifecycle | `Agent` |
## ClineCore
`ClineCore` wraps runtime execution with application features:
- session manifests and message artifacts
- built-in tools
- tool approval callbacks
- local, hub, and remote backends
- automation/scheduling APIs
- optional plugin paths and extensions
```typescript
import { ClineCore } from "@cline/sdk"
const cline = await ClineCore.create({
clientName: "my-app",
backendMode: "auto",
})
const session = await cline.start({
prompt: "Set up GitHub Actions for this repo",
config: {
providerId: "anthropic",
modelId: "claude-sonnet-4-6",
apiKey: process.env.ANTHROPIC_API_KEY,
systemPrompt: "You are a helpful coding assistant.",
cwd: "/path/to/project",
workspaceRoot: "/path/to/project",
enableTools: true,
enableSpawnAgent: false,
enableAgentTeams: false,
},
})
console.log(session.sessionId)
console.log(session.result?.finishReason)
```
### Methods
| Method | Purpose |
|--------|---------|
| `ClineCore.create(options)` | Create the runtime |
| `start(input)` | Start a session |
| `send({ sessionId, prompt })` | Send a follow-up message |
| `subscribe(listener, options?)` | Listen to session events |
| `list(limit?, options?)` | List sessions with history metadata |
| `get(sessionId)` | Read session metadata |
| `readMessages(sessionId)` | Read session messages |
| `getAccumulatedUsage(sessionId)` | Read session token/cost totals |
| `abort(sessionId, reason?)` | Abort current work |
| `stop(sessionId)` | Stop a session |
| `delete(sessionId)` | Delete a session |
| `dispose(reason?)` | Clean up runtime resources |
See [ClineCore reference](/sdk/reference/cline-core) for exact signatures.
## Backend Modes
| Mode | Behavior |
|------|----------|
| `auto` | Prefer a compatible local hub, otherwise use local execution |
| `hub` | Require a compatible WebSocket hub |
| `remote` | Connect to a configured remote hub |
| `local` | Always use local in-process execution and local storage |
For process topology, see [Hub & Spoke](/sdk/architecture/hub-spoke).
## Session Artifacts
`ClineCore` stores session manifests and messages as files. A session result includes:
| Field | Meaning |
|-------|---------|
| `sessionId` | Session identifier |
| `manifest` | Parsed session manifest |
| `manifestPath` | Path to the session manifest JSON |
| `messagesPath` | Path to persisted message JSON |
| `result` | Final `AgentResult`, when available |
## Tool Approval
Use tool policies for simple cases:
```typescript
await cline.start({
prompt: "Audit this repo",
config: {
providerId: "anthropic",
modelId: "claude-sonnet-4-6",
apiKey: process.env.ANTHROPIC_API_KEY,
systemPrompt: "You are a helpful coding assistant.",
cwd: process.cwd(),
workspaceRoot: process.cwd(),
enableTools: true,
enableSpawnAgent: false,
enableAgentTeams: false,
},
toolPolicies: {
read_files: { autoApprove: true },
search_codebase: { autoApprove: true },
run_commands: { autoApprove: false },
editor: { autoApprove: false },
},
})
```
Use `requestToolApproval` when your application needs to decide dynamically:
```typescript
const cline = await ClineCore.create({
clientName: "my-app",
capabilities: {
requestToolApproval: async (request) => {
return { approved: request.toolName !== "run_commands" }
},
},
})
```
For tool behavior and policies, see [Tools](/sdk/tools).
## Using Agent directly
`Agent` (also exported as `AgentRuntime`) is the stateless primitive that `ClineCore` builds on. Use it directly when you want full control or don't need the harness.
`Agent` is an alias for `AgentRuntime`. Use `Agent` when constructing from provider/model IDs. Use `AgentRuntime` when supplying a pre-built `AgentModel`.
`Agent` runs the core loop:
```txt
run() or continue()
-> model request
-> tool calls, if any
-> tool results
-> repeat until complete
```
```typescript
import { Agent } from "@cline/sdk"
const agent = new Agent({
providerId: "anthropic",
modelId: "claude-sonnet-4-6",
apiKey: process.env.ANTHROPIC_API_KEY,
systemPrompt: "You are a helpful coding assistant.",
tools: [myTool],
})
agent.subscribe((event) => {
if (event.type === "assistant-text-delta") {
process.stdout.write(event.text ?? "")
}
})
const result = await agent.run("Review this diff")
console.log(result.outputText)
```
### Agent Methods
| Method | Purpose |
|--------|---------|
| `run(input)` | Start a run with user input |
| `continue(input?)` | Continue with optional new input |
| `abort(reason?)` | Abort the active run |
| `subscribe(listener)` | Listen to `AgentRuntimeEvent` events |
| `restore(messages)` | Replace conversation history |
| `snapshot()` | Read runtime state |
See [Agent reference](/sdk/reference/agent) for exact signatures.
### Multi-Turn Conversations
`AgentRuntime` keeps message state internally. Use `continue()` after the first run:
```typescript
await agent.run("What does this project do?")
await agent.continue("Now identify risky files")
```
If you persist messages externally, restore them with `restore(messages)` before continuing.