plexus_substrate/
builder.rs1use std::sync::{Arc, Weak};
6
7use crate::activations::arbor::{Arbor, ArborConfig};
8use crate::activations::bash::Bash;
9use crate::activations::changelog::{Changelog, ChangelogStorageConfig};
10use crate::activations::claudecode::{ClaudeCode, ClaudeCodeStorage, ClaudeCodeStorageConfig};
11use crate::activations::claudecode_loopback::{ClaudeCodeLoopback, LoopbackStorageConfig};
12use crate::activations::cone::{Cone, ConeStorageConfig};
13use crate::activations::echo::Echo;
14use crate::activations::health::Health;
15use crate::activations::interactive::Interactive;
16use crate::activations::mustache::{Mustache, MustacheStorageConfig};
17use crate::activations::solar::Solar;
18use crate::plexus::DynamicHub;
19use hyperforge::HyperforgeHub;
20use registry::Registry;
22
23pub async fn build_plexus_rpc() -> Arc<DynamicHub> {
41 let arbor: Arbor<Weak<DynamicHub>> = Arbor::with_context_type(ArborConfig::default())
44 .await
45 .expect("Failed to initialize Arbor");
46 let arbor_storage = arbor.storage();
47
48 let cone: Cone<Weak<DynamicHub>> = Cone::with_context_type(ConeStorageConfig::default(), arbor_storage.clone())
51 .await
52 .expect("Failed to initialize Cone");
53
54 let claudecode_storage = ClaudeCodeStorage::new(
57 ClaudeCodeStorageConfig::default(),
58 arbor_storage,
59 )
60 .await
61 .expect("Failed to initialize ClaudeCode storage");
62 let claudecode: ClaudeCode<Weak<DynamicHub>> = ClaudeCode::with_context_type(Arc::new(claudecode_storage));
63
64 let mustache = Mustache::new(MustacheStorageConfig::default())
66 .await
67 .expect("Failed to initialize Mustache");
68
69 let changelog = Changelog::new(ChangelogStorageConfig::default())
71 .await
72 .expect("Failed to initialize Changelog");
73
74 let loopback = ClaudeCodeLoopback::new(LoopbackStorageConfig::default())
76 .await
77 .expect("Failed to initialize ClaudeCodeLoopback");
78
79 let registry = Registry::with_defaults()
84 .await
85 .expect("Failed to initialize Registry");
86
87 let hub = Arc::new_cyclic(|weak_hub: &Weak<DynamicHub>| {
91 arbor.inject_parent(weak_hub.clone());
93 cone.inject_parent(weak_hub.clone());
94 claudecode.inject_parent(weak_hub.clone());
95
96 DynamicHub::new("substrate")
98 .register(Health::new())
99 .register(Echo::new())
100 .register(Bash::new())
101 .register(arbor)
102 .register(cone)
103 .register(claudecode)
104 .register(mustache)
105 .register(changelog.clone())
106 .register(loopback)
107 .register(registry)
109 .register(Interactive::new()) .register_hub(Solar::new())
111 .register(HyperforgeHub::new())
112 });
113
114 let plexus_hash = hub.compute_hash();
116 match changelog.startup_check(&plexus_hash).await {
117 Ok((hash_changed, is_documented, message)) => {
118 if hash_changed && !is_documented {
119 tracing::error!("{}", message);
120 } else if hash_changed {
121 tracing::info!("{}", message);
122 } else {
123 tracing::debug!("{}", message);
124 }
125 }
126 Err(e) => {
127 tracing::error!("Changelog startup check failed: {}", e);
128 }
129 }
130
131 hub
132}