openpay/
compliance/ PCI-DSS readiness package (scope-map,
pci-zero-architecture, hsm-kms-guidance,
qsa-checklist), citing PCI-DSS v4.0.1
requirements. (#1)
examples/pci-zero/ Runnable example demonstrating a deployment
where merchant code never touches a PAN. (#1)
crates/op-core/ Tokenized<Card> typestate + NetworkToken
+ CardNetwork + Cryptogram. (#2)
crates/op-rails-card/network_token/
NetworkTokenProvider trait + VTS adapter
+ MDES adapter, with deterministic stubs
behind a 'live' feature flag. (#2)
crates/op-driver-sdk/conformance/network_token.rs
Conformance harness for third-party
NetworkTokenProvider implementations. (#2)
crates/op-cli/src/ledger/ 'openpay ledger as-of' subcommand for
bi-temporal queries. (#3)
crates/op-orchestrator/src/telemetry.rs
OpenTelemetry span emission per
Payment<S> transition with semantic-
conventions tags. (#3)
docs/observability/ Grafana dashboard JSON + wiring guide
for the bi-temporal ledger lens. (#3)
smart-byte/
smart-byte-rs/ Rust reference implementation: envelope
encode/decode (canonical CBOR + BLAKE3
content addressing), Ed25519 sign +
verify, lockstep BFT commit MVP, Iroh
transport scaffold, CLI. (#4)
spec/identity_and_key_rotation.md
Adopts KERI SAIDs + key-event log
format; explicitly does not adopt ACDC
chaining wholesale. (#5)
conformance/v1/ 21 test vectors covering canonicalisation,
SAID computation, signature verification,
lockstep commit, gossip propagation.
CI gate enforces spec/vector coupling. (#6)
eoc/
eoc-rs/ Rust + WASM reference implementation:
4-stage cascade (cache -> kv -> graph ->
neural), joule counters via RAPL / NVML /
powermetrics, CLI, wasm-bindgen surface.
18 tests pass. (#7)
eoc-bench/ Benchmark harness, MT-Bench and Router
case sets, 'joules per MT-Bench point'
metric, 'eoc-bench run | compare' CLI. (#8)
standards/sci-for-ai-submission.md
Submission proposal mapping EOC's
receipt schema to GSF SCI-for-AI. (#9)
cookbook/ HuggingFace-style cookbook (markdown +
runnable Python) demonstrating EOC's
cascade with HF AI Energy Score. (#9)
docs/bench-v0.md Reproducibility doc for eoc-bench.
Workspace state:
- openpay clippy -- -D warnings: clean across all touched crates
- smart-byte-rs cargo test --workspace + clippy: clean
- eoc-rs cargo test --workspace + clippy: clean (18 tests)
- eoc-bench cargo check --workspace + clippy + 15 tests: clean
Rust 1.95.0 edition 2024 pinned at the open-standards root via
rust-toolchain.toml; every workspace inherits.
Closes #1 #2 #3 #4 #5 #6 #7 #8 #9.
85 lines
2.7 KiB
Rust
85 lines
2.7 KiB
Rust
//! Browser-runnable EOC cascade.
|
|
//!
|
|
//! This crate exposes a minimal `wasm-bindgen` surface so the EOC cascade
|
|
//! can be driven from JavaScript. The build target is
|
|
//! `wasm32-unknown-unknown`:
|
|
//!
|
|
//! ```text
|
|
//! cargo build -p eoc-wasm --target wasm32-unknown-unknown --release
|
|
//! wasm-bindgen target/wasm32-unknown-unknown/release/eoc_wasm.wasm \
|
|
//! --out-dir ./pkg --target web
|
|
//! ```
|
|
//!
|
|
//! The meter is omitted in WASM — RAPL/NVML/powermetrics do not compile
|
|
//! to `wasm32-unknown-unknown`. The cascade falls back to estimated
|
|
//! joule cost reported by each stage.
|
|
|
|
#![forbid(unsafe_code)]
|
|
|
|
use std::sync::Arc;
|
|
|
|
use eoc_cache::LruCache;
|
|
use eoc_cascade::Cascade;
|
|
use eoc_core::Query;
|
|
use eoc_graph::{GraphStage, Triple};
|
|
use eoc_kv::{KvBackend, KvStage, MemoryKvBackend};
|
|
use eoc_neural::{EchoBackend, NeuralStage};
|
|
use serde::Serialize;
|
|
use wasm_bindgen::prelude::*;
|
|
|
|
#[derive(Serialize)]
|
|
struct JsResponse {
|
|
stage: String,
|
|
payload: String,
|
|
microjoules: u64,
|
|
source: String,
|
|
receipt_hex: String,
|
|
}
|
|
|
|
/// A WASM-friendly handle to a fully wired cascade.
|
|
#[wasm_bindgen]
|
|
pub struct WasmCascade {
|
|
inner: Cascade,
|
|
}
|
|
|
|
#[wasm_bindgen]
|
|
impl WasmCascade {
|
|
/// Construct a demo cascade with a seeded graph and KV.
|
|
#[wasm_bindgen(constructor)]
|
|
pub fn new() -> WasmCascade {
|
|
let cache = Arc::new(LruCache::new(256));
|
|
let kv_backend = Box::new(MemoryKvBackend::new());
|
|
kv_backend.put("ping", b"pong".to_vec());
|
|
let kv = Arc::new(KvStage::new(kv_backend));
|
|
let graph = Arc::new(GraphStage::new());
|
|
graph.insert(Triple::new("Paris", "capital of", "France"));
|
|
let neural = Arc::new(NeuralStage::new(Box::new(EchoBackend::new())));
|
|
let inner = Cascade::new(cache, kv, graph, neural);
|
|
Self { inner }
|
|
}
|
|
|
|
/// Resolve a prompt through the cascade. Returns a JS object
|
|
/// `{ stage, payload, microjoules, source, receipt_hex }`.
|
|
#[wasm_bindgen(js_name = resolve)]
|
|
pub async fn resolve_js(&self, prompt: String) -> Result<JsValue, JsValue> {
|
|
let q = Query::new(prompt);
|
|
let r = self.inner.resolve(q).await;
|
|
let out = JsResponse {
|
|
stage: r.stage.to_string(),
|
|
payload: r.payload,
|
|
microjoules: r.joule_cost.microjoules,
|
|
source: match r.joule_cost.source {
|
|
eoc_core::JouleSource::Measured => "measured".to_string(),
|
|
eoc_core::JouleSource::Estimated => "estimated".to_string(),
|
|
},
|
|
receipt_hex: r.receipt.to_hex(),
|
|
};
|
|
serde_wasm_bindgen::to_value(&out).map_err(|e| JsValue::from_str(&e.to_string()))
|
|
}
|
|
}
|
|
|
|
impl Default for WasmCascade {
|
|
fn default() -> Self {
|
|
Self::new()
|
|
}
|
|
}
|