AI controls must hide themselves rather than fail, matching the web app's documented behaviour.
Rules from the product docs
providers: [] → the site has no ANTHROPIC_API_KEY; hide all AI controls (calls would 409 no_provider_configured).
subscriber: false → free account; do not show AI controls at all.
- Quota is 50 actions/day per account; a preview and its confirmed action each count.
429 quota_exceeded → tell the user to retry tomorrow; 429 rate_limited → honor Retry-After.
Acceptance criteria
AI controls must hide themselves rather than fail, matching the web app's documented behaviour.
Rules from the product docs
providers: []→ the site has noANTHROPIC_API_KEY; hide all AI controls (calls would409 no_provider_configured).subscriber: false→ free account; do not show AI controls at all.429 quota_exceeded→ tell the user to retry tomorrow;429 rate_limited→ honorRetry-After.Acceptance criteria
GET /api/ai/statusis fetched once per session (and on demand) and cached on a shared service.IsAiAvailablegate (subscriber AND providers non-empty) drives visibility of every AI affordance.42 of 50 left today).quota_exceededandrate_limitedrender as distinct, non-blocking in-place messages — not a generic error toast, and never a modal that blocks the dispatcher.