1#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
5pub enum FrontendFacadeMethod {
6 Describe,
7 Attach,
8 SendInput,
9 Submit,
10 Interrupt,
11 Steer,
12 Respond,
13 Invoke,
14 Lease,
15 AcquireControl,
16 TakeControl,
17 Heartbeat,
18 Detach,
19 Close,
20}
21
22impl FrontendFacadeMethod {
23 pub const ALL: [Self; 14] = [
24 Self::Describe,
25 Self::Attach,
26 Self::SendInput,
27 Self::Submit,
28 Self::Interrupt,
29 Self::Steer,
30 Self::Respond,
31 Self::Invoke,
32 Self::Lease,
33 Self::AcquireControl,
34 Self::TakeControl,
35 Self::Heartbeat,
36 Self::Detach,
37 Self::Close,
38 ];
39
40 pub const fn id(self) -> &'static str {
41 match self {
42 Self::Describe => "describe",
43 Self::Attach => "attach",
44 Self::SendInput => "send_input",
45 Self::Submit => "submit",
46 Self::Interrupt => "interrupt",
47 Self::Steer => "steer",
48 Self::Respond => "respond",
49 Self::Invoke => "invoke",
50 Self::Lease => "lease",
51 Self::AcquireControl => "acquire_control",
52 Self::TakeControl => "take_control",
53 Self::Heartbeat => "heartbeat",
54 Self::Detach => "detach",
55 Self::Close => "close",
56 }
57 }
58
59 pub const fn wire_name(self) -> &'static str {
60 match self {
61 Self::Describe => "frontend.v2.describe",
62 Self::Attach => "frontend.v2.attach",
63 Self::SendInput => "frontend.v2.send_input",
64 Self::Submit => "frontend.v2.submit",
65 Self::Interrupt => "frontend.v2.interrupt",
66 Self::Steer => "frontend.v2.steer",
67 Self::Respond => "frontend.v2.respond",
68 Self::Invoke => "frontend.v2.invoke",
69 Self::Lease => "frontend.v2.lease",
70 Self::AcquireControl => "frontend.v2.acquire_control",
71 Self::TakeControl => "frontend.v2.take_control",
72 Self::Heartbeat => "frontend.v2.heartbeat",
73 Self::Detach => "frontend.v2.detach",
74 Self::Close => "frontend.v2.close",
75 }
76 }
77
78 pub const fn sdk_action(self) -> &'static str {
79 match self {
80 Self::Describe => "resume",
81 Self::Attach => "events",
82 Self::SendInput => "input",
83 Self::Submit => "input",
84 Self::Interrupt => "interrupt",
85 Self::Steer => "steer",
86 Self::Respond => "respond",
87 Self::Invoke => "input",
88 Self::Lease => "events",
89 Self::AcquireControl => "input",
90 Self::TakeControl => "input",
91 Self::Heartbeat => "events",
92 Self::Detach => "events",
93 Self::Close => "close",
94 }
95 }
96
97 pub fn from_wire_name(value: &str) -> Option<Self> {
98 match value {
99 "frontend.v2.describe" => Some(Self::Describe),
100 "frontend.v2.attach" => Some(Self::Attach),
101 "frontend.v2.send_input" => Some(Self::SendInput),
102 "frontend.v2.submit" => Some(Self::Submit),
103 "frontend.v2.interrupt" => Some(Self::Interrupt),
104 "frontend.v2.steer" => Some(Self::Steer),
105 "frontend.v2.respond" => Some(Self::Respond),
106 "frontend.v2.invoke" => Some(Self::Invoke),
107 "frontend.v2.lease" => Some(Self::Lease),
108 "frontend.v2.acquire_control" => Some(Self::AcquireControl),
109 "frontend.v2.take_control" => Some(Self::TakeControl),
110 "frontend.v2.heartbeat" => Some(Self::Heartbeat),
111 "frontend.v2.detach" => Some(Self::Detach),
112 "frontend.v2.close" => Some(Self::Close),
113 "frontend.describe" => Some(Self::Describe),
114 "frontend.attach" => Some(Self::Attach),
115 "frontend.send_input" => Some(Self::SendInput),
116 "frontend.invoke" => Some(Self::Invoke),
117 "frontend.lease" => Some(Self::Lease),
118 "frontend.acquire_control" => Some(Self::AcquireControl),
119 "frontend.take_control" => Some(Self::TakeControl),
120 "frontend.heartbeat" => Some(Self::Heartbeat),
121 "frontend.detach" => Some(Self::Detach),
122 "frontend.close" => Some(Self::Close),
123 "submit" => Some(Self::Submit),
124 "interrupt" => Some(Self::Interrupt),
125 "steer" => Some(Self::Steer),
126 "respond" => Some(Self::Respond),
127 _ => None,
128 }
129 }
130}
131
132pub trait FrontendFacadeTransport: Send + Sync {
134 fn call<'a>(
135 &'a self,
136 method: FrontendFacadeMethod,
137 params: serde_json::Value,
138 ) -> std::pin::Pin<
139 Box<
140 dyn std::future::Future<Output = Result<serde_json::Value, crate::FrontendRuntimeError>>
141 + Send
142 + 'a,
143 >,
144 >;
145}
146
147pub struct GeneratedFrontendClient<T> {
149 transport: T,
150}
151
152impl<T> GeneratedFrontendClient<T> {
153 pub const fn new(transport: T) -> Self {
154 Self { transport }
155 }
156}
157
158impl<T: FrontendFacadeTransport> GeneratedFrontendClient<T> {
159 pub async fn describe(
160 &self,
161 ) -> Result<crate::FrontendRuntimeDescriptor, crate::FrontendRuntimeError> {
162 let value = self
163 .transport
164 .call(FrontendFacadeMethod::Describe, serde_json::json!({}))
165 .await?;
166 serde_json::from_value::<crate::FrontendRuntimeDescriptor>(value)
167 .map_err(|error| crate::FrontendRuntimeError::Transport(error.to_string()))
168 }
169
170 pub async fn attach(
171 &self,
172 limit: u64,
173 after_sequence: Option<u64>,
174 ) -> Result<crate::FrontendAttachSnapshot, crate::FrontendRuntimeError> {
175 let mut params = serde_json::json!({"limit": limit});
176 if let Some(value) = after_sequence {
177 params["after_sequence"] = serde_json::json!(value);
178 }
179 let value = self
180 .transport
181 .call(FrontendFacadeMethod::Attach, params)
182 .await?;
183 serde_json::from_value::<crate::FrontendAttachSnapshot>(value)
184 .map_err(|error| crate::FrontendRuntimeError::Transport(error.to_string()))
185 }
186
187 pub async fn send_input(
188 &self,
189 prompt: String,
190 image_urls: Option<Vec<String>>,
191 ) -> Result<bool, crate::FrontendRuntimeError> {
192 let mut params = serde_json::json!({"prompt": prompt});
193 if let Some(value) = image_urls {
194 params["image_urls"] = serde_json::json!(value);
195 }
196 let value = self
197 .transport
198 .call(FrontendFacadeMethod::SendInput, params)
199 .await?;
200 value
201 .get("accepted")
202 .and_then(serde_json::Value::as_bool)
203 .ok_or_else(|| {
204 crate::FrontendRuntimeError::Transport(
205 "invalid frontend.v2.send_input result".into(),
206 )
207 })
208 }
209
210 pub async fn submit(
211 &self,
212 prompt: String,
213 image_urls: Option<Vec<String>>,
214 ) -> Result<String, crate::FrontendRuntimeError> {
215 let mut params = serde_json::json!({"prompt": prompt});
216 if let Some(value) = image_urls {
217 params["image_urls"] = serde_json::json!(value);
218 }
219 let value = self
220 .transport
221 .call(FrontendFacadeMethod::Submit, params)
222 .await?;
223 value
224 .get("reply")
225 .and_then(serde_json::Value::as_str)
226 .map(|value| value.to_string())
227 .ok_or_else(|| {
228 crate::FrontendRuntimeError::Transport("invalid frontend.v2.submit result".into())
229 })
230 }
231
232 pub async fn interrupt(&self) -> Result<bool, crate::FrontendRuntimeError> {
233 let value = self
234 .transport
235 .call(FrontendFacadeMethod::Interrupt, serde_json::json!({}))
236 .await?;
237 value
238 .get("interrupted")
239 .and_then(serde_json::Value::as_bool)
240 .ok_or_else(|| {
241 crate::FrontendRuntimeError::Transport(
242 "invalid frontend.v2.interrupt result".into(),
243 )
244 })
245 }
246
247 pub async fn steer(&self, prompt: String) -> Result<bool, crate::FrontendRuntimeError> {
248 let value = self
249 .transport
250 .call(
251 FrontendFacadeMethod::Steer,
252 serde_json::json!({"prompt": prompt}),
253 )
254 .await?;
255 value
256 .get("queued")
257 .and_then(serde_json::Value::as_bool)
258 .ok_or_else(|| {
259 crate::FrontendRuntimeError::Transport("invalid frontend.v2.steer result".into())
260 })
261 }
262
263 pub async fn respond(
264 &self,
265 response: crate::FrontendResponse,
266 ) -> Result<bool, crate::FrontendRuntimeError> {
267 let value = self
268 .transport
269 .call(
270 FrontendFacadeMethod::Respond,
271 serde_json::json!({"response": response}),
272 )
273 .await?;
274 value
275 .get("accepted")
276 .and_then(serde_json::Value::as_bool)
277 .ok_or_else(|| {
278 crate::FrontendRuntimeError::Transport("invalid frontend.v2.respond result".into())
279 })
280 }
281
282 pub async fn invoke(
283 &self,
284 operation: crate::FrontendOperationInvocation,
285 ) -> Result<crate::FrontendOperationResult, crate::FrontendRuntimeError> {
286 let value = self
287 .transport
288 .call(
289 FrontendFacadeMethod::Invoke,
290 serde_json::json!({"operation": operation}),
291 )
292 .await?;
293 serde_json::from_value::<crate::FrontendOperationResult>(value)
294 .map_err(|error| crate::FrontendRuntimeError::Transport(error.to_string()))
295 }
296
297 pub async fn lease(&self) -> Result<crate::RuntimeLeaseSnapshot, crate::FrontendRuntimeError> {
298 let value = self
299 .transport
300 .call(FrontendFacadeMethod::Lease, serde_json::json!({}))
301 .await?;
302 serde_json::from_value::<crate::RuntimeLeaseSnapshot>(value)
303 .map_err(|error| crate::FrontendRuntimeError::Transport(error.to_string()))
304 }
305
306 pub async fn acquire_control(
307 &self,
308 ) -> Result<crate::RuntimeLeaseSnapshot, crate::FrontendRuntimeError> {
309 let value = self
310 .transport
311 .call(FrontendFacadeMethod::AcquireControl, serde_json::json!({}))
312 .await?;
313 serde_json::from_value::<crate::RuntimeLeaseSnapshot>(value)
314 .map_err(|error| crate::FrontendRuntimeError::Transport(error.to_string()))
315 }
316
317 pub async fn take_control(
318 &self,
319 ) -> Result<crate::RuntimeLeaseSnapshot, crate::FrontendRuntimeError> {
320 let value = self
321 .transport
322 .call(FrontendFacadeMethod::TakeControl, serde_json::json!({}))
323 .await?;
324 serde_json::from_value::<crate::RuntimeLeaseSnapshot>(value)
325 .map_err(|error| crate::FrontendRuntimeError::Transport(error.to_string()))
326 }
327
328 pub async fn heartbeat(
329 &self,
330 ) -> Result<crate::RuntimeLeaseSnapshot, crate::FrontendRuntimeError> {
331 let value = self
332 .transport
333 .call(FrontendFacadeMethod::Heartbeat, serde_json::json!({}))
334 .await?;
335 serde_json::from_value::<crate::RuntimeLeaseSnapshot>(value)
336 .map_err(|error| crate::FrontendRuntimeError::Transport(error.to_string()))
337 }
338
339 pub async fn detach(&self) -> Result<crate::RuntimeLeaseSnapshot, crate::FrontendRuntimeError> {
340 let value = self
341 .transport
342 .call(FrontendFacadeMethod::Detach, serde_json::json!({}))
343 .await?;
344 serde_json::from_value::<crate::RuntimeLeaseSnapshot>(value)
345 .map_err(|error| crate::FrontendRuntimeError::Transport(error.to_string()))
346 }
347
348 pub async fn close(&self) -> Result<bool, crate::FrontendRuntimeError> {
349 let value = self
350 .transport
351 .call(FrontendFacadeMethod::Close, serde_json::json!({}))
352 .await?;
353 value
354 .get("closed")
355 .and_then(serde_json::Value::as_bool)
356 .ok_or_else(|| {
357 crate::FrontendRuntimeError::Transport("invalid frontend.v2.close result".into())
358 })
359 }
360}