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, stoppedKey Cryptographic Source Files
crates/atomcode-codingplan-crypto/src/versions/v1.rs— CodingPlan cryptocrates/atomcode-core/src/auth/oauth.rs— Auth OAuth handlingcrates/atomcode-core/src/mcp/oauth.rs— MCP OAuth handlingcrates/atomcode-core/src/coding_plan/setup.rs— CodingPlan setupcrates/atomcode-daemon/src/api_codingplan.rs— CodingPlan APIcrates/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 Type | Fields |
|---|---|
text | content: String |
reasoning | content: String |
tool_start | id, name, arguments |
tool_output | chunk: String |
tool_result | id, name, output, success, duration_ms |
tokens | prompt, completion, total |
error | message: String |
done | session_id |
stopped | (none) |
provider | provider: String |
snapshot | session_id, messages, provider |
Local Daemon REST API
| Endpoint | Method | Purpose |
|---|---|---|
/health | GET | Health check |
/shutdown | POST | Stop daemon |
/auth/status | GET | Check login status |
/auth/login/start | POST | Start OAuth login |
/auth/login/:id/poll | POST | Poll login result |
/auth/login/:id | DELETE | Cancel login |
/auth/logout | POST | Logout |
/models | GET | List available models |
/providers | GET | List configured providers |
/providers/:name/default | PATCH | Set default provider |
/providers/:name/thinking | PATCH | Configure thinking |
/chat | POST | Send chat (SSE stream) |
/chat/stop | POST | Stop generation |
/chat/active | GET | Active chat status |
/codingplan/setup | POST | Setup CodingPlan |
/projects/:hash/sessions | GET/POST | List/create sessions |
/projects/:hash/sessions/:id | GET | Get session |
/projects/:hash/sessions/:id/rename | PATCH | Rename session |
/config/reload | POST | Reload config |
/mcp/status | GET | MCP server status |
/mcp/reload | POST | Reload MCP |
Key Environment Variables
| Variable | Purpose |
|---|---|
ATOMCODE_CODINGPLAN_LLM_BASE_URL | Override CodingPlan LLM base URL |
ATOMCODE_CODINGPLAN_API_BASE | Override CodingPlan API base |
ATOMCODE_HOME | Override home directory (~/.atomcode) |
ATOMCODE_INVITE | Referral invite code |
ATOMCODE_VERSION | Pin version for install |
ATOMCODE_GITHUB_MCP_CLIENT_ID | GitHub MCP client ID |
ATOMCODE_TELEMETRY | 0 to disable telemetry |
ATOMCODE_TELEMETRY_ENDPOINT | Telemetry endpoint |