#![forbid(unsafe_code)] #![warn(missing_docs)] //! Shared runtime assembly for every interface mode. //! //! One runtime shape serves eval and RPC: resolve an endpoint from the //! catalog, validate credentials without dispatch, and drive the //! provider-independent agent. `mock` provides a scripted provider for //! offline runs and tests. pub mod http; pub mod runtime; pub mod wasm; pub use runtime::{RuntimeConfig, RuntimeProvider, build_agent}; pub use smith_ai::auth::{AuthStore, credential_env_var}; pub use smith_ai::models::ProviderKind; use smith::id::MessageId; use smith::provider::{ProviderStream, StreamFn}; use smith::stream::StreamEvent; use std::sync::Arc; use std::sync::atomic::{AtomicUsize, Ordering}; /// A scripted mock provider: one canned response per request, then a final /// apologetic refusal. #[must_use] pub fn mock_stream(script: Vec>) -> StreamFn { let script: Arc<[Vec]> = script.into(); let next = AtomicUsize::new(0); Arc::new(move |_request, _cancel| { let index = next.fetch_add(1, Ordering::Relaxed); let response = script.get(index).cloned().unwrap_or_default(); let stream: ProviderStream = Box::pin(futures::stream::iter(response.into_iter().map(Ok))); stream }) } /// Convenience: a mock reply of plain text. #[must_use] pub fn mock_text_reply(text: &str) -> Vec { vec![ StreamEvent::text_delta(MessageId::new(), text), StreamEvent::stop(smith::stream::StopReason::EndTurn, None), ] }