Summary
9router and CLIProxyAPI are currently wired as special-cased runtime services in several places (manifest injection, provider models routing, and UI/service endpoints). This has started to become a scalability bottleneck for router architecture work.
Requested change
- Introduce a shared provider-plugin contract for embedded services (service id, expose toggle, model sync, endpoint metadata).
- Register 9router/cliproxyapi providers through that path instead of duplicated service-specific behavior.
- Keep current providerExpose behavior (boolean) but make backend/provider registration data-driven.
- Preserve backward-compatibility with open-sse manifest + model prefixing semantics while decoupling from fixed if rawProvider in {...} checks.
Why now
- 9router and cliproxyapi need parity for future replacement with Go/Rust sidecars or external SDK-based routing.
Summary
9router and CLIProxyAPI are currently wired as special-cased runtime services in several places (manifest injection, provider models routing, and UI/service endpoints). This has started to become a scalability bottleneck for router architecture work.
Requested change
Why now