Implement pure Rust visual snapshots (#132)
Some checks failed
CI / rust-skia (Rust only) (push) Successful in 2m48s
CI / required (push) Failing after 54s

This commit is contained in:
2026-08-18 11:57:50 +02:00
parent 64edd8df46
commit 11a8c37f21
16 changed files with 1793 additions and 17 deletions

View File

@@ -224,6 +224,7 @@ async fn run_live(
config.limits.observable_queue,
)?
.start();
live.vision.set_generation(handle.status().generation);
if run_once {
let readiness = tokio::time::timeout(config.timeouts.startup, async {
@@ -232,19 +233,21 @@ async fn run_live(
Some(event @ SessionObservation::Transition { status, .. })
if status.agent_ready =>
{
live.vision.set_generation(status.generation);
record_session_observation(&live.observability, &event);
return Ok::<(), CliError>(());
}
Some(
event @ SessionObservation::Transition {
status:
metacrate_grid_agent::SessionStatus {
status @ metacrate_grid_agent::SessionStatus {
state: SessionState::AuthenticationBlocked,
..
},
..
},
) => {
live.vision.set_generation(status.generation);
record_session_observation(&live.observability, &event);
return Err(CliError(
"grid authentication/configuration requires operator action".into(),
@@ -292,6 +295,7 @@ async fn run_live(
)?;
control_target.attach_observability(live.observability.clone());
control_target.attach_build_control(live.build_control.clone());
control_target.attach_vision_control(live.vision.clone());
control_target.update_session(handle.status());
let erased_target: Arc<dyn ControlTarget> = control_target.clone();
let (control_plane, integrated_client, control_server) = match config.mode {
@@ -360,6 +364,7 @@ async fn run_live(
let Some(event) = event else { break; };
record_session_observation(&live.observability, &event);
if let SessionObservation::Transition { status, reason, retry_in } = event {
live.vision.set_generation(status.generation);
control_target.update_session(status);
live.landmark_roaming
.update_pause(|pause| pause.degraded = !status.agent_ready);
@@ -492,6 +497,8 @@ struct LiveInteractions {
_landmark_intake: metacrate_grid_agent::LibremetaverseLandmarkIntake,
landmark_roaming: metacrate_grid_agent::LandmarkRoamingHandle,
build_control: Arc<dyn metacrate_grid_agent::BuildControl>,
vision:
Arc<metacrate_grid_agent::VisionService<metacrate_grid_agent::LibremetaverseSceneSource>>,
}
#[cfg(feature = "live-grid")]
@@ -504,12 +511,13 @@ fn start_live_interactions(
AuthorizedBackendRouter, AuthorizedToolBackend, BehaviorBackend, BehaviorController,
BuildLimits, BuildService, BuildToolBackend, ConversationStore, InteractionCoordinator,
LandmarkLimits, LandmarkService, LandmarkToolBackend, LibremetaverseBuildGrid,
LibremetaverseLandmarkGrid, LibremetaverseLandmarkIntake, LibremetaverseScriptInventory,
LlmClient, LlmTransportLimits, MemoryPolicyAudit, Observability, ObservabilityLimits,
PerceptionBackend, PolicyAuditSink, PolicyGateway, PolicyLimits, PolicyLlmResponder,
ScriptDeliveryBackend, ScriptDeliverySettings, SystemRoamingRandom, ToolLoopLimits,
UnifiedPolicyAudit, behavior_policy_tools, build_policy_tools, landmark_policy_tools,
perception_policy_tools, script_delivery_policy_tool,
LibremetaverseLandmarkGrid, LibremetaverseLandmarkIntake, LibremetaverseSceneSource,
LibremetaverseScriptInventory, LlmClient, LlmTransportLimits, MemoryPolicyAudit,
Observability, ObservabilityLimits, PerceptionBackend, PolicyAuditSink, PolicyGateway,
PolicyLimits, PolicyLlmResponder, ScriptDeliveryBackend, ScriptDeliverySettings,
SystemRoamingRandom, ToolLoopLimits, UnifiedPolicyAudit, VisionAugmentedResponder,
VisionLimits, VisionService, behavior_policy_tools, build_policy_tools,
landmark_policy_tools, perception_policy_tools, script_delivery_policy_tool,
};
let transport_limits = LlmTransportLimits {
@@ -635,6 +643,12 @@ fn start_live_interactions(
loop_limits,
now,
)?);
let vision_limits = VisionLimits::default();
let vision = Arc::new(VisionService::new(
Arc::new(LibremetaverseSceneSource::new(owner, vision_limits)),
vision_limits,
)?);
let responder = Arc::new(VisionAugmentedResponder::new(vision.clone(), responder));
let sink = Arc::new(owner.interaction_sink());
let pacer: Arc<dyn metacrate_grid_agent::ResponsePacer> = Arc::new(behavior_ingress);
let interaction = InteractionCoordinator::new(
@@ -662,6 +676,7 @@ fn start_live_interactions(
_landmark_intake: landmark_intake,
landmark_roaming,
build_control,
vision,
})
}