Skip to main content

spn_core/
lib.rs

1//! spn-core: Core types and validation for the SuperNovae ecosystem.
2//!
3//! This crate provides:
4//! - Provider definitions (13+ LLM and MCP service providers)
5//! - Key format validation with detailed error messages
6//! - MCP server configuration types
7//! - Package registry types
8//!
9//! # Design Principles
10//!
11//! - **Zero dependencies**: Pure Rust, fast compilation, WASM-compatible
12//! - **Single source of truth**: All provider definitions in one place
13//! - **Shared types**: Used by spn-cli, spn-client, spn-keyring, and nika
14//!
15//! # Example
16//!
17//! ```
18//! use spn_core::{
19//!     Provider, ProviderCategory, KNOWN_PROVIDERS,
20//!     find_provider, provider_to_env_var,
21//!     validate_key_format, mask_key, ValidationResult,
22//! };
23//!
24//! // Find a provider
25//! let provider = find_provider("anthropic").unwrap();
26//! assert_eq!(provider.env_var, "ANTHROPIC_API_KEY");
27//!
28//! // Validate a key format
29//! match validate_key_format("anthropic", "sk-ant-api03-xxx") {
30//!     ValidationResult::Valid => println!("Key is valid!"),
31//!     ValidationResult::InvalidPrefix { expected, .. } => {
32//!         println!("Key should start with: {}", expected);
33//!     }
34//!     _ => {}
35//! }
36//!
37//! // Mask a key for display
38//! let masked = mask_key("sk-ant-secret-key-12345");
39//! assert_eq!(masked, "sk-ant-••••••••");
40//! ```
41
42#![forbid(unsafe_code)]
43#![warn(missing_docs)]
44#![warn(clippy::all)]
45
46mod backend;
47mod mcp;
48mod providers;
49mod registry;
50mod validation;
51
52// Re-export everything at crate root for ergonomic imports
53pub use providers::{
54    Provider,
55    ProviderCategory,
56    KNOWN_PROVIDERS,
57    find_provider,
58    provider_to_env_var,
59    providers_by_category,
60};
61
62pub use validation::{
63    ValidationResult,
64    validate_key_format,
65    mask_key,
66};
67
68pub use mcp::{
69    McpServer,
70    McpServerType,
71    McpConfig,
72    McpSource,
73};
74
75pub use registry::{
76    PackageRef,
77    PackageManifest,
78    PackageType,
79};
80
81pub use backend::{
82    PullProgress,
83    ModelInfo,
84    RunningModel,
85    GpuInfo,
86    LoadConfig,
87    BackendError,
88};