### Added
- **DeepSeek provider support** — DeepSeek is now a fully supported LLM provider alongside OpenAI, Anthropic, Google, OpenRouter, MiniMax, and Zhipu. Configure via `JEAN2_LLM_DEEPSEEK_API_KEY` in your `.env` file or through the Settings UI. Two models are included out of the box:
  - `deepseek-v4-pro` — premium tier, 1M context window, 384K max output, with reasoning effort variants (low / medium / high / xhigh / max)
  - `deepseek-v4-flash` — budget tier, 1M context window, 384K max output, with reasoning effort variants (low / medium / high / xhigh / max)
- **Dynamic providerOptions key resolution for model variants** — variant `providerOptions` (e.g., `reasoningEffort`) are now correctly keyed per provider (`deepseek`, `openai`, `anthropic`, etc.) instead of always defaulting to `openai`. This ensures DeepSeek's reasoning effort and thinking mode options are properly passed through the AI SDK.

### Fixed
- **Wrapped provider rate-limit errors are classified correctly** — `classifyApiError()` now recognizes additional provider and AI SDK error shapes, including `statusCode`, `responseHeaders`, `responseBody`, nested `cause` / `originalError`, and provider payloads like `data.error.type = "usage_limit_reached"`. This fixes cases where providers returned real 429 usage-limit errors but they were later wrapped by the AI SDK and surfaced to Jean2 as generic `unknown` failures instead of `rate_limit`.
- **Retry-after timing is extracted from more error shapes** — rate-limit handling now reads retry timing from both standard response headers and provider payload fields like `resets_in_seconds`, improving backoff behavior and the structured `retryAfterMs` data sent to clients.
- **Classified timeout errors no longer degrade into `[object Object]`** — when `agent.ts` throws a structured `ClassifiedError` into `retry.ts`, the retry layer now preserves that classification instead of accidentally re-classifying the plain object and losing its message/type. This fixes timeout errors that were correctly identified in `agent.ts` but later surfaced as generic `unknown` failures with `[object Object]` as the message.
