1use serde::{Deserialize, Serialize};
5use std::sync::Arc;
6
7use crate::patch_engine::{CompiledArtifact, PatchEngine, RuntimePatch};
8
9pub trait RuntimeHandle: Send + Sync {
11 fn send_patch(&self, patch: RuntimePatch);
13
14 fn request_state(&self) -> RuntimeStateSnapshot;
16
17 fn send_event(&self, event: RuntimeEvent);
19}
20
21pub struct DevRuntimeController {
23 runtime: Arc<dyn RuntimeHandle>,
24 patch_engine: PatchEngine,
25}
26
27impl DevRuntimeController {
28 pub fn new(runtime: Arc<dyn RuntimeHandle>) -> Self {
30 Self {
31 runtime,
32 patch_engine: PatchEngine::new(),
33 }
34 }
35
36 pub fn apply_code_update(&self, compiled_artifact: CompiledArtifact) {
38 let patch = self.patch_engine.generate_patch(compiled_artifact);
39 self.runtime.send_patch(patch);
40 }
41
42 pub fn inject_agent_stream(&self, stream: Vec<RuntimeEvent>) {
44 for event in stream {
45 self.runtime.send_event(event);
46 }
47 }
48}
49
50#[derive(Debug, Clone, Serialize, Deserialize)]
52pub enum RuntimeEvent {
53 Agent(AgentEvent),
54 }
56
57#[derive(Debug, Clone, Serialize, Deserialize)]
59pub enum AgentEvent {
60 Token(String),
61 ToolCall(String),
62 StateChange(String),
63 Error(String),
64}
65
66#[derive(Debug, Clone, Serialize, Deserialize)]
68pub struct RuntimeStateSnapshot {
69 pub data: String,
71}
72
73impl RuntimeStateSnapshot {
74 pub fn new(data: String) -> Self {
75 Self { data }
76 }
77}