use serde::{Deserialize, Serialize};
fn default_max_processes() -> u32 {
64
}
fn default_health_check_interval_secs() -> u64 {
30
}
fn default_enabled() -> bool {
true
}
pub const DEFAULT_BRAND: &str = "WeftOS";
fn default_brand() -> String {
DEFAULT_BRAND.to_string()
}
fn process_brand_slot() -> &'static std::sync::RwLock<String> {
use std::sync::{OnceLock, RwLock};
static SLOT: OnceLock<RwLock<String>> = OnceLock::new();
SLOT.get_or_init(|| RwLock::new(DEFAULT_BRAND.to_string()))
}
pub fn install_brand(brand: &str) {
let value = {
let t = brand.trim();
if t.is_empty() {
DEFAULT_BRAND
} else {
t
}
};
if let Ok(mut guard) = process_brand_slot().write() {
*guard = value.to_string();
}
}
pub fn brand() -> String {
process_brand_slot()
.read()
.map(|g| g.clone())
.unwrap_or_else(|_| DEFAULT_BRAND.to_string())
}
pub fn reset_brand_for_test() {
install_brand(DEFAULT_BRAND);
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ClusterNetworkConfig {
#[serde(default = "default_replication_factor", alias = "replicationFactor")]
pub replication_factor: usize,
#[serde(default = "default_shard_count", alias = "shardCount")]
pub shard_count: u32,
#[serde(default = "default_cluster_heartbeat", alias = "heartbeatIntervalSecs")]
pub heartbeat_interval_secs: u64,
#[serde(default = "default_node_timeout", alias = "nodeTimeoutSecs")]
pub node_timeout_secs: u64,
#[serde(default = "default_enable_consensus", alias = "enableConsensus")]
pub enable_consensus: bool,
#[serde(default = "default_min_quorum", alias = "minQuorumSize")]
pub min_quorum_size: usize,
#[serde(default, alias = "seedNodes")]
pub seed_nodes: Vec<String>,
#[serde(default, alias = "nodeName")]
pub node_name: Option<String>,
}
fn default_replication_factor() -> usize {
3
}
fn default_shard_count() -> u32 {
64
}
fn default_cluster_heartbeat() -> u64 {
5
}
fn default_node_timeout() -> u64 {
30
}
fn default_enable_consensus() -> bool {
true
}
fn default_min_quorum() -> usize {
2
}
impl Default for ClusterNetworkConfig {
fn default() -> Self {
Self {
replication_factor: default_replication_factor(),
shard_count: default_shard_count(),
heartbeat_interval_secs: default_cluster_heartbeat(),
node_timeout_secs: default_node_timeout(),
enable_consensus: default_enable_consensus(),
min_quorum_size: default_min_quorum(),
seed_nodes: Vec::new(),
node_name: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct KernelConfig {
#[serde(default = "default_enabled")]
pub enabled: bool,
#[serde(default = "default_max_processes", alias = "maxProcesses")]
pub max_processes: u32,
#[serde(
default = "default_health_check_interval_secs",
alias = "healthCheckIntervalSecs"
)]
pub health_check_interval_secs: u64,
#[serde(default = "default_brand")]
pub brand: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cluster: Option<ClusterNetworkConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub chain: Option<ChainConfig>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "resourceTree"
)]
pub resource_tree: Option<ResourceTreeConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub vector: Option<VectorConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub spatial: Option<SpatialConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub profiles: Option<ProfilesConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub pairing: Option<PairingConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub mesh: Option<MeshConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub anchor: Option<AnchorConfig>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "ipcTcp")]
pub ipc_tcp: Option<IpcTcpConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub llm: Option<LlmEndpointConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub agent: Option<AgentAnchorConfig>,
#[serde(default)]
pub governance: super::governance::GovernanceConfig,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub profile: Option<KernelProfile>,
#[serde(default, skip_serializing_if = "SharedServicesConfig::is_default")]
pub shared_services: SharedServicesConfig,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum KernelProfile {
Project,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum SharedServiceMode {
#[default]
Parent,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct SharedServicesConfig {
#[serde(default)]
pub embeddings: SharedServiceMode,
#[serde(default)]
pub llm: SharedServiceMode,
#[serde(default)]
pub voice: SharedServiceMode,
}
impl SharedServicesConfig {
fn is_default(&self) -> bool {
*self == Self::default()
}
}
impl Default for KernelConfig {
fn default() -> Self {
Self {
enabled: true,
max_processes: default_max_processes(),
health_check_interval_secs: default_health_check_interval_secs(),
brand: default_brand(),
cluster: None,
chain: None,
resource_tree: None,
vector: None,
spatial: None,
profiles: None,
pairing: None,
mesh: None,
anchor: None,
ipc_tcp: None,
llm: None,
agent: None,
governance: Default::default(),
profile: None,
shared_services: Default::default(),
}
}
}
impl KernelConfig {
#[must_use]
pub fn for_inspection(mut self) -> Self {
if let Some(mesh) = self.mesh.as_mut() {
mesh.enabled = false;
}
let mut chain = self.chain.take().unwrap_or_default();
chain.enabled = false;
self.chain = Some(chain);
self
}
pub fn brand(&self) -> &str {
let t = self.brand.trim();
if t.is_empty() {
DEFAULT_BRAND
} else {
t
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct AgentAnchorConfig {
#[serde(default, alias = "anchorChain")]
pub anchor_chain: bool,
#[serde(default, alias = "anchorCausal")]
pub anchor_causal: bool,
#[serde(default, alias = "talkLoop")]
pub talk_loop: bool,
#[serde(
default,
alias = "talkLoopIdleSecs",
skip_serializing_if = "Option::is_none"
)]
pub talk_loop_idle_secs: Option<u64>,
#[serde(default, alias = "voiceLoop")]
pub voice_loop: bool,
#[serde(default)]
pub subagents: SubagentsConfig,
#[serde(default)]
pub proposal: ProposalConfig,
#[serde(default)]
pub classification: ClassificationConfig,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ProposalConfig {
#[serde(default)]
pub mode: ProposalMode,
#[serde(
default,
alias = "timeoutSecs",
skip_serializing_if = "Option::is_none"
)]
pub timeout_secs: Option<u64>,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum ProposalMode {
#[default]
Auto,
Review,
}
impl AgentAnchorConfig {
pub fn any_enabled(&self) -> bool {
self.anchor_chain || self.anchor_causal
}
}
fn default_subagents_enabled() -> bool {
true
}
fn default_subagents_max_per_conv() -> u32 {
5
}
fn default_subagents_max_depth() -> u32 {
3
}
fn default_subagents_timeout_secs() -> u64 {
120
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SubagentsConfig {
#[serde(default = "default_subagents_enabled")]
pub enabled: bool,
#[serde(default = "default_subagents_max_per_conv", alias = "maxPerConv")]
pub max_per_conv: u32,
#[serde(default = "default_subagents_max_depth", alias = "maxDepth")]
pub max_depth: u32,
#[serde(default = "default_subagents_timeout_secs", alias = "timeoutSecs")]
pub timeout_secs: u64,
#[serde(default, alias = "notifyOnComplete")]
pub notify_on_complete: bool,
#[serde(default, alias = "governanceGrant")]
pub governance_grant: bool,
}
impl Default for SubagentsConfig {
fn default() -> Self {
Self {
enabled: default_subagents_enabled(),
max_per_conv: default_subagents_max_per_conv(),
max_depth: default_subagents_max_depth(),
timeout_secs: default_subagents_timeout_secs(),
notify_on_complete: false,
governance_grant: false,
}
}
}
impl SubagentsConfig {
pub fn timeout(&self) -> std::time::Duration {
std::time::Duration::from_secs(self.timeout_secs)
}
}
fn default_classification_queue_bound() -> usize {
256
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum ClassificationMode {
#[default]
Off,
Keyword,
Full,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ClassificationConfig {
#[serde(default)]
pub mode: ClassificationMode,
#[serde(
default,
alias = "modelOverride",
skip_serializing_if = "Option::is_none"
)]
pub model_override: Option<String>,
#[serde(default = "default_classification_queue_bound", alias = "queueBound")]
pub queue_bound: usize,
}
impl Default for ClassificationConfig {
fn default() -> Self {
Self {
mode: ClassificationMode::default(),
model_override: None,
queue_bound: default_classification_queue_bound(),
}
}
}
impl ClassificationConfig {
pub fn is_enabled(&self) -> bool {
self.mode != ClassificationMode::Off
}
pub fn is_full(&self) -> bool {
self.mode == ClassificationMode::Full
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct LlmEndpointConfig {
#[serde(default, skip_serializing_if = "Option::is_none", alias = "serviceUrl")]
pub service_url: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IpcTcpConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default = "default_ipc_tcp_listen_addr", alias = "listenAddr")]
pub listen_addr: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub bearer: Option<String>,
}
impl Default for IpcTcpConfig {
fn default() -> Self {
Self {
enabled: false,
listen_addr: default_ipc_tcp_listen_addr(),
bearer: None,
}
}
}
fn default_ipc_tcp_listen_addr() -> String {
"127.0.0.1:9471".to_string()
}
impl IpcTcpConfig {
pub fn is_non_loopback(&self) -> bool {
use std::net::SocketAddr;
match self.listen_addr.parse::<SocketAddr>() {
Ok(addr) => !addr.ip().is_loopback(),
Err(_) => true,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AnchorConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default)]
pub topics: Vec<String>,
#[serde(default = "default_anchor_window_secs")]
pub window_secs: u64,
}
fn default_anchor_window_secs() -> u64 {
2
}
impl Default for AnchorConfig {
fn default() -> Self {
Self {
enabled: false,
topics: Vec::new(),
window_secs: default_anchor_window_secs(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MeshConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default = "default_mesh_transport")]
pub transport: String,
#[serde(default = "default_mesh_listen_addr", alias = "listen")]
pub listen_addr: String,
#[serde(default)]
pub discovery: bool,
#[serde(default)]
pub seed_peers: Vec<String>,
#[serde(default)]
pub noise: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub noise_key_path: Option<String>,
#[serde(default)]
pub admission: MeshAdmissionMode,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub genesis_hash: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub mesh_nonce: Option<String>,
#[serde(default)]
pub admission_open_membership: bool,
#[serde(default = "default_mesh_max_connections_per_ip")]
pub max_connections_per_ip: usize,
#[serde(default = "default_mesh_first_frame_timeout_secs")]
pub first_frame_timeout_secs: u64,
#[serde(default)]
pub service: MeshServicePolicy,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub service_socket: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum MeshServicePolicy {
#[default]
Auto,
Required,
Off,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum MeshAdmissionMode {
Off,
#[default]
Observe,
Enforce,
}
fn default_mesh_transport() -> String {
"tcp".to_owned()
}
pub const DEFAULT_MESH_PORT: u16 = 9489;
fn default_mesh_max_connections_per_ip() -> usize {
64
}
fn default_mesh_first_frame_timeout_secs() -> u64 {
10
}
fn default_mesh_listen_addr() -> String {
format!("0.0.0.0:{DEFAULT_MESH_PORT}")
}
impl Default for MeshConfig {
fn default() -> Self {
Self {
enabled: false,
transport: default_mesh_transport(),
listen_addr: default_mesh_listen_addr(),
discovery: false,
seed_peers: vec![],
noise: false,
noise_key_path: None,
admission: MeshAdmissionMode::default(),
genesis_hash: None,
mesh_nonce: None,
admission_open_membership: false,
max_connections_per_ip: default_mesh_max_connections_per_ip(),
first_frame_timeout_secs: default_mesh_first_frame_timeout_secs(),
service: MeshServicePolicy::default(),
service_socket: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProfilesConfig {
#[serde(default = "default_profiles_enabled")]
pub enabled: bool,
#[serde(default = "default_profiles_storage_path")]
pub storage_path: String,
#[serde(default = "default_profile_name")]
pub default_profile: String,
}
fn default_profiles_enabled() -> bool {
true
}
fn default_profiles_storage_path() -> String {
".weftos/profiles".to_owned()
}
fn default_profile_name() -> String {
"default".to_owned()
}
impl Default for ProfilesConfig {
fn default() -> Self {
Self {
enabled: default_profiles_enabled(),
storage_path: default_profiles_storage_path(),
default_profile: default_profile_name(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PairingConfig {
#[serde(default = "default_pairing_persist_path")]
pub persist_path: String,
#[serde(default = "default_pairing_window_secs")]
pub default_window_secs: u64,
}
fn default_pairing_persist_path() -> String {
".weftos/runtime/paired_hosts.json".to_owned()
}
fn default_pairing_window_secs() -> u64 {
30
}
impl Default for PairingConfig {
fn default() -> Self {
Self {
persist_path: default_pairing_persist_path(),
default_window_secs: default_pairing_window_secs(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChainConfig {
#[serde(default = "default_true")]
pub enabled: bool,
#[serde(default = "default_checkpoint_interval", alias = "checkpointInterval")]
pub checkpoint_interval: u64,
#[serde(default)]
pub chain_id: u32,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "checkpointPath"
)]
pub checkpoint_path: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "externalAnchor"
)]
pub external_anchor: Option<ChainExternalAnchorConfig>,
}
fn default_true() -> bool {
true
}
fn default_checkpoint_interval() -> u64 {
1000
}
impl Default for ChainConfig {
fn default() -> Self {
Self {
enabled: true,
checkpoint_interval: default_checkpoint_interval(),
chain_id: 0,
checkpoint_path: None,
external_anchor: None,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "snake_case")]
pub enum ChainAnchorBackend {
#[default]
None,
Mock,
File,
External,
Parent,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChainExternalAnchorConfig {
#[serde(default)]
pub backend: ChainAnchorBackend,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "ledgerPath"
)]
pub ledger_path: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub endpoint: Option<String>,
#[serde(
default = "default_anchor_min_interval_secs",
alias = "minIntervalSecs"
)]
pub min_interval_secs: u64,
#[serde(
default = "default_anchor_min_events",
alias = "minEventsBetween"
)]
pub min_events_between: u64,
}
fn default_anchor_min_interval_secs() -> u64 {
300
}
fn default_anchor_min_events() -> u64 {
100
}
impl Default for ChainExternalAnchorConfig {
fn default() -> Self {
Self {
backend: ChainAnchorBackend::File,
ledger_path: None,
endpoint: None,
min_interval_secs: default_anchor_min_interval_secs(),
min_events_between: default_anchor_min_events(),
}
}
}
impl ChainExternalAnchorConfig {
pub fn effective_ledger_path(&self) -> Option<String> {
if let Some(ref p) = self.ledger_path {
return Some(p.clone());
}
#[cfg(feature = "native")]
{
Some(
crate::runtime_paths::RuntimePaths::resolve()
.anchors_ledger()
.to_string_lossy()
.into_owned(),
)
}
#[cfg(not(feature = "native"))]
{
None
}
}
}
impl ChainConfig {
pub fn isolated_in(dir: &std::path::Path) -> Self {
Self {
checkpoint_path: Some(
dir.join(super::chain_paths::CHAIN_CHECKPOINT_FILE)
.to_string_lossy()
.into_owned(),
),
..Self::default()
}
}
pub fn effective_checkpoint_path(&self) -> Option<String> {
if self.checkpoint_path.is_some() {
return self.checkpoint_path.clone();
}
#[cfg(feature = "native")]
{
Some(
crate::runtime_paths::RuntimePaths::resolve()
.chain_checkpoint()
.to_string_lossy()
.into_owned(),
)
}
#[cfg(not(feature = "native"))]
{
None
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResourceTreeConfig {
#[serde(default = "default_true_rt")]
pub enabled: bool,
#[serde(
default,
skip_serializing_if = "Option::is_none",
alias = "checkpointPath"
)]
pub checkpoint_path: Option<String>,
}
fn default_true_rt() -> bool {
true
}
impl Default for ResourceTreeConfig {
fn default() -> Self {
Self {
enabled: true,
checkpoint_path: None,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "lowercase")]
pub enum SpatialBackendKind {
#[default]
Bvh,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum BranchRetentionPolicy {
KeepLast(usize),
}
impl Default for BranchRetentionPolicy {
fn default() -> Self {
Self::KeepLast(64)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SpatialConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default)]
pub backend: SpatialBackendKind,
#[serde(default = "default_spatial_max_leaves")]
pub max_leaves: usize,
#[serde(default = "default_spatial_phase_commit_threshold")]
pub phase_commit_threshold: usize,
#[serde(default)]
pub branch_retention: BranchRetentionPolicy,
}
fn default_spatial_max_leaves() -> usize {
1_000_000
}
fn default_spatial_phase_commit_threshold() -> usize {
4096
}
impl Default for SpatialConfig {
fn default() -> Self {
Self {
enabled: false,
backend: SpatialBackendKind::Bvh,
max_leaves: default_spatial_max_leaves(),
phase_commit_threshold: default_spatial_phase_commit_threshold(),
branch_retention: BranchRetentionPolicy::default(),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "lowercase")]
pub enum VectorBackendKind {
#[default]
Hnsw,
DiskAnn,
Hybrid,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VectorHnswConfig {
#[serde(default = "default_ef_construction")]
pub ef_construction: usize,
#[serde(default = "default_m")]
pub m: usize,
#[serde(default = "default_max_elements")]
pub max_elements: usize,
}
fn default_ef_construction() -> usize {
200
}
fn default_m() -> usize {
16
}
fn default_max_elements() -> usize {
100_000
}
impl Default for VectorHnswConfig {
fn default() -> Self {
Self {
ef_construction: default_ef_construction(),
m: default_m(),
max_elements: default_max_elements(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VectorDiskAnnConfig {
#[serde(default = "default_diskann_max_points")]
pub max_points: usize,
#[serde(default = "default_diskann_dimensions")]
pub dimensions: usize,
#[serde(default = "default_diskann_num_neighbors")]
pub num_neighbors: usize,
#[serde(default = "default_diskann_search_list_size")]
pub search_list_size: usize,
#[serde(default = "default_diskann_data_path")]
pub data_path: String,
#[serde(default = "default_diskann_use_pq")]
pub use_pq: bool,
#[serde(default = "default_diskann_pq_num_chunks")]
pub pq_num_chunks: usize,
}
fn default_diskann_max_points() -> usize {
10_000_000
}
fn default_diskann_dimensions() -> usize {
384
}
fn default_diskann_num_neighbors() -> usize {
64
}
fn default_diskann_search_list_size() -> usize {
100
}
fn default_diskann_data_path() -> String {
".weftos/diskann".to_owned()
}
fn default_diskann_use_pq() -> bool {
true
}
fn default_diskann_pq_num_chunks() -> usize {
48
}
impl Default for VectorDiskAnnConfig {
fn default() -> Self {
Self {
max_points: default_diskann_max_points(),
dimensions: default_diskann_dimensions(),
num_neighbors: default_diskann_num_neighbors(),
search_list_size: default_diskann_search_list_size(),
data_path: default_diskann_data_path(),
use_pq: default_diskann_use_pq(),
pq_num_chunks: default_diskann_pq_num_chunks(),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "lowercase")]
pub enum VectorEvictionPolicy {
#[default]
Lru,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VectorHybridConfig {
#[serde(default = "default_hybrid_hot_capacity")]
pub hot_capacity: usize,
#[serde(default = "default_hybrid_promotion_threshold")]
pub promotion_threshold: u32,
#[serde(default)]
pub eviction_policy: VectorEvictionPolicy,
}
fn default_hybrid_hot_capacity() -> usize {
50_000
}
fn default_hybrid_promotion_threshold() -> u32 {
3
}
impl Default for VectorHybridConfig {
fn default() -> Self {
Self {
hot_capacity: default_hybrid_hot_capacity(),
promotion_threshold: default_hybrid_promotion_threshold(),
eviction_policy: VectorEvictionPolicy::default(),
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct VectorConfig {
#[serde(default)]
pub backend: VectorBackendKind,
#[serde(default)]
pub strict: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub hnsw: Option<VectorHnswConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub diskann: Option<VectorDiskAnnConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub hybrid: Option<VectorHybridConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub log_quantized: Option<LogQuantizedStubConfig>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub simd_distance: Option<SimdDistanceStubConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LogQuantizedStubConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default = "default_log_quantized_compression_ratio")]
pub compression_ratio: usize,
}
fn default_log_quantized_compression_ratio() -> usize {
4
}
impl Default for LogQuantizedStubConfig {
fn default() -> Self {
Self {
enabled: false,
compression_ratio: default_log_quantized_compression_ratio(),
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct SimdDistanceStubConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default)]
pub pad_to_power_of_two: bool,
}
#[cfg(test)]
mod tests {
#[test]
fn for_inspection_disables_mesh_listener() {
let kc = super::KernelConfig {
mesh: Some(super::MeshConfig {
enabled: true,
..super::MeshConfig::default()
}),
..super::KernelConfig::default()
}
.for_inspection();
assert!(!kc.mesh.unwrap().enabled);
assert!(super::KernelConfig::default().for_inspection().mesh.is_none());
}
#[test]
fn for_inspection_disables_the_chain() {
let kc = super::KernelConfig::default().for_inspection();
assert!(!kc.chain.expect("chain config set").enabled);
let kc = super::KernelConfig {
chain: Some(super::ChainConfig {
enabled: true,
..super::ChainConfig::default()
}),
..super::KernelConfig::default()
}
.for_inspection();
assert!(!kc.chain.unwrap().enabled);
}
use super::*;
#[test]
fn default_kernel_config() {
let cfg = KernelConfig::default();
assert!(cfg.enabled);
assert_eq!(cfg.max_processes, 64);
assert_eq!(cfg.health_check_interval_secs, 30);
}
#[test]
fn deserialize_empty() {
let cfg: KernelConfig = serde_json::from_str("{}").unwrap();
assert!(cfg.enabled);
assert_eq!(cfg.max_processes, 64);
}
#[test]
fn deserialize_camel_case() {
let json = r#"{"maxProcesses": 128, "healthCheckIntervalSecs": 15}"#;
let cfg: KernelConfig = serde_json::from_str(json).unwrap();
assert_eq!(cfg.max_processes, 128);
assert_eq!(cfg.health_check_interval_secs, 15);
}
#[test]
fn brand_defaults_to_weftos() {
let cfg = KernelConfig::default();
assert_eq!(cfg.brand(), DEFAULT_BRAND);
assert_eq!(cfg.brand, "WeftOS");
let empty: KernelConfig = serde_json::from_str("{}").unwrap();
assert_eq!(empty.brand(), DEFAULT_BRAND);
}
#[test]
fn brand_accessor_is_configurable() {
let mut cfg = KernelConfig {
brand: "Valtech Agentic Mesh".into(),
..KernelConfig::default()
};
assert_eq!(cfg.brand(), "Valtech Agentic Mesh");
cfg.brand = " ".into();
assert_eq!(cfg.brand(), DEFAULT_BRAND, "whitespace falls back");
let json = r#"{"brand": "Acme OS"}"#;
let parsed: KernelConfig = serde_json::from_str(json).unwrap();
assert_eq!(parsed.brand(), "Acme OS");
}
#[test]
fn process_brand_install_and_reset() {
install_brand("Custom Brand");
assert_eq!(brand(), "Custom Brand");
install_brand("");
assert_eq!(brand(), DEFAULT_BRAND);
reset_brand_for_test();
assert_eq!(brand(), DEFAULT_BRAND);
}
#[test]
fn serde_roundtrip() {
let cfg = KernelConfig {
enabled: true,
max_processes: 256,
health_check_interval_secs: 10,
brand: "WeftOS".into(),
cluster: None,
chain: None,
resource_tree: None,
vector: None,
spatial: None,
profiles: None,
pairing: None,
mesh: None,
anchor: None,
ipc_tcp: None,
llm: None,
agent: None,
governance: Default::default(),
profile: None,
shared_services: Default::default(),
};
let json = serde_json::to_string(&cfg).unwrap();
let restored: KernelConfig = serde_json::from_str(&json).unwrap();
assert_eq!(restored.enabled, cfg.enabled);
assert_eq!(restored.max_processes, cfg.max_processes);
assert_eq!(restored.brand(), cfg.brand());
}
#[test]
fn old_configs_load_without_profile_or_shared_services() {
let cfg: KernelConfig = serde_json::from_str(r#"{"enabled": true}"#).unwrap();
assert_eq!(cfg.profile, None);
assert_eq!(cfg.shared_services, SharedServicesConfig::default());
let json = serde_json::to_value(KernelConfig::default()).unwrap();
assert!(json.get("profile").is_none());
assert!(json.get("shared_services").is_none());
}
#[test]
fn project_profile_and_shared_services_parse() {
let cfg: KernelConfig = serde_json::from_str(
r#"{"profile": "project", "shared_services": {"embeddings": "parent", "llm": "parent", "voice": "parent"}}"#,
)
.unwrap();
assert_eq!(cfg.profile, Some(KernelProfile::Project));
assert_eq!(cfg.shared_services.voice, SharedServiceMode::Parent);
let back = serde_json::to_value(&cfg).unwrap();
assert_eq!(back["profile"], "project");
assert!(
serde_json::from_str::<KernelConfig>(r#"{"shared_services": {"llm": "local"}}"#)
.is_err()
);
}
#[test]
fn profiles_config_defaults() {
let cfg = ProfilesConfig::default();
assert!(cfg.enabled);
assert_eq!(cfg.storage_path, ".weftos/profiles");
assert_eq!(cfg.default_profile, "default");
}
#[test]
fn profiles_config_deserialize() {
let json =
r#"{"enabled": false, "storage_path": "/tmp/profiles", "default_profile": "admin"}"#;
let cfg: ProfilesConfig = serde_json::from_str(json).unwrap();
assert!(!cfg.enabled);
assert_eq!(cfg.storage_path, "/tmp/profiles");
assert_eq!(cfg.default_profile, "admin");
}
#[test]
fn pairing_config_defaults() {
let cfg = PairingConfig::default();
assert_eq!(cfg.persist_path, ".weftos/runtime/paired_hosts.json");
assert_eq!(cfg.default_window_secs, 30);
}
#[test]
fn pairing_config_deserialize() {
let json = r#"{"persist_path": "/opt/pairing.json", "default_window_secs": 60}"#;
let cfg: PairingConfig = serde_json::from_str(json).unwrap();
assert_eq!(cfg.persist_path, "/opt/pairing.json");
assert_eq!(cfg.default_window_secs, 60);
}
#[test]
fn kernel_config_with_profiles_and_pairing() {
let json = r#"{"profiles": {"enabled": true}, "pairing": {"default_window_secs": 45}}"#;
let cfg: KernelConfig = serde_json::from_str(json).unwrap();
assert!(cfg.profiles.is_some());
assert!(cfg.profiles.unwrap().enabled);
assert!(cfg.pairing.is_some());
assert_eq!(cfg.pairing.unwrap().default_window_secs, 45);
}
#[test]
fn vector_config_defaults() {
let cfg = VectorConfig::default();
assert_eq!(cfg.backend, VectorBackendKind::Hnsw);
assert!(cfg.hnsw.is_none());
assert!(cfg.diskann.is_none());
assert!(cfg.hybrid.is_none());
assert!(cfg.log_quantized.is_none());
assert!(cfg.simd_distance.is_none());
}
#[test]
fn vector_config_deserialize_hybrid() {
let json =
r#"{"backend": "hybrid", "hybrid": {"hot_capacity": 1000, "promotion_threshold": 5}}"#;
let cfg: VectorConfig = serde_json::from_str(json).unwrap();
assert_eq!(cfg.backend, VectorBackendKind::Hybrid);
let h = cfg.hybrid.unwrap();
assert_eq!(h.hot_capacity, 1000);
assert_eq!(h.promotion_threshold, 5);
}
#[test]
fn vector_config_deserialize_diskann() {
let json = r#"{"backend": "diskann", "diskann": {"max_points": 5000000}}"#;
let cfg: VectorConfig = serde_json::from_str(json).unwrap();
assert_eq!(cfg.backend, VectorBackendKind::DiskAnn);
let d = cfg.diskann.unwrap();
assert_eq!(d.max_points, 5_000_000);
}
#[test]
fn kernel_config_with_vector() {
let json = r#"{"vector": {"backend": "hnsw"}}"#;
let cfg: KernelConfig = serde_json::from_str(json).unwrap();
assert!(cfg.vector.is_some());
assert_eq!(cfg.vector.unwrap().backend, VectorBackendKind::Hnsw);
}
#[test]
fn spatial_config_defaults() {
let cfg = SpatialConfig::default();
assert!(!cfg.enabled);
assert_eq!(cfg.backend, SpatialBackendKind::Bvh);
assert_eq!(cfg.max_leaves, 1_000_000);
assert_eq!(cfg.phase_commit_threshold, 4096);
assert_eq!(cfg.branch_retention, BranchRetentionPolicy::KeepLast(64));
}
#[test]
fn kernel_config_with_spatial() {
let json = r#"{"spatial": {"enabled": true, "backend": "bvh", "max_leaves": 1000}}"#;
let cfg: KernelConfig = serde_json::from_str(json).unwrap();
let s = cfg.spatial.unwrap();
assert!(s.enabled);
assert_eq!(s.backend, SpatialBackendKind::Bvh);
assert_eq!(s.max_leaves, 1000);
}
#[test]
fn log_quantized_stub_config_defaults() {
let cfg = LogQuantizedStubConfig::default();
assert!(!cfg.enabled);
assert_eq!(cfg.compression_ratio, 4);
}
#[test]
fn log_quantized_stub_config_deserialize() {
let json = r#"{"enabled": true, "compression_ratio": 8}"#;
let cfg: LogQuantizedStubConfig = serde_json::from_str(json).unwrap();
assert!(cfg.enabled);
assert_eq!(cfg.compression_ratio, 8);
}
#[test]
fn simd_distance_stub_config_defaults() {
let cfg = SimdDistanceStubConfig::default();
assert!(!cfg.enabled);
assert!(!cfg.pad_to_power_of_two);
}
#[test]
fn simd_distance_stub_config_deserialize() {
let json = r#"{"enabled": true, "pad_to_power_of_two": true}"#;
let cfg: SimdDistanceStubConfig = serde_json::from_str(json).unwrap();
assert!(cfg.enabled);
assert!(cfg.pad_to_power_of_two);
}
#[test]
fn vector_config_with_shaal_stubs() {
let json = r#"{
"backend": "hnsw",
"log_quantized": {"enabled": true, "compression_ratio": 16},
"simd_distance": {"enabled": true, "pad_to_power_of_two": true}
}"#;
let cfg: VectorConfig = serde_json::from_str(json).unwrap();
let lq = cfg.log_quantized.unwrap();
assert!(lq.enabled);
assert_eq!(lq.compression_ratio, 16);
let sd = cfg.simd_distance.unwrap();
assert!(sd.enabled);
assert!(sd.pad_to_power_of_two);
}
#[test]
fn subagents_config_defaults_match_spawner() {
let cfg = SubagentsConfig::default();
assert!(cfg.enabled);
assert_eq!(cfg.max_per_conv, 5);
assert_eq!(cfg.max_depth, 3);
assert_eq!(cfg.timeout_secs, 120);
assert!(!cfg.notify_on_complete);
assert_eq!(cfg.timeout(), std::time::Duration::from_secs(120));
}
#[test]
fn subagents_config_absent_block_uses_defaults() {
let json = r#"{"talk_loop": true}"#;
let cfg: AgentAnchorConfig = serde_json::from_str(json).unwrap();
assert!(cfg.talk_loop);
assert!(cfg.subagents.enabled);
assert_eq!(cfg.subagents.max_depth, 3);
}
#[test]
fn subagents_config_partial_block_fills_missing_fields() {
let json = r#"{"subagents": {"max_depth": 1, "enabled": false}}"#;
let cfg: AgentAnchorConfig = serde_json::from_str(json).unwrap();
assert!(!cfg.subagents.enabled);
assert_eq!(cfg.subagents.max_depth, 1);
assert_eq!(cfg.subagents.max_per_conv, 5); assert_eq!(cfg.subagents.timeout_secs, 120); }
#[test]
fn subagents_config_camel_case_aliases() {
let json = r#"{"maxPerConv": 8, "maxDepth": 2, "timeoutSecs": 60, "notifyOnComplete": true}"#;
let cfg: SubagentsConfig = serde_json::from_str(json).unwrap();
assert_eq!(cfg.max_per_conv, 8);
assert_eq!(cfg.max_depth, 2);
assert_eq!(cfg.timeout_secs, 60);
assert!(cfg.notify_on_complete);
}
#[test]
fn classification_config_defaults_to_off() {
let cfg = ClassificationConfig::default();
assert_eq!(cfg.mode, ClassificationMode::Off);
assert!(!cfg.is_enabled());
assert!(cfg.model_override.is_none());
assert_eq!(cfg.queue_bound, 256);
}
#[test]
fn classification_config_absent_block_uses_defaults() {
let json = r#"{"anchor_causal": true}"#;
let cfg: AgentAnchorConfig = serde_json::from_str(json).unwrap();
assert!(cfg.anchor_causal);
assert_eq!(cfg.classification.mode, ClassificationMode::Off);
assert!(!cfg.classification.is_enabled());
assert_eq!(cfg.classification.queue_bound, 256);
}
#[test]
fn classification_config_partial_block_fills_missing_fields() {
let json = r#"{"classification": {"mode": "keyword"}}"#;
let cfg: AgentAnchorConfig = serde_json::from_str(json).unwrap();
assert_eq!(cfg.classification.mode, ClassificationMode::Keyword);
assert!(cfg.classification.is_enabled());
assert!(cfg.classification.model_override.is_none()); assert_eq!(cfg.classification.queue_bound, 256); }
#[test]
fn classification_config_full_mode_round_trip() {
let json =
r#"{"mode": "full", "model_override": "haiku-3.5", "queue_bound": 512}"#;
let cfg: ClassificationConfig = serde_json::from_str(json).unwrap();
assert_eq!(cfg.mode, ClassificationMode::Full);
assert!(cfg.is_enabled());
assert_eq!(cfg.model_override.as_deref(), Some("haiku-3.5"));
assert_eq!(cfg.queue_bound, 512);
}
#[test]
fn classification_config_camel_case_aliases() {
let json = r#"{"mode": "full", "modelOverride": "haiku-3.5", "queueBound": 128}"#;
let cfg: ClassificationConfig = serde_json::from_str(json).unwrap();
assert_eq!(cfg.mode, ClassificationMode::Full);
assert_eq!(cfg.model_override.as_deref(), Some("haiku-3.5"));
assert_eq!(cfg.queue_bound, 128);
}
#[test]
fn chain_external_anchor_defaults() {
let cfg = ChainExternalAnchorConfig::default();
assert_eq!(cfg.backend, ChainAnchorBackend::File);
assert_eq!(cfg.min_interval_secs, 300);
assert_eq!(cfg.min_events_between, 100);
assert!(cfg.ledger_path.is_none());
assert!(cfg.endpoint.is_none());
}
#[test]
fn chain_config_external_anchor_serde() {
let json = r#"{
"enabled": true,
"external_anchor": {
"backend": "file",
"ledger_path": "/tmp/anchors.jsonl",
"min_interval_secs": 60,
"min_events_between": 10
}
}"#;
let cfg: ChainConfig = serde_json::from_str(json).unwrap();
let anchor = cfg.external_anchor.expect("present");
assert_eq!(anchor.backend, ChainAnchorBackend::File);
assert_eq!(anchor.ledger_path.as_deref(), Some("/tmp/anchors.jsonl"));
assert_eq!(anchor.min_interval_secs, 60);
assert_eq!(anchor.min_events_between, 10);
}
#[test]
fn chain_external_anchor_camel_case_and_external_backend() {
let json = r#"{
"backend": "external",
"ledgerPath": "/var/lib/weftos/intent.jsonl",
"endpoint": "https://ledger.example/anchor",
"minIntervalSecs": 0,
"minEventsBetween": 0
}"#;
let cfg: ChainExternalAnchorConfig = serde_json::from_str(json).unwrap();
assert_eq!(cfg.backend, ChainAnchorBackend::External);
assert_eq!(
cfg.ledger_path.as_deref(),
Some("/var/lib/weftos/intent.jsonl")
);
assert_eq!(
cfg.endpoint.as_deref(),
Some("https://ledger.example/anchor")
);
assert_eq!(cfg.min_interval_secs, 0);
assert_eq!(cfg.min_events_between, 0);
}
}