# AI Server IPC Design

## Overview

Decouple heavy AI SDK imports (google.genai, anthropic) from the GUI process via a subprocess command queue. GUI starts instantly (~0.5s) while AI server loads in background (~1.2s one-time cost).

## Architecture

```
GUI Process                    AI Server Process
+-----------+                 +------------------+
| Command   |----pipe/json--->| AI processing    |
| Queue     |                 | (google.genai,  |
+-----------+                 |  anthropic)     |
| Response  |<---pipe/json-----|------------------+
| Queue     |                 |                 |
+-----------+                 +------------------+
```

## Command Queue (Input to AI Server)

Format: JSON lines on stdin
```json
{"id": "uuid", "method": "send", "params": {...}}
{"id": "uuid", "method": "list_models", "params": {}}
```

## Response Queue (Output from AI Server)

Format: JSON lines on stdout
```json
{"id": "uuid", "result": {...}}
{"id": "uuid", "error": "message"}
```

## Commands

| Method | Params | Description |
|--------|--------|-------------|
| `send` | `{history, model, provider, tools}` | Send AI request |
| `list_models` | `{provider}` | List available models |
| `cleanup` | `{}` | Cleanup sessions |
| `reset_session` | `{}` | Reset conversation history |
| `set_provider` | `{provider, model}` | Switch provider |
| `set_credentials` | `{creds}` | Set API credentials |

## AI Server Lifecycle

1. **Spawn**: `subprocess.Popen(["python", "-m", "src.ai_server"])`
2. **Startup**: Load google.genai, anthropic SDKs (~1.2s)
3. **Ready**: Send `{"type": "ready"}` to GUI
4. **Process**: Read commands, write responses
5. **Shutdown**: On GUI exit or disconnect

## GUI Response

- **Immediate return** from command queue operations
- **Background thread reads** response queue
- **No polling** - blocking read with timeout
- **Lock-free** queue operations

## Status Indicator

GUI tracks AI server state:
- `init` - Server starting
- `ready` - Server loaded, accepting requests
- `busy` - Processing request
- `error` - Server error state

Panels that need AI show "Initializing..." tint when `status != ready`.

## Implementation

### Files

- `src/ai_server.py` - Subprocess AI server (new)
- `src/ai_client_proxy.py` - Queue client for GUI (new)
- Modify `src/ai_client.py` - Route via proxy when AI server enabled

### ai_server.py

```
- stdin reader loop
- Command dispatcher
- Provider wrappers (google.genai, anthropic)
- stdout writer
```

### ai_client_proxy.py

```
- Command queue (subprocess.stdin)
- Response queue (subprocess.stdout reader thread)
- Request/response matching by ID
- Timeout handling
```

## Error Handling

- **Server crash**: GUI detects via broken pipe, auto-restart server
- **Timeout**: Requests timeout after 60s, return error
- **Queue full**: Backpressure, return busy status

## Startup Sequence

1. GUI starts, shows immediate (~0.5s)
2. Spawn ai_server subprocess
3. Server loads SDKs (~1.2s)
4. Server sends `{"type": "ready"}`
5. GUI enables AI panels
