1pub mod init;
50
51pub use clawft_kernel as kernel;
53
54pub use clawft_kernel::{
56 Kernel, KernelState,
57 Pid, ProcessEntry, ProcessState, ProcessTable,
59 AgentSupervisor, SpawnBackend, SpawnRequest, SpawnResult,
61 AgentCapabilities, CapabilityChecker, IpcScope, ResourceLimits,
63 KernelIpc, KernelMessage, KernelSignal, MessagePayload, MessageTarget,
65 GlobalPid,
66 ServiceRegistry, ServiceEntry, SystemService,
68 HealthSystem, HealthStatus, OverallHealth,
70 GovernanceEngine, GovernanceRule, GovernanceRequest, GovernanceDecision,
72 EffectVector,
73 TopicRouter, Subscription,
75 ClusterConfig, ClusterMembership, NodeState, PeerNode,
77 KernelConfigExt,
79 BootEvent, BootPhase, BootLog,
81 KernelError, KernelResult,
83 CronService,
85 AppManager, AppManifest, InstalledApp, AppState,
87 ContainerManager, ContainerConfig, ContainerState,
89};
90
91#[cfg(feature = "exochain")]
93pub use clawft_kernel::{
94 ChainManager, ChainEvent, TreeManager, TreeStats,
95 GateBackend, GateDecision, GovernanceGate, CapabilityGate,
96};
97
98#[cfg(feature = "ecc")]
99pub use clawft_kernel::{
100 CausalGraph, CausalEdgeType, CognitiveTick, CognitiveTickConfig,
101 CrossRef, CrossRefStore, CrossRefType, UniversalNodeId,
102 HnswService, HnswServiceConfig, HnswSearchResult,
103 ImpulseQueue, ImpulseType,
104 EccCalibration,
105};
106
107#[cfg(feature = "mesh")]
108pub use clawft_kernel::{
109 MeshError, MeshPeer, MeshStream, MeshTransport, TransportListener,
110 WeftHandshake, MeshConnectionPool, TcpTransport,
111 DiscoveryCoordinator, BootstrapDiscovery,
112 MeshIpcEnvelope, DedupFilter,
113 HeartbeatTracker, HeartbeatConfig, HeartbeatState,
114 DistributedProcessTable, ClusterServiceRegistry,
115};
116
117#[cfg(feature = "os-patterns")]
118pub use clawft_kernel::{
119 MetricsRegistry, LogService, TimerService,
120 DeadLetterQueue, ReliableQueue, NamedPipeRegistry,
121 ReconciliationController,
122};
123
124use std::path::Path;
125
126#[cfg(feature = "native")]
127use std::sync::Arc;
128
129#[cfg(feature = "native")]
130use clawft_platform::NativePlatform;
131
132#[cfg(feature = "native")]
134pub struct WeftOs {
135 kernel: clawft_kernel::Kernel<NativePlatform>,
136 project_root: std::path::PathBuf,
137}
138
139#[cfg(feature = "native")]
140impl WeftOs {
141 pub async fn boot_default() -> Result<Self, KernelError> {
143 Self::boot_in(std::env::current_dir().unwrap_or_else(|_| ".".into())).await
144 }
145
146 pub async fn boot_in(project_root: impl Into<std::path::PathBuf>) -> Result<Self, KernelError> {
148 let project_root = project_root.into();
149 let config = clawft_types::config::Config::default();
150 let kernel_config = clawft_types::config::KernelConfig::default();
151 let platform = Arc::new(NativePlatform::new());
152
153 let kernel = Kernel::boot(config, kernel_config, platform).await?;
154
155 Ok(Self { kernel, project_root })
156 }
157
158 pub async fn boot_with(
160 config: clawft_types::config::Config,
161 kernel_config: clawft_types::config::KernelConfig,
162 project_root: impl Into<std::path::PathBuf>,
163 ) -> Result<Self, KernelError> {
164 let project_root = project_root.into();
165 let platform = Arc::new(NativePlatform::new());
166 let kernel = Kernel::boot(config, kernel_config, platform).await?;
167 Ok(Self { kernel, project_root })
168 }
169
170 pub fn project_root(&self) -> &Path {
172 &self.project_root
173 }
174
175 pub fn state(&self) -> &KernelState {
177 self.kernel.state()
178 }
179
180 pub fn service_count(&self) -> usize {
182 self.kernel.services().len()
183 }
184
185 pub fn process_count(&self) -> usize {
187 self.kernel.process_table().len()
188 }
189
190 pub fn kernel(&self) -> &Kernel<NativePlatform> {
192 &self.kernel
193 }
194
195 pub fn kernel_mut(&mut self) -> &mut Kernel<NativePlatform> {
197 &mut self.kernel
198 }
199
200 pub async fn shutdown(mut self) -> KernelResult<()> {
202 tracing::info!("WeftOS shutting down");
203 self.kernel.shutdown().await
204 }
205}
206
207pub const VERSION: &str = env!("CARGO_PKG_VERSION");
209
210pub fn is_initialized(path: impl AsRef<Path>) -> bool {
212 path.as_ref().join(".weftos").exists()
213 || path.as_ref().join("weave.toml").exists()
214}
215
216#[cfg(test)]
217mod tests {
218 use super::*;
219
220 #[test]
221 fn is_not_initialized_in_random_dir() {
222 assert!(!is_initialized("/tmp/nonexistent-weftos-test"));
223 }
224
225 #[test]
226 fn init_creates_structure() {
227 let dir = std::env::temp_dir().join("weftos-test-init");
228 let _ = std::fs::remove_dir_all(&dir);
229 std::fs::create_dir_all(&dir).unwrap();
230
231 let result = init::init_project(&dir).unwrap();
232 assert!(result.weftos_dir_created);
233 assert!(result.weave_toml_created);
234 assert!(dir.join(".weftos").exists());
235 assert!(dir.join("weave.toml").exists());
236 assert!(dir.join(".weftos/chain").exists());
237 assert!(dir.join(".weftos/logs").exists());
238
239 std::fs::remove_dir_all(&dir).ok();
241 }
242
243 #[test]
244 fn init_detects_rust_project() {
245 let dir = std::env::temp_dir().join("weftos-test-rust");
246 let _ = std::fs::remove_dir_all(&dir);
247 std::fs::create_dir_all(&dir).unwrap();
248 std::fs::write(dir.join("Cargo.toml"), "[package]\nname = \"test\"").unwrap();
249
250 let _result = init::init_project(&dir).unwrap();
251 let config = std::fs::read_to_string(dir.join("weave.toml")).unwrap();
252 assert!(config.contains("language = \"rust\""));
253 assert!(config.contains("*.rs"));
254
255 std::fs::remove_dir_all(&dir).ok();
256 }
257
258 #[tokio::test]
259 async fn weftos_boots_and_reports_state() {
260 let os = WeftOs::boot_default().await.unwrap();
261 assert!(matches!(os.state(), KernelState::Running));
262 assert!(os.service_count() > 0);
263 os.shutdown().await.unwrap();
264 }
265}