//! WASM-extensible channel system. //! //! This module provides a runtime for executing WASM-based channels using a //! Host-Managed Event Loop pattern. The host (Rust) manages infrastructure //! (HTTP server, polling), while WASM modules define channel behavior through //! callbacks. //! //! # Architecture //! //! ```text //! ┌─────────────────────────────────────────────────────────────────────────────────┐ //! │ Host-Managed Event Loop │ //! │ │ //! │ ┌─────────────┐ ┌──────────────┐ ┌──────────────┐ │ //! │ │ HTTP │ │ Polling │ │ Timer │ │ //! │ │ Router │ │ Scheduler │ │ Scheduler │ │ //! │ └──────┬──────┘ └──────┬───────┘ └──────┬───────┘ │ //! │ │ │ │ │ //! │ └───────────────────┴────────────────────┘ │ //! │ │ │ //! │ ▼ │ //! │ ┌─────────────────┐ │ //! │ │ Event Router │ │ //! │ └────────┬────────┘ │ //! │ │ │ //! │ ┌──────────────────┼──────────────────┐ │ //! │ ▼ ▼ ▼ │ //! │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ //! │ │ on_http_req │ │ on_poll │ │ on_respond │ WASM Exports │ //! │ └─────────────┘ └─────────────┘ └─────────────┘ │ //! │ │ │ │ │ //! │ └──────────────────┴──────────────────┘ │ //! │ │ │ //! │ ▼ │ //! │ ┌─────────────────┐ │ //! │ │ Host Imports │ │ //! │ │ emit_message │──────────▶ MessageStream │ //! │ │ http_request │ │ //! │ │ log, etc. │ │ //! │ └─────────────────┘ │ //! └─────────────────────────────────────────────────────────────────────────────────┘ //! ``` //! //! # Key Design Decisions //! //! 1. **Fresh Instance Per Callback** (NEAR Pattern) - Full isolation, no shared mutable state //! 2. **Host Manages Infrastructure** - HTTP server, polling, timing in Rust //! 3. **WASM Defines Behavior** - Callbacks for events, message parsing, response handling //! 4. **Reuse Tool Runtime** - Share Wasmtime engine, extend capabilities //! //! # Security Model //! //! | Threat | Mitigation | //! |--------|------------| //! | Path hijacking | `allowed_paths` restricts registrable endpoints | //! | Token exposure | Injected at host boundary, WASM never sees | //! | State pollution | Fresh instance per callback | //! | Workspace escape | Paths prefixed with `channels//` | //! | Message spam | Rate limiting on `emit_message` | //! | Resource exhaustion | Fuel metering, memory limits, callback timeout | //! | Polling abuse | Minimum 30s interval enforced | //! //! # Example Usage //! //! ```ignore //! use ironclaw::channels::wasm::{WasmChannelLoader, WasmChannelRuntime}; //! //! // Create runtime (can share engine with tool runtime) //! let runtime = WasmChannelRuntime::new(config)?; //! //! // Load channels from directory //! let loader = WasmChannelLoader::new(runtime, pairing_store, settings_store, owner_scope_id); //! let channels = loader.load_from_dir(Path::new("~/.ironclaw/channels/")).await?; //! //! // Add to channel manager //! for channel in channels { //! manager.add(Box::new(channel)); //! } //! ``` mod bundled; mod capabilities; mod error; mod host; mod loader; mod router; mod runtime; mod schema; pub mod setup; pub(crate) mod signature; #[allow(dead_code)] pub(crate) mod storage; mod telegram_host_config; mod wrapper; // Core types pub use bundled::{available_channel_names, bundled_channel_names, install_bundled_channel}; pub use capabilities::{ChannelCapabilities, EmitRateLimitConfig, HttpEndpointConfig, PollConfig}; pub use error::WasmChannelError; pub use host::{ChannelEmitRateLimiter, ChannelHostState, EmittedMessage}; pub use loader::{ DiscoveredChannel, LoadResults, LoadedChannel, WasmChannelLoader, default_channels_dir, discover_channels, }; pub use router::{RegisteredEndpoint, WasmChannelRouter, create_wasm_channel_router}; pub use runtime::{PreparedChannelModule, WasmChannelRuntime, WasmChannelRuntimeConfig}; pub use schema::{ ChannelCapabilitiesFile, ChannelConfig, SecretSetupSchema, SetupSchema, WebhookSchema, }; pub use setup::{WasmChannelSetup, inject_channel_credentials, setup_wasm_channels}; pub(crate) use telegram_host_config::{TELEGRAM_CHANNEL_NAME, bot_username_setting_key}; pub use wrapper::{HttpResponse, SharedWasmChannel, WasmChannel};