When APP_AI_BASIC_URL already ends with /v1 (e.g. openrouter.ai/api/v1), appending /v1/models produces /v1/v1/models. Detect trailing /v1 and only append /models in that case.
- Split agent crate into client/, model/, agent/ subdirs - Add billing.rs for token usage recording - Add sync.rs for upstream model sync - EmbedService: Qdrant-backed vector memory for semantic search - ChatService: wire EmbedService for memory lookup, passive skill awareness - ReAct loop: streamline with tokio::select! and proper error handling