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 backup;
48mod mcp;
49mod providers;
50mod registry;
51mod validation;
52
53// Re-export everything at crate root for ergonomic imports
54pub use providers::{
55 find_provider, provider_to_env_var, providers_by_category, Provider, ProviderCategory,
56 KNOWN_PROVIDERS,
57};
58
59pub use validation::{mask_key, validate_key_format, ValidationResult};
60
61pub use mcp::{McpConfig, McpServer, McpServerType, McpSource};
62
63pub use registry::{PackageManifest, PackageRef, PackageType, Source};
64
65pub use backend::{
66 BackendError, ChatMessage, ChatOptions, ChatResponse, ChatRole, EmbeddingResponse, GpuInfo,
67 LoadConfig, ModelInfo, PullProgress, RunningModel,
68};
69
70pub use backup::{
71 BackupContents, BackupError, BackupInfo, BackupManifest, ComponentVersions, NikaContents,
72 NovaNetContents, RestoreInfo, SpnContents,
73};