From f4aad57cce21cbbd206b88769f58d447b2235ec8 Mon Sep 17 00:00:00 2001 From: autocommit Date: Thu, 4 Jun 2026 09:26:32 -0700 Subject: [PATCH] =?UTF-8?q?feat(mc-mod-host):=20=E2=9C=A8=20Implement=20Wa?= =?UTF-8?q?smController=20and=20NativeLoader=20for=20WASM=20module=20manag?= =?UTF-8?q?ement=20with=20test=20coverage=20for=20execution=20limits=20and?= =?UTF-8?q?=20no-op=20behavior?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Lilith Autocommit --- src/simulator/crates/mc-mod-host/src/native_loader.rs | 3 ++- src/simulator/crates/mc-mod-host/src/wasm_controller.rs | 3 ++- .../crates/mc-mod-host/tests/wasm_controller_limits.rs | 4 ++-- .../crates/mc-mod-host/tests/wasm_controller_noop.rs | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/simulator/crates/mc-mod-host/src/native_loader.rs b/src/simulator/crates/mc-mod-host/src/native_loader.rs index 997caa5b..cc51c903 100644 --- a/src/simulator/crates/mc-mod-host/src/native_loader.rs +++ b/src/simulator/crates/mc-mod-host/src/native_loader.rs @@ -27,7 +27,7 @@ use std::sync::Mutex; use libloading::{Library, Symbol}; use mc_ai::evaluator::ScoringWeights; -use mc_ai::tactical::{Action, TacticalState}; +use mc_ai::tactical::{Action, TacticalMemory, TacticalState}; use mc_player_api::controllers::{AiController, AiControllerIdent, SandboxKind}; use crate::abi::{self, STATE_VERSION_PREFIX}; @@ -93,6 +93,7 @@ impl AiController for NativeAiController { slot: u8, _weights: &ScoringWeights, seed: u64, + _memory: &mut TacticalMemory, ) -> Vec { let payload = match postcard::to_allocvec(state) { Ok(p) => p, diff --git a/src/simulator/crates/mc-mod-host/src/wasm_controller.rs b/src/simulator/crates/mc-mod-host/src/wasm_controller.rs index 78124ff4..3cc50847 100644 --- a/src/simulator/crates/mc-mod-host/src/wasm_controller.rs +++ b/src/simulator/crates/mc-mod-host/src/wasm_controller.rs @@ -8,7 +8,7 @@ use std::sync::{Arc, Mutex}; use mc_ai::evaluator::ScoringWeights; -use mc_ai::tactical::{Action, TacticalState}; +use mc_ai::tactical::{Action, TacticalMemory, TacticalState}; use mc_player_api::controllers::{AiController, AiControllerIdent, SandboxKind}; use wasmtime::{Memory, TypedFunc, Val}; @@ -273,6 +273,7 @@ impl AiController for WasmAiController { slot: u8, _weights: &ScoringWeights, seed: u64, + _memory: &mut TacticalMemory, ) -> Vec { // Serialise state. postcard::to_allocvec is allocator-only; // pulling it through our `postcard = { features = ["alloc"] }` diff --git a/src/simulator/crates/mc-mod-host/tests/wasm_controller_limits.rs b/src/simulator/crates/mc-mod-host/tests/wasm_controller_limits.rs index 79c5f100..b688a6cf 100644 --- a/src/simulator/crates/mc-mod-host/tests/wasm_controller_limits.rs +++ b/src/simulator/crates/mc-mod-host/tests/wasm_controller_limits.rs @@ -44,7 +44,7 @@ fn memory_limiter_blocks_grow_past_16_mib() { let weights = ScoringWeights::default(); // Guest requests +300 pages on top of the initial 1; limiter rejects, // memory.grow returns -1, guest traps. Host MUST surface empty plan. - let actions = controller.decide_turn(&state, 0, &weights, 0); + let actions = controller.decide_turn(&state, 0, &weights, 0, &mut mc_ai::tactical::TacticalMemory::default()); assert!( actions.is_empty(), "memory.grow past 16 MiB cap must yield empty actions, got {actions:?}" @@ -62,7 +62,7 @@ fn allocator_mode_retries_once_on_buffer_too_small() { // Call #1 returns -2; host retries → call #2 writes one zero byte // (postcard's `Vec::::new()`) and returns 1. Decoded result: // an empty action chain. - let actions = controller.decide_turn(&state, 0, &weights, 0); + let actions = controller.decide_turn(&state, 0, &weights, 0, &mut mc_ai::tactical::TacticalMemory::default()); assert!( actions.is_empty(), "expected empty postcard Vec after retry, got {actions:?}" diff --git a/src/simulator/crates/mc-mod-host/tests/wasm_controller_noop.rs b/src/simulator/crates/mc-mod-host/tests/wasm_controller_noop.rs index 42cf12f9..ef313494 100644 --- a/src/simulator/crates/mc-mod-host/tests/wasm_controller_noop.rs +++ b/src/simulator/crates/mc-mod-host/tests/wasm_controller_noop.rs @@ -35,7 +35,7 @@ fn wasm_controller_noop_returns_empty_actions() { let state = empty_state(); let weights = ScoringWeights::default(); - let actions = controller.decide_turn(&state, 0, &weights, 42); + let actions = controller.decide_turn(&state, 0, &weights, 42, &mut mc_ai::tactical::TacticalMemory::default()); assert!( actions.is_empty(), "noop must return empty action chain, got {actions:?}"