id_effect 3.0.0

Effect<A, E, R> (sync + async), capability DI, pipe — interpreter-style, no bundled executor
Documentation
# AI and MCP

Phase H adds `id_effect_ai` — vendor-neutral LLM traits over Phase A `HttpClient`, with feature-gated vendors.

## Language model trait

```rust
use id_effect_ai::{ChatRequest, LanguageModel, complete};
```

`LanguageModel` is a capability (`LanguageModelKey`). Install `MockLanguageModel` in tests; wire OpenAI or Anthropic at the edge with `provide_openai_language_model` / `provide_anthropic_language_model`.

OpenAI and ChatGPT share one adapter (`feature = "openai"`) — model IDs like `gpt-4o` select the model.

## Streaming

`complete_stream` returns `Stream<CompletionChunk, AiError, R>` — token deltas map to chunks for sinks and UI bridges.

## Anthropic Claude

`feature = "anthropic"` uses the Messages API (`/v1/messages`) with SSE streaming. System prompts map to the top-level `system` field.

## Cursor Cloud Agents

`feature = "cursor"` exposes `CursorAgentsClient` — a **separate** capability from `LanguageModel`:

- `list_models()``GET /v1/models`
- `create_agent(prompt)``POST /v1/agents`
- `send_followup(agent_id, prompt)``POST /v1/agents/{id}/runs`
- `wait_until_idle(agent_id, run_id)` — poll until terminal status

Cursor uses HTTP Basic auth (`CURSOR_API_KEY`).

## Configuration and secrets

Load keys via `AiConfig::from_env()`. API keys are `Secret<String>` from `id_effect_config` — never log `.expose()` output.

Transient HTTP failures (429/502/503/504) retry via `Schedule` in `retry_transient_ai_http`.

## MCP server template

`cargo run -p id_effect_ai --example mcp_server_template` scaffolds a minimal MCP JSON-RPC loop over stdio using the same `Effect` + capability patterns.