mirror of
https://github.com/outbackdingo/optimclaw.git
synced 2026-08-26 07:30:11 +00:00
* refactor: split large files and consolidate test stubs for contributor velocity - Extract 7 Database sub-traits (ConversationStore, JobStore, SandboxStore, RoutineStore, ToolFailureStore, SettingsStore, WorkspaceStore) with Database as a supertrait combining them all - Split libsql_backend.rs (2769 lines) into src/db/libsql/ directory with one file per sub-trait implementation - Split config.rs (1753 lines) into src/config/ directory with 16 domain files - Consolidate 3 duplicate test LLM stubs into shared StubLlm in src/testing.rs - Split server.rs handlers into src/channels/web/handlers/ directory - Extract main.rs init phases into AppBuilder (src/app.rs) - Add developer setup script (scripts/dev-setup.sh) Co-Authored-By: Claude Opus 4.6 <[email protected]> * refactor: move heartbeat test from examples/ to tests/ Convert standalone example binary into a proper #[ignore] integration test, matching the convention of the other integration tests. Co-Authored-By: Claude Opus 4.6 <[email protected]> * style: fix rustfmt formatting for CI Co-Authored-By: Claude Opus 4.6 <[email protected]> * fix: address PR review comments from Copilot - tunnel.rs: replace .ok().flatten() with ? to propagate env var errors - secrets.rs: remove misleading "process-wide cache" comment - database.rs: use uppercase "DATABASE_URL" in error key - testing.rs: gate harness tests with #[cfg(feature = "libsql")] Co-Authored-By: Claude Opus 4.6 <[email protected]> --------- Co-authored-by: Illia Polosukhin <[email protected]> Co-authored-by: Claude Opus 4.6 <[email protected]>
100 lines
3.5 KiB
Rust
100 lines
3.5 KiB
Rust
use std::path::PathBuf;
|
|
use std::time::Duration;
|
|
|
|
use crate::config::helpers::{optional_env, parse_optional_env};
|
|
use crate::error::ConfigError;
|
|
|
|
/// WASM sandbox configuration.
|
|
#[derive(Debug, Clone)]
|
|
pub struct WasmConfig {
|
|
/// Whether WASM tool execution is enabled.
|
|
pub enabled: bool,
|
|
/// Directory containing installed WASM tools (default: ~/.ironclaw/tools/).
|
|
pub tools_dir: PathBuf,
|
|
/// Default memory limit in bytes (default: 10 MB).
|
|
pub default_memory_limit: u64,
|
|
/// Default execution timeout in seconds (default: 60).
|
|
pub default_timeout_secs: u64,
|
|
/// Default fuel limit for CPU metering (default: 10M).
|
|
pub default_fuel_limit: u64,
|
|
/// Whether to cache compiled modules.
|
|
pub cache_compiled: bool,
|
|
/// Directory for compiled module cache.
|
|
pub cache_dir: Option<PathBuf>,
|
|
}
|
|
|
|
impl Default for WasmConfig {
|
|
fn default() -> Self {
|
|
Self {
|
|
enabled: true,
|
|
tools_dir: default_tools_dir(),
|
|
default_memory_limit: 10 * 1024 * 1024, // 10 MB
|
|
default_timeout_secs: 60,
|
|
default_fuel_limit: 10_000_000,
|
|
cache_compiled: true,
|
|
cache_dir: None,
|
|
}
|
|
}
|
|
}
|
|
|
|
/// Get the default tools directory (~/.ironclaw/tools/).
|
|
fn default_tools_dir() -> PathBuf {
|
|
dirs::home_dir()
|
|
.unwrap_or_else(|| PathBuf::from("."))
|
|
.join(".ironclaw")
|
|
.join("tools")
|
|
}
|
|
|
|
impl WasmConfig {
|
|
pub(crate) fn resolve() -> Result<Self, ConfigError> {
|
|
Ok(Self {
|
|
enabled: optional_env("WASM_ENABLED")?
|
|
.map(|s| s.parse())
|
|
.transpose()
|
|
.map_err(|e| ConfigError::InvalidValue {
|
|
key: "WASM_ENABLED".to_string(),
|
|
message: format!("must be 'true' or 'false': {e}"),
|
|
})?
|
|
.unwrap_or(true),
|
|
tools_dir: optional_env("WASM_TOOLS_DIR")?
|
|
.map(PathBuf::from)
|
|
.unwrap_or_else(default_tools_dir),
|
|
default_memory_limit: parse_optional_env(
|
|
"WASM_DEFAULT_MEMORY_LIMIT",
|
|
10 * 1024 * 1024,
|
|
)?,
|
|
default_timeout_secs: parse_optional_env("WASM_DEFAULT_TIMEOUT_SECS", 60)?,
|
|
default_fuel_limit: parse_optional_env("WASM_DEFAULT_FUEL_LIMIT", 10_000_000)?,
|
|
cache_compiled: optional_env("WASM_CACHE_COMPILED")?
|
|
.map(|s| s.parse())
|
|
.transpose()
|
|
.map_err(|e| ConfigError::InvalidValue {
|
|
key: "WASM_CACHE_COMPILED".to_string(),
|
|
message: format!("must be 'true' or 'false': {e}"),
|
|
})?
|
|
.unwrap_or(true),
|
|
cache_dir: optional_env("WASM_CACHE_DIR")?.map(PathBuf::from),
|
|
})
|
|
}
|
|
|
|
/// Convert to WasmRuntimeConfig.
|
|
pub fn to_runtime_config(&self) -> crate::tools::wasm::WasmRuntimeConfig {
|
|
use crate::tools::wasm::{FuelConfig, ResourceLimits, WasmRuntimeConfig};
|
|
|
|
WasmRuntimeConfig {
|
|
default_limits: ResourceLimits {
|
|
memory_bytes: self.default_memory_limit,
|
|
fuel: self.default_fuel_limit,
|
|
timeout: Duration::from_secs(self.default_timeout_secs),
|
|
},
|
|
fuel_config: FuelConfig {
|
|
initial_fuel: self.default_fuel_limit,
|
|
enabled: true,
|
|
},
|
|
cache_compiled: self.cache_compiled,
|
|
cache_dir: self.cache_dir.clone(),
|
|
optimization_level: wasmtime::OptLevel::Speed,
|
|
}
|
|
}
|
|
}
|