cline-sdk
Version:
Comprehensive SDK for Cline - AI-powered development assistant with database integration, execution modes, and custom functions
670 lines (575 loc) • 18.9 kB
Markdown
# Cline SDK - AI Technical Reference
**Technical documentation for AI systems integrating with the Cline SDK**
## Overview
The Cline SDK is a comprehensive TypeScript/JavaScript library for building AI-powered development assistants with database integration, execution control, and extensible functionality.
## Core Architecture
### Class Hierarchy
```typescript
CompleteClineSDK extends EventEmitter
├── ConfigManager: ClineConfigManager
├── AnthropicClient: API communication
├── Tools: Map<string, Tool>
├── FunctionRegistry: Custom function management
├── PostgreSQLManager: Database operations
├── TableKnowledgeManager: Business context storage
└── ExecutionMode: "ask" | "plan" | "act"
```
### Primary Interfaces
```typescript
interface ClineConfig {
apiProvider: "anthropic"
apiKey: string
model?: string
enabledTools: string[]
executionMode?: ExecutionMode
workingDirectory: string
storageType: "local" | "supabase"
enableDatabase?: boolean
database?: PostgreSQLConfig
enableCustomFunctions?: boolean
customInstructions?: string
}
interface ClineTask {
id: string
created: number
text: string
images: string[]
files: string[]
status: "running" | "completed" | "error" | "cancelled"
messages: ClineMessage[]
tokensIn: number
tokensOut: number
totalCost: number
costCalculations: CostCalculation[]
}
interface ClineMessage {
ts: number
type: "say" | "tool" | "ask"
say?: "user" | "assistant"
text?: string
images?: string[]
toolName?: string
toolInput?: any
toolResult?: any
costCalculation?: CostCalculation
}
```
## Execution Modes
### Mode Definitions
```typescript
type ExecutionMode = "ask" | "plan" | "act"
const MODE_DEFINITIONS: Record<ExecutionMode, ModeConfiguration> = {
ask: {
allowedTools: [],
systemPromptAddition: "IMPORTANT: You are in ASK MODE - you can only provide information...",
autoSwitchEnabled: true
},
plan: {
allowedTools: ["Read", "DatabaseSchema"],
systemPromptAddition: "You are in PLAN MODE - you can inspect and analyze...",
autoSwitchEnabled: true
},
act: {
allowedTools: ["Write", "Read", "Bash", "DatabaseQuery", "DatabaseSchema", "DatabaseRLS", "CustomFunction"],
systemPromptAddition: "You are in ACT MODE - you have full access...",
autoSwitchEnabled: true
}
}
```
### Mode Switching Logic
```typescript
function parseModeSwitch(userInput: string): ExecutionMode | null {
const input = userInput.toLowerCase().trim()
// Direct commands
if (input === "/ask" || input.includes("switch to ask mode")) return "ask"
if (input === "/plan" || input.includes("switch to plan mode")) return "plan"
if (input === "/act" || input.includes("switch to act mode")) return "act"
// Natural language detection
if (input.includes("only answer questions") || input.includes("don't execute")) return "ask"
if (input.includes("create a plan") || input.includes("analyze but don't execute")) return "plan"
if (input.includes("execute") || input.includes("do it")) return "act"
return null
}
```
## Tool System
### Tool Interface
```typescript
interface Tool {
getDefinition(): ToolDefinition
execute(input: any): Promise<any>
}
interface ToolDefinition {
name: string
description: string
input_schema: {
type: "object"
properties: Record<string, any>
required?: string[]
}
}
```
### Available Tools
#### File Operations
- **WriteTool**: File creation and modification
- **ReadTool**: File reading and content retrieval
- **SupabaseWriteTool**: Cloud file operations
- **SupabaseReadTool**: Cloud file retrieval
#### System Operations
- **BashTool**: Command execution with safety controls
#### Database Operations
- **DatabaseQueryTool**: SQL query execution with parameterization
- **DatabaseSchemaTool**: Schema introspection and metadata
- **DatabaseRLSTool**: Row Level Security management
#### Custom Operations
- **CustomFunctionTool**: User-defined function execution
### Tool Execution Flow
```typescript
private async executeTool(task: ClineTask, toolName: string, input: any, toolId: string): Promise<void> {
// 1. Mode restriction check
if (!this.isToolAllowedInMode(toolName)) {
// Return mode restriction error
return
}
// 2. Tool existence validation
const tool = this.tools.get(toolName)
if (!tool) throw new Error(`Tool not found: ${toolName}`)
// 3. Execute with error handling
try {
const result = await tool.execute(input)
// Add success message to task
} catch (error) {
// Add error message to task
}
}
```
## Database Integration
### PostgreSQL Manager
```typescript
class PostgreSQLManager {
private pool: Pool
private permissions: DatabasePermissions
async query(sql: string, params?: any[]): Promise<QueryResult>
async getSchemas(): Promise<string[]>
async getTables(schema: string): Promise<TableInfo[]>
async getTableSchema(schema: string, table: string): Promise<TableSchema>
async testConnection(): Promise<ConnectionResult>
async createRLSPolicy(table: string, policy: RLSPolicy): Promise<void>
async enableRLS(table: string): Promise<void>
getSchemaContext(): string
close(): Promise<void>
}
```
### Permission System
```typescript
interface DatabasePermissions {
allowRead: boolean
allowWrite: boolean
allowDelete: boolean
allowSchemaChanges: boolean
allowRLSManagement: boolean
restrictedTables: string[]
allowedTables: string[]
}
```
### Query Safety
- All queries use parameterized statements ($1, $2, etc.)
- SQL injection prevention through pg library
- Permission checking before query execution
- Table access validation against allow/restrict lists
## Table Knowledge System
### Knowledge Structure
```typescript
interface TableKnowledge {
schemaName: string
tableName: string
businessName: string
description: string
businessPurpose: string
domain?: string
columns: ColumnKnowledge[]
relationships?: TableRelationships
businessRules?: BusinessRule[]
commonUseCases?: UseCase[]
dataLifecycle?: DataLifecycle
performance?: PerformanceInfo
security?: SecurityInfo
tags?: string[]
}
interface ColumnKnowledge {
name: string
dataType: string
description: string
businessPurpose: string
validation?: ValidationRules
privacy?: PrivacyInfo
businessRules?: string[]
examples?: string[]
relationships?: ColumnRelationships
commonQueries?: string[]
}
```
### Knowledge Manager API
```typescript
class TableKnowledgeManager {
private knowledgeBase: Map<string, TableKnowledge>
private dbManager?: PostgreSQLManager
addTable(knowledge: Partial<TableKnowledge>, options?: TableRegistrationOptions): void
addColumn(schemaName: string, tableName: string, columnKnowledge: ColumnKnowledge): void
addTables(tables: Partial<TableKnowledge>[], options?: TableRegistrationOptions): void
getTableKnowledge(schemaName: string, tableName: string): TableKnowledge | undefined
getAllTables(): TableKnowledge[]
searchTables(query: SearchQuery): TableKnowledge[]
generateKnowledgeContext(includeOnlyTables?: string[]): string
exportKnowledge(): string
importKnowledge(jsonData: string): void
validateKnowledge(schemaName: string, tableName: string): Promise<ValidationResult>
getStats(): KnowledgeStats
clearKnowledge(): void
}
```
### AI Context Generation
The knowledge system generates structured context for AI consumption:
```
# Database Business Knowledge
## Domain: customer-management
### Customer Accounts (public.customers)
**Purpose:** Manage customer relationships, personalization, and order history
**Description:** Customer account information including personal details and preferences
**Columns:**
- **customer_id** (uuid): Unique identifier for each customer
- Business Purpose: Primary key that connects customers to orders, reviews, and preferences
- Business Rules: UUID v4 format; Immutable after creation
- **email** (varchar): Customer's email address for login and communication
- Business Purpose: Primary authentication method and marketing communication channel
- ⚠️ Contains PII (Personal Identifiable Information)
- Business Rules: Must be unique across all customers; Required for account creation
```
## Custom Functions System
### Function Registration
```typescript
interface FunctionDefinition {
name: string
description: string
category: string
parameters: FunctionParameter[]
}
interface FunctionParameter {
name: string
type: "string" | "number" | "boolean" | "object" | "array"
description: string
required?: boolean
optional?: boolean
default?: any
}
class FunctionRegistry {
register(definition: FunctionDefinition, implementation: (...args: any[]) => any): void
unregister(name: string): boolean
execute(name: string, args: any[]): Promise<any>
getFunctionNames(): string[]
getStats(): FunctionStats
clear(): void
}
```
### Function Execution
```typescript
// Custom function tool execution
async execute(input: { functionName: string, parameters: any[] }): Promise<any> {
try {
const result = await this.registry.execute(input.functionName, input.parameters)
return {
success: true,
result,
functionName: input.functionName,
executedAt: new Date().toISOString()
}
} catch (error) {
return {
success: false,
error: error.message,
functionName: input.functionName
}
}
}
```
## Event System
### Event Types
```typescript
interface ClineEvents {
"task:created": (task: ClineTask) => void
"task:updated": (task: ClineTask) => void
"task:completed": (task: ClineTask) => void
"task:error": (task: ClineTask, error: Error) => void
"message:added": (message: ClineMessage) => void
"state:changed": (state: ClineState) => void
"mode:changed": (mode: ExecutionMode, previousMode: ExecutionMode) => void
}
```
### Event Flow
1. Task creation → `task:created`
2. AI processing → `message:added` for each response
3. Tool execution → `message:added` for each tool result
4. Task completion → `task:completed`
5. State changes → `state:changed`
## API Integration
### Anthropic Claude Integration
```typescript
class AnthropicClient {
private config: ClineConfig
async sendMessage(
messages: AnthropicMessage[],
tools: ToolDefinition[],
systemPrompt: string
): Promise<AnthropicResponse>
}
interface AnthropicMessage {
role: "user" | "assistant"
content: string
}
interface AnthropicResponse {
content: ContentBlock[]
usage: TokenUsage
}
```
### System Prompt Construction
The SDK dynamically builds system prompts incorporating:
1. Base Cline identity and capabilities
2. Current execution mode instructions
3. Working directory information
4. Database connection details and permissions
5. Registered table knowledge context
6. Available tools list
7. Custom instructions
```typescript
private buildSystemPrompt(): string {
const config = this.configManager.getConfig()
const modeConfig = MODE_DEFINITIONS[this.executionMode]
let prompt = `You are Cline, an AI assistant...
Current working directory: ${config.workingDirectory}
${modeConfig.systemPromptAddition}`
// Add database context
if (config.enableDatabase && this.databaseManager) {
prompt += `\nDatabase Connection: ${config.database.host}:${config.database.port}/${config.database.database}`
const knowledgeContext = this.tableKnowledgeManager.generateKnowledgeContext()
if (knowledgeContext.length > 100) {
prompt += `\n\n${knowledgeContext}`
}
}
// Add available tools
prompt += `\nYou have access to the following tools:\n`
for (const toolName of config.enabledTools) {
if (this.isToolAllowedInMode(toolName)) {
const tool = this.tools.get(toolName)
if (tool?.getDefinition) {
const def = tool.getDefinition()
prompt += `- ${def.name}: ${def.description}\n`
}
}
}
return prompt
}
```
## Cost Tracking
### Cost Calculation
```typescript
interface CostCalculation {
provider: string
model: string
input_tokens: number
output_tokens: number
total_tokens: number
input_cost_usd: number
output_cost_usd: number
total_cost_usd: number
timestamp: string
cost_per_1k_input: number
cost_per_1k_output: number
}
class CostCalculator {
static calculateCost(provider: string, model: string, usage: TokenUsage): CostCalculation
static getPricingInfo(provider: string, model: string): PricingInfo | null
static setCustomPricing(provider: string, model: string, pricing: PricingInfo): void
static formatCost(calculation: CostCalculation): string
}
```
## Storage Abstraction
### Storage Interface
```typescript
interface StorageBackend {
write(path: string, content: string): Promise<StorageResult>
read(path: string): Promise<StorageResult>
exists(path: string): Promise<boolean>
delete(path: string): Promise<StorageResult>
list(path: string): Promise<string[]>
}
```
### Implementations
- **LocalStorage**: File system operations
- **SupabaseStorage**: Cloud storage with public URLs
## Error Handling
### Error Types
```typescript
class ClineError extends Error {
constructor(message: string, public code: string, public details?: any) {
super(message)
}
}
// Common error codes
const ERROR_CODES = {
INVALID_CONFIG: "INVALID_CONFIG",
API_ERROR: "API_ERROR",
TOOL_ERROR: "TOOL_ERROR",
DATABASE_ERROR: "DATABASE_ERROR",
PERMISSION_DENIED: "PERMISSION_DENIED",
MODE_RESTRICTION: "MODE_RESTRICTION"
}
```
### Error Recovery
- Automatic retry for transient failures
- Graceful degradation for missing features
- Detailed error context in responses
- Event emission for error monitoring
## Performance Considerations
### Connection Pooling
```typescript
// PostgreSQL connection pool configuration
const poolConfig = {
host: config.host,
port: config.port,
database: config.database,
user: config.username,
password: config.password,
max: config.maxConnections || 10,
idleTimeoutMillis: config.idleTimeoutMillis || 30000,
connectionTimeoutMillis: config.connectionTimeoutMillis || 5000
}
```
### Memory Management
- Automatic cleanup of completed tasks
- Bounded message history
- Efficient knowledge storage with Map structures
- Connection pooling to prevent resource leaks
### Optimization Strategies
- Lazy loading of optional components
- Efficient tool filtering by mode
- Minimal API calls through batching
- Caching of database schema information
## Security Model
### Multi-layered Security
1. **API Key Protection**: Secure credential storage
2. **Database Permissions**: Granular access control
3. **Mode Restrictions**: Tool availability by execution mode
4. **SQL Injection Prevention**: Parameterized queries
5. **Table Access Control**: Allow/deny lists
6. **PII Handling**: Privacy-aware data processing
### Row Level Security (RLS)
```typescript
// RLS policy creation
await dbManager.createRLSPolicy("users", {
name: "user_isolation",
command: "SELECT",
using: "auth.uid() = user_id"
})
// RLS enabling
await dbManager.enableRLS("sensitive_table")
```
## Integration Patterns
### Middleware Pattern
```typescript
class MiddlewareManager {
private middlewares: Middleware[] = []
use(middleware: Middleware): void
async execute(context: ExecutionContext): Promise<void>
}
```
### Plugin Architecture
```typescript
interface Plugin {
name: string
version: string
install(sdk: CompleteClineSDK): void
uninstall(sdk: CompleteClineSDK): void
}
```
### Event-Driven Architecture
```typescript
// Event bus for loose coupling
class EventBus extends EventEmitter {
emit(event: string, ...args: any[]): boolean
on(event: string, listener: (...args: any[]) => void): this
off(event: string, listener: (...args: any[]) => void): this
}
```
## Testing Framework
### Unit Testing
```typescript
// Mock implementations for testing
class MockPostgreSQLManager extends PostgreSQLManager {
async query(sql: string, params?: any[]): Promise<QueryResult> {
return { success: true, rows: [], rowCount: 0 }
}
}
// Test utilities
class TestUtils {
static createMockSDK(config?: Partial<ClineConfig>): CompleteClineSDK
static createMockTask(options?: Partial<ClineTask>): ClineTask
static waitForTaskCompletion(sdk: CompleteClineSDK): Promise<ClineTask>
}
```
### Integration Testing
```typescript
// Database test setup
async function setupTestDatabase(): Promise<void> {
const client = new Client(testDbConfig)
await client.connect()
await client.query(`
CREATE TABLE IF NOT EXISTS test_users (
id UUID PRIMARY KEY,
email VARCHAR(255) UNIQUE,
created_at TIMESTAMP DEFAULT NOW()
)
`)
await client.end()
}
```
## Deployment Considerations
### Environment Configuration
```typescript
// Production configuration
const productionConfig: ClineConfig = {
apiProvider: "anthropic",
apiKey: process.env.ANTHROPIC_API_KEY!,
enabledTools: ["Write", "Read", "DatabaseQuery"],
executionMode: "act",
database: {
host: process.env.DB_HOST!,
port: parseInt(process.env.DB_PORT!),
database: process.env.DB_NAME!,
username: process.env.DB_USER!,
password: process.env.DB_PASSWORD!,
ssl: true,
maxConnections: 20,
permissions: {
allowRead: true,
allowWrite: true,
allowDelete: false,
allowSchemaChanges: false,
allowRLSManagement: false,
restrictedTables: ["admin_users", "audit_logs"]
}
}
}
```
### Monitoring Integration
```typescript
// Telemetry and monitoring
interface TelemetryProvider {
trackEvent(event: string, properties: Record<string, any>): void
trackError(error: Error, context: Record<string, any>): void
trackPerformance(metric: string, value: number): void
}
class PostHogTelemetry implements TelemetryProvider {
// Implementation for PostHog analytics
}
```
*This technical reference provides comprehensive details for AI systems integrating with the Cline SDK, covering architecture, APIs, security, and best practices for production deployment.*