Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
227 changes: 132 additions & 95 deletions Cargo.lock

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,9 @@ members = [
# Spectral graph sparsification
"crates/ruvector-sparsifier",
"crates/ruvector-sparsifier-wasm",
# Consciousness metrics (IIT Φ, causal emergence)
"crates/ruvector-consciousness",
"crates/ruvector-consciousness-wasm",
]
resolver = "2"

Expand Down
1 change: 1 addition & 0 deletions crates/mcp-brain-server/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ ruvector-domain-expansion = { path = "../ruvector-domain-expansion" }
ruvector-delta-core = { path = "../ruvector-delta-core" }
ruvector-solver = { path = "../ruvector-solver", features = ["forward-push"] }
ruvector-sparsifier = { path = "../ruvector-sparsifier" }
ruvector-consciousness = { path = "../ruvector-consciousness", features = ["phi"], default-features = false }

# RuvLLM Embeddings (HashEmbedder + RlmEmbedder — pure Rust, no model download)
ruvllm = { path = "../ruvllm", default-features = false, features = ["minimal"] }
Expand Down
1 change: 1 addition & 0 deletions crates/mcp-brain-server/Cargo.workspace.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ members = [
"crates/mcp-brain-server",
"crates/mcp-brain",
"crates/sona",
"crates/ruvector-consciousness",
"crates/ruvector-mincut",
"crates/ruvector-nervous-system",
"crates/ruvector-domain-expansion",
Expand Down
8 changes: 8 additions & 0 deletions crates/mcp-brain-server/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ COPY crates/ruvector-domain-expansion ./crates/ruvector-domain-expansion
COPY crates/ruvector-delta-core ./crates/ruvector-delta-core
COPY crates/ruvector-solver ./crates/ruvector-solver
COPY crates/ruvector-sparsifier ./crates/ruvector-sparsifier
COPY crates/ruvector-consciousness ./crates/ruvector-consciousness
COPY crates/ruvllm ./crates/ruvllm
COPY crates/ruvector-core ./crates/ruvector-core
COPY crates/rvf ./crates/rvf
Expand Down Expand Up @@ -62,6 +63,13 @@ RUN sed -i '/ruvector-graph\s*=/d' crates/ruvector-mincut/Cargo.toml && \
sed -i '/\[\[bench\]\]/,/^$/d' crates/ruvector-delta-core/Cargo.toml && \
sed -i '/\[\[example\]\]/,/^$/d' crates/ruvector-sparsifier/Cargo.toml && \
sed -i '/\[\[bench\]\]/,/^$/d' crates/ruvector-sparsifier/Cargo.toml && \
sed -i '/\[\[bench\]\]/,/^$/d' crates/ruvector-consciousness/Cargo.toml && \
sed -i '/ruvector-coherence\s*=/d' crates/ruvector-consciousness/Cargo.toml && \
sed -i '/ruvector-cognitive-container\s*=/d' crates/ruvector-consciousness/Cargo.toml && \
sed -i '/ruvector-math\s*=/d' crates/ruvector-consciousness/Cargo.toml && \
sed -i 's/"coherence-accel",\s*//g' crates/ruvector-consciousness/Cargo.toml && \
sed -i 's/"witness",\s*//g' crates/ruvector-consciousness/Cargo.toml && \
sed -i 's/"math-accel",\s*//g' crates/ruvector-consciousness/Cargo.toml && \
find crates/rvf -name "Cargo.toml" -exec sed -i '/\[\[example\]\]/,/^$/d' {} \; && \
find crates/rvf -name "Cargo.toml" -exec sed -i '/\[\[bench\]\]/,/^$/d' {} \; && \
find crates/sona -name "Cargo.toml" -exec sed -i '/\[\[example\]\]/,/^$/d' {} \; && \
Expand Down
18 changes: 18 additions & 0 deletions crates/mcp-brain-server/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,24 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
}
});

// ── Background sparsifier build for large graphs ──
// Deferred from startup to avoid blocking the health probe.
let spar_state = state.clone();
tokio::spawn(async move {
tokio::time::sleep(std::time::Duration::from_secs(15)).await;
let edge_count = spar_state.graph.read().edge_count();
if edge_count > 100_000 && spar_state.graph.read().sparsifier_stats().is_none() {
tracing::info!("Background sparsifier build starting ({edge_count} edges)");
spar_state.graph.write().rebuild_sparsifier();
let stats = spar_state.graph.read().sparsifier_stats();
if let Some(s) = stats {
tracing::info!("Sparsifier built: {} edges, {:.1}x compression", s.sparsified_edges, s.compression_ratio);
} else {
tracing::warn!("Sparsifier build returned no stats");
}
}
});

let listener = tokio::net::TcpListener::bind(format!("0.0.0.0:{port}")).await?;
tracing::info!("mcp-brain-server listening on port {port}");
tracing::info!("Endpoints: brain.ruv.io | π.ruv.io");
Expand Down
297 changes: 292 additions & 5 deletions crates/mcp-brain-server/src/routes.rs

Large diffs are not rendered by default.

52 changes: 52 additions & 0 deletions crates/mcp-brain-server/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,12 @@ pub enum BrainCategory {
/// Benchmark results, comparative analyses
Benchmark,

// ── Consciousness & IIT ──
/// IIT 4.0 consciousness metrics: Φ, CES, distinctions, relations
Consciousness,
/// Information decomposition: ΦID, PID, redundancy/synergy analysis
InformationDecomposition,

Custom(String),
}

Expand Down Expand Up @@ -137,6 +143,8 @@ impl std::fmt::Display for BrainCategory {
Self::Finance => write!(f, "finance"),
Self::MetaCognition => write!(f, "meta_cognition"),
Self::Benchmark => write!(f, "benchmark"),
Self::Consciousness => write!(f, "consciousness"),
Self::InformationDecomposition => write!(f, "information_decomposition"),
Self::Custom(s) => write!(f, "{s}"),
}
}
Expand Down Expand Up @@ -495,6 +503,50 @@ pub struct StatusResponse {
pub sparsifier_compression: f64,
/// Number of edges in the sparsified graph
pub sparsifier_edges: usize,
// ── Consciousness / IIT 4.0 ──
/// Available consciousness algorithms
pub consciousness_algorithms: Vec<String>,
/// Max system elements supported (for exact IIT 4.0)
pub consciousness_max_elements: usize,
}

/// Request for POST /v1/consciousness/compute
#[derive(Debug, Clone, Deserialize)]
pub struct ConsciousnessComputeRequest {
/// State-to-state transition probability matrix (flattened row-major, n×n)
pub tpm: Vec<f64>,
/// Number of states (must be power of 2)
pub n: usize,
/// Current state index
pub state: usize,
/// Algorithm: "iit4_phi", "ces", "phi_id", "pid", "streaming", "bounds", "auto"
#[serde(default = "default_algo")]
pub algorithm: String,
/// Minimum φ threshold for CES distinctions
#[serde(default = "default_phi_threshold")]
pub phi_threshold: f64,
/// Partition mask for ΦID/PID (bitmask of elements in source A)
pub partition_mask: Option<u64>,
}

fn default_algo() -> String { "auto".into() }
fn default_phi_threshold() -> f64 { 1e-6 }

/// Response for POST /v1/consciousness/compute
#[derive(Debug, Serialize)]
pub struct ConsciousnessComputeResponse {
/// Algorithm used
pub algorithm: String,
/// System-level integrated information (Φ)
pub phi: f64,
/// Number of elements (binary components)
pub num_elements: usize,
/// Number of states
pub num_states: usize,
/// Computation time in microseconds
pub elapsed_us: u64,
/// Algorithm-specific results
pub details: serde_json::Value,
}

/// Response for GET /v1/temporal — temporal delta tracking stats
Expand Down
33 changes: 33 additions & 0 deletions crates/ruvector-consciousness-wasm/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
[package]
name = "ruvector-consciousness-wasm"
version.workspace = true
edition.workspace = true
rust-version.workspace = true
license.workspace = true
authors.workspace = true
repository.workspace = true
description = "WASM bindings for ruvector-consciousness: IIT Φ, causal emergence, quantum collapse"
keywords = ["consciousness", "wasm", "iit", "phi"]

[lib]
crate-type = ["cdylib", "rlib"]

[dependencies]
ruvector-consciousness = { version = "2.1.0", path = "../ruvector-consciousness", default-features = false, features = ["wasm", "phi", "emergence", "collapse"] }
wasm-bindgen = "0.2"
serde-wasm-bindgen = "0.6"
serde = { workspace = true, features = ["derive"] }
serde_json = { workspace = true }
js-sys = "0.3"
getrandom = { version = "0.2", features = ["js"] }

[dev-dependencies]
wasm-bindgen-test = "0.3"

[profile.release]
opt-level = "s"
lto = true
panic = "abort"

[package.metadata.wasm-pack.profile.release]
wasm-opt = false
Loading
Loading