Files
codewhale/docs/ARCHITECTURE.md
T
2026-02-03 18:29:36 -06:00

9.7 KiB

DeepSeek CLI Architecture

This document provides an overview of the DeepSeek CLI architecture for developers and contributors.

High-Level Overview

┌─────────────────────────────────────────────────────────────────┐
│                         User Interface                          │
│  ┌─────────────────┐  ┌─────────────────┐  ┌────────────────┐  │
│  │   TUI (ratatui) │  │  One-shot Mode  │  │  Config/CLI    │  │
│  └────────┬────────┘  └────────┬────────┘  └────────┬───────┘  │
└───────────┼─────────────────────┼────────────────────┼──────────┘
            │                     │                    │
            ▼                     ▼                    ▼
┌─────────────────────────────────────────────────────────────────┐
│                        Core Engine                              │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │                    Agent Loop (core/engine.rs)           │   │
│  │  ┌─────────┐  ┌─────────────┐  ┌──────────────────────┐ │   │
│  │  │ Session │  │ Turn Mgmt   │  │ Tool Orchestration   │ │   │
│  │  └─────────┘  └─────────────┘  └──────────────────────┘ │   │
│  └─────────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────────┘
            │                     │                    │
            ▼                     ▼                    ▼
┌─────────────────────────────────────────────────────────────────┐
│                     Tool & Extension Layer                      │
│  ┌──────────┐  ┌──────────┐  ┌─────────┐  ┌────────────────┐   │
│  │  Tools   │  │  Skills  │  │  Hooks  │  │  MCP Servers   │   │
│  │ (shell,  │  │ (plugins)│  │ (pre/   │  │  (external)    │   │
│  │  file)   │  │          │  │  post)  │  │                │   │
│  └──────────┘  └──────────┘  └─────────┘  └────────────────┘   │
└─────────────────────────────────────────────────────────────────┘
            │                     │                    │
            ▼                     ▼                    ▼
┌─────────────────────────────────────────────────────────────────┐
│                        LLM Layer                                │
│  ┌──────────────────────────────────────────────────────────┐  │
│  │              LLM Client Abstraction (llm_client.rs)       │  │
│  │  ┌─────────────────┐  ┌─────────────────────────────┐    │  │
│  │  │  DeepSeek Client │  │  Compatible Client (DeepSeek)│    │  │
│  │  │   (client.rs)   │  │       (client.rs)           │    │  │
│  │  └─────────────────┘  └─────────────────────────────┘    │  │
│  └──────────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────────┘

Module Organization

Entry Point

  • main.rs - CLI argument parsing (clap), configuration loading, entry point routing

Core Components

  • core/ - Main engine components
    • engine.rs - Agent loop, message processing, tool execution orchestration
    • session.rs - Session state management
    • turn.rs - Turn-based conversation handling
    • events.rs - Event system for UI updates
    • ops.rs - Core operations

Configuration

  • config.rs - Configuration loading, profiles, environment variables
  • settings.rs - Runtime settings management

LLM Integration

  • client.rs - HTTP client for DeepSeek's OpenAI-compatible Responses API (with chat fallback)
  • llm_client.rs - Abstract LLM client trait with retry logic
  • models.rs - Data structures for API requests/responses

DeepSeek API Endpoints

DeepSeek exposes OpenAI-compatible endpoints. The CLI uses:

  • https://api.deepseek.com/v1/responses - preferred Responses API
  • https://api.deepseek.com/v1/chat/completions - fallback if Responses is unavailable

The engine uses handle_deepseek_turn() to drive the agent loop against the Responses API (with automatic fallback if needed).

Tool System

  • tools/ - Built-in tool implementations
    • mod.rs - Tool registry and common types
    • shell.rs - Shell command execution
    • file.rs - File read/write operations
    • todo.rs - Todo list management
    • plan.rs - Planning tools
    • subagent.rs - Sub-agent spawning
    • spec.rs - Tool specifications

Extension Systems

  • mcp.rs - Model Context Protocol client for external tool servers
  • skills.rs - Plugin/skill loading and execution
  • hooks.rs - Pre/post execution hooks with conditions

User Interface

  • tui/ - Terminal UI components (ratatui-based)

    • app.rs - Application state and message handling
    • ui.rs - Rendering logic
    • approval.rs - Tool approval dialog
    • clipboard.rs - Clipboard handling
    • streaming.rs - Streaming text collector
  • ui.rs - Legacy/simple UI utilities

Security

  • sandbox/ - macOS sandboxing support
    • mod.rs - Sandbox type definitions
    • policy.rs - Sandbox policy configuration
    • seatbelt.rs - macOS Seatbelt profile generation

Utilities

  • utils.rs - Common utilities
  • logging.rs - Logging infrastructure
  • compaction.rs - Context compaction for long conversations
  • pricing.rs - Cost estimation
  • prompts.rs - System prompt templates
  • project_doc.rs - Project documentation handling
  • session.rs - Session serialization

Data Flow

Interactive Session

  1. User input received in TUI
  2. Input processed by core/engine.rs
  3. Message sent to LLM via llm_client.rs
  4. Response streamed back, parsed in client.rs
  5. Tool calls extracted and executed via tools/
  6. Hooks triggered before/after tool execution
  7. Results aggregated and sent back to LLM
  8. Final response rendered in TUI

Tool Execution

  1. LLM requests tool via tool_use content block
  2. Tool registry looks up handler
  3. Pre-execution hooks run
  4. Approval requested if needed (non-yolo mode)
  5. Tool executed (possibly sandboxed on macOS)
  6. Post-execution hooks run
  7. Result returned to agent loop

Extension Points

Adding a New Tool

  1. Create handler in tools/
  2. Register in tools/registry.rs
  3. Add tool specification (name, description, input schema)

Adding an MCP Server

  1. Configure in ~/.deepseek/mcp.json
  2. Server auto-discovered at startup
  3. Tools exposed to LLM automatically

Creating a Skill

  1. Create skill directory with SKILL.md
  2. Define skill prompt and optional scripts
  3. Place in ~/.deepseek/skills/

Adding Hooks

Configure in ~/.deepseek/config.toml:

[[hooks]]
event = "tool_call_before"
command = "echo 'Running tool: $TOOL_NAME'"

Key Design Decisions

  1. Streaming-first: All LLM responses stream for responsiveness
  2. Tool safety: Non-yolo mode requires approval for destructive operations
  3. Extensibility: MCP, skills, and hooks allow customization without code changes
  4. Cross-platform: Core works on Linux/macOS/Windows, sandboxing macOS-only
  5. Minimal dependencies: Careful dependency selection for build speed

Configuration Files

  • ~/.deepseek/config.toml - Main configuration
  • ~/.deepseek/mcp.json - MCP server configuration
  • ~/.deepseek/skills/ - User skills directory
  • ~/.deepseek/sessions/ - Session history