Skip to content

AtomCode Auth & CodingPlan Flow Analysis

Complete Login Flow

Step 1: AtomGit OAuth Login

User → POST /auth/login/start {open_browser: false}
      ← {"url": "...", "login_id": "...", "expires_in_seconds": 300}
      
User opens URL in browser (AtomGit OAuth page)

User authorizes → AtomGit redirects to callback with ?token=xxx

Daemon polls: POST /auth/login/:login_id/poll (every 2s, up to 150 times = 5min)
      ← On success: auth token acquired

Check: GET /auth/status
      ← {"logged_in": true, "user": {"name": "...", "username": "...", "avatar_url": "..."}}

Step 2: CodingPlan Claim

After login, claim CodingPlan:
POST /codingplan/setup → triggers claim via:
 → https://api.gitcode.com/api/v5/coding-plan/claim-v2
 → https://api.gitcode.com/api/v5/coding-plan/status-v2
 → https://api.gitcode.com/api/v5/models-v2?plan_type=X
 
This configures a provider that points to:
  base_url = "https://llm-api.atomgit.com/v1"
  api_key  = <CodingPlan-specific API key>

Step 3: LLM API Call

The configured provider sends OpenAI-compatible requests:

POST https://llm-api.atomgit.com/v1/chat/completions
Authorization: Bearer <codingplan-api-key>
Content-Type: application/json

{
  "model": "deepseek-chat",
  "messages": [...],
  "stream": true,
  ...
}

Response: SSE stream with events:
  - text, reasoning, tool_start, tool_output, tool_result, tokens, error, done, stopped

Key Cryptographic Source Files

  • crates/atomcode-codingplan-crypto/src/versions/v1.rs — CodingPlan crypto
  • crates/atomcode-core/src/auth/oauth.rs — Auth OAuth handling
  • crates/atomcode-core/src/mcp/oauth.rs — MCP OAuth handling
  • crates/atomcode-core/src/coding_plan/setup.rs — CodingPlan setup
  • crates/atomcode-daemon/src/api_codingplan.rs — CodingPlan API
  • crates/atomcode-tuix/src/event_loop/oauth_poll.rs — OAuth polling

ProviderConfig Structure (15 fields)

rust
struct ProviderConfig {
    name: String,
    model: String,
    base_url: String,       // e.g. "https://llm-api.atomgit.com/v1"
    api_key: String,        // the CodingPlan API key
    provider_type: String,  // "openai" | "claude" | "ollama"
    max_tokens: Option<u32>,
    thinking_budget: Option<u32>,
    thinking_type: Option<String>,
    thinking_keep: Option<bool>,
    reasoning_history: Option<String>,
    user_agent: Option<String>,
    is_default: bool,
    skip_tls_verify: bool,
    clear_api_key: Option<String>,
    clear_base_url: Option<String>,
}

LLM Chat Streaming Events

Event TypeFields
textcontent: String
reasoningcontent: String
tool_startid, name, arguments
tool_outputchunk: String
tool_resultid, name, output, success, duration_ms
tokensprompt, completion, total
errormessage: String
donesession_id
stopped(none)
providerprovider: String
snapshotsession_id, messages, provider

Local Daemon REST API

EndpointMethodPurpose
/healthGETHealth check
/shutdownPOSTStop daemon
/auth/statusGETCheck login status
/auth/login/startPOSTStart OAuth login
/auth/login/:id/pollPOSTPoll login result
/auth/login/:idDELETECancel login
/auth/logoutPOSTLogout
/modelsGETList available models
/providersGETList configured providers
/providers/:name/defaultPATCHSet default provider
/providers/:name/thinkingPATCHConfigure thinking
/chatPOSTSend chat (SSE stream)
/chat/stopPOSTStop generation
/chat/activeGETActive chat status
/codingplan/setupPOSTSetup CodingPlan
/projects/:hash/sessionsGET/POSTList/create sessions
/projects/:hash/sessions/:idGETGet session
/projects/:hash/sessions/:id/renamePATCHRename session
/config/reloadPOSTReload config
/mcp/statusGETMCP server status
/mcp/reloadPOSTReload MCP

Key Environment Variables

VariablePurpose
ATOMCODE_CODINGPLAN_LLM_BASE_URLOverride CodingPlan LLM base URL
ATOMCODE_CODINGPLAN_API_BASEOverride CodingPlan API base
ATOMCODE_HOMEOverride home directory (~/.atomcode)
ATOMCODE_INVITEReferral invite code
ATOMCODE_VERSIONPin version for install
ATOMCODE_GITHUB_MCP_CLIENT_IDGitHub MCP client ID
ATOMCODE_TELEMETRY0 to disable telemetry
ATOMCODE_TELEMETRY_ENDPOINTTelemetry endpoint

基于 VitePress 构建 · AtomCode v4.25.3 逆向工程分析文档